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 */
87a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com#include "SampleCode.h"
97a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com#include "SkView.h"
107a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com#include "SkCanvas.h"
117a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com#include "SkGraphics.h"
127a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com#include "SkRandom.h"
137a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com#include "SkDashPathEffect.h"
147a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com#include "SkShader.h"
157a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
167a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.comstatic void setBitmapDash(SkPaint* paint, int width) {
177a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    SkColor c = paint->getColor();
187a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
197a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    SkBitmap bm;
20a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org    bm.allocN32Pixels(2, 1);
217a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    bm.lockPixels();
227a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    *bm.getAddr32(0, 0) = SkPreMultiplyARGB(0xFF, SkColorGetR(c),
237a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com                                            SkColorGetG(c), SkColorGetB(c));
247a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    *bm.getAddr32(1, 0) = 0;
257a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    bm.unlockPixels();
267a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
277a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    SkMatrix matrix;
287a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    matrix.setScale(SkIntToScalar(width), SK_Scalar1);
297a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
307a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    SkShader* s = SkShader::CreateBitmapShader(bm, SkShader::kRepeat_TileMode,
319c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                               SkShader::kClamp_TileMode, &matrix);
327a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
337a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    paint->setShader(s)->unref();
347a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com}
357a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
367a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.comclass DashView : public SampleView {
377a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.compublic:
387a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    DashView() {
397a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        this->setBGColor(0xFFDDDDDD);
407a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    }
41ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
427a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.comprotected:
437a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    // overrides from SkEventSink
447a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    virtual bool onQuery(SkEvent* evt) {
457a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        if (SampleCode::TitleQ(*evt)) {
467a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            SampleCode::TitleR(evt, "Dash");
477a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            return true;
487a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        }
497a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        return this->INHERITED::onQuery(evt);
507a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    }
517a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
527a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    virtual void onDrawContent(SkCanvas* canvas) {
537a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        static const char* gStr[] = {
547a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            "11",
557a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            "44",
567a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            "112233",
577a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            "411327463524",
587a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        };
597a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
607a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        SkPaint paint;
617a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        paint.setStrokeWidth(SkIntToScalar(1));
627a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
637a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        SkScalar x0 = SkIntToScalar(10);
647a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        SkScalar y0 = SkIntToScalar(10);
657a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        SkScalar x1 = x0 + SkIntToScalar(1000);
667a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        for (size_t i = 0; i < SK_ARRAY_COUNT(gStr); i++) {
677a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            SkScalar interval[12];
687a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            size_t len = SkMin32(strlen(gStr[i]), SK_ARRAY_COUNT(interval));
697a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            for (size_t j = 0; j < len; j++) {
707a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com                interval[j] = SkIntToScalar(gStr[i][j] - '0');
717a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            }
72ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
737a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            SkDashPathEffect dash(interval, len, 0);
747a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            paint.setPathEffect(&dash);
757a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            canvas->drawLine(x0, y0, x1, y0, paint);
767a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            paint.setPathEffect(NULL);
777a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
787a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com            y0 += paint.getStrokeWidth() * 3;
797a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        }
807a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
817a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        setBitmapDash(&paint, 3);
827a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com        canvas->drawLine(x0, y0, x1, y0, paint);
837a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    }
847a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
857a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.comprivate:
867a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com    typedef SampleView INHERITED;
877a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com};
887a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
897a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com//////////////////////////////////////////////////////////////////////////////
907a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.com
917a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.comstatic SkView* MyFactory() { return new DashView; }
927a253379e7c420002c0fa93ac05a1bffbb5d557dreed@google.comstatic SkViewRegister reg(MyFactory);
93