diff --git a/engine/core/painting/Paint.cpp b/engine/core/painting/Paint.cpp index 05164a09d8d555d5f1105ffce9271d9e12e02230..a3f98099ac75f0678239c3b733aa136cb8f4d552 100644 --- a/engine/core/painting/Paint.cpp +++ b/engine/core/painting/Paint.cpp @@ -37,4 +37,9 @@ void Paint::setMaskFilter(MaskFilter* filter) m_paint.setMaskFilter(filter->filter()); } +void Paint::setTransferMode(SkXfermode::Mode transfer_mode) +{ + m_paint.setXfermodeMode(transfer_mode); +} + } // namespace blink diff --git a/engine/core/painting/Paint.h b/engine/core/painting/Paint.h index 402080a1a85220d5dc8b5d233219e328a9ba0b25..71ac40573207b2a3fe8d5fd720c16070fd404c92 100644 --- a/engine/core/painting/Paint.h +++ b/engine/core/painting/Paint.h @@ -6,6 +6,7 @@ #define SKY_ENGINE_CORE_PAINTING_PAINT_H_ #include "sky/engine/core/painting/CanvasColor.h" +#include "sky/engine/core/painting/TransferMode.h" #include "sky/engine/tonic/dart_wrappable.h" #include "sky/engine/wtf/PassRefPtr.h" #include "sky/engine/wtf/RefCounted.h" @@ -43,6 +44,8 @@ public: const SkPaint& paint() const { return m_paint; } void setPaint(const SkPaint& paint) { m_paint = paint; } + void setTransferMode(SkXfermode::Mode transfer_mode); + private: Paint(); diff --git a/engine/core/painting/Paint.idl b/engine/core/painting/Paint.idl index 11e5c2149604987e909ae58f6da40552646391a4..27f4b20b3532b890b073768aa1e7076d27e0559e 100644 --- a/engine/core/painting/Paint.idl +++ b/engine/core/painting/Paint.idl @@ -13,4 +13,5 @@ void setDrawLooper(DrawLooper looper); void setColorFilter(ColorFilter filter); void setMaskFilter(MaskFilter filter); + void setTransferMode(TransferMode transferMode); }; diff --git a/examples/game/lib/game_world.dart b/examples/game/lib/game_world.dart index e066db98dda89e86fdd3db1bfa84cde4740bb3e7..2101512992d37770000f09a082979f9e426a8c68 100644 --- a/examples/game/lib/game_world.dart +++ b/examples/game/lib/game_world.dart @@ -66,6 +66,8 @@ class GameWorld extends TransformNode { SpriteNode sprt = new SpriteNode.withImage(_image); sprt.width = radius*2; sprt.height = radius*2; + sprt.colorOverlay = new Color(0x33ff0000); + sprt.transferMode = TransferMode.plusMode; body.userData = sprt; this.children.add(sprt); } diff --git a/examples/game/lib/sprite_node.dart b/examples/game/lib/sprite_node.dart index ca6296a82d133880872b01accd2b8af498951110..406a3f4ab442a98a546e816a7af5dc5c21767e8f 100644 --- a/examples/game/lib/sprite_node.dart +++ b/examples/game/lib/sprite_node.dart @@ -6,6 +6,9 @@ class SpriteNode extends TransformNode { Image _image; bool constrainProportions = false; + double _opacity = 1.0; + Color colorOverlay; + TransferMode transferMode; SpriteNode() { this.pivot = new Vector2(0.5, 0.5); @@ -15,7 +18,14 @@ class SpriteNode extends TransformNode { this.pivot = new Vector2(0.5, 0.5); _image = image; } - + + double get opacity => _opacity; + + void set opacity(double opacity) { + assert(opacity >= 0.0 && opacity <= 1.0); + _opacity = opacity; + } + void paint(PictureRecorder canvas) { if (_image != null && _image.width > 0 && _image.height > 0) { @@ -37,7 +47,18 @@ class SpriteNode extends TransformNode { } canvas.scale(scaleX, scaleY); - canvas.drawImage(_image, 0.0, 0.0, new Paint()..setARGB(255, 255, 255, 255)); + + // Setup paint object for opacity and transfer mode + Paint paint = new Paint(); + paint.setARGB((255.0*_opacity).toInt(), 255, 255, 255); + if (colorOverlay != null) { + paint.setColorFilter(new ColorFilter(colorOverlay, TransferMode.srcATopMode)); + } + if (transferMode != null) { + paint.setTransferMode(transferMode); + } + + canvas.drawImage(_image, 0.0, 0.0, paint); canvas.restore(); } else {