+FORCE_LINK_ME(m_layout)
+
+#ifdef __WXWINCE__
+    #include "wx/msw/wince/missing.h"       // for bsearch()
+#else
+    #include <stdlib.h>                     // bsearch()
+#endif
+
+//-----------------------------------------------------------------------------
+// wxHtmlPageBreakCell
+//-----------------------------------------------------------------------------
+
+// Since html isn't a page-layout language, it doesn't support page
+// page breaks directly--that requires CSS2 support. But a page-break
+// facility is handy, and has been requested more than once on the
+// mailing lists. This wxHtml tag handler implements just enough of
+// CSS2 to support a page break by recognizing only
+//   <div style="page-break-before:always">
+//
+// wxHtml maintains page breaks in wxHtmlPrintout::m_PageBreaks. The
+// tag handler below adds appropriate offsets to that array member.
+// wxHtmlDCRenderer::Render() accesses that array and makes a new page
+// begin after each page-break tag.
+
+// The page-break handler does all its work in AdjustPagebreak(). For
+// all tag handlers, that function adjusts the page-break position.
+// For other tags, it determines whether the html element can fit on
+// the remainder of the page; if it cannot fit, but must not be split,
+// then the function moves the page break provided in the argument up,
+// and returns 'true' to inform the caller that the argument was
+// modified.
+//
+// Due to its special purpose, the page-break facility differs from
+// other tags. It takes up no space, but it behaves as though there is
+// never enough room to fit it on the remainder of the page--it always
+// forces a page break. Therefore, unlike other elements that trigger
+// a page break, it would never 'fit' on the following page either.
+// Therefore it's necessary to compare each pagebreak candidate to the
+// array wxHtmlPrintout::m_PageBreaks of pagebreaks already set, and
+// set a new one only if it's not in that array.
+
+class wxHtmlPageBreakCell : public wxHtmlCell
+{
+public:
+    wxHtmlPageBreakCell() {}
+
+    bool AdjustPagebreak(int* pagebreak,
+                         int* known_pagebreaks = NULL,
+                         int number_of_pages = 0) const;
+    void Draw(wxDC& WXUNUSED(dc),
+              int WXUNUSED(x), int WXUNUSED(y),
+              int WXUNUSED(view_y1), int WXUNUSED(view_y2),
+              wxHtmlRenderingInfo& WXUNUSED(info)) {}
+
+private:
+    DECLARE_NO_COPY_CLASS(wxHtmlPageBreakCell)
+};
+
+// Comparison routine for bsearch into an int* array of pagebreaks.
+extern "C" int wxCMPFUNC_CONV wxInteger_compare(void const* i0, void const* i1)
+{
+    return *(int*)i0 - *(int*)i1;
+}
+
+bool wxHtmlPageBreakCell::AdjustPagebreak(int* pagebreak, int* known_pagebreaks, int number_of_pages) const
+{
+    // When we are counting pages, 'known_pagebreaks' is non-NULL.
+    // That's the only time we change 'pagebreak'. Otherwise, pages
+    // were already counted, 'known_pagebreaks' is NULL, and we don't
+    // do anything except return false.
+    //
+    // We also simply return false if the 'pagebreak' argument is
+    // less than (vertically above) or the same as the current
+    // vertical position. Otherwise we'd be setting a pagebreak above
+    // the current cell, which is incorrect, or duplicating a
+    // pagebreak that has already been set.
+    if(NULL == known_pagebreaks || *pagebreak <= m_PosY)
+        {
+        return false;
+        }