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

Unified Diff: src/core/SkBitmapScaler.cpp

Issue 1588653002: Allow Resize to be called w/ a preallocated pixmap (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: update dox, clarifying dst's treatment Created 4 years, 11 months 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 | « src/core/SkBitmapScaler.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkBitmapScaler.cpp
diff --git a/src/core/SkBitmapScaler.cpp b/src/core/SkBitmapScaler.cpp
index 44ed83c8a29b9405cea0dd09aab7f75aee70d86f..dc04691c79b6bcef1ae7d8deb909966823bc7db9 100644
--- a/src/core/SkBitmapScaler.cpp
+++ b/src/core/SkBitmapScaler.cpp
@@ -249,46 +249,55 @@ void SkResizeFilter::computeFilters(int srcSize,
}
}
-bool SkBitmapScaler::Resize(SkBitmap* resultPtr, const SkPixmap& source, ResizeMethod method,
- int destWidth, int destHeight, SkBitmap::Allocator* allocator) {
- if (nullptr == source.addr() || source.colorType() != kN32_SkColorType ||
- source.width() < 1 || source.height() < 1)
- {
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+static bool valid_for_resize(const SkPixmap& source, int dstW, int dstH) {
+ // TODO: Seems like we shouldn't care about the swizzle of source, just that it's 8888
+ return source.addr() && source.colorType() == kN32_SkColorType &&
+ source.width() >= 1 && source.height() >= 1 && dstW >= 1 && dstH >= 1;
+}
+
+bool SkBitmapScaler::Resize(const SkPixmap& result, const SkPixmap& source, ResizeMethod method) {
+ if (!valid_for_resize(source, result.width(), result.height())) {
return false;
}
-
- if (destWidth < 1 || destHeight < 1) {
+ if (!result.addr() || result.colorType() != source.colorType()) {
return false;
}
SkConvolutionProcs convolveProcs= { 0, nullptr, nullptr, nullptr, nullptr };
PlatformConvolutionProcs(&convolveProcs);
- SkRect destSubset = SkRect::MakeIWH(destWidth, destHeight);
+ SkRect destSubset = SkRect::MakeIWH(result.width(), result.height());
SkResizeFilter filter(method, source.width(), source.height(),
- destWidth, destHeight, destSubset, convolveProcs);
+ result.width(), result.height(), destSubset, convolveProcs);
// Get a subset encompassing this touched area. We construct the
// offsets and row strides such that it looks like a new bitmap, while
// referring to the old data.
const uint8_t* sourceSubset = reinterpret_cast<const uint8_t*>(source.addr());
- // Convolve into the result.
+ return BGRAConvolve2D(sourceSubset, static_cast<int>(source.rowBytes()),
+ !source.isOpaque(), filter.xFilter(), filter.yFilter(),
+ static_cast<int>(result.rowBytes()),
+ static_cast<unsigned char*>(result.writable_addr()),
+ convolveProcs, true);
+}
+
+bool SkBitmapScaler::Resize(SkBitmap* resultPtr, const SkPixmap& source, ResizeMethod method,
+ int destWidth, int destHeight, SkBitmap::Allocator* allocator) {
+ // Preflight some of the checks, to avoid allocating the result if we don't need it.
+ if (!valid_for_resize(source, destWidth, destHeight)) {
+ return false;
+ }
+
SkBitmap result;
- result.setInfo(SkImageInfo::MakeN32(SkScalarCeilToInt(destSubset.width()),
- SkScalarCeilToInt(destSubset.height()),
- source.alphaType()));
+ result.setInfo(SkImageInfo::MakeN32(destWidth, destHeight, source.alphaType()));
result.allocPixels(allocator, nullptr);
- if (!result.readyToDraw()) {
- return false;
- }
- if (!BGRAConvolve2D(sourceSubset, static_cast<int>(source.rowBytes()),
- !source.isOpaque(), filter.xFilter(), filter.yFilter(),
- static_cast<int>(result.rowBytes()),
- static_cast<unsigned char*>(result.getPixels()),
- convolveProcs, true)) {
+ SkPixmap resultPM;
+ if (!result.peekPixels(&resultPM) || !Resize(resultPM, source, method)) {
return false;
}
« no previous file with comments | « src/core/SkBitmapScaler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698