Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7e92ac44 authored by Matt Sarett's avatar Matt Sarett Committed by android-build-merger
Browse files

Merge "Bug fix: use legacy SkCanvas regardless of color space tag" into oc-dev

am: 101dc265

Change-Id: Ia6d620a6f4df4e7fdbceae5a6f3bc524aae4358e
parents 4ae32399 101dc265
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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 {
+4 −2
Original line number Diff line number Diff line
@@ -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));

+10 −4
Original line number Diff line number Diff line
@@ -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);