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