Modified the Euclidean distance "grow" operator so that it honors
the grid limit setting.
This commit is contained in:
parent
bee0039e43
commit
e8eb96103d
222
cif/CIFgen.c
222
cif/CIFgen.c
|
|
@ -112,6 +112,123 @@ cifPaintFunc(tile, table)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
* SetBoxGrid ---
|
||||||
|
*
|
||||||
|
* Adjust the given area by expanding each side individually to
|
||||||
|
* ensure that it falls on the CIF minimum grid.
|
||||||
|
*
|
||||||
|
* Returns: Nothing
|
||||||
|
*
|
||||||
|
* Side Effects: Point to Rect "area" may be modified.
|
||||||
|
*
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
SetBoxGrid(area)
|
||||||
|
Rect *area;
|
||||||
|
{
|
||||||
|
int limit;
|
||||||
|
int delta;
|
||||||
|
|
||||||
|
limit = CIFCurStyle->cs_gridLimit * CIFCurStyle->cs_expander;
|
||||||
|
limit /= (CIFCurStyle->cs_flags & CWF_ANGSTROMS) ? 100 : 10;
|
||||||
|
|
||||||
|
if (CIFCurStyle && (limit > 1))
|
||||||
|
{
|
||||||
|
delta = abs(area->r_xbot) % limit;
|
||||||
|
if (delta > 0)
|
||||||
|
{
|
||||||
|
if (area->r_xbot < 0)
|
||||||
|
{
|
||||||
|
area->r_xbot += delta;
|
||||||
|
area->r_xbot -= limit;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
area->r_xbot -= delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
delta = abs(area->r_xtop) % limit;
|
||||||
|
if (delta > 0)
|
||||||
|
{
|
||||||
|
if (area->r_xtop < 0)
|
||||||
|
area->r_xtop += delta;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
area->r_xtop -= delta;
|
||||||
|
area->r_xtop += limit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delta = abs(area->r_ybot) % limit;
|
||||||
|
if (delta > 0)
|
||||||
|
{
|
||||||
|
if (area->r_ybot < 0)
|
||||||
|
{
|
||||||
|
area->r_ybot += delta;
|
||||||
|
area->r_ybot -= limit;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
area->r_ybot -= delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
delta = abs(area->r_ytop) % limit;
|
||||||
|
if (delta > 0)
|
||||||
|
{
|
||||||
|
if (area->r_ytop < 0)
|
||||||
|
area->r_ytop += delta;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
area->r_ytop -= delta;
|
||||||
|
area->r_ytop += limit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
* SetMinBoxGrid ---
|
||||||
|
*
|
||||||
|
* Adjust the given area by expanding evenly on both sides so that it
|
||||||
|
* has a width and heigth no less than the given width. Then further
|
||||||
|
* expand the box to ensure that it falls on the CIF minimum grid.
|
||||||
|
*
|
||||||
|
* Returns: Nothing
|
||||||
|
*
|
||||||
|
* Side Effects: Point to Rect "area" may be modified.
|
||||||
|
*
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
SetMinBoxGrid(area, width)
|
||||||
|
Rect *area;
|
||||||
|
int width;
|
||||||
|
{
|
||||||
|
int wtest;
|
||||||
|
int wtot;
|
||||||
|
|
||||||
|
wtest = (area->r_xtop - area->r_xbot);
|
||||||
|
wtot = area->r_xtop + area->r_xbot;
|
||||||
|
if (wtest < width)
|
||||||
|
{
|
||||||
|
area->r_xbot = (wtot - width) / 2;
|
||||||
|
area->r_xtop = (wtot + width) / 2;
|
||||||
|
}
|
||||||
|
wtest = (area->r_ytop - area->r_ybot);
|
||||||
|
wtot = area->r_ytop + area->r_ybot;
|
||||||
|
if (wtest < width)
|
||||||
|
{
|
||||||
|
area->r_ybot = (wtot - width) / 2;
|
||||||
|
area->r_ytop = (wtot + width) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetBoxGrid(area);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ----------------------------------------------------------------------------
|
* ----------------------------------------------------------------------------
|
||||||
*
|
*
|
||||||
|
|
@ -435,6 +552,7 @@ cifGrowEuclideanFunc(tile, table)
|
||||||
int growDistanceX, growDistanceY;
|
int growDistanceX, growDistanceY;
|
||||||
int height, width;
|
int height, width;
|
||||||
double hyp;
|
double hyp;
|
||||||
|
int limit;
|
||||||
|
|
||||||
if (oldType & TT_SIDE)
|
if (oldType & TT_SIDE)
|
||||||
growDirs &= ~GROW_WEST;
|
growDirs &= ~GROW_WEST;
|
||||||
|
|
@ -447,8 +565,8 @@ cifGrowEuclideanFunc(tile, table)
|
||||||
growDirs &= ~GROW_NORTH;
|
growDirs &= ~GROW_NORTH;
|
||||||
|
|
||||||
/* Grow non-Manhattan edges to (the closest integer value */
|
/* Grow non-Manhattan edges to (the closest integer value */
|
||||||
/* to) growDistance along the normal to the edge. This */
|
/* to) growDistance along the normal to the edge. This */
|
||||||
/* will overestimate the distance only to the minimum */
|
/* will overestimate the distance only to the minimum */
|
||||||
/* amount necessary to ensure on-grid endpoints. */
|
/* amount necessary to ensure on-grid endpoints. */
|
||||||
|
|
||||||
width = area.r_xtop - area.r_xbot;
|
width = area.r_xtop - area.r_xbot;
|
||||||
|
|
@ -462,8 +580,9 @@ cifGrowEuclideanFunc(tile, table)
|
||||||
rtmp = area;
|
rtmp = area;
|
||||||
if (!(growDirs & GROW_EAST)) rtmp.r_xtop = rtmp.r_xbot + growDistanceX;
|
if (!(growDirs & GROW_EAST)) rtmp.r_xtop = rtmp.r_xbot + growDistanceX;
|
||||||
if (!(growDirs & GROW_WEST)) rtmp.r_xbot = rtmp.r_xtop - growDistanceX;
|
if (!(growDirs & GROW_WEST)) rtmp.r_xbot = rtmp.r_xtop - growDistanceX;
|
||||||
if (!(growDirs & GROW_SOUTH)) rtmp.r_ybot -=growDistance;
|
if (!(growDirs & GROW_SOUTH)) rtmp.r_ybot -= growDistance;
|
||||||
if (!(growDirs & GROW_NORTH)) rtmp.r_ytop += growDistance;
|
if (!(growDirs & GROW_NORTH)) rtmp.r_ytop += growDistance;
|
||||||
|
SetBoxGrid(&rtmp);
|
||||||
DBPaintPlane(cifPlane, &rtmp, table, (PaintUndoInfo *) NULL);
|
DBPaintPlane(cifPlane, &rtmp, table, (PaintUndoInfo *) NULL);
|
||||||
|
|
||||||
/* Draw horizontal tile to distance Y */
|
/* Draw horizontal tile to distance Y */
|
||||||
|
|
@ -473,6 +592,7 @@ cifGrowEuclideanFunc(tile, table)
|
||||||
if (!(growDirs & GROW_WEST)) rtmp.r_xbot -= growDistance;
|
if (!(growDirs & GROW_WEST)) rtmp.r_xbot -= growDistance;
|
||||||
if (!(growDirs & GROW_SOUTH)) rtmp.r_ybot = rtmp.r_ytop - growDistanceY;
|
if (!(growDirs & GROW_SOUTH)) rtmp.r_ybot = rtmp.r_ytop - growDistanceY;
|
||||||
if (!(growDirs & GROW_NORTH)) rtmp.r_ytop = rtmp.r_ybot + growDistanceY;
|
if (!(growDirs & GROW_NORTH)) rtmp.r_ytop = rtmp.r_ybot + growDistanceY;
|
||||||
|
SetBoxGrid(&rtmp);
|
||||||
DBPaintPlane(cifPlane, &rtmp, table, (PaintUndoInfo *) NULL);
|
DBPaintPlane(cifPlane, &rtmp, table, (PaintUndoInfo *) NULL);
|
||||||
|
|
||||||
/* Finally: translate, resize, and paint the diagonal tile */
|
/* Finally: translate, resize, and paint the diagonal tile */
|
||||||
|
|
@ -496,6 +616,7 @@ cifGrowEuclideanFunc(tile, table)
|
||||||
else
|
else
|
||||||
rtmp.r_xbot += growDistanceX;
|
rtmp.r_xbot += growDistanceX;
|
||||||
|
|
||||||
|
SetBoxGrid(&rtmp);
|
||||||
DBNMPaintPlane(cifPlane, oldType, &rtmp, table, (PaintUndoInfo *) NULL);
|
DBNMPaintPlane(cifPlane, oldType, &rtmp, table, (PaintUndoInfo *) NULL);
|
||||||
oldType = (growDirs & GROW_EAST) ? TiGetRightType(tile) : TiGetLeftType(tile);
|
oldType = (growDirs & GROW_EAST) ? TiGetRightType(tile) : TiGetLeftType(tile);
|
||||||
}
|
}
|
||||||
|
|
@ -1598,101 +1719,6 @@ cifBridgeFunc1(tile, brs)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* ----------------------------------------------------------------------------
|
|
||||||
* SetMinBoxGrid ---
|
|
||||||
*
|
|
||||||
* Adjust the given area by expanding evenly on both sides so that it
|
|
||||||
* has a width and heigth no less than the given width. Then further
|
|
||||||
* expand the box to ensure that it falls on the CIF minimum grid.
|
|
||||||
*
|
|
||||||
* Returns: Nothing
|
|
||||||
*
|
|
||||||
* Side Effects: Point to Rect "area" may be modified.
|
|
||||||
*
|
|
||||||
* ----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
SetMinBoxGrid(area, width)
|
|
||||||
Rect *area;
|
|
||||||
int width;
|
|
||||||
{
|
|
||||||
int wtest;
|
|
||||||
int wtot;
|
|
||||||
int delta;
|
|
||||||
int limit;
|
|
||||||
|
|
||||||
wtest = (area->r_xtop - area->r_xbot);
|
|
||||||
wtot = area->r_xtop + area->r_xbot;
|
|
||||||
if (wtest < width)
|
|
||||||
{
|
|
||||||
area->r_xbot = (wtot - width) / 2;
|
|
||||||
area->r_xtop = (wtot + width) / 2;
|
|
||||||
}
|
|
||||||
wtest = (area->r_ytop - area->r_ybot);
|
|
||||||
wtot = area->r_ytop + area->r_ybot;
|
|
||||||
if (wtest < width)
|
|
||||||
{
|
|
||||||
area->r_ybot = (wtot - width) / 2;
|
|
||||||
area->r_ytop = (wtot + width) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
limit = CIFCurStyle->cs_gridLimit * CIFCurStyle->cs_expander;
|
|
||||||
limit /= (CIFCurStyle->cs_flags & CWF_ANGSTROMS) ? 100 : 10;
|
|
||||||
|
|
||||||
if (CIFCurStyle && (limit > 1))
|
|
||||||
{
|
|
||||||
delta = abs(area->r_xbot) % limit;
|
|
||||||
if (delta > 0)
|
|
||||||
{
|
|
||||||
if (area->r_xbot < 0)
|
|
||||||
{
|
|
||||||
area->r_xbot += delta;
|
|
||||||
area->r_xbot -= limit;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
area->r_xbot -= delta;
|
|
||||||
}
|
|
||||||
|
|
||||||
delta = abs(area->r_xtop) % limit;
|
|
||||||
if (delta > 0)
|
|
||||||
{
|
|
||||||
if (area->r_xtop < 0)
|
|
||||||
area->r_xtop += delta;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
area->r_xtop -= delta;
|
|
||||||
area->r_xtop += limit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delta = abs(area->r_ybot) % limit;
|
|
||||||
if (delta > 0)
|
|
||||||
{
|
|
||||||
if (area->r_ybot < 0)
|
|
||||||
{
|
|
||||||
area->r_ybot += delta;
|
|
||||||
area->r_ybot -= limit;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
area->r_ybot -= delta;
|
|
||||||
}
|
|
||||||
|
|
||||||
delta = abs(area->r_ytop) % limit;
|
|
||||||
if (delta > 0)
|
|
||||||
{
|
|
||||||
if (area->r_ytop < 0)
|
|
||||||
area->r_ytop += delta;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
area->r_ytop -= delta;
|
|
||||||
area->r_ytop += limit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ----------------------------------------------------------------------------
|
* ----------------------------------------------------------------------------
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue