mirror of
https://github.com/RTimothyEdwards/magic.git
synced 2026-10-06 01:43:00 +02:00
Corrected the array DRC checking, which was clipping to the error
area + halo but then failing to limit overlap checks to that clip area, resulting in bizarre errors whenever an array is made. Not sure why the error didn't show up more often.
This commit is contained in:
+12
-1
@@ -105,7 +105,7 @@ drcArrayFunc(scx, arg)
|
||||
int xsep, ysep;
|
||||
int xsize, ysize;
|
||||
int rval, oldTiles;
|
||||
Rect errorArea, yankArea, tmp, tmp2;
|
||||
Rect errorArea, yankArea, tmp, tmp2, saveClip;
|
||||
DRCCookie *save_cptr;
|
||||
CellUse *use = scx->scx_use;
|
||||
Rect *area;
|
||||
@@ -183,6 +183,8 @@ drcArrayFunc(scx, arg)
|
||||
(ClientData) &yankArea);
|
||||
drcArrayCount += DRCBasicCheck(DRCdef, &yankArea, &errorArea,
|
||||
drcArrayErrorFunc, drcArrayClientData);
|
||||
*arg->dCD_clip = *area;
|
||||
GeoClip(arg->dCD_clip, &yankArea);
|
||||
(void) DBArraySr(use, &errorArea, drcArrayOverlapFunc,
|
||||
(ClientData) arg);
|
||||
}
|
||||
@@ -200,6 +202,8 @@ drcArrayFunc(scx, arg)
|
||||
(ClientData) &yankArea);
|
||||
drcArrayCount += DRCBasicCheck(DRCdef, &yankArea, &errorArea,
|
||||
drcArrayErrorFunc, drcArrayClientData);
|
||||
*arg->dCD_clip = *area;
|
||||
GeoClip(arg->dCD_clip, &yankArea);
|
||||
(void) DBArraySr(use, &errorArea, drcArrayOverlapFunc,
|
||||
(ClientData) arg);
|
||||
}
|
||||
@@ -222,6 +226,8 @@ drcArrayFunc(scx, arg)
|
||||
(ClientData) &yankArea);
|
||||
drcArrayCount += DRCBasicCheck(DRCdef, &yankArea, &errorArea,
|
||||
drcArrayErrorFunc, drcArrayClientData);
|
||||
*arg->dCD_clip = *area;
|
||||
GeoClip(arg->dCD_clip, &yankArea);
|
||||
(void) DBArraySr(use, &errorArea, drcArrayOverlapFunc,
|
||||
(ClientData) arg);
|
||||
}
|
||||
@@ -239,11 +245,16 @@ drcArrayFunc(scx, arg)
|
||||
(ClientData) &yankArea);
|
||||
drcArrayCount += DRCBasicCheck(DRCdef, &yankArea, &errorArea,
|
||||
drcArrayErrorFunc, drcArrayClientData);
|
||||
*arg->dCD_clip = *area;
|
||||
GeoClip(arg->dCD_clip, &yankArea);
|
||||
(void) DBArraySr(use, &errorArea, drcArrayOverlapFunc,
|
||||
(ClientData) arg);
|
||||
}
|
||||
}
|
||||
|
||||
/* Restore original clip rect */
|
||||
*arg->dCD_clip = *area;
|
||||
|
||||
(void) DBNewPaintTable(savedPaintTable);
|
||||
(void) DBNewPaintPlane(savedPaintPlane);
|
||||
|
||||
|
||||
+15
-5
@@ -539,13 +539,23 @@ drcExactOverlapTile(tile, cxp)
|
||||
|
||||
type = TiGetType(tile);
|
||||
TTMaskSetOnlyType(&typeMask, type);
|
||||
for (t = DBNumUserLayers; t < DBNumTypes; t++)
|
||||
if (type < DBNumUserLayers)
|
||||
{
|
||||
rmask = DBResidueMask(t);
|
||||
if (TTMaskHasType(rmask, type))
|
||||
TTMaskSetType(&typeMask, t);
|
||||
for (t = DBNumUserLayers; t < DBNumTypes; t++)
|
||||
{
|
||||
rmask = DBResidueMask(t);
|
||||
if (TTMaskHasType(rmask, type))
|
||||
TTMaskSetType(&typeMask, t);
|
||||
}
|
||||
TTMaskCom2(&invMask, &typeMask);
|
||||
}
|
||||
else
|
||||
{
|
||||
rmask = DBResidueMask(type);
|
||||
TTMaskSetMask(&typeMask, rmask); // Add residue types for inverse only
|
||||
TTMaskCom2(&invMask, &typeMask);
|
||||
TTMaskSetOnlyType(&typeMask, type); // Restore original type mask
|
||||
}
|
||||
TTMaskCom2(&invMask, &typeMask);
|
||||
|
||||
for (i = PL_TECHDEPBASE; i < DBNumPlanes; i++)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user