| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "gm.h" | 8 #include "gm.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkShader.h" | 10 #include "SkShader.h" |
| 11 #include "SkXfermode.h" | 11 #include "SkXfermode.h" |
| 12 #include "SkPM4f.h" | 12 #include "SkPM4f.h" |
| 13 | 13 |
| 14 #include "SkArithmeticMode.h" | 14 #include "SkArithmeticMode.h" |
| 15 #include "SkPixelXorXfermode.h" | 15 #include "SkPixelXorXfermode.h" |
| 16 #include "SkAvoidXfermode.h" | 16 #include "SkAvoidXfermode.h" |
| 17 | 17 |
| 18 #define kCustomShift 16 | 18 #define kCustomShift 16 |
| 19 #define kCustomMask (~0xFFFF) | 19 #define kCustomMask (~0xFFFF) |
| 20 | 20 |
| 21 enum CustomModes { | 21 enum CustomModes { |
| 22 kArithmetic_CustomMode = 1 << kCustomShift, | 22 kArithmetic_CustomMode = 1 << kCustomShift, |
| 23 kPixelXor_CustomMode = 2 << kCustomShift, | 23 kPixelXor_CustomMode = 2 << kCustomShift, |
| 24 kAvoid_CustomMode = 3 << kCustomShift, | 24 kAvoid_CustomMode = 3 << kCustomShift, |
| 25 }; | 25 }; |
| 26 | 26 |
| 27 static SkXfermode* make_custom(int customMode) { | 27 static sk_sp<SkXfermode> make_custom(int customMode) { |
| 28 switch (customMode) { | 28 switch (customMode) { |
| 29 case kArithmetic_CustomMode: { | 29 case kArithmetic_CustomMode: { |
| 30 const SkScalar k1 = 0.25; | 30 const SkScalar k1 = 0.25; |
| 31 const SkScalar k2 = 0.75; | 31 const SkScalar k2 = 0.75; |
| 32 const SkScalar k3 = 0.75; | 32 const SkScalar k3 = 0.75; |
| 33 const SkScalar k4 = -0.25; | 33 const SkScalar k4 = -0.25; |
| 34 return SkArithmeticMode::Create(k1, k2, k3, k4); | 34 return SkArithmeticMode::Make(k1, k2, k3, k4); |
| 35 } | 35 } |
| 36 case kPixelXor_CustomMode: | 36 case kPixelXor_CustomMode: |
| 37 return SkPixelXorXfermode::Create(0xFF88CC44); | 37 return SkPixelXorXfermode::Make(0xFF88CC44); |
| 38 case kAvoid_CustomMode: | 38 case kAvoid_CustomMode: |
| 39 return SkAvoidXfermode::Create(0xFFFF0000, 0x44, SkAvoidXfermode::kA
voidColor_Mode); | 39 return SkAvoidXfermode::Make(0xFFFF0000, 0x44, SkAvoidXfermode::kAvo
idColor_Mode); |
| 40 default: | 40 default: |
| 41 break; | 41 break; |
| 42 } | 42 } |
| 43 SkASSERT(false); | 43 SkASSERT(false); |
| 44 return nullptr; | 44 return nullptr; |
| 45 } | 45 } |
| 46 | 46 |
| 47 enum SrcType { | 47 enum SrcType { |
| 48 //! A WxH image with a rectangle in the lower right. | 48 //! A WxH image with a rectangle in the lower right. |
| 49 kRectangleImage_SrcType = 0x01, | 49 kRectangleImage_SrcType = 0x01, |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 static uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF }; | 148 static uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF }; |
| 149 | 149 |
| 150 class XfermodesGM : public skiagm::GM { | 150 class XfermodesGM : public skiagm::GM { |
| 151 SkBitmap fBG; | 151 SkBitmap fBG; |
| 152 SkBitmap fSrcB, fDstB, fTransparent; | 152 SkBitmap fSrcB, fDstB, fTransparent; |
| 153 | 153 |
| 154 /* The srcType argument indicates what to draw for the source part. Skia | 154 /* The srcType argument indicates what to draw for the source part. Skia |
| 155 * uses the implied shape of the drawing command and these modes | 155 * uses the implied shape of the drawing command and these modes |
| 156 * demonstrate that. | 156 * demonstrate that. |
| 157 */ | 157 */ |
| 158 void draw_mode(SkCanvas* canvas, SkXfermode* mode, SrcType srcType, | 158 void draw_mode(SkCanvas* canvas, sk_sp<SkXfermode> mode, SrcType srcType, |
| 159 SkScalar x, SkScalar y) { | 159 SkScalar x, SkScalar y) { |
| 160 SkPaint p; | 160 SkPaint p; |
| 161 SkMatrix m; | 161 SkMatrix m; |
| 162 bool restoreNeeded = false; | 162 bool restoreNeeded = false; |
| 163 m.setTranslate(x, y); | 163 m.setTranslate(x, y); |
| 164 | 164 |
| 165 canvas->drawBitmap(fSrcB, x, y, &p); | 165 canvas->drawBitmap(fSrcB, x, y, &p); |
| 166 p.setXfermode(mode); | 166 p.setXfermode(std::move(mode)); |
| 167 switch (srcType) { | 167 switch (srcType) { |
| 168 case kSmallTransparentImage_SrcType: { | 168 case kSmallTransparentImage_SrcType: { |
| 169 m.postScale(SK_ScalarHalf, SK_ScalarHalf, x, y); | 169 m.postScale(SK_ScalarHalf, SK_ScalarHalf, x, y); |
| 170 | 170 |
| 171 SkAutoCanvasRestore acr(canvas, true); | 171 SkAutoCanvasRestore acr(canvas, true); |
| 172 canvas->concat(m); | 172 canvas->concat(m); |
| 173 canvas->drawBitmap(fTransparent, 0, 0, &p); | 173 canvas->drawBitmap(fTransparent, 0, 0, &p); |
| 174 break; | 174 break; |
| 175 } | 175 } |
| 176 case kQuarterClearInLayer_SrcType: { | 176 case kQuarterClearInLayer_SrcType: { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 const int W = 5; | 272 const int W = 5; |
| 273 | 273 |
| 274 SkScalar x0 = 0; | 274 SkScalar x0 = 0; |
| 275 SkScalar y0 = 0; | 275 SkScalar y0 = 0; |
| 276 for (int sourceType = 1; sourceType & kAll_SrcType; sourceType <<= 1) { | 276 for (int sourceType = 1; sourceType & kAll_SrcType; sourceType <<= 1) { |
| 277 SkScalar x = x0, y = y0; | 277 SkScalar x = x0, y = y0; |
| 278 for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) { | 278 for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) { |
| 279 if ((gModes[i].fSourceTypeMask & sourceType) == 0) { | 279 if ((gModes[i].fSourceTypeMask & sourceType) == 0) { |
| 280 continue; | 280 continue; |
| 281 } | 281 } |
| 282 SkAutoTUnref<SkXfermode> mode; | 282 sk_sp<SkXfermode> mode; |
| 283 if (gModes[i].fSourceTypeMask & kCustomMask) { | 283 if (gModes[i].fSourceTypeMask & kCustomMask) { |
| 284 mode.reset(make_custom(gModes[i].fSourceTypeMask & kCustomMa
sk)); | 284 mode = make_custom(gModes[i].fSourceTypeMask & kCustomMask); |
| 285 } else { | 285 } else { |
| 286 mode.reset(SkXfermode::Create(gModes[i].fMode)); | 286 mode = SkXfermode::Make(gModes[i].fMode); |
| 287 } | 287 } |
| 288 SkRect r; | 288 SkRect r; |
| 289 r.set(x, y, x+w, y+h); | 289 r.set(x, y, x+w, y+h); |
| 290 | 290 |
| 291 SkPaint p; | 291 SkPaint p; |
| 292 p.setStyle(SkPaint::kFill_Style); | 292 p.setStyle(SkPaint::kFill_Style); |
| 293 p.setShader(s); | 293 p.setShader(s); |
| 294 canvas->drawRect(r, p); | 294 canvas->drawRect(r, p); |
| 295 | 295 |
| 296 canvas->saveLayer(&r, nullptr); | 296 canvas->saveLayer(&r, nullptr); |
| 297 draw_mode(canvas, mode, static_cast<SrcType>(sourceType), | 297 draw_mode(canvas, std::move(mode), static_cast<SrcType>(sourceTy
pe), |
| 298 r.fLeft, r.fTop); | 298 r.fLeft, r.fTop); |
| 299 canvas->restore(); | 299 canvas->restore(); |
| 300 | 300 |
| 301 r.inset(-SK_ScalarHalf, -SK_ScalarHalf); | 301 r.inset(-SK_ScalarHalf, -SK_ScalarHalf); |
| 302 p.setStyle(SkPaint::kStroke_Style); | 302 p.setStyle(SkPaint::kStroke_Style); |
| 303 p.setShader(nullptr); | 303 p.setShader(nullptr); |
| 304 canvas->drawRect(r, p); | 304 canvas->drawRect(r, p); |
| 305 | 305 |
| 306 #if 1 | 306 #if 1 |
| 307 canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel), | 307 canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 322 x0 += SkIntToScalar(400); | 322 x0 += SkIntToScalar(400); |
| 323 y0 = 0; | 323 y0 = 0; |
| 324 } | 324 } |
| 325 } | 325 } |
| 326 } | 326 } |
| 327 | 327 |
| 328 private: | 328 private: |
| 329 typedef GM INHERITED; | 329 typedef GM INHERITED; |
| 330 }; | 330 }; |
| 331 DEF_GM( return new XfermodesGM; ) | 331 DEF_GM( return new XfermodesGM; ) |
| OLD | NEW |