brender-1997/d3drend/Surftype.c

350 lines
9.2 KiB
C
Raw Permalink Normal View History

2022-05-03 16:30:35 -05:00
/*
* 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;
}