void EbookController::TriggerLayout() { Size s = ctrls->pagesLayout->GetPage1()->GetDrawableSize(); SizeI size(s.Width, s.Height); if (size.IsEmpty()) { // we haven't been sized yet return; } // CrashIf(size.dx < 100 || size.dy < 40); if (!doc.IsDocLoaded()) return; if (pageSize == size) { //lf("EbookController::TriggerLayout() - skipping layout because same as last size"); return; } //lf("(%3d,%3d) EbookController::TriggerLayout",size.dx, size.dy); pageSize = size; // set it early to prevent re-doing layout at the same size StopFormattingThread(); CrashIf(incomingPages); incomingPages = new Vec<HtmlPage*>(1024); HtmlFormatterArgs *args = CreateFormatterArgsDoc(doc, size.dx, size.dy, &textAllocator); formattingThread = new EbookFormattingThread(doc, args, this, currPageReparseIdx, cb); formattingThreadNo = formattingThread->GetNo(); formattingThread->Start(); UpdateStatus(); }
// we don't use CreateFormatterArgsDoc() to not introduce dependency // on gGlobalPrefs in EngineDump HtmlFormatterArgs *CreateFormatterArgsDoc2(Doc doc, int dx, int dy, PoolAllocator *textAllocator) { HtmlFormatterArgs *args = CreateFormatterArgsDoc(doc, dx, dy, textAllocator); args->SetFontName(GetFontName()); args->fontSize = GetFontSize(); return args; }
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; }
void EbookController::TriggerBookFormatting() { Size s = ctrls->page->GetDrawableSize(); SizeI size(s.Width, s.Height); if (size.IsEmpty()) { // we haven't been sized yet return; } CrashIf(size.dx < 100 || size.dy < 40); if (!doc.IsEbook()) return; if (pageSize == size) { //lf("EbookController::TriggerBookFormatting() - skipping layout because same as last size"); return; } //lf("(%3d,%3d) EbookController::TriggerBookFormatting", dx, dy); pageSize = size; // set it early to prevent re-doing layout at the same size HtmlPage *newPage = PreserveTempPageShown(); if (newPage) { CrashIf((formattingTemp.reparseIdx != 0) && (formattingTemp.reparseIdx != newPage->reparseIdx)); } else { CrashIf(formattingTemp.reparseIdx != 0); } StopFormattingThread(); DeletePages(&pagesFromBeginning); DeletePages(&pagesFromPage); CrashIf(formattingTemp.pagesFromBeginning.Count() > 0); CrashIf(formattingTemp.pagesFromPage.Count() > 0); ShowPage(newPage, newPage != NULL); HtmlFormatterArgs *args = CreateFormatterArgsDoc(doc, size.dx, size.dy, &textAllocator); formattingThread = new EbookFormattingThread(doc, args, this); formattingThreadNo = formattingThread->GetNo(); CrashIf(formattingTemp.reparseIdx < 0); CrashIf(formattingTemp.reparseIdx > (int)args->htmlStrLen); formattingThread->reparseIdx = formattingTemp.reparseIdx; formattingThread->Start(); UpdateStatus(); }
static RenderedBitmap *RenderFirstDocPageToBitmap(Doc doc, SizeI pageSize, SizeI bmpSize, int border) { PoolAllocator textAllocator; HtmlFormatterArgs *args = CreateFormatterArgsDoc(doc, pageSize.dx - 2 * border, pageSize.dy - 2 * border, &textAllocator); TextRenderMethod renderMethod = args->textRenderMethod; HtmlFormatter *formatter = doc.CreateFormatter(args); HtmlPage *pd = formatter->Next(); delete formatter; delete args; args = nullptr; if (!pd) return nullptr; Bitmap pageBmp(pageSize.dx, pageSize.dy, PixelFormat24bppRGB); Graphics g(&pageBmp); Rect r(0, 0, pageSize.dx, pageSize.dy); r.Inflate(1, 1); SolidBrush br(Color(255, 255, 255)); g.FillRectangle(&br, r); ITextRender *textRender = CreateTextRender(renderMethod, &g, pageSize.dx, pageSize.dy); textRender->SetTextBgColor(Color(255,255,255)); DrawHtmlPage(&g, textRender, &pd->instructions, (REAL)border, (REAL)border, false, Color((ARGB)Color::Black)); delete pd; delete textRender; Bitmap res(bmpSize.dx, bmpSize.dy, PixelFormat24bppRGB); Graphics g2(&res); g2.SetInterpolationMode(InterpolationModeHighQualityBicubic); g2.DrawImage(&pageBmp, Rect(0, 0, bmpSize.dx, bmpSize.dy), 0, 0, pageSize.dx, pageSize.dy, UnitPixel); HBITMAP hbmp; Status ok = res.GetHBITMAP((ARGB)Color::White, &hbmp); if (ok != Ok) return nullptr; return new RenderedBitmap(hbmp, bmpSize); }