| 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 },
|
| };
|
|
|
|
|
|
|