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