Revision: 40861
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40861
Author:   psy-fi
Date:     2011-10-09 00:17:47 +0000 (Sun, 09 Oct 2011)
Log Message:
-----------
Long standing todo: Support tiled high resolution images. Also added check for 
color correction so as to avoid converting the image if already in sRGB space.

Modified Paths:
--------------
    branches/soc-2011-onion-uv-tools/source/blender/gpu/intern/gpu_draw.c

Modified: branches/soc-2011-onion-uv-tools/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/gpu/intern/gpu_draw.c       
2011-10-08 22:24:28 UTC (rev 40860)
+++ branches/soc-2011-onion-uv-tools/source/blender/gpu/intern/gpu_draw.c       
2011-10-09 00:17:47 UTC (rev 40861)
@@ -429,7 +429,9 @@
        int rectw, recth, tpx=0, tpy=0, y;
        unsigned int *rectrow, *tilerectrow;
        unsigned int *tilerect= NULL, *scalerect= NULL, *rect= NULL;
+       float *frectrow, *ftilerectrow, *ftilerect= NULL;
        float *frect = NULL, *fscalerect = NULL;
+       float *color_corrected_frect = NULL;
        short texwindx, texwindy, texwinsx, texwinsy;
        /*flag to determine whether high resolution format is used*/
        int useHighPrecisionTex = FALSE;
@@ -483,15 +485,14 @@
                return 0;
 
        if (ibuf->rect_float){
-               /*replace with user preference when ready :)*/
                if(U.high_bit_depth_tex)
                {
                        /*Use high precision textures. This is relatively 
harmless because OpenGL gives us
                        a high precision format only if it is available*/
                        useHighPrecisionTex = TRUE;
                }
-               else if(ibuf->rect==NULL){
-               IMB_rect_from_float(ibuf);
+               if(ibuf->rect==NULL){
+                       IMB_rect_from_float(ibuf);
                }
 
        }
@@ -528,29 +529,42 @@
                        tpx= texwindx;
                        tpy= texwindy;
 
-                       rect= ibuf->rect + texwinsy*ibuf->x + texwinsx;
+                       if(useHighPrecisionTex){
+                               /* We may also need a color corrected float 
image. Dithering will not apply since it's high precision */
+                               if(ibuf->profile == IB_PROFILE_LINEAR_RGB){
+                                       color_corrected_frect = 
MEM_mallocN(ibuf->x*ibuf->y*sizeof(float)*4, "floar_buf_col_cor");
+                                       
IMB_float_color_corrected_from_float_rect(ibuf, color_corrected_frect);
+                                       frect= color_corrected_frect + 
texwinsy*ibuf->x + texwinsx;
+                               }else{
+                                       frect= ibuf->rect_float + 
texwinsy*ibuf->x + texwinsx;
+                               }
+                       }else{
+                               rect= ibuf->rect + texwinsy*ibuf->x + texwinsx;
+                       }
                }
        }
        else {
                /* regular image mode */
                bind= &ima->bindcode;
-               
+
                if(*bind==0) {
                        tpx= ibuf->x;
                        tpy= ibuf->y;
                        rect= ibuf->rect;
                        if(useHighPrecisionTex){
-                               /*We also need a color corrected float image*/
-                               frect = 
MEM_mallocN(ibuf->x*ibuf->y*sizeof(float)*4, "floar_buf_col_cor");
-                               IMB_float_color_corrected_from_float_rect(ibuf, 
frect);
+                               /* We may also need a color corrected float 
image. Dithering will not apply since it's high precision */
+                               if(ibuf->profile == IB_PROFILE_LINEAR_RGB){
+                                       frect = color_corrected_frect = 
MEM_mallocN(ibuf->x*ibuf->y*sizeof(float)*4, "floar_buf_col_cor");
+                                       
IMB_float_color_corrected_from_float_rect(ibuf, color_corrected_frect);
+                                       frect= color_corrected_frect + 
texwinsy*ibuf->x + texwinsx;
+                               }else{
+                                       frect= ibuf->rect_float;
+                               }
+                       }
                }
        }
-       }
 
        if(*bind != 0) {
-               if(frect)
-                       MEM_freeN(frect);
-
                /* enable opengl drawing with textures */
                glBindTexture(GL_TEXTURE_2D, *bind);
                return *bind;
@@ -561,16 +575,29 @@
 
        /* for tiles, copy only part of image into buffer */
        if (GTS.tilemode) {
-               tilerect= MEM_mallocN(rectw*recth*sizeof(*tilerect), 
"tilerect");
+               if(useHighPrecisionTex){
+                       ftilerect= MEM_mallocN(rectw*recth*sizeof(*ftilerect), 
"tilerect");
 
-               for (y=0; y<recth; y++) {
-                       rectrow= &rect[y*ibuf->x];
-                       tilerectrow= &tilerect[y*rectw];
-                               
-                       memcpy(tilerectrow, rectrow, tpx*sizeof(*rectrow));
+                       for (y=0; y<recth; y++) {
+                               frectrow= &frect[y*ibuf->x];
+                               ftilerectrow= &ftilerect[y*rectw];
+
+                               memcpy(ftilerectrow, frectrow, 
tpx*sizeof(*frectrow));
+                       }
+
+                       frect= ftilerect;
+               }else{
+                       tilerect= MEM_mallocN(rectw*recth*sizeof(*tilerect), 
"tilerect");
+
+                       for (y=0; y<recth; y++) {
+                               rectrow= &rect[y*ibuf->x];
+                               tilerectrow= &tilerect[y*rectw];
+
+                               memcpy(tilerectrow, rectrow, 
tpx*sizeof(*rectrow));
+                       }
+                       
+                       rect= tilerect;
                }
-                       
-               rect= tilerect;
        }
 
        /* scale if not a power of two. This is not strictly necessary for 
newer 
@@ -589,11 +616,11 @@
                }
                else
                {
-               scalerect= MEM_mallocN(rectw*recth*sizeof(*scalerect), 
"scalerect");
-               gluScaleImage(GL_RGBA, tpx, tpy, GL_UNSIGNED_BYTE, rect, rectw, 
recth, GL_UNSIGNED_BYTE, scalerect);
-               rect= scalerect;
+                       scalerect= MEM_mallocN(rectw*recth*sizeof(*scalerect), 
"scalerect");
+                       gluScaleImage(GL_RGBA, tpx, tpy, GL_UNSIGNED_BYTE, 
rect, rectw, recth, GL_UNSIGNED_BYTE, scalerect);
+                       rect= scalerect;
+               }
        }
-       }
 
        /* create image */
        glGenTextures(1, (GLuint *)bind);
@@ -626,12 +653,14 @@
        /* clean up */
        if (tilerect)
                MEM_freeN(tilerect);
+       if (ftilerect)
+                       MEM_freeN(ftilerect);
        if (scalerect)
                MEM_freeN(scalerect);
        if (fscalerect)
                MEM_freeN(fscalerect);
-       if(frect)
-               MEM_freeN(frect);
+       if(color_corrected_frect)
+               MEM_freeN(color_corrected_frect);
        return *bind;
 }
 

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to