Пример #1
0
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;
    }
}
Пример #2
0
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;
	}
}