From 51168d3b9843875cafc8a4c274f8c4756052c735 Mon Sep 17 00:00:00 2001
From: Christer Palm <palm@adbteknik.se>
Date: Sun, 24 Sep 2017 01:25:49 +0200
Subject: [PATCH] Fix PT-2024PC support and some minor cleanup

---
 include/ptouch.h |  2 ++
 src/libptouch.c  | 54 +++++++++++++++++++++++++++++-------------------
 2 files changed, 35 insertions(+), 21 deletions(-)

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;
 }