1 /*
2  * Copyright 2020 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "gm/gm.h"
9 #include "include/core/SkBitmap.h"
10 #include "include/core/SkCanvas.h"
11 
12 // This GM should draw two yellow boxes; the bug drew one in cyan.
13 
14 DEF_SIMPLE_GM(skbug_9819, c, 256, 256) {
15     auto info = SkImageInfo::Make(1,1, kUnknown_SkColorType, kPremul_SkAlphaType);
16     SkBitmap rgba,
17              bgra;
18     rgba.allocPixels(info.makeColorType(kRGBA_8888_SkColorType));
19     bgra.allocPixels(info.makeColorType(kBGRA_8888_SkColorType));
20 
21     SkColor yellow = 0xffffff00;
22     rgba.eraseColor(yellow);
23     bgra.eraseColor(yellow);
24 
25     c->save();
26         c->scale(128,128);
27         c->drawBitmap(rgba, 0,0);
28         c->drawBitmap(bgra, 0,1);
29     c->restore();
30 
__anon7cff8fbf0102(int x, int y)31     auto grade = [&](int x, int y){
32         SkBitmap bm;
33         bm.allocPixels(SkImageInfo::Make(1,1,
34                                          kGray_8_SkColorType,
35                                          kUnpremul_SkAlphaType,
36                                          SkColorSpace::MakeSRGB()));
37         if (!c->readPixels(bm, x,y)) {
38             // Picture-backed canvases, that sort of thing.  Just assume they're good.
39             MarkGMGood(c, x+128, y);
40             return;
41         }
42 
43         // We test only luma so that grayscale destinations are also correctly graded:
44         //    - yellow (good) is around 237
45         //    - cyan   (bad)  is around 202
46         uint8_t gray = *bm.getAddr8(0,0);
47         (abs(gray - 237) > 2 ? MarkGMBad
48                              : MarkGMGood)(c, x+128,y);
49     };
50 
51     grade(64,  64);
52     grade(64, 192);
53 }
54