Plumbed machine parameters through the renderer. Removed need for

deprecat.h.

Changed render_texture_set_bitmap() to accept a palette object 
instead of a palette index. The renderer remains optimized for the 
system palette but will work if objects have their own palette as 
well.

Changed renderer to permit palettes for RGB and YUY textures. If
specified, these palettes specify a 32-entry (RGB15) or 256-entry
(others) lookup for applying additional brightness/contrast/gamma
on a per-texture basis.

Removed rescale notification. It never really worked that well and 
violated proper layering.

Renamed palette_set_brightness() to palette_set_pen_contrast() for 
clarity.

Changed palette objects to support global brightness/contrast/gamma
in addition to per-group and per-entry controls.
This commit is contained in:
Aaron Giles 2008-09-29 08:02:58 +00:00
parent ef2fa89e44
commit 296347baab
20 changed files with 346 additions and 171 deletions

View File

@ -170,7 +170,7 @@ static void create_bitmap(int player)
/* create a texture to reference the bitmap */
global.texture[player] = render_texture_alloc(render_texture_hq_scale, NULL);
render_texture_set_bitmap(global.texture[player], global.bitmap[player], NULL, 0, TEXFORMAT_ARGB32);
render_texture_set_bitmap(global.texture[player], global.bitmap[player], NULL, TEXFORMAT_ARGB32, NULL);
}
}

View File

@ -225,11 +225,11 @@ INLINE rgb_t palette_get_color(running_machine *machine, pen_t pen)
/*-------------------------------------------------
palette_set_brightness - set the per-pen
brightness factor
palette_set_pen_contrast - set the per-pen
contrast factor
-------------------------------------------------*/
INLINE void palette_set_brightness(running_machine *machine, pen_t pen, double bright)
INLINE void palette_set_pen_contrast(running_machine *machine, pen_t pen, double bright)
{
palette_entry_set_contrast(machine->palette, pen, bright);
}

View File

@ -1369,15 +1369,15 @@ VIDEO_UPDATE( laserdisc )
if (overbitmap != NULL)
{
if (overbitmap->format == BITMAP_FORMAT_INDEXED16)
render_texture_set_bitmap(ldcore->overtex, overbitmap, &ldcore->config.overclip, 0, TEXFORMAT_PALETTEA16);
render_texture_set_bitmap(ldcore->overtex, overbitmap, &ldcore->config.overclip, TEXFORMAT_PALETTEA16, laserdisc->machine->palette);
else if (overbitmap->format == BITMAP_FORMAT_RGB32)
render_texture_set_bitmap(ldcore->overtex, overbitmap, &ldcore->config.overclip, 0, TEXFORMAT_ARGB32);
render_texture_set_bitmap(ldcore->overtex, overbitmap, &ldcore->config.overclip, TEXFORMAT_ARGB32, NULL);
}
/* get the laserdisc video */
laserdisc_get_video(laserdisc, &vidbitmap);
if (vidbitmap != NULL)
render_texture_set_bitmap(ldcore->videotex, vidbitmap, NULL, 0, TEXFORMAT_YUY16);
render_texture_set_bitmap(ldcore->videotex, vidbitmap, NULL, TEXFORMAT_YUY16, NULL);
/* reset the screen contents */
render_container_empty(render_container_get_screen(screen));

View File

