From 459b257e56d3ed045941cc9eb3ed747813c5025b Mon Sep 17 00:00:00 2001
From: Turo Lamminen <turotl@gmail.com>
Date: Tue, 28 Apr 2015 10:56:39 +0000
Subject: [PATCH] Edward Rudd's version

---
 mojodds.h |    5 ++
 mojodds.c |   59 +++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 1 deletions(-)

diff --git a/mojodds.c b/mojodds.c
index 7da86f0..9900242 100644
--- a/mojodds.c
+++ b/mojodds.c
@@ -59,6 +59,7 @@
 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
 #define GL_BGR 0x80E0
 #define GL_BGRA 0x80E1
+#define GL_LUMINANCE_ALPHA 0x190A
 
 typedef struct
 {
@@ -222,7 +223,14 @@
 
         calcSizeFlag = DDSD_PITCH;
         calcSize = ((width * header->ddspf.dwRGBBitCount) + 7) / 8;
-    } // else if
+    }
+    else if (header->ddspf.dwFlags & (DDPF_LUMINANCE | DDPF_ALPHA) )
+    {
+        *_glfmt = GL_LUMINANCE_ALPHA;
+
+        calcSizeFlag = DDSD_PITCH;
+        calcSize = ((width * header->ddspf.dwRGBBitCount) + 7) / 8;
+    }
 
     //else if (header->ddspf.dwFlags & DDPF_LUMINANCE)  // !!! FIXME
     //else if (header->ddspf.dwFlags & DDPF_YUV)  // !!! FIXME
@@ -279,5 +287,54 @@
     return 1;
 } // MOJODDS_getTexture
 
+int MOJODDS_getMipMapTexture(unsigned int miplevel, unsigned int glfmt,
+                             const void*_basetex, const unsigned long _basetexlen,
+                             unsigned int w, unsigned h,
+                             const void **_tex, unsigned long *_texlen,
+                             unsigned int *_texw, unsigned int *_texh)
+{
+    int i;
+    const void* newtex;
+    unsigned long newtexlen;
+    unsigned int neww;
+    unsigned int newh;
+
+    newtex = _basetex;
+    newtexlen = _basetexlen;
+    neww = w;
+    newh = h;
+
+    // Calculate size of miplevel
+    for (i=0; i < miplevel; ++i)
+    {
+        // move position to next texture start
+        newtex += newtexlen;
+        // calculate texture size
+        newtexlen >>= 2;
+        neww >>= 1;
+        newh >>= 1;
+        if (neww < 1) neww = 1;
+        if (newh < 1) newh = 1;
+        switch (glfmt) {
+            case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+                if (newtexlen < 8) newtexlen = 8;
+                break;
+            case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+            case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+                if (newtexlen < 16) newtexlen = 16;
+                break;
+        } // switch
+    } // for
+
+    *_tex = newtex;
+    if (_texlen) {
+        *_texlen = newtexlen;
+    }
+    *_texw = neww;
+    *_texh = newh;
+    return 1;
+} // MOJODDS_getMipMapTexture
+
+
 // end of mojodds.c ...
 
diff --git a/mojodds.h b/mojodds.h
index 63c848e..3c6b3e6 100644
--- a/mojodds.h
+++ b/mojodds.h
@@ -11,6 +11,11 @@
                        const void **_tex, unsigned long *_texlen,
                        unsigned int *_glfmt, unsigned int *_w,
                        unsigned int *_h, unsigned int *_miplevels);
+int MOJODDS_getMipMapTexture(unsigned int miplevel, unsigned int glfmt,
+                             const void*_basetex, const unsigned long _basetexlen,
+                             unsigned int w, unsigned h,
+                             const void **_tex, unsigned long *_texlen,
+                             unsigned int *_texw, unsigned int *_texh);
 
 #ifdef __cplusplus
 }

--
Gitblit v1.9.3