Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <drawinglayer/attribute/sdrfillattribute.hxx>
21 : #include <basegfx/color/bcolor.hxx>
22 : #include <drawinglayer/attribute/sdrfillbitmapattribute.hxx>
23 : #include <drawinglayer/attribute/fillhatchattribute.hxx>
24 : #include <drawinglayer/attribute/fillgradientattribute.hxx>
25 :
26 : //////////////////////////////////////////////////////////////////////////////
27 :
28 : namespace drawinglayer
29 : {
30 : namespace attribute
31 : {
32 32 : class ImpSdrFillAttribute
33 : {
34 : public:
35 : // refcounter
36 : sal_uInt32 mnRefCount;
37 :
38 : // fill definitions
39 : double mfTransparence; // [0.0 .. 1.0], 0.0==no transp.
40 : basegfx::BColor maColor; // fill color
41 : FillGradientAttribute maGradient; // fill gradient (if used)
42 : FillHatchAttribute maHatch; // fill hatch (if used)
43 : SdrFillBitmapAttribute maBitmap; // fill bitmap (if used)
44 :
45 : public:
46 48 : ImpSdrFillAttribute(
47 : double fTransparence,
48 : const basegfx::BColor& rColor,
49 : const FillGradientAttribute& rGradient,
50 : const FillHatchAttribute& rHatch,
51 : const SdrFillBitmapAttribute& rBitmap)
52 : : mnRefCount(0),
53 : mfTransparence(fTransparence),
54 : maColor(rColor),
55 : maGradient(rGradient),
56 : maHatch(rHatch),
57 48 : maBitmap(rBitmap)
58 : {
59 48 : }
60 :
61 : // data read access
62 41 : double getTransparence() const { return mfTransparence; }
63 41 : const basegfx::BColor& getColor() const { return maColor; }
64 41 : const FillGradientAttribute& getGradient() const { return maGradient; }
65 41 : const FillHatchAttribute& getHatch() const { return maHatch; }
66 41 : const SdrFillBitmapAttribute& getBitmap() const { return maBitmap; }
67 :
68 : // compare operator
69 9 : bool operator==(const ImpSdrFillAttribute& rCandidate) const
70 : {
71 9 : return(getTransparence() == rCandidate.getTransparence()
72 9 : && getColor() == rCandidate.getColor()
73 9 : && getGradient() == rCandidate.getGradient()
74 9 : && getHatch() == rCandidate.getHatch()
75 36 : && getBitmap() == rCandidate.getBitmap());
76 : }
77 :
78 1717 : static ImpSdrFillAttribute* get_global_default()
79 : {
80 : static ImpSdrFillAttribute* pDefault = 0;
81 :
82 1717 : if(!pDefault)
83 : {
84 : pDefault = new ImpSdrFillAttribute(
85 : 0.0,
86 : basegfx::BColor(),
87 : FillGradientAttribute(),
88 : FillHatchAttribute(),
89 9 : SdrFillBitmapAttribute());
90 :
91 : // never delete; start with RefCount 1, not 0
92 9 : pDefault->mnRefCount++;
93 : }
94 :
95 1717 : return pDefault;
96 : }
97 : };
98 :
99 39 : SdrFillAttribute::SdrFillAttribute(
100 : double fTransparence,
101 : const basegfx::BColor& rColor,
102 : const FillGradientAttribute& rGradient,
103 : const FillHatchAttribute& rHatch,
104 : const SdrFillBitmapAttribute& rBitmap)
105 : : mpSdrFillAttribute(new ImpSdrFillAttribute(
106 39 : fTransparence, rColor, rGradient, rHatch, rBitmap))
107 : {
108 39 : }
109 :
110 788 : SdrFillAttribute::SdrFillAttribute()
111 788 : : mpSdrFillAttribute(ImpSdrFillAttribute::get_global_default())
112 : {
113 788 : mpSdrFillAttribute->mnRefCount++;
114 788 : }
115 :
116 553 : SdrFillAttribute::SdrFillAttribute(const SdrFillAttribute& rCandidate)
117 553 : : mpSdrFillAttribute(rCandidate.mpSdrFillAttribute)
118 : {
119 553 : mpSdrFillAttribute->mnRefCount++;
120 553 : }
121 :
122 1357 : SdrFillAttribute::~SdrFillAttribute()
123 : {
124 1357 : if(mpSdrFillAttribute->mnRefCount)
125 : {
126 1325 : mpSdrFillAttribute->mnRefCount--;
127 : }
128 : else
129 : {
130 32 : delete mpSdrFillAttribute;
131 : }
132 1357 : }
133 :
134 929 : bool SdrFillAttribute::isDefault() const
135 : {
136 929 : return mpSdrFillAttribute == ImpSdrFillAttribute::get_global_default();
137 : }
138 :
139 345 : SdrFillAttribute& SdrFillAttribute::operator=(const SdrFillAttribute& rCandidate)
140 : {
141 345 : if(rCandidate.mpSdrFillAttribute != mpSdrFillAttribute)
142 : {
143 39 : if(mpSdrFillAttribute->mnRefCount)
144 : {
145 39 : mpSdrFillAttribute->mnRefCount--;
146 : }
147 : else
148 : {
149 0 : delete mpSdrFillAttribute;
150 : }
151 :
152 39 : mpSdrFillAttribute = rCandidate.mpSdrFillAttribute;
153 39 : mpSdrFillAttribute->mnRefCount++;
154 : }
155 :
156 345 : return *this;
157 : }
158 :
159 42 : bool SdrFillAttribute::operator==(const SdrFillAttribute& rCandidate) const
160 : {
161 42 : if(rCandidate.mpSdrFillAttribute == mpSdrFillAttribute)
162 : {
163 33 : return true;
164 : }
165 :
166 9 : if(rCandidate.isDefault() != isDefault())
167 : {
168 0 : return false;
169 : }
170 :
171 9 : return (*rCandidate.mpSdrFillAttribute == *mpSdrFillAttribute);
172 : }
173 :
174 23 : double SdrFillAttribute::getTransparence() const
175 : {
176 23 : return mpSdrFillAttribute->getTransparence();
177 : }
178 :
179 23 : const basegfx::BColor& SdrFillAttribute::getColor() const
180 : {
181 23 : return mpSdrFillAttribute->getColor();
182 : }
183 :
184 23 : const FillGradientAttribute& SdrFillAttribute::getGradient() const
185 : {
186 23 : return mpSdrFillAttribute->getGradient();
187 : }
188 :
189 23 : const FillHatchAttribute& SdrFillAttribute::getHatch() const
190 : {
191 23 : return mpSdrFillAttribute->getHatch();
192 : }
193 :
194 23 : const SdrFillBitmapAttribute& SdrFillAttribute::getBitmap() const
195 : {
196 23 : return mpSdrFillAttribute->getBitmap();
197 : }
198 : } // end of namespace attribute
199 : } // end of namespace drawinglayer
200 :
201 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|