/* 
 * All modifications in this file to the original code are
 * (C) Copyright 1992, ..., 2003 the "DOSEMU-Development-Team".
 *
 * for details see file COPYING in the DOSEMU distribution
 */

/*
 * Header file for remap.c & remap_asm.S.
 *
 * Copyright (c) 1997 Steffen Winterfeldt
 *
 */

/*
 * print listing of generated code
 */
#undef	REMAP_CODE_DEBUG

#undef	REMAP_RESIZE_DEBUG
#undef	REMAP_AREA_DEBUG
#undef	REMAP_TEST		/* Do not define! -- sw */

/*
 * define to use a 'real' 2x2 dither when using a shared color map
 * (this does not affect the remap speed)
 */
#define	REMAP_REAL_DITHER

#ifndef __ASSEMBLER__
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 * the C part; see below for the asm definitions
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 */

#define MODE_PSEUDO_8	(1 << 0)
#define MODE_TRUE_1_LSB	(1 << 2)
#define MODE_TRUE_1_MSB	(1 << 3)
#define MODE_TRUE_8	(1 << 4)
#define MODE_TRUE_15	(1 << 5)
#define MODE_TRUE_16	(1 << 6)
#define MODE_TRUE_24	(1 << 7)
#define MODE_TRUE_32	(1 << 8)
#define MODE_VGA_1	(1 << 9)
#define MODE_VGA_2	(1 << 10)
#define MODE_VGA_4	(1 << 11)
#define MODE_VGA_X	(1 << 12)
#define MODE_CGA_1	(1 << 13)
#define MODE_CGA_2	(1 << 14)
#define MODE_HERC	(1 << 15)
#define MODE_UNSUP	(1 << 31)

#define MODE_TRUE_COL	(MODE_TRUE_8 | MODE_TRUE_15 | MODE_TRUE_16 | MODE_TRUE_24 | MODE_TRUE_32)

#define RFF_SCALE_ALL	(1 << 0)
#define RFF_SCALE_1	(1 << 1)
#define RFF_SCALE_2	(1 << 2)
#define RFF_REMAP_RECT	(1 << 3)
#define RFF_REMAP_LINES	(1 << 4)
#define RFF_LIN_FILT	(1 << 5)
#define RFF_BILIN_FILT	(1 << 6)
#define RFF_OPT_PENTIUM	(1 << 7)

#define ROS_SCALE_ALL		(1 << 0)
#define ROS_SCALE_1		(1 << 1)
#define ROS_SCALE_2		(1 << 2)
#define ROS_MALLOC_FAIL		(1 << 3)
#define ROS_REMAP_FUNC_OK	(1 << 4)
#define ROS_REMAP_IGNORE	(1 << 5)

#define REMAP_DESC(FL, SRC, DST, F, INI) {FL, SRC, DST, F, #F, INI, NULL}

typedef struct {
  int x, y, width, height;
} RectArea;

typedef struct {
  void (*exec)(void);
  unsigned char *mem, *text;
  int size, pc;
} CodeObj;

typedef struct {
  unsigned r, g, b;
} RGBColor;

typedef struct {
  unsigned bits, bytes;
  unsigned r_mask, g_mask, b_mask;
  unsigned r_shift, g_shift, b_shift;
  unsigned r_bits, g_bits, b_bits;
  unsigned char *pixel_lut;
} ColorSpaceDesc;

struct RemapObjectStruct;

typedef struct RemapFuncDescStruct {
  unsigned flags;
  unsigned src_mode;
  unsigned dst_mode;
  void (*func)(struct RemapObjectStruct *);
  char *func_name;
  void (*func_init)(struct RemapObjectStruct *);
  struct RemapFuncDescStruct *next;
} RemapFuncDesc;

