summaryrefslogtreecommitdiff
path: root/src
diff options
authorNeil Jagdish Patel <neil.patel@canonical.com>2010-12-17 07:30:40 +0000
committerNeil Jagdish Patel <neil.patel@canonical.com>2010-12-17 07:30:40 +0000
commitae09d393f6c53cbb9732d738dd0f36dc5eec41ac (patch)
tree86003b920aed347516b0e662c57e2c28b17cf43d /src
parenteffe86705e3335fbea3a2ca7af2ce6b0a9ddd718 (diff)
Fix renderering
(bzr r669.3.24)
Diffstat (limited to 'src')
-rw-r--r--src/PanelMenuView.cpp94
-rw-r--r--src/PanelMenuView.h2
-rw-r--r--src/WindowManager.cpp2
3 files changed, 87 insertions, 11 deletions
diff --git a/src/PanelMenuView.cpp b/src/PanelMenuView.cpp
index 2fd8898c9..3dc3362a4 100644
--- a/src/PanelMenuView.cpp
+++ b/src/PanelMenuView.cpp
@@ -48,6 +48,8 @@ PanelMenuView::PanelMenuView ()
: _matcher (NULL),
_title_layer (NULL),
_util_cg (CAIRO_FORMAT_ARGB32, 1, 1),
+ _gradient_texture (NULL),
+ _title_tex (NULL),
_is_inside (false),
_is_maximized (false),
_last_active_view (NULL)
@@ -84,6 +86,9 @@ PanelMenuView::~PanelMenuView ()
{
if (_title_layer)
delete _title_layer;
+ if (_title_tex)
+ _title_tex->UnReference ();
+
_menu_layout->UnReference ();
_window_buttons->UnReference ();
}
@@ -152,7 +157,6 @@ long PanelMenuView::PostLayoutManagement (long LayoutResult)
_menu_layout->SetGeometry (geo.x, geo.y, geo.width, geo.height);
_menu_layout->ComputeLayout2();
-
Refresh ();
@@ -163,7 +167,10 @@ void
PanelMenuView::Draw (nux::GraphicsEngine& GfxContext, bool force_draw)
{
nux::Geometry geo = GetGeometry ();
-
+ int button_width = PADDING + _window_buttons->GetContentWidth () + PADDING;
+ float factor = 4;
+ button_width /= factor;
+
GfxContext.PushClippingRectangle (geo);
/* "Clear" out the background */
@@ -175,18 +182,81 @@ PanelMenuView::Draw (nux::GraphicsEngine& GfxContext, bool force_draw)
nux::ColorLayer layer (nux::Color (0x00000000), true, rop);
gPainter.PushDrawLayer (GfxContext, GetGeometry (), &layer);
- if (_is_inside || _last_active_view)
- geo.width = PADDING + _window_buttons->GetContentWidth ();
-
if (_is_maximized)
{
if (!_is_inside)
gPainter.PushDrawLayer (GfxContext, GetGeometry (), _title_layer);
}
else
- gPainter.PushDrawLayer (GfxContext,
- geo,
- _title_layer);
+ {
+ if (_is_inside || _last_active_view)
+ {
+ if (_gradient_texture == NULL)
+ {
+ nux::NTextureData texture_data (nux::BITFMT_R8G8B8A8, geo.width, 1, 1);
+ nux::ImageSurface surface = texture_data.GetSurface (0);
+ nux::SURFACE_LOCKED_RECT lockrect;
+ BYTE *dest;
+ int num_row;
+
+ _gradient_texture = nux::GetThreadGLDeviceFactory ()->CreateSystemCapableDeviceTexture (texture_data.GetWidth (), texture_data.GetHeight (), 1, texture_data.GetFormat ());
+
+ _gradient_texture->LockRect (0, &lockrect, 0);
+
+ dest = (BYTE *) lockrect.pBits;
+ num_row = surface.GetBlockHeight ();
+
+ for (int y = 0; y < num_row; y++)
+ {
+ for (int x = 0; x < geo.width; x++)
+ {
+ *(dest + y * lockrect.Pitch + 4*x + 0) = 223; //red
+ *(dest + y * lockrect.Pitch + 4*x + 1) = 219; //green
+ *(dest + y * lockrect.Pitch + 4*x + 2) = 210; //blue
+
+ if (x < button_width * (factor - 1))
+ {
+ *(dest + y * lockrect.Pitch + 4*x + 3) = 0xff;
+ }
+ else if (x < button_width * factor)
+ {
+ *(dest + y * lockrect.Pitch + 4*x + 3) = 255 - 255 * (((float)x-(button_width * (factor -1)))/(float)(button_width));
+ }
+ else
+ {
+ *(dest + y * lockrect.Pitch + 4*x + 3) = 0x00;
+ }
+ }
+ }
+ _gradient_texture->UnlockRect (0);
+ }
+ GfxContext.GetRenderStates ().SetBlend(true, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ nux::TexCoordXForm texxform0;
+ nux::TexCoordXForm texxform1;
+
+ // Modulate the checkboard and the gradient texture
+ GfxContext.QRP_2TexMod(geo.x, geo.y,
+ geo.width, geo.height,
+ _gradient_texture, texxform0,
+ nux::Color::White,
+ _title_tex->GetDeviceTexture (),
+ texxform1,
+ nux::Color::White);
+
+ GfxContext.GetRenderStates ().SetBlend(false);
+
+ geo.width = button_width * (factor - 1);
+ gPainter.PushDrawLayer (GfxContext, geo, _title_layer);
+ geo = GetGeometry ();
+ }
+ else
+ {
+ gPainter.PushDrawLayer (GfxContext,
+ geo,
+ _title_layer);
+ }
+ }
gPainter.PopBackground ();
@@ -380,8 +450,12 @@ PanelMenuView::Refresh ()
false,
rop);
-
- texture2D->UnReference ();
+
+ if (_title_tex)
+ _title_tex->UnReference ();
+
+ _title_tex = texture2D;
+
g_free (label);
}
diff --git a/src/PanelMenuView.h b/src/PanelMenuView.h
index 4615d002a..ababc491d 100644
--- a/src/PanelMenuView.h
+++ b/src/PanelMenuView.h
@@ -77,6 +77,8 @@ private:
nux::AbstractPaintLayer *_title_layer;
nux::HLayout *_menu_layout;
nux::CairoGraphics _util_cg;
+ nux::IntrusiveSP<nux::IOpenGLBaseTexture> _gradient_texture;
+ nux::BaseTexture *_title_tex;
bool _is_inside;
bool _is_maximized;
diff --git a/src/WindowManager.cpp b/src/WindowManager.cpp
index b7e0e26b8..05e835f3b 100644
--- a/src/WindowManager.cpp
+++ b/src/WindowManager.cpp
@@ -42,7 +42,7 @@ class WindowManagerDummy : public WindowManager
{
bool IsWindowMaximized (guint32 xid)
{
- return true;
+ return false;
}
bool IsWindowDecorated (guint32 xid)