/** * @file graphics_tables.c * @brief Implements the BASIC 7.0 color palette lookup. * * This is a table, so it is laid out as one. The RGB values are the widely * reproduced VIC-II palette (Pepto's measurement of a PAL 6569R3), which is what * an emulator shows and therefore what somebody porting a listing expects to * see. They are not a C128 ROM constant -- the real machine has no RGB anywhere * in it, it has a chroma/luma encoder -- so this is a choice, not a transcription. */ #include #include #include /** * @brief The sixteen BASIC 7.0 colors, indexed from 1 as BASIC indexes them. * * Slot 0 is unused and left black so an off-by-one reads as black rather than as * whatever the last entry happened to be. */ static const akbasic_Color PALETTE[17] = { { 0x00, 0x00, 0x00, 0xff }, /* 0 -- unused; BASIC counts colors from 1 */ { 0x00, 0x00, 0x00, 0xff }, /* 1 -- black */ { 0xff, 0xff, 0xff, 0xff }, /* 2 -- white */ { 0x88, 0x39, 0x32, 0xff }, /* 3 -- red */ { 0x67, 0xb6, 0xbd, 0xff }, /* 4 -- cyan */ { 0x8b, 0x3f, 0x96, 0xff }, /* 5 -- purple */ { 0x55, 0xa0, 0x49, 0xff }, /* 6 -- green */ { 0x40, 0x31, 0x8d, 0xff }, /* 7 -- blue */ { 0xbf, 0xce, 0x72, 0xff }, /* 8 -- yellow */ { 0x8b, 0x54, 0x29, 0xff }, /* 9 -- orange */ { 0x57, 0x42, 0x00, 0xff }, /* 10 -- brown */ { 0xb8, 0x69, 0x62, 0xff }, /* 11 -- light red */ { 0x50, 0x50, 0x50, 0xff }, /* 12 -- dark grey */ { 0x78, 0x78, 0x78, 0xff }, /* 13 -- medium grey */ { 0x94, 0xe0, 0x89, 0xff }, /* 14 -- light green */ { 0x78, 0x69, 0xc4, 0xff }, /* 15 -- light blue */ { 0x9f, 0x9f, 0x9f, 0xff } /* 16 -- light grey */ }; akerr_ErrorContext *akbasic_graphics_palette(int index, akbasic_Color *dest) { PREPARE_ERROR(errctx); FAIL_ZERO_RETURN(errctx, (dest != NULL), AKERR_NULLPOINTER, "NULL destination in palette"); FAIL_ZERO_RETURN(errctx, (index >= 1 && index <= 16), AKBASIC_ERR_BOUNDS, "Color index %d out of range (1 to 16)", index); *dest = PALETTE[index]; SUCCEED_RETURN(errctx); }