static Bool EndPaint(Widget w) { TextSinkObject sink = (TextSinkObject)w; XawTextPaintStruct *paint, *next; if (sink->text_sink.paint == NULL) return (False); XmuDestroyArea(sink->text_sink.paint->clip); if (sink->text_sink.paint->hightabs) XmuDestroyArea(sink->text_sink.paint->hightabs); paint = sink->text_sink.paint->paint; while (paint) { next = paint->next; if (paint->text) XtFree((XtPointer)paint->text); if (paint->backtabs) XmuDestroyArea(paint->backtabs); XtFree((XtPointer)paint); paint = next; } paint = sink->text_sink.paint->bearings; while (paint) { next = paint->next; if (paint->text) XtFree((XtPointer)paint->text); XtFree((XtPointer)paint); paint = next; } XtFree((XtPointer)sink->text_sink.paint); sink->text_sink.paint = NULL; return (True); }
/* * Function: * XmuAreaNot * * Parameters: * area - area to operate * x1 - retangle to clip the result against * y1 - "" * x2 - "" * y2 - "" * * Description: * (Input) * (x1, y1) (x2, y1) * +-------------+ * +------------+ +----+ * | +--------------+ * +----------------+ * (x1, y2) (x2, y2) * * (Output) * (x1, y1) (x2, y1) * +--------------+ +--------------------------+ * | +------------+ +----+ | * | | +--------------+ | * +-+ +------------------------------------+ * (x1, y2) (x2, y2) */ XmuArea * XmuAreaNot(XmuArea *area, int x1, int y1, int x2, int y2) { XmuScanline *z; XmuArea *and; if (!area) return (area); if (x1 > x2) { x1 ^= x2; x2 ^= x1; x1 ^= x2; } if (y1 > y2) { y1 ^= y2; y2 ^= y1; y1 ^= y2; } if (!area->scanline) { if ((area->scanline = XmuNewScanline(y1, x1, x2)) != NULL) area->scanline->next = XmuNewScanline(y2, 0, 0); return (area); } and = XmuNewArea(x1, y1, x2, y2); XmuAreaAnd(area, and); XmuDestroyArea(and); z = area->scanline; if (z->y != y1) { XmuScanline *q = XmuNewScanline(y1, x1, x2); q->next = z; area->scanline = q; } else { area->scanline = area->scanline->next; XmuDestroyScanline(z); XmuOptimizeArea(area); if((z = area->scanline) == (XmuScanline *)NULL) return (area); } /* CONSTCOND */ while (1) { XmuScanlineNot(z, x1, x2); if (!z->next) { z->next = XmuNewScanline(y2, 0, 0); break; } if (z->next->y == y2) { XmuDestroyScanlineList(z->next); z->next = XmuNewScanline(y2, 0, 0); break; } z = z->next; } return (area); }