diff --git a/gyp/core.gyp b/gyp/core.gyp index 64cc79bf5b..afbc78a4ce 100644 --- a/gyp/core.gyp +++ b/gyp/core.gyp @@ -20,6 +20,7 @@ '../include/ports', '../include/utils', '../include/xml', + '../include/images', '../src/core', '../src/sfnt', '../src/image', diff --git a/gyp/core.gypi b/gyp/core.gypi index a6d563532b..7a8d0acebc 100644 --- a/gyp/core.gypi +++ b/gyp/core.gypi @@ -222,7 +222,6 @@ '<(skia_src_path)/image/SkImage.cpp', '<(skia_src_path)/image/SkImagePriv.cpp', - '<(skia_src_path)/image/SkImage_Codec.cpp', # '<(skia_src_path)/image/SkImage_Gpu.cpp', '<(skia_src_path)/image/SkImage_Raster.cpp', '<(skia_src_path)/image/SkSurface.cpp', diff --git a/src/image/SkImage_Codec.cpp b/src/image/SkImage_Codec.cpp deleted file mode 100644 index 21c844d01d..0000000000 --- a/src/image/SkImage_Codec.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - * 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 "SkImageDecoder.h" -#include "SkImage_Base.h" -#include "SkBitmap.h" -#include "SkCanvas.h" -#include "SkData.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*) const SK_OVERRIDE; - virtual void onDrawRectToRect(SkCanvas*, const SkRect*, const SkRect&, - const SkPaint*) const 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) const { - if (!fBitmap.pixelRef()) { - // todo: this needs to be thread-safe - SkBitmap* bitmap = const_cast(&fBitmap); - if (!SkImageDecoder::DecodeMemory(fEncodedData->bytes(), fEncodedData->size(), bitmap)) { - return; - } - } - canvas->drawBitmap(fBitmap, x, y, paint); -} - -void SkImage_Codec::onDrawRectToRect(SkCanvas* canvas, const SkRect* src, const SkRect& dst, - const SkPaint* paint) const { - if (!fBitmap.pixelRef()) { - // todo: this needs to be thread-safe - SkBitmap* bitmap = const_cast(&fBitmap); - if (!SkImageDecoder::DecodeMemory(fEncodedData->bytes(), fEncodedData->size(), bitmap)) { - return; - } - } - canvas->drawBitmapRectToRect(fBitmap, src, dst, paint); -} - -/////////////////////////////////////////////////////////////////////////////// - -SkImage* SkImage::NewEncodedData(SkData* data) { - if (NULL == data) { - return NULL; - } - - SkBitmap bitmap; - if (!SkImageDecoder::DecodeMemory(data->bytes(), data->size(), &bitmap, kUnknown_SkColorType, - SkImageDecoder::kDecodeBounds_Mode)) { - return NULL; - } - - return SkNEW_ARGS(SkImage_Codec, (data, bitmap.width(), bitmap.height())); -} diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index e4768af0ac..4841dae25c 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -10,6 +10,7 @@ #include "SkBitmap.h" #include "SkCanvas.h" #include "SkData.h" +#include "SkDecodingImageGenerator.h" #include "SkMallocPixelRef.h" class SkImage_Raster : public SkImage_Base { @@ -69,6 +70,10 @@ public: SkShader::TileMode, const SkMatrix* localMatrix) const SK_OVERRIDE; + SkImage_Raster(const SkBitmap& bitmap) + :INHERITED(bitmap.width(), bitmap.height()) + , fBitmap(bitmap) { } + private: SkImage_Raster() : INHERITED(0, 0) {} @@ -206,3 +211,17 @@ SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr, SkPixelRef* SkBitmapImageGetPixelRef(SkImage* image) { return ((SkImage_Raster*)image)->getPixelRef(); } + +SkImage* SkImage::NewEncodedData(SkData* data) { + if (NULL == data) { + return NULL; + } + SkBitmap bitmap; + if (!SkInstallDiscardablePixelRef( + SkDecodingImageGenerator::Create( + data, SkDecodingImageGenerator::Options()), + &bitmap)) { + return NULL; + } + return SkNEW_ARGS(SkImage_Raster, (bitmap)); +}