From 0a9e8b293df9f689ff2aeaa99927f6cb59c31e07 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Mon, 27 Jan 2020 02:48:37 +0100 Subject: [PATCH] c64 screen aspect ratio correction --- src/main/kotlin/razorvine/c64emu/GUI.kt | 3 ++- src/main/kotlin/razorvine/c64emu/Screen.kt | 14 ++++++------- .../kotlin/razorvine/examplemachines/GUI.kt | 20 +++++++++---------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/razorvine/c64emu/GUI.kt b/src/main/kotlin/razorvine/c64emu/GUI.kt index 7c88649..70861c5 100644 --- a/src/main/kotlin/razorvine/c64emu/GUI.kt +++ b/src/main/kotlin/razorvine/c64emu/GUI.kt @@ -21,7 +21,8 @@ object ScreenDefs { const val SCREEN_HEIGHT_CHARS = 25 const val SCREEN_WIDTH = SCREEN_WIDTH_CHARS*8 const val SCREEN_HEIGHT = SCREEN_HEIGHT_CHARS*8 - const val DISPLAY_PIXEL_SCALING: Double = 3.0 + const val PIXEL_SCALING = 3.0 + const val ASPECT_RATIO = 1.06 // c64 PAL pixels are slightly taller than wide const val BORDER_SIZE = 24 class Palette { diff --git a/src/main/kotlin/razorvine/c64emu/Screen.kt b/src/main/kotlin/razorvine/c64emu/Screen.kt index 9317847..7cc107b 100644 --- a/src/main/kotlin/razorvine/c64emu/Screen.kt +++ b/src/main/kotlin/razorvine/c64emu/Screen.kt @@ -28,8 +28,8 @@ internal class Screen(private val chargenData: ByteArray, val ram: MemoryCompone ScreenDefs.SCREEN_HEIGHT+2*ScreenDefs.BORDER_SIZE, Transparency.OPAQUE) fullscreenG2d = fullscreenImage.graphics as Graphics2D - val size = Dimension(fullscreenImage.width*ScreenDefs.DISPLAY_PIXEL_SCALING.toInt(), - fullscreenImage.height*ScreenDefs.DISPLAY_PIXEL_SCALING.toInt()) + val size = Dimension(fullscreenImage.width*ScreenDefs.PIXEL_SCALING.toInt(), + (fullscreenImage.height*ScreenDefs.ASPECT_RATIO*ScreenDefs.PIXEL_SCALING).toInt()) minimumSize = size maximumSize = size preferredSize = size @@ -84,13 +84,13 @@ internal class Screen(private val chargenData: ByteArray, val ram: MemoryCompone // scale and draw the image to the window, and simulate a slight scanline effect windowG2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR) - windowG2d.drawImage(fullscreenImage, 0, 0, (fullscreenImage.width*ScreenDefs.DISPLAY_PIXEL_SCALING).toInt(), - (fullscreenImage.height*ScreenDefs.DISPLAY_PIXEL_SCALING).toInt(), null) + windowG2d.drawImage(fullscreenImage, 0, 0, (fullscreenImage.width*ScreenDefs.PIXEL_SCALING).toInt(), + (fullscreenImage.height*ScreenDefs.ASPECT_RATIO*ScreenDefs.PIXEL_SCALING).toInt(), null) windowG2d.color = Color(0, 0, 0, 40) windowG2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR) - val width = fullscreenImage.width*ScreenDefs.DISPLAY_PIXEL_SCALING.toInt() - val height = fullscreenImage.height*ScreenDefs.DISPLAY_PIXEL_SCALING.toInt() - for (y in 0 until height step ScreenDefs.DISPLAY_PIXEL_SCALING.toInt()) { + val width = fullscreenImage.width*ScreenDefs.PIXEL_SCALING.toInt() + val height = (fullscreenImage.height*ScreenDefs.ASPECT_RATIO*ScreenDefs.PIXEL_SCALING).toInt() + for (y in 0 until height step (ScreenDefs.ASPECT_RATIO*ScreenDefs.PIXEL_SCALING).toInt()) { windowG2d.drawLine(0, y, width, y) } Toolkit.getDefaultToolkit().sync() diff --git a/src/main/kotlin/razorvine/examplemachines/GUI.kt b/src/main/kotlin/razorvine/examplemachines/GUI.kt index 017a21d..f845107 100644 --- a/src/main/kotlin/razorvine/examplemachines/GUI.kt +++ b/src/main/kotlin/razorvine/examplemachines/GUI.kt @@ -19,7 +19,7 @@ object ScreenDefs { const val SCREEN_HEIGHT_CHARS = 30 const val SCREEN_WIDTH = SCREEN_WIDTH_CHARS*8 const val SCREEN_HEIGHT = SCREEN_HEIGHT_CHARS*16 - const val DISPLAY_PIXEL_SCALING: Double = 1.5 + const val PIXEL_SCALING = 1.5 const val BORDER_SIZE = 32 val BG_COLOR = Color(0, 10, 20) @@ -68,8 +68,8 @@ private class BitmapScreenPanel : JPanel() { image = gd.createCompatibleImage(ScreenDefs.SCREEN_WIDTH, ScreenDefs.SCREEN_HEIGHT, Transparency.OPAQUE) g2d = image.graphics as Graphics2D - val size = Dimension((image.width*ScreenDefs.DISPLAY_PIXEL_SCALING).toInt(), - (image.height*ScreenDefs.DISPLAY_PIXEL_SCALING).toInt()) + val size = Dimension((image.width*ScreenDefs.PIXEL_SCALING).toInt(), + (image.height*ScreenDefs.PIXEL_SCALING).toInt()) minimumSize = size maximumSize = size preferredSize = size @@ -82,13 +82,13 @@ private class BitmapScreenPanel : JPanel() { override fun paint(graphics: Graphics) { val g2d = graphics as Graphics2D g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR) - g2d.drawImage(image, 0, 0, (image.width*ScreenDefs.DISPLAY_PIXEL_SCALING).toInt(), - (image.height*ScreenDefs.DISPLAY_PIXEL_SCALING).toInt(), null) + g2d.drawImage(image, 0, 0, (image.width*ScreenDefs.PIXEL_SCALING).toInt(), + (image.height*ScreenDefs.PIXEL_SCALING).toInt(), null) if (cursorState) { - val scx = (cursorX*ScreenDefs.DISPLAY_PIXEL_SCALING*8).toInt() - val scy = (cursorY*ScreenDefs.DISPLAY_PIXEL_SCALING*16).toInt() - val scw = (8*ScreenDefs.DISPLAY_PIXEL_SCALING).toInt() - val sch = (16*ScreenDefs.DISPLAY_PIXEL_SCALING).toInt() + val scx = (cursorX*ScreenDefs.PIXEL_SCALING*8).toInt() + val scy = (cursorY*ScreenDefs.PIXEL_SCALING*16).toInt() + val scw = (8*ScreenDefs.PIXEL_SCALING).toInt() + val sch = (16*ScreenDefs.PIXEL_SCALING).toInt() g2d.setXORMode(Color.CYAN) g2d.fillRect(scx, scy, scw, sch) g2d.setPaintMode() @@ -123,7 +123,7 @@ private class BitmapScreenPanel : JPanel() { fun mousePixelPosition(): Point? { val pos = mousePosition ?: return null - return Point((pos.x/ScreenDefs.DISPLAY_PIXEL_SCALING).toInt(), (pos.y/ScreenDefs.DISPLAY_PIXEL_SCALING).toInt()) + return Point((pos.x/ScreenDefs.PIXEL_SCALING).toInt(), (pos.y/ScreenDefs.PIXEL_SCALING).toInt()) } fun cursorPos(x: Int, y: Int) {