| Index: tests/RecordOptsTest.cpp | 
| diff --git a/tests/RecordOptsTest.cpp b/tests/RecordOptsTest.cpp | 
| index 4341b870bf4d46a6433461023bba92cabcdda579..4567a01409b7d5bdbfc6c8a6c778496428db3c27 100644 | 
| --- a/tests/RecordOptsTest.cpp | 
| +++ b/tests/RecordOptsTest.cpp | 
| @@ -16,6 +16,7 @@ | 
| #include "SkXfermode.h" | 
| #include "SkPictureRecorder.h" | 
| #include "SkPictureImageFilter.h" | 
| +#include "SkSurface.h" | 
|  | 
| static const int W = 1920, H = 1080; | 
|  | 
| @@ -343,3 +344,71 @@ DEF_TEST(RecordOpts_MergeSvgOpacityAndFilterLayers, r) { | 
| assert_type<SkRecords::Restore>(r, record, index + 3); | 
| index += 4; | 
| } | 
| + | 
| +static void do_draw(SkCanvas* canvas, SkColor color, bool doLayer) { | 
| +    canvas->drawColor(SK_ColorWHITE); | 
| + | 
| +    SkPaint p; | 
| +    p.setColor(color); | 
| + | 
| +    if (doLayer) { | 
| +        canvas->saveLayer(nullptr, nullptr); | 
| +        p.setXfermodeMode(SkXfermode::kSrc_Mode); | 
| +        canvas->drawPaint(p); | 
| +        canvas->restore(); | 
| +    } else { | 
| +        canvas->drawPaint(p); | 
| +    } | 
| +} | 
| + | 
| +static bool is_equal(SkSurface* a, SkSurface* b) { | 
| +    const SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1); | 
| +    SkPMColor ca, cb; | 
| +    a->readPixels(info, &ca, sizeof(SkPMColor), 0, 0); | 
| +    b->readPixels(info, &cb, sizeof(SkPMColor), 0, 0); | 
| +    return ca == cb; | 
| +} | 
| + | 
| +// Test drawing w/ and w/o a simple layer (no bounds or paint), so see that drawing ops | 
| +// that *should* draw the same in fact do. | 
| +// | 
| +// Perform this test twice : once directly, and once via a picture | 
| +// | 
| +static void do_savelayer_srcmode(skiatest::Reporter* r, SkColor color) { | 
| +    for (int doPicture = 0; doPicture <= 1; ++doPicture) { | 
| +        sk_sp<SkSurface> surf0 = SkSurface::MakeRasterN32Premul(10, 10); | 
| +        sk_sp<SkSurface> surf1 = SkSurface::MakeRasterN32Premul(10, 10); | 
| +        SkCanvas* c0 = surf0->getCanvas(); | 
| +        SkCanvas* c1 = surf1->getCanvas(); | 
| + | 
| +        SkPictureRecorder rec0, rec1; | 
| +        if (doPicture) { | 
| +            c0 = rec0.beginRecording(10, 10); | 
| +            c1 = rec1.beginRecording(10, 10); | 
| +        } | 
| + | 
| +        do_draw(c0, color, false); | 
| +        do_draw(c1, color, true); | 
| + | 
| +        if (doPicture) { | 
| +            surf0->getCanvas()->drawPicture(rec0.finishRecordingAsPicture()); | 
| +            surf1->getCanvas()->drawPicture(rec1.finishRecordingAsPicture()); | 
| +        } | 
| + | 
| +        // we replicate the assert so we can see which line is reported if there is a failure | 
| +        if (doPicture) { | 
| +            REPORTER_ASSERT(r, is_equal(surf0.get(), surf1.get())); | 
| +        } else { | 
| +            REPORTER_ASSERT(r, is_equal(surf0.get(), surf1.get())); | 
| +        } | 
| +    } | 
| +} | 
| + | 
| +DEF_TEST(savelayer_srcmode_opaque, r) { | 
| +    do_savelayer_srcmode(r, SK_ColorRED); | 
| +} | 
| + | 
| +DEF_TEST(savelayer_srcmode_alpha, r) { | 
| +    do_savelayer_srcmode(r, 0x80FF0000); | 
| +} | 
| + | 
|  |