Allow displaying Japanese character with wxMotif/ANSI under a

Japanese EUC-JP locale:

- add a #define (wxMOTIF_NEW_FONT_HANDLING) defaulting to
  off
- factor the code for getting text extents in a central
  wxGetTextExtent function
- when the new font handling is enabled load a fontset instead of
  a single font. For non-Japanese locales this should load a fontset
  containing a single font.
- on a Japanese locale set the default point size to 15: the Japanese
  fonts I have are much more readable like this.
- do not set the wordwrap property for multiline wxTextCtrl with
  OpenMotif 2.1, otherwise it crashes when text is added


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35035 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Mattia Barbon
2005-07-31 09:42:16 +00:00
parent 328f4fee60
commit 996994c714
11 changed files with 212 additions and 181 deletions

View File

@@ -64,11 +64,14 @@ public:
wxXFont();
~wxXFont();
#if !wxMOTIF_NEW_FONT_HANDLING
WXFontStructPtr m_fontStruct; // XFontStruct
#if !wxUSE_RENDER_TABLE
#endif
#if !wxUSE_RENDER_TABLE && !wxMOTIF_NEW_FONT_HANDLING
WXFontList m_fontList; // Motif XmFontList
#else // if wxUSE_RENDER_TABLE
WXRenderTable m_renderTable; // Motif XmRenderTable
WXRendition m_rendition; // Motif XmRendition
#endif
WXDisplay* m_display; // XDisplay
int m_scale; // Scale * 100
@@ -133,11 +136,14 @@ protected:
wxXFont::wxXFont()
{
#if !wxMOTIF_NEW_FONT_HANDLING
m_fontStruct = (WXFontStructPtr) 0;
#if !wxUSE_RENDER_TABLE
#endif
#if !wxUSE_RENDER_TABLE && !wxMOTIF_NEW_FONT_HANDLING
m_fontList = (WXFontList) 0;
#else // if wxUSE_RENDER_TABLE
m_renderTable = (WXRenderTable) 0;
m_rendition = (WXRendition) 0;
#endif
m_display = (WXDisplay*) 0;
m_scale = 100;
@@ -536,6 +542,7 @@ wxXFont* wxFont::GetInternalFont(double scale, WXDisplay* display) const
}
// not found, create a new one
wxString xFontSpec;
XFontStruct *font = (XFontStruct *)
wxLoadQueryNearestFont(pointSize,
M_FONTDATA->m_family,
@@ -543,7 +550,8 @@ wxXFont* wxFont::GetInternalFont(double scale, WXDisplay* display) const
M_FONTDATA->m_weight,
M_FONTDATA->m_underlined,
wxT(""),
M_FONTDATA->m_encoding);
M_FONTDATA->m_encoding,
&xFontSpec);
if ( !font )
{
@@ -553,21 +561,27 @@ wxXFont* wxFont::GetInternalFont(double scale, WXDisplay* display) const
}
wxXFont* f = new wxXFont;
#if wxMOTIF_NEW_FONT_HANDLING
XFreeFont( (Display*) display, font );
#else
f->m_fontStruct = (WXFontStructPtr)font;
#endif
f->m_display = ( display ? display : wxGetDisplay() );
f->m_scale = intScale;
M_FONTDATA->m_fonts.Append(f);
#if !wxUSE_RENDER_TABLE
f->m_fontList = XmFontListCreate ((XFontStruct*) font, XmSTRING_DEFAULT_CHARSET);
#else // if wxUSE_RENDER_TABLE
#if wxUSE_RENDER_TABLE
XmRendition rendition;
XmRenderTable renderTable;
Arg args[5];
int count = 0;
#if wxMOTIF_NEW_FONT_HANDLING
wxChar* fontSpec = wxStrdup( xFontSpec.c_str() );
XtSetArg( args[count], XmNfontName, fontSpec ); ++count;
XtSetArg( args[count], XmNfontType, XmFONT_IS_FONTSET ); ++count;
#else
XtSetArg( args[count], XmNfont, font ); ++count;
#endif
XtSetArg( args[count], XmNunderlineType,
GetUnderlined() ? XmSINGLE_LINE : XmNO_LINE ); ++count;
rendition = XmRenditionCreate( XmGetXmDisplay( (Display*)f->m_display ),
@@ -577,11 +591,20 @@ wxXFont* wxFont::GetInternalFont(double scale, WXDisplay* display) const
XmMERGE_REPLACE );
f->m_renderTable = (WXRenderTable)renderTable;
f->m_rendition = (WXRendition)rendition;
wxASSERT( f->m_renderTable != NULL );
#else // if !wxUSE_RENDER_TABLE
f->m_fontList = XmFontListCreate ((XFontStruct*) font, XmSTRING_DEFAULT_CHARSET);
wxASSERT( f->m_fontList != NULL );
#endif
M_FONTDATA->m_fonts.Append(f);
return f;
}
#if !wxMOTIF_NEW_FONT_HANDLING
WXFontStructPtr wxFont::GetFontStruct(double scale, WXDisplay* display) const
{
wxXFont* f = GetInternalFont(scale, display);
@@ -600,6 +623,8 @@ WXFontList wxFont::GetFontList(double scale, WXDisplay* display) const
#endif
}
#endif // !wxMOTIF_NEW_FONT_HANDLING
// declared in the header, can't use wxUSE_RENDER_TABLE
#if wxCHECK_MOTIF_VERSION( 2, 0 )
@@ -614,7 +639,7 @@ WXRenderTable wxFont::GetRenderTable(WXDisplay* display) const
#endif
}
#endif
#endif // wxCHECK_MOTIF_VERSION( 2, 0 )
WXFontType wxFont::GetFontType(WXDisplay* display) const
{
@@ -642,3 +667,62 @@ WXFontType wxFont::GetFontTypeC(WXDisplay* display) const
return (WXString)XmNfontList;
#endif
}
#if wxMOTIF_NEW_FONT_HANDLING
WXFontSet wxFont::GetFontSet(double scale, WXDisplay* display) const
{
wxXFont* f = GetInternalFont(scale, display);
if( !f ) return (WXFontSet) 0;
Arg args[2];
int count = 0;
XtSetArg( args[count], XmNfont, 0 ); ++count;
XmRenditionRetrieve( (XmRendition) f->m_rendition, args, count );
return (WXFontSet) args[0].value;
}
void wxGetTextExtent(WXDisplay* display, const wxFont& font, double scale,
const wxString& str,
int* width, int* height, int* ascent, int* descent)
{
XRectangle ink, logical;
WXFontSet fset = font.GetFontSet(scale, display);
XmbTextExtents( (XFontSet)fset, str.c_str(), str.length(), &ink, &logical);
if( width ) *width = logical.width;
if( height ) *height = logical.height;
if( ascent ) *ascent = -logical.y;
if( descent ) *descent = logical.height + logical.y;
}
#else // if !wxMOTIF_NEW_FONT_HANDLING
void wxGetTextExtent(WXDisplay* display, const wxFont& font,
double scale, const wxString& str,
int* width, int* height, int* ascent, int* descent)
{
WXFontStructPtr pFontStruct = font.GetFontStruct(scale, display);
int direction, ascent2, descent2;
XCharStruct overall;
int slen = str.Len();
XTextExtents((XFontStruct*) pFontStruct, (char*) str.c_str(), slen,
&direction, &ascent2, &descent2, &overall);
if ( width )
*width = (overall.width);
if ( height )
*height = (ascent2 + descent2);
if ( descent )
*descent = descent2;
if ( ascent )
*ascent = ascent2;
}
#endif // !wxMOTIF_NEW_FONT_HANDLING