From: Robert Jr O. <roh...@vi...> - 2007-01-26 07:34:10
|
I'd like to propose an alternative way of specifying bitmap formats in the new graphics API. Currently, we have a bunch of enums ORed together: * Allegro supports several color spaces. The color space is * specified by the following flags in the format parameter: * - AL_RGBA * - AL_RGB * - AL_PALETTE * - AL_YUV * - AL_LUMINANCE * * These flags select the color space but not the color depth. The depth * is selected via one of the following flags, which are combined with * a binary OR (|) with the previous ones: * - AL_COLOR_8 * - AL_COLOR_8_8_I * - AL_COLOR_5_5_5 (== AL_COLOR_15?) * - AL_COLOR_5_6_5 (== AL_COLOR_16?) * - AL_COLOR_8_8_8 (== AL_COLOR_24?) * - AL_COLOR_8_8_8_8 (== AL_COLOR_32?) * - AL_COLOR_10_10_10 * - AL_COLOR_10_10_10_2 * - AL_COLOR_16_16_16 * - AL_COLOR_16_16_16_16 * - AL_COLOR_32_32_32 * - AL_COLOR_32_32_32_32 (== AL_COLOR_128?) * * The color depth specification can be augmented by the following flags, which * are combined with a binray OR (|) with the previous ones: * - AL_COLOR_INTEGER * - AL_COLOR_FLOAT Instead, I'd like to move towards a more OpenGL-like system: There ought to be 3 separate format identifiers: <internalformat>, <format> and <type>. When creating a bitmap, users specify only an <internalformat>, which is essentially a hint to Allegro as to what format to actually pick. The list of internalformats is much more contrained than all the possibilities available above. For example: AL_RGBA8, AL_RGB5_A1, or AL_RGB32F, or even AL_YUV_422. However, when data supplied directly by the user needs to be provided to Allegro (ie: through al_bitmap_write*() and al_bitmap_read*()), then separate <format> and <type> parameters can be queried so that users can know how to provide the necessary information to Allegro. For example, AL_RGB32F bitmaps would return a format of AL_RGB and a type of AL_FLOAT32. Or perhaps a format of AL_BGR, on platforms where the component ordering is reversed. Writing the bitmap one pixel at a time, through al_put_pixel() / al_make_rgb*() would still not need to know the bitmap format, from the users' perspective. I think the benefit here is reducing parameter validation complexity, and format explosion. Thoughts? |