xref: /trunk/main/drawinglayer/source/texture/texture3d.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_drawinglayer.hxx"
30 
31 #include <drawinglayer/texture/texture3d.hxx>
32 #include <vcl/bmpacc.hxx>
33 #include <drawinglayer/primitive3d/hatchtextureprimitive3d.hxx>
34 
35 //////////////////////////////////////////////////////////////////////////////
36 
37 namespace drawinglayer
38 {
39     namespace texture
40     {
41         GeoTexSvxMono::GeoTexSvxMono(const basegfx::BColor& rSingleColor, double fOpacity)
42         :   maSingleColor(rSingleColor),
43             mfOpacity(fOpacity)
44         {
45         }
46 
47         bool GeoTexSvxMono::operator==(const GeoTexSvx& rGeoTexSvx) const
48         {
49             const GeoTexSvxMono* pCompare = dynamic_cast< const GeoTexSvxMono* >(&rGeoTexSvx);
50             return (pCompare
51                 && maSingleColor == pCompare->maSingleColor
52                 && mfOpacity == pCompare->mfOpacity);
53         }
54 
55         void GeoTexSvxMono::modifyBColor(const basegfx::B2DPoint& /*rUV*/, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
56         {
57             rBColor = maSingleColor;
58         }
59 
60         void GeoTexSvxMono::modifyOpacity(const basegfx::B2DPoint& /*rUV*/, double& rfOpacity) const
61         {
62             rfOpacity = mfOpacity;
63         }
64     } // end of namespace texture
65 } // end of namespace drawinglayer
66 
67 //////////////////////////////////////////////////////////////////////////////
68 
69 namespace drawinglayer
70 {
71     namespace texture
72     {
73         GeoTexSvxBitmap::GeoTexSvxBitmap(const Bitmap& rBitmap, const basegfx::B2DPoint& rTopLeft, const basegfx::B2DVector& rSize)
74         :   maBitmap(rBitmap),
75             mpRead(0L),
76             maTopLeft(rTopLeft),
77             maSize(rSize),
78             mfMulX(0.0),
79             mfMulY(0.0)
80         {
81             mpRead = maBitmap.AcquireReadAccess();
82             OSL_ENSURE(mpRead, "GeoTexSvxBitmap: Got no read access to Bitmap (!)");
83             mfMulX = (double)mpRead->Width() / maSize.getX();
84             mfMulY = (double)mpRead->Height() / maSize.getY();
85         }
86 
87         GeoTexSvxBitmap::~GeoTexSvxBitmap()
88         {
89             delete mpRead;
90         }
91 
92         bool GeoTexSvxBitmap::impIsValid(const basegfx::B2DPoint& rUV, sal_Int32& rX, sal_Int32& rY) const
93         {
94             if(mpRead)
95             {
96                 rX = (sal_Int32)((rUV.getX() - maTopLeft.getX()) * mfMulX);
97 
98                 if(rX >= 0L && rX < mpRead->Width())
99                 {
100                     rY = (sal_Int32)((rUV.getY() - maTopLeft.getY()) * mfMulY);
101 
102                     return (rY >= 0L && rY < mpRead->Height());
103                 }
104             }
105 
106             return false;
107         }
108 
109         void GeoTexSvxBitmap::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& rfOpacity) const
110         {
111             sal_Int32 nX, nY;
112 
113             if(impIsValid(rUV, nX, nY))
114             {
115                 const double fConvertColor(1.0 / 255.0);
116                 const BitmapColor aBMCol(mpRead->GetColor(nY, nX));
117                 const basegfx::BColor aBSource(
118                     (double)aBMCol.GetRed() * fConvertColor,
119                     (double)aBMCol.GetGreen() * fConvertColor,
120                     (double)aBMCol.GetBlue() * fConvertColor);
121 
122                 rBColor = aBSource;
123             }
124             else
125             {
126                 rfOpacity = 0.0;
127             }
128         }
129 
130         void GeoTexSvxBitmap::modifyOpacity(const basegfx::B2DPoint& rUV, double& rfOpacity) const
131         {
132             sal_Int32 nX, nY;
133 
134             if(impIsValid(rUV, nX, nY))
135             {
136                 const BitmapColor aBMCol(mpRead->GetColor(nY, nX));
137                 const Color aColor(aBMCol.GetRed(), aBMCol.GetGreen(), aBMCol.GetBlue());
138 
139                 rfOpacity = ((double)(0xff - aColor.GetLuminance()) * (1.0 / 255.0));
140             }
141             else
142             {
143                 rfOpacity = 0.0;
144             }
145         }
146     } // end of namespace texture
147 } // end of namespace drawinglayer
148 
149 //////////////////////////////////////////////////////////////////////////////
150 
151 namespace drawinglayer
152 {
153     namespace texture
154     {
155         GeoTexSvxBitmapTiled::GeoTexSvxBitmapTiled(const Bitmap& rBitmap, const basegfx::B2DPoint& rTopLeft, const basegfx::B2DVector& rSize)
156         :   GeoTexSvxBitmap(rBitmap, rTopLeft, rSize)
157         {
158         }
159 
160         void GeoTexSvxBitmapTiled::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& rfOpacity) const
161         {
162             if(mpRead)
163             {
164                 GeoTexSvxBitmap::modifyBColor(impGetCorrected(rUV), rBColor, rfOpacity);
165             }
166         }
167 
168         void GeoTexSvxBitmapTiled::modifyOpacity(const basegfx::B2DPoint& rUV, double& rfOpacity) const
169         {
170             if(mpRead)
171             {
172                 GeoTexSvxBitmap::modifyOpacity(impGetCorrected(rUV), rfOpacity);
173             }
174         }
175     } // end of namespace texture
176 } // end of namespace drawinglayer
177 
178 //////////////////////////////////////////////////////////////////////////////
179 
180 namespace drawinglayer
181 {
182     namespace texture
183     {
184         GeoTexSvxMultiHatch::GeoTexSvxMultiHatch(const primitive3d::HatchTexturePrimitive3D& rPrimitive, double fLogicPixelSize)
185         :   mfLogicPixelSize(fLogicPixelSize),
186             mp0(0L),
187             mp1(0L),
188             mp2(0L)
189         {
190             const attribute::FillHatchAttribute& rHatch(rPrimitive.getHatch());
191             const basegfx::B2DRange aOutlineRange(0.0, 0.0, rPrimitive.getTextureSize().getX(), rPrimitive.getTextureSize().getY());
192             const double fAngleA(rHatch.getAngle());
193             maColor = rHatch.getColor();
194             mbFillBackground = rHatch.isFillBackground();
195             mp0 = new GeoTexSvxHatch(aOutlineRange, rHatch.getDistance(), fAngleA);
196 
197             if(attribute::HATCHSTYLE_DOUBLE == rHatch.getStyle() || attribute::HATCHSTYLE_TRIPLE == rHatch.getStyle())
198             {
199                 mp1 = new GeoTexSvxHatch(aOutlineRange, rHatch.getDistance(), fAngleA + F_PI2);
200             }
201 
202             if(attribute::HATCHSTYLE_TRIPLE == rHatch.getStyle())
203             {
204                 mp2 = new GeoTexSvxHatch(aOutlineRange, rHatch.getDistance(), fAngleA + F_PI4);
205             }
206         }
207 
208         GeoTexSvxMultiHatch::~GeoTexSvxMultiHatch()
209         {
210             delete mp0;
211             delete mp1;
212             delete mp2;
213         }
214 
215         bool GeoTexSvxMultiHatch::impIsOnHatch(const basegfx::B2DPoint& rUV) const
216         {
217             if(mp0->getDistanceToHatch(rUV) < mfLogicPixelSize)
218             {
219                 return true;
220             }
221 
222             if(mp1 && mp1->getDistanceToHatch(rUV) < mfLogicPixelSize)
223             {
224                 return true;
225             }
226 
227             if(mp2 && mp2->getDistanceToHatch(rUV) < mfLogicPixelSize)
228             {
229                 return true;
230             }
231 
232             return false;
233         }
234 
235         void GeoTexSvxMultiHatch::modifyBColor(const basegfx::B2DPoint& rUV, basegfx::BColor& rBColor, double& rfOpacity) const
236         {
237             if(impIsOnHatch(rUV))
238             {
239                 rBColor = maColor;
240             }
241             else if(!mbFillBackground)
242             {
243                 rfOpacity = 0.0;
244             }
245         }
246 
247         void GeoTexSvxMultiHatch::modifyOpacity(const basegfx::B2DPoint& rUV, double& rfOpacity) const
248         {
249             if(mbFillBackground || impIsOnHatch(rUV))
250             {
251                 rfOpacity = 1.0;
252             }
253             else
254             {
255                 rfOpacity = 0.0;
256             }
257         }
258     } // end of namespace texture
259 } // end of namespace drawinglayer
260 
261 //////////////////////////////////////////////////////////////////////////////
262 // eof
263