Last active
August 29, 2015 13:57
-
-
Save saitoha/9856224 to your computer and use it in GitHub Desktop.
kmiya's sixel update between 2014-03-02 and 2014-03-28
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -ur Makefile Makefile | |
--- Makefile 2014-03-28 22:34:32.000000000 +0900 | |
+++ Makefile 2014-03-27 04:19:30.000000000 +0900 | |
@@ -2,6 +2,12 @@ | |
CFLAGS = -O3 -g -I/usr/local/include | |
LFLAGS = -L/usr/local/lib -lgd | |
+# vt240 sixel compatible ? | |
+#CFLAGS+= -DUSE_VT240 | |
+ | |
+# xterm sixel compatible ? | |
+#CFLAGS+= -DUSE_INITPAL | |
+ | |
OBJS = main.o tosixel.o fromsixel.o frompnm.o | |
PROG = sixel | |
diff -ur fromsixel.c fromsixel.c | |
--- fromsixel.c 2014-03-28 22:34:32.000000000 +0900 | |
+++ fromsixel.c 2014-03-27 04:20:53.000000000 +0900 | |
@@ -103,7 +103,7 @@ | |
} | |
return p; | |
} | |
-gdImagePtr gdImageCreateFromSixelPtr(int len, BYTE *p) | |
+gdImagePtr gdImageCreateFromSixelPtr(int len, BYTE *p, int bReSize) | |
{ | |
int n, i, a, b, c; | |
int px, py; | |
@@ -365,5 +365,10 @@ | |
gdImageTrueColorToPalette(im, 0, 256); | |
+ if ( bReSize ) { | |
+ sixel_param = NULL; | |
+ sprintf(gra, "\"%d;%d", ay, ax); | |
+ } | |
+ | |
return im; | |
} | |
diff -ur main.c main.c | |
--- main.c 2014-03-28 22:34:32.000000000 +0900 | |
+++ main.c 2014-03-27 04:19:51.000000000 +0900 | |
@@ -9,7 +9,7 @@ | |
extern void gdImageSixel(gdImagePtr gd, FILE *out, int maxPalet, int optPalet); | |
-extern gdImagePtr gdImageCreateFromSixelPtr(int len, BYTE *p); | |
+extern gdImagePtr gdImageCreateFromSixelPtr(int len, BYTE *p, int bReSize); | |
extern gdImagePtr gdImageCreateFromPnmPtr(int len, BYTE *p); | |
#define FMT_GIF 0 | |
@@ -63,18 +63,22 @@ | |
return (-1); | |
} | |
-static int ConvSixel(char *filename, int maxPalet, int optPalet) | |
+static int ConvSixel(char *filename, int maxPalet, int optPalet, | |
+ int resWidth, int resHeight) | |
{ | |
int n, len, max; | |
FILE *fp = stdin; | |
BYTE *data; | |
gdImagePtr im = NULL; | |
+ gdImagePtr dm = NULL; | |
+ int bReSize; | |
if ( filename != NULL && (fp = fopen(filename, "r")) == NULL ) | |
return (-1); | |
len = 0; | |
max = 64 * 1024; | |
+ bReSize = (resWidth > 0 || resHeight > 0 ? 1 : 0); | |
if ( (data = (BYTE *)malloc(max)) == NULL ) | |
return (-1); | |
@@ -116,7 +120,7 @@ | |
im = gdImageCreateFromTiffPtr(len, data); | |
break; | |
case FMT_SIXEL: | |
- im = gdImageCreateFromSixelPtr(len, data); | |
+ im = gdImageCreateFromSixelPtr(len, data, bReSize); | |
break; | |
case FMT_PNM: | |
im = gdImageCreateFromPnmPtr(len, data); | |
@@ -131,12 +135,28 @@ | |
if ( im == NULL ) | |
return 1; | |
+ if ( bReSize ) { | |
+ if ( resWidth <= 0 ) | |
+ resWidth = resHeight * gdImageSX(im) / gdImageSY(im); | |
+ if ( resHeight <= 0 ) | |
+ resHeight = resWidth * gdImageSY(im) / gdImageSX(im); | |
+ | |
+ if ( (dm = gdImageCreateTrueColor(resWidth, resHeight)) == NULL ) | |
+ return 1; | |
+ | |
+ gdImageCopyResampled(dm, im, 0, 0, 0, 0, | |
+ resWidth, resHeight, gdImageSX(im), gdImageSY(im)); | |
+ gdImageDestroy(im); | |
+ im = dm; | |
+ } | |
+ | |
if ( maxPalet < 2 ) | |
maxPalet = 2; | |
else if ( maxPalet > gdMaxColors ) | |
maxPalet = gdMaxColors; | |
gdImageSixel(im, stdout, maxPalet, optPalet); | |
+ gdImageDestroy(im); | |
return 0; | |
} | |
@@ -147,9 +167,11 @@ | |
int mx = 1; | |
int maxPalet = gdMaxColors; | |
int optPalet = 0; | |
+ int resWidth = (-1); | |
+ int resHeight = (-1); | |
for ( ; ; ) { | |
- while ( (n = getopt(ac, av, "p:c")) != EOF ) { | |
+ while ( (n = getopt(ac, av, "p:cw:h:")) != EOF ) { | |
switch(n) { | |
case 'p': | |
maxPalet = atoi(optarg); | |
@@ -157,8 +179,14 @@ | |
case 'c': | |
optPalet = 1; | |
break; | |
+ case 'w': | |
+ resWidth = atoi(optarg); | |
+ break; | |
+ case 'h': | |
+ resHeight = atoi(optarg); | |
+ break; | |
default: | |
- fprintf(stderr, "Usage: %s [-p MaxPalet] [-c] <file name...>\n", av[0]); | |
+ fprintf(stderr, "Usage: %s [-p MaxPalet] [-c] [-w width] [-h height] <file name...>\n", av[0]); | |
exit(0); | |
} | |
} | |
@@ -168,11 +196,11 @@ | |
} | |
if ( mx <= 1 ) { | |
- ConvSixel(NULL, maxPalet, optPalet); | |
+ ConvSixel(NULL, maxPalet, optPalet, resWidth, resHeight); | |
} else { | |
for ( n = 1 ; n < mx ; n++ ) | |
- ConvSixel(av[n], maxPalet, optPalet); | |
+ ConvSixel(av[n], maxPalet, optPalet, resWidth, resHeight); | |
} | |
return 0; | |
diff -ur tosixel.c tosixel.c | |
--- tosixel.c 2014-03-28 22:34:32.000000000 +0900 | |
+++ tosixel.c 2014-03-28 19:56:13.000000000 +0900 | |
@@ -35,6 +35,8 @@ | |
extern char sixel_palinit[]; | |
extern int sixel_palet[]; | |
+gdImagePtr gdImageTrueColorQuant(gdImagePtr im, int maxPalet); | |
+ | |
static void PutData(int ch) | |
{ | |
fputc(ch, out_fp); | |
@@ -248,6 +250,7 @@ | |
return idx; | |
} | |
+ | |
void gdImageSixel(gdImagePtr im, FILE *out, int maxPalet, int optPalet) | |
{ | |
int x, y, i, n, c; | |
@@ -266,12 +269,18 @@ | |
if ( maxPalet > gdMaxColors || maxPalet <= 0 ) | |
maxPalet = gdMaxColors; | |
+ if ( !gdImageTrueColor(im) && gdImageColorsTotal(im) > maxPalet ) | |
+ gdImagePaletteToTrueColor(im); | |
+ | |
if ( gdImageTrueColor(im) ) { | |
- gdImageTrueColorToPalette(im, 1, maxPalet); | |
- sixel_palfix = 0; | |
+ // poor ... but fast | |
+ //gdImageTrueColorToPaletteSetMethod(im, GD_QUANT_JQUANT, 0); | |
+ // debug version ? | |
+ //gdImageTrueColorToPaletteSetMethod(im, GD_QUANT_NEUQUANT, 9); | |
+ | |
+ // used libimagequant/pngquant2 best !! | |
+ //gdImageTrueColorToPaletteSetMethod(im, GD_QUANT_LIQ, 0); | |
- } else if ( gdImageColorsTotal(im) > maxPalet ) { | |
- gdImagePaletteToTrueColor(im); | |
gdImageTrueColorToPalette(im, 1, maxPalet); | |
sixel_palfix = 0; | |
} | |
@@ -379,6 +388,31 @@ | |
PutData('\n'); | |
+#ifdef USE_INITPAL | |
+ | |
+ for ( n = 0 ; n < maxPalet ; n++ ) | |
+ list[conv_palet[n]] = n; | |
+ | |
+ for ( n = i = 0 ; n < maxPalet ; n++ ) { | |
+ if ( init_palet[n] != 0 || list[n] == back ) | |
+ continue; | |
+ | |
+ PutFmt("#%d;2;%d;%d;%d", n, | |
+ PALVAL(gdImageRed (im, list[n]), 100, gdRedMax ), | |
+ PALVAL(gdImageGreen(im, list[n]), 100, gdGreenMax), | |
+ PALVAL(gdImageBlue (im, list[n]), 100, gdBlueMax )); | |
+ init_palet[n] = 1; | |
+ | |
+ if ( ++i > 4 ) { | |
+ PutData('\n'); | |
+ i = 0; | |
+ } | |
+ } | |
+ | |
+ if ( i > 0 ) | |
+ PutData('\n'); | |
+#endif | |
+ | |
for ( y = i = 0 ; y < height ; y++ ) { | |
for ( x = 0 ; x < width ; x++ ) { | |
pix = gdImagePalettePixel(im, x, y); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment