diff options
author | kjlubick <kjlubick@google.com> | 2016-02-10 11:25:07 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-10 11:25:07 -0800 |
commit | 1de415f2c33febbac668500afbbb0c9b120c125f (patch) | |
tree | 6fea38167e591a5908c024866851a294dbd8e4c5 /src/ports/SkImageGenerator_skia.cpp | |
parent | 026388a01864c74208ad57d1ba4f711602d101c6 (diff) |
Revert of Make SkPicture/SkImageGenerator default to SkCodec (patchset #7 id:120001 of https://codereview.chromium.org/1671193002/ )
Reason for revert:
Breaks Ubuntu and Mac CMAKE
Original issue's description:
> Make SkPicture/SkImageGenerator default to SkCodec
>
> Remove reference to SkImageDecoder from SkPicture. Make the default
> InstallPixelRefProc passed to CreateFromStream use
> SkImageGenerator::NewFromEncoded instead.
>
> Make SkImageGenerator::NewFromEncoded create an SkCodecImageGenerator.
> Remove the old version that used SkImageDecoder.
>
> Remove all versions of lazy_decode_bitmap/LazyDecodeBitmap. The default
> now behaves lazily.
>
> Update all clients to use the default.
>
> Move SkImageDecoderGenerator into KtxTest.cpp, and use it directly.
>
> BUG=skia:4691
> BUG=skia:4290
> GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1671193002
>
> Committed: https://skia.googlesource.com/skia/+/026388a01864c74208ad57d1ba4f711602d101c6
TBR=msarett@google.com,reed@google.com,scroggo@google.com
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:4691
Review URL: https://codereview.chromium.org/1685963004
Diffstat (limited to 'src/ports/SkImageGenerator_skia.cpp')
-rw-r--r-- | src/ports/SkImageGenerator_skia.cpp | 96 |
1 files changed, 94 insertions, 2 deletions
diff --git a/src/ports/SkImageGenerator_skia.cpp b/src/ports/SkImageGenerator_skia.cpp index b6ddee935a..8dbad555dd 100644 --- a/src/ports/SkImageGenerator_skia.cpp +++ b/src/ports/SkImageGenerator_skia.cpp @@ -6,8 +6,100 @@ */ #include "SkData.h" -#include "SkCodecImageGenerator.h" +#include "SkImageDecoder.h" +#include "SkImageGenerator.h" +#include "SkStream.h" + +class BareMemoryAllocator : public SkBitmap::Allocator { + const SkImageInfo fInfo; + void* const fMemory; + const size_t fRowBytes; + +public: + BareMemoryAllocator(const SkImageInfo& info, void* memory, size_t rowBytes) + : fInfo(info), fMemory(memory), fRowBytes(rowBytes) + {} + +protected: + bool allocPixelRef(SkBitmap* bm, SkColorTable* ctable) override { + const SkImageInfo bmi = bm->info(); + if (bmi.width() != fInfo.width() || bmi.height() != fInfo.height() || + bmi.colorType() != fInfo.colorType()) + { + return false; + } + return bm->installPixels(bmi, fMemory, fRowBytes, ctable, nullptr, nullptr); + } +}; + +class SkImageDecoderGenerator : public SkImageGenerator { + const SkImageInfo fInfo; + SkAutoTDelete<SkImageDecoder> fDecoder; + SkAutoTUnref<SkData> fData; + +public: + SkImageDecoderGenerator(const SkImageInfo& info, SkImageDecoder* decoder, SkData* data) + : INHERITED(info), fInfo(info), fDecoder(decoder), fData(SkRef(data)) + {} + +protected: + SkData* onRefEncodedData(SK_REFENCODEDDATA_CTXPARAM) override { + return SkRef(fData.get()); + } + bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, + SkPMColor ctableEntries[], int* ctableCount) override { + SkMemoryStream stream(fData->data(), fData->size(), false); + SkAutoTUnref<BareMemoryAllocator> allocator( + new BareMemoryAllocator(info, pixels, rowBytes)); + fDecoder->setAllocator(allocator); + fDecoder->setRequireUnpremultipliedColors(kUnpremul_SkAlphaType == info.alphaType()); + + SkBitmap bm; + const SkImageDecoder::Result result = fDecoder->decode(&stream, &bm, info.colorType(), + SkImageDecoder::kDecodePixels_Mode); + if (SkImageDecoder::kFailure == result) { + return false; + } + + SkASSERT(info.colorType() == bm.info().colorType()); + + if (kIndex_8_SkColorType == info.colorType()) { + SkASSERT(ctableEntries); + + SkColorTable* ctable = bm.getColorTable(); + if (nullptr == ctable) { + return false; + } + const int count = ctable->count(); + memcpy(ctableEntries, ctable->readColors(), count * sizeof(SkPMColor)); + *ctableCount = count; + } + return true; + } + + bool onGetYUV8Planes(SkISize sizes[3], void* planes[3], size_t rowBytes[3], + SkYUVColorSpace* colorSpace) override { + SkMemoryStream stream(fData->data(), fData->size(), false); + return fDecoder->decodeYUV8Planes(&stream, sizes, planes, rowBytes, colorSpace); + } + +private: + typedef SkImageGenerator INHERITED; +}; SkImageGenerator* SkImageGenerator::NewFromEncodedImpl(SkData* data) { - return SkCodecImageGenerator::NewFromEncodedCodec(data); + SkMemoryStream stream(data->data(), data->size(), false); + SkImageDecoder* decoder = SkImageDecoder::Factory(&stream); + if (nullptr == decoder) { + return nullptr; + } + + SkBitmap bm; + stream.rewind(); + if (!decoder->decode(&stream, &bm, kUnknown_SkColorType, SkImageDecoder::kDecodeBounds_Mode)) { + delete decoder; + return nullptr; + } + + return new SkImageDecoderGenerator(bm.info(), decoder, data); } |