/*
 * jsimd.h
 *
 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
 * Copyright 2011 D. R. Commander
 * 
 * Based on the x86 SIMD extension for IJG JPEG library,
 * Copyright (C) 1999-2006, MIYASAKA Masaru.
 * For conditions of distribution and use, see copyright notice in jsimdext.inc
 *
 */

/* Short forms of external names for systems with brain-damaged linkers. */

#ifdef NEED_SHORT_EXTERNAL_NAMES
#define jsimd_can_rgb_ycc                 jSCanRgbYcc
#define jsimd_can_rgb_gray                jSCanRgbGry
#define jsimd_can_ycc_rgb                 jSCanYccRgb
#define jsimd_rgb_ycc_convert             jSRgbYccConv
#define jsimd_rgb_gray_convert            jSRgbGryConv
#define jsimd_ycc_rgb_convert             jSYccRgbConv
#define jsimd_can_h2v2_downsample         jSCanH2V2Down
#define jsimd_can_h2v1_downsample         jSCanH2V1Down
#define jsimd_h2v2_downsample             jSH2V2Down
#define jsimd_h2v1_downsample             jSH2V1Down
#define jsimd_can_h2v2_upsample           jSCanH2V2Up
#define jsimd_can_h2v1_upsample           jSCanH2V1Up
#define jsimd_h2v2_upsample               jSH2V2Up
#define jsimd_h2v1_upsample               jSH2V1Up
#define jsimd_can_h2v2_fancy_upsample     jSCanH2V2FUp
#define jsimd_can_h2v1_fancy_upsample     jSCanH2V1FUp
#define jsimd_h2v2_fancy_upsample         jSH2V2FUp
#define jsimd_h2v1_fancy_upsample         jSH2V1FUp
#define jsimd_can_h2v2_merged_upsample    jSCanH2V2MUp
#define jsimd_can_h2v1_merged_upsample    jSCanH2V1MUp
#define jsimd_h2v2_merged_upsample        jSH2V2MUp
#define jsimd_h2v1_merged_upsample        jSH2V1MUp
#endif /* NEED_SHORT_EXTERNAL_NAMES */

EXTERN(int) jsimd_can_rgb_ycc JPP((void));
EXTERN(int) jsimd_can_rgb_gray JPP((void));
EXTERN(int) jsimd_can_ycc_rgb JPP((void));

EXTERN(void) jsimd_rgb_ycc_convert
        JPP((j_compress_ptr cinfo,
             JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
             JDIMENSION output_row, int num_rows));
EXTERN(void) jsimd_rgb_gray_convert
        JPP((j_compress_ptr cinfo,
             JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
             JDIMENSION output_row, int num_rows));
EXTERN(void) jsimd_ycc_rgb_convert
        JPP((j_decompress_ptr cinfo,
             JSAMPIMAGE input_buf, JDIMENSION input_row,
             JSAMPARRAY output_buf, int num_rows));

EXTERN(int) jsimd_can_h2v2_downsample JPP((void));
EXTERN(int) jsimd_can_h2v1_downsample JPP((void));

EXTERN(void) jsimd_h2v2_downsample
        JPP((j_compress_ptr cinfo, jpeg_component_info * compptr,
             JSAMPARRAY input_data, JSAMPARRAY output_data));
EXTERN(void) jsimd_h2v1_downsample
        JPP((j_compress_ptr cinfo, jpeg_component_info * compptr,
             JSAMPARRAY input_data, JSAMPARRAY output_data));

EXTERN(int) jsimd_can_h2v2_upsample JPP((void));
EXTERN(int) jsimd_can_h2v1_upsample JPP((void));

EXTERN(void) jsimd_h2v2_upsample
        JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
             JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));
EXTERN(void) jsimd_h2v1_upsample
        JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
             JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));

EXTERN(int) jsimd_can_h2v2_fancy_upsample JPP((void));
EXTERN(int) jsimd_can_h2v1_fancy_upsample JPP((void));

EXTERN(void) jsimd_h2v2_fancy_upsample
        JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
             JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));
EXTERN(void) jsimd_h2v1_fancy_upsample
        JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
             JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));

EXTERN(int) jsimd_can_h2v2_merged_upsample JPP((void));
EXTERN(int) jsimd_can_h2v1_merged_upsample JPP((void));

EXTERN(void) jsimd_h2v2_merged_upsample
        JPP((j_decompress_ptr cinfo,
             JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
             JSAMPARRAY output_buf));
EXTERN(void) jsimd_h2v1_merged_upsample
        JPP((j_decompress_ptr cinfo,
             JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
             JSAMPARRAY output_buf));

