17112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 27112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com/* 37112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com * Copyright 2011 Google Inc. 47112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com * 57112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com * Use of this source code is governed by a BSD-style license that can be 67112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com * found in the LICENSE file. 77112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com */ 87112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com#include "gm.h" 97112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com#include "SkCanvas.h" 107112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com#include "SkGradientShader.h" 117112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com#include "SkGraphics.h" 127112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com#include "SkPath.h" 137112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com#include "SkRegion.h" 147112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com#include "SkShader.h" 157112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 167112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comstatic void make_bitmap(SkBitmap* bitmap) { 17eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com bitmap->allocN32Pixels(64, 64); 187112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 193bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org SkCanvas canvas(*bitmap); 207112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 217112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com canvas.drawColor(SK_ColorRED); 227112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com SkPaint paint; 237112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com paint.setAntiAlias(true); 247112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com const SkPoint pts[] = { { 0, 0 }, { 64, 64 } }; 257112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com const SkColor colors[] = { SK_ColorWHITE, SK_ColorBLUE }; 267112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com paint.setShader(SkGradientShader::CreateLinear(pts, colors, NULL, 2, 277112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com SkShader::kClamp_TileMode))->unref(); 287112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com canvas.drawCircle(32, 32, 32, paint); 297112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com} 307112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 317112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comclass DrawBitmapRect2 : public skiagm::GM { 327112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com bool fUseIRect; 337112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.compublic: 347112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com DrawBitmapRect2(bool useIRect) : fUseIRect(useIRect) { 357112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com } 367112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 377112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comprotected: 3836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 397112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com SkString str; 407112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com str.printf("bitmaprect_%s", fUseIRect ? "i" : "s"); 417112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com return str; 427112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com } 437112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 4436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { 457112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com return SkISize::Make(640, 480); 467112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com } 477112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 4836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 497112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com canvas->drawColor(0xFFCCCCCC); 507112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 517112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com const SkIRect src[] = { 527112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com { 0, 0, 32, 32 }, 537112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com { 0, 0, 80, 80 }, 547112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com { 32, 32, 96, 96 }, 557112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com { -32, -32, 32, 32, } 567112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com }; 577112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 587112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com SkPaint paint; 597112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com paint.setStyle(SkPaint::kStroke_Style); 607112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 617112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com SkBitmap bitmap; 627112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com make_bitmap(&bitmap); 637112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 647112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com SkRect dstR = { 0, 200, 128, 380 }; 657112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 667112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com canvas->translate(16, 40); 677112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(src); i++) { 687112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com SkRect srcR; 697112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com srcR.set(src[i]); 707112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 717112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com canvas->drawBitmap(bitmap, 0, 0, &paint); 7221a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com if (!fUseIRect) { 737112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com canvas->drawBitmapRectToRect(bitmap, &srcR, dstR, &paint); 747112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com } else { 757112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com canvas->drawBitmapRect(bitmap, &src[i], dstR, &paint); 767112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com } 777112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 787112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com canvas->drawRect(dstR, paint); 797112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com canvas->drawRect(srcR, paint); 807112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 817112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com canvas->translate(160, 0); 827112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com } 837112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com } 847112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 857112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comprivate: 867112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com typedef skiagm::GM INHERITED; 877112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com}; 887112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 897112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com////////////////////////////////////////////////////////////////////////////// 9021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 91776c0cd9550f16019da6773370dcce70db0c6a09reedstatic void make_3x3_bitmap(SkBitmap* bitmap) { 92776c0cd9550f16019da6773370dcce70db0c6a09reed const int xSize = 3; 93776c0cd9550f16019da6773370dcce70db0c6a09reed const int ySize = 3; 9421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 95776c0cd9550f16019da6773370dcce70db0c6a09reed const SkColor textureData[xSize][ySize] = { 9693f03324189f211db95c312b3cb08b435cc5ac34robertphillips@google.com { SK_ColorRED, SK_ColorWHITE, SK_ColorBLUE }, 9793f03324189f211db95c312b3cb08b435cc5ac34robertphillips@google.com { SK_ColorGREEN, SK_ColorBLACK, SK_ColorCYAN }, 9893f03324189f211db95c312b3cb08b435cc5ac34robertphillips@google.com { SK_ColorYELLOW, SK_ColorGRAY, SK_ColorMAGENTA } 9921a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com }; 10021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 101776c0cd9550f16019da6773370dcce70db0c6a09reed bitmap->allocN32Pixels(xSize, ySize, true); 102776c0cd9550f16019da6773370dcce70db0c6a09reed SkCanvas canvas(*bitmap); 103776c0cd9550f16019da6773370dcce70db0c6a09reed SkPaint paint; 10421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 105776c0cd9550f16019da6773370dcce70db0c6a09reed for (int y = 0; y < ySize; y++) { 106776c0cd9550f16019da6773370dcce70db0c6a09reed for (int x = 0; x < xSize; x++) { 107776c0cd9550f16019da6773370dcce70db0c6a09reed paint.setColor(textureData[x][y]); 108776c0cd9550f16019da6773370dcce70db0c6a09reed canvas.drawIRect(SkIRect::MakeXYWH(x, y, 1, 1), paint); 10921a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 11021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 11121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com} 11221a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 11321a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com// This GM attempts to make visible any issues drawBitmapRectToRect may have 11421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com// with partial source rects. In this case the eight pixels on the border 11521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com// should be half the width/height of the central pixel, i.e.: 11621a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com// __|____|__ 11721a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com// | | 11821a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com// __|____|__ 11921a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com// | | 12021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comclass DrawBitmapRect3 : public skiagm::GM { 12121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.compublic: 12221a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com DrawBitmapRect3() { 12321a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com this->setBGColor(SK_ColorBLACK); 12421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 12521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 12621a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comprotected: 12736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 12821a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com SkString str; 12921a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com str.printf("3x3bitmaprect"); 13021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com return str; 13121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 13221a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 13336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { 13421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com return SkISize::Make(640, 480); 13521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 13621a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 13736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 13821a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 13921a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com SkBitmap bitmap; 14021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com make_3x3_bitmap(&bitmap); 14121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 14221a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com SkRect srcR = { 0.5f, 0.5f, 2.5f, 2.5f }; 14321a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com SkRect dstR = { 100, 100, 300, 200 }; 14421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 14521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com canvas->drawBitmapRectToRect(bitmap, &srcR, dstR, NULL); 14621a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 14721a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 14821a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comprivate: 14921a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com typedef skiagm::GM INHERITED; 15021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com}; 15121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 15221a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com////////////////////////////////////////////////////////////////////////////// 15321a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comstatic void make_big_bitmap(SkBitmap* bitmap) { 15421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 15521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com static const int gXSize = 4096; 15621a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com static const int gYSize = 4096; 15721a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com static const int gBorderWidth = 10; 15821a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 159eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com bitmap->allocN32Pixels(gXSize, gYSize); 16021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com for (int y = 0; y < gYSize; ++y) { 16121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com for (int x = 0; x < gXSize; ++x) { 16244d498812a6fb0c60a8204e6334564fe518fba33skia.committer@gmail.com if (x <= gBorderWidth || x >= gXSize-gBorderWidth || 16321a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com y <= gBorderWidth || y >= gYSize-gBorderWidth) { 164c6e13d73426624275db18a39bc5cf5322bf612a8reed *bitmap->getAddr32(x, y) = SkPreMultiplyColor(0x88FFFFFF); 16521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } else { 166c6e13d73426624275db18a39bc5cf5322bf612a8reed *bitmap->getAddr32(x, y) = SkPreMultiplyColor(0x88FF0000); 16721a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 16821a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 16921a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 17021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com} 17121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 17221a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com// This GM attempts to reveal any issues we may have when the GPU has to 17321a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com// break up a large texture in order to draw it. The XOR transfer mode will 17421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com// create stripes in the image if there is imprecision in the destination 17521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com// tile placement. 17621a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comclass DrawBitmapRect4 : public skiagm::GM { 17721a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com bool fUseIRect; 1789a558d495dfe305a52946cdf97e8883190e0bbcccommit-bot@chromium.org SkBitmap fBigBitmap; 1799a558d495dfe305a52946cdf97e8883190e0bbcccommit-bot@chromium.org 18021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.compublic: 18121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com DrawBitmapRect4(bool useIRect) : fUseIRect(useIRect) { 18221a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com this->setBGColor(0x88444444); 18321a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 18421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 18521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comprotected: 18636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 18721a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com SkString str; 18821a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com str.printf("bigbitmaprect_%s", fUseIRect ? "i" : "s"); 18921a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com return str; 19021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 19121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 19236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { 19321a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com return SkISize::Make(640, 480); 19421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 19521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 19636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onOnceBeforeDraw() override { 1979a558d495dfe305a52946cdf97e8883190e0bbcccommit-bot@chromium.org make_big_bitmap(&fBigBitmap); 1989a558d495dfe305a52946cdf97e8883190e0bbcccommit-bot@chromium.org } 1999a558d495dfe305a52946cdf97e8883190e0bbcccommit-bot@chromium.org 20036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 20121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 20221a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com SkXfermode* mode = SkXfermode::Create(SkXfermode::kXor_Mode); 20321a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 20421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com SkPaint paint; 20521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com paint.setAlpha(128); 2068fdb4c16a1a84b48290c8bebc023036bd3cef519robertphillips@google.com paint.setXfermode(mode)->unref(); 20721a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 208ffad46b264de469b2dd51aab6caaef71099fdbbfrobertphillips@google.com SkRect srcR1 = { 0.0f, 0.0f, 4096.0f, 2040.0f }; 209ffad46b264de469b2dd51aab6caaef71099fdbbfrobertphillips@google.com SkRect dstR1 = { 10.1f, 10.1f, 629.9f, 400.9f }; 210ffad46b264de469b2dd51aab6caaef71099fdbbfrobertphillips@google.com 211ffad46b264de469b2dd51aab6caaef71099fdbbfrobertphillips@google.com SkRect srcR2 = { 4085.0f, 10.0f, 4087.0f, 12.0f }; 212ffad46b264de469b2dd51aab6caaef71099fdbbfrobertphillips@google.com SkRect dstR2 = { 10, 410, 30, 430 }; 21321a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 21421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com if (!fUseIRect) { 2159a558d495dfe305a52946cdf97e8883190e0bbcccommit-bot@chromium.org canvas->drawBitmapRectToRect(fBigBitmap, &srcR1, dstR1, &paint); 2169a558d495dfe305a52946cdf97e8883190e0bbcccommit-bot@chromium.org canvas->drawBitmapRectToRect(fBigBitmap, &srcR2, dstR2, &paint); 21721a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } else { 218ffad46b264de469b2dd51aab6caaef71099fdbbfrobertphillips@google.com SkIRect iSrcR1, iSrcR2; 219ffad46b264de469b2dd51aab6caaef71099fdbbfrobertphillips@google.com 220ffad46b264de469b2dd51aab6caaef71099fdbbfrobertphillips@google.com srcR1.roundOut(&iSrcR1); 221ffad46b264de469b2dd51aab6caaef71099fdbbfrobertphillips@google.com srcR2.roundOut(&iSrcR2); 222ffad46b264de469b2dd51aab6caaef71099fdbbfrobertphillips@google.com 2239a558d495dfe305a52946cdf97e8883190e0bbcccommit-bot@chromium.org canvas->drawBitmapRect(fBigBitmap, &iSrcR1, dstR1, &paint); 2249a558d495dfe305a52946cdf97e8883190e0bbcccommit-bot@chromium.org canvas->drawBitmapRect(fBigBitmap, &iSrcR2, dstR2, &paint); 22521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 22621a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com } 22721a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 22821a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comprivate: 22921a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com typedef skiagm::GM INHERITED; 23021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com}; 23121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 232f786901ff03f78c86962a2a1ed227f1533d16d2breedclass BitmapRectRounding : public skiagm::GM { 233f786901ff03f78c86962a2a1ed227f1533d16d2breed SkBitmap fBM; 234f786901ff03f78c86962a2a1ed227f1533d16d2breed 235f786901ff03f78c86962a2a1ed227f1533d16d2breedpublic: 236f786901ff03f78c86962a2a1ed227f1533d16d2breed BitmapRectRounding() {} 237f786901ff03f78c86962a2a1ed227f1533d16d2breed 238f786901ff03f78c86962a2a1ed227f1533d16d2breedprotected: 23936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 240f786901ff03f78c86962a2a1ed227f1533d16d2breed SkString str; 241f786901ff03f78c86962a2a1ed227f1533d16d2breed str.printf("bitmaprect_rounding"); 242f786901ff03f78c86962a2a1ed227f1533d16d2breed return str; 243f786901ff03f78c86962a2a1ed227f1533d16d2breed } 244f786901ff03f78c86962a2a1ed227f1533d16d2breed 24536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { 246f786901ff03f78c86962a2a1ed227f1533d16d2breed return SkISize::Make(640, 480); 247f786901ff03f78c86962a2a1ed227f1533d16d2breed } 248f786901ff03f78c86962a2a1ed227f1533d16d2breed 24936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onOnceBeforeDraw() override { 250f786901ff03f78c86962a2a1ed227f1533d16d2breed fBM.allocN32Pixels(10, 10); 251f786901ff03f78c86962a2a1ed227f1533d16d2breed fBM.eraseColor(SK_ColorBLUE); 252f786901ff03f78c86962a2a1ed227f1533d16d2breed } 253f786901ff03f78c86962a2a1ed227f1533d16d2breed 254f786901ff03f78c86962a2a1ed227f1533d16d2breed // This choice of coordinates and matrix land the bottom edge of the clip (and bitmap dst) 255f786901ff03f78c86962a2a1ed227f1533d16d2breed // at exactly 1/2 pixel boundary. However, drawBitmapRect may lose precision along the way. 256f786901ff03f78c86962a2a1ed227f1533d16d2breed // If it does, we may see a red-line at the bottom, instead of the bitmap exactly matching 257f786901ff03f78c86962a2a1ed227f1533d16d2breed // the clip (in which case we should see all blue). 258f786901ff03f78c86962a2a1ed227f1533d16d2breed // The correct image should be all blue. 25936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 260f786901ff03f78c86962a2a1ed227f1533d16d2breed SkPaint paint; 261f786901ff03f78c86962a2a1ed227f1533d16d2breed paint.setColor(SK_ColorRED); 262f786901ff03f78c86962a2a1ed227f1533d16d2breed 263f786901ff03f78c86962a2a1ed227f1533d16d2breed const SkRect r = SkRect::MakeXYWH(1, 1, 110, 114); 264f786901ff03f78c86962a2a1ed227f1533d16d2breed canvas->scale(0.9f, 0.9f); 265f786901ff03f78c86962a2a1ed227f1533d16d2breed 266f786901ff03f78c86962a2a1ed227f1533d16d2breed // the drawRect shows the same problem as clipRect(r) followed by drawcolor(red) 267f786901ff03f78c86962a2a1ed227f1533d16d2breed canvas->drawRect(r, paint); 268f786901ff03f78c86962a2a1ed227f1533d16d2breed canvas->drawBitmapRect(fBM, NULL, r, NULL); 269f786901ff03f78c86962a2a1ed227f1533d16d2breed } 2701c4029296f518a84ef90095243ba210163a1e1f9mtklein 271f786901ff03f78c86962a2a1ed227f1533d16d2breedprivate: 272f786901ff03f78c86962a2a1ed227f1533d16d2breed typedef skiagm::GM INHERITED; 273f786901ff03f78c86962a2a1ed227f1533d16d2breed}; 2740393912de72bc3d8b3640c122c53470dd0da1e6dreedDEF_GM( return new BitmapRectRounding; ) 275f786901ff03f78c86962a2a1ed227f1533d16d2breed 27621a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com////////////////////////////////////////////////////////////////////////////// 2777112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 2787112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comstatic skiagm::GM* MyFactory0(void*) { return new DrawBitmapRect2(false); } 2797112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comstatic skiagm::GM* MyFactory1(void*) { return new DrawBitmapRect2(true); } 2807112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 28121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comstatic skiagm::GM* MyFactory2(void*) { return new DrawBitmapRect3(); } 28221a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 283653b0d678e0f8ebbef8682d2cbbd679a4948ba85robertphillips@google.com#ifndef SK_BUILD_FOR_ANDROID 28421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comstatic skiagm::GM* MyFactory3(void*) { return new DrawBitmapRect4(false); } 28521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comstatic skiagm::GM* MyFactory4(void*) { return new DrawBitmapRect4(true); } 286653b0d678e0f8ebbef8682d2cbbd679a4948ba85robertphillips@google.com#endif 28721a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 2887112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comstatic skiagm::GMRegistry reg0(MyFactory0); 2897112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comstatic skiagm::GMRegistry reg1(MyFactory1); 29021a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 29121a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comstatic skiagm::GMRegistry reg2(MyFactory2); 29221a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.com 293653b0d678e0f8ebbef8682d2cbbd679a4948ba85robertphillips@google.com#ifndef SK_BUILD_FOR_ANDROID 29421a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comstatic skiagm::GMRegistry reg3(MyFactory3); 29521a95f16c9b73f3ecd23b9abfb6fc04e069de010robertphillips@google.comstatic skiagm::GMRegistry reg4(MyFactory4); 296653b0d678e0f8ebbef8682d2cbbd679a4948ba85robertphillips@google.com#endif 297f786901ff03f78c86962a2a1ed227f1533d16d2breed 298