diff --git a/include/wx/html/htmprint.h b/include/wx/html/htmprint.h index 0c206ade6c..830a1d8362 100644 --- a/include/wx/html/htmprint.h +++ b/include/wx/html/htmprint.h @@ -54,6 +54,11 @@ public: // (see wxFileSystem for detailed explanation) void SetHtmlText(const wxString& html, const wxString& basepath = wxEmptyString, bool isdir = true); + // Sets the HTML cell that will be rendered: this is more efficient than + // using text as it allows to parse it only once. Note that the cell will + // be modified by this call. + void SetHtmlCell(wxHtmlContainerCell& cell); + // Sets fonts to be used when displaying HTML page. (if size null then default sizes used). void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = NULL); @@ -79,11 +84,14 @@ public: int GetTotalHeight() const; private: + void DoSetHtmlCell(wxHtmlContainerCell* cell); + wxDC *m_DC; wxHtmlWinParser *m_Parser; wxFileSystem *m_FS; wxHtmlContainerCell *m_Cells; int m_Width, m_Height; + bool m_ownsCells; wxDECLARE_NO_COPY_CLASS(wxHtmlDCRenderer); }; diff --git a/interface/wx/html/htmprint.h b/interface/wx/html/htmprint.h index 8e2dfdc9db..1b4a4e861b 100644 --- a/interface/wx/html/htmprint.h +++ b/interface/wx/html/htmprint.h @@ -168,6 +168,19 @@ public: const wxString& basepath = wxEmptyString, bool isdir = true); + /** + Associate the given HTML contents to the renderer. + + This is similar to SetHtmlText(), but is more efficient as the text can + be parsed only once, using wxHtmlParser::Parse(), and then passed to + wxHtmlDCRenderer multiple times or already reused for other purposes. + + Note that @a cell will be modified (e.g. laid out) by this function. + + @since 3.1.2 + */ + void SetHtmlCell(wxHtmlContainerCell& cell); + /** Set size of output rectangle, in pixels. Note that you @b can't change width of the rectangle between calls to Render() ! diff --git a/src/html/htmprint.cpp b/src/html/htmprint.cpp index a3acb7d007..86b0b7f51b 100644 --- a/src/html/htmprint.cpp +++ b/src/html/htmprint.cpp @@ -70,6 +70,7 @@ wxHtmlDCRenderer::wxHtmlDCRenderer() : wxObject() m_DC = NULL; m_Width = m_Height = 0; m_Cells = NULL; + m_ownsCells = false; m_Parser = new wxHtmlWinParser(); m_FS = new wxFileSystem(); m_Parser->SetFS(m_FS); @@ -80,7 +81,9 @@ wxHtmlDCRenderer::wxHtmlDCRenderer() : wxObject() wxHtmlDCRenderer::~wxHtmlDCRenderer() { - if (m_Cells) delete m_Cells; + if ( m_ownsCells ) + delete m_Cells; + if (m_Parser) delete m_Parser; if (m_FS) delete m_FS; } @@ -110,14 +113,33 @@ void wxHtmlDCRenderer::SetHtmlText(const wxString& html, const wxString& basepat wxCHECK_RET( m_DC, "SetDC() must be called before SetHtmlText()" ); wxCHECK_RET( m_Width, "SetSize() must be called before SetHtmlText()" ); - wxDELETE(m_Cells); - m_FS->ChangePathTo(basepath, isdir); - m_Cells = (wxHtmlContainerCell*) m_Parser->Parse(html); + + wxHtmlContainerCell* const cell = (wxHtmlContainerCell*) m_Parser->Parse(html); + wxCHECK_RET( cell, "Failed to parse HTML" ); + + DoSetHtmlCell(cell); + + m_ownsCells = true; +} + +void wxHtmlDCRenderer::DoSetHtmlCell(wxHtmlContainerCell* cell) +{ + if ( m_ownsCells ) + delete m_Cells; + + m_Cells = cell; m_Cells->SetIndent(0, wxHTML_INDENT_ALL, wxHTML_UNITS_PIXELS); m_Cells->Layout(m_Width); } +void wxHtmlDCRenderer::SetHtmlCell(wxHtmlContainerCell& cell) +{ + DoSetHtmlCell(&cell); + + m_ownsCells = false; +} + void wxHtmlDCRenderer::SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes)