150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org/*
250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org * Copyright 2012 Google Inc.
350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org *
450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be
550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org * found in the LICENSE file.
650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org */
750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org#include "SampleCode.h"
950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org#include "SkView.h"
1050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org#include "SkCanvas.h"
1150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org#include "SkPath.h"
1250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org#include "SkRegion.h"
1350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org#include "SkShader.h"
1450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org#include "SkUtils.h"
1550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org#include "SkImage.h"
1650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org#include "SkSurface.h"
1750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
18c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com#define FAT_PIXEL_COLOR     SK_ColorBLACK
19c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com#define PIXEL_CENTER_SIZE   3
20c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com#define WIRE_FRAME_COLOR    0xFFFF0000  /*0xFF00FFFF*/
21c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com#define WIRE_FRAME_SIZE     1.5f
22c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com
23bbe66f0824dc47823826f6265879d7a57843fed3reed@google.comstatic SkScalar apply_grid(SkScalar x) {
24bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    const SkScalar grid = 2;
25bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    return SkScalarRoundToScalar(x * grid) / grid;
26bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com}
27bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com
28bbe66f0824dc47823826f6265879d7a57843fed3reed@google.comstatic void apply_grid(SkPoint pts[], int count) {
29bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    for (int i = 0; i < count; ++i) {
30bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        pts[i].set(apply_grid(pts[i].fX), apply_grid(pts[i].fY));
31bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    }
32bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com}
33bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com
3450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgstatic void erase(SkSurface* surface) {
35dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    surface->getCanvas()->clear(SK_ColorTRANSPARENT);
3650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org}
3750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
385970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.orgstatic SkShader* createChecker(const SkMatrix& localMatrix) {
399c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com//    SkColor colors[] = { 0xFFFDFDFD, 0xFFF4F4F4 };
409c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    SkColor colors[] = { 0xFFFFFFFF, 0xFFFFFFFF };
4150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkBitmap bm;
42a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org    bm.allocN32Pixels(2, 2);
4350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    bm.lockPixels();
449c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = SkPreMultiplyColor(colors[0]);
459c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    *bm.getAddr32(0, 1) = *bm.getAddr32(1, 0) = SkPreMultiplyColor(colors[1]);
469c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org    return SkShader::CreateBitmapShader(bm, SkShader::kRepeat_TileMode,
475970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org                                        SkShader::kRepeat_TileMode, &localMatrix);
4850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org}
4950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
5050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgclass FatBits {
5150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgpublic:
525970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    FatBits() {
5350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fAA = false;
5450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fStyle = kHair_Style;
5550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fGrid = true;
56c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        fShowSkeleton = true;
57c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        fUseGPU = false;
589c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        fUseClip = false;
5964494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org        fRectAsOval = false;
60bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        fUseTriangle = false;
611aa90cf11e136a722bce71dd77f4bb03cc2b56f8skia.committer@gmail.com
629c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        fClipRect.set(2, 2, 11, 8 );
6350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
6450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
65ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com    int getZoom() const { return fZoom; }
66c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com
6750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    bool getAA() const { return fAA; }
6850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void setAA(bool aa) { fAA = aa; }
6950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
7050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    bool getGrid() const { return fGrid; }
7150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void setGrid(bool g) { fGrid = g; }
7245ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
73c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    bool getShowSkeleton() const { return fShowSkeleton; }
74c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    void setShowSkeleton(bool ss) { fShowSkeleton = ss; }
7545ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
76c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    bool getUseGPU() const { return fUseGPU; }
77c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    void setUseGPU(bool ug) { fUseGPU = ug; }
787ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com
79bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    bool getTriangle() const { return fUseTriangle; }
80bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    void setTriangle(bool ut) { fUseTriangle = ut; }
817ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com
8264494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org    void toggleRectAsOval() { fRectAsOval = !fRectAsOval; }
8364494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org
849c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    bool getUseClip() const { return fUseClip; }
859c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    void setUseClip(bool uc) { fUseClip = uc; }
869c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com
8750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    enum Style {
8850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        kHair_Style,
89c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        kStroke_Style,
9050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    };
9150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    Style getStyle() const { return fStyle; }
9250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void setStyle(Style s) { fStyle = s; }
9350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
9450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void setWHZ(int width, int height, int zoom) {
9550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fW = width;
9650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fH = height;
97ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com        fZoom = zoom;
9850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fBounds.set(0, 0, SkIntToScalar(width * zoom), SkIntToScalar(height * zoom));
9950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fMatrix.setScale(SkIntToScalar(zoom), SkIntToScalar(zoom));
10050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fInverse.setScale(SK_Scalar1 / zoom, SK_Scalar1 / zoom);
1015970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org        fShader.reset(createChecker(fMatrix));
10245ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
10332678d9a453e2c9fd26e92be429cdd84250b4d85commit-bot@chromium.org        SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
104bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        fMinSurface.reset(SkSurface::NewRaster(info));
105bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        info.fWidth *= zoom;
106bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        info.fHeight *= zoom;
107bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        fMaxSurface.reset(SkSurface::NewRaster(info));
10850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
10950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
11050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void drawBG(SkCanvas*);
11150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void drawFG(SkCanvas*);
11250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void drawLine(SkCanvas*, SkPoint pts[2]);
11350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void drawRect(SkCanvas* canvas, SkPoint pts[2]);
114bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    void drawTriangle(SkCanvas* canvas, SkPoint pts[3]);
11550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
11650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgprivate:
117bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    bool fAA, fGrid, fShowSkeleton, fUseGPU, fUseClip, fRectAsOval, fUseTriangle;
11850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    Style fStyle;
119ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com    int fW, fH, fZoom;
12050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkMatrix fMatrix, fInverse;
1219c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    SkRect   fBounds, fClipRect;
12250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkAutoTUnref<SkShader> fShader;
12350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkAutoTUnref<SkSurface> fMinSurface;
12450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkAutoTUnref<SkSurface> fMaxSurface;
12550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
12650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void setupPaint(SkPaint* paint) {
12750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        bool aa = this->getAA();
12850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        switch (fStyle) {
12950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            case kHair_Style:
13050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                paint->setStrokeWidth(0);
13150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                break;
13250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            case kStroke_Style:
133cdbcb3ecc78a48a62503c67b01a0e2322d07fe29reed@google.com                paint->setStrokeWidth(SK_Scalar1);
13450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                break;
13550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        }
13650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        paint->setAntiAlias(aa);
13750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
13850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
139c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    void setupSkeletonPaint(SkPaint* paint) {
140c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        paint->setStyle(SkPaint::kStroke_Style);
141c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        paint->setStrokeWidth(WIRE_FRAME_SIZE);
142c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        paint->setColor(fShowSkeleton ? WIRE_FRAME_COLOR : 0);
143c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        paint->setAntiAlias(true);
144c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    }
145c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com
146bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    void drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]);
14750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void drawLineSkeleton(SkCanvas* max, const SkPoint pts[]);
14850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void drawRectSkeleton(SkCanvas* max, const SkRect& r) {
14950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        SkPaint paint;
150c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        this->setupSkeletonPaint(&paint);
151c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        SkPath path;
152c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com
153c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        if (fUseGPU && fAA) {
154c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            SkRect rr = r;
155ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com            rr.inset(SkIntToScalar(fZoom)/2, SkIntToScalar(fZoom)/2);
156c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            path.addRect(rr);
157c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            path.moveTo(rr.fLeft, rr.fTop);
158c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            path.lineTo(rr.fRight, rr.fBottom);
159c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            rr = r;
160ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com            rr.inset(-SkIntToScalar(fZoom)/2, -SkIntToScalar(fZoom)/2);
161c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            path.addRect(rr);
162c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        } else {
16364494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org            fRectAsOval ? path.addOval(r) : path.addRect(r);
164c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            if (fUseGPU) {
165c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                path.moveTo(r.fLeft, r.fTop);
166c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                path.lineTo(r.fRight, r.fBottom);
167c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            }
168c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        }
169c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com        max->drawPath(path, paint);
17050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
17145ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
17250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void copyMinToMax() {
17350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        erase(fMaxSurface);
17450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        SkCanvas* canvas = fMaxSurface->getCanvas();
17550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        canvas->save();
17650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        canvas->concat(fMatrix);
17750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fMinSurface->draw(canvas, 0, 0, NULL);
17850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        canvas->restore();
17950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
18050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        SkPaint paint;
18150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        paint.setXfermodeMode(SkXfermode::kClear_Mode);
18250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        for (int iy = 1; iy < fH; ++iy) {
183ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com            SkScalar y = SkIntToScalar(iy * fZoom);
18450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            canvas->drawLine(0, y - SK_ScalarHalf, 999, y - SK_ScalarHalf, paint);
18550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        }
18650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        for (int ix = 1; ix < fW; ++ix) {
187ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com            SkScalar x = SkIntToScalar(ix * fZoom);
18850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            canvas->drawLine(x - SK_ScalarHalf, 0, x - SK_ScalarHalf, 999, paint);
18950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        }
19050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
19150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org};
19250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
19350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgvoid FatBits::drawBG(SkCanvas* canvas) {
19450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkPaint paint;
19550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
19650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    paint.setShader(fShader);
19750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    canvas->drawRect(fBounds, paint);
19850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    paint.setShader(NULL);
19950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org}
20050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
20150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgvoid FatBits::drawFG(SkCanvas* canvas) {
202c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    SkPaint inner, outer;
203c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com
204c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    inner.setAntiAlias(true);
205c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    inner.setColor(SK_ColorBLACK);
206c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    inner.setStrokeWidth(PIXEL_CENTER_SIZE);
207c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com
208c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    outer.setAntiAlias(true);
209c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    outer.setColor(SK_ColorWHITE);
210c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    outer.setStrokeWidth(PIXEL_CENTER_SIZE + 2);
21150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
212ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com    SkScalar half = SkIntToScalar(fZoom) / 2;
21350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    for (int iy = 0; iy < fH; ++iy) {
214ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com        SkScalar y = SkIntToScalar(iy * fZoom) + half;
21550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        for (int ix = 0; ix < fW; ++ix) {
216ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com            SkScalar x = SkIntToScalar(ix * fZoom) + half;
21745ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
218c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            canvas->drawPoint(x, y, outer);
219c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            canvas->drawPoint(x, y, inner);
22050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        }
22150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
2229c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com
2239c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    if (fUseClip) {
2249c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        SkPaint p;
2259c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        p.setStyle(SkPaint::kStroke_Style);
2269c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        p.setColor(SK_ColorLTGRAY);
2279c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        SkRect r = {
228ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com            fClipRect.fLeft * fZoom,
229ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com            fClipRect.fTop * fZoom,
230ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com            fClipRect.fRight * fZoom,
231ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com            fClipRect.fBottom * fZoom
2329c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        };
2339c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        canvas->drawRect(r, p);
2349c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    }
23550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org}
23650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
23750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgvoid FatBits::drawLineSkeleton(SkCanvas* max, const SkPoint pts[]) {
23850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkPaint paint;
239c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    this->setupSkeletonPaint(&paint);
24045ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
24150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkPath path;
24250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    path.moveTo(pts[0]);
24350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    path.lineTo(pts[1]);
24445ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
24550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    switch (fStyle) {
24650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        case kHair_Style:
247c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            if (fUseGPU) {
248c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                SkPaint p;
249c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                p.setStyle(SkPaint::kStroke_Style);
250ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com                p.setStrokeWidth(SK_Scalar1 * fZoom);
251c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                SkPath dst;
252c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                p.getFillPath(path, &dst);
253c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                path.addPath(dst);
254c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            }
25550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            break;
25650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        case kStroke_Style: {
25750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            SkPaint p;
25850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            p.setStyle(SkPaint::kStroke_Style);
259ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com            p.setStrokeWidth(SK_Scalar1 * fZoom);
26050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            SkPath dst;
26150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            p.getFillPath(path, &dst);
26250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            path = dst;
26345ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
264c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            if (fUseGPU) {
265c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                path.moveTo(dst.getPoint(0));
266c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                path.lineTo(dst.getPoint(2));
267c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com            }
26850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        } break;
26950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
27050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    max->drawPath(path, paint);
27150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org}
27250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
27350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgvoid FatBits::drawLine(SkCanvas* canvas, SkPoint pts[]) {
27450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkPaint paint;
27545ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
27650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    fInverse.mapPoints(pts, 2);
27745ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
27850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    if (fGrid) {
279bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        apply_grid(pts, 2);
28050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
28145ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
28250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    erase(fMinSurface);
28350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    this->setupPaint(&paint);
284c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    paint.setColor(FAT_PIXEL_COLOR);
2859c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    if (fUseClip) {
2869c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        fMinSurface->getCanvas()->save();
2879c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        SkRect r = fClipRect;
2889c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        r.inset(SK_Scalar1/3, SK_Scalar1/3);
2899c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        fMinSurface->getCanvas()->clipRect(r, SkRegion::kIntersect_Op, true);
2909c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    }
29150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    fMinSurface->getCanvas()->drawLine(pts[0].fX, pts[0].fY, pts[1].fX, pts[1].fY, paint);
2929c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    if (fUseClip) {
2939c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com        fMinSurface->getCanvas()->restore();
2949c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    }
29550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    this->copyMinToMax();
29645ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
29750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkCanvas* max = fMaxSurface->getCanvas();
29845ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
29950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    fMatrix.mapPoints(pts, 2);
30050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    this->drawLineSkeleton(max, pts);
30145ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
30250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    fMaxSurface->draw(canvas, 0, 0, NULL);
30350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org}
30450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
30550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgvoid FatBits::drawRect(SkCanvas* canvas, SkPoint pts[2]) {
30650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkPaint paint;
30745ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
30850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    fInverse.mapPoints(pts, 2);
30945ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
31050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    if (fGrid) {
311bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        apply_grid(pts, 2);
31250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
31345ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
31450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkRect r;
31550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    r.set(pts, 2);
31650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
31750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    erase(fMinSurface);
31850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    this->setupPaint(&paint);
319c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    paint.setColor(FAT_PIXEL_COLOR);
32064494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org    {
32164494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org        SkCanvas* c = fMinSurface->getCanvas();
32264494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org        fRectAsOval ? c->drawOval(r, paint) : c->drawRect(r, paint);
32364494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org    }
32450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    this->copyMinToMax();
32545ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
32650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    SkCanvas* max = fMaxSurface->getCanvas();
32745ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
32850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    fMatrix.mapPoints(pts, 2);
32950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    r.set(pts, 2);
33050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    this->drawRectSkeleton(max, r);
33145ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
33250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    fMaxSurface->draw(canvas, 0, 0, NULL);
33350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org}
33450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
335bbe66f0824dc47823826f6265879d7a57843fed3reed@google.comvoid FatBits::drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]) {
336bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    SkPaint paint;
337bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    this->setupSkeletonPaint(&paint);
3387ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com
339bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    SkPath path;
340bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    path.moveTo(pts[0]);
341bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    path.lineTo(pts[1]);
342bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    path.lineTo(pts[2]);
343bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    path.close();
3447ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com
345bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    max->drawPath(path, paint);
346bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com}
347bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com
348bbe66f0824dc47823826f6265879d7a57843fed3reed@google.comvoid FatBits::drawTriangle(SkCanvas* canvas, SkPoint pts[3]) {
349bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    SkPaint paint;
3507ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com
351bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    fInverse.mapPoints(pts, 3);
3527ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com
353bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    if (fGrid) {
354bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        apply_grid(pts, 3);
355bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    }
3567ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com
357bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    SkPath path;
358bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    path.moveTo(pts[0]);
359bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    path.lineTo(pts[1]);
360bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    path.lineTo(pts[2]);
361bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    path.close();
3627ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com
363bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    erase(fMinSurface);
364bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    this->setupPaint(&paint);
365bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    paint.setColor(FAT_PIXEL_COLOR);
366bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    fMinSurface->getCanvas()->drawPath(path, paint);
367bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    this->copyMinToMax();
3687ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com
369bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    SkCanvas* max = fMaxSurface->getCanvas();
3707ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com
371bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    fMatrix.mapPoints(pts, 3);
372bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    this->drawTriangleSkeleton(max, pts);
3737ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com
374bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    fMaxSurface->draw(canvas, 0, 0, NULL);
375bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com}
376bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com
37750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org///////////////////////////////////////////////////////////////////////////////////////////////////
37850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
37950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgclass IndexClick : public SkView::Click {
38050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    int fIndex;
38150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgpublic:
38250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    IndexClick(SkView* v, int index) : SkView::Click(v), fIndex(index) {}
38345ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
38450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    static int GetIndex(SkView::Click* click) {
38550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        return ((IndexClick*)click)->fIndex;
38650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
38750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org};
38850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
38950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgclass DrawLineView : public SampleView {
39050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    FatBits fFB;
391bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    SkPoint fPts[3];
39250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    bool    fIsRect;
39350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgpublic:
39450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    DrawLineView() {
39550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fFB.setWHZ(24, 16, 48);
396cdbcb3ecc78a48a62503c67b01a0e2322d07fe29reed@google.com        fPts[0].set(48, 48);
397cdbcb3ecc78a48a62503c67b01a0e2322d07fe29reed@google.com        fPts[1].set(48 * 5, 48 * 4);
398bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        fPts[2].set(48 * 2, 48 * 6);
399cdbcb3ecc78a48a62503c67b01a0e2322d07fe29reed@google.com        fIsRect = false;
40050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
40145ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
40250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    void setStyle(FatBits::Style s) {
40350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fFB.setStyle(s);
40450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        this->inval(NULL);
40550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
40650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
40750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgprotected:
40850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    virtual bool onQuery(SkEvent* evt) SK_OVERRIDE {
40950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        if (SampleCode::TitleQ(*evt)) {
41050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            SampleCode::TitleR(evt, "FatBits");
41150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            return true;
41250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        }
41350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        SkUnichar uni;
41450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        if (SampleCode::CharQ(*evt, &uni)) {
41550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            switch (uni) {
4169c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com                case 'c':
4179c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com                    fFB.setUseClip(!fFB.getUseClip());
4189c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com                    this->inval(NULL);
4199c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com                    return true;
42050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                case 'r':
42150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    fIsRect = !fIsRect;
42250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    this->inval(NULL);
42350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    return true;
42464494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org                case 'o':
42564494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org                    fFB.toggleRectAsOval();
42664494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org                    this->inval(NULL);
42764494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org                    return true;
428c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                case 'x':
42950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    fFB.setGrid(!fFB.getGrid());
43050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    this->inval(NULL);
43150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    return true;
43250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                case 's':
43350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    if (FatBits::kStroke_Style == fFB.getStyle()) {
43450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                        this->setStyle(FatBits::kHair_Style);
43550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    } else {
43650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                        this->setStyle(FatBits::kStroke_Style);
43750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    }
43850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    return true;
43950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                case 'a':
44050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    fFB.setAA(!fFB.getAA());
44150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    this->inval(NULL);
44250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                    return true;
443c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                case 'w':
444c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                    fFB.setShowSkeleton(!fFB.getShowSkeleton());
445c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                    this->inval(NULL);
446c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                    return true;
447c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                case 'g':
448c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                    fFB.setUseGPU(!fFB.getUseGPU());
449c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                    this->inval(NULL);
450c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                    return true;
451bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com                case 't':
452bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com                    fFB.setTriangle(!fFB.getTriangle());
453bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com                    this->inval(NULL);
454bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com                    return true;
45550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            }
45650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        }
45750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        return this->INHERITED::onQuery(evt);
45850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
45945ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
46050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    virtual void onDrawContent(SkCanvas* canvas) {
46150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fFB.drawBG(canvas);
462bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        if (fFB.getTriangle()) {
463bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com            fFB.drawTriangle(canvas, fPts);
464bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        }
465bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        else if (fIsRect) {
46650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            fFB.drawRect(canvas, fPts);
46750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        } else {
46850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org            fFB.drawLine(canvas, fPts);
46950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        }
47050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        fFB.drawFG(canvas);
4711e34ff7030c95a96c3cd5940de9b4dda4e1cef86skia.committer@gmail.com
472ffe9d01e39a46376e8b233d5fded3dbaec0d492ereed@google.com        {
473ffe9d01e39a46376e8b233d5fded3dbaec0d492ereed@google.com            SkString str;
4749c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com            str.printf("%s %s %s %s",
475ffe9d01e39a46376e8b233d5fded3dbaec0d492ereed@google.com                       fFB.getAA() ? "AA" : "BW",
476ffe9d01e39a46376e8b233d5fded3dbaec0d492ereed@google.com                       FatBits::kHair_Style == fFB.getStyle() ? "Hair" : "Stroke",
4779c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com                       fFB.getUseGPU() ? "GPU" : "CPU",
4789c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com                       fFB.getUseClip() ? "clip" : "noclip");
479ffe9d01e39a46376e8b233d5fded3dbaec0d492ereed@google.com            SkPaint paint;
480ffe9d01e39a46376e8b233d5fded3dbaec0d492ereed@google.com            paint.setAntiAlias(true);
481ffe9d01e39a46376e8b233d5fded3dbaec0d492ereed@google.com            paint.setTextSize(16);
482ffe9d01e39a46376e8b233d5fded3dbaec0d492ereed@google.com            paint.setColor(SK_ColorBLUE);
483ffe9d01e39a46376e8b233d5fded3dbaec0d492ereed@google.com            canvas->drawText(str.c_str(), str.size(), 10, 16, paint);
484ffe9d01e39a46376e8b233d5fded3dbaec0d492ereed@google.com        }
48550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
48650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
487093455c116c016e95c47740ef7385f8a3372f160mike@reedtribe.org    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
488093455c116c016e95c47740ef7385f8a3372f160mike@reedtribe.org                                              unsigned modi) SK_OVERRIDE {
48950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        SkPoint pt = { x, y };
49050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        int index = -1;
491bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        int count = fFB.getTriangle() ? 3 : 2;
492cdbcb3ecc78a48a62503c67b01a0e2322d07fe29reed@google.com        SkScalar tol = 12;
4937ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com
494bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        for (int i = 0; i < count; ++i) {
495bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com            if (fPts[i].equalsWithinTolerance(pt, tol)) {
496bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com                index = i;
497bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com                break;
498bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com            }
49950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        }
500c892a153aabb04da31756acad076fddc6b1ea00emike@reedtribe.org        return new IndexClick(this, index);
50150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
50245ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
503093455c116c016e95c47740ef7385f8a3372f160mike@reedtribe.org    virtual bool onClick(Click* click) SK_OVERRIDE {
50450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        int index = IndexClick::GetIndex(click);
505bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com        if (index >= 0 && index <= 2) {
506c892a153aabb04da31756acad076fddc6b1ea00emike@reedtribe.org            fPts[index] = click->fCurr;
507c892a153aabb04da31756acad076fddc6b1ea00emike@reedtribe.org        } else {
508c892a153aabb04da31756acad076fddc6b1ea00emike@reedtribe.org            SkScalar dx = click->fCurr.fX - click->fPrev.fX;
509c892a153aabb04da31756acad076fddc6b1ea00emike@reedtribe.org            SkScalar dy = click->fCurr.fY - click->fPrev.fY;
510c892a153aabb04da31756acad076fddc6b1ea00emike@reedtribe.org            fPts[0].offset(dx, dy);
511c892a153aabb04da31756acad076fddc6b1ea00emike@reedtribe.org            fPts[1].offset(dx, dy);
512bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com            fPts[2].offset(dx, dy);
513c892a153aabb04da31756acad076fddc6b1ea00emike@reedtribe.org        }
51450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        this->inval(NULL);
51550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org        return true;
51650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    }
51745ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
51850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgprivate:
51945ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
52050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    typedef SampleView INHERITED;
52150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org};
52250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
52350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org//////////////////////////////////////////////////////////////////////////////
52450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
52550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgstatic SkView* MyFactory() { return new DrawLineView; }
52650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.orgstatic SkViewRegister reg(MyFactory);
527