// Fold the saveLayer's alpha into the drawBitmapRect and remove the saveLayer // and restore static void apply_0(SkDebugCanvas* canvas, int curCommand) { SkSaveLayerCommand* saveLayer = (SkSaveLayerCommand*) canvas->getDrawCommandAt(curCommand); const SkPaint* saveLayerPaint = saveLayer->paint(); // if (NULL == saveLayerPaint) the dbmr's paint doesn't need to be changed if (NULL != saveLayerPaint) { SkDrawBitmapRectCommand* dbmr = (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+1); SkPaint* dbmrPaint = dbmr->paint(); if (NULL == dbmrPaint) { // if the DBMR doesn't have a paint just use the saveLayer's dbmr->setPaint(*saveLayerPaint); } else if (NULL != saveLayerPaint) { // Both paints are present so their alphas need to be combined SkColor color = saveLayerPaint->getColor(); int a0 = SkColorGetA(color); color = dbmrPaint->getColor(); int a1 = SkColorGetA(color); int newA = SkMulDiv255Round(a0, a1); SkASSERT(newA <= 0xFF); SkColor newColor = SkColorSetA(color, newA); dbmrPaint->setColor(newColor); } } canvas->deleteDrawCommandAt(curCommand+2); // restore canvas->deleteDrawCommandAt(curCommand); // saveLayer }
// Fold the saveLayer's alpha into the drawBitmapRect and remove the saveLayer // and restore static void apply_1(SkDebugCanvas* canvas, int curCommand) { SkSaveLayerCommand* saveLayer = (SkSaveLayerCommand*) canvas->getDrawCommandAt(curCommand); const SkPaint* saveLayerPaint = saveLayer->paint(); // if (NULL == saveLayerPaint) the dbmr's paint doesn't need to be changed if (NULL != saveLayerPaint) { SkDrawBitmapRectCommand* dbmr = (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+3); SkPaint* dbmrPaint = dbmr->paint(); if (NULL == dbmrPaint) { dbmr->setPaint(*saveLayerPaint); } else { SkColor newColor = SkColorSetA(dbmrPaint->getColor(), SkColorGetA(saveLayerPaint->getColor())); dbmrPaint->setColor(newColor); } } canvas->deleteDrawCommandAt(curCommand+5); // restore canvas->deleteDrawCommandAt(curCommand); // saveLayer }
// Reduce to a single drawBitmapRectToRect call by folding the clipRect's into // the src and dst Rects and the saveLayer paints into the drawBitmapRectToRect's // paint. static void apply_7(SkDebugCanvas* canvas, int curCommand) { SkSaveLayerCommand* saveLayer0 = (SkSaveLayerCommand*) canvas->getDrawCommandAt(curCommand+2); SkSaveLayerCommand* saveLayer1 = (SkSaveLayerCommand*) canvas->getDrawCommandAt(curCommand+5); SkClipRectCommand* clip2 = (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+7); SkDrawBitmapRectCommand* dbmr = (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+8); SkScalar newSrcLeft = dbmr->srcRect()->fLeft + clip2->rect().fLeft - dbmr->dstRect().fLeft; SkScalar newSrcTop = dbmr->srcRect()->fTop + clip2->rect().fTop - dbmr->dstRect().fTop; SkRect newSrc = SkRect::MakeXYWH(newSrcLeft, newSrcTop, clip2->rect().width(), clip2->rect().height()); dbmr->setSrcRect(newSrc); dbmr->setDstRect(clip2->rect()); SkColor color = 0xFF000000; int a0, a1; const SkPaint* saveLayerPaint0 = saveLayer0->paint(); if (NULL != saveLayerPaint0) { color = saveLayerPaint0->getColor(); a0 = SkColorGetA(color); } else { a0 = 0xFF; } const SkPaint* saveLayerPaint1 = saveLayer1->paint(); if (NULL != saveLayerPaint1) { color = saveLayerPaint1->getColor(); a1 = SkColorGetA(color); } else { a1 = 0xFF; } int newA = SkMulDiv255Round(a0, a1); SkASSERT(newA <= 0xFF); SkPaint* dbmrPaint = dbmr->paint(); if (NULL != dbmrPaint) { SkColor newColor = SkColorSetA(dbmrPaint->getColor(), newA); dbmrPaint->setColor(newColor); } else { SkColor newColor = SkColorSetA(color, newA); SkPaint newPaint; newPaint.setColor(newColor); dbmr->setPaint(newPaint); } // remove everything except the drawbitmaprect canvas->deleteDrawCommandAt(curCommand+13); // restore canvas->deleteDrawCommandAt(curCommand+12); // restore canvas->deleteDrawCommandAt(curCommand+11); // restore canvas->deleteDrawCommandAt(curCommand+10); // restore canvas->deleteDrawCommandAt(curCommand+9); // restore canvas->deleteDrawCommandAt(curCommand+7); // clipRect canvas->deleteDrawCommandAt(curCommand+6); // save canvas->deleteDrawCommandAt(curCommand+5); // saveLayer canvas->deleteDrawCommandAt(curCommand+4); // clipRect canvas->deleteDrawCommandAt(curCommand+3); // save canvas->deleteDrawCommandAt(curCommand+2); // saveLayer canvas->deleteDrawCommandAt(curCommand+1); // clipRect canvas->deleteDrawCommandAt(curCommand); // save }