Mitsubishi: Start pulling common code into a separate code module.
This commit is contained in:
parent
d4fb31de28
commit
959b2de744
10
Makefile
10
Makefile
|
@ -98,11 +98,13 @@ LDFLAGS += $(CFLAGS) $(CPPFLAGS)
|
|||
|
||||
# Build stuff
|
||||
DEPS += backend_common.h
|
||||
SOURCES = backend_common.c backend_sinfonia.c $(addsuffix .c,$(addprefix backend_,$(BACKENDS)))
|
||||
SOURCES = backend_common.c backend_sinfonia.c backend_mitsu.c $(addsuffix .c,$(addprefix backend_,$(BACKENDS)))
|
||||
|
||||
# Dependencies for sinfonia backends..
|
||||
SINFONIA_BACKENDS = sinfonia kodak605 kodak6800 shinkos1245 shinkos2145 shinkos6145 shinkos6245
|
||||
SINFONIA_BACKENDS_O = $(addsuffix .o,$(addprefix backend_,$(SINFONIA_BACKENDS)))
|
||||
MITSU_BACKENDS = mitsu mitsu70x mitsu9550
|
||||
MITSU_BACKENDS_O = $(addsuffix .o,$(addprefix backend_,$(MITSU_BACKENDS)))
|
||||
|
||||
# And now the rules!
|
||||
.PHONY: clean all install cppcheck
|
||||
|
@ -175,8 +177,10 @@ endif
|
|||
|
||||
# Backend-specific joy:
|
||||
$(SINFONIA_BACKENDS_O): backend_sinfonia.h
|
||||
backend_mitsu70x.o: CPPFLAGS += -DCORRTABLE_PATH=\"$(BACKEND_DATA_DIR)\" -include lib70x/libMitsuD70ImageReProcess.h
|
||||
backend_mitsu9550.o: CPPFLAGS += -DCORRTABLE_PATH=\"$(BACKEND_DATA_DIR)\" -include lib70x/libMitsuD70ImageReProcess.h
|
||||
$(MITSU_BACKENDS_O): backend_mitsu.h
|
||||
backend_mitsu.o: CPPFLAGS += -DCORRTABLE_PATH=\"$(BACKEND_DATA_DIR)\"
|
||||
backend_mitsu70x.o: CPPFLAGS += -DCORRTABLE_PATH=\"$(BACKEND_DATA_DIR)\"
|
||||
backend_mitsu9550.o: CPPFLAGS += -DCORRTABLE_PATH=\"$(BACKEND_DATA_DIR)\"
|
||||
backend_hiti.o: CPPFLAGS += -DCORRTABLE_PATH=\"$(BACKEND_DATA_DIR)\"
|
||||
backend_mitsud90.o: CPPFLAGS += -DCORRTABLE_PATH=\"$(BACKEND_DATA_DIR)\"
|
||||
|
||||
|
|
|
@ -0,0 +1,192 @@
|
|||
/*
|
||||
* Mitsubishi Photo Printer Comon Code
|
||||
*
|
||||
* (c) 2013-2020 Solomon Peachy <pizza@shaftnet.org>
|
||||
*
|
||||
* The latest version of this program can be found at:
|
||||
*
|
||||
* http://git.shaftnet.org/cgit/selphy_print.git
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0+
|
||||
*
|
||||
*/
|
||||
|
||||
#include "backend_common.h"
|
||||
#include "backend_mitsu.h"
|
||||
|
||||
int mitsu_loadlib(struct mitsu_lib *lib, int type)
|
||||
{
|
||||
DL_INIT();
|
||||
|
||||
#if defined(WITH_DYNAMIC)
|
||||
DEBUG("Attempting to load image processing library\n");
|
||||
lib->dl_handle = DL_OPEN(LIB_NAME_RE);
|
||||
if (!lib->dl_handle)
|
||||
WARNING("Image processing library not found, using internal fallback code\n");
|
||||
if (lib->dl_handle) {
|
||||
lib->GetAPIVersion = DL_SYM(lib->dl_handle, "lib70x_getapiversion");
|
||||
if (!lib->GetAPIVersion) {
|
||||
ERROR("Problem resolving API Version symbol in imaging processing library, too old or not installed?\n");
|
||||
DL_CLOSE(lib->dl_handle);
|
||||
lib->dl_handle = NULL;
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
if (lib->GetAPIVersion() != REQUIRED_LIB_APIVERSION) {
|
||||
ERROR("Image processing library API version mismatch!\n");
|
||||
DL_CLOSE(lib->dl_handle);
|
||||
lib->dl_handle = NULL;
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
|
||||
lib->Get3DColorTable = DL_SYM(lib->dl_handle, "CColorConv3D_Get3DColorTable");
|
||||
lib->Load3DColorTable = DL_SYM(lib->dl_handle, "CColorConv3D_Load3DColorTable");
|
||||
lib->Destroy3DColorTable = DL_SYM(lib->dl_handle, "CColorConv3D_Destroy3DColorTable");
|
||||
lib->DoColorConv = DL_SYM(lib->dl_handle, "CColorConv3D_DoColorConv");
|
||||
lib->GetCPCData = DL_SYM(lib->dl_handle, "get_CPCData");
|
||||
lib->DestroyCPCData = DL_SYM(lib->dl_handle, "destroy_CPCData");
|
||||
lib->DoImageEffect60 = DL_SYM(lib->dl_handle, "do_image_effect60");
|
||||
lib->DoImageEffect70 = DL_SYM(lib->dl_handle, "do_image_effect70");
|
||||
lib->DoImageEffect80 = DL_SYM(lib->dl_handle, "do_image_effect80");
|
||||
lib->SendImageData = DL_SYM(lib->dl_handle, "send_image_data");
|
||||
if (!lib->Get3DColorTable || !lib->Load3DColorTable ||
|
||||
!lib->Destroy3DColorTable || !lib->DoColorConv ||
|
||||
!lib->GetCPCData || !lib->DestroyCPCData ||
|
||||
!lib->DoImageEffect60 || !lib->DoImageEffect70 ||
|
||||
!lib->DoImageEffect80 || !lib->SendImageData) {
|
||||
ERROR("Problem resolving symbols in imaging processing library\n");
|
||||
DL_CLOSE(lib->dl_handle);
|
||||
lib->dl_handle = NULL;
|
||||
return CUPS_BACKEND_FAILED;
|
||||
} else {
|
||||
DEBUG("Image processing library successfully loaded\n");
|
||||
}
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case P_MITSU_D80:
|
||||
lib->DoImageEffect = lib->DoImageEffect80;
|
||||
break;
|
||||
case P_MITSU_K60:
|
||||
case P_KODAK_305:
|
||||
lib->DoImageEffect = lib->DoImageEffect60;
|
||||
break;
|
||||
case P_MITSU_D70X:
|
||||
case P_FUJI_ASK300:
|
||||
lib->DoImageEffect = lib->DoImageEffect70;
|
||||
break;
|
||||
default:
|
||||
lib->DoImageEffect = NULL;
|
||||
}
|
||||
|
||||
return CUPS_BACKEND_OK;
|
||||
#else
|
||||
return CUPS_BACKEND_FAILED;
|
||||
#endif
|
||||
}
|
||||
|
||||
int mitsu_destroylib(struct mitsu_lib *lib)
|
||||
{
|
||||
#if defined(WITH_DYNAMIC)
|
||||
if (lib->dl_handle) {
|
||||
if (lib->cpcdata)
|
||||
lib->DestroyCPCData(lib->cpcdata);
|
||||
if (lib->ecpcdata)
|
||||
lib->DestroyCPCData(lib->ecpcdata);
|
||||
if (lib->lut)
|
||||
lib->Destroy3DColorTable(lib->lut);
|
||||
DL_CLOSE(lib->dl_handle);
|
||||
}
|
||||
|
||||
memset(lib, 0, sizeof(*lib));
|
||||
DL_EXIT();
|
||||
|
||||
#endif
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
int mitsu_apply3dlut(struct mitsu_lib *lib, char *lutfname, uint8_t *databuf,
|
||||
uint16_t cols, uint16_t rows, uint16_t stride,
|
||||
int rgb_bgr)
|
||||
{
|
||||
#if defined(WITH_DYNAMIC)
|
||||
int i;
|
||||
|
||||
if (!lutfname)
|
||||
return CUPS_BACKEND_OK;
|
||||
|
||||
if (!lib->lut) {
|
||||
uint8_t *buf = malloc(LUT_LEN);
|
||||
if (!buf) {
|
||||
ERROR("Memory allocation failure!\n");
|
||||
return CUPS_BACKEND_RETRY_CURRENT;
|
||||
}
|
||||
if ((i = lib->Get3DColorTable(buf, lutfname))) {
|
||||
ERROR("Unable to open LUT file '%s' (%d)\n", lutfname, i);
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
}
|
||||
lib->lut = lib->Load3DColorTable(buf);
|
||||
free(buf);
|
||||
if (!lib->lut) {
|
||||
ERROR("Unable to parse LUT file '%s'!\n", lutfname);
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
}
|
||||
}
|
||||
|
||||
if (lib->lut) {
|
||||
DEBUG("Running print data through 3D LUT\n");
|
||||
lib->DoColorConv(lib->lut, databuf, cols, rows, stride, rgb_bgr);
|
||||
}
|
||||
#endif
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
int mitsu_readlamdata(const char *fname, uint16_t lamstride,
|
||||
uint8_t *databuf, uint32_t *datalen,
|
||||
uint16_t rows, uint16_t cols, uint8_t bpp)
|
||||
{
|
||||
int i, j, fd;
|
||||
int remain = cols * rows * bpp;
|
||||
|
||||
DEBUG("Reading %d bytes of matte data from disk (%d/%d)\n", cols * rows * bpp, cols, lamstride);
|
||||
fd = open(fname, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
ERROR("Unable to open matte lamination data file '%s'\n", fname);
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
}
|
||||
|
||||
/* Read in the matte data plane */
|
||||
for (j = 0 ; j < rows ; j++) {
|
||||
remain = lamstride * bpp;
|
||||
|
||||
/* Read one row of lamination data at a time */
|
||||
while (remain) {
|
||||
i = read(fd, databuf + *datalen, remain);
|
||||
if (i < 0)
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
if (i == 0) {
|
||||
/* We hit EOF, restart from beginning */
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
continue;
|
||||
}
|
||||
*datalen += i;
|
||||
remain -= i;
|
||||
}
|
||||
/* Back off the buffer so we "wrap" on the print row. */
|
||||
*datalen -= ((lamstride - cols) * 2);
|
||||
}
|
||||
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* Mitsubishi Photo Printer Comon Code
|
||||
*
|
||||
* (c) 2013-2020 Solomon Peachy <pizza@shaftnet.org>
|
||||
*
|
||||
* The latest version of this program can be found at:
|
||||
*
|
||||
* http://git.shaftnet.org/cgit/selphy_print.git
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0+
|
||||
*
|
||||
*/
|
||||
|
||||
#include "backend_common.h"
|
||||
|
||||
#include "lib70x/libMitsuD70ImageReProcess.h"
|
||||
|
||||
typedef int (*lib70x_getapiversionFN)(void);
|
||||
typedef int (*Get3DColorTableFN)(uint8_t *buf, const char *filename);
|
||||
typedef struct CColorConv3D *(*Load3DColorTableFN)(const uint8_t *ptr);
|
||||
typedef void (*Destroy3DColorTableFN)(struct CColorConv3D *this);
|
||||
typedef void (*DoColorConvFN)(struct CColorConv3D *this, uint8_t *data, uint16_t cols, uint16_t rows, uint32_t bytes_per_row, int rgb_bgr);
|
||||
typedef struct CPCData *(*get_CPCDataFN)(const char *filename);
|
||||
typedef void (*destroy_CPCDataFN)(struct CPCData *data);
|
||||
typedef int (*do_image_effectFN)(struct CPCData *cpc, struct CPCData *ecpc, struct BandImage *input, struct BandImage *output, int sharpen, int reverse, uint8_t rew[2]);
|
||||
typedef int (*send_image_dataFN)(struct BandImage *out, void *context,
|
||||
int (*callback_fn)(void *context, void *buffer, uint32_t len));
|
||||
|
||||
#ifndef WITH_DYNAMIC
|
||||
#warning "No dynamic loading support!"
|
||||
#endif
|
||||
|
||||
#define REQUIRED_LIB_APIVERSION 4
|
||||
|
||||
#define LIBMITSU_VER "0.01"
|
||||
|
||||
/* Image processing library function prototypes */
|
||||
#define LIB_NAME_RE "libMitsuD70ImageReProcess" DLL_SUFFIX
|
||||
|
||||
#ifndef CORRTABLE_PATH
|
||||
#ifdef PACKAGE_DATA_DIR
|
||||
#define CORRTABLE_PATH PACKAGE_DATA_DIR "/backend_data"
|
||||
#else
|
||||
#error "Must define CORRTABLE_PATH or PACKAGE_DATA_DIR!"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct mitsu_lib {
|
||||
void *dl_handle;
|
||||
lib70x_getapiversionFN GetAPIVersion;
|
||||
Get3DColorTableFN Get3DColorTable;
|
||||
Load3DColorTableFN Load3DColorTable;
|
||||
Destroy3DColorTableFN Destroy3DColorTable;
|
||||
DoColorConvFN DoColorConv;
|
||||
get_CPCDataFN GetCPCData;
|
||||
destroy_CPCDataFN DestroyCPCData;
|
||||
do_image_effectFN DoImageEffect60;
|
||||
do_image_effectFN DoImageEffect70;
|
||||
do_image_effectFN DoImageEffect80;
|
||||
do_image_effectFN DoImageEffect;
|
||||
send_image_dataFN SendImageData;
|
||||
|
||||
struct CColorConv3D *lut;
|
||||
struct CPCData *cpcdata;
|
||||
struct CPCData *ecpcdata;
|
||||
};
|
||||
|
||||
int mitsu_loadlib(struct mitsu_lib *lib, int type);
|
||||
int mitsu_destroylib(struct mitsu_lib *lib);
|
||||
int mitsu_apply3dlut(struct mitsu_lib *lib, char *lutfname, uint8_t *databuf,
|
||||
uint16_t cols, uint16_t rows, uint16_t stride,
|
||||
int rgb_bgr);
|
||||
int mitsu_readlamdata(const char *fname, uint16_t lamstride,
|
||||
uint8_t *databuf, uint32_t *datalen,
|
||||
uint16_t rows, uint16_t cols, uint8_t bpp);
|
|
@ -27,57 +27,13 @@
|
|||
#define BACKEND mitsu70x_backend
|
||||
|
||||
#include "backend_common.h"
|
||||
#include "backend_mitsu.h"
|
||||
|
||||
/* For Integration into gutenprint */
|
||||
#if defined(HAVE_CONFIG_H)
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#ifndef WITH_DYNAMIC
|
||||
#warning "No dynamic loading support!"
|
||||
#endif
|
||||
|
||||
// #include "lib70x/libMitsuD70ImageReProcess.h"
|
||||
|
||||
#ifndef LUT_LEN
|
||||
#define COLORCONV_RGB 0
|
||||
#define COLORCONV_BGR 1
|
||||
|
||||
#define LUT_LEN 14739
|
||||
struct BandImage {
|
||||
void *imgbuf;
|
||||
int32_t bytes_per_row;
|
||||
uint16_t origin_cols;
|
||||
uint16_t origin_rows;
|
||||
uint16_t cols;
|
||||
uint16_t rows;
|
||||
};
|
||||
#endif
|
||||
|
||||
#define REQUIRED_LIB_APIVERSION 4
|
||||
|
||||
/* Image processing library function prototypes */
|
||||
#define LIB_NAME_RE "libMitsuD70ImageReProcess" DLL_SUFFIX
|
||||
|
||||
typedef int (*lib70x_getapiversionFN)(void);
|
||||
typedef int (*Get3DColorTableFN)(uint8_t *buf, const char *filename);
|
||||
typedef struct CColorConv3D *(*Load3DColorTableFN)(const uint8_t *ptr);
|
||||
typedef void (*Destroy3DColorTableFN)(struct CColorConv3D *this);
|
||||
typedef void (*DoColorConvFN)(struct CColorConv3D *this, uint8_t *data, uint16_t cols, uint16_t rows, uint32_t bytes_per_row, int rgb_bgr);
|
||||
typedef struct CPCData *(*get_CPCDataFN)(const char *filename);
|
||||
typedef void (*destroy_CPCDataFN)(struct CPCData *data);
|
||||
typedef int (*do_image_effectFN)(struct CPCData *cpc, struct CPCData *ecpc, struct BandImage *input, struct BandImage *output, int sharpen, int reverse, uint8_t rew[2]);
|
||||
typedef int (*send_image_dataFN)(struct BandImage *out, void *context,
|
||||
int (*callback_fn)(void *context, void *buffer, uint32_t len));
|
||||
|
||||
#ifndef CORRTABLE_PATH
|
||||
#ifdef PACKAGE_DATA_DIR
|
||||
#define CORRTABLE_PATH PACKAGE_DATA_DIR "/backend_data"
|
||||
#else
|
||||
#error "Must define CORRTABLE_PATH or PACKAGE_DATA_DIR!"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define USB_VID_MITSU 0x06D3
|
||||
#define USB_PID_MITSU_D70X 0x3B30
|
||||
#define USB_PID_MITSU_K60 0x3B31
|
||||
|
@ -100,7 +56,7 @@ struct mitsu70x_printjob {
|
|||
int can_combine;
|
||||
|
||||
uint8_t *databuf;
|
||||
int datalen;
|
||||
uint32_t datalen;
|
||||
|
||||
uint8_t *spoolbuf;
|
||||
int spoolbuflen;
|
||||
|
@ -142,23 +98,7 @@ struct mitsu70x_ctx {
|
|||
char serno[7]; /* 6+null */
|
||||
char fwver[7]; /* 6+null */
|
||||
|
||||
void *dl_handle;
|
||||
lib70x_getapiversionFN GetAPIVersion;
|
||||
Get3DColorTableFN Get3DColorTable;
|
||||
Load3DColorTableFN Load3DColorTable;
|
||||
Destroy3DColorTableFN Destroy3DColorTable;
|
||||
DoColorConvFN DoColorConv;
|
||||
get_CPCDataFN GetCPCData;
|
||||
destroy_CPCDataFN DestroyCPCData;
|
||||
do_image_effectFN DoImageEffect60;
|
||||
do_image_effectFN DoImageEffect70;
|
||||
do_image_effectFN DoImageEffect80;
|
||||
do_image_effectFN DoImageEffect;
|
||||
send_image_dataFN SendImageData;
|
||||
|
||||
struct CColorConv3D *lut;
|
||||
struct CPCData *cpcdata;
|
||||
struct CPCData *ecpcdata;
|
||||
struct mitsu_lib lib;
|
||||
|
||||
char *last_cpcfname;
|
||||
char *last_ecpcfname;
|
||||
|
@ -689,8 +629,6 @@ static void *mitsu70x_init(void)
|
|||
}
|
||||
memset(ctx, 0, sizeof(struct mitsu70x_ctx));
|
||||
|
||||
DL_INIT();
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
|
@ -712,63 +650,10 @@ static int mitsu70x_attach(void *vctx, struct libusb_device_handle *dev, int typ
|
|||
|
||||
ctx->last_l = ctx->last_u = 65535;
|
||||
|
||||
/* Attempt to open the library */
|
||||
#if defined(WITH_DYNAMIC)
|
||||
DEBUG("Attempting to load image processing library\n");
|
||||
ctx->dl_handle = DL_OPEN(LIB_NAME_RE);
|
||||
if (!ctx->dl_handle)
|
||||
WARNING("Image processing library not found, using internal fallback code\n");
|
||||
if (ctx->dl_handle) {
|
||||
ctx->GetAPIVersion = DL_SYM(ctx->dl_handle, "lib70x_getapiversion");
|
||||
if (!ctx->GetAPIVersion) {
|
||||
ERROR("Problem resolving API Version symbol in imaging processing library, too old or not installed?\n");
|
||||
DL_CLOSE(ctx->dl_handle);
|
||||
ctx->dl_handle = NULL;
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
if (ctx->GetAPIVersion() != REQUIRED_LIB_APIVERSION) {
|
||||
ERROR("Image processing library API version mismatch!\n");
|
||||
DL_CLOSE(ctx->dl_handle);
|
||||
ctx->dl_handle = NULL;
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
|
||||
ctx->Get3DColorTable = DL_SYM(ctx->dl_handle, "CColorConv3D_Get3DColorTable");
|
||||
ctx->Load3DColorTable = DL_SYM(ctx->dl_handle, "CColorConv3D_Load3DColorTable");
|
||||
ctx->Destroy3DColorTable = DL_SYM(ctx->dl_handle, "CColorConv3D_Destroy3DColorTable");
|
||||
ctx->DoColorConv = DL_SYM(ctx->dl_handle, "CColorConv3D_DoColorConv");
|
||||
ctx->GetCPCData = DL_SYM(ctx->dl_handle, "get_CPCData");
|
||||
ctx->DestroyCPCData = DL_SYM(ctx->dl_handle, "destroy_CPCData");
|
||||
ctx->DoImageEffect60 = DL_SYM(ctx->dl_handle, "do_image_effect60");
|
||||
ctx->DoImageEffect70 = DL_SYM(ctx->dl_handle, "do_image_effect70");
|
||||
ctx->DoImageEffect80 = DL_SYM(ctx->dl_handle, "do_image_effect80");
|
||||
ctx->SendImageData = DL_SYM(ctx->dl_handle, "send_image_data");
|
||||
if (!ctx->Get3DColorTable || !ctx->Load3DColorTable ||
|
||||
!ctx->Destroy3DColorTable || !ctx->DoColorConv ||
|
||||
!ctx->GetCPCData || !ctx->DestroyCPCData ||
|
||||
!ctx->DoImageEffect60 || !ctx->DoImageEffect70 ||
|
||||
!ctx->DoImageEffect80 || !ctx->SendImageData) {
|
||||
ERROR("Problem resolving symbols in imaging processing library\n");
|
||||
DL_CLOSE(ctx->dl_handle);
|
||||
ctx->dl_handle = NULL;
|
||||
return CUPS_BACKEND_FAILED;
|
||||
} else {
|
||||
DEBUG("Image processing library successfully loaded\n");
|
||||
}
|
||||
}
|
||||
|
||||
switch (ctx->type) {
|
||||
case P_MITSU_D80:
|
||||
ctx->DoImageEffect = ctx->DoImageEffect80;
|
||||
break;
|
||||
case P_MITSU_K60:
|
||||
case P_KODAK_305:
|
||||
ctx->DoImageEffect = ctx->DoImageEffect60;
|
||||
break;
|
||||
default:
|
||||
ctx->DoImageEffect = ctx->DoImageEffect70;
|
||||
break;
|
||||
}
|
||||
/* Attempt to open the library */
|
||||
if (mitsu_loadlib(&ctx->lib, ctx->type))
|
||||
return CUPS_BACKEND_FAILED;
|
||||
#else
|
||||
WARNING("Dynamic library support not enabled, using internal fallback code\n");
|
||||
#endif
|
||||
|
@ -887,17 +772,7 @@ static void mitsu70x_teardown(void *vctx) {
|
|||
if (!ctx)
|
||||
return;
|
||||
|
||||
if (ctx->dl_handle) {
|
||||
if (ctx->cpcdata)
|
||||
ctx->DestroyCPCData(ctx->cpcdata);
|
||||
if (ctx->ecpcdata)
|
||||
ctx->DestroyCPCData(ctx->ecpcdata);
|
||||
if (ctx->lut)
|
||||
ctx->Destroy3DColorTable(ctx->lut);
|
||||
DL_CLOSE(ctx->dl_handle);
|
||||
}
|
||||
|
||||
DL_EXIT();
|
||||
mitsu_destroylib(&ctx->lib);
|
||||
|
||||
free(ctx);
|
||||
}
|
||||
|
@ -1242,11 +1117,10 @@ repeat:
|
|||
job->datalen += i;
|
||||
remain -= i;
|
||||
}
|
||||
goto done;
|
||||
goto bypass_raw;
|
||||
}
|
||||
|
||||
/* Non-RAW mode! */
|
||||
|
||||
remain = job->rows * job->cols * 3;
|
||||
DEBUG("Reading in %d bytes of 8bpp BGR data\n", remain);
|
||||
|
||||
|
@ -1273,7 +1147,7 @@ repeat:
|
|||
remain -= i;
|
||||
}
|
||||
|
||||
if (!ctx->dl_handle) {
|
||||
if (!ctx->lib.dl_handle) {
|
||||
// XXXFALLBACK write fallback code?
|
||||
ERROR("!!! Image Processing Library not found, aborting!\n");
|
||||
mitsu70x_cleanup_job(job);
|
||||
|
@ -1281,33 +1155,18 @@ repeat:
|
|||
}
|
||||
|
||||
/* Run through basic LUT, if present and enabled */
|
||||
if (job->lutfname && !ctx->lut) { /* printer-specific, it is fixed per-job */
|
||||
uint8_t *buf = malloc(LUT_LEN);
|
||||
if (!buf) {
|
||||
ERROR("Memory allocation failure!\n");
|
||||
if (job->lutfname) {
|
||||
int ret = mitsu_apply3dlut(&ctx->lib, job->lutfname,
|
||||
job->databuf, job->cols,
|
||||
job->rows, job->cols * 3,
|
||||
COLORCONV_BGR);
|
||||
if (ret) {
|
||||
mitsu70x_cleanup_job(job);
|
||||
return CUPS_BACKEND_RETRY_CURRENT;
|
||||
}
|
||||
if ((i = ctx->Get3DColorTable(buf, job->lutfname))) {
|
||||
ERROR("Unable to open LUT file '%s' (%d)\n", job->lutfname, i);
|
||||
mitsu70x_cleanup_job(job);
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
}
|
||||
ctx->lut = ctx->Load3DColorTable(buf);
|
||||
free(buf);
|
||||
if (!ctx->lut) {
|
||||
ERROR("Unable to parse LUT file '%s'!\n", job->lutfname);
|
||||
mitsu70x_cleanup_job(job);
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (job->lutfname && ctx->lut) {
|
||||
DEBUG("Running print data through 3D LUT\n");
|
||||
ctx->DoColorConv(ctx->lut, job->spoolbuf, job->cols, job->rows, job->cols * 3, COLORCONV_BGR);
|
||||
}
|
||||
|
||||
done:
|
||||
bypass_raw:
|
||||
for (i = 0 ; i < ctx->num_decks ; i++) {
|
||||
switch (ctx->medias[i]) {
|
||||
case 0x1: // 5x3.5
|
||||
|
@ -1729,10 +1588,10 @@ static int mitsu70x_main_loop(void *vctx, const void *vjob)
|
|||
/* Load in the CPC file, if needed */
|
||||
if (job->cpcfname && job->cpcfname != ctx->last_cpcfname) {
|
||||
ctx->last_cpcfname = job->cpcfname;
|
||||
if (ctx->cpcdata)
|
||||
ctx->DestroyCPCData(ctx->cpcdata);
|
||||
ctx->cpcdata = ctx->GetCPCData(job->cpcfname);
|
||||
if (!ctx->cpcdata) {
|
||||
if (ctx->lib.cpcdata)
|
||||
ctx->lib.DestroyCPCData(ctx->lib.cpcdata);
|
||||
ctx->lib.cpcdata = ctx->lib.GetCPCData(job->cpcfname);
|
||||
if (!ctx->lib.cpcdata) {
|
||||
ERROR("Unable to load CPC file '%s'\n", job->cpcfname);
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
}
|
||||
|
@ -1741,16 +1600,16 @@ static int mitsu70x_main_loop(void *vctx, const void *vjob)
|
|||
/* Load in the secondary CPC, if needed */
|
||||
if (job->ecpcfname != ctx->last_ecpcfname) {
|
||||
ctx->last_ecpcfname = job->ecpcfname;
|
||||
if (ctx->ecpcdata)
|
||||
ctx->DestroyCPCData(ctx->ecpcdata);
|
||||
if (ctx->lib.ecpcdata)
|
||||
ctx->lib.DestroyCPCData(ctx->lib.ecpcdata);
|
||||
if (job->ecpcfname) {
|
||||
ctx->ecpcdata = ctx->GetCPCData(job->ecpcfname);
|
||||
if (!ctx->ecpcdata) {
|
||||
ctx->lib.ecpcdata = ctx->lib.GetCPCData(job->ecpcfname);
|
||||
if (!ctx->lib.ecpcdata) {
|
||||
ERROR("Unable to load CPC file '%s'\n", job->cpcfname);
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
}
|
||||
} else {
|
||||
ctx->ecpcdata = NULL;
|
||||
ctx->lib.ecpcdata = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1768,8 +1627,8 @@ static int mitsu70x_main_loop(void *vctx, const void *vjob)
|
|||
ctx->output.bytes_per_row = job->cols * 3 * 2;
|
||||
|
||||
DEBUG("Running print data through processing library\n");
|
||||
if (ctx->DoImageEffect(ctx->cpcdata, ctx->ecpcdata,
|
||||
&input, &ctx->output, job->sharpen, job->reverse, rew)) {
|
||||
if (ctx->lib.DoImageEffect(ctx->lib.cpcdata, ctx->lib.ecpcdata,
|
||||
&input, &ctx->output, job->sharpen, job->reverse, rew)) {
|
||||
ERROR("Image Processing failed, aborting!\n");
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
}
|
||||
|
@ -1792,40 +1651,17 @@ static int mitsu70x_main_loop(void *vctx, const void *vjob)
|
|||
|
||||
/* Now that we've filled everything in, read matte from file */
|
||||
if (job->matte) {
|
||||
int fd;
|
||||
uint32_t j;
|
||||
DEBUG("Reading %u bytes of matte data from disk (%d/%d)\n", job->matte, job->cols, LAMINATE_STRIDE);
|
||||
fd = open(job->laminatefname, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
ERROR("Unable to open matte lamination data file '%s'\n", job->laminatefname);
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
}
|
||||
int ret;
|
||||
|
||||
for (j = 0 ; j < be16_to_cpu(hdr->lamrows) ; j++) {
|
||||
int remain = LAMINATE_STRIDE * 2;
|
||||
|
||||
/* Read one row of lamination data at a time */
|
||||
while (remain) {
|
||||
int i = read(fd, job->databuf + job->datalen, remain);
|
||||
if (i < 0)
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
if (i == 0) {
|
||||
/* We hit EOF, restart from beginning */
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
continue;
|
||||
}
|
||||
job->datalen += i;
|
||||
remain -= i;
|
||||
}
|
||||
/* Back off the buffer so we "wrap" on the print row. */
|
||||
job->datalen -= ((LAMINATE_STRIDE - job->cols) * 2);
|
||||
}
|
||||
/* We're done */
|
||||
close(fd);
|
||||
ret = mitsu_readlamdata(job->laminatefname, LAMINATE_STRIDE,
|
||||
job->databuf, &job->datalen,
|
||||
be16_to_cpu(hdr->lamrows), be16_to_cpu(hdr->lamcols), 2);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Zero out the tail end of the buffer. */
|
||||
j = be16_to_cpu(hdr->lamcols) * be16_to_cpu(hdr->lamrows) * 2;
|
||||
memset(job->databuf + job->datalen, 0, job->matte - j);
|
||||
ret = be16_to_cpu(hdr->lamcols) * be16_to_cpu(hdr->lamrows) * 2;
|
||||
memset(job->databuf + job->datalen, 0, job->matte - ret);
|
||||
}
|
||||
|
||||
bypass:
|
||||
|
@ -2032,8 +1868,8 @@ top:
|
|||
sizeof(struct mitsu70x_hdr))))
|
||||
return CUPS_BACKEND_FAILED;
|
||||
|
||||
if (ctx->dl_handle && !job->raw_format) {
|
||||
if (ctx->SendImageData(&ctx->output, ctx, d70_library_callback))
|
||||
if (ctx->lib.dl_handle && !job->raw_format) {
|
||||
if (ctx->lib.SendImageData(&ctx->output, ctx, d70_library_callback))
|
||||
return CUPS_BACKEND_FAILED;
|
||||
|
||||
if (job->matte)
|
||||
|
@ -2554,7 +2390,7 @@ static const char *mitsu70x_prefixes[] = {
|
|||
/* Exported */
|
||||
struct dyesub_backend mitsu70x_backend = {
|
||||
.name = "Mitsubishi CP-D70 family",
|
||||
.version = "0.97",
|
||||
.version = "0.98" " (lib " LIBMITSU_VER ")",
|
||||
.flags = BACKEND_FLAG_DUMMYPRINT,
|
||||
.uri_prefixes = mitsu70x_prefixes,
|
||||
.cmdline_usage = mitsu70x_cmdline,
|
||||
|
|
|
@ -27,52 +27,13 @@
|
|||
#define BACKEND mitsu9550_backend
|
||||
|
||||
#include "backend_common.h"
|
||||
#include "backend_mitsu.h"
|
||||
|
||||
/* For Integration into gutenprint */
|
||||
#if defined(HAVE_CONFIG_H)
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#ifndef WITH_DYNAMIC
|
||||
#warning "No dynamic loading support!"
|
||||
#endif
|
||||
|
||||
// #include "lib70x/libMitsuD70ImageReProcess.h"
|
||||
|
||||
#ifndef LUT_LEN
|
||||
#define COLORCONV_RGB 0
|
||||
#define COLORCONV_BGR 1
|
||||
|
||||
#define LUT_LEN 14739
|
||||
struct BandImage {
|
||||
void *imgbuf;
|
||||
int32_t bytes_per_row;
|
||||
uint16_t origin_cols;
|
||||
uint16_t origin_rows;
|
||||
uint16_t cols;
|
||||
uint16_t rows;
|
||||
};
|
||||
#endif
|
||||
|
||||
#define REQUIRED_LIB_APIVERSION 4
|
||||
|
||||
/* Image processing library function prototypes */
|
||||
#define LIB_NAME_RE "libMitsuD70ImageReProcess" DLL_SUFFIX
|
||||
|
||||
typedef int (*lib70x_getapiversionFN)(void);
|
||||
typedef int (*Get3DColorTableFN)(uint8_t *buf, const char *filename);
|
||||
typedef struct CColorConv3D *(*Load3DColorTableFN)(const uint8_t *ptr);
|
||||
typedef void (*Destroy3DColorTableFN)(struct CColorConv3D *this);
|
||||
typedef void (*DoColorConvFN)(struct CColorConv3D *this, uint8_t *data, uint16_t cols, uint16_t rows, uint32_t bytes_per_row, int rgb_bgr);
|
||||
|
||||
#ifndef CORRTABLE_PATH
|
||||
#ifdef PACKAGE_DATA_DIR
|
||||
#define CORRTABLE_PATH PACKAGE_DATA_DIR "/backend_data"
|
||||
#else
|
||||
#error "Must define CORRTABLE_PATH or PACKAGE_DATA_DIR!"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define MITSU_M98xx_LAMINATE_FILE CORRTABLE_PATH "/M98MATTE.raw"
|
||||
#define MITSU_M98xx_DATATABLE_FILE CORRTABLE_PATH "/M98TABLE.dat"
|
||||
#define MITSU_M98xx_LUT_FILE CORRTABLE_PATH "/M98XXL01.lut"
|
||||
|
@ -212,14 +173,7 @@ struct mitsu9550_ctx {
|
|||
struct marker marker;
|
||||
|
||||
/* CP98xx stuff */
|
||||
void *dl_handle;
|
||||
lib70x_getapiversionFN GetAPIVersion;
|
||||
Get3DColorTableFN Get3DColorTable;
|
||||
Load3DColorTableFN Load3DColorTable;
|
||||
Destroy3DColorTableFN Destroy3DColorTable;
|
||||
DoColorConvFN DoColorConv;
|
||||
|
||||
struct CColorConv3D *lut;
|
||||
struct mitsu_lib lib;
|
||||
struct mitsu98xx_tables *m98xxdata;
|
||||
};
|
||||
|
||||
|
@ -322,16 +276,7 @@ static void mitsu98xx_dogamma(uint8_t *src, uint16_t *dest, uint8_t plane,
|
|||
|
||||
static int mitsu98xx_fillmatte(struct mitsu9550_printjob *job)
|
||||
{
|
||||
int fd, i;
|
||||
uint32_t j, remain;
|
||||
|
||||
DEBUG("Reading %d bytes of matte data from disk (%d/%d)\n", job->cols * job->rows * 2, job->cols, LAMINATE_STRIDE);
|
||||
fd = open(MITSU_M98xx_LAMINATE_FILE, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
WARNING("Unable to open matte lamination data file '%s'\n", MITSU_M98xx_LAMINATE_FILE);
|
||||
job->hdr1.matte = 0;
|
||||
goto done;
|
||||
}
|
||||
int ret;
|
||||
|
||||
/* Fill in the lamination plane header */
|
||||
struct mitsu9550_plane *matte = (struct mitsu9550_plane *)(job->databuf + job->datalen);
|
||||
|
@ -345,28 +290,11 @@ static int mitsu98xx_fillmatte(struct mitsu9550_printjob *job)
|
|||
matte->rows = cpu_to_be16(job->hdr1.rows);
|
||||
job->datalen += sizeof(struct mitsu9550_plane);
|
||||
|
||||
/* Read in the matte data plane */
|
||||
for (j = 0 ; j < job->rows ; j++) {
|
||||
remain = LAMINATE_STRIDE * 2;
|
||||
|
||||
/* Read one row of lamination data at a time */
|
||||
while (remain) {
|
||||
i = read(fd, job->databuf + job->datalen, remain);
|
||||
if (i < 0)
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
if (i == 0) {
|
||||
/* We hit EOF, restart from beginning */
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
continue;
|
||||
}
|
||||
job->datalen += i;
|
||||
remain -= i;
|
||||
}
|
||||
/* Back off the buffer so we "wrap" on the print row. */
|
||||
job->datalen -= ((LAMINATE_STRIDE - job->cols) * 2);
|
||||
}
|
||||
/* We're done! */
|
||||
close(fd);
|
||||
ret = mitsu_readlamdata(MITSU_M98xx_LAMINATE_FILE, LAMINATE_STRIDE,
|
||||
job->databuf, &job->datalen,
|
||||
job->rows, job->cols, 2);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Fill in the lamination plane footer */
|
||||
job->databuf[job->datalen++] = 0x1b;
|
||||
|
@ -374,16 +302,9 @@ static int mitsu98xx_fillmatte(struct mitsu9550_printjob *job)
|
|||
job->databuf[job->datalen++] = 0x56;
|
||||
job->databuf[job->datalen++] = 0x00;
|
||||
|
||||
done:
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
#ifndef LUT_LEN
|
||||
#define LUT_LEN 14739
|
||||
#define COLORCONV_RGB 0
|
||||
#define COLORCONV_BGR 1
|
||||
#endif
|
||||
|
||||
static int mitsu9550_get_status(struct mitsu9550_ctx *ctx, uint8_t *resp, int status, int status2, int media);
|
||||
static char *mitsu9550_media_types(uint8_t type, uint8_t is_s);
|
||||
|
||||
|
@ -396,8 +317,6 @@ static void *mitsu9550_init(void)
|
|||
}
|
||||
memset(ctx, 0, sizeof(struct mitsu9550_ctx));
|
||||
|
||||
DL_INIT();
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
|
@ -424,46 +343,15 @@ static int mitsu9550_attach(void *vctx, struct libusb_device_handle *dev, int ty
|
|||
ctx->type == P_MITSU_9810)
|
||||
ctx->is_98xx = 1;
|
||||
|
||||
/* Attempt to open the library */
|
||||
#if defined(WITH_DYNAMIC)
|
||||
if (!ctx->is_98xx) goto skip;
|
||||
|
||||
DEBUG("Attempting to load image processing library\n");
|
||||
ctx->dl_handle = DL_OPEN(LIB_NAME_RE);
|
||||
if (!ctx->dl_handle)
|
||||
WARNING("Image processing library not found, using internal fallback code\n");
|
||||
if (ctx->dl_handle) {
|
||||
ctx->GetAPIVersion = DL_SYM(ctx->dl_handle, "lib70x_getapiversion");
|
||||
if (!ctx->GetAPIVersion) {
|
||||
ERROR("Problem resolving API Version symbol in imaging processing library, too old or not installed?\n");
|
||||
DL_CLOSE(ctx->dl_handle);
|
||||
ctx->dl_handle = NULL;
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
if (ctx->GetAPIVersion() != REQUIRED_LIB_APIVERSION) {
|
||||
ERROR("Image processing library API version mismatch!\n");
|
||||
DL_CLOSE(ctx->dl_handle);
|
||||
ctx->dl_handle = NULL;
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
|
||||
ctx->Get3DColorTable = DL_SYM(ctx->dl_handle, "CColorConv3D_Get3DColorTable");
|
||||
ctx->Load3DColorTable = DL_SYM(ctx->dl_handle, "CColorConv3D_Load3DColorTable");
|
||||
ctx->Destroy3DColorTable = DL_SYM(ctx->dl_handle, "CColorConv3D_Destroy3DColorTable");
|
||||
ctx->DoColorConv = DL_SYM(ctx->dl_handle, "CColorConv3D_DoColorConv");
|
||||
if (!ctx->Get3DColorTable || !ctx->Load3DColorTable ||
|
||||
!ctx->Destroy3DColorTable || !ctx->DoColorConv ) {
|
||||
ERROR("Problem resolving symbols in imaging processing library\n");
|
||||
DL_CLOSE(ctx->dl_handle);
|
||||
ctx->dl_handle = NULL;
|
||||
return CUPS_BACKEND_FAILED;
|
||||
} else {
|
||||
DEBUG("Image processing library successfully loaded\n");
|
||||
}
|
||||
}
|
||||
skip:
|
||||
#if defined(WITH_DYNAMIC)
|
||||
/* Attempt to open the library */
|
||||
if (mitsu_loadlib(&ctx->lib, ctx->type))
|
||||
return CUPS_BACKEND_FAILED;
|
||||
#else
|
||||
WARNING("Dynamic library support not enabled, using internal fallback code\n");
|
||||
#endif
|
||||
|
||||
skip:
|
||||
if (test_mode < TEST_MODE_NOATTACH) {
|
||||
if (mitsu9550_get_status(ctx, (uint8_t*) &media, 0, 0, 1))
|
||||
return CUPS_BACKEND_FAILED;
|
||||
|
@ -502,13 +390,10 @@ static void mitsu9550_teardown(void *vctx) {
|
|||
if (!ctx)
|
||||
return;
|
||||
|
||||
if (ctx->dl_handle) {
|
||||
if (ctx->lut)
|
||||
ctx->Destroy3DColorTable(ctx->lut);
|
||||
if (ctx->m98xxdata)
|
||||
free(ctx->m98xxdata);
|
||||
DL_CLOSE(ctx->dl_handle);
|
||||
}
|
||||
if (ctx->m98xxdata)
|
||||
free(ctx->m98xxdata);
|
||||
|
||||
mitsu_destroylib(&ctx->lib);
|
||||
|
||||
free(ctx);
|
||||
}
|
||||
|
@ -796,38 +681,15 @@ hdr_done:
|
|||
|
||||
/* Apply LUT, if job calls for it.. */
|
||||
if (ctx->is_98xx && !job->is_raw && job->hdr2.unkc[9]) {
|
||||
|
||||
if (!ctx->dl_handle) {
|
||||
// XXXFALLBACK write fallback code?
|
||||
ERROR("!!! Image Processing Library not found, aborting!\n");
|
||||
int ret = mitsu_apply3dlut(&ctx->lib, MITSU_M98xx_LUT_FILE,
|
||||
job->databuf + sizeof(struct mitsu9550_plane),
|
||||
job->cols, job->rows,
|
||||
job->cols * 3, COLORCONV_BGR);
|
||||
if (ret) {
|
||||
mitsu9550_cleanup_job(job);
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!ctx->lut) {
|
||||
uint8_t *lbuf = malloc(LUT_LEN);
|
||||
if (!lbuf) {
|
||||
ERROR("Memory allocation failure!\n");
|
||||
mitsu9550_cleanup_job(job);
|
||||
return CUPS_BACKEND_RETRY_CURRENT;
|
||||
}
|
||||
if (ctx->Get3DColorTable(lbuf, MITSU_M98xx_LUT_FILE)) {
|
||||
ERROR("Unable to open LUT file '%s'\n", MITSU_M98xx_LUT_FILE);
|
||||
mitsu9550_cleanup_job(job);
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
}
|
||||
ctx->lut = ctx->Load3DColorTable(lbuf);
|
||||
free(lbuf);
|
||||
if (!ctx->lut) {
|
||||
ERROR("Unable to parse LUT\n");
|
||||
mitsu9550_cleanup_job(job);
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG("Running print data through 3D LUT\n");
|
||||
ctx->DoColorConv(ctx->lut, job->databuf + sizeof(struct mitsu9550_plane),
|
||||
job->cols, job->rows, job->cols * 3, COLORCONV_BGR);
|
||||
job->hdr2.unkc[9] = 0;
|
||||
}
|
||||
|
||||
|
@ -1675,7 +1537,7 @@ static const char *mitsu9550_prefixes[] = {
|
|||
/* Exported */
|
||||
struct dyesub_backend mitsu9550_backend = {
|
||||
.name = "Mitsubishi CP9xxx family",
|
||||
.version = "0.49",
|
||||
.version = "0.50" " (lib " LIBMITSU_VER ")",
|
||||
.uri_prefixes = mitsu9550_prefixes,
|
||||
.cmdline_usage = mitsu9550_cmdline,
|
||||
.cmdline_arg = mitsu9550_cmdline_arg,
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#define BACKEND mitsud90_backend
|
||||
|
||||
#include "backend_common.h"
|
||||
#include "backend_mitsu.h"
|
||||
|
||||
#define USB_VID_MITSU 0x06D3
|
||||
#define USB_PID_MITSU_D90 0x3B60
|
||||
|
@ -411,7 +412,7 @@ static void mitsud90_dump_status(struct mitsud90_status_resp *resp)
|
|||
/* Private data structure */
|
||||
struct mitsud90_printjob {
|
||||
uint8_t *databuf;
|
||||
int datalen;
|
||||
uint32_t datalen;
|
||||
int copies;
|
||||
};
|
||||
|
||||
|
@ -1311,7 +1312,7 @@ static const char *mitsud90_prefixes[] = {
|
|||
/* Exported */
|
||||
struct dyesub_backend mitsud90_backend = {
|
||||
.name = "Mitsubishi CP-D90DW",
|
||||
.version = "0.17",
|
||||
.version = "0.17" " (lib " LIBMITSU_VER ")",
|
||||
.uri_prefixes = mitsud90_prefixes,
|
||||
.cmdline_arg = mitsud90_cmdline_arg,
|
||||
.cmdline_usage = mitsud90_cmdline,
|
||||
|
@ -1742,43 +1743,19 @@ done_free:
|
|||
|
||||
static int cpm1_fillmatte(struct mitsud90_printjob *job)
|
||||
{
|
||||
int fd, i, j;
|
||||
int ret;
|
||||
|
||||
struct mitsud90_job_hdr *hdr = (struct mitsud90_job_hdr *) job->databuf;
|
||||
|
||||
DEBUG("Reading %d bytes of matte data from disk (%d/%d)\n", be16_to_cpu(hdr->cols) * be16_to_cpu(hdr->rows), be16_to_cpu(hdr->cols), LAMINATE_STRIDE);
|
||||
fd = open(MITSU_CPM1_LAMINATE_FILE, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
WARNING("Unable to open matte lamination data file '%s'\n", MITSU_CPM1_LAMINATE_FILE);
|
||||
hdr->overcoat = 0;
|
||||
goto done;
|
||||
}
|
||||
|
||||
// XXX fill out lamination header?
|
||||
ret = mitsu_readlamdata(MITSU_CPM1_LAMINATE_FILE, LAMINATE_STRIDE,
|
||||
job->databuf, &job->datalen,
|
||||
be16_to_cpu(hdr->rows), be16_to_cpu(hdr->cols), 1);
|
||||
|
||||
/* Read in the matte data */
|
||||
for (j = 0; j < be16_to_cpu(hdr->rows) ; j++) {
|
||||
int remain = LAMINATE_STRIDE;
|
||||
|
||||
/* Read in one row at a time */
|
||||
while(remain) {
|
||||
i = read(fd, job->databuf + job->datalen, remain);
|
||||
if (i < 0)
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
if (i == 0) {
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
continue;
|
||||
}
|
||||
job->datalen += i;
|
||||
remain -= i;
|
||||
}
|
||||
/* Back off the buffer so we "wrap" on the row. */
|
||||
job->datalen -= (LAMINATE_STRIDE - be16_to_cpu(hdr->cols));
|
||||
}
|
||||
/* All done */
|
||||
close(fd);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
// XXX fill out footer?
|
||||
|
||||
done:
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue