summaryrefslogtreecommitdiff
path: root/unity-shared
diff options
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2013-11-18 17:24:41 +0100
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2013-11-18 17:24:41 +0100
commitbd147d3148282923626d62aef23af5173fb4595f (patch)
treecc28a19cc09c11e2691ee4c442de4f8d68189151 /unity-shared
parentb160fd3a58a0c810a788a63a18a8a01cd55a3916 (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.cpp59
-rw-r--r--unity-shared/OverlayRenderer.h7
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()
*