Swiftgram/Source/Details/ASPhotosFrameworkImageRequest.m
appleguy 465abb1ded [License] Simplify the Texture license to be pure Apache 2 (removing ASDK-Licenses). (#1077)
* [License] Simplify the Texture license to be pure Apache 2 (removing ASDK-Licenses)

With permission of the Facebook Open Source team, we are simplifying the Texture
license so that clients can rely on the Apache 2 terms that most of Texture is
already covered by. This means that code originally forked from AsyncDisplayKit
will be re-licensed from "BSD 3-clause + PATENTS v2" to Apache 2 without a
PATENTS file.

After getting confirmation that the updates to these core files look good, we'll
propagate this new license header to all files (in this same PR) and get sign-off
from all parties before landing.

* [License] Update all Texture source files to be pure Apache 2.

* Changelog entry for Apache 2 license update.

* Revert "[License] Update all Texture source files to be pure Apache 2."

This reverts commit ffa0fbbba9717d871dd16c4b07539f2f8208fc2b.

* [License] Update all Texture source files to be pure Apache 2, maintaining copyrights.

* [License] Update CONTRIBUTING, README, Podspec & Dangerfile.
2018-08-28 07:39:18 -07:00

160 lines
6.4 KiB
Objective-C

//
// ASPhotosFrameworkImageRequest.m
// Texture
//
// Copyright (c) Facebook, Inc. and its affiliates. All rights reserved.
// Changes after 4/13/2017 are: Copyright (c) Pinterest, Inc. All rights reserved.
// Licensed under Apache 2.0: http://www.apache.org/licenses/LICENSE-2.0
//
#import <AsyncDisplayKit/ASPhotosFrameworkImageRequest.h>
#if AS_USE_PHOTOS
#import <AsyncDisplayKit/ASBaseDefines.h>
NSString *const ASPhotosURLScheme = @"ph";
static NSString *const _ASPhotosURLQueryKeyWidth = @"width";
static NSString *const _ASPhotosURLQueryKeyHeight = @"height";
// value is PHImageContentMode value
static NSString *const _ASPhotosURLQueryKeyContentMode = @"contentmode";
// value is PHImageRequestOptionsResizeMode value
static NSString *const _ASPhotosURLQueryKeyResizeMode = @"resizemode";
// value is PHImageRequestOptionsDeliveryMode value
static NSString *const _ASPhotosURLQueryKeyDeliveryMode = @"deliverymode";
// value is PHImageRequestOptionsVersion value
static NSString *const _ASPhotosURLQueryKeyVersion = @"version";
// value is 0 or 1
static NSString *const _ASPhotosURLQueryKeyAllowNetworkAccess = @"network";
static NSString *const _ASPhotosURLQueryKeyCropOriginX = @"crop_x";
static NSString *const _ASPhotosURLQueryKeyCropOriginY = @"crop_y";
static NSString *const _ASPhotosURLQueryKeyCropWidth = @"crop_w";
static NSString *const _ASPhotosURLQueryKeyCropHeight = @"crop_h";
@implementation ASPhotosFrameworkImageRequest
- (instancetype)initWithAssetIdentifier:(NSString *)assetIdentifier
{
self = [super init];
if (self) {
_assetIdentifier = assetIdentifier;
_options = [PHImageRequestOptions new];
_contentMode = PHImageContentModeDefault;
_targetSize = PHImageManagerMaximumSize;
}
return self;
}
#pragma mark NSCopying
- (id)copyWithZone:(NSZone *)zone
{
ASPhotosFrameworkImageRequest *copy = [[ASPhotosFrameworkImageRequest alloc] initWithAssetIdentifier:self.assetIdentifier];
copy.options = [self.options copy];
copy.targetSize = self.targetSize;
copy.contentMode = self.contentMode;
return copy;
}
#pragma mark Converting to URL
- (NSURL *)url
{
NSURLComponents *comp = [NSURLComponents new];
comp.scheme = ASPhotosURLScheme;
comp.host = _assetIdentifier;
NSMutableArray *queryItems = [NSMutableArray arrayWithObjects:
[NSURLQueryItem queryItemWithName:_ASPhotosURLQueryKeyWidth value:@(_targetSize.width).stringValue],
[NSURLQueryItem queryItemWithName:_ASPhotosURLQueryKeyHeight value:@(_targetSize.height).stringValue],
[NSURLQueryItem queryItemWithName:_ASPhotosURLQueryKeyVersion value:@(_options.version).stringValue],
[NSURLQueryItem queryItemWithName:_ASPhotosURLQueryKeyContentMode value:@(_contentMode).stringValue],
[NSURLQueryItem queryItemWithName:_ASPhotosURLQueryKeyAllowNetworkAccess value:@(_options.networkAccessAllowed).stringValue],
[NSURLQueryItem queryItemWithName:_ASPhotosURLQueryKeyResizeMode value:@(_options.resizeMode).stringValue],
[NSURLQueryItem queryItemWithName:_ASPhotosURLQueryKeyDeliveryMode value:@(_options.deliveryMode).stringValue]
, nil];
CGRect cropRect = _options.normalizedCropRect;
if (!CGRectIsEmpty(cropRect)) {
[queryItems addObjectsFromArray:@[
[NSURLQueryItem queryItemWithName:_ASPhotosURLQueryKeyCropOriginX value:@(cropRect.origin.x).stringValue],
[NSURLQueryItem queryItemWithName:_ASPhotosURLQueryKeyCropOriginY value:@(cropRect.origin.y).stringValue],
[NSURLQueryItem queryItemWithName:_ASPhotosURLQueryKeyCropWidth value:@(cropRect.size.width).stringValue],
[NSURLQueryItem queryItemWithName:_ASPhotosURLQueryKeyCropHeight value:@(cropRect.size.height).stringValue]
]];
}
comp.queryItems = queryItems;
return comp.URL;
}
#pragma mark Converting from URL
+ (ASPhotosFrameworkImageRequest *)requestWithURL:(NSURL *)url
{
// not a photos URL
if (![url.scheme isEqualToString:ASPhotosURLScheme]) {
return nil;
}
NSURLComponents *comp = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
ASPhotosFrameworkImageRequest *request = [[ASPhotosFrameworkImageRequest alloc] initWithAssetIdentifier:url.host];
CGRect cropRect = CGRectZero;
CGSize targetSize = PHImageManagerMaximumSize;
for (NSURLQueryItem *item in comp.queryItems) {
if ([_ASPhotosURLQueryKeyAllowNetworkAccess isEqualToString:item.name]) {
request.options.networkAccessAllowed = item.value.boolValue;
} else if ([_ASPhotosURLQueryKeyWidth isEqualToString:item.name]) {
targetSize.width = item.value.doubleValue;
} else if ([_ASPhotosURLQueryKeyHeight isEqualToString:item.name]) {
targetSize.height = item.value.doubleValue;
} else if ([_ASPhotosURLQueryKeyContentMode isEqualToString:item.name]) {
request.contentMode = (PHImageContentMode)item.value.integerValue;
} else if ([_ASPhotosURLQueryKeyVersion isEqualToString:item.name]) {
request.options.version = (PHImageRequestOptionsVersion)item.value.integerValue;
} else if ([_ASPhotosURLQueryKeyCropOriginX isEqualToString:item.name]) {
cropRect.origin.x = item.value.doubleValue;
} else if ([_ASPhotosURLQueryKeyCropOriginY isEqualToString:item.name]) {
cropRect.origin.y = item.value.doubleValue;
} else if ([_ASPhotosURLQueryKeyCropWidth isEqualToString:item.name]) {
cropRect.size.width = item.value.doubleValue;
} else if ([_ASPhotosURLQueryKeyCropHeight isEqualToString:item.name]) {
cropRect.size.height = item.value.doubleValue;
} else if ([_ASPhotosURLQueryKeyResizeMode isEqualToString:item.name]) {
request.options.resizeMode = (PHImageRequestOptionsResizeMode)item.value.integerValue;
} else if ([_ASPhotosURLQueryKeyDeliveryMode isEqualToString:item.name]) {
request.options.deliveryMode = (PHImageRequestOptionsDeliveryMode)item.value.integerValue;
}
}
request.targetSize = targetSize;
request.options.normalizedCropRect = cropRect;
return request;
}
#pragma mark NSObject
- (BOOL)isEqual:(id)object
{
if (![object isKindOfClass:ASPhotosFrameworkImageRequest.class]) {
return NO;
}
ASPhotosFrameworkImageRequest *other = object;
return [other.assetIdentifier isEqualToString:self.assetIdentifier] &&
other.contentMode == self.contentMode &&
CGSizeEqualToSize(other.targetSize, self.targetSize) &&
CGRectEqualToRect(other.options.normalizedCropRect, self.options.normalizedCropRect) &&
other.options.resizeMode == self.options.resizeMode &&
other.options.version == self.options.version;
}
@end
#endif // AS_USE_PHOTOS