blob: f3db65e03552f7b22b88709cd3e657769f77cc35 [file] [log] [blame]
/*
* Copyright 2010 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#import <CoreGraphics/CoreGraphics.h>
#include <CoreGraphics/CGColorSpace.h>
#import <UIKit/UIKit.h>
#include "SkImageDecoder.h"
#include "SkImageEncoder.h"
#include "SkMovie.h"
#include "SkStream_NSData.h"
class SkImageDecoder_iOS : public SkImageDecoder {
protected:
virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode);
};
#define BITMAP_INFO (kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast)
bool SkImageDecoder_iOS::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
NSData* data = NSData_dataWithStream(stream);
UIImage* uimage = [UIImage imageWithData:data];
const int width = uimage.size.width;
const int height = uimage.size.height;
bm->setInfo(SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType), 0);
if (SkImageDecoder::kDecodeBounds_Mode == mode) {
return true;
}
if (!this->allocPixelRef(bm, NULL)) {
return false;
}
bm->lockPixels();
bm->eraseColor(0);
CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();
CGContextRef cg = CGBitmapContextCreate(bm->getPixels(), width, height,
8, bm->rowBytes(), cs, BITMAP_INFO);
CGContextDrawImage(cg, CGRectMake(0, 0, width, height), uimage.CGImage);
CGContextRelease(cg);
CGColorSpaceRelease(cs);
bm->unlockPixels();
return true;
}
/////////////////////////////////////////////////////////////////////////
SkImageDecoder* SkImageDecoder::Factory(SkStreamRewindable* stream) {
return new SkImageDecoder_iOS;
}
SkMovie* SkMovie::DecodeStream(SkStreamRewindable* stream) {
return NULL;
}