/*
 * jsimd.h
 *
 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
 * Copyright 2011, 2014 D. R. Commander
 * Copyright 2015 Matthieu Darbois
 *
 * 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
 *
 */

#include "jchuff.h"             /* Declarations shared with jcphuff.c */

EXTERN(int) jsimd_can_rgb_ycc (void);
EXTERN(int) jsimd_can_rgb_gray (void);
EXTERN(int) jsimd_can_ycc_rgb (void);
EXTERN(int) jsimd_can_ycc_rgb565 (void);
EXTERN(int) jsimd_c_can_null_convert (void);

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

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

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

EXTERN(int) jsimd_can_h2v2_smooth_downsample (void);

EXTERN(void) jsimd_h2v2_smooth_downsample
        (j_compress_ptr cinfo, jpeg_component_info * compptr,
         JSAMPARRAY input_data, JSAMPARRAY output_data);

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

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

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

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

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

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

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

EXTERN(int) jsimd_can_huff_encode_one_block (void);

EXTERN(JOCTET*) jsimd_huff_encode_one_block
        (void * state, JOCTET *buffer, JCOEFPTR block, int last_dc_val,
         c_derived_tbl *dctbl, c_derived_tbl *actbl);