typedef struct RemapObjectStruct {
  int (*palette_update)(struct RemapObjectStruct *, unsigned, unsigned, unsigned, unsigned, unsigned);
  void (*src_resize)(struct RemapObjectStruct *, int, int, int);
  void (*dst_resize)(struct RemapObjectStruct *, int, int, int);
  RectArea (*remap_rect)(struct RemapObjectStruct *, int, int, int, int);
  RectArea (*remap_mem)(struct RemapObjectStruct *, int, int);
  int state;
  int src_mode, dst_mode;
  ColorSpaceDesc *src_color_space, *dst_color_space;
  unsigned gamma;		/* 4 byte !! */
  unsigned char *gamma_lut;
  unsigned char *src_image, *dst_image;
  unsigned char *src_tmp_line;
  unsigned src_width, src_height, src_scan_len;
  unsigned dst_width, dst_height, dst_scan_len;
  int src_x0, src_y0, src_x1, src_y1;
  int dst_x0, dst_y0, dst_x1, dst_y1;
  int src_offset, dst_offset;
  int *bre_x, *bre_y;
  unsigned *true_color_lut;
  unsigned *bit_lut;
  int supported_src_modes;
  void (*remap_func)(struct RemapObjectStruct *);
  unsigned remap_func_flags;
  char *remap_func_name;
  void (*remap_func_init)(struct RemapObjectStruct *);
  CodeObj *co;
  void (*remap_line)(void);
  RemapFuncDesc *func_all;
  RemapFuncDesc *func_1;
  RemapFuncDesc *func_2;
} RemapObject;

/*
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 * function prototypes
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 */

void set_remap_debug_msg(FILE *);

RemapObject remap_init(int, int, int);
void remap_done(RemapObject *);

unsigned rgb_color_2int(ColorSpaceDesc *, unsigned, RGBColor);
RGBColor int_2rgb_color(ColorSpaceDesc *, unsigned, unsigned);
void color_space_complete(ColorSpaceDesc *);
void adjust_gamma(RemapObject *, unsigned);
void gamma_correct(RemapObject *, RGBColor *, unsigned *);

CodeObj code_init(void);
void code_done(CodeObj *);
void code_append_ins(CodeObj *, int, void *);


#else /* __ASSEMBLER__ */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
		.macro RO_Struct _str_
		  .equ \_str_, RO_ElemCount
		  .equ RO_ElemCount, RO_ElemCount+4
		.endm
		.equ RO_ElemCount, 0

		RO_Struct ro_palette_update
		RO_Struct ro_src_resize
		RO_Struct ro_dst_resize
		RO_Struct ro_remap_rect
		RO_Struct ro_remap_mem
		RO_Struct ro_state
		RO_Struct ro_src_mode
		RO_Struct ro_src_mode
		RO_Struct ro_src_color_space
		RO_Struct ro_dst_color_space
		RO_Struct ro_gamma
		RO_Struct ro_gamma_lut
		RO_Struct ro_src_image
		RO_Struct ro_dst_image
		RO_Struct ro_src_tmp_line
		RO_Struct ro_src_width
		RO_Struct ro_src_height
		RO_Struct ro_src_scan_len
		RO_Struct ro_dst_width
		RO_Struct ro_dst_height
		RO_Struct ro_dst_scan_len
		RO_Struct ro_src_x0
		RO_Struct ro_src_y0
		RO_Struct ro_src_x1
		RO_Struct ro_src_y1
		RO_Struct ro_dst_x0
		RO_Struct ro_dst_y0
		RO_Struct ro_dst_x1
		RO_Struct ro_dst_y1
		RO_Struct ro_src_offset
		RO_Struct ro_dst_offset
		RO_Struct ro_bre_x
		RO_Struct ro_bre_y
		RO_Struct ro_true_color_lut
		RO_Struct ro_bit_lut
		RO_Struct ro_supported_src_modes
		RO_Struct ro_remap_func
		RO_Struct ro_remap_func_flags
		RO_Struct remap_func_name
		RO_Struct remap_func_init
		RO_Struct ro_co
		RO_Struct ro_remap_line
		RO_Struct ro_func_all
		RO_Struct ro_func_1
		RO_Struct ro_func_2

#endif /* __ASSEMBLER__ */

