1 #include "SampleCode.h" 2 #include "SkView.h" 3 #include "SkCanvas.h" 4 #include "Sk64.h" 5 #include "SkCornerPathEffect.h" 6 #include "SkGradientShader.h" 7 #include "SkGraphics.h" 8 #include "SkImageDecoder.h" 9 #include "SkKernel33MaskFilter.h" 10 #include "SkPath.h" 11 #include "SkRandom.h" 12 #include "SkRegion.h" 13 #include "SkShader.h" 14 #include "SkUtils.h" 15 #include "SkColorPriv.h" 16 #include "SkColorFilter.h" 17 #include "SkTime.h" 18 #include "SkTypeface.h" 19 #include "SkXfermode.h" 20 21 #include "SkStream.h" 22 #include "SkXMLParser.h" 23 #include "SkColorPriv.h" 24 #include "SkImageDecoder.h" 25 #include "SkBlurMaskFilter.h" 26 27 static void setNamedTypeface(SkPaint* paint, const char name[]) { 28 SkTypeface* face = SkTypeface::CreateFromName(name, SkTypeface::kNormal); 29 paint->setTypeface(face); 30 SkSafeUnref(face); 31 } 32 33 static uint16_t gBG[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF }; 34 35 class XfermodesBlurView : public SampleView { 36 SkBitmap fBG; 37 SkBitmap fSrcB, fDstB; 38 39 void draw_mode(SkCanvas* canvas, SkXfermode* mode, int alpha, 40 SkScalar x, SkScalar y) { 41 SkPaint p; 42 SkMaskFilter* mf = SkBlurMaskFilter::Create(5, SkBlurMaskFilter::kNormal_BlurStyle, 0); 43 p.setMaskFilter(mf)->unref(); 44 45 SkScalar ww = SkIntToScalar(W); 46 SkScalar hh = SkIntToScalar(H); 47 48 // draw a circle covering the upper 49 // left three quarters of the canvas 50 p.setColor(0xFFCC44FF); 51 SkRect r; 52 r.set(0, 0, ww*3/4, hh*3/4); 53 r.offset(x, y); 54 canvas->drawOval(r, p); 55 56 p.setXfermode(mode); 57 58 // draw a square overlapping the circle 59 // in the lower right of the canvas 60 p.setColor(0x00AA6633 | alpha << 24); 61 r.set(ww/3, hh/3, ww*19/20, hh*19/20); 62 r.offset(x, y); 63 canvas->drawRect(r, p); 64 } 65 66 public: 67 const static int W = 64; 68 const static int H = 64; 69 XfermodesBlurView() { 70 const int W = 64; 71 const int H = 64; 72 73 fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4); 74 fBG.setPixels(gBG); 75 fBG.setIsOpaque(true); 76 } 77 78 protected: 79 // overrides from SkEventSink 80 virtual bool onQuery(SkEvent* evt) { 81 if (SampleCode::TitleQ(*evt)) { 82 SampleCode::TitleR(evt, "XfermodesBlur"); 83 return true; 84 } 85 return this->INHERITED::onQuery(evt); 86 } 87 88 virtual void onDrawContent(SkCanvas* canvas) { 89 canvas->translate(SkIntToScalar(10), SkIntToScalar(20)); 90 91 const struct { 92 SkXfermode::Mode fMode; 93 const char* fLabel; 94 } gModes[] = { 95 { SkXfermode::kClear_Mode, "Clear" }, 96 { SkXfermode::kSrc_Mode, "Src" }, 97 { SkXfermode::kDst_Mode, "Dst" }, 98 { SkXfermode::kSrcOver_Mode, "SrcOver" }, 99 { SkXfermode::kDstOver_Mode, "DstOver" }, 100 { SkXfermode::kSrcIn_Mode, "SrcIn" }, 101 { SkXfermode::kDstIn_Mode, "DstIn" }, 102 { SkXfermode::kSrcOut_Mode, "SrcOut" }, 103 { SkXfermode::kDstOut_Mode, "DstOut" }, 104 { SkXfermode::kSrcATop_Mode, "SrcATop" }, 105 { SkXfermode::kDstATop_Mode, "DstATop" }, 106 { SkXfermode::kXor_Mode, "Xor" }, 107 108 { SkXfermode::kPlus_Mode, "Plus" }, 109 /*{ SkXfermode::kMultiply_Mode, "Multiply" }, 110 { SkXfermode::kScreen_Mode, "Screen" }, 111 { SkXfermode::kOverlay_Mode, "Overlay" }, 112 { SkXfermode::kDarken_Mode, "Darken" }, 113 { SkXfermode::kLighten_Mode, "Lighten" }, 114 { SkXfermode::kColorDodge_Mode, "ColorDodge" }, 115 { SkXfermode::kColorBurn_Mode, "ColorBurn" }, 116 { SkXfermode::kHardLight_Mode, "HardLight" }, 117 { SkXfermode::kSoftLight_Mode, "SoftLight" }, 118 { SkXfermode::kDifference_Mode, "Difference" }, 119 { SkXfermode::kExclusion_Mode, "Exclusion" },*/ 120 }; 121 122 const SkScalar w = SkIntToScalar(W); 123 const SkScalar h = SkIntToScalar(H); 124 SkShader* s = SkShader::CreateBitmapShader(fBG, 125 SkShader::kRepeat_TileMode, 126 SkShader::kRepeat_TileMode); 127 SkMatrix m; 128 m.setScale(SkIntToScalar(6), SkIntToScalar(6)); 129 s->setLocalMatrix(m); 130 131 SkPaint labelP; 132 labelP.setAntiAlias(true); 133 labelP.setLCDRenderText(true); 134 labelP.setTextAlign(SkPaint::kCenter_Align); 135 setNamedTypeface(&labelP, "Menlo Regular"); 136 137 const int W = 5; 138 139 SkScalar x0 = 0; 140 for (int twice = 0; twice < 2; twice++) { 141 SkScalar x = x0, y = 0; 142 for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) { 143 SkXfermode* mode = SkXfermode::Create(gModes[i].fMode); 144 SkAutoUnref aur(mode); 145 SkRect r; 146 r.set(x, y, x+w, y+h); 147 148 SkPaint p; 149 p.setStyle(SkPaint::kFill_Style); 150 p.setShader(s); 151 canvas->drawRect(r, p); 152 153 canvas->saveLayer(&r, NULL, SkCanvas::kARGB_ClipLayer_SaveFlag); 154 draw_mode(canvas, mode, twice ? 0x88 : 0xFF, r.fLeft, r.fTop); 155 canvas->restore(); 156 157 r.inset(-SK_ScalarHalf, -SK_ScalarHalf); 158 p.setStyle(SkPaint::kStroke_Style); 159 p.setShader(NULL); 160 canvas->drawRect(r, p); 161 162 canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel), 163 x + w/2, y - labelP.getTextSize()/2, labelP); 164 x += w + SkIntToScalar(10); 165 if ((i % W) == W - 1) { 166 x = x0; 167 y += h + SkIntToScalar(30); 168 } 169 } 170 x0 += SkIntToScalar(400); 171 } 172 s->unref(); 173 } 174 175 private: 176 typedef SampleView INHERITED; 177 }; 178 179 ////////////////////////////////////////////////////////////////////////////// 180 181 static SkView* MyFactory() { return new XfermodesBlurView; } 182 static SkViewRegister reg(MyFactory); 183