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 "SamplePipeControllers.h" | 9 #include "SamplePipeControllers.h" |
10 #include "SkAndroidCodec.h" | 10 #include "SkAndroidCodec.h" |
(...skipping 974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
985 SkCanvas canvas(*dst); | 985 SkCanvas canvas(*dst); |
986 return src.draw(&canvas); | 986 return src.draw(&canvas); |
987 } | 987 } |
988 | 988 |
989 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 989 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
990 | 990 |
991 // Handy for front-patching a Src. Do whatever up-front work you need, then cal
l draw_to_canvas(), | 991 // Handy for front-patching a Src. Do whatever up-front work you need, then cal
l draw_to_canvas(), |
992 // passing the Sink draw() arguments, a size, and a function draws into an SkCan
vas. | 992 // passing the Sink draw() arguments, a size, and a function draws into an SkCan
vas. |
993 // Several examples below. | 993 // Several examples below. |
994 | 994 |
995 static Error draw_to_canvas(Name name, Sink* sink, SkBitmap* bitmap, SkWStream*
stream, SkString* log, | 995 static Error draw_to_canvas(Sink* sink, SkBitmap* bitmap, SkWStream* stream, SkS
tring* log, |
996 SkISize size, std::function<Error(SkCanvas*)> draw)
{ | 996 SkISize size, std::function<Error(SkCanvas*)> draw)
{ |
997 class ProxySrc : public Src { | 997 class ProxySrc : public Src { |
998 public: | 998 public: |
999 ProxySrc(SkISize size, Name name, std::function<Error(SkCanvas*)> draw) | 999 ProxySrc(SkISize size, std::function<Error(SkCanvas*)> draw) : fSize(siz
e), fDraw(draw) {} |
1000 : fSize(size), fName(name), fDraw(draw) {} | |
1001 Error draw(SkCanvas* canvas) const override { return fDraw(canvas); } | 1000 Error draw(SkCanvas* canvas) const override { return fDraw(canvas); } |
1002 Name name() const override { return fName; } | 1001 Name name() const override { sk_throw(); return ""; }
// Won't be called. |
1003 SkISize size() const override { return fSize; } | 1002 SkISize size() const override { return fSize; } |
1004 private: | 1003 private: |
1005 SkISize fSize; | 1004 SkISize fSize; |
1006 Name fName; | |
1007 std::function<Error(SkCanvas*)> fDraw; | 1005 std::function<Error(SkCanvas*)> fDraw; |
1008 }; | 1006 }; |
1009 return sink->draw(ProxySrc(size, name, draw), bitmap, stream, log); | 1007 return sink->draw(ProxySrc(size, draw), bitmap, stream, log); |
1010 } | 1008 } |
1011 | 1009 |
1012 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1010 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
1013 | 1011 |
1014 static SkISize auto_compute_translate(SkMatrix* matrix, int srcW, int srcH) { | 1012 static SkISize auto_compute_translate(SkMatrix* matrix, int srcW, int srcH) { |
1015 SkRect bounds = SkRect::MakeIWH(srcW, srcH); | 1013 SkRect bounds = SkRect::MakeIWH(srcW, srcH); |
1016 matrix->mapRect(&bounds); | 1014 matrix->mapRect(&bounds); |
1017 matrix->postTranslate(-bounds.x(), -bounds.y()); | 1015 matrix->postTranslate(-bounds.x(), -bounds.y()); |
1018 return SkISize::Make(SkScalarRoundToInt(bounds.width()), SkScalarRoundToInt(
bounds.height())); | 1016 return SkISize::Make(SkScalarRoundToInt(bounds.width()), SkScalarRoundToInt(
bounds.height())); |
1019 } | 1017 } |
1020 | 1018 |
1021 ViaMatrix::ViaMatrix(Name name, SkMatrix matrix, Sink* sink) : Via(name, sink),
fMatrix(matrix) {} | 1019 ViaMatrix::ViaMatrix(SkMatrix matrix, Sink* sink) : Via(sink), fMatrix(matrix) {
} |
1022 | 1020 |
1023 Error ViaMatrix::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStr
ing* log) const { | 1021 Error ViaMatrix::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStr
ing* log) const { |
1024 SkMatrix matrix = fMatrix; | 1022 SkMatrix matrix = fMatrix; |
1025 SkISize size = auto_compute_translate(&matrix, src.size().width(), src.size(
).height()); | 1023 SkISize size = auto_compute_translate(&matrix, src.size().width(), src.size(
).height()); |
1026 Name name = this->decorateName(src); | 1024 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) { |
1027 return draw_to_canvas(name, fSink, bitmap, stream, log, size, [&](SkCanvas*
canvas) { | |
1028 canvas->concat(matrix); | 1025 canvas->concat(matrix); |
1029 return src.draw(canvas); | 1026 return src.draw(canvas); |
1030 }); | 1027 }); |
1031 } | 1028 } |
1032 | 1029 |
1033 // Undoes any flip or 90 degree rotate without changing the scale of the bitmap. | 1030 // Undoes any flip or 90 degree rotate without changing the scale of the bitmap. |
1034 // This should be pixel-preserving. | 1031 // This should be pixel-preserving. |
1035 ViaUpright::ViaUpright(Name name, SkMatrix matrix, Sink* sink) : Via(name, sink)
, fMatrix(matrix) {} | 1032 ViaUpright::ViaUpright(SkMatrix matrix, Sink* sink) : Via(sink), fMatrix(matrix)
{} |
1036 | 1033 |
1037 Error ViaUpright::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkSt
ring* log) const { | 1034 Error ViaUpright::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkSt
ring* log) const { |
1038 Error err = fSink->draw(src, bitmap, stream, log); | 1035 Error err = fSink->draw(src, bitmap, stream, log); |
1039 if (!err.isEmpty()) { | 1036 if (!err.isEmpty()) { |
1040 return err; | 1037 return err; |
1041 } | 1038 } |
1042 | 1039 |
1043 SkMatrix inverse; | 1040 SkMatrix inverse; |
1044 if (!fMatrix.rectStaysRect() || !fMatrix.invert(&inverse)) { | 1041 if (!fMatrix.rectStaysRect() || !fMatrix.invert(&inverse)) { |
1045 return "Cannot upright --matrix."; | 1042 return "Cannot upright --matrix."; |
(...skipping 16 matching lines...) Expand all Loading... |
1062 | 1059 |
1063 *bitmap = uprighted; | 1060 *bitmap = uprighted; |
1064 bitmap->lockPixels(); | 1061 bitmap->lockPixels(); |
1065 return ""; | 1062 return ""; |
1066 } | 1063 } |
1067 | 1064 |
1068 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1065 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
1069 | 1066 |
1070 Error ViaPipe::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStrin
g* log) const { | 1067 Error ViaPipe::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStrin
g* log) const { |
1071 auto size = src.size(); | 1068 auto size = src.size(); |
1072 Name name = this->decorateName(src); | 1069 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) { |
1073 return draw_to_canvas(name, fSink, bitmap, stream, log, size, [&](SkCanvas*
canvas) { | |
1074 PipeController controller(canvas, &SkImageDecoder::DecodeMemory); | 1070 PipeController controller(canvas, &SkImageDecoder::DecodeMemory); |
1075 SkGPipeWriter pipe; | 1071 SkGPipeWriter pipe; |
1076 const uint32_t kFlags = 0; | 1072 const uint32_t kFlags = 0; |
1077 return src.draw(pipe.startRecording(&controller, kFlags, size.width(), s
ize.height())); | 1073 return src.draw(pipe.startRecording(&controller, kFlags, size.width(), s
ize.height())); |
1078 }); | 1074 }); |
1079 } | 1075 } |
1080 | 1076 |
1081 Error ViaRemote::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStr
ing* log) const { | 1077 Error ViaRemote::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStr
ing* log) const { |
1082 Name name = this->decorateName(src); | 1078 return draw_to_canvas(fSink, bitmap, stream, log, src.size(), [&](SkCanvas*
target) { |
1083 return draw_to_canvas(name, fSink, bitmap, stream, log, src.size(), [&](SkCa
nvas* target) { | |
1084 SkAutoTDelete<SkRemote::Encoder> decoder(SkRemote::NewDecoder(target)); | 1079 SkAutoTDelete<SkRemote::Encoder> decoder(SkRemote::NewDecoder(target)); |
1085 SkAutoTDelete<SkRemote::Encoder> cache(fCache ? SkRemote::NewCachingEn
coder(decoder) | 1080 SkAutoTDelete<SkRemote::Encoder> cache(fCache ? SkRemote::NewCachingEn
coder(decoder) |
1086 : nullptr); | 1081 : nullptr); |
1087 SkAutoTDelete<SkCanvas> canvas(SkRemote::NewCanvas(cache ? cache : decod
er)); | 1082 SkAutoTDelete<SkCanvas> canvas(SkRemote::NewCanvas(cache ? cache : decod
er)); |
1088 return src.draw(canvas); | 1083 return src.draw(canvas); |
1089 }); | 1084 }); |
1090 } | 1085 } |
1091 | 1086 |
1092 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1087 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
1093 | 1088 |
1094 Error ViaSerialization::draw( | 1089 Error ViaSerialization::draw( |
1095 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { | 1090 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { |
1096 // Record our Src into a picture. | 1091 // Record our Src into a picture. |
1097 auto size = src.size(); | 1092 auto size = src.size(); |
1098 SkPictureRecorder recorder; | 1093 SkPictureRecorder recorder; |
1099 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), | 1094 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), |
1100 SkIntToScalar(size.height()))); | 1095 SkIntToScalar(size.height()))); |
1101 if (!err.isEmpty()) { | 1096 if (!err.isEmpty()) { |
1102 return err; | 1097 return err; |
1103 } | 1098 } |
1104 SkAutoTUnref<SkPicture> pic(recorder.endRecording()); | 1099 SkAutoTUnref<SkPicture> pic(recorder.endRecording()); |
1105 | 1100 |
1106 // Serialize it and then deserialize it. | 1101 // Serialize it and then deserialize it. |
1107 SkDynamicMemoryWStream wStream; | 1102 SkDynamicMemoryWStream wStream; |
1108 pic->serialize(&wStream); | 1103 pic->serialize(&wStream); |
1109 SkAutoTDelete<SkStream> rStream(wStream.detachAsStream()); | 1104 SkAutoTDelete<SkStream> rStream(wStream.detachAsStream()); |
1110 SkAutoTUnref<SkPicture> deserialized(SkPicture::CreateFromStream(rStream, &l
azy_decode_bitmap)); | 1105 SkAutoTUnref<SkPicture> deserialized(SkPicture::CreateFromStream(rStream, &l
azy_decode_bitmap)); |
1111 Name name = this->decorateName(src); | |
1112 | 1106 |
1113 return draw_to_canvas(name, fSink, bitmap, stream, log, size, [&](SkCanvas*
canvas) { | 1107 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) { |
1114 canvas->drawPicture(deserialized); | 1108 canvas->drawPicture(deserialized); |
1115 return ""; | 1109 return ""; |
1116 }); | 1110 }); |
1117 } | 1111 } |
1118 | 1112 |
1119 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1113 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
1120 | 1114 |
1121 ViaTiles::ViaTiles(Name name, int w, int h, SkBBHFactory* factory, Sink* sink) | 1115 ViaTiles::ViaTiles(int w, int h, SkBBHFactory* factory, Sink* sink) |
1122 : Via(name, sink) | 1116 : Via(sink) |
1123 , fW(w) | 1117 , fW(w) |
1124 , fH(h) | 1118 , fH(h) |
1125 , fFactory(factory) {} | 1119 , fFactory(factory) {} |
1126 | 1120 |
1127 Error ViaTiles::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri
ng* log) const { | 1121 Error ViaTiles::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri
ng* log) const { |
1128 auto size = src.size(); | 1122 auto size = src.size(); |
1129 SkPictureRecorder recorder; | 1123 SkPictureRecorder recorder; |
1130 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), | 1124 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), |
1131 SkIntToScalar(size.height()), | 1125 SkIntToScalar(size.height()), |
1132 fFactory.get())); | 1126 fFactory.get())); |
1133 if (!err.isEmpty()) { | 1127 if (!err.isEmpty()) { |
1134 return err; | 1128 return err; |
1135 } | 1129 } |
1136 SkAutoTUnref<SkPicture> pic(recorder.endRecordingAsPicture()); | 1130 SkAutoTUnref<SkPicture> pic(recorder.endRecordingAsPicture()); |
1137 Name name = this->decorateName(src); | |
1138 | 1131 |
1139 return draw_to_canvas(name, fSink, bitmap, stream, log, src.size(), [&](SkCa
nvas* canvas) { | 1132 return draw_to_canvas(fSink, bitmap, stream, log, src.size(), [&](SkCanvas*
canvas) { |
1140 const int xTiles = (size.width() + fW - 1) / fW, | 1133 const int xTiles = (size.width() + fW - 1) / fW, |
1141 yTiles = (size.height() + fH - 1) / fH; | 1134 yTiles = (size.height() + fH - 1) / fH; |
1142 SkMultiPictureDraw mpd(xTiles*yTiles); | 1135 SkMultiPictureDraw mpd(xTiles*yTiles); |
1143 SkTDArray<SkSurface*> surfaces; | 1136 SkTDArray<SkSurface*> surfaces; |
1144 surfaces.setReserve(xTiles*yTiles); | 1137 surfaces.setReserve(xTiles*yTiles); |
1145 | 1138 |
1146 SkImageInfo info = canvas->imageInfo().makeWH(fW, fH); | 1139 SkImageInfo info = canvas->imageInfo().makeWH(fW, fH); |
1147 for (int j = 0; j < yTiles; j++) { | 1140 for (int j = 0; j < yTiles; j++) { |
1148 for (int i = 0; i < xTiles; i++) { | 1141 for (int i = 0; i < xTiles; i++) { |
1149 // This lets our ultimate Sink determine the best kind of surfac
e. | 1142 // This lets our ultimate Sink determine the best kind of surfac
e. |
(...skipping 21 matching lines...) Expand all Loading... |
1171 }); | 1164 }); |
1172 } | 1165 } |
1173 | 1166 |
1174 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1167 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
1175 | 1168 |
1176 // Draw the Src into two pictures, then draw the second picture into the wrapped
Sink. | 1169 // Draw the Src into two pictures, then draw the second picture into the wrapped
Sink. |
1177 // This tests that any shortcuts we may take while recording that second picture
are legal. | 1170 // This tests that any shortcuts we may take while recording that second picture
are legal. |
1178 Error ViaSecondPicture::draw( | 1171 Error ViaSecondPicture::draw( |
1179 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { | 1172 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { |
1180 auto size = src.size(); | 1173 auto size = src.size(); |
1181 Name name = this->decorateName(src); | 1174 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) -> Error { |
1182 return draw_to_canvas(name, fSink, bitmap, stream, log, size, [&](SkCanvas*
canvas) -> Error { | |
1183 SkPictureRecorder recorder; | 1175 SkPictureRecorder recorder; |
1184 SkAutoTUnref<SkPicture> pic; | 1176 SkAutoTUnref<SkPicture> pic; |
1185 for (int i = 0; i < 2; i++) { | 1177 for (int i = 0; i < 2; i++) { |
1186 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.widt
h()), | 1178 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.widt
h()), |
1187 SkIntToScalar(size.heig
ht()))); | 1179 SkIntToScalar(size.heig
ht()))); |
1188 if (!err.isEmpty()) { | 1180 if (!err.isEmpty()) { |
1189 return err; | 1181 return err; |
1190 } | 1182 } |
1191 pic.reset(recorder.endRecordingAsPicture()); | 1183 pic.reset(recorder.endRecordingAsPicture()); |
1192 } | 1184 } |
1193 canvas->drawPicture(pic); | 1185 canvas->drawPicture(pic); |
1194 return ""; | 1186 return ""; |
1195 }); | 1187 }); |
1196 } | 1188 } |
1197 | 1189 |
1198 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1190 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
1199 | 1191 |
1200 // Draw the Src twice. This can help exercise caching. | 1192 // Draw the Src twice. This can help exercise caching. |
1201 Error ViaTwice::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri
ng* log) const { | 1193 Error ViaTwice::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri
ng* log) const { |
1202 Name name = this->decorateName(src); | 1194 return draw_to_canvas(fSink, bitmap, stream, log, src.size(), [&](SkCanvas*
canvas) -> Error { |
1203 return draw_to_canvas(name, fSink, bitmap, stream, log, src.size(), [&](SkCa
nvas* canvas) -> Error { | |
1204 for (int i = 0; i < 2; i++) { | 1195 for (int i = 0; i < 2; i++) { |
1205 SkAutoCanvasRestore acr(canvas, true/*save now*/); | 1196 SkAutoCanvasRestore acr(canvas, true/*save now*/); |
1206 canvas->clear(SK_ColorTRANSPARENT); | 1197 canvas->clear(SK_ColorTRANSPARENT); |
1207 Error err = src.draw(canvas); | 1198 Error err = src.draw(canvas); |
1208 if (err.isEmpty()) { | 1199 if (err.isEmpty()) { |
1209 return err; | 1200 return err; |
1210 } | 1201 } |
1211 } | 1202 } |
1212 return ""; | 1203 return ""; |
1213 }); | 1204 }); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1245 skstd::enable_if_t<!(T::kTags & SkRecords::kDraw_Tag), void> operator()(cons
t T& op) { | 1236 skstd::enable_if_t<!(T::kTags & SkRecords::kDraw_Tag), void> operator()(cons
t T& op) { |
1246 this->draw(op, fCanvas); | 1237 this->draw(op, fCanvas); |
1247 } | 1238 } |
1248 }; | 1239 }; |
1249 | 1240 |
1250 // Record Src into a picture, then record it into a macro picture with a sub-pic
ture for each draw. | 1241 // Record Src into a picture, then record it into a macro picture with a sub-pic
ture for each draw. |
1251 // Then play back that macro picture into our wrapped sink. | 1242 // Then play back that macro picture into our wrapped sink. |
1252 Error ViaSingletonPictures::draw( | 1243 Error ViaSingletonPictures::draw( |
1253 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { | 1244 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { |
1254 auto size = src.size(); | 1245 auto size = src.size(); |
1255 Name name = this->decorateName(src); | 1246 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) -> Error { |
1256 return draw_to_canvas(name, fSink, bitmap, stream, log, size, [&](SkCanvas*
canvas) -> Error { | |
1257 // Use low-level (Skia-private) recording APIs so we can read the SkReco
rd. | 1247 // Use low-level (Skia-private) recording APIs so we can read the SkReco
rd. |
1258 SkRecord skr; | 1248 SkRecord skr; |
1259 SkRecorder recorder(&skr, size.width(), size.height()); | 1249 SkRecorder recorder(&skr, size.width(), size.height()); |
1260 Error err = src.draw(&recorder); | 1250 Error err = src.draw(&recorder); |
1261 if (!err.isEmpty()) { | 1251 if (!err.isEmpty()) { |
1262 return err; | 1252 return err; |
1263 } | 1253 } |
1264 | 1254 |
1265 // Record our macro-picture, with each draw op as its own sub-picture. | 1255 // Record our macro-picture, with each draw op as its own sub-picture. |
1266 SkPictureRecorder macroRec; | 1256 SkPictureRecorder macroRec; |
(...skipping 11 matching lines...) Expand all Loading... |
1278 skr.visit<void>(i, drawsAsSingletonPictures); | 1268 skr.visit<void>(i, drawsAsSingletonPictures); |
1279 } | 1269 } |
1280 SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture()); | 1270 SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture()); |
1281 | 1271 |
1282 canvas->drawPicture(macroPic); | 1272 canvas->drawPicture(macroPic); |
1283 return ""; | 1273 return ""; |
1284 }); | 1274 }); |
1285 } | 1275 } |
1286 | 1276 |
1287 } // namespace DM | 1277 } // namespace DM |
OLD | NEW |