// Replace everything with a drawRRect with the paint from the drawRect // and the AA settings from the clipRRect static void apply_3(SkDebugCanvas* canvas, int curCommand) { canvas->deleteDrawCommandAt(curCommand+3); // restore SkClipRRectCommand* crr = (SkClipRRectCommand*) canvas->getDrawCommandAt(curCommand+1); SkDrawRectCommand* dr = (SkDrawRectCommand*) canvas->getDrawCommandAt(curCommand+2); // TODO: could skip paint re-creation if the AA settings already match SkPaint newPaint = dr->paint(); newPaint.setAntiAlias(crr->doAA()); SkDrawRRectCommand* drr = new SkDrawRRectCommand(crr->rrect(), newPaint); canvas->setDrawCommandAt(curCommand+2, drr); canvas->deleteDrawCommandAt(curCommand+1); // clipRRect canvas->deleteDrawCommandAt(curCommand); // save }
// Check for: // SAVE // CLIP_RRECT // DRAW_RECT // RESTORE // where the rect entirely encloses the clip static bool check_3(SkDebugCanvas* canvas, int curCommand) { if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || canvas->getSize() <= curCommand+4 || CLIP_RRECT != canvas->getDrawCommandAt(curCommand+1)->getType() || DRAW_RECT != canvas->getDrawCommandAt(curCommand+2)->getType() || RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { return false; } SkClipRRectCommand* crr = (SkClipRRectCommand*) canvas->getDrawCommandAt(curCommand+1); SkDrawRectCommand* dr = (SkDrawRectCommand*) canvas->getDrawCommandAt(curCommand+2); if (SkRegion::kIntersect_Op != crr->op()) { return false; } return dr->rect().contains(crr->rrect().rect()); }
// Check for: // SAVE // CLIP_RRECT // DRAW_RECT // RESTORE // where the rect entirely encloses the clip static bool check_3(SkDebugCanvas* canvas, int curCommand) { if (SkDrawCommand::kSave_OpType != canvas->getDrawCommandAt(curCommand)->getType() || canvas->getSize() <= curCommand+4 || SkDrawCommand::kClipRRect_OpType != canvas->getDrawCommandAt(curCommand+1)->getType() || SkDrawCommand::kDrawRect_OpType != canvas->getDrawCommandAt(curCommand+2)->getType() || SkDrawCommand::kRestore_OpType != canvas->getDrawCommandAt(curCommand+3)->getType()) { return false; } SkClipRRectCommand* crr = (SkClipRRectCommand*) canvas->getDrawCommandAt(curCommand+1); SkDrawRectCommand* dr = (SkDrawRectCommand*) canvas->getDrawCommandAt(curCommand+2); if (SkRegion::kIntersect_Op != crr->op()) { return false; } return dr->rect().contains(crr->rrect().rect()); }