#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/settings.h"
#include "wx/uri.h"
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;
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);
}
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
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)
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() ;
(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;