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:
parent
e403e92017
commit
94a6daa9b0
|
|
@ -105,7 +105,7 @@ drcArrayFunc(scx, arg)
|
||||||
int xsep, ysep;
|
int xsep, ysep;
|
||||||
int xsize, ysize;
|
int xsize, ysize;
|
||||||
int rval, oldTiles;
|
int rval, oldTiles;
|
||||||
Rect errorArea, yankArea, tmp, tmp2;
|
Rect errorArea, yankArea, tmp, tmp2, saveClip;
|
||||||
DRCCookie *save_cptr;
|
DRCCookie *save_cptr;
|
||||||
CellUse *use = scx->scx_use;
|
CellUse *use = scx->scx_use;
|
||||||
Rect *area;
|
Rect *area;
|
||||||
|
|
@ -183,6 +183,8 @@ drcArrayFunc(scx, arg)
|
||||||
(ClientData) &yankArea);
|
(ClientData) &yankArea);
|
||||||
drcArrayCount += DRCBasicCheck(DRCdef, &yankArea, &errorArea,
|
drcArrayCount += DRCBasicCheck(DRCdef, &yankArea, &errorArea,
|
||||||
drcArrayErrorFunc, drcArrayClientData);
|
drcArrayErrorFunc, drcArrayClientData);
|
||||||
|
*arg->dCD_clip = *area;
|
||||||
|
GeoClip(arg->dCD_clip, &yankArea);
|
||||||
(void) DBArraySr(use, &errorArea, drcArrayOverlapFunc,
|
(void) DBArraySr(use, &errorArea, drcArrayOverlapFunc,
|
||||||
(ClientData) arg);
|
(ClientData) arg);
|
||||||
}
|
}
|
||||||
|
|
@ -200,6 +202,8 @@ drcArrayFunc(scx, arg)
|
||||||
(ClientData) &yankArea);
|
(ClientData) &yankArea);
|
||||||
drcArrayCount += DRCBasicCheck(DRCdef, &yankArea, &errorArea,
|
drcArrayCount += DRCBasicCheck(DRCdef, &yankArea, &errorArea,
|
||||||
drcArrayErrorFunc, drcArrayClientData);
|
drcArrayErrorFunc, drcArrayClientData);
|
||||||
|
*arg->dCD_clip = *area;
|
||||||
|
GeoClip(arg->dCD_clip, &yankArea);
|
||||||
(void) DBArraySr(use, &errorArea, drcArrayOverlapFunc,
|
(void) DBArraySr(use, &errorArea, drcArrayOverlapFunc,
|
||||||
(ClientData) arg);
|
(ClientData) arg);
|
||||||
}
|
}
|
||||||
|
|
@ -222,6 +226,8 @@ drcArrayFunc(scx, arg)
|
||||||
(ClientData) &yankArea);
|
(ClientData) &yankArea);
|
||||||
drcArrayCount += DRCBasicCheck(DRCdef, &yankArea, &errorArea,
|
drcArrayCount += DRCBasicCheck(DRCdef, &yankArea, &errorArea,
|
||||||
drcArrayErrorFunc, drcArrayClientData);
|
drcArrayErrorFunc, drcArrayClientData);
|
||||||
|
*arg->dCD_clip = *area;
|
||||||
|
GeoClip(arg->dCD_clip, &yankArea);
|
||||||
(void) DBArraySr(use, &errorArea, drcArrayOverlapFunc,
|
(void) DBArraySr(use, &errorArea, drcArrayOverlapFunc,
|
||||||
(ClientData) arg);
|
(ClientData) arg);
|
||||||
}
|
}
|
||||||
|
|
@ -239,11 +245,16 @@ drcArrayFunc(scx, arg)
|
||||||
(ClientData) &yankArea);
|
(ClientData) &yankArea);
|
||||||
drcArrayCount += DRCBasicCheck(DRCdef, &yankArea, &errorArea,
|
drcArrayCount += DRCBasicCheck(DRCdef, &yankArea, &errorArea,
|
||||||
drcArrayErrorFunc, drcArrayClientData);
|
drcArrayErrorFunc, drcArrayClientData);
|
||||||
|
*arg->dCD_clip = *area;
|
||||||
|
GeoClip(arg->dCD_clip, &yankArea);
|
||||||
(void) DBArraySr(use, &errorArea, drcArrayOverlapFunc,
|
(void) DBArraySr(use, &errorArea, drcArrayOverlapFunc,
|
||||||
(ClientData) arg);
|
(ClientData) arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Restore original clip rect */
|
||||||
|
*arg->dCD_clip = *area;
|
||||||
|
|
||||||
(void) DBNewPaintTable(savedPaintTable);
|
(void) DBNewPaintTable(savedPaintTable);
|
||||||
(void) DBNewPaintPlane(savedPaintPlane);
|
(void) DBNewPaintPlane(savedPaintPlane);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -539,13 +539,23 @@ drcExactOverlapTile(tile, cxp)
|
||||||
|
|
||||||
type = TiGetType(tile);
|
type = TiGetType(tile);
|
||||||
TTMaskSetOnlyType(&typeMask, type);
|
TTMaskSetOnlyType(&typeMask, type);
|
||||||
for (t = DBNumUserLayers; t < DBNumTypes; t++)
|
if (type < DBNumUserLayers)
|
||||||
{
|
{
|
||||||
rmask = DBResidueMask(t);
|
for (t = DBNumUserLayers; t < DBNumTypes; t++)
|
||||||
if (TTMaskHasType(rmask, type))
|
{
|
||||||
TTMaskSetType(&typeMask, 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++)
|
for (i = PL_TECHDEPBASE; i < DBNumPlanes; i++)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue