Эх сурвалжийг харах

(fix): fix some issues when bliting the surface

Douglas A 3 жил өмнө
parent
commit
77690bd146
1 өөрчлөгдсөн 27 нэмэгдсэн , 15 устгасан
  1. 27 15
      src/main.cpp

+ 27 - 15
src/main.cpp

@@ -1,6 +1,10 @@
 #include <stdio.h>
 #include <GLFW/glfw3.h>
 
+
+
+bool load_frame(const char* filename, int* width, int* height, unsigned char** data);
+
 int main (int argc, char** argv)
 {
     GLFWwindow* window;
@@ -18,43 +22,51 @@ int main (int argc, char** argv)
     
     glfwMakeContextCurrent(window);
 
-    
-    unsigned char* data = new unsigned char [100 * 100 * 3];
-    for (int y=0; y < 100; y++) {
-        for (int x = 0; x < 100; x++) {
-            data[y * 100 * 3 + x * 3] = 0xff;
-            data[y * 100 * 3 + x * 3 + 1] = 0x00;
-            data[y * 100 * 3 + x * 3 + 2] = 0x00;
-        }
+
+    int frame_w, frame_h;
+    unsigned char* frame_data;
+    if (!load_frame("/home/cmte/output.mkv", &frame_w, &frame_h, &frame_data)) {
+        fprintf(stderr, "could not load video frame.\n");
+        return 1;
     }
 
+    printf("Got frame size: %d x %d\n", frame_w, frame_h);
+
     GLuint texture_handle;
     glGenTextures(1, &texture_handle);
     glBindTexture(GL_TEXTURE_2D, texture_handle);
-    glTexImage2D(texture_handle, 0, GL_RGB, 100, 100, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, frame_w, frame_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, frame_data);
 
     
     while (!glfwWindowShouldClose(window)) {
 
         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-        glDrawPixels(100, 100, GL_RGB, GL_UNSIGNED_BYTE, data);
+
 
         int window_width, window_height;
         glfwGetFramebufferSize(window, &window_width, &window_height);
         glMatrixMode(GL_PROJECTION);
-
         glLoadIdentity();
         glOrtho(0, window_width, 0, window_height, -1, 1);
 
         glMatrixMode(GL_MODELVIEW);
+        
+        glBindTexture(GL_TEXTURE_2D, texture_handle);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, frame_w, frame_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, frame_data);
 
         glEnable(GL_TEXTURE_2D);
         glBindTexture(GL_TEXTURE_2D, texture_handle);
         glBegin(GL_QUADS);
-            glTexCoord2d(0,0);glTexCoord2d(0,0);
-            glTexCoord2d(1,0);glTexCoord2d(100,0);
-            glTexCoord2d(1,1);glTexCoord2d(100,100);
-            glTexCoord2d(0,1);glTexCoord2d(0,100);
+            glTexCoord2d(0,0); glVertex2i(200, 200);
+            glTexCoord2d(1,0); glVertex2i(200 + frame_w, 200);
+            glTexCoord2d(1,1); glVertex2i(200 + frame_w, 200 + frame_h);
+            glTexCoord2d(0,1); glVertex2i(200, 200 + frame_h);
         glEnd();
         glDisable(GL_TEXTURE_2D);