diff options
author | mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-07-31 03:57:11 +0000 |
---|---|---|
committer | mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-07-31 03:57:11 +0000 |
commit | 5b26ea8c71f48e57f251b6f88443da790a209c40 (patch) | |
tree | 5236d86362413ea0c7d89ec3b1da14507b1e0242 /image/SkImage_Codec.cpp | |
parent | 21f61024c088345bbdf306c9dcfdcef7096752be (diff) | |
download | src-5b26ea8c71f48e57f251b6f88443da790a209c40.tar.gz |
add SkImage from encoded data
git-svn-id: http://skia.googlecode.com/svn/trunk/src@4845 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'image/SkImage_Codec.cpp')
-rw-r--r-- | image/SkImage_Codec.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/image/SkImage_Codec.cpp b/image/SkImage_Codec.cpp new file mode 100644 index 00000000..af7e0db0 --- /dev/null +++ b/image/SkImage_Codec.cpp @@ -0,0 +1,67 @@ +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkImage_Base.h" +#include "SkBitmap.h" +#include "SkCanvas.h" +#include "SkData.h" +#include "../images/SkImageDecoder.h" + +class SkImage_Codec : public SkImage_Base { +public: + static SkImage* NewEmpty(); + + SkImage_Codec(SkData* encodedData, int width, int height); + virtual ~SkImage_Codec(); + + virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) SK_OVERRIDE; + +private: + SkData* fEncodedData; + SkBitmap fBitmap; + + typedef SkImage_Base INHERITED; +}; + +/////////////////////////////////////////////////////////////////////////////// + +SkImage_Codec::SkImage_Codec(SkData* data, int width, int height) : INHERITED(width, height) { + fEncodedData = data; + fEncodedData->ref(); +} + +SkImage_Codec::~SkImage_Codec() { + fEncodedData->unref(); +} + +void SkImage_Codec::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) { + if (!fBitmap.pixelRef()) { + if (!SkImageDecoder::DecodeMemory(fEncodedData->bytes(), fEncodedData->size(), + &fBitmap)) { + return; + } + } + canvas->drawBitmap(fBitmap, x, y, paint); +} + +/////////////////////////////////////////////////////////////////////////////// + +SkImage* SkImage::NewEncodedData(SkData* data) { + if (NULL == data) { + return NULL; + } + + SkBitmap bitmap; + if (!SkImageDecoder::DecodeMemory(data->bytes(), data->size(), &bitmap, + SkBitmap::kNo_Config, + SkImageDecoder::kDecodeBounds_Mode)) { + return NULL; + } + + return SkNEW_ARGS(SkImage_Codec, (data, bitmap.width(), bitmap.height())); +} + |