SampleShaders.cpp revision ae933ce0ea5fd9d21cb6ef2cee7e729d32690aac
11145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org
29e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org/*
39e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org * Copyright 2011 Google Inc.
49e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org *
59e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org * Use of this source code is governed by a BSD-style license that can be
69e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org * found in the LICENSE file.
79e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org */
89e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SampleCode.h"
99e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkView.h"
109e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkCanvas.h"
119e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkGradientShader.h"
129e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkGraphics.h"
139e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkImageDecoder.h"
149e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkPath.h"
159e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkRegion.h"
169e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkShader.h"
179e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkUtils.h"
189e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkXfermode.h"
199e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkComposeShader.h"
209e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkColorPriv.h"
219e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkColorFilter.h"
229e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkTime.h"
239e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkTransparentShader.h"
249e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "SkTypeface.h"
259e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
269e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgstatic SkShader* make_bitmapfade(const SkBitmap& bm)
279e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org{
289e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    SkPoint pts[2];
299e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    SkColor colors[2];
309e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
319e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    pts[0].set(0, 0);
329e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    pts[1].set(0, SkIntToScalar(bm.height()));
339e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    colors[0] = SK_ColorBLACK;
349e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    colors[1] = SkColorSetARGB(0, 0, 0, 0);
359e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
369e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
379e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    SkShader* shaderB = SkShader::CreateBitmapShader(bm,
389e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org                        SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
399e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
409e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    SkXfermode* mode = SkXfermode::Create(SkXfermode::kDstIn_Mode);
419e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
429e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    SkShader* shader = new SkComposeShader(shaderB, shaderA, mode);
43ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    shaderA->unref();
44ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    shaderB->unref();
45ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    mode->unref();
46ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
47ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    return shader;
489e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org}
499e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
509e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgclass ShaderView : public SampleView {
519e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgpublic:
529e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    SkShader*   fShader;
539e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    SkBitmap    fBitmap;
549e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
559e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    ShaderView() {
569e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        SkImageDecoder::DecodeFile("/skimages/logo.gif", &fBitmap);
579e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
589e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        SkPoint pts[2];
599e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        SkColor colors[2];
609e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
619e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        pts[0].set(0, 0);
629e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        pts[1].set(SkIntToScalar(100), 0);
63ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org        colors[0] = SK_ColorRED;
64ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org        colors[1] = SK_ColorBLUE;
65ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org        SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
66ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
67ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org        pts[0].set(0, 0);
689e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        pts[1].set(0, SkIntToScalar(100));
699e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        colors[0] = SK_ColorBLACK;
709e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
719e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
729e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
739e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        SkXfermode* mode = SkXfermode::Create(SkXfermode::kDstIn_Mode);
749e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
759e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        fShader = new SkComposeShader(shaderA, shaderB, mode);
769e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        shaderA->unref();
779e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        shaderB->unref();
789e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        mode->unref();
799e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    }
809e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    virtual ~ShaderView() {
819e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        SkSafeUnref(fShader);
82c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    }
839e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
849e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgprotected:
859e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    // overrides from SkEventSink
869e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    virtual bool onQuery(SkEvent* evt) {
879e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        if (SampleCode::TitleQ(*evt)) {
889e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org            SampleCode::TitleR(evt, "Shaders");
894a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org            return true;
904a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org        }
914a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org        return this->INHERITED::onQuery(evt);
929e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    }
939e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
949e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    virtual void onDrawContent(SkCanvas* canvas) {
959e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        canvas->drawBitmap(fBitmap, 0, 0);
969e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
979e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        canvas->translate(SkIntToScalar(20), SkIntToScalar(120));
98c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
99c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        SkPaint paint;
100c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        SkRect  r;
1019e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1029e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        paint.setColor(SK_ColorGREEN);
1039e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint);
1049e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        paint.setShader(fShader);
1059e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint);
1069e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
107c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        canvas->translate(SkIntToScalar(110), 0);
108c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
109c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        int w = fBitmap.width();
1104d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org        int h = fBitmap.height();
1114d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org        w = 120;
1129e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        h = 80;
1139e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
1149e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1159e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        paint.setShader(NULL);
1169e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        canvas->drawRect(r, paint);
1179e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        paint.setShader(make_bitmapfade(fBitmap))->unref();
1189e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        canvas->drawRect(r, paint);
1199e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1209e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        paint.setShader(new SkTransparentShader)->unref();
1219e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        canvas->drawRect(r, paint);
1229e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    }
1239e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1249e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
1259e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        this->inval(NULL);
1269e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        return this->INHERITED::onFindClickHandler(x, y);
1279e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    }
1289e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1299e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    virtual bool onClick(Click* click) {
1309e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org        return this->INHERITED::onClick(click);
1319e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    }
1329e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1339e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgprivate:
1349e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    typedef SampleView INHERITED;
1359e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org};
1363847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
1373847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com//////////////////////////////////////////////////////////////////////////////
1383847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
1399e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgstatic SkView* MyFactory() { return new ShaderView; }
1409e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgstatic SkViewRegister reg(MyFactory);
1419e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1429e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org