move xfermode modes from porterduff into xfermode itself
git-svn-id: http://skia.googlecode.com/svn/trunk@232 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/core/SkMath.h b/include/core/SkMath.h
index 0c89065..9198412 100644
--- a/include/core/SkMath.h
+++ b/include/core/SkMath.h
@@ -217,5 +217,12 @@
return (prod + (prod >> shift)) >> shift;
}
+/** Just the rounding step in SkDiv255Round: round(value / 255)
+ */
+static inline unsigned SkDiv255Round(unsigned prod) {
+ prod += 128;
+ return (prod + (prod >> 8)) >> 8;
+}
+
#endif
diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h
index dd3aa13..5865fe8 100644
--- a/include/core/SkPaint.h
+++ b/include/core/SkPaint.h
@@ -19,6 +19,9 @@
#include "SkColor.h"
#include "SkMath.h"
+#include "SkXfermode.h"
+
+// DEPRECATED - remove
#include "SkPorterDuff.h"
class SkAutoGlyphCache;
@@ -37,7 +40,6 @@
class SkShader;
class SkDrawLooper;
class SkTypeface;
-class SkXfermode;
typedef const SkGlyph& (*SkDrawCacheProc)(SkGlyphCache*, const char**,
SkFixed x, SkFixed y);
@@ -456,8 +458,15 @@
@return xfermode
*/
SkXfermode* setXfermode(SkXfermode* xfermode);
-
- /** Helper for setXfermode, passing the corresponding xfermode object
+
+ /** Create an xfermode based on the specified Mode, and assign it into the
+ paint, returning the mode that was set. If the Mode is SrcOver, then
+ the paint's xfermode is set to null.
+ */
+ SkXfermode* setXfermode(SkXfermode::Mode);
+
+ /** DEPRECATED
+ Helper for setXfermode, passing the corresponding xfermode object
returned from the PorterDuff factory.
@param mode The porter-duff mode used to create an xfermode for the
paint.
diff --git a/include/core/SkPorterDuff.h b/include/core/SkPorterDuff.h
index 44c5477..52021b1 100644
--- a/include/core/SkPorterDuff.h
+++ b/include/core/SkPorterDuff.h
@@ -21,6 +21,8 @@
class SkXfermode;
+/** DEPRECATED - use SkXfermode::Mode instead
+ */
class SkPorterDuff {
public:
/** List of predefined xfermodes. In general, the algebra for the modes
diff --git a/include/core/SkXfermode.h b/include/core/SkXfermode.h
index 6a7edec..7a06467 100644
--- a/include/core/SkXfermode.h
+++ b/include/core/SkXfermode.h
@@ -75,6 +75,69 @@
*/
virtual bool asCoeff(Coeff* src, Coeff* dst);
+ /** List of predefined xfermodes.
+ The algebra for the modes uses the following symbols:
+ Sa, Sc - source alpha and color
+ Da, Dc - destination alpha and color (before compositing)
+ [a, c] - Resulting (alpha, color) values
+ For these equations, the colors are in premultiplied state.
+ If no xfermode is specified, kSrcOver is assumed.
+ */
+ enum Mode {
+ kClear_Mode, //!< [0, 0]
+ kSrc_Mode, //!< [Sa, Sc]
+ kDst_Mode, //!< [Da, Dc]
+ kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc]
+ kDstOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc]
+ kSrcIn_Mode, //!< [Sa * Da, Sc * Da]
+ kDstIn_Mode, //!< [Sa * Da, Sa * Dc]
+ kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)]
+ kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)]
+ kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc]
+ kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)]
+ kXor_Mode, //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
+
+ // these modes are defined in the SVG Compositing standard
+ // http://www.w3.org/TR/2009/WD-SVGCompositing-20090430/
+ kPlus_Mode,
+ kMultiply_Mode,
+ kScreen_Mode,
+ kOverlay_Mode,
+ kDarken_Mode,
+ kLighten_Mode,
+ kColorDodge_Mode,
+ kColorBurn_Mode,
+ kHardLight_Mode,
+ kSoftLight_Mode,
+ kDifference_Mode,
+ kExclusion_Mode,
+
+ kLastMode = kExclusion_Mode
+ };
+
+ /** Return an SkXfermode object for the specified mode.
+ */
+ static SkXfermode* Create(Mode mode);
+
+ /** Return a function pointer to a routine that applies the specified
+ porter-duff transfer mode.
+ */
+ static SkXfermodeProc GetProc(Mode mode);
+
+ /** Return a function pointer to a routine that applies the specified
+ porter-duff transfer mode and srcColor to a 16bit device color. Note,
+ if the mode+srcColor might return a non-opaque color, then there is not
+ 16bit proc, and this will return NULL.
+ */
+ static SkXfermodeProc16 GetProc16(Mode mode, SkColor srcColor);
+
+ /** If the specified xfermode advertises itself as one of the porterduff
+ modes (via SkXfermode::Coeff), return true and if not null, set mode
+ to the corresponding porterduff mode. If it is not recognized as a one,
+ return false and ignore the mode parameter.
+ */
+ static bool IsMode(SkXfermode*, Mode* mode);
+
protected:
SkXfermode(SkFlattenableReadBuffer& rb) : SkFlattenable(rb) {}
@@ -89,6 +152,9 @@
virtual SkPMColor xferColor(SkPMColor src, SkPMColor dst);
private:
+ enum {
+ kModeCount = kLastMode + 1
+ };
typedef SkFlattenable INHERITED;
};
diff --git a/samplecode/SampleXfermodes.cpp b/samplecode/SampleXfermodes.cpp
index 1dbfc95..7fecec6 100644
--- a/samplecode/SampleXfermodes.cpp
+++ b/samplecode/SampleXfermodes.cpp
@@ -180,25 +180,34 @@
}
const struct {
- SkPorterDuff::Mode fMode;
+ SkXfermode::Mode fMode;
const char* fLabel;
} gModes[] = {
- { SkPorterDuff::kClear_Mode, "Clear" },
- { SkPorterDuff::kSrc_Mode, "Src" },
- { SkPorterDuff::kDst_Mode, "Dst" },
- { SkPorterDuff::kSrcOver_Mode, "SrcOver" },
- { SkPorterDuff::kDstOver_Mode, "DstOver" },
- { SkPorterDuff::kSrcIn_Mode, "SrcIn" },
- { SkPorterDuff::kDstIn_Mode, "DstIn" },
- { SkPorterDuff::kSrcOut_Mode, "SrcOut" },
- { SkPorterDuff::kDstOut_Mode, "DstOut" },
- { SkPorterDuff::kSrcATop_Mode, "SrcATop" },
- { SkPorterDuff::kDstATop_Mode, "DstATop" },
- { SkPorterDuff::kXor_Mode, "Xor" },
- { SkPorterDuff::kDarken_Mode, "Darken" },
- { SkPorterDuff::kLighten_Mode, "Lighten" },
- { SkPorterDuff::kMultiply_Mode, "Multiply" },
- { SkPorterDuff::kScreen_Mode, "Screen" }
+ { SkXfermode::kClear_Mode, "Clear" },
+ { SkXfermode::kSrc_Mode, "Src" },
+ { SkXfermode::kDst_Mode, "Dst" },
+ { SkXfermode::kSrcOver_Mode, "SrcOver" },
+ { SkXfermode::kDstOver_Mode, "DstOver" },
+ { SkXfermode::kSrcIn_Mode, "SrcIn" },
+ { SkXfermode::kDstIn_Mode, "DstIn" },
+ { SkXfermode::kSrcOut_Mode, "SrcOut" },
+ { SkXfermode::kDstOut_Mode, "DstOut" },
+ { SkXfermode::kSrcATop_Mode, "SrcATop" },
+ { SkXfermode::kDstATop_Mode, "DstATop" },
+ { SkXfermode::kXor_Mode, "Xor" },
+
+ { SkXfermode::kPlus_Mode, "Plus" },
+ { SkXfermode::kMultiply_Mode, "Multiply" },
+ { SkXfermode::kScreen_Mode, "Screen" },
+ { SkXfermode::kOverlay_Mode, "Overlay" },
+ { SkXfermode::kDarken_Mode, "Darken" },
+ { SkXfermode::kLighten_Mode, "Lighten" },
+ { SkXfermode::kColorDodge_Mode, "ColorDodge" },
+ { SkXfermode::kColorBurn_Mode, "ColorBurn" },
+ { SkXfermode::kHardLight_Mode, "HardLight" },
+ { SkXfermode::kSoftLight_Mode, "SoftLight" },
+ { SkXfermode::kDifference_Mode, "Difference" },
+ { SkXfermode::kExclusion_Mode, "Exclusion" },
};
canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
@@ -216,16 +225,18 @@
SkPaint labelP;
labelP.setAntiAlias(true);
labelP.setTextAlign(SkPaint::kCenter_Align);
+
+ const int W = 5;
SkScalar x0 = 0;
for (int twice = 0; twice < 2; twice++) {
SkScalar x = x0, y = 0;
for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
- SkXfermode* mode = SkPorterDuff::CreateXfermode(gModes[i].fMode);
+ SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
fBitmap.eraseColor(0);
draw_mode(&c, mode, twice ? 0x88 : 0xFF);
- mode->safeUnref();
+ SkSafeUnref(mode);
SkPaint p;
SkRect r;
@@ -244,12 +255,12 @@
x + w/2, y - labelP.getTextSize()/2, labelP);
x += w + SkIntToScalar(10);
- if ((i & 3) == 3) {
+ if ((i % W) == W - 1) {
x = x0;
y += h + SkIntToScalar(30);
}
}
- x0 += SkIntToScalar(330);
+ x0 += SkIntToScalar(400);
}
s->unref();
}
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index 1441385..2320b1f 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -1437,13 +1437,6 @@
return mode;
}
-SkXfermode* SkPaint::setPorterDuffXfermode(SkPorterDuff::Mode mode)
-{
- fXfermode->safeUnref();
- fXfermode = SkPorterDuff::CreateXfermode(mode);
- return fXfermode;
-}
-
SkPathEffect* SkPaint::setPathEffect(SkPathEffect* effect)
{
SkRefCnt_SafeAssign(fPathEffect, effect);
@@ -1456,6 +1449,11 @@
return filter;
}
+// Helpers
+SkXfermode* SkPaint::setXfermode(SkXfermode::Mode mode) {
+ return this->setXfermode(SkXfermode::Create(mode));
+}
+
////////////////////////////////////////////////////////////////////////////////////////
bool SkPaint::getFillPath(const SkPath& src, SkPath* dst) const
diff --git a/src/core/SkStroke.cpp b/src/core/SkStroke.cpp
index 45ad0ef..1fb25a6 100644
--- a/src/core/SkStroke.cpp
+++ b/src/core/SkStroke.cpp
@@ -302,7 +302,6 @@
bool degenerateBC = !set_normal_unitnormal(pts[1], pts[2], fRadius,
&normalBC, &unitNormalBC);
-
if (degenerateBC || normals_too_curvy(unitNormalAB, unitNormalBC) ||
normals_too_curvy(unitNormalBC, *unitNormalCD)) {
// subdivide if we can
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index 9514bfa..ec42e43 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -55,6 +55,32 @@
return sum;
}
+static int clamp_signed_byte(int n) {
+ if (n < 0) {
+ n = 0;
+ } else if (n > 255) {
+ n = 255;
+ }
+ return n;
+}
+
+static int clamp_div255round(int prod) {
+ if (prod <= 0) {
+ return 0;
+ } else if (prod >= 255*255) {
+ return 255;
+ } else {
+ return SkDiv255Round(prod);
+ }
+}
+
+static int clamp_max(int value, int max) {
+ if (value > max) {
+ value = max;
+ }
+ return value;
+}
+
///////////////////////////////////////////////////////////////////////////////
bool SkXfermode::asCoeff(Coeff* src, Coeff* dst) {
@@ -440,57 +466,19 @@
SkAlphaMulAlpha(isa, SkGetPackedB32(dst)));
}
+///////////////////////////////////////////////////////////////////////////////
-// kDarken_Mode, [Sa + Da - Sa·Da, Sc·(1 - Da) + Dc·(1 - Sa) + min(Sc, Dc)]
-
-static inline unsigned darken_p(unsigned src, unsigned dst,
- unsigned src_mul, unsigned dst_mul) {
- return ((dst_mul * src + src_mul * dst) >> 8) + SkMin32(src, dst);
+// kPlus_Mode
+static SkPMColor plus_modeproc(SkPMColor src, SkPMColor dst) {
+ unsigned a = saturated_add(SkGetPackedA32(src), SkGetPackedA32(dst));
+ unsigned r = saturated_add(SkGetPackedR32(src), SkGetPackedR32(dst));
+ unsigned g = saturated_add(SkGetPackedG32(src), SkGetPackedG32(dst));
+ unsigned b = saturated_add(SkGetPackedB32(src), SkGetPackedB32(dst));
+ return SkPackARGB32(a, r, g, b);
}
-static SkPMColor darken_modeproc(SkPMColor src, SkPMColor dst) {
- unsigned sa = SkGetPackedA32(src);
- unsigned da = SkGetPackedA32(dst);
- unsigned src_scale = SkAlpha255To256(255 - sa);
- unsigned dst_scale = SkAlpha255To256(255 - da);
-
- unsigned ra = sa + da - SkAlphaMulAlpha(sa, da);
- unsigned rr = darken_p(SkGetPackedR32(src), SkGetPackedR32(dst),
- src_scale, dst_scale);
- unsigned rg = darken_p(SkGetPackedG32(src), SkGetPackedG32(dst),
- src_scale, dst_scale);
- unsigned rb = darken_p(SkGetPackedB32(src), SkGetPackedB32(dst),
- src_scale, dst_scale);
-
- return SkPackARGB32(ra, SkFastMin32(rr, ra),
- SkFastMin32(rg, ra), SkFastMin32(rb, ra));
-}
-
-// kLighten_Mode, [Sa + Da - Sa·Da, Sc·(1 - Da) + Dc·(1 - Sa) + max(Sc, Dc)]
-static inline unsigned lighten_p(unsigned src, unsigned dst,
- unsigned src_mul, unsigned dst_mul) {
- return ((dst_mul * src + src_mul * dst) >> 8) + SkMax32(src, dst);
-}
-
-static SkPMColor lighten_modeproc(SkPMColor src, SkPMColor dst) {
- unsigned sa = SkGetPackedA32(src);
- unsigned da = SkGetPackedA32(dst);
- unsigned src_scale = SkAlpha255To256(255 - sa);
- unsigned dst_scale = SkAlpha255To256(255 - da);
-
- unsigned ra = sa + da - SkAlphaMulAlpha(sa, da);
- unsigned rr = lighten_p(SkGetPackedR32(src), SkGetPackedR32(dst),
- src_scale, dst_scale);
- unsigned rg = lighten_p(SkGetPackedG32(src), SkGetPackedG32(dst),
- src_scale, dst_scale);
- unsigned rb = lighten_p(SkGetPackedB32(src), SkGetPackedB32(dst),
- src_scale, dst_scale);
-
- return SkPackARGB32(ra, SkFastMin32(rr, ra),
- SkFastMin32(rg, ra), SkFastMin32(rb, ra));
-}
-
-static SkPMColor mult_modeproc(SkPMColor src, SkPMColor dst) {
+// kMultiply_Mode
+static SkPMColor multiply_modeproc(SkPMColor src, SkPMColor dst) {
int a = SkAlphaMulAlpha(SkGetPackedA32(src), SkGetPackedA32(dst));
int r = SkAlphaMulAlpha(SkGetPackedR32(src), SkGetPackedR32(dst));
int g = SkAlphaMulAlpha(SkGetPackedG32(src), SkGetPackedG32(dst));
@@ -498,23 +486,225 @@
return SkPackARGB32(a, r, g, b);
}
-static inline int screen_byte(int a, int b) {
+// kScreen_Mode
+static inline int srcover_byte(int a, int b) {
return a + b - SkAlphaMulAlpha(a, b);
}
-
static SkPMColor screen_modeproc(SkPMColor src, SkPMColor dst) {
- int a = screen_byte(SkGetPackedA32(src), SkGetPackedA32(dst));
- int r = screen_byte(SkGetPackedR32(src), SkGetPackedR32(dst));
- int g = screen_byte(SkGetPackedG32(src), SkGetPackedG32(dst));
- int b = screen_byte(SkGetPackedB32(src), SkGetPackedB32(dst));
+ int a = srcover_byte(SkGetPackedA32(src), SkGetPackedA32(dst));
+ int r = srcover_byte(SkGetPackedR32(src), SkGetPackedR32(dst));
+ int g = srcover_byte(SkGetPackedG32(src), SkGetPackedG32(dst));
+ int b = srcover_byte(SkGetPackedB32(src), SkGetPackedB32(dst));
return SkPackARGB32(a, r, g, b);
}
-static SkPMColor add_modeproc(SkPMColor src, SkPMColor dst) {
- unsigned a = saturated_add(SkGetPackedA32(src), SkGetPackedA32(dst));
- unsigned r = saturated_add(SkGetPackedR32(src), SkGetPackedR32(dst));
- unsigned g = saturated_add(SkGetPackedG32(src), SkGetPackedG32(dst));
- unsigned b = saturated_add(SkGetPackedB32(src), SkGetPackedB32(dst));
+// kOverlay_Mode
+static inline int overlay_byte(int sc, int dc, int sa, int da) {
+ int tmp = sc * (255 - da) + dc * (255 - sa);
+ int rc;
+ if (2 * dc <= da) {
+ rc = 2 * sc * dc;
+ } else {
+ rc = sa * da - 2 * (da - dc) * (sa - sc);
+ }
+ return clamp_div255round(rc + tmp);
+}
+static SkPMColor overlay_modeproc(SkPMColor src, SkPMColor dst) {
+ int sa = SkGetPackedA32(src);
+ int da = SkGetPackedA32(dst);
+ int a = srcover_byte(sa, da);
+ int r = overlay_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
+ int g = overlay_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
+ int b = overlay_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
+ return SkPackARGB32(a, r, g, b);
+}
+
+// kDarken_Mode
+static inline int darken_byte(int sc, int dc, int sa, int da) {
+ int sd = sc * da;
+ int ds = dc * sa;
+ if (sd < ds) {
+ // srcover
+ return sc + dc - SkDiv255Round(ds);
+ } else {
+ // dstover
+ return dc + sc - SkDiv255Round(sd);
+ }
+}
+static SkPMColor darken_modeproc(SkPMColor src, SkPMColor dst) {
+ int sa = SkGetPackedA32(src);
+ int da = SkGetPackedA32(dst);
+ int a = srcover_byte(sa, da);
+ int r = darken_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
+ int g = darken_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
+ int b = darken_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
+ return SkPackARGB32(a, r, g, b);
+}
+
+// kLighten_Mode
+static inline int lighten_byte(int sc, int dc, int sa, int da) {
+ int sd = sc * da;
+ int ds = dc * sa;
+ if (sd > ds) {
+ // srcover
+ return sc + dc - SkDiv255Round(ds);
+ } else {
+ // dstover
+ return dc + sc - SkDiv255Round(sd);
+ }
+}
+static SkPMColor lighten_modeproc(SkPMColor src, SkPMColor dst) {
+ int sa = SkGetPackedA32(src);
+ int da = SkGetPackedA32(dst);
+ int a = srcover_byte(sa, da);
+ int r = lighten_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
+ int g = lighten_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
+ int b = lighten_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
+ return SkPackARGB32(a, r, g, b);
+}
+
+// kColorDodge_Mode
+static inline int colordodge_byte(int sc, int dc, int sa, int da) {
+ int diff = sa - sc;
+ int rc;
+ if (0 == diff) {
+ rc = sa * da + sc * (255 - da) + dc * (255 - sa);
+ rc = SkDiv255Round(rc);
+ } else {
+ int tmp = (dc * sa << 15) / (da * diff);
+ rc = SkDiv255Round(sa * da) * tmp >> 15;
+ // don't clamp here, since we'll do it in our modeproc
+ }
+ return rc;
+}
+static SkPMColor colordodge_modeproc(SkPMColor src, SkPMColor dst) {
+ // added to avoid div-by-zero in colordodge_byte
+ if (0 == dst) {
+ return src;
+ }
+
+ int sa = SkGetPackedA32(src);
+ int da = SkGetPackedA32(dst);
+ int a = srcover_byte(sa, da);
+ int r = colordodge_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
+ int g = colordodge_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
+ int b = colordodge_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
+ r = clamp_max(r, a);
+ g = clamp_max(g, a);
+ b = clamp_max(b, a);
+ return SkPackARGB32(a, r, g, b);
+}
+
+// kColorBurn_Mode
+static inline int colorburn_byte(int sc, int dc, int sa, int da) {
+ int rc;
+ if (dc == da && 0 == sc) {
+ rc = sa * da + dc * (255 - sa);
+ } else if (0 == sc) {
+ return SkAlphaMulAlpha(dc, 255 - sa);
+ } else {
+ int tmp = (sa * (da - dc) * 256) / (sc * da);
+ if (tmp > 256) {
+ tmp = 256;
+ }
+ int tmp2 = sa * da;
+ rc = tmp2 - (tmp2 * tmp >> 8) + sc * (255 - da) + dc * (255 - sa);
+ }
+ return SkDiv255Round(rc);
+}
+static SkPMColor colorburn_modeproc(SkPMColor src, SkPMColor dst) {
+ // added to avoid div-by-zero in colorburn_byte
+ if (0 == dst) {
+ return src;
+ }
+
+ int sa = SkGetPackedA32(src);
+ int da = SkGetPackedA32(dst);
+ int a = srcover_byte(sa, da);
+ int r = colorburn_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
+ int g = colorburn_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
+ int b = colorburn_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
+ return SkPackARGB32(a, r, g, b);
+}
+
+// kHardLight_Mode
+static inline int hardlight_byte(int sc, int dc, int sa, int da) {
+ int rc;
+ if (2 * sc <= sa) {
+ rc = 2 * sc * dc;
+ } else {
+ rc = sa * da - 2 * (da - dc) * (sa - sc);
+ }
+ return clamp_div255round(rc + sc * (255 - da) + dc * (255 - sa));
+}
+static SkPMColor hardlight_modeproc(SkPMColor src, SkPMColor dst) {
+ int sa = SkGetPackedA32(src);
+ int da = SkGetPackedA32(dst);
+ int a = srcover_byte(sa, da);
+ int r = hardlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
+ int g = hardlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
+ int b = hardlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
+ return SkPackARGB32(a, r, g, b);
+}
+
+// returns 255 * sqrt(n/255)
+static U8CPU sqrt_unit_byte(U8CPU n) {
+ return SkSqrtBits(n, 15+4);
+}
+
+// kSoftLight_Mode
+static inline int softlight_byte(int sc, int dc, int sa, int da) {
+ int m = da ? dc * 256 / da : 0;
+ int rc;
+ if (2 * sc <= sa) {
+ rc = dc * (sa + ((2 * sc - sa) * (256 - m) >> 8));
+ } else if (4 * dc <= da) {
+ int tmp = (4 * m * (4 * m + 256) * (m - 256) >> 16) + 7 * m;
+ rc = dc * sa + (da * (2 * sc - sa) * tmp >> 8);
+ } else {
+ int tmp = sqrt_unit_byte(m) - m;
+ rc = dc * sa + (da * (2 * sc - sa) * tmp >> 8);
+ }
+ return clamp_div255round(rc + sc * (255 - da) + dc * (255 - sa));
+}
+static SkPMColor softlight_modeproc(SkPMColor src, SkPMColor dst) {
+ int sa = SkGetPackedA32(src);
+ int da = SkGetPackedA32(dst);
+ int a = srcover_byte(sa, da);
+ int r = softlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
+ int g = softlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
+ int b = softlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
+ return SkPackARGB32(a, r, g, b);
+}
+
+// kDifference_Mode
+static inline int difference_byte(int sc, int dc, int sa, int da) {
+ int tmp = SkMin32(sc * da, dc * sa);
+ return clamp_signed_byte(sc + dc - 2 * SkDiv255Round(tmp));
+}
+static SkPMColor difference_modeproc(SkPMColor src, SkPMColor dst) {
+ int sa = SkGetPackedA32(src);
+ int da = SkGetPackedA32(dst);
+ int a = srcover_byte(sa, da);
+ int r = difference_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
+ int g = difference_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
+ int b = difference_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
+ return SkPackARGB32(a, r, g, b);
+}
+
+// kExclusion_Mode
+static inline int exclusion_byte(int sc, int dc, int sa, int da) {
+ // this equations is wacky, wait for SVG to confirm it
+ int r = sc * da + dc * sa - 2 * sc * dc + sc * (255 - da) + dc * (255 - sa);
+ return clamp_div255round(r);
+}
+static SkPMColor exclusion_modeproc(SkPMColor src, SkPMColor dst) {
+ int sa = SkGetPackedA32(src);
+ int da = SkGetPackedA32(dst);
+ int a = srcover_byte(sa, da);
+ int r = exclusion_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da);
+ int g = exclusion_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da);
+ int b = exclusion_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da);
return SkPackARGB32(a, r, g, b);
}
@@ -711,8 +901,6 @@
///////////////////////////////////////////////////////////////////////////////
-#include "SkPorterDuff.h"
-
struct ProcCoeff {
SkXfermodeProc fProc;
SkXfermode::Coeff fSC;
@@ -734,16 +922,24 @@
{ srcatop_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kISA_Coeff },
{ dstatop_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kSA_Coeff },
{ xor_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kISA_Coeff },
- { darken_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
- { lighten_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
- { mult_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kSC_Coeff },
- { screen_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISC_Coeff },
- { add_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }
+
+ { plus_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { multiply_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { screen_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { overlay_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { darken_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { lighten_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { colordodge_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { colorburn_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { hardlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { softlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { difference_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
+ { exclusion_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF },
};
-SkXfermode* SkPorterDuff::CreateXfermode(SkPorterDuff::Mode mode) {
- SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == SkPorterDuff::kModeCount);
- SkASSERT((unsigned)mode < SkPorterDuff::kModeCount);
+SkXfermode* SkXfermode::Create(Mode mode) {
+ SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
+ SkASSERT((unsigned)mode < kModeCount);
switch (mode) {
case kClear_Mode:
@@ -756,23 +952,22 @@
return SkNEW(SkDstInXfermode);
case kDstOut_Mode:
return SkNEW(SkDstOutXfermode);
- // these two can't be represented with Coeff
- case kDarken_Mode:
- return SkNEW_ARGS(SkProcXfermode, (darken_modeproc));
- case kLighten_Mode:
- return SkNEW_ARGS(SkProcXfermode, (lighten_modeproc));
// use the table
default: {
const ProcCoeff& rec = gProcCoeffs[mode];
- SkASSERT((unsigned)rec.fSC < SkXfermode::kCoeffCount);
- SkASSERT((unsigned)rec.fDC < SkXfermode::kCoeffCount);
- return SkNEW_ARGS(SkProcCoeffXfermode, (rec.fProc,
- rec.fSC, rec.fDC));
+ if ((unsigned)rec.fSC < SkXfermode::kCoeffCount &&
+ (unsigned)rec.fDC < SkXfermode::kCoeffCount) {
+ return SkNEW_ARGS(SkProcCoeffXfermode, (rec.fProc,
+ rec.fSC,
+ rec.fDC));
+ } else {
+ return SkNEW_ARGS(SkProcXfermode, (rec.fProc));
+ }
}
}
}
-bool SkPorterDuff::IsMode(SkXfermode* xfer, Mode* mode) {
+bool SkXfermode::IsMode(SkXfermode* xfer, Mode* mode) {
if (NULL == xfer) {
if (mode) {
*mode = kSrcOver_Mode;
@@ -789,7 +984,7 @@
for (size_t i = 0; i < SK_ARRAY_COUNT(gProcCoeffs); i++) {
if (rec[i].fSC == sc && rec[i].fDC == dc) {
if (mode) {
- *mode = SkPorterDuff::Mode(i);
+ *mode = static_cast<Mode>(i);
}
return true;
}
@@ -800,40 +995,9 @@
return false;
}
-///////////////////////////////////////////////////////////////////////////////
-
-#ifdef SK_DEBUGx
-static void unit_test() {
- for (unsigned a = 0; a <= 255; a++) {
- for (unsigned c = 0; c <= a; c++) {
- SkPMColor pm = SkPackARGB32(a, c, c, c);
- for (unsigned aa = 0; aa <= 255; aa++) {
- for (unsigned cc = 0; cc <= aa; cc++) {
- SkPMColor pm2 = SkPackARGB32(aa, cc, cc, cc);
-
- const size_t N = SK_ARRAY_COUNT(gProcCoeffs);
- for (size_t i = 0; i < N; i++) {
- gProcCoeffs[i].fProc(pm, pm2);
- }
- }
- }
- }
- }
-}
-#endif
-
-SkXfermodeProc SkPorterDuff::GetXfermodeProc(Mode mode) {
-#ifdef SK_DEBUGx
- static bool gUnitTest;
- if (!gUnitTest) {
- gUnitTest = true;
- unit_test();
- }
-#endif
-
+SkXfermodeProc SkXfermode::GetProc(Mode mode) {
SkXfermodeProc proc = NULL;
-
- if ((unsigned)mode < SkPorterDuff::kModeCount) {
+ if ((unsigned)mode < kModeCount) {
proc = gProcCoeffs[mode].fProc;
}
return proc;
@@ -962,7 +1126,7 @@
SkXfermodeProc16 fProc16_General;
};
-static const Proc16Rec gPorterDuffModeProcs16[] = {
+static const Proc16Rec gModeProcs16[] = {
{ NULL, NULL, NULL }, // CLEAR
{ NULL, src_modeproc16_255, NULL },
{ dst_modeproc16, dst_modeproc16, dst_modeproc16 },
@@ -975,18 +1139,25 @@
{ srcatop_modeproc16_0, srcatop_modeproc16_255, srcatop_modeproc16 },
{ NULL, dstatop_modeproc16_255, NULL },
{ NULL, NULL, NULL }, // XOR
- { darken_modeproc16_0, darken_modeproc16_255, NULL },
- { lighten_modeproc16_0, lighten_modeproc16_255, NULL },
- { NULL, NULL, NULL },//multiply
- { NULL, NULL, NULL }// screen
+
+ { NULL, NULL, NULL }, // plus
+ { NULL, NULL, NULL }, // multiply
+ { NULL, NULL, NULL }, // screen
+ { NULL, NULL, NULL }, // overlay
+ { darken_modeproc16_0, darken_modeproc16_255, NULL }, // darken
+ { lighten_modeproc16_0, lighten_modeproc16_255, NULL }, // lighten
+ { NULL, NULL, NULL }, // colordodge
+ { NULL, NULL, NULL }, // colorburn
+ { NULL, NULL, NULL }, // hardlight
+ { NULL, NULL, NULL }, // softlight
+ { NULL, NULL, NULL }, // difference
+ { NULL, NULL, NULL }, // exclusion
};
-SkXfermodeProc16 SkPorterDuff::GetXfermodeProc16(Mode mode, SkColor srcColor) {
+SkXfermodeProc16 SkXfermode::GetProc16(Mode mode, SkColor srcColor) {
SkXfermodeProc16 proc16 = NULL;
-
- if ((unsigned)mode < SkPorterDuff::kModeCount) {
- const Proc16Rec& rec = gPorterDuffModeProcs16[mode];
-
+ if ((unsigned)mode < kModeCount) {
+ const Proc16Rec& rec = gModeProcs16[mode];
unsigned a = SkColorGetA(srcColor);
if (0 == a) {
diff --git a/src/effects/SkPorterDuff.cpp b/src/effects/SkPorterDuff.cpp
new file mode 100644
index 0000000..42f93b8
--- /dev/null
+++ b/src/effects/SkPorterDuff.cpp
@@ -0,0 +1,75 @@
+#include "SkPorterDuff.h"
+#include "SkXfermode.h"
+
+/* This file just exists as a compatibility layer, gluing the PorterDuff API
+ into the (extended) SkXfermode API
+ */
+
+#define MAKE_PAIR(mode) { SkPorterDuff::k##mode##_Mode, SkXfermode::k##mode##_Mode }
+
+// this table must be in SkPorterDuff::Mode order, so it can be indexed directly
+// with a porterduff mode.
+static const struct Pair {
+ SkPorterDuff::Mode fPD;
+ SkXfermode::Mode fXF;
+} gPairs[] = {
+ MAKE_PAIR(Clear),
+ MAKE_PAIR(Src),
+ MAKE_PAIR(Dst),
+ MAKE_PAIR(SrcOver),
+ MAKE_PAIR(DstOver),
+ MAKE_PAIR(SrcIn),
+ MAKE_PAIR(DstIn),
+ MAKE_PAIR(SrcOut),
+ MAKE_PAIR(DstOut),
+ MAKE_PAIR(SrcATop),
+ MAKE_PAIR(DstATop),
+ MAKE_PAIR(Xor),
+ MAKE_PAIR(Darken),
+ MAKE_PAIR(Lighten),
+ MAKE_PAIR(Multiply),
+ MAKE_PAIR(Screen),
+ { SkPorterDuff::kAdd_Mode, SkXfermode::kPlus_Mode }
+};
+
+static bool find_pdmode(SkXfermode::Mode src, SkPorterDuff::Mode* dst) {
+ const Pair* pairs = gPairs;
+ for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) {
+ if (pairs[i].fXF == src) {
+ if (dst) {
+ *dst = pairs[i].fPD;
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+SkXfermode* SkPorterDuff::CreateXfermode(SkPorterDuff::Mode mode) {
+ const Pair& pair = gPairs[mode];
+ SkASSERT(pair.fPD == mode);
+ return SkXfermode::Create(pair.fXF);
+}
+
+bool SkPorterDuff::IsMode(SkXfermode* xfer, Mode* pdmode) {
+ SkXfermode::Mode xfmode;
+ if (!SkXfermode::IsMode(xfer, &xfmode)) {
+ return false;
+ }
+ return find_pdmode(xfmode, pdmode);
+}
+
+SkXfermodeProc SkPorterDuff::GetXfermodeProc(Mode mode) {
+ return SkXfermode::GetProc(gPairs[mode].fXF);
+}
+
+SkXfermodeProc16 SkPorterDuff::GetXfermodeProc16(Mode mode, SkColor srcColor) {
+ return SkXfermode::GetProc16(gPairs[mode].fXF, srcColor);
+}
+
+// DEPRECATED
+#include "SkPaint.h"
+SkXfermode* SkPaint::setPorterDuffXfermode(SkPorterDuff::Mode mode) {
+ return this->setXfermode(SkPorterDuff::CreateXfermode(mode));
+}
+
diff --git a/src/effects/effects_files.mk b/src/effects/effects_files.mk
index 6fa43f5..f570f15 100644
--- a/src/effects/effects_files.mk
+++ b/src/effects/effects_files.mk
@@ -20,4 +20,5 @@
SkLayerRasterizer.cpp \
SkPaintFlagsDrawFilter.cpp \
SkPixelXorXfermode.cpp \
+ SkPorterDuff.cpp \
SkRectShape.cpp
diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp
index 8c11604..7aa14b2 100644
--- a/src/ports/SkFontHost_FreeType.cpp
+++ b/src/ports/SkFontHost_FreeType.cpp
@@ -75,7 +75,9 @@
virtual ~SkScalerContext_FreeType();
bool success() const {
- return fFaceRec != NULL && fFTSize != NULL;
+ return fFaceRec != NULL &&
+ fFTSize != NULL &&
+ fFace != NULL;
}
protected:
@@ -761,10 +763,6 @@
}
FT_Face face = fFace;
- if (!face) {
- goto ERROR;
- }
-
int upem = face->units_per_EM;
if (upem <= 0) {
goto ERROR;
diff --git a/tests/PaintTest.cpp b/tests/PaintTest.cpp
new file mode 100644
index 0000000..4e6c8b9
--- /dev/null
+++ b/tests/PaintTest.cpp
@@ -0,0 +1,43 @@
+#include "Test.h"
+#include "SkPath.h"
+#include "SkPaint.h"
+
+// found and fixed for webkit: mishandling when we hit recursion limit on
+// mostly degenerate cubic flatness test
+static void regression_cubic(skiatest::Reporter* reporter) {
+ SkPath path, stroke;
+ SkPaint paint;
+
+ path.moveTo(460.2881309415525, 303.250847066498);
+ path.cubicTo(463.36378422175284, 302.1169735073363,
+ 456.32239330810046, 304.720354932878,
+ 453.15255460013304, 305.788586869862);
+
+ SkRect fillR, strokeR;
+ fillR = path.getBounds();
+
+ paint.setStyle(SkPaint::kStroke_Style);
+ paint.setStrokeWidth(SkIntToScalar(2));
+ paint.getFillPath(path, &stroke);
+ strokeR = stroke.getBounds();
+
+ SkRect maxR = fillR;
+ SkScalar miter = SkMaxScalar(SK_Scalar1, paint.getStrokeMiter());
+ SkScalar inset = paint.getStrokeJoin() == SkPaint::kMiter_Join ?
+ SkScalarMul(paint.getStrokeWidth(), miter) :
+ paint.getStrokeWidth();
+ maxR.inset(-inset, -inset);
+
+ // test that our stroke didn't explode
+ REPORTER_ASSERT(reporter, maxR.contains(strokeR));
+}
+
+static void TestPaint(skiatest::Reporter* reporter) {
+ // TODO add general paint tests
+
+ // regression tests
+ regression_cubic(reporter);
+}
+
+#include "TestClassDef.h"
+DEFINE_TESTCLASS("Paint", TestPaintClass, TestPaint)
diff --git a/tests/tests_files.mk b/tests/tests_files.mk
index bce5be7..04fc013 100644
--- a/tests/tests_files.mk
+++ b/tests/tests_files.mk
@@ -7,6 +7,7 @@
StringTest.cpp \
Test.cpp \
UtilsTest.cpp \
+ PaintTest.cpp \
ParsePathTest.cpp \
PathTest.cpp \
ClipCubicTest.cpp \
diff --git a/xcode/effects/effects.xcodeproj/project.pbxproj b/xcode/effects/effects.xcodeproj/project.pbxproj
index ed81d52..1f435b5 100644
--- a/xcode/effects/effects.xcodeproj/project.pbxproj
+++ b/xcode/effects/effects.xcodeproj/project.pbxproj
@@ -42,6 +42,7 @@
002886D20EFAEA260083E387 /* SkNinePatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886CA0EFAEA260083E387 /* SkNinePatch.cpp */; };
002886D30EFAEA260083E387 /* SkProxyCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886CB0EFAEA260083E387 /* SkProxyCanvas.cpp */; };
002886D40EFAEA260083E387 /* SkUnitMappers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 002886CC0EFAEA260083E387 /* SkUnitMappers.cpp */; };
+ 005E92230FEFC571008965B9 /* SkPorterDuff.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 005E92220FEFC571008965B9 /* SkPorterDuff.cpp */; };
2762F61D0FCCC92C002BD8B4 /* SkGroupShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2762F61A0FCCC92C002BD8B4 /* SkGroupShape.cpp */; };
2762F61E0FCCC92C002BD8B4 /* SkNWayCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2762F61B0FCCC92C002BD8B4 /* SkNWayCanvas.cpp */; };
2762F61F0FCCC92C002BD8B4 /* SkRectShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2762F61C0FCCC92C002BD8B4 /* SkRectShape.cpp */; };
@@ -83,6 +84,7 @@
002886CA0EFAEA260083E387 /* SkNinePatch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkNinePatch.cpp; path = ../../src/utils/SkNinePatch.cpp; sourceTree = SOURCE_ROOT; };
002886CB0EFAEA260083E387 /* SkProxyCanvas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkProxyCanvas.cpp; path = ../../src/utils/SkProxyCanvas.cpp; sourceTree = SOURCE_ROOT; };
002886CC0EFAEA260083E387 /* SkUnitMappers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkUnitMappers.cpp; path = ../../src/utils/SkUnitMappers.cpp; sourceTree = SOURCE_ROOT; };
+ 005E92220FEFC571008965B9 /* SkPorterDuff.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkPorterDuff.cpp; path = ../../src/effects/SkPorterDuff.cpp; sourceTree = SOURCE_ROOT; };
2762F61A0FCCC92C002BD8B4 /* SkGroupShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkGroupShape.cpp; path = ../../src/effects/SkGroupShape.cpp; sourceTree = SOURCE_ROOT; };
2762F61B0FCCC92C002BD8B4 /* SkNWayCanvas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkNWayCanvas.cpp; path = ../../src/effects/SkNWayCanvas.cpp; sourceTree = SOURCE_ROOT; };
2762F61C0FCCC92C002BD8B4 /* SkRectShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkRectShape.cpp; path = ../../src/effects/SkRectShape.cpp; sourceTree = SOURCE_ROOT; };
@@ -103,6 +105,7 @@
002886D50EFAEA350083E387 /* utils */ = {
isa = PBXGroup;
children = (
+ 005E92220FEFC571008965B9 /* SkPorterDuff.cpp */,
000A996B0FD97113007E45BD /* SkParse.cpp */,
000A996C0FD97113007E45BD /* SkParseColor.cpp */,
000A996D0FD97113007E45BD /* SkParsePath.cpp */,
@@ -268,6 +271,7 @@
000A996E0FD97113007E45BD /* SkParse.cpp in Sources */,
000A996F0FD97113007E45BD /* SkParseColor.cpp in Sources */,
000A99700FD97113007E45BD /* SkParsePath.cpp in Sources */,
+ 005E92230FEFC571008965B9 /* SkPorterDuff.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/xcode/sampleapp/SampleApp.xcodeproj/project.pbxproj b/xcode/sampleapp/SampleApp.xcodeproj/project.pbxproj
index 0ca9d9f..a8fd22c 100644
--- a/xcode/sampleapp/SampleApp.xcodeproj/project.pbxproj
+++ b/xcode/sampleapp/SampleApp.xcodeproj/project.pbxproj
@@ -8,7 +8,6 @@
/* Begin PBXBuildFile section */
00003C660EFC22A8000FF73A /* SampleApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00003C620EFC22A8000FF73A /* SampleApp.cpp */; };
- 00003C680EFC22A8000FF73A /* SamplePath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00003C640EFC22A8000FF73A /* SamplePath.cpp */; };
00003C690EFC22A8000FF73A /* SamplePathEffects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00003C650EFC22A8000FF73A /* SamplePathEffects.cpp */; };
00003C740EFC22CE000FF73A /* SkEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00003C6B0EFC22CE000FF73A /* SkEvent.cpp */; };
00003C750EFC22CE000FF73A /* SkEventSink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00003C6C0EFC22CE000FF73A /* SkEventSink.cpp */; };
@@ -63,8 +62,8 @@
007A7CBE0F01658C00A2D6EE /* SampleTiling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 007A7CAF0F01658C00A2D6EE /* SampleTiling.cpp */; };
007A7CBF0F01658C00A2D6EE /* SampleTypeface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 007A7CB00F01658C00A2D6EE /* SampleTypeface.cpp */; };
007A7CC00F01658C00A2D6EE /* SampleVertices.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 007A7CB10F01658C00A2D6EE /* SampleVertices.cpp */; };
- 007A7CC10F01658C00A2D6EE /* SampleXfermodes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 007A7CB20F01658C00A2D6EE /* SampleXfermodes.cpp */; };
007C785E0F3B4C230004B142 /* SamplePathClip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 007C785D0F3B4C230004B142 /* SamplePathClip.cpp */; };
+ 0088C1160FEC311C00CE52F5 /* SampleXfermodes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 007A7CB20F01658C00A2D6EE /* SampleXfermodes.cpp */; };
008C4D980F77DAEE0056981C /* SampleHairline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 008C4D970F77DAEE0056981C /* SampleHairline.cpp */; };
009490320FB0A5B90063C792 /* SampleLayerMask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 009490310FB0A5B90063C792 /* SampleLayerMask.cpp */; };
009CC9190F65918A002185BE /* SampleFontScalerTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 009CC9180F65918A002185BE /* SampleFontScalerTest.cpp */; };
@@ -72,6 +71,7 @@
00A7282F0FD43D3700D5051F /* SkMovie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00A7282D0FD43D3700D5051F /* SkMovie.cpp */; };
00A7295D0FD8397600D5051F /* SampleAll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2762F6740FCCCB01002BD8B4 /* SampleAll.cpp */; };
00AF77B00FE2EA2D007F9650 /* SampleTestGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00A729630FD93ED600D5051F /* SampleTestGL.cpp */; };
+ 00AF787E0FE94433007F9650 /* SamplePath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00003C640EFC22A8000FF73A /* SamplePath.cpp */; };
00C55DA10F8552DC000CAC09 /* SampleGradients.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00C55DA00F8552DC000CAC09 /* SampleGradients.cpp */; };
00FF39140FC6ED2C00915187 /* SampleEffects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00FF39130FC6ED2C00915187 /* SampleEffects.cpp */; };
0156F80407C56A3000C6122B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0156F80307C56A3000C6122B /* Foundation.framework */; };
@@ -508,7 +508,6 @@
buildActionMask = 2147483647;
files = (
00003C660EFC22A8000FF73A /* SampleApp.cpp in Sources */,
- 00003C680EFC22A8000FF73A /* SamplePath.cpp in Sources */,
00003C690EFC22A8000FF73A /* SamplePathEffects.cpp in Sources */,
00003C740EFC22CE000FF73A /* SkEvent.cpp in Sources */,
00003C750EFC22CE000FF73A /* SkEventSink.cpp in Sources */,
@@ -554,7 +553,6 @@
007A7CBE0F01658C00A2D6EE /* SampleTiling.cpp in Sources */,
007A7CBF0F01658C00A2D6EE /* SampleTypeface.cpp in Sources */,
007A7CC00F01658C00A2D6EE /* SampleVertices.cpp in Sources */,
- 007A7CC10F01658C00A2D6EE /* SampleXfermodes.cpp in Sources */,
0041CE3C0F00A12400695E8C /* SampleEncode.cpp in Sources */,
007C785E0F3B4C230004B142 /* SamplePathClip.cpp in Sources */,
009CC9190F65918A002185BE /* SampleFontScalerTest.cpp in Sources */,
@@ -575,6 +573,8 @@
000A99820FD97526007E45BD /* SampleArc.cpp in Sources */,
00AF77B00FE2EA2D007F9650 /* SampleTestGL.cpp in Sources */,
2794C04F0FE72903009AD112 /* SampleMipMap.cpp in Sources */,
+ 00AF787E0FE94433007F9650 /* SamplePath.cpp in Sources */,
+ 0088C1160FEC311C00CE52F5 /* SampleXfermodes.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};