TiJoin[XY]1 API introduction at all call sites

This commit is contained in:
Darryl L. Miles 2025-07-14 14:05:54 +01:00 committed by R. Timothy Edwards
parent 489f4fe057
commit fd50bc1f4d
5 changed files with 123 additions and 99 deletions

View File

@ -271,6 +271,7 @@ DBPaintPlane0(plane, area, resultTbl, undo, method)
* search. * search.
*/ */
Tile *delayed = NULL; /* delayed free to extend lifetime */
start.p_x = area->r_xbot; start.p_x = area->r_xbot;
start.p_y = area->r_ytop - 1; start.p_y = area->r_ytop - 1;
tile = PlaneGetHint(plane); tile = PlaneGetHint(plane);
@ -439,11 +440,11 @@ enumerate:
/* Merge the outside tile to its top */ /* Merge the outside tile to its top */
tp = RT(newtile); tp = RT(newtile);
if (CANMERGE_Y(newtile, tp)) TiJoinY(newtile, tp, plane); if (CANMERGE_Y(newtile, tp)) TiJoinY1(&delayed, newtile, tp, plane);
/* Merge the outside tile to its bottom */ /* Merge the outside tile to its bottom */
tp = LB(newtile); tp = LB(newtile);
if (CANMERGE_Y(newtile, tp)) TiJoinY(newtile, tp, plane); if (CANMERGE_Y(newtile, tp)) TiJoinY1(&delayed, newtile, tp, plane);
} }
mergeFlags &= ~MRG_RIGHT; mergeFlags &= ~MRG_RIGHT;
} }
@ -483,11 +484,11 @@ enumerate:
/* Merge the outside tile to its top */ /* Merge the outside tile to its top */
tp = RT(newtile); tp = RT(newtile);
if (CANMERGE_Y(newtile, tp)) TiJoinY(newtile, tp, plane); if (CANMERGE_Y(newtile, tp)) TiJoinY1(&delayed, newtile, tp, plane);
/* Merge the outside tile to its bottom */ /* Merge the outside tile to its bottom */
tp = LB(newtile); tp = LB(newtile);
if (CANMERGE_Y(newtile, tp)) TiJoinY(newtile, tp, plane); if (CANMERGE_Y(newtile, tp)) TiJoinY1(&delayed, newtile, tp, plane);
} }
mergeFlags &= ~MRG_LEFT; mergeFlags &= ~MRG_LEFT;
} }
@ -579,7 +580,7 @@ clipdone:
if (mergeFlags & MRG_TOP) if (mergeFlags & MRG_TOP)
{ {
tp = RT(tile); tp = RT(tile);
if (CANMERGE_Y(tile, tp)) TiJoinY(tile, tp, plane); if (CANMERGE_Y(tile, tp)) TiJoinY1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "merged up (CHEAP)"); dbPaintShowTile(tile, undo, "merged up (CHEAP)");
@ -588,7 +589,7 @@ clipdone:
if (mergeFlags & MRG_BOTTOM) if (mergeFlags & MRG_BOTTOM)
{ {
tp = LB(tile); tp = LB(tile);
if (CANMERGE_Y(tile, tp)) TiJoinY(tile, tp, plane); if (CANMERGE_Y(tile, tp)) TiJoinY1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "merged down (CHEAP)"); dbPaintShowTile(tile, undo, "merged down (CHEAP)");
@ -697,6 +698,7 @@ enum2:
done2: done2:
PlaneSetHint(plane, tile); PlaneSetHint(plane, tile);
TiFreeIf(delayed);
return 0; return 0;
} }
@ -1032,6 +1034,7 @@ DBMergeNMTiles0(plane, area, undo, mergeOnce)
int clipTop; int clipTop;
Tile *tile, *tp, *tp2, *newtile, *tpnew; Tile *tile, *tp, *tp2, *newtile, *tpnew;
int aspecta, aspectb; int aspecta, aspectb;
Tile *delayed = NULL; /* delayed free to extend lifetime */
TileType ttype, ltype, rtype; TileType ttype, ltype, rtype;
start.p_x = area->r_xbot; start.p_x = area->r_xbot;
@ -1121,23 +1124,23 @@ nmenum:
newtile = TiSplitY(tp2, TOP(tile)); newtile = TiSplitY(tp2, TOP(tile));
TiSetBody(newtile, ltype); TiSetBody(newtile, ltype);
if (CANMERGE_X(newtile, BL(newtile))) if (CANMERGE_X(newtile, BL(newtile)))
TiJoinX(newtile, BL(newtile), plane); TiJoinX1(&delayed, newtile, BL(newtile), plane);
if (CANMERGE_X(newtile, TR(newtile))) if (CANMERGE_X(newtile, TR(newtile)))
TiJoinX(newtile, TR(newtile), plane); TiJoinX1(&delayed, newtile, TR(newtile), plane);
if (CANMERGE_Y(newtile, RT(newtile))) if (CANMERGE_Y(newtile, RT(newtile)))
TiJoinY(newtile, RT(newtile), plane); TiJoinY1(&delayed, newtile, RT(newtile), plane);
} }
if (LEFT(tp2) < LEFT(tp)) if (LEFT(tp2) < LEFT(tp))
{ {
newtile = TiSplitX(tp2, LEFT(tp)); newtile = TiSplitX(tp2, LEFT(tp));
TiSetBody(newtile, ltype); TiSetBody(newtile, ltype);
if (CANMERGE_Y(tp2, LB(tp2))) if (CANMERGE_Y(tp2, LB(tp2)))
TiJoinY(tp2, LB(tp2), plane); TiJoinY1(&delayed, tp2, LB(tp2), plane);
if (CANMERGE_Y(tp2, RT(tp2))) if (CANMERGE_Y(tp2, RT(tp2)))
TiJoinY(tp2, RT(tp2), plane); TiJoinY1(&delayed, tp2, RT(tp2), plane);
tp2 = newtile; tp2 = newtile;
} }
TiJoinY(tp2, tp, plane); TiJoinY1(&delayed, tp2, tp, plane);
tp = tp2; tp = tp2;
tp2 = RT(tp2); tp2 = RT(tp2);
} }
@ -1151,11 +1154,11 @@ nmenum:
newtile = TiSplitY(tp2, BOTTOM(tp)); newtile = TiSplitY(tp2, BOTTOM(tp));
TiSetBody(newtile, rtype); TiSetBody(newtile, rtype);
if (CANMERGE_X(tp2, BL(tp2))) if (CANMERGE_X(tp2, BL(tp2)))
TiJoinX(tp2, BL(tp2), plane); TiJoinX1(&delayed, tp2, BL(tp2), plane);
if (CANMERGE_X(tp2, TR(tp2))) if (CANMERGE_X(tp2, TR(tp2)))
TiJoinX(tp2, TR(tp2), plane); TiJoinX1(&delayed, tp2, TR(tp2), plane);
if (CANMERGE_Y(tp2, LB(tp2))) if (CANMERGE_Y(tp2, LB(tp2)))
TiJoinY(tp2, LB(tp2), plane); TiJoinY1(&delayed, tp2, LB(tp2), plane);
tp2 = newtile; tp2 = newtile;
} }
if (RIGHT(tp2) > RIGHT(tile)) if (RIGHT(tp2) > RIGHT(tile))
@ -1163,16 +1166,16 @@ nmenum:
newtile = TiSplitX(tp2, RIGHT(tile)); newtile = TiSplitX(tp2, RIGHT(tile));
TiSetBody(newtile, rtype); TiSetBody(newtile, rtype);
if (CANMERGE_Y(newtile, LB(newtile))) if (CANMERGE_Y(newtile, LB(newtile)))
TiJoinY(newtile, LB(newtile), plane); TiJoinY1(&delayed, newtile, LB(newtile), plane);
if (CANMERGE_Y(newtile, RT(newtile))) if (CANMERGE_Y(newtile, RT(newtile)))
TiJoinY(newtile, RT(newtile), plane); TiJoinY1(&delayed, newtile, RT(newtile), plane);
} }
TiJoinY(tp2, tile, plane); TiJoinY1(&delayed, tp2, tile, plane);
tile = tp2; tile = tp2;
tp2 = LB(tp2); tp2 = LB(tp2);
} }
/* Merge tp and tile */ /* Merge tp and tile */
TiJoinX(tile, tp, plane); TiJoinX1(&delayed, tile, tp, plane);
TiSetBody(tile, ttype); TiSetBody(tile, ttype);
} }
else /* split direction 1 */ else /* split direction 1 */
@ -1213,11 +1216,11 @@ nmenum:
newtile = TiSplitY(tp2, BOTTOM(tp)); newtile = TiSplitY(tp2, BOTTOM(tp));
TiSetBody(newtile, ltype); TiSetBody(newtile, ltype);
if (CANMERGE_X(tp2, BL(tp2))) if (CANMERGE_X(tp2, BL(tp2)))
TiJoinX(tp2, BL(tp2), plane); TiJoinX1(&delayed, tp2, BL(tp2), plane);
if (CANMERGE_X(tp2, TR(tp2))) if (CANMERGE_X(tp2, TR(tp2)))
TiJoinX(tp2, TR(tp2), plane); TiJoinX1(&delayed, tp2, TR(tp2), plane);
if (CANMERGE_Y(tp2, LB(tp2))) if (CANMERGE_Y(tp2, LB(tp2)))
TiJoinY(tp2, LB(tp2), plane); TiJoinY1(&delayed, tp2, LB(tp2), plane);
tp2 = newtile; tp2 = newtile;
} }
if (LEFT(tp2) < LEFT(tile)) if (LEFT(tp2) < LEFT(tile))
@ -1225,12 +1228,12 @@ nmenum:
newtile = TiSplitX(tp2, LEFT(tile)); newtile = TiSplitX(tp2, LEFT(tile));
TiSetBody(newtile, ltype); TiSetBody(newtile, ltype);
if (CANMERGE_Y(tp2, LB(tp2))) if (CANMERGE_Y(tp2, LB(tp2)))
TiJoinY(tp2, LB(tp2), plane); TiJoinY1(&delayed, tp2, LB(tp2), plane);
if (CANMERGE_Y(tp2, RT(tp2))) if (CANMERGE_Y(tp2, RT(tp2)))
TiJoinY(tp2, RT(tp2), plane); TiJoinY1(&delayed, tp2, RT(tp2), plane);
tp2 = newtile; tp2 = newtile;
} }
TiJoinY(tp2, tile, plane); TiJoinY1(&delayed, tp2, tile, plane);
tile = tp2; tile = tp2;
tp2 = LB(tp2); tp2 = LB(tp2);
} }
@ -1245,27 +1248,27 @@ nmenum:
newtile = TiSplitY(tp2, TOP(tile)); newtile = TiSplitY(tp2, TOP(tile));
TiSetBody(newtile, rtype); TiSetBody(newtile, rtype);
if (CANMERGE_X(newtile, BL(newtile))) if (CANMERGE_X(newtile, BL(newtile)))
TiJoinX(newtile, BL(newtile), plane); TiJoinX1(&delayed, newtile, BL(newtile), plane);
if (CANMERGE_X(newtile, TR(newtile))) if (CANMERGE_X(newtile, TR(newtile)))
TiJoinX(newtile, TR(newtile), plane); TiJoinX1(&delayed, newtile, TR(newtile), plane);
if (CANMERGE_Y(newtile, RT(newtile))) if (CANMERGE_Y(newtile, RT(newtile)))
TiJoinY(newtile, RT(newtile), plane); TiJoinY1(&delayed, newtile, RT(newtile), plane);
} }
if (RIGHT(tp2) > RIGHT(tp)) if (RIGHT(tp2) > RIGHT(tp))
{ {
newtile = TiSplitX(tp2, RIGHT(tp)); newtile = TiSplitX(tp2, RIGHT(tp));
TiSetBody(newtile, rtype); TiSetBody(newtile, rtype);
if (CANMERGE_Y(newtile, LB(newtile))) if (CANMERGE_Y(newtile, LB(newtile)))
TiJoinY(newtile, LB(newtile), plane); TiJoinY1(&delayed, newtile, LB(newtile), plane);
if (CANMERGE_Y(newtile, RT(newtile))) if (CANMERGE_Y(newtile, RT(newtile)))
TiJoinY(newtile, RT(newtile), plane); TiJoinY1(&delayed, newtile, RT(newtile), plane);
} }
TiJoinY(tp2, tp, plane); TiJoinY1(&delayed, tp2, tp, plane);
tp = tp2; tp = tp2;
tp2 = RT(tp2); tp2 = RT(tp2);
} }
/* Merge tp and tile */ /* Merge tp and tile */
TiJoinX(tile, tp, plane); TiJoinX1(&delayed, tile, tp, plane);
TiSetBody(tile, ttype); TiSetBody(tile, ttype);
} }
/* Now repeat until no more merging is possible */ /* Now repeat until no more merging is possible */
@ -1307,6 +1310,7 @@ nmenum:
nmdone: nmdone:
PlaneSetHint(plane, tile); PlaneSetHint(plane, tile);
TiFreeIf(delayed);
return 0; return 0;
} }
@ -1885,6 +1889,7 @@ dbPaintMerge(tile, newType, area, plane, mergeFlags, undo, mark)
PaintUndoInfo *undo; /* See DBPaintPlane() above */ PaintUndoInfo *undo; /* See DBPaintPlane() above */
bool mark; /* Mark tiles that were processed */ bool mark; /* Mark tiles that were processed */
{ {
Tile *delayed = NULL; /* delayed free to extend lifetime */
Tile *tp, *tpLast; Tile *tp, *tpLast;
int ysplit; int ysplit;
@ -1991,7 +1996,7 @@ dbPaintMerge(tile, newType, area, plane, mergeFlags, undo, mark)
if (mark) dbMarkClient(tile, area); if (mark) dbMarkClient(tile, area);
} }
if (BOTTOM(tp) < BOTTOM(tile)) tp = TiSplitY(tp, BOTTOM(tile)); if (BOTTOM(tp) < BOTTOM(tile)) tp = TiSplitY(tp, BOTTOM(tile));
TiJoinX(tile, tp, plane); TiJoinX1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged left"); dbPaintShowTile(tile, undo, "(DBMERGE) merged left");
@ -2007,7 +2012,7 @@ dbPaintMerge(tile, newType, area, plane, mergeFlags, undo, mark)
if (mark) dbMarkClient(tile, area); if (mark) dbMarkClient(tile, area);
} }
if (BOTTOM(tp) < BOTTOM(tile)) tp = TiSplitY(tp, BOTTOM(tile)); if (BOTTOM(tp) < BOTTOM(tile)) tp = TiSplitY(tp, BOTTOM(tile));
TiJoinX(tile, tp, plane); TiJoinX1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged right"); dbPaintShowTile(tile, undo, "(DBMERGE) merged right");
@ -2016,7 +2021,7 @@ dbPaintMerge(tile, newType, area, plane, mergeFlags, undo, mark)
if (mergeFlags&MRG_TOP) if (mergeFlags&MRG_TOP)
{ {
tp = RT(tile); tp = RT(tile);
if (CANMERGE_Y(tp, tile)) TiJoinY(tile, tp, plane); if (CANMERGE_Y(tp, tile)) TiJoinY1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged up"); dbPaintShowTile(tile, undo, "(DBMERGE) merged up");
@ -2025,13 +2030,14 @@ dbPaintMerge(tile, newType, area, plane, mergeFlags, undo, mark)
if (mergeFlags&MRG_BOTTOM) if (mergeFlags&MRG_BOTTOM)
{ {
tp = LB(tile); tp = LB(tile);
if (CANMERGE_Y(tp, tile)) TiJoinY(tile, tp, plane); if (CANMERGE_Y(tp, tile)) TiJoinY1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged down"); dbPaintShowTile(tile, undo, "(DBMERGE) merged down");
#endif /* PAINTDEBUG */ #endif /* PAINTDEBUG */
} }
TiFreeIf(delayed);
return (tile); return (tile);
} }
@ -2094,6 +2100,7 @@ DBPaintType(plane, area, resultTbl, client, undo, tileMask)
* search. * search.
*/ */
Tile *delayed = NULL; /* delayed free to extend lifetime */
start.p_x = area->r_xbot; start.p_x = area->r_xbot;
start.p_y = area->r_ytop - 1; start.p_y = area->r_ytop - 1;
tile = PlaneGetHint(plane); tile = PlaneGetHint(plane);
@ -2186,14 +2193,14 @@ enumerate:
if (CANMERGE_Y(newtile, tp) && if (CANMERGE_Y(newtile, tp) &&
( (TiGetClient(tp) == TiGetClient(newtile)) || ( (TiGetClient(tp) == TiGetClient(newtile)) ||
( ! TTMaskHasType(tileMask, TiGetTypeExact(tp)) ) ) ) ( ! TTMaskHasType(tileMask, TiGetTypeExact(tp)) ) ) )
TiJoinY(newtile, tp, plane); TiJoinY1(&delayed, newtile, tp, plane);
/* Merge the outside tile to its bottom */ /* Merge the outside tile to its bottom */
tp = LB(newtile); tp = LB(newtile);
if (CANMERGE_Y(newtile, tp) && if (CANMERGE_Y(newtile, tp) &&
( (TiGetClient(tp) == TiGetClient(newtile)) || ( (TiGetClient(tp) == TiGetClient(newtile)) ||
( ! TTMaskHasType(tileMask, TiGetTypeExact(tp)) ) ) ) ( ! TTMaskHasType(tileMask, TiGetTypeExact(tp)) ) ) )
TiJoinY(newtile, tp, plane); TiJoinY1(&delayed, newtile, tp, plane);
} }
/* Clip left */ /* Clip left */
@ -2210,14 +2217,14 @@ enumerate:
if (CANMERGE_Y(newtile, tp) && if (CANMERGE_Y(newtile, tp) &&
( (TiGetClient(tp) == TiGetClient(newtile)) || ( (TiGetClient(tp) == TiGetClient(newtile)) ||
( ! TTMaskHasType(tileMask, TiGetTypeExact(tp)) ) ) ) ( ! TTMaskHasType(tileMask, TiGetTypeExact(tp)) ) ) )
TiJoinY(newtile, tp, plane); TiJoinY1(&delayed, newtile, tp, plane);
/* Merge the outside tile to its bottom */ /* Merge the outside tile to its bottom */
tp = LB(newtile); tp = LB(newtile);
if (CANMERGE_Y(newtile, tp) && if (CANMERGE_Y(newtile, tp) &&
( (TiGetClient(tp) == TiGetClient(newtile)) || ( (TiGetClient(tp) == TiGetClient(newtile)) ||
( ! TTMaskHasType(tileMask, TiGetTypeExact(tp)) ) ) ) ( ! TTMaskHasType(tileMask, TiGetTypeExact(tp)) ) ) )
TiJoinY(newtile, tp, plane); TiJoinY1(&delayed, newtile, tp, plane);
} }
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
@ -2276,7 +2283,7 @@ enumerate:
{ {
tp = RT(tile); tp = RT(tile);
if (CANMERGE_Y(tile, tp) && (tp->ti_client == client)) if (CANMERGE_Y(tile, tp) && (tp->ti_client == client))
TiJoinY(tile, tp, plane); TiJoinY1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "merged up (CHEAP)"); dbPaintShowTile(tile, undo, "merged up (CHEAP)");
@ -2286,7 +2293,7 @@ enumerate:
{ {
tp = LB(tile); tp = LB(tile);
if (CANMERGE_Y(tile, tp) && (tp->ti_client == client)) if (CANMERGE_Y(tile, tp) && (tp->ti_client == client))
TiJoinY(tile, tp, plane); TiJoinY1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "merged down (CHEAP)"); dbPaintShowTile(tile, undo, "merged down (CHEAP)");
@ -2334,6 +2341,7 @@ paintdone:
done: done:
PlaneSetHint(plane, tile); PlaneSetHint(plane, tile);
TiFreeIf(delayed);
} }
/* /*
@ -2380,6 +2388,7 @@ dbMergeType(tile, newType, plane, mergeFlags, undo, client)
PaintUndoInfo *undo; /* See DBPaintPlane() above */ PaintUndoInfo *undo; /* See DBPaintPlane() above */
ClientData client; ClientData client;
{ {
Tile *delayed = NULL; /* delayed free to extend lifetime */
Tile *tp, *tpLast; Tile *tp, *tpLast;
int ysplit; int ysplit;
@ -2481,7 +2490,7 @@ dbMergeType(tile, newType, plane, mergeFlags, undo, client)
TiSetClient(tpLast, client); TiSetClient(tpLast, client);
} }
if (BOTTOM(tp) < BOTTOM(tile)) tp = TiSplitY(tp, BOTTOM(tile)); if (BOTTOM(tp) < BOTTOM(tile)) tp = TiSplitY(tp, BOTTOM(tile));
TiJoinX(tile, tp, plane); TiJoinX1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged left"); dbPaintShowTile(tile, undo, "(DBMERGE) merged left");
@ -2497,7 +2506,7 @@ dbMergeType(tile, newType, plane, mergeFlags, undo, client)
TiSetClient(tpLast, client); TiSetClient(tpLast, client);
} }
if (BOTTOM(tp) < BOTTOM(tile)) tp = TiSplitY(tp, BOTTOM(tile)); if (BOTTOM(tp) < BOTTOM(tile)) tp = TiSplitY(tp, BOTTOM(tile));
TiJoinX(tile, tp, plane); TiJoinX1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged right"); dbPaintShowTile(tile, undo, "(DBMERGE) merged right");
@ -2506,7 +2515,7 @@ dbMergeType(tile, newType, plane, mergeFlags, undo, client)
if (mergeFlags&MRG_TOP) if (mergeFlags&MRG_TOP)
{ {
tp = RT(tile); tp = RT(tile);
if (CANMERGE_Y(tp, tile) && (tp->ti_client == client)) TiJoinY(tile, tp, plane); if (CANMERGE_Y(tp, tile) && (tp->ti_client == client)) TiJoinY1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged up"); dbPaintShowTile(tile, undo, "(DBMERGE) merged up");
@ -2515,13 +2524,14 @@ dbMergeType(tile, newType, plane, mergeFlags, undo, client)
if (mergeFlags&MRG_BOTTOM) if (mergeFlags&MRG_BOTTOM)
{ {
tp = LB(tile); tp = LB(tile);
if (CANMERGE_Y(tp, tile) && (tp->ti_client == client)) TiJoinY(tile, tp, plane); if (CANMERGE_Y(tp, tile) && (tp->ti_client == client)) TiJoinY1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged down"); dbPaintShowTile(tile, undo, "(DBMERGE) merged down");
#endif /* PAINTDEBUG */ #endif /* PAINTDEBUG */
} }
TiFreeIf(delayed);
return (tile); return (tile);
} }
@ -2581,6 +2591,7 @@ DBPaintPlaneVert(plane, area, resultTbl, undo)
* search. * search.
*/ */
Tile *delayed = NULL; /* delayed free to extend lifetime */
start.p_x = area->r_xbot; start.p_x = area->r_xbot;
start.p_y = area->r_ytop - 1; start.p_y = area->r_ytop - 1;
tile = PlaneGetHint(plane); tile = PlaneGetHint(plane);
@ -2662,11 +2673,11 @@ enumerate:
/* Merge the outside tile to its left */ /* Merge the outside tile to its left */
tp = BL(newtile); tp = BL(newtile);
if (CANMERGE_X(newtile, tp)) TiJoinX(newtile, tp, plane); if (CANMERGE_X(newtile, tp)) TiJoinX1(&delayed, newtile, tp, plane);
/* Merge the outside tile to its right */ /* Merge the outside tile to its right */
tp = TR(newtile); tp = TR(newtile);
if (CANMERGE_X(newtile, tp)) TiJoinX(newtile, tp, plane); if (CANMERGE_X(newtile, tp)) TiJoinX1(&delayed, newtile, tp, plane);
} }
/* Clip down */ /* Clip down */
@ -2678,11 +2689,11 @@ enumerate:
/* Merge the outside tile to its left */ /* Merge the outside tile to its left */
tp = BL(newtile); tp = BL(newtile);
if (CANMERGE_X(newtile, tp)) TiJoinX(newtile, tp, plane); if (CANMERGE_X(newtile, tp)) TiJoinX1(&delayed, newtile, tp, plane);
/* Merge the outside tile to its right */ /* Merge the outside tile to its right */
tp = TR(newtile); tp = TR(newtile);
if (CANMERGE_X(newtile, tp)) TiJoinX(newtile, tp, plane); if (CANMERGE_X(newtile, tp)) TiJoinX1(&delayed, newtile, tp, plane);
} }
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
@ -2740,7 +2751,7 @@ enumerate:
if (mergeFlags & MRG_LEFT) if (mergeFlags & MRG_LEFT)
{ {
tp = BL(tile); tp = BL(tile);
if (CANMERGE_X(tile, tp)) TiJoinX(tile, tp, plane); if (CANMERGE_X(tile, tp)) TiJoinX1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "merged left (CHEAP)"); dbPaintShowTile(tile, undo, "merged left (CHEAP)");
@ -2749,7 +2760,7 @@ enumerate:
if (mergeFlags & MRG_RIGHT) if (mergeFlags & MRG_RIGHT)
{ {
tp = TR(tile); tp = TR(tile);
if (CANMERGE_X(tile, tp)) TiJoinX(tile, tp, plane); if (CANMERGE_X(tile, tp)) TiJoinX1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "merged right (CHEAP)"); dbPaintShowTile(tile, undo, "merged right (CHEAP)");
@ -2797,6 +2808,7 @@ paintdone:
done: done:
PlaneSetHint(plane, tile); PlaneSetHint(plane, tile);
TiFreeIf(delayed);
return 0; return 0;
} }
@ -2849,6 +2861,7 @@ dbPaintMergeVert(tile, newType, plane, mergeFlags, undo)
int mergeFlags; /* Specify which directions to merge */ int mergeFlags; /* Specify which directions to merge */
PaintUndoInfo *undo; /* See DBPaintPlane() above */ PaintUndoInfo *undo; /* See DBPaintPlane() above */
{ {
Tile *delayed = NULL; /* delayed free to extend lifetime */
Tile *tp, *tpLast; Tile *tp, *tpLast;
int xsplit; int xsplit;
@ -2943,7 +2956,7 @@ dbPaintMergeVert(tile, newType, plane, mergeFlags, undo)
if (LEFT(tp) < LEFT(tile)) tp = TiSplitX(tp, LEFT(tile)); if (LEFT(tp) < LEFT(tile)) tp = TiSplitX(tp, LEFT(tile));
if (RIGHT(tp) > RIGHT(tile)) if (RIGHT(tp) > RIGHT(tile))
tpLast = TiSplitX(tp, RIGHT(tile)), TiSetBody(tpLast, newType); tpLast = TiSplitX(tp, RIGHT(tile)), TiSetBody(tpLast, newType);
TiJoinY(tile, tp, plane); TiJoinY1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged up"); dbPaintShowTile(tile, undo, "(DBMERGE) merged up");
@ -2956,7 +2969,7 @@ dbPaintMergeVert(tile, newType, plane, mergeFlags, undo)
if (LEFT(tp) < LEFT(tile)) tp = TiSplitX(tp, LEFT(tile)); if (LEFT(tp) < LEFT(tile)) tp = TiSplitX(tp, LEFT(tile));
if (RIGHT(tp) > RIGHT(tile)) if (RIGHT(tp) > RIGHT(tile))
tpLast = TiSplitX(tp, RIGHT(tile)), TiSetBody(tpLast, newType); tpLast = TiSplitX(tp, RIGHT(tile)), TiSetBody(tpLast, newType);
TiJoinY(tile, tp, plane); TiJoinY1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged down"); dbPaintShowTile(tile, undo, "(DBMERGE) merged down");
@ -2966,7 +2979,7 @@ dbPaintMergeVert(tile, newType, plane, mergeFlags, undo)
if (mergeFlags&MRG_LEFT) if (mergeFlags&MRG_LEFT)
{ {
tp = BL(tile); tp = BL(tile);
if (CANMERGE_X(tp, tile)) TiJoinX(tile, tp, plane); if (CANMERGE_X(tp, tile)) TiJoinX1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged left"); dbPaintShowTile(tile, undo, "(DBMERGE) merged left");
@ -2975,13 +2988,14 @@ dbPaintMergeVert(tile, newType, plane, mergeFlags, undo)
if (mergeFlags&MRG_RIGHT) if (mergeFlags&MRG_RIGHT)
{ {
tp = TR(tile); tp = TR(tile);
if (CANMERGE_X(tp, tile)) TiJoinX(tile, tp, plane); if (CANMERGE_X(tp, tile)) TiJoinX1(&delayed, tile, tp, plane);
#ifdef PAINTDEBUG #ifdef PAINTDEBUG
if (dbPaintDebug) if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged right"); dbPaintShowTile(tile, undo, "(DBMERGE) merged right");
#endif /* PAINTDEBUG */ #endif /* PAINTDEBUG */
} }
TiFreeIf(delayed);
return (tile); return (tile);
} }
@ -3316,6 +3330,7 @@ TiNMMergeRight(tile, plane)
Tile *tile; Tile *tile;
Plane *plane; Plane *plane;
{ {
Tile *delayed = NULL; /* delayed free to extend lifetime */
TileType ttype = TiGetTypeExact(tile); TileType ttype = TiGetTypeExact(tile);
Tile *tp, *tp2, *newtile; Tile *tp, *tp2, *newtile;
@ -3347,7 +3362,7 @@ TiNMMergeRight(tile, plane)
else else
newtile = tile; newtile = tile;
// Join tp to newtile // Join tp to newtile
TiJoinX(newtile, tp, plane); TiJoinX1(&delayed, newtile, tp, plane);
} }
tp = tp2; tp = tp2;
} }
@ -3364,11 +3379,13 @@ TiNMMergeRight(tile, plane)
newtile = TiSplitY(tp, BOTTOM(tile)); newtile = TiSplitY(tp, BOTTOM(tile));
TiSetBody(newtile, ttype); TiSetBody(newtile, ttype);
// join newtile to tile // join newtile to tile
TiJoinX(tile, newtile, plane); TiJoinX1(&delayed, tile, newtile, plane);
// merge up if possible // merge up if possible
if (CANMERGE_Y(tile, RT(tile))) TiJoinY(tile, RT(tile), plane); if (CANMERGE_Y(tile, RT(tile))) TiJoinY1(&delayed, tile, RT(tile), plane);
} }
} }
TiFreeIf(delayed);
return tile; return tile;
} }
@ -3396,6 +3413,7 @@ TiNMMergeLeft(tile, plane)
Tile *tile; Tile *tile;
Plane *plane; Plane *plane;
{ {
Tile *delayed = NULL; /* delayed free to extend lifetime */
TileType ttype = TiGetTypeExact(tile); TileType ttype = TiGetTypeExact(tile);
Tile *tp, *tp2, *newtile; Tile *tp, *tp2, *newtile;
@ -3428,7 +3446,7 @@ TiNMMergeLeft(tile, plane)
else else
newtile = tile; newtile = tile;
// Join tp to tile // Join tp to tile
TiJoinX(tile, tp, plane); TiJoinX1(&delayed, tile, tp, plane);
tile = newtile; tile = newtile;
} }
tp = tp2; tp = tp2;
@ -3446,14 +3464,16 @@ TiNMMergeLeft(tile, plane)
newtile = TiSplitY(tp, TOP(tile)); newtile = TiSplitY(tp, TOP(tile));
TiSetBody(newtile, ttype); TiSetBody(newtile, ttype);
// join tp to tile // join tp to tile
TiJoinX(tile, tp, plane); TiJoinX1(&delayed, tile, tp, plane);
} }
} }
else else
{ {
// Merge up if possible // Merge up if possible
if (CANMERGE_Y(tile, tp)) TiJoinY(tile, tp, plane); if (CANMERGE_Y(tile, tp)) TiJoinY1(&delayed, tile, tp, plane);
} }
TiFreeIf(delayed);
return tile; return tile;
} }

