Commit: 173291bc6dd83ee65687b4a7bc9e9a7b4d3114c8
Author: Antonis Ryakiotakis
Date:   Mon Jan 24 20:28:05 2022 +0100
Branches: KTX_support
https://developer.blender.org/rB173291bc6dd83ee65687b4a7bc9e9a7b4d3114c8

building and running with ktx now works on windows. Loading/saving most likely 
still broken

===================================================================

M       build_files/cmake/platform/platform_win32.cmake
M       source/blender/imbuf/CMakeLists.txt
M       source/blender/imbuf/intern/ktx.c
M       source/creator/CMakeLists.txt

===================================================================

diff --git a/build_files/cmake/platform/platform_win32.cmake 
b/build_files/cmake/platform/platform_win32.cmake
index 0439e2fa5c2..2a4e16e56d1 100644
--- a/build_files/cmake/platform/platform_win32.cmake
+++ b/build_files/cmake/platform/platform_win32.cmake
@@ -456,6 +456,12 @@ if(WITH_IMAGE_TIFF)
   endif()
 endif()
 
+if(WITH_IMAGE_KTX)
+  set(KTX_INCLUDE ${LIBDIR}/ktx2/include)
+  set(KTX_LIBRARY ${LIBDIR}/ktx2/lib/ktx.lib)
+  set(KTX_LIBRARY_DLL ${LIBDIR}/ktx2/lib/ktx.dll)
+endif()
+
 if(WITH_JACK)
   set(JACK_INCLUDE_DIRS
     ${LIBDIR}/jack/include/jack
diff --git a/source/blender/imbuf/CMakeLists.txt 
b/source/blender/imbuf/CMakeLists.txt
index 564bb4f3e45..a14e91179d6 100644
--- a/source/blender/imbuf/CMakeLists.txt
+++ b/source/blender/imbuf/CMakeLists.txt
@@ -193,9 +193,6 @@ if(WITH_IMAGE_KTX)
        list(APPEND INC
                ${KTX_INCLUDE}
        )
-       list(APPEND INC_SYS
-               ${GLEW_INCLUDE_PATH}
-       )
        list(APPEND SRC
                intern/ktx.c
        )
diff --git a/source/blender/imbuf/intern/ktx.c 
b/source/blender/imbuf/intern/ktx.c
index efac0fe666b..05e539ed992 100644
--- a/source/blender/imbuf/intern/ktx.c
+++ b/source/blender/imbuf/intern/ktx.c
@@ -29,9 +29,6 @@
  *  \ingroup imbuf
  */
 
-#define KTX_OPENGL 1
-#define KTX_USE_GETPROC 1
-
 #include "ktx.h"
 
 #include "IMB_imbuf.h"
@@ -45,131 +42,115 @@
 #include <string.h>
 #include <stdlib.h>
 
-#include "GL/glew.h"
-
 static char KTX_HEAD[] = {0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 
0x0D, 0x0A, 0x1A, 0x0A};
 
 
 bool check_ktx(const unsigned char *mem, size_t size)
 {
-  return memcmp(KTX_HEAD, mem, sizeof(KTX_HEAD)) ? 0 : 1;
+  return memcmp(KTX_HEAD, mem, sizeof(KTX_HEAD)) == 0;
 }
 
 struct ImBuf *imb_loadktx(const unsigned char *mem, size_t size, int flags, 
char * UNUSED(colorspace))
 {
-       GLuint texture = 0;
-       GLenum target;
-       GLenum glerror;
-       GLboolean isMipmapped;
-       KTX_error_code ktxerror;
-       unsigned int numKeys;
-       unsigned char *keys;
-
-       /* thumbnails are run from a thread so opengl generation below will 
fail */
-       if (flags & IB_thumbnail) {
-               return NULL;
-       }
-
-       ktxerror = ktxLoadTextureM(mem, size, &texture, &target, NULL, 
&isMipmapped, &glerror, &numKeys, &keys);
-
-       if (ktxerror == KTX_SUCCESS) {
-               ImBuf *ibuf;
-               int xsize, ysize;
-               int internal_format;
-               bool flipx = false, flipy = false;
-               glEnable(target);
-
-               if (isMipmapped)
-                       /* Enable bilinear mipmapping */
-                       glTexParameteri(target, GL_TEXTURE_MIN_FILTER, 
GL_LINEAR_MIPMAP_NEAREST);
-               else
-                       glTexParameteri(target, GL_TEXTURE_MIN_FILTER, 
GL_LINEAR);
-               glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, 
&xsize);
-               glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, 
&ysize);
-
-               ibuf = IMB_allocImBuf(xsize, ysize, 32, (int)IB_rect);
-
-               glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, 
ibuf->rect);
-               glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, 
GL_TEXTURE_COMPRESSED, &internal_format);
-
-               glDeleteTextures(1, &texture);
-
-               if (internal_format) {
-                       flipx = flipy = true;
-               }
-               else {
-                       if (keys) {
-                               KTX_hash_table table;
-                               ktxerror = ktxHashTable_Deserialize(numKeys, 
keys, &table);
-                               if (ktxerror == KTX_SUCCESS) {
-                                       unsigned int valLength;
-                                       unsigned char *value;
-                                       ktxerror = 
ktxHashTable_FindValue(table, KTX_ORIENTATION_KEY, &valLength, (void **)&value);
-
-                                       if (ktxerror == KTX_SUCCESS) {
-                                               if (value[6] == 'd')
-                                                       flipy = true;
-                                       }
-                               }
-                       }
-               }
-
-               if (flipx && flipy) {
-                       int i;
-                       size_t imbuf_size = ibuf->x * ibuf->y;
-
-                       for (i = 0; i < imbuf_size / 2; i++) {
-                               SWAP(unsigned int, ibuf->rect[i], 
ibuf->rect[imbuf_size - i -1]);
-                       }
-               }
-               else if (flipy) {
-                       size_t i, j;
-                       for (j = 0; j < ibuf->y / 2; j++) {
-                               for (i = 0; i < ibuf->x; i++) {
-                                       SWAP(unsigned int, ibuf->rect[i + j * 
ibuf->x], ibuf->rect[i + (ibuf->y - j - 1) * ibuf->x]);
-                               }
-                       }
-               }
-
-               if (keys)
-                       free(keys);
-
-               return ibuf;
-       }
-
-       if (keys)
-               free(keys);
-
-       return NULL;
+  ktxTexture *tex;
+  KTX_error_code ktxerror = ktxTexture_CreateFromMemory(mem, size, 0, &tex);
+
+  if (ktxerror != KTX_SUCCESS) {
+    return NULL;
+  }
+
+  ktx_size_t offset;
+  ktxerror = ktxTexture_GetImageOffset(tex, 0, 0, 0, &offset);
+
+  if (ktxerror != KTX_SUCCESS) {
+    ktxTexture_Destroy(tex);
+    return NULL;
+  }
+
+  ktx_uint8_t *image = ktxTexture_GetData(tex) + offset;
+
+  ktx_uint32_t xsize = tex->baseWidth;
+  ktx_uint32_t ysize = tex->baseHeight;
+
+  ImBuf *ibuf = IMB_allocImBuf(xsize, ysize, 32, (int)IB_rect);
+
+  bool flipx = false, flipy = false;
+
+  for (ktx_uint32_t i = 0; i < xsize + ysize; ++i)
+    ibuf->rect[i] = image[i];
+
+  char *pValue;
+  uint32_t valueLen;
+  ktxerror = ktxHashList_FindValue(&tex->kvDataHead, KTX_ORIENTATION_KEY, 
&valueLen, (void **)&pValue);
+  if (ktxerror != KTX_SUCCESS) {
+    char cx, cy;
+    if (sscanf(pValue, KTX_ORIENTATION2_FMT, &cx, &cy) == 2) {
+      flipx = (cx == 'd');
+      flipy = (cy == 'd');
+    }
+  }
+
+  if (flipx && flipy) {
+    int i;
+    size_t imbuf_size = ibuf->x * ibuf->y;
+
+    for (i = 0; i < imbuf_size / 2; i++) {
+      SWAP(unsigned int, ibuf->rect[i], ibuf->rect[imbuf_size - i - 1]);
+    }
+  }
+  else if (flipy) {
+    size_t i, j;
+    for (j = 0; j < ibuf->y / 2; j++) {
+      for (i = 0; i < ibuf->x; i++) {
+        SWAP(unsigned int,
+             ibuf->rect[i + j * ibuf->x],
+             ibuf->rect[i + (ibuf->y - j - 1) * ibuf->x]);
+      }
+    }
+  }
+
+  ktxTexture_Destroy(tex);
+
+  return ibuf;
 }
 
 
 bool imb_savektx(struct ImBuf *ibuf, const char *name, int UNUSED(flags))
 {
-       KTX_texture_info tinfo;
-       KTX_image_info info;
-       KTX_error_code ktxerror;
-
-       tinfo.glType = GL_UNSIGNED_BYTE;
-       /* compression type, expose as option later */
-       tinfo.glTypeSize = 1;
-       tinfo.glFormat = GL_RGBA;
-       tinfo.glInternalFormat = GL_RGBA;
-       tinfo.glBaseInternalFormat = GL_RGBA;
-       tinfo.pixelWidth = ibuf->x;
-       tinfo.pixelHeight = ibuf->y;
-       tinfo.pixelDepth = 0;
-       tinfo.numberOfArrayElements = 0;
-       tinfo.numberOfFaces = 1;
-       tinfo.numberOfMipmapLevels = 1;
-
-       info.data = (GLubyte *) ibuf->rect;
-       info.size = ((size_t)ibuf->x) * ibuf->y * 4 * sizeof(char);
-
-       ktxerror = ktxWriteKTXN(name, &tinfo, 0, NULL, 1, &info);
-
-       if (KTX_SUCCESS == ktxerror) {
-               return 1;
-       }
-       else return 0;
+  ktxTextureCreateInfo createInfo;
+  createInfo.glInternalformat = 0x8058; // GL_RGBA8
+  createInfo.baseWidth = ibuf->x;
+  createInfo.baseHeight = ibuf->y;
+  createInfo.baseDepth = 0;
+  createInfo.numDimensions = 2;
+  // Note: it is not necessary to provide a full mipmap pyramid.
+  createInfo.numLevels = 1;
+  createInfo.numLayers = 1;
+  createInfo.numFaces = 1;
+  createInfo.isArray = KTX_FALSE;
+  createInfo.generateMipmaps = KTX_FALSE;
+  KTX_error_code result;
+  ktxTexture2 *tex;
+  result = ktxTexture2_Create(&createInfo, KTX_TEXTURE_CREATE_ALLOC_STORAGE, 
&tex);
+  if (KTX_SUCCESS != result) {
+    return false;
+  }
+
+  ktxTexture *texture = ktxTexture(tex);
+
+  ktx_uint32_t level, layer, faceSlice;
+  level = 0;
+  layer = 0;
+  faceSlice = 0;
+  result = ktxTexture_SetImageFromMemory(
+      texture, level, layer, faceSlice, (ktx_uint8_t*)ibuf->rect, 
(size_t)ibuf->x * (size_t)ibuf->y * (size_t) 4);
+
+  if (KTX_SUCCESS != result) {
+    ktxTexture_Destroy(texture);
+    return false;
+  }
+  result = ktxTexture_WriteToNamedFile(texture, name);
+  ktxTexture_Destroy(texture);
+
+  return KTX_SUCCESS == result;
 }
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index 0609b8fd792..8425c872d28 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -730,6 +730,14 @@ elseif(WIN32)
     )
   endif()
 
+  if(WITH_IMAGE_KTX AND WIN32)
+    install(
+          FILES ${KTX_LIBRARY_DLL}
+          DESTINATION "."
+    )
+  endif()
+
+
   if(WITH_FFTW3)
     install(
           FILES ${LIBDIR}/fftw3/lib/libfftw3-3.dll

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to