/tools/source/generic/gen.cxx
C++ | 661 lines | 484 code | 77 blank | 100 comment | 81 complexity | 7e7c7cbf021166dc3e7e834cc7f473b0 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, LGPL-3.0, AGPL-1.0, BSD-3-Clause-No-Nuclear-License-2014, GPL-3.0, GPL-2.0, BSD-3-Clause, LGPL-2.1
- /*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 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;
- 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 = (INT32)nNum;
- nNum = 0;
- i = i1+i2;
- while ( i > i1 )
- {
- i--;
- nNum <<= 8;
- nNum |= cAry[i];
- }
- if ( cId & 0x08 )
- nNum ^= 0xFFFFFFFF;
- rPair.nB = (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;
- UINT32 nNum;
- cAry[0] = 0;
- nNum = (UINT32)(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 = (UINT32)(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
- |*
- *************************************************************************/
- BOOL Rectangle::IsInside( const Point& rPoint ) const
- {
- if ( IsEmpty() )
- return FALSE;
- BOOL bRet = TRUE;
- if ( nLeft <= nRight )
- {
- if ( (rPoint.X() < nLeft) || (rPoint.X() > nRight) )
- bRet = FALSE;
- }
- else
- {
- if ( (rPoint.X() > nLeft) || (rPoint.X() < nRight) )
- bRet = FALSE;
- }
- if ( nTop <= nBottom )
- {
- if ( (rPoint.Y() < nTop) || (rPoint.Y() > nBottom) )
- bRet = FALSE;
- }
- else
- {
- if ( (rPoint.Y() > nTop) || (rPoint.Y() < nBottom) )
- bRet = FALSE;
- }
- return bRet;
- }
- /*************************************************************************
- |*
- |* Rectangle::IsInside()
- |*
- |* Beschreibung GEN.SDW
- |* Ersterstellung TH 19.03.90
- |* Letzte Aenderung MM 21.04.94
- |*
- *************************************************************************/
- BOOL Rectangle::IsInside( const Rectangle& rRect ) const
- {
- if ( IsInside( rRect.TopLeft() ) && IsInside( rRect.BottomRight() ) )
- return TRUE;
- else
- return FALSE;
- }
- /*************************************************************************
- |*
- |* Rectangle::IsOver()
- |*
- |* Beschreibung GEN.SDW
- |* Ersterstellung TH 19.03.90
- |* Letzte Aenderung MM 21.04.94
- |*
- *************************************************************************/
- 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;
- 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 = (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 = (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 = (INT32)nNum;
- nNum = 0;
- i = iLast+i4;
- while ( i > iLast )
- {
- i--;
- nNum <<= 8;
- nNum |= cAry[i];
- }
- if ( cIdAry[1] & 0x08 )
- nNum ^= 0xFFFFFFFF;
- rRect.nBottom = (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;
- UINT32 nNum;
- cAry[0] = 0;
- cAry[1] = 0;
- nNum = (UINT32)(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 = (UINT32)(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 = (UINT32)(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 = (UINT32)(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;
- }