11a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com/* 2fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * Copyright 2010 Google Inc. 3fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * 4fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * Use of this source code is governed by a BSD-style license that can be 5fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * found in the LICENSE file. 6fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com */ 71a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 81a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com#import <CoreGraphics/CoreGraphics.h> 91a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com#include <CoreGraphics/CGColorSpace.h> 101a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com#import <UIKit/UIKit.h> 111a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 121a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com#include "SkImageDecoder.h" 131a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com#include "SkImageEncoder.h" 141a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com#include "SkMovie.h" 151a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com#include "SkStream_NSData.h" 161a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 171a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.comclass SkImageDecoder_iOS : public SkImageDecoder { 181a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.comprotected: 191a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode); 201a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com}; 211a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 221a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com#define BITMAP_INFO (kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast) 231a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 241a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.combool SkImageDecoder_iOS::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { 251a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 261a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com NSData* data = NSData_dataWithStream(stream); 271a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 281a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com UIImage* uimage = [UIImage imageWithData:data]; 291a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 301a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com const int width = uimage.size.width; 311a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com const int height = uimage.size.height; 328a243376d6f6c4561c713a8fae87af5917461872jvanverth bm->setInfo(SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType), 0); 331a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com if (SkImageDecoder::kDecodeBounds_Mode == mode) { 341a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com return true; 351a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com } 361a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 371a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com if (!this->allocPixelRef(bm, NULL)) { 381a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com return false; 391a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com } 401a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 411a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com bm->lockPixels(); 421a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com bm->eraseColor(0); 431a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 441a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB(); 451a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com CGContextRef cg = CGBitmapContextCreate(bm->getPixels(), width, height, 461a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 8, bm->rowBytes(), cs, BITMAP_INFO); 471a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com CGContextDrawImage(cg, CGRectMake(0, 0, width, height), uimage.CGImage); 481a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com CGContextRelease(cg); 491a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com CGColorSpaceRelease(cs); 501a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 511a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com bm->unlockPixels(); 521a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com return true; 531a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com} 541a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 551a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com///////////////////////////////////////////////////////////////////////// 561a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 5750955db60509f351d2ef783f874a40346e12d2a2scroggo@google.comSkImageDecoder* SkImageDecoder::Factory(SkStreamRewindable* stream) { 581a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com return new SkImageDecoder_iOS; 591a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com} 601a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 6150955db60509f351d2ef783f874a40346e12d2a2scroggo@google.comSkMovie* SkMovie::DecodeStream(SkStreamRewindable* stream) { 621a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com return NULL; 631a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com} 641a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 651a2b4c1586596311fc56e002bbe2c5daa2aa2c4dyangsu@google.com 66