X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ba804ab2d429c03bf5b20989d207d2b1ebe049f4..24904055f37af7cd12d1241469bc4852502ad302:/src/html/winpars.cpp?ds=sidebyside diff --git a/src/html/winpars.cpp b/src/html/winpars.cpp index 5446f917d6..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; @@ -116,7 +117,7 @@ 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.69); + 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); @@ -125,6 +126,17 @@ static void wxBuildFontSizes(int *sizes, int size) 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) @@ -133,7 +145,7 @@ void wxHtmlWinParser::SetFonts(const wxString& normal_face, if ( !sizes ) { if ( !default_sizes[0] ) - wxBuildFontSizes(default_sizes, wxNORMAL_FONT->GetPointSize()); + wxBuildFontSizes(default_sizes, wxGetDefaultHTMLFontSize()); sizes = default_sizes; } @@ -168,7 +180,7 @@ void wxHtmlWinParser::SetStandardFonts(int size, const wxString& fixed_face) { if (size == -1) - size = wxNORMAL_FONT->GetPointSize(); + size = wxGetDefaultHTMLFontSize(); int f_sizes[7]; wxBuildFontSizes(f_sizes, size); @@ -188,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 ); @@ -321,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; @@ -341,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 @@ -386,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(' '); } @@ -515,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) {