21 #include <Cocoa/Cocoa.h> 23 # include <ft2build.h> 24 # include FT_FREETYPE_H 58 void ConvertPointsROOTToCocoa(
Int_t nPoints,
const TPoint *
xy, std::vector<TPoint> &dst,
59 NSObject<X11Drawable> *drawable)
61 assert(nPoints != 0 &&
"ConvertPointsROOTToCocoa, nPoints parameter is 0");
62 assert(xy != 0 &&
"ConvertPointsROOTToCocoa, xy parameter is null");
63 assert(drawable != 0 &&
"ConvertPointsROOTToCocoa, drawable parameter is null");
66 for (
Int_t i = 0; i < nPoints; ++i) {
76 : fUseAA(true), fUseFAAA(false)
86 Error(
"TGQuartz",
"TTF::Init() failed");
106 Error(
"TGQuartz",
"TTF::Init() failed");
129 CGContextRef ctx = drawable.fContext;
142 polygon[0].
fX =
x1, polygon[0].
fY = y1;
143 polygon[1].
fX =
x2, polygon[1].
fY = y1;
144 polygon[2].
fX =
x2, polygon[2].
fY = y2;
145 polygon[3].
fX =
x1, polygon[3].
fY = y2;
154 unsigned patternIndex = 0;
162 Error(
"DrawBox",
"SetFillAreaParameters failed");
190 NSObject<X11Drawable> *
const drawable =
196 CGContextRef ctx = drawable.fContext;
211 if (
const TColorGradient *
const gradient = dynamic_cast<const TColorGradient *>(fillColor)) {
215 unsigned patternIndex = 0;
217 Error(
"DrawFillArea",
"SetFillAreaParameters failed");
249 NSObject<X11Drawable> *
const drawable =
254 CGContextRef ctx = drawable.fContext;
285 NSObject<X11Drawable> *
const drawable =
290 CGContextRef ctx = drawable.fContext;
323 NSObject<X11Drawable> *
const drawable =
328 CGContextRef ctx = drawable.fContext;
355 if (!text || !text[0])
361 NSObject<X11Drawable> *
const drawable =
366 CGContextRef ctx = drawable.fContext;
370 CGContextSetTextMatrix(ctx, CGAffineTransformIdentity);
375 if (fontIndex == 12 || fontIndex == 15) {
381 typedef std::vector<UniChar>::size_type size_type;
383 std::vector<UniChar> unichars(std::strlen(text));
384 for (size_type i = 0, len = unichars.size(); i < len; ++i)
385 unichars[i] = 0xF000 + (
unsigned char)text[i];
394 }
catch (
const std::exception &
e) {
395 Error(
"DrawText",
"Exception from Quartz::TextLine: %s", e.what());
402 if (!text || !text[0])
406 Error(
"DrawText",
"wchar_t string to draw, but TTF initialization failed");
436 if (!text || !text[0]) {
444 if (fontIndex == 12 || fontIndex == 15) {
445 typedef std::vector<UniChar>::size_type size_type;
447 std::vector<UniChar> unichars(std::strlen(text));
448 for (size_type i = 0, len = unichars.size(); i < len; ++i)
449 unichars[i] = 0xF000 + (
unsigned char)text[i];
451 fPimpl->fFontManager.GetTextBounds(w, h, unichars);
453 fPimpl->fFontManager.GetTextBounds(w, h, text);
478 if (!text || !text[0])
483 if (fontIndex == 12 || fontIndex == 15) {
485 typedef std::vector<UniChar>::size_type size_type;
487 std::vector<UniChar> unichars(std::strlen(text));
488 for (size_type i = 0, len = unichars.size(); i < len; ++i)
489 unichars[i] = 0xF000 + (
unsigned char)text[i];
491 return Int_t(
fPimpl->fFontManager.GetAscent(unichars));
493 return Int_t(
fPimpl->fFontManager.GetAscent(text));
519 if (!text || !text[0])
524 if (fontIndex == 12 || fontIndex == 15) {
526 typedef std::vector<UniChar>::size_type size_type;
528 std::vector<UniChar> unichars(std::strlen(text));
529 for (size_type i = 0, len = unichars.size(); i < len; ++i)
530 unichars[i] = 0xF000 + (
unsigned char)text[i];
532 return Int_t(
fPimpl->fFontManager.GetDescent(unichars));
534 return Int_t(
fPimpl->fFontManager.GetDescent(text));
645 Error(
"SetTextFont",
"TTF is not initialized");
658 Error(
"SetTextFont",
"TTF is not initialized");
673 Error(
"SetTextSize",
"TTF is not initialized");
752 if (x +
int(w) <= 0 || x >=
int(width))
755 if (y +
int(h) <= 0 || y >=
int(height))
777 dstPixmap = (QuartzPixmap *)drawable;
778 else if ([drawable isKindOfClass : [
QuartzView class]] || [drawable isKindOfClass : [
QuartzWindow class]])
779 dstPixmap = ((NSObject<X11Window> *)drawable).fBackBuffer;
783 Error(
"DrawText",
"fSelectedDrawable is neither QuartzPixmap nor a double buffered window");
802 Util::NSScopeGuard<QuartzPixmap> pixmap([[QuartzPixmap alloc] initWithW : w
H : h scaleFactor : 1.
f]);
804 Error(
"DrawText",
"pixmap creation failed");
808 const unsigned char defaultBackgroundPixel[] = {255, 255, 255, 255};
809 Util::ScopedArray<unsigned char> arrayGuard;
818 arrayGuard.Reset([dstPixmap readColorBits : bbox]);
820 if (!arrayGuard.Get()) {
821 Error(
"DrawText",
"problem with reading background pixels");
826 const Int_t xo = x1 < 0 ? -
x1 : 0;
827 const Int_t yo = y1 < 0 ? -y1 : 0;
829 for (
int yp = 0; yp < int(bbox.fHeight) && yo + yp <
h; ++yp) {
830 const unsigned char *srcBase = arrayGuard.Get() + bbox.fWidth * yp * 4;
831 for (
int xp = 0; xp < int(bbox.fWidth) && xo + xp < w; ++xp) {
832 const unsigned char *
const pixel = srcBase + xp * 4;
833 [pixmap.Get() putPixel : pixel
X : xo + xp
Y : yo + yp];
838 [pixmap.Get() addPixel : defaultBackgroundPixel];
841 CGContextRef ctx = drawable.fContext;
844 CGContextSetRGBStrokeColor(ctx, 0., 0., 1., 1.);
848 if (FT_Glyph_To_Bitmap(&glyph->
fImage,
TTF::GetSmoothing() ? ft_render_mode_normal : ft_render_mode_mono, 0, 1 ))
851 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->
fImage;
852 FT_Bitmap *source = &bitmap->bitmap;
853 const Int_t bx = bitmap->left + xOff;
854 const Int_t by = h - bitmap->top - yOff;
862 [dstPixmap copy : pixmap.Get() area : copyArea withMask : nil clipOrigin :
X11::Point() toPoint : dstPoint];
875 assert(pixmap != nil &&
"DrawFTGlyphIntoPixmap, pixmap parameter is nil");
876 assert(source != 0 &&
"DrawFTGlyphIntoPixmap, source parameter is null");
882 if (back ==
ULong_t(-1) && source->width) {
883 const int maxDots = 50000;
884 int dots =
Int_t(source->width * source->rows);
892 for (
int y = 0, dotCnt = 0;
y < int(source->rows);
y++) {
893 for (
int x = 0;
x < int(source->width);
x++) {
895 const unsigned char *
const pixels = pixmap.
fData + (
y + by) * pixmap.
fWidth * 4 + (
x + bx) * 4;
896 r +=
UShort_t(pixels[0] / 255. * 0xffff);
897 g +=
UShort_t(pixels[1] / 255. * 0xffff);
898 b +=
UShort_t(pixels[2] / 255. * 0xffff);
901 if (++dotCnt >= maxDots)
912 if (col[0].fRed == r && col[0].fGreen == g && col[0].fBlue ==
b) {
925 if (fore != col[4].fPixel || back != col[0].fPixel) {
934 for (
int x = 3;
x > 0; --
x) {
944 const unsigned char *s = source->buffer;
945 for (
int y = 0;
y < (int) source->rows; ++
y) {
946 for (
int x = 0;
x < (int) source->width; ++
x) {
947 unsigned char d = *s++ & 0xff;
948 d = ((d + 10) * 5) / 256;
951 if (d &&
x < (
int) source->width) {
952 const UChar_t pixel[] = {
UChar_t(
double(col[d].fRed) / 0xffff * 255),
953 UChar_t(
double(col[d].fGreen) / 0xffff * 255),
954 UChar_t(
double(col[d].fBlue) / 0xffff * 255), 255};
955 [pixmap putPixel : pixel
X : bx +
x Y : by +
y];
961 unsigned char rgba[4] = {};
966 const unsigned char *row = source->buffer;
967 for (
int y = 0;
y < int(source->rows); ++
y) {
969 const unsigned char *s = row;
970 for (
int x = 0;
x < int(source->width); ++
x) {
975 [pixmap putPixel : rgba
X : bx +
x Y : by +
y];
981 row += source->pitch;
993 if (value ==
"auto") {
994 [[NSScreen mainScreen] backingScaleFactor] > 1. ?
fUseAA = true :
fUseAA =
false;
995 }
else if (value ==
"no")
998 assert(value ==
"yes" &&
"SetAA, value must be 'yes', 'no' or 'auto'");
1002 if (valuefa ==
"auto") {
1003 [[NSScreen mainScreen] backingScaleFactor] > 1. ?
fUseFAAA = true :
fUseFAAA =
false;
1004 }
else if (valuefa ==
"no")
1007 assert(valuefa ==
"yes" &&
"SetAA, value must be 'yes', 'no' or 'auto'");
1016 assert(calledFrom != 0 &&
"GetSelectedDrawableChecked, calledFrom parameter is null");
1017 assert(
fSelectedDrawable >
fPimpl->GetRootWindowID() &&
"GetSelectedDrawableChecked, bad drawable is selected");
1020 if (!drawable.fIsPixmap) {
1022 if ([drawable isKindOfClass : [
QuartzView class]]) {
1023 QuartzView *view = (QuartzView *)drawable;
1025 Error(calledFrom,
"Selected window is not double buffered");
1031 Error(calledFrom,
"Selected drawable is neither a pixmap, nor a double buffered window");
1036 if (!drawable.fContext) {
1037 Error(calledFrom,
"Context is null");
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
static void Init()
Initialise the TrueType fonts interface.
virtual void SetMarkerColor(Color_t cindex)
Sets color index "cindex" for markers.
std::unique_ptr< ROOT::MacOSX::Details::CocoaPrivate > fPimpl
virtual Float_t GetTextMagnitude()
Returns the current font magnification factor.
std::vector< unsigned char > fData
Bool_t SetFillAreaParameters(CGContextRef ctx, unsigned *patternIndex)
virtual void DrawBox(Int_t x1, Int_t y1, Int_t x2, Int_t y2, EBoxMode mode)
Draws a box between [x1,y1] and [x2,y2] according to the "mode".
virtual Color_t GetTextColor() const
Return the text color.
virtual void DrawText(Int_t x, Int_t y, Float_t angle, Float_t mgn, const char *text, ETextMode mode)
Draws a text string using current font.
virtual void SetTextColor(Color_t cindex)
Sets the color index "cindex" for text.
static Bool_t IsInitialized()
FT_Glyph fImage
glyph image
bool AdjustCropArea(const Rectangle &srcRect, Rectangle &cropArea)
virtual void DrawFillArea(Int_t n, TPoint *xy)
Fills area described by the polygon.
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
QuartzPixmap * fBackBuffer
virtual void QueryColor(Colormap_t cmap, ColorStruct_t &color)
Returns the current RGB value for the pixel in the "color" structure.
std::vector< TPoint > fConvertedPoints
virtual Width_t GetLineWidth() const
Return the line width.
virtual void DrawCellArray(Int_t x1, Int_t y1, Int_t x2, Int_t y2, Int_t nx, Int_t ny, Int_t *ic)
Draws a cell array.
virtual void SetLineWidth(Width_t width)
Sets the line width.
virtual Style_t GetMarkerStyle() const
Return the marker style.
virtual void DrawPolyMarker(Int_t n, TPoint *xy)
Draws "n" markers with the current attributes at position [x,y].
virtual void SetTextFont(Font_t tfont=62)
Set the text font.
virtual Style_t GetLineStyle() const
Return the line style.
static const double x2[5]
virtual void SetLineColor(Color_t cindex)
Sets color index "cindex" for drawing lines.
static void LayoutGlyphs()
Compute the glyphs positions, fgAscent and fgWidth (needed for alignment).
static void SetTextFont(Font_t fontnumber)
Set specified font.
virtual Float_t GetTextSize() const
Return the text size.
static void PrepareString(const char *string)
Put the characters in "string" in the "glyphs" array.
virtual void DrawLine(Int_t x1, Int_t y1, Int_t x2, Int_t y2)
Draws a line.
virtual Int_t GetFontDescent() const
Returns the descent of the current font (in pixels.
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
virtual Size_t GetMarkerSize() const
Return the marker size.
static TTGlyph * GetGlyphs()
virtual Bool_t AllocColor(Colormap_t cmap, ColorStruct_t &color)
Allocates a read-only colormap entry corresponding to the closest RGB value supported by the hardware...
virtual void SetTextSize(Float_t textsize)
Sets the current text size to "textsize".
virtual void SetTextAlign(Short_t align=11)
Set the text alignment.
void DrawPolyLine(CGContextRef ctx, Int_t n, TPoint *xy)
static void SetSmoothing(Bool_t state)
Set smoothing (anti-aliasing) flag.
Drawable_t fSelectedDrawable
virtual void SetLineColor(Color_t lcolor)
Set the line color.
void DrawFillArea(CGContextRef ctx, Int_t n, TPoint *xy, Bool_t drawShadow)
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
virtual Font_t GetTextFont() const
Return the text font.
virtual void SetMarkerSize(Float_t markersize)
Sets marker size index.
virtual Int_t GetValue(const char *name, Int_t dflt)
Returns the integer value for a resource.
static FT_Matrix * GetRotMatrix()
TTF helper class containing glyphs description.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
void DrawPolyMarker(CGContextRef ctx, const std::vector< TPoint > &marker, Size_t markerSize, Style_t markerStyle)
void DrawFTGlyphIntoPixmap(void *pixmap, FT_Bitmap *source, ULong_t fore, ULong_t back, Int_t bx, Int_t by)
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
char * Strip(const char *str, char c=' ')
Strip leading and trailing c (blanks by default) from a string.
void DrawPolygonWithGradientFill(CGContextRef ctx, const TColorGradient *extendedColor, const CGSize &sizeOfDrawable, Int_t nPoints, const TPoint *xy, Bool_t drawShadow)
virtual void SetFillColor(Color_t cindex)
Sets color index "cindex" for fill areas.
void PixelToRGB(Pixel_t pixelColor, CGFloat *rgb)
virtual void SetMarkerStyle(Style_t markerstyle)
Sets marker style.
lv DrawLine(0.33, 0.0, 0.33, 1.0)
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
void * GetSelectedDrawableChecked(const char *calledFrom) const
int LocalYROOTToCocoa(NSView< X11Window > *parentView, CGFloat yROOT)
virtual Window_t GetCurrentWindow() const
pointer to the current internal window used in canvas graphics
virtual Color_t GetLineColor() const
Return the line color.
static const double x1[5]
virtual ULong_t GetPixel(Color_t cindex)
Returns pixel value associated to specified ROOT color number "cindex".
virtual Int_t GetFontAscent() const
Returns the ascent of the current font (in pixels).
virtual Color_t GetFillColor() const
Return the fill area color.
you should not use this method at all Int_t Int_t Double_t Double_t Double_t e
The color creation and management class.
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
virtual void SetTextAlign(Short_t talign=11)
Sets the text alignment.
virtual void GetWindowSize(Drawable_t wid, Int_t &x, Int_t &y, UInt_t &w, UInt_t &h)
Returns the location and the size of window "id".
virtual void SetTextFont(Font_t fontnumber)
Sets the current text font number.
static void SetRotationMatrix(Float_t angle)
Set the rotation matrix used to rotate the font outlines.
typedef void((*Func_t)())
void RenderTTFString(Int_t x, Int_t y, ETextMode mode)
Bool_t IsTTFStringVisible(Int_t x, Int_t y, UInt_t w, UInt_t h)
This class implements TVirtualX interface for MacOS X, using Cocoa and Quartz 2D. ...
void DrawBox(CGContextRef ctx, Int_t x1, Int_t y1, Int_t x2, Int_t y2, bool hollow)
virtual void SetOpacity(Int_t percent)
Sets opacity of the current window.
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
virtual void GetTextExtent(UInt_t &w, UInt_t &h, char *text)
Returns the size of the specified character string "mess".
virtual void DrawPolyLine(Int_t n, TPoint *xy)
Draws a line through all points in the list.
const size_t kBitsPerByte
virtual void SetTextColor(Color_t tcolor=1)
Set the text color.
static void SetTextSize(Float_t textsize)
Set current text size.
void DrawLine(CGContextRef ctx) const
virtual Color_t GetMarkerColor() const
Return the marker color.
virtual Style_t GetFillStyle() const
Return the fill area style.
virtual void SetTextSize(Float_t tsize=1)
Set the text size.
virtual void SetLineStyle(Style_t linestyle)
Sets the line style.
static Int_t GetNumGlyphs()
TColorGradient extends basic TColor.
virtual void SetFillStyle(Style_t style)
Sets fill area style.
This is non-GUI part of TVirtualX interface, implemented for MacOS X, using CoreGraphics (Quartz)...
static const FT_BBox & GetBox()
static Bool_t GetSmoothing()
Short_t fTextAlign
Text alignment.