void palette_init(running_machine *machine) { palette_private *palette = auto_malloc(sizeof(*palette)); /* request cleanup */ machine->palette_data = palette; add_exit_callback(machine, palette_exit); /* reset all our data */ memset(palette, 0, sizeof(*palette)); palette->format = machine->screen[0].format; /* determine the color mode */ switch (palette->format) { case BITMAP_FORMAT_INDEXED16: /* indexed modes are fine for everything */ break; case BITMAP_FORMAT_RGB15: case BITMAP_FORMAT_RGB32: /* RGB modes can't use color tables */ assert(machine->drv->color_table_len == 0); break; case BITMAP_FORMAT_INVALID: /* invalid format means no palette - or at least it should */ assert(machine->drv->total_colors == 0); assert(machine->drv->color_table_len == 0); return; default: fatalerror("Unsupported screen bitmap format!"); break; } /* allocate all the data structures */ if (machine->drv->total_colors > 0) { int numcolors; allocate_palette(machine, palette); allocate_color_tables(machine, palette); allocate_shadow_tables(machine, palette); /* set up save/restore of the palette */ numcolors = palette_get_num_colors(machine->palette); palette->save_pen = auto_malloc(sizeof(*palette->save_pen) * numcolors); palette->save_bright = auto_malloc(sizeof(*palette->save_bright) * numcolors); state_save_register_global_pointer(palette->save_pen, numcolors); state_save_register_global_pointer(palette->save_bright, numcolors); state_save_register_func_presave(palette_presave); state_save_register_func_postload(palette_postload); } }
void m62_state::m62_amplify_contrast(palette_t *palette, UINT32 numcolors) { // m62 palette is very dark, so amplify default contrast UINT32 i, ymax=1; if (!numcolors) numcolors = palette_get_num_colors(palette); // find maximum brightness for (i=0;i < numcolors;i++) { rgb_t rgb = palette_entry_get_color(palette,i); UINT32 y = 299 * RGB_RED(rgb) + 587 * RGB_GREEN(rgb) + 114 * RGB_BLUE(rgb); ymax = MAX(ymax, y); } palette_set_contrast(palette, 255000.0/ymax); }
void palette_config(running_machine *machine) { int total_colors = (machine->palette == NULL) ? 0 : palette_get_num_colors(machine->palette) * palette_get_num_groups(machine->palette); pen_t *remapped_colortable = NULL; UINT16 *colortable = NULL; int i; /* allocate memory for the colortables, if needed */ if (machine->drv->color_table_len > 0) { /* first for the raw colortable */ colortable = auto_malloc(machine->drv->color_table_len * sizeof(colortable[0])); for (i = 0; i < machine->drv->color_table_len; i++) colortable[i] = i % total_colors; /* then for the remapped colortable */ remapped_colortable = auto_malloc(machine->drv->color_table_len * sizeof(remapped_colortable[0])); } /* now let the driver modify the initial palette and colortable */ if (machine->drv->init_palette) (*machine->drv->init_palette)(machine, colortable, memory_region(REGION_PROMS)); /* now compute the remapped_colortable */ for (i = 0; i < machine->drv->color_table_len; i++) { pen_t color = colortable[i]; /* check for invalid colors set by machine->drv->init_palette */ assert(color < total_colors); remapped_colortable[i] = machine->pens[color]; } /* now we can set the final colortables */ machine->game_colortable = colortable; machine->remapped_colortable = (remapped_colortable != NULL) ? remapped_colortable : machine->pens; /* set the color table base for each graphics element */ for (i = 0; i < MAX_GFX_ELEMENTS; i++) if (machine->gfx[i] != NULL) machine->gfx[i]->color_base = machine->drv->gfxdecodeinfo[i].color_codes_start; }
void palette_init(running_machine *machine) { int format; palette_private *palette = auto_malloc(sizeof(*palette)); const device_config *device = video_screen_first(machine->config); /* get the format from the first screen, or use BITMAP_FORMAT_INVALID, if screenless */ if (device != NULL) { screen_config *config = device->inline_config; format = config->format; } else format = BITMAP_FORMAT_INVALID; /* request cleanup */ machine->palette_data = palette; add_exit_callback(machine, palette_exit); /* reset all our data */ memset(palette, 0, sizeof(*palette)); palette->format = format; /* determine the color mode */ switch (format) { case BITMAP_FORMAT_INDEXED16: case BITMAP_FORMAT_RGB15: case BITMAP_FORMAT_RGB32: /* indexed and RGB modes are fine for everything */ break; case BITMAP_FORMAT_INVALID: /* invalid format means no palette - or at least it should */ assert(machine->config->total_colors == 0); return; default: fatalerror("Unsupported screen bitmap format!"); break; } /* allocate all the data structures */ if (machine->config->total_colors > 0) { int numcolors; allocate_palette(machine, palette); allocate_color_tables(machine, palette); allocate_shadow_tables(machine, palette); /* set up save/restore of the palette */ numcolors = palette_get_num_colors(machine->palette); palette->save_pen = auto_malloc(sizeof(*palette->save_pen) * numcolors); palette->save_bright = auto_malloc(sizeof(*palette->save_bright) * numcolors); state_save_register_global_pointer(palette->save_pen, numcolors); state_save_register_global_pointer(palette->save_bright, numcolors); state_save_register_presave(machine, palette_presave, palette); state_save_register_postload(machine, palette_postload, palette); } }