13bf66744d61d18c66d46f2608de0467ad3df0268Mopria/*
23bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Copyright (C) 2016 The Android Open Source Project
33bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Copyright (C) 2016 Mopria Alliance, Inc.
43bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
53bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
63bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Licensed under the Apache License, Version 2.0 (the "License");
73bf66744d61d18c66d46f2608de0467ad3df0268Mopria * you may not use this file except in compliance with the License.
83bf66744d61d18c66d46f2608de0467ad3df0268Mopria * You may obtain a copy of the License at
93bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
103bf66744d61d18c66d46f2608de0467ad3df0268Mopria *      http://www.apache.org/licenses/LICENSE-2.0
113bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
123bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Unless required by applicable law or agreed to in writing, software
133bf66744d61d18c66d46f2608de0467ad3df0268Mopria * distributed under the License is distributed on an "AS IS" BASIS,
143bf66744d61d18c66d46f2608de0467ad3df0268Mopria * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153bf66744d61d18c66d46f2608de0467ad3df0268Mopria * See the License for the specific language governing permissions and
163bf66744d61d18c66d46f2608de0467ad3df0268Mopria * limitations under the License.
173bf66744d61d18c66d46f2608de0467ad3df0268Mopria */
183bf66744d61d18c66d46f2608de0467ad3df0268Mopria
193bf66744d61d18c66d46f2608de0467ad3df0268Mopria#ifndef __LIB_PCL_H__
203bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define __LIB_PCL_H__
213bf66744d61d18c66d46f2608de0467ad3df0268Mopria
223bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include "ifc_print_job.h"
233bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include "ifc_wprint.h"
243bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include "lib_wprint.h"
253bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include "lib_pclm.h"
263bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include "common_defines.h"
273bf66744d61d18c66d46f2608de0467ad3df0268Mopria
283bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define _WJOBH_NONE  0
293bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define STANDARD_SCALE_FOR_PDF    72.0
303bf66744d61d18c66d46f2608de0467ad3df0268Mopria
313bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define SP_GRAY(Yr, Cbg, Crb) (((Yr<<6) + (Cbg*160) + (Crb<<5)) >> 8)
323bf66744d61d18c66d46f2608de0467ad3df0268Mopria
333bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define _START_JOB(JOB_INFO, EXT) \
343bf66744d61d18c66d46f2608de0467ad3df0268Mopria{ \
353bf66744d61d18c66d46f2608de0467ad3df0268Mopria    const ifc_wprint_debug_stream_t* debug_ifc = \
363bf66744d61d18c66d46f2608de0467ad3df0268Mopria        JOB_INFO->wprint_ifc->get_debug_stream_ifc(JOB_INFO->job_handle); \
373bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (debug_ifc) { \
383bf66744d61d18c66d46f2608de0467ad3df0268Mopria        debug_ifc->debug_start_job(JOB_INFO->job_handle, EXT); \
393bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } \
403bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
413bf66744d61d18c66d46f2608de0467ad3df0268Mopria
423bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define _START_PAGE(JOB_INFO, WIDTH, HEIGHT) \
433bf66744d61d18c66d46f2608de0467ad3df0268Mopria{ \
443bf66744d61d18c66d46f2608de0467ad3df0268Mopria    const ifc_wprint_debug_stream_t* debug_ifc = \
453bf66744d61d18c66d46f2608de0467ad3df0268Mopria        JOB_INFO->wprint_ifc->get_debug_stream_ifc(JOB_INFO->job_handle); \
463bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (debug_ifc) { \
473bf66744d61d18c66d46f2608de0467ad3df0268Mopria        debug_ifc->debug_start_page(JOB_INFO->job_handle, JOB_INFO->page_number + 1, WIDTH, \
483bf66744d61d18c66d46f2608de0467ad3df0268Mopria            HEIGHT); \
493bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } \
503bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
513bf66744d61d18c66d46f2608de0467ad3df0268Mopria
523bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define _PAGE_DATA(JOB_INFO, BUFF, LEN) \
533bf66744d61d18c66d46f2608de0467ad3df0268Mopria{ \
543bf66744d61d18c66d46f2608de0467ad3df0268Mopria    const ifc_wprint_debug_stream_t* debug_ifc = \
553bf66744d61d18c66d46f2608de0467ad3df0268Mopria        JOB_INFO->wprint_ifc->get_debug_stream_ifc(JOB_INFO->job_handle); \
563bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (debug_ifc) { \
573bf66744d61d18c66d46f2608de0467ad3df0268Mopria        debug_ifc->debug_page_data(JOB_INFO->job_handle, BUFF, LEN); \
583bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } \
593bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
603bf66744d61d18c66d46f2608de0467ad3df0268Mopria
613bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define _END_PAGE(JOB_INFO) \
623bf66744d61d18c66d46f2608de0467ad3df0268Mopria{ \
633bf66744d61d18c66d46f2608de0467ad3df0268Mopria    const ifc_wprint_debug_stream_t* debug_ifc = \
643bf66744d61d18c66d46f2608de0467ad3df0268Mopria        JOB_INFO->wprint_ifc->get_debug_stream_ifc(JOB_INFO->job_handle); \
653bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (debug_ifc) { \
663bf66744d61d18c66d46f2608de0467ad3df0268Mopria        debug_ifc->debug_end_page(JOB_INFO->job_handle); \
673bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } \
683bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
693bf66744d61d18c66d46f2608de0467ad3df0268Mopria
703bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define _END_JOB(JOB_INFO) \
713bf66744d61d18c66d46f2608de0467ad3df0268Mopria{ \
723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    const ifc_wprint_debug_stream_t* debug_ifc = \
733bf66744d61d18c66d46f2608de0467ad3df0268Mopria        JOB_INFO->wprint_ifc->get_debug_stream_ifc(JOB_INFO->job_handle); \
743bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (debug_ifc) { \
753bf66744d61d18c66d46f2608de0467ad3df0268Mopria        debug_ifc->debug_end_job(JOB_INFO->job_handle); \
763bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } \
773bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
783bf66744d61d18c66d46f2608de0467ad3df0268Mopria
793bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define _WRITE(JOB_INFO, BUFF, LEN)   \
803bf66744d61d18c66d46f2608de0467ad3df0268Mopria{ \
813bf66744d61d18c66d46f2608de0467ad3df0268Mopria    const ifc_wprint_debug_stream_t* debug_ifc = \
823bf66744d61d18c66d46f2608de0467ad3df0268Mopria        JOB_INFO->wprint_ifc->get_debug_stream_ifc(JOB_INFO->job_handle); \
833bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (debug_ifc) { \
843bf66744d61d18c66d46f2608de0467ad3df0268Mopria        debug_ifc->debug_job_data(JOB_INFO->job_handle, (const unsigned char *)BUFF, LEN); \
853bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } \
863bf66744d61d18c66d46f2608de0467ad3df0268Mopria    JOB_INFO->print_ifc->send_data(JOB_INFO->print_ifc, BUFF, LEN); \
873bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
883bf66744d61d18c66d46f2608de0467ad3df0268Mopria
893bf66744d61d18c66d46f2608de0467ad3df0268Mopria/*
903bf66744d61d18c66d46f2608de0467ad3df0268Mopria * PCL/PWG job definition
913bf66744d61d18c66d46f2608de0467ad3df0268Mopria */
923bf66744d61d18c66d46f2608de0467ad3df0268Mopriatypedef struct {
933bf66744d61d18c66d46f2608de0467ad3df0268Mopria    const ifc_wprint_t *wprint_ifc;
943bf66744d61d18c66d46f2608de0467ad3df0268Mopria    const ifc_print_job_t *print_ifc;
953bf66744d61d18c66d46f2608de0467ad3df0268Mopria
963bf66744d61d18c66d46f2608de0467ad3df0268Mopria    wJob_t job_handle;
973bf66744d61d18c66d46f2608de0467ad3df0268Mopria    uint8 *seed_row, *pcl_buff;
983bf66744d61d18c66d46f2608de0467ad3df0268Mopria    uint8 *halftone_row;
993bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sint16 *error_buf;
1003bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int pixel_width, pixel_height;
1013bf66744d61d18c66d46f2608de0467ad3df0268Mopria    media_size_t media_size;
1023bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int resolution;
1033bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int page_number, num_rows;
1043bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int send_full_row;
1053bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int rows_to_skip;
1063bf66744d61d18c66d46f2608de0467ad3df0268Mopria    uint8 monochrome;
1073bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1083bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int num_components;
1093bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int scan_line_width;
1103bf66744d61d18c66d46f2608de0467ad3df0268Mopria    float standard_scale;
1113bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int strip_height;
1123bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int pclm_scan_line_width;
1133bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1143bf66744d61d18c66d46f2608de0467ad3df0268Mopria    void *pclmgen_obj;
1153bf66744d61d18c66d46f2608de0467ad3df0268Mopria    PCLmPageSetup pclm_page_info;
1163bf66744d61d18c66d46f2608de0467ad3df0268Mopria    uint8 *pclm_output_buffer;
1173bf66744d61d18c66d46f2608de0467ad3df0268Mopria    const char *useragent;
1183bf66744d61d18c66d46f2608de0467ad3df0268Mopria} pcl_job_info_t;
1193bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1203bf66744d61d18c66d46f2608de0467ad3df0268Mopria/*
1213bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Interface for PCL and PWG job handling
1223bf66744d61d18c66d46f2608de0467ad3df0268Mopria */
1233bf66744d61d18c66d46f2608de0467ad3df0268Mopriatypedef struct ifc_pcl_st {
1243bf66744d61d18c66d46f2608de0467ad3df0268Mopria    /*
1253bf66744d61d18c66d46f2608de0467ad3df0268Mopria     * Called once per job at the start of the job. Returns a print job handle that is used
1263bf66744d61d18c66d46f2608de0467ad3df0268Mopria     * in other functions of this library. Returns WPRINT_BAD_JOB_HANDLE for errors.
1273bf66744d61d18c66d46f2608de0467ad3df0268Mopria     */
1283bf66744d61d18c66d46f2608de0467ad3df0268Mopria    wJob_t (*start_job)(wJob_t job_handle, pcl_job_info_t *job_info, media_size_t media_size,
1293bf66744d61d18c66d46f2608de0467ad3df0268Mopria            media_type_t media_type, int resolution, duplex_t duplex,
1303bf66744d61d18c66d46f2608de0467ad3df0268Mopria            duplex_dry_time_t dry_time, color_space_t color_space, media_tray_t media_tray,
1313bf66744d61d18c66d46f2608de0467ad3df0268Mopria            float top_margin, float left_margin);
1323bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1333bf66744d61d18c66d46f2608de0467ad3df0268Mopria    /*
1343bf66744d61d18c66d46f2608de0467ad3df0268Mopria     * Called once per job at the end of the job. A current print job
1353bf66744d61d18c66d46f2608de0467ad3df0268Mopria     * must end for the next one to start. Returns OK or ERROR as the case maybe.
1363bf66744d61d18c66d46f2608de0467ad3df0268Mopria     */
1373bf66744d61d18c66d46f2608de0467ad3df0268Mopria    status_t (*end_job)(pcl_job_info_t *job_info);
1383bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1393bf66744d61d18c66d46f2608de0467ad3df0268Mopria    /*
1403bf66744d61d18c66d46f2608de0467ad3df0268Mopria     * Called once per page of the job to indicate start of the page and page metrics.
1413bf66744d61d18c66d46f2608de0467ad3df0268Mopria     * Returns running page number starting with 1 or ERROR.
1423bf66744d61d18c66d46f2608de0467ad3df0268Mopria     */
1433bf66744d61d18c66d46f2608de0467ad3df0268Mopria    status_t (*start_page)(pcl_job_info_t *job_info,
1443bf66744d61d18c66d46f2608de0467ad3df0268Mopria            int pixel_width,
1453bf66744d61d18c66d46f2608de0467ad3df0268Mopria            int pixel_height);
1463bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1473bf66744d61d18c66d46f2608de0467ad3df0268Mopria    /*
1483bf66744d61d18c66d46f2608de0467ad3df0268Mopria     * Called once per page of the job to indicate end of the page. Returns OK or ERROR.
1493bf66744d61d18c66d46f2608de0467ad3df0268Mopria     */
1503bf66744d61d18c66d46f2608de0467ad3df0268Mopria    status_t (*end_page)(pcl_job_info_t *job_info,
1513bf66744d61d18c66d46f2608de0467ad3df0268Mopria            int page_number);
1523bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1533bf66744d61d18c66d46f2608de0467ad3df0268Mopria    /*
1543bf66744d61d18c66d46f2608de0467ad3df0268Mopria     * Called several times a page to send a rectangular swath of RGB data. The array
1553bf66744d61d18c66d46f2608de0467ad3df0268Mopria     * rgb_pixels[] must have (num_rows * pixel_width) pixels. bytes_per_row can be used for
1563bf66744d61d18c66d46f2608de0467ad3df0268Mopria     * 32-bit aligned rows. Returns OK or ERROR.
1573bf66744d61d18c66d46f2608de0467ad3df0268Mopria     */
1583bf66744d61d18c66d46f2608de0467ad3df0268Mopria    status_t (*print_swath)(pcl_job_info_t *job_info, char *rgb_pixels, int start_row, int num_rows,
1593bf66744d61d18c66d46f2608de0467ad3df0268Mopria            int bytes_per_row);
1603bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1613bf66744d61d18c66d46f2608de0467ad3df0268Mopria    /*
1623bf66744d61d18c66d46f2608de0467ad3df0268Mopria     * Return true if this interface can cancel a job partway through a page
1633bf66744d61d18c66d46f2608de0467ad3df0268Mopria     */
1643bf66744d61d18c66d46f2608de0467ad3df0268Mopria    bool (*canCancelMidPage)(void);
1653bf66744d61d18c66d46f2608de0467ad3df0268Mopria} ifc_pcl_t;
1663bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1673bf66744d61d18c66d46f2608de0467ad3df0268Mopria/*
1683bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Connect to the PCLm plugin, returning its interface
1693bf66744d61d18c66d46f2608de0467ad3df0268Mopria */
1703bf66744d61d18c66d46f2608de0467ad3df0268Mopriaifc_pcl_t *pclm_connect(void);
1713bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1723bf66744d61d18c66d46f2608de0467ad3df0268Mopria/*
1733bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Connect to the pwg plugin, returning its interface
1743bf66744d61d18c66d46f2608de0467ad3df0268Mopria */
1753bf66744d61d18c66d46f2608de0467ad3df0268Mopriaifc_pcl_t *pwg_connect(void);
1763bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1773bf66744d61d18c66d46f2608de0467ad3df0268Mopria#endif // __LIB_PCL_H__