Avoid extra bitmap copies in SkColorSpaceXformCanvas
Before:
ColorCanvasDrawBitmap_sRGB_to_sRGB 5.09us
ColorCanvasDrawBitmap_AdobeRGB_to_sRGB 50.7us
After:
ColorCanvasDrawBitmap_sRGB_to_sRGB 2.43us
ColorCanvasDrawBitmap_AdobeRGB_to_sRGB 37.1us
BUG=skia:6456
Change-Id: Ie382936c36fd347b59485882cf8f27f315a5d35f
Change-Id: Ie382936c36fd347b59485882cf8f27f315a5d35f
Reviewed-on: https://skia-review.googlesource.com/11040
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Matt Sarett <msarett@google.com>
diff --git a/src/core/SkColorSpaceXformer.cpp b/src/core/SkColorSpaceXformer.cpp
index e983756..4d93fae 100644
--- a/src/core/SkColorSpaceXformer.cpp
+++ b/src/core/SkColorSpaceXformer.cpp
@@ -11,6 +11,7 @@
#include "SkDrawLooper.h"
#include "SkGradientShader.h"
#include "SkImage_Base.h"
+#include "SkImagePriv.h"
#include "SkMakeUnique.h"
std::unique_ptr<SkColorSpaceXformer> SkColorSpaceXformer::Make(sk_sp<SkColorSpace> dst) {
@@ -30,6 +31,18 @@
return as_IB(src)->makeColorSpace(fDst);
}
+sk_sp<SkImage> SkColorSpaceXformer::apply(const SkBitmap& src) {
+ sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(src, kNever_SkCopyPixelsMode);
+ if (!image) {
+ return nullptr;
+ }
+
+ sk_sp<SkImage> xformed = as_IB(image)->makeColorSpace(fDst);
+ // We want to be sure we don't let the kNever_SkCopyPixelsMode image escape this stack frame.
+ SkASSERT(xformed != image);
+ return xformed;
+}
+
void SkColorSpaceXformer::apply(SkColor* xformed, const SkColor* srgb, int n) {
SkAssertResult(fFromSRGB->apply(SkColorSpaceXform::kBGRA_8888_ColorFormat, xformed,
SkColorSpaceXform::kBGRA_8888_ColorFormat, srgb,