19#include <Cocoa/Cocoa.h>
85 "Execute, gVirtualX is either null or not of TGCocoa type");
95 assert(segments != 0 &&
"DrawSegments, segments parameter is null");
96 assert(nSegments > 0 &&
"DrawSegments, nSegments <= 0");
98 fSegments.assign(segments, segments + nSegments);
105 "Execute, gVirtualX is either null or not of TGCocoa type");
121 "Execute, gVirtualX is either null or not of TGCocoa type");
146 "Execute, gVirtualX is either null or not of TGCocoa type");
155 const std::string &
text)
166 "Execute, gVirtualX is either null or not of TGCocoa type");
176 fRectangle(rectangle)
184 "Execute, gVirtualX is either null or not of TGCocoa type");
196 assert(
points != 0 &&
"FillPolygon, points parameter is null");
197 assert(nPoints > 0 &&
"FillPolygon, nPoints <= 0");
206 "Execute, gVirtualX is either null or not of TGCocoa type");
215 fRectangle(rectangle)
223 "Execute, gVirtualX is either null or not of TGCocoa type");
235 assert(
view != nil &&
"UpdateWindow, view parameter is nil");
241 assert(
fView.
fContext != 0 &&
"Execute, view.fContext is null");
244 [
fView copy : pixmap area :
Rectangle(0, 0, pixmap.fWidth, pixmap.fHeight)
245 withMask : nil clipOrigin :
Point() toPoint :
Point()];
258 "Execute, gVirtualX is either null or not of TGCocoa type");
282 return NSPoint{CGFloat(rp.fX), CGFloat(rp.fY)};
288 assert(ctx &&
"Execute, 'ctx' parameter is nullptr");
293 CGContextStrokeRect(ctx, CGRectMake(btLeft.x, btLeft.y,
fP2.
fX -
fP1.
fX, height));
313 assert(ctx &&
"Execute, invalid (nullptr) parameter 'ctx'");
317 for (
auto &point :
line) {
319 point = [
view convertPoint : point toView : nil];
322 CGContextBeginPath(ctx);
323 CGContextMoveToPoint(ctx,
line[0].
x,
line[0].
y);
324 CGContextAddLineToPoint(ctx,
line[1].
x,
line[1].
y);
325 CGContextStrokePath(ctx);
349 }
catch (
const std::exception &) {
358 assert(segments != 0 &&
"AddDrawSegments, segments parameter is null");
359 assert(nSegments > 0 &&
"AddDrawSegments, nSegments <= 0");
362 std::unique_ptr<DrawSegments> cmd(
new DrawSegments(wid, gc, segments, nSegments));
365 }
catch (
const std::exception &) {
379 std::unique_ptr<ClearArea> cmd(
new ClearArea(wid,
r));
382 }
catch (
const std::exception &) {
399 std::unique_ptr<CopyArea> cmd(
new CopyArea(src, dst, gc, area,
Point(dstX, dstY)));
402 }
catch (
const std::exception &) {
413 len = std::strlen(
text);
414 const std::string substr(
text, len);
418 }
catch (
const std::exception &) {
433 std::unique_ptr<FillRectangle> cmd(
new FillRectangle(wid, gc,
r));
436 }
catch (
const std::exception &) {
451 std::unique_ptr<DrawRectangle> cmd(
new DrawRectangle(wid, gc,
r));
454 }
catch (
const std::exception &) {
463 assert(polygon != 0 &&
"AddFillPolygon, polygon parameter is null");
464 assert(nPoints > 0 &&
"AddFillPolygon, nPoints <= 0");
467 std::unique_ptr<FillPolygon> cmd(
new FillPolygon(wid, gc, polygon, nPoints));
470 }
catch (
const std::exception &) {
478 assert(view != nil &&
"AddUpdateWindow, view parameter is nil");
481 std::unique_ptr<UpdateWindow> cmd(
new UpdateWindow(view));
484 }
catch (
const std::exception &) {
493 std::unique_ptr<DeletePixmap> cmd(
new DeletePixmap(pixmapID));
496 }
catch (
const std::exception &) {
508 }
catch (
const std::exception &) {
520 }
catch (
const std::exception &) {
528 assert(impl != 0 &&
"Flush, impl parameter is null");
544 if (drawable.fIsPixmap) {
551 if (prevView != view)
557 if ([view lockFocusIfCanDraw]) {
558 NSGraphicsContext *nsContext = [NSGraphicsContext currentContext];
559 assert(nsContext != nil &&
"Flush, currentContext is nil");
561 assert(currContext != 0 &&
"Flush, graphicsPort is null");
564 if (prevContext && prevContext != currContext)
565 CGContextFlush(prevContext);
566 prevContext = currContext;
584 withMask : nil clipOrigin :
Point() toPoint :
Point()];
591 }
catch (
const std::exception &) {
602 CGContextFlush(currContext);
621 assert(impl != 0 &&
"FlushXOROps, impl parameter is null");
624 assert([drawable isKindOfClass : [
QuartzView class]] &&
625 "FlushXOROps, drawable must be of type QuartzView");
630 auto xorWindow = [window findXorWindow];
632 ::Warning(
"FlushXOROps",
"No XorDrawingWindow found to draw into");
638 [cv setXorOperations:
fXorOps];
640 [cv setNeedsDisplay : YES];
708bool RectsOverlap(
const NSRect &r1,
const NSRect &r2)
710 if (r2.origin.x >= r1.origin.x + r1.size.width)
712 if (r2.origin.x + r2.size.width <= r1.origin.x)
714 if (r2.origin.y >= r1.origin.y + r1.size.height)
716 if (r2.origin.y + r2.size.height <= r1.origin.y)
740 assert(view != nil &&
"ClipOverlaps, view parameter is nil");
742 typedef std::vector<QuartzView *>::reverse_iterator reverse_iterator;
743 typedef std::vector<CGRect>::iterator rect_iterator;
766 const NSRect frame2 = view.frame;
770 bool doCheck =
false;
772 if (ancestorView == sibling) {
777 }
else if (!doCheck || sibling.fMapState !=
kIsViewable) {
781 frame1 = sibling.frame;
783 if (!frame1.size.width || !frame1.size.height)
786 frame1.origin = [sibling.fParentView convertPoint : frame1.origin
790 if (RectsOverlap(frame2, frame1)) {
792 clipRect.
fX1 = frame1.origin.x;
793 clipRect.
fX2 = clipRect.
fX1 + frame1.size.width;
794 clipRect.
fY1 = frame1.origin.y;
795 clipRect.
fY2 = clipRect.
fY1 + frame1.size.height;
807 frame1 = child.frame;
809 if (!frame1.size.width || !frame1.size.height)
813 frame1.origin = [view convertPoint : frame1.origin toView : view.
fParentView];
815 if (RectsOverlap(frame2, frame1)) {
816 clipRect.
fX1 = frame1.origin.x;
817 clipRect.
fX2 = clipRect.
fX1 + frame1.size.width;
818 clipRect.
fY1 = frame1.origin.y;
819 clipRect.
fY2 = clipRect.
fY1 + frame1.size.height;
828 WidgetRect rect(frame2.origin.x, frame2.origin.y, frame2.origin.x + frame2.size.width,
829 frame2.origin.y + frame2.size.height);
837 for (; recIt != eIt; ++recIt) {
838 if (!recIt->size.width && !recIt->size.height) {
840 assert(
fClippedRegion.size() == 1 &&
"ClipOverlaps, internal logic error");
843 recIt->origin = NSPointToCGPoint([view.
fParentView convertPoint :
844 NSPointFromCGPoint(recIt->origin) toView : view]);
852typedef std::vector<int>::iterator int_iterator;
855int_iterator BinarySearchLeft(int_iterator
first, int_iterator last,
int value)
860 const int_iterator it = std::lower_bound(
first, last, value);
861 assert(it != last && (it ==
first || *it == value) &&
"internal logic error");
864 return it ==
first && *it != value ? last : it;
868int_iterator BinarySearchRight(int_iterator
first, int_iterator last,
int value)
873 const int_iterator it = std::lower_bound(
first, last, value);
874 assert((it == last || *it == value) &&
"internal logic error");
903 typedef std::vector<WidgetRect>::const_iterator rect_const_iterator;
905 assert(
fRectsToClip.size() != 0 &&
"BuildClipRegion, nothing to clip");
913 for (; recIt != endIt; ++recIt) {
914 if (recIt->fX1 <= rect.
fX1 && recIt->fX2 >= rect.
fX2 &&
915 recIt->fY1 <= rect.
fY1 && recIt->fY2 >= rect.
fY2) {
921 if (recIt->fX1 > rect.
fX1)
924 if (recIt->fX2 < rect.
fX2)
927 if (recIt->fY1 > rect.
fY1)
930 if (recIt->fY2 < rect.
fY2)
938 const int_iterator xBoundsEnd = std::unique(
fXBounds.begin(),
fXBounds.end());
939 const int_iterator yBoundsEnd = std::unique(
fYBounds.begin(),
fYBounds.end());
945 fGrid.assign(nXBands * nYBands,
false);
949 for (; recIt != endIt; ++recIt) {
950 const int_iterator left = BinarySearchLeft(
fXBounds.begin(), xBoundsEnd, recIt->fX1);
951 const size_type firstXBand = left == xBoundsEnd ? 0 : left -
fXBounds.begin() + 1;
953 const int_iterator right = BinarySearchRight(
fXBounds.begin(), xBoundsEnd, recIt->fX2);
956 const int_iterator bottom = BinarySearchLeft(
fYBounds.begin(), yBoundsEnd, recIt->fY1);
957 const size_type firstYBand = bottom == yBoundsEnd ? 0 : bottom -
fYBounds.begin() + 1;
959 const int_iterator top = BinarySearchRight(
fYBounds.begin(), yBoundsEnd, recIt->fY2);
962 for (
size_type i = firstYBand; i < lastYBand; ++i) {
964 for (
size_type j = firstXBand; j < lastXBand; ++j)
965 fGrid[baseIndex + j] =
true;
973 for (
size_type i = 0; i < nYBands; ++i) {
975 for (
size_type j = 0; j < nXBands; ++j) {
976 if (!
fGrid[baseIndex + j]) {
980 newRect.size.width = (j == nXBands - 1 ? rect.
fX2 :
fXBounds[j]) - newRect.origin.x;
981 newRect.size.height = (i == nYBands - 1 ? rect.
fY2 :
fYBounds[i]) - newRect.origin.y;
Handle_t Pixmap_t
Pixmap handle.
Handle_t Drawable_t
Drawable handle.
Handle_t Window_t
Window handle.
static const double x2[5]
static const double x1[5]
include TDocParser_001 C image html pict1_TDocParser_001 png width
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
NSObject< X11Drawable > * GetDrawable(Drawable_t drawableD) const
NSObject< X11Window > * GetWindow(Window_t windowID) const
ClearArea(Window_t wid, const Rectangle_t &area)
void RemoveXORGraphicsOperationsForWindow(Window_t wid)
void AddDrawBoxXor(Window_t windowID, Int_t x1, Int_t y1, Int_t x2, Int_t y2)
std::vector< WidgetRect > fRectsToClip
std::vector< CGRect > fClippedRegion
std::vector< Command * > fXorOps
std::vector< bool > fGrid
void AddDrawLineXor(Window_t windowID, Int_t x1, Int_t y1, Int_t x2, Int_t y2)
void Flush(Details::CocoaPrivate *impl)
void AddDrawSegments(Drawable_t wid, const GCValues_t &gc, const Segment_t *segments, Int_t nSegments)
void AddFillPolygon(Drawable_t wid, const GCValues_t &gc, const Point_t *polygon, Int_t nPoints)
void FlushXOROps(Details::CocoaPrivate *impl)
void ClipOverlaps(QuartzView *view)
std::vector< QuartzView * > fViewBranch
void RemoveGraphicsOperationsForWindow(Window_t wid)
void AddClearArea(Window_t wid, Int_t x, Int_t y, UInt_t w, UInt_t h)
std::vector< int > fYBounds
void AddDrawRectangle(Drawable_t wid, const GCValues_t &gc, Int_t x, Int_t y, UInt_t w, UInt_t h)
void ClearXOROperations()
void AddDrawLine(Drawable_t wid, const GCValues_t &gc, Int_t x1, Int_t y1, Int_t x2, Int_t y2)
void RemoveOperationsForDrawable(Drawable_t wid)
std::vector< Command * >::size_type size_type
void AddDrawString(Drawable_t wid, const GCValues_t &gc, Int_t x, Int_t y, const char *text, Int_t len)
void AddDeletePixmap(Pixmap_t pixmap)
std::vector< Command * > fCommands
std::vector< int > fXBounds
void AddCopyArea(Drawable_t src, Drawable_t dst, const GCValues_t &gc, Int_t srcX, Int_t srcY, UInt_t width, UInt_t height, Int_t dstX, Int_t dstY)
void AddUpdateWindow(QuartzView *view)
void BuildClipRegion(const WidgetRect &rect)
void AddFillRectangle(Drawable_t wid, const GCValues_t &gc, Int_t x, Int_t y, UInt_t w, UInt_t h)
virtual bool IsGraphicsCommand() const
virtual void Execute() const =0
virtual bool HasOperand(Drawable_t drawable) const
bool HasOperand(Drawable_t drawable) const
CopyArea(Drawable_t src, Drawable_t dst, const GCValues_t &gc, const Rectangle_t &area, const Point &dstPoint)
DeletePixmap(Pixmap_t pixmap)
DrawBoxXor(Window_t windowID, const Point &p1, const Point &p2)
DrawLineXor(Window_t windowID, const Point &p1, const Point &p2)
DrawLine(Drawable_t wid, const GCValues_t &gc, const Point &p1, const Point &p2)
DrawRectangle(Drawable_t wid, const GCValues_t &gc, const Rectangle_t &rectangle)
std::vector< Segment_t > fSegments
DrawSegments(Drawable_t wid, const GCValues_t &gc, const Segment_t *segments, Int_t nSegments)
DrawString(Drawable_t wid, const GCValues_t &gc, const Point &point, const std::string &text)
std::vector< Point_t > fPolygon
FillPolygon(Drawable_t wid, const GCValues_t &gc, const Point_t *points, Int_t nPoints)
const Rectangle_t fRectangle
FillRectangle(Drawable_t wid, const GCValues_t &gc, const Rectangle_t &rectangle)
UpdateWindow(QuartzView *view)
This class implements TVirtualX interface for MacOS X, using Cocoa and Quartz 2D.
void DrawLineAux(Drawable_t wid, const GCValues_t &gcVals, Int_t x1, Int_t y1, Int_t x2, Int_t y2)
void FillRectangleAux(Drawable_t wid, const GCValues_t &gcVals, Int_t x, Int_t y, UInt_t w, UInt_t h)
void CopyAreaAux(Drawable_t src, Drawable_t dst, const GCValues_t &gc, Int_t srcX, Int_t srcY, UInt_t width, UInt_t height, Int_t dstX, Int_t dstY)
void DrawRectangleAux(Drawable_t wid, const GCValues_t &gcVals, Int_t x, Int_t y, UInt_t w, UInt_t h)
void DrawStringAux(Drawable_t wid, const GCValues_t &gc, Int_t x, Int_t y, const char *s, Int_t len)
void ClearAreaAux(Window_t wid, Int_t x, Int_t y, UInt_t w, UInt_t h)
void DrawSegmentsAux(Drawable_t wid, const GCValues_t &gcVals, const Segment_t *segments, Int_t nSegments)
QuartzPixmap * fBackBuffer
QuartzWindow * fQuartzWindow
QuartzWindow * fQuartzWindow
QuartzImage * fShapeCombineMask
void ClipToShapeMask(NSView< X11Window > *view, CGContextRef ctx)
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
Graphics context structure.
Pixmap_t fClipMask
bitmap clipping; other calls for rects
Point structure (maps to the X11 XPoint structure)
Rectangle structure (maps to the X11 XRectangle structure)
Used for drawing line segments (maps to the X11 XSegments structure)