static void VDI_ReadExtInfo(_THIS, short *work_out) { unsigned long EdDI_version; unsigned long cookie_EdDI; Uint32 num_colours; Uint16 clut_type, num_bits; /* Read EdDI informations */ if (Getcookie(C_EdDI, &cookie_EdDI) == C_NOTFOUND) { return; } EdDI_version = Atari_get_EdDI_version( (void *)cookie_EdDI); vq_scrninfo(VDI_handle, work_out); VDI_format = work_out[0]; clut_type = work_out[1]; num_bits = work_out[2]; num_colours = *((Uint32 *) &work_out[3]); /* With EdDI>=1.1, we can have screen pitch, address and format * so we can directly write to screen without using vro_cpyfm */ if (EdDI_version >= EDDI_11) { VDI_pitch = work_out[5]; VDI_screen = (void *) *((unsigned long *) &work_out[6]); switch(num_colours) { case 32768UL: if (work_out[14] & (1<<7)) { /* Little endian */ if (work_out[14] & (1<<1)) { /* Falcon */ VDI_alphamask = 1 << 13; VDI_redmask = 31 << 3; VDI_greenmask = (3 << 14) | 7; VDI_bluemask = 31 << 8; } else { /* Others */ VDI_alphamask = 1 << 7; VDI_redmask = 31 << 2; VDI_greenmask = (7 << 13) | 3; VDI_bluemask = 31 << 8; } } else { /* Big endian */ if (work_out[14] & (1<<1)) { /* Falcon */ VDI_alphamask = 1 << 5; VDI_redmask = 31 << 11; VDI_greenmask = 31 << 6; VDI_bluemask = 31; } else { /* Others */ VDI_alphamask = 1 << 15; VDI_redmask = 31 << 10; VDI_greenmask = 31 << 5; VDI_bluemask = 31; } } break; case 65536UL: if (work_out[14] & (1<<7)) { /* Little endian */ VDI_alphamask = 0; VDI_redmask = 31 << 3; VDI_greenmask = (7 << 13) | 7; VDI_bluemask = 31 << 8; } else { /* Big endian */ VDI_alphamask = 0; VDI_redmask = 31 << 11; VDI_greenmask = 63 << 5; VDI_bluemask = 31; } break; case 16777216UL: if (work_out[14] & (1<<7)) { /* Little endian */ switch(num_bits) { case 24: VDI_alphamask = 0; VDI_redmask = 255; VDI_greenmask = 255 << 8; VDI_bluemask = 255 << 16; break; case 32: VDI_alphamask = 255; VDI_redmask = 255 << 8; VDI_greenmask = 255 << 16; VDI_bluemask = 255 << 24; break; } } else { /* Big endian */ switch(num_bits) { case 24: VDI_alphamask = 0; VDI_redmask = 255 << 16; VDI_greenmask = 255 << 8; VDI_bluemask = 255; break; case 32: VDI_alphamask = 255 << 24; VDI_redmask = 255 << 16; VDI_greenmask = 255 << 8; VDI_bluemask = 255; break; } } break; } } switch(clut_type) { case VDI_CLUT_HARDWARE: { int i; Uint16 *tmp_p; tmp_p = (Uint16 *)&work_out[16]; for (i=0; i<256; i++) { vdi_index[*tmp_p++] = i; } } break; case VDI_CLUT_SOFTWARE: if (EdDI_version < EDDI_11) { int component; /* red, green, blue, alpha, overlay */ int num_bit; unsigned short *tmp_p; /* We can build masks with info here */ tmp_p = (unsigned short *) &work_out[16]; for (component=0; component<5; component++) { for (num_bit=0; num_bit<16; num_bit++) { unsigned short valeur; valeur = *tmp_p++; if (valeur == 0xffff) { continue; } switch(component) { case 0: VDI_redmask |= 1<< valeur; break; case 1: VDI_greenmask |= 1<< valeur; break; case 2: VDI_bluemask |= 1<< valeur; break; case 3: VDI_alphamask |= 1<< valeur; break; } } } } /* Remove lower green bits for Intel endian screen */ if ((VDI_greenmask == ((7<<13)|3)) || (VDI_greenmask == ((7<<13)|7))) { VDI_greenmask &= ~(7<<13); } break; case VDI_CLUT_NONE: break; } }
static void VDI_ReadExtInfo(_THIS, short *work_out) { unsigned long EdDI_version; long cookie_EdDI; Uint16 clut_type; if (Getcookie(C_EdDI, &cookie_EdDI) == C_NOTFOUND) { return; } EdDI_version = Atari_get_EdDI_version( (void *)cookie_EdDI); vq_scrninfo(VDI_handle, work_out); VDI_format = work_out[0]; clut_type = work_out[1]; if (EdDI_version >= EDDI_11) { VDI_pitch = work_out[5]; VDI_screen = (void *) *((unsigned long *) &work_out[6]); } switch(clut_type) { case VDI_CLUT_HARDWARE: { int i; Uint16 *tmp_p; tmp_p = (Uint16 *)&work_out[16]; for (i=0;i<256;i++) { vdi_index[*tmp_p++] = i; } } break; case VDI_CLUT_SOFTWARE: { int component; int num_bit; unsigned short *tmp_p; tmp_p = (unsigned short *) &work_out[16]; for (component=0;component<5;component++) { for (num_bit=0;num_bit<16;num_bit++) { unsigned short valeur; valeur = *tmp_p++; if (valeur == 0xffff) { continue; } switch(component) { case 0: VDI_redmask |= 1<< valeur; break; case 1: VDI_greenmask |= 1<< valeur; break; case 2: VDI_bluemask |= 1<< valeur; break; case 3: VDI_alphamask |= 1<< valeur; break; } } } } if ((VDI_greenmask == ((7<<13)|3)) || (VDI_greenmask == ((7<<13)|7))) { VDI_greenmask &= ~(7<<13); } break; case VDI_CLUT_NONE: break; } }