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 : #ifndef INCLUDED_TOOLS_GEN_HXX
20 : #define INCLUDED_TOOLS_GEN_HXX
21 :
22 : #include <tools/toolsdllapi.h>
23 :
24 : #include <limits.h>
25 : #include <algorithm>
26 : #include <ostream>
27 : #include <cstdlib>
28 :
29 : class SvStream;
30 :
31 : enum TriState { TRISTATE_FALSE, TRISTATE_TRUE, TRISTATE_INDET };
32 :
33 : // Pair
34 :
35 : class SAL_WARN_UNUSED Pair
36 : {
37 : public:
38 : Pair();
39 : Pair( long nA, long nB );
40 :
41 4 : long A() const { return nA; }
42 4 : long B() const { return nB; }
43 :
44 227037 : long& A() { return nA; }
45 226971 : long& B() { return nB; }
46 :
47 : bool operator == ( const Pair& rPair ) const;
48 : bool operator != ( const Pair& rPair ) const;
49 :
50 : TOOLS_DLLPUBLIC friend SvStream& ReadPair( SvStream& rIStream, Pair& rPair );
51 : TOOLS_DLLPUBLIC friend SvStream& WritePair( SvStream& rOStream, const Pair& rPair );
52 :
53 : protected:
54 : long nA;
55 : long nB;
56 : };
57 :
58 69192570 : inline Pair::Pair()
59 : {
60 69192570 : nA = nB = 0;
61 69192570 : }
62 :
63 147289132 : inline Pair::Pair( long _nA, long _nB )
64 : {
65 147289132 : Pair::nA = _nA;
66 147289132 : Pair::nB = _nB;
67 147289132 : }
68 :
69 2437148 : inline bool Pair::operator == ( const Pair& rPair ) const
70 : {
71 2437148 : return ((nA == rPair.nA) && (nB == rPair.nB));
72 : }
73 :
74 22259674 : inline bool Pair::operator != ( const Pair& rPair ) const
75 : {
76 22259674 : return ((nA != rPair.nA) || (nB != rPair.nB));
77 : }
78 :
79 : // Point
80 :
81 : class SAL_DLLPUBLIC_EXPORT SAL_WARN_UNUSED Point : public Pair
82 : {
83 : public:
84 : Point();
85 : Point( long nX, long nY );
86 :
87 120753720 : long X() const { return nA; }
88 74613412 : long Y() const { return nB; }
89 :
90 129078623 : long& X() { return nA; }
91 121905009 : long& Y() { return nB; }
92 :
93 : void Move( long nHorzMove, long nVertMove );
94 : bool IsAbove( const Point& rPoint ) const;
95 : bool IsBelow( const Point& rPoint ) const;
96 : bool IsLeft( const Point& rPoint ) const;
97 : bool IsRight( const Point& rPoint ) const;
98 :
99 : void RotateAround( long& rX, long& rY, short nOrientation ) const;
100 :
101 :
102 : Point& operator += ( const Point& rPoint );
103 : Point& operator -= ( const Point& rPoint );
104 : Point& operator *= ( const long nVal );
105 : Point& operator /= ( const long nVal );
106 :
107 : friend inline Point operator+( const Point &rVal1, const Point &rVal2 );
108 : friend inline Point operator-( const Point &rVal1, const Point &rVal2 );
109 : friend inline Point operator*( const Point &rVal1, const long nVal2 );
110 : friend inline Point operator/( const Point &rVal1, const long nVal2 );
111 :
112 21360353 : long getX() const { return X(); }
113 16296647 : long getY() const { return Y(); }
114 1349590 : void setX(long nX) { X() = nX; }
115 1579736 : void setY(long nY) { Y() = nY; }
116 : };
117 :
118 14309512 : inline Point::Point()
119 : {
120 14309512 : }
121 :
122 113227370 : inline Point::Point( long nX, long nY ) : Pair( nX, nY )
123 : {
124 113227370 : }
125 :
126 2132 : inline void Point::Move( long nHorzMove, long nVertMove )
127 : {
128 2132 : nA += nHorzMove;
129 2132 : nB += nVertMove;
130 2132 : }
131 :
132 : inline bool Point::IsAbove( const Point& rPoint ) const
133 : {
134 : return (nB > rPoint.nB);
135 : }
136 :
137 : inline bool Point::IsBelow( const Point& rPoint ) const
138 : {
139 : return (nB < rPoint.nB);
140 : }
141 :
142 : inline bool Point::IsLeft( const Point& rPoint ) const
143 : {
144 : return (nA < rPoint.nA);
145 : }
146 :
147 : inline bool Point::IsRight( const Point& rPoint ) const
148 : {
149 : return (nA > rPoint.nA);
150 : }
151 :
152 5962144 : inline Point& Point::operator += ( const Point& rPoint )
153 : {
154 5962144 : nA += rPoint.nA;
155 5962144 : nB += rPoint.nB;
156 5962144 : return *this;
157 : }
158 :
159 437972 : inline Point& Point::operator -= ( const Point& rPoint )
160 : {
161 437972 : nA -= rPoint.nA;
162 437972 : nB -= rPoint.nB;
163 437972 : return *this;
164 : }
165 :
166 1758 : inline Point& Point::operator *= ( const long nVal )
167 : {
168 1758 : nA *= nVal;
169 1758 : nB *= nVal;
170 1758 : return *this;
171 : }
172 :
173 0 : inline Point& Point::operator /= ( const long nVal )
174 : {
175 0 : nA /= nVal;
176 0 : nB /= nVal;
177 0 : return *this;
178 : }
179 :
180 5416105 : inline Point operator+( const Point &rVal1, const Point &rVal2 )
181 : {
182 5416105 : return Point( rVal1.nA+rVal2.nA, rVal1.nB+rVal2.nB );
183 : }
184 :
185 4972077 : inline Point operator-( const Point &rVal1, const Point &rVal2 )
186 : {
187 4972077 : return Point( rVal1.nA-rVal2.nA, rVal1.nB-rVal2.nB );
188 : }
189 :
190 0 : inline Point operator*( const Point &rVal1, const long nVal2 )
191 : {
192 0 : return Point( rVal1.nA*nVal2, rVal1.nB*nVal2 );
193 : }
194 :
195 0 : inline Point operator/( const Point &rVal1, const long nVal2 )
196 : {
197 0 : return Point( rVal1.nA/nVal2, rVal1.nB/nVal2 );
198 : }
199 :
200 : template< typename charT, typename traits >
201 : inline std::basic_ostream<charT, traits> & operator <<(
202 : std::basic_ostream<charT, traits> & stream, const Point& point )
203 : {
204 : return stream << point.X() << ',' << point.Y();
205 : }
206 :
207 : // Size
208 :
209 : class SAL_WARN_UNUSED Size : public Pair
210 : {
211 : public:
212 : Size();
213 : Size( long nWidth, long nHeight );
214 :
215 54213097 : long Width() const { return nA; }
216 54377986 : long Height() const { return nB; }
217 :
218 152159138 : long& Width() { return nA; }
219 27533231 : long& Height() { return nB; }
220 :
221 20474156 : long getWidth() const { return Width(); }
222 22103126 : long getHeight() const { return Height(); }
223 6089036 : void setWidth(long nWidth) { Width() = nWidth; }
224 5927076 : void setHeight(long nHeight) { Height() = nHeight; }
225 : };
226 :
227 54856660 : inline Size::Size()
228 : {
229 54856660 : }
230 :
231 33340371 : inline Size::Size( long nWidth, long nHeight ) :
232 33340371 : Pair( nWidth, nHeight )
233 : {
234 33340371 : }
235 :
236 : template< typename charT, typename traits >
237 0 : inline std::basic_ostream<charT, traits> & operator <<(
238 : std::basic_ostream<charT, traits> & stream, const Size& size )
239 : {
240 0 : return stream << size.Width() << 'x' << size.Height();
241 : }
242 :
243 : // Range
244 :
245 : #define RANGE_MAX LONG_MAX
246 :
247 : class SAL_WARN_UNUSED Range : public Pair
248 : {
249 : public:
250 : Range();
251 : Range( long nMin, long nMax );
252 :
253 33948 : long Min() const { return nA; }
254 33896 : long Max() const { return nB; }
255 386342 : long Len() const { return nB - nA + 1; }
256 :
257 1106662 : long& Min() { return nA; }
258 1894774 : long& Max() { return nB; }
259 :
260 : bool IsInside( long nIs ) const;
261 :
262 : void Justify();
263 : };
264 :
265 739 : inline Range::Range()
266 : {
267 739 : }
268 :
269 705243 : inline Range::Range( long nMin, long nMax ) : Pair( nMin, nMax )
270 : {
271 705243 : }
272 :
273 860 : inline bool Range::IsInside( long nIs ) const
274 : {
275 860 : return ((nA <= nIs) && (nIs <= nB ));
276 : }
277 :
278 136179 : inline void Range::Justify()
279 : {
280 136179 : if ( nA > nB )
281 : {
282 1924 : long nHelp = nA;
283 1924 : nA = nB;
284 1924 : nB = nHelp;
285 : }
286 136179 : }
287 :
288 : template< typename charT, typename traits >
289 : inline std::basic_ostream<charT, traits> & operator <<(
290 : std::basic_ostream<charT, traits> & stream, const Range& range )
291 : {
292 : return stream << range.Min() << '-' << range.Max();
293 : }
294 :
295 : // Selection
296 :
297 : #define SELECTION_MIN LONG_MIN
298 : #define SELECTION_MAX LONG_MAX
299 :
300 : class SAL_WARN_UNUSED Selection : public Pair
301 : {
302 : public:
303 : Selection();
304 : Selection( long nPos );
305 : Selection( long nMin, long nMax );
306 :
307 0 : long Min() const { return nA; }
308 0 : long Max() const { return nB; }
309 86324 : long Len() const { return nB - nA; }
310 :
311 153392 : long& Min() { return nA; }
312 146831 : long& Max() { return nB; }
313 :
314 : bool IsInside( long nIs ) const;
315 :
316 : void Justify();
317 :
318 2048 : bool operator !() const { return !Len(); }
319 :
320 0 : long getMin() const { return Min(); }
321 : long getMax() const { return Max(); }
322 0 : void setMin(long nMin) { Min() = nMin; }
323 0 : void setMax(long nMax) { Max() = nMax; }
324 : };
325 :
326 25659 : inline Selection::Selection()
327 : {
328 25659 : }
329 :
330 0 : inline Selection::Selection( long nPos ) : Pair( nPos, nPos )
331 : {
332 0 : }
333 :
334 16104 : inline Selection::Selection( long nMin, long nMax ) :
335 16104 : Pair( nMin, nMax )
336 : {
337 16104 : }
338 :
339 0 : inline bool Selection::IsInside( long nIs ) const
340 : {
341 0 : return ((nA <= nIs) && (nIs < nB ));
342 : }
343 :
344 25454 : inline void Selection::Justify()
345 : {
346 25454 : if ( nA > nB )
347 : {
348 2 : long nHelp = nA;
349 2 : nA = nB;
350 2 : nB = nHelp;
351 : }
352 25454 : }
353 :
354 : template< typename charT, typename traits >
355 : inline std::basic_ostream<charT, traits> & operator <<(
356 : std::basic_ostream<charT, traits> & stream, const Selection& selection )
357 : {
358 : return stream << selection.Min() << '-' << selection.Max();
359 : }
360 : // Rectangle
361 :
362 : #define RECT_EMPTY ((short)-32767)
363 : #define RECT_MAX LONG_MAX
364 : #define RECT_MIN LONG_MIN
365 :
366 : class TOOLS_DLLPUBLIC SAL_WARN_UNUSED Rectangle
367 : {
368 : public:
369 : Rectangle();
370 : Rectangle( const Point& rLT, const Point& rRB );
371 : Rectangle( long nLeft, long nTop,
372 : long nRight, long nBottom );
373 : Rectangle( const Point& rLT, const Size& rSize );
374 :
375 20853484 : long Left() const { return nLeft; }
376 19646048 : long Right() const { return nRight; }
377 20289031 : long Top() const { return nTop; }
378 19374698 : long Bottom() const { return nBottom; }
379 :
380 17571958 : long& Left() { return nLeft; }
381 6005778 : long& Right() { return nRight; }
382 19128029 : long& Top() { return nTop; }
383 8228073 : long& Bottom() { return nBottom; }
384 :
385 : inline Point TopLeft() const;
386 : inline Point TopRight() const;
387 : inline Point TopCenter() const;
388 : inline Point BottomLeft() const;
389 : inline Point BottomRight() const;
390 : inline Point BottomCenter() const;
391 : inline Point LeftCenter() const;
392 : inline Point RightCenter() const;
393 : inline Point Center() const;
394 :
395 : inline void Move( long nHorzMove, long nVertMove );
396 : inline void Transpose();
397 : inline void SetPos( const Point& rPoint );
398 : void SetSize( const Size& rSize );
399 : inline Size GetSize() const;
400 :
401 : inline long GetWidth() const;
402 : inline long GetHeight() const;
403 :
404 : Rectangle& Union( const Rectangle& rRect );
405 : Rectangle& Intersection( const Rectangle& rRect );
406 : inline Rectangle GetUnion( const Rectangle& rRect ) const;
407 : inline Rectangle GetIntersection( const Rectangle& rRect ) const;
408 :
409 : void Justify();
410 :
411 : bool IsInside( const Point& rPOINT ) const;
412 : bool IsInside( const Rectangle& rRect ) const;
413 : bool IsOver( const Rectangle& rRect ) const;
414 :
415 835492 : void SetEmpty() { nRight = nBottom = RECT_EMPTY; }
416 : inline bool IsEmpty() const;
417 :
418 : inline bool operator == ( const Rectangle& rRect ) const;
419 : inline bool operator != ( const Rectangle& rRect ) const;
420 :
421 : inline Rectangle& operator += ( const Point& rPt );
422 : inline Rectangle& operator -= ( const Point& rPt );
423 :
424 : friend inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt );
425 : friend inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt );
426 :
427 : TOOLS_DLLPUBLIC friend SvStream& ReadRectangle( SvStream& rIStream, Rectangle& rRect );
428 : TOOLS_DLLPUBLIC friend SvStream& WriteRectangle( SvStream& rOStream, const Rectangle& rRect );
429 :
430 : // ONE
431 3459 : long getX() const { return nLeft; }
432 6284 : long getY() const { return nTop; }
433 115631 : long getWidth() const { return nRight - nLeft; }
434 126662 : long getHeight() const { return nBottom - nTop; }
435 38840 : void setX( long n ) { nRight += n-nLeft; nLeft = n; }
436 38453 : void setY( long n ) { nBottom += n-nTop; nTop = n; }
437 131229 : void setWidth( long n ) { nRight = nLeft + n; }
438 157311 : void setHeight( long n ) { nBottom = nTop + n; }
439 :
440 : private:
441 : long nLeft;
442 : long nTop;
443 : long nRight;
444 : long nBottom;
445 : };
446 :
447 12072685 : inline Rectangle::Rectangle()
448 : {
449 12072685 : nLeft = nTop = 0;
450 12072685 : nRight = nBottom = RECT_EMPTY;
451 12072685 : }
452 :
453 692010 : inline Rectangle::Rectangle( const Point& rLT, const Point& rRB )
454 : {
455 692010 : nLeft = rLT.X();
456 692010 : nTop = rLT.Y();
457 692010 : nRight = rRB.X();
458 692010 : nBottom = rRB.Y();
459 692010 : }
460 :
461 7977952 : inline Rectangle::Rectangle( long _nLeft, long _nTop,
462 : long _nRight, long _nBottom )
463 : {
464 7977952 : nLeft = _nLeft;
465 7977952 : nTop = _nTop;
466 7977952 : nRight = _nRight;
467 7977952 : nBottom = _nBottom;
468 7977952 : }
469 :
470 7644613 : inline Rectangle::Rectangle( const Point& rLT, const Size& rSize )
471 : {
472 7644613 : nLeft = rLT.X();
473 7644613 : nTop = rLT.Y();
474 7644613 : nRight = rSize.Width() ? nLeft+rSize.Width()-1 : RECT_EMPTY;
475 7644613 : nBottom = rSize.Height() ? nTop+rSize.Height()-1 : RECT_EMPTY;
476 7644613 : }
477 :
478 20943718 : inline bool Rectangle::IsEmpty() const
479 : {
480 20943718 : return ((nRight == RECT_EMPTY) || (nBottom == RECT_EMPTY));
481 : }
482 :
483 5436345 : inline Point Rectangle::TopLeft() const
484 : {
485 5436345 : return Point( nLeft, nTop );
486 : }
487 :
488 3769192 : inline Point Rectangle::TopRight() const
489 : {
490 3769192 : return Point( (nRight == RECT_EMPTY) ? nLeft : nRight, nTop );
491 : }
492 :
493 3765222 : inline Point Rectangle::BottomLeft() const
494 : {
495 3765222 : return Point( nLeft, (nBottom == RECT_EMPTY) ? nTop : nBottom );
496 : }
497 :
498 3856332 : inline Point Rectangle::BottomRight() const
499 : {
500 3856332 : return Point( (nRight == RECT_EMPTY) ? nLeft : nRight,
501 7712664 : (nBottom == RECT_EMPTY) ? nTop : nBottom );
502 : }
503 :
504 468 : inline Point Rectangle::TopCenter() const
505 : {
506 468 : if ( IsEmpty() )
507 0 : return Point( nLeft, nTop );
508 : else
509 936 : return Point( std::min( nLeft, nRight ) + std::abs( (nRight - nLeft)/2 ),
510 1404 : std::min( nTop, nBottom) );
511 : }
512 :
513 498 : inline Point Rectangle::BottomCenter() const
514 : {
515 498 : if ( IsEmpty() )
516 0 : return Point( nLeft, nTop );
517 : else
518 996 : return Point( std::min( nLeft, nRight ) + std::abs( (nRight - nLeft)/2 ),
519 1494 : std::max( nTop, nBottom) );
520 : }
521 :
522 468 : inline Point Rectangle::LeftCenter() const
523 : {
524 468 : if ( IsEmpty() )
525 0 : return Point( nLeft, nTop );
526 : else
527 468 : return Point( std::min( nLeft, nRight ), nTop + (nBottom - nTop)/2 );
528 : }
529 :
530 468 : inline Point Rectangle::RightCenter() const
531 : {
532 468 : if ( IsEmpty() )
533 0 : return Point( nLeft, nTop );
534 : else
535 468 : return Point( std::max( nLeft, nRight ), nTop + (nBottom - nTop)/2 );
536 : }
537 :
538 432269 : inline Point Rectangle::Center() const
539 : {
540 432269 : if ( IsEmpty() )
541 52669 : return Point( nLeft, nTop );
542 : else
543 379600 : return Point( nLeft+(nRight-nLeft)/2 , nTop+(nBottom-nTop)/2 );
544 : }
545 :
546 508174 : inline void Rectangle::Move( long nHorzMove, long nVertMove )
547 : {
548 508174 : nLeft += nHorzMove;
549 508174 : nTop += nVertMove;
550 508174 : if ( nRight != RECT_EMPTY )
551 383954 : nRight += nHorzMove;
552 508174 : if ( nBottom != RECT_EMPTY )
553 380776 : nBottom += nVertMove;
554 508174 : }
555 :
556 0 : void Rectangle::Transpose()
557 : {
558 0 : if ( !IsEmpty() )
559 : {
560 0 : long swap( nLeft );
561 0 : nLeft = nTop;
562 0 : nTop = swap;
563 :
564 0 : swap = nRight;
565 0 : nRight = nBottom;
566 0 : nBottom = swap;
567 : }
568 0 : }
569 :
570 13721 : inline void Rectangle::SetPos( const Point& rPoint )
571 : {
572 13721 : if ( nRight != RECT_EMPTY )
573 9475 : nRight += rPoint.X() - nLeft;
574 13721 : if ( nBottom != RECT_EMPTY )
575 9475 : nBottom += rPoint.Y() - nTop;
576 13721 : nLeft = rPoint.X();
577 13721 : nTop = rPoint.Y();
578 13721 : }
579 :
580 5401457 : inline long Rectangle::GetWidth() const
581 : {
582 : long n;
583 5401457 : if ( nRight == RECT_EMPTY )
584 126441 : n = 0;
585 : else
586 : {
587 5275016 : n = nRight - nLeft;
588 5275016 : if( n < 0 )
589 9346 : n--;
590 : else
591 5265670 : n++;
592 : }
593 :
594 5401457 : return n;
595 : }
596 :
597 5762591 : inline long Rectangle::GetHeight() const
598 : {
599 : long n;
600 5762591 : if ( nBottom == RECT_EMPTY )
601 117967 : n = 0;
602 : else
603 : {
604 5644624 : n = nBottom - nTop;
605 5644624 : if ( n < 0 )
606 19943 : n--;
607 : else
608 5624681 : n++;
609 : }
610 :
611 5762591 : return n;
612 : }
613 :
614 911896 : inline Size Rectangle::GetSize() const
615 : {
616 911896 : return Size( GetWidth(), GetHeight() );
617 : }
618 :
619 0 : inline Rectangle Rectangle::GetUnion( const Rectangle& rRect ) const
620 : {
621 0 : Rectangle aTmpRect( *this );
622 0 : return aTmpRect.Union( rRect );
623 : }
624 :
625 391260 : inline Rectangle Rectangle::GetIntersection( const Rectangle& rRect ) const
626 : {
627 391260 : Rectangle aTmpRect( *this );
628 391260 : return aTmpRect.Intersection( rRect );
629 : }
630 :
631 175442 : inline bool Rectangle::operator == ( const Rectangle& rRect ) const
632 : {
633 274156 : return ((nLeft == rRect.nLeft ) &&
634 196452 : (nTop == rRect.nTop ) &&
635 343848 : (nRight == rRect.nRight ) &&
636 246110 : (nBottom == rRect.nBottom ));
637 : }
638 :
639 397282 : inline bool Rectangle::operator != ( const Rectangle& rRect ) const
640 : {
641 674954 : return ((nLeft != rRect.nLeft ) ||
642 550705 : (nTop != rRect.nTop ) ||
643 910602 : (nRight != rRect.nRight ) ||
644 637569 : (nBottom != rRect.nBottom ));
645 : }
646 :
647 1197922 : inline Rectangle& Rectangle::operator +=( const Point& rPt )
648 : {
649 1197922 : nLeft += rPt.X();
650 1197922 : nTop += rPt.Y();
651 1197922 : if ( nRight != RECT_EMPTY )
652 1196881 : nRight += rPt.X();
653 1197922 : if ( nBottom != RECT_EMPTY )
654 1168965 : nBottom += rPt.Y();
655 1197922 : return *this;
656 : }
657 :
658 27687 : inline Rectangle& Rectangle::operator -= ( const Point& rPt )
659 : {
660 27687 : nLeft -= rPt.X();
661 27687 : nTop -= rPt.Y();
662 27687 : if ( nRight != RECT_EMPTY )
663 27687 : nRight -= rPt.X();
664 27687 : if ( nBottom != RECT_EMPTY )
665 27687 : nBottom -= rPt.Y();
666 27687 : return *this;
667 : }
668 :
669 32688 : inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt )
670 : {
671 65376 : Rectangle aRect( rRect.nLeft + rPt.X(), rRect.nTop + rPt.Y(),
672 65376 : (rRect.nRight == RECT_EMPTY) ? RECT_EMPTY : rRect.nRight + rPt.X(),
673 163440 : (rRect.nBottom == RECT_EMPTY) ? RECT_EMPTY : rRect.nBottom + rPt.Y() );
674 32688 : return aRect;
675 : }
676 :
677 2839 : inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt )
678 : {
679 2839 : Rectangle aRect( rRect.nLeft - rPt.X(),
680 2839 : rRect.nTop - rPt.Y(),
681 5678 : (rRect.nRight == RECT_EMPTY) ? RECT_EMPTY : rRect.nRight - rPt.X(),
682 14195 : (rRect.nBottom == RECT_EMPTY) ? RECT_EMPTY : rRect.nBottom - rPt.Y() );
683 2839 : return aRect;
684 : }
685 :
686 : template< typename charT, typename traits >
687 : inline std::basic_ostream<charT, traits> & operator <<(
688 : std::basic_ostream<charT, traits> & stream, const Rectangle& rectangle )
689 : {
690 : if (rectangle.IsEmpty())
691 : return stream << "EMPTY";
692 : else
693 : return stream << rectangle.getWidth() << 'x' << rectangle.getHeight()
694 : << "@(" << rectangle.getX() << ',' << rectangle.getY() << ")";
695 : }
696 :
697 : #endif
698 :
699 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|