35#if defined(__c128xx__)
40static RGBi SYSTEM_PALETTE[] = {
41 { 0x00, 0x00, 0x00, 0xff, 0,
"BLACK" },
42 { 0xff, 0xff, 0xff, 0xff, 1,
"WHITE" },
43 { 0x80, 0x00, 0x00, 0xff, 2,
"RED" },
44 { 0xaa, 0xff, 0xe6, 0xff, 3,
"CYAN" },
45 { 0xcc, 0x44, 0xcc, 0xff, 4,
"VIOLET" },
46 { 0x00, 0xcc, 0x55, 0xff, 5,
"GREEN" },
47 { 0x00, 0x00, 0xaa, 0xff, 6,
"BLUE" },
48 { 0xee, 0xee, 0x77, 0xff, 7,
"YELLOW" },
49 { 0xa1, 0x68, 0x3c, 0xff, 8,
"ORANGE" },
50 { 0xdd, 0x88, 0x65, 0xff, 9,
"BROWN" },
51 { 0xff, 0x77, 0x77, 0xff, 10,
"LIGHT_RED" },
52 { 0x33, 0x33, 0x33, 0xff, 11,
"DARK_GREY" },
53 { 0x77, 0x77, 0x77, 0xff, 12,
"GREY" },
54 { 0xaa, 0xff, 0x66, 0xff, 13,
"LIGHT GREEN" },
55 { 0x00, 0x88, 0xff, 0xff, 14,
"LIGHT BLUE" },
56 { 0xbb, 0xbb, 0xbb, 0xff, 15,
"LIGHT GREY" }
59static RGBi * commonPalette;
66RGBi * vdc_image_nearest_system_color(
RGBi * _color ) {
68 unsigned int minDistance = 0xffff;
78 return &SYSTEM_PALETTE[colorIndex];
93static void vdc_image_converter_tile(
Environment * _environment,
char * _source,
char * _dest,
int _width,
int _depth,
int _source_width ) {
96 memset(colorIndexesCount, 0,
COLOR_COUNT *
sizeof(
int ) );
102 memset( _dest, 0, 9 );
105 for (
int y=0; y<8; ++y) {
106 for (
int x=0; x<8; ++x) {
110 memset( &rgb, 0,
sizeof(
RGBi ) );
117 rgb.
alpha = *(_source + 3);
121 if ( rgb.
alpha == 0 ) {
127 if ( rgb.
alpha < 255 ) {
130 RGBi *systemRgb = vdc_image_nearest_system_color( &rgb );
131 ++colorIndexesCount[systemRgb->
index];
138 source += _depth * ( _source_width - 8 );
142 int colorBackground = 0;
143 int colorBackgroundMax = 0;
144 int colorForeground = 0;
145 int colorForegroundMax = 0;
147 if ( colorIndexesCount[xx] > colorBackgroundMax ) {
148 colorBackground = xx;
149 colorBackgroundMax = colorIndexesCount[xx];
153 colorIndexesCount[colorBackground] = 0;
156 if ( colorIndexesCount[xx] > colorForegroundMax ) {
157 colorForeground = xx;
158 colorForegroundMax = colorIndexesCount[xx];
163 if ( colorForeground == 0 ) {
164 colorForeground = colorBackground;
171 if ( colorForeground == colorBackground ) {
172 colorForeground = ( colorBackground == 0 ) ? 1 : 0;
177 for (
int y=0; y<8; ++y) {
178 for (
int x=0; x<8; ++x) {
182 memset( &rgb, 0,
sizeof(
RGBi ) );
188 rgb.
alpha = *(_source + 3);
192 if ( rgb.
alpha == 0 ) {
198 RGBi *systemRgb = vdc_image_nearest_system_color( &rgb );
200 char bitmask = 1 << ( 7 - ((x) & 0x7) );
202 if ( rgb.
alpha < 255 ) {
203 *( _dest + y ) &= ~bitmask;
206 if ( systemRgb->
index != colorBackground ) {
208 *( _dest + y ) |= bitmask;
212 *( _dest + y ) &= ~bitmask;
221 source += _depth * ( _source_width - 8 );
225 *( _dest + 8 ) = ( colorForeground << 4 ) | colorBackground ;
240static void vdc_image_converter_tiles(
Environment * _environment,
char * _source,
char * _dest,
int _width,
int _height,
int _depth,
int _source_width ) {
242 int bitmapSize = ( _width>>3 ) * _height;
243 int colormapSize = ( _width>>3 ) * (_height>>3);
245 memset( _dest, 0, bitmapSize + colormapSize );
249 for(
int y=0; y<_height; y+=8 ) {
250 for(
int x=0; x<_width; x+=8 ) {
252 char *
source = _source + ( ( y * _source_width ) + x ) * _depth;
255 vdc_image_converter_tile( _environment,
source, tile, _width, _depth, _source_width );
257 int offset = ((y>>3) * 8 *( _width >> 3 ) ) + ((x>>3) * 8) + ((y) & 0x07);
263 char * destBitmap = _dest +
offset;
264 char * destColormap = _dest + bitmapSize + ( ( ( y >> 3 ) * ( _width >> 3 ) ) + ( x >> 3 ) );
265 for(
int i=0; i<8; ++i ) {
266 *destBitmap = tile[i];
270 *destColormap = tile[8];
291static void vdc_image_converter_tile_multicolor(
Environment * _environment,
char * _source,
char * _dest,
int _width,
int _depth,
int _background,
int _source_width ) {
294 memset(colorIndexesCount, 0,
COLOR_COUNT *
sizeof(
int ) );
300 memset( _dest, 0, 10 );
303 for (
int y=0; y<8; ++y) {
304 for (
int x=0; x<4; ++x) {
308 memset( &rgb, 0,
sizeof(
RGBi ) );
315 rgb.
alpha = *(_source + 3);
319 if ( rgb.
alpha == 0 ) {
325 if ( rgb.
alpha < 255 ) {
329 RGBi *systemRgb = vdc_image_nearest_system_color( &rgb );
331 ++colorIndexesCount[systemRgb->
index];
339 source += _depth * ( _source_width - 4 );
347 colorIndexesCount[_background] = 0;
350 int colorFirstMax = 0;
352 int colorSecondMax = 0;
354 int colorThirdMax = 0;
357 if ( colorIndexesCount[xx] > colorFirstMax ) {
359 colorFirstMax = colorIndexesCount[xx];
363 colorIndexesCount[colorFirst] = 0;
366 if ( colorIndexesCount[xx] > colorSecondMax ) {
368 colorSecondMax = colorIndexesCount[xx];
372 colorIndexesCount[colorSecond] = 0;
375 if ( colorIndexesCount[xx] > colorThirdMax ) {
377 colorThirdMax = colorIndexesCount[xx];
381 colorIndexesCount[colorThird] = 0;
385 for (
int y=0; y<8; ++y) {
386 for (
int x=0; x<4; ++x) {
390 memset( &rgb, 0,
sizeof(
RGBi ) );
396 rgb.
alpha = *(_source + 3);
400 if ( rgb.
alpha == 0 ) {
408 if ( rgb.
alpha < 255 ) {
413 RGBi *systemRgb = vdc_image_nearest_system_color( &rgb );
415 if ( systemRgb->
index == colorFirst ) {
418 }
else if ( systemRgb->
index == colorSecond ) {
421 }
else if ( systemRgb->
index == colorThird ) {
430 char bitmask = colorIndex << (6 - ((x & 0x3) * 2));
432 *(_dest + y) |= bitmask;
438 source += _depth * ( _source_width - 4 );
442 *( _dest + 8 ) = ( colorFirst << 4 ) | colorSecond ;
443 *( _dest + 9 ) = ( _background << 4 ) | colorThird;
460static void vdc_image_converter_tiles_multicolor(
Environment * _environment,
char * _source,
char * _dest,
int _width,
int _height,
int _depth,
int _source_width,
int _background ) {
462 int bitmapSize = ( _width>>2 ) * _height;
463 int colormap1Size = ( _width>>2 ) * (_height>>3);
464 int colormap2Size = ( _width>>2 ) * (_height>>3);
466 memset( _dest, 0, bitmapSize + colormap1Size + colormap2Size );
470 for(
int y=0; y<_height; y+=8 ) {
471 for(
int x=0; x<_width; x+=4 ) {
473 char *
source = _source + ( ( y * _source_width ) + x ) * _depth;
476 vdc_image_converter_tile_multicolor( _environment,
source, tile, _width, _depth, _background, _source_width );
478 int offset = ((y>>3) * 8 *( _width >> 2 ) ) + ((x>>2) * 8) + ((y) & 0x07);
480 char * destBitmap = _dest +
offset;
481 char * destColormap1 = _dest + bitmapSize + ( ( ( y >> 3 ) * ( _width >> 2 ) ) + ( x >> 2 ) );
482 char * destColormap2 = _dest + bitmapSize + colormap1Size + ( ( ( y >> 3 ) * ( _width >> 2 ) ) + ( x >> 2 ) );
483 for(
int i=0; i<8; ++i ) {
484 *destBitmap = tile[i];
487 *destColormap1 = tile[8];
488 *destColormap2 = tile[9];
670static int rgbConverterFunction(
int _red,
int _green,
int _blue ) {
673 unsigned int minDistance = 0xffffffff;
681 for (j = 0; j <
sizeof(SYSTEM_PALETTE)/
sizeof(
RGBi); ++j) {
723 deploy( vdcvars, src_hw_vdc_vars_asm);
724 deploy( vdcvarsGraphic, src_hw_vdc_vars_graphic_asm );
734 deploy( vdcvars, src_hw_vdc_vars_asm);
735 deploy( vdcvarsGraphic, src_hw_vdc_vars_graphic_asm );
746 deploy( vdcvars, src_hw_vdc_vars_asm);
747 deploy( vdcvarsGraphic, src_hw_vdc_vars_graphic_asm );
779 deploy( sprite, src_hw_vdc_sprites_asm );
787 deploy( sprite, src_hw_vdc_sprites_asm );
795 deploy( sprite, src_hw_vdc_sprites_asm );
805 deploy( sprite, src_hw_vdc_sprites_asm );
813 deploy( sprite, src_hw_vdc_sprites_asm );
821 deploy( sprite, src_hw_vdc_sprites_asm );
829 deploy( sprite, src_hw_vdc_sprites_asm );
837 deploy( sprite, src_hw_vdc_sprites_asm );
845 deploy( sprite, src_hw_vdc_sprites_asm );
853 deploy( sprite, src_hw_vdc_sprites_asm );
862 deploy( sprite, src_hw_vdc_sprites_asm );
871 deploy( sprite, src_hw_vdc_sprites_asm );
913 deploy( vdcvars, src_hw_vdc_vars_asm);
914 deploy( vScrollTextUp, src_hw_vdc_vscroll_text_up_asm );
915 deploy( textEncodedAt, src_hw_vdc_text_at_asm );
923static RGBi * multicolorSpritePalette[2];
932 copperList = copperList->
next;
940 deploy( textHScroll, src_hw_vdc_hscroll_text_asm );
946 deploy( textHScroll, src_hw_vdc_hscroll_text_asm );
958 deploy( textCline, src_hw_vdc_cline_asm );
962static int calculate_image_size(
Environment * _environment,
int _width,
int _height,
int _mode ) {
968Variable *
vdc_image_converter(
Environment * _environment,
char * _data,
int _width,
int _height,
int _depth,
int _offset_x,
int _offset_y,
int _frame_width,
int _frame_height,
int _mode,
int _transparent_color,
int _flags ) {
984void vdc_put_image(
Environment * _environment,
char * _image,
char * _x,
char * _y,
char * _frame,
char * _sequence,
int _frame_size,
int _frame_count,
char * _flags ) {
986 deploy( vdcvars, src_hw_vdc_vars_asm);
987 deploy( vdcvarsGraphic, src_hw_vdc_vars_graphic_asm );
988 deploy( putimage, src_hw_vdc_put_image_asm );
992void vdc_blit_image(
Environment * _environment,
char * _sources[],
int _source_count,
char * _blit,
char * _x,
char * _y,
char * _frame,
char * _sequence,
int _frame_size,
int _frame_count,
int _flags ) {
994 deploy( vdcvars, src_hw_vdc_vars_asm);
995 deploy( vdcvarsGraphic, src_hw_vdc_vars_graphic_asm );
996 deploy( blitimage, src_hw_vdc_blit_image_asm );
1002 deploy( vdcvarsGraphic, src_hw_vdc_vars_graphic_asm );
1003 deploy( vbl, src_hw_vdc_vbl_asm);
1041void vdc_get_image(
Environment * _environment,
char * _image,
char * _x,
char * _y,
char * _frame,
char * _sequence,
int _frame_size,
int _frame_count,
int _palette ) {
1043 deploy( vdcvars, src_hw_vdc_vars_asm);
1044 deploy( vdcvarsGraphic, src_hw_vdc_vars_graphic_asm );
1045 deploy( getimage, src_hw_vdc_get_image_asm );
1051 deploy( vdcvars, src_hw_vdc_vars_asm);
1053 deploy( textHScroll, src_hw_vdc_hscroll_text_asm );
1054 deploy( vScrollTextDown, src_hw_vdc_vscroll_text_down_asm );
1055 deploy( vScrollTextUp, src_hw_vdc_vscroll_text_up_asm );
1061 deploy( vdcvars, src_hw_vdc_vars_asm);
1062 deploy( tiles, src_hw_vdc_tiles_asm );
1072 deploy( vdcvars, src_hw_vdc_vars_asm);
1073 deploy( tiles, src_hw_vdc_tiles_asm );
1079 deploy( vdcvars, src_hw_vdc_vars_asm);
1080 deploy( tiles, src_hw_vdc_tiles_asm );
1086 deploy( vdcvars, src_hw_vdc_vars_asm);
1087 deploy( tiles, src_hw_vdc_tiles_asm );
1093 deploy( vdcvars, src_hw_vdc_vars_asm);
1094 deploy( tiles, src_hw_vdc_tiles_asm );
1106void vdc_slice_image(
Environment * _environment,
char * _image,
char * _frame,
char * _sequence,
int _frame_size,
int _frame_count,
char * _destination ) {
int lastUsedSlotInCommonPalette
Variable * variable_retrieve(Environment *_environment, char *_name)
Variable * variable_retrieve_or_define(Environment *_environment, char *_name, VariableType _type, int _value)
int rgbi_distance(RGBi *_e1, RGBi *_e2)
Calculate the distance between two colors.
Variable * variable_temporary(Environment *_environment, VariableType _type, char *_meaning)
Define a temporary variable.
void back(Environment *_environment, char *_color)
Emit ASM code to fill background color.
void color(Environment *_environment, int _index, int _shade)
Emit ASM code for instruction COLOR [int], [int].
void plot(Environment *_environment, char *_x, char *_y, char *_c, int _preserve_color)
Variable * distance(Environment *_environment, char *_x1, char *_y1, char *_x2, char *_y2)
Return the distance between two (screen) positions.
struct _CopperList * next
unsigned char * valueBuffer
struct _ScreenMode ScreenMode
struct _RGBi RGBi
Structure to store color components (red, green and blue).
#define adilineendbitmap()
struct _Variable Variable
Structure of a single variable.
struct _Environment Environment
Structure of compilation environment.
#define adilinebeginbitmap(s)
struct _CopperList CopperList
void vdc_raster_at(Environment *_environment, char *_label, char *_positionlo, char *_positionhi)
void vdc_get_image(Environment *_environment, char *_image, char *_x, char *_y, char *_frame, char *_sequence, int _frame_size, int _frame_count, int _palette)
void vdc_background_color_semivars(Environment *_environment, int _index, char *_background_color)
void vdc_sprite_color(Environment *_environment, char *_sprite, char *_color)
Variable * vdc_sprite_converter(Environment *_environment, char *_data, int _width, int _height, int _depth, RGBi *_color, int _flags)
void vdc_next_raster(Environment *_environment)
void vdc_bitmap_disable(Environment *_environment)
void vdc_put_tiles(Environment *_environment, char *_image, char *_x, char *_y, char *_w, char *_h)
void vdc_tiles_get(Environment *_environment, char *_result)
void vdc_finalization(Environment *_environment)
void vdc_tiles_at(Environment *_environment, char *_address)
void vdc_put_tile(Environment *_environment, char *_image, char *_x, char *_y)
void vdc_cline(Environment *_environment, char *_characters)
void vdc_background_color_get_vars(Environment *_environment, char *_index, char *_background_color)
void vdc_sprite_compress_vertical(Environment *_environment, char *_sprite)
void vdc_screen_on(Environment *_environment)
void vdc_tilemap_enable(Environment *_environment, int _width, int _height, int _colors, int _tile_width, int _tile_height)
void vdc_sprite_common_color(Environment *_environment, char *_index, char *_common_color)
void vdc_tile_at(Environment *_environment, char *_x, char *_y, char *_result)
void vdc_wait_vbl(Environment *_environment)
void vdc_hit(Environment *_environment, char *_sprite_mask, char *_result)
void vdc_sprite_compress_horizontal(Environment *_environment, char *_sprite)
void vdc_screen_columns(Environment *_environment, char *_columns)
void vdc_sprite_multicolor(Environment *_environment, char *_sprite)
void vdc_use_tileset(Environment *_environment, char *_tileset)
void vdc_bitmap_at(Environment *_environment, char *_address)
Variable * vdc_new_images(Environment *_environment, int _frames, int _width, int _height, int _mode)
void vdc_sprite_data_from(Environment *_environment, char *_sprite, char *_address)
void vdc_blit_image(Environment *_environment, char *_sources[], int _source_count, char *_blit, char *_x, char *_y, char *_frame, char *_sequence, int _frame_size, int _frame_count, int _flags)
void vdc_move_tiles(Environment *_environment, char *_image, char *_x, char *_y)
int vdc_screen_mode_enable(Environment *_environment, ScreenMode *_screen_mode)
void vdc_textmap_at(Environment *_environment, char *_address)
void vdc_cls(Environment *_environment)
void vdc_sprite_priority(Environment *_environment, char *_sprite, char *_priority)
Variable * vdc_image_converter(Environment *_environment, char *_data, int _width, int _height, int _depth, int _offset_x, int _offset_y, int _frame_width, int _frame_height, int _mode, int _transparent_color, int _flags)
void vdc_background_color_vars(Environment *_environment, char *_index, char *_background_color)
Variable * vdc_new_image(Environment *_environment, int _width, int _height, int _mode)
Variable * vdc_collision(Environment *_environment, char *_sprite)
void vdc_sprite_expand_horizontal(Environment *_environment, char *_sprite)
void vdc_screen_off(Environment *_environment)
void vdc_bank_select(Environment *_environment, int _bank)
void vdc_initialization(Environment *_environment)
void vdc_sprite_disable(Environment *_environment, char *_sprite)
void vdc_sprite_at(Environment *_environment, char *_sprite, char *_x, char *_y)
void vdc_scroll_text(Environment *_environment, int _direction, int _overlap)
void vdc_next_raster_at(Environment *_environment, char *_label, char *_positionlo, char *_positionhi)
void vdc_bitmap_enable(Environment *_environment, int _width, int _height, int _colors)
void vdc_horizontal_scroll(Environment *_environment, char *_displacement)
void vdc_slice_image(Environment *_environment, char *_image, char *_frame, char *_sequence, int _frame_size, int _frame_count, char *_destination)
void vdc_put_image(Environment *_environment, char *_image, char *_x, char *_y, char *_frame, char *_sequence, int _frame_size, int _frame_count, char *_flags)
void vdc_pget_color_vars(Environment *_environment, char *_x, char *_y, char *_result)
void vdc_pset_int(Environment *_environment, int _x, int _y, int *_c)
Variable * vdc_new_sequence(Environment *_environment, int _sequences, int _frames, int _width, int _height, int _mode)
void vdc_hscroll_screen(Environment *_environment, int _direction, int _overlap)
Variable * vdc_get_raster_line(Environment *_environment)
void vdc_busy_wait(Environment *_environment, char *_timing)
void vdc_hscroll_line(Environment *_environment, int _direction, int _overlap)
void vdc_text(Environment *_environment, char *_text, char *_text_size, int _raw)
void vdc_back(Environment *_environment)
void vdc_calculate_sequence_frame_offset(Environment *_environment, char *_offset, char *_sequence, char *_frame, int _frame_size, int _frame_count)
void vdc_pset_vars(Environment *_environment, char *_x, char *_y, char *_c)
void vdc_sprite_data_set(Environment *_environment, char *_sprite, char *_address)
void vdc_scroll(Environment *_environment, int _dx, int _dy)
void vdc_screen_rows(Environment *_environment, char *_rows)
void vdc_colormap_at(Environment *_environment, char *_address)
void vdc_sprite_expand_vertical(Environment *_environment, char *_sprite)
void vdc_sprite_monocolor(Environment *_environment, char *_sprite)
void vdc_get_width(Environment *_environment, char *_result)
void vdc_vertical_scroll(Environment *_environment, char *_displacement)
void vdc_get_height(Environment *_environment, char *_result)
void vdc_sprite_enable(Environment *_environment, char *_sprite)
void vdc_border_color(Environment *_environment, char *_border_color)
void vdc_background_color(Environment *_environment, int _index, int _background_color)