X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bc55e31bdc7fbf6f1006f298ed8310e7972984e9..0c246b3ca3a803904525dd02da7bc94cb6565890:/src/html/winpars.cpp diff --git a/src/html/winpars.cpp b/src/html/winpars.cpp index 352ba3e0cc..cb4a11b7f1 100644 --- a/src/html/winpars.cpp +++ b/src/html/winpars.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: winpars.cpp +// Name: src/html/winpars.cpp // Purpose: wxHtmlParser class (generic parser) // Author: Vaclav Slavik // RCS-ID: $Id$ @@ -9,24 +9,23 @@ #include "wx/wxprec.h" -#include "wx/defs.h" -#if wxUSE_HTML && wxUSE_STREAMS - #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_HTML && wxUSE_STREAMS + #ifndef WXPRECOMP #include "wx/intl.h" #include "wx/dc.h" + #include "wx/log.h" + #include "wx/settings.h" #endif #include "wx/html/htmldefs.h" #include "wx/html/winpars.h" #include "wx/html/htmlwin.h" #include "wx/fontmap.h" -#include "wx/log.h" -#include "wx/settings.h" #include "wx/uri.h" @@ -111,25 +110,50 @@ void wxHtmlWinParser::RemoveModule(wxHtmlTagsModule *module) m_Modules.DeleteObject(module); } -void wxHtmlWinParser::SetFonts(const wxString& normal_face, const wxString& fixed_face, +// build all HTML font sizes (1..7) from the given base size +static void wxBuildFontSizes(int *sizes, int size) +{ + // using a fixed factor (1.2, from CSS2) is a bad idea as explained at + // http://www.w3.org/TR/CSS21/fonts.html#font-size-props but this is by far + // simplest thing to do so still do it like this for now + sizes[0] = int(size * 0.75); // exception to 1.2 rule, otherwise too small + sizes[1] = int(size * 0.83); + sizes[2] = size; + sizes[3] = int(size * 1.2); + sizes[4] = int(size * 1.44); + sizes[5] = int(size * 1.73); + sizes[6] = int(size * 2); +} + +static int wxGetDefaultHTMLFontSize() +{ + // base the default font size on the size of the default system font but + // also ensure that we have a font of reasonable size, otherwise small HTML + // fonts are unreadable + int size = wxNORMAL_FONT->GetPointSize(); + if ( size < 10 ) + size = 10; + return size; +} + +void wxHtmlWinParser::SetFonts(const wxString& normal_face, + const wxString& fixed_face, const int *sizes) { - static int default_sizes[7] = - { - wxHTML_FONT_SIZE_1, - wxHTML_FONT_SIZE_2, - wxHTML_FONT_SIZE_3, - wxHTML_FONT_SIZE_4, - wxHTML_FONT_SIZE_5, - wxHTML_FONT_SIZE_6, - wxHTML_FONT_SIZE_7 - }; + static int default_sizes[7] = { 0 }; + if ( !sizes ) + { + if ( !default_sizes[0] ) + wxBuildFontSizes(default_sizes, wxGetDefaultHTMLFontSize()); - if (sizes == NULL) sizes = default_sizes; + sizes = default_sizes; + } int i, j, k, l, m; - for (i = 0; i < 7; i++) m_FontsSizes[i] = sizes[i]; + for (i = 0; i < 7; i++) + m_FontsSizes[i] = sizes[i]; + m_FontFaceFixed = fixed_face; m_FontFaceNormal = normal_face; @@ -154,22 +178,15 @@ void wxHtmlWinParser::SetStandardFonts(int size, const wxString& normal_face, const wxString& fixed_face) { - wxFont defaultFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); - - int f_sizes[7]; if (size == -1) - size = defaultFont.GetPointSize(); + size = wxGetDefaultHTMLFontSize(); - f_sizes[0] = int(size * 0.6); - f_sizes[1] = int(size * 0.8); - f_sizes[2] = size; - f_sizes[3] = int(size * 1.2); - f_sizes[4] = int(size * 1.4); - f_sizes[5] = int(size * 1.6); - f_sizes[6] = int(size * 1.8); + int f_sizes[7]; + wxBuildFontSizes(f_sizes, size); - wxString normal = normal_face.empty() ? - defaultFont.GetFaceName() : normal_face; + wxString normal = normal_face; + if ( normal.empty() ) + normal = wxNORMAL_FONT->GetFaceName(); SetFonts(normal, fixed_face, f_sizes); } @@ -197,7 +214,11 @@ void wxHtmlWinParser::InitParser(const wxString& source) m_tmpLastWasSpace = false; m_lastWordCell = NULL; + // open the toplevel container that contains everything else and that + // is never closed (this makes parser's life easier): OpenContainer(); + + // then open the first container into which page's content will go: OpenContainer(); #if !wxUSE_UNICODE @@ -538,7 +559,7 @@ void wxHtmlWinParser::SetInputEncoding(wxFontEncoding enc) else { #ifndef __WXMAC__ - // okay, let convert to ISO_8859-1, available always + // okay, let's convert to ISO_8859-1, available always m_OutputEnc = wxFONTENCODING_DEFAULT; #else m_OutputEnc = wxLocale::GetSystemEncoding() ; @@ -558,7 +579,7 @@ void wxHtmlWinParser::SetInputEncoding(wxFontEncoding enc) (m_OutputEnc == wxFONTENCODING_DEFAULT) ? wxFONTENCODING_ISO8859_1 : m_OutputEnc, wxCONVERT_SUBSTITUTE)) - { // total failture :-( + { // total failure :-( wxLogError(_("Failed to display HTML document in %s encoding"), wxFontMapper::GetEncodingName(enc).c_str()); m_InputEnc = m_OutputEnc = wxFONTENCODING_DEFAULT; @@ -602,4 +623,3 @@ void wxHtmlTagsModule::OnExit() } #endif -