summaryrefslogtreecommitdiffstats
path: root/backend_mitsu9550.c
diff options
context:
space:
mode:
authorSolomon Peachy <pizza@shaftnet.org>2018-06-17 22:24:15 -0400
committerSolomon Peachy <pizza@shaftnet.org>2018-06-17 22:24:15 -0400
commitc542a37d180057b6706e7e11fbd47f6d09cb1dac (patch)
treef8afd1cb8a9b24322b469d2a645342e28b45d49b /backend_mitsu9550.c
parenta21e5607cf318bb94af5301eb090f6fcfc2ca0dc (diff)
downloadselphy_print-c542a37d180057b6706e7e11fbd47f6d09cb1dac.tar.gz
selphy_print-c542a37d180057b6706e7e11fbd47f6d09cb1dac.tar.bz2
selphy_print-c542a37d180057b6706e7e11fbd47f6d09cb1dac.zip
mitsu98xx: Move bulk of image processing out of read_parse.
Paves way for the combining of jobs.
Diffstat (limited to 'backend_mitsu9550.c')
-rw-r--r--backend_mitsu9550.c201
1 files changed, 100 insertions, 101 deletions
diff --git a/backend_mitsu9550.c b/backend_mitsu9550.c
index 7fee1ee..6f29df2 100644
--- a/backend_mitsu9550.c
+++ b/backend_mitsu9550.c
@@ -165,6 +165,7 @@ struct mitsu9550_printjob {
uint16_t rows;
uint16_t cols;
uint32_t plane_len;
+ int is_raw;
int copies;
@@ -191,6 +192,7 @@ struct mitsu9550_ctx {
/* CP98xx stuff */
struct mitsu98xx_tables *m98xxdata;
+ struct CColorConv3D *lut;
};
/* Printer data structures */
@@ -585,6 +587,8 @@ static void mitsu9550_teardown(void *vctx) {
if (!ctx)
return;
+ if (ctx->lut)
+ CColorConv3D_Destroy3DColorTable(ctx->lut);
if (ctx->m98xxdata)
free(ctx->m98xxdata);
free(ctx);
@@ -595,7 +599,6 @@ static int mitsu9550_read_parse(void *vctx, const void **vjob, int data_fd, int
uint8_t buf[sizeof(struct mitsu9550_hdr1)];
int remain, i;
uint32_t planelen = 0;
- int is_raw = 1;
struct mitsu9550_printjob *job = NULL;
@@ -608,11 +611,7 @@ static int mitsu9550_read_parse(void *vctx, const void **vjob, int data_fd, int
return CUPS_BACKEND_RETRY_CURRENT;
}
memset(job, 0, sizeof(*job));
-
- job->hdr1_present = 0;
- job->hdr2_present = 0;
- job->hdr3_present = 0;
- job->hdr4_present = 0;
+ job->is_raw = 1;
top:
/* Read in initial header */
@@ -645,7 +644,7 @@ top:
if (buf[3] == 0x10)
planelen *= 2;
else if (ctx->is_98xx && buf[3] == 0x80)
- is_raw = 0;
+ job->is_raw = 0;
goto hdr_done;
} else {
@@ -691,7 +690,7 @@ top:
hdr_done:
/* Read in CP98xx data tables if necessary */
- if (ctx->is_98xx && !is_raw && !ctx->m98xxdata) {
+ if (ctx->is_98xx && !job->is_raw && !ctx->m98xxdata) {
int fd;
DEBUG("Reading in 98xx data from disk\n");
@@ -719,7 +718,7 @@ hdr_done:
close(fd);
}
- if (is_raw) {
+ if (job->is_raw) {
/* We have three planes + headers and the final terminator to read */
remain = 3 * (planelen + sizeof(struct mitsu9550_plane)) + sizeof(struct mitsu9550_cmd);
} else {
@@ -746,7 +745,7 @@ hdr_done:
if (ctx->type != P_MITSU_9810) {
WARNING("Matte not supported on this printer, disabling\n");
job->hdr1.matte = 0;
- } else if (is_raw) {
+ } else if (job->is_raw) {
remain += planelen + sizeof(struct mitsu9550_plane) + sizeof(struct mitsu9550_cmd);
}
}
@@ -848,16 +847,10 @@ hdr_done:
}
}
- /* Do the 98xx processing here */
- if (ctx->is_98xx && !is_raw) {
- uint8_t *newbuf;
- uint32_t newlen = 0;
- struct mitsu98xx_data *table;
- struct CColorConv3D *lut;
-
- /* Apply LUT */
- if (job->hdr2.unkc[9]) {
- DEBUG("Applying 3D LUT\n");
+ /* Apply LUT */
+ if (ctx->is_98xx && !job->is_raw && job->hdr2.unkc[9]) {
+ DEBUG("Applying 3D LUT\n");
+ if (!ctx->lut) {
uint8_t *buf = malloc(LUT_LEN);
if (!buf) {
ERROR("Memory allocation failure!\n");
@@ -869,91 +862,17 @@ hdr_done:
mitsu9550_cleanup_job(job);
return CUPS_BACKEND_CANCEL;
}
- lut = CColorConv3D_Load3DColorTable(buf);
+ ctx->lut = CColorConv3D_Load3DColorTable(buf);
free(buf);
- if (!lut) {
+ if (!ctx->lut) {
ERROR("Unable to parse LUT\n");
mitsu9550_cleanup_job(job);
return CUPS_BACKEND_CANCEL;
}
- CColorConv3D_DoColorConv(lut, job->databuf + sizeof(struct mitsu9550_plane),
- job->cols, job->rows, job->cols * 3, COLORCONV_BGR);
- CColorConv3D_Destroy3DColorTable(lut);
- job->hdr2.unkc[9] = 0;
- }
-
- planelen = job->rows * job->cols * 2;
- remain = (job->hdr1.matte ? 3 : 4) * (planelen + sizeof(struct mitsu9550_plane)) + sizeof(struct mitsu9550_cmd);
- newbuf = malloc(remain);
- if (!newbuf) {
- ERROR("Memory allocation Failure!\n");
- mitsu9550_cleanup_job(job);
- return CUPS_BACKEND_RETRY_CURRENT;
- }
- switch (job->hdr2.mode) {
- case 0x80:
- table = &ctx->m98xxdata->superfine;
- break;
- case 0x11:
- table = &ctx->m98xxdata->fine_hg;
- job->hdr2.mode = 0x10;
- break;
- case 0x10:
- default:
- table = &ctx->m98xxdata->fine_std;
- break;
- }
-
- DEBUG("Applying 8bpp->12bpp Gamma Correction\n");
- /* For B/Y plane */
- memcpy(newbuf + newlen, job->databuf, sizeof(struct mitsu9550_plane));
- newbuf[newlen + 3] = 0x10; /* ie 16bpp data */
- newlen += sizeof(struct mitsu9550_plane);
- mitsu98xx_dogamma(job->databuf + sizeof(struct mitsu9550_plane),
- (uint16_t*) (newbuf + newlen),
- 0,
- table->GNMby,
- planelen / 2);
- newlen += planelen;
-
- /* For G/M plane */
- memcpy(newbuf + newlen, job->databuf, sizeof(struct mitsu9550_plane));
- newbuf[newlen + 3] = 0x10; /* ie 16bpp data */
- newlen += sizeof(struct mitsu9550_plane);
- mitsu98xx_dogamma(job->databuf + sizeof(struct mitsu9550_plane),
- (uint16_t*) (newbuf + newlen),
- 1,
- table->GNMgm,
- planelen / 2);
- newlen += planelen;
-
- /* For R/C plane */
- memcpy(newbuf + newlen, job->databuf, sizeof(struct mitsu9550_plane));
- newbuf[newlen + 3] = 0x10; /* ie 16bpp data */
- newlen += sizeof(struct mitsu9550_plane);
- mitsu98xx_dogamma(job->databuf + sizeof(struct mitsu9550_plane),
- (uint16_t*) (newbuf + newlen),
- 2,
- table->GNMrc,
- planelen / 2);
- newlen += planelen;
-
- /* And finally, the job footer. */
- memcpy(newbuf + newlen, job->databuf + sizeof(struct mitsu9550_plane) + planelen * 3, sizeof(struct mitsu9550_cmd));
- newlen += sizeof(struct mitsu9550_cmd);
-
- /* Clean up */
- free(job->databuf);
- job->databuf = newbuf;
- job->datalen = newlen;
-
- /* Now handle the matte plane generation */
- if (job->hdr1.matte) {
- if ((i = mitsu98xx_fillmatte(job))) {
- mitsu9550_cleanup_job(job);
- return i;
- }
}
+ CColorConv3D_DoColorConv(ctx->lut, job->databuf + sizeof(struct mitsu9550_plane),
+ job->cols, job->rows, job->cols * 3, COLORCONV_BGR);
+ job->hdr2.unkc[9] = 0;
}
/* Update printjob header to reflect number of requested copies */
@@ -1239,7 +1158,8 @@ static int mitsu9550_main_loop(void *vctx, const void *vjob) {
int copies;
#endif
- const struct mitsu9550_printjob *job = vjob;
+// const struct mitsu9550_printjob *job = vjob;
+ struct mitsu9550_printjob *job = (struct mitsu9550_printjob*) vjob; // XXX not good.
if (!ctx)
return CUPS_BACKEND_FAILED;
@@ -1256,6 +1176,85 @@ static int mitsu9550_main_loop(void *vctx, const void *vjob) {
// XXX..
#endif
+ /* Do the 98xx processing here */
+ if (ctx->is_98xx && !job->is_raw) {
+ uint8_t *newbuf;
+ uint32_t newlen = 0;
+ struct mitsu98xx_data *table;
+ int i, remain, planelen;
+
+ planelen = job->rows * job->cols * 2;
+ remain = (job->hdr1.matte ? 3 : 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 (job->hdr2.mode) {
+ case 0x80:
+ table = &ctx->m98xxdata->superfine;
+ break;
+ case 0x11:
+ table = &ctx->m98xxdata->fine_hg;
+ job->hdr2.mode = 0x10;
+ break;
+ case 0x10:
+ default:
+ table = &ctx->m98xxdata->fine_std;
+ break;
+ }
+
+ DEBUG("Applying 8bpp->12bpp Gamma Correction\n");
+ /* For B/Y plane */
+ memcpy(newbuf + newlen, job->databuf, sizeof(struct mitsu9550_plane));
+ newbuf[newlen + 3] = 0x10; /* ie 16bpp data */
+ newlen += sizeof(struct mitsu9550_plane);
+ mitsu98xx_dogamma(job->databuf + sizeof(struct mitsu9550_plane),
+ (uint16_t*) (newbuf + newlen),
+ 0,
+ table->GNMby,
+ planelen / 2);
+ newlen += planelen;
+
+ /* For G/M plane */
+ memcpy(newbuf + newlen, job->databuf, sizeof(struct mitsu9550_plane));
+ newbuf[newlen + 3] = 0x10; /* ie 16bpp data */
+ newlen += sizeof(struct mitsu9550_plane);
+ mitsu98xx_dogamma(job->databuf + sizeof(struct mitsu9550_plane),
+ (uint16_t*) (newbuf + newlen),
+ 1,
+ table->GNMgm,
+ planelen / 2);
+ newlen += planelen;
+
+ /* For R/C plane */
+ memcpy(newbuf + newlen, job->databuf, sizeof(struct mitsu9550_plane));
+ newbuf[newlen + 3] = 0x10; /* ie 16bpp data */
+ newlen += sizeof(struct mitsu9550_plane);
+ mitsu98xx_dogamma(job->databuf + sizeof(struct mitsu9550_plane),
+ (uint16_t*) (newbuf + newlen),
+ 2,
+ table->GNMrc,
+ planelen / 2);
+ newlen += planelen;
+
+ /* And finally, the job footer. */
+ memcpy(newbuf + newlen, job->databuf + sizeof(struct mitsu9550_plane) + planelen * 3, sizeof(struct mitsu9550_cmd));
+ newlen += sizeof(struct mitsu9550_cmd);
+
+ /* Clean up */
+ free(job->databuf);
+ job->databuf = newbuf;
+ job->datalen = newlen;
+
+ /* Now handle the matte plane generation */
+ if (job->hdr1.matte) {
+ if ((i = mitsu98xx_fillmatte(job))) {
+ return i;
+ }
+ }
+ }
+
top:
if (ctx->is_s) {
int num;
@@ -1706,7 +1705,7 @@ static const char *mitsu9550_prefixes[] = {
/* Exported */
struct dyesub_backend mitsu9550_backend = {
.name = "Mitsubishi CP9xxx family",
- .version = "0.39",
+ .version = "0.40",
.uri_prefixes = mitsu9550_prefixes,
.cmdline_usage = mitsu9550_cmdline,
.cmdline_arg = mitsu9550_cmdline_arg,