1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/generic/textmeasure.cpp
4 // Author: Vadim Zeitlin
7 // Copyright: (c) 2012 Vadim Zeitlin <vadim@wxwidgets.org>
8 // Licence: wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
11 // ============================================================================
13 // ============================================================================
15 // ----------------------------------------------------------------------------
17 // ----------------------------------------------------------------------------
19 // for compilers that support precompilation, includes "wx.h".
20 #include "wx/wxprec.h"
27 #include "wx/window.h"
31 #include "wx/private/textmeasure.h"
33 #if wxUSE_GENERIC_TEXTMEASURE
35 // ============================================================================
36 // wxTextMeasure generic implementation
37 // ============================================================================
39 // We assume that the ports not providing platform-specific wxTextMeasure
40 // implementation implement the corresponding functions in their wxDC and
41 // wxWindow classes, so forward back to them instead of using wxTextMeasure
42 // from there, as usual.
43 void wxTextMeasure::DoGetTextExtent(const wxString
& string
,
47 wxCoord
*externalLeading
)
51 m_dc
->GetTextExtent(string
, width
, height
,
52 descent
, externalLeading
, m_font
);
56 m_win
->GetTextExtent(string
, width
, height
,
57 descent
, externalLeading
, m_font
);
59 //else: we already asserted in the ctor, don't do it any more
62 // Each element of the widths array will be the width of the string up to and
63 // including the corresponding character in text. This is the generic
64 // implementation, the port-specific classes should do this with native APIs
65 // if available and if faster. Note: pango_layout_index_to_pos is much slower
66 // than calling GetTextExtent!!
73 FontWidthCache() : m_scaleX(1), m_widths(NULL
) { }
74 ~FontWidthCache() { delete []m_widths
; }
79 m_widths
= new int[FWC_SIZE
];
81 memset(m_widths
, 0, sizeof(int)*FWC_SIZE
);
89 static FontWidthCache s_fontWidthCache
;
91 bool wxTextMeasure::DoGetPartialTextExtents(const wxString
& text
,
97 // reset the cache if font or horizontal scale have changed
98 if ( !s_fontWidthCache
.m_widths
||
99 !wxIsSameDouble(s_fontWidthCache
.m_scaleX
, scaleX
) ||
100 (s_fontWidthCache
.m_font
!= *m_font
) )
102 s_fontWidthCache
.Reset();
103 s_fontWidthCache
.m_font
= *m_font
;
104 s_fontWidthCache
.m_scaleX
= scaleX
;
107 // Calculate the position of each character based on the widths of
108 // the previous characters. This is inexact for not fixed fonts.
110 for ( wxString::const_iterator it
= text
.begin();
114 const wxChar c
= *it
;
115 unsigned int c_int
= (unsigned int)c
;
118 if ((c_int
< FWC_SIZE
) && (s_fontWidthCache
.m_widths
[c_int
] != 0))
120 w
= s_fontWidthCache
.m_widths
[c_int
];
124 DoGetTextExtent(c
, &w
, NULL
);
125 if (c_int
< FWC_SIZE
)
126 s_fontWidthCache
.m_widths
[c_int
] = w
;
130 widths
[n
++] = totalWidth
;
136 #endif // wxUSE_GENERIC_TEXTMEASURE