Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Unified Diff: src/core/SkBitmap.cpp

Issue 122293002: Revert "Revert of https://codereview.chromium.org/113823003/" (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/utils/SkRandom.h ('k') | src/core/SkMallocPixelRef.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkBitmap.cpp
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp
index d4c3a47d81f42519dbb08c15c9fbb6ad5cbcb4cf..11c7cbd69c289991ea25c8894a6b62037ec34a2c 100644
--- a/src/core/SkBitmap.cpp
+++ b/src/core/SkBitmap.cpp
@@ -24,10 +24,6 @@
#include "SkPackBits.h"
#include <new>
-static bool isPos32Bits(const Sk64& value) {
- return !value.isNeg() && value.is32();
-}
-
struct MipLevel {
void* fPixels;
uint32_t fRowBytes;
@@ -44,14 +40,12 @@ struct SkBitmap::MipMap : SkNoncopyable {
if (levelCount < 0) {
return NULL;
}
- Sk64 size;
- size.setMul(levelCount + 1, sizeof(MipLevel));
- size.add(sizeof(MipMap));
- size.add(SkToS32(pixelSize));
- if (!isPos32Bits(size)) {
+ int64_t size = (levelCount + 1) * sizeof(MipLevel);
+ size += sizeof(MipMap) + pixelSize;
+ if (!sk_64_isS32(size)) {
return NULL;
}
- MipMap* mm = (MipMap*)sk_malloc_throw(size.get32());
+ MipMap* mm = (MipMap*)sk_malloc_throw(sk_64_asS32(size));
mm->fRefCnt = 1;
mm->fLevelCount = levelCount;
return mm;
@@ -185,58 +179,49 @@ size_t SkBitmap::ComputeRowBytes(Config c, int width) {
return 0;
}
- Sk64 rowBytes;
- rowBytes.setZero();
+ int64_t rowBytes = 0;
switch (c) {
case kNo_Config:
break;
case kA8_Config:
case kIndex8_Config:
- rowBytes.set(width);
+ rowBytes = width;
break;
case kRGB_565_Config:
case kARGB_4444_Config:
- rowBytes.set(width);
- rowBytes.shiftLeft(1);
+ rowBytes = width << 1;
break;
case kARGB_8888_Config:
- rowBytes.set(width);
- rowBytes.shiftLeft(2);
+ rowBytes = width << 2;
break;
default:
SkDEBUGFAIL("unknown config");
break;
}
- return isPos32Bits(rowBytes) ? rowBytes.get32() : 0;
+ return sk_64_isS32(rowBytes) ? sk_64_asS32(rowBytes) : 0;
}
-Sk64 SkBitmap::ComputeSize64(Config c, int width, int height) {
- Sk64 size;
- size.setMul(SkToS32(SkBitmap::ComputeRowBytes(c, width)), height);
- return size;
+int64_t SkBitmap::ComputeSize64(Config config, int width, int height) {
+ int64_t rowBytes = sk_64_mul(ComputeBytesPerPixel(config), width);
+ return rowBytes * height;
}
size_t SkBitmap::ComputeSize(Config c, int width, int height) {
- Sk64 size = SkBitmap::ComputeSize64(c, width, height);
- return isPos32Bits(size) ? size.get32() : 0;
+ int64_t size = SkBitmap::ComputeSize64(c, width, height);
+ return sk_64_isS32(size) ? sk_64_asS32(size) : 0;
}
-Sk64 SkBitmap::ComputeSafeSize64(Config config,
- uint32_t width,
- uint32_t height,
- size_t rowBytes) {
- Sk64 safeSize;
- safeSize.setZero();
+int64_t SkBitmap::ComputeSafeSize64(Config config,
+ uint32_t width,
+ uint32_t height,
+ size_t rowBytes) {
+ int64_t safeSize = 0;
if (height > 0) {
- // TODO: Handle the case where the return value from
- // ComputeRowBytes is more than 31 bits.
- safeSize.set(SkToS32(ComputeRowBytes(config, width)));
- Sk64 sizeAllButLastRow;
- sizeAllButLastRow.setMul(height - 1, SkToS32(rowBytes));
- safeSize.add(sizeAllButLastRow);
- }
- SkASSERT(!safeSize.isNeg());
+ int64_t lastRow = sk_64_mul(ComputeBytesPerPixel(config), width);
+ safeSize = sk_64_mul(height - 1, rowBytes) + lastRow;
+ }
+ SkASSERT(safeSize >= 0);
return safeSize;
}
@@ -244,8 +229,13 @@ size_t SkBitmap::ComputeSafeSize(Config config,
uint32_t width,
uint32_t height,
size_t rowBytes) {
- Sk64 safeSize = ComputeSafeSize64(config, width, height, rowBytes);
- return (safeSize.is32() ? safeSize.get32() : 0);
+ int64_t safeSize = ComputeSafeSize64(config, width, height, rowBytes);
+ int32_t safeSize32 = (int32_t)safeSize;
+
+ if (safeSize32 != safeSize) {
+ safeSize32 = 0;
+ }
+ return safeSize32;
}
void SkBitmap::getBounds(SkRect* bounds) const {
@@ -558,10 +548,6 @@ size_t SkBitmap::getSafeSize() const {
ComputeRowBytes(this->config(), fWidth): 0);
}
-Sk64 SkBitmap::getSafeSize64() const {
- return ComputeSafeSize64(this->config(), fWidth, fHeight, fRowBytes);
-}
-
bool SkBitmap::copyPixelsTo(void* const dst, size_t dstSize,
size_t dstRowBytes, bool preserveDstPad) const {
« no previous file with comments | « include/utils/SkRandom.h ('k') | src/core/SkMallocPixelRef.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698