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

Unified Diff: dm/DMSrcSink.cpp

Issue 2445863002: DM: Draw image frames in a grid (Closed)
Patch Set: Created 4 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dm/DMSrcSink.cpp
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 06ca7507349b7e5cf05f34246c48a22a4b5eaec5..274f7dbe6d302cb92caeefbb75e4adbbbfefe0af 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -38,6 +38,7 @@
#include "SkTLogic.h"
#include "SkSwizzler.h"
#include <functional>
+#include <cmath>
#if defined(SK_BUILD_FOR_WIN)
#include "SkAutoCoInitialize.h"
@@ -433,7 +434,12 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
return SkStringPrintf("%s is not an animated image.", fPath.c_str());
}
- SkAutoCanvasRestore acr(canvas, true);
+ // As in CodecSrc::size(), compute a roughly square grid to draw the frames
+ // into. "factor" is the number of frames to draw on one row. There will be
+ // up to "factor" rows as well.
+ const float root = sqrt((float) frameInfos.size());
+ const int factor = sk_float_ceil2int(root);
+
// Used to cache a frame that future frames will depend on.
SkAutoMalloc priorFramePixels;
size_t cachedFrame = SkCodec::kNone;
@@ -454,13 +460,18 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
colorPtr, &colorCount);
switch (result) {
case SkCodec::kSuccess:
- case SkCodec::kIncompleteInput:
+ case SkCodec::kIncompleteInput: {
+ SkAutoCanvasRestore acr(canvas, true);
+ const int xTranslate = (i % factor) * decodeInfo.width();
+ const int yTranslate = (i / factor) * decodeInfo.height();
+ canvas->translate(SkIntToScalar(xTranslate), SkIntToScalar(yTranslate));
draw_to_canvas(canvas, bitmapInfo, pixels.get(), rowBytes,
colorPtr, colorCount, fDstColorType);
if (result == SkCodec::kIncompleteInput) {
return "";
}
break;
+ }
default:
return SkStringPrintf("Couldn't getPixels for frame %i in %s.",
i, fPath.c_str());
@@ -472,8 +483,6 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
memcpy(priorFramePixels.reset(safeSize), pixels.get(), safeSize);
cachedFrame = i;
}
-
- canvas->translate(SkIntToScalar(0), SkIntToScalar(decodeInfo.height()));
}
break;
}
@@ -712,9 +721,14 @@ SkISize CodecSrc::size() const {
auto imageSize = codec->getScaledDimensions(fScale);
if (fMode == kAnimated_Mode) {
- // We'll draw one of each frame, so make it big enough to hold them all.
+ // We'll draw one of each frame, so make it big enough to hold them all
+ // in a grid. The grid will be roughly square, with "factor" frames per
+ // row and up to "factor" rows.
const size_t count = codec->getFrameInfo().size();
- imageSize.fHeight = imageSize.fHeight * count;
+ const float root = sqrt((float) count);
+ const int factor = sk_float_ceil2int(root);
+ imageSize.fWidth = imageSize.fWidth * factor;
+ imageSize.fHeight = imageSize.fHeight * sk_float_ceil2int((float) count / (float) factor);
}
return imageSize;
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698