/* * Copyright 2020 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "gm/gm.h" #include "include/core/SkBitmap.h" #include "include/core/SkCanvas.h" #include "include/core/SkColorSpace.h" #include "include/core/SkImage.h" // This GM should draw two yellow boxes; the bug drew one in cyan. DEF_SIMPLE_GM(skbug_9819, c, 256, 256) { auto info = SkImageInfo::Make(1,1, kUnknown_SkColorType, kPremul_SkAlphaType); SkBitmap rgba, bgra; rgba.allocPixels(info.makeColorType(kRGBA_8888_SkColorType)); bgra.allocPixels(info.makeColorType(kBGRA_8888_SkColorType)); SkColor yellow = 0xffffff00; rgba.eraseColor(yellow); bgra.eraseColor(yellow); c->save(); c->scale(128,128); c->drawImage(rgba.asImage(), 0,0); c->drawImage(bgra.asImage(), 0,1); c->restore(); auto grade = [&](int x, int y){ SkBitmap bm; bm.allocPixels(SkImageInfo::Make(1,1, kGray_8_SkColorType, kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB())); if (!c->readPixels(bm, x,y)) { // Picture-backed canvases, that sort of thing. Just assume they're good. MarkGMGood(c, x+128, y); return; } // We test only luma so that grayscale destinations are also correctly graded: // - yellow (good) is around 237 // - cyan (bad) is around 202 uint8_t gray = *bm.getAddr8(0,0); (abs(gray - 237) > 2 ? MarkGMBad : MarkGMGood)(c, x+128,y); }; grade(64, 64); grade(64, 192); }