350 lines
9.2 KiB
C
350 lines
9.2 KiB
C
|
/*
|
||
|
* Copyright (c) 1993-1995 Argonaut Technologies Limited. All rights reserved.
|
||
|
*
|
||
|
* $Id: SURFTYPE.C 1.3 1997/07/23 15:51:32 jon Exp JON $
|
||
|
* $Locker: JON $
|
||
|
*
|
||
|
* Useful routines for dealing with BRender and DirectDraw pixel formats
|
||
|
*/
|
||
|
#include "drv.h"
|
||
|
#include "surftype.h"
|
||
|
|
||
|
BR_RCS_ID("$Id: SURFTYPE.C 1.3 1997/07/23 15:51:32 jon Exp JON $");
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* DirectDraw pixel format structures for every BRender pixel format
|
||
|
*/
|
||
|
struct {
|
||
|
|
||
|
br_boolean valid;
|
||
|
br_boolean indexed;
|
||
|
br_uint_32 pixel_bits;
|
||
|
br_uint_32 r_bits;
|
||
|
br_uint_32 g_bits;
|
||
|
br_uint_32 b_bits;
|
||
|
br_uint_32 a_bits;
|
||
|
|
||
|
DDPIXELFORMAT ddpixelformat;
|
||
|
|
||
|
} pixeltype[] = {
|
||
|
|
||
|
// BR_PMT_INDEX_1
|
||
|
|
||
|
{ BR_TRUE, BR_TRUE, 1, 0, 0, 0, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED1 | DDPF_RGB, 0,
|
||
|
1, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_INDEX_2
|
||
|
|
||
|
{ BR_TRUE, BR_TRUE, 2, 0, 0, 0, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED2 | DDPF_RGB, 0,
|
||
|
2, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_INDEX_4
|
||
|
|
||
|
{ BR_TRUE, BR_TRUE, 4, 0, 0, 0, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED4 | DDPF_RGB, 0,
|
||
|
4, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_INDEX_8
|
||
|
|
||
|
{ BR_TRUE, BR_TRUE, 8, 0, 0, 0, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED8 | DDPF_RGB, 0,
|
||
|
8, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_RGB_555
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 15, 5, 5, 5, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
|
||
|
16, 0x00007c00, 0x000003e0, 0x0000001f, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_RGB_565
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 16, 5, 6, 5, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
|
||
|
16, 0x0000f800, 0x000007e0, 0x0000001f, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_RGB_888
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 24, 8, 8, 8, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
|
||
|
24, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_RGBX_888
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 32, 8, 8, 8, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
|
||
|
32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_RGBA_8888
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 32, 8, 8, 8, 8,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
|
||
|
32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 } },
|
||
|
|
||
|
// BR_PMT_YUYV_8888 *** HMMMMMMM ***
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 32, 16, 8, 8, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_YUV, 0,
|
||
|
32, 0xff00ff00, 0x00ff0000, 0x000000ff, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_YUV_888
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 24, 8, 8, 8, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_YUV, 0,
|
||
|
24, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_DEPTH_16
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 16, 0, 0, 0, 16,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_ZBUFFER, 0,
|
||
|
16, 0x00000000, 0x00000000, 0x00000000, 0x0000ffff } },
|
||
|
|
||
|
// BR_PMT_DEPTH_32
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 32, 0, 0, 0, 32,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_ZBUFFER, 0,
|
||
|
32, 0x00000000, 0x00000000, 0x00000000, 0xffffffff } },
|
||
|
|
||
|
// BR_PMT_ALPHA_8
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 8, 0, 0, 0, 8,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_ALPHA, 0,
|
||
|
8, 0x00000000, 0x00000000, 0x00000000, 0x000000ff } },
|
||
|
|
||
|
// BR_PMT_INDEXA_88 *** HMMMMMMM *** *** MASK CORRECT? ***
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 16, 0, 0, 0, 8,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED8 | DDPF_ALPHAPIXELS, 0,
|
||
|
16, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00 } },
|
||
|
|
||
|
// BR_PMT_NORMAL_INDEX_8 *** HMMMMMMM ***
|
||
|
|
||
|
{ BR_FALSE, BR_FALSE, 8, 0, 0, 0, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), 0, 0,
|
||
|
8, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_NORMAL_XYZ *** HMMMMMMM *** *** BIT COUNT CORRECT? ***
|
||
|
|
||
|
{ BR_FALSE, BR_FALSE, 24, 0, 0, 0, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), 0, 0,
|
||
|
24, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_BGR_555
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 24, 5, 5, 5, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
|
||
|
24, 0x0000001f, 0x000003e0, 0x00007c00, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_RGBA_4444
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 16, 4, 4, 4, 4,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
|
||
|
16, 0x00000f00, 0x000000f0, 0x0000000f, 0x0000f000 } },
|
||
|
|
||
|
// BR_PMT_RBG_bab *** HMMMMMMM ***
|
||
|
|
||
|
{ BR_FALSE, BR_FALSE, 16, 0, 0, 0, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), 0, 0,
|
||
|
16, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_RBG_1aba *** HMMMMMMM ***
|
||
|
|
||
|
{ BR_FALSE, BR_FALSE, 16, 0, 0, 0, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), 0, 0,
|
||
|
16, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_RGB_332
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 8, 3, 3, 2, 0,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
|
||
|
8, 0x000000e0, 0x0000001c, 0x00000003, 0x00000000 } },
|
||
|
|
||
|
// BR_PMT_DEPTH_8
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 8, 0, 0, 0, 8,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_ZBUFFER, 0,
|
||
|
8, 0x00000000, 0x00000000, 0x00000000, 0x000000ff } },
|
||
|
|
||
|
// BR_PMT_ARGB_8888 *** MASKS CORRECT? ***
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 32, 8, 8, 8, 8,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
|
||
|
32, 0x0000f000, 0x00000f00, 0x000000f0, 0x0000000f } },
|
||
|
|
||
|
// BR_PMT_ALPHA_4
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 4, 0, 0, 0, 4,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_ALPHA, 0,
|
||
|
4, 0x00000000, 0x00000000, 0x00000000, 0x0000000f } },
|
||
|
|
||
|
// BR_PMT_AINDEX_44 *** HMMMMMMM *** *** MASK CORRECT? ***
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 8, 0, 0, 0, 4,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED4 | DDPF_ALPHAPIXELS, 0,
|
||
|
8, 0x00000000, 0x00000000, 0x00000000, 0x000000f0 } },
|
||
|
|
||
|
// BR_PMT_AINDEX_88 *** HMMMMMMM *** *** MASK CORRECT? ***
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 16, 0, 0, 0, 8,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED8 | DDPF_ALPHAPIXELS, 0,
|
||
|
16, 0x00000000, 0x00000000, 0x00000000, 0x0000ff00 } },
|
||
|
|
||
|
// BR_PMT_DEPTH_15 *** HMMMMMMM ***
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 16, 0, 0, 0, 15,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_ZBUFFER, 0,
|
||
|
16, 0x00000000, 0x00000000, 0x00000000, 0x00007fff } },
|
||
|
|
||
|
// BR_PMT_DEPTH_31 *** HMMMMMMM ***
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 32, 0, 0, 0, 31,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_ZBUFFER, 0,
|
||
|
32, 0x00000000, 0x00000000, 0x00000000, 0x7fffffff } },
|
||
|
|
||
|
// BR_PMT_DEPTH_FP16 *** HMMMMMMM ***
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 16, 0, 0, 0, 16,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_ZBUFFER, 0,
|
||
|
16, 0x00000000, 0x00000000, 0x00000000, 0x0000ffff } },
|
||
|
|
||
|
// BR_PMT_DEPTH_FP15
|
||
|
|
||
|
{ BR_TRUE, BR_FALSE, 16, 0, 0, 0, 15,
|
||
|
{ sizeof(DDPIXELFORMAT), DDPF_ZBUFFER, 0,
|
||
|
16, 0x00000000, 0x00000000, 0x00000000, 0x00007fff } },
|
||
|
};
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Pixel format flags that are significant for comparison purposes for indexed and direct pixel
|
||
|
* types
|
||
|
*/
|
||
|
#define INDEXED_DDPF_MASK (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 | DDPF_PALETTEINDEXED4 |\
|
||
|
DDPF_PALETTEINDEXED8 | DDPF_ALPHAPIXELS | DDPF_ZPIXELS | DDPF_COMPRESSED)
|
||
|
|
||
|
#define DIRECT_DDPF_MASK (DDPF_ALPHA | DDPF_ALPHAPIXELS | DDPF_ZBUFFER | DDPF_ZPIXELS |\
|
||
|
DDPF_PALETTEINDEXEDTO8 | DDPF_RGB | DDPF_YUV | DDPF_COMPRESSED | DDPF_RGBTOYUV)
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Convert a BRender pixel type to a DirectDraw pixel format
|
||
|
*/
|
||
|
br_error PixelTypeToDDPixelFormat(LPDDPIXELFORMAT *format, br_uint_32 type)
|
||
|
{
|
||
|
if (type > BR_ASIZE(pixeltype) || !pixeltype[type].valid)
|
||
|
return BRE_FAIL;
|
||
|
|
||
|
*format = &pixeltype[type].ddpixelformat;
|
||
|
|
||
|
return BRE_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Convert a BRender pixel type to a DirectDraw pixel format
|
||
|
*/
|
||
|
br_error DDPixelFormatToPixelType(br_uint_32 *type, LPDDPIXELFORMAT format)
|
||
|
{
|
||
|
br_uint_32 i;
|
||
|
|
||
|
for (i = 0; i < BR_ASIZE(pixeltype); i++) {
|
||
|
|
||
|
/*
|
||
|
* Check appropriate flags are correct
|
||
|
*
|
||
|
* At the moment I ignore the PALETTEINDEXEDTO8, RGB and YUV flags for indexed types because
|
||
|
* I don't care what the palette is. I also ignore some other flags which have no place
|
||
|
* in an indexed type
|
||
|
*/
|
||
|
if (format->dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 |
|
||
|
DDPF_PALETTEINDEXED4 | DDPF_PALETTEINDEXED8)) {
|
||
|
|
||
|
if ((format->dwFlags & INDEXED_DDPF_MASK) !=
|
||
|
(pixeltype[i].ddpixelformat.dwFlags & INDEXED_DDPF_MASK))
|
||
|
|
||
|
continue;
|
||
|
|
||
|
} else {
|
||
|
|
||
|
if ((format->dwFlags & DIRECT_DDPF_MASK) !=
|
||
|
(pixeltype[i].ddpixelformat.dwFlags & DIRECT_DDPF_MASK))
|
||
|
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (format->dwFlags & DDPF_RGB &&
|
||
|
(format->dwRBitMask != pixeltype[i].ddpixelformat.dwRBitMask ||
|
||
|
format->dwGBitMask != pixeltype[i].ddpixelformat.dwGBitMask ||
|
||
|
format->dwBBitMask != pixeltype[i].ddpixelformat.dwBBitMask))
|
||
|
|
||
|
continue;
|
||
|
|
||
|
if (format->dwFlags & DDPF_YUV &&
|
||
|
(format->dwYBitMask != pixeltype[i].ddpixelformat.dwYBitMask ||
|
||
|
format->dwUBitMask != pixeltype[i].ddpixelformat.dwUBitMask ||
|
||
|
format->dwVBitMask != pixeltype[i].ddpixelformat.dwVBitMask))
|
||
|
|
||
|
continue;
|
||
|
|
||
|
if (format->dwFlags & (DDPF_ALPHA | DDPF_ALPHAPIXELS) &&
|
||
|
format->dwRGBAlphaBitMask != pixeltype[i].ddpixelformat.dwRGBAlphaBitMask)
|
||
|
|
||
|
continue;
|
||
|
|
||
|
if (format->dwFlags & (DDPF_ZBUFFER | DDPF_ZPIXELS) &&
|
||
|
format->dwRGBZBitMask != pixeltype[i].ddpixelformat.dwRGBZBitMask)
|
||
|
|
||
|
continue;
|
||
|
|
||
|
*type = i;
|
||
|
return BRE_OK;
|
||
|
}
|
||
|
|
||
|
return BRE_FAIL;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Simple pixel type properties - would prefer to make these inline, but H2INC can't cope with the
|
||
|
* windows includes
|
||
|
*/
|
||
|
br_boolean PixelTypeIndexed(br_uint_32 type)
|
||
|
{
|
||
|
return pixeltype[type].indexed;
|
||
|
}
|
||
|
|
||
|
br_uint_32 PixelTypePixelBits(br_uint_32 type)
|
||
|
{
|
||
|
return pixeltype[type].pixel_bits;
|
||
|
}
|
||
|
|
||
|
br_uint_32 PixelTypePixelBytes(br_uint_32 type)
|
||
|
{
|
||
|
return (pixeltype[type].pixel_bits + 7) / 8;
|
||
|
}
|
||
|
|
||
|
br_uint_32 PixelTypeRBits(br_uint_32 type)
|
||
|
{
|
||
|
return pixeltype[type].r_bits;
|
||
|
}
|
||
|
|
||
|
br_uint_32 PixelTypeGBits(br_uint_32 type)
|
||
|
{
|
||
|
return pixeltype[type].g_bits;
|
||
|
}
|
||
|
|
||
|
br_uint_32 PixelTypeBBits(br_uint_32 type)
|
||
|
{
|
||
|
return pixeltype[type].b_bits;
|
||
|
}
|
||
|
|
||
|
br_uint_32 PixelTypeABits(br_uint_32 type)
|
||
|
{
|
||
|
return pixeltype[type].a_bits;
|
||
|
}
|
||
|
|