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 _SV_GEN_HXX
20 : #define _SV_GEN_HXX
21 :
22 : #include "tools/toolsdllapi.h"
23 : #include <tools/solar.h>
24 :
25 : #include <limits.h>
26 : #include <ostream>
27 : #include <cstdlib>
28 :
29 : class SvStream;
30 :
31 : // Pair
32 :
33 : class SAL_WARN_UNUSED Pair
34 : {
35 : public:
36 : Pair();
37 : Pair( long nA, long nB );
38 :
39 1 : long A() const { return nA; }
40 1 : long B() const { return nB; }
41 :
42 16087 : long& A() { return nA; }
43 16087 : long& B() { return nB; }
44 :
45 : bool operator == ( const Pair& rPair ) const;
46 : bool operator != ( const Pair& rPair ) const;
47 :
48 : TOOLS_DLLPUBLIC friend SvStream& operator>>( SvStream& rIStream, Pair& rPair );
49 : TOOLS_DLLPUBLIC friend SvStream& operator<<( SvStream& rOStream, const Pair& rPair );
50 :
51 : protected:
52 : long nA;
53 : long nB;
54 : };
55 :
56 13068886 : inline Pair::Pair()
57 : {
58 13068886 : nA = nB = 0;
59 13068886 : }
60 :
61 44562642 : inline Pair::Pair( long _nA, long _nB )
62 : {
63 44562642 : Pair::nA = _nA;
64 44562642 : Pair::nB = _nB;
65 44562642 : }
66 :
67 278387 : inline bool Pair::operator == ( const Pair& rPair ) const
68 : {
69 278387 : return ((nA == rPair.nA) && (nB == rPair.nB));
70 : }
71 :
72 2892925 : inline bool Pair::operator != ( const Pair& rPair ) const
73 : {
74 2892925 : return ((nA != rPair.nA) || (nB != rPair.nB));
75 : }
76 :
77 : // Point
78 :
79 : class SAL_WARN_UNUSED Point : public Pair
80 : {
81 : public:
82 : Point();
83 : Point( long nX, long nY );
84 :
85 31139493 : long X() const { return nA; }
86 17977366 : long Y() const { return nB; }
87 :
88 35273257 : long& X() { return nA; }
89 33411001 : long& Y() { return nB; }
90 :
91 : void Move( long nHorzMove, long nVertMove );
92 : bool IsAbove( const Point& rPoint ) const;
93 : bool IsBelow( const Point& rPoint ) const;
94 : bool IsLeft( const Point& rPoint ) const;
95 : bool IsRight( const Point& rPoint ) const;
96 :
97 : Point& operator += ( const Point& rPoint );
98 : Point& operator -= ( const Point& rPoint );
99 : Point& operator *= ( const long nVal );
100 : Point& operator /= ( const long nVal );
101 :
102 : friend inline Point operator+( const Point &rVal1, const Point &rVal2 );
103 : friend inline Point operator-( const Point &rVal1, const Point &rVal2 );
104 : friend inline Point operator*( const Point &rVal1, const long nVal2 );
105 : friend inline Point operator/( const Point &rVal1, const long nVal2 );
106 :
107 3217715 : long getX() const { return X(); }
108 2749909 : long getY() const { return Y(); }
109 254664 : void setX(long nX) { X() = nX; }
110 237580 : void setY(long nY) { Y() = nY; }
111 : };
112 :
113 6131136 : inline Point::Point()
114 : {
115 6131136 : }
116 :
117 32517229 : inline Point::Point( long nX, long nY ) : Pair( nX, nY )
118 : {
119 32517229 : }
120 :
121 441 : inline void Point::Move( long nHorzMove, long nVertMove )
122 : {
123 441 : nA += nHorzMove;
124 441 : nB += nVertMove;
125 441 : }
126 :
127 : inline bool Point::IsAbove( const Point& rPoint ) const
128 : {
129 : return (nB > rPoint.nB);
130 : }
131 :
132 : inline bool Point::IsBelow( const Point& rPoint ) const
133 : {
134 : return (nB < rPoint.nB);
135 : }
136 :
137 : inline bool Point::IsLeft( const Point& rPoint ) const
138 : {
139 : return (nA < rPoint.nA);
140 : }
141 :
142 : inline bool Point::IsRight( const Point& rPoint ) const
143 : {
144 : return (nA > rPoint.nA);
145 : }
146 :
147 1461012 : inline Point& Point::operator += ( const Point& rPoint )
148 : {
149 1461012 : nA += rPoint.nA;
150 1461012 : nB += rPoint.nB;
151 1461012 : return *this;
152 : }
153 :
154 114868 : inline Point& Point::operator -= ( const Point& rPoint )
155 : {
156 114868 : nA -= rPoint.nA;
157 114868 : nB -= rPoint.nB;
158 114868 : return *this;
159 : }
160 :
161 0 : inline Point& Point::operator *= ( const long nVal )
162 : {
163 0 : nA *= nVal;
164 0 : nB *= nVal;
165 0 : return *this;
166 : }
167 :
168 0 : inline Point& Point::operator /= ( const long nVal )
169 : {
170 0 : nA /= nVal;
171 0 : nB /= nVal;
172 0 : return *this;
173 : }
174 :
175 4091607 : inline Point operator+( const Point &rVal1, const Point &rVal2 )
176 : {
177 4091607 : return Point( rVal1.nA+rVal2.nA, rVal1.nB+rVal2.nB );
178 : }
179 :
180 1252155 : inline Point operator-( const Point &rVal1, const Point &rVal2 )
181 : {
182 1252155 : return Point( rVal1.nA-rVal2.nA, rVal1.nB-rVal2.nB );
183 : }
184 :
185 0 : inline Point operator*( const Point &rVal1, const long nVal2 )
186 : {
187 0 : return Point( rVal1.nA*nVal2, rVal1.nB*nVal2 );
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 : template< typename charT, typename traits >
196 : inline std::basic_ostream<charT, traits> & operator <<(
197 : std::basic_ostream<charT, traits> & stream, const Point& point )
198 : {
199 : return stream << point.X() << ',' << point.Y();
200 : }
201 :
202 : // Size
203 :
204 : class SAL_WARN_UNUSED Size : public Pair
205 : {
206 : public:
207 : Size();
208 : Size( long nWidth, long nHeight );
209 :
210 19189860 : long Width() const { return nA; }
211 15924220 : long Height() const { return nB; }
212 :
213 61049929 : long& Width() { return nA; }
214 10353582 : long& Height() { return nB; }
215 :
216 6704313 : long getWidth() const { return Width(); }
217 5104078 : long getHeight() const { return Height(); }
218 673354 : void setWidth(long nWidth) { Width() = nWidth; }
219 541863 : void setHeight(long nHeight) { Height() = nHeight; }
220 : };
221 :
222 6933306 : inline Size::Size()
223 : {
224 6933306 : }
225 :
226 11556913 : inline Size::Size( long nWidth, long nHeight ) :
227 11556913 : Pair( nWidth, nHeight )
228 : {
229 11556913 : }
230 :
231 : template< typename charT, typename traits >
232 : inline std::basic_ostream<charT, traits> & operator <<(
233 : std::basic_ostream<charT, traits> & stream, const Size& size )
234 : {
235 : return stream << size.Width() << 'x' << size.Height();
236 : }
237 :
238 : // Range
239 :
240 : #define RANGE_MAX LONG_MAX
241 :
242 : class SAL_WARN_UNUSED Range : public Pair
243 : {
244 : public:
245 : Range();
246 : Range( long nMin, long nMax );
247 :
248 1840 : long Min() const { return nA; }
249 2124 : long Max() const { return nB; }
250 451796 : long Len() const { return nB - nA + 1; }
251 :
252 907355 : long& Min() { return nA; }
253 1889136 : long& Max() { return nB; }
254 :
255 : bool IsInside( long nIs ) const;
256 :
257 : void Justify();
258 : };
259 :
260 70 : inline Range::Range()
261 : {
262 70 : }
263 :
264 484304 : inline Range::Range( long nMin, long nMax ) : Pair( nMin, nMax )
265 : {
266 484304 : }
267 :
268 533 : inline bool Range::IsInside( long nIs ) const
269 : {
270 533 : return ((nA <= nIs) && (nIs <= nB ));
271 : }
272 :
273 15058 : inline void Range::Justify()
274 : {
275 15058 : if ( nA > nB )
276 : {
277 27 : long nHelp = nA;
278 27 : nA = nB;
279 27 : nB = nHelp;
280 : }
281 15058 : }
282 :
283 : template< typename charT, typename traits >
284 : inline std::basic_ostream<charT, traits> & operator <<(
285 : std::basic_ostream<charT, traits> & stream, const Range& range )
286 : {
287 : return stream << range.Min() << '-' << range.Max();
288 : }
289 :
290 : // Selection
291 :
292 : #define SELECTION_MIN LONG_MIN
293 : #define SELECTION_MAX LONG_MAX
294 :
295 : class SAL_WARN_UNUSED Selection : public Pair
296 : {
297 : public:
298 : Selection();
299 : Selection( long nPos );
300 : Selection( long nMin, long nMax );
301 :
302 0 : long Min() const { return nA; }
303 0 : long Max() const { return nB; }
304 13584 : long Len() const { return nB - nA; }
305 :
306 18396 : long& Min() { return nA; }
307 16133 : long& Max() { return nB; }
308 :
309 : bool IsInside( long nIs ) const;
310 :
311 : void Justify();
312 :
313 269 : bool operator !() const { return !Len(); }
314 :
315 0 : long getMin() const { return Min(); }
316 : long getMax() const { return Max(); }
317 0 : void setMin(long nMin) { Min() = nMin; }
318 0 : void setMax(long nMax) { Max() = nMax; }
319 : };
320 :
321 4374 : inline Selection::Selection()
322 : {
323 4374 : }
324 :
325 0 : inline Selection::Selection( long nPos ) : Pair( nPos, nPos )
326 : {
327 0 : }
328 :
329 4192 : inline Selection::Selection( long nMin, long nMax ) :
330 4192 : Pair( nMin, nMax )
331 : {
332 4192 : }
333 :
334 0 : inline bool Selection::IsInside( long nIs ) const
335 : {
336 0 : return ((nA <= nIs) && (nIs < nB ));
337 : }
338 :
339 3193 : inline void Selection::Justify()
340 : {
341 3193 : if ( nA > nB )
342 : {
343 0 : long nHelp = nA;
344 0 : nA = nB;
345 0 : nB = nHelp;
346 : }
347 3193 : }
348 :
349 : template< typename charT, typename traits >
350 : inline std::basic_ostream<charT, traits> & operator <<(
351 : std::basic_ostream<charT, traits> & stream, const Selection& selection )
352 : {
353 : return stream << selection.Min() << '-' << selection.Max();
354 : }
355 : // Rectangle
356 :
357 : #define RECT_EMPTY ((short)-32767)
358 :
359 : class TOOLS_DLLPUBLIC SAL_WARN_UNUSED Rectangle
360 : {
361 : public:
362 : Rectangle();
363 : Rectangle( const Point& rLT, const Point& rRB );
364 : Rectangle( long nLeft, long nTop,
365 : long nRight, long nBottom );
366 : Rectangle( const Point& rLT, const Size& rSize );
367 :
368 3884760 : long Left() const { return nLeft; }
369 3537333 : long Right() const { return nRight; }
370 3880179 : long Top() const { return nTop; }
371 3519199 : long Bottom() const { return nBottom; }
372 :
373 8265786 : long& Left() { return nLeft; }
374 2878919 : long& Right() { return nRight; }
375 9340141 : long& Top() { return nTop; }
376 2251143 : long& Bottom() { return nBottom; }
377 :
378 : inline Point TopLeft() const;
379 : inline Point TopRight() const;
380 : inline Point TopCenter() const;
381 : inline Point BottomLeft() const;
382 : inline Point BottomRight() const;
383 : inline Point BottomCenter() const;
384 : inline Point LeftCenter() const;
385 : inline Point RightCenter() const;
386 : inline Point Center() const;
387 :
388 : inline void Move( long nHorzMove, long nVertMove );
389 : inline void Transpose();
390 : inline void SetPos( const Point& rPoint );
391 : void SetSize( const Size& rSize );
392 : inline Size GetSize() const;
393 :
394 : inline long GetWidth() const;
395 : inline long GetHeight() const;
396 :
397 : Rectangle& Union( const Rectangle& rRect );
398 : Rectangle& Intersection( const Rectangle& rRect );
399 : inline Rectangle GetUnion( const Rectangle& rRect ) const;
400 : inline Rectangle GetIntersection( const Rectangle& rRect ) const;
401 :
402 : void Justify();
403 :
404 : bool IsInside( const Point& rPOINT ) const;
405 : bool IsInside( const Rectangle& rRect ) const;
406 : bool IsOver( const Rectangle& rRect ) const;
407 :
408 161129 : void SetEmpty() { nRight = nBottom = RECT_EMPTY; }
409 : inline bool IsEmpty() const;
410 :
411 : inline bool operator == ( const Rectangle& rRect ) const;
412 : inline bool operator != ( const Rectangle& rRect ) const;
413 :
414 : inline Rectangle& operator += ( const Point& rPt );
415 : inline Rectangle& operator -= ( const Point& rPt );
416 :
417 : friend inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt );
418 : friend inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt );
419 :
420 : TOOLS_DLLPUBLIC friend SvStream& operator>>( SvStream& rIStream, Rectangle& rRect );
421 : TOOLS_DLLPUBLIC friend SvStream& operator<<( SvStream& rOStream, const Rectangle& rRect );
422 :
423 : // ONE
424 664 : long getX() const { return nLeft; }
425 1289 : long getY() const { return nTop; }
426 59251 : long getWidth() const { return nRight - nLeft; }
427 57243 : long getHeight() const { return nBottom - nTop; }
428 6505 : void setX( long n ) { nRight += n-nLeft; nLeft = n; }
429 6273 : void setY( long n ) { nBottom += n-nTop; nTop = n; }
430 63900 : void setWidth( long n ) { nRight = nLeft + n; }
431 67354 : void setHeight( long n ) { nBottom = nTop + n; }
432 :
433 : private:
434 : long nLeft;
435 : long nTop;
436 : long nRight;
437 : long nBottom;
438 : };
439 :
440 4609685 : inline Rectangle::Rectangle()
441 : {
442 4609685 : nLeft = nTop = 0;
443 4609685 : nRight = nBottom = RECT_EMPTY;
444 4609685 : }
445 :
446 800634 : inline Rectangle::Rectangle( const Point& rLT, const Point& rRB )
447 : {
448 800634 : nLeft = rLT.X();
449 800634 : nTop = rLT.Y();
450 800634 : nRight = rRB.X();
451 800634 : nBottom = rRB.Y();
452 800634 : }
453 :
454 1952314 : inline Rectangle::Rectangle( long _nLeft, long _nTop,
455 : long _nRight, long _nBottom )
456 : {
457 1952314 : nLeft = _nLeft;
458 1952314 : nTop = _nTop;
459 1952314 : nRight = _nRight;
460 1952314 : nBottom = _nBottom;
461 1952314 : }
462 :
463 2520577 : inline Rectangle::Rectangle( const Point& rLT, const Size& rSize )
464 : {
465 2520577 : nLeft = rLT.X();
466 2520577 : nTop = rLT.Y();
467 2520577 : nRight = rSize.Width() ? nLeft+rSize.Width()-1 : RECT_EMPTY;
468 2520577 : nBottom = rSize.Height() ? nTop+rSize.Height()-1 : RECT_EMPTY;
469 2520577 : }
470 :
471 7394183 : inline bool Rectangle::IsEmpty() const
472 : {
473 7394183 : return ((nRight == RECT_EMPTY) || (nBottom == RECT_EMPTY));
474 : }
475 :
476 2154122 : inline Point Rectangle::TopLeft() const
477 : {
478 2154122 : return Point( nLeft, nTop );
479 : }
480 :
481 1619997 : inline Point Rectangle::TopRight() const
482 : {
483 1619997 : return Point( (nRight == RECT_EMPTY) ? nLeft : nRight, nTop );
484 : }
485 :
486 199446 : inline Point Rectangle::BottomLeft() const
487 : {
488 199446 : return Point( nLeft, (nBottom == RECT_EMPTY) ? nTop : nBottom );
489 : }
490 :
491 214395 : inline Point Rectangle::BottomRight() const
492 : {
493 214395 : return Point( (nRight == RECT_EMPTY) ? nLeft : nRight,
494 428790 : (nBottom == RECT_EMPTY) ? nTop : nBottom );
495 : }
496 :
497 101 : inline Point Rectangle::TopCenter() const
498 : {
499 101 : if ( IsEmpty() )
500 0 : return Point( nLeft, nTop );
501 : else
502 202 : return Point( std::min( nLeft, nRight ) + std::abs( (nRight - nLeft)/2 ),
503 303 : std::min( nTop, nBottom) );
504 : }
505 :
506 105 : inline Point Rectangle::BottomCenter() const
507 : {
508 105 : if ( IsEmpty() )
509 0 : return Point( nLeft, nTop );
510 : else
511 210 : return Point( std::min( nLeft, nRight ) + std::abs( (nRight - nLeft)/2 ),
512 315 : std::max( nTop, nBottom) );
513 : }
514 :
515 101 : inline Point Rectangle::LeftCenter() const
516 : {
517 101 : if ( IsEmpty() )
518 0 : return Point( nLeft, nTop );
519 : else
520 101 : return Point( std::min( nLeft, nRight ), nTop + (nBottom - nTop)/2 );
521 : }
522 :
523 101 : inline Point Rectangle::RightCenter() const
524 : {
525 101 : if ( IsEmpty() )
526 0 : return Point( nLeft, nTop );
527 : else
528 101 : return Point( std::max( nLeft, nRight ), nTop + (nBottom - nTop)/2 );
529 : }
530 :
531 160371 : inline Point Rectangle::Center() const
532 : {
533 160371 : if ( IsEmpty() )
534 37021 : return Point( nLeft, nTop );
535 : else
536 123350 : return Point( nLeft+(nRight-nLeft)/2 , nTop+(nBottom-nTop)/2 );
537 : }
538 :
539 342862 : inline void Rectangle::Move( long nHorzMove, long nVertMove )
540 : {
541 342862 : nLeft += nHorzMove;
542 342862 : nTop += nVertMove;
543 342862 : if ( nRight != RECT_EMPTY )
544 260407 : nRight += nHorzMove;
545 342862 : if ( nBottom != RECT_EMPTY )
546 258507 : nBottom += nVertMove;
547 342862 : }
548 :
549 0 : void Rectangle::Transpose()
550 : {
551 0 : if ( !IsEmpty() )
552 : {
553 0 : long swap( nLeft );
554 0 : nLeft = nTop;
555 0 : nTop = swap;
556 :
557 0 : swap = nRight;
558 0 : nRight = nBottom;
559 0 : nBottom = swap;
560 : }
561 0 : }
562 :
563 7441 : inline void Rectangle::SetPos( const Point& rPoint )
564 : {
565 7441 : if ( nRight != RECT_EMPTY )
566 2660 : nRight += rPoint.X() - nLeft;
567 7441 : if ( nBottom != RECT_EMPTY )
568 4808 : nBottom += rPoint.Y() - nTop;
569 7441 : nLeft = rPoint.X();
570 7441 : nTop = rPoint.Y();
571 7441 : }
572 :
573 1931996 : inline long Rectangle::GetWidth() const
574 : {
575 : long n;
576 1931996 : if ( nRight == RECT_EMPTY )
577 46376 : n = 0;
578 : else
579 : {
580 1885620 : n = nRight - nLeft;
581 1885620 : if( n < 0 )
582 1606 : n--;
583 : else
584 1884014 : n++;
585 : }
586 :
587 1931996 : return n;
588 : }
589 :
590 2427101 : inline long Rectangle::GetHeight() const
591 : {
592 : long n;
593 2427101 : if ( nBottom == RECT_EMPTY )
594 56264 : n = 0;
595 : else
596 : {
597 2370837 : n = nBottom - nTop;
598 2370837 : if ( n < 0 )
599 1730 : n--;
600 : else
601 2369107 : n++;
602 : }
603 :
604 2427101 : return n;
605 : }
606 :
607 504481 : inline Size Rectangle::GetSize() const
608 : {
609 504481 : return Size( GetWidth(), GetHeight() );
610 : }
611 :
612 0 : inline Rectangle Rectangle::GetUnion( const Rectangle& rRect ) const
613 : {
614 0 : Rectangle aTmpRect( *this );
615 0 : return aTmpRect.Union( rRect );
616 : }
617 :
618 378032 : inline Rectangle Rectangle::GetIntersection( const Rectangle& rRect ) const
619 : {
620 378032 : Rectangle aTmpRect( *this );
621 378032 : return aTmpRect.Intersection( rRect );
622 : }
623 :
624 10072 : inline bool Rectangle::operator == ( const Rectangle& rRect ) const
625 : {
626 18334 : return ((nLeft == rRect.nLeft ) &&
627 16131 : (nTop == rRect.nTop ) &&
628 24025 : (nRight == rRect.nRight ) &&
629 16156 : (nBottom == rRect.nBottom ));
630 : }
631 :
632 108584 : inline bool Rectangle::operator != ( const Rectangle& rRect ) const
633 : {
634 172755 : return ((nLeft != rRect.nLeft ) ||
635 127547 : (nTop != rRect.nTop ) ||
636 231055 : (nRight != rRect.nRight ) ||
637 167679 : (nBottom != rRect.nBottom ));
638 : }
639 :
640 277263 : inline Rectangle& Rectangle::operator +=( const Point& rPt )
641 : {
642 277263 : nLeft += rPt.X();
643 277263 : nTop += rPt.Y();
644 277263 : if ( nRight != RECT_EMPTY )
645 276721 : nRight += rPt.X();
646 277263 : if ( nBottom != RECT_EMPTY )
647 264718 : nBottom += rPt.Y();
648 277263 : return *this;
649 : }
650 :
651 14205 : inline Rectangle& Rectangle::operator -= ( const Point& rPt )
652 : {
653 14205 : nLeft -= rPt.X();
654 14205 : nTop -= rPt.Y();
655 14205 : if ( nRight != RECT_EMPTY )
656 14205 : nRight -= rPt.X();
657 14205 : if ( nBottom != RECT_EMPTY )
658 14205 : nBottom -= rPt.Y();
659 14205 : return *this;
660 : }
661 :
662 5483 : inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt )
663 : {
664 10966 : Rectangle aRect( rRect.nLeft + rPt.X(), rRect.nTop + rPt.Y(),
665 10966 : (rRect.nRight == RECT_EMPTY) ? RECT_EMPTY : rRect.nRight + rPt.X(),
666 27415 : (rRect.nBottom == RECT_EMPTY) ? RECT_EMPTY : rRect.nBottom + rPt.Y() );
667 5483 : return aRect;
668 : }
669 :
670 1165 : inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt )
671 : {
672 1165 : Rectangle aRect( rRect.nLeft - rPt.X(),
673 1165 : rRect.nTop - rPt.Y(),
674 2330 : (rRect.nRight == RECT_EMPTY) ? RECT_EMPTY : rRect.nRight - rPt.X(),
675 5825 : (rRect.nBottom == RECT_EMPTY) ? RECT_EMPTY : rRect.nBottom - rPt.Y() );
676 1165 : return aRect;
677 : }
678 :
679 : template< typename charT, typename traits >
680 : inline std::basic_ostream<charT, traits> & operator <<(
681 : std::basic_ostream<charT, traits> & stream, const Rectangle& rectangle )
682 : {
683 : if (rectangle.IsEmpty())
684 : return stream << "EMPTY";
685 : else
686 : return stream << rectangle.getWidth() << 'x' << rectangle.getHeight()
687 : << "@(" << rectangle.getX() << ',' << rectangle.getY() << ")";
688 : }
689 :
690 : #endif
691 :
692 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|