~3v1n0/unity/overlay-border-scale

« back to all changes in this revision

Viewing changes to unity-shared/OverlayRenderer.cpp

  • Committer: Marco Trevisan (Treviño)
  • Date: 2014-07-10 17:29:18 UTC
  • Revision ID: mail@3v1n0.net-20140710172918-5as0b4qb2g81rktw
OverlayRenderer: scale dash borders to match current scaling

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
namespace
37
37
{
38
38
const RawPixel INNER_CORNER_RADIUS = 5_em;
39
 
const int EXCESS_BORDER = 10;
 
39
const RawPixel EXCESS_BORDER = 10_em;
 
40
 
 
41
const RawPixel LEFT_CORNER_OFFSET = 10_em;
 
42
const RawPixel TOP_CORNER_OFFSET = 10_em;
40
43
 
41
44
const nux::Color LINE_COLOR = nux::color::White * 0.07f;
42
45
const RawPixel GRADIENT_HEIGHT = 50_em;
53
56
public:
54
57
  OverlayRendererImpl(OverlayRenderer *parent_);
55
58
 
 
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);
59
63
 
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);
71
75
 
72
76
  std::unique_ptr<nux::TextureLayer> bg_refine_gradient_;
73
77
 
 
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_;
 
84
 
74
85
  // temporary variable that stores the number of backgrounds we have rendered
75
86
  int bgs;
76
87
  bool visible;
96
107
  : visible(false)
97
108
  , parent(parent_)
98
109
{
99
 
  parent_->scale = 1.0;
 
110
  parent->scale = 1.0;
 
111
  parent->scale.changed.connect(sigc::hide(sigc::mem_fun(this, &OverlayRendererImpl::LoadScaledTextures)));
100
112
  UpdateTextures();
 
113
  LoadScaledTextures();
 
114
}
 
115
 
 
116
void OverlayRendererImpl::LoadScaledTextures()
 
117
{
 
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);
101
126
}
102
127
 
103
128
void OverlayRendererImpl::OnBgColorChanged(nux::Color const& new_color)
145
170
  bg_shine_texture_ = dash::Style::Instance().GetDashShine()->GetDeviceTexture();
146
171
 
147
172
  auto const& bg_refine_tex = dash::Style::Instance().GetRefineTextureDash();
 
173
 
148
174
  if (bg_refine_tex)
149
175
  {
150
176
    rop.Blend = true;
406
432
 
407
433
void OverlayRendererImpl::ComputeLargerGeometries(nux::Geometry& larger_absolute_geo, nux::Geometry& larger_content_geo, bool force_edges)
408
434
{
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);
412
438
}
565
591
      gfx_context.GetRenderStates().SetBlend(true);
566
592
      gfx_context.GetRenderStates().SetPremultipliedBlend(nux::SRC_OVER);
567
593
 
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;
582
 
 
583
 
      int left_corner_offset = 10;
584
 
      int top_corner_offset = 10;
585
 
 
586
 
      geo.width += corner->GetWidth() - 10;
587
 
      geo.height += corner->GetHeight() - 10;
 
607
      auto const& top_tile = top_texture_;
 
608
 
 
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));
 
614
 
 
615
      geo.width += corner_size.width - left_corner_offset;
 
616
      geo.height += corner_size.height - top_corner_offset;
588
617
      {
589
618
        // Corner
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);
592
622
 
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()),
596
 
                                         corner->GetWidth(),
597
 
                                         corner->GetHeight(),
 
624
        gfx_context.QRP_ColorModTexAlpha(geo.x + (geo.width - corner_size.width),
 
625
                                         geo.y + (geo.height - corner_size.height),
 
626
                                         corner_size.width,
 
627
                                         corner_size.height,
598
628
                                         corner_mask->GetDeviceTexture(),
599
629
                                         texxform,
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()),
607
 
                             corner->GetWidth(),
