20#include <Cocoa/Cocoa.h>
86 "Execute, gVirtualX is either null or not of TGCocoa type");
96 assert(segments != 0 &&
"DrawSegments, segments parameter is null");
97 assert(nSegments > 0 &&
"DrawSegments, nSegments <= 0");
99 fSegments.assign(segments, segments + nSegments);
106 "Execute, gVirtualX is either null or not of TGCocoa type");
122 "Execute, gVirtualX is either null or not of TGCocoa type");
140 return fID == drawable ||
fSrc == drawable ||
fGC.fClipMask == drawable;
147 "Execute, gVirtualX is either null or not of TGCocoa type");
156 const std::string &
text)
167 "Execute, gVirtualX is either null or not of TGCocoa type");
185 "Execute, gVirtualX is either null or not of TGCocoa type");
197 assert(
points != 0 &&
"FillPolygon, points parameter is null");
198 assert(nPoints > 0 &&
"FillPolygon, nPoints <= 0");
207 "Execute, gVirtualX is either null or not of TGCocoa type");
224 "Execute, gVirtualX is either null or not of TGCocoa type");
236 assert(
view != nil &&
"UpdateWindow, view parameter is nil");
242 assert(
fView.fContext != 0 &&
"Execute, view.fContext is null");
245 [
fView copy : pixmap area :
Rectangle(0, 0, pixmap.fWidth, pixmap.fHeight)
246 withMask : nil clipOrigin :
Point() toPoint :
Point()];
259 "Execute, gVirtualX is either null or not of TGCocoa type");
271 std::swap(
fP1.fX,
fP2.fX);
273 std::swap(
fP1.fY,
fP2.fY);
283 return NSPoint{CGFloat(rp.fX), CGFloat(rp.fY)};
289 assert(ctx &&
"Execute, 'ctx' parameter is nullptr");
294 CGContextStrokeRect(ctx, CGRectMake(btLeft.x, btLeft.y,
fP2.fX -
fP1.fX,
height));
314 assert(ctx &&
"Execute, invalid (nullptr) parameter 'ctx'");
318 for (
auto &point :
line) {
320 point = [
view convertPoint : point toView : nil];
323 CGContextBeginPath(ctx);
324 CGContextMoveToPoint(ctx,
line[0].
x,
line[0].
y);
325 CGContextAddLineToPoint(ctx,
line[1].
x,
line[1].
y);
326 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 &) {
382 }
catch (
const std::exception &) {
402 }
catch (
const std::exception &) {
414 const std::string substr(
text,
len);
418 }
catch (
const std::exception &) {
436 }
catch (
const std::exception &) {
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 &) {
504 assert(impl != 0 &&
"Flush, impl parameter is null");
520 if (drawable.fIsPixmap) {
527 if (prevView != view)
533 if ([view lockFocusIfCanDraw]) {
534 NSGraphicsContext *nsContext = [NSGraphicsContext currentContext];
535 assert(nsContext != nil &&
"Flush, currentContext is nil");
537 assert(currContext != 0 &&
"Flush, graphicsPort is null");
540 if (prevContext && prevContext != currContext)
541 CGContextFlush(prevContext);
542 prevContext = currContext;
560 withMask : nil clipOrigin :
Point() toPoint :
Point()];
567 }
catch (
const std::exception &) {
578 CGContextFlush(currContext);
621bool RectsOverlap(
const NSRect &r1,
const NSRect &r2)
623 if (r2.origin.x >= r1.origin.x + r1.size.width)
625 if (r2.origin.x + r2.size.width <= r1.origin.x)
627 if (r2.origin.y >= r1.origin.y + r1.size.height)
629 if (r2.origin.y + r2.size.height <= r1.origin.y)
653 assert(view != nil &&
"ClipOverlaps, view parameter is nil");
655 typedef std::vector<QuartzView *>::reverse_iterator reverse_iterator;
656 typedef std::vector<CGRect>::iterator rect_iterator;
679 const NSRect frame2 = view.frame;
683 bool doCheck =
false;
685 if (ancestorView == sibling) {
690 }
else if (!doCheck || sibling.fMapState !=
kIsViewable) {
694 frame1 = sibling.frame;
696 if (!frame1.size.width || !frame1.size.height)
699 frame1.origin = [sibling.fParentView convertPoint : frame1.origin
703 if (RectsOverlap(frame2, frame1)) {
705 clipRect.
fX1 = frame1.origin.x;
706 clipRect.
fX2 = clipRect.
fX1 + frame1.size.width;
707 clipRect.
fY1 = frame1.origin.y;
708 clipRect.
fY2 = clipRect.
fY1 + frame1.size.height;
720 frame1 =
child.frame;
722 if (!frame1.size.width || !frame1.size.height)
726 frame1.origin = [view convertPoint : frame1.origin toView : view.
fParentView];
728 if (RectsOverlap(frame2, frame1)) {
729 clipRect.
fX1 = frame1.origin.x;
730 clipRect.
fX2 = clipRect.
fX1 + frame1.size.width;
731 clipRect.
fY1 = frame1.origin.y;
732 clipRect.
fY2 = clipRect.
fY1 + frame1.size.height;
741 WidgetRect rect(frame2.origin.x, frame2.origin.y, frame2.origin.x + frame2.size.width,
742 frame2.origin.y + frame2.size.height);
750 for (; recIt != eIt; ++recIt) {
751 if (!recIt->size.width && !recIt->size.height) {
753 assert(
fClippedRegion.size() == 1 &&
"ClipOverlaps, internal logic error");
756 recIt->origin = NSPointToCGPoint([view.
fParentView convertPoint :
757 NSPointFromCGPoint(recIt->origin) toView : view]);
765typedef std::vector<int>::iterator int_iterator;
768int_iterator BinarySearchLeft(int_iterator first, int_iterator last,
int value)
773 const int_iterator it = std::lower_bound(first, last,
value);
774 assert(it != last && (it == first || *it ==
value) &&
"internal logic error");
777 return it == first && *it !=
value ? last : it;
781int_iterator BinarySearchRight(int_iterator first, int_iterator last,
int value)
786 const int_iterator it = std::lower_bound(first, last,
value);
787 assert((it == last || *it ==
value) &&
"internal logic error");
816 typedef std::vector<WidgetRect>::const_iterator rect_const_iterator;
818 assert(
fRectsToClip.size() != 0 &&
"BuildClipRegion, nothing to clip");
826 for (; recIt != endIt; ++recIt) {
827 if (recIt->fX1 <=
rect.fX1 && recIt->fX2 >=
rect.fX2 &&
828 recIt->fY1 <=
rect.fY1 && recIt->fY2 >=
rect.fY2) {
834 if (recIt->fX1 >
rect.fX1)
837 if (recIt->fX2 <
rect.fX2)
840 if (recIt->fY1 >
rect.fY1)
843 if (recIt->fY2 <
rect.fY2)
851 const int_iterator xBoundsEnd = std::unique(
fXBounds.begin(),
fXBounds.end());
852 const int_iterator yBoundsEnd = std::unique(
fYBounds.begin(),
fYBounds.end());
858 fGrid.assign(nXBands * nYBands,
false);
862 for (; recIt != endIt; ++recIt) {
863 const int_iterator left = BinarySearchLeft(
fXBounds.begin(), xBoundsEnd, recIt->fX1);
864 const size_type firstXBand = left == xBoundsEnd ? 0 : left -
fXBounds.begin() + 1;
866 const int_iterator right = BinarySearchRight(
fXBounds.begin(), xBoundsEnd, recIt->fX2);
869 const int_iterator bottom = BinarySearchLeft(
fYBounds.begin(), yBoundsEnd, recIt->fY1);
870 const size_type firstYBand = bottom == yBoundsEnd ? 0 : bottom -
fYBounds.begin() + 1;
872 const int_iterator top = BinarySearchRight(
fYBounds.begin(), yBoundsEnd, recIt->fY2);
875 for (
size_type i = firstYBand; i < lastYBand; ++i) {
877 for (
size_type j = firstXBand; j < lastXBand; ++j)
878 fGrid[baseIndex + j] =
true;
886 for (
size_type i = 0; i < nYBands; ++i) {
888 for (
size_type j = 0; j < nXBands; ++j) {
889 if (!
fGrid[baseIndex + j]) {
893 newRect.size.width = (j == nXBands - 1 ?
rect.fX2 :
fXBounds[j]) - newRect.origin.x;
894 newRect.size.height = (i == nYBands - 1 ?
rect.fY2 :
fYBounds[i]) - newRect.origin.y;
Handle_t Pixmap_t
Pixmap handle.
Handle_t Window_t
Window handle.
Handle_t Drawable_t
Drawable handle.
unsigned short UShort_t
Unsigned Short integer 2 bytes (unsigned short).
int Int_t
Signed integer 4 bytes (int).
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void w
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize wid
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t rect
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t child
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t CopyArea
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char FillPolygon
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char DrawLine
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t FillRectangle
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t points
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t src
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t height
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void gc
Option_t Option_t TPoint TPoint const char text
Option_t Option_t TPoint TPoint const char y1
NSObject< X11Drawable > * GetDrawable(Drawable_t drawableD) const
NSObject< X11Window > * GetWindow(Window_t windowID) const
ClearArea(Window_t wid, const Rectangle_t &area)
std::vector< WidgetRect > fRectsToClip
std::vector< CGRect > fClippedRegion
std::vector< bool > fGrid
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 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 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
QuartzImage * fShapeCombineMask
if(pos!=-1) leafTypeName.Remove(pos)
void ClipToShapeMask(NSView< X11Window > *view, CGContextRef ctx)
Graphics context structure.
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).