void PageControl::Paint(Graphics *gfx, int offX, int offY) { CrashIf(!IsVisible()); Timer timerAll; CachedStyle *s = cachedStyle; Timer timerFill; Rect r(offX, offY, pos.Width, pos.Height); if (!s->bgColor->IsTransparent()) { Brush *br = BrushFromColorData(s->bgColor, r); gfx->FillRectangle(br, r); } double durFill = timerFill.Stop(); if (!page) return; // during resize the page we currently show might be bigger than // our area. To avoid drawing outside our area we clip Region origClipRegion; gfx->GetClip(&origClipRegion); r.X += s->padding.left; r.Y += s->padding.top; r.Width -= (s->padding.left + s->padding.right); r.Height -= (s->padding.top + s->padding.bottom); r.Inflate(1,0); gfx->SetClip(r, CombineModeReplace); Color textColor; if (gGlobalPrefs->useSysColors) textColor.SetFromCOLORREF(GetSysColor(COLOR_WINDOWTEXT)); else textColor.SetFromCOLORREF(gGlobalPrefs->ebookUI.textColor); ITextRender *textRender = CreateTextRender(GetTextRenderMethod(), gfx); Color bgCol; if (gGlobalPrefs->useSysColors) bgCol.SetFromCOLORREF(GetSysColor(COLOR_WINDOW)); else bgCol.SetFromCOLORREF(gGlobalPrefs->ebookUI.backgroundColor); textRender->SetTextBgColor(bgCol); Timer timerDrawHtml; DrawHtmlPage(gfx, textRender, &page->instructions, (REAL)r.X, (REAL)r.Y, IsDebugPaint(), textColor); double durDraw = timerDrawHtml.Stop(); gfx->SetClip(&origClipRegion, CombineModeReplace); delete textRender; double durAll = timerAll.Stop(); plogf("all: %.2f, fill: %.2f, draw html: %.2f", durAll, durFill, durDraw); }
void PageControl::Paint(Graphics *gfx, int offX, int offY) { CrashIf(!IsVisible()); #if 0 // for testing mouse move, paint a blue circle at current cursor position if ((-1 != cursorX) && (-1 != cursorY)) { SolidBrush br(Color(180, 0, 0, 255)); int x = offX + cursorX; int y = offY + cursorY; Rect r(RectForCircle(x, y, 10)); gfx->FillEllipse(&br, r); } #endif CachedStyle *s = cachedStyle; Rect r(offX, offY, pos.Width, pos.Height); Brush *br = BrushFromColorData(s->bgColor, r); gfx->FillRectangle(br, r); if (!page) return; // during resize the page we currently show might be bigger than // our area. To avoid drawing outside our area we clip Region origClipRegion; gfx->GetClip(&origClipRegion); r.X += s->padding.left; r.Y += s->padding.top; r.Width -= (s->padding.left + s->padding.right); r.Height -= (s->padding.top + s->padding.bottom); r.Inflate(1,0); gfx->SetClip(r, CombineModeReplace); // TODO: support changing the text color to gRenderCache.colorRange[0] // or GetSysColor(COLOR_WINDOWTEXT) if gGlobalPrefs.useSysColors DrawHtmlPage(gfx, &page->instructions, (REAL)r.X, (REAL)r.Y, IsDebugPaint()); gfx->SetClip(&origClipRegion, CombineModeReplace); }
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); }