summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/rendlay.cpp
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2020-10-19 10:51:21 +1100
committer Vas Crabb <vas@vastheman.com>2020-10-19 10:51:21 +1100
commit66d2045d356561f15f022ac572835d581a78280e (patch)
treeb535244e37f016b63babe957470167b20c3ea650 /src/emu/rendlay.cpp
parentc88f0006c93e64bdf86e094cc97c8447885549ca (diff)
-emu/rendlay.cpp: Avoid another issue with floating point error accumulation when drawing disk components.
-fidel_dames.cpp: Draw buttons as single elements - improves appearance at small sizes.
Diffstat (limited to 'src/emu/rendlay.cpp')
-rw-r--r--src/emu/rendlay.cpp47
1 files changed, 26 insertions, 21 deletions
diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp
index 1f10941bbab..833d9e4e86d 100644
--- a/src/emu/rendlay.cpp
+++ b/src/emu/rendlay.cpp
@@ -38,7 +38,8 @@
#define LOG_GROUP_BOUNDS_RESOLUTION (1U << 1)
#define LOG_INTERACTIVE_ITEMS (1U << 2)
-#define LOG_IMAGE_LOAD (1U << 3)
+#define LOG_DISK_DRAW (1U << 3)
+#define LOG_IMAGE_LOAD (1U << 4)
//#define VERBOSE (LOG_GROUP_BOUNDS_RESOLUTION | LOG_INTERACTIVE_ITEMS | LOG_IMAGE_LOAD)
#define LOG_OUTPUT_FUNC osd_printf_verbose
@@ -2041,6 +2042,8 @@ public:
float const yradius = curbounds.height() * float(dest.height()) * 0.5F;
s32 const miny = s32(curbounds.y0 * float(dest.height()));
s32 const maxy = s32(std::ceil(curbounds.y1 * float(dest.height()))) - 1;
+ LOGMASKED(LOG_DISK_DRAW, "Draw disk: bounds (%s %s %s %s); (((x - %s) ** 2) / (%s ** 2) + ((y - %s) ** 2) / (%s ** 2)) = 1; rows [%s %s]\n",
+ curbounds.x0, curbounds.y0, curbounds.x1, curbounds.y1, xcenter, xradius, ycenter, yradius, miny, maxy);
if (miny == maxy)
{
@@ -2115,17 +2118,18 @@ public:
// draw rows above the axis
s32 y = miny + 1;
float ycoord1 = ycenter - float(y);
- float xval1 = xradius * std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
- float l1 = xcenter - xval1;
- float r1 = xcenter + xval1;
+ float xval1 = std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
+ float l1 = xcenter - (xval1 * xradius);
+ float r1 = xcenter + (xval1 * xradius);
for ( ; (maxy > y) && (float(y + 1) <= ycenter); ++y)
{
+ float const xval0 = xval1;
float const l0 = l1;
float const r0 = r1;
ycoord1 = ycenter - float(y + 1);
- xval1 = xradius * std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
- l1 = xcenter - xval1;
- r1 = xcenter + xval1;
+ xval1 = std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
+ l1 = xcenter - (xval1 * xradius);
+ r1 = xcenter + (xval1 * xradius);
s32 minx = int(l1);
s32 maxx = int(std::ceil(r1)) - 1;
u32 *dst = &dest.pix(y, minx);
@@ -2142,13 +2146,13 @@ public:
{
float val = 0.0F;
if (float(x + 1) <= l0)
- val += integral((xcenter - float(x + 1)) / xradius, (xcenter - (std::max)(float(x), l1)) / xradius);
+ val += integral((std::max)((float(x) - xcenter) / xradius, -xval1), (float(x + 1) - xcenter) / xradius);
else if (float(x) <= l0)
- val += integral((xcenter - l0) / xradius, (xcenter - (std::max)(float(x), l1)) / xradius);
+ val += integral((std::max)((float(x) - xcenter) / xradius, -xval1), -xval0);
else if (float(x) >= r0)
- val += integral((float(x) - xcenter) / xradius, ((std::min)(float(x + 1), r1) - xcenter) / xradius);
+ val += integral((float(x) - xcenter) / xradius, (std::min)((float(x + 1) - xcenter) / xradius, xval1));
else if (float(x + 1) >= r0)
- val += integral((r0 - xcenter) / xradius, ((std::min)(float(x + 1), r1) - xcenter) / xradius);
+ val += integral(xval0, (std::min)((float(x + 1) - xcenter) / xradius, xval1));
val *= scale;
if (float(x) <= l0)
val -= ((std::min)(float(x + 1), l0) - (std::max)(float(x), l1)) * ycoord1;
@@ -2166,9 +2170,9 @@ public:
float const l0 = l1;
float const r0 = r1;
ycoord1 = float(y + 1) - ycenter;
- xval1 = xradius * std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
- l1 = xcenter - xval1;
- r1 = xcenter + xval1;
+ xval1 = std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
+ l1 = xcenter - (xval1 * xradius);
+ r1 = xcenter + (xval1 * xradius);
s32 const minx = int(curbounds.x0 * float(dest.width()));
s32 const maxx = int(std::ceil(curbounds.x1 * float(dest.width()))) - 1;
u32 *dst = &dest.pix(y, minx);
@@ -2213,12 +2217,13 @@ public:
for ( ; maxy > y; ++y)
{
float const ycoord0 = ycoord1;
+ float const xval0 = xval1;
float const l0 = l1;
float const r0 = r1;
ycoord1 = float(y + 1) - ycenter;
- xval1 = xradius * std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
- l1 = xcenter - xval1;
- r1 = xcenter + xval1;
+ xval1 = std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F));
+ l1 = xcenter - (xval1 * xradius);
+ r1 = xcenter + (xval1 * xradius);
s32 minx = int(l0);
s32 maxx = int(std::ceil(r0)) - 1;
u32 *dst = &dest.pix(y, minx);
@@ -2235,13 +2240,13 @@ public:
{
float val = 0.0F;
if (float(x + 1) <= l1)
- val += integral((xcenter - float(x + 1)) / xradius, (xcenter - (std::max)(float(x), l0)) / xradius);
+ val += integral((std::max)((float(x) - xcenter) / xradius, -xval0), (float(x + 1) - xcenter) / xradius);
else if (float(x) <= l1)
- val += integral((xcenter - l1) / xradius, (xcenter - (std::max)(float(x), l0)) / xradius);
+ val += integral((std::max)((float(x) - xcenter) / xradius, -xval0), -xval1);
else if (float(x) >= r1)
- val += integral((float(x) - xcenter) / xradius, ((std::min)(float(x + 1), r0) - xcenter) / xradius);
+ val += integral((float(x) - xcenter) / xradius, (std::min)((float(x + 1) - xcenter) / xradius, xval0));
else if (float(x + 1) >= r1)
- val += integral((r1 - xcenter) / xradius, ((std::min)(float(x + 1), r0) - xcenter) / xradius);
+ val += integral(xval1, (std::min)((float(x + 1) - xcenter) / xradius, xval0));
val *= scale;
if (float(x) <= l1)
val -= ((std::min)(float(x + 1), l1) - (std::max)(float(x), l0)) * ycoord0;