blob: eade0a6b72365b626d487114cffc41d0ae3a9be8 [file] [log] [blame]
/*
* Copyright (C) 2021 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "config.h"
#import "ImageAnalysisTestingUtilities.h"
#if HAVE(VK_IMAGE_ANALYSIS)
#import <wtf/BlockPtr.h>
#import <pal/cocoa/VisionKitCoreSoftLink.h>
@interface TestVKQuad : NSObject
- (instancetype)initWithTopLeft:(CGPoint)topLeft topRight:(CGPoint)topRight bottomLeft:(CGPoint)bottomLeft bottomRight:(CGPoint)bottomRight;
@property (nonatomic, readonly) CGPoint topLeft;
@property (nonatomic, readonly) CGPoint topRight;
@property (nonatomic, readonly) CGPoint bottomLeft;
@property (nonatomic, readonly) CGPoint bottomRight;
@end
@implementation TestVKQuad
- (instancetype)initWithTopLeft:(CGPoint)topLeft topRight:(CGPoint)topRight bottomLeft:(CGPoint)bottomLeft bottomRight:(CGPoint)bottomRight
{
if (!(self = [super init]))
return nil;
_topLeft = topLeft;
_topRight = topRight;
_bottomLeft = bottomLeft;
_bottomRight = bottomRight;
return self;
}
@end
@interface TestVKWKTextInfo : NSObject
- (instancetype)initWithString:(NSString *)string quad:(VKQuad *)quad;
@end
@implementation TestVKWKTextInfo {
RetainPtr<NSString> _string;
RetainPtr<VKQuad> _quad;
}
- (instancetype)initWithString:(NSString *)string quad:(VKQuad *)quad
{
if (!(self = [super init]))
return nil;
_string = string;
_quad = quad;
return self;
}
- (NSString *)string
{
return _string.get();
}
- (VKQuad *)quad
{
return _quad.get();
}
@end
@interface TestVKWKLineInfo : TestVKWKTextInfo
- (instancetype)initWithString:(NSString *)string quad:(VKQuad *)quad children:(NSArray<VKWKTextInfo *> *)children;
@end
@implementation TestVKWKLineInfo {
RetainPtr<NSArray> _children;
}
- (instancetype)initWithString:(NSString *)string quad:(VKQuad *)quad children:(NSArray<VKWKTextInfo *> *)children
{
if (!(self = [super initWithString:string quad:quad]))
return nil;
_children = children;
return self;
}
- (NSArray<VKWKTextInfo *> *)children
{
return _children.get();
}
@end
@interface TestVKImageAnalysis : NSObject
- (instancetype)initWithLines:(NSArray<VKWKLineInfo *> *)lines;
#if HAVE(VK_IMAGE_ANALYSIS_FOR_MACHINE_READABLE_CODES)
@property (nonatomic, weak) UIViewController *presentingViewControllerForMrcAction;
#endif
@end
@implementation TestVKImageAnalysis {
RetainPtr<NSArray> _lines;
}
- (instancetype)initWithLines:(NSArray<VKWKLineInfo *> *)lines
{
if (!(self = [super init]))
return nil;
_lines = lines;
return self;
}
- (NSArray<VKWKLineInfo *> *)allLines
{
return _lines.get();
}
- (BOOL)hasResultsForAnalysisTypes:(VKAnalysisTypes)analysisTypes
{
// We only simulate text results for the time being.
return analysisTypes == VKAnalysisTypeText && [_lines count];
}
@end
@interface TestVKImageAnalyzerRequest : NSObject
@property (nonatomic, readonly) CGImageRef image;
@property (nonatomic, readonly) VKImageOrientation orientation;
@property (nonatomic, readonly) VKAnalysisTypes requestType;
@property (nonatomic, copy) NSURL *imageURL;
@property (nonatomic, copy) NSURL *pageURL;
@end
@implementation TestVKImageAnalyzerRequest {
RetainPtr<CGImageRef> _image;
VKImageOrientation _orientation;
VKAnalysisTypes _requestType;
RetainPtr<NSURL> _imageURL;
RetainPtr<NSURL> _pageURL;
}
- (instancetype)initWithCGImage:(CGImageRef)image orientation:(VKImageOrientation)orientation requestType:(VKAnalysisTypes)requestType
{
if (!(self = [super init]))
return nil;
_image = image;
_orientation = orientation;
_requestType = requestType;
return self;
}
- (CGImageRef)image
{
return _image.get();
}
- (NSURL *)imageURL
{
return _imageURL.get();
}
- (void)setImageURL:(NSURL *)url
{
_imageURL = adoptNS(url.copy);
}
- (NSURL *)pageURL
{
return _pageURL.get();
}
- (void)setPageURL:(NSURL *)url
{
_pageURL = adoptNS(url.copy);
}
@end
#if ENABLE(IMAGE_ANALYSIS_ENHANCEMENTS)
@interface FakeRemoveBackgroundResult : NSObject
- (instancetype)initWithImage:(CGImageRef)image cropRect:(CGRect)cropRect;
- (CGImageRef)createCGImage;
@property (nonatomic, readonly) CGRect cropRect;
@end
@implementation FakeRemoveBackgroundResult {
RetainPtr<CGImageRef> _image;
CGRect _cropRect;
}
- (instancetype)initWithImage:(CGImageRef)image cropRect:(CGRect)cropRect
{
if (!(self = [super init]))
return nil;
_image = image;
_cropRect = cropRect;
return self;
}
- (CGImageRef)createCGImage
{
return _image.get();
}
- (CGRect)cropRect
{
return _cropRect;
}
@end
#endif // ENABLE(IMAGE_ANALYSIS_ENHANCEMENTS)
namespace TestWebKitAPI {
RetainPtr<VKQuad> createQuad(CGPoint topLeft, CGPoint topRight, CGPoint bottomLeft, CGPoint bottomRight)
{
return adoptNS(static_cast<VKQuad *>([[TestVKQuad alloc] initWithTopLeft:topLeft topRight:topRight bottomLeft:bottomLeft bottomRight:bottomRight]));
}
RetainPtr<VKWKTextInfo> createTextInfo(NSString *string, VKQuad *quad)
{
return adoptNS(static_cast<VKWKTextInfo *>([[TestVKWKTextInfo alloc] initWithString:string quad:quad]));
}
RetainPtr<VKWKLineInfo> createLineInfo(NSString *string, VKQuad *quad, NSArray<VKWKTextInfo *> *children)
{
return adoptNS(static_cast<VKWKLineInfo *>([[TestVKWKLineInfo alloc] initWithString:string quad:quad children:children]));
}
RetainPtr<VKImageAnalysis> createImageAnalysis(NSArray<VKWKLineInfo *> *lines)
{
return adoptNS(static_cast<VKImageAnalysis *>([[TestVKImageAnalysis alloc] initWithLines:lines]));
}
RetainPtr<VKImageAnalysis> createImageAnalysisWithSimpleFixedResults()
{
auto quad = createQuad(CGPointMake(0, 0), CGPointMake(1, 0), CGPointMake(1, 0.5), CGPointMake(0, 0.5));
auto text = createTextInfo(@"Foo bar", quad.get());
auto line = createLineInfo(@"Foo bar", quad.get(), @[ text.get() ]);
return createImageAnalysis(@[ line.get() ]);
}
RetainPtr<VKImageAnalyzerRequest> createRequest(CGImageRef image, VKImageOrientation orientation, VKAnalysisTypes types)
{
return adoptNS(static_cast<VKImageAnalyzerRequest *>([[TestVKImageAnalyzerRequest alloc] initWithCGImage:image orientation:orientation requestType:types]));
}
#if ENABLE(IMAGE_ANALYSIS_ENHANCEMENTS)
IMP makeRequestHandler(CGImageRef image, CGRect cropRect)
{
return imp_implementationWithBlock([image = RetainPtr { image }, cropRect](VKCRemoveBackgroundRequestHandler *, VKCRemoveBackgroundRequest *, void (^completion)(VKCRemoveBackgroundResult *, NSError *)) {
auto result = adoptNS([[FakeRemoveBackgroundResult alloc] initWithImage:image.get() cropRect:cropRect]);
completion(static_cast<VKCRemoveBackgroundResult *>(result.get()), nil);
});
}
RemoveBackgroundSwizzler::RemoveBackgroundSwizzler(CGImageRef image, CGRect cropRect)
: m_removeBackgroundRequestSwizzler { PAL::getVKCRemoveBackgroundRequestHandlerClass(), @selector(performRequest:completion:), makeRequestHandler(image, cropRect) }
{
}
#endif // ENABLE(IMAGE_ANALYSIS_ENHANCEMENTS)
} // namespace TestWebKitAPI
#endif // HAVE(VK_IMAGE_ANALYSIS)