74 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| // Copyright 2020 Google LLC.
 | |
| // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
 | |
| #include "tools/fiddle/examples.h"
 | |
| REG_FIDDLE(BlendModes, 256, 4352, false, 0) {
 | |
| void drawBG(SkCanvas* canvas) {
 | |
|     SkColor radColors[] = {0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF};
 | |
|     auto rad = SkGradientShader::MakeRadial(SkPoint::Make(128, 128), 128, radColors, nullptr, 3,
 | |
|                                             SkTileMode::kClamp);
 | |
| 
 | |
|     SkMatrix rotMtx;
 | |
|     rotMtx.setRotate(-90, 128, 128);
 | |
|     SkColor sweepColors[] = {0xFFFF00FF, 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00,
 | |
|                              0xFF00FFFF, 0xFF0000FF, 0xFFFF00FF};
 | |
|     auto sweep = SkGradientShader::MakeSweep(128, 128, sweepColors, nullptr, 7, 0, &rotMtx);
 | |
| 
 | |
|     auto comp = SkShaders::Blend(SkBlendMode::kModulate, std::move(rad), std::move(sweep));
 | |
|     SkPaint p;
 | |
|     p.setShader(std::move(comp));
 | |
| 
 | |
|     canvas->drawPaint(p);
 | |
| }
 | |
| 
 | |
| void draw(SkCanvas* canvas) {
 | |
|     SkBlendMode blendModes[] = {
 | |
|         SkBlendMode::kDst,
 | |
|         SkBlendMode::kSrc,
 | |
|         SkBlendMode::kSrcOver,
 | |
|         SkBlendMode::kDstOver,
 | |
|         SkBlendMode::kSrcIn,
 | |
|         SkBlendMode::kDstIn,
 | |
|         SkBlendMode::kSrcOut,
 | |
|         SkBlendMode::kDstOut,
 | |
|         SkBlendMode::kSrcATop,
 | |
|         SkBlendMode::kDstATop,
 | |
|         SkBlendMode::kXor,
 | |
|         SkBlendMode::kPlus,
 | |
|         SkBlendMode::kModulate,
 | |
|         SkBlendMode::kScreen,
 | |
|         SkBlendMode::kOverlay,
 | |
|         SkBlendMode::kDarken,
 | |
|         SkBlendMode::kLighten,
 | |
|     };
 | |
| 
 | |
|     SkPaint labelPaint;
 | |
|     labelPaint.setAntiAlias(true);
 | |
|     SkFont font(nullptr, 12);
 | |
| 
 | |
|     for (auto mode : blendModes) {
 | |
|         SkPaint layerPaint;
 | |
|         layerPaint.setBlendMode(mode);
 | |
| 
 | |
|         canvas->save();
 | |
|         canvas->clipRect(SkRect::MakeWH(256, 256));
 | |
| 
 | |
|         drawBG(canvas);
 | |
| 
 | |
|         canvas->saveLayer(nullptr, &layerPaint);
 | |
|         const SkScalar r = 80;
 | |
|         SkPaint discP;
 | |
|         discP.setAntiAlias(true);
 | |
|         discP.setBlendMode(SkBlendMode::kPlus);
 | |
|         discP.setColor(SK_ColorGREEN); canvas->drawCircle(128, r, r, discP);
 | |
|         discP.setColor(SK_ColorRED);   canvas->drawCircle(r, 256 - r, r, discP);
 | |
|         discP.setColor(SK_ColorBLUE);  canvas->drawCircle(256 - r, 256 - r, r, discP);
 | |
|         canvas->restore();
 | |
| 
 | |
|         canvas->drawSimpleText(SkBlendMode_Name(mode), strlen(SkBlendMode_Name(mode)),
 | |
|                                SkTextEncoding::kUTF8, 10, 10, font, labelPaint);
 | |
|         canvas->restore();
 | |
|         canvas->translate(0, 256);
 | |
|     }
 | |
| }
 | |
| }  // END FIDDLE
 |