Revert "Revert "evas: allow fuzziness on the texture format returned by GL.""
authorCedric Bail <cedric.bail@samsung.com>
Wed, 27 Nov 2013 02:06:56 +0000 (11:06 +0900)
committerCedric Bail <cedric.bail@samsung.com>
Wed, 27 Nov 2013 04:51:40 +0000 (13:51 +0900)
This reverts commit 87385b05c3117aa8d46fd4029bfdeadf3444a7b9 that is necessary for desktop target.

ChangeLog
NEWS
src/modules/evas/engines/gl_common/evas_gl_texture.c

index ec1db15..95ee2ab 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,10 @@
         * ecore anim: Fixed animator not working problem when source_set is
         changed back and forth very fast.
 
+2013-11-26  Cedric Bail
+
+        * Evas: Allow fuzziness on the texture format returned by GL.
+
 2013-11-25  Tom Hacohen
 
         * Evas textblock: Fixed wrapping of lines ending with whites.
diff --git a/NEWS b/NEWS
index 856e3f4..e5a8bbe 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -228,6 +228,7 @@ Improvements:
      - Use mmap/munmap for image data allocation on system that have mmap.
      - Add iterator for walking child of smart objects, table and a box.
      - Use Eina_Spinlock for Evas_ScaleCache, Evas_Async_Events and Image_Entry.
+     - Allow fuzziness on the texture format returned by GL.
     * Ecore:
      - Use Eina_Spinlock for Ecore_Thread.
     * Ecore_Con:
index 1cacce3..95cb3a4 100644 (file)
@@ -54,6 +54,42 @@ static const struct {
 #endif
 };
 
+static const GLenum matching_rgba[] = { GL_RGBA4, GL_RGBA8, GL_RGBA12, GL_RGBA16, 0x0 };
+static const GLenum matching_alpha[] = { GL_ALPHA4, GL_ALPHA8, GL_ALPHA12, GL_ALPHA16, 0x0 };
+static const GLenum matching_luminance[] = { GL_LUMINANCE4, GL_LUMINANCE8, GL_LUMINANCE12, GL_LUMINANCE16, 0x0 };
+static const GLenum matching_luminance_alpha[] = { GL_LUMINANCE4_ALPHA4, GL_LUMINANCE8_ALPHA8, GL_LUMINANCE12_ALPHA12, GL_LUMINANCE16_ALPHA16, 0x0 };
+
+static const struct {
+   GLenum master;
+   const GLenum *matching;
+} matching_fmt[] = {
+  { GL_RGBA, matching_rgba },
+  { GL_ALPHA, matching_alpha },
+  { GL_LUMINANCE, matching_luminance },
+  { GL_LUMINANCE_ALPHA, matching_luminance_alpha }
+};
+
+static Eina_Bool
+_evas_gl_texture_match(GLenum intfmt, GLenum intfmtret)
+{
+   unsigned int i;
+
+   if (intfmt == intfmtret) return EINA_TRUE;
+
+   for (i = 0; i < sizeof (matching_fmt) / sizeof (matching_fmt[0]); i++)
+     if (matching_fmt[i].master == intfmt)
+       {
+          unsigned int j;
+
+          for (j = 0; matching_fmt[i].matching[j] != 0x0; j++)
+            if (matching_fmt[i].matching[j] == intfmtret)
+              return EINA_TRUE;
+          return EINA_FALSE;
+       }
+
+   return EINA_FALSE;
+}
+
 static int
 _evas_gl_texture_search_format(Eina_Bool alpha, Eina_Bool bgra)
 {
@@ -161,7 +197,7 @@ _tex_2d(Evas_Engine_GL_Context *gc, int intfmt, int w, int h, int fmt, int type)
         
         glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
                                  GL_TEXTURE_INTERNAL_FORMAT, &intfmtret);
-        if (intfmtret != intfmt)
+        if (!_evas_gl_texture_match(intfmt, intfmtret))
           {
              ERR("Fail tex alloc %ix%i", w, h);
              //        XXX send async err to evas