@ -44,7 +44,6 @@
#include "config.h"
#include "output.h"
#include "xmlfile.h"
#include "deprecat.h"
@ -55,7 +54,7 @@
#define MAX_TEXTURE_SCALES 8
#define TEXTURE_GROUP_SIZE 256
#define NUM_PRIMLISTS 2
#define NUM_PRIMLISTS 3
#define MAX_CLEAR_EXTENTS 1000
@ -133,12 +132,14 @@ struct _render_texture
render_texture * base; /* pointer to base of texture group */
bitmap_t * bitmap; /* pointer to the original bitmap */
rectangle sbounds; /* source bounds within the bitmap */
UINT32 palettebase; /* palette base within the system palette */
palette_t * palette; /* palette associated with the texture */
int format; /* format of the texture data */
texture_scaler_func scaler; /* scaling callback */
void * param; /* scaling callback parameter */
UINT32 curseq; /* current sequence number */
scaled_texture scaled[MAX_TEXTURE_SCALES]; /* array of scaled variants of this texture */
rgb_t * bcglookup; /* dynamically allocated B/C/G lookup table */
UINT32 bcglookup_entries; /* number of B/C/G lookup entries allocated */
};
@ -146,6 +147,7 @@ struct _render_texture
struct _render_target
{
render_target * next; /* keep a linked list of targets */
running_machine * machine; /* pointer to the machine we are connected with */
layout_view * curview; /* current view */
layout_file * filelist; /* list of layout files */
UINT32 flags; /* creation flags */
@ -213,9 +215,6 @@ struct _render_container
static render_target *targetlist;
static render_target *ui_target;
/* notifier callbacks */
static int (*rescale_notify)(running_machine *, int, int);
/* free lists */
static render_primitive *render_primitive_free_list;
static container_item *container_item_free_list;
@ -270,10 +269,11 @@ static void add_clear_and_optimize_primitive_list(render_target *target, render_
static void invalidate_all_render_ref(void *refptr);
/* render textures */
static int render_texture_get_scaled(render_texture *texture, UINT32 dwidth, UINT32 dheight, render_texinfo *texinfo, render_ref **reflist);
static int texture_get_scaled(render_texture *texture, UINT32 dwidth, UINT32 dheight, render_texinfo *texinfo, render_ref **reflist);
static const rgb_t *texture_get_adjusted_palette(render_texture *texture, render_container *container);
/* render containers */
static render_container *render_container_alloc(void);
static render_container *render_container_alloc(running_machine *machine);
static void render_container_free(render_container *container);
static container_item *render_container_item_add_generic(render_container *container, UINT8 type, float x0, float y0, float x1, float y1, rgb_t argb);
static void render_container_overlay_scale(bitmap_t *dest, const bitmap_t *source, const rectangle *sbounds, void *param);
@ -557,12 +557,12 @@ void render_init(running_machine *machine)
ui_target = NULL;
/* create a UI container */
ui_container = render_container_alloc();
ui_container = render_container_alloc(machine);
/* create a container for each screen and determine its orientation */
for (screen = video_screen_first(machine->config); screen != NULL; screen = video_screen_next(screen))
{
render_container *screen_container = render_container_alloc();
render_container *screen_container = render_container_alloc(machine);
render_container **temp = &screen_container->next;
render_container_user_settings settings;
@ -946,18 +946,6 @@ static void render_save(running_machine *machine, int config_type, xml_data_node
}
/*-------------------------------------------------
render_set_rescale_notify - set a notifier
that we call before doing long scaling
operations
-------------------------------------------------*/
void render_set_rescale_notify(running_machine *machine, int (*notifier)(running_machine *, int, int))
{
rescale_notify = notifier;
}
/*-------------------------------------------------
render_is_live_screen - return if the screen
is 'live'
@ -1078,7 +1066,7 @@ float render_get_ui_aspect(void)
target
-------------------------------------------------*/
render_target *render_target_alloc(const char *layoutfile, UINT32 flags)
render_target *render_target_alloc(running_machine *machine, const char *layoutfile, UINT32 flags)
{
render_target *target;
render_target **nextptr;
@ -1093,6 +1081,7 @@ render_target *render_target_alloc(const char *layoutfile, UINT32 flags)
*nextptr = target;
/* fill in the basics with reasonable defaults */
target->machine = machine;
target->flags = flags;
target->width = 640;
target->height = 480;
@ -1112,12 +1101,12 @@ render_target *render_target_alloc(const char *layoutfile, UINT32 flags)
/* determine the base orientation based on options */
target->orientation = ROT0;
if (!options_get_bool(mame_options(), OPTION_ROTATE))
target->base_orientation = orientation_reverse(Machine->gamedrv->flags & ORIENTATION_MASK);
target->base_orientation = orientation_reverse(machine->gamedrv->flags & ORIENTATION_MASK);
/* rotate left/right */
if (options_get_bool(mame_options(), OPTION_ROR) || (options_get_bool(mame_options(), OPTION_AUTOROR) && (Machine->gamedrv->flags & ORIENTATION_SWAP_XY)))
if (options_get_bool(mame_options(), OPTION_ROR) || (options_get_bool(mame_options(), OPTION_AUTOROR) && (machine->gamedrv->flags & ORIENTATION_SWAP_XY)))
target->base_orientation = orientation_add(ROT90, target->base_orientation);
if (options_get_bool(mame_options(), OPTION_ROL) || (options_get_bool(mame_options(), OPTION_AUTOROL) && (Machine->gamedrv->flags & ORIENTATION_SWAP_XY)))
if (options_get_bool(mame_options(), OPTION_ROL) || (options_get_bool(mame_options(), OPTION_AUTOROL) && (machine->gamedrv->flags & ORIENTATION_SWAP_XY)))
target->base_orientation = orientation_add(ROT270, target->base_orientation);
/* flip X/Y */
@ -1131,7 +1120,7 @@ render_target *render_target_alloc(const char *layoutfile, UINT32 flags)
target->layerconfig = target->base_layerconfig;
/* allocate a lock for the primitive list */
for (listnum = 0; listnum < NUM_PRIMLISTS; listnum++)
for (listnum = 0; listnum < ARRAY_LENGTH(target->primlist); listnum++)
target->primlist[listnum].lock = osd_lock_alloc();
/* load the layout files */
@ -1166,7 +1155,7 @@ void render_target_free(render_target *target)
*curr = target->next;
/* free any primitives */
for (listnum = 0; listnum < NUM_PRIMLISTS; listnum++)
for (listnum = 0; listnum < ARRAY_LENGTH(target->primlist); listnum++)
{
release_render_list(&target->primlist[listnum]);
osd_lock_free(target->primlist[listnum].lock);
@ -1478,7 +1467,7 @@ void render_target_get_minimum_size(render_target *target, INT32 *minwidth, INT3
for (item = target->curview->itemlist[layer]; item != NULL; item = item->next)
if (item->element == NULL)
{
const device_config *screen = device_list_find_by_index(Machine->config->devicelist, VIDEO_SCREEN, item->index);
const device_config *screen = device_list_find_by_index(target->machine->config->devicelist, VIDEO_SCREEN, item->index);
const screen_config *scrconfig = screen->inline_config;
const rectangle vectorvis = { 0, 639, 0, 479 };
const rectangle *visarea = NULL;
@ -1486,7 +1475,7 @@ void render_target_get_minimum_size(render_target *target, INT32 *minwidth, INT3
render_bounds bounds;
float xscale, yscale;
/* we may be called very early, before Machine->visible_area is initialized; handle that case */
/* we may be called very early, before machine->visible_area is initialized; handle that case */
if (scrconfig->type == SCREEN_TYPE_VECTOR)
visarea = &vectorvis;
else if (screen->token != NULL)
@ -1551,7 +1540,7 @@ const render_primitive_list *render_target_get_primitives(render_target *target)
/* switch to the next primitive list */
listnum = target->listindex;
target->listindex = (target->listindex + 1) % NUM_PRIMLISTS;
target->listindex = (target->listindex + 1) % ARRAY_LENGTH(target->primlist);
osd_lock_acquire(target->primlist[listnum].lock);
/* free any previous primitives */
@ -1569,7 +1558,7 @@ const render_primitive_list *render_target_get_primitives(render_target *target)
root_xform.orientation = target->orientation;
/* iterate over layers back-to-front, but only if we're running */
if (mame_get_phase(Machine) >= MAME_PHASE_RESET)
if (mame_get_phase(target->machine) >= MAME_PHASE_RESET)
for (layernum = 0; layernum < ITEM_LAYER_MAX; layernum++)
{
int blendmode;
@ -1610,9 +1599,9 @@ const render_primitive_list *render_target_get_primitives(render_target *target)
state = output_get_value(item->output_name);
else if (item->input_tag[0] != 0)
{
const input_field_config *field = input_field_by_tag_and_mask(Machine->portconfig, item->input_tag, item->input_mask);
const input_field_config *field = input_field_by_tag_and_mask(target->machine->portconfig, item->input_tag, item->input_mask);
if (field != NULL)
state = ((input_port_read_safe(Machine, item->input_tag, 0) ^ field->defvalue) & item->input_mask) ? 1 : 0;
state = ((input_port_read_safe(target->machine, item->input_tag, 0) ^ field->defvalue) & item->input_mask) ? 1 : 0;
}
add_element_primitives(target, &target->primlist[listnum], &item_xform, item->element, state, blendmode);
}
@ -1796,7 +1785,7 @@ static int load_layout_files(render_target *target, const char *layoutfile, int
/* if there's an explicit file, load that first */
if (layoutfile != NULL)
{
*nextfile = layout_file_load(Machine->basename, layoutfile);
*nextfile = layout_file_load(target->machine->basename, layoutfile);
if (*nextfile != NULL)
nextfile = &(*nextfile)->next;
}
@ -1806,28 +1795,28 @@ static int load_layout_files(render_target *target, const char *layoutfile, int
return (nextfile == &target->filelist) ? 1 : 0;
/* try to load a file based on the driver name */
*nextfile = layout_file_load(Machine->basename, Machine->gamedrv->name);
*nextfile = layout_file_load(target->machine->basename, target->machine->gamedrv->name);
if (*nextfile == NULL)
*nextfile = layout_file_load(Machine->basename, "default");
*nextfile = layout_file_load(target->machine->basename, "default");
if (*nextfile != NULL)
nextfile = &(*nextfile)->next;
/* if a default view has been specified, use that as a fallback */
if (Machine->gamedrv->default_layout != NULL)
if (target->machine->gamedrv->default_layout != NULL)
{
*nextfile = layout_file_load(NULL, Machine->gamedrv->default_layout);
*nextfile = layout_file_load(NULL, target->machine->gamedrv->default_layout);
if (*nextfile != NULL)
nextfile = &(*nextfile)->next;
}
if (Machine->config->default_layout != NULL)
if (target->machine->config->default_layout != NULL)
{
*nextfile = layout_file_load(NULL, Machine->config->default_layout);
*nextfile = layout_file_load(NULL, target->machine->config->default_layout);
if (*nextfile != NULL)
nextfile = &(*nextfile)->next;
}
/* try to load another file based on the parent driver name */
cloneof = driver_get_clone(Machine->gamedrv);
cloneof = driver_get_clone(target->machine->gamedrv);
if (cloneof != NULL)
{
*nextfile = layout_file_load(cloneof->name, cloneof->name);
@ -1838,9 +1827,9 @@ static int load_layout_files(render_target *target, const char *layoutfile, int
}
/* now do the built-in layouts for single-screen games */
if (video_screen_count(Machine->config) == 1)
if (video_screen_count(target->machine->config) == 1)
{
if (Machine->gamedrv->flags & ORIENTATION_SWAP_XY)
if (target->machine->gamedrv->flags & ORIENTATION_SWAP_XY)
*nextfile = layout_file_load(NULL, layout_vertical);
else
*nextfile = layout_file_load(NULL, layout_horizont);
@ -1992,19 +1981,10 @@ static void add_container_primitives(render_target *target, render_primitive_lis
height = (finalorient & ORIENTATION_SWAP_XY) ? (prim->bounds.x1 - prim->bounds.x0) : (prim->bounds.y1 - prim->bounds.y0);
width = MIN(width, target->maxtexwidth);
height = MIN(height, target->maxtexheight);
if (render_texture_get_scaled(item->texture, width, height, &prim->texture, &list->reflist))
if (texture_get_scaled(item->texture, width, height, &prim->texture, &list->reflist))
{
/* override the palette with our adjusted palette */
switch (item->texture->format)
{
case TEXFORMAT_PALETTE16: prim->texture.palette = &container->bcglookup[prim->texture.palette - palette_entry_list_adjusted(Machine->palette)]; break;
case TEXFORMAT_PALETTEA16: prim->texture.palette = &container->bcglookup[prim->texture.palette - palette_entry_list_adjusted(Machine->palette)]; break;
case TEXFORMAT_RGB15: prim->texture.palette = &container->bcglookup32[0]; break;
case TEXFORMAT_RGB32: prim->texture.palette = &container->bcglookup256[0]; break;
case TEXFORMAT_ARGB32: prim->texture.palette = &container->bcglookup256[0]; break;
case TEXFORMAT_YUY16: prim->texture.palette = &container->bcglookup256[0]; break;
default: assert(FALSE);
}
/* set the palette */
prim->texture.palette = texture_get_adjusted_palette(item->texture, container);
/* determine UV coordinates and apply clipping */
prim->texcoords = oriented_texcoords[finalorient];
@ -2055,7 +2035,7 @@ static void add_container_primitives(render_target *target, render_primitive_lis
prim->color = container_xform.color;
width = render_round_nearest(prim->bounds.x1) - render_round_nearest(prim->bounds.x0);
height = render_round_nearest(prim->bounds.y1) - render_round_nearest(prim->bounds.y0);
if (render_texture_get_scaled(container->overlaytexture,
if (texture_get_scaled(container->overlaytexture,
(container_xform.orientation & ORIENTATION_SWAP_XY) ? height : width,
(container_xform.orientation & ORIENTATION_SWAP_XY) ? width : height, &prim->texture, &list->reflist))
{
@ -2111,7 +2091,7 @@ static void add_element_primitives(render_target *target, render_primitive_list
height = MIN(height, target->maxtexheight);
/* get the scaled texture and append it */
if (render_texture_get_scaled(texture, width, height, &prim->texture, &list->reflist))
if (texture_get_scaled(texture, width, height, &prim->texture, &list->reflist))
{
/* compute the clip rect */
cliprect.x0 = render_round_nearest(xform->xoffs);
@ -2419,7 +2399,7 @@ static void invalidate_all_render_ref(void *refptr)
/* loop over targets */
for (target = targetlist; target != NULL; target = target->next)
for (listnum = 0; listnum < NUM_PRIMLISTS; listnum++)
for (listnum = 0; listnum < ARRAY_LENGTH(target->primlist); listnum++)
{
render_primitive_list *list = &target->primlist[listnum];
osd_lock_acquire(list->lock);
@ -2495,6 +2475,14 @@ void render_texture_free(render_texture *texture)
if (texture->bitmap != NULL)
invalidate_all_render_ref(texture->bitmap);
/* release palette references */
if (texture->palette != NULL)
palette_deref(texture->palette);
/* free any B/C/G lookup tables */
if (texture->bcglookup != NULL)
free(texture->bcglookup);
/* add ourself back to the free list */
base_save = texture->base;
memset(texture, 0, sizeof(*texture));
@ -2509,13 +2497,26 @@ void render_texture_free(render_texture *texture)
bitmap
-------------------------------------------------*/
void render_texture_set_bitmap(render_texture *texture, bitmap_t *bitmap, const rectangle *sbounds, UINT32 palettebase, int format)
void render_texture_set_bitmap(render_texture *texture, bitmap_t *bitmap, const rectangle *sbounds, int format, palette_t *palette)
{
int scalenum;
/* ensure we have a valid palette for palettized modes */
if (format == TEXFORMAT_PALETTE16 || format == TEXFORMAT_PALETTEA16)
assert(palette != NULL);
/* invalidate references to the old bitmap */
if (bitmap != texture->bitmap && texture->bitmap != NULL)
invalidate_all_render_ref(texture->bitmap);
/* if the palette is different, adjust references */
if (palette != texture->palette)
{
if (texture->palette != NULL)
palette_deref(texture->palette);
if (palette != NULL)
palette_ref(palette);
}
/* set the new bitmap/palette */
texture->bitmap = bitmap;
@ -2523,7 +2524,7 @@ void render_texture_set_bitmap(render_texture *texture, bitmap_t *bitmap, const
texture->sbounds.min_y = (sbounds != NULL) ? sbounds->min_y : 0;
texture->sbounds.max_x = (sbounds != NULL) ? sbounds->max_x : (bitmap != NULL) ? bitmap->width : 1000;
texture->sbounds.max_y = (sbounds != NULL) ? sbounds->max_y : (bitmap != NULL) ? bitmap->height : 1000;
texture->palettebase = palettebase;
texture->palette = palette;
texture->format = format;
/* invalidate all scaled versions */
@ -2541,14 +2542,14 @@ void render_texture_set_bitmap(render_texture *texture, bitmap_t *bitmap, const
/*-------------------------------------------------
render_texture_get_scaled - get a scaled
texture_get_scaled - get a scaled
bitmap (if we can)
-------------------------------------------------*/
static int render_texture_get_scaled(render_texture *texture, UINT32 dwidth, UINT32 dheight, render_texinfo *texinfo, render_ref **reflist)
static int texture_get_scaled(render_texture *texture, UINT32 dwidth, UINT32 dheight, render_texinfo *texinfo, render_ref **reflist)
{
UINT8 bpp = (texture->format == TEXFORMAT_PALETTE16 || texture->format == TEXFORMAT_PALETTEA16 || texture->format == TEXFORMAT_RGB15 || texture->format == TEXFORMAT_YUY16) ? 16 : 32;
const rgb_t *palbase = (texture->format == TEXFORMAT_PALETTE16 || texture->format == TEXFORMAT_PALETTEA16) ? palette_entry_list_adjusted(Machine->palette) + texture->palettebase : NULL;
const rgb_t *palbase = (texture->format == TEXFORMAT_PALETTE16 || texture->format == TEXFORMAT_PALETTEA16) ? palette_entry_list_adjusted(texture->palette) : NULL;
scaled_texture *scaled = NULL;
int swidth, sheight;
int scalenum;
@ -2590,10 +2591,6 @@ static int render_texture_get_scaled(render_texture *texture, UINT32 dwidth, UIN
{
int lowest = -1;
/* ask our notifier if we can scale now */
if (rescale_notify != NULL && !(*rescale_notify)(Machine, dwidth, dheight))
return FALSE;
/* didn't find one -- take the entry with the lowest seqnum */
for (scalenum = 0; scalenum < ARRAY_LENGTH(texture->scaled); scalenum++)
if ((lowest == -1 || texture->scaled[scalenum].seqid < texture->scaled[lowest].seqid) && !has_render_ref(*reflist, texture->scaled[scalenum].bitmap))
@ -2640,6 +2637,119 @@ void render_texture_hq_scale(bitmap_t *dest, const bitmap_t *source, const recta
}
/*-------------------------------------------------
texture_get_adjusted_palette - return the
adjusted palette for a texture
-------------------------------------------------*/
static const rgb_t *texture_get_adjusted_palette(render_texture *texture, render_container *container)
{
const rgb_t *adjusted;
int numentries;
int index;
/* override the palette with our adjusted palette */
switch (texture->format)
{
case TEXFORMAT_PALETTE16:
case TEXFORMAT_PALETTEA16:
/* if no adjustment necessary, return the raw palette */
assert(texture->palette != NULL);
adjusted = palette_entry_list_adjusted(texture->palette);
if (container->brightness == 1.0f && container->contrast == 1.0f && container->gamma == 1.0f)
return adjusted;
/* if this is the machine palette, return our precomputed adjusted palette */
if (container->palclient != NULL && palette_client_get_palette(container->palclient) == texture->palette)
return container->bcglookup;
/* otherwise, ensure we have memory allocated and compute the adjusted result ourself */
numentries = palette_get_num_colors(texture->palette) * palette_get_num_groups(texture->palette);
if (texture->bcglookup == NULL || texture->bcglookup_entries < numentries)
{
texture->bcglookup = realloc(texture->bcglookup, numentries * sizeof(*texture->bcglookup));
texture->bcglookup_entries = numentries;
}
for (index = 0; index < numentries; index++)
{
UINT8 r = apply_brightness_contrast_gamma(RGB_RED(adjusted[index]), container->brightness, container->contrast, container->gamma);
UINT8 g = apply_brightness_contrast_gamma(RGB_GREEN(adjusted[index]), container->brightness, container->contrast, container->gamma);
UINT8 b = apply_brightness_contrast_gamma(RGB_BLUE(adjusted[index]), container->brightness, container->contrast, container->gamma);
texture->bcglookup[index] = MAKE_ARGB(RGB_ALPHA(adjusted[index]), r, g, b);
}
return texture->bcglookup;
case TEXFORMAT_RGB15:
/* if no adjustment necessary, return NULL */
if (container->brightness == 1.0f && container->contrast == 1.0f && container->gamma == 1.0f && texture->palette == NULL)
return NULL;
/* if no palette, return the standard lookups */
if (texture->palette == NULL)
return container->bcglookup32;
/* otherwise, ensure we have memory allocated and compute the adjusted result ourself */
assert(palette_get_num_colors(texture->palette) == 32);
adjusted = palette_entry_list_adjusted(texture->palette);
if (texture->bcglookup == NULL || texture->bcglookup_entries < 4 * 32)
{
texture->bcglookup = realloc(texture->bcglookup, 4 * 32 * sizeof(*texture->bcglookup));
texture->bcglookup_entries = 4 * 32;
}
/* otherwise, return the 32-entry BCG lookups */
for (index = 0; index < 32; index++)
{
UINT8 val = apply_brightness_contrast_gamma(RGB_GREEN(adjusted[index]), container->brightness, container->contrast, container->gamma);
texture->bcglookup[0x00 + index] = val << 0;
texture->bcglookup[0x20 + index] = val << 8;
texture->bcglookup[0x40 + index] = val << 16;
texture->bcglookup[0x60 + index] = val << 24;
}
return texture->bcglookup;
case TEXFORMAT_RGB32:
case TEXFORMAT_ARGB32:
case TEXFORMAT_YUY16:
/* if no adjustment necessary, return NULL */
if (container->brightness == 1.0f && container->contrast == 1.0f && container->gamma == 1.0f && texture->palette == NULL)
return NULL;
/* if no palette, return the standard lookups */
if (texture->palette == NULL)
return container->bcglookup256;
/* otherwise, ensure we have memory allocated and compute the adjusted result ourself */
assert(palette_get_num_colors(texture->palette) == 256);
adjusted = palette_entry_list_adjusted(texture->palette);
if (texture->bcglookup == NULL || texture->bcglookup_entries < 4 * 256)
{
texture->bcglookup = realloc(texture->bcglookup, 4 * 256 * sizeof(*texture->bcglookup));
texture->bcglookup_entries = 4 * 256;
}
/* otherwise, return the 32-entry BCG lookups */
for (index = 0; index < 256; index++)
{
UINT8 val = apply_brightness_contrast_gamma(RGB_GREEN(adjusted[index]), container->brightness, container->contrast, container->gamma);
texture->bcglookup[0x000 + index] = val << 0;
texture->bcglookup[0x100 + index] = val << 8;
texture->bcglookup[0x200 + index] = val << 16;
texture->bcglookup[0x300 + index] = val << 24;
}
return texture->bcglookup;
default:
assert(FALSE);
}
return NULL;
}
/***************************************************************************
RENDER CONTAINERS
@ -2650,7 +2760,7 @@ void render_texture_hq_scale(bitmap_t *dest, const bitmap_t *source, const recta
container
-------------------------------------------------*/
static render_container *render_container_alloc(void)
static render_container *render_container_alloc(running_machine *machine)
{
render_container *container;
int color;
@ -2674,8 +2784,8 @@ static render_container *render_container_alloc(void)
render_container_empty(container);
/* allocate a client to the main palette */
if (Machine->palette != NULL)
container->palclient = palette_client_alloc(Machine->palette);
if (machine->palette != NULL)
container->palclient = palette_client_alloc(machine->palette);
render_container_recompute_lookups(container);
return container;
}
@ -2788,7 +2898,7 @@ void render_container_set_overlay(render_container *container, bitmap_t *bitmap)
if (container->overlaybitmap != NULL)
{
container->overlaytexture = render_texture_alloc(render_container_overlay_scale, NULL);
render_texture_set_bitmap(container->overlaytexture, bitmap, NULL, 0, TEXFORMAT_ARGB32);
render_texture_set_bitmap(container->overlaytexture, bitmap, NULL, TEXFORMAT_ARGB32, NULL);
}
}

View File

@ -88,22 +88,22 @@ enum
/* texture formats */
enum
{
TEXFORMAT_UNDEFINED = 0, /* require a format to be specified */
TEXFORMAT_PALETTE16, /* 16bpp palettized, alpha ignored */
TEXFORMAT_PALETTEA16, /* 16bpp palettized, alpha respected */
TEXFORMAT_RGB15, /* 16bpp 5-5-5 RGB */
TEXFORMAT_RGB32, /* 32bpp 8-8-8 RGB */
TEXFORMAT_ARGB32, /* 32bpp 8-8-8-8 ARGB */
TEXFORMAT_YUY16 /* 16bpp 8-8 Y/Cb, Y/Cr in sequence */
TEXFORMAT_UNDEFINED = 0, /* require a format to be specified */
TEXFORMAT_PALETTE16, /* 16bpp palettized, alpha ignored */
TEXFORMAT_PALETTEA16, /* 16bpp palettized, alpha respected */
TEXFORMAT_RGB15, /* 16bpp 5-5-5 RGB */
TEXFORMAT_RGB32, /* 32bpp 8-8-8 RGB */
TEXFORMAT_ARGB32, /* 32bpp 8-8-8-8 ARGB */
TEXFORMAT_YUY16 /* 16bpp 8-8 Y/Cb, Y/Cr in sequence */
};
/* blending modes */
enum
{
BLENDMODE_NONE = 0, /* no blending */
BLENDMODE_ALPHA, /* standard alpha blend */
BLENDMODE_RGB_MULTIPLY, /* apply source alpha to source pix, then multiply RGB values */
BLENDMODE_ADD /* apply source alpha to source pix, then add to destination */
BLENDMODE_NONE = 0, /* no blending */
BLENDMODE_ALPHA, /* standard alpha blend */
BLENDMODE_RGB_MULTIPLY, /* apply source alpha to source pix, then multiply RGB values */
BLENDMODE_ADD /* apply source alpha to source pix, then add to destination */
};
@ -350,7 +350,7 @@ int render_input_hit_test(render_target *target, INT32 target_x, INT32 target_y,
/* ----- render target management ----- */
/* allocate a new render target */
render_target *render_target_alloc(const char *layout, UINT32 flags);
render_target *render_target_alloc(running_machine *machine, const char *layout, UINT32 flags);
/* free memory for a render target */
void render_target_free(render_target *target);
@ -424,7 +424,7 @@ render_texture *render_texture_alloc(texture_scaler_func scaler, void *param);
void render_texture_free(render_texture *texture);
/* set a new source bitmap */
void render_texture_set_bitmap(render_texture *texture, bitmap_t *bitmap, const rectangle *sbounds, UINT32 palettebase, int format);
void render_texture_set_bitmap(render_texture *texture, bitmap_t *bitmap, const rectangle *sbounds, int format, palette_t *palette);
/* generic high quality resampling scaler */
void render_texture_hq_scale(bitmap_t *dest, const bitmap_t *source, const rectangle *sbounds, void *param);

View File

@ -276,7 +276,7 @@ static void render_font_char_expand(render_font *font, render_font_char *ch)
/* wrap a texture around the bitmap */
ch->texture = render_texture_alloc(render_texture_hq_scale, NULL);
render_texture_set_bitmap(ch->texture, ch->bitmap, NULL, 0, TEXFORMAT_ARGB32);
render_texture_set_bitmap(ch->texture, ch->bitmap, NULL, TEXFORMAT_ARGB32, NULL);
}

View File

@ -94,9 +94,6 @@ static rgb_t messagebox_backcolor;
static slider_state *slider_list;
static slider_state *slider_current;
static int display_rescale_message;
static int allow_rescale;
/***************************************************************************
@ -104,7 +101,6 @@ static int allow_rescale;
***************************************************************************/
static void ui_exit(running_machine *machine);
static int rescale_notifier(running_machine *machine, int width, int height);
/* text generators */
static astring *disclaimer_string(running_machine *machine, astring *buffer);
@ -228,11 +224,6 @@ int ui_init(running_machine *machine)
/* reset globals */
single_step = FALSE;
ui_set_handler(handler_messagebox, 0);
/* request callbacks when the renderer does resizing */
render_set_rescale_notify(machine, rescale_notifier);
allow_rescale = 0;
display_rescale_message = FALSE;
return 0;
}
@ -255,26 +246,6 @@ static void ui_exit(running_machine *machine)
}
/*-------------------------------------------------
rescale_notifier - notifier to trigger a
rescale message during long operations
-------------------------------------------------*/
static int rescale_notifier(running_machine *machine, int width, int height)
{
/* always allow rescaling for a "small" area and for screenless drivers */
if (width < 500 || height < 500 || machine->primary_screen == NULL)
return TRUE;
/* if we've currently disallowed rescaling, turn on a message next frame */
if (allow_rescale == 0)
display_rescale_message = TRUE;
/* only allow rescaling once we're sure the message is visible */
return (allow_rescale == 1);
}
/*-------------------------------------------------
ui_display_startup_screens - display the
various startup screens
@ -416,19 +387,6 @@ void ui_update_and_render(running_machine *machine)
/* cancel takes us back to the ingame handler */
if (ui_handler_param == UI_HANDLER_CANCEL)
ui_set_handler(handler_ingame, 0);
/* add a message if we are rescaling */
if (display_rescale_message)
{
display_rescale_message = FALSE;
if (allow_rescale == 0)
allow_rescale = 2;
ui_draw_text_box("Updating Artwork...", JUSTIFY_CENTER, 0.5f, 0.5f, messagebox_backcolor);
}
/* decrement the frame counter if it is non-zero */
else if (allow_rescale != 0)
allow_rescale--;
}

View File

@ -702,7 +702,7 @@ static void gfxset_update_bitmap(running_machine *machine, ui_gfx_state *state,
/* allocate new stuff */
state->bitmap = bitmap_alloc(cellxpix * xcells, cellypix * ycells, BITMAP_FORMAT_ARGB32);
state->texture = render_texture_alloc(NULL, NULL);
render_texture_set_bitmap(state->texture, state->bitmap, NULL, 0, TEXFORMAT_ARGB32);
render_texture_set_bitmap(state->texture, state->bitmap, NULL, TEXFORMAT_ARGB32, NULL);
/* force a redraw */
state->bitmap_dirty = TRUE;
@ -750,7 +750,7 @@ static void gfxset_update_bitmap(running_machine *machine, ui_gfx_state *state,
}
/* reset the texture to force an update */
render_texture_set_bitmap(state->texture, state->bitmap, NULL, 0, TEXFORMAT_ARGB32);
render_texture_set_bitmap(state->texture, state->bitmap, NULL, TEXFORMAT_ARGB32, NULL);
state->bitmap_dirty = FALSE;
}
}
@ -1034,15 +1034,16 @@ static void tilemap_handle_keys(running_machine *machine, ui_gfx_state *state, i
static void tilemap_update_bitmap(running_machine *machine, ui_gfx_state *state, int width, int height)
{
bitmap_format screen_format = video_screen_get_format(machine->primary_screen);
palette_t *palette = NULL;
int screen_texformat;
/* convert the screen format to a texture format */
switch (screen_format)
{
case BITMAP_FORMAT_INDEXED16: screen_texformat = TEXFORMAT_PALETTE16; break;
case BITMAP_FORMAT_RGB15: screen_texformat = TEXFORMAT_RGB15; break;
case BITMAP_FORMAT_RGB32: screen_texformat = TEXFORMAT_RGB32; break;
default: fatalerror("Invalid bitmap format!"); break;
case BITMAP_FORMAT_INDEXED16: screen_texformat = TEXFORMAT_PALETTE16; palette = machine->palette; break;
case BITMAP_FORMAT_RGB15: screen_texformat = TEXFORMAT_RGB15; palette = NULL; break;
case BITMAP_FORMAT_RGB32: screen_texformat = TEXFORMAT_RGB32; palette = NULL; break;
default: fatalerror("Invalid bitmap format!"); break;
}
/* swap the coordinates back if they were talking about a rotated surface */
@ -1061,7 +1062,7 @@ static void tilemap_update_bitmap(running_machine *machine, ui_gfx_state *state,
/* allocate new stuff */
state->bitmap = bitmap_alloc(width, height, screen_format);
state->texture = render_texture_alloc(NULL, NULL);
render_texture_set_bitmap(state->texture, state->bitmap, NULL, 0, screen_texformat);
render_texture_set_bitmap(state->texture, state->bitmap, NULL, screen_texformat, palette);
/* force a redraw */
state->bitmap_dirty = TRUE;
@ -1073,7 +1074,7 @@ static void tilemap_update_bitmap(running_machine *machine, ui_gfx_state *state,
tilemap_draw_by_index(state->bitmap, state->tilemap.which, state->tilemap.xoffs, state->tilemap.yoffs);
/* reset the texture to force an update */
render_texture_set_bitmap(state->texture, state->bitmap, NULL, 0, screen_texformat);
render_texture_set_bitmap(state->texture, state->bitmap, NULL, screen_texformat, palette);
state->bitmap_dirty = FALSE;
}
}

View File

@ -384,7 +384,7 @@ void ui_menu_init(running_machine *machine)
*BITMAP_ADDR32(hilight_bitmap, 0, x) = MAKE_ARGB(alpha,0xff,0xff,0xff);
}
hilight_texture = render_texture_alloc(NULL, NULL);
render_texture_set_bitmap(hilight_texture, hilight_bitmap, NULL, 0, TEXFORMAT_ARGB32);
render_texture_set_bitmap(hilight_texture, hilight_bitmap, NULL, TEXFORMAT_ARGB32, NULL);
/* create a texture for arrow icons */
arrow_texture = render_texture_alloc(menu_render_triangle, NULL);

View File

@ -356,7 +356,7 @@ void video_init(running_machine *machine)
/* the native target is hard-coded to our internal layout and has all options disabled */
if (global.snap_native)
{
global.snap_target = render_target_alloc(layout_snap, RENDER_CREATE_SINGLE_FILE | RENDER_CREATE_HIDDEN);
global.snap_target = render_target_alloc(machine, layout_snap, RENDER_CREATE_SINGLE_FILE | RENDER_CREATE_HIDDEN);
assert(global.snap_target != NULL);
render_target_set_layer_config(global.snap_target, 0);
}
@ -364,7 +364,7 @@ void video_init(running_machine *machine)
/* other targets select the specified view and turn off effects */
else
{
global.snap_target = render_target_alloc(NULL, RENDER_CREATE_HIDDEN);
global.snap_target = render_target_alloc(machine, NULL, RENDER_CREATE_HIDDEN);
assert(global.snap_target != NULL);
render_target_set_view(global.snap_target, video_get_view_for_target(machine, global.snap_target, viewname, 0, 1));
render_target_set_layer_config(global.snap_target, render_target_get_layer_config(global.snap_target) & ~LAYER_CONFIG_ENABLE_SCREEN_OVERLAY);
@ -722,6 +722,7 @@ static void realloc_screen_bitmaps(const device_config *screen)
if (state->width > curwidth || state->height > curheight)
{
bitmap_format screen_format = config->format;
palette_t *palette;
/* free what we have currently */
if (state->texture[0] != NULL)
@ -740,10 +741,10 @@ static void realloc_screen_bitmaps(const device_config *screen)
/* choose the texture format - convert the screen format to a texture format */
switch (screen_format)
{
case BITMAP_FORMAT_INDEXED16: state->texture_format = TEXFORMAT_PALETTE16; break;
case BITMAP_FORMAT_RGB15: state->texture_format = TEXFORMAT_RGB15; break;
case BITMAP_FORMAT_RGB32: state->texture_format = TEXFORMAT_RGB32; break;
default: fatalerror("Invalid bitmap format!"); break;
case BITMAP_FORMAT_INDEXED16: state->texture_format = TEXFORMAT_PALETTE16; palette = screen->machine->palette; break;
case BITMAP_FORMAT_RGB15: state->texture_format = TEXFORMAT_RGB15; palette = NULL; break;
case BITMAP_FORMAT_RGB32: state->texture_format = TEXFORMAT_RGB32; palette = NULL; break;
default: fatalerror("Invalid bitmap format!"); break;
}
/* allocate bitmaps */
@ -754,9 +755,9 @@ static void realloc_screen_bitmaps(const device_config *screen)
/* allocate textures */
state->texture[0] = render_texture_alloc(NULL, NULL);
render_texture_set_bitmap(state->texture[0], state->bitmap[0], &state->visarea, 0, state->texture_format);
render_texture_set_bitmap(state->texture[0], state->bitmap[0], &state->visarea, state->texture_format, palette);
state->texture[1] = render_texture_alloc(NULL, NULL);
render_texture_set_bitmap(state->texture[1], state->bitmap[1], &state->visarea, 0, state->texture_format);
render_texture_set_bitmap(state->texture[1], state->bitmap[1], &state->visarea, state->texture_format, palette);
}
}
}
@ -1572,9 +1573,11 @@ static int finish_screen_updates(running_machine *machine)
{
bitmap_t *bitmap = state->bitmap[state->curbitmap];
rectangle fixedvis = *video_screen_get_visible_area(screen);
palette_t *palette = (state->texture_format == TEXFORMAT_PALETTE16) ? machine->palette : NULL;
fixedvis.max_x++;
fixedvis.max_y++;
render_texture_set_bitmap(state->texture[state->curbitmap], bitmap, &fixedvis, 0, state->texture_format);
render_texture_set_bitmap(state->texture[state->curbitmap], bitmap, &fixedvis, state->texture_format, palette);
state->curtexture = state->curbitmap;
state->curbitmap = 1 - state->curbitmap;
}

View File

@ -10,6 +10,7 @@
******************************************************************************/
#include "palette.h"
#include <math.h>
@ -44,6 +45,11 @@ struct _palette_t
UINT32 numcolors; /* number of colors in the palette */
UINT32 numgroups; /* number of groups in the palette */
float brightness; /* overall brightness value */
float contrast; /* overall contrast value */
float gamma; /* overall gamma value */
UINT8 gamma_map[256]; /* gamma map */
rgb_t * entry_color; /* array of raw colors */
float * entry_contrast; /* contrast value for each entry */
rgb_t * adjusted_color; /* array of adjusted colors */
@ -75,11 +81,11 @@ static void update_adjusted_color(palette_t *palette, UINT32 group, UINT32 index
entry for brightness
-------------------------------------------------*/
INLINE rgb_t adjust_palette_entry(rgb_t entry, float brightness, float contrast)
INLINE rgb_t adjust_palette_entry(rgb_t entry, float brightness, float contrast, const UINT8 *gamma_map)
{
int r = rgb_clamp((float)RGB_RED(entry) * contrast + brightness);
int g = rgb_clamp((float)RGB_GREEN(entry) * contrast + brightness);
int b = rgb_clamp((float)RGB_BLUE(entry) * contrast + brightness);
int r = rgb_clamp((float)gamma_map[RGB_RED(entry)] * contrast + brightness);
int g = rgb_clamp((float)gamma_map[RGB_GREEN(entry)] * contrast + brightness);
int b = rgb_clamp((float)gamma_map[RGB_BLUE(entry)] * contrast + brightness);
int a = RGB_ALPHA(entry);
return MAKE_ARGB(a,r,g,b);
}
@ -105,6 +111,13 @@ palette_t *palette_alloc(UINT32 numcolors, UINT32 numgroups)
if (palette == NULL)
goto error;
memset(palette, 0, sizeof(*palette));
/* initialize overall controls */
palette->brightness = 0.0f;
palette->contrast = 1.0f;
palette->gamma = 1.0f;
for (index = 0; index < 256; index++)
palette->gamma_map[index] = index;
/* allocate an array of palette entries and individual contrasts for each */
palette->entry_color = malloc(sizeof(*palette->entry_color) * numcolors);
@ -461,6 +474,81 @@ const rgb_t *palette_entry_list_adjusted_rgb15(palette_t *palette)
PALETTE ADJUSTMENTS
***************************************************************************/
/*-------------------------------------------------
palette_set_brightness - set the overall
brightness for the palette
-------------------------------------------------*/
void palette_set_brightness(palette_t *palette, float brightness)
{
int groupnum, index;
/* convert incoming value to normalized result */
brightness = (brightness - 1.0f) * 256.0f;
/* set the global brightness if changed */
if (palette->brightness == brightness)
return;
palette->brightness = brightness;
/* update across all indices in all groups */
for (groupnum = 0; groupnum < palette->numgroups; groupnum++)
for (index = 0; index < palette->numcolors; index++)
update_adjusted_color(palette, groupnum, index);
}
/*-------------------------------------------------
palette_set_contrast - set the overall
contrast for the palette
-------------------------------------------------*/
void palette_set_contrast(palette_t *palette, float contrast)
{
int groupnum, index;
/* set the global contrast if changed */
if (palette->contrast == contrast)
return;
palette->contrast = contrast;
/* update across all indices in all groups */
for (groupnum = 0; groupnum < palette->numgroups; groupnum++)
for (index = 0; index < palette->numcolors; index++)
update_adjusted_color(palette, groupnum, index);
}
/*-------------------------------------------------
palette_set_gamma - set the overall
gamma for the palette
-------------------------------------------------*/
void palette_set_gamma(palette_t *palette, float gamma)
{
int groupnum, index;
/* set the global gamma if changed */
if (palette->gamma == gamma)
return;
palette->gamma = gamma;
/* recompute the gamma map */
gamma = 1.0f / gamma;
for (index = 0; index < 256; index++)
{
float fval = (float)index * (1.0f / 255.0f);
float fresult = pow(fval, gamma);
palette->gamma_map[index] = rgb_clamp(255.0f * fresult);
}
/* update across all indices in all groups */
for (groupnum = 0; groupnum < palette->numgroups; groupnum++)
for (index = 0; index < palette->numcolors; index++)
update_adjusted_color(palette, groupnum, index);
}
/*-------------------------------------------------
palette_entry_set_contrast - set the contrast
adjustment for a single palette index
@ -502,6 +590,9 @@ float palette_entry_get_contrast(palette_t *palette, UINT32 index)
void palette_group_set_brightness(palette_t *palette, UINT32 group, float brightness)
{
int index;
/* convert incoming value to normalized result */
brightness = (brightness - 1.0f) * 256.0f;
/* if out of range, or unchanged, ignore */
if (group >= palette->numgroups || palette->group_bright[group] == brightness)
@ -632,7 +723,10 @@ static void update_adjusted_color(palette_t *palette, UINT32 group, UINT32 index
rgb_t adjusted;
/* compute the adjusted value */
adjusted = adjust_palette_entry(palette->entry_color[index], palette->group_bright[group], palette->group_contrast[group] * palette->entry_contrast[index]);
adjusted = adjust_palette_entry(palette->entry_color[index],
palette->group_bright[group] * palette->brightness,
palette->group_contrast[group] * palette->entry_contrast[index] * palette->contrast,
palette->gamma_map);
/* if not different, ignore */
if (palette->adjusted_color[finalindex] == adjusted)

View File

@ -129,6 +129,15 @@ const rgb_t *palette_entry_list_adjusted_rgb15(palette_t *palette);
/* ----- palette adjustments ----- */
/* set the overall brightness for the palette */
void palette_set_brightness(palette_t *palette, float brightness);
/* set the overall contrast for the palette */
void palette_set_contrast(palette_t *palette, float contrast);
/* set the overall gamma for the palette */
void palette_set_gamma(palette_t *palette, float gamma);
/* set the contrast adjustment for a single palette index */
void palette_entry_set_contrast(palette_t *palette, UINT32 index, float contrast);

View File

@ -105,7 +105,7 @@ static WRITE8_HANDLER( chqflag_vreg_w )
/* only affect the background */
for (i = 512;i < 1024;i++)
palette_set_brightness(machine,i,brt);
palette_set_pen_contrast(machine,i,brt);
}
//if ((data & 0xf8) && (data & 0xf8) != 0x88)

View File

@ -123,7 +123,7 @@ static WRITE16_HANDLER( mwarr_brightness_w )
brightness = (double)(data & 0xff);
for (i=0;i<0x800;i++)
{
palette_set_brightness(machine, i, brightness/255);
palette_set_pen_contrast(machine, i, brightness/255);
}
}

View File

@ -299,7 +299,7 @@ static WRITE32_HANDLER( ps4_screen1_brt_w )
int i;
for (i = 0; i < 0x800; i++)
palette_set_brightness(machine,i,brt1);
palette_set_pen_contrast(machine,i,brt1);
oldbrt1 = brt1;
}
@ -326,7 +326,7 @@ static WRITE32_HANDLER( ps4_screen2_brt_w )
int i;
for (i = 0x800; i < 0x1000; i++)
palette_set_brightness(machine,i,brt2);
palette_set_pen_contrast(machine,i,brt2);
oldbrt2 = brt2;
}

View File

@ -225,7 +225,7 @@ static WRITE16_HANDLER ( shadfrce_sound_brt_w )
double brt = (data & 0xff) / 255.0;
for (i = 0; i < 0x4000; i++)
palette_set_brightness(machine,i,brt);
palette_set_pen_contrast(machine,i,brt);
}
}

View File

@ -271,7 +271,7 @@ WRITE16_HANDLER( timekill_intensity_w )
double intensity = (double)(data & 0xff) / (double)0x60;
int i;
for (i = 0; i < 8192; i++)
palette_set_brightness(machine, i, intensity);
palette_set_pen_contrast(machine, i, intensity);
}
}

View File

@ -756,15 +756,15 @@ VIDEO_UPDATE( tmnt2 )
// dim all colors before it
for (i=0; i<cb; i++)
palette_set_brightness(screen->machine,i,brt);
palette_set_pen_contrast(screen->machine,i,brt);
// reset all colors in range
for (i=cb; i<ce; i++)
palette_set_brightness(screen->machine,i,1.0);
palette_set_pen_contrast(screen->machine,i,1.0);
// dim all colors after it
for (i=ce; i<2048; i++)
palette_set_brightness(screen->machine,i,brt);
palette_set_pen_contrast(screen->machine,i,brt);
// toggle shadow/highlight
if (~dim_c & 0x10)

View File

@ -129,9 +129,9 @@ WRITE16_HANDLER( toobin_paletteram_w )
palette_set_color(machine, offset & 0x3ff, MAKE_RGB(red, green, blue));
if (!(newword & 0x8000))
palette_set_brightness(machine, offset & 0x3ff, brightness);
palette_set_pen_contrast(machine, offset & 0x3ff, brightness);
else
palette_set_brightness(machine, offset & 0x3ff, 1.0);
palette_set_pen_contrast(machine, offset & 0x3ff, 1.0);
}
}
@ -146,7 +146,7 @@ WRITE16_HANDLER( toobin_intensity_w )
for (i = 0; i < 0x400; i++)
if (!(paletteram16[i] & 0x8000))
palette_set_brightness(machine, i, brightness);
palette_set_pen_contrast(machine, i, brightness);
}
}

View File

@ -605,7 +605,7 @@ void winwindow_video_window_create(running_machine *machine, int index, win_moni
window->render_lock = osd_lock_alloc();
// load the layout
window->target = render_target_alloc(NULL, 0);
window->target = render_target_alloc(machine, NULL, 0);
if (window->target == NULL)
fatalerror("Error creating render target for window %d", index);