1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SampleCode.h" 9b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h" 10ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com#include "SkBlurDrawLooper.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPath.h" 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPathMeasure.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 15ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com#define REPEAT_COUNT 1 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 17ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.comstatic void textStrokePath(SkCanvas* canvas) { 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 19ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com SkPath path; 20ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com SkRect rect; 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 22ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com canvas->save(); 23ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com canvas->scale(SkIntToScalar(250),SkIntToScalar(250)); 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 254b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org rect.set(0.0f, 0.21f, 264b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 0.78f, 0.99f); 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 28ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com path.addArc(rect, SkIntToScalar(280), SkIntToScalar(350)); 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setAntiAlias(true); 31ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com paint.setStyle(SkPaint::kStroke_Style); 32ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com paint.setColor(0xFFFF0000); 334b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org paint.setTextSize(0.085f); 344b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org paint.setStrokeWidth(.005f); 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 36ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com canvas->drawPath(path, paint); 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3873cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org paint.setLooper(SkBlurDrawLooper::Create(SK_ColorBLACK, 3973cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org SkBlurMask::ConvertRadiusToSigma(0.002f), 4073cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org 0.0f, 4173cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org 0.0f))->unref(); 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 43ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com const char* text = "DRAWING STROKED TEXT WITH A BLUR ON A PATH"; 44ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com size_t len = strlen(text); 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 46c6ce750c73c6586a5c2e88a0620b04e9569af401robertphillips@google.com canvas->drawTextOnPathHV(text, len, path, 0, 474b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org -0.025f, paint); 48ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com canvas->restore(); 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 51ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.comstatic void textPathMatrix(SkCanvas* canvas) { 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPath path; 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMatrix matrix; 55ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 56ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com path.moveTo(SkIntToScalar(050), SkIntToScalar(200)); 57ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com path.quadTo(SkIntToScalar(250), SkIntToScalar(000), 58ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com SkIntToScalar(450), SkIntToScalar(200)); 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setAntiAlias(true); 61ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setStyle(SkPaint::kStroke_Style); 63ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com canvas->drawPath(path, paint); 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setStyle(SkPaint::kFill_Style); 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setTextSize(SkIntToScalar(48)); 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setTextAlign(SkPaint::kRight_Align); 67ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 68f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com const char* text = "Reflection"; 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t len = strlen(text); 70ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com 71ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com SkPathMeasure meas(path, false); 72ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com SkScalar pathLen = meas.getLength(); 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawTextOnPath(text, len, path, NULL, paint); 75ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(SK_ColorRED); 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix.setScale(-SK_Scalar1, SK_Scalar1); 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix.postTranslate(pathLen, 0); 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawTextOnPath(text, len, path, &matrix, paint); 80ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(SK_ColorBLUE); 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix.setScale(SK_Scalar1, -SK_Scalar1); 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawTextOnPath(text, len, path, &matrix, paint); 84ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(SK_ColorGREEN); 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix.setScale(-SK_Scalar1, -SK_Scalar1); 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix.postTranslate(pathLen, 0); 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawTextOnPath(text, len, path, &matrix, paint); 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 91f21833999d90ad9c8c584cff3238797b39cfc00breed@google.comclass TextOnPathView : public SampleView { 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPath fPath; 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScalar fHOffset; 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 96ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com TextOnPathView() { 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRect r; 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.set(SkIntToScalar(100), SkIntToScalar(100), 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIntToScalar(300), SkIntToScalar(300)); 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPath.addOval(r); 101ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com fPath.offset(SkIntToScalar(-50), SkIntToScalar(-50)); 102f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fHOffset = SkIntToScalar(50); 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // overrides from SkEventSink 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool onQuery(SkEvent* evt) { 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SampleCode::TitleQ(*evt)) { 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SampleCode::TitleR(evt, "Text On Path"); 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->INHERITED::onQuery(evt); 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 115ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 116f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com virtual void onDrawContent(SkCanvas* canvas) { 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setAntiAlias(true); 119ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com paint.setTextSize(SkIntToScalar(48)); 120ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com 121ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com const char* text = "Hamburgefons"; 122ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com size_t len = strlen(text); 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for (int j = 0; j < REPEAT_COUNT; j++) { 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScalar x = fHOffset; 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(SK_ColorBLACK); 128ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com canvas->drawTextOnPathHV(text, len, fPath, 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com x, paint.getTextSize()/2, paint); 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(SK_ColorRED); 132ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com canvas->drawTextOnPathHV(text, len, fPath, 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com x + SkIntToScalar(50), 0, paint); 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(SK_ColorBLUE); 136ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com canvas->drawTextOnPathHV(text, len, fPath, 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com x + SkIntToScalar(100), -paint.getTextSize()/2, paint); 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 139ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(SK_ColorGREEN); 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setStyle(SkPaint::kStroke_Style); 142ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com canvas->drawPath(fPath, paint); 143ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 144ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com canvas->translate(SkIntToScalar(275), 0); 145ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com textStrokePath(canvas); 146ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com 147ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com canvas->translate(SkIntToScalar(-275), SkIntToScalar(250)); 148ae8ae3d1a2e5a22f42453a02533981f886327c37djsollen@google.com textPathMatrix(canvas); 149ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (REPEAT_COUNT > 1) 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->inval(NULL); 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 153ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1544d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) SK_OVERRIDE { 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fHints += 1; 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->inval(NULL); 1574d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com return this->INHERITED::onFindClickHandler(x, y, modi); 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 159ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool onClick(Click* click) { 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->INHERITED::onClick(click); 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 163ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int fHints; 166f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com typedef SampleView INHERITED; 1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////// 1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { 1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return new TextOnPathView; 1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory); 176