From b007c2695ead1e484cf327765c47d8346f632447 Mon Sep 17 00:00:00 2001
From: scuri <scuri>
Date: Mon, 25 Oct 2010 18:29:06 +0000
Subject: *** empty log message ***

---
 src/im.def               |   1 +
 src/im_convertbitmap.cpp | 146 ++++++++++++++++++++++++++++++++---------------
 src/lua5/imlua_image.c   |  17 +++++-
 src/lua5/imlua_palette.c |  12 ++--
 src/lua5/imlua_util.c    |   8 +--
 5 files changed, 127 insertions(+), 57 deletions(-)

(limited to 'src')

diff --git a/src/im.def b/src/im.def
index 9c448d5..1bbe79d 100644
--- a/src/im.def
+++ b/src/im.def
@@ -101,6 +101,7 @@ EXPORTS
   imImageLineSize
   imImageIsBitmap
   imImageGetOpenGLData
+  imImageCreateFromOpenGLData
   imImageMatch
   imImageMatchColor
   imImageMatchColorSpace
diff --git a/src/im_convertbitmap.cpp b/src/im_convertbitmap.cpp
index a4f6b70..629dcf5 100644
--- a/src/im_convertbitmap.cpp
+++ b/src/im_convertbitmap.cpp
@@ -2,7 +2,7 @@
  * \brief Image Conversion
  *
  * See Copyright Notice in im_lib.h
- * $Id: im_convertbitmap.cpp,v 1.3 2009/08/18 02:23:33 scuri Exp $
+ * $Id: im_convertbitmap.cpp,v 1.4 2010/10/25 18:29:07 scuri Exp $
  */
 
 #include "im.h"
