662 lines
17 KiB
C++
662 lines
17 KiB
C++
/*************************************************************************
|
|
*
|
|
* 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;
|
|
}
|