]> Shamusworld >> Repos - virtualjaguar/blobdiff - src/gui/glwidget.cpp
Stretched the virtual screen slightly.
[virtualjaguar] / src / gui / glwidget.cpp
index 9788bc3b4f65e53cc6cd5fb039e01f3ee827b59d..56fcd0ed824de8490a95cf8e3440b935310dbe8a 100644 (file)
@@ -1,10 +1,10 @@
 // OpenGL implementation in Qt
 // Parts of this are blantantly ripped off from BSNES (thanks Byuu!)
 //
-// by James L. Hammons
+// by James Hammons
 // (C) 2010 Underground Software
 //
-// JLH = James L. Hammons <jlhamm@acm.org>
+// JLH = James Hammons <jlhamm@acm.org>
 //
 // Who  When        What
 // ---  ----------  -------------------------------------------------------------
 
 #include "glwidget.h"
 
+#include "jaguar.h"
 #include "settings.h"
 #include "tom.h"
-#include "video.h"
+
+#ifdef __GCCWIN32__
+// Apparently on win32, various OpenGL constants aren't pulled in.
+#include <GL/glext.h>
+#endif
 
 GLWidget::GLWidget(QWidget * parent/*= 0*/): QGLWidget(parent), texture(0),
-       textureWidth(0), textureHeight(0), buffer(0), rasterWidth(320), rasterHeight(240)
+       textureWidth(0), textureHeight(0), buffer(0), rasterWidth(340), rasterHeight(240)
 {
-//     tomDeviceWidth = rasterWidth;
-       tomDeviceWidth = 1024;  // It has to be the texture width...
-
-       // Set up the backbuffer
-       // To be safe, this should be 1280 * 625 * 2...
-       backbuffer = (uint32_t *)malloc(1280 * 625 * sizeof(uint32_t));
-//     memset(backbuffer, 0x44, rasterWidth *
-       memset(backbuffer, 0xFF, 1024 *
-               (vjs.hardwareTypeNTSC ? rasterHeight : VIRTUAL_SCREEN_HEIGHT_PAL)
-               * sizeof(uint32_t));
+       // Screen pitch has to be the texture width (in 32-bit pixels)...
+       JaguarSetScreenPitch(1024);
 }
 
 GLWidget::~GLWidget()
 {
-       delete[] backbuffer;
+//     free(backbuffer);
 }
 
 void GLWidget::initializeGL()
@@ -55,7 +52,7 @@ void GLWidget::initializeGL()
 void GLWidget::paintGL()
 {
 //kludge
-rasterHeight = (vjs.hardwareTypeNTSC ? 240 : 256);
+rasterHeight = (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL);
 
        unsigned outputWidth  = width();
        unsigned outputHeight = height();
@@ -71,9 +68,12 @@ rasterHeight = (vjs.hardwareTypeNTSC ? 240 : 256);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (vjs.glFilter ? GL_LINEAR : GL_NEAREST));
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (vjs.glFilter ? GL_LINEAR : GL_NEAREST));
 //     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, rasterWidth, rasterHeight, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buffer);
-       glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, rasterWidth, rasterHeight, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, buffer);
+//more kludge
+       glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TOMGetVideoModeWidth(), rasterHeight, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, buffer);
+//     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, rasterWidth, rasterHeight, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, buffer);
 
-       double w = (double)rasterWidth  / (double)textureWidth;
+       double w = (double)TOMGetVideoModeWidth()  / (double)textureWidth;
+//     double w = (double)rasterWidth  / (double)textureWidth;
        double h = (double)rasterHeight / (double)textureHeight;
        unsigned u = outputWidth;
        unsigned v = outputHeight;
@@ -90,13 +90,9 @@ void GLWidget::resizeGL(int width, int height)
 {
        if (width > textureWidth || height > textureHeight)
        {
-//             textureWidth  = max(width,  textureWidth);
-//             textureHeight = max(height, textureHeight);
-// Seems that power of 2 sizes are still mandatory...
-               textureWidth  = 1024;//(width > textureWidth ? width : textureWidth);
-               textureHeight = 512;//(height > textureHeight ? height : textureHeight);
-//             textureWidth  = (width > textureWidth ? width : textureWidth);
-//             textureHeight = (height > textureHeight ? height : textureHeight);
+               // Seems that power of 2 sizes are still mandatory...
+               textureWidth  = 1024;
+               textureHeight = 512;
 #if 0
 printf("Resizing: new texture width/height = %i x %i\n", textureWidth, textureHeight);
 printf("Resizing: new raster width/height = %i x %i\n", rasterWidth, rasterHeight);
@@ -109,12 +105,15 @@ printf("Resizing: new raster width/height = %i x %i\n", rasterWidth, rasterHeigh
                }
 
                buffer = new uint32_t[textureWidth * textureHeight];
+               JaguarSetScreenBuffer(buffer);
+
+//???
+memset(buffer, 0xFF, textureWidth * textureHeight * sizeof(uint32_t));
                glGenTextures(1, &texture);
                glBindTexture(GL_TEXTURE_2D, texture);
                glPixelStorei(GL_UNPACK_ROW_LENGTH, textureWidth);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-//             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textureWidth, textureHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
                glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL);
        }
 }