View File

@ -571,6 +571,7 @@ glChanMergeFunc(tile)
Tile *tile; Tile *tile;
{ {
GCRChannel *ch = (GCRChannel *) tile->ti_client; GCRChannel *ch = (GCRChannel *) tile->ti_client;
Tile *delayed = NULL; /* delayed free to extend lifetime */
Tile *tp; Tile *tp;
int ret; int ret;
@ -582,7 +583,7 @@ glChanMergeFunc(tile)
&& LEFT(tp) == LEFT(tile) && LEFT(tp) == LEFT(tile)
&& RIGHT(tp) == RIGHT(tile)) && RIGHT(tp) == RIGHT(tile))
{ {
TiJoinY(tile, tp, glChanPlane); TiJoinY1(&delayed, tile, tp, glChanPlane);
ret = 1; ret = 1;
} }
} }
@ -593,7 +594,7 @@ glChanMergeFunc(tile)
&& TOP(tp) == TOP(tile) && TOP(tp) == TOP(tile)
&& BOTTOM(tp) == BOTTOM(tile)) && BOTTOM(tp) == BOTTOM(tile))
{ {
TiJoinX(tile, tp, glChanPlane); TiJoinX1(&delayed, tile, tp, glChanPlane);
ret = 1; ret = 1;
} }
} }
@ -604,7 +605,7 @@ glChanMergeFunc(tile)
&& LEFT(tp) == LEFT(tile) && LEFT(tp) == LEFT(tile)
&& RIGHT(tp) == RIGHT(tile)) && RIGHT(tp) == RIGHT(tile))
{ {
TiJoinY(tile, tp, glChanPlane); TiJoinY1(&delayed, tile, tp, glChanPlane);
ret = 1; ret = 1;
} }
} }
@ -615,11 +616,12 @@ glChanMergeFunc(tile)
&& TOP(tp) == TOP(tile) && TOP(tp) == TOP(tile)
&& BOTTOM(tp) == BOTTOM(tile)) && BOTTOM(tp) == BOTTOM(tile))
{ {
TiJoinX(tile, tp, glChanPlane); TiJoinX1(&delayed, tile, tp, glChanPlane);
ret = 1; ret = 1;
} }
} }
TiFreeIf(delayed);
return ret; return ret;
} }

