void PanelView::DrawContent(nux::GraphicsEngine& GfxContext, bool force_draw) { nux::Geometry const& geo = GetGeometry(); bool overlay_mode = InOverlayMode(); int bgs = 1; GfxContext.PushClippingRectangle(geo); GfxContext.GetRenderStates().SetBlend(true); GfxContext.GetRenderStates().SetPremultipliedBlend(nux::SRC_OVER); if (bg_blur_texture_.IsValid() && IsTransparent()) { nux::Geometry const& geo_absolute = GetAbsoluteGeometry(); nux::TexCoordXForm texxform_blur_bg; texxform_blur_bg.flip_v_coord = true; texxform_blur_bg.SetTexCoordType(nux::TexCoordXForm::OFFSET_COORD); texxform_blur_bg.uoffset = geo.x / static_cast<float>(geo_absolute.width); texxform_blur_bg.voffset = geo.y / static_cast<float>(geo_absolute.height); nux::ROPConfig rop; rop.Blend = false; rop.SrcBlend = GL_ONE; rop.DstBlend = GL_ONE_MINUS_SRC_ALPHA; #ifndef NUX_OPENGLES_20 if (GfxContext.UsingGLSLCodePath()) gPainter.PushCompositionLayer(GfxContext, geo, bg_blur_texture_, texxform_blur_bg, nux::color::White, WindowManager::Default().average_color(), nux::LAYER_BLEND_MODE_OVERLAY, true, rop); else gPainter.PushTextureLayer(GfxContext, geo, bg_blur_texture_, texxform_blur_bg, nux::color::White, true, rop); #else gPainter.PushCompositionLayer(GfxContext, geo, bg_blur_texture_, texxform_blur_bg, nux::color::White, WindowManager::Default().average_color(), nux::LAYER_BLEND_MODE_OVERLAY, true, rop); #endif bgs++; if (overlay_mode) { if (Settings::Instance().GetLowGfxMode()) { rop.Blend = false; auto const& bg_color = WindowManager::Default().average_color(); bg_darken_layer_.reset(new nux::ColorLayer(bg_color, false, rop)); } nux::GetPainter().PushLayer(GfxContext, geo, bg_darken_layer_.get()); bgs++; nux::Geometry refine_geo = geo; int refine_x_pos = geo.x + (stored_dash_width_ - refine_gradient_midpoint); refine_x_pos += unity::Settings::Instance().LauncherWidth(monitor_); refine_geo.x = refine_x_pos; refine_geo.width = bg_refine_tex_->GetWidth(); if (!Settings::Instance().GetLowGfxMode()) { nux::GetPainter().PushLayer(GfxContext, refine_geo, bg_refine_layer_.get()); bgs++; refine_geo.x += refine_geo.width; refine_geo.width = geo.width; nux::GetPainter().PushLayer(GfxContext, refine_geo, bg_refine_single_column_layer_.get()); bgs++; } } } if (!overlay_mode || !GfxContext.UsingGLSLCodePath()) gPainter.PushLayer(GfxContext, geo, bg_layer_.get()); if (overlay_mode && !Settings::Instance().GetLowGfxMode()) { // apply the shine nux::TexCoordXForm texxform; texxform.SetTexCoordType(nux::TexCoordXForm::OFFSET_COORD); texxform.SetWrap(nux::TEXWRAP_CLAMP, nux::TEXWRAP_CLAMP); nux::ROPConfig rop; rop.Blend = true; rop.SrcBlend = GL_DST_COLOR; rop.DstBlend = GL_ONE; nux::GetPainter().PushTextureLayer(GfxContext, geo, panel_sheen_->GetDeviceTexture(), texxform, nux::color::White, false, rop); } layout_->ProcessDraw(GfxContext, force_draw); gPainter.PopBackground(bgs); GfxContext.GetRenderStates().SetBlend(false); GfxContext.PopClippingRectangle(); }
void PanelView::Draw(nux::GraphicsEngine& GfxContext, bool force_draw) { nux::Geometry const& geo = GetGeometry(); UpdateBackground(); bool overlay_mode = InOverlayMode(); GfxContext.PushClippingRectangle(geo); if (IsTransparent()) { nux::Geometry const& geo_absolute = GetAbsoluteGeometry(); if (BackgroundEffectHelper::blur_type != BLUR_NONE) { bg_blur_texture_ = bg_effect_helper_.GetBlurRegion(); } else { bg_blur_texture_ = bg_effect_helper_.GetRegion(); } if (bg_blur_texture_.IsValid()) { nux::TexCoordXForm texxform_blur_bg; texxform_blur_bg.flip_v_coord = true; texxform_blur_bg.SetTexCoordType(nux::TexCoordXForm::OFFSET_COORD); texxform_blur_bg.uoffset = geo.x / static_cast<float>(geo_absolute.width); texxform_blur_bg.voffset = geo.y / static_cast<float>(geo_absolute.height); nux::ROPConfig rop; rop.Blend = false; rop.SrcBlend = GL_ONE; rop.DstBlend = GL_ONE_MINUS_SRC_ALPHA; GfxContext.PushClippingRectangle(geo); #ifndef NUX_OPENGLES_20 if (GfxContext.UsingGLSLCodePath()) gPainter.PushDrawCompositionLayer(GfxContext, geo, bg_blur_texture_, texxform_blur_bg, nux::color::White, WindowManager::Default().average_color(), nux::LAYER_BLEND_MODE_OVERLAY, true, rop); else gPainter.PushDrawTextureLayer(GfxContext, geo, bg_blur_texture_, texxform_blur_bg, nux::color::White, true, rop); #else gPainter.PushDrawCompositionLayer(GfxContext, geo, bg_blur_texture_, texxform_blur_bg, nux::color::White, WindowManager::Default().average_color(), nux::LAYER_BLEND_MODE_OVERLAY, true, rop); #endif GfxContext.PopClippingRectangle(); } if (overlay_mode && !Settings::Instance().GetLowGfxMode()) { nux::GetPainter().RenderSinglePaintLayer(GfxContext, geo, bg_darken_layer_.get()); GfxContext.GetRenderStates().SetBlend(true, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); nux::TexCoordXForm refine_texxform; int refine_x_pos = geo.x + (stored_dash_width_ - refine_gradient_midpoint); refine_x_pos += unity::Settings::Instance().LauncherWidth(monitor_); GfxContext.QRP_1Tex(refine_x_pos, geo.y, bg_refine_tex_->GetWidth(), bg_refine_tex_->GetHeight(), bg_refine_tex_->GetDeviceTexture(), refine_texxform, nux::color::White); GfxContext.QRP_1Tex(refine_x_pos + bg_refine_tex_->GetWidth(), geo.y, geo.width, geo.height, bg_refine_single_column_tex_->GetDeviceTexture(), refine_texxform, nux::color::White); } } if (!overlay_mode || !GfxContext.UsingGLSLCodePath()) nux::GetPainter().RenderSinglePaintLayer(GfxContext, geo, bg_layer_.get()); GfxContext.PopClippingRectangle(); if (needs_geo_sync_) { SyncGeometries(); needs_geo_sync_ = false; } }