Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Unified Diff: dm/DMSrcSink.cpp

Issue 1718273004: Add an SkImageGeneratorCG (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 80 chars Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « dm/DMSrcSink.h ('k') | gyp/ports.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dm/DMSrcSink.cpp
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 9e45ce9b692ca25726d791e497567fe77dad41b9..84af854deae65c8597cd30839d98034795df5978 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -14,6 +14,7 @@
#include "SkDocument.h"
#include "SkError.h"
#include "SkImageGenerator.h"
+#include "SkImageGeneratorCG.h"
#include "SkMallocPixelRef.h"
#include "SkMultiPictureDraw.h"
#include "SkNullCanvas.h"
@@ -263,15 +264,7 @@ CodecSrc::CodecSrc(Path path, Mode mode, DstColorType dstColorType, SkAlphaType
{}
bool CodecSrc::veto(SinkFlags flags) const {
- // Test CodecImageGenerator on 8888, 565, and gpu
- if (kGen_Mode == fMode) {
- // For image generator, we want to test kDirect approaches for kRaster and kGPU,
- // while skipping everything else.
- return (flags.type != SinkFlags::kRaster && flags.type != SinkFlags::kGPU) ||
- flags.approach != SinkFlags::kDirect;
- }
-
- // Test all other modes to direct raster backends (8888 and 565).
+ // Test to direct raster backends (8888 and 565).
return flags.type != SinkFlags::kRaster || flags.approach != SinkFlags::kDirect;
}
@@ -333,42 +326,12 @@ bool get_decode_info(SkImageInfo* decodeInfo, SkColorType canvasColorType,
return true;
}
-Error test_gen(SkCanvas* canvas, SkData* data) {
- SkAutoTDelete<SkImageGenerator> gen = SkCodecImageGenerator::NewFromEncodedCodec(data);
- if (!gen) {
- return "Could not create image generator.";
- }
-
- // FIXME: The gpu backend does not draw kGray sources correctly. (skbug.com/4822)
- // Currently, we will avoid creating a CodecSrc for this case (see DM.cpp).
- SkASSERT(kGray_8_SkColorType != gen->getInfo().colorType());
-
- if (kOpaque_SkAlphaType != gen->getInfo().alphaType() &&
- kRGB_565_SkColorType == canvas->imageInfo().colorType()) {
- return Error::Nonfatal("Skip testing non-opaque images to 565.");
- }
-
- SkAutoTDelete<SkImage> image(SkImage::NewFromGenerator(gen.detach(), nullptr));
- if (!image) {
- return "Could not create image from codec image generator.";
- }
-
- canvas->drawImage(image, 0, 0);
- return "";
-}
-
Error CodecSrc::draw(SkCanvas* canvas) const {
SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str()));
if (!encoded) {
return SkStringPrintf("Couldn't read %s.", fPath.c_str());
}
- // The CodecImageGenerator test does not share much code with the other tests,
- // so we will handle it in its own function.
- if (kGen_Mode == fMode) {
- return test_gen(canvas, encoded);
- }
-
SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
if (nullptr == codec.get()) {
return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str());
@@ -802,6 +765,118 @@ Name AndroidCodecSrc::name() const {
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+ImageGenSrc::ImageGenSrc(Path path, Mode mode, SkAlphaType alphaType, bool isGpu)
+ : fPath(path)
+ , fMode(mode)
+ , fDstAlphaType(alphaType)
+ , fIsGpu(isGpu)
+ , fRunSerially(serial_from_path_name(path))
+{}
+
+bool ImageGenSrc::veto(SinkFlags flags) const {
+ if (fIsGpu) {
+ return flags.type != SinkFlags::kGPU || flags.approach != SinkFlags::kDirect;
+ }
+
+ return flags.type != SinkFlags::kRaster || flags.approach != SinkFlags::kDirect;
+}
+
+Error ImageGenSrc::draw(SkCanvas* canvas) const {
+ if (kRGB_565_SkColorType == canvas->imageInfo().colorType()) {
+ return Error::Nonfatal("Uninteresting to test image generator to 565.");
+ }
+
+ SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str()));
+ if (!encoded) {
+ return SkStringPrintf("Couldn't read %s.", fPath.c_str());
+ }
+
+ SkAutoTDelete<SkImageGenerator> gen(nullptr);
+ switch (fMode) {
+ case kCodec_Mode:
+ gen.reset(SkCodecImageGenerator::NewFromEncodedCodec(encoded));
+ if (!gen) {
+ return "Could not create codec image generator.";
+ }
+ break;
+#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
+ case kPlatform_Mode:
+ gen.reset(SkImageGeneratorCG::NewFromEncodedCG(encoded));
+ if (!gen) {
+ return "Could not create CG image generator.";
+ }
+ break;
+#endif
+ default:
+ SkASSERT(false);
+ return "Invalid image generator mode";
+ }
+
+ // Test deferred decoding path on GPU
+ if (fIsGpu) {
+ // FIXME: The gpu backend does not draw kGray sources correctly. (skbug.com/4822)
+ // We have disabled these tests in DM.cpp.
+ SkASSERT(kGray_8_SkColorType != gen->getInfo().colorType());
+
+ SkAutoTDelete<SkImage> image(SkImage::NewFromGenerator(gen.detach(), nullptr));
+ if (!image) {
+ return "Could not create image from codec image generator.";
+ }
+ canvas->drawImage(image, 0, 0);
+ return "";
+ }
+
+ // Test various color and alpha types on CPU
+ SkImageInfo decodeInfo = gen->getInfo().makeAlphaType(fDstAlphaType);
+
+ if (kGray_8_SkColorType == decodeInfo.colorType() &&
+ kOpaque_SkAlphaType != decodeInfo.alphaType()) {
+ return Error::Nonfatal("Avoid requesting non-opaque kGray8 decodes.");
+ }
+
+ SkAutoTUnref<SkColorTable> colorTable(nullptr);
+ SkPMColor* colorPtr = nullptr;
+ int* colorCountPtr = nullptr;
+ int maxColors = 256;
+ if (kIndex_8_SkColorType == decodeInfo.colorType()) {
+ SkPMColor colors[256];
+ colorTable.reset(new SkColorTable(colors, maxColors));
+ colorPtr = const_cast<SkPMColor*>(colorTable->readColors());
+ colorCountPtr = &maxColors;
+ }
+
+ SkBitmap bitmap;
+ if (!bitmap.tryAllocPixels(decodeInfo, nullptr, colorTable.get())) {
+ return SkStringPrintf("Image(%s) is too large (%d x %d)", fPath.c_str(),
+ decodeInfo.width(), decodeInfo.height());
+ }
+
+ if (!gen->getPixels(decodeInfo, bitmap.getPixels(), bitmap.rowBytes(), colorPtr,
+ colorCountPtr))
+ {
+ return SkStringPrintf("Image generator could not getPixels() for %s\n", fPath.c_str());
+ }
+
+ premultiply_if_necessary(bitmap);
+ canvas->drawBitmap(bitmap, 0, 0);
+ return "";
+}
+
+SkISize ImageGenSrc::size() const {
+ SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str()));
+ SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
+ if (nullptr == codec) {
+ return SkISize::Make(0, 0);
+ }
+ return codec->getInfo().dimensions();
+}
+
+Name ImageGenSrc::name() const {
+ return SkOSPath::Basename(fPath.c_str());
+}
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
static const SkRect kSKPViewport = {0,0, 1000,1000};
SKPSrc::SKPSrc(Path path) : fPath(path) {}
« no previous file with comments | « dm/DMSrcSink.h ('k') | gyp/ports.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698