// Check for: // SAVE // CLIP_RECT // DRAW_RECT // RESTORE // where the rect is entirely within the clip and the clip is an intersect static bool check_2(SkDebugCanvas* canvas, int curCommand) { if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || canvas->getSize() <= curCommand+4 || CLIP_RECT != canvas->getDrawCommandAt(curCommand+1)->getType() || DRAW_RECT != canvas->getDrawCommandAt(curCommand+2)->getType() || RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { return false; } SkClipRectCommand* cr = (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+1); SkDrawRectCommand* dr = (SkDrawRectCommand*) canvas->getDrawCommandAt(curCommand+2); if (SkRegion::kIntersect_Op != cr->op()) { return false; } return cr->rect().contains(dr->rect()); }
// Check for: // SAVE // CLIP_RECT // DRAW_BITMAP_RECT_TO_RECT // RESTORE // where the rect and drawBitmapRect dst exactly match static bool check_4(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; } SkClipRectCommand* cr = (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+1); SkDrawBitmapRectCommand* dbmr = (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+2); if (SkRegion::kIntersect_Op != cr->op()) { return false; } return dbmr->dstRect() == cr->rect(); }
// Check for: // SAVE // CLIP_RECT // DRAW_BITMAP_RECT_TO_RECT // RESTORE // where the rect and drawBitmapRect dst exactly match static bool check_4(SkDebugCanvas* canvas, int curCommand) { if (SkDrawCommand::kSave_OpType != canvas->getDrawCommandAt(curCommand)->getType() || canvas->getSize() <= curCommand+4 || SkDrawCommand::kClipRect_OpType != canvas->getDrawCommandAt(curCommand+1)->getType() || SkDrawCommand::kDrawBitmapRect_OpType != canvas->getDrawCommandAt(curCommand+2)->getType() || SkDrawCommand::kRestore_OpType != canvas->getDrawCommandAt(curCommand+3)->getType()) { return false; } SkClipRectCommand* cr = (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+1); SkDrawBitmapRectCommand* dbmr = (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+2); if (SkRegion::kIntersect_Op != cr->op()) { return false; } return dbmr->dstRect() == cr->rect(); }
// 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; } SkClipRectCommand* clip = (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+1); SkDrawBitmapRectCommand* dbmr = (SkDrawBitmapRectCommand*) 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; }