11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SampleCode.h" 90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h" 100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkView.h" 110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "Sk1DPathEffect.h" 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "Sk2DPathEffect.h" 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkAvoidXfermode.h" 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkBlurMaskFilter.h" 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorFilter.h" 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorPriv.h" 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCornerPathEffect.h" 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkDashPathEffect.h" 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkDiscretePathEffect.h" 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkEmbossMaskFilter.h" 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkGradientShader.h" 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkImageDecoder.h" 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkLayerRasterizer.h" 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkMath.h" 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPath.h" 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRegion.h" 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkShader.h" 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkComposeShader.h" 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCornerPathEffect.h" 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPathMeasure.h" 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPicture.h" 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRandom.h" 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTransparentShader.h" 340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTypeface.h" 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUnitMappers.h" 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUtils.h" 370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkXfermode.h" 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include <math.h> 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic inline SkPMColor rgb2gray(SkPMColor c) { 420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger unsigned r = SkGetPackedR32(c); 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger unsigned g = SkGetPackedG32(c); 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger unsigned b = SkGetPackedB32(c); 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger unsigned x = (r * 5 + g * 7 + b * 4) >> 4; 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return SkPackARGB32(0, x, x, x) | (c & (SK_A32_MASK << SK_A32_SHIFT)); 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkGrayScaleColorFilter : public SkColorFilter { 520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void filterSpan(const SkPMColor src[], int count, SkPMColor result[]) { 540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int i = 0; i < count; i++) 550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger result[i] = rgb2gray(src[i]); 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkChannelMaskColorFilter : public SkColorFilter { 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkChannelMaskColorFilter(U8CPU redMask, U8CPU greenMask, U8CPU blueMask) { 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fMask = SkPackARGB32(0xFF, redMask, greenMask, blueMask); 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void filterSpan(const SkPMColor src[], int count, SkPMColor result[]) { 660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPMColor mask = fMask; 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int i = 0; i < count; i++) { 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger result[i] = src[i] & mask; 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPMColor fMask; 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/////////////////////////////////////////////////////////// 770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r0(SkLayerRasterizer* rast, SkPaint& p) { 790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setMaskFilter(SkBlurMaskFilter::Create(SkIntToScalar(3), 800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBlurMaskFilter::kNormal_BlurStyle))->unref(); 810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3)); 820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setMaskFilter(NULL); 840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStyle(SkPaint::kStroke_Style); 850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStrokeWidth(SK_Scalar1); 860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setAlpha(0x11); 890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStyle(SkPaint::kFill_Style); 900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermodeMode(SkXfermode::kSrc_Mode); 910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r1(SkLayerRasterizer* rast, SkPaint& p) { 950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setAlpha(0x40); 980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermodeMode(SkXfermode::kSrc_Mode); 990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStyle(SkPaint::kStroke_Style); 1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStrokeWidth(SK_Scalar1*2); 1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r2(SkLayerRasterizer* rast, SkPaint& p) { 1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStyle(SkPaint::kStrokeAndFill_Style); 1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStrokeWidth(SK_Scalar1*4); 1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStyle(SkPaint::kStroke_Style); 1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStrokeWidth(SK_Scalar1*3/2); 1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermodeMode(SkXfermode::kClear_Mode); 1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r3(SkLayerRasterizer* rast, SkPaint& p) { 1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStyle(SkPaint::kStroke_Style); 1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStrokeWidth(SK_Scalar1*3); 1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setAlpha(0x20); 1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStyle(SkPaint::kFill_Style); 1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermodeMode(SkXfermode::kSrc_Mode); 1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r4(SkLayerRasterizer* rast, SkPaint& p) { 1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setAlpha(0x60); 1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3)); 1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setAlpha(0xFF); 1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermodeMode(SkXfermode::kClear_Mode); 1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2); 1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermode(NULL); 1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r5(SkLayerRasterizer* rast, SkPaint& p) { 1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setPathEffect(new SkDiscretePathEffect(SK_Scalar1*4, SK_Scalar1*3))->unref(); 1420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermodeMode(SkXfermode::kSrcOut_Mode); 1430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 1440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r6(SkLayerRasterizer* rast, SkPaint& p) { 1470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 1480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setAntiAlias(false); 1500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkLayerRasterizer* rast2 = new SkLayerRasterizer; 1510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger r5(rast2, p); 1520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setRasterizer(rast2)->unref(); 1530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermodeMode(SkXfermode::kClear_Mode); 1540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 1550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass Dot2DPathEffect : public Sk2DPathEffect { 1580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 1590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger Dot2DPathEffect(SkScalar radius, const SkMatrix& matrix) 1600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger : Sk2DPathEffect(matrix), fRadius(radius) {} 1610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void flatten(SkFlattenableWriteBuffer& buffer) { 1630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->INHERITED::flatten(buffer); 1640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger buffer.writeScalar(fRadius); 1660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual Factory getFactory() { return CreateProc; } 1680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 1700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void next(const SkPoint& loc, int u, int v, SkPath* dst) { 1710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger dst->addCircle(loc.fX, loc.fY, fRadius); 1720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger Dot2DPathEffect(SkFlattenableReadBuffer& buffer) : Sk2DPathEffect(buffer) { 1750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fRadius = buffer.readScalar(); 1760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 1780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar fRadius; 1790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { 1810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return new Dot2DPathEffect(buffer); 1820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef Sk2DPathEffect INHERITED; 1850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 1860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r7(SkLayerRasterizer* rast, SkPaint& p) { 1880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkMatrix lattice; 1890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0); 1900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger lattice.postSkew(SK_Scalar1/3, 0, 0, 0); 1910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setPathEffect(new Dot2DPathEffect(SK_Scalar1*4, lattice))->unref(); 1920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 1930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r8(SkLayerRasterizer* rast, SkPaint& p) { 1960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 1970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkMatrix lattice; 1990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0); 2000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger lattice.postSkew(SK_Scalar1/3, 0, 0, 0); 2010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setPathEffect(new Dot2DPathEffect(SK_Scalar1*2, lattice))->unref(); 2020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermodeMode(SkXfermode::kClear_Mode); 2030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 2040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setPathEffect(NULL); 2060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermode(NULL); 2070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStyle(SkPaint::kStroke_Style); 2080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStrokeWidth(SK_Scalar1); 2090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 2100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 2110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass Line2DPathEffect : public Sk2DPathEffect { 2130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 2140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger Line2DPathEffect(SkScalar width, const SkMatrix& matrix) 2150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger : Sk2DPathEffect(matrix), fWidth(width) {} 2160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width) { 2180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (this->INHERITED::filterPath(dst, src, width)) { 2190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *width = fWidth; 2200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 2210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return false; 2230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual Factory getFactory() { return CreateProc; } 2260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void flatten(SkFlattenableWriteBuffer& buffer) { 2270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->INHERITED::flatten(buffer); 2280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger buffer.writeScalar(fWidth); 2290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 2310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void nextSpan(int u, int v, int ucount, SkPath* dst) { 2320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (ucount > 1) { 2330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint src[2], dstP[2]; 2340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger src[0].set(SkIntToScalar(u) + SK_ScalarHalf, 2360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkIntToScalar(v) + SK_ScalarHalf); 2370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger src[1].set(SkIntToScalar(u+ucount) + SK_ScalarHalf, 2380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkIntToScalar(v) + SK_ScalarHalf); 2390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->getMatrix().mapPoints(dstP, src, 2); 2400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger dst->moveTo(dstP[0]); 2420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger dst->lineTo(dstP[1]); 2430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger Line2DPathEffect(SkFlattenableReadBuffer& buffer) : Sk2DPathEffect(buffer) { 2470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fWidth = buffer.readScalar(); 2480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 2510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar fWidth; 2520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { return new Line2DPathEffect(buffer); } 2540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef Sk2DPathEffect INHERITED; 2560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 2570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void r9(SkLayerRasterizer* rast, SkPaint& p) { 2590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 2600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkMatrix lattice; 2620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0); 2630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger lattice.postRotate(SkIntToScalar(30), 0, 0); 2640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setPathEffect(new Line2DPathEffect(SK_Scalar1*2, lattice))->unref(); 2650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermodeMode(SkXfermode::kClear_Mode); 2660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 2670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setPathEffect(NULL); 2690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setXfermode(NULL); 2700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStyle(SkPaint::kStroke_Style); 2710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setStrokeWidth(SK_Scalar1); 2720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger rast->addLayer(p); 2730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 2740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergertypedef void (*raster_proc)(SkLayerRasterizer*, SkPaint&); 2760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic const raster_proc gRastProcs[] = { 2780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger r0, r1, r2, r3, r4, r5, r6, r7, r8, r9 2790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 2800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic const struct { 2820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColor fMul, fAdd; 2830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} gLightingColors[] = { 2840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 0x808080, 0x800000 }, // general case 2850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 0x707070, 0x707070 }, // no-pin case 2860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 0xFFFFFF, 0x800000 }, // just-add case 2870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 0x808080, 0x000000 }, // just-mul case 2880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 0xFFFFFF, 0x000000 } // identity case 2890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 2900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic unsigned color_dist16(uint16_t a, uint16_t b) { 2920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger unsigned dr = SkAbs32(SkPacked16ToR32(a) - SkPacked16ToR32(b)); 2930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger unsigned dg = SkAbs32(SkPacked16ToG32(a) - SkPacked16ToG32(b)); 2940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger unsigned db = SkAbs32(SkPacked16ToB32(a) - SkPacked16ToB32(b)); 2950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return SkMax32(dr, SkMax32(dg, db)); 2970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 2980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic unsigned scale_dist(unsigned dist, unsigned scale) { 3000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger dist >>= 6; 3010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger dist = (dist << 2) | dist; 3020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger dist = (dist << 4) | dist; 3030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return dist; 3040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger// return SkAlphaMul(dist, scale); 3060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 3070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void apply_shader(SkPaint* paint, int index) { 3090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger raster_proc proc = gRastProcs[index]; 3100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (proc) { 3110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint p; 3120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkLayerRasterizer* rast = new SkLayerRasterizer; 3130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p.setAntiAlias(true); 3150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger proc(rast, p); 3160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint->setRasterizer(rast)->unref(); 3170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#if 1 3200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar dir[] = { SK_Scalar1, SK_Scalar1, SK_Scalar1 }; 3210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint->setMaskFilter(SkBlurMaskFilter::CreateEmboss(dir, SK_Scalar1/4, SkIntToScalar(4), SkIntToScalar(3)))->unref(); 3220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint->setColor(SK_ColorBLUE); 3230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif 3240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 3250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass DemoView : public SampleView { 3270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 3280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger DemoView() {} 3290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 3310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // overrides from SkEventSink 3320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onQuery(SkEvent* evt) { 3330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (SampleCode::TitleQ(*evt)) { 3340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SampleCode::TitleR(evt, "Demo"); 3350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 3360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onQuery(evt); 3380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onClick(Click* click) { 3410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onClick(click); 3420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger void makePath(SkPath& path) { 3450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.addCircle(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(20), 3460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPath::kCCW_Direction); 3470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int index = 0; index < 10; index++) { 3480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar x = SkFloatToScalar(cos(index / 10.0f * 2 * 3.1415925358f)); 3490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar y = SkFloatToScalar(sin(index / 10.0f * 2 * 3.1415925358f)); 3500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger x *= index & 1 ? 7 : 14; 3510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger y *= index & 1 ? 7 : 14; 3520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger x += SkIntToScalar(20); 3530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger y += SkIntToScalar(20); 3540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (index == 0) 3550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.moveTo(x, y); 3560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger else 3570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.lineTo(x, y); 3580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.close(); 3600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onDrawContent(SkCanvas* canvas) { 3630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->save(); 3640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger drawPicture(canvas, 0); 3650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 3660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 3680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPicture picture; 3690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkCanvas* record = picture.beginRecording(320, 480); 3700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger drawPicture(record, 120); 3710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(0, SkIntToScalar(120)); 3720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect clip; 3740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clip.set(0, 0, SkIntToScalar(160), SkIntToScalar(160)); 3750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger do { 3760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->save(); 3770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->clipRect(clip); 3780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger picture.draw(canvas); 3790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 3800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (clip.fRight < SkIntToScalar(320)) 3810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clip.offset(SkIntToScalar(160), 0); 3820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger else if (clip.fBottom < SkIntToScalar(480)) 3830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clip.offset(-SkIntToScalar(320), SkIntToScalar(160)); 3840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger else 3850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger break; 3860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } while (true); 3870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger void drawPicture(SkCanvas* canvas, int spriteOffset) { 3910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkMatrix matrix; matrix.reset(); 3920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 3930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPath path; 3940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint start = {0, 0}; 3950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint stop = { SkIntToScalar(40), SkIntToScalar(40) }; 3960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect rect = {0, 0, SkIntToScalar(40), SkIntToScalar(40) }; 3970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect rect2 = {0, 0, SkIntToScalar(65), SkIntToScalar(20) }; 3980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar left = 0, top = 0, x = 0, y = 0; 3990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger size_t index; 4000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 4010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger char ascii[] = "ascii..."; 4020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger size_t asciiLength = sizeof(ascii) - 1; 4030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger char utf8[] = "utf8" "\xe2\x80\xa6"; 4040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger short utf16[] = {'u', 't', 'f', '1', '6', 0x2026 }; 4050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger short utf16simple[] = {'u', 't', 'f', '1', '6', '!' }; 4060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 4070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger makePath(path); 4080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkTDArray<SkPoint>(pos); 4090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger pos.setCount(asciiLength); 4100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (index = 0; index < asciiLength; index++) 4110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger pos[index].set(SkIntToScalar(index * 10), SkIntToScalar(index * 2)); 4120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkTDArray<SkPoint>(pos2); 4130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger pos2.setCount(asciiLength); 4140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (index = 0; index < asciiLength; index++) 4150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger pos2[index].set(SkIntToScalar(index * 10), SkIntToScalar(20)); 4160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 4170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // shaders 4180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint linearPoints[] = { { 0, 0, }, { SkIntToScalar(40), SkIntToScalar(40) } }; 4190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColor linearColors[] = { SK_ColorRED, SK_ColorBLUE }; 4200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar* linearPos = NULL; 4210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int linearCount = 2; 4220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader::TileMode linearMode = SkShader::kMirror_TileMode; 4230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkUnitMapper* linearMapper = new SkDiscreteMapper(3); 4240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAutoUnref unmapLinearMapper(linearMapper); 4250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader* linear = SkGradientShader::CreateLinear(linearPoints, 4260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger linearColors, linearPos, linearCount, linearMode, linearMapper); 4270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 4280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint radialCenter = { SkIntToScalar(25), SkIntToScalar(25) }; 4290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar radialRadius = SkIntToScalar(25); 4300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColor radialColors[] = { SK_ColorGREEN, SK_ColorGRAY, SK_ColorRED }; 4310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar radialPos[] = { 0, SkIntToScalar(3) / 5, SkIntToScalar(1)}; 4320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int radialCount = 3; 4330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader::TileMode radialMode = SkShader::kRepeat_TileMode; 4340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkUnitMapper* radialMapper = new SkCosineMapper(); 4350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAutoUnref unmapRadialMapper(radialMapper); 4360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader* radial = SkGradientShader::CreateRadial(radialCenter, 4370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger radialRadius, radialColors, radialPos, radialCount, 4380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger radialMode, radialMapper); 4390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 4400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkTransparentShader* transparentShader = new SkTransparentShader(); 4410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkEmbossMaskFilter::Light light; 4420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger light.fDirection[0] = SK_Scalar1/2; 4430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger light.fDirection[1] = SK_Scalar1/2; 4440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger light.fDirection[2] = SK_Scalar1/3; 4450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger light.fAmbient = 0x48; 4460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger light.fSpecular = 0x80; 4470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar radius = SkIntToScalar(12)/5; 4480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkEmbossMaskFilter* embossFilter = new SkEmbossMaskFilter(light, 4490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger radius); 4500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 4510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkXfermode* xfermode = SkXfermode::Create(SkXfermode::kXor_Mode); 4520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColorFilter* lightingFilter = SkColorFilter::CreateLightingFilter( 4530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 0xff89bc45, 0xff112233); 4540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 4550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->save(); 4560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(0), SkIntToScalar(5)); 4570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setFlags(SkPaint::kAntiAlias_Flag | SkPaint::kFilterBitmap_Flag); 4580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // !!! draw through a clip 4590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorLTGRAY); 4600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStyle(SkPaint::kFill_Style); 4610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect clip = {0, 0, SkIntToScalar(320), SkIntToScalar(120)}; 4620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->clipRect(clip); 4630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setShader(SkShader::CreateBitmapShader(fTx, 4640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader::kMirror_TileMode, SkShader::kRepeat_TileMode))->unref(); 4650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPaint(paint); 4660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->save(); 4670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 4680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // line (exercises xfermode, colorShader, colorFilter, filterShader) 4690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorGREEN); 4700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStrokeWidth(SkIntToScalar(10)); 4710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStyle(SkPaint::kStroke_Style); 4720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setXfermode(xfermode)->unref(); 4730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColorFilter(lightingFilter)->unref(); 4740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawLine(start.fX, start.fY, stop.fX, stop.fY, paint); // should not be green 4750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setXfermode(NULL); 4760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColorFilter(NULL); 4770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 4780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // rectangle 4790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStyle(SkPaint::kFill_Style); 4800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(50), 0); 4810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorYELLOW); 4820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setShader(linear)->unref(); 4830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setPathEffect(pathEffectTest())->unref(); 4840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawRect(rect, paint); 4850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setPathEffect(NULL); 4860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 4870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // circle w/ emboss & transparent (exercises 3dshader) 4880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(50), 0); 4890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setMaskFilter(embossFilter)->unref(); 4900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawOval(rect, paint); 4910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); 4920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setShader(transparentShader)->unref(); 4930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawOval(rect, paint); 4940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(0, SkIntToScalar(-10)); 4950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 4960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // path 4970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(50), 0); 4980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorRED); 4990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStyle(SkPaint::kStroke_Style); 5000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStrokeWidth(SkIntToScalar(5)); 5010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setShader(radial)->unref(); 5020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setMaskFilter(NULL); 5030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPath(path, paint); 5040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 5050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setShader(NULL); 5060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // bitmap, sprite 5070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(50), 0); 5080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStyle(SkPaint::kFill_Style); 5090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawBitmap(fBug, left, top, &paint); 5100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(30), 0); 5110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawSprite(fTb, 5120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalarRound(canvas->getTotalMatrix().getTranslateX()), 5130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger spriteOffset + 10, &paint); 5140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 5150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(-SkIntToScalar(30), SkIntToScalar(30)); 5160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setShader(shaderTest())->unref(); // test compose shader 5170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawRect(rect2, paint); 5180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setShader(NULL); 5190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 5200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 5210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // text 5220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(0, SkIntToScalar(60)); 5230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->save(); 5240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorGRAY); 5250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPosText(ascii, asciiLength, pos.begin(), paint); 5260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPosText(ascii, asciiLength, pos2.begin(), paint); 5270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 5280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(50), 0); 5290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorCYAN); 5300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawText(utf8, sizeof(utf8) - 1, x, y, paint); 5310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 5320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(30), 0); 5330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorMAGENTA); 5340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setTextEncoding(SkPaint::kUTF16_TextEncoding); 5350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger matrix.setTranslate(SkIntToScalar(10), SkIntToScalar(10)); 5360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawTextOnPath((void*) utf16, sizeof(utf16), path, &matrix, paint); 5370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(0, SkIntToScalar(20)); 5380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawTextOnPath((void*) utf16simple, sizeof(utf16simple), path, &matrix, paint); 5390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 5400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 5410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(0, SkIntToScalar(60)); 5420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setTextEncoding(SkPaint::kUTF8_TextEncoding); 5430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 5440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 5450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 5460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger /* 5470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkColorFilter.h:25:class SkColorFilter : public SkFlattenable { -- abstract 5480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static SkColorFilter* CreatXfermodeFilter() *** untested *** 5490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static SkColorFilter* CreatePorterDuffFilter() *** untested *** 5500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static SkColorFilter* CreateLightingFilter() -- tested 5510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkDrawLooper.h:9:class SkDrawLooper : public SkFlattenable { -- virtually abstract 5520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkBlurDrawLooper.h:9:class SkBlurDrawLooper : public SkDrawLooper { *** untested *** 5530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkMaskFilter.h:41:class SkMaskFilter : public SkFlattenable { -- abstract chmod +w .h 5540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkEmbossMaskFilter.h:27:class SkEmbossMaskFilter : public SkMaskFilter { -- tested 5550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkPathEffect.h:33:class SkPathEffect : public SkFlattenable { -- abstract 5560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./Sk1DPathEffect.h:27:class Sk1DPathEffect : public SkPathEffect { -- abstract 5570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./Sk1DPathEffect.h:48:class SkPath1DPathEffect : public Sk1DPathEffect { -- tested 5580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./Sk2DPathEffect.h:25:class Sk2DPathEffect : public SkPathEffect { *** untested *** 5590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkCornerPathEffect.h:28:class SkCornerPathEffect : public SkPathEffect { *** untested *** 5600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkDashPathEffect.h:27:class SkDashPathEffect : public SkPathEffect { 5610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkDiscretePathEffect.h:27:class SkDiscretePathEffect : public SkPathEffect { 5620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkPaint.h:760:class SkStrokePathEffect : public SkPathEffect { 5630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkPathEffect.h:58:class SkPairPathEffect : public SkPathEffect { 5640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkPathEffect.h:78:class SkComposePathEffect : public SkPairPathEffect { 5650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkPathEffect.h:114:class SkSumPathEffect : public SkPairPathEffect { 5660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkRasterizer.h:29:class SkRasterizer : public SkFlattenable { 5670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkLayerRasterizer.h:27:class SkLayerRasterizer : public SkRasterizer { 5680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkShader.h:36:class SkShader : public SkFlattenable { 5690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkColorFilter.h:59:class SkFilterShader : public SkShader { 5700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkColorShader.h:26:class SkColorShader : public SkShader { 5710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkShaderExtras.h:31:class SkComposeShader : public SkShader { 5720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkTransparentShader.h:23:class SkTransparentShader : public SkShader { 5730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkUnitMapper.h:24:class SkUnitMapper : public SkFlattenable { 5740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkUnitMapper.h:33:class SkDiscreteMapper : public SkUnitMapper { 5750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkUnitMapper.h:51:class SkFlipCosineMapper : public SkUnitMapper { 5760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkXfermode.h:32:class SkXfermode : public SkFlattenable { 5770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkAvoidXfermode.h:28:class SkAvoidXfermode : public SkXfermode { *** not done *** chmod +w .h .cpp 5780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ./SkXfermode.h:54:class SkProcXfermode : public SkXfermode { 5790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 5800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 5810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger /* 5820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkBlurMaskFilter.h:25:class SkBlurMaskFilter { 5830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger chmod +w SkBlurMaskFilter.cpp 5840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger./SkGradientShader.h:30:class SkGradientShader { 5850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 5860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // save layer, bounder, looper 5870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // matrix 5880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // clip /path/region 5890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // bitmap proc shader ? 5900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 5910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/* untested: 5920b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkCornerPathEffect.h:28:class SkCornerPathEffect : public SkPathEffect { 5930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger*/ 5940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 5950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { 5960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fClickPt.set(x, y); 5970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->inval(NULL); 5980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onFindClickHandler(x, y); 5990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 6000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPathEffect* pathEffectTest() { 6020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static const int gXY[] = { 1, 0, 0, -1, 2, -1, 3, 0, 2, 1, 0, 1 }; 6030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar gPhase = 0; 6040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPath path; 6050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1])); 6060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2) 6070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1])); 6080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.close(); 6090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.offset(SkIntToScalar(-6), 0); 6100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPathEffect* outer = new SkPath1DPathEffect(path, SkIntToScalar(12), 6110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger gPhase, SkPath1DPathEffect::kRotate_Style); 6120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPathEffect* inner = new SkDiscretePathEffect(SkIntToScalar(2), 6130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkIntToScalar(1)/10); // SkCornerPathEffect(SkIntToScalar(2)); 6140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPathEffect* result = new SkComposePathEffect(outer, inner); 6150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger outer->unref(); 6160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger inner->unref(); 6170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return result; 6180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 6190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPathEffect* pathEffectTest2() { // unsure this works (has no visible effect) 6210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPathEffect* outer = new SkStrokePathEffect(SkIntToScalar(4), 6220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint::kStroke_Style, SkPaint::kMiter_Join, SkPaint::kButt_Cap); 6230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static const SkScalar intervals[] = {SkIntToScalar(1), SkIntToScalar(2), 6240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkIntToScalar(2), SkIntToScalar(1)}; 6250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPathEffect* inner = new SkDashPathEffect(intervals, 6260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger sizeof(intervals) / sizeof(intervals[0]), 0); 6270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPathEffect* result = new SkSumPathEffect(outer, inner); 6280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger outer->unref(); 6290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger inner->unref(); 6300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return result; 6310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 6320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader* shaderTest() { 6340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint pts[] = { { 0, 0, }, { SkIntToScalar(100), 0 } }; 6350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColor colors[] = { SK_ColorRED, SK_ColorBLUE }; 6360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL, 6370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2, SkShader::kClamp_TileMode); 6380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger pts[1].set(0, SkIntToScalar(100)); 6390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColor colors2[] = {SK_ColorBLACK, SkColorSetARGB(0x80, 0, 0, 0)}; 6400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors2, NULL, 6410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2, SkShader::kClamp_TileMode); 6420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkXfermode* mode = SkXfermode::Create(SkXfermode::kDstIn_Mode); 6430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader* result = new SkComposeShader(shaderA, shaderB, mode); 6440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger shaderA->unref(); 6450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger shaderB->unref(); 6460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger mode->unref(); 6470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return result; 6480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 6490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void startTest() { 6510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/bugcirc.gif", &fBug); 6520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/tbcirc.gif", &fTb); 6530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/05psp04.gif", &fTx); 6540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 6550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger void drawRaster(SkCanvas* canvas) { 6570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (size_t index = 0; index < SK_ARRAY_COUNT(gRastProcs); index++) 6580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger drawOneRaster(canvas); 6590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 6600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger void drawOneRaster(SkCanvas* canvas) { 6620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->save(); 6630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar x = SkIntToScalar(20); 6650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar y = SkIntToScalar(40); 6660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 6670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setAntiAlias(true); 6690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setTextSize(SkIntToScalar(48)); 6700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setTypeface(SkTypeface::CreateFromName("sans-serif", 6710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkTypeface::kBold)); 6720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkString str("GOOGLE"); 6740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(gRastProcs); i++) { 6760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger apply_shader(&paint, i); 6770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // paint.setMaskFilter(NULL); 6790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // paint.setColor(SK_ColorBLACK); 6800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#if 01 6820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int index = i % SK_ARRAY_COUNT(gLightingColors); 6830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColorFilter(SkColorFilter::CreateLightingFilter( 6840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger gLightingColors[index].fMul, 6850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger gLightingColors[index].fAdd))->unref(); 6860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif 6870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawText(str.c_str(), str.size(), x, y, paint); 6890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect oval = { x, y - SkIntToScalar(40), x + SkIntToScalar(40), y }; 6900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStyle(SkPaint::kStroke_Style); 6910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawOval(oval, paint); 6920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStyle(SkPaint::kFill_Style); 6930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger y += paint.getFontSpacing(); 6950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 6960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 6980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 6990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (1) { 7000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAvoidXfermode mode(SK_ColorWHITE, 0xFF, 7010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAvoidXfermode::kTargetColor_Mode); 7020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 7030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger x += SkIntToScalar(20); 7040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect r = { x, 0, x + SkIntToScalar(360), SkIntToScalar(700) }; 7050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setXfermode(&mode); 7060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorGREEN); 7070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setAntiAlias(true); 7080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawOval(r, paint); 7090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 7100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 7110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 7120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 7130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPoint fClickPt; 7140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap fBug, fTb, fTx; 7150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef SampleView INHERITED; 7160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 7170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 7180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger////////////////////////////////////////////////////////////////////////////// 7190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 7200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new DemoView; } 7210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory); 7220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 723