use OGL 1.1 color logic ops in addition to GL_EXT_blend_logic_op
authorRoland Scheidegger <rscheidegger@gmx.ch>
Fri, 21 May 2004 17:03:38 +0000 (17:03 +0000)
committerRoland Scheidegger <rscheidegger@gmx.ch>
Fri, 21 May 2004 17:03:38 +0000 (17:03 +0000)
progs/samples/blendeq.c
progs/samples/blendxor.c

index 315257b9e455d964c5ad9b9e1cb4015282af3def..f78afd303815bf20b4a5af7bbf79e46918e8d604 100644 (file)
@@ -19,6 +19,8 @@
 
 GLenum doubleBuffer;
 static int dithering = 0;
+int use11ops = 0;
+int supportlogops = 0;
 static int doPrint = 1;
 static int deltaY;
 GLint windW, windH;
@@ -62,6 +64,13 @@ static void Key(unsigned char key, int x, int y)
       case 'd':
        dithering = !dithering;
        break;
+      case 'l':
+        if (supportlogops == 3)
+           use11ops = (!use11ops);
+        if (use11ops)
+           printf("Using GL 1.1 color logic ops.\n");
+        else printf("Using GL_EXT_blend_logic_op.\n");
+        break;
       default:
        return;
     }
@@ -100,6 +109,8 @@ static void Draw(void)
 
     (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
     glDisable(GL_BLEND);
+    if (supportlogops & 2)
+       glDisable(GL_COLOR_LOGIC_OP);
 
     glClearColor(0.5, 0.6, 0.1, 1.0);
     glClear(GL_COLOR_BUFFER_BIT);
@@ -175,48 +186,46 @@ static void Draw(void)
 
     glBlendFunc(GL_ONE, GL_ZERO);
     i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
+    if (!use11ops)
+       glBlendEquationEXT(GL_LOGIC_OP);
+    else
+       glEnable(GL_COLOR_LOGIC_OP);
     glLogicOp(GL_CLEAR);
     glRectf(x1, i, x2, i+deltaY);
 
     i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
     glLogicOp(GL_SET);
     glRectf(x1, i, x2, i+deltaY);
 
     i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
     glLogicOp(GL_COPY);
     glRectf(x1, i, x2, i+deltaY);
 
     i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
     glLogicOp(GL_NOOP);
     glRectf(x1, i, x2, i+deltaY);
 
     i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
     glLogicOp(GL_AND);
     glRectf(x1, i, x2, i+deltaY);
 
     i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
     glLogicOp(GL_INVERT);
     glRectf(x1, i, x2, i+deltaY);
 
     i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
     glLogicOp(GL_OR);
     glRectf(x1, i, x2, i+deltaY);
 
     i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
     glLogicOp(GL_XOR);
     glRectf(x1, i, x2, i+deltaY);
     glRectf(x1, i+10, x2, i+5);
 
   if (doPrint) {
       glDisable(GL_BLEND);
+      if (supportlogops & 2)
+          glDisable(GL_COLOR_LOGIC_OP);
       glColor3f(1.0, 1.0, 1.0);
       PrintColorStrings();
   }
@@ -254,6 +263,7 @@ int main(int argc, char **argv)
     char *extName1 = "GL_EXT_blend_logic_op";
     char *extName2 = "GL_EXT_blend_minmax";
     char *extName3 = "GL_EXT_blend_subtract";
+    char *version;
 
     glutInit(&argc, argv);
 
@@ -273,10 +283,21 @@ int main(int argc, char **argv)
 
     /* Make sure blend_logic_op extension is there. */
     s = (char *) glGetString(GL_EXTENSIONS);
+    version = (char*) glGetString(GL_VERSION);
     if (!s)
        exit(1);
-    if (strstr(s,extName1) == 0) {
-       printf("Blend_logic_op extension is not present.\n");
+    if (strstr(s,extName1)) {
+       supportlogops = 1;
+        use11ops = 0;
+        printf("blend_logic_op extension available.\n");
+    }
+    if (strncmp(version,"1.1",3)>=0) {
+       supportlogops += 2;
+        use11ops = 1;
+       printf("1.1 color logic ops available.\n");
+    }
+    if (supportlogops == 0) {
+       printf("Blend_logic_op extension and GL 1.1 not present.\n");
        exit(1);
     }
     if (strstr(s,extName2) == 0) {
index 7d3285d049fad39da76c38a577c7ef5fa218b6e9..6f34e28461c8138aa283184d3ddb74debfab8f9e 100644 (file)
@@ -19,6 +19,8 @@
 
 GLenum doubleBuffer;
 int dithering = 0;
+int use11ops = 0;
+int supportlogops = 0;
 GLint windW, windH;
 
 static void Init(void)
@@ -50,6 +52,13 @@ static void Key(unsigned char key, int x, int y)
       case 'd':
        dithering = !dithering;
        break;
+      case 'l':
+        if (supportlogops == 3)
+           use11ops = (!use11ops);
+        if (use11ops)
+           printf("Using GL 1.1 color logic ops.\n");
+        else printf("Using GL_EXT_blend_logic_op.\n");
+        break;
       default:
        return;
     }
@@ -62,6 +71,8 @@ static void Draw(void)
     int i;
 
     glDisable(GL_BLEND);
+    if (supportlogops & 2)
+       glDisable(GL_COLOR_LOGIC_OP);
 
     (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
 
@@ -83,7 +94,10 @@ static void Draw(void)
     glEnd();
 
     glEnable(GL_BLEND);
-    glBlendEquationEXT(GL_LOGIC_OP);
+    if (!use11ops)
+       glBlendEquationEXT(GL_LOGIC_OP);
+    else
+       glEnable(GL_COLOR_LOGIC_OP);
     glLogicOp(GL_XOR);
 
     /* Draw a set of rectangles across the window */
@@ -142,6 +156,7 @@ int main(int argc, char **argv)
     GLenum type;
     char *s;
     char *extName = "GL_EXT_blend_logic_op";
+    char *version;
 
     glutInit(&argc, argv);
 
@@ -161,10 +176,21 @@ int main(int argc, char **argv)
 
     /* Make sure blend_logic_op extension is there. */
     s = (char *) glGetString(GL_EXTENSIONS);
+    version = (char*) glGetString(GL_VERSION);
     if (!s)
        exit(1);
-    if (strstr(s,extName) == 0) {
-       printf("Blend_logic_op extension is not present.\n");
+    if (strstr(s,extName)) {
+       supportlogops = 1;
+        use11ops = 0;
+        printf("blend_logic_op extension available.\n");
+    }
+    if (strncmp(version,"1.1",3)>=0) {
+       supportlogops += 2;
+        use11ops = 1;
+       printf("1.1 color logic ops available.\n");
+    }
+    if (supportlogops == 0) {
+       printf("Blend_logic_op extension and GL 1.1 not present.\n");
        exit(1);
     }