1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
78ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
867981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com#include "gm.h"
967981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com
108ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comclass SkJSCanvas {
118ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.compublic:
128ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    SkJSCanvas(SkCanvas* target);
138ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ~SkJSCanvas();
148ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
158ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    void save();
168ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    void restore();
17020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
188ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    double lineWidth;
198ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    void setLineWidth(double);
20020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
218ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    void beginPath();
228ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    void moveTo(double x, double y);
238ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    void lineTo(double x, double y);
248ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    void closePath();
25020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
268ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    void fill();
278ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    void stroke();
28020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
298ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    void fillText(const char text[], double x, double y);
308ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
318ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comprivate:
328ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    SkCanvas*   fTarget;
338ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    SkPaint     fFillPaint;
348ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    SkPaint     fStrokePaint;
358ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    SkPath      fPath;
368ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com};
378ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
388ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comSkJSCanvas::SkJSCanvas(SkCanvas* target) : fTarget(target) {
398ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    fFillPaint.setAntiAlias(true);
408ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    fStrokePaint.setAntiAlias(true);
418ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    fStrokePaint.setStyle(SkPaint::kStroke_Style);
428ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    fStrokePaint.setStrokeWidth(SK_Scalar1);
438ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com}
4467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com
458ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comSkJSCanvas::~SkJSCanvas() {}
468ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
478ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comvoid SkJSCanvas::save() { fTarget->save(); }
488ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comvoid SkJSCanvas::restore() { fTarget->restore(); }
498ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
508ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comvoid SkJSCanvas::beginPath() { fPath.reset(); }
518ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comvoid SkJSCanvas::moveTo(double x, double y) {
528ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    fPath.moveTo(SkDoubleToScalar(x), SkDoubleToScalar(y));
538ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com}
548ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
558ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comvoid SkJSCanvas::lineTo(double x, double y) {
568ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    fPath.lineTo(SkDoubleToScalar(x), SkDoubleToScalar(y));
578ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com}
588ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
598ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comvoid SkJSCanvas::closePath() { fPath.close(); }
608ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
618ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comvoid SkJSCanvas::fill() {
628ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    fTarget->drawPath(fPath, fFillPaint);
638ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com}
648ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
658ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comvoid SkJSCanvas::stroke() {
668ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    fStrokePaint.setStrokeWidth(SkDoubleToScalar(lineWidth));
678ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    fTarget->drawPath(fPath, fStrokePaint);
688ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com}
698ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
708ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comvoid SkJSCanvas::fillText(const char text[], double x, double y) {
718ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    fTarget->drawText(text, strlen(text),
728ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com                      SkDoubleToScalar(x), SkDoubleToScalar(y), fFillPaint);
738ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com}
748ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
758ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com///////////////////////////////////////////////////////////////////////////////
768ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
778ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comstatic void dump(const SkPath& path) {
788ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    const SkRect& r = path.getBounds();
798ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    SkDebugf("isEmpty %d, bounds [%g %g %g %g]\n", path.isEmpty(),
808ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com             r.fLeft, r.fTop, r.fRight, r.fBottom);
818ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com}
828ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
838ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comstatic void test_stroke(SkCanvas* canvas) {
848ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    if (true) {
858ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        SkPath path;
868ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        dump(path);
878ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        path.reset(); path.moveTo(0, 0);
888ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        dump(path);
898ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        path.reset(); path.moveTo(100, 100);
908ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        dump(path);
918ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        path.reset(); path.moveTo(0, 0); path.moveTo(100, 100);
928ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        dump(path);
938ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        path.reset(); path.moveTo(0, 0); path.lineTo(100, 100);
948ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        dump(path);
958ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        path.reset(); path.moveTo(0, 0); path.lineTo(100, 100); path.moveTo(200, 200);
968ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        dump(path);
978ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    }
98020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
998ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com#if 0
1008ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    // TEST 1 - The rectangle as it's expected to look
1018ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    var canvas = document.createElement('canvas');
1028ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    document.body.appendChild(canvas);
1038ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    var ctx = canvas.getContext("2d");
1048ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com#else
1058ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    SkJSCanvas ctx(canvas);
1068ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com#endif
1078ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
1088ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.save();
1098ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.lineWidth = 2;
1108ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.beginPath();
1118ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.moveTo(10, 100);
1128ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.lineTo(150, 100);
1138ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.lineTo(150, 15);
1148ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.lineTo(10, 15);
1158ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.closePath();
116020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
1178ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    // no extra moveTo here
1188ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    // ctx.moveTo(175, 125);
119020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
1208ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.stroke();
1218ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.restore();
122020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
1238ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.fillText("As Expected", 10, 10);
124020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
1258ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com#if 0
1268ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    // TEST 2 - Includes an extra moveTo call before stroke; the rectangle appears larger
1278ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    canvas = document.createElement('canvas');
1288ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    document.body.appendChild(canvas);
1298ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx = canvas.getContext("2d");
1308ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com#else
1318ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    canvas->translate(200, 0);
1328ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com#endif
1338ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
1348ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.save();
1358ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.lineWidth = 2;
1368ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.beginPath();
1378ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.moveTo(10, 100);
1388ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.lineTo(150, 100);
1398ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.lineTo(150, 15);
1408ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.lineTo(10, 15);
1418ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.closePath();
142020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
1438ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.moveTo(175, 125);
144020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
1458ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.stroke();
1468ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.restore();
147020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
1488ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.fillText("Larger Rectangle", 10, 10);
149020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
1508ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com#if 0
1518ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    // TEST 3 - Identical to test 2 except the line width is 1
1528ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    canvas = document.createElement('canvas');
1538ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    document.body.appendChild(canvas);
1548ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx = canvas.getContext("2d");
1558ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com#else
1568ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    canvas->translate(200, 0);
1578ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com#endif
1588ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
1598ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.save();
1608ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.lineWidth = 1;
1618ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.beginPath();
1628ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.moveTo(10, 100);
1638ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.lineTo(150, 100);
1648ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.lineTo(150, 15);
1658ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.lineTo(10, 15);
1668ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.closePath();
167020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
1688ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.moveTo(175, 125);
169020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
1708ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.stroke();
1718ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.restore();
172020b25becb4a99061e8643780c887ad472eb0648skia.committer@gmail.com
1738ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    ctx.fillText("As Expected - line width 1", 10, 10);
1748ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com}
1758ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
1768ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comclass Poly2PolyGM : public skiagm::GM {
17767981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.compublic:
178d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    Poly2PolyGM() {}
179d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
18067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.comprotected:
181a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
182a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
183a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
184a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
1858ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    virtual SkString onShortName() SK_OVERRIDE {
18667981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        return SkString("poly2poly");
18767981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com    }
18867981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com
1898ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    virtual SkISize onISize() SK_OVERRIDE {
1908ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        return SkISize::Make(835, 840);
19167981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com    }
192d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
19367981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com    static void doDraw(SkCanvas* canvas, SkPaint* paint, const int isrc[],
19467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com                       const int idst[], int count) {
19567981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        SkMatrix matrix;
19667981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        SkPoint src[4], dst[4];
197d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
19867981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        for (int i = 0; i < count; i++) {
19967981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com            src[i].set(SkIntToScalar(isrc[2*i+0]), SkIntToScalar(isrc[2*i+1]));
20067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com            dst[i].set(SkIntToScalar(idst[2*i+0]), SkIntToScalar(idst[2*i+1]));
20167981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        }
202d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
20367981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->save();
20467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        matrix.setPolyToPoly(src, dst, count);
20567981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->concat(matrix);
206d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
20767981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        paint->setColor(SK_ColorGRAY);
20867981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        paint->setStyle(SkPaint::kStroke_Style);
20967981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        const SkScalar D = SkIntToScalar(64);
21067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->drawRectCoords(0, 0, D, D, *paint);
21167981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->drawLine(0, 0, D, D, *paint);
21267981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->drawLine(0, D, D, 0, *paint);
213d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
21467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        SkPaint::FontMetrics fm;
21567981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        paint->getFontMetrics(&fm);
21667981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        paint->setColor(SK_ColorRED);
21767981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        paint->setStyle(SkPaint::kFill_Style);
21867981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        SkScalar x = D/2;
21972e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com        SkScalar y = D/2 - (fm.fAscent + fm.fDescent)/2;
22067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        SkString str;
22167981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        str.appendS32(count);
22267981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->drawText(str.c_str(), str.size(), x, y, *paint);
223d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
22467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->restore();
22567981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com    }
226d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2278ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
2288ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com        if (false) { test_stroke(canvas); return; }
2298ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com
23067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        SkPaint paint;
23167981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        paint.setAntiAlias(true);
23267981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        paint.setStrokeWidth(SkIntToScalar(4));
23367981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        paint.setTextSize(SkIntToScalar(40));
23467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        paint.setTextAlign(SkPaint::kCenter_Align);
235d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
23667981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->save();
23767981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
23867981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        // translate (1 point)
23967981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        const int src1[] = { 0, 0 };
24067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        const int dst1[] = { 5, 5 };
24167981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        doDraw(canvas, &paint, src1, dst1, 1);
24267981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->restore();
243d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
24467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->save();
24567981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->translate(SkIntToScalar(160), SkIntToScalar(10));
24667981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        // rotate/uniform-scale (2 points)
24767981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        const int src2[] = { 32, 32, 64, 32 };
24867981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        const int dst2[] = { 32, 32, 64, 48 };
24967981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        doDraw(canvas, &paint, src2, dst2, 2);
25067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->restore();
251d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
25267981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->save();
25367981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->translate(SkIntToScalar(10), SkIntToScalar(110));
25467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        // rotate/skew (3 points)
25567981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        const int src3[] = { 0, 0, 64, 0, 0, 64 };
25667981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        const int dst3[] = { 0, 0, 96, 0, 24, 64 };
25767981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        doDraw(canvas, &paint, src3, dst3, 3);
25867981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->restore();
259d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
26067981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->save();
26167981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->translate(SkIntToScalar(160), SkIntToScalar(110));
26267981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        // perspective (4 points)
26367981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        const int src4[] = { 0, 0, 64, 0, 64, 64, 0, 64 };
26467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        const int dst4[] = { 0, 0, 96, 0, 64, 96, 0, 64 };
26567981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        doDraw(canvas, &paint, src4, dst4, 4);
26667981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com        canvas->restore();
26767981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com    }
268d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
26967981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.comprivate:
2708ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.com    typedef skiagm::GM INHERITED;
27167981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com};
27267981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com
27367981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com//////////////////////////////////////////////////////////////////////////////
27467981c5e4b4bec341fb40a59b111d75da1d6ab66reed@google.com
2758ea69838a4f00281c744e8c8e7fc95375c0aa1e5reed@google.comDEF_GM( return new Poly2PolyGM; )
276