/*
* Copyright (C) 2016 The Android Open Source Project
* Copyright (C) 2016 Mopria Alliance, Inc.
* Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __WPRINT_IMAGE__
#define __WPRINT_IMAGE__
#include <stdio.h>
#include "mime_types.h"
#include "wprint_scaler.h"
#include "wprint_debug.h"
#include "ifc_wprint.h"
#ifdef __cplusplus
extern "C"
{
#endif
#define BYTES_PER_PIXEL(X) ((X)*3)
#define BITS_PER_CHANNEL 8
/*
* Rotations to apply while decoding
*/
typedef enum {
ROT_0 = 0,
ROT_90,
ROT_180,
ROT_270,
} wprint_rotation_t;
/*
* Location(s) for padding to be applied while decoding
*/
typedef enum {
PAD_TOP = (1 << 0),
PAD_LEFT = (1 << 1),
PAD_RIGHT = (1 << 2),
PAD_BOTTOM = (1 << 3),
} wprint_padding_t;
#define PAD_NONE (0)
#define PAD_PRINT (PAD_TOP | PAD_LEFT)
#define PAD_ALL (PAD_TOP | PAD_LEFT | PAD_RIGHT | PAD_BOTTOM)
#define __DEFINE_WPRINT_PLATFORM_TYPES__
#include "wprint_image_platform.h"
#undef __DEFINE_WPRINT_PLATFORM_TYPES__
/*
* Define an image which can be decoded into a stream
*/
typedef struct {
// file information
const char *mime_type;
FILE *imgfile;
// interfaces
const struct _image_decode_ifc_st *decode_ifc;
const ifc_wprint_t *wprint_ifc;
// image dimensions
unsigned int width;
unsigned int height;
unsigned int sampled_width;
unsigned int sampled_height;
// printable area information
unsigned int printable_width;
unsigned int printable_height;
unsigned int print_resolution;
unsigned int render_flags;
// output information
unsigned int output_width;
unsigned int output_height;
int num_components;
int pdf_render_resolution;
// memory optimization parameters
unsigned int stripe_height;
unsigned int concurrent_stripes;
unsigned int output_rows;
// scaling parameters
unsigned int scaled_sample_size;
unsigned int scaled_width;
unsigned int scaled_height;
int unscaled_start_row;
int unscaled_end_row;
unsigned int unscaled_rows_needed;
unsigned char *unscaled_rows;
unsigned int mixed_memory_needed;
unsigned char *mixed_memory;
unsigned char scaling_needed;
scaler_config_t scaler_config;
// padding parameters
unsigned int output_padding_top;
unsigned int output_padding_bottom;
unsigned int output_padding_left;
unsigned int output_padding_right;
unsigned int padding_options;
// decoding information
wprint_rotation_t rotation;
unsigned int row_offset;
unsigned int col_offset;
int swath_start;
int rows_cached;
unsigned char **output_cache;
int output_swath_start;
decoder_data_t decoder_data;
} wprint_image_info_t;
/*
* Defines an interface for decoding images
*/
typedef struct _image_decode_ifc_st {
/*
* Prepare for decoding of the specified image
*/
void (*init)(wprint_image_info_t *image_info);
/*
* Prepare for decoding of an image
*/
status_t (*get_hdr)(wprint_image_info_t *image_info);
/*
* Supply image data at the specified row
*/
unsigned char *(*decode_row)(wprint_image_info_t *, int row);
/*
* Release all resources related to the image
*/
status_t (*cleanup)(wprint_image_info_t *image_info);
/*
* Return OK if subsampling is supported by this decoder
*/
status_t (*supports_subsampling)(wprint_image_info_t *image_info);
/*
* Return resolution in DPI
*/
int (*native_units)(wprint_image_info_t *image_info);
} image_decode_ifc_t;
/*
* Return the appropriate decoding object corresponding to the image
*/
const image_decode_ifc_t *wprint_image_get_decode_ifc(wprint_image_info_t *image_info);
/*
* Initializes image_info with supplied parameters
*/
void wprint_image_setup(wprint_image_info_t *image_info, const char *mime_type,
const ifc_wprint_t *wprint_ifc, unsigned int output_resolution, int pdf_render_resolution);
/*
* Open an initialized image from a file
*/
status_t wprint_image_get_info(FILE *imgfile, wprint_image_info_t *image_info);
/*
* Configure image_info parameters as supplied
*/
status_t wprint_image_set_output_properties(wprint_image_info_t *image_info,
wprint_rotation_t rotation, unsigned int printable_width, unsigned int printable_height,
unsigned int top_margin, unsigned int left_margin, unsigned int right_margin,
unsigned int bottom_margin, unsigned int render_flags, unsigned int max_decode_stripe,
unsigned int concurrent_stripes, unsigned int padding_options);
/*
* Return true if the image is wider than it is high (landscape orientation)
*/
bool wprint_image_is_landscape(wprint_image_info_t *image_info);
/*
* Return the size required to render the image
*/
int wprint_image_get_output_buff_size(wprint_image_info_t *image_info);
/*
* Return the full image width, including any padding
*/
int wprint_image_get_width(wprint_image_info_t *image_info);
/*
* Return the full image height, including any padding
*/
int wprint_image_get_height(wprint_image_info_t *image_info);
/*
* Decode a single stripe of data into rgb_pixels, storing height rendered and returning
* bytes processed or 0/negative on error.
*/
int wprint_image_decode_stripe(wprint_image_info_t *image_info, int start_row, int *height,
unsigned char *rgb_pixels);
/*
* Compute and allocate memory in preparation for decoding row data, returning the number of rows
*/
int wprint_image_compute_rows_to_cache(wprint_image_info_t *image_info);
/*
* Return the current number of cached rows
*/
int wprint_image_input_rows_cached(wprint_image_info_t *image_info);
/*
* Free all image resources
*/
void wprint_image_cleanup(wprint_image_info_t *image_info);
#ifdef __cplusplus
}
#endif
#define __DEFINE_WPRINT_PLATFORM_METHODS__
#include "wprint_image_platform.h"
#undef __DEFINE_WPRINT_PLATFORM_METHODS__
#endif // __WPRINT_IMAGE__