View File

@ -153,7 +153,7 @@ bool plowPropagateSel();
bool plowPropagateRect(CellDef *def, Rect *userRect, const TileTypeBitMask *lcp, Rect *changedArea); bool plowPropagateRect(CellDef *def, Rect *userRect, const TileTypeBitMask *lcp, Rect *changedArea);
PlowRule *plowBuildWidthRules(); PlowRule *plowBuildWidthRules();
void plowMergeBottom(Tile *, Plane *); void plowMergeBottom(Tile **delay1, Tile *tp, Plane *plane);
void plowInitRule(RuleTableEntry *rtePtr, RuleTableEntry *rteEnd, int whichRules, int (*proc)(), const char *name, void plowInitRule(RuleTableEntry *rtePtr, RuleTableEntry *rteEnd, int whichRules, int (*proc)(), const char *name,
const TileTypeBitMask *ltypesp, const TileTypeBitMask *rtypesp); const TileTypeBitMask *ltypesp, const TileTypeBitMask *rtypesp);
@ -163,7 +163,7 @@ extern void plowUpdate();
extern void plowSetTrans(); extern void plowSetTrans();
extern void plowProcessEdge(); extern void plowProcessEdge();
extern void plowMoveEdge(); extern void plowMoveEdge();
extern void plowMergeTop(); extern void plowMergeTop(Tile **delay1, Tile *tp, Plane *plane);
extern void plowYankCreate(); extern void plowYankCreate();
@ -1829,6 +1829,7 @@ plowMoveEdge(edge)
Edge *edge; /* Edge to be moved */ Edge *edge; /* Edge to be moved */
{ {
Plane *plane = plowYankDef->cd_planes[edge->e_pNum]; Plane *plane = plowYankDef->cd_planes[edge->e_pNum];
Tile *delayed = NULL; /* delayed free to extend lifetime */
Tile *tp, *tpL; Tile *tp, *tpL;
Point p; Point p;
@ -1863,7 +1864,7 @@ plowMoveEdge(edge)
{ {
if (TRAILING(tp) < edge->e_newx) if (TRAILING(tp) < edge->e_newx)
plowSetTrailing(tp, edge->e_newx); plowSetTrailing(tp, edge->e_newx);
plowMergeTop(tp, plane); plowMergeTop(&delayed, tp, plane);
} }
/* /*
@ -1886,18 +1887,18 @@ plowMoveEdge(edge)
/* Merge (no clipping was necessary) */ /* Merge (no clipping was necessary) */
tpL = BL(tp); tpL = BL(tp);
plowSetTrailing(tp, edge->e_newx); plowSetTrailing(tp, edge->e_newx);
plowMergeBottom(tp, plane); plowMergeBottom(&delayed, tp, plane);
} }
/* Split the bottom-left tile if necessary; otherwise, merge down */ /* Split the bottom-left tile if necessary; otherwise, merge down */
if (BOTTOM(tpL) < edge->e_ybot) if (BOTTOM(tpL) < edge->e_ybot)
tpL = plowSplitY(tpL, edge->e_ybot); /* TpL is upper tile */ tpL = plowSplitY(tpL, edge->e_ybot); /* TpL is upper tile */
else else
plowMergeBottom(tpL, plane); plowMergeBottom(&delayed, tpL, plane);
} }
else for (tpL = BL(tp); TOP(tpL) <= edge->e_ybot; tpL = RT(tpL)) else for (tpL = BL(tp); TOP(tpL) <= edge->e_ybot; tpL = RT(tpL))
/* Nothing */; /* Nothing */;
plowMergeTop(tp, plane); plowMergeTop(&delayed, tp, plane);
/* /*
* Now 'tpL' is the bottom-left tile, which has already been merged * Now 'tpL' is the bottom-left tile, which has already been merged
@ -1905,7 +1906,7 @@ plowMoveEdge(edge)
* each tile with its lower neighbor. * each tile with its lower neighbor.
*/ */
for (tp = RT(tpL); BOTTOM(tp) < edge->e_ytop; tp = RT(tp)) for (tp = RT(tpL); BOTTOM(tp) < edge->e_ytop; tp = RT(tp))
plowMergeBottom(tp, plane); plowMergeBottom(&delayed, tp, plane);
/* /*
* If tp now extends above edge->e_ytop, then it must not have been split * If tp now extends above edge->e_ytop, then it must not have been split
@ -1914,10 +1915,12 @@ plowMoveEdge(edge)
* not changed. Hence, we needn't try to merge to its bottom. * not changed. Hence, we needn't try to merge to its bottom.
*/ */
if (BOTTOM(tp) == edge->e_ytop) if (BOTTOM(tp) == edge->e_ytop)
plowMergeBottom(tp, plane); plowMergeBottom(&delayed, tp, plane);
if (DebugIsSet(plowDebugID, plowDebMove)) if (DebugIsSet(plowDebugID, plowDebMove))
plowDebugEdge(edge, (RuleTableEntry *) NULL, "move"); plowDebugEdge(edge, (RuleTableEntry *) NULL, "move");
TiFreeIf(delayed);
} }
/* /*
@ -1979,9 +1982,7 @@ plowSplitY(tp, y)
*/ */
void void
plowMergeTop(tp, plane) plowMergeTop(Tile **delay1, Tile *tp, Plane *plane)
Tile *tp;
Plane *plane;
{ {
Tile *tpRT = RT(tp); Tile *tpRT = RT(tp);
@ -1989,14 +1990,12 @@ plowMergeTop(tp, plane)
&& LEFT(tp) == LEFT(tpRT) && RIGHT(tp) == RIGHT(tpRT) && LEFT(tp) == LEFT(tpRT) && RIGHT(tp) == RIGHT(tpRT)
&& LEADING(tp) == LEADING(tpRT) && TRAILING(tp) == TRAILING(tpRT)) && LEADING(tp) == LEADING(tpRT) && TRAILING(tp) == TRAILING(tpRT))
{ {
TiJoinY(tp, tpRT, plane); TiJoinY1(delay1, tp, tpRT, plane);
} }
} }
void void
plowMergeBottom(tp, plane) plowMergeBottom(Tile **delay1, Tile *tp, Plane *plane)
Tile *tp;
Plane *plane;
{ {
Tile *tpLB = LB(tp); Tile *tpLB = LB(tp);
@ -2004,7 +2003,7 @@ plowMergeBottom(tp, plane)
&& LEFT(tp) == LEFT(tpLB) && RIGHT(tp) == RIGHT(tpLB) && LEFT(tp) == LEFT(tpLB) && RIGHT(tp) == RIGHT(tpLB)
&& LEADING(tp) == LEADING(tpLB) && TRAILING(tp) == TRAILING(tpLB)) && LEADING(tp) == LEADING(tpLB) && TRAILING(tp) == TRAILING(tpLB))
{ {
TiJoinY(tp, tpLB, plane); TiJoinY1(delay1, tp, tpLB, plane);
} }
} }

