summaryrefslogtreecommitdiffstats
path: root/src/frontend/mame/ui/viewgfx.cpp
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2016-08-26 22:21:47 -0400
committer AJR <ajrhacker@users.noreply.github.com>2016-08-26 22:39:58 -0400
commit1fe589ca1e65e94bc51a6dd694f21182ae4801cf (patch)
tree32030de3885b2cc484031f13d02cdb33c7b8710e /src/frontend/mame/ui/viewgfx.cpp
parentcdb531e83defeb87fe131c37ca4ff3d28fc3f3df (diff)
Show color values in palette viewer
- On the UI graphics viewer's palette screen, moving the mouse over a color rectangle will show the index of the entry and its RGB values in hexadecimal. - For indirect pens, the index of the corresponding color will also be shown. - For colors in normal RAM-based palettes, the raw (i.e. undecoded) value stored in memory will also be shown. This does not currently work with most buffered palettes (though the Seibu SPI driver has been updated for this purpose), and is totally incompatible with PROM-based or RAMDAC-based palettes. (nw) The changes made to the core while implementing this feature may look more substantial than they really are. A whole batch of read methods have been made const, and palette_device now has a generic read_entry function that is used both internally and externally.
Diffstat (limited to 'src/frontend/mame/ui/viewgfx.cpp')
-rw-r--r--src/frontend/mame/ui/viewgfx.cpp78
1 files changed, 50 insertions, 28 deletions
diff --git a/src/frontend/mame/ui/viewgfx.cpp b/src/frontend/mame/ui/viewgfx.cpp
index b19df247cfc..f299cacd3cf 100644
--- a/src/frontend/mame/ui/viewgfx.cpp
+++ b/src/frontend/mame/ui/viewgfx.cpp
@@ -347,14 +347,12 @@ static void palette_handler(mame_ui_manager &mui, render_container &container, u
int total = state.palette.which ? palette->indirect_entries() : palette->entries();
const rgb_t *raw_color = palette->palette()->entry_list_raw();
render_font *ui_font = mui.get_font();
- float cellwidth, cellheight;
float chwidth, chheight;
float titlewidth;
float x0, y0;
render_bounds cellboxbounds;
render_bounds boxbounds;
int x, y, skip;
- char title[100];
// add a half character padding for the box
chheight = mui.get_line_height();
@@ -377,10 +375,42 @@ static void palette_handler(mame_ui_manager &mui, render_container &container, u
// add space on the top for a title, a half line of padding, a header, and another half line
cellboxbounds.y0 += 3.0f * chheight;
- // figure out the title and expand the outer box to fit
- const char *suffix = palette->indirect_entries() == 0 ? "" : state.palette.which ? _(" COLORS") : _(" PENS");
- sprintf(title, "'%s'%s", palette->tag(), suffix);
- titlewidth = ui_font->string_width(chheight, mui.machine().render().ui_aspect(), title);
+ // compute the cell size
+ float cellwidth = (cellboxbounds.x1 - cellboxbounds.x0) / (float)state.palette.columns;
+ float cellheight = (cellboxbounds.y1 - cellboxbounds.y0) / (float)state.palette.columns;
+
+ // figure out the title
+ std::ostringstream title_buf;
+ util::stream_format(title_buf, "'%s'", palette->tag());
+ if (palette->indirect_entries() > 0)
+ title_buf << (state.palette.which ? _(" COLORS") : _(" PENS"));
+
+ // if the mouse pointer is over one of our cells, add some info about the corresponding palette entry
+ INT32 mouse_target_x, mouse_target_y;
+ bool mouse_button;
+ float mouse_x, mouse_y;
+ render_target *mouse_target = mui.machine().ui_input().find_mouse(&mouse_target_x, &mouse_target_y, &mouse_button);
+ if (mouse_target != nullptr && mouse_target->map_point_container(mouse_target_x, mouse_target_y, container, mouse_x, mouse_y)
+ && cellboxbounds.x0 <= mouse_x && cellboxbounds.x1 > mouse_x
+ && cellboxbounds.y0 <= mouse_y && cellboxbounds.y1 > mouse_y)
+ {
+ int index = state.palette.offset + int((mouse_x - cellboxbounds.x0) / cellwidth) + int((mouse_y - cellboxbounds.y0) / cellheight) * state.palette.columns;
+ if (index < total)
+ {
+ util::stream_format(title_buf, " #%X", index);
+ if (palette->indirect_entries() > 0 && !state.palette.which)
+ util::stream_format(title_buf, " => %X", palette->pen_indirect(index));
+ else if (palette->basemem().base() != nullptr)
+ util::stream_format(title_buf, " = %X", palette->read_entry(index));
+
+ rgb_t col = state.palette.which ? palette->indirect_color(index) : raw_color[index];
+ util::stream_format(title_buf, " (R:%X G:%X B:%X)", col.r(), col.g(), col.b());
+ }
+ }
+
+ // expand the outer box to fit the title
+ const std::string title = title_buf.str();
+ titlewidth = ui_font->string_width(chheight, mui.machine().render().ui_aspect(), title.c_str());
x0 = 0.0f;
if (boxbounds.x1 - boxbounds.x0 < titlewidth + chwidth)
x0 = boxbounds.x0 - (0.5f - 0.5f * (titlewidth + chwidth));
@@ -391,16 +421,12 @@ static void palette_handler(mame_ui_manager &mui, render_container &container, u
// draw the title
x0 = 0.5f - 0.5f * titlewidth;
y0 = boxbounds.y0 + 0.5f * chheight;
- for (x = 0; title[x] != 0; x++)
+ for (auto ch : title)
{
- container.add_char(x0, y0, chheight, mui.machine().render().ui_aspect(), rgb_t::white, *ui_font, title[x]);
- x0 += ui_font->char_width(chheight, mui.machine().render().ui_aspect(), title[x]);
+ container.add_char(x0, y0, chheight, mui.machine().render().ui_aspect(), rgb_t::white, *ui_font, ch);
+ x0 += ui_font->char_width(chheight, mui.machine().render().ui_aspect(), ch);
}
- // compute the cell size
- cellwidth = (cellboxbounds.x1 - cellboxbounds.x0) / (float)state.palette.columns;
- cellheight = (cellboxbounds.y1 - cellboxbounds.y0) / (float)state.palette.columns;
-
// draw the top column headers
skip = (int)(chwidth / cellwidth);
for (x = 0; x < state.palette.columns; x += 1 + skip)
@@ -559,7 +585,6 @@ static void gfxset_handler(mame_ui_manager &mui, render_container &container, ui
float cellwidth, cellheight;
float chwidth, chheight;
float titlewidth;
- //float cellaspect;
float x0, y0;
render_bounds cellboxbounds;
render_bounds boxbounds;
@@ -570,7 +595,6 @@ static void gfxset_handler(mame_ui_manager &mui, render_container &container, ui
int xcells, ycells;
int pixelscale = 0;
int x, y, skip;
- char title[100];
// add a half character padding for the box
chheight = mui.get_line_height();
@@ -638,12 +662,12 @@ static void gfxset_handler(mame_ui_manager &mui, render_container &container, ui
boxbounds.y1 = boxbounds.y0 + fullheight;
// figure out the title and expand the outer box to fit
- sprintf(title, "'%s' %d/%d %dx%d COLOR %X",
+ const std::string title = string_format("'%s' %d/%d %dx%d COLOR %X",
interface.device().tag(),
set, info.setcount - 1,
gfx.width(), gfx.height(),
info.color[set]);
- titlewidth = ui_font->string_width(chheight, mui.machine().render().ui_aspect(), title);
+ titlewidth = ui_font->string_width(chheight, mui.machine().render().ui_aspect(), title.c_str());
x0 = 0.0f;
if (boxbounds.x1 - boxbounds.x0 < titlewidth + chwidth)
x0 = boxbounds.x0 - (0.5f - 0.5f * (titlewidth + chwidth));
@@ -654,10 +678,10 @@ static void gfxset_handler(mame_ui_manager &mui, render_container &container, ui
// draw the title
x0 = 0.5f - 0.5f * titlewidth;
y0 = boxbounds.y0 + 0.5f * chheight;
- for (x = 0; title[x] != 0; x++)
+ for (auto ch : title)
{
- container.add_char(x0, y0, chheight, mui.machine().render().ui_aspect(), rgb_t::white, *ui_font, title[x]);
- x0 += ui_font->char_width(chheight, mui.machine().render().ui_aspect(), title[x]);
+ container.add_char(x0, y0, chheight, mui.machine().render().ui_aspect(), rgb_t::white, *ui_font, ch);
+ x0 += ui_font->char_width(chheight, mui.machine().render().ui_aspect(), ch);
}
// draw the top column headers
@@ -960,8 +984,6 @@ static void tilemap_handler(mame_ui_manager &mui, render_container &container, u
int mapboxwidth, mapboxheight;
int maxxscale, maxyscale;
UINT32 mapwidth, mapheight;
- int x, pixelscale;
- char title[100];
// get the size of the tilemap itself
tilemap_t *tilemap = mui.machine().tilemap().find(state.tilemap.which);
@@ -993,7 +1015,7 @@ static void tilemap_handler(mame_ui_manager &mui, render_container &container, u
mapboxheight = (mapboxbounds.y1 - mapboxbounds.y0) * (float)targheight;
// determine the maximum integral scaling factor
- pixelscale = state.tilemap.zoom;
+ int pixelscale = state.tilemap.zoom;
if (pixelscale == 0)
{
for (maxxscale = 1; mapwidth * (maxxscale + 1) < mapboxwidth; maxxscale++) { }
@@ -1018,8 +1040,8 @@ static void tilemap_handler(mame_ui_manager &mui, render_container &container, u
boxbounds.y1 = mapboxbounds.y1 + 0.5f * chheight;
// figure out the title and expand the outer box to fit
- sprintf(title, "TILEMAP %d/%d %dx%d OFFS %d,%d", state.tilemap.which, mui.machine().tilemap().count() - 1, mapwidth, mapheight, state.tilemap.xoffs, state.tilemap.yoffs);
- titlewidth = ui_font->string_width(chheight, mui.machine().render().ui_aspect(), title);
+ const std::string title = string_format("TILEMAP %d/%d %dx%d OFFS %d,%d", state.tilemap.which, mui.machine().tilemap().count() - 1, mapwidth, mapheight, state.tilemap.xoffs, state.tilemap.yoffs);
+ titlewidth = ui_font->string_width(chheight, mui.machine().render().ui_aspect(), title.c_str());
if (boxbounds.x1 - boxbounds.x0 < titlewidth + chwidth)
{
boxbounds.x0 = 0.5f - 0.5f * (titlewidth + chwidth);
@@ -1032,10 +1054,10 @@ static void tilemap_handler(mame_ui_manager &mui, render_container &container, u
// draw the title
x0 = 0.5f - 0.5f * titlewidth;
y0 = boxbounds.y0 + 0.5f * chheight;
- for (x = 0; title[x] != 0; x++)
+ for (auto ch : title)
{
- container.add_char(x0, y0, chheight, mui.machine().render().ui_aspect(), rgb_t::white, *ui_font, title[x]);
- x0 += ui_font->char_width(chheight, mui.machine().render().ui_aspect(), title[x]);
+ container.add_char(x0, y0, chheight, mui.machine().render().ui_aspect(), rgb_t::white, *ui_font, ch);
+ x0 += ui_font->char_width(chheight, mui.machine().render().ui_aspect(), ch);
}
// update the bitmap