diff --git a/include/ptouch.h b/include/ptouch.h index e687293..75b17e1 100644 --- a/include/ptouch.h +++ b/include/ptouch.h @@ -27,6 +27,8 @@ struct _pt_tape_info { #define FLAG_NONE 0 #define FLAG_UNSUP_RASTER 1 +#define FLAG_FORCE_TIFF 2 + struct _pt_dev_info { int vid; /* USB vendor ID */ int pid; /* USB product ID */ diff --git a/src/libptouch.c b/src/libptouch.c index df88e92..83c7a23 100644 --- a/src/libptouch.c +++ b/src/libptouch.c @@ -32,19 +32,21 @@ #define _(s) gettext(s) -struct _pt_tape_info tape_info[6]= { - {6, 32}, /* 6mm tape is 32px wide? works for me ;-) */ - {9, 52}, /* 9mm tape is 52px wide? works for me ;-) */ - {12,76}, /* and 76px work for me on a 12mm tape - maybe its only 64px */ - {18,120}, - {24,128}, - {0,0} /* terminating entry */ +/* Print area width in 180 DPI pixels */ +struct _pt_tape_info tape_info[]= { + { 6, 32}, /* 6 mm tape */ + { 9, 53}, /* 9 mm tape */ + {12, 75}, /* 12 mm tape */ + {18, 117}, /* 18 mm tape */ + {24, 128}, /* 24 mm tape */ + {36, 192}, /* 36 mm tape */ + { 0, 0} /* terminating entry */ }; struct _pt_dev_info ptdevs[] = { - {0x04f9, 0x202d, "PT-2430PC", 128, FLAG_NONE}, /* 180dpi, maximum 128px */ - {0x04f9, 0x2007, "PT-2420PC", 128, FLAG_NONE}, /* maximum tape width 24mm, unknown how much pixels, untested so far */ - {0x04f9, 0x202c, "PT-1230PC", 76, FLAG_NONE}, /* 180dpi, supports tapes up to 12mm - I don't know how much pixels it can print! */ + {0x04f9, 0x202d, "PT-2430PC", 128, FLAG_NONE}, /* 180dpi, maximum 128px */ + {0x04f9, 0x2007, "PT-2420PC", 128, FLAG_FORCE_TIFF}, /* 180dpi, 128px, maximum tape width 24mm, must send TIFF compressed pixel data */ + {0x04f9, 0x202c, "PT-1230PC", 76, FLAG_NONE}, /* 180dpi, supports tapes up to 12mm - I don't know how much pixels it can print! */ {0x04f9, 0x2061, "PT-P700", 120, FLAG_UNSUP_RASTER}, /* DOES NOT WORK */ {0x04f9, 0x2073, "PT-D450VP", 120, FLAG_UNSUP_RASTER}, /* DOES NOT WORK */ /* Notes about the PT-D450VP: Tape detecting works, but printing does @@ -151,7 +153,7 @@ int ptouch_init(ptouch_dev ptdev) int ptouch_rasterstart(ptouch_dev ptdev) { - char cmd[]="\x1b\x69\x52\x01"; /* 1B 69 52 01 = RASTER DATA */ + char cmd[] = "\x1b\x69\x52\x01"; /* 1B 69 52 01 = Select graphics transfer mode = Raster */ return ptouch_send(ptdev, (uint8_t *)cmd, strlen(cmd)); } @@ -284,21 +286,31 @@ int ptouch_getstatus(ptouch_dev ptdev) int ptouch_getmaxwidth(ptouch_dev ptdev) { - /* TODO: should also check what the device supports. but I assume, - you can't use a large tape in a printe that doesn't support it anyways */ return ptdev->tape_width_px; } int ptouch_sendraster(ptouch_dev ptdev, uint8_t *data, int len) { - uint8_t buf[32]; + uint8_t buf[70]; + int rc; + + if (len > ptdev->devinfo->max_px / 8) { + return -1; + } - if (len > 16) { /* PT-2430PC can not print more than 128 px */ - return -1; /* as we support more devices, we need to check */ - } /* how much pixels each device support */ buf[0]=0x47; - buf[1]=len; - buf[2]=0; - memcpy(buf+3, data, len); - return ptouch_send(ptdev, buf, len+3); + if (ptdev->devinfo->flags & FLAG_FORCE_TIFF) { + /* Fake compression by encoding a single uncompressed run */ + buf[1] = len + 1; + buf[2] = 0; + buf[3] = len - 1; + memcpy(buf + 4, data, len); + rc = ptouch_send(ptdev, buf, len + 4); + } else { + buf[1] = len; + buf[2] = 0; + memcpy(buf + 3, data, len); + rc = ptouch_send(ptdev, buf, len + 3); + } + return rc; } diff --git a/src/ptouch-print.c b/src/ptouch-print.c index e99e6ae..86b4462 100644 --- a/src/ptouch-print.c +++ b/src/ptouch-print.c @@ -319,7 +319,7 @@ int parse_args(int argc, char **argv) int main(int argc, char *argv[]) { - int i, lines, tape_width; + int i, lines = 0, tape_width; char *line[MAX_LINES]; gdImage *im=NULL; ptouch_dev ptdev=NULL; @@ -369,10 +369,6 @@ int main(int argc, char *argv[]) exit(0); } else if (strcmp(&argv[i][1], "-image") == 0) { im=image_load(argv[++i]); - if (im != NULL) { - print_img(ptdev, im); - gdImageDestroy(im); - } } else if (strcmp(&argv[i][1], "-text") == 0) { for (lines=0; (lines < MAX_LINES) && (i < argc); lines++) { if ((i+1 >= argc) || (argv[i+1][0] == '-')) { @@ -381,26 +377,30 @@ int main(int argc, char *argv[]) i++; line[lines]=argv[i]; } - if ((im=render_text(font_file, line, lines, tape_width)) == NULL) { - printf(_("could not render text\n")); - return 1; - } - if (save_png != NULL) { - write_png(im, save_png); - } else { - print_img(ptdev, im); - } - gdImageDestroy(im); } else if (strcmp(&argv[i][1], "-cutmark") == 0) { ptouch_cutmark(ptdev); } else { usage(argv[0]); } } - if (ptouch_eject(ptdev) != 0) { - printf(_("ptouch_eject() failed\n")); - return -1; + + if (lines) { + if ((im=render_text(font_file, line, lines, tape_width)) == NULL) { + printf(_("could not render text\n")); + return 1; + } } + + if (save_png) { + write_png(im, save_png); + } else { + print_img(ptdev, im); + if (ptouch_eject(ptdev) != 0) { + printf(_("ptouch_eject() failed\n")); + return -1; + } + } + gdImageDestroy(im); ptouch_close(ptdev); libusb_exit(NULL); return 0;