diff --git a/Makefile.in b/Makefile.in index edea19f..489d0b6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -92,6 +92,7 @@ OBJS = \ lprint.o \ lprint-brother.o \ lprint-common.o \ + lprint-cpcl.o \ lprint-dymo.o \ lprint-epl2.o \ lprint-sii.o \ @@ -193,6 +194,7 @@ resheaders: $(OBJS) $(TESTOBJS): config.h lprint.h Makefile lprint.o: \ lprint-brother.h \ + lprint-cpcl.h \ lprint-dymo.h \ lprint-epl2.h \ lprint-sii.h \ diff --git a/README.md b/README.md index 0f1670c..10a28b0 100644 --- a/README.md +++ b/README.md @@ -49,12 +49,10 @@ The following printers are currently supported: - Zebra/Eltron EPL2 printers - Zebra ZPL printers -Additional drivers for Brother PT/QL, Zebra CPCL, Zebra/Eltron EPL1, and -Intellitech Intellibar (PCL) printers can be enabled using the -`--enable-experimental` configure option, however they are untested and/or -not fully functional. - -Others will be added as time and access to printers permits. +Additional drivers for Brother PT/QL and Zebra CPCL printers can be enabled +using the `--enable-experimental` configure option, however they are untested +and/or not fully functional. Other label printers will be added as time and +access to printers permits. Standards diff --git a/lprint-brother.c b/lprint-brother.c index be9c785..635e9a8 100644 --- a/lprint-brother.c +++ b/lprint-brother.c @@ -1,5 +1,5 @@ // -// Brother driver for LPrint, a Label Printer Application +// Experimental Brother driver for LPrint, a Label Printer Application // // Copyright © 2023-2024 by Michael R Sweet. // diff --git a/lprint-brother.h b/lprint-brother.h index dbeb72b..a23c724 100644 --- a/lprint-brother.h +++ b/lprint-brother.h @@ -1,7 +1,7 @@ // -// Brother driver table for LPrint, a Label Printer Application +// Experimental Brother driver table for LPrint, a Label Printer Application // -// Copyright © 2023 by Michael R Sweet. +// Copyright © 2023-2024 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. diff --git a/lprint-cpcl.c b/lprint-cpcl.c index 571202c..7ae807a 100644 --- a/lprint-cpcl.c +++ b/lprint-cpcl.c @@ -1,17 +1,24 @@ // -// UNIMPLEMENTED CPCL driver for LPrint, a Label Printer Application +// Experimental CPCL driver for LPrint, a Label Printer Application // -// Copyright © 2019 by Michael R Sweet. +// Copyright © 2019-2024 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // +#include "lprint.h" +#ifdef LPRINT_EXPERIMENTAL + + // -// Include necessary headers... +// Local types... // -#include "lprint.h" +typedef struct lprint_cpcl_s // CPCL driver data +{ + lprint_dither_t dither; // Dither buffer +} lprint_cpcl_t; // @@ -37,8 +44,8 @@ static const char * const lprint_cpcl_media[] = "oe_2x4-label_2x4in", "oe_2x5.5-label_2x5.5in", - "oe_2.25x0.5-label_2.25xin", - "oe_2.25x1.25-label_2.25xin", + "oe_2.25x0.5-label_2.25x0.5in", + "oe_2.25x1.25-label_2.25x1.25in", "oe_30859-paint-can-label_2.25x3.125in", "oe_2.25x4-label_2.25x4in", "oe_2.25x5.5-label_2.25x5.5in", @@ -75,25 +82,7 @@ static const char * const lprint_cpcl_media[] = "oe_4x6.5-label_4x6.5in", "oe_4x13-label_4x13in", - "oe_6x1-label_6x1in", - "oe_6x2-label_6x2in", - "oe_6x3-label_6x3in", - "oe_6x4-label_6x4in", - "oe_6x5-label_6x5in", - "oe_6x6-label_6x6in", - "oe_6x6.5-label_6x6.5in", - "oe_6x13-label_6x13in", - - "oe_8x1-label_8x1in", - "oe_8x2-label_8x2in", - "oe_8x3-label_8x3in", - "oe_8x4-label_8x4in", - "oe_8x5-label_8x5in", - "oe_8x6-label_8x6in", - "oe_8x6.5-label_8x6.5in", - "oe_8x13-label_8x13in", - - "roll_max_8x100in", + "roll_max_4x50in", "roll_min_1.25x0.25in" }; @@ -102,56 +91,301 @@ static const char * const lprint_cpcl_media[] = // Local functions... // -static int lprint_cpcl_print(lprint_printer_t *printer, lprint_job_t *job); -static int lprint_cpcl_status(lprint_printer_t *printer); +static bool lprint_cpcl_printfile(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); +static bool lprint_cpcl_rendjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); +static bool lprint_cpcl_rendpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); +static bool lprint_cpcl_rstartjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); +static bool lprint_cpcl_rstartpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); +static bool lprint_cpcl_rwriteline(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned y, const unsigned char *line); +static bool lprint_cpcl_status(pappl_printer_t *printer); // // 'lprintInit()' - Initialize the driver. // -void -lprintInitCPCL( - lprint_driver_t *driver) // I - Driver +bool // O - `true` on success, `false` on error +lprintCPCL( + pappl_system_t *system, // I - System + const char *driver_name,// I - Driver name + const char *device_uri, // I - Device URI + const char *device_id, // I - 1284 device ID + pappl_pr_driver_data_t *data, // I - Pointer to driver data + ipp_t **attrs, // O - Pointer to driver attributes + void *cbdata) // I - Callback data (not used) { - pthread_rwlock_wrlock(&driver->rwlock); + data->printfile_cb = lprint_cpcl_printfile; + data->rendjob_cb = lprint_cpcl_rendjob; + data->rendpage_cb = lprint_cpcl_rendpage; + data->rstartjob_cb = lprint_cpcl_rstartjob; + data->rstartpage_cb = lprint_cpcl_rstartpage; + data->rwriteline_cb = lprint_cpcl_rwriteline; + data->status_cb = lprint_cpcl_status; + data->format = LPRINT_EPL2_MIMETYPE; + + data->num_resolution = 1; + + if (strstr(driver_name, "-203dpi")) + { + data->x_resolution[0] = 203; + data->y_resolution[0] = 203; + } + else + { + data->x_resolution[0] = 300; + data->y_resolution[0] = 300; + } + + data->x_default = data->y_default = data->x_resolution[0]; + + data->finishings |= PAPPL_FINISHINGS_TRIM; + + data->num_media = (int)(sizeof(lprint_cpcl_media) / sizeof(lprint_cpcl_media[0])); + memcpy(data->media, lprint_cpcl_media, sizeof(lprint_cpcl_media)); + + papplCopyString(data->media_ready[0].size_name, "na_index-4x6_4x6in", sizeof(data->media_ready[0].size_name)); + papplCopyString(data->media_ready[0].type, "labels", sizeof(data->media_ready[0].type)); - driver->printfunc = lprint_cpcl_print; - driver->statusfunc = lprint_cpcl_status; - driver->format = "application/vnd.-"; + data->bottom_top = data->left_right = 1; - driver->num_resolution = 1; - driver->x_resolution[0] = 203; - driver->y_resolution[0] = 203; + data->num_source = 1; + data->source[0] = "main-roll"; - driver->num_media = (int)(sizeof(lprint_cpcl_media) / sizeof(lprint_cpcl_media[0])); - memcpy(driver->media, lprint_cpcl_media, sizeof(lprint_cpcl_media)); + data->tracking_supported = PAPPL_MEDIA_TRACKING_MARK | PAPPL_MEDIA_TRACKING_WEB | PAPPL_MEDIA_TRACKING_CONTINUOUS; - driver->num_source = 1; - driver->source[0] = "main-roll"; + data->num_type = 3; + data->type[0] = "continuous"; + data->type[1] = "labels"; + data->type[2] = "labels-continuous"; - driver->num_type = 1; - driver->type[0] = "labels"; + data->tear_offset_configured = 0; + data->tear_offset_supported[0] = -1500; + data->tear_offset_supported[1] = 1500; - driver->num_supply = 0; + data->speed_default = 0; + data->speed_supported[0] = 2540; + data->speed_supported[1] = 4 * 2540; - pthread_rwlock_unlock(&driver->rwlock); + data->darkness_configured = 50; + data->darkness_supported = 30; + + return (true); } // -// 'lprint_cpcl_print()' - Print a file. +// 'lprint_cpcl_printfile()' - Print a file. // -static int // O - 1 on success, 0 on failure -lprint_cpcl_print( - lprint_printer_t *printer, // I - Printer - lprint_job_t *job) // I - Job +static bool // O - `true` on success, `false` on failure +lprint_cpcl_printfile( + pappl_job_t *job, // I - Job + pappl_pr_options_t *options, // I - Job options + pappl_device_t *device) // I - Output device { - (void)printer; - (void)job; - return (1); + int fd; // Input file + ssize_t bytes; // Bytes read/written + char buffer[65536]; // Read/write buffer + + + // Copy the raw file... + papplJobSetImpressions(job, 1); + + if ((fd = open(papplJobGetFilename(job), O_RDONLY)) < 0) + { + papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to open print file '%s': %s", papplJobGetFilename(job), strerror(errno)); + return (false); + } + + // Copy print data... + while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) + { + if (papplDeviceWrite(device, buffer, (size_t)bytes) < 0) + { + papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to send %d bytes to printer.", (int)bytes); + close(fd); + return (false); + } + } + close(fd); + + papplJobSetImpressionsCompleted(job, 1); + + return (true); +} + + +// +// 'lprint_cpcl_rend()' - End a job. +// + +static bool // O - `true` on success, `false` on failure +lprint_cpcl_rendjob( + pappl_job_t *job, // I - Job + pappl_pr_options_t *options, // I - Job options + pappl_device_t *device) // I - Output device +{ + lprint_cpcl_t *cpcl = (lprint_cpcl_t *)papplJobGetData(job); + // CPCL driver data + + (void)options; + (void)device; + + free(cpcl); + papplJobSetData(job, NULL); + + return (true); +} + + +// +// 'lprint_cpcl_rendpage()' - End a page. +// + +static bool // O - `true` on success, `false` on failure +lprint_cpcl_rendpage( + pappl_job_t *job, // I - Job + pappl_pr_options_t *options, // I - Job options + pappl_device_t *device, // I - Output device + unsigned page) // I - Page number +{ + lprint_cpcl_t *cpcl = (lprint_cpcl_t *)papplJobGetData(job); + // CPCL driver data + int darkness; // Composite darkness value + + + (void)page; + + // Write last line + lprint_cpcl_rwriteline(job, options, device, options->header.cupsHeight, NULL); + + // Set options + papplDevicePrintf(device, "PRESENT-AT %d 4\r\n", options->media.top_offset * options->printer_resolution[1] / 2540); + + if ((darkness = options->print_darkness + options->darkness_configured) < 0) + darkness = 0; + else if (darkness > 100) + darkness = 100; + + papplDevicePrintf(device, "TONE %d\r\n", 2 * darkness); + + if (options->print_speed > 0) + papplDevicePrintf(device, "SPEED %d\r\n", 5 * options->print_speed / (4 * 2540)); + + if (options->finishings & PAPPL_FINISHINGS_TRIM) + papplDevicePuts(device, "CUT\r\n"); + + if (options->media.type[0] && strcmp(options->media.type, "labels")) + { + // Continuous media, so always set tracking to continuous... + options->media.tracking = PAPPL_MEDIA_TRACKING_CONTINUOUS; + } + + if (options->media.tracking != PAPPL_MEDIA_TRACKING_CONTINUOUS) + papplDevicePuts(device, "FORM\r\n"); + + // Eject + papplDevicePuts(device, "PRINT\r\n"); + papplDeviceFlush(device); + + // Free memory and return... + lprintDitherFree(&cpcl->dither); + + return (true); +} + + +// +// 'lprint_cpcl_rstartjob()' - Start a job. +// + +static bool // O - `true` on success, `false` on failure +lprint_cpcl_rstartjob( + pappl_job_t *job, // I - Job + pappl_pr_options_t *options, // I - Job options + pappl_device_t *device) // I - Output device +{ + lprint_cpcl_t *cpcl = (lprint_cpcl_t *)calloc(1, sizeof(lprint_cpcl_t)); + // CPCL driver data + + + (void)options; + (void)device; + + // Save driver data... + papplJobSetData(job, cpcl); + + return (true); +} + + +// +// 'lprint_cpcl_rstartpage()' - Start a page. +// + +static bool // O - `true` on success, `false` on failure +lprint_cpcl_rstartpage( + pappl_job_t *job, // I - Job + pappl_pr_options_t *options, // I - Job options + pappl_device_t *device, // I - Output device + unsigned page) // I - Page number +{ + lprint_cpcl_t *cpcl = (lprint_cpcl_t *)papplJobGetData(job); + // CPCL driver data + + + (void)page; + + // Initialize the dither buffer... + if (!lprintDitherAlloc(&cpcl->dither, job, options, CUPS_CSPACE_W, options->header.HWResolution[0] == 300 ? 1.2 : 1.0)) + return (false); + + // Initialize the printer... + papplDevicePrintf(device, "! 0 %u %u %u %u\r\n", options->header.HWResolution[0], options->header.HWResolution[1], options->header.cupsHeight, options->header.NumCopies); + papplDevicePrintf(device, "PAGE-WIDTH %u\r\n", options->header.cupsWidth); + papplDevicePrintf(device, "PAGE-HEIGHT %u\r\n", options->header.cupsHeight); + + + // Start the page image... + papplDevicePuts(device, "CLS\n"); + papplDevicePrintf(device, "BITMAP 0,0,%u,%u,1,", cpcl->dither.out_width, options->header.cupsHeight); + + return (true); +} + + +// +// 'lprint_cpcl_rwriteline()' - Write a raster line. +// + +static bool // O - `true` on success, `false` on failure +lprint_cpcl_rwriteline( + pappl_job_t *job, // I - Job + pappl_pr_options_t *options, // I - Job options + pappl_device_t *device, // I - Output device + unsigned y, // I - Line number + const unsigned char *line) // I - Line +{ + lprint_cpcl_t *cpcl = (lprint_cpcl_t *)papplJobGetData(job); + // CPCL driver data + + + (void)options; + + // Dither and write the line... + if (lprintDitherLine(&cpcl->dither, y, line)) + { + if (cpcl->dither.output[0] || memcmp(cpcl->dither.output, cpcl->dither.output + 1, cpcl->dither.out_width - 1)) + { + papplDevicePrintf(device, "CG %u 1 0 %d ", (unsigned)cpcl->dither.out_width, y); + papplDeviceWrite(device, cpcl->dither.output, cpcl->dither.out_width); + papplDevicePuts(device, "\r\n"); + papplDeviceFlush(device); + } + } + + return (true); } @@ -159,11 +393,12 @@ lprint_cpcl_print( // 'lprint_cpcl_status()' - Get current printer status. // -static int // O - 1 on success, 0 on failure +static bool // O - `true` on success, `false` on failure lprint_cpcl_status( - lprint_printer_t *printer) // I - Printer + pappl_printer_t *printer) // I - Printer { (void)printer; - return (1); + return (true); } +#endif // LPRINT_EXPERIMENTAL diff --git a/lprint-cpcl.h b/lprint-cpcl.h new file mode 100644 index 0000000..dad1ea7 --- /dev/null +++ b/lprint-cpcl.h @@ -0,0 +1,11 @@ +// +// Experimental CPCL driver table for LPrint, a Label Printer Application +// +// Copyright © 2024 by Michael R Sweet. +// +// Licensed under Apache License v2.0. See the file "LICENSE" for more +// information. +// + +{ "cpcl-203dpi", "CPCL Label Printer", + "", NULL }, diff --git a/lprint-epl1.c b/lprint-epl1.c deleted file mode 100644 index 97c0f51..0000000 --- a/lprint-epl1.c +++ /dev/null @@ -1,169 +0,0 @@ -// -// UNIMPLEMENTED EPL1 driver for LPrint, a Label Printer Application -// -// Copyright © 2019 by Michael R Sweet. -// -// Licensed under Apache License v2.0. See the file "LICENSE" for more -// information. -// - -// -// Include necessary headers... -// - -#include "lprint.h" - - -// -// Local globals... -// - -static const char * const lprint_epl1_media[] = -{ // Supported media sizes - "oe_1.25x0.25-label_1.25x0.25in", - "oe_1.25x2.25-label_1.25x2.25in", - - "oe_1.5x0.25-label_1.5x0.25in", - "oe_1.5x0.5-label_1.5x0.5in", - "oe_1.5x1-label_1.5x1in", - "oe_1.5x2-label_1.5x2in", - - "oe_2x0.37-label_2x0.37in", - "oe_2x0.5-label_2x0.5in", - "oe_2x1-label_2x1in", - "oe_2x1.25-label_2x1.25in", - "oe_2x2-label_2x2in", - "oe_2x3-label_2x3in", - "oe_2x4-label_2x4in", - "oe_2x5.5-label_2x5.5in", - - "oe_2.25x0.5-label_2.25xin", - "oe_2.25x1.25-label_2.25xin", - "oe_30859-paint-can-label_2.25x3.125in", - "oe_2.25x4-label_2.25x4in", - "oe_2.25x5.5-label_2.25x5.5in", - - "oe_2.38x5.5-label_2.38x5.5in", - - "oe_2.5x1-label_2.5x1in", - "oe_2.5x2-label_2.5x2in", - - "oe_2.75x1.25-label_2.75x1.25in", - - "oe_2.9x1-label_2.9x1in", - - "oe_3x1-label_3x1in", - "oe_3x1.25-label_3x1.25in", - "oe_3x2-label_3x2in", - "oe_3x3-label_3x3in", - "oe_3x5-label_3x5in", - - "oe_3.25x2-label_3.25x2in", - "oe_3.25x5-label_3.25x5in", - "oe_3.25x5.5-label_3.25x5.5in", - "oe_3.25x5.83-label_3.25x5.83in", - "oe_3.25x7.83-label_3.25x7.83in", - - "oe_3.5x1-label_3.5x1in", - - "oe_4x1-label_4x1in", - "oe_4x2-label_4x2in", - "oe_4x3-label_4x3in", - "oe_4x4-label_4x4in", - "oe_4x5-label_4x5in", - "oe_4x6-label_4x6in", - "oe_4x6.5-label_4x6.5in", - "oe_4x13-label_4x13in", - - "oe_6x1-label_6x1in", - "oe_6x2-label_6x2in", - "oe_6x3-label_6x3in", - "oe_6x4-label_6x4in", - "oe_6x5-label_6x5in", - "oe_6x6-label_6x6in", - "oe_6x6.5-label_6x6.5in", - "oe_6x13-label_6x13in", - - "oe_8x1-label_8x1in", - "oe_8x2-label_8x2in", - "oe_8x3-label_8x3in", - "oe_8x4-label_8x4in", - "oe_8x5-label_8x5in", - "oe_8x6-label_8x6in", - "oe_8x6.5-label_8x6.5in", - "oe_8x13-label_8x13in", - - "roll_max_8x100in", - "roll_min_1.25x0.25in" -}; - - -// -// Local functions... -// - -static int lprint_epl1_print(lprint_printer_t *printer, lprint_job_t *job); -static int lprint_epl1_status(lprint_printer_t *printer); - - -// -// 'lprintInitEPL1()' - Initialize the driver. -// - -void -lprintInitEPL1( - lprint_driver_t *driver) // I - Driver -{ - pthread_rwlock_wrlock(&driver->rwlock); - - driver->printfunc = lprint_epl1_print; - driver->statusfunc = lprint_epl1_status; - driver->format = "application/vnd.-"; - - driver->num_resolution = 1; - driver->x_resolution[0] = 203; - driver->y_resolution[0] = 203; - - driver->num_media = (int)(sizeof(lprint_epl1_media) / sizeof(lprint_epl1_media[0])); - memcpy(driver->media, lprint_epl1_media, sizeof(lprint_epl1_media)); - - driver->num_source = 1; - driver->source[0] = "main-roll"; - - driver->num_type = 1; - driver->type[0] = "labels"; - - driver->num_supply = 0; - - pthread_rwlock_unlock(&driver->rwlock); -} - - -// -// 'lprint_epl1_print()' - Print a file. -// - -static int // O - 1 on success, 0 on failure -lprint_epl1_print( - lprint_printer_t *printer, // I - Printer - lprint_job_t *job) // I - Job -{ - (void)printer; - (void)job; - - return (1); -} - - -// -// 'lprint_epl1_status()' - Get current printer status. -// - -static int // O - 1 on success, 0 on failure -lprint_epl1_status( - lprint_printer_t *printer) // I - Printer -{ - (void)printer; - - return (1); -} diff --git a/lprint-fgl.c b/lprint-fgl.c deleted file mode 100644 index 7d24f0a..0000000 --- a/lprint-fgl.c +++ /dev/null @@ -1,169 +0,0 @@ -// -// UNIMPLEMENTED FGL driver for LPrint, a Label Printer Application -// -// Copyright © 2019 by Michael R Sweet. -// -// Licensed under Apache License v2.0. See the file "LICENSE" for more -// information. -// - -// -// Include necessary headers... -// - -#include "lprint.h" - - -// -// Local globals... -// - -static const char * const lprint_fgl_media[] = -{ // Supported media sizes - "oe_1.25x0.25-label_1.25x0.25in", - "oe_1.25x2.25-label_1.25x2.25in", - - "oe_1.5x0.25-label_1.5x0.25in", - "oe_1.5x0.5-label_1.5x0.5in", - "oe_1.5x1-label_1.5x1in", - "oe_1.5x2-label_1.5x2in", - - "oe_2x0.37-label_2x0.37in", - "oe_2x0.5-label_2x0.5in", - "oe_2x1-label_2x1in", - "oe_2x1.25-label_2x1.25in", - "oe_2x2-label_2x2in", - "oe_2x3-label_2x3in", - "oe_2x4-label_2x4in", - "oe_2x5.5-label_2x5.5in", - - "oe_2.25x0.5-label_2.25xin", - "oe_2.25x1.25-label_2.25xin", - "oe_30859-paint-can-label_2.25x3.125in", - "oe_2.25x4-label_2.25x4in", - "oe_2.25x5.5-label_2.25x5.5in", - - "oe_2.38x5.5-label_2.38x5.5in", - - "oe_2.5x1-label_2.5x1in", - "oe_2.5x2-label_2.5x2in", - - "oe_2.75x1.25-label_2.75x1.25in", - - "oe_2.9x1-label_2.9x1in", - - "oe_3x1-label_3x1in", - "oe_3x1.25-label_3x1.25in", - "oe_3x2-label_3x2in", - "oe_3x3-label_3x3in", - "oe_3x5-label_3x5in", - - "oe_3.25x2-label_3.25x2in", - "oe_3.25x5-label_3.25x5in", - "oe_3.25x5.5-label_3.25x5.5in", - "oe_3.25x5.83-label_3.25x5.83in", - "oe_3.25x7.83-label_3.25x7.83in", - - "oe_3.5x1-label_3.5x1in", - - "oe_4x1-label_4x1in", - "oe_4x2-label_4x2in", - "oe_4x3-label_4x3in", - "oe_4x4-label_4x4in", - "oe_4x5-label_4x5in", - "oe_4x6-label_4x6in", - "oe_4x6.5-label_4x6.5in", - "oe_4x13-label_4x13in", - - "oe_6x1-label_6x1in", - "oe_6x2-label_6x2in", - "oe_6x3-label_6x3in", - "oe_6x4-label_6x4in", - "oe_6x5-label_6x5in", - "oe_6x6-label_6x6in", - "oe_6x6.5-label_6x6.5in", - "oe_6x13-label_6x13in", - - "oe_8x1-label_8x1in", - "oe_8x2-label_8x2in", - "oe_8x3-label_8x3in", - "oe_8x4-label_8x4in", - "oe_8x5-label_8x5in", - "oe_8x6-label_8x6in", - "oe_8x6.5-label_8x6.5in", - "oe_8x13-label_8x13in", - - "roll_max_8x100in", - "roll_min_1.25x0.25in" -}; - - -// -// Local functions... -// - -static int lprint_fgl_print(lprint_printer_t *printer, lprint_job_t *job); -static int lprint_fgl_status(lprint_printer_t *printer); - - -// -// 'lprintInitFGL()' - Initialize the driver. -// - -void -lprintInitFGL( - lprint_driver_t *driver) // I - Driver -{ - pthread_rwlock_wrlock(&driver->rwlock); - - driver->printfunc = lprint_fgl_print; - driver->statusfunc = lprint_fgl_status; - driver->format = "application/vnd.-"; - - driver->num_resolution = 1; - driver->x_resolution[0] = 203; - driver->y_resolution[0] = 203; - - driver->num_media = (int)(sizeof(lprint_fgl_media) / sizeof(lprint_fgl_media[0])); - memcpy(driver->media, lprint_fgl_media, sizeof(lprint_fgl_media)); - - driver->num_source = 1; - driver->source[0] = "main-roll"; - - driver->num_type = 1; - driver->type[0] = "labels"; - - driver->num_supply = 0; - - pthread_rwlock_unlock(&driver->rwlock); -} - - -// -// 'lprint_fgl_print()' - Print a file. -// - -static int // O - 1 on success, 0 on failure -lprint_fgl_print( - lprint_printer_t *printer, // I - Printer - lprint_job_t *job) // I - Job -{ - (void)printer; - (void)job; - - return (1); -} - - -// -// 'lprint_fgl_status()' - Get current printer status. -// - -static int // O - 1 on success, 0 on failure -lprint_fgl_status( - lprint_printer_t *printer) // I - Printer -{ - (void)printer; - - return (1); -} diff --git a/lprint-pcl.c b/lprint-pcl.c deleted file mode 100644 index 529cc34..0000000 --- a/lprint-pcl.c +++ /dev/null @@ -1,169 +0,0 @@ -// -// UNIMPLEMENTED PCL driver for LPrint, a Label Printer Application -// -// Copyright © 2019 by Michael R Sweet. -// -// Licensed under Apache License v2.0. See the file "LICENSE" for more -// information. -// - -// -// Include necessary headers... -// - -#include "lprint.h" - - -// -// Local globals... -// - -static const char * const lprint_pcl_media[] = -{ // Supported media sizes - "oe_1.25x0.25-label_1.25x0.25in", - "oe_1.25x2.25-label_1.25x2.25in", - - "oe_1.5x0.25-label_1.5x0.25in", - "oe_1.5x0.5-label_1.5x0.5in", - "oe_1.5x1-label_1.5x1in", - "oe_1.5x2-label_1.5x2in", - - "oe_2x0.37-label_2x0.37in", - "oe_2x0.5-label_2x0.5in", - "oe_2x1-label_2x1in", - "oe_2x1.25-label_2x1.25in", - "oe_2x2-label_2x2in", - "oe_2x3-label_2x3in", - "oe_2x4-label_2x4in", - "oe_2x5.5-label_2x5.5in", - - "oe_2.25x0.5-label_2.25xin", - "oe_2.25x1.25-label_2.25xin", - "oe_30859-paint-can-label_2.25x3.125in", - "oe_2.25x4-label_2.25x4in", - "oe_2.25x5.5-label_2.25x5.5in", - - "oe_2.38x5.5-label_2.38x5.5in", - - "oe_2.5x1-label_2.5x1in", - "oe_2.5x2-label_2.5x2in", - - "oe_2.75x1.25-label_2.75x1.25in", - - "oe_2.9x1-label_2.9x1in", - - "oe_3x1-label_3x1in", - "oe_3x1.25-label_3x1.25in", - "oe_3x2-label_3x2in", - "oe_3x3-label_3x3in", - "oe_3x5-label_3x5in", - - "oe_3.25x2-label_3.25x2in", - "oe_3.25x5-label_3.25x5in", - "oe_3.25x5.5-label_3.25x5.5in", - "oe_3.25x5.83-label_3.25x5.83in", - "oe_3.25x7.83-label_3.25x7.83in", - - "oe_3.5x1-label_3.5x1in", - - "oe_4x1-label_4x1in", - "oe_4x2-label_4x2in", - "oe_4x3-label_4x3in", - "oe_4x4-label_4x4in", - "oe_4x5-label_4x5in", - "oe_4x6-label_4x6in", - "oe_4x6.5-label_4x6.5in", - "oe_4x13-label_4x13in", - - "oe_6x1-label_6x1in", - "oe_6x2-label_6x2in", - "oe_6x3-label_6x3in", - "oe_6x4-label_6x4in", - "oe_6x5-label_6x5in", - "oe_6x6-label_6x6in", - "oe_6x6.5-label_6x6.5in", - "oe_6x13-label_6x13in", - - "oe_8x1-label_8x1in", - "oe_8x2-label_8x2in", - "oe_8x3-label_8x3in", - "oe_8x4-label_8x4in", - "oe_8x5-label_8x5in", - "oe_8x6-label_8x6in", - "oe_8x6.5-label_8x6.5in", - "oe_8x13-label_8x13in", - - "roll_max_8x100in", - "roll_min_1.25x0.25in" -}; - - -// -// Local functions... -// - -static int lprint_pcl_print(lprint_printer_t *printer, lprint_job_t *job); -static int lprint_pcl_status(lprint_printer_t *printer); - - -// -// 'lprintInitPCL()' - Initialize the driver. -// - -void -lprintInitPCL( - lprint_driver_t *driver) // I - Driver -{ - pthread_rwlock_wrlock(&driver->rwlock); - - driver->printfunc = lprint_pcl_print; - driver->statusfunc = lprint_pcl_status; - driver->format = "application/vnd.-"; - - driver->num_resolution = 1; - driver->x_resolution[0] = 203; - driver->y_resolution[0] = 203; - - driver->num_media = (int)(sizeof(lprint_pcl_media) / sizeof(lprint_pcl_media[0])); - memcpy(driver->media, lprint_pcl_media, sizeof(lprint_pcl_media)); - - driver->num_source = 1; - driver->source[0] = "main-roll"; - - driver->num_type = 1; - driver->type[0] = "labels"; - - driver->num_supply = 0; - - pthread_rwlock_unlock(&driver->rwlock); -} - - -// -// 'lprint_pcl_print()' - Print a file. -// - -static int // O - 1 on success, 0 on failure -lprint_pcl_print( - lprint_printer_t *printer, // I - Printer - lprint_job_t *job) // I - Job -{ - (void)printer; - (void)job; - - return (1); -} - - -// -// 'lprint_pcl_status()' - Get current printer status. -// - -static int // O - 1 on success, 0 on failure -lprint_pcl_status( - lprint_printer_t *printer) // I - Printer -{ - (void)printer; - - return (1); -} diff --git a/lprint-tspl.c b/lprint-tspl.c index 87ea532..68816c4 100644 --- a/lprint-tspl.c +++ b/lprint-tspl.c @@ -14,7 +14,7 @@ // Local types... // -typedef struct lprint_tspl_s // tspl driver data +typedef struct lprint_tspl_s // TSPL driver data { lprint_dither_t dither; // Dither buffer } lprint_tspl_t; diff --git a/lprint.c b/lprint.c index 42cb4a3..81c542a 100644 --- a/lprint.c +++ b/lprint.c @@ -54,6 +54,7 @@ static pappl_pr_driver_t lprint_drivers[] = { // Driver list #ifdef LPRINT_EXPERIMENTAL # include "lprint-brother.h" +# include "lprint-cpcl.h" #endif // LPRINT_EXPERIMENTAL #include "lprint-dymo.h" #include "lprint-epl2.h" diff --git a/lprint.h b/lprint.h index a458ecf..694876b 100644 --- a/lprint.h +++ b/lprint.h @@ -103,13 +103,12 @@ typedef ipp_copycb_t ipp_copy_cb_t; // Constants... // -# define LPRINT_MAX_CUSTOM 32 - # define LPRINT_TESTPAGE_MIMETYPE "application/vnd.lprint-test" # define LPRINT_TESTPAGE_HEADER "T*E*S*T*P*A*G*E*" # ifdef LPRINT_EXPERIMENTAL # define LPRINT_BROTHER_PT_CBP_MIMETYPE "application/vnd.brother-pt-cbp" +# define LPRINT_CPCL_MIMETYPE "application/vnd.zebra-cpcl" # endif // LPRINT_EXPERIMENTAL # define LPRINT_EPL2_MIMETYPE "application/vnd.eltron-epl" # define LPRINT_SLP_MIMETYPE "application/vnd.sii-slp" @@ -117,6 +116,7 @@ typedef ipp_copycb_t ipp_copy_cb_t; # define LPRINT_ZPL_MIMETYPE "application/vnd.zebra-zpl" + // // Types... // @@ -160,6 +160,7 @@ extern void lprintMediaUpdate(pappl_printer_t *printer, pappl_pr_driver_data_t * # ifdef LPRINT_EXPERIMENTAL extern bool lprintBrother(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *data, ipp_t **attrs, void *cbdata); +extern bool lprintCPCL(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *driver_data, ipp_t **driver_attrs, void *cbdata); # endif // LPRINT_EXPERIMENTAL extern bool lprintDYMO(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *data, ipp_t **attrs, void *cbdata); extern bool lprintEPL2(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *data, ipp_t **attrs, void *cbdata); @@ -170,11 +171,5 @@ extern bool lprintTSPL(pappl_system_t *system, const char *driver_name, const ch extern bool lprintZPL(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *data, ipp_t **attrs, void *cbdata); extern void lprintZPLQueryDriver(pappl_system_t *system, const char *device_uri, char *name, size_t namesize); -// Future planned drivers that are not yet implemented -//extern bool lprintCPCL(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *driver_data, ipp_t **driver_attrs, void *data); -//extern bool lprintEPL1(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *driver_data, ipp_t **driver_attrs, void *data); -//extern bool lprintFGL(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *driver_data, ipp_t **driver_attrs, void *data); -//extern bool lprintPCL(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *driver_data, ipp_t **driver_attrs, void *data); - #endif // !LPRINT_H diff --git a/xcode/config.h b/xcode/config.h index 4dd7089..4f0949a 100644 --- a/xcode/config.h +++ b/xcode/config.h @@ -16,3 +16,4 @@ // Enable experimental drivers? /*#undef LPRINT_EXPERIMENTAL */ +#define LPRINT_EXPERIMENTAL 1 diff --git a/xcode/lprint.xcodeproj/project.pbxproj b/xcode/lprint.xcodeproj/project.pbxproj index 00cdfda..07132e8 100644 --- a/xcode/lprint.xcodeproj/project.pbxproj +++ b/xcode/lprint.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 2715B53325FD7FC200C0BBF6 /* lprint-common.c in Sources */ = {isa = PBXBuildFile; fileRef = 2715B53025FD7FC200C0BBF6 /* lprint-common.c */; }; 2715B53425FD7FC200C0BBF6 /* lprint-dymo.c in Sources */ = {isa = PBXBuildFile; fileRef = 2715B53125FD7FC200C0BBF6 /* lprint-dymo.c */; }; 271DBD422B56EB3A00475159 /* lprint-brother.c in Sources */ = {isa = PBXBuildFile; fileRef = 27712E3D2B12A48B0032AE30 /* lprint-brother.c */; }; + 271DBD472B56ED0D00475159 /* lprint-cpcl.c in Sources */ = {isa = PBXBuildFile; fileRef = 271DBD432B56ED0D00475159 /* lprint-cpcl.c */; }; 272FF1992966330F008C4F4F /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 272FF1982966330F008C4F4F /* Security.framework */; }; 273A4980276BB83B00C3B44E /* lprint-epl2.c in Sources */ = {isa = PBXBuildFile; fileRef = 273A497F276BB83B00C3B44E /* lprint-epl2.c */; }; 273A4982276BCE3100C3B44E /* libjpeg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 273A4981276BCE3100C3B44E /* libjpeg.a */; }; @@ -89,6 +90,8 @@ 2715B52F25FD7FC200C0BBF6 /* lprint-dymo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-dymo.h"; path = "../lprint-dymo.h"; sourceTree = ""; }; 2715B53025FD7FC200C0BBF6 /* lprint-common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "lprint-common.c"; path = "../lprint-common.c"; sourceTree = ""; }; 2715B53125FD7FC200C0BBF6 /* lprint-dymo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "lprint-dymo.c"; path = "../lprint-dymo.c"; sourceTree = ""; }; + 271DBD432B56ED0D00475159 /* lprint-cpcl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "lprint-cpcl.c"; path = "../lprint-cpcl.c"; sourceTree = ""; }; + 271DBD4C2B56EDC000475159 /* lprint-cpcl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-cpcl.h"; path = "../lprint-cpcl.h"; sourceTree = ""; }; 2724350F23A441DB00B318AF /* lprint-default.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-default.1"; path = "../man/lprint-default.1"; sourceTree = ""; }; 2724351023A441DB00B318AF /* lprint-delete.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-delete.1"; path = "../man/lprint-delete.1"; sourceTree = ""; }; 2724351123A441DB00B318AF /* lprint-modify.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-modify.1"; path = "../man/lprint-modify.1"; sourceTree = ""; }; @@ -225,6 +228,8 @@ 27712E3C2B12A48B0032AE30 /* lprint-brother.h */, 27712E3D2B12A48B0032AE30 /* lprint-brother.c */, 2715B53025FD7FC200C0BBF6 /* lprint-common.c */, + 271DBD4C2B56EDC000475159 /* lprint-cpcl.h */, + 271DBD432B56ED0D00475159 /* lprint-cpcl.c */, 2715B52F25FD7FC200C0BBF6 /* lprint-dymo.h */, 2715B53125FD7FC200C0BBF6 /* lprint-dymo.c */, 275C79802770055400BB595D /* lprint-epl2.h */, @@ -409,6 +414,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 271DBD472B56ED0D00475159 /* lprint-cpcl.c in Sources */, 27FBEEE52396988300BB195A /* lprint.c in Sources */, 271DBD422B56EB3A00475159 /* lprint-brother.c in Sources */, 2715B53325FD7FC200C0BBF6 /* lprint-common.c in Sources */,