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