38
38
const RawPixel INNER_CORNER_RADIUS = 5_em;
39
const int EXCESS_BORDER = 10;
39
const RawPixel EXCESS_BORDER = 10_em;
41
const RawPixel LEFT_CORNER_OFFSET = 10_em;
42
const RawPixel TOP_CORNER_OFFSET = 10_em;
41
44
const nux::Color LINE_COLOR = nux::color::White * 0.07f;
42
45
const RawPixel GRADIENT_HEIGHT = 50_em;
54
57
OverlayRendererImpl(OverlayRenderer *parent_);
59
void UpdateTextures();
60
void LoadScaledTextures();
56
61
void ComputeLargerGeometries(nux::Geometry& larger_absolute_geo, nux::Geometry& larger_content_geo, bool force_edges);
57
void UpdateTextures();
58
62
void OnBgColorChanged(nux::Color const& new_color);
60
64
void Draw(nux::GraphicsEngine& gfx_context, nux::Geometry const& content_geo, nux::Geometry const& absolute_geo, nux::Geometry const& geometry, bool force_draw);
72
76
std::unique_ptr<nux::TextureLayer> bg_refine_gradient_;
78
nux::ObjectPtr<nux::BaseTexture> bottom_texture_;
79
nux::ObjectPtr<nux::BaseTexture> bottom_texture_mask_;
80
nux::ObjectPtr<nux::BaseTexture> right_texture_;
81
nux::ObjectPtr<nux::BaseTexture> right_texture_mask_;
82
nux::ObjectPtr<nux::BaseTexture> left_texture_;
83
nux::ObjectPtr<nux::BaseTexture> top_texture_;
74
85
// temporary variable that stores the number of backgrounds we have rendered
111
parent->scale.changed.connect(sigc::hide(sigc::mem_fun(this, &OverlayRendererImpl::LoadScaledTextures)));
100
112
UpdateTextures();
113
LoadScaledTextures();
116
void OverlayRendererImpl::LoadScaledTextures()
118
double scale = parent->scale;
119
auto& style = dash::Style::Instance();
120
bottom_texture_ = style.GetDashBottomTile(scale);
121
bottom_texture_mask_ = style.GetDashBottomTileMask(scale);
122
right_texture_ = style.GetDashRightTile(scale);
123
right_texture_mask_ = style.GetDashRightTileMask(scale);
124
left_texture_ = style.GetDashLeftTile(scale);
125
top_texture_ = style.GetDashTopTile(scale);
103
128
void OverlayRendererImpl::OnBgColorChanged(nux::Color const& new_color)
407
433
void OverlayRendererImpl::ComputeLargerGeometries(nux::Geometry& larger_absolute_geo, nux::Geometry& larger_content_geo, bool force_edges)
409
int excess_border = (Settings::Instance().form_factor() != FormFactor::NETBOOK || force_edges) ? EXCESS_BORDER : 0;
435
int excess_border = (Settings::Instance().form_factor() != FormFactor::NETBOOK || force_edges) ? EXCESS_BORDER.CP(parent->scale) : 0;
410
436
larger_absolute_geo.OffsetSize(excess_border, excess_border);
411
437
larger_content_geo.OffsetSize(excess_border, excess_border);
565
591
gfx_context.GetRenderStates().SetBlend(true);
566
592
gfx_context.GetRenderStates().SetPremultipliedBlend(nux::SRC_OVER);
568
dash::Style& style = dash::Style::Instance();
569
auto const& bottom = style.GetDashBottomTile();
570
auto const& bottom_mask = style.GetDashBottomTileMask();
571
auto const& right = style.GetDashRightTile();
572
auto const& right_mask = style.GetDashRightTileMask();
594
nux::TexCoordXForm texxform;
595
auto& style = dash::Style::Instance();
596
auto const& bottom = bottom_texture_;
597
auto const& bottom_mask = bottom_texture_mask_;
598
auto const& right = right_texture_;
599
auto const& right_mask = right_texture_mask_;
573
600
auto const& corner = style.GetDashCorner();
574
601
auto const& corner_mask = style.GetDashCornerMask();
575
602
auto const& left_corner = style.GetDashLeftCorner();
576
603
auto const& left_corner_mask = style.GetDashLeftCornerMask();
577
auto const& left_tile = style.GetDashLeftTile();
604
auto const& left_tile = left_texture_;
578
605
auto const& top_corner = style.GetDashTopCorner();
579
606
auto const& top_corner_mask = style.GetDashTopCornerMask();
580
auto const& top_tile = style.GetDashTopTile();
581
nux::TexCoordXForm texxform;
583
int left_corner_offset = 10;
584
int top_corner_offset = 10;
586
geo.width += corner->GetWidth() - 10;
587
geo.height += corner->GetHeight() - 10;
607
auto const& top_tile = top_texture_;
609
int left_corner_offset = LEFT_CORNER_OFFSET.CP(scale);
610
int top_corner_offset = TOP_CORNER_OFFSET.CP(scale);
611
nux::Size corner_size(RawPixel(corner->GetWidth()).CP(scale), RawPixel(corner->GetHeight()).CP(scale));
612
nux::Size top_corner_size(RawPixel(top_corner->GetWidth()).CP(scale), RawPixel(top_corner->GetHeight()).CP(scale));
613
nux::Size left_corner_size(RawPixel(left_corner->GetWidth()).CP(scale), RawPixel(left_corner->GetHeight()).CP(scale));
615
geo.width += corner_size.width - left_corner_offset;
616
geo.height += corner_size.height - top_corner_offset;
590
texxform.SetTexCoordType(nux::TexCoordXForm::OFFSET_COORD);
619
texxform.SetTexCoordType(nux::TexCoordXForm::OFFSET_SCALE_COORD);
591
620
texxform.SetWrap(nux::TEXWRAP_CLAMP_TO_BORDER, nux::TEXWRAP_CLAMP_TO_BORDER);
621
texxform.SetFilter(nux::TEXFILTER_LINEAR, nux::TEXFILTER_LINEAR);
593
623
// Selectively erase blur region in the curbe
594
gfx_context.QRP_ColorModTexAlpha(geo.x + (geo.width - corner->GetWidth()),
595
geo.y + (geo.height - corner->GetHeight()),
624
gfx_context.QRP_ColorModTexAlpha(geo.x + (geo.width - corner_size.width),
625
geo.y + (geo.height - corner_size.height),
598
628
corner_mask->GetDeviceTexture(),
600
630
nux::color::Black);
602
632
// Write correct alpha
603
633
gfx_context.GetRenderStates().SetBlend(false);
604
634
gfx_context.GetRenderStates().SetColorMask(false, false, false, true);
605
RenderInverseMask(gfx_context, geo.x + (geo.width - corner->GetWidth()),
606
geo.y + (geo.height - corner->GetHeight()),
635
RenderInverseMask(gfx_context, geo.x + (geo.width - corner_size.width),
636
geo.y + (geo.height - corner_size.height),
609
639
corner_mask->GetDeviceTexture(),
611
641
nux::color::White);
614
644
gfx_context.GetRenderStates().SetPremultipliedBlend(nux::SRC_OVER);
615
645
gfx_context.GetRenderStates().SetColorMask(true, true, true, true);
617
gfx_context.QRP_1Tex(geo.x + (geo.width - corner->GetWidth()),
618
geo.y + (geo.height - corner->GetHeight()),
647
gfx_context.QRP_1Tex(geo.x + (geo.width - corner_size.width),
648
geo.y + (geo.height - corner_size.height),
621
651
corner->GetDeviceTexture(),
623
653
nux::color::White);
626
656
// Bottom repeated texture
627
int real_width = geo.width - (left_corner->GetWidth() - left_corner_offset) - corner->GetWidth();
657
int real_width = geo.width - (left_corner_size.width - left_corner_offset) - corner_size.width;
628
658
int offset = real_width % bottom->GetWidth();
630
660
texxform.SetTexCoordType(nux::TexCoordXForm::OFFSET_COORD);
631
661
texxform.SetWrap(nux::TEXWRAP_REPEAT, nux::TEXWRAP_REPEAT);
633
663
// Selectively erase blur region in the curbe
634
gfx_context.QRP_ColorModTexAlpha(left_corner->GetWidth() - left_corner_offset - offset,
664
gfx_context.QRP_ColorModTexAlpha(left_corner_size.width - left_corner_offset - offset,
635
665
geo.y + (geo.height - bottom->GetHeight()),
636
666
real_width + offset,
637
667
bottom->GetHeight(),
642
672
// Write correct alpha
643
673
gfx_context.GetRenderStates().SetBlend(false);
644
674
gfx_context.GetRenderStates().SetColorMask(false, false, false, true);
645
RenderInverseMask(gfx_context, left_corner->GetWidth() - left_corner_offset - offset,
675
RenderInverseMask(gfx_context, left_corner_size.width - left_corner_offset - offset,
646
676
geo.y + (geo.height - bottom->GetHeight()),
647
677
real_width + offset,
648
678
bottom->GetHeight(),
654
684
gfx_context.GetRenderStates().SetPremultipliedBlend(nux::SRC_OVER);
655
685
gfx_context.GetRenderStates().SetColorMask(true, true, true, true);
657
gfx_context.QRP_1Tex(left_corner->GetWidth() - left_corner_offset - offset,
687
gfx_context.QRP_1Tex(left_corner_size.width - left_corner_offset - offset,
658
688
geo.y + (geo.height - bottom->GetHeight()),
659
689
real_width + offset,
660
690
bottom->GetHeight(),
666
696
// Bottom left corner
667
texxform.SetTexCoordType(nux::TexCoordXForm::OFFSET_COORD);
697
texxform.SetTexCoordType(nux::TexCoordXForm::OFFSET_SCALE_COORD);
668
698
texxform.SetWrap(nux::TEXWRAP_CLAMP_TO_BORDER, nux::TEXWRAP_CLAMP_TO_BORDER);
699
texxform.SetFilter(nux::TEXFILTER_LINEAR, nux::TEXFILTER_LINEAR);
670
701
// Selectively erase blur region in the curbe
671
702
gfx_context.QRP_ColorModTexAlpha(geo.x - left_corner_offset,
672
geo.y + (geo.height - left_corner->GetHeight()),
673
left_corner->GetWidth(),
674
left_corner->GetHeight(),
703
geo.y + (geo.height - left_corner_size.height),
704
left_corner_size.width,
705
left_corner_size.height,
675
706
left_corner_mask->GetDeviceTexture(),
677
708
nux::color::Black);
680
711
gfx_context.GetRenderStates().SetBlend(false);
681
712
gfx_context.GetRenderStates().SetColorMask(false, false, false, true);
682
713
RenderInverseMask(gfx_context, geo.x - left_corner_offset,
683
geo.y + (geo.height - left_corner->GetHeight()),
684
left_corner->GetWidth(),
685
left_corner->GetHeight(),
714
geo.y + (geo.height - left_corner_size.height),
715
left_corner_size.width,
716
left_corner_size.height,
686
717
left_corner_mask->GetDeviceTexture(),
688
719
nux::color::White);
692
723
gfx_context.GetRenderStates().SetColorMask(true, true, true, true);
694
725
gfx_context.QRP_1Tex(geo.x - left_corner_offset,
695
geo.y + (geo.height - left_corner->GetHeight()),
696
left_corner->GetWidth(),
697
left_corner->GetHeight(),
726
geo.y + (geo.height - left_corner_size.height),
727
left_corner_size.width,
728
left_corner_size.height,
698
729
left_corner->GetDeviceTexture(),
700
731
nux::color::White);
724
755
// Selectively erase blur region in the curbe
725
756
gfx_context.QRP_ColorModTexAlpha(geo.x + geo.width - right->GetWidth(),
726
geo.y + top_corner->GetHeight() - top_corner_offset,
757
geo.y + top_corner_size.height - top_corner_offset,
727
758
right->GetWidth(),
728
geo.height - corner->GetHeight() - (top_corner->GetHeight() - top_corner_offset),
759
geo.height - corner_size.height - (top_corner_size.height - top_corner_offset),
729
760
right_mask->GetDeviceTexture(),
731
762
nux::color::Black);
734
765
gfx_context.GetRenderStates().SetBlend(false);
735
766
gfx_context.GetRenderStates().SetColorMask(false, false, false, true);
736
767
RenderInverseMask(gfx_context, geo.x + geo.width - right->GetWidth(),
737
geo.y + top_corner->GetHeight() - top_corner_offset,
768
geo.y + top_corner_size.height - top_corner_offset,
738
769
right->GetWidth(),
739
geo.height - corner->GetHeight() - (top_corner->GetHeight() - top_corner_offset),
770
geo.height - corner_size.height - (top_corner_size.height - top_corner_offset),
740
771
right_mask->GetDeviceTexture(),
742
773
nux::color::White);
746
777
gfx_context.GetRenderStates().SetColorMask(true, true, true, true);
748
779
gfx_context.QRP_1Tex(geo.x + geo.width - right->GetWidth(),
749
geo.y + top_corner->GetHeight() - top_corner_offset,
780
geo.y + top_corner_size.height - top_corner_offset,
750
781
right->GetWidth(),
751
geo.height - corner->GetHeight() - (top_corner->GetHeight() - top_corner_offset),
782
geo.height - corner_size.height - (top_corner_size.height - top_corner_offset),
752
783
right->GetDeviceTexture(),
754
785
nux::color::White);
757
788
// Top right corner
758
texxform.SetTexCoordType(nux::TexCoordXForm::OFFSET_COORD);
789
texxform.SetTexCoordType(nux::TexCoordXForm::OFFSET_SCALE_COORD);
759
790
texxform.SetWrap(nux::TEXWRAP_CLAMP_TO_BORDER, nux::TEXWRAP_CLAMP_TO_BORDER);
791
texxform.SetFilter(nux::TEXFILTER_LINEAR, nux::TEXFILTER_LINEAR);
761
793
// Selectively erase blur region in the curbe
762
794
gfx_context.QRP_ColorModTexAlpha(geo.x + geo.width - right->GetWidth(),
763
795
geo.y - top_corner_offset,
764
top_corner->GetWidth(),
765
top_corner->GetHeight(),
796
top_corner_size.width,
797
top_corner_size.height,
766
798
top_corner_mask->GetDeviceTexture(),
768
800
nux::color::Black);
772
804
gfx_context.GetRenderStates().SetColorMask(false, false, false, true);
773
805
RenderInverseMask(gfx_context, geo.x + geo.width - right->GetWidth(),
774
806
geo.y - top_corner_offset,
775
top_corner->GetWidth(),
776
top_corner->GetHeight(),
807
top_corner_size.width,
808
top_corner_size.height,
777
809
top_corner_mask->GetDeviceTexture(),
779
811
nux::color::White);