diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/codec/SkCodecImageGenerator.cpp | 26 | ||||
-rw-r--r-- | src/codec/SkCodecImageGenerator.h | 2 | ||||
-rw-r--r-- | src/core/SkImageGenerator.cpp | 18 | ||||
-rw-r--r-- | src/core/SkPictureImageGenerator.cpp | 32 | ||||
-rw-r--r-- | src/core/SkPictureImageGenerator.h | 2 | ||||
-rw-r--r-- | src/ports/SkImageGeneratorCG.cpp | 2 | ||||
-rw-r--r-- | src/ports/SkImageGeneratorCG.h | 4 | ||||
-rw-r--r-- | src/ports/SkImageGeneratorWIC.cpp | 2 | ||||
-rw-r--r-- | src/ports/SkImageGeneratorWIC.h | 4 |
9 files changed, 42 insertions, 50 deletions
diff --git a/src/codec/SkCodecImageGenerator.cpp b/src/codec/SkCodecImageGenerator.cpp index d778bc7ea1..bf794d60d3 100644 --- a/src/codec/SkCodecImageGenerator.cpp +++ b/src/codec/SkCodecImageGenerator.cpp @@ -17,16 +17,21 @@ std::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(codec, data)); } -static SkImageInfo make_premul(const SkImageInfo& info) { +static SkImageInfo adjust_info(const SkImageInfo& info) { + SkImageInfo newInfo = info; if (kUnpremul_SkAlphaType == info.alphaType()) { - return info.makeAlphaType(kPremul_SkAlphaType); + newInfo = newInfo.makeAlphaType(kPremul_SkAlphaType); } - return info; + if (kIndex_8_SkColorType == info.colorType()) { + newInfo = newInfo.makeColorType(kN32_SkColorType); + } + + return newInfo; } SkCodecImageGenerator::SkCodecImageGenerator(SkCodec* codec, sk_sp<SkData> data) - : INHERITED(make_premul(codec->getInfo())) + : INHERITED(adjust_info(codec->getInfo())) , fCodec(codec) , fData(std::move(data)) {} @@ -36,20 +41,11 @@ SkData* SkCodecImageGenerator::onRefEncodedData() { } bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, - SkPMColor ctable[], int* ctableCount) { - Options opts; - opts.fColorTable = ctable; - opts.fColorTableCount = ctableCount; - opts.fBehavior = SkTransferFunctionBehavior::kRespect; - return this->onGetPixels(info, pixels, rowBytes, opts); -} - -bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options& opts) { SkCodec::Options codecOpts; codecOpts.fPremulBehavior = opts.fBehavior; - SkCodec::Result result = fCodec->getPixels(info, pixels, rowBytes, &codecOpts, opts.fColorTable, - opts.fColorTableCount); + SkCodec::Result result = fCodec->getPixels(info, pixels, rowBytes, &codecOpts, nullptr, + nullptr); switch (result) { case SkCodec::kSuccess: case SkCodec::kIncompleteInput: diff --git a/src/codec/SkCodecImageGenerator.h b/src/codec/SkCodecImageGenerator.h index 832a7f3bed..4d0c0780a6 100644 --- a/src/codec/SkCodecImageGenerator.h +++ b/src/codec/SkCodecImageGenerator.h @@ -23,8 +23,6 @@ public: protected: SkData* onRefEncodedData() override; - bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor ctable[], - int* ctableCount) override; bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options& opts) override; diff --git a/src/core/SkImageGenerator.cpp b/src/core/SkImageGenerator.cpp index 35eaf8900e..d0d8f97c74 100644 --- a/src/core/SkImageGenerator.cpp +++ b/src/core/SkImageGenerator.cpp @@ -14,6 +14,7 @@ SkImageGenerator::SkImageGenerator(const SkImageInfo& info, uint32_t uniqueID) , fUniqueID(kNeedNewImageUniqueID == uniqueID ? SkNextID::ImageID() : uniqueID) {} +#ifdef SK_SUPPORT_LEGACY_IMGEN_API bool SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor ctable[], int* ctableCount) { if (kUnknown_SkColorType == info.colorType()) { @@ -44,9 +45,20 @@ bool SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t r } return success; } +#endif bool SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options* opts) { + if (kUnknown_SkColorType == info.colorType() || kIndex_8_SkColorType == info.colorType()) { + return false; + } + if (nullptr == pixels) { + return false; + } + if (rowBytes < info.minRowBytes()) { + return false; + } + Options defaultOpts; if (!opts) { opts = &defaultOpts; @@ -55,11 +67,7 @@ bool SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t r } bool SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes) { - SkASSERT(kIndex_8_SkColorType != info.colorType()); - if (kIndex_8_SkColorType == info.colorType()) { - return false; - } - return this->getPixels(info, pixels, rowBytes, nullptr, nullptr); + return this->getPixels(info, pixels, rowBytes, nullptr); } bool SkImageGenerator::queryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const { diff --git a/src/core/SkPictureImageGenerator.cpp b/src/core/SkPictureImageGenerator.cpp index 34046e9ae4..86e98d828b 100644 --- a/src/core/SkPictureImageGenerator.cpp +++ b/src/core/SkPictureImageGenerator.cpp @@ -59,33 +59,25 @@ SkPictureImageGenerator::SkPictureImageGenerator(const SkImageInfo& info, sk_sp< } bool SkPictureImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, - SkPMColor ctable[], int* ctableCount) { - // Rely on SkCanvas factory to know what configs can and cannot be drawn into. - auto canvas = SkCanvas::MakeRasterDirect(info, pixels, rowBytes); - if (!canvas) { - return false; - } - canvas->clear(0); - canvas->drawPicture(fPicture, &fMatrix, fPaint.getMaybeNull()); - return true; -} - -bool SkPictureImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options& opts) { - // No need to use the xform canvas if we want fully color correct behavior or if we do not - // have a destination color space. - if (SkTransferFunctionBehavior::kRespect == opts.fBehavior || !info.colorSpace()) { - return this->onGetPixels(info, pixels, rowBytes, opts.fColorTable, opts.fColorTableCount); - } + bool useXformCanvas = + SkTransferFunctionBehavior::kIgnore == opts.fBehavior && info.colorSpace(); - auto canvas = SkCanvas::MakeRasterDirect(info.makeColorSpace(nullptr), pixels, rowBytes); + SkImageInfo canvasInfo = useXformCanvas ? info.makeColorSpace(nullptr) : info; + std::unique_ptr<SkCanvas> canvas = SkCanvas::MakeRasterDirect(canvasInfo, pixels, rowBytes); if (!canvas) { return false; } canvas->clear(0); - auto xformCanvas = SkCreateColorSpaceXformCanvas(canvas.get(), info.refColorSpace()); - xformCanvas->drawPicture(fPicture, &fMatrix, fPaint.getMaybeNull()); + SkCanvas* canvasPtr = canvas.get(); + std::unique_ptr<SkCanvas> xformCanvas; + if (useXformCanvas) { + xformCanvas = SkCreateColorSpaceXformCanvas(canvas.get(), info.refColorSpace()); + canvasPtr = xformCanvas.get(); + } + + canvasPtr->drawPicture(fPicture, &fMatrix, fPaint.getMaybeNull()); return true; } diff --git a/src/core/SkPictureImageGenerator.h b/src/core/SkPictureImageGenerator.h index 95eeb88236..6dba29c172 100644 --- a/src/core/SkPictureImageGenerator.h +++ b/src/core/SkPictureImageGenerator.h @@ -17,8 +17,6 @@ public: sk_sp<SkColorSpace>); protected: - bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor ctable[], - int* ctableCount) override; bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options& opts) override; diff --git a/src/ports/SkImageGeneratorCG.cpp b/src/ports/SkImageGeneratorCG.cpp index 7aa1f28cde..a2fe6a40ef 100644 --- a/src/ports/SkImageGeneratorCG.cpp +++ b/src/ports/SkImageGeneratorCG.cpp @@ -80,7 +80,7 @@ SkData* SkImageGeneratorCG::onRefEncodedData() { } bool SkImageGeneratorCG::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, - SkPMColor ctable[], int* ctableCount) { + const Options&) { if (kN32_SkColorType != info.colorType()) { // FIXME: Support other colorTypes. return false; diff --git a/src/ports/SkImageGeneratorCG.h b/src/ports/SkImageGeneratorCG.h index 2c20c5c25b..65300a6de2 100644 --- a/src/ports/SkImageGeneratorCG.h +++ b/src/ports/SkImageGeneratorCG.h @@ -24,8 +24,8 @@ public: protected: SkData* onRefEncodedData() override; - bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor ctable[], - int* ctableCount) override; + bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options&) + override; private: /* diff --git a/src/ports/SkImageGeneratorWIC.cpp b/src/ports/SkImageGeneratorWIC.cpp index 358d993e16..e69b2ee2e9 100644 --- a/src/ports/SkImageGeneratorWIC.cpp +++ b/src/ports/SkImageGeneratorWIC.cpp @@ -137,7 +137,7 @@ SkData* SkImageGeneratorWIC::onRefEncodedData() { } bool SkImageGeneratorWIC::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, - SkPMColor ctable[], int* ctableCount) { + const Options&) { if (kN32_SkColorType != info.colorType()) { return false; } diff --git a/src/ports/SkImageGeneratorWIC.h b/src/ports/SkImageGeneratorWIC.h index 0a5c9d32ed..4770ee2111 100644 --- a/src/ports/SkImageGeneratorWIC.h +++ b/src/ports/SkImageGeneratorWIC.h @@ -41,8 +41,8 @@ public: protected: SkData* onRefEncodedData() override; - bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor ctable[], - int* ctableCount) override; + bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options&) + override; private: /* |