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

Unified Diff: src/codec/SkWebpCodec.cpp

Issue 1395183003: Add scaled subset API to SkCodec (Closed) Base URL: https://skia.googlesource.com/skia.git@split0
Patch Set: Created 5 years, 2 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
Index: src/codec/SkWebpCodec.cpp
diff --git a/src/codec/SkWebpCodec.cpp b/src/codec/SkWebpCodec.cpp
index 3c61b937622097d5e1c5be483770a6fb2336543a..5d3cb78039dc5a7a968d6e17f923398cf44eac4e 100644
--- a/src/codec/SkWebpCodec.cpp
+++ b/src/codec/SkWebpCodec.cpp
@@ -120,6 +120,13 @@ bool SkWebpCodec::onDimensionsSupported(const SkISize& dim) {
&& dim.height() >= 1 && dim.height() <= info.height();
}
+bool SkWebpCodec::onSubsetSupported(const SkIRect& subset, bool isScanlineDecode) {
+ return !((subset.left() & 1) || (subset.top() & 1));
scroggo 2015/10/12 20:47:07 Could you add a comment explaining this? (Left and
+}
+
+bool SkWebpCodec::onScaledSubsetSupported(const Options& options, bool isScanlineDecode) {
+ return this->onSubsetSupported(*options.fSubset, isScanlineDecode);
+}
static WEBP_CSP_MODE webp_decode_mode(SkColorType ct, bool premultiply) {
switch (ct) {
@@ -139,21 +146,26 @@ static WEBP_CSP_MODE webp_decode_mode(SkColorType ct, bool premultiply) {
// is arbitrary.
static const size_t BUFFER_SIZE = 4096;
-bool SkWebpCodec::onGetValidSubset(SkIRect* desiredSubset) const {
- if (!desiredSubset) {
- return false;
- }
-
- SkIRect dimensions = SkIRect::MakeSize(this->getInfo().dimensions());
- if (!dimensions.contains(*desiredSubset)) {
- return false;
- }
+bool SkWebpCodec::onGetScaledSubsetDimensions(float desiredScale, const Options& options) const {
+ options.fSubset->fLeft = (options.fSubset->fLeft >> 1) << 1;
+ options.fSubset->fTop = (options.fSubset->fTop >> 1) << 1;
+
+ // Notice that we may round the size of the subset up to 1. This means that we must
+ // round up the scaled output dimensions to avoid suggesting a subset that is off the
+ // edge of the image. This rounding behvaior is consistent with SkJpegCodec.
+ *(options.fScaledDimensions) = SkISize::Make(
+ sk_float_ceil2int(desiredScale * this->getInfo().width()),
+ sk_float_ceil2int(desiredScale * this->getInfo().height()));
+
+ // Notice that we may round the size of the subset up to 1. This means that we must
+ // floor the left and top offsets to ensure that we do not suggest a subset that is
+ // off the edge of the image.
+ *(options.fScaledSubset) = SkIRect::MakeXYWH(
+ int (desiredScale * options.fSubset->left()),
+ int (desiredScale * options.fSubset->top()),
+ SkTMax(1, SkScalarRoundToInt(desiredScale * options.fSubset->width())),
+ SkTMax(1, SkScalarRoundToInt(desiredScale * options.fSubset->height())));
- // As stated below, libwebp snaps to even left and top. Make sure top and left are even, so we
- // decode this exact subset.
- // Leave right and bottom unmodified, so we suggest a slightly larger subset than requested.
- desiredSubset->fLeft = (desiredSubset->fLeft >> 1) << 1;
- desiredSubset->fTop = (desiredSubset->fTop >> 1) << 1;
return true;
}
@@ -193,16 +205,6 @@ SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst,
return kInvalidParameters;
}
-#ifdef SK_DEBUG
msarett 2015/10/12 18:33:29 I tried to keep a debug check here, but it is too
- {
- // Make a copy, since getValidSubset can change its input.
- SkIRect subset(bounds);
- // That said, getValidSubset should *not* change its input, in this case; otherwise
- // getValidSubset does not match the actual subsets we can do.
- SkASSERT(this->getValidSubset(&subset) && subset == bounds);
- }
-#endif
-
config.options.use_cropping = 1;
config.options.crop_left = bounds.fLeft;
config.options.crop_top = bounds.fTop;
« src/codec/SkSwizzler.cpp ('K') | « src/codec/SkWebpCodec.h ('k') | tests/CodexTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698