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 __WPRINT_IMAGE__ 20 #define __WPRINT_IMAGE__ 21 22 #include <stdio.h> 23 #include "mime_types.h" 24 #include "wprint_scaler.h" 25 #include "wprint_debug.h" 26 #include "ifc_wprint.h" 27 28 #ifdef __cplusplus 29 extern "C" 30 { 31 #endif 32 33 #define BYTES_PER_PIXEL(X) ((X)*3) 34 #define BITS_PER_CHANNEL 8 35 36 /* 37 * Rotations to apply while decoding 38 */ 39 typedef enum { 40 ROT_0 = 0, 41 ROT_90, 42 ROT_180, 43 ROT_270, 44 } wprint_rotation_t; 45 46 /* 47 * Location(s) for padding to be applied while decoding 48 */ 49 typedef enum { 50 PAD_TOP = (1 << 0), 51 PAD_LEFT = (1 << 1), 52 PAD_RIGHT = (1 << 2), 53 PAD_BOTTOM = (1 << 3), 54 } wprint_padding_t; 55 56 #define PAD_NONE (0) 57 #define PAD_PRINT (PAD_TOP | PAD_LEFT) 58 #define PAD_ALL (PAD_TOP | PAD_LEFT | PAD_RIGHT | PAD_BOTTOM) 59 60 #define __DEFINE_WPRINT_PLATFORM_TYPES__ 61 62 #include "wprint_image_platform.h" 63 64 #undef __DEFINE_WPRINT_PLATFORM_TYPES__ 65 66 /* 67 * Define an image which can be decoded into a stream 68 */ 69 typedef struct { 70 // file information 71 const char *mime_type; 72 FILE *imgfile; 73 74 // interfaces 75 const struct _image_decode_ifc_st *decode_ifc; 76 const ifc_wprint_t *wprint_ifc; 77 78 // image dimensions 79 unsigned int width; 80 unsigned int height; 81 unsigned int sampled_width; 82 unsigned int sampled_height; 83 84 // printable area information 85 unsigned int printable_width; 86 unsigned int printable_height; 87 unsigned int print_resolution; 88 unsigned int render_flags; 89 90 // output information 91 unsigned int output_width; 92 unsigned int output_height; 93 int num_components; 94 int pdf_render_resolution; 95 96 // memory optimization parameters 97 unsigned int stripe_height; 98 unsigned int concurrent_stripes; 99 unsigned int output_rows; 100 101 // scaling parameters 102 unsigned int scaled_sample_size; 103 unsigned int scaled_width; 104 unsigned int scaled_height; 105 int unscaled_start_row; 106 int unscaled_end_row; 107 unsigned int unscaled_rows_needed; 108 unsigned char *unscaled_rows; 109 unsigned int mixed_memory_needed; 110 unsigned char *mixed_memory; 111 unsigned char scaling_needed; 112 scaler_config_t scaler_config; 113 114 // padding parameters 115 unsigned int output_padding_top; 116 unsigned int output_padding_bottom; 117 unsigned int output_padding_left; 118 unsigned int output_padding_right; 119 unsigned int padding_options; 120 121 // decoding information 122 wprint_rotation_t rotation; 123 unsigned int row_offset; 124 unsigned int col_offset; 125 int swath_start; 126 int rows_cached; 127 unsigned char **output_cache; 128 int output_swath_start; 129 decoder_data_t decoder_data; 130 } wprint_image_info_t; 131 132 /* 133 * Defines an interface for decoding images 134 */ 135 typedef struct _image_decode_ifc_st { 136 /* 137 * Prepare for decoding of the specified image 138 */ 139 void (*init)(wprint_image_info_t *image_info); 140 141 /* 142 * Prepare for decoding of an image 143 */ 144 status_t (*get_hdr)(wprint_image_info_t *image_info); 145 146 /* 147 * Supply image data at the specified row 148 */ 149 unsigned char *(*decode_row)(wprint_image_info_t *, int row); 150 151 /* 152 * Release all resources related to the image 153 */ 154 status_t (*cleanup)(wprint_image_info_t *image_info); 155 156 /* 157 * Return OK if subsampling is supported by this decoder 158 */ 159 status_t (*supports_subsampling)(wprint_image_info_t *image_info); 160 161 /* 162 * Return resolution in DPI 163 */ 164 int (*native_units)(wprint_image_info_t *image_info); 165 } image_decode_ifc_t; 166 167 /* 168 * Return the appropriate decoding object corresponding to the image 169 */ 170 const image_decode_ifc_t *wprint_image_get_decode_ifc(wprint_image_info_t *image_info); 171 172 /* 173 * Initializes image_info with supplied parameters 174 */ 175 void wprint_image_setup(wprint_image_info_t *image_info, const char *mime_type, 176 const ifc_wprint_t *wprint_ifc, unsigned int output_resolution, int pdf_render_resolution); 177 178 /* 179 * Open an initialized image from a file 180 */ 181 status_t wprint_image_get_info(FILE *imgfile, wprint_image_info_t *image_info); 182 183 /* 184 * Configure image_info parameters as supplied 185 */ 186 status_t wprint_image_set_output_properties(wprint_image_info_t *image_info, 187 wprint_rotation_t rotation, unsigned int printable_width, unsigned int printable_height, 188 unsigned int top_margin, unsigned int left_margin, unsigned int right_margin, 189 unsigned int bottom_margin, unsigned int render_flags, unsigned int max_decode_stripe, 190 unsigned int concurrent_stripes, unsigned int padding_options); 191 192 /* 193 * Return true if the image is wider than it is high (landscape orientation) 194 */ 195 bool wprint_image_is_landscape(wprint_image_info_t *image_info); 196 197 /* 198 * Return the size required to render the image 199 */ 200 int wprint_image_get_output_buff_size(wprint_image_info_t *image_info); 201 202 /* 203 * Return the full image width, including any padding 204 */ 205 int wprint_image_get_width(wprint_image_info_t *image_info); 206 207 /* 208 * Return the full image height, including any padding 209 */ 210 int wprint_image_get_height(wprint_image_info_t *image_info); 211 212 /* 213 * Decode a single stripe of data into rgb_pixels, storing height rendered and returning 214 * bytes processed or 0/negative on error. 215 */ 216 int wprint_image_decode_stripe(wprint_image_info_t *image_info, int start_row, int *height, 217 unsigned char *rgb_pixels); 218 219 /* 220 * Compute and allocate memory in preparation for decoding row data, returning the number of rows 221 */ 222 int wprint_image_compute_rows_to_cache(wprint_image_info_t *image_info); 223 224 /* 225 * Return the current number of cached rows 226 */ 227 int wprint_image_input_rows_cached(wprint_image_info_t *image_info); 228 229 /* 230 * Free all image resources 231 */ 232 void wprint_image_cleanup(wprint_image_info_t *image_info); 233 234 #ifdef __cplusplus 235 } 236 #endif 237 238 #define __DEFINE_WPRINT_PLATFORM_METHODS__ 239 240 #include "wprint_image_platform.h" 241 242 #undef __DEFINE_WPRINT_PLATFORM_METHODS__ 243 244 #endif // __WPRINT_IMAGE__