[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60950] branches/soc-2013-paint/source/ blender/editors/sculpt_paint: Fix anchored and drag dot strokes not being undoable after last commit
Antony Riakiotakis
kalast at gmail.com
Sat Oct 26 21:35:31 CEST 2013
Revision: 60950
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60950
Author: psy-fi
Date: 2013-10-26 19:35:30 +0000 (Sat, 26 Oct 2013)
Log Message:
-----------
Fix anchored and drag dot strokes not being undoable after last commit
to undo tiles. Not really nice but it works for now.
Modified Paths:
--------------
branches/soc-2013-paint/source/blender/editors/sculpt_paint/paint_image.c
branches/soc-2013-paint/source/blender/editors/sculpt_paint/paint_image_proj.c
branches/soc-2013-paint/source/blender/editors/sculpt_paint/paint_intern.h
Modified: branches/soc-2013-paint/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- branches/soc-2013-paint/source/blender/editors/sculpt_paint/paint_image.c 2013-10-26 17:45:39 UTC (rev 60949)
+++ branches/soc-2013-paint/source/blender/editors/sculpt_paint/paint_image.c 2013-10-26 19:35:30 UTC (rev 60950)
@@ -218,7 +218,7 @@
return NULL;
}
-void *image_undo_push_tile(Image *ima, ImBuf *ibuf, ImBuf **tmpibuf, int x_tile, int y_tile, unsigned short **mask)
+void *image_undo_push_tile(Image *ima, ImBuf *ibuf, ImBuf **tmpibuf, int x_tile, int y_tile, unsigned short **mask, bool **valid)
{
ListBase *lb = undo_paint_push_get_list(UNDO_PAINT_IMAGE);
UndoImageTile *tile;
@@ -256,6 +256,9 @@
tile->valid = true;
tile->ima = ima;
+ if (valid)
+ *valid = &tile->valid;
+
undo_copy_tile(tile, *tmpibuf, ibuf, COPY);
undo_paint_push_count_alloc(UNDO_PAINT_IMAGE, allocsize);
@@ -461,7 +464,7 @@
for (ty = tiley; ty <= tileh; ty++)
for (tx = tilex; tx <= tilew; tx++)
- image_undo_push_tile(ima, ibuf, &tmpibuf, tx, ty, NULL);
+ image_undo_push_tile(ima, ibuf, &tmpibuf, tx, ty, NULL, NULL);
ibuf->userflags |= IB_BITMAPDIRTY;
Modified: branches/soc-2013-paint/source/blender/editors/sculpt_paint/paint_image_proj.c
===================================================================
--- branches/soc-2013-paint/source/blender/editors/sculpt_paint/paint_image_proj.c 2013-10-26 17:45:39 UTC (rev 60949)
+++ branches/soc-2013-paint/source/blender/editors/sculpt_paint/paint_image_proj.c 2013-10-26 19:35:30 UTC (rev 60950)
@@ -185,6 +185,7 @@
void **undoRect; /* only used to build undo tiles after painting */
void **maskRect; /* the mask accumulation must happen on canvas, not on space screen bucket.
* Here we store the mask rectangle */
+ bool **valid; /* store flag to enforce validation of undo rectangle */
int touch;
} ProjPaintImage;
@@ -316,6 +317,8 @@
unsigned short mask;
short x_px, y_px;
+ /* horrible hack, store tile valid flag pointer here to re-validate tiles used for anchored and drag-dot strokes */
+ bool *valid;
PixelPointer origColor;
PixelStore newColor;
@@ -1390,7 +1393,7 @@
}
}
-static int project_paint_undo_subtiles(const TileInfo *tinf, int tx, int ty)
+static int project_paint_undo_subtiles(const TileInfo *tinf, int tx, int ty, bool **valid)
{
unsigned short *maskrect;
ProjPaintImage *pjIma = tinf->pjima;
@@ -1402,14 +1405,18 @@
if (UNLIKELY(!pjIma->undoRect[tileindex])) {
if (tinf->masked) {
- pjIma->undoRect[tileindex] = image_undo_push_tile(pjIma->ima, pjIma->ibuf, tinf->tmpibuf, tx, ty, &maskrect);
+ pjIma->undoRect[tileindex] = image_undo_push_tile(pjIma->ima, pjIma->ibuf, tinf->tmpibuf, tx, ty, &maskrect, &pjIma->valid[tileindex]);
pjIma->maskRect[tileindex] = maskrect;
}
else
- pjIma->undoRect[tileindex] = image_undo_push_tile(pjIma->ima, pjIma->ibuf, tinf->tmpibuf, tx, ty, NULL);
+ pjIma->undoRect[tileindex] = image_undo_push_tile(pjIma->ima, pjIma->ibuf, tinf->tmpibuf, tx, ty, NULL, &pjIma->valid[tileindex]);
+ *valid = pjIma->valid[tileindex];
pjIma->ibuf->userflags |= IB_BITMAPDIRTY;
}
+ else {
+ *valid = pjIma->valid[tileindex];
+ }
if (tinf->threaded)
BLI_unlock_thread(LOCK_CUSTOM1);
@@ -1443,6 +1450,9 @@
x_px = mod_i(x_px, ibuf->x);
y_px = mod_i(y_px, ibuf->y);
+ BLI_assert(ps->pixel_sizeof == project_paint_pixel_sizeof(ps->tool));
+ projPixel = (ProjPixel *)BLI_memarena_alloc(arena, ps->pixel_sizeof);
+
/* calculate the undo tile offset of the pixel, used to store the original
* pixel colour and acculmuated mask if any */
x_tile = x_px >> IMAPAINT_TILE_BITS;
@@ -1450,17 +1460,14 @@
x_round = x_tile * IMAPAINT_TILE_SIZE;
y_round = y_tile * IMAPAINT_TILE_SIZE;
+ //memset(projPixel, 0, size);
tile_offset = (x_px - x_round) + (y_px - y_round) * IMAPAINT_TILE_SIZE;
- tile_index = project_paint_undo_subtiles(tinf, x_tile, y_tile);
+ tile_index = project_paint_undo_subtiles(tinf, x_tile, y_tile, &projPixel->valid);
BLI_assert(tile_index < (IMAPAINT_TILE_NUMBER(ibuf->x) * IMAPAINT_TILE_NUMBER(ibuf->y)));
BLI_assert(tile_offset < (IMAPAINT_TILE_SIZE * IMAPAINT_TILE_SIZE));
- BLI_assert(ps->pixel_sizeof == project_paint_pixel_sizeof(ps->tool));
- projPixel = (ProjPixel *)BLI_memarena_alloc(arena, ps->pixel_sizeof);
- //memset(projPixel, 0, size);
-
if (ibuf->rect_float) {
projPixel->pixel.f_pt = ibuf->rect_float + ((x_px + y_px * ibuf->x) * 4);
projPixel->origColor.f_pt = (float *)projima->undoRect[tile_index] + 4 * tile_offset;
@@ -3417,6 +3424,8 @@
memset(projIma->undoRect, 0, size);
projIma->maskRect = (void **) BLI_memarena_alloc(arena, size);
memset(projIma->maskRect, 0, size);
+ projIma->valid = (bool **) BLI_memarena_alloc(arena, size);
+ memset(projIma->valid, 0, size);
}
/* we have built the array, discard the linked list */
@@ -4154,6 +4163,9 @@
}
/* end copy */
+ /* validate undo tile, since we will modify t*/
+ *projPixel->valid = true;
+
last_partial_redraw_cell = last_projIma->partRedrawRect + projPixel->bb_cell_index;
last_partial_redraw_cell->x1 = min_ii(last_partial_redraw_cell->x1, (int)projPixel->x_px);
last_partial_redraw_cell->y1 = min_ii(last_partial_redraw_cell->y1, (int)projPixel->y_px);
Modified: branches/soc-2013-paint/source/blender/editors/sculpt_paint/paint_intern.h
===================================================================
--- branches/soc-2013-paint/source/blender/editors/sculpt_paint/paint_intern.h 2013-10-26 17:45:39 UTC (rev 60949)
+++ branches/soc-2013-paint/source/blender/editors/sculpt_paint/paint_intern.h 2013-10-26 19:35:30 UTC (rev 60950)
@@ -145,7 +145,7 @@
int image_texture_paint_poll(struct bContext *C);
void *image_undo_find_tile(struct Image *ima, struct ImBuf *ibuf, int x_tile, int y_tile, unsigned short **mask, bool validate);
-void *image_undo_push_tile(struct Image *ima, struct ImBuf *ibuf, struct ImBuf **tmpibuf, int x_tile, int y_tile, unsigned short **);
+void *image_undo_push_tile(struct Image *ima, struct ImBuf *ibuf, struct ImBuf **tmpibuf, int x_tile, int y_tile, unsigned short **, bool **valid);
void image_undo_remove_masks(void);
void image_undo_restore(struct bContext *C, struct ListBase *lb);
void image_undo_free(struct ListBase *lb);
More information about the Bf-blender-cvs
mailing list