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

Side by Side Diff: dm/DMSrcSink.cpp

Issue 1530933003: Use possible read_partial_scanlines() API in SkJpegCodec (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Response to comments and further testing Created 5 years 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 unified diff | Download patch
« no previous file with comments | « dm/DMSrcSink.h ('k') | gyp/codec.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "DMSrcSink.h" 8 #include "DMSrcSink.h"
9 #include "SamplePipeControllers.h" 9 #include "SamplePipeControllers.h"
10 #include "SkAndroidCodec.h" 10 #include "SkAndroidCodec.h"
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 // memory will be filled with the proper value. 365 // memory will be filled with the proper value.
366 codec->getScanlines(dstPtr, 1, bitmap.rowBytes()); 366 codec->getScanlines(dstPtr, 1, bitmap.rowBytes());
367 } 367 }
368 break; 368 break;
369 } 369 }
370 } 370 }
371 371
372 canvas->drawBitmap(bitmap, 0, 0); 372 canvas->drawBitmap(bitmap, 0, 0);
373 break; 373 break;
374 } 374 }
375 case kStripe_Mode: { 375 case kTile_Mode: {
376 const int width = decodeInfo.width();
376 const int height = decodeInfo.height(); 377 const int height = decodeInfo.height();
377 // This value is chosen arbitrarily. We exercise more cases by choo sing a value that 378 // This value is chosen arbitrarily. We exercise more cases by choo sing a value that
378 // does not align with image blocks. 379 // does not align with image blocks.
379 const int stripeHeight = 37; 380 const int tileSize = 37;
380 const int numStripes = (height + stripeHeight - 1) / stripeHeight; 381 const int tileWidth = (width + tileSize - 1) / tileSize;
382 const int tileHeight = (height + tileSize - 1) / tileSize;
381 383
382 // Decode odd stripes 384 SkCodec::Options opts;
383 if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, NULL , colorPtr, 385 SkIRect subset;
384 colorCountPtr) 386 for (int tileX = 0; tileX < tileWidth; tileX++) {
385 || SkCodec::kTopDown_SkScanlineOrder != codec->getScanlineOr der()) { 387 const int startX = tileX * tileSize;
386 // This mode was designed to test the new skip scanlines API in libjpeg-turbo. 388 subset = SkIRect::MakeXYWH(startX, 0, SkTMin(tileSize, width - s tartX), height);
387 // Jpegs have kTopDown_SkScanlineOrder, and at this time, it is not interesting 389 opts.fSubset = &subset;
388 // to run this test for image types that do not have this scanli ne ordering. 390 for (int tileY = 0; tileY < tileHeight; tileY++) {
389 return Error::Nonfatal("Could not start top-down scanline decode r"); 391 if (SkCodec::kSuccess != codec->startScanlineDecode(decodeIn fo, &opts,
390 } 392 colorPtr, colorCountPtr) ||
393 SkCodec::kTopDown_SkScanlineOrder != codec->getScanl ineOrder()) {
394 if (0 == tileY && 0 == tileX) {
395 return Error::Nonfatal("Could not start top-down sca nline decoder");
396 }
397 return "Could not restart scanline decoder.";
398 }
391 399
392 for (int i = 0; i < numStripes; i += 2) { 400 const int startY = tileY * tileSize;
393 // Skip a stripe 401 codec->skipScanlines(startY);
394 const int linesToSkip = SkTMin(stripeHeight, height - i * stripe Height); 402 const int linesToGet = SkTMin(tileSize, height - startY);
395 codec->skipScanlines(linesToSkip); 403 codec->getScanlines(bitmap.getAddr(startX, startY), linesToG et,
396 404 bitmap.rowBytes());
397 // Read a stripe
398 const int startY = (i + 1) * stripeHeight;
399 const int linesToRead = SkTMin(stripeHeight, height - startY);
400 if (linesToRead > 0) {
401 codec->getScanlines(bitmap.getAddr(0, startY), linesToRead, bitmap.rowBytes());
402 } 405 }
403 } 406 }
404 407
405 // Decode even stripes
406 const SkCodec::Result startResult = codec->startScanlineDecode(decod eInfo, nullptr,
407 colorPtr, colorCountPtr);
408 if (SkCodec::kSuccess != startResult) {
409 return "Failed to restart scanline decoder with same parameters. ";
410 }
411 for (int i = 0; i < numStripes; i += 2) {
412 // Read a stripe
413 const int startY = i * stripeHeight;
414 const int linesToRead = SkTMin(stripeHeight, height - startY);
415 codec->getScanlines(bitmap.getAddr(0, startY), linesToRead, bitm ap.rowBytes());
416
417 // Skip a stripe
418 const int linesToSkip = SkTMin(stripeHeight, height - (i + 1) * stripeHeight);
419 if (linesToSkip > 0) {
420 codec->skipScanlines(linesToSkip);
421 }
422 }
423 canvas->drawBitmap(bitmap, 0, 0); 408 canvas->drawBitmap(bitmap, 0, 0);
424 break; 409 break;
425 } 410 }
426 case kSubset_Mode: { 411 case kSubset_Mode: {
427 // Arbitrarily choose a divisor. 412 // Arbitrarily choose a divisor.
428 int divisor = 2; 413 int divisor = 2;
429 // Total width/height of the image. 414 // Total width/height of the image.
430 const int W = codec->getInfo().width(); 415 const int W = codec->getInfo().width();
431 const int H = codec->getInfo().height(); 416 const int H = codec->getInfo().height();
432 if (divisor > W || divisor > H) { 417 if (divisor > W || divisor > H) {
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after
1264 skr.visit<void>(i, drawsAsSingletonPictures); 1249 skr.visit<void>(i, drawsAsSingletonPictures);
1265 } 1250 }
1266 SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture()); 1251 SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture());
1267 1252
1268 canvas->drawPicture(macroPic); 1253 canvas->drawPicture(macroPic);
1269 return ""; 1254 return "";
1270 }); 1255 });
1271 } 1256 }
1272 1257
1273 } // namespace DM 1258 } // namespace DM
OLDNEW
« no previous file with comments | « dm/DMSrcSink.h ('k') | gyp/codec.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698