summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSolomon Peachy <pizza@shaftnet.org>2018-04-18 20:52:32 -0400
committerSolomon Peachy <pizza@shaftnet.org>2018-04-18 21:12:27 -0400
commitbce5aaed4568de99b62a19de3b88c88c2d2159e7 (patch)
treef80581962565431ea305179bdae331683e5c70b0
parent46f3c1c6577b8f5a97eea336d35c77acc6b9170f (diff)
downloadselphy_print-bce5aaed4568de99b62a19de3b88c88c2d2159e7.tar.gz
selphy_print-bce5aaed4568de99b62a19de3b88c88c2d2159e7.tar.bz2
selphy_print-bce5aaed4568de99b62a19de3b88c88c2d2159e7.zip
mitsu98xx: Use the gamma tables out of the $OtherOS driver.
A lot of additional work is needed still, including Gutenprint.
-rw-r--r--backend_mitsu9550.c141
-rw-r--r--icm/Mitsubishi/Mitsu_CP-9810/CP981FHG.ICCbin0 -> 1601088 bytes
-rw-r--r--icm/Mitsubishi/Mitsu_CP-9810/CP981SHG.iccbin0 -> 1601088 bytes
-rw-r--r--icm/Mitsubishi/Mitsu_CP-9810/CP981SST.iccbin0 -> 1601088 bytes
-rw-r--r--lib70x/Makefile1
-rw-r--r--lib70x/data/M98TABLE.datbin0 -> 42204 bytes
6 files changed, 139 insertions, 3 deletions
diff --git a/backend_mitsu9550.c b/backend_mitsu9550.c
index 1b779d5..d7197a4 100644
--- a/backend_mitsu9550.c
+++ b/backend_mitsu9550.c
@@ -64,7 +64,10 @@
#endif
#define MITSU_M98xx_LAMINATE_FILE CORRTABLE_PATH "M98MATTE.raw"
+#define MITSU_M98xx_DATATABLE_FILE CORRTABLE_PATH "M98TABLE.dat"
+
#define LAMINATE_STRIDE 1868
+#define DATATABLE_SIZE 42204
/* Spool file structures */
@@ -81,7 +84,7 @@ struct mitsu9550_hdr1 {
/* Print parameters2 */
struct mitsu9550_hdr2 {
uint8_t cmd[4]; /* 1b 57 21 2e */
- uint8_t unk[24]; /* 00 80 00 22 08 03 00 [...] */
+ uint8_t unk[24]; /* 00 80 00 22 08 03 [...] */
uint16_t copies; /* BE, 1-680 */
uint8_t null[2];
uint8_t cut; /* 00 == normal, 83 == 2x6*2 */
@@ -113,6 +116,21 @@ struct mitsu9550_plane {
uint16_t rows; /* BE */
} __attribute__((packed));
+/* CP98xx Tabular Data */
+struct mitsu98xx_data {
+ uint16_t GNMby[256];
+ uint16_t GNMgm[256];
+ uint16_t GNMrc[256];
+ uint8_t WMAM[12532]; /* Unknown for now */
+} __attribute__((packed));
+
+struct mitsu98xx_tables {
+ struct mitsu98xx_data superfine;
+ struct mitsu98xx_data fine_std;
+ struct mitsu98xx_data fine_hg;
+} __attribute__((packed));
+
+/* Command header */
struct mitsu9550_cmd {
uint8_t cmd[4];
} __attribute__((packed));
@@ -124,6 +142,7 @@ struct mitsu9550_ctx {
uint8_t endp_down;
int type;
int is_s;
+ int is_98xx;
uint8_t *databuf;
uint32_t datalen;
@@ -145,6 +164,9 @@ struct mitsu9550_ctx {
int hdr3_present;
struct mitsu9550_hdr4 hdr4;
int hdr4_present;
+
+ /* CP98xx stuff */
+ struct mitsu98xx_tables *m98xxdata;
};
/* Printer data structures */
@@ -249,6 +271,14 @@ struct mitsu9550_status2 {
} \
} while (0);
+static void mitsu98xx_dogamma(uint8_t *src, uint16_t *dest,
+ uint16_t *table, uint32_t len)
+{
+ while(len--) {
+ *dest++ = table[*src++];
+ }
+}
+
static void *mitsu9550_init(void)
{
struct mitsu9550_ctx *ctx = malloc(sizeof(struct mitsu9550_ctx));
@@ -284,10 +314,14 @@ static void mitsu9550_attach(void *vctx, struct libusb_device_handle *dev,
ctx->type == P_MITSU_9800S)
ctx->is_s = 1;
+ if (ctx->type == P_MITSU_9800 ||
+ ctx->type == P_MITSU_9800S ||
+ ctx->type == P_MITSU_9810)
+ ctx->is_98xx = 1;
+
ctx->last_donor = ctx->last_remain = 65535;
}
-
static void mitsu9550_teardown(void *vctx) {
struct mitsu9550_ctx *ctx = vctx;
@@ -296,6 +330,8 @@ static void mitsu9550_teardown(void *vctx) {
if (ctx->databuf)
free(ctx->databuf);
+ if (ctx->m98xxdata)
+ free(ctx->m98xxdata);
free(ctx);
}
@@ -304,6 +340,7 @@ static int mitsu9550_read_parse(void *vctx, int data_fd) {
uint8_t buf[sizeof(struct mitsu9550_hdr1)];
int remain, i;
uint32_t planelen = 0;
+ int is_raw = 1;
if (!ctx)
return CUPS_BACKEND_FAILED;
@@ -341,6 +378,8 @@ top:
/* We're in the data portion now */
if (buf[3] == 0x10)
planelen *= 2;
+ else if (ctx->is_98xx)
+ is_raw = 0;
goto hdr_done;
} else {
@@ -404,6 +443,31 @@ hdr_done:
ctx->hdr4_present = 0;
}
+ /* Read in CP98xx data tables if necessary */
+ if (ctx->is_98xx && !is_raw && !ctx->m98xxdata) {
+ int fd;
+
+ DEBUG("Reading in 98xx data from disk\n");
+ fd = open(MITSU_M98xx_DATATABLE_FILE, O_RDONLY);
+ if (fd < 0) {
+ ERROR("Unable to open 98xx data table file '%s'\n", MITSU_M98xx_DATATABLE_FILE);
+ return CUPS_BACKEND_FAILED;
+ }
+ ctx->m98xxdata = malloc(DATATABLE_SIZE);
+ if (!ctx->m98xxdata) {
+ ERROR("Memory allocation Failure!\n");
+ return CUPS_BACKEND_RETRY_CURRENT;
+ }
+ remain = DATATABLE_SIZE;
+ while (remain) {
+ i = read(fd, ((uint8_t*)&ctx->m98xxdata) + (DATATABLE_SIZE - remain), remain);
+ if (i < 0)
+ return CUPS_BACKEND_CANCEL;
+ remain -= i;
+ }
+ close(fd);
+ }
+
/* Allocate buffer for the payload */
ctx->datalen = 0;
ctx->databuf = malloc(remain);
@@ -495,6 +559,77 @@ hdr_done:
ctx->hdr1.matte = 0;
}
+ /* Do the 98xx processing here */
+ if (ctx->is_98xx && !is_raw) {
+ uint8_t *newbuf;
+ uint32_t newlen = 0;
+ struct mitsu98xx_data *table;
+
+ planelen *= 2;
+ remain = 4 * (planelen + sizeof(struct mitsu9550_plane)) + sizeof(struct mitsu9550_cmd);
+ newbuf = malloc(remain);
+ if (!newbuf) {
+ ERROR("Memory allocation Failure!\n");
+ return CUPS_BACKEND_RETRY_CURRENT;
+ }
+ switch (ctx->hdr2.mode) {
+ case 0x80:
+ table = &ctx->m98xxdata->superfine;
+ break;
+ case 0x11:
+ table = &ctx->m98xxdata->fine_hg;
+ ctx->hdr2.mode = 0x10;
+ break;
+ case 0x10:
+ default:
+ table = &ctx->m98xxdata->fine_std;
+ break;
+ }
+
+ ctx->datalen = 0;
+
+ /* For B/Y plane */
+ memcpy(newbuf + newlen, ctx->databuf + ctx->datalen, sizeof(struct mitsu9550_plane));
+ ctx->databuf[ctx->datalen + 3] = 0x10; /* ie 16bpp data */
+ ctx->datalen += sizeof(struct mitsu9550_plane);
+ newlen += sizeof(struct mitsu9550_plane);
+ mitsu98xx_dogamma(ctx->databuf + ctx->datalen,
+ (uint16_t*) (newbuf + newlen),
+ table->GNMby,
+ planelen / 2);
+ ctx->datalen += planelen / 2;
+ newlen += planelen;
+
+ /* For G/M plane */
+ memcpy(newbuf + newlen, ctx->databuf + ctx->datalen, sizeof(struct mitsu9550_plane));
+ ctx->databuf[ctx->datalen + 3] = 0x10; /* ie 16bpp data */
+ ctx->datalen += sizeof(struct mitsu9550_plane);
+ newlen += sizeof(struct mitsu9550_plane);
+ mitsu98xx_dogamma(ctx->databuf + ctx->datalen,
+ (uint16_t*) (newbuf + newlen),
+ table->GNMgm,
+ planelen / 2);
+ ctx->datalen += planelen / 2;
+ newlen += planelen;
+
+ /* For R/C plane */
+ memcpy(newbuf + newlen, ctx->databuf + ctx->datalen, sizeof(struct mitsu9550_plane));
+ ctx->databuf[ctx->datalen + 3] = 0x10; /* ie 16bpp data */
+ ctx->datalen += sizeof(struct mitsu9550_plane);
+ newlen += sizeof(struct mitsu9550_plane);
+ mitsu98xx_dogamma(ctx->databuf + ctx->datalen,
+ (uint16_t*) (newbuf + newlen),
+ table->GNMrc,
+ planelen / 2);
+ ctx->datalen += planelen / 2;
+ newlen += planelen;
+
+ /* Clean up */
+ free(ctx->databuf);
+ ctx->databuf = newbuf;
+ ctx->datalen = newlen;
+ }
+
/* If the backend has to generate the matte data... */
if (ctx->hdr1.matte == 0x80) {
int fd;
@@ -1277,7 +1412,7 @@ static const char *mitsu9550_prefixes[] = {
/* Exported */
struct dyesub_backend mitsu9550_backend = {
.name = "Mitsubishi CP9xxx family",
- .version = "0.31",
+ .version = "0.32",
.uri_prefixes = mitsu9550_prefixes,
.cmdline_usage = mitsu9550_cmdline,
.cmdline_arg = mitsu9550_cmdline_arg,
diff --git a/icm/Mitsubishi/Mitsu_CP-9810/CP981FHG.ICC b/icm/Mitsubishi/Mitsu_CP-9810/CP981FHG.ICC
new file mode 100644
index 0000000..d781bbf
--- /dev/null
+++ b/icm/Mitsubishi/Mitsu_CP-9810/CP981FHG.ICC
Binary files differ
diff --git a/icm/Mitsubishi/Mitsu_CP-9810/CP981SHG.icc b/icm/Mitsubishi/Mitsu_CP-9810/CP981SHG.icc
new file mode 100644
index 0000000..870cab5
--- /dev/null
+++ b/icm/Mitsubishi/Mitsu_CP-9810/CP981SHG.icc
Binary files differ
diff --git a/icm/Mitsubishi/Mitsu_CP-9810/CP981SST.icc b/icm/Mitsubishi/Mitsu_CP-9810/CP981SST.icc
new file mode 100644
index 0000000..55918b6
--- /dev/null
+++ b/icm/Mitsubishi/Mitsu_CP-9810/CP981SST.icc
Binary files differ
diff --git a/lib70x/Makefile b/lib70x/Makefile
index 3ad4b62..0f959ef 100644
--- a/lib70x/Makefile
+++ b/lib70x/Makefile
@@ -37,6 +37,7 @@ install:
$(INSTALL) -o root -m 644 data/*raw $(BACKEND_DATA_DIR)
$(INSTALL) -o root -m 644 data/*lut $(BACKEND_DATA_DIR)
$(INSTALL) -o root -m 644 data/*cpc $(BACKEND_DATA_DIR)
+ $(INSTALL) -o root -m 644 data/*dat $(BACKEND_DATA_DIR)
clean:
$(RM) -f lib$(LIBMITSUD70_NAME).so *.o
diff --git a/lib70x/data/M98TABLE.dat b/lib70x/data/M98TABLE.dat
new file mode 100644
index 0000000..c55abb3
--- /dev/null
+++ b/lib70x/data/M98TABLE.dat
Binary files differ