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

Unified Diff: dm/DMSrcSink.cpp

Issue 1390213002: Add subsetting to SkScanlineDecoder (Closed) Base URL: https://skia.googlesource.com/skia.git@fill-refactor
Patch Set: Rebase to manage dependencies 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
« no previous file with comments | « dm/DM.cpp ('k') | gyp/bench.gypi » ('j') | src/codec/SkCodec.cpp » ('J')
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 88371a8e28fdf68e1e0e5e041588a3a475e4adc1..6bed84d2166086a11aef99070b6edc4b152d3a5e 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -8,7 +8,7 @@
#include "DMSrcSink.h"
#include "SamplePipeControllers.h"
#include "SkCodec.h"
-#include "SkCodecTools.h"
+#include "SkCodecPriv.h"
#include "SkCommonFlags.h"
#include "SkData.h"
#include "SkDocument.h"
@@ -86,7 +86,7 @@ static SkBitmapRegionDecoderInterface* create_brd(Path path,
SkBitmapRegionDecoderInterface::Strategy strategy) {
SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(path.c_str()));
if (!encoded) {
- return NULL;
+ return nullptr;
}
return SkBitmapRegionDecoderInterface::CreateBitmapRegionDecoder(new SkMemoryStream(encoded),
strategy);
@@ -244,7 +244,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
if (!encoded) {
return SkStringPrintf("Couldn't read %s.", fPath.c_str());
}
- SkAutoTDelete<SkCodec> codec(NULL);
+ SkAutoTDelete<SkCodec> codec(nullptr);
if (kScaledCodec_Mode == fMode) {
codec.reset(SkScaledCodec::NewFromData(encoded));
// TODO (msarett): This should fall through to a fatal error once we support scaled
@@ -400,9 +400,6 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
return SkStringPrintf("Image(%s) is too large (%d x %d)\n", fPath.c_str(),
largestSubsetDecodeInfo.width(), largestSubsetDecodeInfo.height());
}
- const size_t rowBytes = decodeInfo.minRowBytes();
- char* buffer = new char[largestSubsetDecodeInfo.height() * rowBytes];
- SkAutoTDeleteArray<char> lineDeleter(buffer);
for (int col = 0; col < divisor; col++) {
//currentSubsetWidth may be larger than subsetWidth for rightmost subsets
const int currentSubsetWidth = (col + 1 == divisor) ?
@@ -414,10 +411,13 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
subsetHeight + extraY : subsetHeight;
const int y = row * subsetHeight;
//create scanline decoder for each subset
- if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, NULL, colorPtr,
- colorCountPtr)
- // TODO (msarett): Support this mode for all scanline orderings.
- || SkCodec::kTopDown_SkScanlineOrder != codec->getScanlineOrder()) {
+ SkCodec::Options options;
+ SkIRect subset = SkIRect::MakeXYWH(x, 0, currentSubsetWidth, h);
+ options.fSubset = &subset;
+ // TODO (msarett): Support this mode for all scanline orderings.
+ if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, &options,
+ colorPtr, colorCountPtr) ||
+ SkCodec::kTopDown_SkScanlineOrder != codec->getScanlineOrder()) {
if (x == 0 && y == 0) {
//first try, image may not be compatible
return Error::Nonfatal("Could not start top-down scanline decoder");
@@ -433,22 +433,14 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
codec->skipScanlines(y);
//create and set size of subsetBm
- SkBitmap subsetBm;
+ SkBitmap bitmap;
scroggo 2015/10/08 20:16:07 Why did you change this name? The comment above no
msarett 2015/10/09 20:03:44 Can't remember. Changing it back sorry.
SkIRect bounds = SkIRect::MakeWH(currentSubsetWidth, currentSubsetHeight);
- SkAssertResult(largestSubsetBm.extractSubset(&subsetBm, bounds));
- SkAutoLockPixels autlockSubsetBm(subsetBm, true);
- codec->getScanlines(buffer, currentSubsetHeight, rowBytes);
-
- const size_t bpp = decodeInfo.bytesPerPixel();
- char* bufferRow = buffer;
- for (int subsetY = 0; subsetY < currentSubsetHeight; ++subsetY) {
- memcpy(subsetBm.getAddr(0, subsetY), bufferRow + x*bpp,
- currentSubsetWidth*bpp);
- bufferRow += rowBytes;
- }
-
- subsetBm.notifyPixelsChanged();
- canvas->drawBitmap(subsetBm, SkIntToScalar(x), SkIntToScalar(y));
+ SkAssertResult(largestSubsetBm.extractSubset(&bitmap, bounds));
+ SkAutoLockPixels autolock(bitmap, true);
+ codec->getScanlines(bitmap.getAddr(0, 0), currentSubsetHeight,
+ bitmap.rowBytes());
+ bitmap.notifyPixelsChanged();
+ canvas->drawBitmap(bitmap, SkIntToScalar(x), SkIntToScalar(y));
}
}
break;
« no previous file with comments | « dm/DM.cpp ('k') | gyp/bench.gypi » ('j') | src/codec/SkCodec.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698