Index: tests/PictureTest.cpp |
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp |
index 95ceb051146b859c94076f1e191f5ab74bc7d161..0e5ab243621da18d559462a76f8e634719a2b292 100644 |
--- a/tests/PictureTest.cpp |
+++ b/tests/PictureTest.cpp |
@@ -1610,3 +1610,61 @@ DEF_TEST(Canvas_EmptyBitmap, r) { |
test_draw_bitmaps(&canvas); |
} |
+ |
+DEF_TEST(DontOptimizeSaveLayerDrawDrawRestore, reporter) { |
+ // This test is from crbug.com/344987. |
+ // The commands are: |
+ // saveLayer with paint that modifies alpha |
+ // drawBitmapRectToRect |
+ // drawBitmapRectToRect |
+ // restore |
+ // The bug was that this structure was modified so that: |
+ // - The saveLayer and restore were eliminated |
+ // - The alpha was only applied to the first drawBitmapRectToRect |
+ |
+ // This test draws blue and red squares inside a 50% transparent |
+ // layer. Both colours should show up muted. |
+ // When the bug is present, the red square (the second bitmap) |
+ // shows upwith full opacity. |
+ |
+ SkImageInfo onePixelII = SkImageInfo::Make(1,1,kBGRA_8888_SkColorType,kPremul_SkAlphaType); |
robertphillips
2014/07/30 19:03:49
blueBM? - Skia doesn't use '_' in variable names.
dneto
2014/07/30 19:26:20
Done.
|
+ SkBitmap bm_blue; |
+ make_bm(&bm_blue,100,100,SkColorSetARGB(255,0,0,255),true); |
robertphillips
2014/07/30 19:03:49
redBM?
dneto
2014/07/30 19:26:20
Done.
|
+ SkBitmap bm_red; |
+ make_bm(&bm_red,100,100,SkColorSetARGB(255,255,0,0),true); |
robertphillips
2014/07/30 19:03:50
semiTransparent?
dneto
2014/07/30 19:26:20
Done.
|
+ SkPaint semi_transparent; |
+ semi_transparent.setAlpha(0x80); |
+ |
+ SkPictureRecorder recorder; |
+ SkCanvas* canvas = recorder.beginRecording(100,100); |
+ canvas->drawARGB(0,0,0,0); |
+ |
+ canvas->saveLayer(0, &semi_transparent); |
+ canvas->drawBitmap(bm_blue, 25, 25); |
+ canvas->drawBitmap(bm_red, 50, 50); |
+ canvas->restore(); |
+ |
+ SkPicture* picture = recorder.endRecording(); |
mtklein
2014/07/30 18:47:26
As written this leaks. Best to clean it up!
SkAu
dneto
2014/07/30 19:26:20
Done.
|
+ |
+ // Now replay the picture back on another canvas |
+ // and check a couple of its pixels. |
robertphillips
2014/07/30 19:03:50
replayBM?
dneto
2014/07/30 19:26:20
Done.
|
+ SkBitmap bm_replay; |
+ make_bm(&bm_replay,100,100,SK_ColorBLACK,false); |
+ SkCanvas replayCanvas(bm_replay); |
+ picture->draw(&replayCanvas); |
+ replayCanvas.flush(); |
+ |
+ SkColor darkBlue = SkColorSetARGB(0xff,0,0,0x80); |
+ SkColor darkRed = SkColorSetARGB(0xff,0x80,0,0); |
+ |
+ uint32_t blueDot = 0xdeadbeef; |
+ uint32_t redDot = 0xdeadbeef; |
+ |
+ REPORTER_ASSERT(reporter, replayCanvas.readPixels(onePixelII,&blueDot,4,30,30)); |
mtklein
2014/07/30 18:47:26
This is all fine, but I think you can replace ever
dneto
2014/07/30 19:26:20
Done.
|
+ REPORTER_ASSERT(reporter, replayCanvas.readPixels(onePixelII,&redDot,4,55,55)); |
+ |
+ REPORTER_ASSERT(reporter, blueDot == darkBlue ); |
+ // With the bug present, we would get a fully opaque red intead of |
+ // a dark red. |
+ REPORTER_ASSERT(reporter, redDot == darkRed ); |
+} |