Allow creating wxGraphicsFont without using wxFont.
This is mostly important to allow using wxImage-based wxGraphicsContext without requiring X server connection under Unix: as wxFont can't be used without X server, we needed another way to create wxGraphicsFont in this case. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69360 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		| @@ -474,6 +474,7 @@ All (GUI): | |||||||
| - Derive wxAuiNotebook from wxBookCtrlBase (Steven Lamerton). | - Derive wxAuiNotebook from wxBookCtrlBase (Steven Lamerton). | ||||||
| - Fix tooltips in wxSearchCtrl and other composite controls (Catalin Raceanu). | - Fix tooltips in wxSearchCtrl and other composite controls (Catalin Raceanu). | ||||||
| - Allow converting to and from wxGraphicsBitmap and wxImage directly. | - Allow converting to and from wxGraphicsBitmap and wxImage directly. | ||||||
|  | - Allow wxGraphicsFont creation without passing by wxFont. | ||||||
|  |  | ||||||
| OSX: | OSX: | ||||||
|  |  | ||||||
|   | |||||||
| @@ -490,8 +490,12 @@ public: | |||||||
|                               wxDouble xc, wxDouble yc, wxDouble radius, |                               wxDouble xc, wxDouble yc, wxDouble radius, | ||||||
|                               const wxGraphicsGradientStops& stops) const; |                               const wxGraphicsGradientStops& stops) const; | ||||||
|  |  | ||||||
|     // sets the font |     // creates a font | ||||||
|     virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) const; |     virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) const; | ||||||
|  |     virtual wxGraphicsFont CreateFont(double sizeInPixels, | ||||||
|  |                                       const wxString& facename, | ||||||
|  |                                       int flags = wxFONTFLAG_DEFAULT, | ||||||
|  |                                       const wxColour& col = *wxBLACK) const; | ||||||
|  |  | ||||||
|     // create a native bitmap representation |     // create a native bitmap representation | ||||||
|     virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) const; |     virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) const; | ||||||
| @@ -829,6 +833,10 @@ public: | |||||||
|  |  | ||||||
|     // sets the font |     // sets the font | ||||||
|     virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) = 0; |     virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) = 0; | ||||||
|  |     virtual wxGraphicsFont CreateFont(double sizeInPixels, | ||||||
|  |                                       const wxString& facename, | ||||||
|  |                                       int flags = wxFONTFLAG_DEFAULT, | ||||||
|  |                                       const wxColour& col = *wxBLACK) = 0; | ||||||
|  |  | ||||||
|     // create a native bitmap representation |     // create a native bitmap representation | ||||||
|     virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) = 0; |     virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) = 0; | ||||||
|   | |||||||
| @@ -453,6 +453,19 @@ public: | |||||||
|     virtual wxGraphicsFont CreateFont(const wxFont& font, |     virtual wxGraphicsFont CreateFont(const wxFont& font, | ||||||
|                                       const wxColour& col = *wxBLACK) const; |                                       const wxColour& col = *wxBLACK) const; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |         Creates a font object with the specified attributes. | ||||||
|  |  | ||||||
|  |         The use of overload taking wxFont is preferred, see | ||||||
|  |         wxGraphicsRenderer::CreateFont() for more details. | ||||||
|  |  | ||||||
|  |         @since 2.9.3 | ||||||
|  |      */ | ||||||
|  |     virtual wxGraphicsFont CreateFont(double sizeInPixels, | ||||||
|  |                                       const wxString& facename, | ||||||
|  |                                       int flags = wxFONTFLAG_DEFAULT, | ||||||
|  |                                       const wxColour& col = *wxBLACK) const; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|         Creates a wxGraphicsContext from a native context. This native context |         Creates a wxGraphicsContext from a native context. This native context | ||||||
|         must be a CGContextRef for Core Graphics, a Graphics pointer for |         must be a CGContextRef for Core Graphics, a Graphics pointer for | ||||||
| @@ -1027,6 +1040,35 @@ public: | |||||||
|     virtual wxGraphicsFont CreateFont(const wxFont& font, |     virtual wxGraphicsFont CreateFont(const wxFont& font, | ||||||
|                                       const wxColour& col = *wxBLACK) = 0; |                                       const wxColour& col = *wxBLACK) = 0; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |         Creates a graphics font with the given characteristics. | ||||||
|  |  | ||||||
|  |         If possible, the CreateFont() overload taking wxFont should be used | ||||||
|  |         instead. The main advantage of this overload is that it can be used | ||||||
|  |         without X server connection under Unix when using Cairo. | ||||||
|  |  | ||||||
|  |         @param sizeInPixels | ||||||
|  |             Height of the font in user space units, i.e. normally pixels. | ||||||
|  |             Notice that this is different from the overload taking wxFont as | ||||||
|  |             wxFont size is specified in points. | ||||||
|  |         @param facename | ||||||
|  |             The name of the font. The same font name might not be available | ||||||
|  |             under all platforms so the font name can also be empty to use the | ||||||
|  |             default platform font. | ||||||
|  |         @param flags | ||||||
|  |             Combination of wxFontFlag enum elements. Currently only | ||||||
|  |             @c wxFONTFLAG_ITALIC and @c wxFONTFLAG_BOLD are supported. By | ||||||
|  |             default the normal font version is used. | ||||||
|  |         @param col | ||||||
|  |             The font colour, black by default. | ||||||
|  |  | ||||||
|  |         @since 2.9.3 | ||||||
|  |      */ | ||||||
|  |     virtual wxGraphicsFont CreateFont(double sizeInPixels, | ||||||
|  |                                       const wxString& facename, | ||||||
|  |                                       int flags = wxFONTFLAG_DEFAULT, | ||||||
|  |                                       const wxColour& col = *wxBLACK) = 0; | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|         Creates a native brush with a linear gradient. |         Creates a native brush with a linear gradient. | ||||||
|   | |||||||
| @@ -866,10 +866,11 @@ private: | |||||||
|         wxGraphicsBitmap gb(gc->CreateBitmapFromImage(m_image)); |         wxGraphicsBitmap gb(gc->CreateBitmapFromImage(m_image)); | ||||||
|  |  | ||||||
|         gc->SetFont(*wxNORMAL_FONT, *wxBLACK); |         gc->SetFont(*wxNORMAL_FONT, *wxBLACK); | ||||||
|  |  | ||||||
|         gc->DrawText("Bitmap", 0, HEIGHT/2); |         gc->DrawText("Bitmap", 0, HEIGHT/2); | ||||||
|         gc->DrawBitmap(m_bitmap, 0, 0, WIDTH, HEIGHT); |         gc->DrawBitmap(m_bitmap, 0, 0, WIDTH, HEIGHT); | ||||||
|  |  | ||||||
|  |         wxGraphicsFont gf = gc->CreateFont(wxNORMAL_FONT->GetPixelSize().y, ""); | ||||||
|  |         gc->SetFont(gf); | ||||||
|         gc->DrawText("Graphics bitmap", 0, (3*HEIGHT)/2); |         gc->DrawText("Graphics bitmap", 0, (3*HEIGHT)/2); | ||||||
|         gc->DrawBitmap(gb, 0, HEIGHT, WIDTH, HEIGHT); |         gc->DrawBitmap(gb, 0, HEIGHT, WIDTH, HEIGHT); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -837,12 +837,20 @@ wxGraphicsContext::CreateRadialGradientBrush( | |||||||
|                           ); |                           ); | ||||||
| } | } | ||||||
|  |  | ||||||
| // sets the font |  | ||||||
| wxGraphicsFont wxGraphicsContext::CreateFont( const wxFont &font , const wxColour &col ) const | wxGraphicsFont wxGraphicsContext::CreateFont( const wxFont &font , const wxColour &col ) const | ||||||
| { | { | ||||||
|     return GetRenderer()->CreateFont(font,col); |     return GetRenderer()->CreateFont(font,col); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | wxGraphicsFont | ||||||
|  | wxGraphicsContext::CreateFont(double size, | ||||||
|  |                               const wxString& facename, | ||||||
|  |                               int flags, | ||||||
|  |                               const wxColour& col) const | ||||||
|  | { | ||||||
|  |     return GetRenderer()->CreateFont(size, facename, flags, col); | ||||||
|  | } | ||||||
|  |  | ||||||
| wxGraphicsBitmap wxGraphicsContext::CreateBitmap( const wxBitmap& bmp ) const | wxGraphicsBitmap wxGraphicsContext::CreateBitmap( const wxBitmap& bmp ) const | ||||||
| { | { | ||||||
|     return GetRenderer()->CreateBitmap(bmp); |     return GetRenderer()->CreateBitmap(bmp); | ||||||
|   | |||||||
| @@ -282,14 +282,24 @@ class wxCairoFontData : public wxGraphicsObjectRefData | |||||||
| { | { | ||||||
| public: | public: | ||||||
|     wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &font, const wxColour& col ); |     wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &font, const wxColour& col ); | ||||||
|  |     wxCairoFontData(wxGraphicsRenderer* renderer, | ||||||
|  |                     double sizeInPixels, | ||||||
|  |                     const wxString& facename, | ||||||
|  |                     int flags, | ||||||
|  |                     const wxColour& col); | ||||||
|     ~wxCairoFontData(); |     ~wxCairoFontData(); | ||||||
|  |  | ||||||
|     virtual void Apply( wxGraphicsContext* context ); |     virtual bool Apply( wxGraphicsContext* context ); | ||||||
| #ifdef __WXGTK__ | #ifdef __WXGTK__ | ||||||
|     const PangoFontDescription* GetFont() const { return m_font; } |     const PangoFontDescription* GetFont() const { return m_font; } | ||||||
|     bool GetUnderlined() const { return m_underlined; } |     bool GetUnderlined() const { return m_underlined; } | ||||||
| #endif | #endif | ||||||
| private : | private : | ||||||
|  |     void InitColour(const wxColour& col); | ||||||
|  |     void InitFontComponents(const wxString& facename, | ||||||
|  |                             cairo_font_slant_t slant, | ||||||
|  |                             cairo_font_weight_t weight); | ||||||
|  |  | ||||||
|     double m_size; |     double m_size; | ||||||
|     bool m_underlined; |     bool m_underlined; | ||||||
|     double m_red; |     double m_red; | ||||||
| @@ -300,11 +310,21 @@ private : | |||||||
|     cairo_font_face_t *m_font; |     cairo_font_face_t *m_font; | ||||||
| #elif defined(__WXGTK__) | #elif defined(__WXGTK__) | ||||||
|     PangoFontDescription* m_font; |     PangoFontDescription* m_font; | ||||||
| #else | #endif | ||||||
|  |  | ||||||
|  |     // These members are used when the font is created from its face name and | ||||||
|  |     // flags (and not from wxFont) and also even when creating it from wxFont | ||||||
|  |     // on the platforms not covered above. | ||||||
|  |     // | ||||||
|  |     // Notice that we can't use cairo_font_face_t instead of storing those, | ||||||
|  |     // even though it would be simpler and need less #ifdefs, because | ||||||
|  |     // cairo_toy_font_face_create() that we'd need to create it is only | ||||||
|  |     // available in Cairo 1.8 and we require just 1.2 currently. If we do drop | ||||||
|  |     // support for < 1.8 versions in the future it would be definitely better | ||||||
|  |     // to use cairo_toy_font_face_create() instead. | ||||||
|     wxCharBuffer m_fontName; |     wxCharBuffer m_fontName; | ||||||
|     cairo_font_slant_t m_slant; |     cairo_font_slant_t m_slant; | ||||||
|     cairo_font_weight_t m_weight; |     cairo_font_weight_t m_weight; | ||||||
| #endif |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class wxCairoBitmapData : public wxGraphicsObjectRefData | class wxCairoBitmapData : public wxGraphicsObjectRefData | ||||||
| @@ -806,13 +826,29 @@ void wxCairoBrushData::Init() | |||||||
| // wxCairoFontData implementation | // wxCairoFontData implementation | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
|  |  | ||||||
| wxCairoFontData::wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &font, | void wxCairoFontData::InitColour(const wxColour& col) | ||||||
|                          const wxColour& col ) : wxGraphicsObjectRefData(renderer) |  | ||||||
| { | { | ||||||
|     m_red = col.Red()/255.0; |     m_red = col.Red()/255.0; | ||||||
|     m_green = col.Green()/255.0; |     m_green = col.Green()/255.0; | ||||||
|     m_blue = col.Blue()/255.0; |     m_blue = col.Blue()/255.0; | ||||||
|     m_alpha = col.Alpha()/255.0; |     m_alpha = col.Alpha()/255.0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void | ||||||
|  | wxCairoFontData::InitFontComponents(const wxString& facename, | ||||||
|  |                                     cairo_font_slant_t slant, | ||||||
|  |                                     cairo_font_weight_t weight) | ||||||
|  | { | ||||||
|  |     m_fontName = facename.mb_str(wxConvUTF8); | ||||||
|  |     m_slant = slant; | ||||||
|  |     m_weight = weight; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | wxCairoFontData::wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &font, | ||||||
|  |                          const wxColour& col ) : wxGraphicsObjectRefData(renderer) | ||||||
|  | { | ||||||
|  |     InitColour(col); | ||||||
|  |  | ||||||
|     m_size = font.GetPointSize(); |     m_size = font.GetPointSize(); | ||||||
|     m_underlined = font.GetUnderlined(); |     m_underlined = font.GetUnderlined(); | ||||||
|  |  | ||||||
| @@ -821,35 +857,87 @@ wxCairoFontData::wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &fo | |||||||
| #elif defined(__WXGTK__) | #elif defined(__WXGTK__) | ||||||
|     m_font = pango_font_description_copy( font.GetNativeFontInfo()->description ); |     m_font = pango_font_description_copy( font.GetNativeFontInfo()->description ); | ||||||
| #else | #else | ||||||
|     m_fontName = font.GetFaceName().mb_str(wxConvUTF8); |     InitFontComponents | ||||||
|     m_slant = font.GetStyle() == wxFONTSTYLE_ITALIC ? CAIRO_FONT_SLANT_ITALIC:CAIRO_FONT_SLANT_NORMAL; |     ( | ||||||
|     m_weight = font.GetWeight() == wxFONTWEIGHT_BOLD ? CAIRO_FONT_WEIGHT_BOLD:CAIRO_FONT_WEIGHT_NORMAL; |         font.GetFaceName(), | ||||||
|  |         font.GetStyle() == wxFONTSTYLE_ITALIC ? CAIRO_FONT_SLANT_ITALIC | ||||||
|  |                                               : CAIRO_FONT_SLANT_NORMAL, | ||||||
|  |         font.GetWeight() == wxFONTWEIGHT_BOLD ? CAIRO_FONT_WEIGHT_BOLD | ||||||
|  |                                               : CAIRO_FONT_WEIGHT_NORMAL | ||||||
|  |     ); | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|  | wxCairoFontData::wxCairoFontData(wxGraphicsRenderer* renderer, | ||||||
|  |                                  double sizeInPixels, | ||||||
|  |                                  const wxString& facename, | ||||||
|  |                                  int flags, | ||||||
|  |                                  const wxColour& col) : | ||||||
|  |     wxGraphicsObjectRefData(renderer) | ||||||
|  | { | ||||||
|  |     InitColour(col); | ||||||
|  |  | ||||||
|  |     // Resolution for Cairo image surfaces is 72 DPI meaning that the sizes in | ||||||
|  |     // points and pixels are identical, so we can just pass the size in pixels | ||||||
|  |     // directly to cairo_set_font_size(). | ||||||
|  |     m_size = sizeInPixels; | ||||||
|  |  | ||||||
|  | #if defined(__WXGTK__) || defined(__WXMAC__) | ||||||
|  |     m_font = NULL; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     m_underlined = (flags & wxFONTFLAG_UNDERLINED) != 0; | ||||||
|  |  | ||||||
|  |     InitFontComponents | ||||||
|  |     ( | ||||||
|  |         facename, | ||||||
|  |         flags & wxFONTFLAG_ITALIC ? CAIRO_FONT_SLANT_ITALIC | ||||||
|  |                                   : CAIRO_FONT_SLANT_NORMAL, | ||||||
|  |         flags & wxFONTFLAG_BOLD ? CAIRO_FONT_WEIGHT_BOLD | ||||||
|  |                                 : CAIRO_FONT_WEIGHT_NORMAL | ||||||
|  |     ); | ||||||
|  | } | ||||||
|  |  | ||||||
| wxCairoFontData::~wxCairoFontData() | wxCairoFontData::~wxCairoFontData() | ||||||
| { | { | ||||||
| #ifdef __WXMAC__ | #ifdef __WXMAC__ | ||||||
|  |     if ( m_font ) | ||||||
|         cairo_font_face_destroy( m_font ); |         cairo_font_face_destroy( m_font ); | ||||||
| #elif defined(__WXGTK__) | #elif defined(__WXGTK__) | ||||||
|  |     if ( m_font ) | ||||||
|         pango_font_description_free( m_font ); |         pango_font_description_free( m_font ); | ||||||
| #else | #else | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void wxCairoFontData::Apply( wxGraphicsContext* context ) | bool wxCairoFontData::Apply( wxGraphicsContext* context ) | ||||||
| { | { | ||||||
|     cairo_t * ctext = (cairo_t*) context->GetNativeContext(); |     cairo_t * ctext = (cairo_t*) context->GetNativeContext(); | ||||||
|     cairo_set_source_rgba(ctext,m_red,m_green, m_blue,m_alpha); |     cairo_set_source_rgba(ctext,m_red,m_green, m_blue,m_alpha); | ||||||
| #ifdef __WXGTK__ | #ifdef __WXGTK__ | ||||||
|     // the rest is done using Pango layouts |     if ( m_font ) | ||||||
|  |     { | ||||||
|  |         // Nothing to do, the caller uses Pango layout functions to do | ||||||
|  |         // everything. | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
| #elif defined(__WXMAC__) | #elif defined(__WXMAC__) | ||||||
|  |     if ( m_font ) | ||||||
|  |     { | ||||||
|         cairo_set_font_face(ctext, m_font); |         cairo_set_font_face(ctext, m_font); | ||||||
|         cairo_set_font_size(ctext, m_size ); |         cairo_set_font_size(ctext, m_size ); | ||||||
| #else |         return true; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     // If we get here, we must be on a platform without native font support or | ||||||
|  |     // we're using toy Cairo API even under wxGTK/wxMac. | ||||||
|     cairo_select_font_face(ctext, m_fontName, m_slant, m_weight ); |     cairo_select_font_face(ctext, m_fontName, m_slant, m_weight ); | ||||||
|     cairo_set_font_size(ctext, m_size ); |     cairo_set_font_size(ctext, m_size ); | ||||||
| #endif |  | ||||||
|  |     // Indicate that we don't use native fonts for the platforms which care | ||||||
|  |     // about this (currently only wxGTK). | ||||||
|  |     return false; | ||||||
| } | } | ||||||
|  |  | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
| @@ -1900,8 +1988,8 @@ void wxCairoContext::DoDrawText(const wxString& str, wxDouble x, wxDouble y) | |||||||
|     if ( !data ) |     if ( !data ) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     ((wxCairoFontData*)m_font.GetRefData())->Apply(this); |     if ( ((wxCairoFontData*)m_font.GetRefData())->Apply(this) ) | ||||||
|  |     { | ||||||
| #ifdef __WXGTK__ | #ifdef __WXGTK__ | ||||||
|         size_t datalen = strlen(data); |         size_t datalen = strlen(data); | ||||||
|  |  | ||||||
| @@ -1923,7 +2011,12 @@ void wxCairoContext::DoDrawText(const wxString& str, wxDouble x, wxDouble y) | |||||||
|         pango_cairo_show_layout (m_context, layout); |         pango_cairo_show_layout (m_context, layout); | ||||||
|  |  | ||||||
|         g_object_unref (layout); |         g_object_unref (layout); | ||||||
| #else |  | ||||||
|  |         // Don't use Cairo text API, we already did everything. | ||||||
|  |         return; | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // Cairo's x,y for drawing text is at the baseline, so we need to adjust |     // Cairo's x,y for drawing text is at the baseline, so we need to adjust | ||||||
|     // the position we move to by the ascent. |     // the position we move to by the ascent. | ||||||
|     cairo_font_extents_t fe; |     cairo_font_extents_t fe; | ||||||
| @@ -1931,7 +2024,6 @@ void wxCairoContext::DoDrawText(const wxString& str, wxDouble x, wxDouble y) | |||||||
|     cairo_move_to(m_context, x, y+fe.ascent); |     cairo_move_to(m_context, x, y+fe.ascent); | ||||||
|  |  | ||||||
|     cairo_show_text(m_context, data); |     cairo_show_text(m_context, data); | ||||||
| #endif |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void wxCairoContext::GetTextExtent( const wxString &str, wxDouble *width, wxDouble *height, | void wxCairoContext::GetTextExtent( const wxString &str, wxDouble *width, wxDouble *height, | ||||||
| @@ -1951,6 +2043,8 @@ void wxCairoContext::GetTextExtent( const wxString &str, wxDouble *width, wxDoub | |||||||
|     if ( str.empty()) |     if ( str.empty()) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|  |     if ( ((wxCairoFontData*)m_font.GetRefData())->Apply((wxCairoContext*)this) ) | ||||||
|  |     { | ||||||
| #ifdef __WXGTK__ | #ifdef __WXGTK__ | ||||||
|         int w, h; |         int w, h; | ||||||
|  |  | ||||||
| @@ -1975,8 +2069,9 @@ void wxCairoContext::GetTextExtent( const wxString &str, wxDouble *width, wxDoub | |||||||
|             *descent = h - PANGO_PIXELS(baseline); |             *descent = h - PANGO_PIXELS(baseline); | ||||||
|         } |         } | ||||||
|         g_object_unref (layout); |         g_object_unref (layout); | ||||||
| #else |         return; | ||||||
|     ((wxCairoFontData*)m_font.GetRefData())->Apply((wxCairoContext*)this); | #endif | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (width) |     if (width) | ||||||
|     { |     { | ||||||
| @@ -2009,7 +2104,6 @@ void wxCairoContext::GetTextExtent( const wxString &str, wxDouble *width, wxDoub | |||||||
|         if ( externalLeading ) |         if ( externalLeading ) | ||||||
|             *externalLeading = wxMax(0, fe.height - (fe.ascent + fe.descent)); |             *externalLeading = wxMax(0, fe.height - (fe.ascent + fe.descent)); | ||||||
|     } |     } | ||||||
| #endif |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void wxCairoContext::GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const | void wxCairoContext::GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const | ||||||
| @@ -2187,6 +2281,10 @@ public : | |||||||
|  |  | ||||||
|     // sets the font |     // sets the font | ||||||
|     virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) ; |     virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) ; | ||||||
|  |     virtual wxGraphicsFont CreateFont(double sizeInPixels, | ||||||
|  |                                       const wxString& facename, | ||||||
|  |                                       int flags = wxFONTFLAG_DEFAULT, | ||||||
|  |                                       const wxColour& col = *wxBLACK); | ||||||
|  |  | ||||||
|     // create a native bitmap representation |     // create a native bitmap representation | ||||||
|     virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ); |     virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ); | ||||||
| @@ -2403,7 +2501,6 @@ wxCairoRenderer::CreateRadialGradientBrush(wxDouble xo, wxDouble yo, | |||||||
|     return p; |     return p; | ||||||
| } | } | ||||||
|  |  | ||||||
| // sets the font |  | ||||||
| wxGraphicsFont wxCairoRenderer::CreateFont( const wxFont &font , const wxColour &col ) | wxGraphicsFont wxCairoRenderer::CreateFont( const wxFont &font , const wxColour &col ) | ||||||
| { | { | ||||||
|     ENSURE_LOADED_OR_RETURN(wxNullGraphicsFont); |     ENSURE_LOADED_OR_RETURN(wxNullGraphicsFont); | ||||||
| @@ -2417,6 +2514,19 @@ wxGraphicsFont wxCairoRenderer::CreateFont( const wxFont &font , const wxColour | |||||||
|         return wxNullGraphicsFont; |         return wxNullGraphicsFont; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | wxGraphicsFont | ||||||
|  | wxCairoRenderer::CreateFont(double sizeInPixels, | ||||||
|  |                             const wxString& facename, | ||||||
|  |                             int flags, | ||||||
|  |                             const wxColour& col) | ||||||
|  | { | ||||||
|  |     ENSURE_LOADED_OR_RETURN(wxNullGraphicsFont); | ||||||
|  |  | ||||||
|  |     wxGraphicsFont font; | ||||||
|  |     font.SetRefData(new wxCairoFontData(this, sizeInPixels, facename, flags, col)); | ||||||
|  |     return font; | ||||||
|  | } | ||||||
|  |  | ||||||
| wxGraphicsBitmap wxCairoRenderer::CreateBitmap( const wxBitmap& bmp ) | wxGraphicsBitmap wxCairoRenderer::CreateBitmap( const wxBitmap& bmp ) | ||||||
| { | { | ||||||
|     ENSURE_LOADED_OR_RETURN(wxNullGraphicsBitmap); |     ENSURE_LOADED_OR_RETURN(wxNullGraphicsBitmap); | ||||||
|   | |||||||
| @@ -296,6 +296,11 @@ public: | |||||||
|     wxGDIPlusFontData( wxGraphicsRenderer* renderer, |     wxGDIPlusFontData( wxGraphicsRenderer* renderer, | ||||||
|                        const wxFont &font, |                        const wxFont &font, | ||||||
|                        const wxColour& col ); |                        const wxColour& col ); | ||||||
|  |     wxGDIPlusFontData(wxGraphicsRenderer* renderer, | ||||||
|  |                       const wxString& name, | ||||||
|  |                       REAL sizeInPixels, | ||||||
|  |                       int style, | ||||||
|  |                       const wxColour& col); | ||||||
|     ~wxGDIPlusFontData(); |     ~wxGDIPlusFontData(); | ||||||
|  |  | ||||||
|     virtual Brush* GetGDIPlusBrush() { return m_textBrush; } |     virtual Brush* GetGDIPlusBrush() { return m_textBrush; } | ||||||
| @@ -307,7 +312,8 @@ private : | |||||||
|     void Init(const wxString& name, |     void Init(const wxString& name, | ||||||
|               REAL size, |               REAL size, | ||||||
|               int style, |               int style, | ||||||
|               const wxColour& col); |               const wxColour& col, | ||||||
|  |               Unit fontUnit); | ||||||
|  |  | ||||||
|     Brush* m_textBrush; |     Brush* m_textBrush; | ||||||
|     Font* m_font; |     Font* m_font; | ||||||
| @@ -540,6 +546,11 @@ public : | |||||||
|     virtual wxGraphicsFont CreateFont( const wxFont& font, |     virtual wxGraphicsFont CreateFont( const wxFont& font, | ||||||
|                                        const wxColour& col); |                                        const wxColour& col); | ||||||
|  |  | ||||||
|  |     virtual wxGraphicsFont CreateFont(double size, | ||||||
|  |                                       const wxString& facename, | ||||||
|  |                                       int flags = wxFONTFLAG_DEFAULT, | ||||||
|  |                                       const wxColour& col = *wxBLACK); | ||||||
|  |  | ||||||
|     // create a graphics bitmap from a native bitmap |     // create a graphics bitmap from a native bitmap | ||||||
|     virtual wxGraphicsBitmap CreateBitmapFromNativeBitmap( void* bitmap ); |     virtual wxGraphicsBitmap CreateBitmapFromNativeBitmap( void* bitmap ); | ||||||
|  |  | ||||||
| @@ -884,9 +895,10 @@ void | |||||||
| wxGDIPlusFontData::Init(const wxString& name, | wxGDIPlusFontData::Init(const wxString& name, | ||||||
|                         REAL size, |                         REAL size, | ||||||
|                         int style, |                         int style, | ||||||
|                         const wxColour& col) |                         const wxColour& col, | ||||||
|  |                         Unit fontUnit) | ||||||
| { | { | ||||||
|     m_font = new Font(name, size, style, UnitPoint); |     m_font = new Font(name, size, style, fontUnit); | ||||||
|  |  | ||||||
|     m_textBrush = new SolidBrush(wxColourToColor(col)); |     m_textBrush = new SolidBrush(wxColourToColor(col)); | ||||||
| } | } | ||||||
| @@ -904,7 +916,17 @@ wxGDIPlusFontData::wxGDIPlusFontData( wxGraphicsRenderer* renderer, | |||||||
|     if ( font.GetWeight() == wxFONTWEIGHT_BOLD ) |     if ( font.GetWeight() == wxFONTWEIGHT_BOLD ) | ||||||
|         style |= FontStyleBold; |         style |= FontStyleBold; | ||||||
|  |  | ||||||
|     Init(font.GetFaceName(), font.GetPointSize(), style, col); |     Init(font.GetFaceName(), font.GetPointSize(), style, col, UnitPoint); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | wxGDIPlusFontData::wxGDIPlusFontData(wxGraphicsRenderer* renderer, | ||||||
|  |                                      const wxString& name, | ||||||
|  |                                      REAL sizeInPixels, | ||||||
|  |                                      int style, | ||||||
|  |                                      const wxColour& col) : | ||||||
|  |     wxGraphicsObjectRefData(renderer) | ||||||
|  | { | ||||||
|  |     Init(name, sizeInPixels, style, col, UnitPixel); | ||||||
| } | } | ||||||
|  |  | ||||||
| wxGDIPlusFontData::~wxGDIPlusFontData() | wxGDIPlusFontData::~wxGDIPlusFontData() | ||||||
| @@ -2113,6 +2135,31 @@ wxGDIPlusRenderer::CreateFont( const wxFont &font, | |||||||
|         return wxNullGraphicsFont; |         return wxNullGraphicsFont; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | wxGraphicsFont | ||||||
|  | wxGDIPlusRenderer::CreateFont(double size, | ||||||
|  |                               const wxString& facename, | ||||||
|  |                               int flags, | ||||||
|  |                               const wxColour& col) | ||||||
|  | { | ||||||
|  |     ENSURE_LOADED_OR_RETURN(wxNullGraphicsFont); | ||||||
|  |  | ||||||
|  |     // Convert wxFont flags to GDI+ style: | ||||||
|  |     int style = FontStyleRegular; | ||||||
|  |     if ( flags & wxFONTFLAG_ITALIC ) | ||||||
|  |         style |= FontStyleItalic; | ||||||
|  |     if ( flags & wxFONTFLAG_UNDERLINED ) | ||||||
|  |         style |= FontStyleUnderline; | ||||||
|  |     if ( flags & wxFONTFLAG_BOLD ) | ||||||
|  |         style |= FontStyleBold; | ||||||
|  |     if ( flags & wxFONTFLAG_STRIKETHROUGH ) | ||||||
|  |         style |= FontStyleStrikeout; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     wxGraphicsFont f; | ||||||
|  |     f.SetRefData(new wxGDIPlusFontData(this, facename, size, style, col)); | ||||||
|  |     return f; | ||||||
|  | } | ||||||
|  |  | ||||||
| wxGraphicsBitmap wxGDIPlusRenderer::CreateBitmap( const wxBitmap &bitmap ) | wxGraphicsBitmap wxGDIPlusRenderer::CreateBitmap( const wxBitmap &bitmap ) | ||||||
| { | { | ||||||
|     ENSURE_LOADED_OR_RETURN(wxNullGraphicsBitmap); |     ENSURE_LOADED_OR_RETURN(wxNullGraphicsBitmap); | ||||||
|   | |||||||
| @@ -2829,6 +2829,10 @@ public : | |||||||
|  |  | ||||||
|    // sets the font |    // sets the font | ||||||
|     virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) ; |     virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) ; | ||||||
|  |     virtual wxGraphicsFont CreateFont(double sizeInPixels, | ||||||
|  |                                       const wxString& facename, | ||||||
|  |                                       int flags = wxFONTFLAG_DEFAULT, | ||||||
|  |                                       const wxColour& col = *wxBLACK); | ||||||
|  |  | ||||||
|     // create a native bitmap representation |     // create a native bitmap representation | ||||||
|     virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) ; |     virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) ; | ||||||
| @@ -3080,7 +3084,6 @@ wxMacCoreGraphicsRenderer::CreateRadialGradientBrush(wxDouble xo, wxDouble yo, | |||||||
|     return p; |     return p; | ||||||
| } | } | ||||||
|  |  | ||||||
| // sets the font |  | ||||||
| wxGraphicsFont wxMacCoreGraphicsRenderer::CreateFont( const wxFont &font , const wxColour &col ) | wxGraphicsFont wxMacCoreGraphicsRenderer::CreateFont( const wxFont &font , const wxColour &col ) | ||||||
| { | { | ||||||
|     if ( font.IsOk() ) |     if ( font.IsOk() ) | ||||||
| @@ -3093,6 +3096,32 @@ wxGraphicsFont wxMacCoreGraphicsRenderer::CreateFont( const wxFont &font , const | |||||||
|         return wxNullGraphicsFont; |         return wxNullGraphicsFont; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | wxGraphicsFont | ||||||
|  | wxMacCoreGraphicsRenderer::CreateFont(double sizeInPixels, | ||||||
|  |                                       const wxString& facename, | ||||||
|  |                                       int flags, | ||||||
|  |                                       const wxColour& col) | ||||||
|  | { | ||||||
|  |     // This implementation is not ideal as we don't support fractional font | ||||||
|  |     // sizes right now, but it's the simplest one. | ||||||
|  |     // | ||||||
|  |     // Notice that under Mac we always use 72 DPI so the font size in pixels is | ||||||
|  |     // the same as the font size in points and we can pass it directly to wxFont | ||||||
|  |     // ctor. | ||||||
|  |     wxFont font(wxRound(sizeInPixels), | ||||||
|  |                 wxFONTFAMILY_DEFAULT, | ||||||
|  |                 flags & wxFONTFLAG_ITALIC ? wxFONTSTYLE_ITALIC | ||||||
|  |                                           : wxFONTSTYLE_NORMAL, | ||||||
|  |                 flags & wxFONTFLAG_BOLD ? wxFONTWEIGHT_BOLD | ||||||
|  |                                         : wxFONTWEIGHT_NORMAL, | ||||||
|  |                 (flags & wxFONTFLAG_UNDERLINED) != 0, | ||||||
|  |                 facename); | ||||||
|  |  | ||||||
|  |     wxGraphicsFont f; | ||||||
|  |     f.SetRefData(new wxMacCoreGraphicsFontData(this, font, col)); | ||||||
|  |     return f; | ||||||
|  | } | ||||||
|  |  | ||||||
| // | // | ||||||
| // CoreGraphics Helper Methods | // CoreGraphics Helper Methods | ||||||
| // | // | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user