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 = CreateFormatter(doc, 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 NULL) // returns true if layout thread was cancelled bool EbookFormattingThread::Format(int reparseIdx) { bool fromBeginning = (0 == reparseIdx); //lf("Started laying out mobi, fromBeginning=%d", (int)fromBeginning); int totalPageCount = 0; Timer t(true); formatterArgs->reparseIdx = reparseIdx; HtmlFormatter *formatter = CreateFormatter(doc, formatterArgs); int lastReparseIdx = reparseIdx; for (HtmlPage *pd = formatter->Next(); pd; pd = formatter->Next()) { CrashIf(pd->reparseIdx < lastReparseIdx); lastReparseIdx = pd->reparseIdx; 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, fromBeginning); delete formatter; return true; } pages[pageCount++] = pd; ++totalPageCount; // we send first 5 pages one by one and the rest in batches to minimize user-visible // latency but also not overload ui thread SendPagesIfNecessary(totalPageCount < 5, false, fromBeginning); CrashIf(pageCount >= dimof(pages)); } // this is the last message only if we're laying out from the beginning bool finished = fromBeginning; SendPagesIfNecessary(true, finished, fromBeginning); //lf("Laying out took %.2f ms", t.GetTimeInMs()); delete formatter; return false; }