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