1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_drawinglayer.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <drawinglayer/attribute/fontattribute.hxx>
28*b1cdbd2cSJim Jagielski #include <tools/string.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski namespace drawinglayer
33*b1cdbd2cSJim Jagielski {
34*b1cdbd2cSJim Jagielski 	namespace attribute
35*b1cdbd2cSJim Jagielski 	{
36*b1cdbd2cSJim Jagielski 		class ImpFontAttribute
37*b1cdbd2cSJim Jagielski 		{
38*b1cdbd2cSJim Jagielski 		public:
39*b1cdbd2cSJim Jagielski 			// refcounter
40*b1cdbd2cSJim Jagielski 			sal_uInt32								mnRefCount;
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski             /// core data
43*b1cdbd2cSJim Jagielski 			String   									maFamilyName;       // Font Family Name
44*b1cdbd2cSJim Jagielski 			String   									maStyleName;        // Font Style Name
45*b1cdbd2cSJim Jagielski 			sal_uInt16									mnWeight;           // Font weight
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski 			/// bitfield
48*b1cdbd2cSJim Jagielski 			unsigned									mbSymbol : 1;       // Symbol Font Flag
49*b1cdbd2cSJim Jagielski 			unsigned									mbVertical : 1;     // Vertical Text Flag
50*b1cdbd2cSJim Jagielski 			unsigned									mbItalic : 1;       // Italic Flag
51*b1cdbd2cSJim Jagielski 			unsigned									mbOutline : 1;      // Outline Flag
52*b1cdbd2cSJim Jagielski             unsigned                                    mbRTL : 1;          // RTL Flag
53*b1cdbd2cSJim Jagielski             unsigned                                    mbBiDiStrong : 1;   // BiDi Flag
54*b1cdbd2cSJim Jagielski             unsigned                                    mbMonospaced : 1;
55*b1cdbd2cSJim Jagielski 
ImpFontAttribute(const String & rFamilyName,const String & rStyleName,sal_uInt16 nWeight,bool bSymbol,bool bVertical,bool bItalic,bool bMonospaced,bool bOutline,bool bRTL,bool bBiDiStrong)56*b1cdbd2cSJim Jagielski             ImpFontAttribute(
57*b1cdbd2cSJim Jagielski                 const String& rFamilyName,
58*b1cdbd2cSJim Jagielski                 const String& rStyleName,
59*b1cdbd2cSJim Jagielski                 sal_uInt16 nWeight,
60*b1cdbd2cSJim Jagielski                 bool bSymbol,
61*b1cdbd2cSJim Jagielski                 bool bVertical,
62*b1cdbd2cSJim Jagielski                 bool bItalic,
63*b1cdbd2cSJim Jagielski                 bool bMonospaced,
64*b1cdbd2cSJim Jagielski                 bool bOutline,
65*b1cdbd2cSJim Jagielski                 bool bRTL,
66*b1cdbd2cSJim Jagielski                 bool bBiDiStrong)
67*b1cdbd2cSJim Jagielski 			:	mnRefCount(0),
68*b1cdbd2cSJim Jagielski                 maFamilyName(rFamilyName),
69*b1cdbd2cSJim Jagielski 			    maStyleName(rStyleName),
70*b1cdbd2cSJim Jagielski 			    mnWeight(nWeight),
71*b1cdbd2cSJim Jagielski 			    mbSymbol(bSymbol),
72*b1cdbd2cSJim Jagielski 			    mbVertical(bVertical),
73*b1cdbd2cSJim Jagielski 			    mbItalic(bItalic),
74*b1cdbd2cSJim Jagielski 			    mbOutline(bOutline),
75*b1cdbd2cSJim Jagielski                 mbRTL(bRTL),
76*b1cdbd2cSJim Jagielski                 mbBiDiStrong(bBiDiStrong),
77*b1cdbd2cSJim Jagielski                 mbMonospaced(bMonospaced)
78*b1cdbd2cSJim Jagielski             {
79*b1cdbd2cSJim Jagielski             }
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski             // data read access
getFamilyName() const82*b1cdbd2cSJim Jagielski             const String& getFamilyName() const { return maFamilyName; }
getStyleName() const83*b1cdbd2cSJim Jagielski             const String& getStyleName() const { return maStyleName; }
getWeight() const84*b1cdbd2cSJim Jagielski             sal_uInt16 getWeight() const { return mnWeight; }
getSymbol() const85*b1cdbd2cSJim Jagielski             bool getSymbol() const { return mbSymbol; }
getVertical() const86*b1cdbd2cSJim Jagielski             bool getVertical() const { return mbVertical; }
getItalic() const87*b1cdbd2cSJim Jagielski             bool getItalic() const { return mbItalic; }
getOutline() const88*b1cdbd2cSJim Jagielski             bool getOutline() const { return mbOutline; }
getRTL() const89*b1cdbd2cSJim Jagielski             bool getRTL() const { return mbRTL; }
getBiDiStrong() const90*b1cdbd2cSJim Jagielski             bool getBiDiStrong() const { return mbBiDiStrong; }
getMonospaced() const91*b1cdbd2cSJim Jagielski             bool getMonospaced() const { return mbMonospaced; }
92*b1cdbd2cSJim Jagielski 
operator ==(const ImpFontAttribute & rCompare) const93*b1cdbd2cSJim Jagielski             bool operator==(const ImpFontAttribute& rCompare) const
94*b1cdbd2cSJim Jagielski             {
95*b1cdbd2cSJim Jagielski 			    return (getFamilyName() == rCompare.getFamilyName()
96*b1cdbd2cSJim Jagielski 				    && getStyleName() == rCompare.getStyleName()
97*b1cdbd2cSJim Jagielski 				    && getWeight() == rCompare.getWeight()
98*b1cdbd2cSJim Jagielski 				    && getSymbol() == rCompare.getSymbol()
99*b1cdbd2cSJim Jagielski 				    && getVertical() == rCompare.getVertical()
100*b1cdbd2cSJim Jagielski 				    && getItalic() == rCompare.getItalic()
101*b1cdbd2cSJim Jagielski 				    && getOutline() == rCompare.getOutline()
102*b1cdbd2cSJim Jagielski 				    && getRTL() == rCompare.getRTL()
103*b1cdbd2cSJim Jagielski 				    && getBiDiStrong() == rCompare.getBiDiStrong()
104*b1cdbd2cSJim Jagielski 				    && getMonospaced() == rCompare.getMonospaced());
105*b1cdbd2cSJim Jagielski             }
106*b1cdbd2cSJim Jagielski 
get_global_default()107*b1cdbd2cSJim Jagielski             static ImpFontAttribute* get_global_default()
108*b1cdbd2cSJim Jagielski             {
109*b1cdbd2cSJim Jagielski                 static ImpFontAttribute* pDefault = 0;
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski                 if(!pDefault)
112*b1cdbd2cSJim Jagielski                 {
113*b1cdbd2cSJim Jagielski                     pDefault = new ImpFontAttribute(
114*b1cdbd2cSJim Jagielski                         String(), String(),
115*b1cdbd2cSJim Jagielski                         0,
116*b1cdbd2cSJim Jagielski                         false, false, false, false, false, false, false);
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski                     // never delete; start with RefCount 1, not 0
119*b1cdbd2cSJim Jagielski     			    pDefault->mnRefCount++;
120*b1cdbd2cSJim Jagielski                 }
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski                 return pDefault;
123*b1cdbd2cSJim Jagielski             }
124*b1cdbd2cSJim Jagielski 		};
125*b1cdbd2cSJim Jagielski 
FontAttribute(const String & rFamilyName,const String & rStyleName,sal_uInt16 nWeight,bool bSymbol,bool bVertical,bool bItalic,bool bMonospaced,bool bOutline,bool bRTL,bool bBiDiStrong)126*b1cdbd2cSJim Jagielski         FontAttribute::FontAttribute(
127*b1cdbd2cSJim Jagielski             const String& rFamilyName,
128*b1cdbd2cSJim Jagielski             const String& rStyleName,
129*b1cdbd2cSJim Jagielski             sal_uInt16 nWeight,
130*b1cdbd2cSJim Jagielski             bool bSymbol,
131*b1cdbd2cSJim Jagielski             bool bVertical,
132*b1cdbd2cSJim Jagielski             bool bItalic,
133*b1cdbd2cSJim Jagielski             bool bMonospaced,
134*b1cdbd2cSJim Jagielski             bool bOutline,
135*b1cdbd2cSJim Jagielski             bool bRTL,
136*b1cdbd2cSJim Jagielski             bool bBiDiStrong)
137*b1cdbd2cSJim Jagielski 		:	mpFontAttribute(new ImpFontAttribute(
138*b1cdbd2cSJim Jagielski                 rFamilyName, rStyleName, nWeight, bSymbol, bVertical, bItalic, bMonospaced, bOutline, bRTL, bBiDiStrong))
139*b1cdbd2cSJim Jagielski 		{
140*b1cdbd2cSJim Jagielski 		}
141*b1cdbd2cSJim Jagielski 
FontAttribute()142*b1cdbd2cSJim Jagielski 		FontAttribute::FontAttribute()
143*b1cdbd2cSJim Jagielski         :	mpFontAttribute(ImpFontAttribute::get_global_default())
144*b1cdbd2cSJim Jagielski 		{
145*b1cdbd2cSJim Jagielski 			mpFontAttribute->mnRefCount++;
146*b1cdbd2cSJim Jagielski 		}
147*b1cdbd2cSJim Jagielski 
FontAttribute(const FontAttribute & rCandidate)148*b1cdbd2cSJim Jagielski 		FontAttribute::FontAttribute(const FontAttribute& rCandidate)
149*b1cdbd2cSJim Jagielski 		:	mpFontAttribute(rCandidate.mpFontAttribute)
150*b1cdbd2cSJim Jagielski 		{
151*b1cdbd2cSJim Jagielski 			mpFontAttribute->mnRefCount++;
152*b1cdbd2cSJim Jagielski 		}
153*b1cdbd2cSJim Jagielski 
~FontAttribute()154*b1cdbd2cSJim Jagielski 		FontAttribute::~FontAttribute()
155*b1cdbd2cSJim Jagielski 		{
156*b1cdbd2cSJim Jagielski 			if(mpFontAttribute->mnRefCount)
157*b1cdbd2cSJim Jagielski 			{
158*b1cdbd2cSJim Jagielski 				mpFontAttribute->mnRefCount--;
159*b1cdbd2cSJim Jagielski 			}
160*b1cdbd2cSJim Jagielski 			else
161*b1cdbd2cSJim Jagielski 			{
162*b1cdbd2cSJim Jagielski 				delete mpFontAttribute;
163*b1cdbd2cSJim Jagielski 			}
164*b1cdbd2cSJim Jagielski 		}
165*b1cdbd2cSJim Jagielski 
isDefault() const166*b1cdbd2cSJim Jagielski         bool FontAttribute::isDefault() const
167*b1cdbd2cSJim Jagielski         {
168*b1cdbd2cSJim Jagielski             return mpFontAttribute == ImpFontAttribute::get_global_default();
169*b1cdbd2cSJim Jagielski         }
170*b1cdbd2cSJim Jagielski 
operator =(const FontAttribute & rCandidate)171*b1cdbd2cSJim Jagielski         FontAttribute& FontAttribute::operator=(const FontAttribute& rCandidate)
172*b1cdbd2cSJim Jagielski 		{
173*b1cdbd2cSJim Jagielski 			if(rCandidate.mpFontAttribute != mpFontAttribute)
174*b1cdbd2cSJim Jagielski 			{
175*b1cdbd2cSJim Jagielski 				if(mpFontAttribute->mnRefCount)
176*b1cdbd2cSJim Jagielski 				{
177*b1cdbd2cSJim Jagielski 					mpFontAttribute->mnRefCount--;
178*b1cdbd2cSJim Jagielski 				}
179*b1cdbd2cSJim Jagielski 				else
180*b1cdbd2cSJim Jagielski 				{
181*b1cdbd2cSJim Jagielski 					delete mpFontAttribute;
182*b1cdbd2cSJim Jagielski 				}
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 				mpFontAttribute = rCandidate.mpFontAttribute;
185*b1cdbd2cSJim Jagielski 				mpFontAttribute->mnRefCount++;
186*b1cdbd2cSJim Jagielski 			}
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski 			return *this;
189*b1cdbd2cSJim Jagielski 		}
190*b1cdbd2cSJim Jagielski 
operator ==(const FontAttribute & rCandidate) const191*b1cdbd2cSJim Jagielski 		bool FontAttribute::operator==(const FontAttribute& rCandidate) const
192*b1cdbd2cSJim Jagielski 		{
193*b1cdbd2cSJim Jagielski 			if(rCandidate.mpFontAttribute == mpFontAttribute)
194*b1cdbd2cSJim Jagielski 			{
195*b1cdbd2cSJim Jagielski 				return true;
196*b1cdbd2cSJim Jagielski 			}
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski 			if(rCandidate.isDefault() != isDefault())
199*b1cdbd2cSJim Jagielski 			{
200*b1cdbd2cSJim Jagielski 				return false;
201*b1cdbd2cSJim Jagielski 			}
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski 			return (*rCandidate.mpFontAttribute == *mpFontAttribute);
204*b1cdbd2cSJim Jagielski 		}
205*b1cdbd2cSJim Jagielski 
getFamilyName() const206*b1cdbd2cSJim Jagielski         const String& FontAttribute::getFamilyName() const
207*b1cdbd2cSJim Jagielski         {
208*b1cdbd2cSJim Jagielski             return mpFontAttribute->getFamilyName();
209*b1cdbd2cSJim Jagielski         }
210*b1cdbd2cSJim Jagielski 
getStyleName() const211*b1cdbd2cSJim Jagielski         const String& FontAttribute::getStyleName() const
212*b1cdbd2cSJim Jagielski         {
213*b1cdbd2cSJim Jagielski             return mpFontAttribute->getStyleName();
214*b1cdbd2cSJim Jagielski         }
215*b1cdbd2cSJim Jagielski 
getWeight() const216*b1cdbd2cSJim Jagielski         sal_uInt16 FontAttribute::getWeight() const
217*b1cdbd2cSJim Jagielski         {
218*b1cdbd2cSJim Jagielski             return mpFontAttribute->getWeight();
219*b1cdbd2cSJim Jagielski         }
220*b1cdbd2cSJim Jagielski 
getSymbol() const221*b1cdbd2cSJim Jagielski         bool FontAttribute::getSymbol() const
222*b1cdbd2cSJim Jagielski         {
223*b1cdbd2cSJim Jagielski             return mpFontAttribute->getSymbol();
224*b1cdbd2cSJim Jagielski         }
225*b1cdbd2cSJim Jagielski 
getVertical() const226*b1cdbd2cSJim Jagielski         bool FontAttribute::getVertical() const
227*b1cdbd2cSJim Jagielski         {
228*b1cdbd2cSJim Jagielski             return mpFontAttribute->getVertical();
229*b1cdbd2cSJim Jagielski         }
230*b1cdbd2cSJim Jagielski 
getItalic() const231*b1cdbd2cSJim Jagielski         bool FontAttribute::getItalic() const
232*b1cdbd2cSJim Jagielski         {
233*b1cdbd2cSJim Jagielski             return mpFontAttribute->getItalic();
234*b1cdbd2cSJim Jagielski         }
235*b1cdbd2cSJim Jagielski 
getOutline() const236*b1cdbd2cSJim Jagielski         bool FontAttribute::getOutline() const
237*b1cdbd2cSJim Jagielski         {
238*b1cdbd2cSJim Jagielski             return mpFontAttribute->getOutline();
239*b1cdbd2cSJim Jagielski         }
240*b1cdbd2cSJim Jagielski 
getRTL() const241*b1cdbd2cSJim Jagielski         bool FontAttribute::getRTL() const
242*b1cdbd2cSJim Jagielski         {
243*b1cdbd2cSJim Jagielski             return mpFontAttribute->getRTL();
244*b1cdbd2cSJim Jagielski         }
245*b1cdbd2cSJim Jagielski 
getBiDiStrong() const246*b1cdbd2cSJim Jagielski         bool FontAttribute::getBiDiStrong() const
247*b1cdbd2cSJim Jagielski         {
248*b1cdbd2cSJim Jagielski             return mpFontAttribute->getBiDiStrong();
249*b1cdbd2cSJim Jagielski         }
250*b1cdbd2cSJim Jagielski 
getMonospaced() const251*b1cdbd2cSJim Jagielski         bool FontAttribute::getMonospaced() const
252*b1cdbd2cSJim Jagielski         {
253*b1cdbd2cSJim Jagielski             return mpFontAttribute->getMonospaced();
254*b1cdbd2cSJim Jagielski         }
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski     } // end of namespace attribute
258*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
261*b1cdbd2cSJim Jagielski // eof
262