1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 #ifndef _SV_GEN_HXX 24 #define _SV_GEN_HXX 25 26 #include "tools/toolsdllapi.h" 27 #include <tools/solar.h> 28 29 #include <limits.h> 30 31 class SvStream; 32 33 // -------------------- 34 // - Helper functions - 35 // -------------------- 36 37 inline long MinMax( long nVal, long nMin, long nMax ); 38 inline long AlignedWidth4Bytes( long nWidthBits ); 39 inline long FRound( double fVal ); 40 41 // --------------- 42 // - Inlines - 43 // --------------- 44 45 inline long MinMax( long nVal, long nMin, long nMax ) 46 { 47 return( nVal >= nMin ? ( nVal <= nMax ? nVal : nMax ) : nMin ); 48 } 49 50 // ------------------------------------------------------------------ 51 52 inline long AlignedWidth4Bytes( long nWidthBits ) 53 { 54 return( ( ( nWidthBits + 31 ) >> 5 ) << 2 ); 55 } 56 57 // ------------------------------------------------------------------ 58 59 inline long FRound( double fVal ) 60 { 61 return( fVal > 0.0 ? (long) ( fVal + 0.5 ) : -(long) ( -fVal + 0.5 ) ); 62 } 63 64 // -------- 65 // - Pair - 66 // -------- 67 68 class Pair 69 { 70 public: 71 long nA; 72 long nB; 73 74 Pair(); 75 Pair( long nA, long nB ); 76 77 long A() const { return nA; } 78 long B() const { return nB; } 79 80 long& A() { return nA; } 81 long& B() { return nB; } 82 83 sal_Bool operator == ( const Pair& rPair ) const; 84 sal_Bool operator != ( const Pair& rPair ) const; 85 86 TOOLS_DLLPUBLIC friend SvStream& operator>>( SvStream& rIStream, Pair& rPair ); 87 TOOLS_DLLPUBLIC friend SvStream& operator<<( SvStream& rOStream, const Pair& rPair ); 88 }; 89 90 inline Pair::Pair() 91 { 92 nA = nB = 0; 93 } 94 95 inline Pair::Pair( long _nA, long _nB ) 96 { 97 Pair::nA = _nA; 98 Pair::nB = _nB; 99 } 100 101 inline sal_Bool Pair::operator == ( const Pair& rPair ) const 102 { 103 return ((nA == rPair.nA) && (nB == rPair.nB)); 104 } 105 106 inline sal_Bool Pair::operator != ( const Pair& rPair ) const 107 { 108 return ((nA != rPair.nA) || (nB != rPair.nB)); 109 } 110 111 // --------- 112 // - Point - 113 // --------- 114 115 class Point : public Pair 116 { 117 public: 118 Point(); 119 Point( long nX, long nY ); 120 121 long X() const { return nA; } 122 long Y() const { return nB; } 123 124 long& X() { return nA; } 125 long& Y() { return nB; } 126 127 void Move( long nHorzMove, long nVertMove ); 128 sal_Bool IsAbove( const Point& rPoint ) const; 129 sal_Bool IsBelow( const Point& rPoint ) const; 130 sal_Bool IsLeft( const Point& rPoint ) const; 131 sal_Bool IsRight( const Point& rPoint ) const; 132 133 Point& operator += ( const Point& rPoint ); 134 Point& operator -= ( const Point& rPoint ); 135 Point& operator *= ( const long nVal ); 136 Point& operator /= ( const long nVal ); 137 138 #ifdef __BORLANDC__ 139 friend Point operator+( const Point &rVal1, const Point &rVal2 ); 140 friend Point operator-( const Point &rVal1, const Point &rVal2 ); 141 friend Point operator*( const Point &rVal1, const long nVal2 ); 142 friend Point operator/( const Point &rVal1, const long nVal2 ); 143 #else 144 friend inline Point operator+( const Point &rVal1, const Point &rVal2 ); 145 friend inline Point operator-( const Point &rVal1, const Point &rVal2 ); 146 friend inline Point operator*( const Point &rVal1, const long nVal2 ); 147 friend inline Point operator/( const Point &rVal1, const long nVal2 ); 148 #endif 149 150 long getX() const { return X(); } 151 long getY() const { return Y(); } 152 void setX(long nX) { X() = nX; } 153 void setY(long nY) { Y() = nY; } 154 }; 155 156 inline Point::Point() 157 { 158 } 159 160 inline Point::Point( long nX, long nY ) : Pair( nX, nY ) 161 { 162 } 163 164 inline void Point::Move( long nHorzMove, long nVertMove ) 165 { 166 nA += nHorzMove; 167 nB += nVertMove; 168 } 169 170 inline sal_Bool Point::IsAbove( const Point& rPoint ) const 171 { 172 return (nB > rPoint.nB); 173 } 174 175 inline sal_Bool Point::IsBelow( const Point& rPoint ) const 176 { 177 return (nB < rPoint.nB); 178 } 179 180 inline sal_Bool Point::IsLeft( const Point& rPoint ) const 181 { 182 return (nA < rPoint.nA); 183 } 184 185 inline sal_Bool Point::IsRight( const Point& rPoint ) const 186 { 187 return (nA > rPoint.nA); 188 } 189 190 inline Point& Point::operator += ( const Point& rPoint ) 191 { 192 nA += rPoint.nA; 193 nB += rPoint.nB; 194 return *this; 195 } 196 197 inline Point& Point::operator -= ( const Point& rPoint ) 198 { 199 nA -= rPoint.nA; 200 nB -= rPoint.nB; 201 return *this; 202 } 203 204 inline Point& Point::operator *= ( const long nVal ) 205 { 206 nA *= nVal; 207 nB *= nVal; 208 return *this; 209 } 210 211 inline Point& Point::operator /= ( const long nVal ) 212 { 213 nA /= nVal; 214 nB /= nVal; 215 return *this; 216 } 217 218 inline Point operator+( const Point &rVal1, const Point &rVal2 ) 219 { 220 return Point( rVal1.nA+rVal2.nA, rVal1.nB+rVal2.nB ); 221 } 222 223 inline Point operator-( const Point &rVal1, const Point &rVal2 ) 224 { 225 return Point( rVal1.nA-rVal2.nA, rVal1.nB-rVal2.nB ); 226 } 227 228 inline Point operator*( const Point &rVal1, const long nVal2 ) 229 { 230 return Point( rVal1.nA*nVal2, rVal1.nB*nVal2 ); 231 } 232 233 inline Point operator/( const Point &rVal1, const long nVal2 ) 234 { 235 return Point( rVal1.nA/nVal2, rVal1.nB/nVal2 ); 236 } 237 238 // -------- 239 // - Size - 240 // -------- 241 242 class Size : public Pair 243 { 244 public: 245 Size(); 246 Size( long nWidth, long nHeight ); 247 248 long Width() const { return nA; } 249 long Height() const { return nB; } 250 251 long& Width() { return nA; } 252 long& Height() { return nB; } 253 254 long getWidth() const { return Width(); } 255 long getHeight() const { return Height(); } 256 void setWidth(long nWidth) { Width() = nWidth; } 257 void setHeight(long nHeight) { Height() = nHeight; } 258 }; 259 260 inline Size::Size() 261 { 262 } 263 264 inline Size::Size( long nWidth, long nHeight ) : 265 Pair( nWidth, nHeight ) 266 { 267 } 268 269 // --------- 270 // - Range - 271 // --------- 272 273 #define RANGE_MIN LONG_MIN 274 #define RANGE_MAX LONG_MAX 275 276 class Range : public Pair 277 { 278 public: 279 Range(); 280 Range( long nMin, long nMax ); 281 282 long Min() const { return nA; } 283 long Max() const { return nB; } 284 long Len() const { return nB - nA + 1; } 285 286 long& Min() { return nA; } 287 long& Max() { return nB; } 288 289 sal_Bool IsInside( long nIs ) const; 290 291 void Justify(); 292 }; 293 294 inline Range::Range() 295 { 296 } 297 298 inline Range::Range( long nMin, long nMax ) : Pair( nMin, nMax ) 299 { 300 } 301 302 inline sal_Bool Range::IsInside( long nIs ) const 303 { 304 return ((nA <= nIs) && (nIs <= nB )); 305 } 306 307 inline void Range::Justify() 308 { 309 if ( nA > nB ) 310 { 311 long nHelp = nA; 312 nA = nB; 313 nB = nHelp; 314 } 315 } 316 317 // ------------- 318 // - Selection - 319 // ------------- 320 321 #define SELECTION_MIN LONG_MIN 322 #define SELECTION_MAX LONG_MAX 323 324 class Selection : public Pair 325 { 326 public: 327 Selection(); 328 Selection( long nPos ); 329 Selection( long nMin, long nMax ); 330 331 long Min() const { return nA; } 332 long Max() const { return nB; } 333 long Len() const { return nB - nA; } 334 335 long& Min() { return nA; } 336 long& Max() { return nB; } 337 338 sal_Bool IsInside( long nIs ) const; 339 340 void Justify(); 341 342 sal_Bool operator !() const { return !Len(); } 343 344 long getMin() const { return Min(); } 345 long getMax() const { return Max(); } 346 void setMin(long nMin) { Min() = nMin; } 347 void setMax(long nMax) { Max() = nMax; } 348 }; 349 350 inline Selection::Selection() 351 { 352 } 353 354 inline Selection::Selection( long nPos ) : Pair( nPos, nPos ) 355 { 356 } 357 358 inline Selection::Selection( long nMin, long nMax ) : 359 Pair( nMin, nMax ) 360 { 361 } 362 363 inline sal_Bool Selection::IsInside( long nIs ) const 364 { 365 return ((nA <= nIs) && (nIs < nB )); 366 } 367 368 inline void Selection::Justify() 369 { 370 if ( nA > nB ) 371 { 372 long nHelp = nA; 373 nA = nB; 374 nB = nHelp; 375 } 376 } 377 378 // ------------- 379 // - Rectangle - 380 // ------------- 381 382 #define RECT_EMPTY ((short)-32767) 383 384 class TOOLS_DLLPUBLIC Rectangle 385 { 386 public: 387 long nLeft; 388 long nTop; 389 long nRight; 390 long nBottom; 391 392 Rectangle(); 393 Rectangle( const Point& rLT, const Point& rRB ); 394 Rectangle( long nLeft, long nTop, 395 long nRight, long nBottom ); 396 Rectangle( const Point& rLT, const Size& rSize ); 397 398 long Left() const { return nLeft; } 399 long Right() const { return nRight; } 400 long Top() const { return nTop; } 401 long Bottom() const { return nBottom; } 402 403 long& Left() { return nLeft; } 404 long& Right() { return nRight; } 405 long& Top() { return nTop; } 406 long& Bottom() { return nBottom; } 407 408 inline Point TopLeft() const; 409 Point TopRight() const; 410 Point TopCenter() const; 411 Point BottomLeft() const; 412 Point BottomRight() const; 413 Point BottomCenter() const; 414 Point LeftCenter() const; 415 Point RightCenter() const; 416 Point Center() const; 417 418 void Move( long nHorzMove, long nVertMove ); 419 inline void Transpose(); 420 inline void SetPos( const Point& rPoint ); 421 void SetSize( const Size& rSize ); 422 inline Size GetSize() const; 423 424 long GetWidth() const; 425 long GetHeight() const; 426 427 Rectangle& Union( const Rectangle& rRect ); 428 Rectangle& Intersection( const Rectangle& rRect ); 429 Rectangle GetUnion( const Rectangle& rRect ) const; 430 Rectangle GetIntersection( const Rectangle& rRect ) const; 431 432 void Justify(); 433 434 sal_Bool IsInside( const Point& rPOINT ) const; 435 sal_Bool IsInside( const Rectangle& rRect ) const; 436 sal_Bool IsOver( const Rectangle& rRect ) const; 437 438 void SetEmpty() { nRight = nBottom = RECT_EMPTY; } 439 sal_Bool IsEmpty() const; 440 441 sal_Bool operator == ( const Rectangle& rRect ) const; 442 sal_Bool operator != ( const Rectangle& rRect ) const; 443 444 Rectangle& operator += ( const Point& rPt ); 445 Rectangle& operator -= ( const Point& rPt ); 446 447 #ifdef __BORLANDC__ 448 friend Rectangle operator + ( const Rectangle& rRect, const Point& rPt ); 449 friend Rectangle operator - ( const Rectangle& rRect, const Point& rPt ); 450 #else 451 friend inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt ); 452 friend inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt ); 453 #endif 454 455 TOOLS_DLLPUBLIC friend SvStream& operator>>( SvStream& rIStream, Rectangle& rRect ); 456 TOOLS_DLLPUBLIC friend SvStream& operator<<( SvStream& rOStream, const Rectangle& rRect ); 457 458 // ONE 459 long getX() const { return nLeft; } 460 long getY() const { return nTop; } 461 long getWidth() const { return nRight - nLeft; } 462 long getHeight() const { return nBottom - nTop; } 463 void setX( long n ) { nRight += n-nLeft; nLeft = n; } 464 void setY( long n ) { nBottom += n-nTop; nTop = n; } 465 void setWidth( long n ) { nRight = nLeft + n; } 466 void setHeight( long n ) { nBottom = nTop + n; } 467 }; 468 469 inline Rectangle::Rectangle() 470 { 471 nLeft = nTop = 0; 472 nRight = nBottom = RECT_EMPTY; 473 } 474 475 inline Rectangle::Rectangle( const Point& rLT, const Point& rRB ) 476 { 477 nLeft = rLT.X(); 478 nTop = rLT.Y(); 479 nRight = rRB.X(); 480 nBottom = rRB.Y(); 481 } 482 483 inline Rectangle::Rectangle( long _nLeft, long _nTop, 484 long _nRight, long _nBottom ) 485 { 486 nLeft = _nLeft; 487 nTop = _nTop; 488 nRight = _nRight; 489 nBottom = _nBottom; 490 } 491 492 inline Rectangle::Rectangle( const Point& rLT, const Size& rSize ) 493 { 494 nLeft = rLT.X(); 495 nTop = rLT.Y(); 496 nRight = rSize.Width() ? nLeft+rSize.Width()-1 : RECT_EMPTY; 497 nBottom = rSize.Height() ? nTop+rSize.Height()-1 : RECT_EMPTY; 498 } 499 500 inline sal_Bool Rectangle::IsEmpty() const 501 { 502 return ((nRight == RECT_EMPTY) || (nBottom == RECT_EMPTY)); 503 } 504 505 inline Point Rectangle::TopLeft() const 506 { 507 return Point( nLeft, nTop ); 508 } 509 510 inline Point Rectangle::TopRight() const 511 { 512 return Point( (nRight == RECT_EMPTY) ? nLeft : nRight, nTop ); 513 } 514 515 inline Point Rectangle::BottomLeft() const 516 { 517 return Point( nLeft, (nBottom == RECT_EMPTY) ? nTop : nBottom ); 518 } 519 520 inline Point Rectangle::BottomRight() const 521 { 522 return Point( (nRight == RECT_EMPTY) ? nLeft : nRight, 523 (nBottom == RECT_EMPTY) ? nTop : nBottom ); 524 } 525 526 inline Point Rectangle::TopCenter() const 527 { 528 if ( IsEmpty() ) 529 return Point( nLeft, nTop ); 530 else 531 return Point( Min( nLeft, nRight ) + Abs( (nRight - nLeft)/2 ), 532 Min( nTop, nBottom) ); 533 } 534 535 inline Point Rectangle::BottomCenter() const 536 { 537 if ( IsEmpty() ) 538 return Point( nLeft, nTop ); 539 else 540 return Point( Min( nLeft, nRight ) + Abs( (nRight - nLeft)/2 ), 541 Max( nTop, nBottom) ); 542 } 543 544 inline Point Rectangle::LeftCenter() const 545 { 546 if ( IsEmpty() ) 547 return Point( nLeft, nTop ); 548 else 549 return Point( Min( nLeft, nRight ), nTop + (nBottom - nTop)/2 ); 550 } 551 552 inline Point Rectangle::RightCenter() const 553 { 554 if ( IsEmpty() ) 555 return Point( nLeft, nTop ); 556 else 557 return Point( Max( nLeft, nRight ), nTop + (nBottom - nTop)/2 ); 558 } 559 560 inline Point Rectangle::Center() const 561 { 562 if ( IsEmpty() ) 563 return Point( nLeft, nTop ); 564 else 565 return Point( nLeft+(nRight-nLeft)/2 , nTop+(nBottom-nTop)/2 ); 566 } 567 568 inline void Rectangle::Move( long nHorzMove, long nVertMove ) 569 { 570 nLeft += nHorzMove; 571 nTop += nVertMove; 572 if ( nRight != RECT_EMPTY ) 573 nRight += nHorzMove; 574 if ( nBottom != RECT_EMPTY ) 575 nBottom += nVertMove; 576 } 577 578 void Rectangle::Transpose() 579 { 580 if ( !IsEmpty() ) 581 { 582 long swap( nLeft ); 583 nLeft = nTop; 584 nTop = swap; 585 586 swap = nRight; 587 nRight = nBottom; 588 nBottom = swap; 589 } 590 } 591 592 inline void Rectangle::SetPos( const Point& rPoint ) 593 { 594 if ( nRight != RECT_EMPTY ) 595 nRight += rPoint.X() - nLeft; 596 if ( nBottom != RECT_EMPTY ) 597 nBottom += rPoint.Y() - nTop; 598 nLeft = rPoint.X(); 599 nTop = rPoint.Y(); 600 } 601 602 inline long Rectangle::GetWidth() const 603 { 604 long n; 605 if ( nRight == RECT_EMPTY ) 606 n = 0; 607 else 608 { 609 n = nRight - nLeft; 610 if( n < 0 ) 611 n--; 612 else 613 n++; 614 } 615 616 return n; 617 } 618 619 inline long Rectangle::GetHeight() const 620 { 621 long n; 622 if ( nBottom == RECT_EMPTY ) 623 n = 0; 624 else 625 { 626 n = nBottom - nTop; 627 if ( n < 0 ) 628 n--; 629 else 630 n++; 631 } 632 633 return n; 634 } 635 636 inline Size Rectangle::GetSize() const 637 { 638 return Size( GetWidth(), GetHeight() ); 639 } 640 641 inline Rectangle Rectangle::GetUnion( const Rectangle& rRect ) const 642 { 643 Rectangle aTmpRect( *this ); 644 return aTmpRect.Union( rRect ); 645 } 646 647 inline Rectangle Rectangle::GetIntersection( const Rectangle& rRect ) const 648 { 649 Rectangle aTmpRect( *this ); 650 return aTmpRect.Intersection( rRect ); 651 } 652 653 inline sal_Bool Rectangle::operator == ( const Rectangle& rRect ) const 654 { 655 return ((nLeft == rRect.nLeft ) && 656 (nTop == rRect.nTop ) && 657 (nRight == rRect.nRight ) && 658 (nBottom == rRect.nBottom )); 659 } 660 661 inline sal_Bool Rectangle::operator != ( const Rectangle& rRect ) const 662 { 663 return ((nLeft != rRect.nLeft ) || 664 (nTop != rRect.nTop ) || 665 (nRight != rRect.nRight ) || 666 (nBottom != rRect.nBottom )); 667 } 668 669 inline Rectangle& Rectangle::operator +=( const Point& rPt ) 670 { 671 nLeft += rPt.X(); 672 nTop += rPt.Y(); 673 if ( nRight != RECT_EMPTY ) 674 nRight += rPt.X(); 675 if ( nBottom != RECT_EMPTY ) 676 nBottom += rPt.Y(); 677 return *this; 678 } 679 680 inline Rectangle& Rectangle::operator -= ( const Point& rPt ) 681 { 682 nLeft -= rPt.X(); 683 nTop -= rPt.Y(); 684 if ( nRight != RECT_EMPTY ) 685 nRight -= rPt.X(); 686 if ( nBottom != RECT_EMPTY ) 687 nBottom -= rPt.Y(); 688 return *this; 689 } 690 691 inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt ) 692 { 693 Rectangle aRect( rRect.nLeft + rPt.X(), rRect.nTop + rPt.Y(), 694 (rRect.nRight == RECT_EMPTY) ? RECT_EMPTY : rRect.nRight + rPt.X(), 695 (rRect.nBottom == RECT_EMPTY) ? RECT_EMPTY : rRect.nBottom + rPt.Y() ); 696 return aRect; 697 } 698 699 inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt ) 700 { 701 Rectangle aRect( rRect.nLeft - rPt.X(), 702 rRect.nTop - rPt.Y(), 703 (rRect.nRight == RECT_EMPTY) ? RECT_EMPTY : rRect.nRight - rPt.X(), 704 (rRect.nBottom == RECT_EMPTY) ? RECT_EMPTY : rRect.nBottom - rPt.Y() ); 705 return aRect; 706 } 707 708 #endif // _GEN_HXX 709