Revision: 16461
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16461
Author:   blendix
Date:     2008-09-10 15:02:58 +0200 (Wed, 10 Sep 2008)

Log Message:
-----------

Fix for bug #8132: on Mac OS X 10.5 with Nvidia cards drawing
background images and node previews goes wrong. The exact cause
of that is not sure, may be a driver bug, workaround is to fall
back to another slower function.

Modified Paths:
--------------
    trunk/blender/source/blender/include/BIF_glutil.h
    trunk/blender/source/blender/src/glutil.c
    trunk/blender/source/blender/src/mywindow.c

Modified: trunk/blender/source/blender/include/BIF_glutil.h
===================================================================
--- trunk/blender/source/blender/include/BIF_glutil.h   2008-09-10 12:04:20 UTC 
(rev 16460)
+++ trunk/blender/source/blender/include/BIF_glutil.h   2008-09-10 13:02:58 UTC 
(rev 16461)
@@ -204,6 +204,7 @@
 /* intel gfx cards frontbuffer problem */
 void bglFlush(void);
 int is_a_really_crappy_intel_card(void);
+int is_a_really_crappy_nvidia_card(void);
 void set_inverted_drawing(int enable);
 
 

Modified: trunk/blender/source/blender/src/glutil.c
===================================================================
--- trunk/blender/source/blender/src/glutil.c   2008-09-10 12:04:20 UTC (rev 
16460)
+++ trunk/blender/source/blender/src/glutil.c   2008-09-10 13:02:58 UTC (rev 
16461)
@@ -290,18 +290,67 @@
        return texid;
 }
 
+#define FTOCHAR(val) val<=0.0f?0: (val>=1.0f?255: (char)(255.0f*val))
 void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void 
*rect)
 {
-       unsigned char *uc_rect= (unsigned char*) rect;
-       float *f_rect= (float *)rect;
-       float xzoom= glaGetOneFloat(GL_ZOOM_X), yzoom= 
glaGetOneFloat(GL_ZOOM_Y);
-       int ltexid= glaGetOneInteger(GL_TEXTURE_2D);
-       int lrowlength= glaGetOneInteger(GL_UNPACK_ROW_LENGTH);
-       int subpart_x, subpart_y, tex_w, tex_h;
-       int texid= get_cached_work_texture(&tex_w, &tex_h);
-       int nsubparts_x= (img_w+(tex_w-1))/tex_w;
-       int nsubparts_y= (img_h+(tex_h-1))/tex_h;
+       float *f_rect;
+       float xzoom, yzoom;
+       unsigned char *uc_rect;
+       int ltexid, lrowlength, texid, tex_w, tex_h;
+       int subpart_x, subpart_y, nsubparts_x, nsubparts_y;
 
+       uc_rect= (unsigned char*) rect;
+       f_rect= (float *)rect;
+
+#ifdef __APPLE__
+       /* On Nvidia, Mac OS X 10.5 this function doesn't work correct and
+        * can crash even, use glDrawPixels instead of textures then */
+       if(is_a_really_crappy_nvidia_card()) {
+               float col[4], modcol[4];
+               unsigned char *srect = rect;
+               int a;
+
+               /* modulate with current color */
+               glGetFloatv(GL_CURRENT_COLOR, col);
+               if(col[0]!=1.0f || col[1]!=1.0f ||col[2]!=1.0f ||col[3]!=1.0f) {
+                       srect = MEM_callocN(4*img_w*img_h, 
"glDrawPixelsTexSafe");
+                       for(a=0; a<img_w*img_h*4; a+=4) {
+                               if(format == GL_FLOAT) {
+                                       modcol[0]= col[0]*f_rect[a];
+                                       modcol[1]= col[1]*f_rect[a+1];
+                                       modcol[2]= col[2]*f_rect[a+2];
+                                       modcol[3]= col[3]*f_rect[a+3];
+                               }
+                               else {
+                                       modcol[0]= 
col[0]*uc_rect[a]*(1.0f/255.0f);
+                                       modcol[1]= 
col[1]*uc_rect[a+1]*(1.0f/255.0f);
+                                       modcol[2]= 
col[2]*uc_rect[a+2]*(1.0f/255.0f);
+                                       modcol[3]= 
col[3]*uc_rect[a+3]*(1.0f/255.0f);
+                               }
+
+                               srect[a]= FTOCHAR(modcol[0]);
+                               srect[a+1]= FTOCHAR(modcol[1]);
+                               srect[a+2]= FTOCHAR(modcol[2]);
+                               srect[a+3]= FTOCHAR(modcol[3]);
+                       }
+               }
+
+               glaDrawPixelsSafe(x, y, img_w, img_h, img_w, GL_RGBA, format, 
srect);
+
+               if(srect != rect)
+                       MEM_freeN(srect);
+
+               return;
+       }
+#endif
+
+       xzoom= glaGetOneFloat(GL_ZOOM_X), yzoom= glaGetOneFloat(GL_ZOOM_Y);
+       ltexid= glaGetOneInteger(GL_TEXTURE_2D);
+       lrowlength= glaGetOneInteger(GL_UNPACK_ROW_LENGTH);
+       texid= get_cached_work_texture(&tex_w, &tex_h);
+       nsubparts_x= (img_w+(tex_w-1))/tex_w;
+       nsubparts_y= (img_h+(tex_h-1))/tex_h;
+
        /* Specify the color outside this function, and tex will modulate it.
         * This is useful for changing alpha without using glPixelTransferf()
         */
@@ -348,7 +397,6 @@
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 }
 
-#define FTOCHAR(val) val<=0.0f?0: (val>=1.0f?255: (char)(255.0f*val))
 void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int 
row_w, float *rectf)
 {
        float *rf;
@@ -717,6 +765,17 @@
        return well_is_it;
 }
 
+int is_a_really_crappy_nvidia_card(void)
+{
+       static int well_is_it= -1;
+
+       /* Do you understand the implication? Do you? */
+       if (well_is_it==-1)
+               well_is_it= (strcmp((char*) glGetString(GL_VENDOR), "NVIDIA 
Corporation") == 0);
+
+       return well_is_it;
+}
+
 void bglFlush(void) 
 {
        glFlush();

Modified: trunk/blender/source/blender/src/mywindow.c
===================================================================
--- trunk/blender/source/blender/src/mywindow.c 2008-09-10 12:04:20 UTC (rev 
16460)
+++ trunk/blender/source/blender/src/mywindow.c 2008-09-10 13:02:58 UTC (rev 
16461)
@@ -604,18 +604,6 @@
 
 /* ********** END MY WINDOW ************** */
 
-#ifdef WIN32
-static int is_a_really_crappy_nvidia_card(void) {
-       static int well_is_it= -1;
-
-               /* Do you understand the implication? Do you? */
-       if (well_is_it==-1)
-               well_is_it= (strcmp((char*) glGetString(GL_VENDOR), "NVIDIA 
Corporation") == 0);
-
-       return well_is_it;
-}
-#endif
-
 void myswapbuffers(void)
 {
        ScrArea *sa;


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to