1 /***********************************************************************
2     created:    Mon Jul 18 2005
3     author:     Paul D Turner <paul@cegui.org.uk>
4 *************************************************************************/
5 /***************************************************************************
6  *   Copyright (C) 2004 - 2012 Paul D Turner & The CEGUI Development Team
7  *
8  *   Permission is hereby granted, free of charge, to any person obtaining
9  *   a copy of this software and associated documentation files (the
10  *   "Software"), to deal in the Software without restriction, including
11  *   without limitation the rights to use, copy, modify, merge, publish,
12  *   distribute, sublicense, and/or sell copies of the Software, and to
13  *   permit persons to whom the Software is furnished to do so, subject to
14  *   the following conditions:
15  *
16  *   The above copyright notice and this permission notice shall be
17  *   included in all copies or substantial portions of the Software.
18  *
19  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22  *   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23  *   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24  *   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25  *   OTHER DEALINGS IN THE SOFTWARE.
26  ***************************************************************************/
27 #include "CEGUI/falagard/ComponentBase.h"
28 #include "CEGUI/falagard/XMLHandler.h"
29 #include "CEGUI/Exceptions.h"
30 #include "CEGUI/PropertyHelper.h"
31 #include "CEGUI/Colour.h"
32 #include <iostream>
33 
34 namespace CEGUI
35 {
36 //----------------------------------------------------------------------------//
FalagardComponentBase()37 FalagardComponentBase::FalagardComponentBase() :
38     d_colours(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)
39 {}
40 
41 //----------------------------------------------------------------------------//
~FalagardComponentBase()42 FalagardComponentBase::~FalagardComponentBase()
43 {}
44 
45 //----------------------------------------------------------------------------//
render(Window & srcWindow,const CEGUI::ColourRect * modColours,const Rectf * clipper,bool clipToDisplay) const46 void FalagardComponentBase::render(Window& srcWindow,
47                                    const CEGUI::ColourRect* modColours,
48                                    const Rectf* clipper,
49                                    bool clipToDisplay) const
50 {
51     Rectf dest_rect(d_area.getPixelRect(srcWindow));
52 
53     if (!clipper)
54         clipper = &dest_rect;
55 
56     const Rectf final_clip_rect(dest_rect.getIntersection(*clipper));
57     render_impl(srcWindow, dest_rect, modColours,
58                 &final_clip_rect, clipToDisplay);
59 }
60 
61 //----------------------------------------------------------------------------//
render(Window & srcWindow,const Rectf & baseRect,const CEGUI::ColourRect * modColours,const Rectf * clipper,bool clipToDisplay) const62 void FalagardComponentBase::render(Window& srcWindow,
63                                    const Rectf& baseRect,
64                                    const CEGUI::ColourRect* modColours,
65                                    const Rectf* clipper,
66                                    bool clipToDisplay) const
67 {
68     Rectf dest_rect(d_area.getPixelRect(srcWindow, baseRect));
69 
70     if (!clipper)
71         clipper = &dest_rect;
72 
73     const Rectf final_clip_rect(dest_rect.getIntersection(*clipper));
74     render_impl(srcWindow, dest_rect, modColours,
75                 &final_clip_rect, clipToDisplay);
76 }
77 
78 //----------------------------------------------------------------------------//
getComponentArea() const79 const ComponentArea& FalagardComponentBase::getComponentArea() const
80 {
81     return d_area;
82 }
83 
84 //----------------------------------------------------------------------------//
setComponentArea(const ComponentArea & area)85 void FalagardComponentBase::setComponentArea(const ComponentArea& area)
86 {
87     d_area = area;
88 }
89 
90 //----------------------------------------------------------------------------//
getColours() const91 const ColourRect& FalagardComponentBase::getColours() const
92 {
93     return d_colours;
94 }
95 
96 //----------------------------------------------------------------------------//
setColours(const ColourRect & cols)97 void FalagardComponentBase::setColours(const ColourRect& cols)
98 {
99     d_colours = cols;
100 }
101 
102 //----------------------------------------------------------------------------//
getColoursPropertySource() const103 const String& FalagardComponentBase::getColoursPropertySource() const
104 {
105     return d_colourPropertyName;
106 }
107 
108 //----------------------------------------------------------------------------//
setColoursPropertySource(const String & property)109 void FalagardComponentBase::setColoursPropertySource(const String& property)
110 {
111     d_colourPropertyName = property;
112 }
113 
114 //----------------------------------------------------------------------------//
initColoursRect(const Window & wnd,const ColourRect * modCols,ColourRect & cr) const115 void FalagardComponentBase::initColoursRect(const Window& wnd,
116                                             const ColourRect* modCols,
117                                             ColourRect& cr) const
118 {
119     // if colours come via a colour property
120     if (!d_colourPropertyName.empty())
121     {
122         // if property accesses a ColourRect or a colour
123         cr = wnd.getProperty<ColourRect>(d_colourPropertyName);
124     }
125     // use explicit ColourRect.
126     else
127         cr = d_colours;
128 
129     if (modCols)
130         cr *= *modCols;
131 }
132 
133 //----------------------------------------------------------------------------//
writeColoursXML(XMLSerializer & xml_stream) const134 bool FalagardComponentBase::writeColoursXML(XMLSerializer& xml_stream) const
135 {
136 
137     if (!d_colourPropertyName.empty())
138     {
139         xml_stream.openTag(Falagard_xmlHandler::ColourRectPropertyElement);
140         xml_stream.attribute(Falagard_xmlHandler::NameAttribute, d_colourPropertyName)
141             .closeTag();
142     }
143     else if (!d_colours.isMonochromatic() ||
144               d_colours.d_top_left != Colour(1,1,1,1))
145     {
146         xml_stream.openTag(Falagard_xmlHandler::ColoursElement)
147             .attribute(Falagard_xmlHandler::TopLeftAttribute,
148                 PropertyHelper<Colour>::toString(d_colours.d_top_left))
149             .attribute(Falagard_xmlHandler::TopRightAttribute,
150                 PropertyHelper<Colour>::toString(d_colours.d_top_right))
151             .attribute(Falagard_xmlHandler::BottomLeftAttribute,
152                 PropertyHelper<Colour>::toString(d_colours.d_bottom_left))
153             .attribute(Falagard_xmlHandler::BottomRightAttribute,
154                 PropertyHelper<Colour>::toString(d_colours.d_bottom_right))
155             .closeTag();
156     }
157     else
158         return false;
159 
160     return true;
161 }
162 
163 //----------------------------------------------------------------------------//
handleFontRenderSizeChange(Window & window,const Font * font) const164 bool FalagardComponentBase::handleFontRenderSizeChange(Window& window,
165                                                        const Font* font) const
166 {
167     return d_area.handleFontRenderSizeChange(window, font);
168 }
169 
170 //----------------------------------------------------------------------------//
171 
172 }
173 
174