changeset 18961:9f1bbc70c773

Support for 16 bit ppms
author reimar
date Sat, 08 Jul 2006 19:23:26 +0000
parents 3aaed991e8cd
children 9beb5426b3ca
files libvo/gl_common.c libvo/gl_common.h
diffstat 2 files changed, 36 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/gl_common.c	Sat Jul 08 19:22:36 2006 +0000
+++ b/libvo/gl_common.c	Sat Jul 08 19:23:26 2006 +0000
@@ -67,6 +67,8 @@
 
 //! \defgroup glconversion OpenGL conversion helper functions
 
+static GLint hqtexfmt;
+
 /**
  * \brief adjusts the GL_UNPACK_ALIGNMENT to fit the stride.
  * \param stride number of bytes per line for which alignment should fit.
@@ -314,6 +316,12 @@
     }
     *(dsc->funcptr) = ptr;
   }
+  if (strstr(allexts, "_texture_float"))
+    hqtexfmt = GL_RGB32F;
+  else if (strstr(allexts, "NV_float_buffer"))
+    hqtexfmt = GL_FLOAT_RGB32_NV;
+  else
+    hqtexfmt = GL_RGB16;
   free(allexts);
 }
 
@@ -370,7 +378,7 @@
 /**
  * \brief creates a texture from a PPM file
  * \param target texture taget, usually GL_TEXTURE_2D
- * \param fmt internal texture format
+ * \param fmt internal texture format, 0 for default
  * \param filter filter used for scaling, e.g. GL_LINEAR
  * \param f file to read PPM from
  * \param width [out] width of texture
@@ -381,7 +389,7 @@
  */
 int glCreatePPMTex(GLenum target, GLenum fmt, GLint filter,
                    FILE *f, int *width, int *height, int *maxval) {
-  unsigned w, h, m, val;
+  unsigned w, h, m, val, bpp;
   char *data;
   ppm_skip(f);
   if (fgetc(f) != 'P' || fgetc(f) != '6')
@@ -400,11 +408,18 @@
     return 0;
   if (w > MAXDIM || h > MAXDIM)
     return 0;
-  data = malloc(w * h * 3);
-  if (fread(data, w * 3, h, f) != h)
+  bpp = (m > 255) ? 6 : 3;
+  data = malloc(w * h * bpp);
+  if (fread(data, w * bpp, h, f) != h)
     return 0;
+  if (!fmt) {
+    fmt = (m > 255) ? hqtexfmt : 3;
+    if (fmt == GL_FLOAT_RGB32_NV && target != GL_TEXTURE_RECTANGLE)
+      fmt = GL_RGB16;
+  }
   glCreateClearTex(target, fmt, filter, w, h, 0);
-  glUploadTex(target, GL_RGB, GL_UNSIGNED_BYTE, data, w * 3, 0, 0, w, h, 0);
+  glUploadTex(target, GL_RGB, (m > 255) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE,
+              data, w * bpp, 0, 0, w, h, 0);
   free(data);
   if (width) *width = w;
   if (height) *height = h;
@@ -422,6 +437,7 @@
  * Does not handle all possible variants, just those used by MPlayer
  */
 int glFmt2bpp(GLenum format, GLenum type) {
+  int component_size = 0;
   switch (type) {
     case GL_UNSIGNED_BYTE_3_3_2:
     case GL_UNSIGNED_BYTE_2_3_3_REV:
@@ -431,19 +447,23 @@
     case GL_UNSIGNED_SHORT_5_6_5:
     case GL_UNSIGNED_SHORT_5_6_5_REV:
       return 2;
+    case GL_UNSIGNED_BYTE:
+      component_size = 1;
+      break;
+    case GL_UNSIGNED_SHORT:
+      component_size = 2;
+      break;
   }
-  if (type != GL_UNSIGNED_BYTE)
-    return 0; //not implemented
   switch (format) {
     case GL_LUMINANCE:
     case GL_ALPHA:
-      return 1;
+      return component_size;
     case GL_RGB:
     case GL_BGR:
-      return 3;
+      return 3 * component_size;
     case GL_RGBA:
     case GL_BGRA:
-      return 4;
+      return 4 * component_size;
   }
   return 0; // unknown
 }
--- a/libvo/gl_common.h	Sat Jul 08 19:22:36 2006 +0000
+++ b/libvo/gl_common.h	Sat Jul 08 19:23:26 2006 +0000
@@ -180,6 +180,12 @@
 #ifndef GL_UNSIGNED_SHORT_1_5_5_5_REV
 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
 #endif
+#ifndef GL_RGB32F
+#define GL_RGB32F 0x8815
+#endif
+#ifndef GL_FLOAT_RGB32_NV
+#define GL_FLOAT_RGB32_NV 0x8889
+#endif
 #ifndef GL_FRAGMENT_PROGRAM
 #define GL_FRAGMENT_PROGRAM 0x8804
 #endif