Home | History | Annotate | Download | only in plugins
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  * Copyright (C) 2016 Mopria Alliance, Inc.
      4  * Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  */
     18 
     19 #ifndef __LIB_PCL_H__
     20 #define __LIB_PCL_H__
     21 
     22 #include "ifc_print_job.h"
     23 #include "ifc_wprint.h"
     24 #include "lib_wprint.h"
     25 #include "lib_pclm.h"
     26 #include "common_defines.h"
     27 
     28 #define _WJOBH_NONE  0
     29 #define STANDARD_SCALE_FOR_PDF    72.0
     30 
     31 #define SP_GRAY(Yr, Cbg, Crb) (((Yr<<6) + (Cbg*160) + (Crb<<5)) >> 8)
     32 
     33 #define _START_JOB(JOB_INFO, EXT) \
     34 { \
     35     const ifc_wprint_debug_stream_t* debug_ifc = \
     36         JOB_INFO->wprint_ifc->get_debug_stream_ifc(JOB_INFO->job_handle); \
     37     if (debug_ifc) { \
     38         debug_ifc->debug_start_job(JOB_INFO->job_handle, EXT); \
     39     } \
     40 }
     41 
     42 #define _START_PAGE(JOB_INFO, WIDTH, HEIGHT) \
     43 { \
     44     const ifc_wprint_debug_stream_t* debug_ifc = \
     45         JOB_INFO->wprint_ifc->get_debug_stream_ifc(JOB_INFO->job_handle); \
     46     if (debug_ifc) { \
     47         debug_ifc->debug_start_page(JOB_INFO->job_handle, JOB_INFO->page_number + 1, WIDTH, \
     48             HEIGHT); \
     49     } \
     50 }
     51 
     52 #define _PAGE_DATA(JOB_INFO, BUFF, LEN) \
     53 { \
     54     const ifc_wprint_debug_stream_t* debug_ifc = \
     55         JOB_INFO->wprint_ifc->get_debug_stream_ifc(JOB_INFO->job_handle); \
     56     if (debug_ifc) { \
     57         debug_ifc->debug_page_data(JOB_INFO->job_handle, BUFF, LEN); \
     58     } \
     59 }
     60 
     61 #define _END_PAGE(JOB_INFO) \
     62 { \
     63     const ifc_wprint_debug_stream_t* debug_ifc = \
     64         JOB_INFO->wprint_ifc->get_debug_stream_ifc(JOB_INFO->job_handle); \
     65     if (debug_ifc) { \
     66         debug_ifc->debug_end_page(JOB_INFO->job_handle); \
     67     } \
     68 }
     69 
     70 #define _END_JOB(JOB_INFO) \
     71 { \
     72     const ifc_wprint_debug_stream_t* debug_ifc = \
     73         JOB_INFO->wprint_ifc->get_debug_stream_ifc(JOB_INFO->job_handle); \
     74     if (debug_ifc) { \
     75         debug_ifc->debug_end_job(JOB_INFO->job_handle); \
     76     } \
     77 }
     78 
     79 #define _WRITE(JOB_INFO, BUFF, LEN)   \
     80 { \
     81     const ifc_wprint_debug_stream_t* debug_ifc = \
     82         JOB_INFO->wprint_ifc->get_debug_stream_ifc(JOB_INFO->job_handle); \
     83     if (debug_ifc) { \
     84         debug_ifc->debug_job_data(JOB_INFO->job_handle, (const unsigned char *)BUFF, LEN); \
     85     } \
     86     JOB_INFO->print_ifc->send_data(JOB_INFO->print_ifc, BUFF, LEN); \
     87 }
     88 
     89 /*
     90  * PCL/PWG job definition
     91  */
     92 typedef struct {
     93     const ifc_wprint_t *wprint_ifc;
     94     const ifc_print_job_t *print_ifc;
     95 
     96     wJob_t job_handle;
     97     uint8 *seed_row, *pcl_buff;
     98     uint8 *halftone_row;
     99     sint16 *error_buf;
    100     int pixel_width, pixel_height;
    101     media_size_t media_size;
    102     int resolution;
    103     int page_number, num_rows;
    104     int send_full_row;
    105     int rows_to_skip;
    106     uint8 monochrome;
    107 
    108     int num_components;
    109     int scan_line_width;
    110     float standard_scale;
    111     int strip_height;
    112     int pclm_scan_line_width;
    113 
    114     void *pclmgen_obj;
    115     PCLmPageSetup pclm_page_info;
    116     uint8 *pclm_output_buffer;
    117     const char *useragent;
    118 } pcl_job_info_t;
    119 
    120 /*
    121  * Interface for PCL and PWG job handling
    122  */
    123 typedef struct ifc_pcl_st {
    124     /*
    125      * Called once per job at the start of the job. Returns a print job handle that is used
    126      * in other functions of this library. Returns WPRINT_BAD_JOB_HANDLE for errors.
    127      */
    128     wJob_t (*start_job)(wJob_t job_handle, pcl_job_info_t *job_info, media_size_t media_size,
    129             media_type_t media_type, int resolution, duplex_t duplex,
    130             duplex_dry_time_t dry_time, color_space_t color_space, media_tray_t media_tray,
    131             float top_margin, float left_margin);
    132 
    133     /*
    134      * Called once per job at the end of the job. A current print job
    135      * must end for the next one to start. Returns OK or ERROR as the case maybe.
    136      */
    137     status_t (*end_job)(pcl_job_info_t *job_info);
    138 
    139     /*
    140      * Called once per page of the job to indicate start of the page and page metrics.
    141      * Returns running page number starting with 1 or ERROR.
    142      */
    143     status_t (*start_page)(pcl_job_info_t *job_info,
    144             int pixel_width,
    145             int pixel_height);
    146 
    147     /*
    148      * Called once per page of the job to indicate end of the page. Returns OK or ERROR.
    149      */
    150     status_t (*end_page)(pcl_job_info_t *job_info,
    151             int page_number);
    152 
    153     /*
    154      * Called several times a page to send a rectangular swath of RGB data. The array
    155      * rgb_pixels[] must have (num_rows * pixel_width) pixels. bytes_per_row can be used for
    156      * 32-bit aligned rows. Returns OK or ERROR.
    157      */
    158     status_t (*print_swath)(pcl_job_info_t *job_info, char *rgb_pixels, int start_row, int num_rows,
    159             int bytes_per_row);
    160 
    161     /*
    162      * Return true if this interface can cancel a job partway through a page
    163      */
    164     bool (*canCancelMidPage)(void);
    165 } ifc_pcl_t;
    166 
    167 /*
    168  * Connect to the PCLm plugin, returning its interface
    169  */
    170 ifc_pcl_t *pclm_connect(void);
    171 
    172 /*
    173  * Connect to the pwg plugin, returning its interface
    174  */
    175 ifc_pcl_t *pwg_connect(void);
    176 
    177 #endif // __LIB_PCL_H__