C++程序  |  244行  |  6.4 KB

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