608
 
                             corner->GetHeight(),
 
635
        RenderInverseMask(gfx_context, geo.x + (geo.width - corner_size.width),
 
636
                             geo.y + (geo.height - corner_size.height),
 
637
                             corner_size.width,
 
638
                             corner_size.height,
609
639
                             corner_mask->GetDeviceTexture(),
610
640
                             texxform,
611
641
                             nux::color::White);
614
644
        gfx_context.GetRenderStates().SetPremultipliedBlend(nux::SRC_OVER);
615
645
        gfx_context.GetRenderStates().SetColorMask(true, true, true, true);
616
646
 
617
 
        gfx_context.QRP_1Tex(geo.x + (geo.width - corner->GetWidth()),
618
 
                             geo.y + (geo.height - corner->GetHeight()),
619
 
                             corner->GetWidth(),
620
 
                             corner->GetHeight(),
 
647
        gfx_context.QRP_1Tex(geo.x + (geo.width - corner_size.width),
 
648
                             geo.y + (geo.height - corner_size.height),
 
649
                             corner_size.width,
 
650
                             corner_size.height,
621
651
                             corner->GetDeviceTexture(),
622
652
                             texxform,
623
653
                             nux::color::White);
624
654
      }
625
655
      {
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();
629
659
 
630
660
        texxform.SetTexCoordType(nux::TexCoordXForm::OFFSET_COORD);
631
661
        texxform.SetWrap(nux::TEXWRAP_REPEAT, nux::TEXWRAP_REPEAT);
632
662
 
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);
656
686
 
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(),
664
694
      }
665
695
      {
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);
669
700
 
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(),
676
707
                                         texxform,
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(),
687
718
                             texxform,
688
719
                             nux::color::White);
692
723
        gfx_context.GetRenderStates().SetColorMask(true, true, true, true);
693
724
 
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(),
699
730
                             texxform,
700
731
                             nux::color::White);
708
739
        texxform.SetTexCoordType(nux::TexCoordXForm::OFFSET_COORD);
709
740
        texxform.SetWrap(nux::TEXWRAP_REPEAT, nux::TEXWRAP_REPEAT);
710
741
 
711
 
        gfx_context.QRP_1Tex(geo.x - 10,
 
742
        gfx_context.QRP_1Tex(geo.x - left_corner_offset,
712
743
                             geo.y + geo.height,
713
744
                             left_tile->GetWidth(),
714
745
                             real_height + offset,
723
754
 
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(),
730
761
                                         texxform,
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(),
741
772
                             texxform,
742
773
                             nux::color::White);
746
777
        gfx_context.GetRenderStates().SetColorMask(true, true, true, true);
747
778
 
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(),
753
784
                             texxform,
754
785
                             nux::color::White);
755
786
      }
756
787
      {
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);
760
792
 
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(),
767
799
                                        texxform,
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(),
778
810
                                        texxform,
779
811
                                        nux::color::White);
783
815
        gfx_context.GetRenderStates().SetColorMask(true, true, true, true);
784
816
        gfx_context.QRP_1Tex(geo.x + geo.width - right->GetWidth(),
785
817
                             geo.y - top_corner_offset,
786
 
                             top_corner->GetWidth(),
787
 
                             top_corner->GetHeight(),
 
818
                             top_corner_size.width,
 
819
                             top_corner_size.height,
788
820
                             top_corner->GetDeviceTexture(),
789
821
                             texxform,
790
822
                             nux::color::White);
796
828
 
797
829
        gfx_context.GetRenderStates().SetPremultipliedBlend(nux::SRC_OVER);
798
830
        gfx_context.QRP_1Tex(geo.x + geo.width,
799
 
                             geo.y - 10,
 
831
                             geo.y - top_corner_offset,
800
832
                             geometry.width - (geo.x + geo.width),
801
833
                             top_tile->GetHeight(),
802
834
                             top_tile->GetDeviceTexture(),