skimage_main.cpp revision 80bacfeb4bda06541e8695bd502229727bccfeab
1 2/* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8#include "SkBitmap.h" 9#include "SkGraphics.h" 10#include "SkImageDecoder.h" 11#include "SkImageEncoder.h" 12#include "SkStream.h" 13#include "SkTemplates.h" 14 15static bool decodeFile(SkBitmap* bitmap, const char srcPath[]) { 16 SkFILEStream stream(srcPath); 17 if (!stream.isValid()) { 18 SkDebugf("ERROR: bad filename <%s>\n", srcPath); 19 return false; 20 } 21 22 SkImageDecoder* codec = SkImageDecoder::Factory(&stream); 23 if (NULL == codec) { 24 SkDebugf("ERROR: no codec found for <%s>\n", srcPath); 25 return false; 26 } 27 28 SkAutoTDelete<SkImageDecoder> ad(codec); 29 30 stream.rewind(); 31 if (!codec->decode(&stream, bitmap, SkBitmap::kARGB_8888_Config, 32 SkImageDecoder::kDecodePixels_Mode)) { 33 SkDebugf("ERROR: codec failed for <%s>\n", srcPath); 34 return false; 35 } 36 return true; 37} 38 39/////////////////////////////////////////////////////////////////////////////// 40 41static void show_help() { 42 SkDebugf("usage: skiamge [-o out-dir] inputfiles...\n"); 43} 44 45static void make_outname(SkString* dst, const char outDir[], const char src[]) { 46 dst->set(outDir); 47 const char* start = strrchr(src, '/'); 48 if (start) { 49 start += 1; // skip the actual last '/' 50 } else { 51 start = src; 52 } 53 dst->append(start); 54 dst->append(".png"); 55} 56 57int tool_main(int argc, char** argv); 58int tool_main(int argc, char** argv) { 59 SkAutoGraphics ag; 60 int i, outDirIndex = 0; 61 SkString outDir; 62 63 for (i = 1; i < argc; i++) { 64 if (!strcmp(argv[i], "-help")) { 65 show_help(); 66 return 0; 67 } 68 if (!strcmp(argv[i], "-o")) { 69 if (i == argc-1) { 70 SkDebugf("ERROR: -o needs a following filename\n"); 71 return -1; 72 } 73 outDirIndex = i; 74 outDir.set(argv[i+1]); 75 if (outDir.c_str()[outDir.size() - 1] != '/') { 76 outDir.append("/"); 77 } 78 i += 1; // skip the out dir name 79 } 80 } 81 82 for (i = 1; i < argc; i++) { 83 if (i == outDirIndex) { 84 i += 1; // skip this and the next entry 85 continue; 86 } 87 88 SkBitmap bitmap; 89 if (decodeFile(&bitmap, argv[i])) { 90 if (outDirIndex) { 91 SkString outPath; 92 make_outname(&outPath, outDir.c_str(), argv[i]); 93 SkDebugf(" writing %s\n", outPath.c_str()); 94 SkImageEncoder::EncodeFile(outPath.c_str(), bitmap, 95 SkImageEncoder::kPNG_Type, 100); 96 } else { 97 SkDebugf(" decoded %s [%d %d]\n", argv[i], bitmap.width(), 98 bitmap.height()); 99 } 100 } 101 } 102 103 return 0; 104} 105 106#if !defined SK_BUILD_FOR_IOS 107int main(int argc, char * const argv[]) { 108 return tool_main(argc, (char**) argv); 109} 110#endif 111 112