Modified the "bloat-all" cifoutput operator to allow operations on
templayers. This permits some useful interactions like growing to the size of a bounding box, or abutment box, as well as many other possibilities. Also: Corrected the use of "cif see" for the boundary (abutment box) layer, which was not working because the "cif see" command uses a flattened CellDef that does not have the boundary property of the cell it was flattened from.
This commit is contained in:
parent
a908893ae3
commit
3203eec28c
|
|
@ -998,7 +998,7 @@ calmaOutFunc(def, f, cliprect)
|
||||||
/* Output all the tiles associated with this cell; skip temporary layers */
|
/* Output all the tiles associated with this cell; skip temporary layers */
|
||||||
GEO_EXPAND(&def->cd_bbox, CIFCurStyle->cs_radius, &bigArea);
|
GEO_EXPAND(&def->cd_bbox, CIFCurStyle->cs_radius, &bigArea);
|
||||||
CIFErrorDef = def;
|
CIFErrorDef = def;
|
||||||
CIFGen(def, &bigArea, CIFPlanes, &DBAllTypeBits, TRUE, TRUE, (ClientData) f);
|
CIFGen(def, def, &bigArea, CIFPlanes, &DBAllTypeBits, TRUE, TRUE, (ClientData) f);
|
||||||
if (!CIFHierWriteDisable)
|
if (!CIFHierWriteDisable)
|
||||||
CIFGenSubcells(def, &bigArea, CIFPlanes);
|
CIFGenSubcells(def, &bigArea, CIFPlanes);
|
||||||
if (!CIFArrayWriteDisable)
|
if (!CIFArrayWriteDisable)
|
||||||
|
|
|
||||||
56
cif/CIFgen.c
56
cif/CIFgen.c
|
|
@ -1051,6 +1051,7 @@ cifFoundFunc(tile, BloatStackPtr)
|
||||||
typedef struct _bloatStruct {
|
typedef struct _bloatStruct {
|
||||||
CIFOp *op;
|
CIFOp *op;
|
||||||
CellDef *def;
|
CellDef *def;
|
||||||
|
Plane **temps;
|
||||||
} BloatStruct;
|
} BloatStruct;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1080,21 +1081,24 @@ cifBloatAllFunc(tile, bls)
|
||||||
Rect area;
|
Rect area;
|
||||||
TileTypeBitMask connect;
|
TileTypeBitMask connect;
|
||||||
Tile *t, *tp;
|
Tile *t, *tp;
|
||||||
TileType type;
|
TileType type, ttype;
|
||||||
BloatData *bloats;
|
BloatData *bloats;
|
||||||
int i, locScale;
|
int i, locScale;
|
||||||
PlaneMask pmask;
|
PlaneMask pmask;
|
||||||
CIFOp *op;
|
CIFOp *op;
|
||||||
CellDef *def;
|
CellDef *def;
|
||||||
|
Plane **temps;
|
||||||
static Stack *BloatStack = (Stack *)NULL;
|
static Stack *BloatStack = (Stack *)NULL;
|
||||||
|
|
||||||
op = bls->op;
|
op = bls->op;
|
||||||
def = bls->def;
|
def = bls->def;
|
||||||
|
temps = bls->temps;
|
||||||
bloats = (BloatData *)op->co_client;
|
bloats = (BloatData *)op->co_client;
|
||||||
|
|
||||||
/* Create a mask of all connecting types (these must be in a single
|
/* Create a mask of all connecting types (these must be in a single
|
||||||
* plane), then call a search function to find all connecting material
|
* plane), then call a search function to find all connecting material
|
||||||
* of these types.
|
* of these types (if the bloat types are temp layers, then this mask
|
||||||
|
* is not used).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
TTMaskZero(&connect);
|
TTMaskZero(&connect);
|
||||||
|
|
@ -1117,6 +1121,9 @@ cifBloatAllFunc(tile, bls)
|
||||||
if (type == CIF_SOLIDTYPE)
|
if (type == CIF_SOLIDTYPE)
|
||||||
{
|
{
|
||||||
pmask = 0;
|
pmask = 0;
|
||||||
|
if (bloats->bl_isCif == TRUE)
|
||||||
|
locScale = 1;
|
||||||
|
else
|
||||||
locScale = (CIFCurStyle) ? CIFCurStyle->cs_scaleFactor : 1;
|
locScale = (CIFCurStyle) ? CIFCurStyle->cs_scaleFactor : 1;
|
||||||
|
|
||||||
/* Get the tile into magic database coordinates if it's in CIF coords */
|
/* Get the tile into magic database coordinates if it's in CIF coords */
|
||||||
|
|
@ -1129,13 +1136,40 @@ cifBloatAllFunc(tile, bls)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int pNum = DBPlane(type);
|
int pNum = DBPlane(type);
|
||||||
pmask = CoincidentPlanes(&connect, PlaneNumToMaskBit(pNum));
|
pmask = (bloats->bl_isCif == TRUE) ? 0 :
|
||||||
|
CoincidentPlanes(&connect, PlaneNumToMaskBit(pNum));
|
||||||
if (pmask == 0) TiToRect(tile, &area);
|
if (pmask == 0) TiToRect(tile, &area);
|
||||||
|
if (bloats->bl_isCif == TRUE)
|
||||||
|
{
|
||||||
|
/* Get the tile into CIF database coordinates if it's in magic coords */
|
||||||
|
area.r_xbot *= cifScale;
|
||||||
|
area.r_xtop *= cifScale;
|
||||||
|
area.r_ybot *= cifScale;
|
||||||
|
area.r_ytop *= cifScale;
|
||||||
|
locScale = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
locScale = cifScale;
|
locScale = cifScale;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (pmask == 0)
|
if (pmask == 0)
|
||||||
|
{
|
||||||
|
if (bloats->bl_isCif)
|
||||||
|
{
|
||||||
|
/* This expands the area to the OR of all temp layers specified */
|
||||||
|
/* which may or may not be useful; normally one would expand */
|
||||||
|
/* into a single layer if a temp layer is specified. */
|
||||||
|
|
||||||
|
for (ttype = 0; ttype < TT_MAXTYPES; ttype++, temps++)
|
||||||
|
if (bloats->bl_distance[ttype] > 0)
|
||||||
|
(void) DBSrPaintArea((Tile *)NULL, *temps, &area,
|
||||||
|
&CIFSolidBits, cifFoundFunc, (ClientData)(&BloatStack));
|
||||||
|
}
|
||||||
|
else
|
||||||
DBSrPaintArea((Tile *)NULL, def->cd_planes[bloats->bl_plane], &area,
|
DBSrPaintArea((Tile *)NULL, def->cd_planes[bloats->bl_plane], &area,
|
||||||
&connect, cifFoundFunc, (ClientData)(&BloatStack));
|
&connect, cifFoundFunc, (ClientData)(&BloatStack));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
PUSHTILE(t, BloatStack);
|
PUSHTILE(t, BloatStack);
|
||||||
|
|
||||||
|
|
@ -3127,7 +3161,7 @@ cifSrTiles(cifOp, area, cellDef, temps, func, cdArg)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Plane *
|
Plane *
|
||||||
CIFGenLayer(op, area, cellDef, temps, clientdata)
|
CIFGenLayer(op, area, cellDef, origDef, temps, clientdata)
|
||||||
CIFOp *op; /* List of CIFOps telling how to make layer. */
|
CIFOp *op; /* List of CIFOps telling how to make layer. */
|
||||||
Rect *area; /* Area to consider when generating CIF. Only
|
Rect *area; /* Area to consider when generating CIF. Only
|
||||||
* material in this area will be considered, so
|
* material in this area will be considered, so
|
||||||
|
|
@ -3137,6 +3171,9 @@ CIFGenLayer(op, area, cellDef, temps, clientdata)
|
||||||
CellDef *cellDef; /* CellDef to search when paint layers are
|
CellDef *cellDef; /* CellDef to search when paint layers are
|
||||||
* needed for operation.
|
* needed for operation.
|
||||||
*/
|
*/
|
||||||
|
CellDef *origDef; /* Original CellDef for which output is being
|
||||||
|
* generated (cellDef may be derived from this).
|
||||||
|
*/
|
||||||
Plane *temps[]; /* Temporary layers to be used when needed
|
Plane *temps[]; /* Temporary layers to be used when needed
|
||||||
* for operation.
|
* for operation.
|
||||||
*/
|
*/
|
||||||
|
|
@ -3374,6 +3411,7 @@ CIFGenLayer(op, area, cellDef, temps, clientdata)
|
||||||
cifPlane = curPlane;
|
cifPlane = curPlane;
|
||||||
bls.op = op;
|
bls.op = op;
|
||||||
bls.def = cellDef;
|
bls.def = cellDef;
|
||||||
|
bls.temps = temps;
|
||||||
cifSrTiles(op, area, cellDef, temps,
|
cifSrTiles(op, area, cellDef, temps,
|
||||||
cifBloatAllFunc, (ClientData)&bls);
|
cifBloatAllFunc, (ClientData)&bls);
|
||||||
break;
|
break;
|
||||||
|
|
@ -3442,12 +3480,13 @@ CIFGenLayer(op, area, cellDef, temps, clientdata)
|
||||||
case CIFOP_BOUNDARY:
|
case CIFOP_BOUNDARY:
|
||||||
cifPlane = curPlane;
|
cifPlane = curPlane;
|
||||||
/* This function for cifoutput only. cifinput handled separately. */
|
/* This function for cifoutput only. cifinput handled separately. */
|
||||||
if (cellDef && (cellDef->cd_flags & CDFIXEDBBOX))
|
|
||||||
|
if (origDef && (origDef->cd_flags & CDFIXEDBBOX))
|
||||||
{
|
{
|
||||||
char *propvalue;
|
char *propvalue;
|
||||||
bool found;
|
bool found;
|
||||||
|
|
||||||
propvalue = (char *)DBPropGet(cellDef, "FIXED_BBOX", &found);
|
propvalue = (char *)DBPropGet(origDef, "FIXED_BBOX", &found);
|
||||||
if (!found) break;
|
if (!found) break;
|
||||||
if (sscanf(propvalue, "%d %d %d %d", &bbox.r_xbot, &bbox.r_ybot,
|
if (sscanf(propvalue, "%d %d %d %d", &bbox.r_xbot, &bbox.r_ybot,
|
||||||
&bbox.r_xtop, &bbox.r_ytop) != 4) break;
|
&bbox.r_xtop, &bbox.r_ytop) != 4) break;
|
||||||
|
|
@ -3527,8 +3566,9 @@ CIFGenLayer(op, area, cellDef, temps, clientdata)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
CIFGen(cellDef, area, planes, layers, replace, genAllPlanes, clientdata)
|
CIFGen(cellDef, origDef, area, planes, layers, replace, genAllPlanes, clientdata)
|
||||||
CellDef *cellDef; /* Cell for which CIF is to be generated. */
|
CellDef *cellDef; /* Cell for which CIF is to be generated. */
|
||||||
|
CellDef *origDef; /* Original cell, if different from cellDef */
|
||||||
Rect *area; /* Any CIF overlapping this area (in coords
|
Rect *area; /* Any CIF overlapping this area (in coords
|
||||||
* of cellDef) will be generated. The CIF
|
* of cellDef) will be generated. The CIF
|
||||||
* will be clipped to this area.
|
* will be clipped to this area.
|
||||||
|
|
@ -3574,7 +3614,7 @@ CIFGen(cellDef, area, planes, layers, replace, genAllPlanes, clientdata)
|
||||||
{
|
{
|
||||||
CIFErrorLayer = i;
|
CIFErrorLayer = i;
|
||||||
new[i] = CIFGenLayer(CIFCurStyle->cs_layers[i]->cl_ops,
|
new[i] = CIFGenLayer(CIFCurStyle->cs_layers[i]->cl_ops,
|
||||||
&expanded, cellDef, new, clientdata);
|
&expanded, cellDef, origDef, new, clientdata);
|
||||||
|
|
||||||
/* Clean up the non-manhattan geometry in the plane */
|
/* Clean up the non-manhattan geometry in the plane */
|
||||||
if (CIFUnfracture) DBMergeNMTiles(new[i], &expanded,
|
if (CIFUnfracture) DBMergeNMTiles(new[i], &expanded,
|
||||||
|
|
|
||||||
|
|
@ -325,8 +325,8 @@ cifHierCellFunc(scx)
|
||||||
|
|
||||||
CIFErrorDef = (CellDef *) NULL;
|
CIFErrorDef = (CellDef *) NULL;
|
||||||
GeoTransRect(&scx->scx_trans, &scx->scx_area, &rootArea);
|
GeoTransRect(&scx->scx_trans, &scx->scx_area, &rootArea);
|
||||||
CIFGen(CIFComponentDef, &rootArea, CIFComponentPlanes,
|
CIFGen(CIFComponentDef, scx->scx_use->cu_def, &rootArea,
|
||||||
&CIFCurStyle->cs_hierLayers, FALSE, TRUE);
|
CIFComponentPlanes, &CIFCurStyle->cs_hierLayers, FALSE, TRUE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -575,7 +575,7 @@ CIFGenSubcells(def, area, output)
|
||||||
(void) DBTreeSrTiles(&scx, &CIFCurStyle->cs_yankLayers, 0,
|
(void) DBTreeSrTiles(&scx, &CIFCurStyle->cs_yankLayers, 0,
|
||||||
cifHierCopyFunc, (ClientData) CIFTotalDef);
|
cifHierCopyFunc, (ClientData) CIFTotalDef);
|
||||||
CIFErrorDef = def;
|
CIFErrorDef = def;
|
||||||
CIFGen(CIFTotalDef, &interaction, CIFTotalPlanes,
|
CIFGen(CIFTotalDef, def, &interaction, CIFTotalPlanes,
|
||||||
&CIFCurStyle->cs_hierLayers, TRUE, TRUE);
|
&CIFCurStyle->cs_hierLayers, TRUE, TRUE);
|
||||||
|
|
||||||
/* Now go through all the subcells overlapping the area
|
/* Now go through all the subcells overlapping the area
|
||||||
|
|
@ -592,7 +592,7 @@ CIFGenSubcells(def, area, output)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
CIFErrorDef = (CellDef *) NULL;
|
CIFErrorDef = (CellDef *) NULL;
|
||||||
CIFGen(def, &interaction, CIFComponentPlanes,
|
CIFGen(def, def, &interaction, CIFComponentPlanes,
|
||||||
&CIFCurStyle->cs_hierLayers, FALSE, TRUE);
|
&CIFCurStyle->cs_hierLayers, FALSE, TRUE);
|
||||||
|
|
||||||
/* Make sure everything in the pieces is also in the overall
|
/* Make sure everything in the pieces is also in the overall
|
||||||
|
|
@ -679,7 +679,7 @@ cifHierElementFunc(use, transform, x, y, checkArea)
|
||||||
cifHierCopyFunc, (ClientData) CIFComponentDef);
|
cifHierCopyFunc, (ClientData) CIFComponentDef);
|
||||||
|
|
||||||
CIFErrorDef = (CellDef *) NULL;
|
CIFErrorDef = (CellDef *) NULL;
|
||||||
CIFGen(CIFComponentDef, checkArea, CIFComponentPlanes,
|
CIFGen(CIFComponentDef, use->cu_def, checkArea, CIFComponentPlanes,
|
||||||
&CIFCurStyle->cs_hierLayers, FALSE, TRUE);
|
&CIFCurStyle->cs_hierLayers, FALSE, TRUE);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -920,8 +920,8 @@ cifHierArrayFunc(scx, output)
|
||||||
(void) DBArraySr(use, &expandedArea, cifHierElementFunc,
|
(void) DBArraySr(use, &expandedArea, cifHierElementFunc,
|
||||||
(ClientData) &A);
|
(ClientData) &A);
|
||||||
CIFErrorDef = use->cu_parent;
|
CIFErrorDef = use->cu_parent;
|
||||||
CIFGen(CIFTotalDef, &A, CIFTotalPlanes, &CIFCurStyle->cs_hierLayers,
|
CIFGen(CIFTotalDef, use->cu_def, &A, CIFTotalPlanes,
|
||||||
FALSE, TRUE);
|
&CIFCurStyle->cs_hierLayers, FALSE, TRUE);
|
||||||
anyInteractions = TRUE;
|
anyInteractions = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -937,8 +937,8 @@ cifHierArrayFunc(scx, output)
|
||||||
(void) DBArraySr(use, &expandedArea, cifHierElementFunc,
|
(void) DBArraySr(use, &expandedArea, cifHierElementFunc,
|
||||||
(ClientData) &C);
|
(ClientData) &C);
|
||||||
CIFErrorDef = use->cu_parent;
|
CIFErrorDef = use->cu_parent;
|
||||||
CIFGen(CIFTotalDef, &C, CIFTotalPlanes, &CIFCurStyle->cs_hierLayers,
|
CIFGen(CIFTotalDef, use->cu_def, &C, CIFTotalPlanes,
|
||||||
FALSE, TRUE);
|
&CIFCurStyle->cs_hierLayers, FALSE, TRUE);
|
||||||
anyInteractions = TRUE;
|
anyInteractions = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -954,8 +954,8 @@ cifHierArrayFunc(scx, output)
|
||||||
(void) DBArraySr(use, &expandedArea, cifHierElementFunc,
|
(void) DBArraySr(use, &expandedArea, cifHierElementFunc,
|
||||||
(ClientData) &B);
|
(ClientData) &B);
|
||||||
CIFErrorDef = use->cu_parent;
|
CIFErrorDef = use->cu_parent;
|
||||||
CIFGen(CIFTotalDef, &B, CIFTotalPlanes, &CIFCurStyle->cs_hierLayers,
|
CIFGen(CIFTotalDef, use->cu_def, &B, CIFTotalPlanes,
|
||||||
FALSE, TRUE);
|
&CIFCurStyle->cs_hierLayers, FALSE, TRUE);
|
||||||
|
|
||||||
/* D */
|
/* D */
|
||||||
|
|
||||||
|
|
@ -967,8 +967,8 @@ cifHierArrayFunc(scx, output)
|
||||||
(void) DBArraySr(use, &expandedArea, cifHierElementFunc,
|
(void) DBArraySr(use, &expandedArea, cifHierElementFunc,
|
||||||
(ClientData) &D);
|
(ClientData) &D);
|
||||||
CIFErrorDef = use->cu_parent;
|
CIFErrorDef = use->cu_parent;
|
||||||
CIFGen(CIFTotalDef, &D, CIFTotalPlanes, &CIFCurStyle->cs_hierLayers,
|
CIFGen(CIFTotalDef, use->cu_def, &D, CIFTotalPlanes,
|
||||||
FALSE, TRUE);
|
&CIFCurStyle->cs_hierLayers, FALSE, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (anyInteractions)
|
if (anyInteractions)
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@
|
||||||
|
|
||||||
typedef struct bloat_data
|
typedef struct bloat_data
|
||||||
{
|
{
|
||||||
|
bool bl_isCif; /* TRUE if types of bl_distance are CIF types */
|
||||||
int bl_plane; /* Plane on which a bloat or squares
|
int bl_plane; /* Plane on which a bloat or squares
|
||||||
* operation is valid.
|
* operation is valid.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -327,7 +327,23 @@ CIFNameToMask(name, result, depend)
|
||||||
{
|
{
|
||||||
cl = CIFCurStyle->cs_layers[j];
|
cl = CIFCurStyle->cs_layers[j];
|
||||||
for (op = cl->cl_ops; op != NULL; op = op->co_next)
|
for (op = cl->cl_ops; op != NULL; op = op->co_next)
|
||||||
|
{
|
||||||
TTMaskSetMask(depend, &op->co_cifMask);
|
TTMaskSetMask(depend, &op->co_cifMask);
|
||||||
|
|
||||||
|
/* Bloat layers may depend on CIF layers */
|
||||||
|
/* Currently supported only with bloat-all */
|
||||||
|
|
||||||
|
if (op->co_opcode == CIFOP_BLOATALL)
|
||||||
|
{
|
||||||
|
BloatData *bloats = (BloatData *)op->co_client;
|
||||||
|
TileType ttype;
|
||||||
|
|
||||||
|
if (bloats->bl_isCif == TRUE)
|
||||||
|
for (ttype = 0; ttype < TT_MAXTYPES; ttype++)
|
||||||
|
if (bloats->bl_distance[ttype] > 0)
|
||||||
|
TTMaskSetType(depend, ttype);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
||||||
|
|
@ -572,7 +572,7 @@ CIFPaintCurrent(filetype)
|
||||||
CIFOp *op;
|
CIFOp *op;
|
||||||
|
|
||||||
plane = CIFGenLayer(cifCurReadStyle->crs_layers[i]->crl_ops,
|
plane = CIFGenLayer(cifCurReadStyle->crs_layers[i]->crl_ops,
|
||||||
&TiPlaneRect, (CellDef *) NULL, cifCurReadPlanes);
|
&TiPlaneRect, (CellDef *)NULL, (CellDef *)NULL, cifCurReadPlanes);
|
||||||
|
|
||||||
/* Generate a paint/erase table, then paint from the CIF
|
/* Generate a paint/erase table, then paint from the CIF
|
||||||
* plane into the current Magic cell.
|
* plane into the current Magic cell.
|
||||||
|
|
|
||||||
|
|
@ -163,7 +163,8 @@ CIFPaintLayer(rootDef, area, cifLayer, magicLayer, paintDef)
|
||||||
(void) DBTreeSrTiles(&scx, &DBAllButSpaceAndDRCBits, 0,
|
(void) DBTreeSrTiles(&scx, &DBAllButSpaceAndDRCBits, 0,
|
||||||
cifHierCopyFunc, (ClientData) CIFComponentDef);
|
cifHierCopyFunc, (ClientData) CIFComponentDef);
|
||||||
oldCount = DBWFeedbackCount;
|
oldCount = DBWFeedbackCount;
|
||||||
CIFGen(CIFComponentDef, area, CIFPlanes, &depend, TRUE, TRUE);
|
|
||||||
|
CIFGen(CIFComponentDef, rootDef, area, CIFPlanes, &depend, TRUE, TRUE);
|
||||||
DBCellClearDef(CIFComponentDef);
|
DBCellClearDef(CIFComponentDef);
|
||||||
|
|
||||||
/* Report any errors that occurred. */
|
/* Report any errors that occurred. */
|
||||||
|
|
@ -277,7 +278,7 @@ CIFSeeLayer(rootDef, area, layer)
|
||||||
(void) DBTreeSrTiles(&scx, &DBAllButSpaceAndDRCBits, 0,
|
(void) DBTreeSrTiles(&scx, &DBAllButSpaceAndDRCBits, 0,
|
||||||
cifHierCopyFunc, (ClientData) CIFComponentDef);
|
cifHierCopyFunc, (ClientData) CIFComponentDef);
|
||||||
oldCount = DBWFeedbackCount;
|
oldCount = DBWFeedbackCount;
|
||||||
CIFGen(CIFComponentDef, area, CIFPlanes, &depend, TRUE, TRUE);
|
CIFGen(CIFComponentDef, rootDef, area, CIFPlanes, &depend, TRUE, TRUE);
|
||||||
DBCellClearDef(CIFComponentDef);
|
DBCellClearDef(CIFComponentDef);
|
||||||
|
|
||||||
/* Report any errors that occurred. */
|
/* Report any errors that occurred. */
|
||||||
|
|
@ -440,7 +441,7 @@ CIFCoverageLayer(rootDef, area, layer)
|
||||||
scx.scx_trans = GeoIdentityTransform;
|
scx.scx_trans = GeoIdentityTransform;
|
||||||
(void) DBTreeSrTiles(&scx, &DBAllButSpaceAndDRCBits, 0,
|
(void) DBTreeSrTiles(&scx, &DBAllButSpaceAndDRCBits, 0,
|
||||||
cifHierCopyFunc, (ClientData) CIFComponentDef);
|
cifHierCopyFunc, (ClientData) CIFComponentDef);
|
||||||
CIFGen(CIFComponentDef, area, CIFPlanes, &depend, TRUE, TRUE);
|
CIFGen(CIFComponentDef, rootDef, area, CIFPlanes, &depend, TRUE, TRUE);
|
||||||
DBCellClearDef(CIFComponentDef);
|
DBCellClearDef(CIFComponentDef);
|
||||||
|
|
||||||
cstats.coverage = 0;
|
cstats.coverage = 0;
|
||||||
|
|
|
||||||
|
|
@ -524,7 +524,7 @@ CIFTechLine(sectionName, argc, argv)
|
||||||
int argc; /* Number of fields on line. */
|
int argc; /* Number of fields on line. */
|
||||||
char *argv[]; /* Values of fields. */
|
char *argv[]; /* Values of fields. */
|
||||||
{
|
{
|
||||||
TileTypeBitMask mask, tempMask, bloatLayers;
|
TileTypeBitMask mask, tempMask, cifMask, bloatLayers;
|
||||||
int i, j, l, distance;
|
int i, j, l, distance;
|
||||||
CIFLayer *newLayer;
|
CIFLayer *newLayer;
|
||||||
CIFOp *newOp = NULL;
|
CIFOp *newOp = NULL;
|
||||||
|
|
@ -1093,21 +1093,37 @@ CIFTechLine(sectionName, argc, argv)
|
||||||
for (i = 0; i < TT_MAXTYPES; i++)
|
for (i = 0; i < TT_MAXTYPES; i++)
|
||||||
bloats->bl_distance[i] = 0;
|
bloats->bl_distance[i] = 0;
|
||||||
newOp->co_client = (ClientData)bloats;
|
newOp->co_client = (ClientData)bloats;
|
||||||
cifParseLayers(argv[2], CIFCurStyle, &mask, &tempMask, TRUE);
|
cifParseLayers(argv[2], CIFCurStyle, &mask, &cifMask, TRUE);
|
||||||
|
|
||||||
|
/* 5/25/2020: Lifting restriction that bloatLayers types */
|
||||||
|
/* cannot be CIF or temp layers. However, CIF/temp layers */
|
||||||
|
/* and magic database layers may not be mixed. */
|
||||||
|
|
||||||
|
if (!TTMaskIsZero(&mask) && !TTMaskIsZero(&cifMask))
|
||||||
|
TechError("Can't mix CIF and magic layers in bloat statement.\n");
|
||||||
|
|
||||||
/* 10/15/2019: Lifting restriction that the types that */
|
/* 10/15/2019: Lifting restriction that the types that */
|
||||||
/* trigger the bloating must be in the same plane as the */
|
/* trigger the bloating must be in the same plane as the */
|
||||||
/* types that are bloated into. */
|
/* types that are bloated into. */
|
||||||
|
|
||||||
TTMaskZero(&bloatLayers);
|
TTMaskZero(&bloatLayers);
|
||||||
|
if (!TTMaskIsZero(&mask))
|
||||||
|
{
|
||||||
|
bloats->bl_isCif = FALSE;
|
||||||
TTMaskSetMask(&bloatLayers, &mask);
|
TTMaskSetMask(&bloatLayers, &mask);
|
||||||
if (!TTMaskEqual(&tempMask, &DBZeroTypeBits))
|
|
||||||
TechError("Can't use templayers in bloat statement.\n");
|
|
||||||
|
|
||||||
for (i = 0; i < TT_MAXTYPES; i++)
|
for (i = 0; i < TT_MAXTYPES; i++)
|
||||||
if (TTMaskHasType(&mask, i))
|
if (TTMaskHasType(&mask, i))
|
||||||
bloats->bl_distance[i] = 1;
|
bloats->bl_distance[i] = 1;
|
||||||
goto bloatCheck;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bloats->bl_isCif = TRUE;
|
||||||
|
TTMaskSetMask(&bloatLayers, &cifMask);
|
||||||
|
for (i = 0; i < TT_MAXTYPES; i++)
|
||||||
|
if (TTMaskHasType(&cifMask, i))
|
||||||
|
bloats->bl_distance[i] = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case CIFOP_BLOAT:
|
case CIFOP_BLOAT:
|
||||||
case CIFOP_BLOATMIN:
|
case CIFOP_BLOATMIN:
|
||||||
|
|
@ -1119,6 +1135,7 @@ CIFTechLine(sectionName, argc, argv)
|
||||||
bloatArg = argv + 2;
|
bloatArg = argv + 2;
|
||||||
bloatLayers = newOp->co_paintMask;
|
bloatLayers = newOp->co_paintMask;
|
||||||
bloats = (BloatData *)mallocMagic(sizeof(BloatData));
|
bloats = (BloatData *)mallocMagic(sizeof(BloatData));
|
||||||
|
bloats->bl_isCif = FALSE;
|
||||||
for (i = 0; i < TT_MAXTYPES; i++)
|
for (i = 0; i < TT_MAXTYPES; i++)
|
||||||
bloats->bl_distance[i] = 0;
|
bloats->bl_distance[i] = 0;
|
||||||
newOp->co_client = (ClientData)bloats;
|
newOp->co_client = (ClientData)bloats;
|
||||||
|
|
@ -1859,8 +1876,13 @@ CIFTechFinal()
|
||||||
for (j = 0; j < TT_MAXTYPES; j++)
|
for (j = 0; j < TT_MAXTYPES; j++)
|
||||||
{
|
{
|
||||||
if (bloats->bl_distance[j] != bloats->bl_distance[TT_SPACE])
|
if (bloats->bl_distance[j] != bloats->bl_distance[TT_SPACE])
|
||||||
|
{
|
||||||
|
if (bloats->bl_isCif)
|
||||||
|
TTMaskSetType(&ourDepend, j);
|
||||||
|
else
|
||||||
TTMaskSetType(&ourYank, j);
|
TTMaskSetType(&ourYank, j);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
needThisLayer = TRUE;
|
needThisLayer = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -378,7 +378,7 @@ cifOutFunc(def, f)
|
||||||
|
|
||||||
GEO_EXPAND(&def->cd_bbox, CIFCurStyle->cs_radius, &bigArea);
|
GEO_EXPAND(&def->cd_bbox, CIFCurStyle->cs_radius, &bigArea);
|
||||||
CIFErrorDef = def;
|
CIFErrorDef = def;
|
||||||
CIFGen(def, &bigArea, CIFPlanes, &DBAllTypeBits, TRUE, TRUE);
|
CIFGen(def, def, &bigArea, CIFPlanes, &DBAllTypeBits, TRUE, TRUE);
|
||||||
if (!CIFHierWriteDisable)
|
if (!CIFHierWriteDisable)
|
||||||
CIFGenSubcells(def, &bigArea, CIFPlanes);
|
CIFGenSubcells(def, &bigArea, CIFPlanes);
|
||||||
if (!CIFArrayWriteDisable)
|
if (!CIFArrayWriteDisable)
|
||||||
|
|
|
||||||
|
|
@ -540,7 +540,8 @@ drcCifCheck(arg)
|
||||||
arg->dCD_rect = &cifrect;
|
arg->dCD_rect = &cifrect;
|
||||||
oldTiles = DRCstatTiles;
|
oldTiles = DRCstatTiles;
|
||||||
|
|
||||||
CIFGen(arg->dCD_celldef, checkRect, CIFPlanes, &DBAllTypeBits, TRUE, TRUE);
|
CIFGen(arg->dCD_celldef, arg->dCD_celldef, checkRect, CIFPlanes,
|
||||||
|
&DBAllTypeBits, TRUE, TRUE);
|
||||||
|
|
||||||
for (i = 0; i < drcCifStyle->cs_nLayers; i++)
|
for (i = 0; i < drcCifStyle->cs_nLayers; i++)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1739,7 +1739,7 @@ W3DCIFredisplay(w, rootArea, clipArea)
|
||||||
scx.scx_trans = GeoIdentityTransform;
|
scx.scx_trans = GeoIdentityTransform;
|
||||||
(void) DBTreeSrTiles(&scx, &DBAllButSpaceAndDRCBits, 0,
|
(void) DBTreeSrTiles(&scx, &DBAllButSpaceAndDRCBits, 0,
|
||||||
cifHierCopyFunc, (ClientData) CIFComponentDef);
|
cifHierCopyFunc, (ClientData) CIFComponentDef);
|
||||||
CIFGen(CIFComponentDef, &clipRect, CIFPlanes, &DBAllTypeBits, TRUE, TRUE);
|
CIFGen(CIFComponentDef, cellDef, &clipRect, CIFPlanes, &DBAllTypeBits, TRUE, TRUE);
|
||||||
DBCellClearDef(CIFComponentDef);
|
DBCellClearDef(CIFComponentDef);
|
||||||
|
|
||||||
w3dClear();
|
w3dClear();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue