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 __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__