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