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 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_tools.hxx" 26 #include <tools/debug.hxx> 27 #include <tools/gen.hxx> 28 #include <tools/stream.hxx> 29 30 // ======================================================================= 31 32 SvStream& operator>>( SvStream& rIStream, Pair& rPair ) 33 { 34 DBG_ASSERTWARNING( rIStream.GetVersion(), "Pair::>> - Solar-Version not set on rIStream" ); 35 36 if ( rIStream.GetCompressMode() == COMPRESSMODE_FULL ) 37 { 38 unsigned char cId; 39 unsigned char cAry[8]; 40 int i; 41 int i1; 42 int i2; 43 sal_uInt32 nNum; 44 45 rIStream >> cId; 46 i1 = (cId & 0x70) >> 4; 47 i2 = cId & 0x07; 48 rIStream.Read( cAry, i1+i2 ); 49 50 nNum = 0; 51 i = i1; 52 while ( i ) 53 { 54 i--; 55 nNum <<= 8; 56 nNum |= cAry[i]; 57 } 58 if ( cId & 0x80 ) 59 nNum ^= 0xFFFFFFFF; 60 rPair.nA = (sal_Int32)nNum; 61 62 nNum = 0; 63 i = i1+i2; 64 while ( i > i1 ) 65 { 66 i--; 67 nNum <<= 8; 68 nNum |= cAry[i]; 69 } 70 if ( cId & 0x08 ) 71 nNum ^= 0xFFFFFFFF; 72 rPair.nB = (sal_Int32)nNum; 73 } 74 else 75 { 76 rIStream >> rPair.nA >> rPair.nB; 77 } 78 79 return rIStream; 80 } 81 82 // ----------------------------------------------------------------------- 83 84 SvStream& operator<<( SvStream& rOStream, const Pair& rPair ) 85 { 86 DBG_ASSERTWARNING( rOStream.GetVersion(), "Pair::<< - Solar-Version not set on rOStream" ); 87 88 if ( rOStream.GetCompressMode() == COMPRESSMODE_FULL ) 89 { 90 unsigned char cAry[9]; 91 int i = 1; 92 sal_uInt32 nNum; 93 94 cAry[0] = 0; 95 96 nNum = (sal_uInt32)(sal_Int32)rPair.nA; 97 if ( rPair.nA < 0 ) 98 { 99 cAry[0] |= 0x80; 100 nNum ^= 0xFFFFFFFF; 101 } 102 if ( nNum ) 103 { 104 cAry[i] = (unsigned char)(nNum & 0xFF); 105 nNum >>= 8; 106 i++; 107 108 if ( nNum ) 109 { 110 cAry[i] = (unsigned char)(nNum & 0xFF); 111 nNum >>= 8; 112 i++; 113 114 if ( nNum ) 115 { 116 cAry[i] = (unsigned char)(nNum & 0xFF); 117 nNum >>= 8; 118 i++; 119 120 if ( nNum ) 121 { 122 cAry[i] = (unsigned char)(nNum & 0xFF); 123 nNum >>= 8; 124 i++; 125 cAry[0] |= 0x40; 126 } 127 else 128 cAry[0] |= 0x30; 129 } 130 else 131 cAry[0] |= 0x20; 132 } 133 else 134 cAry[0] |= 0x10; 135 } 136 137 nNum = (sal_uInt32)(sal_Int32)rPair.nB; 138 if ( rPair.nB < 0 ) 139 { 140 cAry[0] |= 0x08; 141 nNum ^= 0xFFFFFFFF; 142 } 143 if ( nNum ) 144 { 145 cAry[i] = (unsigned char)(nNum & 0xFF); 146 nNum >>= 8; 147 i++; 148 149 if ( nNum ) 150 { 151 cAry[i] = (unsigned char)(nNum & 0xFF); 152 nNum >>= 8; 153 i++; 154 155 if ( nNum ) 156 { 157 cAry[i] = (unsigned char)(nNum & 0xFF); 158 nNum >>= 8; 159 i++; 160 161 if ( nNum ) 162 { 163 cAry[i] = (unsigned char)(nNum & 0xFF); 164 nNum >>= 8; 165 i++; 166 cAry[0] |= 0x04; 167 } 168 else 169 cAry[0] |= 0x03; 170 } 171 else 172 cAry[0] |= 0x02; 173 } 174 else 175 cAry[0] |= 0x01; 176 } 177 178 rOStream.Write( cAry, i ); 179 } 180 else 181 { 182 rOStream << rPair.nA << rPair.nB; 183 } 184 185 return rOStream; 186 } 187 188 /************************************************************************* 189 |* 190 |* Rectangle::SetSize() 191 |* 192 |* Beschreibung GEN.SDW 193 |* Ersterstellung DV 29.10.91 194 |* Letzte Aenderung MM 21.04.94 195 |* 196 *************************************************************************/ 197 198 void Rectangle::SetSize( const Size& rSize ) 199 { 200 if ( rSize.Width() < 0 ) 201 nRight = nLeft + rSize.Width() +1; 202 else if ( rSize.Width() > 0 ) 203 nRight = nLeft + rSize.Width() -1; 204 else 205 nRight = RECT_EMPTY; 206 207 if ( rSize.Height() < 0 ) 208 nBottom = nTop + rSize.Height() +1; 209 else if ( rSize.Height() > 0 ) 210 nBottom = nTop + rSize.Height() -1; 211 else 212 nBottom = RECT_EMPTY; 213 } 214 215 /************************************************************************* 216 |* 217 |* Rectangle::Union() 218 |* 219 |* Beschreibung GEN.SDW 220 |* Ersterstellung TH 20.10.92 221 |* Letzte Aenderung MM 21.04.94 222 |* 223 *************************************************************************/ 224 225 Rectangle& Rectangle::Union( const Rectangle& rRect ) 226 { 227 if ( rRect.IsEmpty() ) 228 return *this; 229 230 if ( IsEmpty() ) 231 *this = rRect; 232 else 233 { 234 nLeft = Min( Min( nLeft, rRect.nLeft ), Min( nRight, rRect.nRight ) ); 235 nRight = Max( Max( nLeft, rRect.nLeft ), Max( nRight, rRect.nRight ) ); 236 nTop = Min( Min( nTop, rRect.nTop ), Min( nBottom, rRect.nBottom ) ); 237 nBottom = Max( Max( nTop, rRect.nTop ), Max( nBottom, rRect.nBottom ) ); 238 } 239 240 return *this; 241 } 242 243 /************************************************************************* 244 |* 245 |* Rectangle::Intersection() 246 |* 247 |* Beschreibung GEN.SDW 248 |* Ersterstellung TH 20.10.92 249 |* Letzte Aenderung MM 21.04.94 250 |* 251 *************************************************************************/ 252 253 Rectangle& Rectangle::Intersection( const Rectangle& rRect ) 254 { 255 if ( IsEmpty() ) 256 return *this; 257 if ( rRect.IsEmpty() ) 258 { 259 *this = Rectangle(); 260 return *this; 261 } 262 263 // nicht mit umgedrehten Rechtecken arbeiten 264 Rectangle aTmpRect( rRect ); 265 Justify(); 266 aTmpRect.Justify(); 267 268 // Schnitt bilden 269 nLeft = Max( nLeft, aTmpRect.nLeft ); 270 nRight = Min( nRight, aTmpRect.nRight ); 271 nTop = Max( nTop, aTmpRect.nTop ); 272 nBottom= Min( nBottom, aTmpRect.nBottom ); 273 274 // Feststellen ob Schnitt leer 275 if ( nRight < nLeft || nBottom < nTop ) 276 *this = Rectangle(); 277 278 return *this; 279 } 280 281 /************************************************************************* 282 |* 283 |* Rectangle::Justify() 284 |* 285 |* Beschreibung GEN.SDW 286 |* Ersterstellung DV 07.03.91 287 |* Letzte Aenderung DV 07.03.91 288 |* 289 *************************************************************************/ 290 291 void Rectangle::Justify() 292 { 293 long nHelp; 294 295 // Abfrage, ob Right kleiner Left 296 if ( (nRight < nLeft) && (nRight != RECT_EMPTY) ) 297 { 298 nHelp = nLeft; 299 nLeft = nRight; 300 nRight = nHelp; 301 } 302 303 // Abfrage, ob Bottom kleiner Top 304 if ( (nBottom < nTop) && (nBottom != RECT_EMPTY) ) 305 { 306 nHelp = nBottom; 307 nBottom = nTop; 308 nTop = nHelp; 309 } 310 } 311 312 /************************************************************************* 313 |* 314 |* Rectangle::IsInside() 315 |* 316 |* Beschreibung GEN.SDW 317 |* Ersterstellung TH 19.03.90 318 |* Letzte Aenderung MM 21.04.94 319 |* 320 *************************************************************************/ 321 322 sal_Bool Rectangle::IsInside( const Point& rPoint ) const 323 { 324 if ( IsEmpty() ) 325 return sal_False; 326 327 sal_Bool bRet = sal_True; 328 if ( nLeft <= nRight ) 329 { 330 if ( (rPoint.X() < nLeft) || (rPoint.X() > nRight) ) 331 bRet = sal_False; 332 } 333 else 334 { 335 if ( (rPoint.X() > nLeft) || (rPoint.X() < nRight) ) 336 bRet = sal_False; 337 } 338 if ( nTop <= nBottom ) 339 { 340 if ( (rPoint.Y() < nTop) || (rPoint.Y() > nBottom) ) 341 bRet = sal_False; 342 } 343 else 344 { 345 if ( (rPoint.Y() > nTop) || (rPoint.Y() < nBottom) ) 346 bRet = sal_False; 347 } 348 return bRet; 349 } 350 351 /************************************************************************* 352 |* 353 |* Rectangle::IsInside() 354 |* 355 |* Beschreibung GEN.SDW 356 |* Ersterstellung TH 19.03.90 357 |* Letzte Aenderung MM 21.04.94 358 |* 359 *************************************************************************/ 360 361 sal_Bool Rectangle::IsInside( const Rectangle& rRect ) const 362 { 363 if ( IsInside( rRect.TopLeft() ) && IsInside( rRect.BottomRight() ) ) 364 return sal_True; 365 else 366 return sal_False; 367 } 368 369 /************************************************************************* 370 |* 371 |* Rectangle::IsOver() 372 |* 373 |* Beschreibung GEN.SDW 374 |* Ersterstellung TH 19.03.90 375 |* Letzte Aenderung MM 21.04.94 376 |* 377 *************************************************************************/ 378 379 sal_Bool Rectangle::IsOver( const Rectangle& rRect ) const 380 { 381 // Wenn sie sich nicht schneiden, ueberlappen sie auch nicht 382 return !GetIntersection( rRect ).IsEmpty(); 383 } 384 385 // ======================================================================= 386 387 SvStream& operator>>( SvStream& rIStream, Rectangle& rRect ) 388 { 389 DBG_ASSERTWARNING( rIStream.GetVersion(), "Rectangle::>> - Solar-Version not set on rIStream" ); 390 391 if ( rIStream.GetCompressMode() == COMPRESSMODE_FULL ) 392 { 393 unsigned char cIdAry[2]; 394 unsigned char cAry[16]; 395 int i; 396 int iLast; 397 int i1; 398 int i2; 399 int i3; 400 int i4; 401 sal_uInt32 nNum; 402 403 rIStream.Read( cIdAry, 2 ); 404 i1 = (cIdAry[0] & 0x70) >> 4; 405 i2 = cIdAry[0] & 0x07; 406 i3 = (cIdAry[1] & 0x70) >> 4; 407 i4 = cIdAry[1] & 0x07; 408 rIStream.Read( cAry, i1+i2+i3+i4 ); 409 410 nNum = 0; 411 i = i1; 412 iLast = i; 413 while ( i ) 414 { 415 i--; 416 nNum <<= 8; 417 nNum |= cAry[i]; 418 } 419 iLast = i1; 420 if ( cIdAry[0] & 0x80 ) 421 nNum ^= 0xFFFFFFFF; 422 rRect.nLeft = (sal_Int32)nNum; 423 424 nNum = 0; 425 i = iLast+i2; 426 while ( i > iLast ) 427 { 428 i--; 429 nNum <<= 8; 430 nNum |= cAry[i]; 431 } 432 iLast += i2; 433 if ( cIdAry[0] & 0x08 ) 434 nNum ^= 0xFFFFFFFF; 435 rRect.nTop = (sal_Int32)nNum; 436 437 nNum = 0; 438 i = iLast+i3; 439 while ( i > iLast ) 440 { 441 i--; 442 nNum <<= 8; 443 nNum |= cAry[i]; 444 } 445 iLast += i3; 446 if ( cIdAry[1] & 0x80 ) 447 nNum ^= 0xFFFFFFFF; 448 rRect.nRight = (sal_Int32)nNum; 449 450 nNum = 0; 451 i = iLast+i4; 452 while ( i > iLast ) 453 { 454 i--; 455 nNum <<= 8; 456 nNum |= cAry[i]; 457 } 458 if ( cIdAry[1] & 0x08 ) 459 nNum ^= 0xFFFFFFFF; 460 rRect.nBottom = (sal_Int32)nNum; 461 } 462 else 463 { 464 rIStream >> rRect.nLeft >> rRect.nTop >> rRect.nRight >> rRect.nBottom; 465 } 466 467 return rIStream; 468 } 469 470 // ----------------------------------------------------------------------- 471 472 SvStream& operator<<( SvStream& rOStream, const Rectangle& rRect ) 473 { 474 DBG_ASSERTWARNING( rOStream.GetVersion(), "Rectangle::<< - Solar-Version not set on rOStream" ); 475 476 if ( rOStream.GetCompressMode() == COMPRESSMODE_FULL ) 477 { 478 unsigned char cAry[18]; 479 int i = 2; 480 sal_uInt32 nNum; 481 482 cAry[0] = 0; 483 cAry[1] = 0; 484 485 nNum = (sal_uInt32)(sal_Int32)rRect.nLeft; 486 if ( rRect.nLeft < 0 ) 487 { 488 cAry[0] |= 0x80; 489 nNum ^= 0xFFFFFFFF; 490 } 491 if ( nNum ) 492 { 493 cAry[i] = (unsigned char)(nNum & 0xFF); 494 nNum >>= 8; 495 i++; 496 497 if ( nNum ) 498 { 499 cAry[i] = (unsigned char)(nNum & 0xFF); 500 nNum >>= 8; 501 i++; 502 503 if ( nNum ) 504 { 505 cAry[i] = (unsigned char)(nNum & 0xFF); 506 nNum >>= 8; 507 i++; 508 509 if ( nNum ) 510 { 511 cAry[i] = (unsigned char)(nNum & 0xFF); 512 nNum >>= 8; 513 i++; 514 cAry[0] |= 0x40; 515 } 516 else 517 cAry[0] |= 0x30; 518 } 519 else 520 cAry[0] |= 0x20; 521 } 522 else 523 cAry[0] |= 0x10; 524 } 525 526 nNum = (sal_uInt32)(sal_Int32)rRect.nTop; 527 if ( rRect.nTop < 0 ) 528 { 529 cAry[0] |= 0x08; 530 nNum ^= 0xFFFFFFFF; 531 } 532 if ( nNum ) 533 { 534 cAry[i] = (unsigned char)(nNum & 0xFF); 535 nNum >>= 8; 536 i++; 537 538 if ( nNum ) 539 { 540 cAry[i] = (unsigned char)(nNum & 0xFF); 541 nNum >>= 8; 542 i++; 543 544 if ( nNum ) 545 { 546 cAry[i] = (unsigned char)(nNum & 0xFF); 547 nNum >>= 8; 548 i++; 549 550 if ( nNum ) 551 { 552 cAry[i] = (unsigned char)(nNum & 0xFF); 553 nNum >>= 8; 554 i++; 555 cAry[0] |= 0x04; 556 } 557 else 558 cAry[0] |= 0x03; 559 } 560 else 561 cAry[0] |= 0x02; 562 } 563 else 564 cAry[0] |= 0x01; 565 } 566 567 nNum = (sal_uInt32)(sal_Int32)rRect.nRight; 568 if ( rRect.nRight < 0 ) 569 { 570 cAry[1] |= 0x80; 571 nNum ^= 0xFFFFFFFF; 572 } 573 if ( nNum ) 574 { 575 cAry[i] = (unsigned char)(nNum & 0xFF); 576 nNum >>= 8; 577 i++; 578 579 if ( nNum ) 580 { 581 cAry[i] = (unsigned char)(nNum & 0xFF); 582 nNum >>= 8; 583 i++; 584 585 if ( nNum ) 586 { 587 cAry[i] = (unsigned char)(nNum & 0xFF); 588 nNum >>= 8; 589 i++; 590 591 if ( nNum ) 592 { 593 cAry[i] = (unsigned char)(nNum & 0xFF); 594 nNum >>= 8; 595 i++; 596 cAry[1] |= 0x40; 597 } 598 else 599 cAry[1] |= 0x30; 600 } 601 else 602 cAry[1] |= 0x20; 603 } 604 else 605 cAry[1] |= 0x10; 606 } 607 608 nNum = (sal_uInt32)(sal_Int32)rRect.nBottom; 609 if ( rRect.nBottom < 0 ) 610 { 611 cAry[1] |= 0x08; 612 nNum ^= 0xFFFFFFFF; 613 } 614 if ( nNum ) 615 { 616 cAry[i] = (unsigned char)(nNum & 0xFF); 617 nNum >>= 8; 618 i++; 619 620 if ( nNum ) 621 { 622 cAry[i] = (unsigned char)(nNum & 0xFF); 623 nNum >>= 8; 624 i++; 625 626 if ( nNum ) 627 { 628 cAry[i] = (unsigned char)(nNum & 0xFF); 629 nNum >>= 8; 630 i++; 631 632 if ( nNum ) 633 { 634 cAry[i] = (unsigned char)(nNum & 0xFF); 635 nNum >>= 8; 636 i++; 637 cAry[1] |= 0x04; 638 } 639 else 640 cAry[1] |= 0x03; 641 } 642 else 643 cAry[1] |= 0x02; 644 } 645 else 646 cAry[1] |= 0x01; 647 } 648 649 rOStream.Write( cAry, i ); 650 } 651 else 652 { 653 rOStream << rRect.nLeft << rRect.nTop << rRect.nRight << rRect.nBottom; 654 } 655 656 return rOStream; 657 } 658