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; |
} |