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");
291 const auto height =
fP2.fY -
fP1.fY;
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 &) {
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 &) {
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 Drawable_t
Drawable handle.
Handle_t Window_t
Window 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).
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).
lv DrawLine(0.33, 0.0, 0.33, 1.0)