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__