View File

@ -438,6 +438,7 @@ ResSplitX(tile, x)
int x; int x;
{ {
Tile *delayed = NULL; /* delayed free to extend lifetime */
TileType tt = TiGetType(tile); TileType tt = TiGetType(tile);
Tile *tp = TiSplitX(tile, x); Tile *tp = TiSplitX(tile, x);
Tile *tp2; Tile *tp2;
@ -450,13 +451,13 @@ ResSplitX(tile, x)
if (tp2 == resSrTile) if (tp2 == resSrTile)
{ {
if (resTopTile == tile) resTopTile = NULL; if (resTopTile == tile) resTopTile = NULL;
TiJoinY(tp2, tile, resFracPlane); TiJoinY1(&delayed, tp2, tile, resFracPlane);
tile = tp2; tile = tp2;
} }
else else
{ {
if (resTopTile == tp2) resTopTile = NULL; if (resTopTile == tp2) resTopTile = NULL;
TiJoinY(tile, tp2, resFracPlane); TiJoinY1(&delayed, tile, tp2, resFracPlane);
} }
} }
tp2 = LB(tile); tp2 = LB(tile);
@ -465,26 +466,28 @@ ResSplitX(tile, x)
if (tp2 == resSrTile) if (tp2 == resSrTile)
{ {
if (resTopTile == tile) resTopTile = NULL; if (resTopTile == tile) resTopTile = NULL;
TiJoinY(tp2, tile, resFracPlane); TiJoinY1(&delayed, tp2, tile, resFracPlane);
tile = tp2; tile = tp2;
} }
else else
{ {
if (resTopTile == tp2) resTopTile = NULL; if (resTopTile == tp2) resTopTile = NULL;
TiJoinY(tile, tp2, resFracPlane); TiJoinY1(&delayed, tile, tp2, resFracPlane);
} }
} }
/* do the same checks with the newly created tile */ /* do the same checks with the newly created tile */
tp2 = RT(tp); tp2 = RT(tp);
if (TiGetType(tp2) == tt && LEFT(tp2) == LEFT(tp) && RIGHT(tp2) == RIGHT(tp)) if (TiGetType(tp2) == tt && LEFT(tp2) == LEFT(tp) && RIGHT(tp2) == RIGHT(tp))
{ {
TiJoinY(tp2, tp, resFracPlane); TiJoinY1(&delayed, tp2, tp, resFracPlane);
tp = tp2; tp = tp2;
} }
tp2 = LB(tp); tp2 = LB(tp);
if (TiGetType(tp2) == tt && LEFT(tp2) == LEFT(tp) && RIGHT(tp2) == RIGHT(tp)) if (TiGetType(tp2) == tt && LEFT(tp2) == LEFT(tp) && RIGHT(tp2) == RIGHT(tp))
{ {
TiJoinY(tp2, tp, resFracPlane); TiJoinY1(&delayed, tp2, tp, resFracPlane);
} }
TiFreeIf(delayed);
return tile; return tile;
} }

