void KdSetRootClip (ScreenPtr pScreen, BOOL enable) { #ifndef FB_OLD_SCREEN WindowPtr pWin = WindowTable[pScreen->myNum]; WindowPtr pChild; Bool WasViewable; Bool anyMarked; RegionPtr pOldClip, bsExposed; #ifdef DO_SAVE_UNDERS Bool dosave = FALSE; #endif WindowPtr pLayerWin; BoxRec box; if (!pWin) return; WasViewable = (Bool)(pWin->viewable); if (WasViewable) { for (pChild = pWin->firstChild; pChild; pChild = pChild->nextSib) { (void) (*pScreen->MarkOverlappedWindows)(pChild, pChild, &pLayerWin); } (*pScreen->MarkWindow) (pWin); anyMarked = TRUE; if (pWin->valdata) { if (HasBorder (pWin)) { RegionPtr borderVisible; borderVisible = REGION_CREATE(pScreen, NullBox, 1); REGION_SUBTRACT(pScreen, borderVisible, &pWin->borderClip, &pWin->winSize); pWin->valdata->before.borderVisible = borderVisible; } pWin->valdata->before.resized = TRUE; } } if (enable) { box.x1 = 0; box.y1 = 0; box.x2 = pScreen->width; box.y2 = pScreen->height; pWin->drawable.width = pScreen->width; pWin->drawable.height = pScreen->height; REGION_INIT (pScreen, &pWin->winSize, &box, 1); REGION_INIT (pScreen, &pWin->borderSize, &box, 1); REGION_RESET(pScreen, &pWin->borderClip, &box); REGION_BREAK (pWin->drawable.pScreen, &pWin->clipList); } else { REGION_EMPTY(pScreen, &pWin->borderClip); REGION_BREAK (pWin->drawable.pScreen, &pWin->clipList); } ResizeChildrenWinSize (pWin, 0, 0, 0, 0); if (WasViewable) { if (pWin->backStorage) { pOldClip = REGION_CREATE(pScreen, NullBox, 1); REGION_COPY(pScreen, pOldClip, &pWin->clipList); } if (pWin->firstChild) { anyMarked |= (*pScreen->MarkOverlappedWindows)(pWin->firstChild, pWin->firstChild, (WindowPtr *)NULL); } else { (*pScreen->MarkWindow) (pWin); anyMarked = TRUE; } #ifdef DO_SAVE_UNDERS if (DO_SAVE_UNDERS(pWin)) { dosave = (*pScreen->ChangeSaveUnder)(pLayerWin, pLayerWin); } #endif /* DO_SAVE_UNDERS */ if (anyMarked) (*pScreen->ValidateTree)(pWin, NullWindow, VTOther); } if (pWin->backStorage && ((pWin->backingStore == Always) || WasViewable)) { if (!WasViewable) pOldClip = &pWin->clipList; /* a convenient empty region */ bsExposed = (*pScreen->TranslateBackingStore) (pWin, 0, 0, pOldClip, pWin->drawable.x, pWin->drawable.y); if (WasViewable) REGION_DESTROY(pScreen, pOldClip); if (bsExposed) { RegionPtr valExposed = NullRegion; if (pWin->valdata) valExposed = &pWin->valdata->after.exposed; (*pScreen->WindowExposures) (pWin, valExposed, bsExposed); if (valExposed) REGION_EMPTY(pScreen, valExposed); REGION_DESTROY(pScreen, bsExposed); } } if (WasViewable) { if (anyMarked) (*pScreen->HandleExposures)(pWin); #ifdef DO_SAVE_UNDERS if (dosave) (*pScreen->PostChangeSaveUnder)(pLayerWin, pLayerWin); #endif /* DO_SAVE_UNDERS */ if (anyMarked && pScreen->PostValidateTree) (*pScreen->PostValidateTree)(pWin, NullWindow, VTOther); } if (pWin->realized) WindowsRestructured (); #endif /* !FB_OLD_SCREEN */ }
static void PclDoArc( DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc *pArcs, void (*DoIt)(FILE *, PclContextPrivPtr, double, double, xArc)) { char t[80]; FILE *outFile; int nbox, i; BoxPtr pbox; BoxRec r; RegionPtr drawRegion, region, transClip; short fudge; int xoffset, yoffset; XpContextPtr pCon; PclContextPrivPtr pConPriv; xRectangle repro; if( PclUpdateDrawableGC( pGC, pDrawable, &outFile ) == FALSE ) return; fudge = 3 * pGC->lineWidth; pCon = PclGetContextFromWindow( (WindowPtr) pDrawable ); pConPriv = (PclContextPrivPtr) dixLookupPrivate(&pCon->devPrivates, PclContextPrivateKey); XpGetReproductionArea( pCon, &repro ); /* * Generate the PCL code to draw the collection of arcs, by * defining it as a macro which uses the HP-GL/2 arc drawing * function. */ xoffset = pDrawable->x; yoffset = pDrawable->y; for( i = 0; i < nArcs; i++ ) { xArc Arc = pArcs[i]; double b, X, Y, ratio; double angle1; MACRO_START( outFile, pConPriv ); SAVE_PCL( outFile, pConPriv, "\033%0B" ); /* Calculate the start of the arc */ if( ( Arc.angle1 / 64 ) % 360 == 90 ) { X = 0; Y = -Arc.height / 2.0; } else if( ( Arc.angle1 / 64 ) % 360 == 270 ) { X = 0; Y = Arc.height / 2.0; } else { /* Convert the angle to radians */ angle1 = ( Arc.angle1 / 64.0 ) * 3.141592654 / 180.0; b = (Arc.height / 2.0); X = b * cos( angle1 ); Y = -b * sin( angle1 ); } /* Change the coordinate system to scale the ellipse */ ratio = (double)Arc.height / (double)Arc.width; sprintf( t, "SC%.2f,%.2f,%d,%d;", (repro.x - Arc.width / 2 - xoffset - Arc.x) * ratio, (repro.x - Arc.width / 2 - xoffset - Arc.x + repro.width) * ratio, repro.y - Arc.height / 2 - yoffset - Arc.y + repro.height, repro.y - Arc.height / 2 - yoffset - Arc.y); SAVE_PCL( outFile, pConPriv, t ); DoIt( outFile, pConPriv, X, Y, Arc ); /* Build the bounding box */ r.x1 = -Arc.width / 2 - fudge; r.y1 = -Arc.height / 2 - fudge; r.x2 = Arc.width / 2 + fudge; r.y2 = Arc.height / 2 + fudge; drawRegion = REGION_CREATE( pGC->pScreen, &r, 0 ); SAVE_PCL( outFile, pConPriv, "\033%0A" ); MACRO_END( outFile ); /* * Intersect the bounding box with the clip region. */ region = REGION_CREATE( pGC->pScreen, NULL, 0 ); transClip = REGION_CREATE( pGC->pScreen, NULL, 0 ); REGION_COPY( pGC->pScreen, transClip, pGC->pCompositeClip ); REGION_TRANSLATE( pGC->pScreen, transClip, -(xoffset + Arc.x + Arc.width / 2), -(yoffset + Arc.y + Arc.height / 2) ); REGION_INTERSECT( pGC->pScreen, region, drawRegion, transClip ); /* * For each rectangle in the clip region, set the HP-GL/2 "input * window" and render the collection of arcs to it. */ pbox = REGION_RECTS( region ); nbox = REGION_NUM_RECTS( region ); PclSendData(outFile, pConPriv, pbox, nbox, ratio); /* * Restore the coordinate system */ sprintf( t, "\033%%0BSC%d,%d,%d,%d;\033%%0A", repro.x, repro.x + repro.width, repro.y + repro.height, repro.y ); SEND_PCL( outFile, t ); /* * Clean up the temporary regions */ REGION_DESTROY( pGC->pScreen, drawRegion ); REGION_DESTROY( pGC->pScreen, region ); REGION_DESTROY( pGC->pScreen, transClip ); } }