diff options
Diffstat (limited to 'src/emu/rendlay.cpp')
-rw-r--r-- | src/emu/rendlay.cpp | 47 |
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; |