| OLD | NEW |
| 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 "SkAndroidCodec.h" | 9 #include "SkAndroidCodec.h" |
| 10 #include "SkCodec.h" | 10 #include "SkCodec.h" |
| (...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 879 | 879 |
| 880 static const SkRect kSKPViewport = {0,0, 1000,1000}; | 880 static const SkRect kSKPViewport = {0,0, 1000,1000}; |
| 881 | 881 |
| 882 SKPSrc::SKPSrc(Path path) : fPath(path) {} | 882 SKPSrc::SKPSrc(Path path) : fPath(path) {} |
| 883 | 883 |
| 884 Error SKPSrc::draw(SkCanvas* canvas) const { | 884 Error SKPSrc::draw(SkCanvas* canvas) const { |
| 885 SkAutoTDelete<SkStream> stream(SkStream::NewFromFile(fPath.c_str())); | 885 SkAutoTDelete<SkStream> stream(SkStream::NewFromFile(fPath.c_str())); |
| 886 if (!stream) { | 886 if (!stream) { |
| 887 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); | 887 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); |
| 888 } | 888 } |
| 889 SkAutoTUnref<SkPicture> pic(SkPicture::CreateFromStream(stream)); | 889 sk_sp<SkPicture> pic(SkPicture::MakeFromStream(stream)); |
| 890 if (!pic) { | 890 if (!pic) { |
| 891 return SkStringPrintf("Couldn't decode %s as a picture.", fPath.c_str())
; | 891 return SkStringPrintf("Couldn't decode %s as a picture.", fPath.c_str())
; |
| 892 } | 892 } |
| 893 stream.reset((SkStream*)nullptr); // Might as well drop this when we're don
e with it. | 893 stream.reset((SkStream*)nullptr); // Might as well drop this when we're don
e with it. |
| 894 | 894 |
| 895 canvas->clipRect(kSKPViewport); | 895 canvas->clipRect(kSKPViewport); |
| 896 canvas->drawPicture(pic); | 896 canvas->drawPicture(pic); |
| 897 return ""; | 897 return ""; |
| 898 } | 898 } |
| 899 | 899 |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1092 SKPSink::SKPSink() {} | 1092 SKPSink::SKPSink() {} |
| 1093 | 1093 |
| 1094 Error SKPSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const
{ | 1094 Error SKPSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const
{ |
| 1095 SkSize size; | 1095 SkSize size; |
| 1096 size = src.size(); | 1096 size = src.size(); |
| 1097 SkPictureRecorder recorder; | 1097 SkPictureRecorder recorder; |
| 1098 Error err = src.draw(recorder.beginRecording(size.width(), size.height())); | 1098 Error err = src.draw(recorder.beginRecording(size.width(), size.height())); |
| 1099 if (!err.isEmpty()) { | 1099 if (!err.isEmpty()) { |
| 1100 return err; | 1100 return err; |
| 1101 } | 1101 } |
| 1102 SkAutoTUnref<SkPicture> pic(recorder.endRecording()); | 1102 recorder.finishRecordingAsPicture()->serialize(dst); |
| 1103 pic->serialize(dst); | |
| 1104 return ""; | 1103 return ""; |
| 1105 } | 1104 } |
| 1106 | 1105 |
| 1107 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1106 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
| 1108 | 1107 |
| 1109 SVGSink::SVGSink() {} | 1108 SVGSink::SVGSink() {} |
| 1110 | 1109 |
| 1111 Error SVGSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const
{ | 1110 Error SVGSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const
{ |
| 1112 SkAutoTDelete<SkXMLWriter> xmlWriter(new SkXMLStreamWriter(dst)); | 1111 SkAutoTDelete<SkXMLWriter> xmlWriter(new SkXMLStreamWriter(dst)); |
| 1113 SkAutoTUnref<SkCanvas> canvas(SkSVGCanvas::Create( | 1112 SkAutoTUnref<SkCanvas> canvas(SkSVGCanvas::Create( |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1249 Error ViaSerialization::draw( | 1248 Error ViaSerialization::draw( |
| 1250 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { | 1249 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { |
| 1251 // Record our Src into a picture. | 1250 // Record our Src into a picture. |
| 1252 auto size = src.size(); | 1251 auto size = src.size(); |
| 1253 SkPictureRecorder recorder; | 1252 SkPictureRecorder recorder; |
| 1254 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), | 1253 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), |
| 1255 SkIntToScalar(size.height()))); | 1254 SkIntToScalar(size.height()))); |
| 1256 if (!err.isEmpty()) { | 1255 if (!err.isEmpty()) { |
| 1257 return err; | 1256 return err; |
| 1258 } | 1257 } |
| 1259 SkAutoTUnref<SkPicture> pic(recorder.endRecording()); | 1258 sk_sp<SkPicture> pic(recorder.finishRecordingAsPicture()); |
| 1260 | 1259 |
| 1261 // Serialize it and then deserialize it. | 1260 // Serialize it and then deserialize it. |
| 1262 SkDynamicMemoryWStream wStream; | 1261 SkDynamicMemoryWStream wStream; |
| 1263 pic->serialize(&wStream); | 1262 pic->serialize(&wStream); |
| 1264 SkAutoTDelete<SkStream> rStream(wStream.detachAsStream()); | 1263 SkAutoTDelete<SkStream> rStream(wStream.detachAsStream()); |
| 1265 SkAutoTUnref<SkPicture> deserialized(SkPicture::CreateFromStream(rStream)); | 1264 sk_sp<SkPicture> deserialized(SkPicture::MakeFromStream(rStream)); |
| 1266 | 1265 |
| 1267 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) { | 1266 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) { |
| 1268 canvas->drawPicture(deserialized); | 1267 canvas->drawPicture(deserialized); |
| 1269 return check_against_reference(bitmap, src, fSink); | 1268 return check_against_reference(bitmap, src, fSink); |
| 1270 }); | 1269 }); |
| 1271 } | 1270 } |
| 1272 | 1271 |
| 1273 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1272 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
| 1274 | 1273 |
| 1275 ViaTiles::ViaTiles(int w, int h, SkBBHFactory* factory, Sink* sink) | 1274 ViaTiles::ViaTiles(int w, int h, SkBBHFactory* factory, Sink* sink) |
| 1276 : Via(sink) | 1275 : Via(sink) |
| 1277 , fW(w) | 1276 , fW(w) |
| 1278 , fH(h) | 1277 , fH(h) |
| 1279 , fFactory(factory) {} | 1278 , fFactory(factory) {} |
| 1280 | 1279 |
| 1281 Error ViaTiles::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri
ng* log) const { | 1280 Error ViaTiles::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri
ng* log) const { |
| 1282 auto size = src.size(); | 1281 auto size = src.size(); |
| 1283 SkPictureRecorder recorder; | 1282 SkPictureRecorder recorder; |
| 1284 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), | 1283 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), |
| 1285 SkIntToScalar(size.height()), | 1284 SkIntToScalar(size.height()), |
| 1286 fFactory.get())); | 1285 fFactory.get())); |
| 1287 if (!err.isEmpty()) { | 1286 if (!err.isEmpty()) { |
| 1288 return err; | 1287 return err; |
| 1289 } | 1288 } |
| 1290 SkAutoTUnref<SkPicture> pic(recorder.endRecordingAsPicture()); | 1289 sk_sp<SkPicture> pic(recorder.finishRecordingAsPicture()); |
| 1291 | 1290 |
| 1292 return draw_to_canvas(fSink, bitmap, stream, log, src.size(), [&](SkCanvas*
canvas) { | 1291 return draw_to_canvas(fSink, bitmap, stream, log, src.size(), [&](SkCanvas*
canvas) { |
| 1293 const int xTiles = (size.width() + fW - 1) / fW, | 1292 const int xTiles = (size.width() + fW - 1) / fW, |
| 1294 yTiles = (size.height() + fH - 1) / fH; | 1293 yTiles = (size.height() + fH - 1) / fH; |
| 1295 SkMultiPictureDraw mpd(xTiles*yTiles); | 1294 SkMultiPictureDraw mpd(xTiles*yTiles); |
| 1296 SkTDArray<SkSurface*> surfaces; | 1295 SkTDArray<SkSurface*> surfaces; |
| 1297 surfaces.setReserve(xTiles*yTiles); | 1296 surfaces.setReserve(xTiles*yTiles); |
| 1298 | 1297 |
| 1299 SkImageInfo info = canvas->imageInfo().makeWH(fW, fH); | 1298 SkImageInfo info = canvas->imageInfo().makeWH(fW, fH); |
| 1300 for (int j = 0; j < yTiles; j++) { | 1299 for (int j = 0; j < yTiles; j++) { |
| 1301 for (int i = 0; i < xTiles; i++) { | 1300 for (int i = 0; i < xTiles; i++) { |
| 1302 // This lets our ultimate Sink determine the best kind of surfac
e. | 1301 // This lets our ultimate Sink determine the best kind of surfac
e. |
| 1303 // E.g., if it's a GpuSink, the surfaces and images are textures
. | 1302 // E.g., if it's a GpuSink, the surfaces and images are textures
. |
| 1304 SkSurface* s = canvas->newSurface(info); | 1303 SkSurface* s = canvas->newSurface(info); |
| 1305 if (!s) { | 1304 if (!s) { |
| 1306 s = SkSurface::NewRaster(info); // Some canvases can't crea
te surfaces. | 1305 s = SkSurface::NewRaster(info); // Some canvases can't crea
te surfaces. |
| 1307 } | 1306 } |
| 1308 surfaces.push(s); | 1307 surfaces.push(s); |
| 1309 SkCanvas* c = s->getCanvas(); | 1308 SkCanvas* c = s->getCanvas(); |
| 1310 c->translate(SkIntToScalar(-i * fW), | 1309 c->translate(SkIntToScalar(-i * fW), |
| 1311 SkIntToScalar(-j * fH)); // Line up the canvas wit
h this tile. | 1310 SkIntToScalar(-j * fH)); // Line up the canvas wit
h this tile. |
| 1312 mpd.add(c, pic); | 1311 mpd.add(c, pic.get()); |
| 1313 } | 1312 } |
| 1314 } | 1313 } |
| 1315 mpd.draw(); | 1314 mpd.draw(); |
| 1316 for (int j = 0; j < yTiles; j++) { | 1315 for (int j = 0; j < yTiles; j++) { |
| 1317 for (int i = 0; i < xTiles; i++) { | 1316 for (int i = 0; i < xTiles; i++) { |
| 1318 sk_sp<SkImage> image(surfaces[i+xTiles*j]->makeImageSnapshot()); | 1317 sk_sp<SkImage> image(surfaces[i+xTiles*j]->makeImageSnapshot()); |
| 1319 canvas->drawImage(image, SkIntToScalar(i*fW), SkIntToScalar(j*fH
)); | 1318 canvas->drawImage(image, SkIntToScalar(i*fW), SkIntToScalar(j*fH
)); |
| 1320 } | 1319 } |
| 1321 } | 1320 } |
| 1322 surfaces.unrefAll(); | 1321 surfaces.unrefAll(); |
| 1323 return ""; | 1322 return ""; |
| 1324 }); | 1323 }); |
| 1325 } | 1324 } |
| 1326 | 1325 |
| 1327 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1326 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
| 1328 | 1327 |
| 1329 Error ViaPicture::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkSt
ring* log) const { | 1328 Error ViaPicture::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkSt
ring* log) const { |
| 1330 auto size = src.size(); | 1329 auto size = src.size(); |
| 1331 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) -> Error { | 1330 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) -> Error { |
| 1332 SkPictureRecorder recorder; | 1331 SkPictureRecorder recorder; |
| 1333 SkAutoTUnref<SkPicture> pic; | 1332 sk_sp<SkPicture> pic; |
| 1334 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width())
, | 1333 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width())
, |
| 1335 SkIntToScalar(size.height()
))); | 1334 SkIntToScalar(size.height()
))); |
| 1336 if (!err.isEmpty()) { | 1335 if (!err.isEmpty()) { |
| 1337 return err; | 1336 return err; |
| 1338 } | 1337 } |
| 1339 pic.reset(recorder.endRecordingAsPicture()); | 1338 pic = recorder.finishRecordingAsPicture(); |
| 1340 canvas->drawPicture(pic); | 1339 canvas->drawPicture(pic); |
| 1341 return check_against_reference(bitmap, src, fSink); | 1340 return check_against_reference(bitmap, src, fSink); |
| 1342 }); | 1341 }); |
| 1343 } | 1342 } |
| 1344 | 1343 |
| 1345 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1344 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
| 1346 | 1345 |
| 1347 // Draw the Src into two pictures, then draw the second picture into the wrapped
Sink. | 1346 // Draw the Src into two pictures, then draw the second picture into the wrapped
Sink. |
| 1348 // This tests that any shortcuts we may take while recording that second picture
are legal. | 1347 // This tests that any shortcuts we may take while recording that second picture
are legal. |
| 1349 Error ViaSecondPicture::draw( | 1348 Error ViaSecondPicture::draw( |
| 1350 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { | 1349 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { |
| 1351 auto size = src.size(); | 1350 auto size = src.size(); |
| 1352 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) -> Error { | 1351 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) -> Error { |
| 1353 SkPictureRecorder recorder; | 1352 SkPictureRecorder recorder; |
| 1354 SkAutoTUnref<SkPicture> pic; | 1353 sk_sp<SkPicture> pic; |
| 1355 for (int i = 0; i < 2; i++) { | 1354 for (int i = 0; i < 2; i++) { |
| 1356 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.widt
h()), | 1355 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.widt
h()), |
| 1357 SkIntToScalar(size.heig
ht()))); | 1356 SkIntToScalar(size.heig
ht()))); |
| 1358 if (!err.isEmpty()) { | 1357 if (!err.isEmpty()) { |
| 1359 return err; | 1358 return err; |
| 1360 } | 1359 } |
| 1361 pic.reset(recorder.endRecordingAsPicture()); | 1360 pic = recorder.finishRecordingAsPicture(); |
| 1362 } | 1361 } |
| 1363 canvas->drawPicture(pic); | 1362 canvas->drawPicture(pic); |
| 1364 return check_against_reference(bitmap, src, fSink); | 1363 return check_against_reference(bitmap, src, fSink); |
| 1365 }); | 1364 }); |
| 1366 } | 1365 } |
| 1367 | 1366 |
| 1368 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1367 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
| 1369 | 1368 |
| 1370 // Draw the Src twice. This can help exercise caching. | 1369 // Draw the Src twice. This can help exercise caching. |
| 1371 Error ViaTwice::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri
ng* log) const { | 1370 Error ViaTwice::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri
ng* log) const { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1385 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1384 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
| 1386 | 1385 |
| 1387 #ifdef SK_MOJO | 1386 #ifdef SK_MOJO |
| 1388 Error ViaMojo::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkS
tring* log) const { | 1387 Error ViaMojo::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkS
tring* log) const { |
| 1389 SkPictureRecorder recorder; | 1388 SkPictureRecorder recorder; |
| 1390 SkRect size = SkRect::Make(SkIRect::MakeSize(src.size())); | 1389 SkRect size = SkRect::Make(SkIRect::MakeSize(src.size())); |
| 1391 Error err = src.draw(recorder.beginRecording(size)); | 1390 Error err = src.draw(recorder.beginRecording(size)); |
| 1392 if (!err.isEmpty()) { | 1391 if (!err.isEmpty()) { |
| 1393 return err; | 1392 return err; |
| 1394 } | 1393 } |
| 1395 SkAutoTUnref<SkPicture> skPicture(recorder.endRecording()); | 1394 sk_sp<SkPicture> skPicture(recorder.finishRecordingAsPicture()); |
| 1396 | 1395 |
| 1397 SkASSERT(skPicture); | 1396 SkASSERT(skPicture); |
| 1398 SkDynamicMemoryWStream buffer; | 1397 SkDynamicMemoryWStream buffer; |
| 1399 skPicture->serialize(&buffer); | 1398 skPicture->serialize(&buffer); |
| 1400 skPicture.reset(); | 1399 skPicture.reset(); |
| 1401 SkMojo::FlattenedPicturePtr mojoPicture = SkMojo::FlattenedPicture::New(
); | 1400 SkMojo::FlattenedPicturePtr mojoPicture = SkMojo::FlattenedPicture::New(
); |
| 1402 mojoPicture->data.resize(buffer.bytesWritten()); | 1401 mojoPicture->data.resize(buffer.bytesWritten()); |
| 1403 buffer.copyTo(mojoPicture->data.data()); | 1402 buffer.copyTo(mojoPicture->data.data()); |
| 1404 buffer.reset(); | 1403 buffer.reset(); |
| 1405 SkASSERT(mojoPicture.get() && mojoPicture->data); | 1404 SkASSERT(mojoPicture.get() && mojoPicture->data); |
| 1406 | 1405 |
| 1407 size_t flatSize = mojoPicture->GetSerializedSize(); | 1406 size_t flatSize = mojoPicture->GetSerializedSize(); |
| 1408 SkAutoMalloc storage(flatSize); | 1407 SkAutoMalloc storage(flatSize); |
| 1409 if (!mojoPicture->Serialize(storage.get(), flatSize)) { | 1408 if (!mojoPicture->Serialize(storage.get(), flatSize)) { |
| 1410 return "SkMojo::FlattenedPicture::Serialize failed"; | 1409 return "SkMojo::FlattenedPicture::Serialize failed"; |
| 1411 } | 1410 } |
| 1412 mojoPicture = SkMojo::FlattenedPicture::New(); | 1411 mojoPicture = SkMojo::FlattenedPicture::New(); |
| 1413 mojoPicture->Deserialize(storage.get()); | 1412 mojoPicture->Deserialize(storage.get()); |
| 1414 storage.reset(); | 1413 storage.reset(); |
| 1415 if (!mojoPicture) { | 1414 if (!mojoPicture) { |
| 1416 return "SkMojo::FlattenedPicture::Deserialize failed"; | 1415 return "SkMojo::FlattenedPicture::Deserialize failed"; |
| 1417 } | 1416 } |
| 1418 SkMemoryStream tmpStream(mojoPicture->data.data(), | 1417 SkMemoryStream tmpStream(mojoPicture->data.data(), |
| 1419 mojoPicture->data.size()); | 1418 mojoPicture->data.size()); |
| 1420 skPicture.reset(SkPicture::CreateFromStream(&tmpStream)); | 1419 skPicture = SkPicture::MakeFromStream(&tmpStream); |
| 1421 mojoPicture.reset(); | 1420 mojoPicture.reset(); |
| 1422 auto fn = [&](SkCanvas* canvas) -> Error { | 1421 auto fn = [&](SkCanvas* canvas) -> Error { |
| 1423 canvas->drawPicture(skPicture.get()); | 1422 canvas->drawPicture(skPicture.get()); |
| 1424 return check_against_reference(bitmap, src, fSink); | 1423 return check_against_reference(bitmap, src, fSink); |
| 1425 }; | 1424 }; |
| 1426 return draw_to_canvas(fSink, bitmap, stream, log, src.size(), fn); | 1425 return draw_to_canvas(fSink, bitmap, stream, log, src.size(), fn); |
| 1427 } | 1426 } |
| 1428 #else // not SK_MOJO | 1427 #else // not SK_MOJO |
| 1429 Error ViaMojo::draw(const Src&, SkBitmap*, SkWStream*, SkString*) const { | 1428 Error ViaMojo::draw(const Src&, SkBitmap*, SkWStream*, SkString*) const { |
| 1430 return "Mojo is missing!"; | 1429 return "Mojo is missing!"; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1447 // which would have the funky effect of applying transforms over and ove
r. | 1446 // which would have the funky effect of applying transforms over and ove
r. |
| 1448 SkRecords::Draw d(canvas, nullptr, fDrawables.begin(), fDrawables.count(
), &SkMatrix::I()); | 1447 SkRecords::Draw d(canvas, nullptr, fDrawables.begin(), fDrawables.count(
), &SkMatrix::I()); |
| 1449 d(op); | 1448 d(op); |
| 1450 } | 1449 } |
| 1451 | 1450 |
| 1452 // Draws get their own picture. | 1451 // Draws get their own picture. |
| 1453 template <typename T> | 1452 template <typename T> |
| 1454 SK_WHEN(T::kTags & SkRecords::kDraw_Tag, void) operator()(const T& op) { | 1453 SK_WHEN(T::kTags & SkRecords::kDraw_Tag, void) operator()(const T& op) { |
| 1455 SkPictureRecorder rec; | 1454 SkPictureRecorder rec; |
| 1456 this->draw(op, rec.beginRecording(SkRect::MakeLargest())); | 1455 this->draw(op, rec.beginRecording(SkRect::MakeLargest())); |
| 1457 SkAutoTUnref<SkPicture> pic(rec.endRecordingAsPicture()); | 1456 sk_sp<SkPicture> pic(rec.finishRecordingAsPicture()); |
| 1458 fCanvas->drawPicture(pic); | 1457 fCanvas->drawPicture(pic); |
| 1459 } | 1458 } |
| 1460 | 1459 |
| 1461 // We'll just issue non-draws directly. | 1460 // We'll just issue non-draws directly. |
| 1462 template <typename T> | 1461 template <typename T> |
| 1463 skstd::enable_if_t<!(T::kTags & SkRecords::kDraw_Tag), void> operator()(cons
t T& op) { | 1462 skstd::enable_if_t<!(T::kTags & SkRecords::kDraw_Tag), void> operator()(cons
t T& op) { |
| 1464 this->draw(op, fCanvas); | 1463 this->draw(op, fCanvas); |
| 1465 } | 1464 } |
| 1466 }; | 1465 }; |
| 1467 | 1466 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1487 SkAutoTDelete<SkDrawableList> drawables(recorder.detachDrawableList()); | 1486 SkAutoTDelete<SkDrawableList> drawables(recorder.detachDrawableList()); |
| 1488 const SkDrawableList empty; | 1487 const SkDrawableList empty; |
| 1489 | 1488 |
| 1490 DrawsAsSingletonPictures drawsAsSingletonPictures = { | 1489 DrawsAsSingletonPictures drawsAsSingletonPictures = { |
| 1491 macroCanvas, | 1490 macroCanvas, |
| 1492 drawables ? *drawables : empty, | 1491 drawables ? *drawables : empty, |
| 1493 }; | 1492 }; |
| 1494 for (int i = 0; i < skr.count(); i++) { | 1493 for (int i = 0; i < skr.count(); i++) { |
| 1495 skr.visit<void>(i, drawsAsSingletonPictures); | 1494 skr.visit<void>(i, drawsAsSingletonPictures); |
| 1496 } | 1495 } |
| 1497 SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture()); | 1496 sk_sp<SkPicture> macroPic(macroRec.finishRecordingAsPicture()); |
| 1498 | 1497 |
| 1499 canvas->drawPicture(macroPic); | 1498 canvas->drawPicture(macroPic); |
| 1500 return check_against_reference(bitmap, src, fSink); | 1499 return check_against_reference(bitmap, src, fSink); |
| 1501 }); | 1500 }); |
| 1502 } | 1501 } |
| 1503 | 1502 |
| 1504 } // namespace DM | 1503 } // namespace DM |
| OLD | NEW |