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

Side by Side Diff: dm/DMSrcSink.cpp

Issue 1581653003: DM test for YUV (Closed) Base URL: https://skia.googlesource.com/skia.git@yuv
Patch Set: Created 4 years, 11 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 unified diff | Download patch
« no previous file with comments | « dm/DMSrcSink.h ('k') | no next file » | 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 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/ 233 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/
234 234
235 CodecSrc::CodecSrc(Path path, Mode mode, DstColorType dstColorType, float scale) 235 CodecSrc::CodecSrc(Path path, Mode mode, DstColorType dstColorType, float scale)
236 : fPath(path) 236 : fPath(path)
237 , fMode(mode) 237 , fMode(mode)
238 , fDstColorType(dstColorType) 238 , fDstColorType(dstColorType)
239 , fScale(scale) 239 , fScale(scale)
240 {} 240 {}
241 241
242 bool CodecSrc::veto(SinkFlags flags) const { 242 bool CodecSrc::veto(SinkFlags flags) const {
243 if (kYUV_Mode == fMode) {
244 // YUV mode does not support scaling or non-canvas color types.
245 if (CodecSrc::kGetFromCanvas_DstColorType != fDstColorType || 1.0f != fS cale) {
scroggo 2016/01/13 21:04:54 For the DstColorType, can we just limit creating C
msarett 2016/01/15 18:57:34 Done.
246 return true;
247 }
248
249 return flags.type != SinkFlags::kGPU;
250 }
251
243 // No need to test decoding to non-raster or indirect backend. 252 // No need to test decoding to non-raster or indirect backend.
244 // TODO: Once we implement GPU paths (e.g. JPEG YUV), we should use a deferr ed decode to
245 // let the GPU handle it.
246 return flags.type != SinkFlags::kRaster 253 return flags.type != SinkFlags::kRaster
247 || flags.approach != SinkFlags::kDirect; 254 || flags.approach != SinkFlags::kDirect;
248 } 255 }
249 256
250 bool get_decode_info(SkImageInfo* decodeInfo, const SkImageInfo& defaultInfo, 257 bool get_decode_info(SkImageInfo* decodeInfo, const SkImageInfo& defaultInfo,
251 SkColorType canvasColorType, CodecSrc::DstColorType dstColorType) { 258 SkColorType canvasColorType, CodecSrc::DstColorType dstColorType) {
252 switch (dstColorType) { 259 switch (dstColorType) {
253 case CodecSrc::kIndex8_Always_DstColorType: 260 case CodecSrc::kIndex8_Always_DstColorType:
254 if (kRGB_565_SkColorType == canvasColorType) { 261 if (kRGB_565_SkColorType == canvasColorType) {
255 return false; 262 return false;
(...skipping 11 matching lines...) Expand all
267 break; 274 break;
268 } 275 }
269 276
270 // FIXME: Currently we cannot draw unpremultiplied sources. 277 // FIXME: Currently we cannot draw unpremultiplied sources.
271 if (decodeInfo->alphaType() == kUnpremul_SkAlphaType) { 278 if (decodeInfo->alphaType() == kUnpremul_SkAlphaType) {
272 *decodeInfo = decodeInfo->makeAlphaType(kPremul_SkAlphaType); 279 *decodeInfo = decodeInfo->makeAlphaType(kPremul_SkAlphaType);
273 } 280 }
274 return true; 281 return true;
275 } 282 }
276 283
284 Error test_yuv(SkCanvas* canvas, SkCodec* codec) {
285 SkAutoTDelete<SkCodec> deleter(codec);
286
287 SkCodec::YUVPlanesSizes sizes;
288 SkCodec::YUVPlanesWidthBytes widthBytes;
289 SkYUVColorSpace colorSpace;
290 if (!codec->queryYUV8(&sizes, &widthBytes, &colorSpace)) {
291 return Error::Nonfatal("YUV not supported.");
292 }
293
294 const size_t totalBytes = sizes.YSize.height() * widthBytes.YWidthBytes +
295 sizes.USize.height() * widthBytes.UWidthBytes +
296 sizes.VSize.height() * widthBytes.VWidthBytes;
297 SkAutoMalloc storage(totalBytes);
298 void* planes[3];
299 planes[0] = storage.get();
300 planes[1] = SkTAddOffset<void>(planes[0], sizes.YSize.height() * widthBytes. YWidthBytes);
301 planes[2] = SkTAddOffset<void>(planes[1], sizes.USize.height() * widthBytes. UWidthBytes);
302
303 switch (codec->getYUV8Planes(&sizes, planes, &widthBytes)) {
304 case SkCodec::kSuccess:
305 case SkCodec::kIncompleteInput: {
306 /* How do we draw this to canvas? */
307 return "";
308 }
309 default:
310 return SkStringPrintf("Couldn't getYUV8Planes.");
311 }
312 }
313
277 Error CodecSrc::draw(SkCanvas* canvas) const { 314 Error CodecSrc::draw(SkCanvas* canvas) const {
278 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); 315 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str()));
279 if (!encoded) { 316 if (!encoded) {
280 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); 317 return SkStringPrintf("Couldn't read %s.", fPath.c_str());
281 } 318 }
282 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); 319 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
283 if (nullptr == codec.get()) { 320 if (nullptr == codec.get()) {
284 return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str()); 321 return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str());
285 } 322 }
286 323
324 // The YUV test does not share much code with the other tests, so we will ha ndle
325 // it in its own function.
326 if (kYUV_Mode == fMode) {
327 return test_yuv(canvas, codec.detach());
scroggo 2016/01/13 21:04:54 Alternatively, you could let this method delete th
msarett 2016/01/15 18:57:35 Done.
328 }
329
287 SkImageInfo decodeInfo; 330 SkImageInfo decodeInfo;
288 if (!get_decode_info(&decodeInfo, codec->getInfo(), canvas->imageInfo().colo rType(), 331 if (!get_decode_info(&decodeInfo, codec->getInfo(), canvas->imageInfo().colo rType(),
289 fDstColorType)) { 332 fDstColorType)) {
290 return Error::Nonfatal("Testing non-565 to 565 is uninteresting."); 333 return Error::Nonfatal("Testing non-565 to 565 is uninteresting.");
291 } 334 }
292 335
293 // Try to scale the image if it is desired 336 // Try to scale the image if it is desired
294 SkISize size = codec->getScaledDimensions(fScale); 337 SkISize size = codec->getScaledDimensions(fScale);
295 if (size == decodeInfo.dimensions() && 1.0f != fScale) { 338 if (size == decodeInfo.dimensions() && 1.0f != fScale) {
296 return Error::Nonfatal("Test without scaling is uninteresting."); 339 return Error::Nonfatal("Test without scaling is uninteresting.");
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 } 537 }
495 canvas->drawBitmap(subsetBm, SkIntToScalar(left), SkIntToSca lar(top)); 538 canvas->drawBitmap(subsetBm, SkIntToScalar(left), SkIntToSca lar(top));
496 // translate by the scaled height. 539 // translate by the scaled height.
497 top += decodeInfo.height(); 540 top += decodeInfo.height();
498 } 541 }
499 // translate by the scaled width. 542 // translate by the scaled width.
500 left += decodeInfo.width(); 543 left += decodeInfo.width();
501 } 544 }
502 return ""; 545 return "";
503 } 546 }
547 default:
548 SkASSERT(false);
549 return "Invalid fMode";
504 } 550 }
505 return ""; 551 return "";
506 } 552 }
507 553
508 SkISize CodecSrc::size() const { 554 SkISize CodecSrc::size() const {
509 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); 555 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str()));
510 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); 556 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
511 if (nullptr == codec) { 557 if (nullptr == codec) {
512 return SkISize::Make(0, 0); 558 return SkISize::Make(0, 0);
513 } 559 }
(...skipping 12 matching lines...) Expand all
526 AndroidCodecSrc::AndroidCodecSrc(Path path, Mode mode, CodecSrc::DstColorType ds tColorType, 572 AndroidCodecSrc::AndroidCodecSrc(Path path, Mode mode, CodecSrc::DstColorType ds tColorType,
527 int sampleSize) 573 int sampleSize)
528 : fPath(path) 574 : fPath(path)
529 , fMode(mode) 575 , fMode(mode)
530 , fDstColorType(dstColorType) 576 , fDstColorType(dstColorType)
531 , fSampleSize(sampleSize) 577 , fSampleSize(sampleSize)
532 {} 578 {}
533 579
534 bool AndroidCodecSrc::veto(SinkFlags flags) const { 580 bool AndroidCodecSrc::veto(SinkFlags flags) const {
535 // No need to test decoding to non-raster or indirect backend. 581 // No need to test decoding to non-raster or indirect backend.
536 // TODO: Once we implement GPU paths (e.g. JPEG YUV), we should use a deferr ed decode to
537 // let the GPU handle it.
538 return flags.type != SinkFlags::kRaster 582 return flags.type != SinkFlags::kRaster
539 || flags.approach != SinkFlags::kDirect; 583 || flags.approach != SinkFlags::kDirect;
540 } 584 }
541 585
542 Error AndroidCodecSrc::draw(SkCanvas* canvas) const { 586 Error AndroidCodecSrc::draw(SkCanvas* canvas) const {
543 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); 587 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str()));
544 if (!encoded) { 588 if (!encoded) {
545 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); 589 return SkStringPrintf("Couldn't read %s.", fPath.c_str());
546 } 590 }
547 SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromData(encoded)); 591 SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromData(encoded));
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after
1264 skr.visit<void>(i, drawsAsSingletonPictures); 1308 skr.visit<void>(i, drawsAsSingletonPictures);
1265 } 1309 }
1266 SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture()); 1310 SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture());
1267 1311
1268 canvas->drawPicture(macroPic); 1312 canvas->drawPicture(macroPic);
1269 return ""; 1313 return "";
1270 }); 1314 });
1271 } 1315 }
1272 1316
1273 } // namespace DM 1317 } // namespace DM
OLDNEW
« no previous file with comments | « dm/DMSrcSink.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698