| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| #include "SampleCode.h" |
| #include "SkBlurMask.h" |
| #include "SkBlurDrawLooper.h" |
| #include "SkCanvas.h" |
| #include "SkPath.h" |
| #include "SkPathMeasure.h" |
| |
| #define REPEAT_COUNT 1 |
| |
| static void textStrokePath(SkCanvas* canvas) { |
| SkPaint paint; |
| SkPath path; |
| SkRect rect; |
| |
| canvas->save(); |
| canvas->scale(SkIntToScalar(250),SkIntToScalar(250)); |
| |
| rect.set(0.0f, 0.21f, |
| 0.78f, 0.99f); |
| |
| path.addArc(rect, SkIntToScalar(280), SkIntToScalar(350)); |
| |
| paint.setAntiAlias(true); |
| paint.setStyle(SkPaint::kStroke_Style); |
| paint.setColor(0xFFFF0000); |
| paint.setTextSize(0.085f); |
| paint.setStrokeWidth(.005f); |
| |
| canvas->drawPath(path, paint); |
| |
| paint.setLooper(SkBlurDrawLooper::Make(SK_ColorBLACK, SkBlurMask::ConvertRadiusToSigma(0.002f), |
| 0.0f, 0.0f)); |
| |
| const char* text = "DRAWING STROKED TEXT WITH A BLUR ON A PATH"; |
| size_t len = strlen(text); |
| |
| canvas->drawTextOnPathHV(text, len, path, 0, |
| -0.025f, paint); |
| canvas->restore(); |
| } |
| |
| static void textPathMatrix(SkCanvas* canvas) { |
| SkPaint paint; |
| SkPath path; |
| SkMatrix matrix; |
| |
| path.moveTo(SkIntToScalar(050), SkIntToScalar(200)); |
| path.quadTo(SkIntToScalar(250), SkIntToScalar(000), |
| SkIntToScalar(450), SkIntToScalar(200)); |
| |
| paint.setAntiAlias(true); |
| |
| paint.setStyle(SkPaint::kStroke_Style); |
| canvas->drawPath(path, paint); |
| paint.setStyle(SkPaint::kFill_Style); |
| paint.setTextSize(SkIntToScalar(48)); |
| paint.setTextAlign(SkPaint::kRight_Align); |
| |
| const char* text = "Reflection"; |
| size_t len = strlen(text); |
| |
| SkPathMeasure meas(path, false); |
| SkScalar pathLen = meas.getLength(); |
| |
| canvas->drawTextOnPath(text, len, path, nullptr, paint); |
| |
| paint.setColor(SK_ColorRED); |
| matrix.setScale(-SK_Scalar1, SK_Scalar1); |
| matrix.postTranslate(pathLen, 0); |
| canvas->drawTextOnPath(text, len, path, &matrix, paint); |
| |
| paint.setColor(SK_ColorBLUE); |
| matrix.setScale(SK_Scalar1, -SK_Scalar1); |
| canvas->drawTextOnPath(text, len, path, &matrix, paint); |
| |
| paint.setColor(SK_ColorGREEN); |
| matrix.setScale(-SK_Scalar1, -SK_Scalar1); |
| matrix.postTranslate(pathLen, 0); |
| canvas->drawTextOnPath(text, len, path, &matrix, paint); |
| } |
| |
| class TextOnPathView : public SampleView { |
| public: |
| SkPath fPath; |
| SkScalar fHOffset; |
| |
| protected: |
| void onOnceBeforeDraw() override { |
| SkRect r; |
| r.set(SkIntToScalar(100), SkIntToScalar(100), |
| SkIntToScalar(300), SkIntToScalar(300)); |
| fPath.addOval(r); |
| fPath.offset(SkIntToScalar(-50), SkIntToScalar(-50)); |
| |
| fHOffset = SkIntToScalar(50); |
| } |
| |
| // overrides from SkEventSink |
| bool onQuery(SkEvent* evt) override { |
| if (SampleCode::TitleQ(*evt)) { |
| SampleCode::TitleR(evt, "Text On Path"); |
| return true; |
| } |
| return this->INHERITED::onQuery(evt); |
| } |
| |
| void onDrawContent(SkCanvas* canvas) override { |
| SkPaint paint; |
| paint.setAntiAlias(true); |
| paint.setTextSize(SkIntToScalar(48)); |
| |
| const char* text = "Hamburgefons"; |
| size_t len = strlen(text); |
| |
| for (int j = 0; j < REPEAT_COUNT; j++) { |
| SkScalar x = fHOffset; |
| |
| paint.setColor(SK_ColorBLACK); |
| canvas->drawTextOnPathHV(text, len, fPath, |
| x, paint.getTextSize()/2, paint); |
| |
| paint.setColor(SK_ColorRED); |
| canvas->drawTextOnPathHV(text, len, fPath, |
| x + SkIntToScalar(50), 0, paint); |
| |
| paint.setColor(SK_ColorBLUE); |
| canvas->drawTextOnPathHV(text, len, fPath, |
| x + SkIntToScalar(100), -paint.getTextSize()/2, paint); |
| } |
| |
| paint.setColor(SK_ColorGREEN); |
| paint.setStyle(SkPaint::kStroke_Style); |
| canvas->drawPath(fPath, paint); |
| |
| canvas->translate(SkIntToScalar(275), 0); |
| textStrokePath(canvas); |
| |
| canvas->translate(SkIntToScalar(-275), SkIntToScalar(250)); |
| textPathMatrix(canvas); |
| } |
| |
| SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override { |
| fHints += 1; |
| return this->INHERITED::onFindClickHandler(x, y, modi); |
| } |
| |
| private: |
| int fHints; |
| typedef SampleView INHERITED; |
| }; |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| static SkView* MyFactory() { |
| return new TextOnPathView; |
| } |
| |
| static SkViewRegister reg(MyFactory); |