| Index: src/gpu/GrSWMaskHelper.cpp
|
| diff --git a/src/gpu/GrSWMaskHelper.cpp b/src/gpu/GrSWMaskHelper.cpp
|
| index 547a05e79be8388df9d3811a470b01b3faa4de40..ba62858cb7b27c0c339440cb87c435cb2d744e63 100644
|
| --- a/src/gpu/GrSWMaskHelper.cpp
|
| +++ b/src/gpu/GrSWMaskHelper.cpp
|
| @@ -13,7 +13,6 @@
|
|
|
| #include "SkData.h"
|
| #include "SkStrokeRec.h"
|
| -#include "SkTextureCompressor.h"
|
|
|
| // TODO: try to remove this #include
|
| #include "GrContext.h"
|
| @@ -37,6 +36,20 @@ SkXfermode::Mode op_to_mode(SkRegion::Op op) {
|
| return modeMap[op];
|
| }
|
|
|
| +static inline GrPixelConfig fmt_to_config(SkTextureCompressor::Format fmt) {
|
| + static const GrPixelConfig configMap[] = {
|
| + kLATC_GrPixelConfig, // kLATC_Format,
|
| + kR11_EAC_GrPixelConfig, // kR11_EAC_Format,
|
| + kASTC_12x12_GrPixelConfig // kASTC_12x12_Format,
|
| + };
|
| + GR_STATIC_ASSERT(0 == SkTextureCompressor::kLATC_Format);
|
| + GR_STATIC_ASSERT(1 == SkTextureCompressor::kR11_EAC_Format);
|
| + GR_STATIC_ASSERT(2 == SkTextureCompressor::kASTC_12x12_Format);
|
| + GR_STATIC_ASSERT(SK_ARRAY_COUNT(configMap) == SkTextureCompressor::kFormatCnt);
|
| +
|
| + return configMap[fmt];
|
| +}
|
| +
|
| }
|
|
|
| /**
|
| @@ -102,11 +115,16 @@ bool GrSWMaskHelper::init(const SkIRect& resultBounds,
|
| -resultBounds.fTop * SK_Scalar1);
|
| SkIRect bounds = SkIRect::MakeWH(resultBounds.width(),
|
| resultBounds.height());
|
| +
|
| #if GR_COMPRESS_ALPHA_MASK
|
| + fCompressedFormat = SkTextureCompressor::kR11_EAC_Format;
|
| +
|
| // Make sure that the width is a multiple of 16 so that we can use
|
| // specialized SIMD instructions that compress 4 blocks at a time.
|
| - const int cmpWidth = (bounds.fRight + 15) & ~15;
|
| - const int cmpHeight = (bounds.fBottom + 3) & ~3;
|
| + int dimX, dimY;
|
| + SkTextureCompressor::GetBlockDimensions(fCompressedFormat, &dimX, &dimY);
|
| + const int cmpWidth = dimX * ((bounds.fRight + (dimX - 1)) / dimX);
|
| + const int cmpHeight = dimY * ((bounds.fRight + (dimY - 1)) / dimY);
|
| #else
|
| const int cmpWidth = bounds.fRight;
|
| const int cmpHeight = bounds.fBottom;
|
| @@ -135,21 +153,24 @@ bool GrSWMaskHelper::getTexture(GrAutoScratchTexture* texture) {
|
| GrTextureDesc desc;
|
| desc.fWidth = fBM.width();
|
| desc.fHeight = fBM.height();
|
| - desc.fConfig = kAlpha_8_GrPixelConfig;
|
|
|
| #if GR_COMPRESS_ALPHA_MASK
|
| - static const int kCompressedBlockSize = 4;
|
| - static const GrPixelConfig kCompressedConfig = kR11_EAC_GrPixelConfig;
|
|
|
| - if (desc.fWidth % kCompressedBlockSize == 0 &&
|
| - desc.fHeight % kCompressedBlockSize == 0) {
|
| - desc.fConfig = kCompressedConfig;
|
| - }
|
| +#ifdef SK_DEBUG
|
| + int dimX, dimY;
|
| + SkTextureCompressor::GetBlockDimensions(fCompressedFormat, &dimX, &dimY);
|
| + SkASSERT((desc.fWidth % dimX) == 0);
|
| + SkASSERT((desc.fHeight % dimY) == 0);
|
| +#endif
|
| +
|
| + desc.fConfig = fmt_to_config(fCompressedFormat);
|
|
|
| // If this config isn't supported then we should fall back to A8
|
| if (!(fContext->getGpu()->caps()->isConfigTexturable(desc.fConfig))) {
|
| desc.fConfig = kAlpha_8_GrPixelConfig;
|
| }
|
| +#else
|
| + desc.fConfig = kAlpha_8_GrPixelConfig;
|
| #endif
|
|
|
| texture->set(fContext, desc);
|
|
|