Merge "Bug fix: use legacy SkCanvas regardless of color space tag" into oc-dev
am: 101dc265a8
Change-Id: Ia6d620a6f4df4e7fdbceae5a6f3bc524aae4358e
This commit is contained in:
@@ -616,7 +616,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding
|
||||
paint.setBlendMode(SkBlendMode::kSrc);
|
||||
paint.setFilterQuality(kLow_SkFilterQuality); // bilinear filtering
|
||||
|
||||
SkCanvas canvas(outputBitmap);
|
||||
SkCanvas canvas(outputBitmap, SkCanvas::ColorBehavior::kLegacy);
|
||||
canvas.scale(sx, sy);
|
||||
canvas.drawBitmap(decodingBitmap, 0.0f, 0.0f, &paint);
|
||||
} else {
|
||||
|
||||
@@ -60,7 +60,8 @@ SkiaCanvas::SkiaCanvas(SkCanvas* canvas, XformToSRGB xformToSRGB)
|
||||
|
||||
SkiaCanvas::SkiaCanvas(const SkBitmap& bitmap) {
|
||||
sk_sp<SkColorSpace> cs = bitmap.refColorSpace();
|
||||
mCanvasOwned = std::unique_ptr<SkCanvas>(new SkCanvas(bitmap));
|
||||
mCanvasOwned =
|
||||
std::unique_ptr<SkCanvas>(new SkCanvas(bitmap, SkCanvas::ColorBehavior::kLegacy));
|
||||
mCanvasWrapper = SkCreateColorSpaceXformCanvas(mCanvasOwned.get(),
|
||||
cs == nullptr ? SkColorSpace::MakeSRGB() : std::move(cs));
|
||||
mCanvas = mCanvasWrapper.get();
|
||||
@@ -83,7 +84,8 @@ void SkiaCanvas::reset(SkCanvas* skiaCanvas) {
|
||||
|
||||
void SkiaCanvas::setBitmap(const SkBitmap& bitmap) {
|
||||
sk_sp<SkColorSpace> cs = bitmap.refColorSpace();
|
||||
std::unique_ptr<SkCanvas> newCanvas = std::unique_ptr<SkCanvas>(new SkCanvas(bitmap));
|
||||
std::unique_ptr<SkCanvas> newCanvas =
|
||||
std::unique_ptr<SkCanvas>(new SkCanvas(bitmap, SkCanvas::ColorBehavior::kLegacy));
|
||||
std::unique_ptr<SkCanvas> newCanvasWrapper = SkCreateColorSpaceXformCanvas(newCanvas.get(),
|
||||
cs == nullptr ? SkColorSpace::MakeSRGB() : std::move(cs));
|
||||
|
||||
|
||||
@@ -104,14 +104,20 @@ TEST(SkiaCanvas, colorSpaceXform) {
|
||||
skBitmap.lockPixels();
|
||||
ASSERT_EQ(0xFF0000FF, *skBitmap.getAddr32(0, 0));
|
||||
|
||||
// Create a software canvas with an Adobe color space.
|
||||
SkiaCanvas adobeSkCanvas(adobeSkBitmap);
|
||||
adobeSkCanvas.drawBitmap(*bitmap, 0, 0, nullptr);
|
||||
// The result should be less than fully red, since we convert to Adobe RGB at draw time.
|
||||
ASSERT_EQ(0xFF0000DC, *adobeSkBitmap.getAddr32(0, 0));
|
||||
|
||||
// Now try in kDefer mode. This is a little strange given that, in practice, all software
|
||||
// canvases are kImmediate.
|
||||
SkCanvas skCanvas(skBitmap);
|
||||
SkiaCanvas deferCanvas(&skCanvas, Canvas::XformToSRGB::kDefer);
|
||||
deferCanvas.drawBitmap(*adobeBitmap, 0, 0, nullptr);
|
||||
// The result should be as initialized, since we deferred the conversion to sRGB.
|
||||
// The result should be as before, since we deferred the conversion to sRGB.
|
||||
skBitmap.lockPixels();
|
||||
ASSERT_EQ(0xFF0000F0, *skBitmap.getAddr32(0, 0));
|
||||
ASSERT_EQ(0xFF0000DC, *skBitmap.getAddr32(0, 0));
|
||||
|
||||
// Test picture recording. We will kDefer the xform at recording time, but handle it when
|
||||
// we playback to the software canvas.
|
||||
@@ -121,9 +127,9 @@ TEST(SkiaCanvas, colorSpaceXform) {
|
||||
picCanvas.drawBitmap(*adobeBitmap, 0, 0, nullptr);
|
||||
sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
|
||||
|
||||
// Playback to a deferred canvas. The result should be as initialized.
|
||||
// Playback to a deferred canvas. The result should be as before.
|
||||
deferCanvas.asSkCanvas()->drawPicture(picture);
|
||||
ASSERT_EQ(0xFF0000F0, *skBitmap.getAddr32(0, 0));
|
||||
ASSERT_EQ(0xFF0000DC, *skBitmap.getAddr32(0, 0));
|
||||
|
||||
// Playback to an immediate canvas. The result should be fully red.
|
||||
canvas.asSkCanvas()->drawPicture(picture);
|
||||
|
||||
Reference in New Issue
Block a user