View File

@ -79,7 +79,7 @@ extern void rtrRoundRect();
extern void rtrHashKill(); extern void rtrHashKill();
extern void rtrSplitToArea(); extern void rtrSplitToArea();
extern void rtrMarkChannel(); extern void rtrMarkChannel();
extern void rtrMerge(); extern void rtrMerge(Tile **delay1, Tile *tup, Tile *tdn, Plane *plane);
bool rtrUseCorner(); bool rtrUseCorner();
@ -775,6 +775,7 @@ rtrMarkChannel(plane, tiles, point, corner)
} }
else /* Choose the vertical boundary */ else /* Choose the vertical boundary */
{ {
Tile *delayed = NULL; /* delayed free to extend lifetime */
/* /*
* Split a sequence of space tiles starting with tiles[0] * Split a sequence of space tiles starting with tiles[0]
* (the bottom tile), for yDist at the point->p_y. * (the bottom tile), for yDist at the point->p_y.
@ -810,8 +811,8 @@ rtrMarkChannel(plane, tiles, point, corner)
rtrCLEAR(tile, rtrSE); rtrCLEAR(tile, rtrSE);
/* Merge tile and new with lower neighbors if possible */ /* Merge tile and new with lower neighbors if possible */
rtrMerge(new, LB(new), plane); rtrMerge(&delayed, new, LB(new), plane);
rtrMerge(tile, LB(tile), plane); rtrMerge(&delayed, tile, LB(tile), plane);
/* Find next (higher) tile to split */ /* Find next (higher) tile to split */
if (TOP(tile) >= lastY) break; if (TOP(tile) >= lastY) break;
@ -820,8 +821,9 @@ rtrMarkChannel(plane, tiles, point, corner)
} }
/* Merge new and tile with upper neighbors if possible */ /* Merge new and tile with upper neighbors if possible */
rtrMerge(RT(new), new, plane); rtrMerge(&delayed, RT(new), new, plane);
rtrMerge(RT(tile), tile, plane); rtrMerge(&delayed, RT(tile), tile, plane);
TiFreeIf(delayed);
} }
} }
@ -983,9 +985,7 @@ rtrXDist(tiles, x, isRight)
*/ */
void void
rtrMerge(tup, tdn, plane) rtrMerge(Tile **delay1, Tile *tup, Tile *tdn, Plane *plane)
Tile *tup, *tdn;
Plane *plane;
{ {
Tile *side; Tile *side;
@ -1006,7 +1006,7 @@ rtrMerge(tup, tdn, plane)
if (rtrMARKED(tdn, rtrSW)) rtrMARK(tup, rtrSW); else rtrCLEAR(tup, rtrSW); if (rtrMARKED(tdn, rtrSW)) rtrMARK(tup, rtrSW); else rtrCLEAR(tup, rtrSW);
if (rtrMARKED(tdn, rtrSE)) rtrMARK(tup, rtrSE); else rtrCLEAR(tup, rtrSE); if (rtrMARKED(tdn, rtrSE)) rtrMARK(tup, rtrSE); else rtrCLEAR(tup, rtrSE);
TiJoinY(tup, tdn, plane); TiJoinY1(delay1, tup, tdn, plane);
/* /*
* Merge sideways if the result of the join matches a tile on either side, * Merge sideways if the result of the join matches a tile on either side,
@ -1017,12 +1017,12 @@ rtrMerge(tup, tdn, plane)
&& LEFT(side) >= RouteArea.r_xbot && LEFT(side) >= RouteArea.r_xbot
&& TOP(side) == TOP(tup) && TOP(side) == TOP(tup)
&& BOTTOM(side) == BOTTOM(tup)) && BOTTOM(side) == BOTTOM(tup))
TiJoinX(tup, side, plane); TiJoinX1(delay1, tup, side, plane);
side = TR(tup); side = TR(tup);
if (TiGetBody(side) == (ClientData) NULL if (TiGetBody(side) == (ClientData) NULL
&& RIGHT(side) <= RouteArea.r_xtop && RIGHT(side) <= RouteArea.r_xtop
&& TOP(side) == TOP(tup) && TOP(side) == TOP(tup)
&& BOTTOM(side) == BOTTOM(tup)) && BOTTOM(side) == BOTTOM(tup))
TiJoinX(tup, side, plane); TiJoinX1(delay1, tup, side, plane);
} }