From 6b26deb8d6067589ce9b7853ab8e8d39de1a45de Mon Sep 17 00:00:00 2001 From: Ben Wagner Date: Fri, 10 Nov 2017 16:24:50 -0500 Subject: Alloc glyph image correctly for SkMask::k3D_Format. This removes the no longer used outside Skia SK_SUPPORT_LEGACY_EMBOSSMASKFILTER define, and either deletes the code it guards or updates it to use the new emboss mask filter factory. This re-enables the code to test the emboss mask filter. Also added is a test to ensure that embossed text is drawn correctly, as before this glyphs did not allocate the proper amount of memory for the k3D_Format which this mask filter produces. This also fixes SkEmbossMask::Emboss to write the whole of the mul and add planes to avoid pixel differences and MemorySanitizer errors. Change-Id: Ib492c72a19d6a27d140e3cd48179a3ca9ce313f5 Reviewed-on: https://skia-review.googlesource.com/70260 Commit-Queue: Ben Wagner Reviewed-by: Herb Derby --- src/core/SkGlyph.h | 45 +++++++++++++++++++++++++++++++++----------- src/core/SkScalerContext.cpp | 2 -- 2 files changed, 34 insertions(+), 13 deletions(-) (limited to 'src/core') diff --git a/src/core/SkGlyph.h b/src/core/SkGlyph.h index 06c1d76fb3..b54635277b 100644 --- a/src/core/SkGlyph.h +++ b/src/core/SkGlyph.h @@ -172,34 +172,57 @@ public: */ static unsigned ComputeRowBytes(unsigned width, SkMask::Format format) { unsigned rb = width; - if (SkMask::kBW_Format == format) { + switch (format) { + case SkMask::kBW_Format: rb = BitsToBytes(rb); - } else if (SkMask::kARGB32_Format == format) { + break; + case SkMask::kA8_Format: + rb = SkAlign4(rb); + break; + case SkMask::k3D_Format: + rb = SkAlign4(rb); + break; + case SkMask::kARGB32_Format: rb <<= 2; - } else if (SkMask::kLCD16_Format == format) { + break; + case SkMask::kLCD16_Format: rb = SkAlign4(rb << 1); - } else { - rb = SkAlign4(rb); + break; + default: + SK_ABORT("Unknown mask format."); + break; } return rb; } size_t allocImage(SkArenaAlloc* alloc) { size_t allocSize; - if (SkMask::kBW_Format == fMaskFormat) { + switch (static_cast(fMaskFormat)) { + case SkMask::kBW_Format: allocSize = BitsToBytes(fWidth) * fHeight; fImage = alloc->makeArrayDefault(allocSize); - } else if (SkMask::kARGB32_Format == fMaskFormat) { + break; + case SkMask::kA8_Format: + allocSize = SkAlign4(fWidth) * fHeight; + fImage = alloc->makeArrayDefault(allocSize); + break; + case SkMask::k3D_Format: + allocSize = SkAlign4(fWidth) * fHeight * 3; + fImage = alloc->makeArrayDefault(allocSize); + break; + case SkMask::kARGB32_Format: allocSize = fWidth * fHeight; fImage = alloc->makeArrayDefault(fWidth * fHeight); allocSize *= sizeof(uint32_t); - } else if (SkMask::kLCD16_Format == fMaskFormat) { + break; + case SkMask::kLCD16_Format: allocSize = SkAlign2(fWidth) * fHeight; fImage = alloc->makeArrayDefault(allocSize); allocSize *= sizeof(uint16_t); - } else { - allocSize = SkAlign4(fWidth) * fHeight; - fImage = alloc->makeArrayDefault(allocSize); + break; + default: + SK_ABORT("Unknown mask format."); + break; } return allocSize; } diff --git a/src/core/SkScalerContext.cpp b/src/core/SkScalerContext.cpp index 8a1ab60ae8..828f978287 100644 --- a/src/core/SkScalerContext.cpp +++ b/src/core/SkScalerContext.cpp @@ -26,8 +26,6 @@ #include "SkStrokeRec.h" #include "SkWriteBuffer.h" -#define ComputeBWRowBytes(width) (((unsigned)(width) + 7) >> 3) - void SkGlyph::toMask(SkMask* mask) const { SkASSERT(mask); -- cgit v1.2.3