OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "LazyDecodeBitmap.h" | 8 #include "LazyDecodeBitmap.h" |
9 #include "CopyTilesRenderer.h" | 9 #include "CopyTilesRenderer.h" |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 * Sets gInputFileName to name, minus any extension ".*" | 105 * Sets gInputFileName to name, minus any extension ".*" |
106 * Sets gImageNo to 0, so images from file "X.skp" will | 106 * Sets gImageNo to 0, so images from file "X.skp" will |
107 * look like "X_<gImageNo>.<suffix>", beginning with 0 | 107 * look like "X_<gImageNo>.<suffix>", beginning with 0 |
108 * for each new skp. | 108 * for each new skp. |
109 */ | 109 */ |
110 static void reset_image_file_base_name(const SkString& name) { | 110 static void reset_image_file_base_name(const SkString& name) { |
111 gImageNo = 0; | 111 gImageNo = 0; |
112 // Remove ".skp" | 112 // Remove ".skp" |
113 const char* cName = name.c_str(); | 113 const char* cName = name.c_str(); |
114 const char* dot = strrchr(cName, '.'); | 114 const char* dot = strrchr(cName, '.'); |
115 if (dot != NULL) { | 115 if (dot != nullptr) { |
116 gInputFileName.set(cName, dot - cName); | 116 gInputFileName.set(cName, dot - cName); |
117 } else { | 117 } else { |
118 gInputFileName.set(name); | 118 gInputFileName.set(name); |
119 } | 119 } |
120 } | 120 } |
121 | 121 |
122 /** | 122 /** |
123 * Write the raw encoded bitmap data to a file. | 123 * Write the raw encoded bitmap data to a file. |
124 */ | 124 */ |
125 static bool write_image_to_file(const void* buffer, size_t size, SkBitmap* bitma
p) { | 125 static bool write_image_to_file(const void* buffer, size_t size, SkBitmap* bitma
p) { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 reset_image_file_base_name(inputFilename); | 174 reset_image_file_base_name(inputFilename); |
175 proc = &write_image_to_file; | 175 proc = &write_image_to_file; |
176 } else { | 176 } else { |
177 proc = &SkImageDecoder::DecodeMemory; | 177 proc = &SkImageDecoder::DecodeMemory; |
178 } | 178 } |
179 | 179 |
180 SkDebugf("deserializing... %s\n", inputPath.c_str()); | 180 SkDebugf("deserializing... %s\n", inputPath.c_str()); |
181 | 181 |
182 SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(&inputStream, pr
oc)); | 182 SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(&inputStream, pr
oc)); |
183 | 183 |
184 if (NULL == picture) { | 184 if (nullptr == picture) { |
185 SkDebugf("Could not read an SkPicture from %s\n", inputPath.c_str()); | 185 SkDebugf("Could not read an SkPicture from %s\n", inputPath.c_str()); |
186 return false; | 186 return false; |
187 } | 187 } |
188 | 188 |
189 while (FLAGS_bench_record) { | 189 while (FLAGS_bench_record) { |
190 SkPictureRecorder recorder; | 190 SkPictureRecorder recorder; |
191 picture->playback(recorder.beginRecording(picture->cullRect().width(), | 191 picture->playback(recorder.beginRecording(picture->cullRect().width(), |
192 picture->cullRect().height(), | 192 picture->cullRect().height(), |
193 NULL, 0)); | 193 nullptr, 0)); |
194 SkAutoTUnref<SkPicture> other(recorder.endRecording()); | 194 SkAutoTUnref<SkPicture> other(recorder.endRecording()); |
195 } | 195 } |
196 | 196 |
197 SkDebugf("drawing... [%f %f %f %f] %s\n", | 197 SkDebugf("drawing... [%f %f %f %f] %s\n", |
198 picture->cullRect().fLeft, picture->cullRect().fTop, | 198 picture->cullRect().fLeft, picture->cullRect().fTop, |
199 picture->cullRect().fRight, picture->cullRect().fBottom, | 199 picture->cullRect().fRight, picture->cullRect().fBottom, |
200 inputPath.c_str()); | 200 inputPath.c_str()); |
201 | 201 |
202 renderer.init(picture, &writePathString, &mismatchPathString, &inputFilename
, | 202 renderer.init(picture, &writePathString, &mismatchPathString, &inputFilename
, |
203 FLAGS_writeChecksumBasedFilenames, FLAGS_mpd); | 203 FLAGS_writeChecksumBasedFilenames, FLAGS_mpd); |
(...skipping 17 matching lines...) Expand all Loading... |
221 } | 221 } |
222 | 222 |
223 static int MaxByteDiff(uint32_t v1, uint32_t v2) { | 223 static int MaxByteDiff(uint32_t v1, uint32_t v2) { |
224 return SkMax32(SkMax32(SkTAbs(getByte(v1, 0) - getByte(v2, 0)), SkTAbs(getBy
te(v1, 1) - getByte(v2, 1))), | 224 return SkMax32(SkMax32(SkTAbs(getByte(v1, 0) - getByte(v2, 0)), SkTAbs(getBy
te(v1, 1) - getByte(v2, 1))), |
225 SkMax32(SkTAbs(getByte(v1, 2) - getByte(v2, 2)), SkTAbs(getBy
te(v1, 3) - getByte(v2, 3)))); | 225 SkMax32(SkTAbs(getByte(v1, 2) - getByte(v2, 2)), SkTAbs(getBy
te(v1, 3) - getByte(v2, 3)))); |
226 } | 226 } |
227 | 227 |
228 class AutoRestoreBbhType { | 228 class AutoRestoreBbhType { |
229 public: | 229 public: |
230 AutoRestoreBbhType() { | 230 AutoRestoreBbhType() { |
231 fRenderer = NULL; | 231 fRenderer = nullptr; |
232 fSavedBbhType = sk_tools::PictureRenderer::kNone_BBoxHierarchyType; | 232 fSavedBbhType = sk_tools::PictureRenderer::kNone_BBoxHierarchyType; |
233 } | 233 } |
234 | 234 |
235 void set(sk_tools::PictureRenderer* renderer, | 235 void set(sk_tools::PictureRenderer* renderer, |
236 sk_tools::PictureRenderer::BBoxHierarchyType bbhType) { | 236 sk_tools::PictureRenderer::BBoxHierarchyType bbhType) { |
237 fRenderer = renderer; | 237 fRenderer = renderer; |
238 fSavedBbhType = renderer->getBBoxHierarchyType(); | 238 fSavedBbhType = renderer->getBBoxHierarchyType(); |
239 renderer->setBBoxHierarchyType(bbhType); | 239 renderer->setBBoxHierarchyType(bbhType); |
240 } | 240 } |
241 | 241 |
242 ~AutoRestoreBbhType() { | 242 ~AutoRestoreBbhType() { |
243 if (fRenderer) { | 243 if (fRenderer) { |
244 fRenderer->setBBoxHierarchyType(fSavedBbhType); | 244 fRenderer->setBBoxHierarchyType(fSavedBbhType); |
245 } | 245 } |
246 } | 246 } |
247 | 247 |
248 private: | 248 private: |
249 sk_tools::PictureRenderer* fRenderer; | 249 sk_tools::PictureRenderer* fRenderer; |
250 sk_tools::PictureRenderer::BBoxHierarchyType fSavedBbhType; | 250 sk_tools::PictureRenderer::BBoxHierarchyType fSavedBbhType; |
251 }; | 251 }; |
252 | 252 |
253 /** | 253 /** |
254 * Render the SKP file(s) within inputPath. | 254 * Render the SKP file(s) within inputPath. |
255 * | 255 * |
256 * @param inputPath path to an individual SKP file, or a directory of SKP files | 256 * @param inputPath path to an individual SKP file, or a directory of SKP files |
257 * @param writePath if not NULL, write all image(s) generated into this director
y | 257 * @param writePath if not nullptr, write all image(s) generated into this direc
tory |
258 * @param mismatchPath if not NULL, write any image(s) not matching expectations
into this directory | 258 * @param mismatchPath if not nullptr, write any image(s) not matching expectati
ons into this directory |
259 * @param renderer PictureRenderer to use to render the SKPs | 259 * @param renderer PictureRenderer to use to render the SKPs |
260 * @param jsonSummaryPtr if not NULL, add the image(s) generated to this summary | 260 * @param jsonSummaryPtr if not nullptr, add the image(s) generated to this summ
ary |
261 */ | 261 */ |
262 static bool render_picture(const SkString& inputPath, const SkString* writePath, | 262 static bool render_picture(const SkString& inputPath, const SkString* writePath, |
263 const SkString* mismatchPath, sk_tools::PictureRender
er& renderer, | 263 const SkString* mismatchPath, sk_tools::PictureRender
er& renderer, |
264 sk_tools::ImageResultsAndExpectations *jsonSummaryPtr
) { | 264 sk_tools::ImageResultsAndExpectations *jsonSummaryPtr
) { |
265 int diffs[256] = {0}; | 265 int diffs[256] = {0}; |
266 SkBitmap* bitmap = NULL; | 266 SkBitmap* bitmap = nullptr; |
267 renderer.setJsonSummaryPtr(jsonSummaryPtr); | 267 renderer.setJsonSummaryPtr(jsonSummaryPtr); |
268 bool success = render_picture_internal(inputPath, | 268 bool success = render_picture_internal(inputPath, |
269 FLAGS_writeWholeImage ? NULL : writePath, | 269 FLAGS_writeWholeImage ? nullptr : writePath, |
270 FLAGS_writeWholeImage ? NULL : mismatchPath, | 270 FLAGS_writeWholeImage ? nullptr : mismatchPath, |
271 renderer, | 271 renderer, |
272 FLAGS_validate || FLAGS_writeWholeImage ? &bitmap : NULL); | 272 FLAGS_validate || FLAGS_writeWholeImage ? &bitmap : nullptr); |
273 | 273 |
274 if (!success || ((FLAGS_validate || FLAGS_writeWholeImage) && bitmap == NULL
)) { | 274 if (!success || ((FLAGS_validate || FLAGS_writeWholeImage) && bitmap == null
ptr)) { |
275 SkDebugf("Failed to draw the picture.\n"); | 275 SkDebugf("Failed to draw the picture.\n"); |
276 delete bitmap; | 276 delete bitmap; |
277 return false; | 277 return false; |
278 } | 278 } |
279 | 279 |
280 if (FLAGS_validate) { | 280 if (FLAGS_validate) { |
281 SkBitmap* referenceBitmap = NULL; | 281 SkBitmap* referenceBitmap = nullptr; |
282 sk_tools::PictureRenderer* referenceRenderer; | 282 sk_tools::PictureRenderer* referenceRenderer; |
283 // If the renderer uses a BBoxHierarchy, then the reference renderer | 283 // If the renderer uses a BBoxHierarchy, then the reference renderer |
284 // will be the same renderer, without the bbh. | 284 // will be the same renderer, without the bbh. |
285 AutoRestoreBbhType arbbh; | 285 AutoRestoreBbhType arbbh; |
286 if (sk_tools::PictureRenderer::kNone_BBoxHierarchyType != | 286 if (sk_tools::PictureRenderer::kNone_BBoxHierarchyType != |
287 renderer.getBBoxHierarchyType()) { | 287 renderer.getBBoxHierarchyType()) { |
288 referenceRenderer = &renderer; | 288 referenceRenderer = &renderer; |
289 referenceRenderer->ref(); // to match auto unref below | 289 referenceRenderer->ref(); // to match auto unref below |
290 arbbh.set(referenceRenderer, sk_tools::PictureRenderer::kNone_BBoxHi
erarchyType); | 290 arbbh.set(referenceRenderer, sk_tools::PictureRenderer::kNone_BBoxHi
erarchyType); |
291 } else { | 291 } else { |
292 #if SK_SUPPORT_GPU | 292 #if SK_SUPPORT_GPU |
293 referenceRenderer = new sk_tools::SimplePictureRenderer(renderer.get
GrContextOptions()); | 293 referenceRenderer = new sk_tools::SimplePictureRenderer(renderer.get
GrContextOptions()); |
294 #else | 294 #else |
295 referenceRenderer = new sk_tools::SimplePictureRenderer; | 295 referenceRenderer = new sk_tools::SimplePictureRenderer; |
296 #endif | 296 #endif |
297 } | 297 } |
298 SkAutoTUnref<sk_tools::PictureRenderer> aurReferenceRenderer(referenceRe
nderer); | 298 SkAutoTUnref<sk_tools::PictureRenderer> aurReferenceRenderer(referenceRe
nderer); |
299 | 299 |
300 success = render_picture_internal(inputPath, NULL, NULL, *referenceRende
rer, | 300 success = render_picture_internal(inputPath, nullptr, nullptr, *referenc
eRenderer, |
301 &referenceBitmap); | 301 &referenceBitmap); |
302 | 302 |
303 if (!success || NULL == referenceBitmap || NULL == referenceBitmap->getP
ixels()) { | 303 if (!success || nullptr == referenceBitmap || nullptr == referenceBitmap
->getPixels()) { |
304 SkDebugf("Failed to draw the reference picture.\n"); | 304 SkDebugf("Failed to draw the reference picture.\n"); |
305 delete bitmap; | 305 delete bitmap; |
306 delete referenceBitmap; | 306 delete referenceBitmap; |
307 return false; | 307 return false; |
308 } | 308 } |
309 | 309 |
310 if (success && (bitmap->width() != referenceBitmap->width())) { | 310 if (success && (bitmap->width() != referenceBitmap->width())) { |
311 SkDebugf("Expected image width: %i, actual image width %i.\n", | 311 SkDebugf("Expected image width: %i, actual image width %i.\n", |
312 referenceBitmap->width(), bitmap->width()); | 312 referenceBitmap->width(), bitmap->width()); |
313 delete bitmap; | 313 delete bitmap; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 SkString inputFilename = SkOSPath::Basename(inputPath.c_str()); | 356 SkString inputFilename = SkOSPath::Basename(inputPath.c_str()); |
357 SkString outputFilename(inputFilename); | 357 SkString outputFilename(inputFilename); |
358 sk_tools::replace_char(&outputFilename, '.', '_'); | 358 sk_tools::replace_char(&outputFilename, '.', '_'); |
359 outputFilename.append(".png"); | 359 outputFilename.append(".png"); |
360 | 360 |
361 if (jsonSummaryPtr) { | 361 if (jsonSummaryPtr) { |
362 sk_tools::ImageDigest imageDigest(*bitmap); | 362 sk_tools::ImageDigest imageDigest(*bitmap); |
363 jsonSummaryPtr->add(inputFilename.c_str(), outputFilename.c_str(), i
mageDigest); | 363 jsonSummaryPtr->add(inputFilename.c_str(), outputFilename.c_str(), i
mageDigest); |
364 if ((mismatchPath) && !mismatchPath->isEmpty() && | 364 if ((mismatchPath) && !mismatchPath->isEmpty() && |
365 !jsonSummaryPtr->getExpectation(inputFilename.c_str()).matches(i
mageDigest)) { | 365 !jsonSummaryPtr->getExpectation(inputFilename.c_str()).matches(i
mageDigest)) { |
366 success &= sk_tools::write_bitmap_to_disk(*bitmap, *mismatchPath
, NULL, | 366 success &= sk_tools::write_bitmap_to_disk(*bitmap, *mismatchPath
, nullptr, |
367 outputFilename); | 367 outputFilename); |
368 } | 368 } |
369 } | 369 } |
370 | 370 |
371 if ((writePath) && !writePath->isEmpty()) { | 371 if ((writePath) && !writePath->isEmpty()) { |
372 success &= sk_tools::write_bitmap_to_disk(*bitmap, *writePath, NULL,
outputFilename); | 372 success &= sk_tools::write_bitmap_to_disk(*bitmap, *writePath, nullp
tr, outputFilename); |
373 } | 373 } |
374 } | 374 } |
375 delete bitmap; | 375 delete bitmap; |
376 | 376 |
377 return success; | 377 return success; |
378 } | 378 } |
379 | 379 |
380 | 380 |
381 static int process_input(const char* input, const SkString* writePath, | 381 static int process_input(const char* input, const SkString* writePath, |
382 const SkString* mismatchPath, sk_tools::PictureRenderer
& renderer, | 382 const SkString* mismatchPath, sk_tools::PictureRenderer
& renderer, |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 } | 436 } |
437 } | 437 } |
438 | 438 |
439 SkString errorString; | 439 SkString errorString; |
440 SkAutoTUnref<sk_tools::PictureRenderer> renderer(parseRenderer(errorString, | 440 SkAutoTUnref<sk_tools::PictureRenderer> renderer(parseRenderer(errorString, |
441 kRender_Pictu
reTool)); | 441 kRender_Pictu
reTool)); |
442 if (errorString.size() > 0) { | 442 if (errorString.size() > 0) { |
443 SkDebugf("%s\n", errorString.c_str()); | 443 SkDebugf("%s\n", errorString.c_str()); |
444 } | 444 } |
445 | 445 |
446 if (renderer.get() == NULL) { | 446 if (renderer.get() == nullptr) { |
447 exit(-1); | 447 exit(-1); |
448 } | 448 } |
449 | 449 |
450 SkAutoGraphics ag; | 450 SkAutoGraphics ag; |
451 | 451 |
452 SkString writePath; | 452 SkString writePath; |
453 if (FLAGS_writePath.count() == 1) { | 453 if (FLAGS_writePath.count() == 1) { |
454 writePath.set(FLAGS_writePath[0]); | 454 writePath.set(FLAGS_writePath[0]); |
455 } | 455 } |
456 SkString mismatchPath; | 456 SkString mismatchPath; |
457 if (FLAGS_mismatchPath.count() == 1) { | 457 if (FLAGS_mismatchPath.count() == 1) { |
458 mismatchPath.set(FLAGS_mismatchPath[0]); | 458 mismatchPath.set(FLAGS_mismatchPath[0]); |
459 } | 459 } |
460 sk_tools::ImageResultsAndExpectations jsonSummary; | 460 sk_tools::ImageResultsAndExpectations jsonSummary; |
461 sk_tools::ImageResultsAndExpectations* jsonSummaryPtr = NULL; | 461 sk_tools::ImageResultsAndExpectations* jsonSummaryPtr = nullptr; |
462 if (FLAGS_writeJsonSummaryPath.count() == 1) { | 462 if (FLAGS_writeJsonSummaryPath.count() == 1) { |
463 jsonSummaryPtr = &jsonSummary; | 463 jsonSummaryPtr = &jsonSummary; |
464 if (FLAGS_readJsonSummaryPath.count() == 1) { | 464 if (FLAGS_readJsonSummaryPath.count() == 1) { |
465 SkASSERT(jsonSummary.readExpectationsFile(FLAGS_readJsonSummaryPath[
0])); | 465 SkASSERT(jsonSummary.readExpectationsFile(FLAGS_readJsonSummaryPath[
0])); |
466 } | 466 } |
467 } | 467 } |
468 | 468 |
469 int failures = 0; | 469 int failures = 0; |
470 for (int i = 0; i < FLAGS_readPath.count(); i ++) { | 470 for (int i = 0; i < FLAGS_readPath.count(); i ++) { |
471 failures += process_input(FLAGS_readPath[i], &writePath, &mismatchPath,
*renderer.get(), | 471 failures += process_input(FLAGS_readPath[i], &writePath, &mismatchPath,
*renderer.get(), |
(...skipping 30 matching lines...) Expand all Loading... |
502 jsonSummary.writeToFile(FLAGS_writeJsonSummaryPath[0]); | 502 jsonSummary.writeToFile(FLAGS_writeJsonSummaryPath[0]); |
503 } | 503 } |
504 return 0; | 504 return 0; |
505 } | 505 } |
506 | 506 |
507 #if !defined SK_BUILD_FOR_IOS | 507 #if !defined SK_BUILD_FOR_IOS |
508 int main(int argc, char * const argv[]) { | 508 int main(int argc, char * const argv[]) { |
509 return tool_main(argc, (char**) argv); | 509 return tool_main(argc, (char**) argv); |
510 } | 510 } |
511 #endif | 511 #endif |
OLD | NEW |