X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6a17b868de5fd4b78988b355b9e1efbb766cd6f2..c2edb90727071a10407fc8a8bb16da31224e00db:/src/html/winpars.cpp diff --git a/src/html/winpars.cpp b/src/html/winpars.cpp index 13ef2c9ae6..5054e70b29 100644 --- a/src/html/winpars.cpp +++ b/src/html/winpars.cpp @@ -15,7 +15,7 @@ #if wxUSE_HTML && wxUSE_STREAMS -#ifndef WXPRECOMP +#ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/dc.h" #include "wx/log.h" @@ -47,6 +47,7 @@ wxHtmlWinParser::wxHtmlWinParser(wxHtmlWindowInterface *wndIface) m_CharHeight = m_CharWidth = 0; m_UseLink = false; #if !wxUSE_UNICODE + m_nbsp = 0; m_EncConv = NULL; m_InputEnc = wxFONTENCODING_ISO8859_1; m_OutputEnc = wxFONTENCODING_DEFAULT; @@ -110,25 +111,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; @@ -153,22 +179,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); } @@ -181,10 +200,13 @@ void wxHtmlWinParser::InitParser(const wxString& source) m_FontBold = m_FontItalic = m_FontUnderlined = m_FontFixed = FALSE; m_FontSize = 3; //default one CreateCurrentFont(); // we're selecting default font into - m_DC->GetTextExtent( wxT("H"), &m_CharWidth, &m_CharHeight); - /* NOTE : we're not using GetCharWidth/Height() because - of differences under X and win - */ + + // we're not using GetCharWidth/Height() because of + // differences under X and win + wxCoord w,h; + m_DC->GetTextExtent( wxT("H"), &w, &h); + m_CharWidth = w; + m_CharHeight = h; m_UseLink = false; m_Link = wxHtmlLinkInfo( wxEmptyString ); @@ -314,18 +336,19 @@ wxFSFile *wxHtmlWinParser::OpenURL(wxHtmlURLType type, if ( status == wxHTML_BLOCK ) return NULL; - return GetFS()->OpenFile(myurl); + int flags = wxFS_READ; + if (type == wxHTML_URL_IMAGE) + flags |= wxFS_SEEKABLE; + + return GetFS()->OpenFile(myurl, flags); } -void wxHtmlWinParser::AddText(const wxChar* txt) +void wxHtmlWinParser::AddText(const wxString& txt) { - size_t i = 0, - x, - lng = wxStrlen(txt); register wxChar d; int templen = 0; - wxChar nbsp = GetEntitiesParser()->GetCharForCode(160 /* nbsp */); + size_t lng = txt.length(); if (lng+1 > m_tmpStrBufSize) { delete[] m_tmpStrBuf; @@ -334,42 +357,63 @@ void wxHtmlWinParser::AddText(const wxChar* txt) } wxChar *temp = m_tmpStrBuf; + wxString::const_iterator i = txt.begin(); + wxString::const_iterator end = txt.end(); + if (m_tmpLastWasSpace) { - while ((i < lng) && - ((txt[i] == wxT('\n')) || (txt[i] == wxT('\r')) || (txt[i] == wxT(' ')) || - (txt[i] == wxT('\t')))) i++; + while ( (i < end) && + (*i == wxT('\n') || *i == wxT('\r') || *i == wxT(' ') || + *i == wxT('\t')) ) + { + ++i; + } } - while (i < lng) + while (i < end) { - x = 0; - d = temp[templen++] = txt[i]; + size_t x = 0; + d = temp[templen++] = *i; if ((d == wxT('\n')) || (d == wxT('\r')) || (d == wxT(' ')) || (d == wxT('\t'))) { - i++, x++; - while ((i < lng) && ((txt[i] == wxT('\n')) || (txt[i] == wxT('\r')) || - (txt[i] == wxT(' ')) || (txt[i] == wxT('\t')))) i++, x++; + ++i, ++x; + while ( (i < end) && + (*i == wxT('\n') || *i == wxT('\r') || + *i == wxT(' ') || *i == wxT('\t')) ) + { + ++i; + ++x; + } } - else i++; + else + ++i; if (x) { temp[templen-1] = wxT(' '); - DoAddText(temp, templen, nbsp); + DoAddText(temp, templen); m_tmpLastWasSpace = true; } } if (templen && (templen > 1 || temp[0] != wxT(' '))) { - DoAddText(temp, templen, nbsp); + DoAddText(temp, templen); m_tmpLastWasSpace = false; } } -void wxHtmlWinParser::DoAddText(wxChar *temp, int& templen, wxChar nbsp) +void wxHtmlWinParser::DoAddText(wxChar *temp, int& templen) { + #define NBSP_UNICODE_VALUE 160 +#if !wxUSE_UNICODE + if ( m_nbsp == 0 ) + m_nbsp = GetEntitiesParser()->GetCharForCode(NBSP_UNICODE_VALUE); + #define CUR_NBSP_VALUE m_nbsp +#else + #define CUR_NBSP_VALUE NBSP_UNICODE_VALUE +#endif + temp[templen] = 0; templen = 0; #if !wxUSE_UNICODE @@ -379,7 +423,7 @@ void wxHtmlWinParser::DoAddText(wxChar *temp, int& templen, wxChar nbsp) size_t len = wxStrlen(temp); for (size_t j = 0; j < len; j++) { - if (temp[j] == nbsp) + if (temp[j] == CUR_NBSP_VALUE) temp[j] = wxT(' '); } @@ -508,6 +552,9 @@ void wxHtmlWinParser::ApplyStateToCell(wxHtmlCell *cell) #if !wxUSE_UNICODE void wxHtmlWinParser::SetInputEncoding(wxFontEncoding enc) { + // the character used for non-breakable space may change: + m_nbsp = 0; + m_InputEnc = m_OutputEnc = wxFONTENCODING_DEFAULT; if (m_EncConv) {