byte sprite_bpp(const osspriteop_header *s) { /* bit 31 indicates the presence of a full alpha channel * rather than a binary mask */ int type = ((unsigned)s->mode >> osspriteop_TYPE_SHIFT) & 15; byte bpp = 0; switch (type) { case osspriteop_TYPE_OLD: { bits psr; int val; if (!xos_read_mode_variable(s->mode, os_MODEVAR_LOG2_BPP, &val, &psr) && !(psr & _C)) bpp = 1 << val; } break; case osspriteop_TYPE1BPP: bpp = 1; break; case osspriteop_TYPE2BPP: bpp = 2; break; case osspriteop_TYPE4BPP: bpp = 4; break; case osspriteop_TYPE8BPP: bpp = 8; break; case osspriteop_TYPE16BPP: bpp = 16; break; case osspriteop_TYPE32BPP: bpp = 32; break; case osspriteop_TYPE_CMYK: bpp = 32; break; } return bpp; }
unsigned int ro_gui_dialog_test_sprite(const char *name) { unsigned int result = 0; int var_val; os_coord dimensions; os_mode mode; os_error *error; error = xosspriteop_read_sprite_info(osspriteop_USER_AREA, theme_sprites, (osspriteop_id)name, &dimensions.x, &dimensions.y, 0, &mode); if (error) return 1; if (((unsigned int)mode) & osspriteop_ALPHA_MASK) result |= 4; error = xos_read_mode_variable(mode, os_MODEVAR_LOG2_BPP, &var_val, 0); if (error) { LOG(("xos_read_mode_variable: 0x%x: %s", error->errnum, error->errmess)); } else { if (var_val > 3) result |= 2; } return result; }