Avoid drawing BW clipped color glyphs many times. Prior to this change if a color glyph is drawn through the raster device with an aliased clip the glyph is drawn once for each rectangular region in the aliased clip. In addition, even when the glyph was not a color glyph in this situation, the mask was checked for being a color glyph once for each rectangular region of the aliased clip. This change hoists the test for the color format out of the loop to ensure that the mask format is checked once and the mask is drawn once. This issue was discovered by rotating the coloremoji_blendmodes gm. Change-Id: I18b6b546356780e0b00948fff7b65783219f5c92 Reviewed-on: https://skia-review.googlesource.com/125868 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Ben Wagner <bungeman@google.com>
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp index 0526f76..34f5da5 100644 --- a/src/core/SkDraw.cpp +++ b/src/core/SkDraw.cpp
@@ -1441,11 +1441,15 @@ SkRegion::Cliperator clipper(*fClip, mask.fBounds); if (!clipper.done() && this->getImageData(glyph, &mask)) { - const SkIRect& cr = clipper.rect(); - do { - this->blitMask(mask, cr); - clipper.next(); - } while (!clipper.done()); + if (SkMask::kARGB32_Format == mask.fFormat) { + this->blitARGB32Mask(mask); + } else { + const SkIRect& cr = clipper.rect(); + do { + fBlitter->blitMask(mask, cr); + clipper.next(); + } while (!clipper.done()); + } } } else { SkIRect storage; @@ -1460,7 +1464,11 @@ } if (this->getImageData(glyph, &mask)) { - this->blitMask(mask, *bounds); + if (SkMask::kARGB32_Format == mask.fFormat) { + this->blitARGB32Mask(mask); + } else { + fBlitter->blitMask(mask, *bounds); + } } } } @@ -1491,17 +1499,14 @@ return true; } - void blitMask(const SkMask& mask, const SkIRect& clip) const { - if (SkMask::kARGB32_Format == mask.fFormat) { - SkBitmap bm; - bm.installPixels( - SkImageInfo::MakeN32Premul(mask.fBounds.width(), mask.fBounds.height()), - (SkPMColor*)mask.fImage, mask.fRowBytes); + void blitARGB32Mask(const SkMask& mask) const { + SkASSERT(SkMask::kARGB32_Format == mask.fFormat); + SkBitmap bm; + bm.installPixels( + SkImageInfo::MakeN32Premul(mask.fBounds.width(), mask.fBounds.height()), + (SkPMColor*)mask.fImage, mask.fRowBytes); - fDraw.drawSprite(bm, mask.fBounds.x(), mask.fBounds.y(), fPaint); - } else { - fBlitter->blitMask(mask, clip); - } + fDraw.drawSprite(bm, mask.fBounds.x(), mask.fBounds.y(), fPaint); } const bool fUseRegionToDraw;