1/*
2 * Copyright 2010 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#import <CoreGraphics/CoreGraphics.h>
9#include <CoreGraphics/CGColorSpace.h>
10#import <UIKit/UIKit.h>
11
12#include "SkImageDecoder.h"
13#include "SkImageEncoder.h"
14#include "SkMovie.h"
15#include "SkStream_NSData.h"
16
17class SkImageDecoder_iOS : public SkImageDecoder {
18protected:
19    virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode);
20};
21
22#define BITMAP_INFO (kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast)
23
24bool SkImageDecoder_iOS::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
25
26    NSData* data = NSData_dataWithStream(stream);
27
28    UIImage* uimage = [UIImage imageWithData:data];
29
30    const int width = uimage.size.width;
31    const int height = uimage.size.height;
32    bm->setInfo(SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType), 0);
33    if (SkImageDecoder::kDecodeBounds_Mode == mode) {
34        return true;
35    }
36
37    if (!this->allocPixelRef(bm, NULL)) {
38        return false;
39    }
40
41    bm->lockPixels();
42    bm->eraseColor(0);
43
44    CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();
45    CGContextRef cg = CGBitmapContextCreate(bm->getPixels(), width, height,
46                                            8, bm->rowBytes(), cs, BITMAP_INFO);
47    CGContextDrawImage(cg, CGRectMake(0, 0, width, height), uimage.CGImage);
48    CGContextRelease(cg);
49    CGColorSpaceRelease(cs);
50
51    bm->unlockPixels();
52    return true;
53}
54
55/////////////////////////////////////////////////////////////////////////
56
57SkImageDecoder* SkImageDecoder::Factory(SkStreamRewindable* stream) {
58    return new SkImageDecoder_iOS;
59}
60
61SkMovie* SkMovie::DecodeStream(SkStreamRewindable* stream) {
62    return NULL;
63}
64
65
66