diff options
author | Herb Derby <herb@google.com> | 2018-03-06 20:41:57 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-03-06 20:42:07 +0000 |
commit | 61e2d45f0009cbdbf1046f57bbc08206f3f2bc28 (patch) | |
tree | bda78672757065311a157e445d27f00d0afad744 /src/core/SkMask.cpp | |
parent | 2c7113309144ff5fb3e7b8d75208bdf1b87b9feb (diff) |
Revert "Centralize mask byte calculations"
This reverts commit 8994150a436f0e813e9a7b8a2dc0ad237f4e3513.
Reason for revert: Breaks mask rowbytes calc.
Original change's description:
> Centralize mask byte calculations
>
> These calculations are usually done in place around the code,
> but most implementation don't take the care needed for safe calculation.
>
> I have provided safe implementations for use around the code. It
> will take a while to track down all the independant implementations
> and convert them over.
>
> BUG=skia:7515
>
> Change-Id: Ice6a9be2e8e5ebef18d472adb26c17b03177ef47
> Reviewed-on: https://skia-review.googlesource.com/111120
> Reviewed-by: Mike Reed <reed@google.com>
> Commit-Queue: Herb Derby <herb@google.com>
TBR=herb@google.com,reed@google.com
Change-Id: I2ce6c5e647fb684c6472022517ad777d29c8177c
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:7515
Reviewed-on: https://skia-review.googlesource.com/112640
Reviewed-by: Herb Derby <herb@google.com>
Commit-Queue: Herb Derby <herb@google.com>
Diffstat (limited to 'src/core/SkMask.cpp')
-rw-r--r-- | src/core/SkMask.cpp | 80 |
1 files changed, 9 insertions, 71 deletions
diff --git a/src/core/SkMask.cpp b/src/core/SkMask.cpp index 4e8ad29504..ea196f9e45 100644 --- a/src/core/SkMask.cpp +++ b/src/core/SkMask.cpp @@ -12,86 +12,24 @@ /** returns the product if it is positive and fits in 31 bits. Otherwise this returns 0. */ -static size_t safe_mul(size_t a, size_t b) { - SkSafeMath safe; - size_t r = safe.mul(a, b); - if (safe) { - return r; +static int32_t safeMul32(int32_t a, int32_t b) { + int64_t size = sk_64_mul(a, b); + if (size > 0 && sk_64_isS32(size)) { + return sk_64_asS32(size); } - return 0; } -static size_t safe_align4(size_t v) { - uint64_t adjusted = v + 3; - uint64_t possible = adjusted > v ? (adjusted & ~3) : 0; - return SkTFitsIn<size_t>(possible) ? possible : 0; -} - size_t SkMask::computeImageSize() const { - auto height = fBounds.height(); - auto safeHeight = SkTo<uint32_t>(height >= 0 ? height : 0); - return safe_mul(safeHeight, fRowBytes); + return safeMul32(fBounds.height(), fRowBytes); } size_t SkMask::computeTotalImageSize() const { - return ComputeImageSize(fFormat, fBounds.width(), fBounds.height()); -} - -static size_t bits_to_bytes(size_t bits) { - return (bits + 7) >> 3; -} - -size_t SkMask::AlignmentForMask(SkMask::Format format) { - switch (format) { - case SkMask::kBW_Format: - return alignof(uint8_t); - case SkMask::kA8_Format: - return alignof(uint8_t); - case SkMask::k3D_Format: - return alignof(uint8_t); - case SkMask::kARGB32_Format: - return alignof(uint32_t); - case SkMask::kLCD16_Format: - return alignof(uint16_t); - default: - SK_ABORT("Unknown mask format."); - break; - } - // Should not reach here. - return alignof(uint64_t); -} - -size_t SkMask::ComputeRowBytes(SkMask::Format format, int32_t width) { - auto safeWidth = SkTo<uint32_t>(width >= 0 ? width : 0); - switch (format) { - case SkMask::kBW_Format: - // Always safe. - return SkTo<size_t>(bits_to_bytes(safeWidth)); - case SkMask::kA8_Format: - return safe_align4(static_cast<size_t>(safeWidth)); - case SkMask::k3D_Format: - return safe_align4(static_cast<size_t>(safeWidth)); - case SkMask::kARGB32_Format: - return safe_mul(safeWidth, sizeof(uint32_t)); - case SkMask::kLCD16_Format: - return safe_align4(safe_mul(safeWidth, sizeof(uint16_t))); - default: - SK_ABORT("Unknown mask format."); - break; - } - // Should not reach here. - return 0; -} - -size_t SkMask::ComputeImageSize(SkMask::Format format, int32_t width, int32_t height) { - size_t size = ComputeRowBytes(format, width); - if (format == SkMask::k3D_Format) { - size = safe_mul(size, 3); + size_t size = this->computeImageSize(); + if (fFormat == SkMask::k3D_Format) { + size = safeMul32(SkToS32(size), 3); } - auto safeHeight = SkTo<uint32_t>(height >= 0 ? height : 0); - auto result = safe_mul(size, safeHeight); - return result; + return size; } /** We explicitly use this allocator for SkBimap pixels, so that we can |