Index: src/core/SkDraw.cpp |
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp |
index fa2ac9863e4590e566f27485cd01ec510045b026..84899789cfcbf92e42b10caaeeef5bf0c10163bc 100644 |
--- a/src/core/SkDraw.cpp |
+++ b/src/core/SkDraw.cpp |
@@ -7,7 +7,6 @@ |
#include "SkDraw.h" |
#include "SkBlitter.h" |
-#include "SkBounder.h" |
#include "SkCanvas.h" |
#include "SkColorPriv.h" |
#include "SkDevice.h" |
@@ -259,9 +258,6 @@ void SkDraw::drawPaint(const SkPaint& paint) const { |
SkIRect devRect; |
devRect.set(0, 0, fBitmap->width(), fBitmap->height()); |
- if (fBounder && !fBounder->doIRect(devRect)) { |
- return; |
- } |
if (fRC->isBW()) { |
/* If we don't have a shader (i.e. we're just a solid color) we may |
@@ -535,21 +531,6 @@ PtProcRec::Proc PtProcRec::chooseProc(SkBlitter** blitterPtr) { |
return proc; |
} |
-static bool bounder_points(SkBounder* bounder, SkCanvas::PointMode mode, |
- size_t count, const SkPoint pts[], |
- const SkPaint& paint, const SkMatrix& matrix) { |
- SkIRect ibounds; |
- SkRect bounds; |
- SkScalar inset = paint.getStrokeWidth(); |
- |
- bounds.set(pts, SkToInt(count)); |
- bounds.inset(-inset, -inset); |
- matrix.mapRect(&bounds); |
- |
- bounds.roundOut(&ibounds); |
- return bounder->doIRect(ibounds); |
-} |
- |
// each of these costs 8-bytes of stack space, so don't make it too large |
// must be even for lines/polygon to work |
#define MAX_DEV_PTS 32 |
@@ -574,19 +555,6 @@ void SkDraw::drawPoints(SkCanvas::PointMode mode, size_t count, |
return; |
} |
- if (fBounder) { |
- if (!bounder_points(fBounder, mode, count, pts, paint, *fMatrix)) { |
- return; |
- } |
- |
- // clear the bounder and call this again, so we don't invoke the bounder |
- // later if we happen to call ourselves for drawRect, drawPath, etc. |
- SkDraw noBounder(*this); |
- noBounder.fBounder = NULL; |
- noBounder.drawPoints(mode, count, pts, paint, forceUseDevice); |
- return; |
- } |
- |
PtProcRec rec; |
if (!forceUseDevice && rec.init(mode, paint, fMatrix, fRC)) { |
SkAutoBlitterChoose blitter(*fBitmap, *fMatrix, paint); |
@@ -842,10 +810,6 @@ void SkDraw::drawRect(const SkRect& rect, const SkPaint& paint) const { |
matrix.mapPoints(rect_points(devRect), rect_points(rect), 2); |
devRect.sort(); |
- if (fBounder && !fBounder->doRect(devRect, paint)) { |
- return; |
- } |
- |
// look for the quick exit, before we build a blitter |
SkIRect ir; |
devRect.roundOut(&ir); |
@@ -916,10 +880,6 @@ void SkDraw::drawDevMask(const SkMask& srcM, const SkPaint& paint) const { |
} |
SkAutoMaskFreeImage ami(dstM.fImage); |
- if (fBounder && !fBounder->doIRect(mask->fBounds)) { |
- return; |
- } |
- |
SkAutoBlitterChoose blitterChooser(*fBitmap, *fMatrix, paint); |
SkBlitter* blitter = blitterChooser.get(); |
@@ -1015,8 +975,7 @@ void SkDraw::drawRRect(const SkRRect& rrect, const SkPaint& paint) const { |
SkRRect devRRect; |
if (rrect.transform(*fMatrix, &devRRect)) { |
SkAutoBlitterChoose blitter(*fBitmap, *fMatrix, paint); |
- if (paint.getMaskFilter()->filterRRect(devRRect, *fMatrix, *fRC, |
- fBounder, blitter.get(), |
+ if (paint.getMaskFilter()->filterRRect(devRRect, *fMatrix, *fRC, blitter.get(), |
SkPaint::kFill_Style)) { |
return; // filterRRect() called the blitter, so we're done |
} |
@@ -1123,17 +1082,11 @@ void SkDraw::drawPath(const SkPath& origSrcPath, const SkPaint& origPaint, |
if (paint->getMaskFilter()) { |
SkPaint::Style style = doFill ? SkPaint::kFill_Style : |
SkPaint::kStroke_Style; |
- if (paint->getMaskFilter()->filterPath(*devPathPtr, *fMatrix, *fRC, |
- fBounder, blitter.get(), |
- style)) { |
+ if (paint->getMaskFilter()->filterPath(*devPathPtr, *fMatrix, *fRC, blitter.get(), style)) { |
return; // filterPath() called the blitter, so we're done |
} |
} |
- if (fBounder && !fBounder->doPath(*devPathPtr, *paint, doFill)) { |
- return; |
- } |
- |
void (*proc)(const SkPath&, const SkRasterClip&, SkBlitter*); |
if (doFill) { |
if (paint->isAntiAlias()) { |
@@ -1283,18 +1236,7 @@ void SkDraw::drawBitmap(const SkBitmap& bitmap, const SkMatrix& prematrix, |
return; |
} |
- if (fBounder && just_translate(matrix, bitmap)) { |
- SkIRect ir; |
- int32_t ix = SkScalarRoundToInt(matrix.getTranslateX()); |
- int32_t iy = SkScalarRoundToInt(matrix.getTranslateY()); |
- ir.set(ix, iy, ix + bitmap.width(), iy + bitmap.height()); |
- if (!fBounder->doIRect(ir)) { |
- return; |
- } |
- } |
- |
- if (bitmap.colorType() != kAlpha_8_SkColorType && |
- just_translate(matrix, bitmap)) { |
+ if (bitmap.colorType() != kAlpha_8_SkColorType && just_translate(matrix, bitmap)) { |
// |
// It is safe to call lock pixels now, since we know the matrix is |
// (more or less) identity. |
@@ -1366,10 +1308,6 @@ void SkDraw::drawSprite(const SkBitmap& bitmap, int x, int y, |
x, y, &allocator); |
if (blitter) { |
- if (fBounder && !fBounder->doIRect(bounds)) { |
- return; |
- } |
- |
SkScan::FillIRect(bounds, *fRC, blitter); |
return; |
} |
@@ -1472,13 +1410,10 @@ void SkDraw::drawText_asPaths(const char text[], size_t byteLength, |
////////////////////////////////////////////////////////////////////////////// |
-static void D1G_NoBounder_RectClip(const SkDraw1Glyph& state, |
- SkFixed fx, SkFixed fy, |
- const SkGlyph& glyph) { |
+static void D1G_RectClip(const SkDraw1Glyph& state, SkFixed fx, SkFixed fy, const SkGlyph& glyph) { |
int left = SkFixedFloorToInt(fx); |
int top = SkFixedFloorToInt(fy); |
SkASSERT(glyph.fWidth > 0 && glyph.fHeight > 0); |
- SkASSERT(NULL == state.fBounder); |
SkASSERT((NULL == state.fClip && state.fAAClip) || |
(state.fClip && NULL == state.fAAClip && state.fClip->isRect())); |
@@ -1516,14 +1451,11 @@ static void D1G_NoBounder_RectClip(const SkDraw1Glyph& state, |
state.blitMask(mask, *bounds); |
} |
-static void D1G_NoBounder_RgnClip(const SkDraw1Glyph& state, |
- SkFixed fx, SkFixed fy, |
- const SkGlyph& glyph) { |
+static void D1G_RgnClip(const SkDraw1Glyph& state, SkFixed fx, SkFixed fy, const SkGlyph& glyph) { |
int left = SkFixedFloorToInt(fx); |
int top = SkFixedFloorToInt(fy); |
SkASSERT(glyph.fWidth > 0 && glyph.fHeight > 0); |
SkASSERT(!state.fClip->isRect()); |
- SkASSERT(NULL == state.fBounder); |
SkMask mask; |
@@ -1553,60 +1485,6 @@ static void D1G_NoBounder_RgnClip(const SkDraw1Glyph& state, |
} |
} |
-static void D1G_Bounder(const SkDraw1Glyph& state, |
- SkFixed fx, SkFixed fy, |
- const SkGlyph& glyph) { |
- int left = SkFixedFloorToInt(fx); |
- int top = SkFixedFloorToInt(fy); |
- SkASSERT(glyph.fWidth > 0 && glyph.fHeight > 0); |
- |
- SkMask mask; |
- |
- left += glyph.fLeft; |
- top += glyph.fTop; |
- |
- mask.fBounds.set(left, top, left + glyph.fWidth, top + glyph.fHeight); |
- SkRegion::Cliperator clipper(*state.fClip, mask.fBounds); |
- |
- if (!clipper.done()) { |
- const SkIRect& cr = clipper.rect(); |
- const uint8_t* aa = (const uint8_t*)glyph.fImage; |
- if (NULL == aa) { |
- aa = (uint8_t*)state.fCache->findImage(glyph); |
- if (NULL == aa) { |
- return; |
- } |
- } |
- |
- // we need to pass the origin, which we approximate with our |
- // (unadjusted) left,top coordinates (the caller called fixedfloor) |
- if (state.fBounder->doIRectGlyph(cr, |
- left - glyph.fLeft, |
- top - glyph.fTop, glyph)) { |
- mask.fRowBytes = glyph.rowBytes(); |
- mask.fFormat = static_cast<SkMask::Format>(glyph.fMaskFormat); |
- mask.fImage = (uint8_t*)aa; |
- do { |
- state.blitMask(mask, cr); |
- clipper.next(); |
- } while (!clipper.done()); |
- } |
- } |
-} |
- |
-static void D1G_Bounder_AAClip(const SkDraw1Glyph& state, |
- SkFixed fx, SkFixed fy, |
- const SkGlyph& glyph) { |
- int left = SkFixedFloorToInt(fx); |
- int top = SkFixedFloorToInt(fy); |
- SkIRect bounds; |
- bounds.set(left, top, left + glyph.fWidth, top + glyph.fHeight); |
- |
- if (state.fBounder->doIRectGlyph(bounds, left, top, glyph)) { |
- D1G_NoBounder_RectClip(state, fx, fy, glyph); |
- } |
-} |
- |
static bool hasCustomD1GProc(const SkDraw& draw) { |
return draw.fProcs && draw.fProcs->fD1GProc; |
} |
@@ -1615,10 +1493,9 @@ static bool needsRasterTextBlit(const SkDraw& draw) { |
return !hasCustomD1GProc(draw); |
} |
-SkDraw1Glyph::Proc SkDraw1Glyph::init(const SkDraw* draw, SkBlitter* blitter, |
- SkGlyphCache* cache, const SkPaint& pnt) { |
+SkDraw1Glyph::Proc SkDraw1Glyph::init(const SkDraw* draw, SkBlitter* blitter, SkGlyphCache* cache, |
+ const SkPaint& pnt) { |
fDraw = draw; |
- fBounder = draw->fBounder; |
fBlitter = blitter; |
fCache = cache; |
fPaint = &pnt; |
@@ -1640,24 +1517,16 @@ SkDraw1Glyph::Proc SkDraw1Glyph::init(const SkDraw* draw, SkBlitter* blitter, |
fAAClip = NULL; |
fClip = &draw->fRC->bwRgn(); |
fClipBounds = fClip->getBounds(); |
- if (NULL == fBounder) { |
- if (fClip->isRect()) { |
- return D1G_NoBounder_RectClip; |
- } else { |
- return D1G_NoBounder_RgnClip; |
- } |
+ if (fClip->isRect()) { |
+ return D1G_RectClip; |
} else { |
- return D1G_Bounder; |
+ return D1G_RgnClip; |
} |
} else { // aaclip |
fAAClip = &draw->fRC->aaRgn(); |
fClip = NULL; |
fClipBounds = fAAClip->getBounds(); |
- if (NULL == fBounder) { |
- return D1G_NoBounder_RectClip; |
- } else { |
- return D1G_Bounder_AAClip; |
- } |
+ return D1G_RectClip; |
} |
} |
@@ -2377,14 +2246,6 @@ void SkDraw::drawVertices(SkCanvas::VertexMode vmode, int count, |
SkPoint* devVerts = storage.get(); |
fMatrix->mapPoints(devVerts, vertices, count); |
- if (fBounder) { |
- SkRect bounds; |
- bounds.set(devVerts, count); |
- if (!fBounder->doRect(bounds, paint)) { |
- return; |
- } |
- } |
- |
/* |
We can draw the vertices in 1 of 4 ways: |
@@ -2516,97 +2377,6 @@ void SkDraw::validate() const { |
#endif |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-SkBounder::SkBounder() { |
- // initialize up front. This gets reset by SkCanvas before each draw call. |
- fClip = &SkRegion::GetEmptyRegion(); |
-} |
- |
-bool SkBounder::doIRect(const SkIRect& r) { |
- SkIRect rr; |
- return rr.intersect(fClip->getBounds(), r) && this->onIRect(rr); |
-} |
- |
-// TODO: change the prototype to take fixed, and update the callers |
-bool SkBounder::doIRectGlyph(const SkIRect& r, int x, int y, |
- const SkGlyph& glyph) { |
- SkIRect rr; |
- if (!rr.intersect(fClip->getBounds(), r)) { |
- return false; |
- } |
- GlyphRec rec; |
- rec.fLSB.set(SkIntToFixed(x), SkIntToFixed(y)); |
- rec.fRSB.set(rec.fLSB.fX + glyph.fAdvanceX, |
- rec.fLSB.fY + glyph.fAdvanceY); |
- rec.fGlyphID = glyph.getGlyphID(); |
- rec.fFlags = 0; |
- return this->onIRectGlyph(rr, rec); |
-} |
- |
-bool SkBounder::doHairline(const SkPoint& pt0, const SkPoint& pt1, |
- const SkPaint& paint) { |
- SkIRect r; |
- SkScalar v0, v1; |
- |
- v0 = pt0.fX; |
- v1 = pt1.fX; |
- if (v0 > v1) { |
- SkTSwap<SkScalar>(v0, v1); |
- } |
- r.fLeft = SkScalarFloorToInt(v0); |
- r.fRight = SkScalarCeilToInt(v1); |
- |
- v0 = pt0.fY; |
- v1 = pt1.fY; |
- if (v0 > v1) { |
- SkTSwap<SkScalar>(v0, v1); |
- } |
- r.fTop = SkScalarFloorToInt(v0); |
- r.fBottom = SkScalarCeilToInt(v1); |
- |
- if (paint.isAntiAlias()) { |
- r.inset(-1, -1); |
- } |
- return this->doIRect(r); |
-} |
- |
-bool SkBounder::doRect(const SkRect& rect, const SkPaint& paint) { |
- SkIRect r; |
- |
- if (paint.getStyle() == SkPaint::kFill_Style) { |
- rect.round(&r); |
- } else { |
- int rad = -1; |
- rect.roundOut(&r); |
- if (paint.isAntiAlias()) { |
- rad = -2; |
- } |
- r.inset(rad, rad); |
- } |
- return this->doIRect(r); |
-} |
- |
-bool SkBounder::doPath(const SkPath& path, const SkPaint& paint, bool doFill) { |
- SkIRect r; |
- const SkRect& bounds = path.getBounds(); |
- |
- if (doFill) { |
- bounds.round(&r); |
- } else { // hairline |
- bounds.roundOut(&r); |
- } |
- |
- if (paint.isAntiAlias()) { |
- r.inset(-1, -1); |
- } |
- return this->doIRect(r); |
-} |
- |
-void SkBounder::commit() { |
- // override in subclass |
-} |
- |
//////////////////////////////////////////////////////////////////////////////////////////////// |
#include "SkPath.h" |
@@ -2682,7 +2452,6 @@ static void draw_into_mask(const SkMask& mask, const SkPath& devPath, |
draw.fRC = &clip; |
draw.fClip = &clip.bwRgn(); |
draw.fMatrix = &matrix; |
- draw.fBounder = NULL; |
paint.setAntiAlias(true); |
paint.setStyle(style); |
draw.drawPath(devPath, paint); |