11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SampleCode.h" 90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkView.h" 100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h" 110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkGradientShader.h" 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPath.h" 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRegion.h" 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkShader.h" 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUtils.h" 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkComposeShader.h" 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "Sk1DPathEffect.h" 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCornerPathEffect.h" 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPathMeasure.h" 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRandom.h" 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorPriv.h" 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorFilter.h" 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkLayerRasterizer.h" 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkParsePath.h" 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void testparse() { 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect r; 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger r.set(0, 0, SkFloatToScalar(10), SkFloatToScalar(10.5)); 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPath p, p2; 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkString str, str2; 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.addRect(r); 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkParsePath::ToSVGString(p, &str); 340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkParsePath::FromSVGString(str.c_str(), &p2); 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkParsePath::ToSVGString(p2, &str2); 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass ArcsView : public SampleView { 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ArcsView() { 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger testparse(); 420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fSweep = SkIntToScalar(100); 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->setBGColor(0xFFDDDDDD); 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // overrides from SkEventSink 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onQuery(SkEvent* evt) { 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (SampleCode::TitleQ(*evt)) { 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SampleCode::TitleR(evt, "Arcs"); 510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onQuery(evt); 540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static void drawRectWithLines(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawRect(r, p); 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, p); 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawLine(r.fLeft, r.fBottom, r.fRight, r.fTop, p); 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawLine(r.fLeft, r.centerY(), r.fRight, r.centerY(), p); 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawLine(r.centerX(), r.fTop, r.centerX(), r.fBottom, p); 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static void draw_label(SkCanvas* canvas, const SkRect& rect, 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int start, int sweep) { 660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setAntiAlias(true); 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setTextAlign(SkPaint::kCenter_Align); 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkString str; 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger str.appendS32(start); 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger str.append(", "); 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger str.appendS32(sweep); 760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawText(str.c_str(), str.size(), rect.centerX(), 770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rect.fBottom + paint.getTextSize() * 5/4, paint); 780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static void drawArcs(SkCanvas* canvas) { 810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect r; 830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar w = SkIntToScalar(75); 840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar h = SkIntToScalar(50); 850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger r.set(0, 0, w, h); 870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setAntiAlias(true); 880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStyle(SkPaint::kStroke_Style); 890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->save(); 910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(10), SkIntToScalar(300)); 920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStrokeWidth(SkIntToScalar(1)); 940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static const int gAngles[] = { 960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 0, 360, 970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 0, 45, 980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 0, -45, 990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 720, 135, 1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger -90, 269, 1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger -90, 270, 1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger -90, 271, 1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger -180, -270, 1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 225, 90 1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger }; 1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(gAngles); i += 2) { 1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorBLACK); 1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger drawRectWithLines(canvas, r, paint); 1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorRED); 1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawArc(r, SkIntToScalar(gAngles[i]), 1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkIntToScalar(gAngles[i+1]), false, paint); 1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger draw_label(canvas, r, gAngles[i], gAngles[i+1]); 1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(w * 8 / 7, 0); 1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onDrawContent(SkCanvas* canvas) { 1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fSweep = SampleCode::GetAnimScalar(SkIntToScalar(360)/24, 1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkIntToScalar(360)); 1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger// fSweep = SkFloatToScalar(359.99f); 1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect r; 1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setAntiAlias(true); 1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStrokeWidth(SkIntToScalar(2)); 1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStyle(SkPaint::kStroke_Style); 1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger r.set(0, 0, SkIntToScalar(200), SkIntToScalar(200)); 1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger r.offset(SkIntToScalar(20), SkIntToScalar(20)); 1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (false) { 1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const SkScalar d = SkIntToScalar(3); 1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const SkScalar rad[] = { d, d, d, d, d, d, d, d }; 1410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPath path; 1420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.addRoundRect(r, rad); 1430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPath(path, paint); 1440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return; 1450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger drawRectWithLines(canvas, r, paint); 1480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // printf("----- sweep %g %X\n", SkScalarToFloat(fSweep), SkDegreesToRadians(fSweep)); 1500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStyle(SkPaint::kFill_Style); 1530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(0x800000FF); 1540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawArc(r, 0, fSweep, true, paint); 1550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(0x800FF000); 1570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawArc(r, 0, fSweep, false, paint); 1580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStyle(SkPaint::kStroke_Style); 1600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorRED); 1610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawArc(r, 0, fSweep, true, paint); 1620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStrokeWidth(0); 1640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorBLUE); 1650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawArc(r, 0, fSweep, false, paint); 1660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger drawArcs(canvas); 1680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->inval(NULL); 1690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { 1720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // fSweep += SK_Scalar1; 1730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->inval(NULL); 1740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onFindClickHandler(x, y); 1750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onClick(Click* click) { 1780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onClick(click); 1790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 1820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar fSweep; 1830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef SampleView INHERITED; 1850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 1860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger////////////////////////////////////////////////////////////////////////////// 1880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new ArcsView; } 1900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory); 1910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 192