diff options
| author | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2013-11-18 17:24:41 +0100 |
|---|---|---|
| committer | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2013-11-18 17:24:41 +0100 |
| commit | bd147d3148282923626d62aef23af5173fb4595f (patch) | |
| tree | cc28a19cc09c11e2691ee4c442de4f8d68189151 /unity-shared | |
| parent | b160fd3a58a0c810a788a63a18a8a01cd55a3916 (diff) | |
OverlayRenderer: update the blur region before drawing, otherwise we'll get a lag
We need to update BackgroundEffectHelper about the new blurred regions before drawing, otherwise compiz will copy the wrong area to the backbuffer and as result we'll get a corrupted blurred image as background. (bzr r3347.5.17)
Diffstat (limited to 'unity-shared')
| -rw-r--r-- | unity-shared/OverlayRenderer.cpp | 59 | ||||
| -rw-r--r-- | unity-shared/OverlayRenderer.h | 7 |
2 files changed, 38 insertions, 28 deletions
diff --git a/unity-shared/OverlayRenderer.cpp b/unity-shared/OverlayRenderer.cpp index d048d227f..a4b1a1a7c 100644 --- a/unity-shared/OverlayRenderer.cpp +++ b/unity-shared/OverlayRenderer.cpp @@ -45,8 +45,8 @@ class OverlayRendererImpl : public sigc::trackable public: OverlayRendererImpl(OverlayRenderer *parent_); + void ComputeLargerGeometries(nux::Geometry& larger_absolute_geo, nux::Geometry& larger_content_geo, bool force_edges); void UpdateTextures(); - void OnBgColorChanged(nux::Color const& new_color); void Draw(nux::GraphicsEngine& gfx_context, nux::Geometry const& content_geo, nux::Geometry const& absolute_geo, nux::Geometry const& geometry, bool force_draw); @@ -395,30 +395,26 @@ void OverlayRendererImpl::RenderInverseMask(nux::GraphicsEngine& gfx_context, in } } -void OverlayRendererImpl::Draw(nux::GraphicsEngine& gfx_context, nux::Geometry const& content_geo, nux::Geometry const& absolute_geo, nux::Geometry const& geometry, bool force_edges) +void OverlayRendererImpl::ComputeLargerGeometries(nux::Geometry& larger_absolute_geo, nux::Geometry& larger_content_geo, bool force_edges) { - nux::Geometry geo(content_geo); int excess_border = (Settings::Instance().form_factor() != FormFactor::NETBOOK || force_edges) ? EXCESS_BORDER : 0; - - nux::Geometry larger_content_geo = content_geo; + larger_absolute_geo.OffsetSize(excess_border, excess_border); larger_content_geo.OffsetSize(excess_border, excess_border); +} +void OverlayRenderer::UpdateBlurBackgroundSize(nux::Geometry const& content_geo, nux::Geometry const& absolute_geo, bool force_edges) +{ nux::Geometry larger_absolute_geo = absolute_geo; - larger_absolute_geo.OffsetSize(excess_border, excess_border); - - nux::TexCoordXForm texxform_absolute_bg; - texxform_absolute_bg.flip_v_coord = true; - texxform_absolute_bg.SetTexCoordType(nux::TexCoordXForm::OFFSET_COORD); - texxform_absolute_bg.uoffset = 0.0f; - texxform_absolute_bg.voffset = 0.0f; - texxform_absolute_bg.SetWrap(nux::TEXWRAP_CLAMP, nux::TEXWRAP_CLAMP); + nux::Geometry larger_content_geo = content_geo; + pimpl_->ComputeLargerGeometries(larger_absolute_geo, larger_content_geo, force_edges); - nux::Geometry blur_geo(larger_absolute_geo.x, larger_absolute_geo.y, larger_content_geo.width, larger_content_geo.height); + nux::Geometry blur_geo(larger_absolute_geo.x, larger_absolute_geo.y, + larger_content_geo.width, larger_content_geo.height); - if (blur_geo_ != blur_geo) + if (pimpl_->blur_geo_ != blur_geo) { - blur_geo_ = blur_geo; - auto* view = bg_effect_helper_.owner(); + pimpl_->blur_geo_ = blur_geo; + auto* view = pimpl_->bg_effect_helper_.owner(); if (view) { @@ -426,6 +422,22 @@ void OverlayRendererImpl::Draw(nux::GraphicsEngine& gfx_context, nux::Geometry c view->geometry_changed.emit(view, blur_geo); } } +} + +void OverlayRendererImpl::Draw(nux::GraphicsEngine& gfx_context, nux::Geometry const& content_geo, nux::Geometry const& absolute_geo, nux::Geometry const& geometry, bool force_edges) +{ + nux::Geometry geo(content_geo); + + nux::Geometry larger_content_geo = content_geo; + nux::Geometry larger_absolute_geo = absolute_geo; + ComputeLargerGeometries(larger_absolute_geo, larger_content_geo, force_edges); + + nux::TexCoordXForm texxform_absolute_bg; + texxform_absolute_bg.flip_v_coord = true; + texxform_absolute_bg.SetTexCoordType(nux::TexCoordXForm::OFFSET_COORD); + texxform_absolute_bg.uoffset = 0.0f; + texxform_absolute_bg.voffset = 0.0f; + texxform_absolute_bg.SetWrap(nux::TEXWRAP_CLAMP, nux::TEXWRAP_CLAMP); if (BackgroundEffectHelper::blur_type != BLUR_NONE) { @@ -799,24 +811,17 @@ void OverlayRendererImpl::Draw(nux::GraphicsEngine& gfx_context, nux::Geometry c gfx_context.GetRenderStates().SetPremultipliedBlend(nux::SRC_OVER); gfx_context.GetRenderStates().SetColorMask(true, true, true, true); gfx_context.GetRenderStates().SetBlend(false); - } void OverlayRendererImpl::DrawContent(nux::GraphicsEngine& gfx_context, nux::Geometry const& content_geo, nux::Geometry const& absolute_geo, nux::Geometry const& geometry) { bgs = 0; - int excess_border = (Settings::Instance().form_factor() != FormFactor::NETBOOK) ? EXCESS_BORDER : 0; - nux::Geometry larger_content_geo = content_geo; - larger_content_geo.OffsetSize(excess_border, excess_border); - - nux::Geometry larger_geo(larger_content_geo); - nux::Geometry larger_absolute_geo = absolute_geo; - larger_absolute_geo.OffsetSize(excess_border, excess_border); + ComputeLargerGeometries(larger_absolute_geo, larger_content_geo, false); - gfx_context.PushClippingRectangle(larger_geo); + gfx_context.PushClippingRectangle(larger_content_geo); unsigned int blend_alpha, blend_src, blend_dest = 0; gfx_context.GetRenderStates().GetBlend(blend_alpha, blend_src, blend_dest); @@ -947,7 +952,7 @@ void OverlayRenderer::AboutToShow() void OverlayRenderer::SetOwner(nux::View* owner) { pimpl_->bg_effect_helper_.owner= owner; - pimpl_->bg_effect_helper_.SetGeometryGetter([this] { return pimpl_->blur_geo_; }); + pimpl_->bg_effect_helper_.SetGeometryGetter([this] { std::cout << "Blur geo "<< pimpl_->blur_geo_; return pimpl_->blur_geo_; }); } void OverlayRenderer::DisableBlur() diff --git a/unity-shared/OverlayRenderer.h b/unity-shared/OverlayRenderer.h index 27aa31340..d6d359107 100644 --- a/unity-shared/OverlayRenderer.h +++ b/unity-shared/OverlayRenderer.h @@ -62,7 +62,12 @@ public: * Needed internally, should be called with yourself as the owner as soon as possible */ void SetOwner(nux::View *owner); - + + /* + * Call this whenever the interface size changes: it should be called before the drawing loop happens. + */ + void UpdateBlurBackgroundSize(nux::Geometry const& content_geo, nux::Geometry const& absolute_geo, bool force_edges=false); + /* * Draws the entire stack of visuals using direct rendering, use in the Draw() call, not DrawContent() * |
