├── samples ├── 4.jpg ├── 4.webp └── 5_webp_a.webp ├── .gitignore ├── STWebPDecoderExample-iOS ├── Default.png ├── Default@2x.png ├── Default-568h@2x.png ├── STWebPViewController.h ├── STWebPWebViewController.h ├── STAppDelegate.h ├── main.m ├── STAppDelegate.m ├── STWebPWebViewController.m ├── Info.plist └── STWebPViewController.m ├── Gemfile ├── STWebPDecoderExample-mac ├── main.m ├── STAppDelegate.h ├── en.lproj │ ├── Credits.rtf │ └── MainMenu.xib ├── STAppDelegate.m └── Info.plist ├── .gitmodules ├── .travis.yml ├── STWebP ├── STWebP.m ├── STWebPURLProtocol.h ├── STWebP.h ├── STWebPDecoder.h ├── STWebPStreamingDecoder.h ├── STWebPDecoder-iOS.m ├── STWebPDecoder-mac.m ├── STWebPStreamingDecoder-iOS.m ├── STWebPStreamingDecoder-mac.m └── STWebPURLProtocol.m ├── STWebPTests ├── Info.plist ├── STWebPDecoderTests-mac.m └── STWebPDecoderTests-iOS.m ├── README.md ├── STWebP.xcodeproj ├── xcshareddata │ └── xcschemes │ │ ├── STWebP-iOS.xcscheme │ │ └── STWebP-mac.xcscheme └── project.pbxproj ├── Rakefile └── LICENSE /samples/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cysp/STWebPDecoder/HEAD/samples/4.jpg -------------------------------------------------------------------------------- /samples/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cysp/STWebPDecoder/HEAD/samples/4.webp -------------------------------------------------------------------------------- /samples/5_webp_a.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cysp/STWebPDecoder/HEAD/samples/5_webp_a.webp -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.xcodeproj/*.xcworkspace 2 | *.xcodeproj/xcuserdata 3 | 4 | .bundle 5 | Gemfile.lock 6 | -------------------------------------------------------------------------------- /STWebPDecoderExample-iOS/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cysp/STWebPDecoder/HEAD/STWebPDecoderExample-iOS/Default.png -------------------------------------------------------------------------------- /STWebPDecoderExample-iOS/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cysp/STWebPDecoder/HEAD/STWebPDecoderExample-iOS/Default@2x.png -------------------------------------------------------------------------------- /STWebPDecoderExample-iOS/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cysp/STWebPDecoder/HEAD/STWebPDecoderExample-iOS/Default-568h@2x.png -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | # A sample Gemfile 2 | source "https://rubygems.org" 3 | source "http://chikachow.org/gems" 4 | 5 | gem 'rake' 6 | 7 | gem 'xctool' 8 | -------------------------------------------------------------------------------- /STWebPDecoderExample-mac/main.m: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2013 Scott Talbot. All rights reserved. 2 | 3 | #import 4 | 5 | 6 | int main(int argc, char *argv[]) { 7 | return NSApplicationMain(argc, (const char **)argv); 8 | } 9 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/libwebp"] 2 | path = lib/libwebp 3 | url = https://github.com/cysp/libwebp.git 4 | branch = 0.4.0 5 | [submodule "libwebp-test-data"] 6 | path = libwebp-test-data 7 | url = https://chromium.googlesource.com/webm/libwebp-test-data 8 | -------------------------------------------------------------------------------- /STWebPDecoderExample-iOS/STWebPViewController.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2013 Scott Talbot. All rights reserved. 2 | 3 | #import 4 | 5 | @interface STWebPViewController : UIViewController 6 | 7 | + (instancetype)viewController; 8 | 9 | @end 10 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | branches: 3 | only: 4 | - master 5 | before_script: 6 | - bundle exec rake -s analyze:${CI_PLATFORM} 7 | script: bundle exec rake -s test:${CI_PLATFORM} 8 | env: 9 | - CI_PLATFORM=ios 10 | - CI_PLATFORM=mac 11 | -------------------------------------------------------------------------------- /STWebPDecoderExample-iOS/STWebPWebViewController.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2013 Scott Talbot. All rights reserved. 2 | 3 | #import 4 | 5 | 6 | @interface STWebPWebViewController : UIViewController 7 | 8 | + (instancetype)viewController; 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /STWebPDecoderExample-iOS/STAppDelegate.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2013 Scott Talbot. All rights reserved. 2 | 3 | #import 4 | 5 | 6 | @interface STAppDelegate : UIResponder 7 | 8 | @property (strong, nonatomic) UIWindow *window; 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /STWebPDecoderExample-iOS/main.m: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2013 Scott Talbot. All rights reserved. 2 | 3 | #import 4 | 5 | #import "STAppDelegate.h" 6 | 7 | 8 | int main(int argc, char *argv[]) { 9 | @autoreleasepool { 10 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([STAppDelegate class])); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /STWebPDecoderExample-mac/STAppDelegate.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2013 Scott Talbot. All rights reserved. 2 | 3 | #import 4 | 5 | 6 | @interface STAppDelegate : NSObject 7 | 8 | @property (nonatomic,assign) IBOutlet NSWindow *window; 9 | 10 | @property (nonatomic,strong) IBOutlet NSImageView *imageView; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /STWebP/STWebP.m: -------------------------------------------------------------------------------- 1 | // This Source Code Form is subject to the terms of the Mozilla Public 2 | // License, v. 2.0. If a copy of the MPL was not distributed with this 3 | // file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | // 5 | // Copyright (c) 2014 Scott Talbot. 6 | 7 | #import "STWebP.h" 8 | 9 | 10 | NSString * const STWebPErrorDomain = @"STWebP"; 11 | -------------------------------------------------------------------------------- /STWebPDecoderExample-mac/en.lproj/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} 2 | {\colortbl;\red255\green255\blue255;} 3 | \paperw9840\paperh8400 4 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural 5 | 6 | \f0\b\fs24 \cf0 Engineering: 7 | \b0 \ 8 | Some people\ 9 | \ 10 | 11 | \b Human Interface Design: 12 | \b0 \ 13 | Some other people\ 14 | \ 15 | 16 | \b Testing: 17 | \b0 \ 18 | Hopefully not nobody\ 19 | \ 20 | 21 | \b Documentation: 22 | \b0 \ 23 | Whoever\ 24 | \ 25 | 26 | \b With special thanks to: 27 | \b0 \ 28 | Mom\ 29 | } 30 | -------------------------------------------------------------------------------- /STWebPDecoderExample-mac/STAppDelegate.m: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2013 Scott Talbot. All rights reserved. 2 | 3 | #import "STAppDelegate.h" 4 | #import "STWebPDecoder.h" 5 | 6 | 7 | @implementation STAppDelegate 8 | 9 | - (void)applicationDidFinishLaunching:(NSNotification * __unused)aNotification { 10 | NSString * const webpPath = [[NSBundle mainBundle] pathForResource:@"4" ofType:@"webp"]; 11 | NSData * const webpData = [[NSData alloc] initWithContentsOfFile:webpPath options:NSDataReadingMappedIfSafe error:NULL]; 12 | self.imageView.image = [STWebPDecoder imageWithData:webpData scale:2 error:NULL]; 13 | } 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /STWebP/STWebPURLProtocol.h: -------------------------------------------------------------------------------- 1 | // This Source Code Form is subject to the terms of the Mozilla Public 2 | // License, v. 2.0. If a copy of the MPL was not distributed with this 3 | // file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | // 5 | // Copyright (c) 2013 Scott Talbot. 6 | 7 | #import 8 | 9 | 10 | extern NSString * const STWebPURLProtocolSchemePrefix; 11 | 12 | 13 | extern NSString * const STWebPURLProtocolOptionClaimWebPExtension; 14 | 15 | 16 | @interface STWebPURLProtocol : NSURLProtocol 17 | + (void)register; 18 | + (void)registerWithOptions:(NSDictionary *)options; 19 | + (void)unregister; 20 | @end 21 | -------------------------------------------------------------------------------- /STWebP/STWebP.h: -------------------------------------------------------------------------------- 1 | // This Source Code Form is subject to the terms of the Mozilla Public 2 | // License, v. 2.0. If a copy of the MPL was not distributed with this 3 | // file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | // 5 | // Copyright (c) 2014 Scott Talbot. 6 | 7 | #if __has_include() 8 | # import 9 | # define STWEBP_UIKIT 1 10 | #elif __has_include() 11 | # import 12 | # define STWEBP_APPKIT 1 13 | #else 14 | # error "Unsupported platform" 15 | #endif 16 | 17 | 18 | extern NSString * const STWebPErrorDomain; 19 | enum STWebPErrorCode { 20 | STWebPDecodeFailure = 1, 21 | }; 22 | 23 | #import 24 | #import 25 | #import 26 | -------------------------------------------------------------------------------- /STWebPTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.chikachow.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # STWebPDecoder 2 | 3 | A simple wrapper for libwebp, providing a simple interface to decode WebP image data for use in iOS / Mac applications. 4 | 5 | ``` 6 | NSString * const webpPath = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"webp"]; 7 | NSData * const webpData = [[NSData alloc] initWithContentsOfFile:webpPath options:NSDataReadingMappedIfSafe error:NULL]; 8 | self.imageView.image = [STWebPDecoder imageWithData:webpData scale:2 error:NULL]; 9 | ``` 10 | 11 | # STWebPURLProtocol 12 | 13 | More interestingly, this class allows transparent use of WebP images inside UIWebViews. 14 | 15 | ``` 16 | [STWebPURLProtocol registerWithOptions:@{ STWebPURLProtocolOptionClaimWebPExtension: @YES }]; 17 | ``` 18 | … 19 | ``` 20 | [self.webView loadHTMLString:@"" baseURL:nil]; 21 | ``` 22 | -------------------------------------------------------------------------------- /STWebP/STWebPDecoder.h: -------------------------------------------------------------------------------- 1 | // This Source Code Form is subject to the terms of the Mozilla Public 2 | // License, v. 2.0. If a copy of the MPL was not distributed with this 3 | // file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | // 5 | // Copyright (c) 2013-2014 Scott Talbot. 6 | 7 | #import 8 | 9 | #import "STWebP.h" 10 | 11 | 12 | @interface STWebPDecoder : NSObject 13 | 14 | #if defined(STWEBP_UIKIT) && STWEBP_UIKIT 15 | + (UIImage *)imageWithData:(NSData *)data error:(NSError * __autoreleasing *)error; 16 | + (UIImage *)imageWithData:(NSData *)data scale:(CGFloat)scale error:(NSError * __autoreleasing *)error; 17 | #endif 18 | 19 | #if defined(STWEBP_APPKIT) && STWEBP_APPKIT 20 | + (NSImage *)imageWithData:(NSData *)data error:(NSError * __autoreleasing *)error; 21 | + (NSImage *)imageWithData:(NSData *)data scale:(CGFloat)scale error:(NSError * __autoreleasing *)error; 22 | #endif 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /STWebPDecoderExample-iOS/STAppDelegate.m: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2013 Scott Talbot. All rights reserved. 2 | 3 | #import "STAppDelegate.h" 4 | 5 | #import "STWebPViewController.h" 6 | #import "STWebPWebViewController.h" 7 | 8 | #import "STWebPURLProtocol.h" 9 | 10 | 11 | @implementation STAppDelegate 12 | 13 | - (void)setWindow:(UIWindow *)window { 14 | _window = window; 15 | [_window makeKeyAndVisible]; 16 | } 17 | 18 | - (BOOL)application:(UIApplication * __unused)application didFinishLaunchingWithOptions:(NSDictionary * __unused)launchOptions { 19 | UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 20 | window.backgroundColor = [UIColor blackColor]; 21 | 22 | [STWebPURLProtocol registerWithOptions:@{ STWebPURLProtocolOptionClaimWebPExtension: @YES }]; 23 | 24 | STWebPWebViewController *viewController = [STWebPWebViewController viewController]; 25 | UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 26 | window.rootViewController = navController; 27 | 28 | self.window = window; 29 | 30 | return YES; 31 | } 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /STWebP/STWebPStreamingDecoder.h: -------------------------------------------------------------------------------- 1 | // This Source Code Form is subject to the terms of the Mozilla Public 2 | // License, v. 2.0. If a copy of the MPL was not distributed with this 3 | // file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | // 5 | // Copyright (c) 2013-2014 Scott Talbot. 6 | 7 | #import 8 | 9 | 10 | typedef NS_ENUM(NSUInteger, STWebPStreamingDecoderState) { 11 | STWebPStreamingDecoderStateIncomplete = 0, 12 | STWebPStreamingDecoderStateComplete, 13 | STWebPStreamingDecoderStateError, 14 | }; 15 | 16 | @interface STWebPStreamingDecoder : NSObject 17 | 18 | + (instancetype)decoderWithData:(NSData *)data; 19 | - (id)initWithData:(NSData *)data; 20 | 21 | - (STWebPStreamingDecoderState)updateWithData:(NSData *)data; 22 | 23 | @property (nonatomic,assign,readonly) STWebPStreamingDecoderState state; 24 | 25 | #if defined(STWEBP_UIKIT) && STWEBP_UIKIT 26 | - (UIImage *)imageWithScale:(CGFloat)scale; 27 | - (UIImage *)imageWithScale:(CGFloat)scale error:(NSError * __autoreleasing *)error; 28 | #endif 29 | 30 | #if defined(STWEBP_APPKIT) && STWEBP_APPKIT 31 | - (NSImage *)imageWithScale:(CGFloat)scale; 32 | - (NSImage *)imageWithScale:(CGFloat)scale error:(NSError * __autoreleasing *)error; 33 | #endif 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /STWebPDecoderExample-mac/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | com.stalbot.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSMinimumSystemVersion 26 | ${MACOSX_DEPLOYMENT_TARGET} 27 | NSHumanReadableCopyright 28 | Copyright © 2013 Scott Talbot. All rights reserved. 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /STWebPDecoderExample-iOS/STWebPWebViewController.m: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2013 Scott Talbot. All rights reserved. 2 | 3 | #import "STWebPWebViewController.h" 4 | 5 | 6 | @interface STWebPWebViewController () 7 | @property (nonatomic,weak) UIWebView *webView; 8 | @end 9 | 10 | 11 | @implementation STWebPWebViewController 12 | 13 | + (instancetype)viewController { 14 | return [[self alloc] initWithNibName:nil bundle:nil]; 15 | } 16 | 17 | - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 18 | if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 19 | } 20 | return self; 21 | } 22 | 23 | - (void)loadView { 24 | self.view = [[UIView alloc] initWithFrame:(CGRect){ .size = { .width = 768, .height = 1004 } }]; 25 | UIView * const view = self.view; 26 | CGRect const bounds = view.bounds; 27 | 28 | UIWebView *webView = [[UIWebView alloc] initWithFrame:bounds]; 29 | webView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; 30 | self.webView = webView; 31 | [view addSubview:webView]; 32 | } 33 | 34 | - (void)viewDidLoad { 35 | [super viewDidLoad]; 36 | 37 | // double delayInSeconds = 2.0; 38 | // dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 39 | // dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 40 | [self.webView loadHTMLString:@"" baseURL:nil]; 41 | // }); 42 | } 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /STWebPDecoderExample-iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.stalbot.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /STWebP/STWebPDecoder-iOS.m: -------------------------------------------------------------------------------- 1 | // This Source Code Form is subject to the terms of the Mozilla Public 2 | // License, v. 2.0. If a copy of the MPL was not distributed with this 3 | // file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | // 5 | // Copyright (c) 2013 Scott Talbot. 6 | 7 | #import "STWebP.h" 8 | 9 | #import "lib/libwebp/src/webp/decode.h" 10 | 11 | 12 | static void STCGDataProviderReleaseDataCallbackFree(void * __unused info, const void *data, size_t __unused size) { 13 | free((void *)data); 14 | } 15 | 16 | 17 | @implementation STWebPDecoder 18 | 19 | + (UIImage *)imageWithData:(NSData *)data error:(NSError * __autoreleasing *)error { 20 | return [self imageWithData:data scale:1 error:error]; 21 | } 22 | 23 | + (UIImage *)imageWithData:(NSData *)data scale:(CGFloat)scale error:(NSError * __autoreleasing *)error { 24 | int w = 0, h = 0; 25 | uint8_t *bitmapData = WebPDecodeBGRA(data.bytes, data.length, &w, &h); 26 | if (!bitmapData) { 27 | if (error) { 28 | *error = [NSError errorWithDomain:STWebPErrorDomain code:STWebPDecodeFailure userInfo:nil]; 29 | } 30 | return nil; 31 | } 32 | 33 | CGImageRef bitmap = NULL; 34 | { 35 | NSUInteger const bitsPerComponent = 8; 36 | NSUInteger const bytesPerPixel = 4; 37 | NSUInteger const bitsPerPixel = bitsPerComponent * bytesPerPixel; 38 | NSUInteger const stride = (NSUInteger)w * bytesPerPixel; 39 | 40 | CGBitmapInfo const bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaFirst; 41 | 42 | CGColorSpaceRef drgb = CGColorSpaceCreateDeviceRGB(); 43 | if (drgb) { 44 | CGDataProviderRef bitmapDataProvider = CGDataProviderCreateWithData(NULL, bitmapData, (size_t)(stride * h), STCGDataProviderReleaseDataCallbackFree); 45 | 46 | if (bitmapDataProvider) { 47 | bitmap = CGImageCreate((size_t)w, (size_t)h, bitsPerComponent, bitsPerPixel, stride, drgb, bitmapInfo, bitmapDataProvider, NULL, YES, kCGRenderingIntentDefault); 48 | CGDataProviderRelease(bitmapDataProvider); 49 | } 50 | 51 | CGColorSpaceRelease(drgb); 52 | } 53 | } 54 | if (!bitmap) { 55 | if (error) { 56 | *error = [NSError errorWithDomain:STWebPErrorDomain code:STWebPDecodeFailure userInfo:nil]; 57 | } 58 | return nil; 59 | } 60 | 61 | UIImage *image = [[UIImage alloc] initWithCGImage:bitmap scale:scale orientation:UIImageOrientationUp]; 62 | CFRelease(bitmap); 63 | 64 | return image; 65 | } 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /STWebP/STWebPDecoder-mac.m: -------------------------------------------------------------------------------- 1 | // This Source Code Form is subject to the terms of the Mozilla Public 2 | // License, v. 2.0. If a copy of the MPL was not distributed with this 3 | // file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | // 5 | // Copyright (c) 2013 Scott Talbot. 6 | 7 | #import "STWebP.h" 8 | 9 | #import "lib/libwebp/src/webp/decode.h" 10 | 11 | 12 | static void STCGDataProviderReleaseDataCallbackFree(void * __unused info, const void *data, size_t __unused size) { 13 | free((void *)data); 14 | } 15 | 16 | 17 | @implementation STWebPDecoder 18 | 19 | + (NSImage *)imageWithData:(NSData *)data error:(NSError * __autoreleasing *)error { 20 | return [self imageWithData:data scale:1 error:error]; 21 | } 22 | 23 | + (NSImage *)imageWithData:(NSData *)data scale:(CGFloat)scale error:(NSError * __autoreleasing *)error { 24 | int w = 0, h = 0; 25 | uint8_t *bitmapData = WebPDecodeBGRA(data.bytes, data.length, &w, &h); 26 | if (!bitmapData) { 27 | if (error) { 28 | *error = [NSError errorWithDomain:STWebPErrorDomain code:STWebPDecodeFailure userInfo:nil]; 29 | } 30 | return nil; 31 | } 32 | 33 | CGImageRef bitmap = NULL; 34 | { 35 | NSUInteger const bitsPerComponent = 8; 36 | NSUInteger const bytesPerPixel = 4; 37 | NSUInteger const bitsPerPixel = bitsPerComponent * bytesPerPixel; 38 | NSUInteger const stride = (NSUInteger)w * bytesPerPixel; 39 | 40 | CGBitmapInfo const bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaFirst; 41 | 42 | CGColorSpaceRef drgb = CGColorSpaceCreateDeviceRGB(); 43 | if (drgb) { 44 | CGDataProviderRef bitmapDataProvider = CGDataProviderCreateWithData(NULL, bitmapData, (size_t)(stride * h), STCGDataProviderReleaseDataCallbackFree); 45 | 46 | if (bitmapDataProvider) { 47 | bitmap = CGImageCreate((size_t)w, (size_t)h, bitsPerComponent, bitsPerPixel, stride, drgb, bitmapInfo, bitmapDataProvider, NULL, YES, kCGRenderingIntentDefault); 48 | CGDataProviderRelease(bitmapDataProvider); 49 | } 50 | 51 | CGColorSpaceRelease(drgb); 52 | } 53 | } 54 | if (!bitmap) { 55 | if (error) { 56 | *error = [NSError errorWithDomain:STWebPErrorDomain code:STWebPDecodeFailure userInfo:nil]; 57 | } 58 | return nil; 59 | } 60 | 61 | if (scale == 0) { 62 | scale = 1; 63 | } 64 | NSSize const imageSize = (NSSize){ .width = w / scale, .height = h / scale }; 65 | 66 | NSImage *image = [[NSImage alloc] initWithCGImage:bitmap size:imageSize]; 67 | CFRelease(bitmap); 68 | 69 | return image; 70 | } 71 | 72 | @end 73 | -------------------------------------------------------------------------------- /STWebP.xcodeproj/xcshareddata/xcschemes/STWebP-iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 52 | 53 | 54 | 55 | 61 | 62 | 64 | 65 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /STWebP.xcodeproj/xcshareddata/xcschemes/STWebP-mac.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 52 | 53 | 54 | 55 | 61 | 62 | 64 | 65 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /STWebP/STWebPStreamingDecoder-iOS.m: -------------------------------------------------------------------------------- 1 | // This Source Code Form is subject to the terms of the Mozilla Public 2 | // License, v. 2.0. If a copy of the MPL was not distributed with this 3 | // file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | // 5 | // Copyright (c) 2013-2014 Scott Talbot. 6 | 7 | #import "STWebP.h" 8 | 9 | #import "lib/libwebp/src/webp/decode.h" 10 | 11 | 12 | static void STCGDataProviderReleaseDataCallbackFree(void * __unused info, const void *data, size_t __unused size) { 13 | free((void *)data); 14 | } 15 | 16 | 17 | @implementation STWebPStreamingDecoder { 18 | @private 19 | WebPIDecoder *_decoder; 20 | } 21 | 22 | + (instancetype)decoderWithData:(NSData *)data { 23 | return [[self alloc] initWithData:data]; 24 | } 25 | 26 | - (id)init { 27 | return [self initWithData:nil]; 28 | } 29 | 30 | - (id)initWithData:(NSData *)data { 31 | if ((self = [super init])) { 32 | _decoder = WebPINewRGB(MODE_BGRA, NULL, 0, 0); 33 | _state = STWebPStreamingDecoderStateIncomplete; 34 | 35 | if (data) { 36 | [self updateWithData:data]; 37 | } 38 | } 39 | return self; 40 | } 41 | 42 | - (void)dealloc { 43 | WebPIDelete(_decoder), _decoder = NULL; 44 | } 45 | 46 | 47 | - (STWebPStreamingDecoderState)updateWithData:(NSData *)data { 48 | { 49 | switch (_state) { 50 | case STWebPStreamingDecoderStateComplete: 51 | case STWebPStreamingDecoderStateError: 52 | return _state; 53 | case STWebPStreamingDecoderStateIncomplete: 54 | break; 55 | } 56 | } 57 | 58 | if ([data length]) { 59 | VP8StatusCode status = WebPIAppend(_decoder, data.bytes, data.length); 60 | switch (status) { 61 | case VP8_STATUS_OK: 62 | _state = STWebPStreamingDecoderStateComplete; 63 | break; 64 | case VP8_STATUS_SUSPENDED: 65 | _state = STWebPStreamingDecoderStateIncomplete; 66 | break; 67 | case VP8_STATUS_BITSTREAM_ERROR: 68 | case VP8_STATUS_INVALID_PARAM: 69 | case VP8_STATUS_NOT_ENOUGH_DATA: 70 | case VP8_STATUS_OUT_OF_MEMORY: 71 | case VP8_STATUS_UNSUPPORTED_FEATURE: 72 | case VP8_STATUS_USER_ABORT: 73 | _state = STWebPStreamingDecoderStateError; 74 | break; 75 | } 76 | } 77 | 78 | return _state; 79 | } 80 | 81 | - (UIImage *)imageWithScale:(CGFloat)scale { 82 | return [self imageWithScale:scale error:nil]; 83 | } 84 | - (UIImage *)imageWithScale:(CGFloat)scale error:(NSError * __autoreleasing *)error { 85 | switch (_state) { 86 | case STWebPStreamingDecoderStateError: { 87 | if (error) { 88 | *error = [NSError errorWithDomain:STWebPErrorDomain code:STWebPDecodeFailure userInfo:nil]; 89 | } 90 | return nil; 91 | } 92 | case STWebPStreamingDecoderStateIncomplete: 93 | case STWebPStreamingDecoderStateComplete: 94 | break; 95 | } 96 | 97 | int w = 0, h = 0, last_y = 0, stride = 0; 98 | uint8_t *bitmapDataInternal = WebPIDecGetRGB(_decoder, &last_y, &w, &h, &stride); 99 | 100 | if (!bitmapDataInternal) { 101 | if (error) { 102 | *error = [NSError errorWithDomain:STWebPErrorDomain code:STWebPDecodeFailure userInfo:nil]; 103 | } 104 | return nil; 105 | } 106 | 107 | CGImageRef bitmap = NULL; 108 | { 109 | NSUInteger const bitsPerComponent = 8; 110 | NSUInteger const bytesPerPixel = 4; 111 | NSUInteger const bitsPerPixel = bitsPerComponent * bytesPerPixel; 112 | 113 | CGBitmapInfo const bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaFirst; 114 | 115 | CGColorSpaceRef drgb = CGColorSpaceCreateDeviceRGB(); 116 | if (drgb) { 117 | uint8_t *bitmapData = calloc(stride, h); 118 | memcpy(bitmapData, bitmapDataInternal, stride * last_y); 119 | 120 | CGDataProviderRef bitmapDataProvider = CGDataProviderCreateWithData(NULL, bitmapData, (size_t)(stride * h), STCGDataProviderReleaseDataCallbackFree); 121 | 122 | if (bitmapDataProvider) { 123 | bitmap = CGImageCreate((size_t)w, (size_t)h, bitsPerComponent, bitsPerPixel, stride, drgb, bitmapInfo, bitmapDataProvider, NULL, YES, kCGRenderingIntentDefault); 124 | CGDataProviderRelease(bitmapDataProvider); 125 | } else { 126 | free(bitmapData); 127 | } 128 | 129 | CGColorSpaceRelease(drgb); 130 | } 131 | } 132 | if (!bitmap) { 133 | if (error) { 134 | *error = [NSError errorWithDomain:STWebPErrorDomain code:STWebPDecodeFailure userInfo:nil]; 135 | } 136 | return nil; 137 | } 138 | 139 | UIImage *image = [[UIImage alloc] initWithCGImage:bitmap scale:scale orientation:UIImageOrientationUp]; 140 | CFRelease(bitmap); 141 | 142 | return image; 143 | } 144 | 145 | @end 146 | -------------------------------------------------------------------------------- /STWebP/STWebPStreamingDecoder-mac.m: -------------------------------------------------------------------------------- 1 | // This Source Code Form is subject to the terms of the Mozilla Public 2 | // License, v. 2.0. If a copy of the MPL was not distributed with this 3 | // file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | // 5 | // Copyright (c) 2013-2014 Scott Talbot. 6 | 7 | #import "STWebP.h" 8 | 9 | #import "lib/libwebp/src/webp/decode.h" 10 | 11 | 12 | static void STCGDataProviderReleaseDataCallbackFree(void * __unused info, const void *data, size_t __unused size) { 13 | free((void *)data); 14 | } 15 | 16 | 17 | @implementation STWebPStreamingDecoder { 18 | @private 19 | WebPIDecoder *_decoder; 20 | } 21 | 22 | + (instancetype)decoderWithData:(NSData *)data { 23 | return [[self alloc] initWithData:data]; 24 | } 25 | 26 | - (id)init { 27 | return [self initWithData:nil]; 28 | } 29 | 30 | - (id)initWithData:(NSData *)data { 31 | if ((self = [super init])) { 32 | _decoder = WebPINewRGB(MODE_BGRA, NULL, 0, 0); 33 | _state = STWebPStreamingDecoderStateIncomplete; 34 | 35 | if (data) { 36 | [self updateWithData:data]; 37 | } 38 | } 39 | return self; 40 | } 41 | 42 | - (void)dealloc { 43 | WebPIDelete(_decoder), _decoder = NULL; 44 | } 45 | 46 | 47 | - (STWebPStreamingDecoderState)updateWithData:(NSData *)data { 48 | { 49 | switch (_state) { 50 | case STWebPStreamingDecoderStateComplete: 51 | case STWebPStreamingDecoderStateError: 52 | return _state; 53 | case STWebPStreamingDecoderStateIncomplete: 54 | break; 55 | } 56 | } 57 | 58 | if ([data length]) { 59 | VP8StatusCode status = WebPIAppend(_decoder, data.bytes, data.length); 60 | switch (status) { 61 | case VP8_STATUS_OK: 62 | _state = STWebPStreamingDecoderStateComplete; 63 | break; 64 | case VP8_STATUS_SUSPENDED: 65 | _state = STWebPStreamingDecoderStateIncomplete; 66 | break; 67 | case VP8_STATUS_BITSTREAM_ERROR: 68 | case VP8_STATUS_INVALID_PARAM: 69 | case VP8_STATUS_NOT_ENOUGH_DATA: 70 | case VP8_STATUS_OUT_OF_MEMORY: 71 | case VP8_STATUS_UNSUPPORTED_FEATURE: 72 | case VP8_STATUS_USER_ABORT: 73 | _state = STWebPStreamingDecoderStateError; 74 | break; 75 | } 76 | } 77 | 78 | return _state; 79 | } 80 | 81 | - (NSImage *)imageWithScale:(CGFloat)scale { 82 | return [self imageWithScale:scale error:nil]; 83 | } 84 | - (NSImage *)imageWithScale:(CGFloat)scale error:(NSError * __autoreleasing *)error { 85 | switch (_state) { 86 | case STWebPStreamingDecoderStateError: { 87 | if (error) { 88 | *error = [NSError errorWithDomain:STWebPErrorDomain code:STWebPDecodeFailure userInfo:nil]; 89 | } 90 | return nil; 91 | } 92 | case STWebPStreamingDecoderStateIncomplete: 93 | case STWebPStreamingDecoderStateComplete: 94 | break; 95 | } 96 | 97 | int w = 0, h = 0, last_y = 0, stride = 0; 98 | uint8_t *bitmapDataInternal = WebPIDecGetRGB(_decoder, &last_y, &w, &h, &stride); 99 | 100 | if (!bitmapDataInternal) { 101 | if (error) { 102 | *error = [NSError errorWithDomain:STWebPErrorDomain code:STWebPDecodeFailure userInfo:nil]; 103 | } 104 | return nil; 105 | } 106 | 107 | CGImageRef bitmap = NULL; 108 | { 109 | NSUInteger const bitsPerComponent = 8; 110 | NSUInteger const bytesPerPixel = 4; 111 | NSUInteger const bitsPerPixel = bitsPerComponent * bytesPerPixel; 112 | 113 | CGBitmapInfo const bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaFirst; 114 | 115 | CGColorSpaceRef drgb = CGColorSpaceCreateDeviceRGB(); 116 | if (drgb) { 117 | uint8_t *bitmapData = calloc(stride, h); 118 | memcpy(bitmapData, bitmapDataInternal, stride * last_y); 119 | 120 | CGDataProviderRef bitmapDataProvider = CGDataProviderCreateWithData(NULL, bitmapData, (size_t)(stride * h), STCGDataProviderReleaseDataCallbackFree); 121 | 122 | if (bitmapDataProvider) { 123 | bitmap = CGImageCreate((size_t)w, (size_t)h, bitsPerComponent, bitsPerPixel, stride, drgb, bitmapInfo, bitmapDataProvider, NULL, YES, kCGRenderingIntentDefault); 124 | CGDataProviderRelease(bitmapDataProvider); 125 | } else { 126 | free(bitmapData); 127 | } 128 | 129 | CGColorSpaceRelease(drgb); 130 | } 131 | } 132 | if (!bitmap) { 133 | if (error) { 134 | *error = [NSError errorWithDomain:STWebPErrorDomain code:STWebPDecodeFailure userInfo:nil]; 135 | } 136 | return nil; 137 | } 138 | 139 | if (scale == 0) { 140 | scale = 1; 141 | } 142 | NSSize const imageSize = (NSSize){ .width = w / scale, .height = h / scale }; 143 | 144 | NSImage *image = [[NSImage alloc] initWithCGImage:bitmap size:imageSize]; 145 | CFRelease(bitmap); 146 | 147 | return image; 148 | } 149 | 150 | @end 151 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | PROJECTNAME = 'STWebP'.freeze 2 | 3 | begin 4 | require 'bundler' 5 | Bundler.configure 6 | rescue LoadError 7 | end 8 | 9 | require 'pathname' 10 | require 'xctool' 11 | 12 | begin 13 | require 'stcoverage' 14 | require 'stcoveralls' 15 | rescue LoadError 16 | end 17 | 18 | task :default => 'analyze' 19 | 20 | desc "Clean #{PROJECTNAME}-iOS and -mac" 21 | task :clean => [ 'ios', 'mac' ].map { |x| 'clean:' + x } 22 | 23 | namespace :clean do 24 | desc "Clean #{PROJECTNAME}-iOS" 25 | task :ios do IosSim.clean or fail end 26 | 27 | desc "Clean #{PROJECTNAME}-mac" 28 | task :mac do Mac.clean or fail end 29 | end 30 | 31 | desc "Analyze #{PROJECTNAME}-iOS and -mac" 32 | task :analyze => [ 'ios', 'mac' ].map { |x| 'analyze:' + x } 33 | 34 | namespace :analyze do 35 | desc "Analyze #{PROJECTNAME}-iOS" 36 | task :ios do IosSim.analyze or fail end 37 | 38 | desc "Analyze #{PROJECTNAME}-mac" 39 | task :mac do Mac.analyze or fail end 40 | end 41 | 42 | desc "Execute #{PROJECTNAME}Tests-iOS and -mac" 43 | task :test => [ 'ios', 'mac' ].map { |x| 'test:' + x } 44 | 45 | namespace :test do 46 | desc "Execute #{PROJECTNAME}Tests-iOS" 47 | task :ios do IosSim.test or fail end 48 | 49 | desc "Execute #{PROJECTNAME}Tests-mac" 50 | task :mac do Mac.test or fail end 51 | end 52 | 53 | if defined?(Stcoverage) 54 | desc "Calculate test coverage for #{PROJECTNAME}-iOS and -mac" 55 | task :coverage => [ 'ios', 'mac' ].map { |x| 'coverage:' + x } 56 | 57 | namespace :coverage do 58 | desc "Calculate test coverage -iOS" 59 | task :ios do IosSim.coverage or fail end 60 | 61 | desc "Calculate test coverage -iOS" 62 | task :mac do Mac.coverage or fail end 63 | end 64 | 65 | if defined?(Stcoveralls) 66 | namespace :coveralls do 67 | desc "Submit coverage data to coveralls -iOS" 68 | task :ios do IosSim.coveralls or fail end 69 | 70 | desc "Submit coverage data to coveralls -mac" 71 | task :mac do Mac.coveralls or fail end 72 | end 73 | end 74 | end 75 | 76 | 77 | module BuildCommands 78 | def clean 79 | Xctool.exec(@xctool_args, 'clean') 80 | end 81 | 82 | def analyze 83 | Xctool.exec(@xctool_args, 'analyze', ['-failOnWarnings']) 84 | end 85 | 86 | def test 87 | xctool_args = @xctool_args + [ 88 | '-configuration', 'Debug', 89 | 'GCC_GENERATE_TEST_COVERAGE_FILES=YES', 90 | 'GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES', 91 | ] 92 | Xctool.exec(xctool_args, 'test') 93 | end 94 | 95 | if defined?(Stcoverage) 96 | def coverage 97 | cwd = Pathname.getwd 98 | cwds = cwd.to_s 99 | 100 | coverage = stcoverage 101 | 102 | source_lines = 0 103 | covered_lines = 0 104 | coverage.each do |k, v| 105 | next unless k.start_with? cwds 106 | 107 | path = Pathname.new k 108 | next unless path.file? && path.readable? 109 | 110 | relpath = path.relative_path_from cwd 111 | 112 | file_source_lines = v.count 113 | file_covered_lines = v.count {|k, v| v > 0} 114 | file_coverage_fraction = (file_covered_lines / file_source_lines.to_f unless file_source_lines == 0) || 0 115 | puts "#{relpath.to_s}: #{file_covered_lines}/#{file_source_lines} #{(file_coverage_fraction * 100).floor}%" 116 | 117 | source_lines += file_source_lines 118 | covered_lines += file_covered_lines 119 | end 120 | 121 | coverage_fraction = (covered_lines / source_lines.to_f unless source_lines == 0) || 0 122 | puts "Overall: #{(coverage_fraction * 100).floor}%" 123 | true 124 | end 125 | 126 | if defined?(Stcoveralls) 127 | def coveralls 128 | cov = stcoverage 129 | Stcoveralls.coveralls do |c| 130 | c.add_stcoverage_local(cov) 131 | end 132 | end 133 | end 134 | end 135 | 136 | private 137 | 138 | if defined?(Stcoverage) 139 | def stcoverage 140 | xctool_args = @xctool_args + [ 141 | '-configuration', 'Debug', 142 | ] 143 | object_file_path = Xctool.platform_object_files_path(xctool_args) 144 | return {} if object_file_path.nil? 145 | object_file_path = Pathname.new(object_file_path) 146 | return {} unless object_file_path.exist? 147 | 148 | gcfilenames = object_file_path.children.map{ |c| c.cleanpath.to_s if c.fnmatch? '*.gc??' }.compact 149 | Stcoverage.coverage(gcfilenames) 150 | end 151 | end 152 | end 153 | 154 | class IosSim 155 | @xctool_args = [ 156 | '-project', "#{PROJECTNAME}.xcodeproj", 157 | '-scheme', "#{PROJECTNAME}-iOS", 158 | '-sdk', 'iphonesimulator', 159 | 'ONLY_ACTIVE_ARCH=NO', 160 | ].freeze 161 | 162 | extend BuildCommands 163 | end 164 | 165 | class Mac 166 | @xctool_args = [ 167 | '-project', "#{PROJECTNAME}.xcodeproj", 168 | '-scheme', "#{PROJECTNAME}-mac", 169 | '-sdk', 'macosx', 170 | ].freeze 171 | 172 | extend BuildCommands 173 | end 174 | -------------------------------------------------------------------------------- /STWebPDecoderExample-iOS/STWebPViewController.m: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2013 Scott Talbot. All rights reserved. 2 | 3 | #import "STWebPViewController.h" 4 | 5 | #import "STWebPDecoder.h" 6 | 7 | #include 8 | 9 | 10 | //static void CGDataProviderReleaseDataCallbackFree(void *info, const void *data, size_t size); 11 | 12 | 13 | @interface STWebPViewController () 14 | @property (nonatomic,weak) UIImageView *imageView; 15 | @end 16 | 17 | 18 | @implementation STWebPViewController 19 | 20 | + (instancetype)viewController { 21 | return [[self alloc] initWithNibName:nil bundle:nil]; 22 | } 23 | 24 | - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 25 | if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 26 | } 27 | return self; 28 | } 29 | 30 | 31 | - (void)loadView { 32 | self.view = [[UIView alloc] initWithFrame:(CGRect){ .size = { .width = 768, .height = 968 } }]; 33 | UIView * const view = self.view; 34 | view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; 35 | view.backgroundColor = [UIColor whiteColor]; 36 | 37 | UIImageView * const imageView = [[UIImageView alloc] initWithFrame:CGRectZero]; 38 | imageView.contentMode = UIViewContentModeCenter; 39 | [view addSubview:imageView]; 40 | self.imageView = imageView; 41 | } 42 | 43 | 44 | - (void)viewDidLoad { 45 | [super viewDidLoad]; 46 | 47 | mach_timebase_info_data_t timebaseInfo = { }; 48 | (void)mach_timebase_info(&timebaseInfo); 49 | 50 | // @autoreleasepool { 51 | // uint64_t const start = mach_absolute_time(); 52 | // 53 | // for (int i = 0; i < 100; ++i) @autoreleasepool { 54 | // NSString * const webpPath = [[NSBundle mainBundle] pathForResource:@"4" ofType:@"webp"]; 55 | // NSData * const webpData = [NSData dataWithContentsOfFile:webpPath options:NSDataReadingMappedIfSafe error:NULL]; 56 | // 57 | // int bitmapWidth = 0, bitmapHeight = 0; 58 | // uint8_t *bitmapData = WebPDecodeBGRA(webpData.bytes, webpData.length, &bitmapWidth, &bitmapHeight); 59 | // if (!bitmapData) { 60 | // return; 61 | // } 62 | // 63 | // CGDataProviderRef bitmapDataProvider = CGDataProviderCreateWithData(NULL, bitmapData, bitmapWidth * bitmapHeight, CGDataProviderReleaseDataCallbackFree); 64 | // 65 | // CGColorSpaceRef drgb = CGColorSpaceCreateDeviceRGB(); 66 | // CGBitmapInfo const bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaFirst; 67 | // CGImageRef bitmap = CGImageCreate(bitmapWidth, bitmapHeight, 8, 32, bitmapWidth*4, drgb, bitmapInfo, bitmapDataProvider, NULL, YES, kCGRenderingIntentDefault); 68 | // CFRelease(drgb); 69 | // 70 | // UIImage *image = [[UIImage alloc] initWithCGImage:bitmap scale:1 orientation:UIImageOrientationUp]; 71 | // CFRelease(bitmap); 72 | // (void)image; 73 | // } 74 | // uint64_t const end = mach_absolute_time(); 75 | // NSLog(@"webp elapsed: %lluns", ((end - start) * timebaseInfo.numer / timebaseInfo.denom) / 100); 76 | // } 77 | 78 | // @autoreleasepool { 79 | // uint64_t const start = mach_absolute_time(); 80 | // 81 | // NSString * const webpPath = [[NSBundle mainBundle] pathForResource:@"4" ofType:@"webp"]; 82 | // NSData * const webpData = [[NSData alloc] initWithContentsOfFile:webpPath options:NSDataReadingMappedIfSafe error:NULL]; 83 | // 84 | // for (int i = 0; i < 100; ++i) @autoreleasepool { 85 | // 86 | // UIImage * const image = [STWebPDecoder imageWithData:webpData scale:1 error:NULL]; 87 | // (void)image; 88 | // } 89 | // uint64_t const end = mach_absolute_time(); 90 | // NSLog(@"webp elapsed: %lluns", ((end - start) * timebaseInfo.numer / timebaseInfo.denom) / 100); 91 | // } 92 | // 93 | // 94 | // @autoreleasepool { 95 | // uint64_t const start = mach_absolute_time(); 96 | // for (int i = 0; i < 100; ++i) @autoreleasepool { 97 | // NSString * const inputPath = [[NSBundle mainBundle] pathForResource:@"4" ofType:@"jpg"]; 98 | // NSData * const inputData = [NSData dataWithContentsOfFile:inputPath options:NSDataReadingMappedIfSafe error:NULL]; 99 | // 100 | // CGDataProviderRef bitmapDataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)inputData); 101 | // 102 | // CGImageRef bitmap = CGImageCreateWithJPEGDataProvider(bitmapDataProvider, NULL, YES, kCGRenderingIntentDefault); 103 | // 104 | // UIImage *image = [[UIImage alloc] initWithCGImage:bitmap scale:1 orientation:UIImageOrientationUp]; 105 | // CFRelease(bitmap); 106 | // CGDataProviderRelease(bitmapDataProvider); 107 | // (void)image; 108 | // } 109 | // uint64_t const end = mach_absolute_time(); 110 | // NSLog(@"jpeg elapsed: %lluns", ((end - start) * timebaseInfo.numer / timebaseInfo.denom) / 100); 111 | // } 112 | // 113 | // @autoreleasepool { 114 | // uint64_t const start = mach_absolute_time(); 115 | // for (int i = 0; i < 100; ++i) @autoreleasepool { 116 | // NSString * const webpPath = [[NSBundle mainBundle] pathForResource:@"4" ofType:@"jpg"]; 117 | // UIImage *image = [[UIImage alloc] initWithContentsOfFile:webpPath]; 118 | // (void)image; 119 | // } 120 | // uint64_t const end = mach_absolute_time(); 121 | // NSLog(@"jpegi elapsed: %lluns", ((end - start) * timebaseInfo.numer / timebaseInfo.denom) / 100); 122 | // } 123 | 124 | NSString * const webpPath = [[NSBundle mainBundle] pathForResource:@"4" ofType:@"webp"]; 125 | NSData * const webpData = [[NSData alloc] initWithContentsOfFile:webpPath options:NSDataReadingMappedIfSafe error:NULL]; 126 | self.imageView.image = [STWebPDecoder imageWithData:webpData scale:2 error:NULL]; 127 | // self.imageView.image = nil; 128 | } 129 | 130 | - (void)viewWillLayoutSubviews { 131 | [super viewWillLayoutSubviews]; 132 | 133 | UIView * const view = self.view; 134 | CGRect const bounds = view.bounds; 135 | CGSize const boundsSize = bounds.size; 136 | 137 | UIImageView * const imageView = self.imageView; 138 | UIImage * const imageViewImage = imageView.image; 139 | CGSize const imageViewImageSize = imageViewImage ? imageViewImage.size : (CGSize){ 0, 0 }; 140 | 141 | CGRect const imageViewFrame = (CGRect){ 142 | .origin = { 143 | .x = (boundsSize.width - imageViewImageSize.width) / 2, 144 | .y = (boundsSize.height - imageViewImageSize.height) / 2, 145 | }, 146 | .size = imageViewImageSize, 147 | }; 148 | 149 | imageView.frame = imageViewFrame; 150 | } 151 | 152 | @end 153 | 154 | 155 | //static void CGDataProviderReleaseDataCallbackFree(void *info, const void *data, size_t size) { 156 | // free((void *)data); 157 | //}; 158 | -------------------------------------------------------------------------------- /STWebPTests/STWebPDecoderTests-mac.m: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2014 Scott Talbot. All rights reserved. 2 | 3 | #import 4 | 5 | #import 6 | 7 | #import 8 | 9 | 10 | @interface STWebPDecoderTests : XCTestCase 11 | @end 12 | 13 | @implementation STWebPDecoderTests { 14 | @private 15 | NSData *_gridImageData; 16 | NSData *_peakImageData; 17 | } 18 | 19 | - (NSData *)st_bitmapDataForImage:(NSImage *)image { 20 | CGSize const imageSize = image.size; 21 | NSUInteger const bitsPerComponent = 8; 22 | NSUInteger const bytesPerPixel = 4; 23 | NSUInteger const stride = (NSUInteger)imageSize.width * bytesPerPixel; 24 | 25 | CGBitmapInfo const bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst; 26 | 27 | CGColorSpaceRef const drgb = CGColorSpaceCreateDeviceRGB(); 28 | CGContextRef ctx = CGBitmapContextCreate(NULL, (size_t)imageSize.width, (size_t)imageSize.height, bitsPerComponent, stride, drgb, bitmapInfo); 29 | CGColorSpaceRelease(drgb); 30 | CGContextDrawImage(ctx, (CGRect){ .size = imageSize }, [image CGImageForProposedRect:NULL context:nil hints:nil]); 31 | NSData * const imageData = [[NSData alloc] initWithBytes:CGBitmapContextGetData(ctx) length:(NSUInteger)(stride*imageSize.height)]; 32 | 33 | CGContextRelease(ctx); 34 | 35 | return imageData; 36 | } 37 | 38 | - (void)setUp { 39 | [super setUp]; 40 | 41 | NSBundle * const bundle = [NSBundle bundleForClass:self.class]; 42 | { 43 | NSURL * const gridPNGURL = [bundle URLForResource:@"grid" withExtension:@"png" subdirectory:@"libwebp-test-data"]; 44 | NSImage * const gridImage = [[NSImage alloc] initWithContentsOfURL:gridPNGURL]; 45 | _gridImageData = [self st_bitmapDataForImage:gridImage]; 46 | } 47 | { 48 | NSURL * const peakPNGURL = [bundle URLForResource:@"peak" withExtension:@"png" subdirectory:@"libwebp-test-data"]; 49 | NSImage * const peakImage = [[NSImage alloc] initWithContentsOfURL:peakPNGURL]; 50 | _peakImageData = [self st_bitmapDataForImage:peakImage]; 51 | } 52 | } 53 | 54 | - (BOOL)st_checkLosslessVec1Image:(NSImage *)image { 55 | NSData * const imageBitmapData = [self st_bitmapDataForImage:image]; 56 | return [_gridImageData isEqualToData:imageBitmapData]; 57 | } 58 | 59 | - (BOOL)st_testLosslessVec1:(NSUInteger)number { 60 | NSString * const filename = [NSString stringWithFormat:@"lossless_vec_1_%lu", (unsigned long)number]; 61 | NSBundle * const bundle = [NSBundle bundleForClass:self.class]; 62 | NSURL * const url = [bundle URLForResource:filename withExtension:@"webp" subdirectory:@"libwebp-test-data"]; 63 | NSData * const data = [[NSData alloc] initWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:NULL]; 64 | NSImage * const image = [STWebPDecoder imageWithData:data error:NULL]; 65 | return [self st_checkLosslessVec1Image:image]; 66 | } 67 | 68 | - (void)testLosslessVec1_0 { 69 | XCTAssert([self st_testLosslessVec1:0], @""); 70 | } 71 | - (void)testLosslessVec1_1 { 72 | XCTAssert([self st_testLosslessVec1:1], @""); 73 | } 74 | - (void)testLosslessVec1_2 { 75 | XCTAssert([self st_testLosslessVec1:2], @""); 76 | } 77 | - (void)testLosslessVec1_3 { 78 | XCTAssert([self st_testLosslessVec1:3], @""); 79 | } 80 | - (void)testLosslessVec1_4 { 81 | XCTAssert([self st_testLosslessVec1:4], @""); 82 | } 83 | - (void)testLosslessVec1_5 { 84 | XCTAssert([self st_testLosslessVec1:5], @""); 85 | } 86 | - (void)testLosslessVec1_6 { 87 | XCTAssert([self st_testLosslessVec1:6], @""); 88 | } 89 | - (void)testLosslessVec1_7 { 90 | XCTAssert([self st_testLosslessVec1:7], @""); 91 | } 92 | - (void)testLosslessVec1_8 { 93 | XCTAssert([self st_testLosslessVec1:8], @""); 94 | } 95 | - (void)testLosslessVec1_9 { 96 | XCTAssert([self st_testLosslessVec1:9], @""); 97 | } 98 | - (void)testLosslessVec1_10 { 99 | XCTAssert([self st_testLosslessVec1:10], @""); 100 | } 101 | - (void)testLosslessVec1_11 { 102 | XCTAssert([self st_testLosslessVec1:11], @""); 103 | } 104 | - (void)testLosslessVec1_12 { 105 | XCTAssert([self st_testLosslessVec1:12], @""); 106 | } 107 | - (void)testLosslessVec1_13 { 108 | XCTAssert([self st_testLosslessVec1:13], @""); 109 | } 110 | - (void)testLosslessVec1_14 { 111 | XCTAssert([self st_testLosslessVec1:14], @""); 112 | } 113 | - (void)testLosslessVec1_15 { 114 | XCTAssert([self st_testLosslessVec1:15], @""); 115 | } 116 | 117 | - (BOOL)st_checkLosslessVec2Image:(NSImage *)image { 118 | NSData * const imageBitmapData = [self st_bitmapDataForImage:image]; 119 | return [_peakImageData isEqualToData:imageBitmapData]; 120 | } 121 | 122 | - (BOOL)st_testLosslessVec2:(NSUInteger)number { 123 | NSString * const filename = [NSString stringWithFormat:@"lossless_vec_2_%lu", (unsigned long)number]; 124 | NSBundle * const bundle = [NSBundle bundleForClass:self.class]; 125 | NSURL * const url = [bundle URLForResource:filename withExtension:@"webp" subdirectory:@"libwebp-test-data"]; 126 | NSData * const data = [[NSData alloc] initWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:NULL]; 127 | NSImage * const image = [STWebPDecoder imageWithData:data error:NULL]; 128 | return [self st_checkLosslessVec2Image:image]; 129 | } 130 | 131 | - (void)testLosslessVec2_0 { 132 | XCTAssert([self st_testLosslessVec2:0], @""); 133 | } 134 | - (void)testLosslessVec2_1 { 135 | XCTAssert([self st_testLosslessVec2:1], @""); 136 | } 137 | - (void)testLosslessVec2_2 { 138 | XCTAssert([self st_testLosslessVec2:2], @""); 139 | } 140 | - (void)testLosslessVec2_3 { 141 | XCTAssert([self st_testLosslessVec2:3], @""); 142 | } 143 | - (void)testLosslessVec2_4 { 144 | XCTAssert([self st_testLosslessVec2:4], @""); 145 | } 146 | - (void)testLosslessVec2_5 { 147 | XCTAssert([self st_testLosslessVec2:5], @""); 148 | } 149 | - (void)testLosslessVec2_6 { 150 | XCTAssert([self st_testLosslessVec2:6], @""); 151 | } 152 | - (void)testLosslessVec2_7 { 153 | XCTAssert([self st_testLosslessVec2:7], @""); 154 | } 155 | - (void)testLosslessVec2_8 { 156 | XCTAssert([self st_testLosslessVec2:8], @""); 157 | } 158 | - (void)testLosslessVec2_9 { 159 | XCTAssert([self st_testLosslessVec2:9], @""); 160 | } 161 | - (void)testLosslessVec2_10 { 162 | XCTAssert([self st_testLosslessVec2:10], @""); 163 | } 164 | - (void)testLosslessVec2_11 { 165 | XCTAssert([self st_testLosslessVec2:11], @""); 166 | } 167 | - (void)testLosslessVec2_12 { 168 | XCTAssert([self st_testLosslessVec2:12], @""); 169 | } 170 | - (void)testLosslessVec2_13 { 171 | XCTAssert([self st_testLosslessVec2:13], @""); 172 | } 173 | - (void)testLosslessVec2_14 { 174 | XCTAssert([self st_testLosslessVec2:14], @""); 175 | } 176 | - (void)testLosslessVec2_15 { 177 | XCTAssert([self st_testLosslessVec2:15], @""); 178 | } 179 | 180 | @end 181 | -------------------------------------------------------------------------------- /STWebP/STWebPURLProtocol.m: -------------------------------------------------------------------------------- 1 | // This Source Code Form is subject to the terms of the Mozilla Public 2 | // License, v. 2.0. If a copy of the MPL was not distributed with this 3 | // file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | // 5 | // Copyright (c) 2013 Scott Talbot. 6 | 7 | #import "STWebP.h" 8 | 9 | 10 | NSString * const STWebPURLProtocolOptionClaimWebPExtension = @"claim-webp-extension"; 11 | 12 | 13 | NSString * const STWebPURLProtocolSchemePrefix = @"stwebp-"; 14 | static NSUInteger const STWebPURLProtocolSchemePrefixLength = 7; 15 | 16 | static NSString * const STWebPURLRequestHandledKey = @"stwebp-handled"; 17 | static NSString * const STWebPURLRequestHandledValue = @"handled"; 18 | 19 | 20 | static NSDictionary *gSTWebPURLProtocolOptions = nil; 21 | 22 | 23 | @interface STWebPURLProtocol () 24 | @end 25 | 26 | @implementation STWebPURLProtocol { 27 | @private 28 | NSURLConnection *_connection; 29 | STWebPStreamingDecoder *_decoder; 30 | } 31 | 32 | + (void)register { 33 | [self registerWithOptions:nil]; 34 | } 35 | + (void)registerWithOptions:(NSDictionary *)options { 36 | NSAssert([NSThread isMainThread], @"not on main thread"); 37 | 38 | NSMutableDictionary *sanitizedOptions = [[NSMutableDictionary alloc] initWithCapacity:options.count]; 39 | { 40 | id const optionClaimWebPExtension = options[STWebPURLProtocolOptionClaimWebPExtension]; 41 | if ([optionClaimWebPExtension respondsToSelector:@selector(boolValue)] && [optionClaimWebPExtension boolValue]) { 42 | [sanitizedOptions setObject:@YES forKey:STWebPURLProtocolOptionClaimWebPExtension]; 43 | } 44 | } 45 | gSTWebPURLProtocolOptions = [sanitizedOptions copy]; 46 | 47 | [NSURLProtocol registerClass:self]; 48 | } 49 | 50 | + (void)unregister { 51 | NSAssert([NSThread isMainThread], @"not on main thread"); 52 | 53 | [self unregisterClass:self]; 54 | gSTWebPURLProtocolOptions = nil; 55 | } 56 | 57 | + (BOOL)canInitWithRequest:(NSURLRequest *)request { 58 | if ([self propertyForKey:STWebPURLRequestHandledKey inRequest:request] == STWebPURLRequestHandledValue) { 59 | return NO; 60 | } 61 | 62 | NSString * const requestURLScheme = request.URL.scheme.lowercaseString; 63 | 64 | BOOL canProbablyInit = NO; 65 | if ([requestURLScheme hasPrefix:STWebPURLProtocolSchemePrefix]) { 66 | NSString * const deprefixedScheme = [requestURLScheme substringFromIndex:STWebPURLProtocolSchemePrefixLength]; 67 | canProbablyInit = [deprefixedScheme hasPrefix:@"http"]; 68 | } 69 | if (!canProbablyInit && [gSTWebPURLProtocolOptions[STWebPURLProtocolOptionClaimWebPExtension] boolValue]) { 70 | NSString * const requestURLPathExtension = request.URL.pathExtension.lowercaseString; 71 | if ([@"webp" isEqualToString:requestURLPathExtension]) { 72 | canProbablyInit = [requestURLScheme hasPrefix:@"http"]; 73 | } 74 | } 75 | if (!canProbablyInit) { 76 | return NO; 77 | } 78 | request = [self st_canonicalRequestForRequest:request]; 79 | return [NSURLConnection canHandleRequest:request]; 80 | } 81 | 82 | + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { 83 | return [self st_canonicalRequestForRequest:request]; 84 | } 85 | 86 | + (NSURLRequest *)st_canonicalRequestForRequest:(NSURLRequest *)request { 87 | NSURL *url = request.URL; 88 | NSString * const absoluteURLString = [url absoluteString]; 89 | if ([absoluteURLString hasPrefix:STWebPURLProtocolSchemePrefix]) { 90 | url = [NSURL URLWithString:[absoluteURLString substringFromIndex:STWebPURLProtocolSchemePrefixLength]]; 91 | } 92 | NSMutableURLRequest * const modifiedRequest = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:request.cachePolicy timeoutInterval:request.timeoutInterval]; 93 | [modifiedRequest addValue:@"image/webp" forHTTPHeaderField:@"Accept"]; 94 | [self setProperty:STWebPURLRequestHandledValue forKey:STWebPURLRequestHandledKey inRequest:modifiedRequest]; 95 | return modifiedRequest; 96 | } 97 | 98 | 99 | - (id)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id)client { 100 | if ((self = [super initWithRequest:request cachedResponse:cachedResponse client:client])) { 101 | request = [self.class canonicalRequestForRequest:request]; 102 | _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 103 | [_connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 104 | } 105 | return self; 106 | } 107 | 108 | - (void)dealloc { 109 | [_connection cancel]; 110 | } 111 | 112 | 113 | - (void)startLoading { 114 | [_connection start]; 115 | } 116 | 117 | - (void)stopLoading { 118 | [_connection cancel]; 119 | } 120 | 121 | 122 | #pragma mark - NSURLConnectionDelegate 123 | 124 | - (void)connection:(NSURLConnection * __unused)connection didFailWithError:(NSError *)error { 125 | [self.client URLProtocol:self didFailWithError:error]; 126 | } 127 | 128 | 129 | #pragma mark - NSURLConnectionDataDelegate 130 | 131 | - (NSURLRequest *)connection:(NSURLConnection * __unused)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse * __unused)response { 132 | // [self.client URLProtocol:self wasRedirectedToRequest:request redirectResponse:response]; 133 | return request; 134 | } 135 | 136 | - (void)connection:(NSURLConnection * __unused)connection didReceiveResponse:(NSURLResponse *)response { 137 | NSHTTPURLResponse * const httpResponse = [response isKindOfClass:[NSHTTPURLResponse class]] ? (NSHTTPURLResponse *)response : nil; 138 | 139 | if (httpResponse.statusCode != 200) { 140 | [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed]; 141 | return; 142 | } 143 | 144 | NSDictionary * const responseHeaderFields = @{ 145 | @"Content-Type": @"image/png", 146 | @"X-STWebP": @"YES", 147 | }; 148 | 149 | NSURLRequest * const request = self.request; 150 | NSHTTPURLResponse * const modifiedResponse = [[NSHTTPURLResponse alloc] initWithURL:request.URL statusCode:200 HTTPVersion:@"1.0" headerFields:responseHeaderFields]; 151 | 152 | _decoder = [[STWebPStreamingDecoder alloc] init]; 153 | [self.client URLProtocol:self didReceiveResponse:modifiedResponse cacheStoragePolicy:NSURLCacheStorageAllowed]; 154 | } 155 | 156 | - (void)connection:(NSURLConnection * __unused)connection didReceiveData:(NSData *)data { 157 | [_decoder updateWithData:data]; 158 | } 159 | 160 | - (void)connectionDidFinishLoading:(NSURLConnection * __unused)connection { 161 | NSError *error = nil; 162 | UIImage *image = [_decoder imageWithScale:1 error:&error]; 163 | if (!image) { 164 | [self.client URLProtocol:self didFailWithError:error]; 165 | return; 166 | } 167 | 168 | NSData *imagePNGData = UIImagePNGRepresentation(image); 169 | [self.client URLProtocol:self didLoadData:imagePNGData]; 170 | [self.client URLProtocolDidFinishLoading:self]; 171 | } 172 | 173 | @end 174 | -------------------------------------------------------------------------------- /STWebPTests/STWebPDecoderTests-iOS.m: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2014 Scott Talbot. All rights reserved. 2 | 3 | #import 4 | 5 | #import 6 | 7 | #import 8 | 9 | 10 | @interface STWebPDecoderTests : XCTestCase 11 | @end 12 | 13 | @implementation STWebPDecoderTests { 14 | @private 15 | NSData *_gridImageData; 16 | NSData *_peakImageData; 17 | } 18 | 19 | - (NSData *)st_bitmapDataForImage:(UIImage *)image { 20 | CGSize const imageSize = image.size; 21 | CGFloat const imageScale = image.scale; 22 | CGSize const ctxSize = (CGSize){ .width = imageSize.width * imageScale, .height = imageSize.height * imageScale }; 23 | NSUInteger const bitsPerComponent = 8; 24 | NSUInteger const bytesPerPixel = 4; 25 | NSUInteger const stride = (NSUInteger)ctxSize.width * bytesPerPixel; 26 | 27 | CGBitmapInfo const bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst; 28 | 29 | CGColorSpaceRef const drgb = CGColorSpaceCreateDeviceRGB(); 30 | CGContextRef ctx = CGBitmapContextCreate(NULL, (size_t)ctxSize.width, (size_t)ctxSize.height, bitsPerComponent, stride, drgb, bitmapInfo); 31 | CGColorSpaceRelease(drgb); 32 | CGContextDrawImage(ctx, (CGRect){ .size = ctxSize }, image.CGImage); 33 | NSData * const imageData = [[NSData alloc] initWithBytes:CGBitmapContextGetData(ctx) length:(NSUInteger)(stride*ctxSize.height)]; 34 | 35 | CGContextRelease(ctx); 36 | 37 | return imageData; 38 | } 39 | 40 | - (void)setUp { 41 | [super setUp]; 42 | 43 | NSBundle * const bundle = [NSBundle bundleForClass:self.class]; 44 | { 45 | NSURL * const gridPNGURL = [bundle URLForResource:@"grid" withExtension:@"png" subdirectory:@"libwebp-test-data"]; 46 | UIImage * const gridImage = [[UIImage alloc] initWithContentsOfFile:gridPNGURL.path]; 47 | _gridImageData = [self st_bitmapDataForImage:gridImage]; 48 | } 49 | { 50 | NSURL * const peakPNGURL = [bundle URLForResource:@"peak" withExtension:@"png" subdirectory:@"libwebp-test-data"]; 51 | UIImage * const peakImage = [[UIImage alloc] initWithContentsOfFile:peakPNGURL.path]; 52 | _peakImageData = [self st_bitmapDataForImage:peakImage]; 53 | } 54 | } 55 | 56 | - (BOOL)st_checkLosslessVec1Image:(UIImage *)image { 57 | NSData * const imageBitmapData = [self st_bitmapDataForImage:image]; 58 | return [_gridImageData isEqualToData:imageBitmapData]; 59 | } 60 | 61 | - (BOOL)st_testLosslessVec1:(NSUInteger)number { 62 | NSString * const filename = [NSString stringWithFormat:@"lossless_vec_1_%lu", (unsigned long)number]; 63 | NSBundle * const bundle = [NSBundle bundleForClass:self.class]; 64 | NSURL * const url = [bundle URLForResource:filename withExtension:@"webp" subdirectory:@"libwebp-test-data"]; 65 | NSData * const data = [[NSData alloc] initWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:NULL]; 66 | UIImage * const image = [STWebPDecoder imageWithData:data error:NULL]; 67 | return [self st_checkLosslessVec1Image:image]; 68 | } 69 | 70 | - (void)testLosslessVec1_0 { 71 | XCTAssert([self st_testLosslessVec1:0], @""); 72 | } 73 | - (void)testLosslessVec1_1 { 74 | XCTAssert([self st_testLosslessVec1:1], @""); 75 | } 76 | - (void)testLosslessVec1_2 { 77 | XCTAssert([self st_testLosslessVec1:2], @""); 78 | } 79 | - (void)testLosslessVec1_3 { 80 | XCTAssert([self st_testLosslessVec1:3], @""); 81 | } 82 | - (void)testLosslessVec1_4 { 83 | XCTAssert([self st_testLosslessVec1:4], @""); 84 | } 85 | - (void)testLosslessVec1_5 { 86 | XCTAssert([self st_testLosslessVec1:5], @""); 87 | } 88 | - (void)testLosslessVec1_6 { 89 | XCTAssert([self st_testLosslessVec1:6], @""); 90 | } 91 | - (void)testLosslessVec1_7 { 92 | XCTAssert([self st_testLosslessVec1:7], @""); 93 | } 94 | - (void)testLosslessVec1_8 { 95 | XCTAssert([self st_testLosslessVec1:8], @""); 96 | } 97 | - (void)testLosslessVec1_9 { 98 | XCTAssert([self st_testLosslessVec1:9], @""); 99 | } 100 | - (void)testLosslessVec1_10 { 101 | XCTAssert([self st_testLosslessVec1:10], @""); 102 | } 103 | - (void)testLosslessVec1_11 { 104 | XCTAssert([self st_testLosslessVec1:11], @""); 105 | } 106 | - (void)testLosslessVec1_12 { 107 | XCTAssert([self st_testLosslessVec1:12], @""); 108 | } 109 | - (void)testLosslessVec1_13 { 110 | XCTAssert([self st_testLosslessVec1:13], @""); 111 | } 112 | - (void)testLosslessVec1_14 { 113 | XCTAssert([self st_testLosslessVec1:14], @""); 114 | } 115 | - (void)testLosslessVec1_15 { 116 | XCTAssert([self st_testLosslessVec1:15], @""); 117 | } 118 | 119 | - (BOOL)st_checkLosslessVec2Image:(UIImage *)image { 120 | NSData * const imageBitmapData = [self st_bitmapDataForImage:image]; 121 | return [_peakImageData isEqualToData:imageBitmapData]; 122 | } 123 | 124 | - (BOOL)st_testLosslessVec2:(NSUInteger)number { 125 | NSString * const filename = [NSString stringWithFormat:@"lossless_vec_2_%lu", (unsigned long)number]; 126 | NSBundle * const bundle = [NSBundle bundleForClass:self.class]; 127 | NSURL * const url = [bundle URLForResource:filename withExtension:@"webp" subdirectory:@"libwebp-test-data"]; 128 | NSData * const data = [[NSData alloc] initWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:NULL]; 129 | UIImage * const image = [STWebPDecoder imageWithData:data error:NULL]; 130 | return [self st_checkLosslessVec2Image:image]; 131 | } 132 | 133 | - (void)testLosslessVec2_0 { 134 | XCTAssert([self st_testLosslessVec2:0], @""); 135 | } 136 | - (void)testLosslessVec2_1 { 137 | XCTAssert([self st_testLosslessVec2:1], @""); 138 | } 139 | - (void)testLosslessVec2_2 { 140 | XCTAssert([self st_testLosslessVec2:2], @""); 141 | } 142 | - (void)testLosslessVec2_3 { 143 | XCTAssert([self st_testLosslessVec2:3], @""); 144 | } 145 | - (void)testLosslessVec2_4 { 146 | XCTAssert([self st_testLosslessVec2:4], @""); 147 | } 148 | - (void)testLosslessVec2_5 { 149 | XCTAssert([self st_testLosslessVec2:5], @""); 150 | } 151 | - (void)testLosslessVec2_6 { 152 | XCTAssert([self st_testLosslessVec2:6], @""); 153 | } 154 | - (void)testLosslessVec2_7 { 155 | XCTAssert([self st_testLosslessVec2:7], @""); 156 | } 157 | - (void)testLosslessVec2_8 { 158 | XCTAssert([self st_testLosslessVec2:8], @""); 159 | } 160 | - (void)testLosslessVec2_9 { 161 | XCTAssert([self st_testLosslessVec2:9], @""); 162 | } 163 | - (void)testLosslessVec2_10 { 164 | XCTAssert([self st_testLosslessVec2:10], @""); 165 | } 166 | - (void)testLosslessVec2_11 { 167 | XCTAssert([self st_testLosslessVec2:11], @""); 168 | } 169 | - (void)testLosslessVec2_12 { 170 | XCTAssert([self st_testLosslessVec2:12], @""); 171 | } 172 | - (void)testLosslessVec2_13 { 173 | XCTAssert([self st_testLosslessVec2:13], @""); 174 | } 175 | - (void)testLosslessVec2_14 { 176 | XCTAssert([self st_testLosslessVec2:14], @""); 177 | } 178 | - (void)testLosslessVec2_15 { 179 | XCTAssert([self st_testLosslessVec2:15], @""); 180 | } 181 | 182 | @end 183 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /STWebPDecoderExample-mac/en.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1080 5 | 12D78 6 | 3084 7 | 1187.37 8 | 626.00 9 | 10 | com.apple.InterfaceBuilder.CocoaPlugin 11 | 3084 12 | 13 | 14 | IBNSLayoutConstraint 15 | NSCustomObject 16 | NSImageCell 17 | NSImageView 18 | NSMenu 19 | NSMenuItem 20 | NSView 21 | NSWindowTemplate 22 | 23 | 24 | com.apple.InterfaceBuilder.CocoaPlugin 25 | 26 | 27 | PluginDependencyRecalculationVersion 28 | 29 | 30 | 31 | 32 | NSApplication 33 | 34 | 35 | FirstResponder 36 | 37 | 38 | NSApplication 39 | 40 | 41 | AMainMenu 42 | 43 | 44 | 45 | STWebPDecoderExample-mac 46 | 47 | 1048576 48 | 2147483647 49 | 50 | NSImage 51 | NSMenuCheckmark 52 | 53 | 54 | NSImage 55 | NSMenuMixedState 56 | 57 | submenuAction: 58 | 59 | STWebPDecoderExample-mac 60 | 61 | 62 | 63 | Quit STWebPDecoderExample-mac 64 | q 65 | 1048576 66 | 2147483647 67 | 68 | 69 | 70 | 71 | _NSAppleMenu 72 | 73 | 74 | 75 | _NSMainMenu 76 | 77 | 78 | 15 79 | 2 80 | {{335, 390}, {480, 360}} 81 | 1954021376 82 | STWebPDecoderExample-mac 83 | NSWindow 84 | 85 | 86 | 87 | 88 | 256 89 | 90 | 91 | 92 | 268 93 | 94 | Apple PDF pasteboard type 95 | Apple PICT pasteboard type 96 | Apple PNG pasteboard type 97 | NSFilenamesPboardType 98 | NeXT Encapsulated PostScript v1.2 pasteboard type 99 | NeXT TIFF v4.0 pasteboard type 100 | 101 | {480, 360} 102 | 103 | 104 | _NS:9 105 | YES 106 | 107 | 134217728 108 | 33554432 109 | _NS:9 110 | 0 111 | 2 112 | 0 113 | NO 114 | 115 | NO 116 | YES 117 | 118 | 119 | {480, 360} 120 | 121 | 122 | 123 | {{0, 0}, {1440, 878}} 124 | {10000000000000, 10000000000000} 125 | YES 126 | 127 | 128 | STAppDelegate 129 | 130 | 131 | NSFontManager 132 | 133 | 134 | 135 | 136 | 137 | 138 | terminate: 139 | 140 | 141 | 142 | 449 143 | 144 | 145 | 146 | delegate 147 | 148 | 149 | 150 | 495 151 | 152 | 153 | 154 | window 155 | 156 | 157 | 158 | 532 159 | 160 | 161 | 162 | imageView 163 | 164 | 165 | 166 | 564 167 | 168 | 169 | 170 | 171 | 172 | 0 173 | 174 | 175 | 176 | 177 | 178 | -2 179 | 180 | 181 | File's Owner 182 | 183 | 184 | -1 185 | 186 | 187 | First Responder 188 | 189 | 190 | -3 191 | 192 | 193 | Application 194 | 195 | 196 | 29 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 56 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 57 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 136 221 | 222 | 223 | 224 | 225 | 371 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 372 234 | 235 | 236 | 237 | 238 | 6 239 | 0 240 | 241 | 6 242 | 1 243 | 244 | 0.0 245 | 246 | 1000 247 | 248 | 8 249 | 29 250 | 3 251 | 252 | 253 | 254 | 3 255 | 0 256 | 257 | 3 258 | 1 259 | 260 | 0.0 261 | 262 | 1000 263 | 264 | 8 265 | 29 266 | 3 267 | 268 | 269 | 270 | 4 271 | 0 272 | 273 | 4 274 | 1 275 | 276 | 0.0 277 | 278 | 1000 279 | 280 | 8 281 | 29 282 | 3 283 | 284 | 285 | 286 | 5 287 | 0 288 | 289 | 5 290 | 1 291 | 292 | 0.0 293 | 294 | 1000 295 | 296 | 8 297 | 29 298 | 3 299 | 300 | 301 | 302 | 303 | 304 | 305 | 420 306 | 307 | 308 | 309 | 310 | 494 311 | 312 | 313 | 314 | 315 | 536 316 | 317 | 318 | 319 | 320 | 321 | 7 322 | 1 323 | 324 | 0 325 | 1 326 | 327 | 42 328 | 329 | 1000 330 | 331 | 9 332 | 40 333 | 1 334 | 335 | 336 | 337 | 8 338 | 1 339 | 340 | 0 341 | 1 342 | 343 | 42 344 | 345 | 1000 346 | 347 | 9 348 | 40 349 | 1 350 | 351 | 352 | 353 | 354 | 355 | 537 356 | 357 | 358 | 359 | 360 | 540 361 | 362 | 363 | 364 | 365 | 541 366 | 367 | 368 | 369 | 370 | 577 371 | 372 | 373 | 374 | 375 | 580 376 | 377 | 378 | 379 | 380 | 604 381 | 382 | 383 | 384 | 385 | 605 386 | 387 | 388 | 389 | 390 | 391 | 392 | com.apple.InterfaceBuilder.CocoaPlugin 393 | com.apple.InterfaceBuilder.CocoaPlugin 394 | com.apple.InterfaceBuilder.CocoaPlugin 395 | com.apple.InterfaceBuilder.CocoaPlugin 396 | com.apple.InterfaceBuilder.CocoaPlugin 397 | com.apple.InterfaceBuilder.CocoaPlugin 398 | {{380, 496}, {480, 360}} 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | com.apple.InterfaceBuilder.CocoaPlugin 407 | com.apple.InterfaceBuilder.CocoaPlugin 408 | com.apple.InterfaceBuilder.CocoaPlugin 409 | 410 | 411 | 412 | 413 | 414 | com.apple.InterfaceBuilder.CocoaPlugin 415 | com.apple.InterfaceBuilder.CocoaPlugin 416 | com.apple.InterfaceBuilder.CocoaPlugin 417 | com.apple.InterfaceBuilder.CocoaPlugin 418 | com.apple.InterfaceBuilder.CocoaPlugin 419 | com.apple.InterfaceBuilder.CocoaPlugin 420 | com.apple.InterfaceBuilder.CocoaPlugin 421 | com.apple.InterfaceBuilder.CocoaPlugin 422 | com.apple.InterfaceBuilder.CocoaPlugin 423 | com.apple.InterfaceBuilder.CocoaPlugin 424 | 425 | 426 | 427 | 428 | 429 | 605 430 | 431 | 432 | 433 | 434 | NSLayoutConstraint 435 | NSObject 436 | 437 | IBProjectSource 438 | ./Classes/NSLayoutConstraint.h 439 | 440 | 441 | 442 | STAppDelegate 443 | NSObject 444 | 445 | NSImageView 446 | NSWindow 447 | 448 | 449 | 450 | imageView 451 | NSImageView 452 | 453 | 454 | window 455 | NSWindow 456 | 457 | 458 | 459 | IBProjectSource 460 | ./Classes/STAppDelegate.h 461 | 462 | 463 | 464 | 465 | 0 466 | IBCocoaFramework 467 | YES 468 | 3 469 | 470 | {11, 11} 471 | {10, 3} 472 | 473 | YES 474 | 475 | 476 | -------------------------------------------------------------------------------- /STWebP.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 2C0EC12E18A2279200C47CC0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CBA51BD189BC15400529073 /* XCTest.framework */; }; 11 | 2C0EC13618A2279200C47CC0 /* STWebPDecoderTests-mac.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C0EC13518A2279200C47CC0 /* STWebPDecoderTests-mac.m */; }; 12 | 2C0EC13F18A2280800C47CC0 /* libwebp-test-data in Resources */ = {isa = PBXBuildFile; fileRef = 2C0EC13E18A2280800C47CC0 /* libwebp-test-data */; }; 13 | 2C0EC14018A22ED100C47CC0 /* libSTWebP.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CE5C690172C83EF00CB54A5 /* libSTWebP.a */; }; 14 | 2C0EC14118A22EDC00C47CC0 /* libwebp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CBA51D6189BC25100529073 /* libwebp.a */; }; 15 | 2C0EC14718A2426100C47CC0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CBA51BD189BC15400529073 /* XCTest.framework */; }; 16 | 2C0EC14918A2426100C47CC0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C605BB21727CEE500CE8626 /* UIKit.framework */; }; 17 | 2C0EC15118A2426100C47CC0 /* STWebPDecoderTests-iOS.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C0EC15018A2426100C47CC0 /* STWebPDecoderTests-iOS.m */; }; 18 | 2C0EC15818A242A700C47CC0 /* libwebp-test-data in Resources */ = {isa = PBXBuildFile; fileRef = 2C0EC13E18A2280800C47CC0 /* libwebp-test-data */; }; 19 | 2C0EC15918A2437100C47CC0 /* libSTWebP.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CFC2D21172BD74300893638 /* libSTWebP.a */; }; 20 | 2C0EC15A18A2437400C47CC0 /* libwebp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CBA51AF189BC15400529073 /* libwebp.a */; }; 21 | 2C5BD00F173157D2006B6AC5 /* STWebPURLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C5BD00D173157D2006B6AC5 /* STWebPURLProtocol.m */; }; 22 | 2C5BD01317327425006B6AC5 /* STWebPWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C5BD01217327425006B6AC5 /* STWebPWebViewController.m */; }; 23 | 2C605BB31727CEE500CE8626 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C605BB21727CEE500CE8626 /* UIKit.framework */; }; 24 | 2C605BB51727CEE500CE8626 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C605BB41727CEE500CE8626 /* Foundation.framework */; }; 25 | 2C605BBF1727CEE500CE8626 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C605BBE1727CEE500CE8626 /* main.m */; }; 26 | 2C605BC31727CEE500CE8626 /* STAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C605BC21727CEE500CE8626 /* STAppDelegate.m */; }; 27 | 2C605BC51727CEE500CE8626 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 2C605BC41727CEE500CE8626 /* Default.png */; }; 28 | 2C605BC71727CEE500CE8626 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 2C605BC61727CEE500CE8626 /* Default@2x.png */; }; 29 | 2C605BC91727CEE500CE8626 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 2C605BC81727CEE500CE8626 /* Default-568h@2x.png */; }; 30 | 2C605BD61727D85700CE8626 /* STWebPViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C605BD51727D85700CE8626 /* STWebPViewController.m */; }; 31 | 2C605BD81727DA9800CE8626 /* 4.webp in Resources */ = {isa = PBXBuildFile; fileRef = 2C605BD71727DA9700CE8626 /* 4.webp */; }; 32 | 2C605BDA1727E1D000CE8626 /* 5_webp_a.webp in Resources */ = {isa = PBXBuildFile; fileRef = 2C605BD91727E1D000CE8626 /* 5_webp_a.webp */; }; 33 | 2C605BDC1727E33B00CE8626 /* 4.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 2C605BDB1727E33B00CE8626 /* 4.jpg */; }; 34 | 2C751345172C8B020036F82B /* 4.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 2C605BDB1727E33B00CE8626 /* 4.jpg */; }; 35 | 2C751346172C8B020036F82B /* 4.webp in Resources */ = {isa = PBXBuildFile; fileRef = 2C605BD71727DA9700CE8626 /* 4.webp */; }; 36 | 2C751347172C8B020036F82B /* 5_webp_a.webp in Resources */ = {isa = PBXBuildFile; fileRef = 2C605BD91727E1D000CE8626 /* 5_webp_a.webp */; }; 37 | 2C7D692E18A251160067B4A5 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CBA5199189A8BBE00529073 /* AppKit.framework */; }; 38 | 2C7D693018A2666A0067B4A5 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C7D692F18A2666A0067B4A5 /* CoreGraphics.framework */; }; 39 | 2CB9CC2B172C85EC0054BC07 /* STWebPDecoder-mac.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CB9CC29172C85EC0054BC07 /* STWebPDecoder-mac.m */; }; 40 | 2CB9CC39172C86E10054BC07 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CB9CC38172C86E10054BC07 /* main.m */; }; 41 | 2CB9CC3D172C86E10054BC07 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 2CB9CC3B172C86E10054BC07 /* Credits.rtf */; }; 42 | 2CB9CC40172C86E10054BC07 /* STAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CB9CC3F172C86E10054BC07 /* STAppDelegate.m */; }; 43 | 2CB9CC43172C86E20054BC07 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2CB9CC41172C86E20054BC07 /* MainMenu.xib */; }; 44 | 2CB9CC49172C87170054BC07 /* libSTWebP.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CE5C690172C83EF00CB54A5 /* libSTWebP.a */; }; 45 | 2CBA519A189A8BBE00529073 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CBA5199189A8BBE00529073 /* AppKit.framework */; }; 46 | 2CBA519E189A8BCA00529073 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CBA519D189A8BCA00529073 /* QuartzCore.framework */; }; 47 | 2CBA51FB189BC30D00529073 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F57C172A8CDE00FC9B99 /* enc.c */; }; 48 | 2CBA51FC189BC30D00529073 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F57C172A8CDE00FC9B99 /* enc.c */; }; 49 | 2CBA51FD189BC31200529073 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F57D172A8CDE00FC9B99 /* enc_neon.c */; }; 50 | 2CBA51FE189BC31200529073 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F57E172A8CDE00FC9B99 /* enc_sse2.c */; }; 51 | 2CBA51FF189BC31300529073 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F57D172A8CDE00FC9B99 /* enc_neon.c */; }; 52 | 2CBA5200189BC31300529073 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F57E172A8CDE00FC9B99 /* enc_sse2.c */; }; 53 | 2CBA5201189BC34900529073 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F560172A8CDE00FC9B99 /* alpha.c */; }; 54 | 2CBA5202189BC34900529073 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F561172A8CDE00FC9B99 /* buffer.c */; }; 55 | 2CBA5203189BC34900529073 /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F563172A8CDE00FC9B99 /* frame.c */; }; 56 | 2CBA5204189BC34900529073 /* idec.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F564172A8CDE00FC9B99 /* idec.c */; }; 57 | 2CBA5205189BC34900529073 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F565172A8CDE00FC9B99 /* io.c */; }; 58 | 2CBA5206189BC34900529073 /* layer.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F566172A8CDE00FC9B99 /* layer.c */; }; 59 | 2CBA5207189BC34900529073 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F569172A8CDE00FC9B99 /* quant.c */; }; 60 | 2CBA5208189BC34900529073 /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F56A172A8CDE00FC9B99 /* tree.c */; }; 61 | 2CBA5209189BC34900529073 /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F56B172A8CDE00FC9B99 /* vp8.c */; }; 62 | 2CBA520A189BC34900529073 /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F56D172A8CDE00FC9B99 /* vp8l.c */; }; 63 | 2CBA520B189BC34900529073 /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F56F172A8CDE00FC9B99 /* webp.c */; }; 64 | 2CBA520C189BC34900529073 /* demux.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F572172A8CDE00FC9B99 /* demux.c */; }; 65 | 2CBA520D189BC34900529073 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F577172A8CDE00FC9B99 /* cpu.c */; }; 66 | 2CBA520E189BC34900529073 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F578172A8CDE00FC9B99 /* dec.c */; }; 67 | 2CBA520F189BC34900529073 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F579172A8CDE00FC9B99 /* dec_neon.c */; }; 68 | 2CBA5210189BC34900529073 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F57A172A8CDE00FC9B99 /* dec_sse2.c */; }; 69 | 2CBA5211189BC34900529073 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F57F172A8CDE00FC9B99 /* lossless.c */; }; 70 | 2CBA5212189BC34900529073 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F583172A8CDE00FC9B99 /* upsampling.c */; }; 71 | 2CBA5213189BC34900529073 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F584172A8CDE00FC9B99 /* upsampling_neon.c */; }; 72 | 2CBA5214189BC34900529073 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F585172A8CDE00FC9B99 /* upsampling_sse2.c */; }; 73 | 2CBA5215189BC34900529073 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F586172A8CDE00FC9B99 /* yuv.c */; }; 74 | 2CBA5216189BC34900529073 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F589172A8CDE00FC9B99 /* alpha.c */; }; 75 | 2CBA5217189BC34900529073 /* analysis.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F58A172A8CDE00FC9B99 /* analysis.c */; }; 76 | 2CBA5218189BC34900529073 /* backward_references.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F58B172A8CDE00FC9B99 /* backward_references.c */; }; 77 | 2CBA5219189BC34900529073 /* config.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F58D172A8CDE00FC9B99 /* config.c */; }; 78 | 2CBA521A189BC34900529073 /* cost.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F58E172A8CDE00FC9B99 /* cost.c */; }; 79 | 2CBA521B189BC34900529073 /* filter.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F590172A8CDE00FC9B99 /* filter.c */; }; 80 | 2CBA521C189BC34900529073 /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F591172A8CDE00FC9B99 /* frame.c */; }; 81 | 2CBA521D189BC34900529073 /* histogram.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F592172A8CDE00FC9B99 /* histogram.c */; }; 82 | 2CBA521E189BC34900529073 /* iterator.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F594172A8CDE00FC9B99 /* iterator.c */; }; 83 | 2CBA521F189BC34900529073 /* layer.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F595172A8CDE00FC9B99 /* layer.c */; }; 84 | 2CBA5220189BC34900529073 /* picture.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F598172A8CDE00FC9B99 /* picture.c */; }; 85 | 2CBA5221189BC34900529073 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F599172A8CDE00FC9B99 /* quant.c */; }; 86 | 2CBA5222189BC34900529073 /* syntax.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F59A172A8CDE00FC9B99 /* syntax.c */; }; 87 | 2CBA5223189BC34900529073 /* token.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F59B172A8CDE00FC9B99 /* token.c */; }; 88 | 2CBA5224189BC34900529073 /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F59C172A8CDE00FC9B99 /* tree.c */; }; 89 | 2CBA5225189BC34900529073 /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F59E172A8CDE00FC9B99 /* vp8l.c */; }; 90 | 2CBA5226189BC34900529073 /* webpenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5A0172A8CDE00FC9B99 /* webpenc.c */; }; 91 | 2CBA5227189BC34900529073 /* muxedit.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5A9172A8CDE00FC9B99 /* muxedit.c */; }; 92 | 2CBA5228189BC34900529073 /* muxinternal.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5AB172A8CDE00FC9B99 /* muxinternal.c */; }; 93 | 2CBA5229189BC34900529073 /* muxread.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5AC172A8CDE00FC9B99 /* muxread.c */; }; 94 | 2CBA522A189BC34900529073 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CCC346A17F040E600EC7B66 /* alpha_processing.c */; }; 95 | 2CBA522B189BC34900529073 /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5AE172A8CDE00FC9B99 /* bit_reader.c */; }; 96 | 2CBA522C189BC34900529073 /* bit_writer.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5B0172A8CDE00FC9B99 /* bit_writer.c */; }; 97 | 2CBA522D189BC34900529073 /* color_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5B2172A8CDE00FC9B99 /* color_cache.c */; }; 98 | 2CBA522E189BC34900529073 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5B4172A8CDE00FC9B99 /* filters.c */; }; 99 | 2CBA522F189BC34900529073 /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5B6172A8CDE00FC9B99 /* huffman.c */; }; 100 | 2CBA5230189BC34900529073 /* huffman_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5B8172A8CDE00FC9B99 /* huffman_encode.c */; }; 101 | 2CBA5231189BC34900529073 /* quant_levels.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5BC172A8CDE00FC9B99 /* quant_levels.c */; }; 102 | 2CBA5232189BC34900529073 /* quant_levels_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5BE172A8CDE00FC9B99 /* quant_levels_dec.c */; }; 103 | 2CBA5233189BC34900529073 /* random.c in Sources */ = {isa = PBXBuildFile; fileRef = 2C61728B187AC82D0082C342 /* random.c */; }; 104 | 2CBA5234189BC34900529073 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5C0172A8CDE00FC9B99 /* rescaler.c */; }; 105 | 2CBA5235189BC34900529073 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5C2172A8CDE00FC9B99 /* thread.c */; }; 106 | 2CBA5236189BC34900529073 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5C4172A8CDE00FC9B99 /* utils.c */; }; 107 | 2CBA5237189BC34A00529073 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F560172A8CDE00FC9B99 /* alpha.c */; }; 108 | 2CBA5238189BC34A00529073 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F561172A8CDE00FC9B99 /* buffer.c */; }; 109 | 2CBA5239189BC34A00529073 /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F563172A8CDE00FC9B99 /* frame.c */; }; 110 | 2CBA523A189BC34A00529073 /* idec.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F564172A8CDE00FC9B99 /* idec.c */; }; 111 | 2CBA523B189BC34A00529073 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F565172A8CDE00FC9B99 /* io.c */; }; 112 | 2CBA523C189BC34A00529073 /* layer.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F566172A8CDE00FC9B99 /* layer.c */; }; 113 | 2CBA523D189BC34A00529073 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F569172A8CDE00FC9B99 /* quant.c */; }; 114 | 2CBA523E189BC34A00529073 /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F56A172A8CDE00FC9B99 /* tree.c */; }; 115 | 2CBA523F189BC34A00529073 /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F56B172A8CDE00FC9B99 /* vp8.c */; }; 116 | 2CBA5240189BC34A00529073 /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F56D172A8CDE00FC9B99 /* vp8l.c */; }; 117 | 2CBA5241189BC34A00529073 /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F56F172A8CDE00FC9B99 /* webp.c */; }; 118 | 2CBA5242189BC34A00529073 /* demux.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F572172A8CDE00FC9B99 /* demux.c */; }; 119 | 2CBA5243189BC34A00529073 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F577172A8CDE00FC9B99 /* cpu.c */; }; 120 | 2CBA5244189BC34A00529073 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F578172A8CDE00FC9B99 /* dec.c */; }; 121 | 2CBA5245189BC34A00529073 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F579172A8CDE00FC9B99 /* dec_neon.c */; }; 122 | 2CBA5246189BC34A00529073 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F57A172A8CDE00FC9B99 /* dec_sse2.c */; }; 123 | 2CBA5247189BC34A00529073 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F57F172A8CDE00FC9B99 /* lossless.c */; }; 124 | 2CBA5248189BC34A00529073 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F583172A8CDE00FC9B99 /* upsampling.c */; }; 125 | 2CBA5249189BC34A00529073 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F584172A8CDE00FC9B99 /* upsampling_neon.c */; }; 126 | 2CBA524A189BC34A00529073 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F585172A8CDE00FC9B99 /* upsampling_sse2.c */; }; 127 | 2CBA524B189BC34A00529073 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F586172A8CDE00FC9B99 /* yuv.c */; }; 128 | 2CBA524C189BC34A00529073 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F589172A8CDE00FC9B99 /* alpha.c */; }; 129 | 2CBA524D189BC34A00529073 /* analysis.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F58A172A8CDE00FC9B99 /* analysis.c */; }; 130 | 2CBA524E189BC34A00529073 /* backward_references.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F58B172A8CDE00FC9B99 /* backward_references.c */; }; 131 | 2CBA524F189BC34A00529073 /* config.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F58D172A8CDE00FC9B99 /* config.c */; }; 132 | 2CBA5250189BC34A00529073 /* cost.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F58E172A8CDE00FC9B99 /* cost.c */; }; 133 | 2CBA5251189BC34A00529073 /* filter.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F590172A8CDE00FC9B99 /* filter.c */; }; 134 | 2CBA5252189BC34A00529073 /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F591172A8CDE00FC9B99 /* frame.c */; }; 135 | 2CBA5253189BC34A00529073 /* histogram.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F592172A8CDE00FC9B99 /* histogram.c */; }; 136 | 2CBA5254189BC34A00529073 /* iterator.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F594172A8CDE00FC9B99 /* iterator.c */; }; 137 | 2CBA5255189BC34A00529073 /* layer.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F595172A8CDE00FC9B99 /* layer.c */; }; 138 | 2CBA5256189BC34A00529073 /* picture.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F598172A8CDE00FC9B99 /* picture.c */; }; 139 | 2CBA5257189BC34A00529073 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F599172A8CDE00FC9B99 /* quant.c */; }; 140 | 2CBA5258189BC34A00529073 /* syntax.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F59A172A8CDE00FC9B99 /* syntax.c */; }; 141 | 2CBA5259189BC34A00529073 /* token.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F59B172A8CDE00FC9B99 /* token.c */; }; 142 | 2CBA525A189BC34A00529073 /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F59C172A8CDE00FC9B99 /* tree.c */; }; 143 | 2CBA525B189BC34A00529073 /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F59E172A8CDE00FC9B99 /* vp8l.c */; }; 144 | 2CBA525C189BC34A00529073 /* webpenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5A0172A8CDE00FC9B99 /* webpenc.c */; }; 145 | 2CBA525D189BC34A00529073 /* muxedit.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5A9172A8CDE00FC9B99 /* muxedit.c */; }; 146 | 2CBA525E189BC34A00529073 /* muxinternal.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5AB172A8CDE00FC9B99 /* muxinternal.c */; }; 147 | 2CBA525F189BC34A00529073 /* muxread.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5AC172A8CDE00FC9B99 /* muxread.c */; }; 148 | 2CBA5260189BC34A00529073 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CCC346A17F040E600EC7B66 /* alpha_processing.c */; }; 149 | 2CBA5261189BC34A00529073 /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5AE172A8CDE00FC9B99 /* bit_reader.c */; }; 150 | 2CBA5262189BC34A00529073 /* bit_writer.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5B0172A8CDE00FC9B99 /* bit_writer.c */; }; 151 | 2CBA5263189BC34A00529073 /* color_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5B2172A8CDE00FC9B99 /* color_cache.c */; }; 152 | 2CBA5264189BC34A00529073 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5B4172A8CDE00FC9B99 /* filters.c */; }; 153 | 2CBA5265189BC34A00529073 /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5B6172A8CDE00FC9B99 /* huffman.c */; }; 154 | 2CBA5266189BC34A00529073 /* huffman_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5B8172A8CDE00FC9B99 /* huffman_encode.c */; }; 155 | 2CBA5267189BC34A00529073 /* quant_levels.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5BC172A8CDE00FC9B99 /* quant_levels.c */; }; 156 | 2CBA5268189BC34A00529073 /* quant_levels_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5BE172A8CDE00FC9B99 /* quant_levels_dec.c */; }; 157 | 2CBA5269189BC34A00529073 /* random.c in Sources */ = {isa = PBXBuildFile; fileRef = 2C61728B187AC82D0082C342 /* random.c */; }; 158 | 2CBA526A189BC34A00529073 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5C0172A8CDE00FC9B99 /* rescaler.c */; }; 159 | 2CBA526B189BC34A00529073 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5C2172A8CDE00FC9B99 /* thread.c */; }; 160 | 2CBA526C189BC34A00529073 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3F5C4172A8CDE00FC9B99 /* utils.c */; }; 161 | 2CBA529F189BC37000529073 /* libwebp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CBA51D6189BC25100529073 /* libwebp.a */; }; 162 | 2CBA52A0189BC37700529073 /* libwebp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CBA51AF189BC15400529073 /* libwebp.a */; }; 163 | 2CBA52AC189F9F1300529073 /* STWebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CBA52AA189F9F1300529073 /* STWebP.h */; }; 164 | 2CBA52AD189F9F1300529073 /* STWebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CBA52AB189F9F1300529073 /* STWebP.m */; }; 165 | 2CBA52AE189F9F1300529073 /* STWebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CBA52AB189F9F1300529073 /* STWebP.m */; }; 166 | 2CBA52B7189F9FC900529073 /* STWebPStreamingDecoder-iOS.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CBA52B4189F9FC900529073 /* STWebPStreamingDecoder-iOS.m */; }; 167 | 2CBA52BA189F9FC900529073 /* STWebPStreamingDecoder-mac.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CBA52B5189F9FC900529073 /* STWebPStreamingDecoder-mac.m */; }; 168 | 2CBA52BB189F9FC900529073 /* STWebPStreamingDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CBA52B6189F9FC900529073 /* STWebPStreamingDecoder.h */; }; 169 | 2CCF47F51747174000BBE8A2 /* STWebPDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CFC2D26172BD74300893638 /* STWebPDecoder.h */; }; 170 | 2CFC2D27172BD74300893638 /* STWebPDecoder.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2CFC2D26172BD74300893638 /* STWebPDecoder.h */; }; 171 | 2CFC2D29172BD74300893638 /* STWebPDecoder-iOS.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CFC2D28172BD74300893638 /* STWebPDecoder-iOS.m */; }; 172 | 2CFC2D2F172BD81D00893638 /* libSTWebP.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CFC2D21172BD74300893638 /* libSTWebP.a */; }; 173 | /* End PBXBuildFile section */ 174 | 175 | /* Begin PBXContainerItemProxy section */ 176 | 2C0EC13818A2279200C47CC0 /* PBXContainerItemProxy */ = { 177 | isa = PBXContainerItemProxy; 178 | containerPortal = 2C605BA71727CEE500CE8626 /* Project object */; 179 | proxyType = 1; 180 | remoteGlobalIDString = 2CE5C68F172C83EF00CB54A5; 181 | remoteInfo = "STWebP-mac"; 182 | }; 183 | 2C0EC15318A2426100C47CC0 /* PBXContainerItemProxy */ = { 184 | isa = PBXContainerItemProxy; 185 | containerPortal = 2C605BA71727CEE500CE8626 /* Project object */; 186 | proxyType = 1; 187 | remoteGlobalIDString = 2CFC2D20172BD74300893638; 188 | remoteInfo = "STWebP-iOS"; 189 | }; 190 | 2CB9CC47172C87120054BC07 /* PBXContainerItemProxy */ = { 191 | isa = PBXContainerItemProxy; 192 | containerPortal = 2C605BA71727CEE500CE8626 /* Project object */; 193 | proxyType = 1; 194 | remoteGlobalIDString = 2CE5C68F172C83EF00CB54A5; 195 | remoteInfo = "STWebP-mac"; 196 | }; 197 | 2CBA529B189BC36500529073 /* PBXContainerItemProxy */ = { 198 | isa = PBXContainerItemProxy; 199 | containerPortal = 2C605BA71727CEE500CE8626 /* Project object */; 200 | proxyType = 1; 201 | remoteGlobalIDString = 2CBA51AE189BC15400529073; 202 | remoteInfo = "libwebp-iOS"; 203 | }; 204 | 2CBA529D189BC36B00529073 /* PBXContainerItemProxy */ = { 205 | isa = PBXContainerItemProxy; 206 | containerPortal = 2C605BA71727CEE500CE8626 /* Project object */; 207 | proxyType = 1; 208 | remoteGlobalIDString = 2CBA51D5189BC25100529073; 209 | remoteInfo = "libwebp-mac"; 210 | }; 211 | 2CFC2D2D172BD81A00893638 /* PBXContainerItemProxy */ = { 212 | isa = PBXContainerItemProxy; 213 | containerPortal = 2C605BA71727CEE500CE8626 /* Project object */; 214 | proxyType = 1; 215 | remoteGlobalIDString = 2CFC2D20172BD74300893638; 216 | remoteInfo = STWebP; 217 | }; 218 | /* End PBXContainerItemProxy section */ 219 | 220 | /* Begin PBXCopyFilesBuildPhase section */ 221 | 2CBA51AD189BC15400529073 /* CopyFiles */ = { 222 | isa = PBXCopyFilesBuildPhase; 223 | buildActionMask = 2147483647; 224 | dstPath = "include/$(PRODUCT_NAME)"; 225 | dstSubfolderSpec = 16; 226 | files = ( 227 | ); 228 | runOnlyForDeploymentPostprocessing = 0; 229 | }; 230 | 2CFC2D1F172BD74300893638 /* CopyFiles */ = { 231 | isa = PBXCopyFilesBuildPhase; 232 | buildActionMask = 2147483647; 233 | dstPath = "include/${PRODUCT_NAME}"; 234 | dstSubfolderSpec = 16; 235 | files = ( 236 | 2CFC2D27172BD74300893638 /* STWebPDecoder.h in CopyFiles */, 237 | ); 238 | runOnlyForDeploymentPostprocessing = 0; 239 | }; 240 | /* End PBXCopyFilesBuildPhase section */ 241 | 242 | /* Begin PBXFileReference section */ 243 | 2C0EC12D18A2279200C47CC0 /* STWebPTests-mac.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "STWebPTests-mac.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 244 | 2C0EC13118A2279200C47CC0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 245 | 2C0EC13518A2279200C47CC0 /* STWebPDecoderTests-mac.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "STWebPDecoderTests-mac.m"; sourceTree = ""; }; 246 | 2C0EC13E18A2280800C47CC0 /* libwebp-test-data */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "libwebp-test-data"; sourceTree = SOURCE_ROOT; }; 247 | 2C0EC14618A2426100C47CC0 /* STWebPTests-iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "STWebPTests-iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 248 | 2C0EC15018A2426100C47CC0 /* STWebPDecoderTests-iOS.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "STWebPDecoderTests-iOS.m"; sourceTree = ""; }; 249 | 2C5BD00C173157D2006B6AC5 /* STWebPURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STWebPURLProtocol.h; sourceTree = ""; }; 250 | 2C5BD00D173157D2006B6AC5 /* STWebPURLProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STWebPURLProtocol.m; sourceTree = ""; }; 251 | 2C5BD01117327425006B6AC5 /* STWebPWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STWebPWebViewController.h; sourceTree = ""; }; 252 | 2C5BD01217327425006B6AC5 /* STWebPWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STWebPWebViewController.m; sourceTree = ""; }; 253 | 2C605BAF1727CEE500CE8626 /* STWebPDecoderExample-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "STWebPDecoderExample-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 254 | 2C605BB21727CEE500CE8626 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 255 | 2C605BB41727CEE500CE8626 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 256 | 2C605BBA1727CEE500CE8626 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 257 | 2C605BBE1727CEE500CE8626 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 258 | 2C605BC11727CEE500CE8626 /* STAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = STAppDelegate.h; sourceTree = ""; }; 259 | 2C605BC21727CEE500CE8626 /* STAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = STAppDelegate.m; sourceTree = ""; }; 260 | 2C605BC41727CEE500CE8626 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 261 | 2C605BC61727CEE500CE8626 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 262 | 2C605BC81727CEE500CE8626 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 263 | 2C605BD41727D85700CE8626 /* STWebPViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STWebPViewController.h; sourceTree = ""; }; 264 | 2C605BD51727D85700CE8626 /* STWebPViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STWebPViewController.m; sourceTree = ""; }; 265 | 2C605BD71727DA9700CE8626 /* 4.webp */ = {isa = PBXFileReference; lastKnownFileType = file; path = 4.webp; sourceTree = ""; }; 266 | 2C605BD91727E1D000CE8626 /* 5_webp_a.webp */ = {isa = PBXFileReference; lastKnownFileType = file; path = 5_webp_a.webp; sourceTree = ""; }; 267 | 2C605BDB1727E33B00CE8626 /* 4.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 4.jpg; sourceTree = ""; }; 268 | 2C61728B187AC82D0082C342 /* random.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = random.c; sourceTree = ""; }; 269 | 2C61728C187AC82D0082C342 /* random.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = random.h; sourceTree = ""; }; 270 | 2C7D692F18A2666A0067B4A5 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 271 | 2CB9CC29172C85EC0054BC07 /* STWebPDecoder-mac.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "STWebPDecoder-mac.m"; sourceTree = ""; }; 272 | 2CB9CC30172C86E10054BC07 /* STWebPDecoderExample-mac.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "STWebPDecoderExample-mac.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 273 | 2CB9CC34172C86E10054BC07 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 274 | 2CB9CC38172C86E10054BC07 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 275 | 2CB9CC3C172C86E10054BC07 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; 276 | 2CB9CC3E172C86E10054BC07 /* STAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = STAppDelegate.h; sourceTree = ""; }; 277 | 2CB9CC3F172C86E10054BC07 /* STAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = STAppDelegate.m; sourceTree = ""; }; 278 | 2CB9CC42172C86E20054BC07 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; 279 | 2CBA5199189A8BBE00529073 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 280 | 2CBA519D189A8BCA00529073 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; 281 | 2CBA51AF189BC15400529073 /* libwebp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libwebp.a; sourceTree = BUILT_PRODUCTS_DIR; }; 282 | 2CBA51BD189BC15400529073 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 283 | 2CBA51D6189BC25100529073 /* libwebp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libwebp.a; sourceTree = BUILT_PRODUCTS_DIR; }; 284 | 2CBA52AA189F9F1300529073 /* STWebP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STWebP.h; sourceTree = ""; }; 285 | 2CBA52AB189F9F1300529073 /* STWebP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STWebP.m; sourceTree = ""; }; 286 | 2CBA52B4189F9FC900529073 /* STWebPStreamingDecoder-iOS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "STWebPStreamingDecoder-iOS.m"; sourceTree = ""; }; 287 | 2CBA52B5189F9FC900529073 /* STWebPStreamingDecoder-mac.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "STWebPStreamingDecoder-mac.m"; sourceTree = ""; }; 288 | 2CBA52B6189F9FC900529073 /* STWebPStreamingDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STWebPStreamingDecoder.h; sourceTree = ""; }; 289 | 2CCC346A17F040E600EC7B66 /* alpha_processing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = alpha_processing.c; sourceTree = ""; }; 290 | 2CCC346B17F040E600EC7B66 /* alpha_processing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = alpha_processing.h; sourceTree = ""; }; 291 | 2CE3F560172A8CDE00FC9B99 /* alpha.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = alpha.c; sourceTree = ""; }; 292 | 2CE3F561172A8CDE00FC9B99 /* buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = buffer.c; sourceTree = ""; }; 293 | 2CE3F562172A8CDE00FC9B99 /* decode_vp8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decode_vp8.h; sourceTree = ""; }; 294 | 2CE3F563172A8CDE00FC9B99 /* frame.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = frame.c; sourceTree = ""; }; 295 | 2CE3F564172A8CDE00FC9B99 /* idec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = idec.c; sourceTree = ""; }; 296 | 2CE3F565172A8CDE00FC9B99 /* io.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = io.c; sourceTree = ""; }; 297 | 2CE3F566172A8CDE00FC9B99 /* layer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = layer.c; sourceTree = ""; }; 298 | 2CE3F569172A8CDE00FC9B99 /* quant.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = quant.c; sourceTree = ""; }; 299 | 2CE3F56A172A8CDE00FC9B99 /* tree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tree.c; sourceTree = ""; }; 300 | 2CE3F56B172A8CDE00FC9B99 /* vp8.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vp8.c; sourceTree = ""; }; 301 | 2CE3F56C172A8CDE00FC9B99 /* vp8i.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vp8i.h; sourceTree = ""; }; 302 | 2CE3F56D172A8CDE00FC9B99 /* vp8l.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vp8l.c; sourceTree = ""; }; 303 | 2CE3F56E172A8CDE00FC9B99 /* vp8li.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vp8li.h; sourceTree = ""; }; 304 | 2CE3F56F172A8CDE00FC9B99 /* webp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = webp.c; sourceTree = ""; }; 305 | 2CE3F570172A8CDE00FC9B99 /* webpi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = webpi.h; sourceTree = ""; }; 306 | 2CE3F572172A8CDE00FC9B99 /* demux.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = demux.c; sourceTree = ""; }; 307 | 2CE3F577172A8CDE00FC9B99 /* cpu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cpu.c; sourceTree = ""; }; 308 | 2CE3F578172A8CDE00FC9B99 /* dec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec.c; sourceTree = ""; }; 309 | 2CE3F579172A8CDE00FC9B99 /* dec_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_neon.c; sourceTree = ""; }; 310 | 2CE3F57A172A8CDE00FC9B99 /* dec_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_sse2.c; sourceTree = ""; }; 311 | 2CE3F57B172A8CDE00FC9B99 /* dsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dsp.h; sourceTree = ""; }; 312 | 2CE3F57C172A8CDE00FC9B99 /* enc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc.c; sourceTree = ""; }; 313 | 2CE3F57D172A8CDE00FC9B99 /* enc_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc_neon.c; sourceTree = ""; }; 314 | 2CE3F57E172A8CDE00FC9B99 /* enc_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc_sse2.c; sourceTree = ""; }; 315 | 2CE3F57F172A8CDE00FC9B99 /* lossless.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless.c; sourceTree = ""; }; 316 | 2CE3F580172A8CDE00FC9B99 /* lossless.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lossless.h; sourceTree = ""; }; 317 | 2CE3F583172A8CDE00FC9B99 /* upsampling.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = upsampling.c; sourceTree = ""; }; 318 | 2CE3F584172A8CDE00FC9B99 /* upsampling_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = upsampling_neon.c; sourceTree = ""; }; 319 | 2CE3F585172A8CDE00FC9B99 /* upsampling_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = upsampling_sse2.c; sourceTree = ""; }; 320 | 2CE3F586172A8CDE00FC9B99 /* yuv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yuv.c; sourceTree = ""; }; 321 | 2CE3F587172A8CDE00FC9B99 /* yuv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv.h; sourceTree = ""; }; 322 | 2CE3F589172A8CDE00FC9B99 /* alpha.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = alpha.c; sourceTree = ""; }; 323 | 2CE3F58A172A8CDE00FC9B99 /* analysis.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = analysis.c; sourceTree = ""; }; 324 | 2CE3F58B172A8CDE00FC9B99 /* backward_references.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = backward_references.c; sourceTree = ""; }; 325 | 2CE3F58C172A8CDE00FC9B99 /* backward_references.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = backward_references.h; sourceTree = ""; }; 326 | 2CE3F58D172A8CDE00FC9B99 /* config.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.c; sourceTree = ""; }; 327 | 2CE3F58E172A8CDE00FC9B99 /* cost.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cost.c; sourceTree = ""; }; 328 | 2CE3F58F172A8CDE00FC9B99 /* cost.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cost.h; sourceTree = ""; }; 329 | 2CE3F590172A8CDE00FC9B99 /* filter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter.c; sourceTree = ""; }; 330 | 2CE3F591172A8CDE00FC9B99 /* frame.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = frame.c; sourceTree = ""; }; 331 | 2CE3F592172A8CDE00FC9B99 /* histogram.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = histogram.c; sourceTree = ""; }; 332 | 2CE3F593172A8CDE00FC9B99 /* histogram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = histogram.h; sourceTree = ""; }; 333 | 2CE3F594172A8CDE00FC9B99 /* iterator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iterator.c; sourceTree = ""; }; 334 | 2CE3F595172A8CDE00FC9B99 /* layer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = layer.c; sourceTree = ""; }; 335 | 2CE3F598172A8CDE00FC9B99 /* picture.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = picture.c; sourceTree = ""; }; 336 | 2CE3F599172A8CDE00FC9B99 /* quant.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = quant.c; sourceTree = ""; }; 337 | 2CE3F59A172A8CDE00FC9B99 /* syntax.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = syntax.c; sourceTree = ""; }; 338 | 2CE3F59B172A8CDE00FC9B99 /* token.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = token.c; sourceTree = ""; }; 339 | 2CE3F59C172A8CDE00FC9B99 /* tree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tree.c; sourceTree = ""; }; 340 | 2CE3F59D172A8CDE00FC9B99 /* vp8enci.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vp8enci.h; sourceTree = ""; }; 341 | 2CE3F59E172A8CDE00FC9B99 /* vp8l.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vp8l.c; sourceTree = ""; }; 342 | 2CE3F59F172A8CDE00FC9B99 /* vp8li.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vp8li.h; sourceTree = ""; }; 343 | 2CE3F5A0172A8CDE00FC9B99 /* webpenc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = webpenc.c; sourceTree = ""; }; 344 | 2CE3F5A9172A8CDE00FC9B99 /* muxedit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = muxedit.c; sourceTree = ""; }; 345 | 2CE3F5AA172A8CDE00FC9B99 /* muxi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = muxi.h; sourceTree = ""; }; 346 | 2CE3F5AB172A8CDE00FC9B99 /* muxinternal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = muxinternal.c; sourceTree = ""; }; 347 | 2CE3F5AC172A8CDE00FC9B99 /* muxread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = muxread.c; sourceTree = ""; }; 348 | 2CE3F5AE172A8CDE00FC9B99 /* bit_reader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bit_reader.c; sourceTree = ""; }; 349 | 2CE3F5AF172A8CDE00FC9B99 /* bit_reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_reader.h; sourceTree = ""; }; 350 | 2CE3F5B0172A8CDE00FC9B99 /* bit_writer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bit_writer.c; sourceTree = ""; }; 351 | 2CE3F5B1172A8CDE00FC9B99 /* bit_writer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_writer.h; sourceTree = ""; }; 352 | 2CE3F5B2172A8CDE00FC9B99 /* color_cache.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = color_cache.c; sourceTree = ""; }; 353 | 2CE3F5B3172A8CDE00FC9B99 /* color_cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = color_cache.h; sourceTree = ""; }; 354 | 2CE3F5B4172A8CDE00FC9B99 /* filters.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filters.c; sourceTree = ""; }; 355 | 2CE3F5B5172A8CDE00FC9B99 /* filters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filters.h; sourceTree = ""; }; 356 | 2CE3F5B6172A8CDE00FC9B99 /* huffman.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = huffman.c; sourceTree = ""; }; 357 | 2CE3F5B7172A8CDE00FC9B99 /* huffman.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = huffman.h; sourceTree = ""; }; 358 | 2CE3F5B8172A8CDE00FC9B99 /* huffman_encode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = huffman_encode.c; sourceTree = ""; }; 359 | 2CE3F5B9172A8CDE00FC9B99 /* huffman_encode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = huffman_encode.h; sourceTree = ""; }; 360 | 2CE3F5BC172A8CDE00FC9B99 /* quant_levels.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = quant_levels.c; sourceTree = ""; }; 361 | 2CE3F5BD172A8CDE00FC9B99 /* quant_levels.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quant_levels.h; sourceTree = ""; }; 362 | 2CE3F5BE172A8CDE00FC9B99 /* quant_levels_dec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = quant_levels_dec.c; sourceTree = ""; }; 363 | 2CE3F5BF172A8CDE00FC9B99 /* quant_levels_dec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quant_levels_dec.h; sourceTree = ""; }; 364 | 2CE3F5C0172A8CDE00FC9B99 /* rescaler.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rescaler.c; sourceTree = ""; }; 365 | 2CE3F5C1172A8CDE00FC9B99 /* rescaler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rescaler.h; sourceTree = ""; }; 366 | 2CE3F5C2172A8CDE00FC9B99 /* thread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = thread.c; sourceTree = ""; }; 367 | 2CE3F5C3172A8CDE00FC9B99 /* thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread.h; sourceTree = ""; }; 368 | 2CE3F5C4172A8CDE00FC9B99 /* utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utils.c; sourceTree = ""; }; 369 | 2CE3F5C5172A8CDE00FC9B99 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; 370 | 2CE3F5C7172A8CDE00FC9B99 /* decode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decode.h; sourceTree = ""; }; 371 | 2CE3F5C8172A8CDE00FC9B99 /* demux.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = demux.h; sourceTree = ""; }; 372 | 2CE3F5C9172A8CDE00FC9B99 /* encode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = encode.h; sourceTree = ""; }; 373 | 2CE3F5CA172A8CDE00FC9B99 /* format_constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = format_constants.h; sourceTree = ""; }; 374 | 2CE3F5CB172A8CDE00FC9B99 /* mux.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mux.h; sourceTree = ""; }; 375 | 2CE3F5CC172A8CDE00FC9B99 /* mux_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mux_types.h; sourceTree = ""; }; 376 | 2CE3F5CD172A8CDE00FC9B99 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = ""; }; 377 | 2CE5C690172C83EF00CB54A5 /* libSTWebP.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSTWebP.a; sourceTree = BUILT_PRODUCTS_DIR; }; 378 | 2CFC2D21172BD74300893638 /* libSTWebP.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSTWebP.a; sourceTree = BUILT_PRODUCTS_DIR; }; 379 | 2CFC2D26172BD74300893638 /* STWebPDecoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = STWebPDecoder.h; sourceTree = ""; }; 380 | 2CFC2D28172BD74300893638 /* STWebPDecoder-iOS.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "STWebPDecoder-iOS.m"; sourceTree = ""; }; 381 | /* End PBXFileReference section */ 382 | 383 | /* Begin PBXFrameworksBuildPhase section */ 384 | 2C0EC12A18A2279200C47CC0 /* Frameworks */ = { 385 | isa = PBXFrameworksBuildPhase; 386 | buildActionMask = 2147483647; 387 | files = ( 388 | 2C7D692E18A251160067B4A5 /* AppKit.framework in Frameworks */, 389 | 2C0EC12E18A2279200C47CC0 /* XCTest.framework in Frameworks */, 390 | 2C0EC14018A22ED100C47CC0 /* libSTWebP.a in Frameworks */, 391 | 2C0EC14118A22EDC00C47CC0 /* libwebp.a in Frameworks */, 392 | ); 393 | runOnlyForDeploymentPostprocessing = 0; 394 | }; 395 | 2C0EC14318A2426100C47CC0 /* Frameworks */ = { 396 | isa = PBXFrameworksBuildPhase; 397 | buildActionMask = 2147483647; 398 | files = ( 399 | 2C7D693018A2666A0067B4A5 /* CoreGraphics.framework in Frameworks */, 400 | 2C0EC14918A2426100C47CC0 /* UIKit.framework in Frameworks */, 401 | 2C0EC14718A2426100C47CC0 /* XCTest.framework in Frameworks */, 402 | 2C0EC15918A2437100C47CC0 /* libSTWebP.a in Frameworks */, 403 | 2C0EC15A18A2437400C47CC0 /* libwebp.a in Frameworks */, 404 | ); 405 | runOnlyForDeploymentPostprocessing = 0; 406 | }; 407 | 2C605BAC1727CEE500CE8626 /* Frameworks */ = { 408 | isa = PBXFrameworksBuildPhase; 409 | buildActionMask = 2147483647; 410 | files = ( 411 | 2C605BB31727CEE500CE8626 /* UIKit.framework in Frameworks */, 412 | 2C605BB51727CEE500CE8626 /* Foundation.framework in Frameworks */, 413 | 2CFC2D2F172BD81D00893638 /* libSTWebP.a in Frameworks */, 414 | 2CBA52A0189BC37700529073 /* libwebp.a in Frameworks */, 415 | ); 416 | runOnlyForDeploymentPostprocessing = 0; 417 | }; 418 | 2CB9CC2D172C86E10054BC07 /* Frameworks */ = { 419 | isa = PBXFrameworksBuildPhase; 420 | buildActionMask = 2147483647; 421 | files = ( 422 | 2CBA519A189A8BBE00529073 /* AppKit.framework in Frameworks */, 423 | 2CBA519E189A8BCA00529073 /* QuartzCore.framework in Frameworks */, 424 | 2CB9CC49172C87170054BC07 /* libSTWebP.a in Frameworks */, 425 | 2CBA529F189BC37000529073 /* libwebp.a in Frameworks */, 426 | ); 427 | runOnlyForDeploymentPostprocessing = 0; 428 | }; 429 | 2CBA51AC189BC15400529073 /* Frameworks */ = { 430 | isa = PBXFrameworksBuildPhase; 431 | buildActionMask = 2147483647; 432 | files = ( 433 | ); 434 | runOnlyForDeploymentPostprocessing = 0; 435 | }; 436 | 2CBA51D3189BC25100529073 /* Frameworks */ = { 437 | isa = PBXFrameworksBuildPhase; 438 | buildActionMask = 2147483647; 439 | files = ( 440 | ); 441 | runOnlyForDeploymentPostprocessing = 0; 442 | }; 443 | 2CE5C68D172C83EF00CB54A5 /* Frameworks */ = { 444 | isa = PBXFrameworksBuildPhase; 445 | buildActionMask = 2147483647; 446 | files = ( 447 | ); 448 | runOnlyForDeploymentPostprocessing = 0; 449 | }; 450 | 2CFC2D1E172BD74300893638 /* Frameworks */ = { 451 | isa = PBXFrameworksBuildPhase; 452 | buildActionMask = 2147483647; 453 | files = ( 454 | ); 455 | runOnlyForDeploymentPostprocessing = 0; 456 | }; 457 | /* End PBXFrameworksBuildPhase section */ 458 | 459 | /* Begin PBXGroup section */ 460 | 2C0EC12F18A2279200C47CC0 /* STWebPTests */ = { 461 | isa = PBXGroup; 462 | children = ( 463 | 2C0EC13118A2279200C47CC0 /* Info.plist */, 464 | 2C0EC13E18A2280800C47CC0 /* libwebp-test-data */, 465 | 2C0EC15018A2426100C47CC0 /* STWebPDecoderTests-iOS.m */, 466 | 2C0EC13518A2279200C47CC0 /* STWebPDecoderTests-mac.m */, 467 | ); 468 | path = STWebPTests; 469 | sourceTree = ""; 470 | }; 471 | 2C605BA61727CEE500CE8626 = { 472 | isa = PBXGroup; 473 | children = ( 474 | 2CFC2D23172BD74300893638 /* STWebP */, 475 | 2C0EC12F18A2279200C47CC0 /* STWebPTests */, 476 | 2C605BB81727CEE500CE8626 /* STWebPDecoderExample-iOS */, 477 | 2CB9CC32172C86E10054BC07 /* STWebPDecoderExample-mac */, 478 | 2C751344172C8AA20036F82B /* samples */, 479 | 2C605BCF1727CF5200CE8626 /* lib */, 480 | 2C605BB11727CEE500CE8626 /* Frameworks */, 481 | 2C605BB01727CEE500CE8626 /* Products */, 482 | ); 483 | sourceTree = ""; 484 | }; 485 | 2C605BB01727CEE500CE8626 /* Products */ = { 486 | isa = PBXGroup; 487 | children = ( 488 | 2CFC2D21172BD74300893638 /* libSTWebP.a */, 489 | 2CE5C690172C83EF00CB54A5 /* libSTWebP.a */, 490 | 2C605BAF1727CEE500CE8626 /* STWebPDecoderExample-iOS.app */, 491 | 2CB9CC30172C86E10054BC07 /* STWebPDecoderExample-mac.app */, 492 | 2CBA51AF189BC15400529073 /* libwebp.a */, 493 | 2CBA51D6189BC25100529073 /* libwebp.a */, 494 | 2C0EC12D18A2279200C47CC0 /* STWebPTests-mac.xctest */, 495 | 2C0EC14618A2426100C47CC0 /* STWebPTests-iOS.xctest */, 496 | ); 497 | name = Products; 498 | sourceTree = ""; 499 | }; 500 | 2C605BB11727CEE500CE8626 /* Frameworks */ = { 501 | isa = PBXGroup; 502 | children = ( 503 | 2C605BB41727CEE500CE8626 /* Foundation.framework */, 504 | 2C7D692F18A2666A0067B4A5 /* CoreGraphics.framework */, 505 | 2C605BB21727CEE500CE8626 /* UIKit.framework */, 506 | 2CBA5199189A8BBE00529073 /* AppKit.framework */, 507 | 2CBA51BD189BC15400529073 /* XCTest.framework */, 508 | ); 509 | name = Frameworks; 510 | sourceTree = ""; 511 | }; 512 | 2C605BB81727CEE500CE8626 /* STWebPDecoderExample-iOS */ = { 513 | isa = PBXGroup; 514 | children = ( 515 | 2C605BBA1727CEE500CE8626 /* Info.plist */, 516 | 2C605BBE1727CEE500CE8626 /* main.m */, 517 | 2C605BC11727CEE500CE8626 /* STAppDelegate.h */, 518 | 2C605BC21727CEE500CE8626 /* STAppDelegate.m */, 519 | 2C605BC41727CEE500CE8626 /* Default.png */, 520 | 2C605BC61727CEE500CE8626 /* Default@2x.png */, 521 | 2C605BC81727CEE500CE8626 /* Default-568h@2x.png */, 522 | 2C605BD41727D85700CE8626 /* STWebPViewController.h */, 523 | 2C605BD51727D85700CE8626 /* STWebPViewController.m */, 524 | 2C5BD01117327425006B6AC5 /* STWebPWebViewController.h */, 525 | 2C5BD01217327425006B6AC5 /* STWebPWebViewController.m */, 526 | ); 527 | path = "STWebPDecoderExample-iOS"; 528 | sourceTree = ""; 529 | usesTabs = 1; 530 | }; 531 | 2C605BCF1727CF5200CE8626 /* lib */ = { 532 | isa = PBXGroup; 533 | children = ( 534 | 2CE3F541172A8C8D00FC9B99 /* libwebp */, 535 | ); 536 | path = lib; 537 | sourceTree = ""; 538 | }; 539 | 2C751344172C8AA20036F82B /* samples */ = { 540 | isa = PBXGroup; 541 | children = ( 542 | 2C605BDB1727E33B00CE8626 /* 4.jpg */, 543 | 2C605BD71727DA9700CE8626 /* 4.webp */, 544 | 2C605BD91727E1D000CE8626 /* 5_webp_a.webp */, 545 | ); 546 | path = samples; 547 | sourceTree = ""; 548 | }; 549 | 2CB9CC32172C86E10054BC07 /* STWebPDecoderExample-mac */ = { 550 | isa = PBXGroup; 551 | children = ( 552 | 2CB9CC34172C86E10054BC07 /* Info.plist */, 553 | 2CB9CC38172C86E10054BC07 /* main.m */, 554 | 2CB9CC3E172C86E10054BC07 /* STAppDelegate.h */, 555 | 2CB9CC3F172C86E10054BC07 /* STAppDelegate.m */, 556 | 2CB9CC41172C86E20054BC07 /* MainMenu.xib */, 557 | 2CB9CC3B172C86E10054BC07 /* Credits.rtf */, 558 | ); 559 | path = "STWebPDecoderExample-mac"; 560 | sourceTree = ""; 561 | usesTabs = 1; 562 | }; 563 | 2CE3F541172A8C8D00FC9B99 /* libwebp */ = { 564 | isa = PBXGroup; 565 | children = ( 566 | 2CE3F55E172A8CDE00FC9B99 /* src */, 567 | ); 568 | indentWidth = 2; 569 | name = libwebp; 570 | sourceTree = ""; 571 | tabWidth = 2; 572 | usesTabs = 0; 573 | }; 574 | 2CE3F55E172A8CDE00FC9B99 /* src */ = { 575 | isa = PBXGroup; 576 | children = ( 577 | 2CE3F55F172A8CDE00FC9B99 /* dec */, 578 | 2CE3F571172A8CDE00FC9B99 /* demux */, 579 | 2CE3F576172A8CDE00FC9B99 /* dsp */, 580 | 2CE3F588172A8CDE00FC9B99 /* enc */, 581 | 2CE3F5A5172A8CDE00FC9B99 /* mux */, 582 | 2CE3F5AD172A8CDE00FC9B99 /* utils */, 583 | 2CE3F5C6172A8CDE00FC9B99 /* webp */, 584 | ); 585 | name = src; 586 | path = libwebp/src; 587 | sourceTree = ""; 588 | }; 589 | 2CE3F55F172A8CDE00FC9B99 /* dec */ = { 590 | isa = PBXGroup; 591 | children = ( 592 | 2CE3F560172A8CDE00FC9B99 /* alpha.c */, 593 | 2CE3F561172A8CDE00FC9B99 /* buffer.c */, 594 | 2CE3F562172A8CDE00FC9B99 /* decode_vp8.h */, 595 | 2CE3F563172A8CDE00FC9B99 /* frame.c */, 596 | 2CE3F564172A8CDE00FC9B99 /* idec.c */, 597 | 2CE3F565172A8CDE00FC9B99 /* io.c */, 598 | 2CE3F566172A8CDE00FC9B99 /* layer.c */, 599 | 2CE3F569172A8CDE00FC9B99 /* quant.c */, 600 | 2CE3F56A172A8CDE00FC9B99 /* tree.c */, 601 | 2CE3F56B172A8CDE00FC9B99 /* vp8.c */, 602 | 2CE3F56C172A8CDE00FC9B99 /* vp8i.h */, 603 | 2CE3F56D172A8CDE00FC9B99 /* vp8l.c */, 604 | 2CE3F56E172A8CDE00FC9B99 /* vp8li.h */, 605 | 2CE3F56F172A8CDE00FC9B99 /* webp.c */, 606 | 2CE3F570172A8CDE00FC9B99 /* webpi.h */, 607 | ); 608 | path = dec; 609 | sourceTree = ""; 610 | }; 611 | 2CE3F571172A8CDE00FC9B99 /* demux */ = { 612 | isa = PBXGroup; 613 | children = ( 614 | 2CE3F572172A8CDE00FC9B99 /* demux.c */, 615 | ); 616 | path = demux; 617 | sourceTree = ""; 618 | }; 619 | 2CE3F576172A8CDE00FC9B99 /* dsp */ = { 620 | isa = PBXGroup; 621 | children = ( 622 | 2CE3F577172A8CDE00FC9B99 /* cpu.c */, 623 | 2CE3F578172A8CDE00FC9B99 /* dec.c */, 624 | 2CE3F579172A8CDE00FC9B99 /* dec_neon.c */, 625 | 2CE3F57A172A8CDE00FC9B99 /* dec_sse2.c */, 626 | 2CE3F57B172A8CDE00FC9B99 /* dsp.h */, 627 | 2CE3F57C172A8CDE00FC9B99 /* enc.c */, 628 | 2CE3F57D172A8CDE00FC9B99 /* enc_neon.c */, 629 | 2CE3F57E172A8CDE00FC9B99 /* enc_sse2.c */, 630 | 2CE3F57F172A8CDE00FC9B99 /* lossless.c */, 631 | 2CE3F580172A8CDE00FC9B99 /* lossless.h */, 632 | 2CE3F583172A8CDE00FC9B99 /* upsampling.c */, 633 | 2CE3F584172A8CDE00FC9B99 /* upsampling_neon.c */, 634 | 2CE3F585172A8CDE00FC9B99 /* upsampling_sse2.c */, 635 | 2CE3F586172A8CDE00FC9B99 /* yuv.c */, 636 | 2CE3F587172A8CDE00FC9B99 /* yuv.h */, 637 | ); 638 | path = dsp; 639 | sourceTree = ""; 640 | }; 641 | 2CE3F588172A8CDE00FC9B99 /* enc */ = { 642 | isa = PBXGroup; 643 | children = ( 644 | 2CE3F589172A8CDE00FC9B99 /* alpha.c */, 645 | 2CE3F58A172A8CDE00FC9B99 /* analysis.c */, 646 | 2CE3F58B172A8CDE00FC9B99 /* backward_references.c */, 647 | 2CE3F58C172A8CDE00FC9B99 /* backward_references.h */, 648 | 2CE3F58D172A8CDE00FC9B99 /* config.c */, 649 | 2CE3F58E172A8CDE00FC9B99 /* cost.c */, 650 | 2CE3F58F172A8CDE00FC9B99 /* cost.h */, 651 | 2CE3F590172A8CDE00FC9B99 /* filter.c */, 652 | 2CE3F591172A8CDE00FC9B99 /* frame.c */, 653 | 2CE3F592172A8CDE00FC9B99 /* histogram.c */, 654 | 2CE3F593172A8CDE00FC9B99 /* histogram.h */, 655 | 2CE3F594172A8CDE00FC9B99 /* iterator.c */, 656 | 2CE3F595172A8CDE00FC9B99 /* layer.c */, 657 | 2CE3F598172A8CDE00FC9B99 /* picture.c */, 658 | 2CE3F599172A8CDE00FC9B99 /* quant.c */, 659 | 2CE3F59A172A8CDE00FC9B99 /* syntax.c */, 660 | 2CE3F59B172A8CDE00FC9B99 /* token.c */, 661 | 2CE3F59C172A8CDE00FC9B99 /* tree.c */, 662 | 2CE3F59D172A8CDE00FC9B99 /* vp8enci.h */, 663 | 2CE3F59E172A8CDE00FC9B99 /* vp8l.c */, 664 | 2CE3F59F172A8CDE00FC9B99 /* vp8li.h */, 665 | 2CE3F5A0172A8CDE00FC9B99 /* webpenc.c */, 666 | ); 667 | path = enc; 668 | sourceTree = ""; 669 | }; 670 | 2CE3F5A5172A8CDE00FC9B99 /* mux */ = { 671 | isa = PBXGroup; 672 | children = ( 673 | 2CE3F5A9172A8CDE00FC9B99 /* muxedit.c */, 674 | 2CE3F5AA172A8CDE00FC9B99 /* muxi.h */, 675 | 2CE3F5AB172A8CDE00FC9B99 /* muxinternal.c */, 676 | 2CE3F5AC172A8CDE00FC9B99 /* muxread.c */, 677 | ); 678 | path = mux; 679 | sourceTree = ""; 680 | }; 681 | 2CE3F5AD172A8CDE00FC9B99 /* utils */ = { 682 | isa = PBXGroup; 683 | children = ( 684 | 2CCC346A17F040E600EC7B66 /* alpha_processing.c */, 685 | 2CCC346B17F040E600EC7B66 /* alpha_processing.h */, 686 | 2CE3F5AE172A8CDE00FC9B99 /* bit_reader.c */, 687 | 2CE3F5AF172A8CDE00FC9B99 /* bit_reader.h */, 688 | 2CE3F5B0172A8CDE00FC9B99 /* bit_writer.c */, 689 | 2CE3F5B1172A8CDE00FC9B99 /* bit_writer.h */, 690 | 2CE3F5B2172A8CDE00FC9B99 /* color_cache.c */, 691 | 2CE3F5B3172A8CDE00FC9B99 /* color_cache.h */, 692 | 2CE3F5B4172A8CDE00FC9B99 /* filters.c */, 693 | 2CE3F5B5172A8CDE00FC9B99 /* filters.h */, 694 | 2CE3F5B6172A8CDE00FC9B99 /* huffman.c */, 695 | 2CE3F5B7172A8CDE00FC9B99 /* huffman.h */, 696 | 2CE3F5B8172A8CDE00FC9B99 /* huffman_encode.c */, 697 | 2CE3F5B9172A8CDE00FC9B99 /* huffman_encode.h */, 698 | 2CE3F5BC172A8CDE00FC9B99 /* quant_levels.c */, 699 | 2CE3F5BD172A8CDE00FC9B99 /* quant_levels.h */, 700 | 2CE3F5BE172A8CDE00FC9B99 /* quant_levels_dec.c */, 701 | 2CE3F5BF172A8CDE00FC9B99 /* quant_levels_dec.h */, 702 | 2C61728B187AC82D0082C342 /* random.c */, 703 | 2C61728C187AC82D0082C342 /* random.h */, 704 | 2CE3F5C0172A8CDE00FC9B99 /* rescaler.c */, 705 | 2CE3F5C1172A8CDE00FC9B99 /* rescaler.h */, 706 | 2CE3F5C2172A8CDE00FC9B99 /* thread.c */, 707 | 2CE3F5C3172A8CDE00FC9B99 /* thread.h */, 708 | 2CE3F5C4172A8CDE00FC9B99 /* utils.c */, 709 | 2CE3F5C5172A8CDE00FC9B99 /* utils.h */, 710 | ); 711 | path = utils; 712 | sourceTree = ""; 713 | }; 714 | 2CE3F5C6172A8CDE00FC9B99 /* webp */ = { 715 | isa = PBXGroup; 716 | children = ( 717 | 2CE3F5C7172A8CDE00FC9B99 /* decode.h */, 718 | 2CE3F5C8172A8CDE00FC9B99 /* demux.h */, 719 | 2CE3F5C9172A8CDE00FC9B99 /* encode.h */, 720 | 2CE3F5CA172A8CDE00FC9B99 /* format_constants.h */, 721 | 2CE3F5CB172A8CDE00FC9B99 /* mux.h */, 722 | 2CE3F5CC172A8CDE00FC9B99 /* mux_types.h */, 723 | 2CE3F5CD172A8CDE00FC9B99 /* types.h */, 724 | ); 725 | path = webp; 726 | sourceTree = ""; 727 | }; 728 | 2CFC2D23172BD74300893638 /* STWebP */ = { 729 | isa = PBXGroup; 730 | children = ( 731 | 2CBA52AA189F9F1300529073 /* STWebP.h */, 732 | 2CBA52AB189F9F1300529073 /* STWebP.m */, 733 | 2CFC2D26172BD74300893638 /* STWebPDecoder.h */, 734 | 2CFC2D28172BD74300893638 /* STWebPDecoder-iOS.m */, 735 | 2CB9CC29172C85EC0054BC07 /* STWebPDecoder-mac.m */, 736 | 2CBA52B6189F9FC900529073 /* STWebPStreamingDecoder.h */, 737 | 2CBA52B4189F9FC900529073 /* STWebPStreamingDecoder-iOS.m */, 738 | 2CBA52B5189F9FC900529073 /* STWebPStreamingDecoder-mac.m */, 739 | 2C5BD00C173157D2006B6AC5 /* STWebPURLProtocol.h */, 740 | 2C5BD00D173157D2006B6AC5 /* STWebPURLProtocol.m */, 741 | ); 742 | path = STWebP; 743 | sourceTree = ""; 744 | usesTabs = 1; 745 | }; 746 | /* End PBXGroup section */ 747 | 748 | /* Begin PBXHeadersBuildPhase section */ 749 | 2CBA51D4189BC25100529073 /* Headers */ = { 750 | isa = PBXHeadersBuildPhase; 751 | buildActionMask = 2147483647; 752 | files = ( 753 | ); 754 | runOnlyForDeploymentPostprocessing = 0; 755 | }; 756 | 2CE5C68E172C83EF00CB54A5 /* Headers */ = { 757 | isa = PBXHeadersBuildPhase; 758 | buildActionMask = 2147483647; 759 | files = ( 760 | 2CCF47F51747174000BBE8A2 /* STWebPDecoder.h in Headers */, 761 | 2CBA52AC189F9F1300529073 /* STWebP.h in Headers */, 762 | 2CBA52BB189F9FC900529073 /* STWebPStreamingDecoder.h in Headers */, 763 | ); 764 | runOnlyForDeploymentPostprocessing = 0; 765 | }; 766 | /* End PBXHeadersBuildPhase section */ 767 | 768 | /* Begin PBXNativeTarget section */ 769 | 2C0EC12C18A2279200C47CC0 /* STWebPTests-mac */ = { 770 | isa = PBXNativeTarget; 771 | buildConfigurationList = 2C0EC13C18A2279200C47CC0 /* Build configuration list for PBXNativeTarget "STWebPTests-mac" */; 772 | buildPhases = ( 773 | 2C0EC12918A2279200C47CC0 /* Sources */, 774 | 2C0EC12A18A2279200C47CC0 /* Frameworks */, 775 | 2C0EC12B18A2279200C47CC0 /* Resources */, 776 | ); 777 | buildRules = ( 778 | ); 779 | dependencies = ( 780 | 2C0EC13918A2279200C47CC0 /* PBXTargetDependency */, 781 | ); 782 | name = "STWebPTests-mac"; 783 | productName = "STWebPTests-mac"; 784 | productReference = 2C0EC12D18A2279200C47CC0 /* STWebPTests-mac.xctest */; 785 | productType = "com.apple.product-type.bundle.unit-test"; 786 | }; 787 | 2C0EC14518A2426100C47CC0 /* STWebPTests-iOS */ = { 788 | isa = PBXNativeTarget; 789 | buildConfigurationList = 2C0EC15518A2426100C47CC0 /* Build configuration list for PBXNativeTarget "STWebPTests-iOS" */; 790 | buildPhases = ( 791 | 2C0EC14218A2426100C47CC0 /* Sources */, 792 | 2C0EC14318A2426100C47CC0 /* Frameworks */, 793 | 2C0EC14418A2426100C47CC0 /* Resources */, 794 | ); 795 | buildRules = ( 796 | ); 797 | dependencies = ( 798 | 2C0EC15418A2426100C47CC0 /* PBXTargetDependency */, 799 | ); 800 | name = "STWebPTests-iOS"; 801 | productName = "STWebPTests-iOS"; 802 | productReference = 2C0EC14618A2426100C47CC0 /* STWebPTests-iOS.xctest */; 803 | productType = "com.apple.product-type.bundle.unit-test"; 804 | }; 805 | 2C605BAE1727CEE500CE8626 /* STWebPDecoderExample-iOS */ = { 806 | isa = PBXNativeTarget; 807 | buildConfigurationList = 2C605BCC1727CEE500CE8626 /* Build configuration list for PBXNativeTarget "STWebPDecoderExample-iOS" */; 808 | buildPhases = ( 809 | 2C605BAB1727CEE500CE8626 /* Sources */, 810 | 2C605BAC1727CEE500CE8626 /* Frameworks */, 811 | 2C605BAD1727CEE500CE8626 /* Resources */, 812 | ); 813 | buildRules = ( 814 | ); 815 | dependencies = ( 816 | 2CBA529C189BC36500529073 /* PBXTargetDependency */, 817 | 2CFC2D2E172BD81A00893638 /* PBXTargetDependency */, 818 | ); 819 | name = "STWebPDecoderExample-iOS"; 820 | productName = "STWebPDecoderExample-iOS"; 821 | productReference = 2C605BAF1727CEE500CE8626 /* STWebPDecoderExample-iOS.app */; 822 | productType = "com.apple.product-type.application"; 823 | }; 824 | 2CB9CC2F172C86E10054BC07 /* STWebPDecoderExample-mac */ = { 825 | isa = PBXNativeTarget; 826 | buildConfigurationList = 2CB9CC44172C86E20054BC07 /* Build configuration list for PBXNativeTarget "STWebPDecoderExample-mac" */; 827 | buildPhases = ( 828 | 2CB9CC2C172C86E10054BC07 /* Sources */, 829 | 2CB9CC2D172C86E10054BC07 /* Frameworks */, 830 | 2CB9CC2E172C86E10054BC07 /* Resources */, 831 | ); 832 | buildRules = ( 833 | ); 834 | dependencies = ( 835 | 2CBA529E189BC36B00529073 /* PBXTargetDependency */, 836 | 2CB9CC48172C87120054BC07 /* PBXTargetDependency */, 837 | ); 838 | name = "STWebPDecoderExample-mac"; 839 | productName = "STWebPDecoderExample-mac"; 840 | productReference = 2CB9CC30172C86E10054BC07 /* STWebPDecoderExample-mac.app */; 841 | productType = "com.apple.product-type.application"; 842 | }; 843 | 2CBA51AE189BC15400529073 /* libwebp-iOS */ = { 844 | isa = PBXNativeTarget; 845 | buildConfigurationList = 2CBA51CC189BC15400529073 /* Build configuration list for PBXNativeTarget "libwebp-iOS" */; 846 | buildPhases = ( 847 | 2CBA51AB189BC15400529073 /* Sources */, 848 | 2CBA51AC189BC15400529073 /* Frameworks */, 849 | 2CBA51AD189BC15400529073 /* CopyFiles */, 850 | ); 851 | buildRules = ( 852 | ); 853 | dependencies = ( 854 | ); 855 | name = "libwebp-iOS"; 856 | productName = webp; 857 | productReference = 2CBA51AF189BC15400529073 /* libwebp.a */; 858 | productType = "com.apple.product-type.library.static"; 859 | }; 860 | 2CBA51D5189BC25100529073 /* libwebp-mac */ = { 861 | isa = PBXNativeTarget; 862 | buildConfigurationList = 2CBA51F5189BC25200529073 /* Build configuration list for PBXNativeTarget "libwebp-mac" */; 863 | buildPhases = ( 864 | 2CBA51D2189BC25100529073 /* Sources */, 865 | 2CBA51D3189BC25100529073 /* Frameworks */, 866 | 2CBA51D4189BC25100529073 /* Headers */, 867 | ); 868 | buildRules = ( 869 | ); 870 | dependencies = ( 871 | ); 872 | name = "libwebp-mac"; 873 | productName = webp; 874 | productReference = 2CBA51D6189BC25100529073 /* libwebp.a */; 875 | productType = "com.apple.product-type.library.static"; 876 | }; 877 | 2CE5C68F172C83EF00CB54A5 /* STWebP-mac */ = { 878 | isa = PBXNativeTarget; 879 | buildConfigurationList = 2CE5C69F172C83EF00CB54A5 /* Build configuration list for PBXNativeTarget "STWebP-mac" */; 880 | buildPhases = ( 881 | 2CE5C68C172C83EF00CB54A5 /* Sources */, 882 | 2CE5C68D172C83EF00CB54A5 /* Frameworks */, 883 | 2CE5C68E172C83EF00CB54A5 /* Headers */, 884 | ); 885 | buildRules = ( 886 | ); 887 | dependencies = ( 888 | ); 889 | name = "STWebP-mac"; 890 | productName = "STWebP-mac"; 891 | productReference = 2CE5C690172C83EF00CB54A5 /* libSTWebP.a */; 892 | productType = "com.apple.product-type.library.static"; 893 | }; 894 | 2CFC2D20172BD74300893638 /* STWebP-iOS */ = { 895 | isa = PBXNativeTarget; 896 | buildConfigurationList = 2CFC2D2C172BD74300893638 /* Build configuration list for PBXNativeTarget "STWebP-iOS" */; 897 | buildPhases = ( 898 | 2CFC2D1D172BD74300893638 /* Sources */, 899 | 2CFC2D1E172BD74300893638 /* Frameworks */, 900 | 2CFC2D1F172BD74300893638 /* CopyFiles */, 901 | ); 902 | buildRules = ( 903 | ); 904 | dependencies = ( 905 | ); 906 | name = "STWebP-iOS"; 907 | productName = "STWebP-iOS"; 908 | productReference = 2CFC2D21172BD74300893638 /* libSTWebP.a */; 909 | productType = "com.apple.product-type.library.static"; 910 | }; 911 | /* End PBXNativeTarget section */ 912 | 913 | /* Begin PBXProject section */ 914 | 2C605BA71727CEE500CE8626 /* Project object */ = { 915 | isa = PBXProject; 916 | attributes = { 917 | CLASSPREFIX = STWebP; 918 | LastUpgradeCheck = 0510; 919 | ORGANIZATIONNAME = "Scott Talbot"; 920 | TargetAttributes = { 921 | 2C0EC12C18A2279200C47CC0 = { 922 | TestTargetID = 2CE5C68F172C83EF00CB54A5; 923 | }; 924 | 2C0EC14518A2426100C47CC0 = { 925 | TestTargetID = 2CFC2D20172BD74300893638; 926 | }; 927 | }; 928 | }; 929 | buildConfigurationList = 2C605BAA1727CEE500CE8626 /* Build configuration list for PBXProject "STWebP" */; 930 | compatibilityVersion = "Xcode 3.2"; 931 | developmentRegion = English; 932 | hasScannedForEncodings = 0; 933 | knownRegions = ( 934 | en, 935 | ); 936 | mainGroup = 2C605BA61727CEE500CE8626; 937 | productRefGroup = 2C605BB01727CEE500CE8626 /* Products */; 938 | projectDirPath = ""; 939 | projectRoot = ""; 940 | targets = ( 941 | 2CFC2D20172BD74300893638 /* STWebP-iOS */, 942 | 2CE5C68F172C83EF00CB54A5 /* STWebP-mac */, 943 | 2C0EC14518A2426100C47CC0 /* STWebPTests-iOS */, 944 | 2C0EC12C18A2279200C47CC0 /* STWebPTests-mac */, 945 | 2C605BAE1727CEE500CE8626 /* STWebPDecoderExample-iOS */, 946 | 2CB9CC2F172C86E10054BC07 /* STWebPDecoderExample-mac */, 947 | 2CBA51AE189BC15400529073 /* libwebp-iOS */, 948 | 2CBA51D5189BC25100529073 /* libwebp-mac */, 949 | ); 950 | }; 951 | /* End PBXProject section */ 952 | 953 | /* Begin PBXResourcesBuildPhase section */ 954 | 2C0EC12B18A2279200C47CC0 /* Resources */ = { 955 | isa = PBXResourcesBuildPhase; 956 | buildActionMask = 2147483647; 957 | files = ( 958 | 2C0EC13F18A2280800C47CC0 /* libwebp-test-data in Resources */, 959 | ); 960 | runOnlyForDeploymentPostprocessing = 0; 961 | }; 962 | 2C0EC14418A2426100C47CC0 /* Resources */ = { 963 | isa = PBXResourcesBuildPhase; 964 | buildActionMask = 2147483647; 965 | files = ( 966 | 2C0EC15818A242A700C47CC0 /* libwebp-test-data in Resources */, 967 | ); 968 | runOnlyForDeploymentPostprocessing = 0; 969 | }; 970 | 2C605BAD1727CEE500CE8626 /* Resources */ = { 971 | isa = PBXResourcesBuildPhase; 972 | buildActionMask = 2147483647; 973 | files = ( 974 | 2C605BC51727CEE500CE8626 /* Default.png in Resources */, 975 | 2C605BC71727CEE500CE8626 /* Default@2x.png in Resources */, 976 | 2C605BC91727CEE500CE8626 /* Default-568h@2x.png in Resources */, 977 | 2C605BD81727DA9800CE8626 /* 4.webp in Resources */, 978 | 2C605BDA1727E1D000CE8626 /* 5_webp_a.webp in Resources */, 979 | 2C605BDC1727E33B00CE8626 /* 4.jpg in Resources */, 980 | ); 981 | runOnlyForDeploymentPostprocessing = 0; 982 | }; 983 | 2CB9CC2E172C86E10054BC07 /* Resources */ = { 984 | isa = PBXResourcesBuildPhase; 985 | buildActionMask = 2147483647; 986 | files = ( 987 | 2CB9CC3D172C86E10054BC07 /* Credits.rtf in Resources */, 988 | 2CB9CC43172C86E20054BC07 /* MainMenu.xib in Resources */, 989 | 2C751345172C8B020036F82B /* 4.jpg in Resources */, 990 | 2C751346172C8B020036F82B /* 4.webp in Resources */, 991 | 2C751347172C8B020036F82B /* 5_webp_a.webp in Resources */, 992 | ); 993 | runOnlyForDeploymentPostprocessing = 0; 994 | }; 995 | /* End PBXResourcesBuildPhase section */ 996 | 997 | /* Begin PBXSourcesBuildPhase section */ 998 | 2C0EC12918A2279200C47CC0 /* Sources */ = { 999 | isa = PBXSourcesBuildPhase; 1000 | buildActionMask = 2147483647; 1001 | files = ( 1002 | 2C0EC13618A2279200C47CC0 /* STWebPDecoderTests-mac.m in Sources */, 1003 | ); 1004 | runOnlyForDeploymentPostprocessing = 0; 1005 | }; 1006 | 2C0EC14218A2426100C47CC0 /* Sources */ = { 1007 | isa = PBXSourcesBuildPhase; 1008 | buildActionMask = 2147483647; 1009 | files = ( 1010 | 2C0EC15118A2426100C47CC0 /* STWebPDecoderTests-iOS.m in Sources */, 1011 | ); 1012 | runOnlyForDeploymentPostprocessing = 0; 1013 | }; 1014 | 2C605BAB1727CEE500CE8626 /* Sources */ = { 1015 | isa = PBXSourcesBuildPhase; 1016 | buildActionMask = 2147483647; 1017 | files = ( 1018 | 2C605BBF1727CEE500CE8626 /* main.m in Sources */, 1019 | 2C605BC31727CEE500CE8626 /* STAppDelegate.m in Sources */, 1020 | 2C605BD61727D85700CE8626 /* STWebPViewController.m in Sources */, 1021 | 2C5BD01317327425006B6AC5 /* STWebPWebViewController.m in Sources */, 1022 | ); 1023 | runOnlyForDeploymentPostprocessing = 0; 1024 | }; 1025 | 2CB9CC2C172C86E10054BC07 /* Sources */ = { 1026 | isa = PBXSourcesBuildPhase; 1027 | buildActionMask = 2147483647; 1028 | files = ( 1029 | 2CB9CC39172C86E10054BC07 /* main.m in Sources */, 1030 | 2CB9CC40172C86E10054BC07 /* STAppDelegate.m in Sources */, 1031 | ); 1032 | runOnlyForDeploymentPostprocessing = 0; 1033 | }; 1034 | 2CBA51AB189BC15400529073 /* Sources */ = { 1035 | isa = PBXSourcesBuildPhase; 1036 | buildActionMask = 2147483647; 1037 | files = ( 1038 | 2CBA525A189BC34A00529073 /* tree.c in Sources */, 1039 | 2CBA5244189BC34A00529073 /* dec.c in Sources */, 1040 | 2CBA5246189BC34A00529073 /* dec_sse2.c in Sources */, 1041 | 2CBA5240189BC34A00529073 /* vp8l.c in Sources */, 1042 | 2CBA523F189BC34A00529073 /* vp8.c in Sources */, 1043 | 2CBA523C189BC34A00529073 /* layer.c in Sources */, 1044 | 2CBA5249189BC34A00529073 /* upsampling_neon.c in Sources */, 1045 | 2CBA524E189BC34A00529073 /* backward_references.c in Sources */, 1046 | 2CBA5245189BC34A00529073 /* dec_neon.c in Sources */, 1047 | 2CBA5250189BC34A00529073 /* cost.c in Sources */, 1048 | 2CBA5259189BC34A00529073 /* token.c in Sources */, 1049 | 2CBA525C189BC34A00529073 /* webpenc.c in Sources */, 1050 | 2CBA524D189BC34A00529073 /* analysis.c in Sources */, 1051 | 2CBA5253189BC34A00529073 /* histogram.c in Sources */, 1052 | 2CBA526A189BC34A00529073 /* rescaler.c in Sources */, 1053 | 2CBA51FF189BC31300529073 /* enc_neon.c in Sources */, 1054 | 2CBA5247189BC34A00529073 /* lossless.c in Sources */, 1055 | 2CBA5200189BC31300529073 /* enc_sse2.c in Sources */, 1056 | 2CBA5251189BC34A00529073 /* filter.c in Sources */, 1057 | 2CBA5262189BC34A00529073 /* bit_writer.c in Sources */, 1058 | 2CBA5237189BC34A00529073 /* alpha.c in Sources */, 1059 | 2CBA5239189BC34A00529073 /* frame.c in Sources */, 1060 | 2CBA525D189BC34A00529073 /* muxedit.c in Sources */, 1061 | 2CBA5241189BC34A00529073 /* webp.c in Sources */, 1062 | 2CBA524C189BC34A00529073 /* alpha.c in Sources */, 1063 | 2CBA526B189BC34A00529073 /* thread.c in Sources */, 1064 | 2CBA5248189BC34A00529073 /* upsampling.c in Sources */, 1065 | 2CBA5238189BC34A00529073 /* buffer.c in Sources */, 1066 | 2CBA525E189BC34A00529073 /* muxinternal.c in Sources */, 1067 | 2CBA523B189BC34A00529073 /* io.c in Sources */, 1068 | 2CBA526C189BC34A00529073 /* utils.c in Sources */, 1069 | 2CBA5254189BC34A00529073 /* iterator.c in Sources */, 1070 | 2CBA525B189BC34A00529073 /* vp8l.c in Sources */, 1071 | 2CBA523D189BC34A00529073 /* quant.c in Sources */, 1072 | 2CBA5261189BC34A00529073 /* bit_reader.c in Sources */, 1073 | 2CBA5263189BC34A00529073 /* color_cache.c in Sources */, 1074 | 2CBA5268189BC34A00529073 /* quant_levels_dec.c in Sources */, 1075 | 2CBA5258189BC34A00529073 /* syntax.c in Sources */, 1076 | 2CBA524A189BC34A00529073 /* upsampling_sse2.c in Sources */, 1077 | 2CBA5264189BC34A00529073 /* filters.c in Sources */, 1078 | 2CBA525F189BC34A00529073 /* muxread.c in Sources */, 1079 | 2CBA524B189BC34A00529073 /* yuv.c in Sources */, 1080 | 2CBA5260189BC34A00529073 /* alpha_processing.c in Sources */, 1081 | 2CBA5269189BC34A00529073 /* random.c in Sources */, 1082 | 2CBA5252189BC34A00529073 /* frame.c in Sources */, 1083 | 2CBA5255189BC34A00529073 /* layer.c in Sources */, 1084 | 2CBA523A189BC34A00529073 /* idec.c in Sources */, 1085 | 2CBA524F189BC34A00529073 /* config.c in Sources */, 1086 | 2CBA5242189BC34A00529073 /* demux.c in Sources */, 1087 | 2CBA523E189BC34A00529073 /* tree.c in Sources */, 1088 | 2CBA5265189BC34A00529073 /* huffman.c in Sources */, 1089 | 2CBA5267189BC34A00529073 /* quant_levels.c in Sources */, 1090 | 2CBA5243189BC34A00529073 /* cpu.c in Sources */, 1091 | 2CBA5257189BC34A00529073 /* quant.c in Sources */, 1092 | 2CBA51FB189BC30D00529073 /* enc.c in Sources */, 1093 | 2CBA5256189BC34A00529073 /* picture.c in Sources */, 1094 | 2CBA5266189BC34A00529073 /* huffman_encode.c in Sources */, 1095 | ); 1096 | runOnlyForDeploymentPostprocessing = 0; 1097 | }; 1098 | 2CBA51D2189BC25100529073 /* Sources */ = { 1099 | isa = PBXSourcesBuildPhase; 1100 | buildActionMask = 2147483647; 1101 | files = ( 1102 | 2CBA5224189BC34900529073 /* tree.c in Sources */, 1103 | 2CBA520E189BC34900529073 /* dec.c in Sources */, 1104 | 2CBA5210189BC34900529073 /* dec_sse2.c in Sources */, 1105 | 2CBA520A189BC34900529073 /* vp8l.c in Sources */, 1106 | 2CBA5209189BC34900529073 /* vp8.c in Sources */, 1107 | 2CBA5206189BC34900529073 /* layer.c in Sources */, 1108 | 2CBA5213189BC34900529073 /* upsampling_neon.c in Sources */, 1109 | 2CBA5218189BC34900529073 /* backward_references.c in Sources */, 1110 | 2CBA520F189BC34900529073 /* dec_neon.c in Sources */, 1111 | 2CBA521A189BC34900529073 /* cost.c in Sources */, 1112 | 2CBA5223189BC34900529073 /* token.c in Sources */, 1113 | 2CBA5226189BC34900529073 /* webpenc.c in Sources */, 1114 | 2CBA5217189BC34900529073 /* analysis.c in Sources */, 1115 | 2CBA521D189BC34900529073 /* histogram.c in Sources */, 1116 | 2CBA5234189BC34900529073 /* rescaler.c in Sources */, 1117 | 2CBA51FD189BC31200529073 /* enc_neon.c in Sources */, 1118 | 2CBA5211189BC34900529073 /* lossless.c in Sources */, 1119 | 2CBA51FE189BC31200529073 /* enc_sse2.c in Sources */, 1120 | 2CBA521B189BC34900529073 /* filter.c in Sources */, 1121 | 2CBA522C189BC34900529073 /* bit_writer.c in Sources */, 1122 | 2CBA5201189BC34900529073 /* alpha.c in Sources */, 1123 | 2CBA5203189BC34900529073 /* frame.c in Sources */, 1124 | 2CBA5227189BC34900529073 /* muxedit.c in Sources */, 1125 | 2CBA520B189BC34900529073 /* webp.c in Sources */, 1126 | 2CBA5216189BC34900529073 /* alpha.c in Sources */, 1127 | 2CBA5235189BC34900529073 /* thread.c in Sources */, 1128 | 2CBA5212189BC34900529073 /* upsampling.c in Sources */, 1129 | 2CBA5202189BC34900529073 /* buffer.c in Sources */, 1130 | 2CBA5228189BC34900529073 /* muxinternal.c in Sources */, 1131 | 2CBA5205189BC34900529073 /* io.c in Sources */, 1132 | 2CBA5236189BC34900529073 /* utils.c in Sources */, 1133 | 2CBA521E189BC34900529073 /* iterator.c in Sources */, 1134 | 2CBA5225189BC34900529073 /* vp8l.c in Sources */, 1135 | 2CBA5207189BC34900529073 /* quant.c in Sources */, 1136 | 2CBA522B189BC34900529073 /* bit_reader.c in Sources */, 1137 | 2CBA522D189BC34900529073 /* color_cache.c in Sources */, 1138 | 2CBA5232189BC34900529073 /* quant_levels_dec.c in Sources */, 1139 | 2CBA5222189BC34900529073 /* syntax.c in Sources */, 1140 | 2CBA5214189BC34900529073 /* upsampling_sse2.c in Sources */, 1141 | 2CBA522E189BC34900529073 /* filters.c in Sources */, 1142 | 2CBA5229189BC34900529073 /* muxread.c in Sources */, 1143 | 2CBA5215189BC34900529073 /* yuv.c in Sources */, 1144 | 2CBA522A189BC34900529073 /* alpha_processing.c in Sources */, 1145 | 2CBA5233189BC34900529073 /* random.c in Sources */, 1146 | 2CBA521C189BC34900529073 /* frame.c in Sources */, 1147 | 2CBA521F189BC34900529073 /* layer.c in Sources */, 1148 | 2CBA5204189BC34900529073 /* idec.c in Sources */, 1149 | 2CBA5219189BC34900529073 /* config.c in Sources */, 1150 | 2CBA520C189BC34900529073 /* demux.c in Sources */, 1151 | 2CBA5208189BC34900529073 /* tree.c in Sources */, 1152 | 2CBA522F189BC34900529073 /* huffman.c in Sources */, 1153 | 2CBA5231189BC34900529073 /* quant_levels.c in Sources */, 1154 | 2CBA520D189BC34900529073 /* cpu.c in Sources */, 1155 | 2CBA5221189BC34900529073 /* quant.c in Sources */, 1156 | 2CBA51FC189BC30D00529073 /* enc.c in Sources */, 1157 | 2CBA5220189BC34900529073 /* picture.c in Sources */, 1158 | 2CBA5230189BC34900529073 /* huffman_encode.c in Sources */, 1159 | ); 1160 | runOnlyForDeploymentPostprocessing = 0; 1161 | }; 1162 | 2CE5C68C172C83EF00CB54A5 /* Sources */ = { 1163 | isa = PBXSourcesBuildPhase; 1164 | buildActionMask = 2147483647; 1165 | files = ( 1166 | 2CBA52AE189F9F1300529073 /* STWebP.m in Sources */, 1167 | 2CBA52BA189F9FC900529073 /* STWebPStreamingDecoder-mac.m in Sources */, 1168 | 2CB9CC2B172C85EC0054BC07 /* STWebPDecoder-mac.m in Sources */, 1169 | ); 1170 | runOnlyForDeploymentPostprocessing = 0; 1171 | }; 1172 | 2CFC2D1D172BD74300893638 /* Sources */ = { 1173 | isa = PBXSourcesBuildPhase; 1174 | buildActionMask = 2147483647; 1175 | files = ( 1176 | 2CBA52B7189F9FC900529073 /* STWebPStreamingDecoder-iOS.m in Sources */, 1177 | 2CFC2D29172BD74300893638 /* STWebPDecoder-iOS.m in Sources */, 1178 | 2C5BD00F173157D2006B6AC5 /* STWebPURLProtocol.m in Sources */, 1179 | 2CBA52AD189F9F1300529073 /* STWebP.m in Sources */, 1180 | ); 1181 | runOnlyForDeploymentPostprocessing = 0; 1182 | }; 1183 | /* End PBXSourcesBuildPhase section */ 1184 | 1185 | /* Begin PBXTargetDependency section */ 1186 | 2C0EC13918A2279200C47CC0 /* PBXTargetDependency */ = { 1187 | isa = PBXTargetDependency; 1188 | target = 2CE5C68F172C83EF00CB54A5 /* STWebP-mac */; 1189 | targetProxy = 2C0EC13818A2279200C47CC0 /* PBXContainerItemProxy */; 1190 | }; 1191 | 2C0EC15418A2426100C47CC0 /* PBXTargetDependency */ = { 1192 | isa = PBXTargetDependency; 1193 | target = 2CFC2D20172BD74300893638 /* STWebP-iOS */; 1194 | targetProxy = 2C0EC15318A2426100C47CC0 /* PBXContainerItemProxy */; 1195 | }; 1196 | 2CB9CC48172C87120054BC07 /* PBXTargetDependency */ = { 1197 | isa = PBXTargetDependency; 1198 | target = 2CE5C68F172C83EF00CB54A5 /* STWebP-mac */; 1199 | targetProxy = 2CB9CC47172C87120054BC07 /* PBXContainerItemProxy */; 1200 | }; 1201 | 2CBA529C189BC36500529073 /* PBXTargetDependency */ = { 1202 | isa = PBXTargetDependency; 1203 | target = 2CBA51AE189BC15400529073 /* libwebp-iOS */; 1204 | targetProxy = 2CBA529B189BC36500529073 /* PBXContainerItemProxy */; 1205 | }; 1206 | 2CBA529E189BC36B00529073 /* PBXTargetDependency */ = { 1207 | isa = PBXTargetDependency; 1208 | target = 2CBA51D5189BC25100529073 /* libwebp-mac */; 1209 | targetProxy = 2CBA529D189BC36B00529073 /* PBXContainerItemProxy */; 1210 | }; 1211 | 2CFC2D2E172BD81A00893638 /* PBXTargetDependency */ = { 1212 | isa = PBXTargetDependency; 1213 | target = 2CFC2D20172BD74300893638 /* STWebP-iOS */; 1214 | targetProxy = 2CFC2D2D172BD81A00893638 /* PBXContainerItemProxy */; 1215 | }; 1216 | /* End PBXTargetDependency section */ 1217 | 1218 | /* Begin PBXVariantGroup section */ 1219 | 2CB9CC3B172C86E10054BC07 /* Credits.rtf */ = { 1220 | isa = PBXVariantGroup; 1221 | children = ( 1222 | 2CB9CC3C172C86E10054BC07 /* en */, 1223 | ); 1224 | name = Credits.rtf; 1225 | sourceTree = ""; 1226 | }; 1227 | 2CB9CC41172C86E20054BC07 /* MainMenu.xib */ = { 1228 | isa = PBXVariantGroup; 1229 | children = ( 1230 | 2CB9CC42172C86E20054BC07 /* en */, 1231 | ); 1232 | name = MainMenu.xib; 1233 | sourceTree = ""; 1234 | }; 1235 | /* End PBXVariantGroup section */ 1236 | 1237 | /* Begin XCBuildConfiguration section */ 1238 | 2C0EC13A18A2279200C47CC0 /* Debug */ = { 1239 | isa = XCBuildConfiguration; 1240 | buildSettings = { 1241 | FRAMEWORK_SEARCH_PATHS = ( 1242 | "$(DEVELOPER_FRAMEWORKS_DIR)", 1243 | "$(inherited)", 1244 | ); 1245 | INFOPLIST_FILE = STWebPTests/Info.plist; 1246 | PRODUCT_NAME = "$(TARGET_NAME)"; 1247 | SDKROOT = macosx; 1248 | WRAPPER_EXTENSION = xctest; 1249 | }; 1250 | name = Debug; 1251 | }; 1252 | 2C0EC13B18A2279200C47CC0 /* Release */ = { 1253 | isa = XCBuildConfiguration; 1254 | buildSettings = { 1255 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1256 | FRAMEWORK_SEARCH_PATHS = ( 1257 | "$(DEVELOPER_FRAMEWORKS_DIR)", 1258 | "$(inherited)", 1259 | ); 1260 | INFOPLIST_FILE = STWebPTests/Info.plist; 1261 | PRODUCT_NAME = "$(TARGET_NAME)"; 1262 | SDKROOT = macosx; 1263 | WRAPPER_EXTENSION = xctest; 1264 | }; 1265 | name = Release; 1266 | }; 1267 | 2C0EC15618A2426100C47CC0 /* Debug */ = { 1268 | isa = XCBuildConfiguration; 1269 | buildSettings = { 1270 | FRAMEWORK_SEARCH_PATHS = ( 1271 | "$(SDKROOT)/Developer/Library/Frameworks", 1272 | "$(inherited)", 1273 | "$(DEVELOPER_FRAMEWORKS_DIR)", 1274 | ); 1275 | INFOPLIST_FILE = STWebPTests/Info.plist; 1276 | PRODUCT_NAME = "$(TARGET_NAME)"; 1277 | SDKROOT = iphoneos; 1278 | WRAPPER_EXTENSION = xctest; 1279 | }; 1280 | name = Debug; 1281 | }; 1282 | 2C0EC15718A2426100C47CC0 /* Release */ = { 1283 | isa = XCBuildConfiguration; 1284 | buildSettings = { 1285 | FRAMEWORK_SEARCH_PATHS = ( 1286 | "$(SDKROOT)/Developer/Library/Frameworks", 1287 | "$(inherited)", 1288 | "$(DEVELOPER_FRAMEWORKS_DIR)", 1289 | ); 1290 | INFOPLIST_FILE = STWebPTests/Info.plist; 1291 | PRODUCT_NAME = "$(TARGET_NAME)"; 1292 | SDKROOT = iphoneos; 1293 | WRAPPER_EXTENSION = xctest; 1294 | }; 1295 | name = Release; 1296 | }; 1297 | 2C605BCA1727CEE500CE8626 /* Debug */ = { 1298 | isa = XCBuildConfiguration; 1299 | buildSettings = { 1300 | ALWAYS_SEARCH_USER_PATHS = NO; 1301 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1302 | CLANG_CXX_LIBRARY = "libc++"; 1303 | CLANG_ENABLE_OBJC_ARC = YES; 1304 | CLANG_WARN_BOOL_CONVERSION = YES; 1305 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1306 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1307 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1308 | CLANG_WARN_EMPTY_BODY = YES; 1309 | CLANG_WARN_ENUM_CONVERSION = YES; 1310 | CLANG_WARN_INT_CONVERSION = YES; 1311 | CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES; 1312 | CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; 1313 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1314 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES; 1315 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1316 | CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; 1317 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1318 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1319 | COPY_PHASE_STRIP = NO; 1320 | GCC_C_LANGUAGE_STANDARD = gnu99; 1321 | GCC_DYNAMIC_NO_PIC = NO; 1322 | GCC_OPTIMIZATION_LEVEL = 0; 1323 | GCC_PREPROCESSOR_DEFINITIONS = ( 1324 | "DEBUG=1", 1325 | "$(inherited)", 1326 | ); 1327 | GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = "WEBP_USE_THREAD=1"; 1328 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 1329 | GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; 1330 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1331 | GCC_WARN_ABOUT_MISSING_NEWLINE = YES; 1332 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1333 | GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; 1334 | GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES; 1335 | GCC_WARN_SIGN_COMPARE = YES; 1336 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1337 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1338 | GCC_WARN_UNUSED_FUNCTION = YES; 1339 | GCC_WARN_UNUSED_VARIABLE = YES; 1340 | HEADER_SEARCH_PATHS = ( 1341 | "$(inherited)", 1342 | "$(SRCROOT)", 1343 | ); 1344 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 1345 | ONLY_ACTIVE_ARCH = YES; 1346 | RUN_CLANG_STATIC_ANALYZER = YES; 1347 | TARGETED_DEVICE_FAMILY = "1,2"; 1348 | WARNING_CFLAGS = ( 1349 | "-Wall", 1350 | "-Wextra", 1351 | ); 1352 | }; 1353 | name = Debug; 1354 | }; 1355 | 2C605BCB1727CEE500CE8626 /* Release */ = { 1356 | isa = XCBuildConfiguration; 1357 | buildSettings = { 1358 | ALWAYS_SEARCH_USER_PATHS = NO; 1359 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1360 | CLANG_CXX_LIBRARY = "libc++"; 1361 | CLANG_ENABLE_OBJC_ARC = YES; 1362 | CLANG_WARN_BOOL_CONVERSION = YES; 1363 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1364 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1365 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1366 | CLANG_WARN_EMPTY_BODY = YES; 1367 | CLANG_WARN_ENUM_CONVERSION = YES; 1368 | CLANG_WARN_INT_CONVERSION = YES; 1369 | CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES; 1370 | CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; 1371 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1372 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES; 1373 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1374 | CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; 1375 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1376 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1377 | COPY_PHASE_STRIP = YES; 1378 | GCC_C_LANGUAGE_STANDARD = gnu99; 1379 | GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = "WEBP_USE_THREAD=1"; 1380 | GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; 1381 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1382 | GCC_WARN_ABOUT_MISSING_NEWLINE = YES; 1383 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1384 | GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; 1385 | GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES; 1386 | GCC_WARN_SIGN_COMPARE = YES; 1387 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1388 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1389 | GCC_WARN_UNUSED_FUNCTION = YES; 1390 | GCC_WARN_UNUSED_VARIABLE = YES; 1391 | HEADER_SEARCH_PATHS = ( 1392 | "$(inherited)", 1393 | "$(SRCROOT)", 1394 | ); 1395 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 1396 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 1397 | RUN_CLANG_STATIC_ANALYZER = YES; 1398 | TARGETED_DEVICE_FAMILY = "1,2"; 1399 | VALIDATE_PRODUCT = YES; 1400 | WARNING_CFLAGS = ( 1401 | "-Wall", 1402 | "-Wextra", 1403 | ); 1404 | }; 1405 | name = Release; 1406 | }; 1407 | 2C605BCD1727CEE500CE8626 /* Debug */ = { 1408 | isa = XCBuildConfiguration; 1409 | buildSettings = { 1410 | INFOPLIST_FILE = "STWebPDecoderExample-iOS/Info.plist"; 1411 | PRODUCT_NAME = "$(TARGET_NAME)"; 1412 | SDKROOT = iphoneos; 1413 | WRAPPER_EXTENSION = app; 1414 | }; 1415 | name = Debug; 1416 | }; 1417 | 2C605BCE1727CEE500CE8626 /* Release */ = { 1418 | isa = XCBuildConfiguration; 1419 | buildSettings = { 1420 | INFOPLIST_FILE = "STWebPDecoderExample-iOS/Info.plist"; 1421 | PRODUCT_NAME = "$(TARGET_NAME)"; 1422 | SDKROOT = iphoneos; 1423 | WRAPPER_EXTENSION = app; 1424 | }; 1425 | name = Release; 1426 | }; 1427 | 2CB9CC45172C86E20054BC07 /* Debug */ = { 1428 | isa = XCBuildConfiguration; 1429 | buildSettings = { 1430 | COMBINE_HIDPI_IMAGES = YES; 1431 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 1432 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1433 | INFOPLIST_FILE = "STWebPDecoderExample-mac/Info.plist"; 1434 | MACOSX_DEPLOYMENT_TARGET = 10.8; 1435 | PRODUCT_NAME = "$(TARGET_NAME)"; 1436 | SDKROOT = macosx; 1437 | WRAPPER_EXTENSION = app; 1438 | }; 1439 | name = Debug; 1440 | }; 1441 | 2CB9CC46172C86E20054BC07 /* Release */ = { 1442 | isa = XCBuildConfiguration; 1443 | buildSettings = { 1444 | COMBINE_HIDPI_IMAGES = YES; 1445 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1446 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 1447 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1448 | INFOPLIST_FILE = "STWebPDecoderExample-mac/Info.plist"; 1449 | MACOSX_DEPLOYMENT_TARGET = 10.8; 1450 | PRODUCT_NAME = "$(TARGET_NAME)"; 1451 | SDKROOT = macosx; 1452 | WRAPPER_EXTENSION = app; 1453 | }; 1454 | name = Release; 1455 | }; 1456 | 2CBA51CD189BC15400529073 /* Debug */ = { 1457 | isa = XCBuildConfiguration; 1458 | buildSettings = { 1459 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1460 | CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO; 1461 | DSTROOT = /tmp/webp.dst; 1462 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1463 | PRODUCT_NAME = webp; 1464 | SDKROOT = iphoneos; 1465 | SKIP_INSTALL = YES; 1466 | }; 1467 | name = Debug; 1468 | }; 1469 | 2CBA51CE189BC15400529073 /* Release */ = { 1470 | isa = XCBuildConfiguration; 1471 | buildSettings = { 1472 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1473 | CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO; 1474 | DSTROOT = /tmp/webp.dst; 1475 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1476 | PRODUCT_NAME = webp; 1477 | SDKROOT = iphoneos; 1478 | SKIP_INSTALL = YES; 1479 | }; 1480 | name = Release; 1481 | }; 1482 | 2CBA51F6189BC25200529073 /* Debug */ = { 1483 | isa = XCBuildConfiguration; 1484 | buildSettings = { 1485 | CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO; 1486 | PRODUCT_NAME = webp; 1487 | SDKROOT = macosx; 1488 | }; 1489 | name = Debug; 1490 | }; 1491 | 2CBA51F7189BC25200529073 /* Release */ = { 1492 | isa = XCBuildConfiguration; 1493 | buildSettings = { 1494 | CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO; 1495 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1496 | PRODUCT_NAME = webp; 1497 | SDKROOT = macosx; 1498 | }; 1499 | name = Release; 1500 | }; 1501 | 2CE5C69D172C83EF00CB54A5 /* Debug */ = { 1502 | isa = XCBuildConfiguration; 1503 | buildSettings = { 1504 | FRAMEWORK_SEARCH_PATHS = ( 1505 | "$(inherited)", 1506 | "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"", 1507 | ); 1508 | HEADER_SEARCH_PATHS = "$(SRCROOT)"; 1509 | MACOSX_DEPLOYMENT_TARGET = 10.8; 1510 | PRODUCT_NAME = STWebP; 1511 | SDKROOT = macosx; 1512 | SKIP_INSTALL = YES; 1513 | }; 1514 | name = Debug; 1515 | }; 1516 | 2CE5C69E172C83EF00CB54A5 /* Release */ = { 1517 | isa = XCBuildConfiguration; 1518 | buildSettings = { 1519 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1520 | FRAMEWORK_SEARCH_PATHS = ( 1521 | "$(inherited)", 1522 | "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"", 1523 | ); 1524 | HEADER_SEARCH_PATHS = "$(SRCROOT)"; 1525 | MACOSX_DEPLOYMENT_TARGET = 10.8; 1526 | PRODUCT_NAME = STWebP; 1527 | SDKROOT = macosx; 1528 | SKIP_INSTALL = YES; 1529 | }; 1530 | name = Release; 1531 | }; 1532 | 2CFC2D2A172BD74300893638 /* Debug */ = { 1533 | isa = XCBuildConfiguration; 1534 | buildSettings = { 1535 | GCC_SYMBOLS_PRIVATE_EXTERN = YES; 1536 | HEADER_SEARCH_PATHS = "$(SRCROOT)"; 1537 | PRODUCT_NAME = STWebP; 1538 | SDKROOT = iphoneos; 1539 | SKIP_INSTALL = YES; 1540 | }; 1541 | name = Debug; 1542 | }; 1543 | 2CFC2D2B172BD74300893638 /* Release */ = { 1544 | isa = XCBuildConfiguration; 1545 | buildSettings = { 1546 | GCC_SYMBOLS_PRIVATE_EXTERN = YES; 1547 | HEADER_SEARCH_PATHS = "$(SRCROOT)"; 1548 | PRODUCT_NAME = STWebP; 1549 | SDKROOT = iphoneos; 1550 | SKIP_INSTALL = YES; 1551 | }; 1552 | name = Release; 1553 | }; 1554 | /* End XCBuildConfiguration section */ 1555 | 1556 | /* Begin XCConfigurationList section */ 1557 | 2C0EC13C18A2279200C47CC0 /* Build configuration list for PBXNativeTarget "STWebPTests-mac" */ = { 1558 | isa = XCConfigurationList; 1559 | buildConfigurations = ( 1560 | 2C0EC13A18A2279200C47CC0 /* Debug */, 1561 | 2C0EC13B18A2279200C47CC0 /* Release */, 1562 | ); 1563 | defaultConfigurationIsVisible = 0; 1564 | defaultConfigurationName = Release; 1565 | }; 1566 | 2C0EC15518A2426100C47CC0 /* Build configuration list for PBXNativeTarget "STWebPTests-iOS" */ = { 1567 | isa = XCConfigurationList; 1568 | buildConfigurations = ( 1569 | 2C0EC15618A2426100C47CC0 /* Debug */, 1570 | 2C0EC15718A2426100C47CC0 /* Release */, 1571 | ); 1572 | defaultConfigurationIsVisible = 0; 1573 | defaultConfigurationName = Release; 1574 | }; 1575 | 2C605BAA1727CEE500CE8626 /* Build configuration list for PBXProject "STWebP" */ = { 1576 | isa = XCConfigurationList; 1577 | buildConfigurations = ( 1578 | 2C605BCA1727CEE500CE8626 /* Debug */, 1579 | 2C605BCB1727CEE500CE8626 /* Release */, 1580 | ); 1581 | defaultConfigurationIsVisible = 0; 1582 | defaultConfigurationName = Release; 1583 | }; 1584 | 2C605BCC1727CEE500CE8626 /* Build configuration list for PBXNativeTarget "STWebPDecoderExample-iOS" */ = { 1585 | isa = XCConfigurationList; 1586 | buildConfigurations = ( 1587 | 2C605BCD1727CEE500CE8626 /* Debug */, 1588 | 2C605BCE1727CEE500CE8626 /* Release */, 1589 | ); 1590 | defaultConfigurationIsVisible = 0; 1591 | defaultConfigurationName = Release; 1592 | }; 1593 | 2CB9CC44172C86E20054BC07 /* Build configuration list for PBXNativeTarget "STWebPDecoderExample-mac" */ = { 1594 | isa = XCConfigurationList; 1595 | buildConfigurations = ( 1596 | 2CB9CC45172C86E20054BC07 /* Debug */, 1597 | 2CB9CC46172C86E20054BC07 /* Release */, 1598 | ); 1599 | defaultConfigurationIsVisible = 0; 1600 | defaultConfigurationName = Release; 1601 | }; 1602 | 2CBA51CC189BC15400529073 /* Build configuration list for PBXNativeTarget "libwebp-iOS" */ = { 1603 | isa = XCConfigurationList; 1604 | buildConfigurations = ( 1605 | 2CBA51CD189BC15400529073 /* Debug */, 1606 | 2CBA51CE189BC15400529073 /* Release */, 1607 | ); 1608 | defaultConfigurationIsVisible = 0; 1609 | defaultConfigurationName = Release; 1610 | }; 1611 | 2CBA51F5189BC25200529073 /* Build configuration list for PBXNativeTarget "libwebp-mac" */ = { 1612 | isa = XCConfigurationList; 1613 | buildConfigurations = ( 1614 | 2CBA51F6189BC25200529073 /* Debug */, 1615 | 2CBA51F7189BC25200529073 /* Release */, 1616 | ); 1617 | defaultConfigurationIsVisible = 0; 1618 | defaultConfigurationName = Release; 1619 | }; 1620 | 2CE5C69F172C83EF00CB54A5 /* Build configuration list for PBXNativeTarget "STWebP-mac" */ = { 1621 | isa = XCConfigurationList; 1622 | buildConfigurations = ( 1623 | 2CE5C69D172C83EF00CB54A5 /* Debug */, 1624 | 2CE5C69E172C83EF00CB54A5 /* Release */, 1625 | ); 1626 | defaultConfigurationIsVisible = 0; 1627 | defaultConfigurationName = Release; 1628 | }; 1629 | 2CFC2D2C172BD74300893638 /* Build configuration list for PBXNativeTarget "STWebP-iOS" */ = { 1630 | isa = XCConfigurationList; 1631 | buildConfigurations = ( 1632 | 2CFC2D2A172BD74300893638 /* Debug */, 1633 | 2CFC2D2B172BD74300893638 /* Release */, 1634 | ); 1635 | defaultConfigurationIsVisible = 0; 1636 | defaultConfigurationName = Release; 1637 | }; 1638 | /* End XCConfigurationList section */ 1639 | }; 1640 | rootObject = 2C605BA71727CEE500CE8626 /* Project object */; 1641 | } 1642 | --------------------------------------------------------------------------------