expand SkLayerDrawLooper to allow for an xfermode when transfering the paint's color,
and allow that the offset be applied pre or post
git-svn-id: http://skia.googlecode.com/svn/trunk@1115 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/effects/SkLayerDrawLooper.h b/include/effects/SkLayerDrawLooper.h
index 682a9dc..b487a88 100644
--- a/include/effects/SkLayerDrawLooper.h
+++ b/include/effects/SkLayerDrawLooper.h
@@ -2,6 +2,7 @@
#define SkLayerDrawLooper_DEFINED
#include "SkDrawLooper.h"
+#include "SkXfermode.h"
struct SkPoint;
@@ -10,37 +11,77 @@
SkLayerDrawLooper();
virtual ~SkLayerDrawLooper();
+ /**
+ * Bits specifies which aspects of the layer's paint should replace the
+ * corresponding aspects on the draw's paint.
+ * kEntirePaint_Bits means use the layer's paint completely.
+ * 0 means ignore the layer's paint.
+ */
enum Bits {
- kAlpha_Bit = 1 << 0, //!< use this layer's alpha
- kColor_Bit = 1 << 1, //!< use this layer's color
- kStyle_Bit = 1 << 2, //!< use this layer's Style/stroke settings
- kTextSkewX_Bit = 1 << 3, //!< use this layer's textskewx
- kPathEffect_Bit = 1 << 4, //!< use this layer's patheffect
- kMaskFilter_Bit = 1 << 5, //!< use this layer's maskfilter
- kShader_Bit = 1 << 6, //!< use this layer's shader
- kColorFilter_Bit = 1 << 7, //!< use this layer's colorfilter
- kXfermode_Bit = 1 << 8, //!< use this layer's xfermode
+ kStyle_Bit = 1 << 0, //!< use this layer's Style/stroke settings
+ kTextSkewX_Bit = 1 << 1, //!< use this layer's textskewx
+ kPathEffect_Bit = 1 << 2, //!< use this layer's patheffect
+ kMaskFilter_Bit = 1 << 3, //!< use this layer's maskfilter
+ kShader_Bit = 1 << 4, //!< use this layer's shader
+ kColorFilter_Bit = 1 << 5, //!< use this layer's colorfilter
+ kXfermode_Bit = 1 << 6, //!< use this layer's xfermode
kEntirePaint_Bits = -1, //!< use this layer's paint entirely
};
typedef int32_t BitFlags;
-
+
+ /**
+ * Info for how to apply the layer's paint and offset.
+ *
+ * fColorMode controls how we compute the final color for the layer:
+ * The layer's paint's color is treated as the SRC
+ * The draw's paint's color is treated as the DST
+ * final-color = Mode(layers-color, draws-color);
+ * Any SkXfermode::Mode will work. Two common choices are:
+ * kSrc_Mode: to use the layer's color, ignoring the draw's
+ * kDst_Mode: to just keep the draw's color, ignoring the layer's
+ */
+ struct LayerInfo {
+ BitFlags fPaintBits;
+ SkXfermode::Mode fColorMode;
+ SkVector fOffset;
+ bool fPostTranslate; //!< applies to fOffset
+
+ /**
+ * Initial the LayerInfo. Defaults to settings that will draw the
+ * layer with no changes: e.g.
+ * fPaintBits == 0
+ * fColorMode == kDst_Mode
+ * fOffset == (0, 0)
+ */
+ LayerInfo();
+ };
+
/**
* Call for each layer you want to add (from top to bottom).
* This returns a paint you can modify, but that ptr is only valid until
* the next call made to this object.
- *
- * The optional bits parameter specifies which aspects of this paint
- * should replace the paint that is passed to the draw call. If 0 is
- * specified, then this layer's paint will be ignored.
*/
- SkPaint* addLayer(SkScalar dx, SkScalar dy, BitFlags = kEntirePaint_Bits);
+ SkPaint* addLayer(const LayerInfo&);
+
+ /**
+ * Call for each layer you want to add (from top to bottom).
+ * This returns a paint you can modify, but that ptr is only valid until
+ * the next call made to this object.
+ * The returned paint will be ignored, and only the offset will be applied
+ *
+ * DEPRECATED: call addLayer(const LayerInfo&)
+ */
+ SkPaint* addLayer(SkScalar dx, SkScalar dy);
/**
- * Helper for addLayer() which passes (0, 0) for the offset parameters
+ * Helper for addLayer() which passes (0, 0) for the offset parameters.
+ * This layer will not affect the drawing in any way.
+ *
+ * DEPRECATED: call addLayer(const LayerInfo&)
*/
- SkPaint* addLayer(BitFlags bits = kEntirePaint_Bits) {
- return this->addLayer(0, 0, bits);
+ SkPaint* addLayer() {
+ return this->addLayer(0, 0);
}
// overrides from SkDrawLooper
@@ -63,9 +104,8 @@
struct Rec {
Rec* fNext;
SkPaint fPaint;
- SkPoint fOffset;
- uint32_t fBits;
-
+ LayerInfo fInfo;
+
static Rec* Reverse(Rec*);
};
Rec* fRecs;
@@ -74,7 +114,8 @@
// state-machine during the init/next cycle
Rec* fCurrRec;
- static void ApplyBits(SkPaint* dst, const SkPaint& src, BitFlags bits);
+ static void ApplyBits(SkPaint* dst, const SkPaint& src, BitFlags,
+ SkXfermode::Mode);
class MyRegistrar : public SkFlattenable::Registrar {
public: