Index: src/core/SkDraw.cpp |
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp |
index 671da49d099dc826b75542944b834b4b9649851a..a9d5fbb0b63269d476a6cdba3a0263ff7d8ba28b 100644 |
--- a/src/core/SkDraw.cpp |
+++ b/src/core/SkDraw.cpp |
@@ -5,13 +5,13 @@ |
* found in the LICENSE file. |
*/ |
- |
#include "SkDraw.h" |
#include "SkBlitter.h" |
#include "SkBounder.h" |
#include "SkCanvas.h" |
#include "SkColorPriv.h" |
#include "SkDevice.h" |
+#include "SkDeviceLooper.h" |
#include "SkFixed.h" |
#include "SkMaskFilter.h" |
#include "SkPaint.h" |
@@ -873,48 +873,56 @@ void SkDraw::drawRect(const SkRect& rect, const SkPaint& paint) const { |
} |
// look for the quick exit, before we build a blitter |
- if (true) { |
- SkIRect ir; |
- devRect.roundOut(&ir); |
- if (paint.getStyle() != SkPaint::kFill_Style) { |
- // extra space for hairlines |
- ir.inset(-1, -1); |
- } |
- if (fRC->quickReject(ir)) |
- return; |
+ SkIRect ir; |
+ devRect.roundOut(&ir); |
+ if (paint.getStyle() != SkPaint::kFill_Style) { |
+ // extra space for hairlines |
+ ir.inset(-1, -1); |
+ } |
+ if (fRC->quickReject(ir)) { |
+ return; |
} |
- SkAutoBlitterChoose blitterStorage(*fBitmap, matrix, paint); |
- const SkRasterClip& clip = *fRC; |
- SkBlitter* blitter = blitterStorage.get(); |
- |
- // we want to "fill" if we are kFill or kStrokeAndFill, since in the latter |
- // case we are also hairline (if we've gotten to here), which devolves to |
- // effectively just kFill |
- switch (rtype) { |
- case kFill_RectType: |
- if (paint.isAntiAlias()) { |
- SkScan::AntiFillRect(devRect, clip, blitter); |
- } else { |
- SkScan::FillRect(devRect, clip, blitter); |
- } |
- break; |
- case kStroke_RectType: |
- if (paint.isAntiAlias()) { |
- SkScan::AntiFrameRect(devRect, strokeSize, clip, blitter); |
- } else { |
- SkScan::FrameRect(devRect, strokeSize, clip, blitter); |
- } |
- break; |
- case kHair_RectType: |
- if (paint.isAntiAlias()) { |
- SkScan::AntiHairRect(devRect, clip, blitter); |
- } else { |
- SkScan::HairRect(devRect, clip, blitter); |
- } |
- break; |
- default: |
- SkDEBUGFAIL("bad rtype"); |
+ SkDeviceLooper looper(*fBitmap, *fRC, ir, paint.isAntiAlias()); |
+ while (looper.next()) { |
+ SkRect localDevRect; |
+ looper.mapRect(&localDevRect, devRect); |
+ SkMatrix localMatrix; |
+ looper.mapMatrix(&localMatrix, matrix); |
+ |
+ SkAutoBlitterChoose blitterStorage(looper.getBitmap(), localMatrix, |
+ paint); |
+ const SkRasterClip& clip = looper.getRC(); |
+ SkBlitter* blitter = blitterStorage.get(); |
+ |
+ // we want to "fill" if we are kFill or kStrokeAndFill, since in the latter |
+ // case we are also hairline (if we've gotten to here), which devolves to |
+ // effectively just kFill |
+ switch (rtype) { |
+ case kFill_RectType: |
+ if (paint.isAntiAlias()) { |
+ SkScan::AntiFillRect(localDevRect, clip, blitter); |
+ } else { |
+ SkScan::FillRect(localDevRect, clip, blitter); |
+ } |
+ break; |
+ case kStroke_RectType: |
+ if (paint.isAntiAlias()) { |
+ SkScan::AntiFrameRect(localDevRect, strokeSize, clip, blitter); |
+ } else { |
+ SkScan::FrameRect(localDevRect, strokeSize, clip, blitter); |
+ } |
+ break; |
+ case kHair_RectType: |
+ if (paint.isAntiAlias()) { |
+ SkScan::AntiHairRect(localDevRect, clip, blitter); |
+ } else { |
+ SkScan::HairRect(localDevRect, clip, blitter); |
+ } |
+ break; |
+ default: |
+ SkDEBUGFAIL("bad rtype"); |
+ } |
} |
} |
@@ -2825,3 +2833,4 @@ bool SkDraw::DrawToMask(const SkPath& devPath, const SkIRect* clipBounds, |
return true; |
} |
+ |