12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- /*
- * Copyright 2018 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/SkBlendMode.h"
- #include "include/core/SkCanvas.h"
- #include "include/core/SkColor.h"
- #include "include/core/SkColorSpace.h"
- #include "include/core/SkImageInfo.h"
- #include "include/core/SkPaint.h"
- #include <string.h>
- DEF_SIMPLE_GM(unpremul, canvas, 200, 200) {
- const SkColor color = 0xbf400000;
- auto grade = [&](int x, int y){
- SkBitmap bm;
- bm.allocPixels(SkImageInfo::Make(1,1,
- kBGRA_8888_SkColorType,
- kUnpremul_SkAlphaType,
- SkColorSpace::MakeSRGB()));
- if (!canvas->readPixels(bm, x,y)) {
- // Picture-backed canvases, that sort of thing. Just assume they're good.
- MarkGMGood(canvas, 140,40);
- return;
- }
- SkColor pixel;
- memcpy(&pixel, bm.getAddr(0,0), sizeof(pixel));
- auto close = [](int x, int y) {
- return x-y < 2
- && y-x < 2;
- };
- if (close(SkColorGetR(pixel), SkColorGetR(color)) &&
- close(SkColorGetG(pixel), SkColorGetG(color)) &&
- close(SkColorGetB(pixel), SkColorGetB(color)) &&
- close(SkColorGetA(pixel), SkColorGetA(color))) {
- MarkGMGood(canvas, 140,40);
- } else {
- MarkGMBad(canvas, 140,40);
- }
- };
- {
- SkPaint paint;
- paint.setBlendMode(SkBlendMode::kSrc);
- paint.setColor(color);
- canvas->drawRect({0,0,100,100}, paint);
- grade(50,50);
- }
- canvas->translate(0,100);
- {
- SkPaint paint;
- paint.setBlendMode(SkBlendMode::kSrc);
- SkBitmap bm;
- bm.allocPixels(SkImageInfo::Make(100,100, kRGBA_8888_SkColorType, kUnpremul_SkAlphaType));
- bm.eraseColor(color);
- canvas->drawBitmap(bm, 0,0, &paint);
- grade(50,150);
- }
- }
|