diff --git a/docs/changes.txt b/docs/changes.txt
index daa8c0c192..9275e58a29 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -66,6 +66,9 @@ Changes in behaviour which may result in build errors
- wx/treebook.h doesn't include wx/treectrl.h (and, via it, wx/textctrl.h) any
more, include these headers explicitly from your code if necessary.
+- wxHtmlDCRenderer::Render() arguments have changed, simply omit the ones not
+ existing in the function signature any more to update the code using it.
+
3.1.2: (released 2018-??-??)
----------------------------
diff --git a/include/wx/html/htmprint.h b/include/wx/html/htmprint.h
index 5e4584aec1..8bd6d67e91 100644
--- a/include/wx/html/htmprint.h
+++ b/include/wx/html/htmprint.h
@@ -62,30 +62,19 @@ public:
const wxString& normal_face = wxEmptyString,
const wxString& fixed_face = wxEmptyString);
+ // Finds the next page break after the specified (vertical) position.
+ // Returns wxNOT_FOUND if passed in position is the last page break.
+ int FindNextPageBreak(const wxArrayInt& known_pagebreaks, int pos);
+
// [x,y] is position of upper-left corner of printing rectangle (see SetSize)
// from is y-coordinate of the very first visible cell
// to is y-coordinate of the next following page break, if any
- // Returned value is y coordinate of first cell than didn't fit onto page.
- // Use this value as 'from' in next call to Render in order to print multiple pages
- // document
- // If dont_render is TRUE then nothing is rendered into DC and it only counts
- // pixels and return y coord of the next page
- //
- // known_pagebreaks and number_of_pages are used only when counting pages;
- // otherwise, their default values should be used. Their purpose is to
- // support pagebreaks using a subset of CSS2's
. The
handler
- // needs to know what pagebreaks have already been set so that it doesn't
- // set the same pagebreak twice.
- //
- // CAUTION! Render() changes DC's user scale and does NOT restore it!
- int Render(int x, int y, const wxArrayInt& known_pagebreaks, int from = 0,
- int dont_render = false, int to = INT_MAX);
+ void Render(int x, int y, int from = 0, int to = INT_MAX);
// returns total width of the html document
int GetTotalWidth() const;
// returns total height of the html document
- // (compare Render's return value with this)
int GetTotalHeight() const;
private:
diff --git a/interface/wx/html/htmprint.h b/interface/wx/html/htmprint.h
index 7d0ceaf15e..9036a6f1ff 100644
--- a/interface/wx/html/htmprint.h
+++ b/interface/wx/html/htmprint.h
@@ -38,10 +38,9 @@ public:
/**
Returns the height of the HTML text in pixels.
- This is important if area height (see wxHtmlDCRenderer::SetSize) is
- smaller that total height and thus the page cannot fit into it. In that
- case you're supposed to call Render() as long as its return value is
- smaller than GetTotalHeight()'s.
+ If the height of the area used with this renderer (see
+ wxHtmlDCRenderer::SetSize) is smaller that total height, the renderer
+ will produce more than one page of output.
@see GetTotalWidth()
*/
@@ -52,19 +51,11 @@ public:
@param x,y
position of upper-left corner of printing rectangle (see SetSize()).
- @param known_pagebreaks
- @todo docme
@param from
y-coordinate of the very first visible cell.
- @param dont_render
- if @true then this method only returns y coordinate of the next page
- and does not output anything.
@param to
- y-coordinate of the last visible cell.
-
- Returned value is y coordinate of first cell than didn't fit onto page.
- Use this value as from in next call to Render() in order to print
- multipages document.
+ y-coordinate of the last visible cell or @c INT_MAX to use the full
+ page height.
@note
The following three methods @b must always be called before any call to
@@ -72,11 +63,8 @@ public:
- SetDC()
- SetSize()
- SetHtmlText()
-
- @note Render() changes the DC's user scale and does NOT restore it.
*/
- int Render(int x, int y, wxArrayInt& known_pagebreaks, int from = 0,
- int dont_render = false, int to = INT_MAX);
+ void Render(int x, int y, int from = 0, int to = INT_MAX);
/**
Assign DC instance to the renderer.
diff --git a/src/html/htmprint.cpp b/src/html/htmprint.cpp
index a11eeae995..a65ccb524b 100644
--- a/src/html/htmprint.cpp
+++ b/src/html/htmprint.cpp
@@ -140,36 +140,37 @@ void wxHtmlDCRenderer::SetStandardFonts(int size,
// else: SetHtmlText() not yet called, no need for relayout
}
-int wxHtmlDCRenderer::Render(int x, int y,
- const wxArrayInt& known_pagebreaks,
- int from, int dont_render, int to)
+int wxHtmlDCRenderer::FindNextPageBreak(const wxArrayInt& known_pagebreaks,
+ int pos)
{
- wxCHECK_MSG( m_Cells, 0, "SetHtmlText() must be called before Render()" );
- wxCHECK_MSG( m_DC, 0, "SetDC() must be called before Render()" );
+ // Stop looking for page breaks if the previous one was already at the end
+ // of the last page.
+ //
+ // For an empty HTML document total height is 0, but we still must have at
+ // least a single page in it, so handle the case of pos == 0 specially.
+ if ( pos != 0 && pos >= GetTotalHeight() )
+ return wxNOT_FOUND;
- int pbreak, hght;
+ pos += m_Height;
+ while (m_Cells->AdjustPagebreak(&pos, known_pagebreaks, m_Height)) {}
+ return pos;
+}
- pbreak = (int)(from + m_Height);
- while (m_Cells->AdjustPagebreak(&pbreak, known_pagebreaks, m_Height)) {}
- hght = pbreak - from;
- if(to < hght)
- hght = to;
+void wxHtmlDCRenderer::Render(int x, int y, int from, int to)
+{
+ wxCHECK_RET( m_DC, "SetDC() must be called before Render()" );
- if (!dont_render)
- {
- wxHtmlRenderingInfo rinfo;
- wxDefaultHtmlRenderingStyle rstyle;
- rinfo.SetStyle(&rstyle);
- m_DC->SetBrush(*wxWHITE_BRUSH);
- wxDCClipper clip(*m_DC, x, y, m_Width, hght);
- m_Cells->Draw(*m_DC,
- x, (y - from),
- y, y + hght,
- rinfo);
- }
+ const int hght = to == INT_MAX ? m_Height : to - from;
- const int totalHeight = GetTotalHeight();
- return pbreak < totalHeight ? pbreak : totalHeight;
+ wxHtmlRenderingInfo rinfo;
+ wxDefaultHtmlRenderingStyle rstyle;
+ rinfo.SetStyle(&rstyle);
+ m_DC->SetBrush(*wxWHITE_BRUSH);
+ wxDCClipper clip(*m_DC, x, y, m_Width, hght);
+ m_Cells->Draw(*m_DC,
+ x, (y - from),
+ y, y + hght,
+ rinfo);
}
int wxHtmlDCRenderer::GetTotalWidth() const
@@ -470,27 +471,16 @@ void wxHtmlPrintout::SetFooter(const wxString& footer, int pg)
void wxHtmlPrintout::CountPages()
{
wxBusyCursor wait;
- int pageWidth, pageHeight, mm_w, mm_h;
- float ppmm_h, ppmm_v;
- GetPageSizePixels(&pageWidth, &pageHeight);
- GetPageSizeMM(&mm_w, &mm_h);
- ppmm_h = (float)pageWidth / mm_w;
- ppmm_v = (float)pageHeight / mm_h;
-
- int pos = 0;
m_NumPages = 0;
m_PageBreaks.Clear();
- m_PageBreaks.Add( 0);
- do
+
+ for ( int pos = 0; pos != wxNOT_FOUND; )
{
- pos = m_Renderer.Render((int)( ppmm_h * m_MarginLeft),
- (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight),
- m_PageBreaks,
- pos, true, INT_MAX);
m_PageBreaks.Add( pos);
- } while (pos < m_Renderer.GetTotalHeight());
+ pos = m_Renderer.FindNextPageBreak(m_PageBreaks, pos);
+ }
}
@@ -525,8 +515,8 @@ void wxHtmlPrintout::RenderPage(wxDC *dc, int page)
dc->SetBackgroundMode(wxTRANSPARENT);
m_Renderer.Render((int) (ppmm_h * m_MarginLeft),
- (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight), m_PageBreaks,
- m_PageBreaks[page-1], false, m_PageBreaks[page]-m_PageBreaks[page-1]);
+ (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight),
+ m_PageBreaks[page-1], m_PageBreaks[page]);
m_RendererHdr.SetDC(dc,
@@ -535,12 +525,12 @@ void wxHtmlPrintout::RenderPage(wxDC *dc, int page)
if (!m_Headers[page % 2].empty())
{
m_RendererHdr.SetHtmlText(TranslateHeader(m_Headers[page % 2], page));
- m_RendererHdr.Render((int) (ppmm_h * m_MarginLeft), (int) (ppmm_v * m_MarginTop), m_PageBreaks);
+ m_RendererHdr.Render((int) (ppmm_h * m_MarginLeft), (int) (ppmm_v * m_MarginTop));
}
if (!m_Footers[page % 2].empty())
{
m_RendererHdr.SetHtmlText(TranslateHeader(m_Footers[page % 2], page));
- m_RendererHdr.Render((int) (ppmm_h * m_MarginLeft), (int) (pageHeight - ppmm_v * m_MarginBottom - m_FooterHeight), m_PageBreaks);
+ m_RendererHdr.Render((int) (ppmm_h * m_MarginLeft), (int) (pageHeight - ppmm_v * m_MarginBottom - m_FooterHeight));
}
}