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