static const TCHAR *flushmode[] = { _T("soft"), _T("hard"), 0 };
static const TCHAR *kbleds[] = { _T("none"), _T("POWER"), _T("DF0"), _T("DF1"), _T("DF2"), _T("DF3"), _T("HD"), _T("CD"), _T("DFx"), 0 };
static const TCHAR *onscreenleds[] = { _T("false"), _T("true"), _T("rtg"), _T("both"), 0 };
+static const TCHAR *ledscale[] = { _T("automatic"), _T("1x"), _T("2x"), _T("3x"), _T("4x"), 0 };
static const TCHAR *soundfiltermode1[] = { _T("off"), _T("emulated"), _T("on"), 0 };
static const TCHAR *soundfiltermode2[] = { _T("standard"), _T("enhanced"), 0 };
static const TCHAR *lorestype1[] = { _T("lores"), _T("hires"), _T("superhires"), 0 };
cfgfile_dwrite_bool (f, _T("show_leds_rtg"), !!(p->leds_on_screen & STATUSLINE_RTG));
write_leds(f, _T("show_leds_enabled"), p->leds_on_screen_mask[0]);
write_leds(f, _T("show_leds_enabled_rtg"), p->leds_on_screen_mask[1]);
+ cfgfile_dwrite_str(f, _T("show_leds_size"), ledscale[p->leds_on_screen_multiplier[0]]);
+ cfgfile_dwrite_str(f, _T("show_leds_size_rtg"), ledscale[p->leds_on_screen_multiplier[1]]);
cfgfile_dwrite_bool(f, _T("show_refresh_indicator"), p->refresh_indicator);
cfgfile_dwrite(f, _T("power_led_dim"), _T("%d"), p->power_led_dim);
p->leds_on_screen &= ~STATUSLINE_RTG;
return 1;
}
+ if (_tcscmp(option, _T("show_leds_size")) == 0 || _tcscmp(option, _T("show_leds_size_rtg")) == 0) {
+ TCHAR tmp[MAX_DPATH];
+ int idx = _tcscmp(option, _T("show_leds_size")) == 0 ? 0 : 1;
+ cfgfile_strval(option, value, option, &p->leds_on_screen_multiplier[idx], ledscale, 0);
+ return 1;
+ }
if (_tcscmp (option, _T("show_leds_enabled")) == 0 || _tcscmp (option, _T("show_leds_enabled_rtg")) == 0) {
TCHAR tmp[MAX_DPATH];
int idx = _tcscmp (option, _T("show_leds_enabled")) == 0 ? 0 : 1;
{
if ((currprefs.leds_on_screen & STATUSLINE_CHIPSET) && softstatusline()) {
int slx, sly;
- statusline_getpos(vb->monitor_id, &slx, &sly, vb->outwidth, vb->outheight, 1, 1);
+ int mult = statusline_get_multiplier(vb->monitor_id);
+ statusline_getpos(vb->monitor_id, &slx, &sly, vb->outwidth, vb->outheight);
statusbar_y1 = sly + min_ypos_for_screen - 1;
- statusbar_y2 = statusbar_y1 + TD_TOTAL_HEIGHT + 1;
+ statusbar_y2 = statusbar_y1 + TD_TOTAL_HEIGHT * mult + 1;
draw_status_line(vb->monitor_id, sly, -1);
- for (int i = 0; i < TD_TOTAL_HEIGHT; i++) {
+ for (int i = 0; i < TD_TOTAL_HEIGHT * mult; i++) {
int line = sly + i;
draw_status_line(vb->monitor_id, line, i);
}
#define STATUSLINE_RTG 2
#define STATUSLINE_TARGET 0x80
-extern void draw_status_line_single(int monid, uae_u8 *buf, int bpp, int y, int totalwidth, uae_u32 *rc, uae_u32 *gc, uae_u32 *bc, uae_u32 *alpha);
-extern void statusline_single_erase(int monid, uae_u8 *buf, int bpp, int y, int totalwidth);
-extern void statusline_getpos(int monid, int *x, int *y, int width, int height, int hx, int vx);
-extern bool softstatusline(void);
+void draw_status_line_single(int monid, uae_u8 *buf, int bpp, int y, int totalwidth, uae_u32 *rc, uae_u32 *gc, uae_u32 *bc, uae_u32 *alpha);
+void statusline_single_erase(int monid, uae_u8 *buf, int bpp, int y, int totalwidth);
+void statusline_getpos(int monid, int *x, int *y, int width, int height);
+bool softstatusline(void);
#define STATUSTYPE_FLOPPY 1
#define STATUSTYPE_DISPLAY 2
#define STATUSTYPE_CD 4
#define STATUSTYPE_OTHER 5
-extern bool createstatusline(int);
-extern void deletestatusline(int);
-extern void statusline_render(int, uae_u8 *buf, int bpp, int pitch, int width, int height, uae_u32 *rc, uae_u32 *gc, uae_u32 *bc, uae_u32 *alpha);
-extern void statusline_add_message(int statustype, const TCHAR *format, ...);
-extern void statusline_clear(void);
-extern void statusline_vsync(void);
-extern void statusline_updated(int);
-extern bool has_statusline_updated(void);
-extern const TCHAR *statusline_fetch(void);
+bool createstatusline(int);
+void deletestatusline(int);
+void statusline_render(int, uae_u8 *buf, int bpp, int pitch, int width, int height, uae_u32 *rc, uae_u32 *gc, uae_u32 *bc, uae_u32 *alpha);
+void statusline_add_message(int statustype, const TCHAR *format, ...);
+void statusline_clear(void);
+void statusline_vsync(void);
+void statusline_updated(int);
+bool has_statusline_updated(void);
+const TCHAR *statusline_fetch(void);
+int statusline_set_multiplier(int, int, int);
+int statusline_get_multiplier(int monid);
#endif /* UAE_STATUSLINE_H */
for (int y = 0; y < TD_TOTAL_HEIGHT * d3d->statusbar_vx; y++) {
uae_u8 *buf = (uae_u8*)locked.pBits + y * locked.Pitch;
- statusline_single_erase(d3d - d3ddata, buf, 32 / 8, y, d3d->ledwidth * d3d->statusbar_hx);
+ statusline_single_erase(d3d - d3ddata, buf, 32 / 8, y, d3d->ledwidth);
}
statusline_render(d3d - d3ddata, (uae_u8*)locked.pBits, 32 / 8, locked.Pitch, d3d->ledwidth, d3d->ledheight, rc, gc, bc, a);
- int y = 0;
- for (int yy = 0; yy < d3d->statusbar_vx * TD_TOTAL_HEIGHT; yy++) {
- uae_u8 *buf = (uae_u8*)locked.pBits + yy * locked.Pitch;
+ for (int y = 0; y < TD_TOTAL_HEIGHT * d3d->statusbar_vx; y++) {
+ uae_u8 *buf = (uae_u8*)locked.pBits + y * locked.Pitch;
draw_status_line_single(d3d - d3ddata, buf, 32 / 8, y, d3d->ledwidth, rc, gc, bc, a);
- if ((yy % d3d->statusbar_vx) == 0)
- y++;
}
d3d->ledtexture->UnlockRect (0);
static int createledtexture (struct d3dstruct *d3d)
{
+ struct AmigaMonitor *mon = &AMonitors[d3d - d3ddata];
+
+ d3d->statusbar_hx = d3d->statusbar_vx = statusline_set_multiplier(mon->monitor_id, d3d->tout_w, d3d->tout_h);
d3d->ledwidth = d3d->window_w;
- d3d->ledheight = TD_TOTAL_HEIGHT;
- if (d3d->statusbar_hx < 1)
- d3d->statusbar_hx = 1;
- if (d3d->statusbar_vx < 1)
- d3d->statusbar_vx = 1;
- d3d->ledtexture = createtext (d3d, d3d->ledwidth * d3d->statusbar_hx, d3d->ledheight * d3d->statusbar_vx, D3DFMT_A8R8G8B8);
+ d3d->ledheight = TD_TOTAL_HEIGHT * d3d->statusbar_vx;
+ d3d->ledtexture = createtext(d3d, d3d->ledwidth, d3d->ledheight * d3d->statusbar_vx, D3DFMT_A8R8G8B8);
if (!d3d->ledtexture)
return 0;
return 1;
}
if (d3d->ledtexture && (((currprefs.leds_on_screen & STATUSLINE_RTG) && WIN32GFX_IsPicassoScreen(mon)) || ((currprefs.leds_on_screen & STATUSLINE_CHIPSET) && !WIN32GFX_IsPicassoScreen(mon)))) {
int slx, sly;
- statusline_getpos(d3d - d3ddata, &slx, &sly, d3d->window_w, d3d->window_h, d3d->statusbar_hx, d3d->statusbar_vx);
+ statusline_getpos(d3d - d3ddata, &slx, &sly, d3d->window_w, d3d->window_h);
v.x = slx;
v.y = sly;
v.z = 0;
if (!d3d->osd.texture || d3d != d3d11data)
return;
- statusline_getpos(d3d - d3d11data, &osdx, &osdy, d3d->m_screenWidth, d3d->m_screenHeight, d3d->statusbar_hx, d3d->statusbar_vx);
+ statusline_getpos(d3d - d3d11data, &osdx, &osdy, d3d->m_screenWidth, d3d->m_screenHeight);
d3d->osd.x = osdx;
d3d->osd.y = osdy;
}
for (int y = 0; y < TD_TOTAL_HEIGHT * d3d->statusbar_vx; y++) {
uae_u8 *buf = (uae_u8*)map.pData + y * map.RowPitch;
- statusline_single_erase(d3d - d3d11data, buf, 32 / 8, y, d3d->ledwidth * d3d->statusbar_hx);
+ statusline_single_erase(d3d - d3d11data, buf, 32 / 8, y, d3d->ledwidth);
}
statusline_render(d3d - d3d11data, (uae_u8*)map.pData, 32 / 8, map.RowPitch, d3d->ledwidth, d3d->ledheight, rc, gc, bc, a);
- int y = 0;
- for (int yy = 0; yy < d3d->statusbar_vx * TD_TOTAL_HEIGHT; yy++) {
- uae_u8 *buf = (uae_u8*)map.pData + yy * map.RowPitch;
+ for (int y = 0; y < TD_TOTAL_HEIGHT * d3d->statusbar_vx; y++) {
+ uae_u8 *buf = (uae_u8*)map.pData + y * map.RowPitch;
draw_status_line_single(d3d - d3d11data, buf, 32 / 8, y, d3d->ledwidth, rc, gc, bc, a);
- if ((yy % d3d->statusbar_vx) == 0)
- y++;
}
d3d->m_deviceContext->Unmap(d3d->osd.texture, 0);
static bool CreateTexture(struct d3d11struct *d3d)
{
+ struct AmigaMonitor *mon = &AMonitors[d3d - d3d11data];
D3D11_TEXTURE2D_DESC desc;
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
HRESULT hr;
UpdateVertexArray(d3d, d3d->m_vertexBuffer, 0, 0, 0, 0, 0, 0, 0, 0);
+ d3d->statusbar_hx = d3d->statusbar_vx = statusline_set_multiplier(mon->monitor_id, d3d->m_screenWidth, d3d->m_screenHeight);
d3d->ledwidth = d3d->m_screenWidth;
- d3d->ledheight = TD_TOTAL_HEIGHT;
- if (d3d->statusbar_hx < 1)
- d3d->statusbar_hx = 1;
- if (d3d->statusbar_vx < 1)
- d3d->statusbar_vx = 1;
+ d3d->ledheight = TD_TOTAL_HEIGHT * d3d->statusbar_vx;
allocsprite(d3d, &d3d->osd, d3d->ledwidth, d3d->ledheight, true);
d3d->osd.enabled = true;
if (dst_width > vidinfo->width)
dst_width = vidinfo->width;
pitch = vidinfo->rowbytes;
- statusline_getpos(monid, &slx, &sly, state->Width, dst_height, 1, 1);
- if (currprefs.gfx_api)
+ statusline_getpos(monid, &slx, &sly, state->Width, dst_height);
+ if (currprefs.gfx_api) {
statusline_render(monid, dst + sly * pitch, vidinfo->pixbytes, pitch, dst_width, dst_height, p96rc, p96gc, p96bc, NULL);
- yy = 0;
- for (y = 0; y < TD_TOTAL_HEIGHT; y++) {
+ }
+ int m = statusline_get_multiplier(monid);
+ for (y = 0; y < TD_TOTAL_HEIGHT * m; y++) {
uae_u8 *buf = dst + (y + sly) * pitch;
draw_status_line_single(monid, buf, vidinfo->pixbytes, y, dst_width, p96rc, p96gc, p96bc, NULL);
- yy++;
}
}
if (!(currprefs.leds_on_screen & STATUSLINE_CHIPSET) || !tempsurf)
return;
- statusline_getpos(monid, &slx, &sly, dst_width, dst_height, 1, 1);
+ statusline_getpos(monid, &slx, &sly, dst_width, dst_height);
+ int m = statusline_get_multiplier(monid);
lx = dst_width;
ly = dst_height;
- SetRect(&sr, slx, 0, slx + lx, TD_TOTAL_HEIGHT);
- SetRect(&dr, slx, sly, slx + lx, sly + TD_TOTAL_HEIGHT);
+ SetRect(&sr, slx, 0, slx + lx, TD_TOTAL_HEIGHT * m);
+ SetRect(&dr, slx, sly, slx + lx, sly + TD_TOTAL_HEIGHT * m);
DirectDraw_BlitRect(tempsurf, &sr, NULL, &dr);
if (DirectDraw_LockSurface(tempsurf, &desc)) {
statusline_render(0, (uae_u8*)desc.lpSurface, dst_depth / 8, desc.lPitch, lx, ly, rc, gc, bc, NULL);
- for (y = 0; y < TD_TOTAL_HEIGHT; y++) {
+ for (y = 0; y < TD_TOTAL_HEIGHT * m; y++) {
uae_u8 *buf = (uae_u8*)desc.lpSurface + y * desc.lPitch;
draw_status_line_single(monid, buf, dst_depth / 8, y, lx, rc, gc, bc, NULL);
}
d3d = currprefs.gfx_api;
changed_prefs.leds_on_screen |= STATUSLINE_TARGET;
currprefs.leds_on_screen |= STATUSLINE_TARGET;
+ statusline_set_multiplier(monid, dw, dh);
if (d3d)
dd = amiga_depth2;
* Some code to put status information on the screen.
*/
-void statusline_getpos(int monid, int *x, int *y, int width, int height, int hx, int vx)
+void statusline_getpos(int monid, int *x, int *y, int width, int height)
{
- int total_height = TD_TOTAL_HEIGHT * vx;
+ int mx = statusline_get_multiplier(monid);
+ int total_height = TD_TOTAL_HEIGHT * mx;
if (currprefs.osd_pos.x >= 20000) {
if (currprefs.osd_pos.x >= 30000)
*y = width * (currprefs.osd_pos.x - 30000) / 1000;
return v;
}
-static void write_tdnumber(uae_u8 *buf, int bpp, int x, int y, int num, uae_u32 c1, uae_u32 c2)
+static void write_tdnumber(uae_u8 *buf, int bpp, int x, int y, int num, uae_u32 c1, uae_u32 c2, int mult)
{
int j;
const char *numptr;
numptr = numbers + num * TD_NUM_WIDTH + NUMBERS_NUM * TD_NUM_WIDTH * y;
for (j = 0; j < TD_NUM_WIDTH; j++) {
- if (*numptr == 'x')
- putpixel (buf, NULL, bpp, x + j, c1, 1);
- else if (*numptr == '+')
- putpixel (buf, NULL, bpp, x + j, c2, 0);
+ for (int k = 0; k < mult; k++) {
+ if (*numptr == 'x')
+ putpixel(buf, NULL, bpp, x + j * mult + k, c1, 1);
+ else if (*numptr == '+')
+ putpixel(buf, NULL, bpp, x + j * mult + k, c2, 0);
+ }
numptr++;
}
}
return out;
}
+static int statusline_mult[2];
+
+int statusline_set_multiplier(int monid, int width, int height)
+{
+ struct amigadisplay *ad = &adisplays[monid];
+ int idx = ad->picasso_on ? 1 : 0;
+ int mult = currprefs.leds_on_screen_multiplier[idx];
+ if (!mult) {
+ mult = 1;
+ }
+ if (mult > 4) {
+ mult = 4;
+ }
+ statusline_mult[idx] = mult;
+ return mult;
+}
+
+int statusline_get_multiplier(int monid)
+{
+ struct amigadisplay *ad = &adisplays[monid];
+ int idx = ad->picasso_on ? 1 : 0;
+ if (statusline_mult[idx] <= 0)
+ return 1;
+ return statusline_mult[idx];
+}
+
void draw_status_line_single(int monid, uae_u8 *buf, int bpp, int y, int totalwidth, uae_u32 *rc, uae_u32 *gc, uae_u32 *bc, uae_u32 *alpha)
{
struct amigadisplay *ad = &adisplays[monid];
int x_start, j, led, border;
uae_u32 c1, c2, cb;
+ int mult = statusline_mult[ad->picasso_on ? 1 : 0];
+
+ if (!mult)
+ return;
+
+ y /= mult;
c1 = ledcolor (0x00ffffff, rc, gc, bc, alpha);
c2 = ledcolor (0x00000000, rc, gc, bc, alpha);
if (td_pos & TD_RIGHT)
- x_start = totalwidth - TD_PADX - VISIBLE_LEDS * TD_WIDTH;
+ x_start = totalwidth - (TD_PADX + VISIBLE_LEDS * TD_WIDTH) * mult;
else
- x_start = TD_PADX;
+ x_start = TD_PADX * mult;
for (led = 0; led < LED_MAX; led++) {
int side, pos, num1 = -1, num2 = -1, num3 = -1, num4 = -1;
border = 1;
}
- x = x_start + pos * TD_WIDTH;
- if (!border) {
- putpixel(buf, NULL, bpp, x - 1, cb, 0);
- }
- for (j = 0; j < TD_LED_WIDTH; j++) {
- putpixel(buf, NULL, bpp, x + j, c, 0);
- }
- if (!border) {
- putpixel(buf, NULL, bpp, x + j, cb, 0);
+ x = x_start + pos * TD_WIDTH * mult;
+ for (int xx = 0; xx < mult; xx++) {
+ if (!border) {
+ putpixel(buf, NULL, bpp, x - mult + xx, cb, 0);
+ }
+ for (j = 0; j < TD_LED_WIDTH * mult; j += mult) {
+ putpixel(buf, NULL, bpp, x + j + xx, c, 0);
+ }
+ if (!border) {
+ putpixel(buf, NULL, bpp, x + j + xx, cb, 0);
+ }
}
if (y >= TD_PADY && y - TD_PADY < TD_NUM_HEIGHT) {
if (num3 >= 0) {
- x += (TD_LED_WIDTH - am * TD_NUM_WIDTH) / 2;
+ x += (TD_LED_WIDTH - am * TD_NUM_WIDTH) * mult / 2;
if (num1 > 0) {
- write_tdnumber (buf, bpp, x, y - TD_PADY, num1, pen_rgb, c2);
- x += TD_NUM_WIDTH;
+ write_tdnumber(buf, bpp, x, y - TD_PADY, num1, pen_rgb, c2, mult);
+ x += TD_NUM_WIDTH * mult;
}
if (num2 >= 0) {
- write_tdnumber (buf, bpp, x, y - TD_PADY, num2, pen_rgb, c2);
- x += TD_NUM_WIDTH;
+ write_tdnumber(buf, bpp, x, y - TD_PADY, num2, pen_rgb, c2, mult);
+ x += TD_NUM_WIDTH * mult;
}
- write_tdnumber (buf, bpp, x, y - TD_PADY, num3, pen_rgb, c2);
- x += TD_NUM_WIDTH;
+ write_tdnumber(buf, bpp, x, y - TD_PADY, num3, pen_rgb, c2, mult);
+ x += TD_NUM_WIDTH * mult;
if (num4 > 0)
- write_tdnumber (buf, bpp, x, y - TD_PADY, num4, pen_rgb, c2);
+ write_tdnumber(buf, bpp, x, y - TD_PADY, num4, pen_rgb, c2, mult);
}
}
}