Revision: 42638
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42638
Author:   nazgul
Date:     2011-12-15 08:01:49 +0000 (Thu, 15 Dec 2011)
Log Message:
-----------
Fix #29615: Crash during undo after toggling "Float buffer" in image paint mode

Crash was caused by different types of buffers stored in tile in undo stack and 
in
image itself. Store type of buffer in tile, so byte tile wouldn't be applying on
float image anymore.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/sculpt_paint/paint_image.c

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_image.c     
2011-12-15 07:54:13 UTC (rev 42637)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_image.c     
2011-12-15 08:01:49 UTC (rev 42638)
@@ -383,7 +383,7 @@
        void *rect;
        int x, y;
 
-       short source;
+       short source, use_float;
        char gen_type;
 } UndoImageTile;
 
@@ -413,11 +413,13 @@
        ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_IMAGE);
        UndoImageTile *tile;
        int allocsize;
+       short use_float = ibuf->rect_float ? 1 : 0;
 
        for(tile=lb->first; tile; tile=tile->next)
                if(tile->x == x_tile && tile->y == y_tile && ima->gen_type == 
tile->gen_type && ima->source == tile->source)
-                       if(strcmp(tile->idname, ima->id.name)==0 && 
strcmp(tile->ibufname, ibuf->name)==0)
-                               return tile->rect;
+                       if(tile->use_float == use_float)
+                               if(strcmp(tile->idname, ima->id.name)==0 && 
strcmp(tile->ibufname, ibuf->name)==0)
+                                       return tile->rect;
        
        if (*tmpibuf==NULL)
                *tmpibuf = IMB_allocImBuf(IMAPAINT_TILE_SIZE, 
IMAPAINT_TILE_SIZE, 32, IB_rectfloat|IB_rect);
@@ -435,6 +437,7 @@
 
        tile->gen_type= ima->gen_type;
        tile->source= ima->source;
+       tile->use_float= use_float;
 
        undo_copy_tile(tile, *tmpibuf, ibuf, 0);
        undo_paint_push_count_alloc(UNDO_PAINT_IMAGE, allocsize);
@@ -455,6 +458,8 @@
                                                        IB_rectfloat|IB_rect);
        
        for(tile=lb->first; tile; tile=tile->next) {
+               short use_float;
+
                /* find image based on name, pointer becomes invalid with 
global undo */
                if(ima && strcmp(tile->idname, ima->id.name)==0) {
                        /* ima is valid */
@@ -464,6 +469,7 @@
                }
 
                ibuf= BKE_image_get_ibuf(ima, NULL);
+               use_float = ibuf->rect_float ? 1 : 0;
 
                if(ima && ibuf && strcmp(tile->ibufname, ibuf->name)!=0) {
                        /* current ImBuf filename was changed, probably current 
frame
@@ -480,6 +486,9 @@
                if (ima->gen_type != tile->gen_type || ima->source != 
tile->source)
                        continue;
 
+               if (use_float != tile->use_float)
+                       continue;
+
                undo_copy_tile(tile, tmpibuf, ibuf, 1);
 
                GPU_free_image(ima); /* force OpenGL reload */

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

Reply via email to