1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2016 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkPicture.h" 9cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 10cb93a386Sopenharmony_ci#include "include/utils/SkNullCanvas.h" 11cb93a386Sopenharmony_ci#include "tools/debugger/DebugCanvas.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#include <iostream> 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_WIN 16cb93a386Sopenharmony_ci#include <fcntl.h> 17cb93a386Sopenharmony_ci#include <io.h> 18cb93a386Sopenharmony_ci#endif 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci/* 21cb93a386Sopenharmony_ciIf you execute skp_parser with one argument, it spits out a json representation 22cb93a386Sopenharmony_ciof the skp, but that's incomplete since it's missing many binary blobs (these 23cb93a386Sopenharmony_cicould represent images or typefaces or just anything that doesn't currently 24cb93a386Sopenharmony_cihave a json representation). Each unique blob is labeled with a string in the 25cb93a386Sopenharmony_ciform "data/%d". So for example: 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci tools/git-sync-deps 28cb93a386Sopenharmony_ci bin/gn gen out/debug 29cb93a386Sopenharmony_ci ninja -C out/debug dm skp_parser 30cb93a386Sopenharmony_ci out/debug/dm -m grayscale -w /tmp/dm --config skp 31cb93a386Sopenharmony_ci out/debug/skp_parser /tmp/dm/skp/gm/grayscalejpg.skp | less 32cb93a386Sopenharmony_ci out/debug/skp_parser /tmp/dm/skp/gm/grayscalejpg.skp | grep data 33cb93a386Sopenharmony_ci out/debug/skp_parser /tmp/dm/skp/gm/grayscalejpg.skp data/0 | file - 34cb93a386Sopenharmony_ci out/debug/skp_parser /tmp/dm/skp/gm/grayscalejpg.skp data/0 > /tmp/data0.png 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci"data/0" is an image that the SKP serializer has encoded as PNG. 37cb93a386Sopenharmony_ci*/ 38cb93a386Sopenharmony_ciint main(int argc, char** argv) { 39cb93a386Sopenharmony_ci if (argc < 2) { 40cb93a386Sopenharmony_ci SkDebugf("Usage:\n %s SKP_FILE [DATA_URL]\n", argv[0]); 41cb93a386Sopenharmony_ci return 1; 42cb93a386Sopenharmony_ci } 43cb93a386Sopenharmony_ci SkFILEStream input(argv[1]); 44cb93a386Sopenharmony_ci if (!input.isValid()) { 45cb93a386Sopenharmony_ci SkDebugf("Bad file: '%s'\n", argv[1]); 46cb93a386Sopenharmony_ci return 2; 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci sk_sp<SkPicture> pic = SkPicture::MakeFromStream(&input); 49cb93a386Sopenharmony_ci if (!pic) { 50cb93a386Sopenharmony_ci SkDebugf("Bad skp: '%s'\n", argv[1]); 51cb93a386Sopenharmony_ci return 3; 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci SkISize size = pic->cullRect().roundOut().size(); 54cb93a386Sopenharmony_ci DebugCanvas debugCanvas(size.width(), size.height()); 55cb93a386Sopenharmony_ci pic->playback(&debugCanvas); 56cb93a386Sopenharmony_ci std::unique_ptr<SkCanvas> nullCanvas = SkMakeNullCanvas(); 57cb93a386Sopenharmony_ci UrlDataManager dataManager(SkString("data")); 58cb93a386Sopenharmony_ci SkDynamicMemoryWStream stream; 59cb93a386Sopenharmony_ci SkJSONWriter writer(&stream, SkJSONWriter::Mode::kPretty); 60cb93a386Sopenharmony_ci writer.beginObject(); // root 61cb93a386Sopenharmony_ci debugCanvas.toJSON(writer, dataManager, nullCanvas.get()); 62cb93a386Sopenharmony_ci writer.endObject(); // root 63cb93a386Sopenharmony_ci writer.flush(); 64cb93a386Sopenharmony_ci if (argc > 2) { 65cb93a386Sopenharmony_ci if (UrlDataManager::UrlData* data = 66cb93a386Sopenharmony_ci dataManager.getDataFromUrl(SkString(argv[2]))) { 67cb93a386Sopenharmony_ci SkData* skdata = data->fData.get(); 68cb93a386Sopenharmony_ci SkASSERT(skdata); 69cb93a386Sopenharmony_ci #ifdef SK_BUILD_FOR_WIN 70cb93a386Sopenharmony_ci fflush(stdout); 71cb93a386Sopenharmony_ci (void)_setmode(_fileno(stdout), _O_BINARY); 72cb93a386Sopenharmony_ci #endif 73cb93a386Sopenharmony_ci fwrite(skdata->data(), skdata->size(), 1, stdout); 74cb93a386Sopenharmony_ci } else { 75cb93a386Sopenharmony_ci SkDebugf("Bad data url.\n"); 76cb93a386Sopenharmony_ci return 4; 77cb93a386Sopenharmony_ci } 78cb93a386Sopenharmony_ci } else { 79cb93a386Sopenharmony_ci sk_sp<SkData> data = stream.detachAsData(); 80cb93a386Sopenharmony_ci fwrite(data->data(), data->size(), 1, stdout); 81cb93a386Sopenharmony_ci } 82cb93a386Sopenharmony_ci return 0; 83cb93a386Sopenharmony_ci} 84