1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SampleCode.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkAAClip.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkView.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorPriv.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkClipOpPriv.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconstexpr int W = 150; 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconstexpr int H = 200; 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void show_text(SkCanvas* canvas, bool doAA) { 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(doAA); 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setLCDRenderText(true); 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setTextSize(SkIntToScalar(20)); 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < 200; ++i) { 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor((SK_A32_MASK << SK_A32_SHIFT) | rand.nextU()); 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawString("Hamburgefons", 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rand.nextSScalar1() * W, rand.nextSScalar1() * H + 20, 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint); 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void show_fill(SkCanvas* canvas, bool doAA) { 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(doAA); 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < 50; ++i) { 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r; 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath p; 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H, 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rand.nextUScalar1() * W, rand.nextUScalar1() * H); 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(rand.nextU()); 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(r, paint); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H, 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rand.nextUScalar1() * W, rand.nextUScalar1() * H); 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(rand.nextU()); 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.addOval(r); 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(p, paint); 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkScalar randRange(SkRandom& rand, SkScalar min, SkScalar max) { 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(min <= max); 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return min + rand.nextUScalar1() * (max - min); 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void show_stroke(SkCanvas* canvas, bool doAA, SkScalar strokeWidth, int n) { 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(doAA); 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setStyle(SkPaint::kStroke_Style); 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setStrokeWidth(strokeWidth); 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < n; ++i) { 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r; 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath p; 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H, 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rand.nextUScalar1() * W, rand.nextUScalar1() * H); 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(rand.nextU()); 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(r, paint); 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H, 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rand.nextUScalar1() * W, rand.nextUScalar1() * H); 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(rand.nextU()); 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.addOval(r); 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(p, paint); 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar minx = -SkIntToScalar(W)/4; 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar maxx = 5*SkIntToScalar(W)/4; 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar miny = -SkIntToScalar(H)/4; 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar maxy = 5*SkIntToScalar(H)/4; 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(rand.nextU()); 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawLine(randRange(rand, minx, maxx), randRange(rand, miny, maxy), 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot randRange(rand, minx, maxx), randRange(rand, miny, maxy), 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint); 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void show_hair(SkCanvas* canvas, bool doAA) { 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot show_stroke(canvas, doAA, 0, 150); 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void show_thick(SkCanvas* canvas, bool doAA) { 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot show_stroke(canvas, doAA, SkIntToScalar(5), 50); 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottypedef void (*CanvasProc)(SkCanvas*, bool); 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ClipView : public SampleView { 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ClipView() { 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAAClip clip; 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIRect r = { -2, -3, 842, 18 }; 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clip.setRect(r); 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual ~ClipView() { 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // overrides from SkEventSink 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual bool onQuery(SkEvent* evt) { 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (SampleCode::TitleQ(*evt)) { 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SampleCode::TitleR(evt, "Clip"); 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->INHERITED::onQuery(evt); 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual void onDrawContent(SkCanvas* canvas) { 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawColor(SK_ColorWHITE); 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const CanvasProc gProc[] = { 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot show_text, show_thick, show_hair, show_fill 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) }; 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath clipPath; 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.inset(SK_Scalar1 / 4, SK_Scalar1 / 4); 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipPath.addRoundRect(r, SkIntToScalar(20), SkIntToScalar(20)); 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// clipPath.toggleInverseFillType(); 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int aa = 0; aa <= 1; ++aa) { 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t i = 0; i < SK_ARRAY_COUNT(gProc); ++i) { 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->clipPath(clipPath, kIntersect_SkClipOp, SkToBool(aa)); 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// canvas->drawColor(SK_ColorWHITE); 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot gProc[i](canvas, SkToBool(aa)); 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(W * SK_Scalar1 * 8 / 7, 0); 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(0, H * SK_Scalar1 * 8 / 7); 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef SampleView INHERITED; 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////// 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkView* MyFactory() { return new ClipView; } 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkViewRegister reg(MyFactory); 165