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 :
21 : #include <sdr/overlay/overlaytools.hxx>
22 : #include <svx/sdr/primitive2d/svx_primitivetypes2d.hxx>
23 : #include <basegfx/matrix/b2dhommatrix.hxx>
24 : #include <drawinglayer/primitive2d/bitmapprimitive2d.hxx>
25 : #include <basegfx/polygon/b2dpolygon.hxx>
26 : #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
27 : #include <basegfx/polygon/b2dpolygontools.hxx>
28 : #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
29 : #include <drawinglayer/geometry/viewinformation2d.hxx>
30 : #include <basegfx/matrix/b2dhommatrixtools.hxx>
31 : #include <drawinglayer/primitive2d/unifiedtransparenceprimitive2d.hxx>
32 : #include <vcl/svapp.hxx>
33 : #include <vcl/settings.hxx>
34 :
35 :
36 : namespace drawinglayer
37 : {
38 : namespace primitive2d
39 : {
40 :
41 0 : OverlayStaticRectanglePrimitive::OverlayStaticRectanglePrimitive(
42 : const basegfx::B2DPoint& rPosition,
43 : const basegfx::B2DSize& rSize,
44 : const basegfx::BColor& rStrokeColor,
45 : const basegfx::BColor& rFillColor,
46 : double fTransparence,
47 : double fRotation)
48 : : DiscreteMetricDependentPrimitive2D()
49 : , maPosition(rPosition)
50 : , maSize(rSize)
51 : , maStrokeColor(rStrokeColor)
52 : , maFillColor(rFillColor)
53 : , mfTransparence(fTransparence)
54 0 : , mfRotation(fRotation)
55 0 : {}
56 :
57 0 : Primitive2DSequence OverlayStaticRectanglePrimitive::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
58 : {
59 0 : Primitive2DSequence aPrimitive2DSequence;
60 0 : const double fHalfWidth = maSize.getX() * getDiscreteUnit() / 2.0;
61 0 : const double fHalfHeight = maSize.getY() * getDiscreteUnit() / 2.0;
62 :
63 : basegfx::B2DRange aRange(
64 0 : maPosition.getX() - fHalfWidth, maPosition.getY() - fHalfHeight,
65 0 : maPosition.getX() + fHalfWidth, maPosition.getY() + fHalfHeight);
66 :
67 0 : if (basegfx::fTools::more(getDiscreteUnit(), 0.0) && mfTransparence <= 1.0)
68 : {
69 : basegfx::B2DPolygon aPolygon(
70 0 : basegfx::tools::createPolygonFromRect(aRange));
71 :
72 : // create filled primitive
73 0 : basegfx::B2DPolyPolygon aPolyPolygon;
74 0 : aPolyPolygon.append(aPolygon);
75 :
76 0 : const attribute::LineAttribute aLineAttribute(maStrokeColor, 1.0);
77 :
78 : // create data
79 : const Primitive2DReference aStroke(
80 0 : new PolyPolygonStrokePrimitive2D(aPolyPolygon, aLineAttribute));
81 :
82 : // create fill primitive
83 : const Primitive2DReference aFill(
84 0 : new PolyPolygonColorPrimitive2D(aPolyPolygon, maFillColor));
85 :
86 0 : aPrimitive2DSequence = Primitive2DSequence(2);
87 0 : aPrimitive2DSequence[0] = aFill;
88 0 : aPrimitive2DSequence[1] = aStroke;
89 :
90 : // embed filled to transparency (if used)
91 0 : if (mfTransparence > 0.0)
92 : {
93 : const Primitive2DReference aFillTransparent(
94 : new UnifiedTransparencePrimitive2D(
95 : aPrimitive2DSequence,
96 0 : mfTransparence));
97 :
98 0 : aPrimitive2DSequence = Primitive2DSequence(&aFillTransparent, 1);
99 0 : }
100 : }
101 :
102 0 : return aPrimitive2DSequence;
103 : }
104 :
105 0 : bool OverlayStaticRectanglePrimitive::operator==(const BasePrimitive2D& rPrimitive) const
106 : {
107 0 : if (DiscreteMetricDependentPrimitive2D::operator==(rPrimitive))
108 : {
109 0 : const OverlayStaticRectanglePrimitive& rCompare = static_cast<const OverlayStaticRectanglePrimitive&>(rPrimitive);
110 :
111 0 : return (maPosition == rCompare.maPosition
112 0 : && maSize == rCompare.maSize
113 0 : && maStrokeColor == rCompare.maStrokeColor
114 0 : && maFillColor == rCompare.maFillColor
115 0 : && mfTransparence == rCompare.mfTransparence
116 0 : && mfRotation == rCompare.mfRotation);
117 : }
118 :
119 0 : return false;
120 : }
121 :
122 0 : ImplPrimitive2DIDBlock(OverlayStaticRectanglePrimitive, PRIMITIVE2D_ID_OVERLAYRECTANGLEPRIMITIVE)
123 :
124 : }} // end of namespace drawinglayer::primitive2d
125 :
126 : namespace drawinglayer
127 : {
128 : namespace primitive2d
129 : {
130 329 : OverlayBitmapExPrimitive::OverlayBitmapExPrimitive(
131 : const BitmapEx& rBitmapEx,
132 : const basegfx::B2DPoint& rBasePosition,
133 : sal_uInt16 nCenterX,
134 : sal_uInt16 nCenterY,
135 : double fShearX,
136 : double fRotation)
137 : : DiscreteMetricDependentPrimitive2D(),
138 : maBitmapEx(rBitmapEx),
139 : maBasePosition(rBasePosition),
140 : mnCenterX(nCenterX),
141 : mnCenterY(nCenterY),
142 : mfShearX(fShearX),
143 329 : mfRotation(fRotation)
144 329 : {}
145 :
146 329 : Primitive2DSequence OverlayBitmapExPrimitive::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
147 : {
148 329 : Primitive2DSequence aRetval;
149 329 : const Size aBitmapSize(getBitmapEx().GetSizePixel());
150 :
151 329 : if(aBitmapSize.Width() && aBitmapSize.Height() && basegfx::fTools::more(getDiscreteUnit(), 0.0))
152 : {
153 : // calculate back from internal bitmap's extreme coordinates (the edges)
154 : // to logical coordinates. Only use a unified scaling value (getDiscreteUnit(),
155 : // the prepared one which expresses how many logic units form a discrete unit)
156 : // for this step. This primitive is to be displayed always unscaled (in it's pixel size)
157 : // and unrotated, more like a marker
158 329 : const double fLeft((0.0 - getCenterX()) * getDiscreteUnit());
159 329 : const double fTop((0.0 - getCenterY()) * getDiscreteUnit());
160 329 : const double fRight((aBitmapSize.getWidth() - getCenterX()) * getDiscreteUnit());
161 329 : const double fBottom((aBitmapSize.getHeight() - getCenterY()) * getDiscreteUnit());
162 :
163 : // create a BitmapPrimitive2D using those positions
164 329 : basegfx::B2DHomMatrix aTransform;
165 :
166 329 : aTransform.set(0, 0, fRight - fLeft);
167 329 : aTransform.set(1, 1, fBottom - fTop);
168 329 : aTransform.set(0, 2, fLeft);
169 329 : aTransform.set(1, 2, fTop);
170 :
171 : // if shearX is used, apply it, too
172 329 : if(!basegfx::fTools::equalZero(getShearX()))
173 : {
174 0 : aTransform.shearX(getShearX());
175 : }
176 :
177 : // if rotation is used, apply it, too
178 329 : if(!basegfx::fTools::equalZero(getRotation()))
179 : {
180 0 : aTransform.rotate(getRotation());
181 : }
182 :
183 : // add BasePosition
184 329 : aTransform.translate(getBasePosition().getX(), getBasePosition().getY());
185 :
186 658 : const Primitive2DReference aPrimitive(new BitmapPrimitive2D(getBitmapEx(), aTransform));
187 658 : aRetval = Primitive2DSequence(&aPrimitive, 1);
188 : }
189 :
190 329 : return aRetval;
191 : }
192 :
193 0 : bool OverlayBitmapExPrimitive::operator==( const BasePrimitive2D& rPrimitive ) const
194 : {
195 0 : if(DiscreteMetricDependentPrimitive2D::operator==(rPrimitive))
196 : {
197 0 : const OverlayBitmapExPrimitive& rCompare = static_cast< const OverlayBitmapExPrimitive& >(rPrimitive);
198 :
199 0 : return (getBitmapEx() == rCompare.getBitmapEx()
200 0 : && getBasePosition() == rCompare.getBasePosition()
201 0 : && getCenterX() == rCompare.getCenterX()
202 0 : && getCenterY() == rCompare.getCenterY()
203 0 : && getShearX() == rCompare.getShearX()
204 0 : && getRotation() == rCompare.getRotation());
205 : }
206 :
207 0 : return false;
208 : }
209 :
210 164 : ImplPrimitive2DIDBlock(OverlayBitmapExPrimitive, PRIMITIVE2D_ID_OVERLAYBITMAPEXPRIMITIVE)
211 :
212 : } // end of namespace primitive2d
213 : } // end of namespace drawinglayer
214 :
215 :
216 :
217 : namespace drawinglayer
218 : {
219 : namespace primitive2d
220 : {
221 0 : OverlayCrosshairPrimitive::OverlayCrosshairPrimitive(
222 : const basegfx::B2DPoint& rBasePosition,
223 : const basegfx::BColor& rRGBColorA,
224 : const basegfx::BColor& rRGBColorB,
225 : double fDiscreteDashLength)
226 : : ViewportDependentPrimitive2D(),
227 : maBasePosition(rBasePosition),
228 : maRGBColorA(rRGBColorA),
229 : maRGBColorB(rRGBColorB),
230 0 : mfDiscreteDashLength(fDiscreteDashLength)
231 0 : {}
232 :
233 0 : Primitive2DSequence OverlayCrosshairPrimitive::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
234 : {
235 : // use the prepared Viewport information accessible using getViewport()
236 0 : Primitive2DSequence aRetval;
237 :
238 0 : if(!getViewport().isEmpty())
239 : {
240 0 : aRetval.realloc(2);
241 0 : basegfx::B2DPolygon aPolygon;
242 :
243 0 : aPolygon.append(basegfx::B2DPoint(getViewport().getMinX(), getBasePosition().getY()));
244 0 : aPolygon.append(basegfx::B2DPoint(getViewport().getMaxX(), getBasePosition().getY()));
245 :
246 0 : aRetval[0] = Primitive2DReference(
247 : new PolygonMarkerPrimitive2D(
248 : aPolygon,
249 : getRGBColorA(),
250 : getRGBColorB(),
251 0 : getDiscreteDashLength()));
252 :
253 0 : aPolygon.clear();
254 0 : aPolygon.append(basegfx::B2DPoint(getBasePosition().getX(), getViewport().getMinY()));
255 0 : aPolygon.append(basegfx::B2DPoint(getBasePosition().getX(), getViewport().getMaxY()));
256 :
257 0 : aRetval[1] = Primitive2DReference(
258 : new PolygonMarkerPrimitive2D(
259 : aPolygon,
260 : getRGBColorA(),
261 : getRGBColorB(),
262 0 : getDiscreteDashLength()));
263 : }
264 :
265 0 : return aRetval;
266 : }
267 :
268 0 : bool OverlayCrosshairPrimitive::operator==( const BasePrimitive2D& rPrimitive ) const
269 : {
270 0 : if(ViewportDependentPrimitive2D::operator==(rPrimitive))
271 : {
272 0 : const OverlayCrosshairPrimitive& rCompare = static_cast< const OverlayCrosshairPrimitive& >(rPrimitive);
273 :
274 0 : return (getBasePosition() == rCompare.getBasePosition()
275 0 : && getRGBColorA() == rCompare.getRGBColorA()
276 0 : && getRGBColorB() == rCompare.getRGBColorB()
277 0 : && getDiscreteDashLength() == rCompare.getDiscreteDashLength());
278 : }
279 :
280 0 : return false;
281 : }
282 :
283 0 : ImplPrimitive2DIDBlock(OverlayCrosshairPrimitive, PRIMITIVE2D_ID_OVERLAYCROSSHAIRPRIMITIVE)
284 :
285 : } // end of namespace primitive2d
286 : } // end of namespace drawinglayer
287 :
288 :
289 :
290 : namespace drawinglayer
291 : {
292 : namespace primitive2d
293 : {
294 24 : OverlayRectanglePrimitive::OverlayRectanglePrimitive(
295 : const basegfx::B2DRange& rObjectRange,
296 : const basegfx::BColor& rColor,
297 : double fTransparence,
298 : double fDiscreteGrow,
299 : double fDiscreteShrink,
300 : double fRotation)
301 : : DiscreteMetricDependentPrimitive2D(),
302 : maObjectRange(rObjectRange),
303 : maColor(rColor),
304 : mfTransparence(fTransparence),
305 : mfDiscreteGrow(fDiscreteGrow),
306 : mfDiscreteShrink(fDiscreteShrink),
307 24 : mfRotation(fRotation)
308 24 : {}
309 :
310 24 : Primitive2DSequence OverlayRectanglePrimitive::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
311 : {
312 24 : Primitive2DSequence aRetval;
313 24 : basegfx::B2DRange aInnerRange(getObjectRange());
314 :
315 24 : if(!aInnerRange.isEmpty() && basegfx::fTools::more(getDiscreteUnit(), 0.0) && getTransparence() <= 1.0)
316 : {
317 24 : basegfx::B2DRange aOuterRange(getObjectRange());
318 :
319 : // grow/shrink inner/outer polygons
320 24 : aOuterRange.grow(getDiscreteUnit() * getDiscreteGrow());
321 24 : aInnerRange.grow(getDiscreteUnit() * -getDiscreteShrink());
322 :
323 : // convert to polygons
324 24 : const double fFullGrow(getDiscreteGrow() + getDiscreteShrink());
325 24 : const double fRelativeRadiusX(fFullGrow / aOuterRange.getWidth());
326 24 : const double fRelativeRadiusY(fFullGrow / aOuterRange.getHeight());
327 : basegfx::B2DPolygon aOuterPolygon(
328 : basegfx::tools::createPolygonFromRect(
329 : aOuterRange,
330 : fRelativeRadiusX,
331 24 : fRelativeRadiusY));
332 : basegfx::B2DPolygon aInnerPolygon(
333 : basegfx::tools::createPolygonFromRect(
334 48 : aInnerRange));
335 :
336 : // apply evtl. existing rotation
337 24 : if(!basegfx::fTools::equalZero(getRotation()))
338 : {
339 : const basegfx::B2DHomMatrix aTransform(basegfx::tools::createRotateAroundPoint(
340 0 : getObjectRange().getMinX(), getObjectRange().getMinY(), getRotation()));
341 :
342 0 : aOuterPolygon.transform(aTransform);
343 0 : aInnerPolygon.transform(aTransform);
344 : }
345 :
346 : // create filled primitive
347 48 : basegfx::B2DPolyPolygon aPolyPolygon;
348 :
349 24 : aPolyPolygon.append(aOuterPolygon);
350 24 : aPolyPolygon.append(aInnerPolygon);
351 :
352 24 : if(Application::GetSettings().GetStyleSettings().GetHighContrastMode())
353 : {
354 : // for high contrast, use hatch
355 0 : const basegfx::BColor aHighContrastLineColor(Application::GetSettings().GetStyleSettings().GetFontColor().getBColor());
356 0 : const basegfx::BColor aEmptyColor(0.0, 0.0, 0.0);
357 0 : const double fHatchRotation(45 * F_PI180);
358 0 : const double fDiscreteHatchDistance(3.0);
359 : const drawinglayer::attribute::FillHatchAttribute aFillHatchAttribute(
360 : drawinglayer::attribute::HATCHSTYLE_SINGLE,
361 0 : fDiscreteHatchDistance * getDiscreteUnit(),
362 0 : fHatchRotation - getRotation(),
363 : aHighContrastLineColor,
364 : 3, // same default as VCL, a minimum of three discrete units (pixels) offset
365 0 : false);
366 : const Primitive2DReference aHatch(
367 : new PolyPolygonHatchPrimitive2D(
368 : aPolyPolygon,
369 : aEmptyColor,
370 0 : aFillHatchAttribute));
371 :
372 0 : aRetval = Primitive2DSequence(&aHatch, 1);
373 : }
374 : else
375 : {
376 : // create fill primitive
377 : const Primitive2DReference aFill(
378 : new PolyPolygonColorPrimitive2D(
379 : aPolyPolygon,
380 24 : getColor()));
381 :
382 24 : aRetval = Primitive2DSequence(&aFill, 1);
383 :
384 : // embed filled to transparency (if used)
385 24 : if(getTransparence() > 0.0)
386 : {
387 : const Primitive2DReference aFillTransparent(
388 : new UnifiedTransparencePrimitive2D(
389 : aRetval,
390 24 : getTransparence()));
391 :
392 24 : aRetval = Primitive2DSequence(&aFillTransparent, 1);
393 24 : }
394 24 : }
395 : }
396 :
397 24 : return aRetval;
398 : }
399 :
400 0 : bool OverlayRectanglePrimitive::operator==( const BasePrimitive2D& rPrimitive ) const
401 : {
402 0 : if(DiscreteMetricDependentPrimitive2D::operator==(rPrimitive))
403 : {
404 0 : const OverlayRectanglePrimitive& rCompare = static_cast< const OverlayRectanglePrimitive& >(rPrimitive);
405 :
406 0 : return (getObjectRange() == rCompare.getObjectRange()
407 0 : && getColor() == rCompare.getColor()
408 0 : && getTransparence() == rCompare.getTransparence()
409 0 : && getDiscreteGrow() == rCompare.getDiscreteGrow()
410 0 : && getDiscreteShrink() == rCompare.getDiscreteShrink()
411 0 : && getRotation() == rCompare.getRotation());
412 : }
413 :
414 0 : return false;
415 : }
416 :
417 0 : ImplPrimitive2DIDBlock(OverlayRectanglePrimitive, PRIMITIVE2D_ID_OVERLAYRECTANGLEPRIMITIVE)
418 :
419 : } // end of namespace primitive2d
420 : } // end of namespace drawinglayer
421 :
422 :
423 :
424 : namespace drawinglayer
425 : {
426 : namespace primitive2d
427 : {
428 0 : OverlayHelplineStripedPrimitive::OverlayHelplineStripedPrimitive(
429 : const basegfx::B2DPoint& rBasePosition,
430 : HelplineStyle eStyle,
431 : const basegfx::BColor& rRGBColorA,
432 : const basegfx::BColor& rRGBColorB,
433 : double fDiscreteDashLength)
434 : : ViewportDependentPrimitive2D(),
435 : maBasePosition(rBasePosition),
436 : meStyle(eStyle),
437 : maRGBColorA(rRGBColorA),
438 : maRGBColorB(rRGBColorB),
439 0 : mfDiscreteDashLength(fDiscreteDashLength)
440 0 : {}
441 :
442 0 : Primitive2DSequence OverlayHelplineStripedPrimitive::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
443 : {
444 : // use the prepared Viewport information accessible using getViewport()
445 0 : Primitive2DSequence aRetval;
446 :
447 0 : if(!getViewport().isEmpty())
448 : {
449 0 : switch(getStyle())
450 : {
451 : case HELPLINESTYLE_VERTICAL :
452 : {
453 0 : aRetval.realloc(1);
454 0 : basegfx::B2DPolygon aLine;
455 :
456 0 : aLine.append(basegfx::B2DPoint(getBasePosition().getX(), getViewport().getMinY()));
457 0 : aLine.append(basegfx::B2DPoint(getBasePosition().getX(), getViewport().getMaxY()));
458 :
459 0 : aRetval[0] = Primitive2DReference(
460 : new PolygonMarkerPrimitive2D(
461 : aLine,
462 : getRGBColorA(),
463 : getRGBColorB(),
464 0 : getDiscreteDashLength()));
465 0 : break;
466 : }
467 :
468 : case HELPLINESTYLE_HORIZONTAL :
469 : {
470 0 : aRetval.realloc(1);
471 0 : basegfx::B2DPolygon aLine;
472 :
473 0 : aLine.append(basegfx::B2DPoint(getViewport().getMinX(), getBasePosition().getY()));
474 0 : aLine.append(basegfx::B2DPoint(getViewport().getMaxX(), getBasePosition().getY()));
475 :
476 0 : aRetval[0] = Primitive2DReference(
477 : new PolygonMarkerPrimitive2D(
478 : aLine,
479 : getRGBColorA(),
480 : getRGBColorB(),
481 0 : getDiscreteDashLength()));
482 0 : break;
483 : }
484 :
485 : default: // case HELPLINESTYLE_POINT :
486 : {
487 0 : const double fDiscreteUnit((rViewInformation.getInverseObjectToViewTransformation() * basegfx::B2DVector(1.0, 0.0)).getLength());
488 0 : aRetval.realloc(2);
489 0 : basegfx::B2DPolygon aLineA, aLineB;
490 :
491 0 : aLineA.append(basegfx::B2DPoint(getBasePosition().getX(), getBasePosition().getY() - fDiscreteUnit));
492 0 : aLineA.append(basegfx::B2DPoint(getBasePosition().getX(), getBasePosition().getY() + fDiscreteUnit));
493 :
494 0 : aRetval[0] = Primitive2DReference(
495 : new PolygonMarkerPrimitive2D(
496 : aLineA,
497 : getRGBColorA(),
498 : getRGBColorB(),
499 0 : getDiscreteDashLength()));
500 :
501 0 : aLineB.append(basegfx::B2DPoint(getBasePosition().getX() - fDiscreteUnit, getBasePosition().getY()));
502 0 : aLineB.append(basegfx::B2DPoint(getBasePosition().getX() + fDiscreteUnit, getBasePosition().getY()));
503 :
504 0 : aRetval[1] = Primitive2DReference(
505 : new PolygonMarkerPrimitive2D(
506 : aLineB,
507 : getRGBColorA(),
508 : getRGBColorB(),
509 0 : getDiscreteDashLength()));
510 :
511 0 : break;
512 : }
513 : }
514 : }
515 :
516 0 : return aRetval;
517 : }
518 :
519 0 : bool OverlayHelplineStripedPrimitive::operator==( const BasePrimitive2D& rPrimitive ) const
520 : {
521 0 : if(ViewportDependentPrimitive2D::operator==(rPrimitive))
522 : {
523 0 : const OverlayHelplineStripedPrimitive& rCompare = static_cast< const OverlayHelplineStripedPrimitive& >(rPrimitive);
524 :
525 0 : return (getBasePosition() == rCompare.getBasePosition()
526 0 : && getStyle() == rCompare.getStyle()
527 0 : && getRGBColorA() == rCompare.getRGBColorA()
528 0 : && getRGBColorB() == rCompare.getRGBColorB()
529 0 : && getDiscreteDashLength() == rCompare.getDiscreteDashLength());
530 : }
531 :
532 0 : return false;
533 : }
534 :
535 0 : ImplPrimitive2DIDBlock(OverlayHelplineStripedPrimitive, PRIMITIVE2D_ID_OVERLAYHELPLINESTRIPEDPRIMITIVE)
536 :
537 : } // end of namespace primitive2d
538 : } // end of namespace drawinglayer
539 :
540 :
541 :
542 : namespace drawinglayer
543 : {
544 : namespace primitive2d
545 : {
546 0 : OverlayRollingRectanglePrimitive::OverlayRollingRectanglePrimitive(
547 : const basegfx::B2DRange& aRollingRectangle,
548 : const basegfx::BColor& rRGBColorA,
549 : const basegfx::BColor& rRGBColorB,
550 : double fDiscreteDashLength)
551 : : ViewportDependentPrimitive2D(),
552 : maRollingRectangle(aRollingRectangle),
553 : maRGBColorA(rRGBColorA),
554 : maRGBColorB(rRGBColorB),
555 0 : mfDiscreteDashLength(fDiscreteDashLength)
556 0 : {}
557 :
558 0 : Primitive2DSequence OverlayRollingRectanglePrimitive::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
559 : {
560 : // use the prepared Viewport information accessible using getViewport()
561 0 : Primitive2DSequence aRetval;
562 :
563 0 : if(!getViewport().isEmpty())
564 : {
565 0 : basegfx::B2DPolygon aLine;
566 0 : aRetval.realloc(8);
567 :
568 : // Left lines
569 0 : aLine.append(basegfx::B2DPoint(getViewport().getMinX(), getRollingRectangle().getMinY()));
570 0 : aLine.append(basegfx::B2DPoint(getRollingRectangle().getMinX(), getRollingRectangle().getMinY()));
571 0 : aRetval[0] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
572 :
573 0 : aLine.clear();
574 0 : aLine.append(basegfx::B2DPoint(getViewport().getMinX(), getRollingRectangle().getMaxY()));
575 0 : aLine.append(basegfx::B2DPoint(getRollingRectangle().getMinX(), getRollingRectangle().getMaxY()));
576 0 : aRetval[1] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
577 :
578 : // Right lines
579 0 : aLine.clear();
580 0 : aLine.append(basegfx::B2DPoint(getRollingRectangle().getMaxX(), getRollingRectangle().getMinY()));
581 0 : aLine.append(basegfx::B2DPoint(getViewport().getMaxX(), getRollingRectangle().getMinY()));
582 0 : aRetval[2] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
583 :
584 0 : aLine.clear();
585 0 : aLine.append(basegfx::B2DPoint(getRollingRectangle().getMaxX(), getRollingRectangle().getMaxY()));
586 0 : aLine.append(basegfx::B2DPoint(getViewport().getMaxX(), getRollingRectangle().getMaxY()));
587 0 : aRetval[3] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
588 :
589 : // Top lines
590 0 : aLine.clear();
591 0 : aLine.append(basegfx::B2DPoint(getRollingRectangle().getMinX(), getViewport().getMinY()));
592 0 : aLine.append(basegfx::B2DPoint(getRollingRectangle().getMinX(), getRollingRectangle().getMinY()));
593 0 : aRetval[4] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
594 :
595 0 : aLine.clear();
596 0 : aLine.append(basegfx::B2DPoint(getRollingRectangle().getMaxX(), getViewport().getMinY()));
597 0 : aLine.append(basegfx::B2DPoint(getRollingRectangle().getMaxX(), getRollingRectangle().getMinY()));
598 0 : aRetval[5] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
599 :
600 : // Bottom lines
601 0 : aLine.clear();
602 0 : aLine.append(basegfx::B2DPoint(getRollingRectangle().getMinX(), getRollingRectangle().getMaxY()));
603 0 : aLine.append(basegfx::B2DPoint(getRollingRectangle().getMinX(), getViewport().getMaxY()));
604 0 : aRetval[6] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
605 :
606 0 : aLine.clear();
607 0 : aLine.append(basegfx::B2DPoint(getRollingRectangle().getMaxX(), getRollingRectangle().getMaxY()));
608 0 : aLine.append(basegfx::B2DPoint(getRollingRectangle().getMaxX(), getViewport().getMaxY()));
609 0 : aRetval[7] = Primitive2DReference(new PolygonMarkerPrimitive2D(aLine, getRGBColorA(), getRGBColorB(), getDiscreteDashLength()));
610 : }
611 :
612 0 : return aRetval;
613 : }
614 :
615 0 : bool OverlayRollingRectanglePrimitive::operator==( const BasePrimitive2D& rPrimitive ) const
616 : {
617 0 : if(ViewportDependentPrimitive2D::operator==(rPrimitive))
618 : {
619 0 : const OverlayRollingRectanglePrimitive& rCompare = static_cast< const OverlayRollingRectanglePrimitive& >(rPrimitive);
620 :
621 0 : return (getRollingRectangle() == rCompare.getRollingRectangle()
622 0 : && getRGBColorA() == rCompare.getRGBColorA()
623 0 : && getRGBColorB() == rCompare.getRGBColorB()
624 0 : && getDiscreteDashLength() == rCompare.getDiscreteDashLength());
625 : }
626 :
627 0 : return false;
628 : }
629 :
630 0 : ImplPrimitive2DIDBlock(OverlayRollingRectanglePrimitive, PRIMITIVE2D_ID_OVERLAYROLLINGRECTANGLEPRIMITIVE)
631 :
632 : } // end of namespace primitive2d
633 : } // end of namespace drawinglayer
634 :
635 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|