static void decompress_and_huechange_r8g8b8a5h3_sprite_rle_texture( struct bitmap_data *bitmap, int miplevel, byte *write, struct shading_table_header *shading_header) { byte *read = (byte*)bitmap->row_addresses[0]; byte *end = write + 4*bitmap->width*bitmap->height; byte alpha_state = 0; do { if(IS_TRANSPARENT_OR_OPAQUE(alpha_state)) { // decode RLE byte run_length = 0; run_length = *read++; if(run_length) { if(IS_OPAQUE(alpha_state)) { decode_colorized(&write, &read, run_length, shading_header, alpha_state); } else { pixel32 *start = (pixel32*)write; pixel32 *end = start+run_length; fill(start, end, 0); write = (byte*)end; } } alpha_state = A5H3PIXEL(1,0); } else do { // decode plain alpha_state = *read++; if(A5H3PIXEL_A(alpha_state)) { decode_colorized(&write, &read, 1, shading_header, alpha_state); } else { *(pixel32*)write = 0; write += 4; } } while(!IS_TRANSPARENT_OR_OPAQUE(alpha_state) && write < end); } while(write < end); } static void decompress_and_huechange_r8g8b8a5h3_sprite_rle_texture_2( struct bitmap_data *bitmap, int miplevel, byte *write_, struct shading_table_header *shading_header) { pixel32 *write = (pixel32*)write_; byte *read = (byte*)bitmap->row_addresses[0]; pixel32 *end = write + 4*bitmap->width*bitmap->height; byte alpha_state = 0, next_alpha_state; do { int run_length; if(IS_TRANSPARENT_OR_OPAQUE(alpha_state)) { // decode RLE run_length = *read++; next_alpha_state = A5H3PIXEL(1,0); if(!run_length) { alpha_state = next_alpha_state; continue; } } else { // decode plain run_length = 1; next_alpha_state = alpha_state = *read++; } if(!A5H3PIXEL_A(alpha_state)) { pixel32 *run_end = write + run_length; fill(write, run_end, 0); write = run_end; } else { decode_colorized((byte**)&write, &read, run_length, shading_header, alpha_state); } alpha_state = next_alpha_state; } while(write < end); }