@@ -66,7 +66,7 @@ int imConvertToBitmap(const imImage* src_image, imImage* dst_image, int cpx2real
 
 
 template <class T>
-void iDoChangePacking(const T* src_data, T* dst_data, int width, int height, int depth, 
+void iDoChangePacking(const T* src_data, T* dst_data, int width, int height, int src_depth, int dst_depth,
                              int src_is_packed)
 {
   int count = width*height;
@@ -74,11 +74,12 @@ void iDoChangePacking(const T* src_data, T* dst_data, int width, int height, int
   {
     for (int i = 0; i < count; i++)
     {
-      for (int d = 0; d < depth; d++)
+      for (int d = 0; d < dst_depth; d++)
       {
-        *(dst_data + d*count) = *src_data++;
+        *(dst_data + d*count) = *(src_data + d);
       }
 
+      src_data += src_depth;
       dst_data++;
     }
   }
@@ -86,58 +87,59 @@ void iDoChangePacking(const T* src_data, T* dst_data, int width, int height, int
   {
     for (int i = 0; i < count; i++)
     {
-      for (int d = 0; d < depth; d++)
+      for (int d = 0; d < src_depth; d++)
       {
-        *dst_data++ = *(src_data + d*count);
+        *(dst_data + d) = *(src_data + d*count);
       }
 
+      dst_data += dst_depth;
       src_data++;
     }
   }
 }
 
-void imConvertPacking(const void* src_data, void* dst_data, int width, int height, int depth, 
+void imConvertPacking(const void* src_data, void* dst_data, int width, int height, int src_depth, int dst_depth, 
                       int data_type, int src_is_packed)
 {
   switch(data_type)
   {
   case IM_BYTE:
-    iDoChangePacking((const imbyte*)src_data, (imbyte*)dst_data, width, height, depth, src_is_packed); 
+    iDoChangePacking((const imbyte*)src_data, (imbyte*)dst_data, width, height, src_depth, dst_depth, src_is_packed); 
     break;
   case IM_USHORT:
-    iDoChangePacking((const imushort*)src_data, (imushort*)dst_data, width, height, depth, src_is_packed); 
+    iDoChangePacking((const imushort*)src_data, (imushort*)dst_data, width, height, src_depth, dst_depth, src_is_packed); 
     break;
   case IM_INT:
-    iDoChangePacking((const int*)src_data, (int*)dst_data, width, height, depth, src_is_packed); 
+    iDoChangePacking((const int*)src_data, (int*)dst_data, width, height, src_depth, dst_depth, src_is_packed); 
     break;
   case IM_FLOAT:
-    iDoChangePacking((const float*)src_data, (float*)dst_data, width, height, depth, src_is_packed); 
+    iDoChangePacking((const float*)src_data, (float*)dst_data, width, height, src_depth, dst_depth, src_is_packed); 
     break;
   case IM_CFLOAT:
-    iDoChangePacking((const imcfloat*)src_data, (imcfloat*)dst_data, width, height, depth, src_is_packed); 
+    iDoChangePacking((const imcfloat*)src_data, (imcfloat*)dst_data, width, height, src_depth, dst_depth, src_is_packed); 
     break;
   }
 }
 
-static void iImageMakeGray(imbyte *map, int count, int step)
+static void iImageMakeGray(imbyte *map, int gldepth, int count)
 {
   for(int i = 0; i < count; i++)
   {
     if (*map)
       *map = 255;
-    map += step;
+    map += gldepth;
   }
 }
 
-static void iImageGLCopyMapAlpha(imbyte *map, imbyte *gldata, int depth, int count)
+static void iImageGLCopyMapAlpha(imbyte *map, imbyte *gldata, int gldepth, int count)
 {
   /* gldata can be GL_RGBA or GL_LUMINANCE_ALPHA */
-  gldata += depth-1; /* position at first alpha */
+  gldata += gldepth-1; /* position at first alpha */
   for(int i = 0; i < count; i++)
   {
     *gldata = *map;
     map++;
-    gldata += depth;  /* skip to next alpha */
+    gldata += gldepth;  /* skip to next alpha */
   }
 }
 
@@ -172,10 +174,10 @@ static void iImageGLSetTranspMap(imbyte *map, imbyte *gldata, int count, imbyte
   }
 }
 
-static void iImageGLSetTranspIndex(imbyte *map, imbyte *gldata, int depth, int count, imbyte index)
+static void iImageGLSetTranspIndex(imbyte *map, imbyte *gldata, int gldepth, int count, imbyte index)
 {
   /* gldata can be GL_RGBA or GL_LUMINANCE_ALPHA */
-  gldata += depth-1; /* position at first alpha */
+  gldata += gldepth-1; /* position at first alpha */
   for(int i = 0; i < count; i++)
   {
     if (*map == index)
@@ -184,7 +186,7 @@ static void iImageGLSetTranspIndex(imbyte *map, imbyte *gldata, int depth, int c
       *gldata = 255;  /* opaque */
 
     map++;
-    gldata += depth;  /* skip to next alpha */
+    gldata += gldepth;  /* skip to next alpha */
   }
 }
 
@@ -194,6 +196,46 @@ static void iImageGLSetTranspIndex(imbyte *map, imbyte *gldata, int depth, int c
 #define GL_LUMINANCE                      0x1909
 #define GL_LUMINANCE_ALPHA                0x190A
 
+imImage* imImageCreateFromOpenGLData(int width, int height, int glformat, const void* gldata)
+{
+  int color_space, has_alpha, depth;
+  imImage* image;
+
+  switch(glformat)
+  {
+  case GL_RGBA:
+    color_space = IM_RGB;
+    has_alpha = 1;
+    depth = 4;
+    break;
+  case GL_RGB:
+    color_space = IM_RGB;
+    has_alpha = 0;
+    depth = 3;
+    break;
+  case GL_LUMINANCE_ALPHA:
+    color_space = IM_GRAY;
+    depth = 2;
+    has_alpha = 1;
+  default: /* GL_LUMINANCE */
+    color_space = IM_GRAY;
+    depth = 1;
+    has_alpha = 0;
+    break;
+  }
+
+  image = imImageCreate(width, height, color_space, IM_BYTE);
+  if (!image)
+    return NULL;
+
+  if (has_alpha)
+    imImageAddAlpha(image);
+
+  imConvertPacking(gldata, image->data[0], image->width, image->height, depth, depth, IM_BYTE, 1);
+
+  return image;
+}
+
 void* imImageGetOpenGLData(const imImage* image, int *format)
 {
   if (!imImageIsBitmap(image))
@@ -221,61 +263,73 @@ void* imImageGetOpenGLData(const imImage* image, int *format)
     break;
   case IM_BINARY:
   default: /* IM_GRAY */
-    if (image->has_alpha || transp_index)
+    if (image->has_alpha || transp_map || transp_index)
       glformat = GL_LUMINANCE_ALPHA;
     else
       glformat = GL_LUMINANCE;
     break;
   }
 
-  int depth;
+  int gldepth;
   switch (glformat)
   {
   case GL_RGB:
-    depth = 3;
+    gldepth = 3;
     break;
   case GL_RGBA:
-    depth = 4;
+    gldepth = 4;
     break;
   case GL_LUMINANCE_ALPHA:
-    depth = 2;
+    gldepth = 2;
     break;
   default: /* GL_LUMINANCE */
-    depth = 1;
+    gldepth = 1;
     break;
   }
 
-  int size = image->count*depth;
+  int size = image->count*gldepth;
   imImageSetAttribute(image, "GLDATA", IM_BYTE, size, NULL);
   imbyte* gldata = (imbyte*)imImageGetAttribute(image, "GLDATA", NULL, NULL);
 
-  if (image->color_space == IM_RGB)
+  int depth = image->depth;
+  if (image->has_alpha)
+    depth++;
+
+  /* copy data, including alpha */
+  if (image->color_space != IM_MAP)
   {
-    if (image->has_alpha)
-      imConvertPacking(image->data[0], gldata, image->width, image->height, 4, IM_BYTE, 0);
-    else
-    {
-      imConvertPacking(image->data[0], gldata, image->width, image->height, 3, IM_BYTE, 0);
+    imConvertPacking(image->data[0], gldata, image->width, image->height, depth, gldepth, IM_BYTE, 0);
 
-      if (transp_color)
-        iImageGLSetTranspColor(gldata, image->count, *(transp_color+0), *(transp_color+1), *(transp_color+2));
-    }
+    if (image->color_space == IM_BINARY)
+      iImageMakeGray(gldata, gldepth, image->count);
   }
   else
   {
-    memcpy(gldata, image->data[0], image->size);
+    /* copy map data */
+    memcpy(gldata, image->data[0], image->size);  /* size does not include alpha */
 
-    if (image->color_space == IM_MAP)
-      imConvertMapToRGB(gldata, image->count, depth, 1, image->palette, image->palette_count);
-    else if (image->color_space == IM_BINARY)
-      iImageMakeGray(gldata, image->count, (glformat==GL_LUMINANCE_ALPHA)? 2: 1);
+    /* expand MAP to RGB or RGBA */
+    imConvertMapToRGB(gldata, image->count, gldepth, 1, image->palette, image->palette_count);
 
     if (image->has_alpha)
-      iImageGLCopyMapAlpha((imbyte*)image->data[1], gldata, depth, image->count);
-    else if (transp_map)
-      iImageGLSetTranspMap((imbyte*)image->data[0], gldata, image->count, transp_map, transp_count);
-    else if (transp_index)
-      iImageGLSetTranspIndex((imbyte*)image->data[0], gldata, depth, image->count, *transp_index);
+      iImageGLCopyMapAlpha((imbyte*)image->data[1], gldata, gldepth, image->count);  /* copy the alpha plane */
+  }
+
+  /* set alpha based on attributes */
+  if (!image->has_alpha)
+  {
+    if (image->color_space == IM_RGB)
+    {
+      if (transp_color)
+        iImageGLSetTranspColor(gldata, image->count, *(transp_color+0), *(transp_color+1), *(transp_color+2));
+    }
+    else 
+    {
+      if (transp_map)
+        iImageGLSetTranspMap((imbyte*)image->data[0], gldata, image->count, transp_map, transp_count);
+      else if (transp_index)
+        iImageGLSetTranspIndex((imbyte*)image->data[0], gldata, gldepth, image->count, *transp_index);
+    }
   }
 
   if (format) *format = glformat;
diff --git a/src/lua5/imlua_image.c b/src/lua5/imlua_image.c
index 5f84b97..b8bc1a8 100644
--- a/src/lua5/imlua_image.c
+++ b/src/lua5/imlua_image.c
@@ -2,7 +2,7 @@
  * \brief IM Lua 5 Binding
  *
  * See Copyright Notice in im_lib.h
- * $Id: imlua_image.c,v 1.12 2010/07/18 03:04:23 scuri Exp $
+ * $Id: imlua_image.c,v 1.13 2010/10/25 18:29:07 scuri Exp $
  */
 
 #include <string.h>
@@ -118,6 +118,20 @@ static int imluaImageCreate (lua_State *L)
   return 1;
 }
 
+/*****************************************************************************\
+ im.ImageCreateFromOpenGLData(width, height, glformat, gldata)
+\*****************************************************************************/
+static int imluaImageCreateFromOpenGLData (lua_State *L)
+{
+  int width = luaL_checkint(L, 1);
+  int height = luaL_checkint(L, 2);
+  int glformat = luaL_checkint(L, 3);
+  void* gldata = lua_touserdata(L, 4);
+  imImage *image = imImageCreateFromOpenGLData(width, height, glformat, gldata);
+  imlua_pushimage(L, image);
+  return 1;
+}
+
 /*****************************************************************************\
  image:AddAlpha()
 \*****************************************************************************/
@@ -1014,6 +1028,7 @@ static int imluaImage_index (lua_State *L)
 
 static const luaL_reg imimage_lib[] = {
   {"ImageCreate", imluaImageCreate},
+  {"ImageCreateFromOpenGLData", imluaImageCreateFromOpenGLData},
   {"ImageDestroy", imluaImageDestroy},
   {"FileImageLoad", imluaFileImageLoad},
   {"FileImageLoadBitmap", imluaFileImageLoadBitmap},
diff --git a/src/lua5/imlua_palette.c b/src/lua5/imlua_palette.c
index 135fe9a..029374c 100644
--- a/src/lua5/imlua_palette.c
+++ b/src/lua5/imlua_palette.c
@@ -2,7 +2,7 @@
  * \brief IM Lua 5 Binding
  *
  * See Copyright Notice in im_lib.h
- * $Id: imlua_palette.c,v 1.2 2010/06/11 17:43:52 scuri Exp $
+ * $Id: imlua_palette.c,v 1.3 2010/10/25 18:29:07 scuri Exp $
  */
 
 #include <string.h>
@@ -91,7 +91,7 @@ static int imluaPaletteCreate(lua_State *L)
 static int imluaPaletteFindNearest (lua_State *L)
 {
   imluaPalette *pal = imlua_checkpalette(L, 1);
-  long color = (long int) lua_touserdata(L, 1);
+  long color = (long)lua_touserdata(L, 1);
 
   lua_pushnumber(L, imPaletteFindNearest(pal->color, pal->count, color));
   return 1;
@@ -103,7 +103,7 @@ static int imluaPaletteFindNearest (lua_State *L)
 static int imluaPaletteFindColor (lua_State *L)
 {
   imluaPalette *pal = imlua_checkpalette(L, 1);
-  long color = (long) lua_touserdata(L, 2);
+  long color = (long)lua_touserdata(L, 2);
   unsigned char tol = (unsigned char)luaL_checkint(L, 3);
 
   lua_pushnumber(L, imPaletteFindColor(pal->color, pal->count, color, tol));
@@ -241,7 +241,7 @@ static int imluaPaletteUniform (lua_State *L)
 \*****************************************************************************/
 static int imluaPaletteUniformIndex (lua_State *L)
 {
-  lua_pushnumber(L, imPaletteUniformIndex((long int) lua_touserdata(L, 1)));
+  lua_pushnumber(L, imPaletteUniformIndex((long)lua_touserdata(L, 1)));
   return 1;
 }
 
@@ -250,7 +250,7 @@ static int imluaPaletteUniformIndex (lua_State *L)
 \*****************************************************************************/
 static int imluaPaletteUniformIndexHalftoned (lua_State *L)
 {
-  long color = (long) lua_touserdata(L, 1);
+  long color = (long)lua_touserdata(L, 1);
   int x = luaL_checkint(L, 2);
   int y = luaL_checkint(L, 3);
 
@@ -321,7 +321,7 @@ static int imluaPalette_newindex(lua_State *L)
   if (!lua_islightuserdata(L, 3))
     luaL_argerror(L, 3, "color must be a light user data");
 
-  color_i = (long int) lua_touserdata(L, 3);
+  color_i = (long)lua_touserdata(L, 3);
 
   pal->color[index_i] = color_i;
   return 0;
diff --git a/src/lua5/imlua_util.c b/src/lua5/imlua_util.c
index 69cfb19..c07d920 100644
--- a/src/lua5/imlua_util.c
+++ b/src/lua5/imlua_util.c
@@ -2,7 +2,7 @@
  * \brief IM Lua 5 Binding
  *
  * See Copyright Notice in im_lib.h
- * $Id: imlua_util.c,v 1.1 2008/10/17 06:16:32 scuri Exp $
+ * $Id: imlua_util.c,v 1.2 2010/10/25 18:29:07 scuri Exp $
  */
 
 #include "im.h"
@@ -199,7 +199,7 @@ static int imlua_colorencode(lua_State *L)
 {
   int red_f, green_f, blue_f;
   unsigned char red_i, green_i, blue_i;
-  long int color_i;
+  long color_i;
 
   red_f   = luaL_checkint(L, 1);
   green_f = luaL_checkint(L, 2);
@@ -228,13 +228,13 @@ static int imlua_colorencode(lua_State *L)
 \***************************************************************************/
 static int imlua_colordecode(lua_State *L)
 {
-  long int color_i;
+  long color_i;
   unsigned char red_i, green_i, blue_i;
 
   if (!lua_islightuserdata(L, 1))
     luaL_argerror(L, 1, "color must be a light user data");
 
-  color_i = (long int) lua_touserdata(L,1);
+  color_i = (long)lua_touserdata(L,1);
 
   imColorDecode(&red_i, &green_i, &blue_i, color_i);
   lua_pushnumber(L, red_i);
-- 
cgit v1.2.3