Added a new CIF operator "not-interact" which is complementary to

"interact", because it was trivially easy to implement and saves
processing vs. doing the same thing with two templayers and an
"and-not" operator.
This commit is contained in:
Tim Edwards 2025-02-04 20:43:30 -05:00
parent 21b810b375
commit a5653c8fca
2 changed files with 13 additions and 0 deletions

View File

@ -4752,6 +4752,13 @@ cifInteractingRegions(
} }
} }
/* op->co_client is an invert bit indicating the rule is "not-interact",
* so invert the sense of "interacts". Then the non-interacting regions
* will be kept and the interacting regions will be discarded.
*/
if (op->co_client == (ClientData)1)
interacts = (interacts) ? FALSE : TRUE;
/* Clear the tiles that were processed in this set, first copying them */ /* Clear the tiles that were processed in this set, first copying them */
/* to the destination if this region was found to be interacting with */ /* to the destination if this region was found to be interacting with */
/* op->co_paintMask (op->co_cifMask) */ /* op->co_paintMask (op->co_cifMask) */

View File

@ -110,6 +110,7 @@ cifTechFreeStyle(void)
case CIFOP_BBOX: case CIFOP_BBOX:
case CIFOP_MAXRECT: case CIFOP_MAXRECT:
case CIFOP_BOUNDARY: case CIFOP_BOUNDARY:
case CIFOP_INTERACT:
/* These options use co_client to hold a single */ /* These options use co_client to hold a single */
/* integer value, so it is not allocated. */ /* integer value, so it is not allocated. */
break; break;
@ -1096,6 +1097,11 @@ CIFTechLine(
newOp->co_opcode = CIFOP_BRIDGELIM; newOp->co_opcode = CIFOP_BRIDGELIM;
else if (strcmp(argv[0], "interact") == 0) else if (strcmp(argv[0], "interact") == 0)
newOp->co_opcode = CIFOP_INTERACT; newOp->co_opcode = CIFOP_INTERACT;
else if (strcmp(argv[0], "not-interact") == 0)
{
newOp->co_opcode = CIFOP_INTERACT;
newOp->co_client = (ClientData)1;
}
else else
{ {
TechError("Unknown statement \"%s\".\n", argv[0]); TechError("Unknown statement \"%s\".\n", argv[0]);