id:eel3:20120615:1339768796 ã§zlibããã«ãããid:eel3:20120616:1339815893 ã§ã¯libpngããã«ããããå
¨ã¦ã¯Windowsã§sngã使ãçºã«â¦â¦ã½âã¢ã³ãï¼ãç§ã¯å¸°ã£ã¦æ¥ãï¼
SNGï¼Scriptable Network Graphicsï¼ã¨ãããã¼ã¯ã¢ããè¨èªã¨ãããããè¨èªããããPNGï¼Portable Network Graphicsï¼ãã¡ã¤ã«ã®å é¨æ§é ãããã¹ãã§è¡¨ç¾ããçºã®è¨èªã§ãæ¦ãPNGã®ãã£ã³ã¯æ§é ãCSSã«ä¼¼ãã¹ã¿ã¤ã«ã§è¨è¿°ããæãã«ãªãã
ãã®SNGãåãæ±ãããã®å¦çç³»ãsngã§ãSNGããPNGã«ã¨ã³ã³ã¼ããããããã®éã«PNGããã³ã¼ããã¦SNGãåãåºããããããã¨ãã§ãããä½è ã¯ç¥ã人ãç¥ãESRã ã£ããããã
ä»äºã§PNGã®ç»åãã¡ã¤ã«ãå å·¥ãããã¨ã«ãªããæ¥é½ã¤ã³ã¹ãã¼ã«ããããªã¼ã®ãã¤ã³ããã¼ã«ã§å ã®ãã¡ã¤ã«ã大ããããæ°ãããã¡ã¤ã«ãä½æãããä½æ ããã¡ã¤ã«ãµã¤ãºã9åã®1è¿ãå°ãããªã£ããåå ã調æ»ããããã«PNGãã¡ã¤ã«ã®ä¸èº«ãæ¯è¼ããããªã£ããããã§æãã¤ããã®ããPNGãSNGã«å¤æãã¦æ¯è¼ãããã¨ããæ¹æ³ã ã£ã*1ã
ãããsngã¯ãã¤ãã¼ãªçºãæ¢ãæ¹ãæªãã£ããããWindowsç¨ã®ãã¤ããªã¯è¦ã¤ããããMinGWçã§ãã«ãããäºã ã®æ å ±ãå¼ã£ããããªãã£ããDebianãUbuntuã®ãªãã¸ããªã«ã¯å ¥ã£ã¦ããããã ã
ããããã¦Unixã®ã·ã¹ãã ã³ã¼ã«ã§ã使ã£ã¦ããã®ã ãããã¨çãã¤ã¤ããããESRã®ãã¨ã ããCè¨èªã§æ¸ããªãæ¦ãANSI Cã®ç¯å²ã§å®è£ ãã¦ããã ãã*2ã¨ããç´æããã£ããPNGã®æ§é ãSNGã®ãã©ã¼ããããè¦ãåã«ã¯ãä»®ã«èªåãå®è£ ããå ´åãANSI Cã®ç¯çã§ä½ã¨ããªããããªæ°ãããããªã®ã§éããããã°MinGWã§ãã®ã¾ã¾ãã«ãã§ãã¦ããããããªãã£ãã¨ãã¦ããã¾ãè¦å´ããã«ç§»æ¤ã§ããã®ã§ã¯ãªããã¨èãã¦ãWindowsç¨å®è¡ãã¡ã¤ã«ã®çæã«ææ¦ãã¦ã¿ãã
使ç¨ããå¦çç³»ã¯ç´åã«æ¸ããããã«MinGWï¼æ£ç¢ºã«ã¯TDM-GCC 4.5.1ï¼ãzlibãlibpngããã«ãããã®ã¨åãã³ã³ãã¤ã©ã ãMinGWã¯Unixç°å¢åºæã®ã©ã¤ãã©ãªé¢æ°ã®ä¸é¨ããµãã¼ããã¦ãã¦ããããã®é¢æ°ã®ä»£æ¿æ¡ãèããå¿ è¦ããªããªãã®ã§å°ãã ãä½æ¥ã楽ã«ãªãã
å ¥æãããã®
ã½ã¼ã¹ãã¡ã¤ã«ã¯http://sourceforge.net/projects/sng/ããå ¥æãããç¾æç¹ã®ææ°çã¯sng-1.0.5.tar.gzã ã
ä¾åé¢ä¿ã®é½åã§libpngã¨zlibãsngã¯libpngã使ç¨ãã¦ãã¦ãlibpngã¯zlibã使ç¨ãã¦ãããå ¥æã¨ãã«ãã«ã¤ãã¦ã¯åã®ã¨ã³ããªã§æ¸ãã¦ããã®ã§å²æããã
ãã1ã¤ãsngã¯X11ã®å®è£ ã«å«ã¾ãã¦ããrgb.txtã使ãããã®ãã¡ã¤ã«ã¯Windowsã«ã¯åå¨ããªãã®ã§é©å½ãªUnixãã·ã³ããæã£ã¦ãããç§ã¯Ubuntu 10.04ã®/etc/X11/rgb.txtãã³ãã¼ããããrgb.txtãã§ã°ã°ãã°これã¿ããã«ãããä¸ã§ãè¦ã¤ããããã ã
ãã«ãæ¹æ³
sngã®æ¬æ¥ã®ãã«ãæ¹æ³ã§ã¯configureã使ãã®ã ãã©ãæå ã§ã¯ãã¾ãåä½ããªããããã§GCCãç´å©ãããã
ããã«ããåé¡ç¹ã¨ãã¦ãã½ã¼ã¹ãã¡ã¤ã«ã«ã¦ã¤ã³ã¯ã«ã¼ããã¦ããconfig.hãè¦ã¤ãããªãããã®ãã¡ã¤ã«ã¯configureã®å·¥ç¨ã§çæããããã¡ã¤ã«ã®ããã ãä»åã¯ä»¥ä¸ã®å 容ã®ãã¡ã¤ã«ã§ä»£ç¨ããã
/* config.h */ #define VERSION "1.0.5" #define RGBTXT "D:\\usr\\share\\sng\\rgb.txt"
VERSIONã¯sngã®ãã¼ã¸ã§ã³çªå·ã§ãRGBTXTã¯rgb.txtãé ç½®ããå ´æã«ãªããRGBTXTã¯åç°å¢ãã¨ã«é½åã®ããå¤ã«ãããã¨ã
sngã¯éå§æã«rgb.txtãèªã¿è¾¼ããRGBTXTã§æå®ããå ´æã«ãã¡ã¤ã«ãç¡ãã¨åæåã«å¤±æãã¦å¦çãä¸æãã¦ãã¾ããæ¬å½ã¯åçã«rgb.txtã®å ´æãæå®ã§ãããå¬ããã®ã ãã©ãé¢åãªã®ã§ããã§ã¯æ¾ç½®ãã¦ããã
ã½ã¼ã¹ãã¡ã¤ã«ã®ãã¡main.cã¯è¥å¹²ä¿®æ£ããå¿ è¦ããããã¨ããã®ãWindowsã®æ¨æºå ¥åºåã¯ããã©ã«ãã§ã¯ãã¤ããªãã¡ã¤ã«ããã¾ãæ±ããªãã®ã§ãCRTã®_setmodeã使ãå¿ è¦ãããããã ãã¾ããã¡ã¤ã«ãéãæãæ示çã«ãã¤ããªã¢ã¼ããæå®ããå¿ è¦ãããã
ãªãªã¸ãã«ã®ã½ã¼ã¹ã¨ã®å·®åã¯ä»¥ä¸ã®éãã
*** main.c 2010-11-06 02:29:14.000000000 +0900 --- main.c.mingw 2012-06-16 22:29:46.609375000 +0900 *************** *** 4,9 **** --- 4,21 ---- #include <stdlib.h> #include <ctype.h> #include <unistd.h> + + #ifdef __MINGW32__ + #include <fcntl.h> + #include <io.h> + #ifndef STDIN_FILENO + #define STDIN_FILENO 0 + #endif + #ifndef STDOUT_FILENO + #define STDOUT_FILENO 1 + #endif + #endif /* __MINGW32__ */ + #include "png.h" #include "sng.h" #include "config.h" *************** *** 160,165 **** --- 172,194 ---- _wildcard(&argc, &argv); /* Unix-like globbing for OS/2 and DOS */ #endif + #ifdef __MINGW32__ + { + static const int fd[] = { STDIN_FILENO, STDOUT_FILENO, }; + size_t nfd; + + for (nfd = 0; nfd < (sizeof(fd) / sizeof(fd[0])); nfd++) + { + errno = 0; + if (_setmode(fd[nfd], O_BINARY) == -1) + { + perror("_setmode"); + exit(1); + } + } + } + #endif /* __MINGW32__ */ + while(argc > 1 && argv[1][0] == '-') { switch(argv[1][i]) { *************** *** 238,251 **** if (verbose) printf("sng: converting %s to %s\n", argv[i], outfile); ! if ((fpin = fopen(argv[i], "r")) == NULL) { fprintf(stderr, "sng: couldn't open %s for input (%d)\n", argv[i], errno); continue; } ! if ((fpout = fopen(outfile, "w")) == NULL) { fprintf(stderr, "sng: couldn't open %s for output (%d)\n", --- 267,280 ---- if (verbose) printf("sng: converting %s to %s\n", argv[i], outfile); ! if ((fpin = fopen(argv[i], "rb")) == NULL) { fprintf(stderr, "sng: couldn't open %s for input (%d)\n", argv[i], errno); continue; } ! if ((fpout = fopen(outfile, "wb")) == NULL) { fprintf(stderr, "sng: couldn't open %s for output (%d)\n",
__MINGW32__ã§#ifdefãã¦ããé¨åã_WIN32ã_WIN64ã«ããã°Visual C++ã§ããã«ãã§ãããããããªãâ¦â¦ã¨æã£ããã©unistd.hãã¤ã³ã¯ã«ã¼ããã¦ããã®ã§ãã¡ããã
ãã£ã¬ã¯ããªsng-1.0.5ç´ä¸ã«config.hãã³ãã¼ããmain.cã«ä¸è¨ã®ããããé©ç¨ãããã次ã®ãããªã³ãã³ãã§ãã«ãããã
gcc -Wall -ansi -O2 -o sng main.c sngc.c sngd.c -I..\..\libpng\inc -L..\..\libpng\lib -L..\..\zlib\lib -lpng -lz
libpng-1.2.49ã®ãããã¨ã©ã¤ãã©ãª*3ãzlibã®ã©ã¤ãã©ãªãç½®ãã¦ãããã£ã¬ã¯ããªãæå®ããä¸ã§ããªãã·ã§ã³ -l ã§libpngã¨zlibããªã³ã¯ããããã«æ示ãããã¨ã
ããã§sng.exeã®ã¿ããã«ãããããconfig.hã®RGBTXTã§æå®ããä½ç½®ã«rgb.txtãç½®ããä¸ã§sngãå¼ã³åºãã¦ã¿ã*4ãå梱ã®test.sngããPNGãçæãã¦ããããé©å½ãªPNGãã¡ã¤ã«ãSNGåãã¦ãããã
å ¥åºåããã¤ããªã¢ã¼ãã«ãã代åã¨ãã¦ãåºåããSNGãã¡ã¤ã«ã¯æ¹è¡ãLFã¨ãªããå ¥åããSNGãã¡ã¤ã«ãæ¹è¡ãLFã«ãã¦ãããæ¹ãç¡é£ã ãããç§èªèº«ãCRLFã®ãã¡ã¤ã«ã§ã¯è©¦ãã¦ããªãã
ãªãããã®æ¹æ³ã§ãã«ãããsngãæ¬å½ã«æ£ããåãã¦ããã¦ãããå¦ãã¯ä¸æã ã
*1:æåã¯PNGã®ãã£ã³ã¯ãèªåã§è§£æãã¦ããã¹ãåºåãããã¨èããã次ã«libpngã§è§£æããæ¹ã楽ãã¨æãç´ãããããã¦æå¾ã«sngã®ãã¨ãæãåºããã
*2:ãThe Art of UNIX Programmingãã«åºã¥ããç§ã®åæãªå°è±¡ãå½ç¶ãªããESRæ¬äººã¨ã®é¢èã¯å ¨ãç¡ãã
*3:libpng-1.5.10ã§ã¯ãã«ãã§ããªãã£ãã1.5ç³»ã§ã¯æ§é ä½ã®ä¸èº«ãé ãã¦ã¢ã¯ã»ãµé¢æ°ã使ç¨ããããã«å¤æ´ããã¦ãã¦ãå ¬éãããããã¯æ§é ä½ã®ä¸èº«ãè¦ããªããsngã®ã½ã¼ã¹ã§ã¯æ§é ä½ã®ä¸èº«ã«ç´æ¥ã¢ã¯ã»ã¹ãã¦ããçºãä¸èº«ãé ããã¦ãã1.5ç³»ã®ãããã§ã¯ã³ã³ãã¤ã«ã§ããªãã
*4:DLLã使ãå ´åã¯libpng12.dllã¨zlib1.dllãå¿ è¦ãªã®ã§æ³¨æã