Index: tools/filtermain.cpp |
=================================================================== |
--- tools/filtermain.cpp (revision 8466) |
+++ tools/filtermain.cpp (working copy) |
@@ -489,6 +489,115 @@ |
canvas->deleteDrawCommandAt(curCommand); // save |
} |
+// Check for: |
+// SAVE |
+// CLIP_RECT |
+// DRAWBITMAPRECTTORECT |
+// RESTORE |
+// where: |
+// the drawBitmapRectToRect is a 1-1 copy from src to dest |
+// the clip rect is BW and a subset of the drawBitmapRectToRect's dest rect |
+static bool check_8(SkDebugCanvas* canvas, int curCommand) { |
+ if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || |
+ canvas->getSize() <= curCommand+4 || |
+ CLIP_RECT != canvas->getDrawCommandAt(curCommand+1)->getType() || |
+ DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+2)->getType() || |
+ RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { |
+ return false; |
+ } |
+ |
+ ClipRect* clip = (ClipRect*) canvas->getDrawCommandAt(curCommand+1); |
+ DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curCommand+2); |
+ |
+ if (clip->doAA() || SkRegion::kIntersect_Op != clip->op()) { |
+ return false; |
+ } |
+ |
+ // The src->dest mapping needs to be 1-to-1 |
+ if (NULL == dbmr->srcRect()) { |
+ if (dbmr->bitmap().width() != dbmr->dstRect().width() || |
+ dbmr->bitmap().height() != dbmr->dstRect().height()) { |
+ return false; |
+ } |
+ } else { |
+ if (dbmr->srcRect()->width() != dbmr->dstRect().width() || |
+ dbmr->srcRect()->height() != dbmr->dstRect().height()) { |
+ return false; |
+ } |
+ } |
+ |
+ if (!dbmr->dstRect().contains(clip->rect())) { |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
+// Fold the clipRect into the drawBitmapRectToRect's src and dest rects |
+static void apply_8(SkDebugCanvas* canvas, int curCommand) { |
+ ClipRect* clip = (ClipRect*) canvas->getDrawCommandAt(curCommand+1); |
+ DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curCommand+2); |
+ |
+ SkScalar newSrcLeft, newSrcTop; |
+ |
+ if (NULL != dbmr->srcRect()) { |
+ newSrcLeft = dbmr->srcRect()->fLeft + clip->rect().fLeft - dbmr->dstRect().fLeft; |
+ newSrcTop = dbmr->srcRect()->fTop + clip->rect().fTop - dbmr->dstRect().fTop; |
+ } else { |
+ newSrcLeft = clip->rect().fLeft - dbmr->dstRect().fLeft; |
+ newSrcTop = clip->rect().fTop - dbmr->dstRect().fTop; |
+ } |
+ |
+ SkRect newSrc = SkRect::MakeXYWH(newSrcLeft, newSrcTop, |
+ clip->rect().width(), clip->rect().height()); |
+ |
+ dbmr->setSrcRect(newSrc); |
+ dbmr->setDstRect(clip->rect()); |
+ |
+ // remove everything except the drawbitmaprect |
+ canvas->deleteDrawCommandAt(curCommand+3); |
+ canvas->deleteDrawCommandAt(curCommand+1); |
+ canvas->deleteDrawCommandAt(curCommand); |
+} |
+ |
+// Check for: |
+// SAVE |
+// CLIP_RECT |
+// DRAWBITMAPRECTTORECT |
+// RESTORE |
+// where: |
+// clipRect is BW and encloses the DBMR2R's dest rect |
+static bool check_9(SkDebugCanvas* canvas, int curCommand) { |
+ if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || |
+ canvas->getSize() <= curCommand+4 || |
+ CLIP_RECT != canvas->getDrawCommandAt(curCommand+1)->getType() || |
+ DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+2)->getType() || |
+ RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { |
+ return false; |
+ } |
+ |
+ ClipRect* clip = (ClipRect*) canvas->getDrawCommandAt(curCommand+1); |
+ DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curCommand+2); |
+ |
+ if (clip->doAA() || SkRegion::kIntersect_Op != clip->op()) { |
+ return false; |
+ } |
+ |
+ if (!clip->rect().contains(dbmr->dstRect())) { |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
+// remove everything except the drawbitmaprect |
+static void apply_9(SkDebugCanvas* canvas, int curCommand) { |
+ canvas->deleteDrawCommandAt(curCommand+3); // restore |
+ // drawBitmapRectToRect |
+ canvas->deleteDrawCommandAt(curCommand+1); // clipRect |
+ canvas->deleteDrawCommandAt(curCommand); // save |
+} |
+ |
typedef bool (*PFCheck)(SkDebugCanvas* canvas, int curCommand); |
typedef void (*PFApply)(SkDebugCanvas* canvas, int curCommand); |
@@ -505,6 +614,8 @@ |
{ check_5, apply_5, 0 }, |
{ check_6, apply_6, 0 }, |
{ check_7, apply_7, 0 }, |
+ { check_8, apply_8, 0 }, |
+ { check_9, apply_9, 0 }, |
}; |