Index: src/core/SkScan_AAAPath.cpp |
diff --git a/src/core/SkScan_AAAPath.cpp b/src/core/SkScan_AAAPath.cpp |
index 4bbeccf362a3c3120362c85a863e614cd86090e4..aab253ce8d04ecb2f9378ba1dc2a9f5af89c90e7 100644 |
--- a/src/core/SkScan_AAAPath.cpp |
+++ b/src/core/SkScan_AAAPath.cpp |
@@ -190,8 +190,8 @@ private: |
int fY; |
}; |
-MaskAdditiveBlitter::MaskAdditiveBlitter(SkBlitter* realBlitter, const SkIRect& ir, const SkRegion& clip, |
- bool isInverse) { |
+MaskAdditiveBlitter::MaskAdditiveBlitter( |
+ SkBlitter* realBlitter, const SkIRect& ir, const SkRegion& clip, bool isInverse) { |
SkASSERT(canHandleRect(ir)); |
SkASSERT(!isInverse); |
@@ -367,8 +367,8 @@ private: |
} |
}; |
-RunBasedAdditiveBlitter::RunBasedAdditiveBlitter(SkBlitter* realBlitter, const SkIRect& ir, const SkRegion& clip, |
- bool isInverse) { |
+RunBasedAdditiveBlitter::RunBasedAdditiveBlitter( |
+ SkBlitter* realBlitter, const SkIRect& ir, const SkRegion& clip, bool isInverse) { |
fRealBlitter = realBlitter; |
SkIRect sectBounds; |
@@ -533,7 +533,8 @@ static inline void computeAlphaAboveLine(SkAlpha* alphas, SkFixed l, SkFixed r, |
} |
// Here we always send in l < SK_Fixed1, and the first alpha we want to compute is alphas[0] |
-static inline void computeAlphaBelowLine(SkAlpha* alphas, SkFixed l, SkFixed r, SkFixed dY, SkAlpha fullAlpha) { |
+static inline void computeAlphaBelowLine( |
+ SkAlpha* alphas, SkFixed l, SkFixed r, SkFixed dY, SkAlpha fullAlpha) { |
SkASSERT(l <= r); |
SkASSERT(l >> 16 == 0); |
int R = SkFixedCeilToInt(r); |
@@ -965,9 +966,9 @@ static inline void aaa_walk_convex_edges(SkAnalyticEdge* prevHead, AdditiveBlitt |
} |
local_bot_fixed = SkMin32(local_bot_fixed, SkIntToFixed(stop_y)); |
- SkFixed left = leftE->fX; |
+ SkFixed left = SkTMax(leftBound, leftE->fX); |
SkFixed dLeft = leftE->fDX; |
- SkFixed rite = riteE->fX; |
+ SkFixed rite = SkTMin(riteBound, riteE->fX); |
SkFixed dRite = riteE->fDX; |
if (0 == (dLeft | dRite)) { |
int fullLeft = SkFixedCeilToInt(left); |
@@ -1077,6 +1078,9 @@ static inline void aaa_walk_convex_edges(SkAnalyticEdge* prevHead, AdditiveBlitt |
SkFixed dY = nextY - y; |
SkFixed nextLeft = left + SkFixedMul_lowprec(dLeft, dY); |
SkFixed nextRite = rite + SkFixedMul_lowprec(dRite, dY); |
+ SkASSERT((left & kSnapMask) >= leftBound && (rite & kSnapMask) <= riteBound && |
+ (nextLeft & kSnapMask) >= leftBound && |
+ (nextRite & kSnapMask) <= riteBound); |
blit_trapezoid_row(blitter, y >> 16, left & kSnapMask, rite & kSnapMask, |
nextLeft & kSnapMask, nextRite & kSnapMask, leftE->fDY, riteE->fDY, |
getPartialAlpha(0xFF, dY), maskRow, isUsingMask); |
@@ -1092,6 +1096,9 @@ static inline void aaa_walk_convex_edges(SkAnalyticEdge* prevHead, AdditiveBlitt |
maskRow = static_cast<MaskAdditiveBlitter*>(blitter)->getRow(y >> 16); |
} |
SkFixed nextY = y + SK_Fixed1, nextLeft = left + dLeft, nextRite = rite + dRite; |
+ SkASSERT((left & kSnapMask) >= leftBound && (rite & kSnapMask) <= riteBound && |
+ (nextLeft & kSnapMask) >= leftBound && |
+ (nextRite & kSnapMask) <= riteBound); |
blit_trapezoid_row(blitter, y >> 16, left & kSnapMask, rite & kSnapMask, |
nextLeft & kSnapMask, nextRite & kSnapMask, |
leftE->fDY, riteE->fDY, 0xFF, maskRow, isUsingMask); |
@@ -1113,6 +1120,8 @@ static inline void aaa_walk_convex_edges(SkAnalyticEdge* prevHead, AdditiveBlitt |
// Note that we substract kSnapHalf later so we have to add them to leftBound/riteBound |
SkFixed nextLeft = SkTMax(left + SkFixedMul_lowprec(dLeft, dY), leftBound + kSnapHalf); |
SkFixed nextRite = SkTMin(rite + SkFixedMul_lowprec(dRite, dY), riteBound + kSnapHalf); |
+ SkASSERT((left & kSnapMask) >= leftBound && (rite & kSnapMask) <= riteBound && |
+ (nextLeft & kSnapMask) >= leftBound && (nextRite & kSnapMask) <= riteBound); |
blit_trapezoid_row(blitter, y >> 16, left & kSnapMask, rite & kSnapMask, |
nextLeft & kSnapMask, nextRite & kSnapMask, leftE->fDY, riteE->fDY, |
getPartialAlpha(0xFF, dY), maskRow, isUsingMask); |