Can render a BMP but things are still going wrong
authorSam Moore <matches@ucc.asn.au>
Wed, 16 Apr 2014 18:00:36 +0000 (02:00 +0800)
committerSam Moore <matches@ucc.asn.au>
Wed, 16 Apr 2014 18:00:36 +0000 (02:00 +0800)
If Screen::RenderBMP is called before Screen::ScreenShot, the resulting BMP is blank.

NOTE: Testing colours: If -c 1 0 0 1 is passed, rectangle is rendered RED.
However, if Screen::ScreenShot is called, the rectangle is BLUE.

Something stupid going on with colours?
Tried messing with alpha channel, but things seem to always render regardless of their alpha value.

Should give up and do something actually important.

src/main.cpp
src/main.h
src/screen.cpp
src/view.cpp

index 598de72..12d8d56 100644 (file)
@@ -9,7 +9,8 @@ int main(int argc, char ** argv)
        
        Rect bounds(0,0,1,1);
        Colour c(0,0,0,1);
        
        Rect bounds(0,0,1,1);
        Colour c(0,0,0,1);
-       const char * output_to_bmp = NULL;
+       const char * input_bmp = NULL;
+       const char * output_bmp = NULL;
        const char * input_filename = NULL;
 
        int i = 0;
        const char * input_filename = NULL;
 
        int i = 0;
@@ -25,8 +26,12 @@ int main(int argc, char ** argv)
                        case 'o':
                                mode = OUTPUT_TO_BMP;
                                if (++i >= argc)
                        case 'o':
                                mode = OUTPUT_TO_BMP;
                                if (++i >= argc)
-                                       Fatal("No argument following -o switch");
-                               output_to_bmp = argv[i];
+                                       Fatal("No input argument following -o switch");
+                               input_bmp = argv[i];
+                               if (++i >= argc)
+                                       Fatal("No output argument following -o switch");
+                               output_bmp = argv[i];
+
                                break;
                        case 'c':
                        {
                                break;
                        case 'c':
                        {
@@ -51,7 +56,7 @@ int main(int argc, char ** argv)
        {
                doc.Load(input_filename);
        }
        {
                doc.Load(input_filename);
        }
-       else
+       else 
        {
                doc.Add(RECT_FILLED, Rect(0.2,0.2,0.6,0.6));
        }
        {
                doc.Add(RECT_FILLED, Rect(0.2,0.2,0.6,0.6));
        }
@@ -59,6 +64,6 @@ int main(int argc, char ** argv)
        if (mode == LOOP)
                MainLoop(doc, bounds, c);
        else if (mode == OUTPUT_TO_BMP)
        if (mode == LOOP)
                MainLoop(doc, bounds, c);
        else if (mode == OUTPUT_TO_BMP)
-               OverlayBMP(doc, output_to_bmp, bounds, c);
+               OverlayBMP(doc, input_bmp, output_bmp, bounds, c);
        return 0;
 }
        return 0;
 }
index afcffe8..6763042 100644 (file)
@@ -9,16 +9,15 @@
 using namespace std;
 using namespace IPDF;
 
 using namespace std;
 using namespace IPDF;
 
-inline void OverlayBMP(Document & doc, const char * filename, const Rect & bounds = Rect(0,0,1,1), const Colour & c = Colour(0.f,0.f,0.f,1.f))
+inline void OverlayBMP(Document & doc, const char * input, const char * output, const Rect & bounds = Rect(0,0,1,1), const Colour & c = Colour(0.f,0.f,0.f,1.f))
 {
        View view(doc, bounds, c);
        Screen scr;
        //view.Render();
 {
        View view(doc, bounds, c);
        Screen scr;
        //view.Render();
-       scr.RenderBMP(filename);
+       scr.RenderBMP(input);
        scr.Present();
        scr.Present();
-       //MainLoop(doc, bounds, c);
-       sleep(3);
-       scr.ScreenShot(filename);
+       sleep(5);
+       scr.ScreenShot(output);
 }
 
 inline void MainLoop(Document & doc, const Rect & bounds = Rect(0,0,1,1), const Colour & c = Colour(0.f,0.f,0.f,1.f))
 }
 
 inline void MainLoop(Document & doc, const Rect & bounds = Rect(0,0,1,1), const Colour & c = Colour(0.f,0.f,0.f,1.f))
index 624e55d..712bd26 100644 (file)
@@ -18,6 +18,10 @@ Screen::Screen()
        }
 
        m_gl_context = SDL_GL_CreateContext(m_window);
        }
 
        m_gl_context = SDL_GL_CreateContext(m_window);
