/* * 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 "SkView.h" #include "SkCanvas.h" #include "SkGraphics.h" #include "SkRandom.h" #include "SkDashPathEffect.h" #include "SkShader.h" static void setBitmapDash(SkPaint* paint, int width) { SkColor c = paint->getColor(); SkBitmap bm; bm.allocN32Pixels(2, 1); bm.lockPixels(); *bm.getAddr32(0, 0) = SkPreMultiplyARGB(0xFF, SkColorGetR(c), SkColorGetG(c), SkColorGetB(c)); *bm.getAddr32(1, 0) = 0; bm.unlockPixels(); SkMatrix matrix; matrix.setScale(SkIntToScalar(width), SK_Scalar1); SkShader* s = SkShader::CreateBitmapShader(bm, SkShader::kRepeat_TileMode, SkShader::kClamp_TileMode, &matrix); paint->setShader(s)->unref(); } class DashView : public SampleView { public: DashView() { this->setBGColor(0xFFDDDDDD); } protected: // overrides from SkEventSink virtual bool onQuery(SkEvent* evt) { if (SampleCode::TitleQ(*evt)) { SampleCode::TitleR(evt, "Dash"); return true; } return this->INHERITED::onQuery(evt); } virtual void onDrawContent(SkCanvas* canvas) { static const char* gStr[] = { "11", "44", "112233", "411327463524", }; SkPaint paint; paint.setStrokeWidth(SkIntToScalar(1)); SkScalar x0 = SkIntToScalar(10); SkScalar y0 = SkIntToScalar(10); SkScalar x1 = x0 + SkIntToScalar(1000); for (size_t i = 0; i < SK_ARRAY_COUNT(gStr); i++) { SkScalar interval[12]; size_t len = SkMin32(strlen(gStr[i]), SK_ARRAY_COUNT(interval)); for (size_t j = 0; j < len; j++) { interval[j] = SkIntToScalar(gStr[i][j] - '0'); } SkDashPathEffect dash(interval, len, 0); paint.setPathEffect(&dash); canvas->drawLine(x0, y0, x1, y0, paint); paint.setPathEffect(nullptr); y0 += paint.getStrokeWidth() * 3; } setBitmapDash(&paint, 3); canvas->drawLine(x0, y0, x1, y0, paint); } private: typedef SampleView INHERITED; }; ////////////////////////////////////////////////////////////////////////////// static SkView* MyFactory() { return new DashView; } static SkViewRegister reg(MyFactory);