bool GrSWMaskHelper::init(const SkIRect& resultBounds, const SkMatrix* matrix) { if (NULL != matrix) { fMatrix = *matrix; } else { fMatrix.setIdentity(); } // Now translate so the bound's UL corner is at the origin fMatrix.postTranslate(-resultBounds.fLeft * SK_Scalar1, -resultBounds.fTop * SK_Scalar1); SkIRect bounds = SkIRect::MakeWH(resultBounds.width(), resultBounds.height()); #if GR_COMPRESS_ALPHA_MASK fCompressMask = choose_compressed_fmt(fContext->getGpu()->caps(), &fCompressedFormat); #else fCompressMask = false; #endif // 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. int cmpWidth, cmpHeight; if (fCompressMask) { int dimX, dimY; SkTextureCompressor::GetBlockDimensions(fCompressedFormat, &dimX, &dimY); cmpWidth = dimX * ((bounds.fRight + (dimX - 1)) / dimX); cmpHeight = dimY * ((bounds.fBottom + (dimY - 1)) / dimY); } else { cmpWidth = bounds.fRight; cmpHeight = bounds.fBottom; } if (!fBM.allocPixels(SkImageInfo::MakeA8(cmpWidth, cmpHeight))) { return false; } sk_bzero(fBM.getPixels(), fBM.getSafeSize()); sk_bzero(&fDraw, sizeof(fDraw)); fRasterClip.setRect(bounds); fDraw.fRC = &fRasterClip; fDraw.fClip = &fRasterClip.bwRgn(); fDraw.fMatrix = &fMatrix; fDraw.fBitmap = &fBM; return true; }
bool GrSWMaskHelper::init(const SkIRect& resultBounds, const SkMatrix* matrix, bool allowCompression) { if (matrix) { fMatrix = *matrix; } else { fMatrix.setIdentity(); } // Now translate so the bound's UL corner is at the origin fMatrix.postTranslate(-resultBounds.fLeft * SK_Scalar1, -resultBounds.fTop * SK_Scalar1); SkIRect bounds = SkIRect::MakeWH(resultBounds.width(), resultBounds.height()); if (allowCompression && fContext->getOptions().fDrawPathToCompressedTexture && choose_compressed_fmt(fContext->getGpu()->caps(), &fCompressedFormat)) { fCompressionMode = kCompress_CompressionMode; } // Make sure that the width is a multiple of the desired block dimensions // to allow for specialized SIMD instructions that compress multiple blocks at a time. int cmpWidth = bounds.fRight; int cmpHeight = bounds.fBottom; if (kCompress_CompressionMode == fCompressionMode) { int dimX, dimY; SkTextureCompressor::GetBlockDimensions(fCompressedFormat, &dimX, &dimY); cmpWidth = dimX * ((cmpWidth + (dimX - 1)) / dimX); cmpHeight = dimY * ((cmpHeight + (dimY - 1)) / dimY); // Can we create a blitter? if (SkTextureCompressor::ExistsBlitterForFormat(fCompressedFormat)) { int cmpSz = SkTextureCompressor::GetCompressedDataSize( fCompressedFormat, cmpWidth, cmpHeight); SkASSERT(cmpSz > 0); SkASSERT(NULL == fCompressedBuffer.get()); fCompressedBuffer.reset(cmpSz); fCompressionMode = kBlitter_CompressionMode; } } // If we don't have a custom blitter, then we either need a bitmap to compress // from or a bitmap that we're going to use as a texture. In any case, we should // allocate the pixels for a bitmap const SkImageInfo bmImageInfo = SkImageInfo::MakeA8(cmpWidth, cmpHeight); if (kBlitter_CompressionMode != fCompressionMode) { if (!fBM.tryAllocPixels(bmImageInfo)) { return false; } sk_bzero(fBM.getPixels(), fBM.getSafeSize()); } else { // Otherwise, we just need to remember how big the buffer is... fBM.setInfo(bmImageInfo); } sk_bzero(&fDraw, sizeof(fDraw)); fRasterClip.setRect(bounds); fDraw.fRC = &fRasterClip; fDraw.fClip = &fRasterClip.bwRgn(); fDraw.fMatrix = &fMatrix; fDraw.fBitmap = &fBM; return true; }