+
+       glClearColor(1.f,1.f,1.f,1.f);
+       glClear(GL_COLOR_BUFFER_BIT);
+       Present();
        
        ResizeViewport(800, 600);
 
        
        ResizeViewport(800, 600);
 
@@ -135,6 +139,9 @@ void Screen::ScreenShot(const char * filename) const
        if (surf == NULL)
                Fatal("Failed to create SDL_Surface from pixel data - %s", SDL_GetError());
 
        if (surf == NULL)
                Fatal("Failed to create SDL_Surface from pixel data - %s", SDL_GetError());
 
+       GLenum texture_format = (surf->format->Rmask == 0x000000FF) ? GL_RGBA : GL_BGRA;
+       Debug("SDL_Surface %d BytesPerPixel, format %d (RGB = %d, BGR = %d, RGBA = %d, BGRA = %d)", surf->format->BytesPerPixel, texture_format, GL_RGB, GL_BGR, GL_RGBA, GL_BGRA);
+
        if (SDL_SaveBMP(surf, filename) != 0)
                Fatal("SDL_SaveBMP failed - %s", SDL_GetError());
        
        if (SDL_SaveBMP(surf, filename) != 0)
                Fatal("SDL_SaveBMP failed - %s", SDL_GetError());
        
@@ -169,28 +176,35 @@ void Screen::RenderBMP(const char * filename) const
                        Fatal("Could not understand SDL_Surface format (%d colours)", bmp->format->BytesPerPixel);
                        break;  
        }
                        Fatal("Could not understand SDL_Surface format (%d colours)", bmp->format->BytesPerPixel);
                        break;  
        }
-       Debug("SDL_Surface %d BytesPerPixel, format %d (RGB = %d, BGR = %d, RGBA = %d, BGRA = %d)", bmp->format->BytesPerPixel, texture_format, GL_RGB, GL_BGR, GL_RGBA, GL_BGRA);
 
 
+       //Debug("SDL_Surface %d BytesPerPixel, format %d (RGB = %d, BGR = %d, RGBA = %d, BGRA = %d)", bmp->format->BytesPerPixel, texture_format, GL_RGB, GL_BGR, GL_RGBA, GL_BGRA);
 
 
-       GLuint texID;
 
 
+       GLuint texID;
+       glEnable(GL_TEXTURE_2D);
        glGenTextures(1, &texID);
        glBindTexture(GL_TEXTURE_2D, texID);
        glGenTextures(1, &texID);
        glBindTexture(GL_TEXTURE_2D, texID);
+
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
        glTexImage2D(GL_TEXTURE_2D, 0, bmp->format->BytesPerPixel, w, h, 0, texture_format, GL_UNSIGNED_BYTE, bmp->pixels);
        glTexImage2D(GL_TEXTURE_2D, 0, bmp->format->BytesPerPixel, w, h, 0, texture_format, GL_UNSIGNED_BYTE, bmp->pixels);
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 
 
-       glEnable(GL_TEXTURE_2D);
-       glBindTexture(GL_TEXTURE_2D, texID);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       glOrtho(0.0, 1.0, 1.0, 0.0, -1.f, 1.f);
+       glMatrixMode(GL_MODELVIEW);
+       glLoadIdentity();
 
        glBegin(GL_QUADS);
 
        glBegin(GL_QUADS);
-               glTexCoord2i(0,0); glVertex2f(-0.5f*w, -0.5f*h);
-               glTexCoord2i(1,0); glVertex2f(0.5f*w, -0.5f*h);
-               glTexCoord2i(1,1); glVertex2f(0.5f*w, 0.5f*h);
-               glTexCoord2i(0,1); glVertex2f(-0.5*w,0.5*h);
+               glTexCoord2i(0,0); glVertex2f(0,0);
+               glTexCoord2i(1,0); glVertex2f(1,0);
+               glTexCoord2i(1,1); glVertex2f(1,1);
+               glTexCoord2i(0,1); glVertex2f(0,1);
        glEnd();
 
        glDisable(GL_TEXTURE_2D);
        glEnd();
 
        glDisable(GL_TEXTURE_2D);
-
-       //SDL_FreeSurface(bmp); 
+       SDL_FreeSurface(bmp);   
 }
 }
index cd4cc35..b8b8ab6 100644 (file)
@@ -72,7 +72,7 @@ void View::Render()
        glClearColor(1.f,1.f,1.f,1.f);
        glClear(GL_COLOR_BUFFER_BIT);
 
        glClearColor(1.f,1.f,1.f,1.f);
        glClear(GL_COLOR_BUFFER_BIT);
 
-       DrawGrid(); // Draw the gridlines
+       //DrawGrid(); // Draw the gridlines
 
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
 
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();

UCC git Repository :: git.ucc.asn.au