void ZDCCanvas_X_NonWindow::CopyFrom(ZDCState& ioState, const ZPoint& inDestLocation, ZRef<ZDCCanvas> inSourceCanvas, const ZDCState& inSourceState, const ZRect& inSourceRect) { ZRef<ZDCCanvas_X> sourceCanvasX = ZRefDynamicCast<ZDCCanvas_X>(inSourceCanvas); ZAssertStop(kDebug_X, sourceCanvasX != nil); if (!fDrawable || !sourceCanvasX->Internal_GetDrawable()) return; SetupLock theSetupLock(this); // We can (currently) only copy from one drawable to another if they're on the same display // ZAssertStop(kDebug_X, fXServer == sourceCanvasX->fXServer); ZRect destRect = inSourceRect + (ioState.fOrigin + inDestLocation - inSourceRect.TopLeft()); ZRect sourceRect = inSourceRect + inSourceState.fOrigin; ZDCRgn realClip = this->Internal_CalcClipRgn(ioState); fXServer->SetRegion(fGC, realClip.GetRegion()); ++fChangeCount_Clip; fXServer->SetFunction(fGC, GXcopy); ++fChangeCount_Mode; fXServer->CopyArea(sourceCanvasX->Internal_GetDrawable(), fDrawable, fGC, sourceRect.Left(), sourceRect.Top(), sourceRect.Width(), sourceRect.Height(), destRect.Left(), destRect.Top()); }
ZDC_Off::ZDC_Off(const ZDC& inOther, bool inForceOffscreen) : ZDC(inOther) { // Initially, we copy all settings from inOther, then we attempt to // create a new offscreen canvas. if (inForceOffscreen || !fCanvas->IsOffScreen()) { ZRect canvasClipRect = this->GetClip().Bounds() + this->GetOrigin(); ZRef<ZDCCanvas> offCanvas; try { // We allow the offscreen creation to fail if inForceOffscreen is false. offCanvas = fCanvas->CreateOffScreen(canvasClipRect); } catch (...) { if (inForceOffscreen) throw; } if (offCanvas && offCanvas->IsOffScreen()) { fCanvas = offCanvas; this->ZeroChangeCounts(); fState.fOriginComp = canvasClipRect.TopLeft(); this->SetOrigin(inOther.GetOrigin()); this->SetPatternOrigin(inOther.GetPatternOrigin()); this->SetClip(inOther.GetClip()); } } }