diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2020-02-05 13:22:26 -0500 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2020-02-05 18:50:58 -0500 |
commit | 8c576b13b2c1d511a5bb046e0e20837601ec90ba (patch) | |
tree | 08467f1d4e5aac25671ef2e788b3a6078d499e6d /backend_mitsu.c | |
parent | 9d8ad9b05cdb78a5bff974ff4e9d1fcce03ec454 (diff) | |
download | selphy_print-8c576b13b2c1d511a5bb046e0e20837601ec90ba.tar.gz selphy_print-8c576b13b2c1d511a5bb046e0e20837601ec90ba.tar.bz2 selphy_print-8c576b13b2c1d511a5bb046e0e20837601ec90ba.zip |
Mitsubishi: Start pulling common code into a separate code module.
Diffstat (limited to 'backend_mitsu.c')
-rw-r--r-- | backend_mitsu.c | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/backend_mitsu.c b/backend_mitsu.c new file mode 100644 index 0000000..bcc8cfa --- /dev/null +++ b/backend_mitsu.c @@ -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; +} |