/** Reads an skp file, renders it to pdf and writes the output to a pdf file * @param inputPath The skp file to be read. * @param outputDir Output dir. * @param renderer The object responsible to render the skp object into pdf. */ static bool render_pdf(const SkString& inputPath, const SkString& outputDir, sk_tools::PdfRenderer& renderer) { SkString inputFilename; sk_tools::get_basename(&inputFilename, inputPath); SkFILEStream inputStream; inputStream.setPath(inputPath.c_str()); if (!inputStream.isValid()) { SkDebugf("Could not open file %s\n", inputPath.c_str()); return false; } bool success = false; SkAutoTUnref<SkPicture> picture(SkNEW_ARGS(SkPicture, (&inputStream, &success))); if (!success) { SkDebugf("Could not read an SkPicture from %s\n", inputPath.c_str()); return false; } SkDebugf("exporting... [%i %i] %s\n", picture->width(), picture->height(), inputPath.c_str()); renderer.init(picture); renderer.render(); success = write_output(outputDir, inputFilename, renderer); renderer.end(); return success; }
static bool run_single_benchmark(const SkString& inputPath, sk_tools::PictureBenchmark& benchmark) { SkFILEStream inputStream; inputStream.setPath(inputPath.c_str()); if (!inputStream.isValid()) { SkString err; err.printf("Could not open file %s\n", inputPath.c_str()); gLogger.logError(err); return false; } bool success = false; SkPicture picture(&inputStream, &success, &SkImageDecoder::DecodeStream); if (!success) { SkString err; err.printf("Could not read an SkPicture from %s\n", inputPath.c_str()); gLogger.logError(err); return false; } SkString filename; sk_tools::get_basename(&filename, inputPath); SkString result; result.printf("running bench [%i %i] %s ", picture.width(), picture.height(), filename.c_str()); gLogger.logProgress(result); benchmark.run(&picture); return true; }
SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) { SkTypeface* face = NULL; SkFILEStream* stream = SkNEW_ARGS(SkFILEStream, (path)); if (stream->isValid()) { face = CreateTypefaceFromStream(stream); } stream->unref(); return face; }
static bool render_picture(const SkString& inputPath, const SkString* outputDir, sk_tools::PictureRenderer& renderer, SkBitmap** out, int clones) { SkString inputFilename; sk_tools::get_basename(&inputFilename, inputPath); SkFILEStream inputStream; inputStream.setPath(inputPath.c_str()); if (!inputStream.isValid()) { SkDebugf("Could not open file %s\n", inputPath.c_str()); return false; } bool success = false; SkPicture* picture = SkNEW_ARGS(SkPicture, (&inputStream, &success, &SkImageDecoder::DecodeStream)); if (!success) { SkDebugf("Could not read an SkPicture from %s\n", inputPath.c_str()); return false; } for (int i = 0; i < clones; ++i) { SkPicture* clone = picture->clone(); SkDELETE(picture); picture = clone; } SkDebugf("drawing... [%i %i] %s\n", picture->width(), picture->height(), inputPath.c_str()); renderer.init(picture); renderer.setup(); SkString* outputPath = NULL; if (NULL != outputDir) { outputPath = SkNEW(SkString); make_output_filepath(outputPath, *outputDir, inputFilename); } success = renderer.render(outputPath, out); if (outputPath) { if (!success) { SkDebugf("Could not write to file %s\n", outputPath->c_str()); } SkDELETE(outputPath); } renderer.resetState(); renderer.end(); SkDELETE(picture); return success; }
PreParser(int dirNo) : fDirNo(dirNo) , fIndex(0) , fStatusPath(makeStatusString(dirNo)) { if (!sk_exists(fStatusPath.c_str())) { return; } SkFILEStream reader; reader.setPath(fStatusPath.c_str()); while (fetch(reader, &fResults.push_back())) ; fResults.pop_back(); }
bool fetch(SkFILEStream& reader, TestResult* result) { char c; int i = 0; result->init(fDirNo); result->fPixelError = 0; result->fTime = 0; do { bool readOne = reader.read(&c, 1) != 0; if (!readOne) { SkASSERT(i == 0); return false; } if (c == ' ') { result->fFilename[i++] = '\0'; break; } result->fFilename[i++] = c; SkASSERT(i < kMaxLength); } while (true); do { SkAssertResult(reader.read(&c, 1) != 0); if (c == ' ') { break; } SkASSERT(c >= '0' && c <= '9'); result->fPixelError = result->fPixelError * 10 + (c - '0'); } while (true); bool minus = false; do { if (reader.read(&c, 1) == 0) { break; } if (c == '\r' && reader.read(&c, 1) == 0) { break; } if (c == '\n') { break; } if (c == '-') { minus = true; continue; } SkASSERT(c >= '0' && c <= '9'); result->fTime = result->fTime * 10 + (c - '0'); } while (true); if (minus) { result->fTime = -result->fTime; } return true; }
ImageView() { SkImageRef_GlobalPool::SetRAMBudget(32 * 1024); int i, N = SK_ARRAY_COUNT(gNames); fBitmaps = new SkBitmap[N]; for (i = 0; i < N; i++) { SkString str("/skimages/"); str.append(gNames[i]); SkFILEStream* stream = new SkFILEStream(str.c_str()); SetImageRef(&fBitmaps[i], stream, SkBitmap::kNo_Config, gNames[i]); if (i & 1) fBitmaps[i].buildMipMap(); stream->unref(); } fShader = SkShader::CreateBitmapShader(fBitmaps[5], SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode); if (true) { SkMatrix m; m.setRotate(SkIntToScalar(30)); fShader->setLocalMatrix(m); } #if 0 SkImageRef::DumpPool(); for (i = 0; i < N; i++) { SkBitmap& bm = fBitmaps[i]; SkDebugf("<%s> addr=%p", gNames[i], bm.getPixels()); bool success = bm.lockPixels(); SkDebugf(" addr=%d", bm.getPixels()); if (success) bm.unlockPixels(); SkDebugf(" addr=%p", bm.getPixels()); success = bm.lockPixels(); SkDebugf(" addr=%d", bm.getPixels()); if (success) bm.unlockPixels(); SkDebugf("\n"); } SkImageRef::DumpPool(); #endif }
/** Reads an skp file, renders it to pdf and writes the output to a pdf file * @param inputPath The skp file to be read. * @param outputDir Output dir. * @param renderer The object responsible to render the skp object into pdf. */ static bool render_pdf(const SkString& inputPath, const SkString& outputDir, sk_tools::PdfRenderer& renderer) { SkString inputFilename; sk_tools::get_basename(&inputFilename, inputPath); SkFILEStream inputStream; inputStream.setPath(inputPath.c_str()); if (!inputStream.isValid()) { SkDebugf("Could not open file %s\n", inputPath.c_str()); return false; } SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(&inputStream)); if (NULL == picture.get()) { SkDebugf("Could not read an SkPicture from %s\n", inputPath.c_str()); return false; } SkDebugf("exporting... [%i %i] %s\n", picture->width(), picture->height(), inputPath.c_str()); SkWStream* stream(open_stream(outputDir, inputFilename)); if (!stream) { return false; } renderer.init(picture, stream); bool success = renderer.render(); SkDELETE(stream); renderer.end(); return success; }
static void run_single_benchmark(const SkString& inputPath, sk_tools::PictureBenchmark& benchmark) { SkFILEStream inputStream; inputStream.setPath(inputPath.c_str()); if (!inputStream.isValid()) { SkString err; err.printf("Could not open file %s\n", inputPath.c_str()); gLogger.logError(err); return; } SkPicture picture(&inputStream); SkString filename; sk_tools::get_basename(&filename, inputPath); SkString result; result.printf("running bench [%i %i] %s ", picture.width(), picture.height(), filename.c_str()); gLogger.logProgress(result); benchmark.run(&picture); }
/** * Called only by render_picture(). */ static bool render_picture_internal(const SkString& inputPath, const SkString* outputDir, sk_tools::PictureRenderer& renderer, SkBitmap** out) { SkString inputFilename; sk_tools::get_basename(&inputFilename, inputPath); SkString outputDirString; if (NULL != outputDir && outputDir->size() > 0 && !FLAGS_writeEncodedImages) { outputDirString.set(*outputDir); } SkFILEStream inputStream; inputStream.setPath(inputPath.c_str()); if (!inputStream.isValid()) { SkDebugf("Could not open file %s\n", inputPath.c_str()); return false; } SkPicture::InstallPixelRefProc proc; if (FLAGS_deferImageDecoding) { proc = &sk_tools::LazyDecodeBitmap; } else if (FLAGS_writeEncodedImages) { SkASSERT(!FLAGS_writePath.isEmpty()); reset_image_file_base_name(inputFilename); proc = &write_image_to_file; } else { proc = &SkImageDecoder::DecodeMemory; } SkDebugf("deserializing... %s\n", inputPath.c_str()); SkPicture* picture = SkPicture::CreateFromStream(&inputStream, proc); if (NULL == picture) { SkDebugf("Could not read an SkPicture from %s\n", inputPath.c_str()); return false; } while (FLAGS_bench_record) { const int kRecordFlags = 0; SkPicture other; picture->draw(other.beginRecording(picture->width(), picture->height(), kRecordFlags)); other.endRecording(); } for (int i = 0; i < FLAGS_clone; ++i) { SkPicture* clone = picture->clone(); SkDELETE(picture); picture = clone; } SkDebugf("drawing... [%i %i] %s\n", picture->width(), picture->height(), inputPath.c_str()); renderer.init(picture, &outputDirString, &inputFilename, FLAGS_writeChecksumBasedFilenames); if (FLAGS_preprocess) { if (NULL != renderer.getCanvas()) { renderer.getCanvas()->EXPERIMENTAL_optimize(picture); } } renderer.setup(); bool success = renderer.render(out); if (!success) { SkDebugf("Failed to render %s\n", inputFilename.c_str()); } renderer.end(); SkDELETE(picture); return success; }
static bool run_single_benchmark(const SkString& inputPath, sk_tools::PictureBenchmark& benchmark) { SkFILEStream inputStream; inputStream.setPath(inputPath.c_str()); if (!inputStream.isValid()) { SkString err; err.printf("Could not open file %s\n", inputPath.c_str()); gLogger.logError(err); return false; } SkDiscardableMemoryPool* pool = SkGetGlobalDiscardableMemoryPool(); // Since the old picture has been deleted, all pixels should be cleared. SkASSERT(pool->getRAMUsed() == 0); if (FLAGS_countRAM) { pool->setRAMBudget(SK_MaxU32); // Set the limit to max, so all pixels will be kept } SkPicture::InstallPixelRefProc proc; if (FLAGS_deferImageDecoding) { proc = &sk_tools::LazyDecodeBitmap; } else { proc = &SkImageDecoder::DecodeMemory; } SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(&inputStream, proc)); if (NULL == picture.get()) { SkString err; err.printf("Could not read an SkPicture from %s\n", inputPath.c_str()); gLogger.logError(err); return false; } SkString filename = SkOSPath::Basename(inputPath.c_str()); gWriter.bench(filename.c_str(), picture->width(), picture->height()); benchmark.run(picture); #if SK_LAZY_CACHE_STATS if (FLAGS_trackDeferredCaching) { int cacheHits = pool->getCacheHits(); int cacheMisses = pool->getCacheMisses(); pool->resetCacheHitsAndMisses(); SkString hitString; hitString.printf("Cache hit rate: %f\n", (double) cacheHits / (cacheHits + cacheMisses)); gLogger.logProgress(hitString); gTotalCacheHits += cacheHits; gTotalCacheMisses += cacheMisses; } #endif if (FLAGS_countRAM) { SkString ramCount("RAM used for bitmaps: "); size_t bytes = pool->getRAMUsed(); if (bytes > 1024) { size_t kb = bytes / 1024; if (kb > 1024) { size_t mb = kb / 1024; ramCount.appendf("%zi MB\n", mb); } else { ramCount.appendf("%zi KB\n", kb); } } else { ramCount.appendf("%zi bytes\n", bytes); } gLogger.logProgress(ramCount); } return true; }
static bool run_single_benchmark(const SkString& inputPath, sk_tools::PictureBenchmark& benchmark) { SkFILEStream inputStream; inputStream.setPath(inputPath.c_str()); if (!inputStream.isValid()) { SkString err; err.printf("Could not open file %s\n", inputPath.c_str()); gLogger.logError(err); return false; } // Since the old picture has been deleted, all pixels should be cleared. SkASSERT(gLruImageCache.getImageCacheUsed() == 0); if (FLAGS_countRAM) { // Set the limit to zero, so all pixels will be kept gLruImageCache.setImageCacheLimit(0); } bool success = false; SkPicture* picture; if (FLAGS_deferImageDecoding) { picture = SkNEW_ARGS(SkPicture, (&inputStream, &success, &lazy_decode_bitmap)); } else { picture = SkNEW_ARGS(SkPicture, (&inputStream, &success, &SkImageDecoder::DecodeMemory)); } SkAutoTDelete<SkPicture> ad(picture); if (!success) { SkString err; err.printf("Could not read an SkPicture from %s\n", inputPath.c_str()); gLogger.logError(err); return false; } SkString filename; sk_tools::get_basename(&filename, inputPath); SkString result; result.printf("running bench [%i %i] %s ", picture->width(), picture->height(), filename.c_str()); gLogger.logProgress(result); benchmark.run(picture); #if LAZY_CACHE_STATS if (FLAGS_trackDeferredCaching) { int32_t cacheHits = SkLazyPixelRef::GetCacheHits(); int32_t cacheMisses = SkLazyPixelRef::GetCacheMisses(); SkLazyPixelRef::ResetCacheStats(); SkString hitString; hitString.printf("Cache hit rate: %f\n", (double) cacheHits / (cacheHits + cacheMisses)); gLogger.logProgress(hitString); gTotalCacheHits += cacheHits; gTotalCacheMisses += cacheMisses; } #endif if (FLAGS_countRAM) { SkString ramCount("RAM used for bitmaps: "); size_t bytes = gLruImageCache.getImageCacheUsed(); if (bytes > 1024) { size_t kb = bytes / 1024; if (kb > 1024) { size_t mb = kb / 1024; ramCount.appendf("%zi MB\n", mb); } else { ramCount.appendf("%zi KB\n", kb); } } else { ramCount.appendf("%zi bytes\n", bytes); } gLogger.logProgress(ramCount); } return true; }
int tool_main_core(int argc, char** argv) { SkCommandLineFlags::Parse(argc, argv); SkAutoGraphics ag; SkString outputDir; if (FLAGS_outputDir.count() > 0) { outputDir = FLAGS_outputDir[0]; if (!sk_mkdir(outputDir.c_str())) { SkDebugf("Unable to mkdir '%s'\n", outputDir.c_str()); return 1; } } SkTArray<SkString> files; process_input_files(FLAGS_inputPaths, &files); size_t maximumPathLength = 0; for (int i = 0; i < files.count(); i ++) { SkString basename = SkOSPath::Basename(files[i].c_str()); maximumPathLength = SkTMax(maximumPathLength, basename.size()); } int failures = 0; for (int i = 0; i < files.count(); i ++) { SkString basename = SkOSPath::Basename(files[i].c_str()); SkFILEStream inputStream; inputStream.setPath(files[i].c_str()); if (!inputStream.isValid()) { SkDebugf("Could not open file %s\n", files[i].c_str()); ++failures; continue; } SkAutoTUnref<SkPicture> picture( SkPicture::CreateFromStream(&inputStream)); if (NULL == picture.get()) { SkDebugf("Could not read an SkPicture from %s\n", files[i].c_str()); ++failures; continue; } SkDebugf("[%6g %6g %6g %6g] %-*s", picture->cullRect().fLeft, picture->cullRect().fTop, picture->cullRect().fRight, picture->cullRect().fBottom, maximumPathLength, basename.c_str()); SkAutoTDelete<SkWStream> stream(open_stream(outputDir, files[i])); if (!stream.get()) { ++failures; continue; } if (!pdf_to_stream(picture, stream.get())) { SkDebugf("Error in PDF Serialization."); ++failures; } int max_rss_mb = sk_tools::getMaxResidentSetSizeMB(); if (max_rss_mb >= 0) { SkDebugf(" %4dM peak rss", max_rss_mb); } SkDebugf("\n"); } if (failures != 0) { SkDebugf("Failed to render %i of %i PDFs.\n", failures, files.count()); return 1; } return 0; }
/** * Called only by render_picture(). */ static bool render_picture_internal(const SkString& inputPath, const SkString* writePath, const SkString* mismatchPath, sk_tools::PictureRenderer& renderer, SkBitmap** out) { SkString inputFilename = SkOSPath::Basename(inputPath.c_str()); SkString writePathString; if (writePath && writePath->size() > 0 && !FLAGS_writeEncodedImages) { writePathString.set(*writePath); } SkString mismatchPathString; if (mismatchPath && mismatchPath->size() > 0) { mismatchPathString.set(*mismatchPath); } SkFILEStream inputStream; inputStream.setPath(inputPath.c_str()); if (!inputStream.isValid()) { SkDebugf("Could not open file %s\n", inputPath.c_str()); return false; } SkPicture::InstallPixelRefProc proc; if (FLAGS_deferImageDecoding) { proc = &sk_tools::LazyDecodeBitmap; } else if (FLAGS_writeEncodedImages) { SkASSERT(!FLAGS_writePath.isEmpty()); reset_image_file_base_name(inputFilename); proc = &write_image_to_file; } else { proc = &SkImageDecoder::DecodeMemory; } SkDebugf("deserializing... %s\n", inputPath.c_str()); SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(&inputStream, proc)); if (NULL == picture) { SkDebugf("Could not read an SkPicture from %s\n", inputPath.c_str()); return false; } while (FLAGS_bench_record) { SkPictureRecorder recorder; picture->playback(recorder.beginRecording(picture->cullRect().width(), picture->cullRect().height(), NULL, 0)); SkAutoTUnref<SkPicture> other(recorder.endRecording()); } SkDebugf("drawing... [%f %f %f %f] %s\n", picture->cullRect().fLeft, picture->cullRect().fTop, picture->cullRect().fRight, picture->cullRect().fBottom, inputPath.c_str()); renderer.init(picture, &writePathString, &mismatchPathString, &inputFilename, FLAGS_writeChecksumBasedFilenames, FLAGS_mpd); renderer.setup(); renderer.enableWrites(); bool success = renderer.render(out); if (!success) { SkDebugf("Failed to render %s\n", inputFilename.c_str()); } renderer.end(); return success; }