// Paint windows in z-order by first collecting the windows // and then painting consecutive layers with the same z-order, // starting with the lowest z-order. // We don't sort because we want to preserve the order of // containment of windows with the same z-order and non-stable // sort could change it. static void PaintWindowsInZOrder(Graphics *g, Control *c) { Vec<CtrlAndOffset> toPaint; WndFilter wndFilter; CtrlAndOffset * coff; Pen debugPen(Color(255, 0, 0), 1); CollectWindowsBreathFirst(c, 0, 0, &wndFilter, &toPaint); size_t paintedCount = 0; int16 lastPaintedZOrder = INT16_MIN; for (;;) { // find which z-order should we paint now int16 minUnpaintedZOrder = INT16_MAX; for (coff = toPaint.IterStart(); coff; coff = toPaint.IterNext()) { int16 zOrder = coff->c->zOrder; if ((zOrder > lastPaintedZOrder) && (zOrder < minUnpaintedZOrder)) minUnpaintedZOrder = zOrder; } for (coff = toPaint.IterStart(); coff; coff = toPaint.IterNext()) { if (minUnpaintedZOrder == coff->c->zOrder) { coff->c->Paint(g, coff->offX, coff->offY); if (IsDebugPaint()) { Rect bbox(coff->offX, coff->offY, coff->c->pos.Width, coff->c->pos.Height); g->DrawRectangle(&debugPen, bbox); } ++paintedCount; } } if (paintedCount == toPaint.Count()) return; CrashIf(paintedCount > toPaint.Count()); lastPaintedZOrder = minUnpaintedZOrder; } }
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); }