static int decode_sprite(int gfx_index, const gfx_layout *layout, const void *data) { /* decode the graphics */ Machine->gfx[gfx_index] = allocgfx(layout); if (!Machine->gfx[gfx_index]) return 1; decodegfx(Machine->gfx[gfx_index], data, 0, Machine->gfx[gfx_index]->total_elements); /* set the color information */ Machine->gfx[gfx_index]->colortable = &Machine->remapped_colortable[1024]; Machine->gfx[gfx_index]->total_colors = 64; return 0; }
static int decode_bg(int region) { static const gfx_layout bg_layout = { 8, 8, 2048, 3, { 0x40000+4, 0, 4 }, { 0, 1, 2, 3, 8, 9, 10, 11 }, { 0, 16, 32, 48, 64, 80, 96, 112 }, 128 }; int gfx_index = bg; UINT8 *src = memory_region(region) + 0x8000; unsigned char *buffer; int len = 0x8000; int i; if (!(buffer = malloc(len))) return 1; /* expand rom tc2-19.10d */ for (i = 0; i < len / 2; i++) { buffer[i*2+1] = src[i] & 0x0f; buffer[i*2] = (src[i] & 0xf0) >> 4; } memcpy(src, buffer, len); free(buffer); /* decode the graphics */ Machine->gfx[gfx_index] = allocgfx(&bg_layout); if (!Machine->gfx[gfx_index]) return 1; decodegfx(Machine->gfx[gfx_index], memory_region(region), 0, Machine->gfx[gfx_index]->total_elements); /* set the color information */ Machine->gfx[gfx_index]->colortable = &Machine->remapped_colortable[2048]; Machine->gfx[gfx_index]->total_colors = 64; return 0; }
static int allocate_graphics(const gfx_decode *gfxdecodeinfo) { int i; /* loop over all elements */ for (i = 0; i < MAX_GFX_ELEMENTS && gfxdecodeinfo[i].memory_region != -1; i++) { int region_length = 8 * memory_region_length(gfxdecodeinfo[i].memory_region); UINT32 extxoffs[MAX_ABS_GFX_SIZE], extyoffs[MAX_ABS_GFX_SIZE]; UINT32 *xoffset, *yoffset; gfx_layout glcopy; int j; /* make a copy of the layout */ glcopy = *gfxdecodeinfo[i].gfxlayout; if (glcopy.extxoffs) { memcpy(extxoffs, glcopy.extxoffs, glcopy.width * sizeof(extxoffs[0])); glcopy.extxoffs = extxoffs; } if (glcopy.extyoffs) { memcpy(extyoffs, glcopy.extyoffs, glcopy.height * sizeof(extyoffs[0])); glcopy.extyoffs = extyoffs; } /* if the character count is a region fraction, compute the effective total */ if (IS_FRAC(glcopy.total)) glcopy.total = region_length / glcopy.charincrement * FRAC_NUM(glcopy.total) / FRAC_DEN(glcopy.total); /* loop over all the planes, converting fractions */ for (j = 0; j < glcopy.planes; j++) { UINT32 value = glcopy.planeoffset[j]; if (IS_FRAC(value)) glcopy.planeoffset[j] = FRAC_OFFSET(value) + region_length * FRAC_NUM(value) / FRAC_DEN(value); } /* loop over all the X/Y offsets, converting fractions */ xoffset = glcopy.extxoffs ? extxoffs : glcopy.xoffset; for (j = 0; j < glcopy.width; j++) { UINT32 value = xoffset[j]; if (IS_FRAC(value)) xoffset[j] = FRAC_OFFSET(value) + region_length * FRAC_NUM(value) / FRAC_DEN(value); } yoffset = glcopy.extyoffs ? extyoffs : glcopy.yoffset; for (j = 0; j < glcopy.height; j++) { UINT32 value = yoffset[j]; if (IS_FRAC(value)) yoffset[j] = FRAC_OFFSET(value) + region_length * FRAC_NUM(value) / FRAC_DEN(value); } /* some games increment on partial tile boundaries; to handle this without reading */ /* past the end of the region, we may need to truncate the count */ /* an example is the games in metro.c */ if (glcopy.planeoffset[0] == GFX_RAW) { int base = gfxdecodeinfo[i].start; int end = region_length/8; while (glcopy.total > 0) { int elementbase = base + (glcopy.total - 1) * glcopy.charincrement / 8; int lastpixelbase = elementbase + glcopy.height * yoffset[0] / 8 - 1; if (lastpixelbase < end) break; glcopy.total--; } } /* allocate the graphics */ Machine->gfx[i] = allocgfx(&glcopy); /* if we have a remapped colortable, point our local colortable to it */ if (Machine->remapped_colortable) Machine->gfx[i]->colortable = &Machine->remapped_colortable[gfxdecodeinfo[i].color_codes_start]; Machine->gfx[i]->total_colors = gfxdecodeinfo[i].total_color_codes; } return 0; }
static void allocate_graphics(const gfx_decode *gfxdecodeinfo) { int i; /* loop over all elements */ for (i = 0; i < MAX_GFX_ELEMENTS && gfxdecodeinfo[i].memory_region != -1; i++) { int region_length = 8 * memory_region_length(gfxdecodeinfo[i].memory_region); UINT32 extxoffs[MAX_ABS_GFX_SIZE], extyoffs[MAX_ABS_GFX_SIZE]; gfx_layout glcopy; int j; /* make a copy of the layout */ glcopy = *gfxdecodeinfo[i].gfxlayout; if (glcopy.extxoffs) { memcpy(extxoffs, glcopy.extxoffs, glcopy.width * sizeof(extxoffs[0])); glcopy.extxoffs = extxoffs; } if (glcopy.extyoffs) { memcpy(extyoffs, glcopy.extyoffs, glcopy.height * sizeof(extyoffs[0])); glcopy.extyoffs = extyoffs; } /* if the character count is a region fraction, compute the effective total */ if (IS_FRAC(glcopy.total)) glcopy.total = region_length / glcopy.charincrement * FRAC_NUM(glcopy.total) / FRAC_DEN(glcopy.total); /* for non-raw graphics, decode the X and Y offsets */ if (glcopy.planeoffset[0] != GFX_RAW) { UINT32 *xoffset = glcopy.extxoffs ? extxoffs : glcopy.xoffset; UINT32 *yoffset = glcopy.extyoffs ? extyoffs : glcopy.yoffset; /* loop over all the planes, converting fractions */ for (j = 0; j < glcopy.planes; j++) { UINT32 value = glcopy.planeoffset[j]; if (IS_FRAC(value)) glcopy.planeoffset[j] = FRAC_OFFSET(value) + region_length * FRAC_NUM(value) / FRAC_DEN(value); } /* loop over all the X/Y offsets, converting fractions */ for (j = 0; j < glcopy.width; j++) { UINT32 value = xoffset[j]; if (IS_FRAC(value)) xoffset[j] = FRAC_OFFSET(value) + region_length * FRAC_NUM(value) / FRAC_DEN(value); } for (j = 0; j < glcopy.height; j++) { UINT32 value = yoffset[j]; if (IS_FRAC(value)) yoffset[j] = FRAC_OFFSET(value) + region_length * FRAC_NUM(value) / FRAC_DEN(value); } } /* otherwise, just use yoffset[0] as the line modulo */ else { int base = gfxdecodeinfo[i].start; int end = region_length/8; while (glcopy.total > 0) { int elementbase = base + (glcopy.total - 1) * glcopy.charincrement / 8; int lastpixelbase = elementbase + glcopy.height * glcopy.yoffset[0] / 8 - 1; if (lastpixelbase < end) break; glcopy.total--; } } /* allocate the graphics */ Machine->gfx[i] = allocgfx(&glcopy); /* if we have a remapped colortable, point our local colortable to it */ if (Machine->remapped_colortable) Machine->gfx[i]->colortable = &Machine->remapped_colortable[gfxdecodeinfo[i].color_codes_start]; Machine->gfx[i]->total_colors = gfxdecodeinfo[i].total_color_codes; } }