SkMask SkMask::PrepareDestination(int radiusX, int radiusY, const SkMask& src) { SkSafeMath safe; SkMask dst; // dstW = srcW + 2 * radiusX; size_t dstW = safe.add(src.fBounds.width(), safe.add(radiusX, radiusX)); // dstH = srcH + 2 * radiusY; size_t dstH = safe.add(src.fBounds.height(), safe.add(radiusY, radiusY)); dst.fBounds.set(0, 0, SkTo<int>(dstW), SkTo<int>(dstH)); dst.fBounds.offset(src.fBounds.x(), src.fBounds.y()); dst.fBounds.offset(-radiusX, -radiusY); dst.fImage = nullptr; dst.fRowBytes = SkTo<uint32_t>(dstW); dst.fFormat = SkMask::kA8_Format; size_t toAlloc = safe.mul(dstW, dstH); if (safe && src.fImage != nullptr) { dst.fImage = SkMask::AllocImage(toAlloc); } return dst; }
size_t SkImageInfo::computeByteSize(size_t rowBytes) const { if (0 == fHeight) { return 0; } SkSafeMath safe; size_t bytes = safe.add(safe.mul(fHeight - 1, rowBytes), safe.mul(fWidth, this->bytesPerPixel())); return safe ? bytes : SK_MaxSizeT; }