| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_tools.hxx" |
| #include <tools/debug.hxx> |
| #include <tools/gen.hxx> |
| #include <tools/stream.hxx> |
| |
| // ======================================================================= |
| |
| SvStream& operator>>( SvStream& rIStream, Pair& rPair ) |
| { |
| DBG_ASSERTWARNING( rIStream.GetVersion(), "Pair::>> - Solar-Version not set on rIStream" ); |
| |
| if ( rIStream.GetCompressMode() == COMPRESSMODE_FULL ) |
| { |
| unsigned char cId; |
| unsigned char cAry[8]; |
| int i; |
| int i1; |
| int i2; |
| sal_uInt32 nNum; |
| |
| rIStream >> cId; |
| i1 = (cId & 0x70) >> 4; |
| i2 = cId & 0x07; |
| rIStream.Read( cAry, i1+i2 ); |
| |
| nNum = 0; |
| i = i1; |
| while ( i ) |
| { |
| i--; |
| nNum <<= 8; |
| nNum |= cAry[i]; |
| } |
| if ( cId & 0x80 ) |
| nNum ^= 0xFFFFFFFF; |
| rPair.nA = (sal_Int32)nNum; |
| |
| nNum = 0; |
| i = i1+i2; |
| while ( i > i1 ) |
| { |
| i--; |
| nNum <<= 8; |
| nNum |= cAry[i]; |
| } |
| if ( cId & 0x08 ) |
| nNum ^= 0xFFFFFFFF; |
| rPair.nB = (sal_Int32)nNum; |
| } |
| else |
| { |
| rIStream >> rPair.nA >> rPair.nB; |
| } |
| |
| return rIStream; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SvStream& operator<<( SvStream& rOStream, const Pair& rPair ) |
| { |
| DBG_ASSERTWARNING( rOStream.GetVersion(), "Pair::<< - Solar-Version not set on rOStream" ); |
| |
| if ( rOStream.GetCompressMode() == COMPRESSMODE_FULL ) |
| { |
| unsigned char cAry[9]; |
| int i = 1; |
| sal_uInt32 nNum; |
| |
| cAry[0] = 0; |
| |
| nNum = (sal_uInt32)(sal_Int32)rPair.nA; |
| if ( rPair.nA < 0 ) |
| { |
| cAry[0] |= 0x80; |
| nNum ^= 0xFFFFFFFF; |
| } |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| cAry[0] |= 0x40; |
| } |
| else |
| cAry[0] |= 0x30; |
| } |
| else |
| cAry[0] |= 0x20; |
| } |
| else |
| cAry[0] |= 0x10; |
| } |
| |
| nNum = (sal_uInt32)(sal_Int32)rPair.nB; |
| if ( rPair.nB < 0 ) |
| { |
| cAry[0] |= 0x08; |
| nNum ^= 0xFFFFFFFF; |
| } |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| cAry[0] |= 0x04; |
| } |
| else |
| cAry[0] |= 0x03; |
| } |
| else |
| cAry[0] |= 0x02; |
| } |
| else |
| cAry[0] |= 0x01; |
| } |
| |
| rOStream.Write( cAry, i ); |
| } |
| else |
| { |
| rOStream << rPair.nA << rPair.nB; |
| } |
| |
| return rOStream; |
| } |
| |
| /************************************************************************* |
| |* |
| |* Rectangle::SetSize() |
| |* |
| |* Beschreibung GEN.SDW |
| |* Ersterstellung DV 29.10.91 |
| |* Letzte Aenderung MM 21.04.94 |
| |* |
| *************************************************************************/ |
| |
| void Rectangle::SetSize( const Size& rSize ) |
| { |
| if ( rSize.Width() < 0 ) |
| nRight = nLeft + rSize.Width() +1; |
| else if ( rSize.Width() > 0 ) |
| nRight = nLeft + rSize.Width() -1; |
| else |
| nRight = RECT_EMPTY; |
| |
| if ( rSize.Height() < 0 ) |
| nBottom = nTop + rSize.Height() +1; |
| else if ( rSize.Height() > 0 ) |
| nBottom = nTop + rSize.Height() -1; |
| else |
| nBottom = RECT_EMPTY; |
| } |
| |
| /************************************************************************* |
| |* |
| |* Rectangle::Union() |
| |* |
| |* Beschreibung GEN.SDW |
| |* Ersterstellung TH 20.10.92 |
| |* Letzte Aenderung MM 21.04.94 |
| |* |
| *************************************************************************/ |
| |
| Rectangle& Rectangle::Union( const Rectangle& rRect ) |
| { |
| if ( rRect.IsEmpty() ) |
| return *this; |
| |
| if ( IsEmpty() ) |
| *this = rRect; |
| else |
| { |
| nLeft = Min( Min( nLeft, rRect.nLeft ), Min( nRight, rRect.nRight ) ); |
| nRight = Max( Max( nLeft, rRect.nLeft ), Max( nRight, rRect.nRight ) ); |
| nTop = Min( Min( nTop, rRect.nTop ), Min( nBottom, rRect.nBottom ) ); |
| nBottom = Max( Max( nTop, rRect.nTop ), Max( nBottom, rRect.nBottom ) ); |
| } |
| |
| return *this; |
| } |
| |
| /************************************************************************* |
| |* |
| |* Rectangle::Intersection() |
| |* |
| |* Beschreibung GEN.SDW |
| |* Ersterstellung TH 20.10.92 |
| |* Letzte Aenderung MM 21.04.94 |
| |* |
| *************************************************************************/ |
| |
| Rectangle& Rectangle::Intersection( const Rectangle& rRect ) |
| { |
| if ( IsEmpty() ) |
| return *this; |
| if ( rRect.IsEmpty() ) |
| { |
| *this = Rectangle(); |
| return *this; |
| } |
| |
| // nicht mit umgedrehten Rechtecken arbeiten |
| Rectangle aTmpRect( rRect ); |
| Justify(); |
| aTmpRect.Justify(); |
| |
| // Schnitt bilden |
| nLeft = Max( nLeft, aTmpRect.nLeft ); |
| nRight = Min( nRight, aTmpRect.nRight ); |
| nTop = Max( nTop, aTmpRect.nTop ); |
| nBottom= Min( nBottom, aTmpRect.nBottom ); |
| |
| // Feststellen ob Schnitt leer |
| if ( nRight < nLeft || nBottom < nTop ) |
| *this = Rectangle(); |
| |
| return *this; |
| } |
| |
| /************************************************************************* |
| |* |
| |* Rectangle::Justify() |
| |* |
| |* Beschreibung GEN.SDW |
| |* Ersterstellung DV 07.03.91 |
| |* Letzte Aenderung DV 07.03.91 |
| |* |
| *************************************************************************/ |
| |
| void Rectangle::Justify() |
| { |
| long nHelp; |
| |
| // Abfrage, ob Right kleiner Left |
| if ( (nRight < nLeft) && (nRight != RECT_EMPTY) ) |
| { |
| nHelp = nLeft; |
| nLeft = nRight; |
| nRight = nHelp; |
| } |
| |
| // Abfrage, ob Bottom kleiner Top |
| if ( (nBottom < nTop) && (nBottom != RECT_EMPTY) ) |
| { |
| nHelp = nBottom; |
| nBottom = nTop; |
| nTop = nHelp; |
| } |
| } |
| |
| /************************************************************************* |
| |* |
| |* Rectangle::IsInside() |
| |* |
| |* Beschreibung GEN.SDW |
| |* Ersterstellung TH 19.03.90 |
| |* Letzte Aenderung MM 21.04.94 |
| |* |
| *************************************************************************/ |
| |
| sal_Bool Rectangle::IsInside( const Point& rPoint ) const |
| { |
| if ( IsEmpty() ) |
| return sal_False; |
| |
| sal_Bool bRet = sal_True; |
| if ( nLeft <= nRight ) |
| { |
| if ( (rPoint.X() < nLeft) || (rPoint.X() > nRight) ) |
| bRet = sal_False; |
| } |
| else |
| { |
| if ( (rPoint.X() > nLeft) || (rPoint.X() < nRight) ) |
| bRet = sal_False; |
| } |
| if ( nTop <= nBottom ) |
| { |
| if ( (rPoint.Y() < nTop) || (rPoint.Y() > nBottom) ) |
| bRet = sal_False; |
| } |
| else |
| { |
| if ( (rPoint.Y() > nTop) || (rPoint.Y() < nBottom) ) |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| /************************************************************************* |
| |* |
| |* Rectangle::IsInside() |
| |* |
| |* Beschreibung GEN.SDW |
| |* Ersterstellung TH 19.03.90 |
| |* Letzte Aenderung MM 21.04.94 |
| |* |
| *************************************************************************/ |
| |
| sal_Bool Rectangle::IsInside( const Rectangle& rRect ) const |
| { |
| if ( IsInside( rRect.TopLeft() ) && IsInside( rRect.BottomRight() ) ) |
| return sal_True; |
| else |
| return sal_False; |
| } |
| |
| /************************************************************************* |
| |* |
| |* Rectangle::IsOver() |
| |* |
| |* Beschreibung GEN.SDW |
| |* Ersterstellung TH 19.03.90 |
| |* Letzte Aenderung MM 21.04.94 |
| |* |
| *************************************************************************/ |
| |
| sal_Bool Rectangle::IsOver( const Rectangle& rRect ) const |
| { |
| // Wenn sie sich nicht schneiden, ueberlappen sie auch nicht |
| return !GetIntersection( rRect ).IsEmpty(); |
| } |
| |
| // ======================================================================= |
| |
| SvStream& operator>>( SvStream& rIStream, Rectangle& rRect ) |
| { |
| DBG_ASSERTWARNING( rIStream.GetVersion(), "Rectangle::>> - Solar-Version not set on rIStream" ); |
| |
| if ( rIStream.GetCompressMode() == COMPRESSMODE_FULL ) |
| { |
| unsigned char cIdAry[2]; |
| unsigned char cAry[16]; |
| int i; |
| int iLast; |
| int i1; |
| int i2; |
| int i3; |
| int i4; |
| sal_uInt32 nNum; |
| |
| rIStream.Read( cIdAry, 2 ); |
| i1 = (cIdAry[0] & 0x70) >> 4; |
| i2 = cIdAry[0] & 0x07; |
| i3 = (cIdAry[1] & 0x70) >> 4; |
| i4 = cIdAry[1] & 0x07; |
| rIStream.Read( cAry, i1+i2+i3+i4 ); |
| |
| nNum = 0; |
| i = i1; |
| iLast = i; |
| while ( i ) |
| { |
| i--; |
| nNum <<= 8; |
| nNum |= cAry[i]; |
| } |
| iLast = i1; |
| if ( cIdAry[0] & 0x80 ) |
| nNum ^= 0xFFFFFFFF; |
| rRect.nLeft = (sal_Int32)nNum; |
| |
| nNum = 0; |
| i = iLast+i2; |
| while ( i > iLast ) |
| { |
| i--; |
| nNum <<= 8; |
| nNum |= cAry[i]; |
| } |
| iLast += i2; |
| if ( cIdAry[0] & 0x08 ) |
| nNum ^= 0xFFFFFFFF; |
| rRect.nTop = (sal_Int32)nNum; |
| |
| nNum = 0; |
| i = iLast+i3; |
| while ( i > iLast ) |
| { |
| i--; |
| nNum <<= 8; |
| nNum |= cAry[i]; |
| } |
| iLast += i3; |
| if ( cIdAry[1] & 0x80 ) |
| nNum ^= 0xFFFFFFFF; |
| rRect.nRight = (sal_Int32)nNum; |
| |
| nNum = 0; |
| i = iLast+i4; |
| while ( i > iLast ) |
| { |
| i--; |
| nNum <<= 8; |
| nNum |= cAry[i]; |
| } |
| if ( cIdAry[1] & 0x08 ) |
| nNum ^= 0xFFFFFFFF; |
| rRect.nBottom = (sal_Int32)nNum; |
| } |
| else |
| { |
| rIStream >> rRect.nLeft >> rRect.nTop >> rRect.nRight >> rRect.nBottom; |
| } |
| |
| return rIStream; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SvStream& operator<<( SvStream& rOStream, const Rectangle& rRect ) |
| { |
| DBG_ASSERTWARNING( rOStream.GetVersion(), "Rectangle::<< - Solar-Version not set on rOStream" ); |
| |
| if ( rOStream.GetCompressMode() == COMPRESSMODE_FULL ) |
| { |
| unsigned char cAry[18]; |
| int i = 2; |
| sal_uInt32 nNum; |
| |
| cAry[0] = 0; |
| cAry[1] = 0; |
| |
| nNum = (sal_uInt32)(sal_Int32)rRect.nLeft; |
| if ( rRect.nLeft < 0 ) |
| { |
| cAry[0] |= 0x80; |
| nNum ^= 0xFFFFFFFF; |
| } |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| cAry[0] |= 0x40; |
| } |
| else |
| cAry[0] |= 0x30; |
| } |
| else |
| cAry[0] |= 0x20; |
| } |
| else |
| cAry[0] |= 0x10; |
| } |
| |
| nNum = (sal_uInt32)(sal_Int32)rRect.nTop; |
| if ( rRect.nTop < 0 ) |
| { |
| cAry[0] |= 0x08; |
| nNum ^= 0xFFFFFFFF; |
| } |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| cAry[0] |= 0x04; |
| } |
| else |
| cAry[0] |= 0x03; |
| } |
| else |
| cAry[0] |= 0x02; |
| } |
| else |
| cAry[0] |= 0x01; |
| } |
| |
| nNum = (sal_uInt32)(sal_Int32)rRect.nRight; |
| if ( rRect.nRight < 0 ) |
| { |
| cAry[1] |= 0x80; |
| nNum ^= 0xFFFFFFFF; |
| } |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| cAry[1] |= 0x40; |
| } |
| else |
| cAry[1] |= 0x30; |
| } |
| else |
| cAry[1] |= 0x20; |
| } |
| else |
| cAry[1] |= 0x10; |
| } |
| |
| nNum = (sal_uInt32)(sal_Int32)rRect.nBottom; |
| if ( rRect.nBottom < 0 ) |
| { |
| cAry[1] |= 0x08; |
| nNum ^= 0xFFFFFFFF; |
| } |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| |
| if ( nNum ) |
| { |
| cAry[i] = (unsigned char)(nNum & 0xFF); |
| nNum >>= 8; |
| i++; |
| cAry[1] |= 0x04; |
| } |
| else |
| cAry[1] |= 0x03; |
| } |
| else |
| cAry[1] |= 0x02; |
| } |
| else |
| cAry[1] |= 0x01; |
| } |
| |
| rOStream.Write( cAry, i ); |
| } |
| else |
| { |
| rOStream << rRect.nLeft << rRect.nTop << rRect.nRight << rRect.nBottom; |
| } |
| |
| return rOStream; |
| } |