static int FormatWholeDoc(Doc& doc) { int PAGE_DX = 640; int PAGE_DY = 520; PoolAllocator textAllocator; HtmlFormatterArgs *formatterArgs = CreateFormatterArgsDoc(doc, PAGE_DX, PAGE_DY, &textAllocator); HtmlFormatter *formatter = doc.CreateFormatter(formatterArgs); int nPages = 0; for (HtmlPage *pd = formatter->Next(); pd; pd = formatter->Next()) { delete pd; ++nPages; } delete formatterArgs; delete formatter; return nPages; }
// layout pages from a given reparse point (beginning if nullptr) // returns true if layout thread was cancelled bool EbookFormattingThread::Format() { //lf("Started laying out ebook, reparseIdx=%d", reparseIdx); int totalPageCount = 0; formatterArgs->reparseIdx = 0; pagesAfterReparseIdx = 0; HtmlFormatter *formatter = doc.CreateFormatter(formatterArgs); for (HtmlPage *pd = formatter->Next(); pd; pd = formatter->Next()) { if (WasCancelRequested()) { //lf("layout cancelled"); for (int i = 0; i < pageCount; i++) { delete pages[i]; } pageCount = 0; delete pd; // send a 'finished' message so that the thread object gets deleted SendPagesIfNecessary(true, true /* finished */); delete formatter; return true; } pages[pageCount++] = pd; ++totalPageCount; if (pd->reparseIdx >= reparseIdx) { ++pagesAfterReparseIdx; } // force sending accumulated pages bool force = false; if (2 == pagesAfterReparseIdx) { force = true; //lf("EbookFormattingThread::Format: sending pages because pagesAfterReparseIdx == %d", pagesAfterReparseIdx); } SendPagesIfNecessary(force, false); CrashIf(pageCount >= dimof(pages)); } SendPagesIfNecessary(true, true /* finished */); delete formatter; return false; }