Skip to content

Instantly share code, notes, and snippets.

@saitoha
Last active August 29, 2015 13:57
Show Gist options
  • Save saitoha/9856224 to your computer and use it in GitHub Desktop.
Save saitoha/9856224 to your computer and use it in GitHub Desktop.
kmiya's sixel update between 2014-03-02 and 2014-03-28
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