/************************************************************** * * 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 #include #include // ======================================================================= 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; }