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 */
7bf0001d0472d727266762c5967ec0d919a6df083reed@google.com
88898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SampleCode.h"
98898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkView.h"
108898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkCanvas.h"
118898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkCornerPathEffect.h"
128898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkGradientShader.h"
138898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkGraphics.h"
148898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkImageDecoder.h"
158898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkPath.h"
168898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkRandom.h"
178898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkRegion.h"
188898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkShader.h"
198898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkUtils.h"
208898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkColorPriv.h"
218898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkColorFilter.h"
228898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkTime.h"
238898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkTypeface.h"
248898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkXfermode.h"
258898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
268898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkStream.h"
278898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkXMLParser.h"
288898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkColorPriv.h"
298898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com#include "SkImageDecoder.h"
308898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
318898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.comstatic SkRandom gRand;
328898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
338898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.comstatic void test_chromium_9005() {
348898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    SkBitmap bm;
35a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org    bm.allocN32Pixels(800, 600);
368898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
378898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    SkCanvas canvas(bm);
388898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
394b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    SkPoint pt0 = { 799.33374f, 1.2360189f };
404b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    SkPoint pt1 = { 808.49969f, -7.4338055f };
41ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
428898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    SkPaint paint;
438898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    paint.setAntiAlias(true);
448898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    canvas.drawLine(pt0.fX, pt0.fY, pt1.fX, pt1.fY, paint);
458898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com}
468898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
478898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.comstatic void generate_pts(SkPoint pts[], int count, int w, int h) {
488898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    for (int i = 0; i < count; i++) {
498898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        pts[i].set(gRand.nextUScalar1() * 3 * w - SkIntToScalar(w),
508898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com                   gRand.nextUScalar1() * 3 * h - SkIntToScalar(h));
518898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    }
528898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com}
538898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
548898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.comstatic bool check_zeros(const SkPMColor pixels[], int count, int skip) {
558898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    for (int i = 0; i < count; i++) {
568898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        if (*pixels) {
578898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com            return false;
588898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        }
598898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        pixels += skip;
608898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    }
618898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    return true;
628898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com}
638898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
648898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.comstatic bool check_bitmap_margin(const SkBitmap& bm, int margin) {
658898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    size_t rb = bm.rowBytes();
668898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    for (int i = 0; i < margin; i++) {
678898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        if (!check_zeros(bm.getAddr32(0, i), bm.width(), 1)) {
688898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com            return false;
698898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        }
708898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        int bottom = bm.height() - i - 1;
718898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        if (!check_zeros(bm.getAddr32(0, bottom), bm.width(), 1)) {
728898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com            return false;
738898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        }
748898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        // left column
757fa2a65c0cfc714364490cb715171461143024e0reed@google.com        if (!check_zeros(bm.getAddr32(i, 0), bm.height(), SkToInt(rb >> 2))) {
768898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com            return false;
778898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        }
788898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        int right = bm.width() - margin + i;
797fa2a65c0cfc714364490cb715171461143024e0reed@google.com        if (!check_zeros(bm.getAddr32(right, 0), bm.height(),
807fa2a65c0cfc714364490cb715171461143024e0reed@google.com                         SkToInt(rb >> 2))) {
818898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com            return false;
828898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        }
838898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    }
848898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    return true;
858898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com}
868898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
8728937283e16928a562b3f9e19908db51bbb89ff9reed@android.com#define WIDTH   620
8828937283e16928a562b3f9e19908db51bbb89ff9reed@android.com#define HEIGHT  460
8928937283e16928a562b3f9e19908db51bbb89ff9reed@android.com#define MARGIN  10
9028937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
9128937283e16928a562b3f9e19908db51bbb89ff9reed@android.comstatic void line_proc(SkCanvas* canvas, const SkPaint& paint,
9228937283e16928a562b3f9e19908db51bbb89ff9reed@android.com                      const SkBitmap& bm) {
9328937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    const int N = 2;
9428937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    SkPoint pts[N];
9528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    for (int i = 0; i < 400; i++) {
9628937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        generate_pts(pts, N, WIDTH, HEIGHT);
9728937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
9828937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        canvas->drawLine(pts[0].fX, pts[0].fY, pts[1].fX, pts[1].fY, paint);
9928937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        if (!check_bitmap_margin(bm, MARGIN)) {
10028937283e16928a562b3f9e19908db51bbb89ff9reed@android.com            SkDebugf("---- hairline failure (%g %g) (%g %g)\n",
10128937283e16928a562b3f9e19908db51bbb89ff9reed@android.com                     pts[0].fX, pts[0].fY, pts[1].fX, pts[1].fY);
10228937283e16928a562b3f9e19908db51bbb89ff9reed@android.com            break;
10328937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        }
10428937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    }
10528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com}
10628937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
10728937283e16928a562b3f9e19908db51bbb89ff9reed@android.comstatic void poly_proc(SkCanvas* canvas, const SkPaint& paint,
10828937283e16928a562b3f9e19908db51bbb89ff9reed@android.com                      const SkBitmap& bm) {
10928937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    const int N = 8;
11028937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    SkPoint pts[N];
11128937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    for (int i = 0; i < 50; i++) {
11228937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        generate_pts(pts, N, WIDTH, HEIGHT);
113ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
11428937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        SkPath path;
11528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        path.moveTo(pts[0]);
11628937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        for (int j = 1; j < N; j++) {
11728937283e16928a562b3f9e19908db51bbb89ff9reed@android.com            path.lineTo(pts[j]);
11828937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        }
11928937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        canvas->drawPath(path, paint);
12028937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    }
12128937283e16928a562b3f9e19908db51bbb89ff9reed@android.com}
12228937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
12328937283e16928a562b3f9e19908db51bbb89ff9reed@android.comstatic SkPoint ave(const SkPoint& a, const SkPoint& b) {
12428937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    SkPoint c = a + b;
12528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    c.fX = SkScalarHalf(c.fX);
12628937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    c.fY = SkScalarHalf(c.fY);
12728937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    return c;
12828937283e16928a562b3f9e19908db51bbb89ff9reed@android.com}
12928937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
13028937283e16928a562b3f9e19908db51bbb89ff9reed@android.comstatic void quad_proc(SkCanvas* canvas, const SkPaint& paint,
13128937283e16928a562b3f9e19908db51bbb89ff9reed@android.com                      const SkBitmap& bm) {
13228937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    const int N = 30;
13328937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    SkPoint pts[N];
13428937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    for (int i = 0; i < 10; i++) {
13528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        generate_pts(pts, N, WIDTH, HEIGHT);
136ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
13728937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        SkPath path;
13828937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        path.moveTo(pts[0]);
13928937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        for (int j = 1; j < N - 2; j++) {
14028937283e16928a562b3f9e19908db51bbb89ff9reed@android.com            path.quadTo(pts[j], ave(pts[j], pts[j+1]));
14128937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        }
14228937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        path.quadTo(pts[N - 2], pts[N - 1]);
143ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
14428937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        canvas->drawPath(path, paint);
14528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    }
14628937283e16928a562b3f9e19908db51bbb89ff9reed@android.com}
14728937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
14828937283e16928a562b3f9e19908db51bbb89ff9reed@android.comstatic void add_cubic(SkPath* path, const SkPoint& mid, const SkPoint& end) {
14928937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    SkPoint start;
15028937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    path->getLastPt(&start);
15128937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    path->cubicTo(ave(start, mid), ave(mid, end), end);
15228937283e16928a562b3f9e19908db51bbb89ff9reed@android.com}
15328937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
15428937283e16928a562b3f9e19908db51bbb89ff9reed@android.comstatic void cube_proc(SkCanvas* canvas, const SkPaint& paint,
15528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com                      const SkBitmap& bm) {
15628937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    const int N = 30;
15728937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    SkPoint pts[N];
15828937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    for (int i = 0; i < 10; i++) {
15928937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        generate_pts(pts, N, WIDTH, HEIGHT);
160ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
16128937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        SkPath path;
16228937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        path.moveTo(pts[0]);
16328937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        for (int j = 1; j < N - 2; j++) {
16428937283e16928a562b3f9e19908db51bbb89ff9reed@android.com            add_cubic(&path, pts[j], ave(pts[j], pts[j+1]));
16528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        }
16628937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        add_cubic(&path, pts[N - 2], pts[N - 1]);
167ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
16828937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        canvas->drawPath(path, paint);
16928937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    }
17028937283e16928a562b3f9e19908db51bbb89ff9reed@android.com}
17128937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
17228937283e16928a562b3f9e19908db51bbb89ff9reed@android.comtypedef void (*HairProc)(SkCanvas*, const SkPaint&, const SkBitmap&);
17328937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
17428937283e16928a562b3f9e19908db51bbb89ff9reed@android.comstatic const struct {
17528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    const char* fName;
17628937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    HairProc    fProc;
17728937283e16928a562b3f9e19908db51bbb89ff9reed@android.com} gProcs[] = {
17828937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    { "line",   line_proc },
17928937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    { "poly",   poly_proc },
18028937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    { "quad",   quad_proc },
18128937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    { "cube",   cube_proc },
18228937283e16928a562b3f9e19908db51bbb89ff9reed@android.com};
18328937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
18428937283e16928a562b3f9e19908db51bbb89ff9reed@android.comstatic int cycle_hairproc_index(int index) {
18528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    return (index + 1) % SK_ARRAY_COUNT(gProcs);
18628937283e16928a562b3f9e19908db51bbb89ff9reed@android.com}
1878898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
1885fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.orgclass HairlineView : public SampleView {
189a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com    SkMSec fNow;
19028937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    int fProcIndex;
19128937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    bool fDoAA;
1928898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.compublic:
193ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    HairlineView() {
19450108cdbfea57e983667cd1fecd97a8a9df26b20senorblanco@chromium.org        fCounter = 0;
19528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        fProcIndex = 0;
19628937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        fDoAA = true;
197a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com        fNow = 0;
19828937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    }
199ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2008898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.comprotected:
2018898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    // overrides from SkEventSink
2028898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    virtual bool onQuery(SkEvent* evt) {
2038898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        if (SampleCode::TitleQ(*evt)) {
20428937283e16928a562b3f9e19908db51bbb89ff9reed@android.com            SkString str;
20528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com            str.printf("Hair-%s", gProcs[fProcIndex].fName);
20628937283e16928a562b3f9e19908db51bbb89ff9reed@android.com            SampleCode::TitleR(evt, str.c_str());
2078898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com            return true;
2088898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        }
2098898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        return this->INHERITED::onQuery(evt);
2108898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    }
211ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2128898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    void show_bitmaps(SkCanvas* canvas, const SkBitmap& b0, const SkBitmap& b1,
2138898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com                      const SkIRect& inset) {
2148898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        canvas->drawBitmap(b0, 0, 0, NULL);
2158898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        canvas->drawBitmap(b1, SkIntToScalar(b0.width()), 0, NULL);
2168898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    }
2178898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
21828937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    int fCounter;
21928937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
2205fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org    virtual void onDrawContent(SkCanvas* canvas) {
221a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com        gRand.setSeed(fNow);
222ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
223e3510507b73b564c1dc4dca9a511a485c071a170caryclark@google.com        if (false) { // avoid bit rot, suppress warning
2248898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com            test_chromium_9005();
2258898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        }
226ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2278898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        SkBitmap bm, bm2;
228a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org        bm.allocN32Pixels(WIDTH + MARGIN*2, HEIGHT + MARGIN*2);
2298898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        // this will erase our margin, which we want to always stay 0
230dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com        bm.eraseColor(SK_ColorTRANSPARENT);
2318898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
232a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org        bm2.installPixels(SkImageInfo::MakeN32Premul(WIDTH, HEIGHT),
23300f8d6c75d22ce8f95f932c5b101354b196fa0dfcommit-bot@chromium.org                          bm.getAddr32(MARGIN, MARGIN), bm.rowBytes());
234ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2358898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        SkCanvas c2(bm2);
2368898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com        SkPaint paint;
23728937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        paint.setAntiAlias(fDoAA);
23828937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        paint.setStyle(SkPaint::kStroke_Style);
23928937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
240dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com        bm2.eraseColor(SK_ColorTRANSPARENT);
24128937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        gProcs[fProcIndex].fProc(&c2, paint, bm);
24228937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        canvas->drawBitmap(bm2, SkIntToScalar(10), SkIntToScalar(10), NULL);
243a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com
244a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com        SkMSec now = SampleCode::GetAnimTime();
245a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com        if (fNow != now) {
246a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com            fNow = now;
247a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com            fCounter += 1;
248a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com            fDoAA = !fDoAA;
249a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com            if (fCounter > 50) {
250a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com                fProcIndex = cycle_hairproc_index(fProcIndex);
251a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com                // todo: signal that we want to rebuild our TITLE
252a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com                fCounter = 0;
253a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com            }
254a3d901099d7d295cd7d9df4114e874d9ccfff447reed@android.com            this->inval(NULL);
25528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        }
2568898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com    }
2578898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
2584d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
2594d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com                                              unsigned modi) {
26028937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        fDoAA = !fDoAA;
26128937283e16928a562b3f9e19908db51bbb89ff9reed@android.com        this->inval(NULL);
2624d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com        return this->INHERITED::onFindClickHandler(x, y, modi);
26328937283e16928a562b3f9e19908db51bbb89ff9reed@android.com    }
264ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
26528937283e16928a562b3f9e19908db51bbb89ff9reed@android.com
2668898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.comprivate:
2675fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org    typedef SampleView INHERITED;
2688898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com};
2698898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
2708898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com//////////////////////////////////////////////////////////////////////////////
2718898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.com
2728898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.comstatic SkView* MyFactory() { return new HairlineView; }
2738898363b2ee02e36dfa4bb166b59c09c4e835b0freed@android.comstatic SkViewRegister reg(MyFactory);
274