loplugin:flatten in vcl/gdi
Change-Id: Ief1736264e62acfac3a9a83c54dc564c03d6fba9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100034 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
parent
ce47b1a9c6
commit
750a6bddf1
@ -769,45 +769,45 @@ void GenericSalLayout::ApplyDXArray(const ImplLayoutArgs& rArgs)
|
||||
}
|
||||
|
||||
// Insert Kashida glyphs.
|
||||
if (bKashidaJustify && !pKashidas.empty())
|
||||
if (!bKashidaJustify || pKashidas.empty())
|
||||
return;
|
||||
|
||||
size_t nInserted = 0;
|
||||
for (auto const& pKashida : pKashidas)
|
||||
{
|
||||
size_t nInserted = 0;
|
||||
for (auto const& pKashida : pKashidas)
|
||||
auto pGlyphIter = m_GlyphItems.Impl()->begin() + nInserted + pKashida.first;
|
||||
|
||||
// The total Kashida width.
|
||||
DeviceCoordinate nTotalWidth = pKashida.second;
|
||||
|
||||
// Number of times to repeat each Kashida.
|
||||
int nCopies = 1;
|
||||
if (nTotalWidth > nKashidaWidth)
|
||||
nCopies = nTotalWidth / nKashidaWidth;
|
||||
|
||||
// See if we can improve the fit by adding an extra Kashidas and
|
||||
// squeezing them together a bit.
|
||||
DeviceCoordinate nOverlap = 0;
|
||||
DeviceCoordinate nShortfall = nTotalWidth - nKashidaWidth * nCopies;
|
||||
if (nShortfall > 0)
|
||||
{
|
||||
auto pGlyphIter = m_GlyphItems.Impl()->begin() + nInserted + pKashida.first;
|
||||
++nCopies;
|
||||
DeviceCoordinate nExcess = nCopies * nKashidaWidth - nTotalWidth;
|
||||
if (nExcess > 0)
|
||||
nOverlap = nExcess / (nCopies - 1);
|
||||
}
|
||||
|
||||
// The total Kashida width.
|
||||
DeviceCoordinate nTotalWidth = pKashida.second;
|
||||
|
||||
// Number of times to repeat each Kashida.
|
||||
int nCopies = 1;
|
||||
if (nTotalWidth > nKashidaWidth)
|
||||
nCopies = nTotalWidth / nKashidaWidth;
|
||||
|
||||
// See if we can improve the fit by adding an extra Kashidas and
|
||||
// squeezing them together a bit.
|
||||
DeviceCoordinate nOverlap = 0;
|
||||
DeviceCoordinate nShortfall = nTotalWidth - nKashidaWidth * nCopies;
|
||||
if (nShortfall > 0)
|
||||
{
|
||||
++nCopies;
|
||||
DeviceCoordinate nExcess = nCopies * nKashidaWidth - nTotalWidth;
|
||||
if (nExcess > 0)
|
||||
nOverlap = nExcess / (nCopies - 1);
|
||||
}
|
||||
|
||||
Point aPos(pGlyphIter->m_aLinearPos.getX() - nTotalWidth, 0);
|
||||
int nCharPos = pGlyphIter->charPos();
|
||||
GlyphItemFlags const nFlags = GlyphItemFlags::IS_IN_CLUSTER | GlyphItemFlags::IS_RTL_GLYPH;
|
||||
while (nCopies--)
|
||||
{
|
||||
GlyphItem aKashida(nCharPos, 0, nKashidaIndex, aPos, nFlags, nKashidaWidth, 0, &GetFont());
|
||||
pGlyphIter = m_GlyphItems.Impl()->insert(pGlyphIter, aKashida);
|
||||
aPos.AdjustX(nKashidaWidth );
|
||||
aPos.AdjustX( -nOverlap );
|
||||
++pGlyphIter;
|
||||
++nInserted;
|
||||
}
|
||||
Point aPos(pGlyphIter->m_aLinearPos.getX() - nTotalWidth, 0);
|
||||
int nCharPos = pGlyphIter->charPos();
|
||||
GlyphItemFlags const nFlags = GlyphItemFlags::IS_IN_CLUSTER | GlyphItemFlags::IS_RTL_GLYPH;
|
||||
while (nCopies--)
|
||||
{
|
||||
GlyphItem aKashida(nCharPos, 0, nKashidaIndex, aPos, nFlags, nKashidaWidth, 0, &GetFont());
|
||||
pGlyphIter = m_GlyphItems.Impl()->insert(pGlyphIter, aKashida);
|
||||
aPos.AdjustX(nKashidaWidth );
|
||||
aPos.AdjustX( -nOverlap );
|
||||
++pGlyphIter;
|
||||
++nInserted;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -116,26 +116,26 @@ FileDefinitionWidgetDraw::FileDefinitionWidgetDraw(SalGraphics& rGraphics)
|
||||
m_pWidgetDefinition = getWidgetDefinitionForTheme("ios");
|
||||
#endif
|
||||
|
||||
if (m_pWidgetDefinition)
|
||||
{
|
||||
auto& pSettings = m_pWidgetDefinition->mpSettings;
|
||||
if (!m_pWidgetDefinition)
|
||||
return;
|
||||
|
||||
ImplSVData* pSVData = ImplGetSVData();
|
||||
pSVData->maNWFData.mbNoFocusRects = true;
|
||||
pSVData->maNWFData.mbNoFocusRectsForFlatButtons = true;
|
||||
pSVData->maNWFData.mbNoActiveTabTextRaise
|
||||
= getSettingValueBool(pSettings->msNoActiveTabTextRaise, true);
|
||||
pSVData->maNWFData.mbCenteredTabs = getSettingValueBool(pSettings->msCenteredTabs, true);
|
||||
pSVData->maNWFData.mbProgressNeedsErase = true;
|
||||
pSVData->maNWFData.mnStatusBarLowerRightOffset = 10;
|
||||
pSVData->maNWFData.mbCanDrawWidgetAnySize = true;
|
||||
auto& pSettings = m_pWidgetDefinition->mpSettings;
|
||||
|
||||
int nDefaultListboxEntryMargin = pSVData->maNWFData.mnListBoxEntryMargin;
|
||||
pSVData->maNWFData.mnListBoxEntryMargin
|
||||
= getSettingValueInteger(pSettings->msListBoxEntryMargin, nDefaultListboxEntryMargin);
|
||||
ImplSVData* pSVData = ImplGetSVData();
|
||||
pSVData->maNWFData.mbNoFocusRects = true;
|
||||
pSVData->maNWFData.mbNoFocusRectsForFlatButtons = true;
|
||||
pSVData->maNWFData.mbNoActiveTabTextRaise
|
||||
= getSettingValueBool(pSettings->msNoActiveTabTextRaise, true);
|
||||
pSVData->maNWFData.mbCenteredTabs = getSettingValueBool(pSettings->msCenteredTabs, true);
|
||||
pSVData->maNWFData.mbProgressNeedsErase = true;
|
||||
pSVData->maNWFData.mnStatusBarLowerRightOffset = 10;
|
||||
pSVData->maNWFData.mbCanDrawWidgetAnySize = true;
|
||||
|
||||
m_bIsActive = true;
|
||||
}
|
||||
int nDefaultListboxEntryMargin = pSVData->maNWFData.mnListBoxEntryMargin;
|
||||
pSVData->maNWFData.mnListBoxEntryMargin
|
||||
= getSettingValueInteger(pSettings->msListBoxEntryMargin, nDefaultListboxEntryMargin);
|
||||
|
||||
m_bIsActive = true;
|
||||
}
|
||||
|
||||
bool FileDefinitionWidgetDraw::isNativeControlSupported(ControlType eType, ControlPart ePart)
|
||||
|
@ -82,21 +82,21 @@ void AlphaMask::Replace( const Bitmap& rMask, sal_uInt8 cReplaceTransparency )
|
||||
Bitmap::ScopedReadAccess pMaskAcc( const_cast<Bitmap&>(rMask) );
|
||||
AlphaScopedWriteAccess pAcc(*this);
|
||||
|
||||
if( pMaskAcc && pAcc )
|
||||
{
|
||||
const BitmapColor aReplace( cReplaceTransparency );
|
||||
const long nWidth = std::min( pMaskAcc->Width(), pAcc->Width() );
|
||||
const long nHeight = std::min( pMaskAcc->Height(), pAcc->Height() );
|
||||
const BitmapColor aMaskWhite( pMaskAcc->GetBestMatchingColor( COL_WHITE ) );
|
||||
if( !(pMaskAcc && pAcc) )
|
||||
return;
|
||||
|
||||
for( long nY = 0; nY < nHeight; nY++ )
|
||||
{
|
||||
Scanline pScanline = pAcc->GetScanline(nY);
|
||||
Scanline pScanlineMask = pMaskAcc->GetScanline(nY);
|
||||
for( long nX = 0; nX < nWidth; nX++ )
|
||||
if( pMaskAcc->GetPixelFromData( pScanlineMask, nX ) == aMaskWhite )
|
||||
pAcc->SetPixelOnData( pScanline, nX, aReplace );
|
||||
}
|
||||
const BitmapColor aReplace( cReplaceTransparency );
|
||||
const long nWidth = std::min( pMaskAcc->Width(), pAcc->Width() );
|
||||
const long nHeight = std::min( pMaskAcc->Height(), pAcc->Height() );
|
||||
const BitmapColor aMaskWhite( pMaskAcc->GetBestMatchingColor( COL_WHITE ) );
|
||||
|
||||
for( long nY = 0; nY < nHeight; nY++ )
|
||||
{
|
||||
Scanline pScanline = pAcc->GetScanline(nY);
|
||||
Scanline pScanlineMask = pMaskAcc->GetScanline(nY);
|
||||
for( long nX = 0; nX < nWidth; nX++ )
|
||||
if( pMaskAcc->GetPixelFromData( pScanlineMask, nX ) == aMaskWhite )
|
||||
pAcc->SetPixelOnData( pScanline, nX, aReplace );
|
||||
}
|
||||
}
|
||||
|
||||
@ -104,35 +104,35 @@ void AlphaMask::Replace( sal_uInt8 cSearchTransparency, sal_uInt8 cReplaceTransp
|
||||
{
|
||||
AlphaScopedWriteAccess pAcc(*this);
|
||||
|
||||
if( pAcc && pAcc->GetBitCount() == 8 )
|
||||
if( !(pAcc && pAcc->GetBitCount() == 8) )
|
||||
return;
|
||||
|
||||
const long nWidth = pAcc->Width(), nHeight = pAcc->Height();
|
||||
|
||||
if( pAcc->GetScanlineFormat() == ScanlineFormat::N8BitPal )
|
||||
{
|
||||
const long nWidth = pAcc->Width(), nHeight = pAcc->Height();
|
||||
|
||||
if( pAcc->GetScanlineFormat() == ScanlineFormat::N8BitPal )
|
||||
for( long nY = 0; nY < nHeight; nY++ )
|
||||
{
|
||||
for( long nY = 0; nY < nHeight; nY++ )
|
||||
{
|
||||
Scanline pScan = pAcc->GetScanline( nY );
|
||||
Scanline pScan = pAcc->GetScanline( nY );
|
||||
|
||||
for( long nX = 0; nX < nWidth; nX++, pScan++ )
|
||||
{
|
||||
if( *pScan == cSearchTransparency )
|
||||
*pScan = cReplaceTransparency;
|
||||
}
|
||||
for( long nX = 0; nX < nWidth; nX++, pScan++ )
|
||||
{
|
||||
if( *pScan == cSearchTransparency )
|
||||
*pScan = cReplaceTransparency;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BitmapColor aReplace( cReplaceTransparency );
|
||||
}
|
||||
else
|
||||
{
|
||||
BitmapColor aReplace( cReplaceTransparency );
|
||||
|
||||
for( long nY = 0; nY < nHeight; nY++ )
|
||||
for( long nY = 0; nY < nHeight; nY++ )
|
||||
{
|
||||
Scanline pScanline = pAcc->GetScanline(nY);
|
||||
for( long nX = 0; nX < nWidth; nX++ )
|
||||
{
|
||||
Scanline pScanline = pAcc->GetScanline(nY);
|
||||
for( long nX = 0; nX < nWidth; nX++ )
|
||||
{
|
||||
if( pAcc->GetIndexFromData( pScanline, nX ) == cSearchTransparency )
|
||||
pAcc->SetPixelOnData( pScanline, nX, aReplace );
|
||||
}
|
||||
if( pAcc->GetIndexFromData( pScanline, nX ) == cSearchTransparency )
|
||||
pAcc->SetPixelOnData( pScanline, nX, aReplace );
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -143,23 +143,23 @@ void AlphaMask::BlendWith(const Bitmap& rOther)
|
||||
AlphaMask aOther(rOther); // to 8 bits
|
||||
Bitmap::ScopedReadAccess pOtherAcc(aOther);
|
||||
AlphaScopedWriteAccess pAcc(*this);
|
||||
if (pOtherAcc && pAcc && pOtherAcc->GetBitCount() == 8 && pAcc->GetBitCount() == 8)
|
||||
if (!(pOtherAcc && pAcc && pOtherAcc->GetBitCount() == 8 && pAcc->GetBitCount() == 8))
|
||||
return;
|
||||
|
||||
const long nHeight = std::min(pOtherAcc->Height(), pAcc->Height());
|
||||
const long nWidth = std::min(pOtherAcc->Width(), pAcc->Width());
|
||||
for (long y = 0; y < nHeight; ++y)
|
||||
{
|
||||
const long nHeight = std::min(pOtherAcc->Height(), pAcc->Height());
|
||||
const long nWidth = std::min(pOtherAcc->Width(), pAcc->Width());
|
||||
for (long y = 0; y < nHeight; ++y)
|
||||
Scanline scanline = pAcc->GetScanline( y );
|
||||
ConstScanline otherScanline = pOtherAcc->GetScanline( y );
|
||||
for (long x = 0; x < nWidth; ++x)
|
||||
{
|
||||
Scanline scanline = pAcc->GetScanline( y );
|
||||
ConstScanline otherScanline = pOtherAcc->GetScanline( y );
|
||||
for (long x = 0; x < nWidth; ++x)
|
||||
{
|
||||
// Use sal_uInt16 for following multiplication
|
||||
const sal_uInt16 nGrey1 = *scanline;
|
||||
const sal_uInt16 nGrey2 = *otherScanline;
|
||||
*scanline = static_cast<sal_uInt8>(nGrey1 + nGrey2 - nGrey1 * nGrey2 / 255);
|
||||
++scanline;
|
||||
++otherScanline;
|
||||
}
|
||||
// Use sal_uInt16 for following multiplication
|
||||
const sal_uInt16 nGrey1 = *scanline;
|
||||
const sal_uInt16 nGrey2 = *otherScanline;
|
||||
*scanline = static_cast<sal_uInt8>(nGrey1 + nGrey2 - nGrey1 * nGrey2 / 255);
|
||||
++scanline;
|
||||
++otherScanline;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -794,54 +794,54 @@ bool Bitmap::HasFastScale()
|
||||
void Bitmap::AdaptBitCount(Bitmap& rNew) const
|
||||
{
|
||||
// aNew is the result of some operation; adapt it's BitCount to the original (this)
|
||||
if(GetBitCount() != rNew.GetBitCount())
|
||||
if(GetBitCount() == rNew.GetBitCount())
|
||||
return;
|
||||
|
||||
switch(GetBitCount())
|
||||
{
|
||||
switch(GetBitCount())
|
||||
case 1:
|
||||
{
|
||||
case 1:
|
||||
rNew.Convert(BmpConversion::N1BitThreshold);
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
if(HasGreyPaletteAny())
|
||||
{
|
||||
rNew.Convert(BmpConversion::N1BitThreshold);
|
||||
break;
|
||||
rNew.Convert(BmpConversion::N4BitGreys);
|
||||
}
|
||||
case 4:
|
||||
else
|
||||
{
|
||||
if(HasGreyPaletteAny())
|
||||
{
|
||||
rNew.Convert(BmpConversion::N4BitGreys);
|
||||
}
|
||||
else
|
||||
{
|
||||
rNew.Convert(BmpConversion::N4BitColors);
|
||||
}
|
||||
break;
|
||||
rNew.Convert(BmpConversion::N4BitColors);
|
||||
}
|
||||
case 8:
|
||||
break;
|
||||
}
|
||||
case 8:
|
||||
{
|
||||
if(HasGreyPaletteAny())
|
||||
{
|
||||
if(HasGreyPaletteAny())
|
||||
{
|
||||
rNew.Convert(BmpConversion::N8BitGreys);
|
||||
}
|
||||
else
|
||||
{
|
||||
rNew.Convert(BmpConversion::N8BitColors);
|
||||
}
|
||||
break;
|
||||
rNew.Convert(BmpConversion::N8BitGreys);
|
||||
}
|
||||
case 24:
|
||||
else
|
||||
{
|
||||
rNew.Convert(BmpConversion::N24Bit);
|
||||
break;
|
||||
}
|
||||
case 32:
|
||||
{
|
||||
rNew.Convert(BmpConversion::N32Bit);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
SAL_WARN("vcl", "BitDepth adaptation failed, from " << rNew.GetBitCount() << " to " << GetBitCount());
|
||||
break;
|
||||
rNew.Convert(BmpConversion::N8BitColors);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 24:
|
||||
{
|
||||
rNew.Convert(BmpConversion::N24Bit);
|
||||
break;
|
||||
}
|
||||
case 32:
|
||||
{
|
||||
rNew.Convert(BmpConversion::N32Bit);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
SAL_WARN("vcl", "BitDepth adaptation failed, from " << rNew.GetBitCount() << " to " << GetBitCount());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -456,21 +456,21 @@ void BitmapEx::Expand( sal_uLong nDX, sal_uLong nDY, bool bExpandTransparent )
|
||||
{
|
||||
bool bRet = false;
|
||||
|
||||
if( !!maBitmap )
|
||||
if( !maBitmap )
|
||||
return;
|
||||
|
||||
bRet = maBitmap.Expand( nDX, nDY );
|
||||
|
||||
if( bRet && ( meTransparent == TransparentType::Bitmap ) && !!maMask )
|
||||
{
|
||||
bRet = maBitmap.Expand( nDX, nDY );
|
||||
|
||||
if( bRet && ( meTransparent == TransparentType::Bitmap ) && !!maMask )
|
||||
{
|
||||
Color aColor( bExpandTransparent ? COL_WHITE : COL_BLACK );
|
||||
maMask.Expand( nDX, nDY, &aColor );
|
||||
}
|
||||
|
||||
SetSizePixel(maBitmap.GetSizePixel());
|
||||
|
||||
SAL_WARN_IF(!!maMask && maBitmap.GetSizePixel() != maMask.GetSizePixel(), "vcl",
|
||||
"BitmapEx::Expand(): size mismatch for bitmap and alpha mask.");
|
||||
Color aColor( bExpandTransparent ? COL_WHITE : COL_BLACK );
|
||||
maMask.Expand( nDX, nDY, &aColor );
|
||||
}
|
||||
|
||||
SetSizePixel(maBitmap.GetSizePixel());
|
||||
|
||||
SAL_WARN_IF(!!maMask && maBitmap.GetSizePixel() != maMask.GetSizePixel(), "vcl",
|
||||
"BitmapEx::Expand(): size mismatch for bitmap and alpha mask.");
|
||||
}
|
||||
|
||||
bool BitmapEx::CopyPixel( const tools::Rectangle& rRectDst, const tools::Rectangle& rRectSrc,
|
||||
@ -1539,18 +1539,18 @@ void BitmapEx::setAlphaFrom( sal_uInt8 cIndexFrom, sal_Int8 nAlphaTo )
|
||||
BitmapScopedWriteAccess pWriteAccess(aAlphaMask);
|
||||
Bitmap::ScopedReadAccess pReadAccess(maBitmap);
|
||||
assert( pReadAccess.get() && pWriteAccess.get() );
|
||||
if ( pReadAccess.get() && pWriteAccess.get() )
|
||||
if ( !(pReadAccess.get() && pWriteAccess.get()) )
|
||||
return;
|
||||
|
||||
for ( long nY = 0; nY < pReadAccess->Height(); nY++ )
|
||||
{
|
||||
for ( long nY = 0; nY < pReadAccess->Height(); nY++ )
|
||||
Scanline pScanline = pWriteAccess->GetScanline( nY );
|
||||
Scanline pScanlineRead = pReadAccess->GetScanline( nY );
|
||||
for ( long nX = 0; nX < pReadAccess->Width(); nX++ )
|
||||
{
|
||||
Scanline pScanline = pWriteAccess->GetScanline( nY );
|
||||
Scanline pScanlineRead = pReadAccess->GetScanline( nY );
|
||||
for ( long nX = 0; nX < pReadAccess->Width(); nX++ )
|
||||
{
|
||||
const sal_uInt8 cIndex = pReadAccess->GetPixelFromData( pScanlineRead, nX ).GetIndex();
|
||||
if ( cIndex == cIndexFrom )
|
||||
pWriteAccess->SetPixelOnData( pScanline, nX, BitmapColor(nAlphaTo) );
|
||||
}
|
||||
const sal_uInt8 cIndex = pReadAccess->GetPixelFromData( pScanlineRead, nX ).GetIndex();
|
||||
if ( cIndex == cIndexFrom )
|
||||
pWriteAccess->SetPixelOnData( pScanline, nX, BitmapColor(nAlphaTo) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -364,70 +364,70 @@ void BitmapWriteAccess::CopyScanline( long nY, ConstScanline aSrcScanline,
|
||||
|
||||
const sal_uLong nCount = std::min( GetScanlineSize(), nSrcScanlineSize );
|
||||
|
||||
if( nCount )
|
||||
if( !nCount )
|
||||
return;
|
||||
|
||||
if( GetScanlineFormat() == RemoveScanline( nSrcScanlineFormat ) )
|
||||
memcpy(GetScanline(nY), aSrcScanline, nCount);
|
||||
else
|
||||
{
|
||||
if( GetScanlineFormat() == RemoveScanline( nSrcScanlineFormat ) )
|
||||
memcpy(GetScanline(nY), aSrcScanline, nCount);
|
||||
else
|
||||
DBG_ASSERT( nFormat != ScanlineFormat::N8BitTcMask &&
|
||||
nFormat != ScanlineFormat::N32BitTcMask,
|
||||
"No support for pixel formats with color masks yet!" );
|
||||
|
||||
// TODO: use fastbmp infrastructure
|
||||
FncGetPixel pFncGetPixel;
|
||||
|
||||
switch( nFormat )
|
||||
{
|
||||
DBG_ASSERT( nFormat != ScanlineFormat::N8BitTcMask &&
|
||||
nFormat != ScanlineFormat::N32BitTcMask,
|
||||
"No support for pixel formats with color masks yet!" );
|
||||
|
||||
// TODO: use fastbmp infrastructure
|
||||
FncGetPixel pFncGetPixel;
|
||||
|
||||
switch( nFormat )
|
||||
{
|
||||
case ScanlineFormat::N1BitMsbPal: pFncGetPixel = GetPixelForN1BitMsbPal; break;
|
||||
case ScanlineFormat::N1BitLsbPal: pFncGetPixel = GetPixelForN1BitLsbPal; break;
|
||||
case ScanlineFormat::N4BitMsnPal: pFncGetPixel = GetPixelForN4BitMsnPal; break;
|
||||
case ScanlineFormat::N4BitLsnPal: pFncGetPixel = GetPixelForN4BitLsnPal; break;
|
||||
case ScanlineFormat::N8BitPal: pFncGetPixel = GetPixelForN8BitPal; break;
|
||||
case ScanlineFormat::N8BitTcMask: pFncGetPixel = GetPixelForN8BitTcMask; break;
|
||||
case ScanlineFormat::N24BitTcBgr: pFncGetPixel = GetPixelForN24BitTcBgr; break;
|
||||
case ScanlineFormat::N24BitTcRgb: pFncGetPixel = GetPixelForN24BitTcRgb; break;
|
||||
case ScanlineFormat::N32BitTcAbgr:
|
||||
if (Bitmap32IsPreMultipled())
|
||||
pFncGetPixel = GetPixelForN32BitTcAbgr;
|
||||
else
|
||||
pFncGetPixel = GetPixelForN32BitTcXbgr;
|
||||
break;
|
||||
case ScanlineFormat::N32BitTcArgb:
|
||||
if (Bitmap32IsPreMultipled())
|
||||
pFncGetPixel = GetPixelForN32BitTcArgb;
|
||||
else
|
||||
pFncGetPixel = GetPixelForN32BitTcXrgb;
|
||||
break;
|
||||
case ScanlineFormat::N32BitTcBgra:
|
||||
if (Bitmap32IsPreMultipled())
|
||||
pFncGetPixel = GetPixelForN32BitTcBgra;
|
||||
else
|
||||
pFncGetPixel = GetPixelForN32BitTcBgrx;
|
||||
break;
|
||||
case ScanlineFormat::N32BitTcRgba:
|
||||
if (Bitmap32IsPreMultipled())
|
||||
pFncGetPixel = GetPixelForN32BitTcRgba;
|
||||
else
|
||||
pFncGetPixel = GetPixelForN32BitTcRgbx;
|
||||
break;
|
||||
case ScanlineFormat::N32BitTcMask:
|
||||
pFncGetPixel = GetPixelForN32BitTcMask;
|
||||
break;
|
||||
|
||||
default:
|
||||
assert(false);
|
||||
pFncGetPixel = nullptr;
|
||||
case ScanlineFormat::N1BitMsbPal: pFncGetPixel = GetPixelForN1BitMsbPal; break;
|
||||
case ScanlineFormat::N1BitLsbPal: pFncGetPixel = GetPixelForN1BitLsbPal; break;
|
||||
case ScanlineFormat::N4BitMsnPal: pFncGetPixel = GetPixelForN4BitMsnPal; break;
|
||||
case ScanlineFormat::N4BitLsnPal: pFncGetPixel = GetPixelForN4BitLsnPal; break;
|
||||
case ScanlineFormat::N8BitPal: pFncGetPixel = GetPixelForN8BitPal; break;
|
||||
case ScanlineFormat::N8BitTcMask: pFncGetPixel = GetPixelForN8BitTcMask; break;
|
||||
case ScanlineFormat::N24BitTcBgr: pFncGetPixel = GetPixelForN24BitTcBgr; break;
|
||||
case ScanlineFormat::N24BitTcRgb: pFncGetPixel = GetPixelForN24BitTcRgb; break;
|
||||
case ScanlineFormat::N32BitTcAbgr:
|
||||
if (Bitmap32IsPreMultipled())
|
||||
pFncGetPixel = GetPixelForN32BitTcAbgr;
|
||||
else
|
||||
pFncGetPixel = GetPixelForN32BitTcXbgr;
|
||||
break;
|
||||
case ScanlineFormat::N32BitTcArgb:
|
||||
if (Bitmap32IsPreMultipled())
|
||||
pFncGetPixel = GetPixelForN32BitTcArgb;
|
||||
else
|
||||
pFncGetPixel = GetPixelForN32BitTcXrgb;
|
||||
break;
|
||||
case ScanlineFormat::N32BitTcBgra:
|
||||
if (Bitmap32IsPreMultipled())
|
||||
pFncGetPixel = GetPixelForN32BitTcBgra;
|
||||
else
|
||||
pFncGetPixel = GetPixelForN32BitTcBgrx;
|
||||
break;
|
||||
case ScanlineFormat::N32BitTcRgba:
|
||||
if (Bitmap32IsPreMultipled())
|
||||
pFncGetPixel = GetPixelForN32BitTcRgba;
|
||||
else
|
||||
pFncGetPixel = GetPixelForN32BitTcRgbx;
|
||||
break;
|
||||
case ScanlineFormat::N32BitTcMask:
|
||||
pFncGetPixel = GetPixelForN32BitTcMask;
|
||||
break;
|
||||
}
|
||||
|
||||
if( pFncGetPixel )
|
||||
{
|
||||
const ColorMask aDummyMask;
|
||||
Scanline pScanline = GetScanline(nY);
|
||||
for (long nX = 0, nWidth = mpBuffer->mnWidth; nX < nWidth; ++nX)
|
||||
SetPixelOnData(pScanline, nX, pFncGetPixel(aSrcScanline, nX, aDummyMask));
|
||||
}
|
||||
default:
|
||||
assert(false);
|
||||
pFncGetPixel = nullptr;
|
||||
break;
|
||||
}
|
||||
|
||||
if( pFncGetPixel )
|
||||
{
|
||||
const ColorMask aDummyMask;
|
||||
Scanline pScanline = GetScanline(nY);
|
||||
for (long nX = 0, nWidth = mpBuffer->mnWidth; nX < nWidth; ++nX)
|
||||
SetPixelOnData(pScanline, nX, pFncGetPixel(aSrcScanline, nX, aDummyMask));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -99,134 +99,134 @@ void BitmapWriteAccess::Erase( const Color& rColor )
|
||||
|
||||
void BitmapWriteAccess::DrawLine( const Point& rStart, const Point& rEnd )
|
||||
{
|
||||
if (mpLineColor)
|
||||
if (!mpLineColor)
|
||||
return;
|
||||
|
||||
const BitmapColor& rLineColor = *mpLineColor;
|
||||
long nX, nY;
|
||||
|
||||
if (rStart.X() == rEnd.X())
|
||||
{
|
||||
const BitmapColor& rLineColor = *mpLineColor;
|
||||
long nX, nY;
|
||||
// Vertical Line
|
||||
const long nEndY = rEnd.Y();
|
||||
|
||||
if (rStart.X() == rEnd.X())
|
||||
nX = rStart.X();
|
||||
nY = rStart.Y();
|
||||
|
||||
if (nEndY > nY)
|
||||
{
|
||||
// Vertical Line
|
||||
const long nEndY = rEnd.Y();
|
||||
|
||||
nX = rStart.X();
|
||||
nY = rStart.Y();
|
||||
|
||||
if (nEndY > nY)
|
||||
{
|
||||
for (; nY <= nEndY; nY++ )
|
||||
SetPixel( nY, nX, rLineColor );
|
||||
}
|
||||
else
|
||||
{
|
||||
for (; nY >= nEndY; nY-- )
|
||||
SetPixel( nY, nX, rLineColor );
|
||||
}
|
||||
for (; nY <= nEndY; nY++ )
|
||||
SetPixel( nY, nX, rLineColor );
|
||||
}
|
||||
else if (rStart.Y() == rEnd.Y())
|
||||
else
|
||||
{
|
||||
// Horizontal Line
|
||||
const long nEndX = rEnd.X();
|
||||
for (; nY >= nEndY; nY-- )
|
||||
SetPixel( nY, nX, rLineColor );
|
||||
}
|
||||
}
|
||||
else if (rStart.Y() == rEnd.Y())
|
||||
{
|
||||
// Horizontal Line
|
||||
const long nEndX = rEnd.X();
|
||||
|
||||
nX = rStart.X();
|
||||
nY = rStart.Y();
|
||||
nX = rStart.X();
|
||||
nY = rStart.Y();
|
||||
|
||||
if (nEndX > nX)
|
||||
if (nEndX > nX)
|
||||
{
|
||||
for (; nX <= nEndX; nX++)
|
||||
SetPixel(nY, nX, rLineColor);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (; nX >= nEndX; nX--)
|
||||
SetPixel(nY, nX, rLineColor);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
const long nDX = labs( rEnd.X() - rStart.X() );
|
||||
const long nDY = labs( rEnd.Y() - rStart.Y() );
|
||||
long nX1;
|
||||
long nY1;
|
||||
long nX2;
|
||||
long nY2;
|
||||
|
||||
if (nDX >= nDY)
|
||||
{
|
||||
if (rStart.X() < rEnd.X())
|
||||
{
|
||||
for (; nX <= nEndX; nX++)
|
||||
SetPixel(nY, nX, rLineColor);
|
||||
nX1 = rStart.X();
|
||||
nY1 = rStart.Y();
|
||||
nX2 = rEnd.X();
|
||||
nY2 = rEnd.Y();
|
||||
}
|
||||
else
|
||||
{
|
||||
for (; nX >= nEndX; nX--)
|
||||
SetPixel(nY, nX, rLineColor);
|
||||
nX1 = rEnd.X();
|
||||
nY1 = rEnd.Y();
|
||||
nX2 = rStart.X();
|
||||
nY2 = rStart.Y();
|
||||
}
|
||||
|
||||
const long nDYX = (nDY - nDX) << 1;
|
||||
const long nDY2 = nDY << 1;
|
||||
long nD = nDY2 - nDX;
|
||||
bool bPos = nY1 < nY2;
|
||||
|
||||
for (nX = nX1, nY = nY1; nX <= nX2; nX++)
|
||||
{
|
||||
SetPixel(nY, nX, rLineColor);
|
||||
|
||||
if (nD < 0)
|
||||
nD += nDY2;
|
||||
else
|
||||
{
|
||||
nD += nDYX;
|
||||
|
||||
if (bPos)
|
||||
nY++;
|
||||
else
|
||||
nY--;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
const long nDX = labs( rEnd.X() - rStart.X() );
|
||||
const long nDY = labs( rEnd.Y() - rStart.Y() );
|
||||
long nX1;
|
||||
long nY1;
|
||||
long nX2;
|
||||
long nY2;
|
||||
|
||||
if (nDX >= nDY)
|
||||
if (rStart.Y() < rEnd.Y())
|
||||
{
|
||||
if (rStart.X() < rEnd.X())
|
||||
{
|
||||
nX1 = rStart.X();
|
||||
nY1 = rStart.Y();
|
||||
nX2 = rEnd.X();
|
||||
nY2 = rEnd.Y();
|
||||
}
|
||||
else
|
||||
{
|
||||
nX1 = rEnd.X();
|
||||
nY1 = rEnd.Y();
|
||||
nX2 = rStart.X();
|
||||
nY2 = rStart.Y();
|
||||
}
|
||||
|
||||
const long nDYX = (nDY - nDX) << 1;
|
||||
const long nDY2 = nDY << 1;
|
||||
long nD = nDY2 - nDX;
|
||||
bool bPos = nY1 < nY2;
|
||||
|
||||
for (nX = nX1, nY = nY1; nX <= nX2; nX++)
|
||||
{
|
||||
SetPixel(nY, nX, rLineColor);
|
||||
|
||||
if (nD < 0)
|
||||
nD += nDY2;
|
||||
else
|
||||
{
|
||||
nD += nDYX;
|
||||
|
||||
if (bPos)
|
||||
nY++;
|
||||
else
|
||||
nY--;
|
||||
}
|
||||
}
|
||||
nX1 = rStart.X();
|
||||
nY1 = rStart.Y();
|
||||
nX2 = rEnd.X();
|
||||
nY2 = rEnd.Y();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rStart.Y() < rEnd.Y())
|
||||
{
|
||||
nX1 = rStart.X();
|
||||
nY1 = rStart.Y();
|
||||
nX2 = rEnd.X();
|
||||
nY2 = rEnd.Y();
|
||||
}
|
||||
nX1 = rEnd.X();
|
||||
nY1 = rEnd.Y();
|
||||
nX2 = rStart.X();
|
||||
nY2 = rStart.Y();
|
||||
}
|
||||
|
||||
const long nDYX = (nDX - nDY) << 1;
|
||||
const long nDY2 = nDX << 1;
|
||||
long nD = nDY2 - nDY;
|
||||
bool bPos = nX1 < nX2;
|
||||
|
||||
for (nX = nX1, nY = nY1; nY <= nY2; nY++)
|
||||
{
|
||||
SetPixel(nY, nX, rLineColor);
|
||||
|
||||
if (nD < 0)
|
||||
nD += nDY2;
|
||||
else
|
||||
{
|
||||
nX1 = rEnd.X();
|
||||
nY1 = rEnd.Y();
|
||||
nX2 = rStart.X();
|
||||
nY2 = rStart.Y();
|
||||
}
|
||||
nD += nDYX;
|
||||
|
||||
const long nDYX = (nDX - nDY) << 1;
|
||||
const long nDY2 = nDX << 1;
|
||||
long nD = nDY2 - nDY;
|
||||
bool bPos = nX1 < nX2;
|
||||
|
||||
for (nX = nX1, nY = nY1; nY <= nY2; nY++)
|
||||
{
|
||||
SetPixel(nY, nX, rLineColor);
|
||||
|
||||
if (nD < 0)
|
||||
nD += nDY2;
|
||||
if (bPos)
|
||||
nX++;
|
||||
else
|
||||
{
|
||||
nD += nDYX;
|
||||
|
||||
if (bPos)
|
||||
nX++;
|
||||
else
|
||||
nX--;
|
||||
}
|
||||
nX--;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -235,28 +235,28 @@ void BitmapWriteAccess::DrawLine( const Point& rStart, const Point& rEnd )
|
||||
|
||||
void BitmapWriteAccess::FillRect( const tools::Rectangle& rRect )
|
||||
{
|
||||
if (mpFillColor)
|
||||
if (!mpFillColor)
|
||||
return;
|
||||
|
||||
const BitmapColor& rFillColor = *mpFillColor;
|
||||
tools::Rectangle aRect(Point(), maBitmap.GetSizePixel());
|
||||
|
||||
aRect.Intersection(rRect);
|
||||
|
||||
if (aRect.IsEmpty())
|
||||
return;
|
||||
|
||||
const long nStartX = rRect.Left();
|
||||
const long nStartY = rRect.Top();
|
||||
const long nEndX = rRect.Right();
|
||||
const long nEndY = rRect.Bottom();
|
||||
|
||||
for (long nY = nStartY; nY <= nEndY; nY++)
|
||||
{
|
||||
const BitmapColor& rFillColor = *mpFillColor;
|
||||
tools::Rectangle aRect(Point(), maBitmap.GetSizePixel());
|
||||
|
||||
aRect.Intersection(rRect);
|
||||
|
||||
if (!aRect.IsEmpty())
|
||||
Scanline pScanline = GetScanline( nY );
|
||||
for (long nX = nStartX; nX <= nEndX; nX++)
|
||||
{
|
||||
const long nStartX = rRect.Left();
|
||||
const long nStartY = rRect.Top();
|
||||
const long nEndX = rRect.Right();
|
||||
const long nEndY = rRect.Bottom();
|
||||
|
||||
for (long nY = nStartY; nY <= nEndY; nY++)
|
||||
{
|
||||
Scanline pScanline = GetScanline( nY );
|
||||
for (long nX = nStartX; nX <= nEndX; nX++)
|
||||
{
|
||||
SetPixelOnData(pScanline, nX, rFillColor);
|
||||
}
|
||||
}
|
||||
SetPixelOnData(pScanline, nX, rFillColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -324,67 +324,67 @@ void GDIMetaFile::Record( OutputDevice* pOut )
|
||||
|
||||
void GDIMetaFile::Play( GDIMetaFile& rMtf )
|
||||
{
|
||||
if ( !m_bRecord && !rMtf.m_bRecord )
|
||||
if (m_bRecord || rMtf.m_bRecord)
|
||||
return;
|
||||
|
||||
MetaAction* pAction = GetCurAction();
|
||||
const size_t nObjCount = m_aList.size();
|
||||
|
||||
rMtf.UseCanvas( rMtf.GetUseCanvas() || m_bUseCanvas );
|
||||
|
||||
for( size_t nCurPos = m_nCurrentActionElement; nCurPos < nObjCount; nCurPos++ )
|
||||
{
|
||||
MetaAction* pAction = GetCurAction();
|
||||
const size_t nObjCount = m_aList.size();
|
||||
|
||||
rMtf.UseCanvas( rMtf.GetUseCanvas() || m_bUseCanvas );
|
||||
|
||||
for( size_t nCurPos = m_nCurrentActionElement; nCurPos < nObjCount; nCurPos++ )
|
||||
if( pAction )
|
||||
{
|
||||
if( pAction )
|
||||
{
|
||||
rMtf.AddAction( pAction );
|
||||
}
|
||||
|
||||
pAction = NextAction();
|
||||
rMtf.AddAction( pAction );
|
||||
}
|
||||
|
||||
pAction = NextAction();
|
||||
}
|
||||
}
|
||||
|
||||
void GDIMetaFile::Play( OutputDevice* pOut, size_t nPos )
|
||||
{
|
||||
if( !m_bRecord )
|
||||
{
|
||||
MetaAction* pAction = GetCurAction();
|
||||
const size_t nObjCount = m_aList.size();
|
||||
size_t nSyncCount = pOut->GetSyncCount();
|
||||
if( m_bRecord )
|
||||
return;
|
||||
|
||||
if( nPos > nObjCount )
|
||||
nPos = nObjCount;
|
||||
MetaAction* pAction = GetCurAction();
|
||||
const size_t nObjCount = m_aList.size();
|
||||
size_t nSyncCount = pOut->GetSyncCount();
|
||||
|
||||
// #i23407# Set backwards-compatible text language and layout mode
|
||||
// This is necessary, since old metafiles don't even know of these
|
||||
// recent add-ons. Newer metafiles must of course explicitly set
|
||||
// those states.
|
||||
pOut->Push( PushFlags::TEXTLAYOUTMODE|PushFlags::TEXTLANGUAGE );
|
||||
pOut->SetLayoutMode( ComplexTextLayoutFlags::Default );
|
||||
pOut->SetDigitLanguage( LANGUAGE_SYSTEM );
|
||||
if( nPos > nObjCount )
|
||||
nPos = nObjCount;
|
||||
|
||||
SAL_INFO( "vcl.gdi", "GDIMetaFile::Play on device of size: " << pOut->GetOutputSizePixel().Width() << " " << pOut->GetOutputSizePixel().Height());
|
||||
// #i23407# Set backwards-compatible text language and layout mode
|
||||
// This is necessary, since old metafiles don't even know of these
|
||||
// recent add-ons. Newer metafiles must of course explicitly set
|
||||
// those states.
|
||||
pOut->Push( PushFlags::TEXTLAYOUTMODE|PushFlags::TEXTLANGUAGE );
|
||||
pOut->SetLayoutMode( ComplexTextLayoutFlags::Default );
|
||||
pOut->SetDigitLanguage( LANGUAGE_SYSTEM );
|
||||
|
||||
if( !ImplPlayWithRenderer( pOut, Point(0,0), pOut->GetOutputSize() ) ) {
|
||||
size_t i = 0;
|
||||
for( size_t nCurPos = m_nCurrentActionElement; nCurPos < nPos; nCurPos++ )
|
||||
SAL_INFO( "vcl.gdi", "GDIMetaFile::Play on device of size: " << pOut->GetOutputSizePixel().Width() << " " << pOut->GetOutputSizePixel().Height());
|
||||
|
||||
if( !ImplPlayWithRenderer( pOut, Point(0,0), pOut->GetOutputSize() ) ) {
|
||||
size_t i = 0;
|
||||
for( size_t nCurPos = m_nCurrentActionElement; nCurPos < nPos; nCurPos++ )
|
||||
{
|
||||
if( pAction )
|
||||
{
|
||||
if( pAction )
|
||||
pAction->Execute( pOut );
|
||||
|
||||
// flush output from time to time
|
||||
if( i++ > nSyncCount )
|
||||
{
|
||||
pAction->Execute( pOut );
|
||||
|
||||
// flush output from time to time
|
||||
if( i++ > nSyncCount )
|
||||
{
|
||||
static_cast<vcl::Window*>( pOut )->Flush();
|
||||
i = 0;
|
||||
}
|
||||
static_cast<vcl::Window*>( pOut )->Flush();
|
||||
i = 0;
|
||||
}
|
||||
|
||||
pAction = NextAction();
|
||||
}
|
||||
|
||||
pAction = NextAction();
|
||||
}
|
||||
pOut->Pop();
|
||||
}
|
||||
pOut->Pop();
|
||||
}
|
||||
|
||||
bool GDIMetaFile::ImplPlayWithRenderer( OutputDevice* pOut, const Point& rPos, Size rLogicDestSize )
|
||||
@ -520,21 +520,21 @@ void GDIMetaFile::Play( OutputDevice* pOut, const Point& rPos,
|
||||
|
||||
void GDIMetaFile::Pause( bool _bPause )
|
||||
{
|
||||
if( m_bRecord )
|
||||
{
|
||||
if( _bPause )
|
||||
{
|
||||
if( !m_bPause )
|
||||
Linker( m_pOutDev, false );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( m_bPause )
|
||||
Linker( m_pOutDev, true );
|
||||
}
|
||||
if( !m_bRecord )
|
||||
return;
|
||||
|
||||
m_bPause = _bPause;
|
||||
if( _bPause )
|
||||
{
|
||||
if( !m_bPause )
|
||||
Linker( m_pOutDev, false );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( m_bPause )
|
||||
Linker( m_pOutDev, true );
|
||||
}
|
||||
|
||||
m_bPause = _bPause;
|
||||
}
|
||||
|
||||
void GDIMetaFile::Stop()
|
||||
@ -1287,20 +1287,20 @@ static void ImplActionBounds( tools::Rectangle& o_rOutBounds,
|
||||
tools::Rectangle aBounds( i_rInBounds );
|
||||
if( ! i_rInBounds.IsEmpty() && ! i_rClipStack.empty() && ! i_rClipStack.back().IsEmpty() )
|
||||
aBounds.Intersection( i_rClipStack.back() );
|
||||
if( ! aBounds.IsEmpty() )
|
||||
{
|
||||
if( ! o_rOutBounds.IsEmpty() )
|
||||
o_rOutBounds.Union( aBounds );
|
||||
else
|
||||
o_rOutBounds = aBounds;
|
||||
if( aBounds.IsEmpty() )
|
||||
return;
|
||||
|
||||
if(o_pHairline)
|
||||
{
|
||||
if( ! o_pHairline->IsEmpty() )
|
||||
o_pHairline->Union( aBounds );
|
||||
else
|
||||
*o_pHairline = aBounds;
|
||||
}
|
||||
if( ! o_rOutBounds.IsEmpty() )
|
||||
o_rOutBounds.Union( aBounds );
|
||||
else
|
||||
o_rOutBounds = aBounds;
|
||||
|
||||
if(o_pHairline)
|
||||
{
|
||||
if( ! o_pHairline->IsEmpty() )
|
||||
o_pHairline->Union( aBounds );
|
||||
else
|
||||
*o_pHairline = aBounds;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -747,34 +747,34 @@ bool ImplVectorize( const Bitmap& rColorBmp, GDIMetaFile& rMtf,
|
||||
|
||||
void ImplLimitPolyPoly( tools::PolyPolygon& rPolyPoly )
|
||||
{
|
||||
if( rPolyPoly.Count() > VECT_POLY_MAX )
|
||||
if( rPolyPoly.Count() <= VECT_POLY_MAX )
|
||||
return;
|
||||
|
||||
tools::PolyPolygon aNewPolyPoly;
|
||||
long nReduce = 0;
|
||||
sal_uInt16 nNewCount;
|
||||
|
||||
do
|
||||
{
|
||||
tools::PolyPolygon aNewPolyPoly;
|
||||
long nReduce = 0;
|
||||
sal_uInt16 nNewCount;
|
||||
aNewPolyPoly.Clear();
|
||||
nReduce++;
|
||||
|
||||
do
|
||||
for( sal_uInt16 i = 0, nCount = rPolyPoly.Count(); i < nCount; i++ )
|
||||
{
|
||||
aNewPolyPoly.Clear();
|
||||
nReduce++;
|
||||
const tools::Rectangle aBound( rPolyPoly[ i ].GetBoundRect() );
|
||||
|
||||
for( sal_uInt16 i = 0, nCount = rPolyPoly.Count(); i < nCount; i++ )
|
||||
if( aBound.GetWidth() > nReduce && aBound.GetHeight() > nReduce )
|
||||
{
|
||||
const tools::Rectangle aBound( rPolyPoly[ i ].GetBoundRect() );
|
||||
|
||||
if( aBound.GetWidth() > nReduce && aBound.GetHeight() > nReduce )
|
||||
{
|
||||
if( rPolyPoly[ i ].GetSize() )
|
||||
aNewPolyPoly.Insert( rPolyPoly[ i ] );
|
||||
}
|
||||
if( rPolyPoly[ i ].GetSize() )
|
||||
aNewPolyPoly.Insert( rPolyPoly[ i ] );
|
||||
}
|
||||
|
||||
nNewCount = aNewPolyPoly.Count();
|
||||
}
|
||||
while( nNewCount > VECT_POLY_MAX );
|
||||
|
||||
rPolyPoly = aNewPolyPoly;
|
||||
nNewCount = aNewPolyPoly.Count();
|
||||
}
|
||||
while( nNewCount > VECT_POLY_MAX );
|
||||
|
||||
rPolyPoly = aNewPolyPoly;
|
||||
}
|
||||
|
||||
ImplVectMap* ImplExpand( BitmapReadAccess* pRAcc, const Color& rColor )
|
||||
|
@ -199,63 +199,63 @@ void LineInfo::applyToB2DPolyPolygon(
|
||||
{
|
||||
o_rFillPolyPolygon.clear();
|
||||
|
||||
if(io_rLinePolyPolygon.count())
|
||||
if(!io_rLinePolyPolygon.count())
|
||||
return;
|
||||
|
||||
if(LineStyle::Dash == GetStyle())
|
||||
{
|
||||
if(LineStyle::Dash == GetStyle())
|
||||
::std::vector< double > fDotDashArray;
|
||||
const double fDashLen(GetDashLen());
|
||||
const double fDotLen(GetDotLen());
|
||||
const double fDistance(GetDistance());
|
||||
|
||||
for(sal_uInt16 a(0); a < GetDashCount(); a++)
|
||||
{
|
||||
::std::vector< double > fDotDashArray;
|
||||
const double fDashLen(GetDashLen());
|
||||
const double fDotLen(GetDotLen());
|
||||
const double fDistance(GetDistance());
|
||||
|
||||
for(sal_uInt16 a(0); a < GetDashCount(); a++)
|
||||
{
|
||||
fDotDashArray.push_back(fDashLen);
|
||||
fDotDashArray.push_back(fDistance);
|
||||
}
|
||||
|
||||
for(sal_uInt16 b(0); b < GetDotCount(); b++)
|
||||
{
|
||||
fDotDashArray.push_back(fDotLen);
|
||||
fDotDashArray.push_back(fDistance);
|
||||
}
|
||||
|
||||
const double fAccumulated(::std::accumulate(fDotDashArray.begin(), fDotDashArray.end(), 0.0));
|
||||
|
||||
if(fAccumulated > 0.0)
|
||||
{
|
||||
basegfx::B2DPolyPolygon aResult;
|
||||
|
||||
for(auto const& rPolygon : io_rLinePolyPolygon)
|
||||
{
|
||||
basegfx::B2DPolyPolygon aLineTraget;
|
||||
basegfx::utils::applyLineDashing(
|
||||
rPolygon,
|
||||
fDotDashArray,
|
||||
&aLineTraget);
|
||||
aResult.append(aLineTraget);
|
||||
}
|
||||
|
||||
io_rLinePolyPolygon = aResult;
|
||||
}
|
||||
fDotDashArray.push_back(fDashLen);
|
||||
fDotDashArray.push_back(fDistance);
|
||||
}
|
||||
|
||||
if(GetWidth() > 1 && io_rLinePolyPolygon.count())
|
||||
for(sal_uInt16 b(0); b < GetDotCount(); b++)
|
||||
{
|
||||
const double fHalfLineWidth((GetWidth() * 0.5) + 0.5);
|
||||
fDotDashArray.push_back(fDotLen);
|
||||
fDotDashArray.push_back(fDistance);
|
||||
}
|
||||
|
||||
const double fAccumulated(::std::accumulate(fDotDashArray.begin(), fDotDashArray.end(), 0.0));
|
||||
|
||||
if(fAccumulated > 0.0)
|
||||
{
|
||||
basegfx::B2DPolyPolygon aResult;
|
||||
|
||||
for(auto const& rPolygon : io_rLinePolyPolygon)
|
||||
{
|
||||
o_rFillPolyPolygon.append(basegfx::utils::createAreaGeometry(
|
||||
basegfx::B2DPolyPolygon aLineTraget;
|
||||
basegfx::utils::applyLineDashing(
|
||||
rPolygon,
|
||||
fHalfLineWidth,
|
||||
GetLineJoin(),
|
||||
GetLineCap()));
|
||||
fDotDashArray,
|
||||
&aLineTraget);
|
||||
aResult.append(aLineTraget);
|
||||
}
|
||||
|
||||
io_rLinePolyPolygon.clear();
|
||||
io_rLinePolyPolygon = aResult;
|
||||
}
|
||||
}
|
||||
|
||||
if(!(GetWidth() > 1 && io_rLinePolyPolygon.count()))
|
||||
return;
|
||||
|
||||
const double fHalfLineWidth((GetWidth() * 0.5) + 0.5);
|
||||
|
||||
for(auto const& rPolygon : io_rLinePolyPolygon)
|
||||
{
|
||||
o_rFillPolyPolygon.append(basegfx::utils::createAreaGeometry(
|
||||
rPolygon,
|
||||
fHalfLineWidth,
|
||||
GetLineJoin(),
|
||||
GetLineCap()));
|
||||
}
|
||||
|
||||
io_rLinePolyPolygon.clear();
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
||||
|
@ -979,32 +979,32 @@ void MetaPolyPolygonAction::Read( SvStream& rIStm, ImplMetaReadData* )
|
||||
VersionCompat aCompat(rIStm, StreamMode::READ);
|
||||
ReadPolyPolygon( rIStm, maPolyPoly ); // Version 1
|
||||
|
||||
if ( aCompat.GetVersion() >= 2 ) // Version 2
|
||||
if ( aCompat.GetVersion() < 2 ) // Version 2
|
||||
return;
|
||||
|
||||
sal_uInt16 nNumberOfComplexPolygons(0);
|
||||
rIStm.ReadUInt16( nNumberOfComplexPolygons );
|
||||
const size_t nMinRecordSize = sizeof(sal_uInt16);
|
||||
const size_t nMaxRecords = rIStm.remainingSize() / nMinRecordSize;
|
||||
if (nNumberOfComplexPolygons > nMaxRecords)
|
||||
{
|
||||
sal_uInt16 nNumberOfComplexPolygons(0);
|
||||
rIStm.ReadUInt16( nNumberOfComplexPolygons );
|
||||
const size_t nMinRecordSize = sizeof(sal_uInt16);
|
||||
const size_t nMaxRecords = rIStm.remainingSize() / nMinRecordSize;
|
||||
if (nNumberOfComplexPolygons > nMaxRecords)
|
||||
SAL_WARN("vcl.gdi", "Parsing error: " << nMaxRecords <<
|
||||
" max possible entries, but " << nNumberOfComplexPolygons << " claimed, truncating");
|
||||
nNumberOfComplexPolygons = nMaxRecords;
|
||||
}
|
||||
for (sal_uInt16 i = 0; i < nNumberOfComplexPolygons; ++i)
|
||||
{
|
||||
sal_uInt16 nIndex(0);
|
||||
rIStm.ReadUInt16( nIndex );
|
||||
tools::Polygon aPoly;
|
||||
aPoly.Read( rIStm );
|
||||
if (nIndex >= maPolyPoly.Count())
|
||||
{
|
||||
SAL_WARN("vcl.gdi", "Parsing error: " << nMaxRecords <<
|
||||
" max possible entries, but " << nNumberOfComplexPolygons << " claimed, truncating");
|
||||
nNumberOfComplexPolygons = nMaxRecords;
|
||||
}
|
||||
for (sal_uInt16 i = 0; i < nNumberOfComplexPolygons; ++i)
|
||||
{
|
||||
sal_uInt16 nIndex(0);
|
||||
rIStm.ReadUInt16( nIndex );
|
||||
tools::Polygon aPoly;
|
||||
aPoly.Read( rIStm );
|
||||
if (nIndex >= maPolyPoly.Count())
|
||||
{
|
||||
SAL_WARN("vcl.gdi", "svm contains polygon index " << nIndex
|
||||
<< " outside possible range " << maPolyPoly.Count());
|
||||
continue;
|
||||
}
|
||||
maPolyPoly.Replace( aPoly, nIndex );
|
||||
SAL_WARN("vcl.gdi", "svm contains polygon index " << nIndex
|
||||
<< " outside possible range " << maPolyPoly.Count());
|
||||
continue;
|
||||
}
|
||||
maPolyPoly.Replace( aPoly, nIndex );
|
||||
}
|
||||
}
|
||||
|
||||
@ -3183,54 +3183,54 @@ rtl::Reference<MetaAction> MetaCommentAction::Clone()
|
||||
|
||||
void MetaCommentAction::Move( long nXMove, long nYMove )
|
||||
{
|
||||
if ( nXMove || nYMove )
|
||||
if ( !(nXMove || nYMove) )
|
||||
return;
|
||||
|
||||
if ( !(mnDataSize && mpData) )
|
||||
return;
|
||||
|
||||
bool bPathStroke = (maComment == "XPATHSTROKE_SEQ_BEGIN");
|
||||
if ( !(bPathStroke || maComment == "XPATHFILL_SEQ_BEGIN") )
|
||||
return;
|
||||
|
||||
SvMemoryStream aMemStm( static_cast<void*>(mpData.get()), mnDataSize, StreamMode::READ );
|
||||
SvMemoryStream aDest;
|
||||
if ( bPathStroke )
|
||||
{
|
||||
if ( mnDataSize && mpData )
|
||||
{
|
||||
bool bPathStroke = (maComment == "XPATHSTROKE_SEQ_BEGIN");
|
||||
if ( bPathStroke || maComment == "XPATHFILL_SEQ_BEGIN" )
|
||||
{
|
||||
SvMemoryStream aMemStm( static_cast<void*>(mpData.get()), mnDataSize, StreamMode::READ );
|
||||
SvMemoryStream aDest;
|
||||
if ( bPathStroke )
|
||||
{
|
||||
SvtGraphicStroke aStroke;
|
||||
ReadSvtGraphicStroke( aMemStm, aStroke );
|
||||
SvtGraphicStroke aStroke;
|
||||
ReadSvtGraphicStroke( aMemStm, aStroke );
|
||||
|
||||
tools::Polygon aPath;
|
||||
aStroke.getPath( aPath );
|
||||
aPath.Move( nXMove, nYMove );
|
||||
aStroke.setPath( aPath );
|
||||
tools::Polygon aPath;
|
||||
aStroke.getPath( aPath );
|
||||
aPath.Move( nXMove, nYMove );
|
||||
aStroke.setPath( aPath );
|
||||
|
||||
tools::PolyPolygon aStartArrow;
|
||||
aStroke.getStartArrow(aStartArrow);
|
||||
aStartArrow.Move(nXMove, nYMove);
|
||||
aStroke.setStartArrow(aStartArrow);
|
||||
tools::PolyPolygon aStartArrow;
|
||||
aStroke.getStartArrow(aStartArrow);
|
||||
aStartArrow.Move(nXMove, nYMove);
|
||||
aStroke.setStartArrow(aStartArrow);
|
||||
|
||||
tools::PolyPolygon aEndArrow;
|
||||
aStroke.getEndArrow(aEndArrow);
|
||||
aEndArrow.Move(nXMove, nYMove);
|
||||
aStroke.setEndArrow(aEndArrow);
|
||||
tools::PolyPolygon aEndArrow;
|
||||
aStroke.getEndArrow(aEndArrow);
|
||||
aEndArrow.Move(nXMove, nYMove);
|
||||
aStroke.setEndArrow(aEndArrow);
|
||||
|
||||
WriteSvtGraphicStroke( aDest, aStroke );
|
||||
}
|
||||
else
|
||||
{
|
||||
SvtGraphicFill aFill;
|
||||
ReadSvtGraphicFill( aMemStm, aFill );
|
||||
|
||||
tools::PolyPolygon aPath;
|
||||
aFill.getPath( aPath );
|
||||
aPath.Move( nXMove, nYMove );
|
||||
aFill.setPath( aPath );
|
||||
|
||||
WriteSvtGraphicFill( aDest, aFill );
|
||||
}
|
||||
mpData.reset();
|
||||
ImplInitDynamicData( static_cast<const sal_uInt8*>( aDest.GetData() ), aDest.Tell() );
|
||||
}
|
||||
}
|
||||
WriteSvtGraphicStroke( aDest, aStroke );
|
||||
}
|
||||
else
|
||||
{
|
||||
SvtGraphicFill aFill;
|
||||
ReadSvtGraphicFill( aMemStm, aFill );
|
||||
|
||||
tools::PolyPolygon aPath;
|
||||
aFill.getPath( aPath );
|
||||
aPath.Move( nXMove, nYMove );
|
||||
aFill.setPath( aPath );
|
||||
|
||||
WriteSvtGraphicFill( aDest, aFill );
|
||||
}
|
||||
mpData.reset();
|
||||
ImplInitDynamicData( static_cast<const sal_uInt8*>( aDest.GetData() ), aDest.Tell() );
|
||||
}
|
||||
|
||||
// SJ: 25.07.06 #i56656# we are not able to mirror certain kind of
|
||||
@ -3239,62 +3239,62 @@ void MetaCommentAction::Move( long nXMove, long nYMove )
|
||||
// FIXME: fake comment to apply the next hunk in the right location
|
||||
void MetaCommentAction::Scale( double fXScale, double fYScale )
|
||||
{
|
||||
if ( ( fXScale != 1.0 ) || ( fYScale != 1.0 ) )
|
||||
if (( fXScale == 1.0 ) && ( fYScale == 1.0 ))
|
||||
return;
|
||||
|
||||
if ( !(mnDataSize && mpData) )
|
||||
return;
|
||||
|
||||
bool bPathStroke = (maComment == "XPATHSTROKE_SEQ_BEGIN");
|
||||
if ( bPathStroke || maComment == "XPATHFILL_SEQ_BEGIN" )
|
||||
{
|
||||
if ( mnDataSize && mpData )
|
||||
SvMemoryStream aMemStm( static_cast<void*>(mpData.get()), mnDataSize, StreamMode::READ );
|
||||
SvMemoryStream aDest;
|
||||
if ( bPathStroke )
|
||||
{
|
||||
bool bPathStroke = (maComment == "XPATHSTROKE_SEQ_BEGIN");
|
||||
if ( bPathStroke || maComment == "XPATHFILL_SEQ_BEGIN" )
|
||||
{
|
||||
SvMemoryStream aMemStm( static_cast<void*>(mpData.get()), mnDataSize, StreamMode::READ );
|
||||
SvMemoryStream aDest;
|
||||
if ( bPathStroke )
|
||||
{
|
||||
SvtGraphicStroke aStroke;
|
||||
ReadSvtGraphicStroke( aMemStm, aStroke );
|
||||
aStroke.scale( fXScale, fYScale );
|
||||
WriteSvtGraphicStroke( aDest, aStroke );
|
||||
}
|
||||
else
|
||||
{
|
||||
SvtGraphicFill aFill;
|
||||
ReadSvtGraphicFill( aMemStm, aFill );
|
||||
tools::PolyPolygon aPath;
|
||||
aFill.getPath( aPath );
|
||||
aPath.Scale( fXScale, fYScale );
|
||||
aFill.setPath( aPath );
|
||||
WriteSvtGraphicFill( aDest, aFill );
|
||||
}
|
||||
mpData.reset();
|
||||
ImplInitDynamicData( static_cast<const sal_uInt8*>( aDest.GetData() ), aDest.Tell() );
|
||||
} else if( maComment == "EMF_PLUS_HEADER_INFO" ){
|
||||
SvMemoryStream aMemStm( static_cast<void*>(mpData.get()), mnDataSize, StreamMode::READ );
|
||||
SvMemoryStream aDest;
|
||||
|
||||
sal_Int32 nLeft(0), nRight(0), nTop(0), nBottom(0);
|
||||
sal_Int32 nPixX(0), nPixY(0), nMillX(0), nMillY(0);
|
||||
float m11(0), m12(0), m21(0), m22(0), mdx(0), mdy(0);
|
||||
|
||||
// read data
|
||||
aMemStm.ReadInt32( nLeft ).ReadInt32( nTop ).ReadInt32( nRight ).ReadInt32( nBottom );
|
||||
aMemStm.ReadInt32( nPixX ).ReadInt32( nPixY ).ReadInt32( nMillX ).ReadInt32( nMillY );
|
||||
aMemStm.ReadFloat( m11 ).ReadFloat( m12 ).ReadFloat( m21 ).ReadFloat( m22 ).ReadFloat( mdx ).ReadFloat( mdy );
|
||||
|
||||
// add scale to the transformation
|
||||
m11 *= fXScale;
|
||||
m12 *= fXScale;
|
||||
m22 *= fYScale;
|
||||
m21 *= fYScale;
|
||||
|
||||
// prepare new data
|
||||
aDest.WriteInt32( nLeft ).WriteInt32( nTop ).WriteInt32( nRight ).WriteInt32( nBottom );
|
||||
aDest.WriteInt32( nPixX ).WriteInt32( nPixY ).WriteInt32( nMillX ).WriteInt32( nMillY );
|
||||
aDest.WriteFloat( m11 ).WriteFloat( m12 ).WriteFloat( m21 ).WriteFloat( m22 ).WriteFloat( mdx ).WriteFloat( mdy );
|
||||
|
||||
// save them
|
||||
ImplInitDynamicData( static_cast<const sal_uInt8*>( aDest.GetData() ), aDest.Tell() );
|
||||
}
|
||||
SvtGraphicStroke aStroke;
|
||||
ReadSvtGraphicStroke( aMemStm, aStroke );
|
||||
aStroke.scale( fXScale, fYScale );
|
||||
WriteSvtGraphicStroke( aDest, aStroke );
|
||||
}
|
||||
else
|
||||
{
|
||||
SvtGraphicFill aFill;
|
||||
ReadSvtGraphicFill( aMemStm, aFill );
|
||||
tools::PolyPolygon aPath;
|
||||
aFill.getPath( aPath );
|
||||
aPath.Scale( fXScale, fYScale );
|
||||
aFill.setPath( aPath );
|
||||
WriteSvtGraphicFill( aDest, aFill );
|
||||
}
|
||||
mpData.reset();
|
||||
ImplInitDynamicData( static_cast<const sal_uInt8*>( aDest.GetData() ), aDest.Tell() );
|
||||
} else if( maComment == "EMF_PLUS_HEADER_INFO" ){
|
||||
SvMemoryStream aMemStm( static_cast<void*>(mpData.get()), mnDataSize, StreamMode::READ );
|
||||
SvMemoryStream aDest;
|
||||
|
||||
sal_Int32 nLeft(0), nRight(0), nTop(0), nBottom(0);
|
||||
sal_Int32 nPixX(0), nPixY(0), nMillX(0), nMillY(0);
|
||||
float m11(0), m12(0), m21(0), m22(0), mdx(0), mdy(0);
|
||||
|
||||
// read data
|
||||
aMemStm.ReadInt32( nLeft ).ReadInt32( nTop ).ReadInt32( nRight ).ReadInt32( nBottom );
|
||||
aMemStm.ReadInt32( nPixX ).ReadInt32( nPixY ).ReadInt32( nMillX ).ReadInt32( nMillY );
|
||||
aMemStm.ReadFloat( m11 ).ReadFloat( m12 ).ReadFloat( m21 ).ReadFloat( m22 ).ReadFloat( mdx ).ReadFloat( mdy );
|
||||
|
||||
// add scale to the transformation
|
||||
m11 *= fXScale;
|
||||
m12 *= fXScale;
|
||||
m22 *= fYScale;
|
||||
m21 *= fYScale;
|
||||
|
||||
// prepare new data
|
||||
aDest.WriteInt32( nLeft ).WriteInt32( nTop ).WriteInt32( nRight ).WriteInt32( nBottom );
|
||||
aDest.WriteInt32( nPixX ).WriteInt32( nPixY ).WriteInt32( nMillX ).WriteInt32( nMillY );
|
||||
aDest.WriteFloat( m11 ).WriteFloat( m12 ).WriteFloat( m21 ).WriteFloat( m22 ).WriteFloat( mdx ).WriteFloat( mdy );
|
||||
|
||||
// save them
|
||||
ImplInitDynamicData( static_cast<const sal_uInt8*>( aDest.GetData() ), aDest.Tell() );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -525,39 +525,39 @@ void appendDouble( double fValue, OStringBuffer& rBuffer, sal_Int32 nPrecision =
|
||||
if( bNeg && ( nInt || nFrac ) )
|
||||
rBuffer.append( '-' );
|
||||
rBuffer.append( nInt );
|
||||
if( nFrac )
|
||||
if( !nFrac )
|
||||
return;
|
||||
|
||||
int i;
|
||||
rBuffer.append( '.' );
|
||||
sal_Int64 nBound = static_cast<sal_Int64>(pow( 10.0, nPrecision - 1.0 )+0.5);
|
||||
for ( i = 0; ( i < nPrecision ) && nFrac; i++ )
|
||||
{
|
||||
int i;
|
||||
rBuffer.append( '.' );
|
||||
sal_Int64 nBound = static_cast<sal_Int64>(pow( 10.0, nPrecision - 1.0 )+0.5);
|
||||
for ( i = 0; ( i < nPrecision ) && nFrac; i++ )
|
||||
{
|
||||
sal_Int64 nNumb = nFrac / nBound;
|
||||
nFrac -= nNumb * nBound;
|
||||
rBuffer.append( nNumb );
|
||||
nBound /= 10;
|
||||
}
|
||||
sal_Int64 nNumb = nFrac / nBound;
|
||||
nFrac -= nNumb * nBound;
|
||||
rBuffer.append( nNumb );
|
||||
nBound /= 10;
|
||||
}
|
||||
}
|
||||
|
||||
void appendColor( const Color& rColor, OStringBuffer& rBuffer, bool bConvertToGrey )
|
||||
{
|
||||
|
||||
if( rColor != COL_TRANSPARENT )
|
||||
if( rColor == COL_TRANSPARENT )
|
||||
return;
|
||||
|
||||
if( bConvertToGrey )
|
||||
{
|
||||
if( bConvertToGrey )
|
||||
{
|
||||
sal_uInt8 cByte = rColor.GetLuminance();
|
||||
appendDouble( static_cast<double>(cByte) / 255.0, rBuffer );
|
||||
}
|
||||
else
|
||||
{
|
||||
appendDouble( static_cast<double>(rColor.GetRed()) / 255.0, rBuffer );
|
||||
rBuffer.append( ' ' );
|
||||
appendDouble( static_cast<double>(rColor.GetGreen()) / 255.0, rBuffer );
|
||||
rBuffer.append( ' ' );
|
||||
appendDouble( static_cast<double>(rColor.GetBlue()) / 255.0, rBuffer );
|
||||
}
|
||||
sal_uInt8 cByte = rColor.GetLuminance();
|
||||
appendDouble( static_cast<double>(cByte) / 255.0, rBuffer );
|
||||
}
|
||||
else
|
||||
{
|
||||
appendDouble( static_cast<double>(rColor.GetRed()) / 255.0, rBuffer );
|
||||
rBuffer.append( ' ' );
|
||||
appendDouble( static_cast<double>(rColor.GetGreen()) / 255.0, rBuffer );
|
||||
rBuffer.append( ' ' );
|
||||
appendDouble( static_cast<double>(rColor.GetBlue()) / 255.0, rBuffer );
|
||||
}
|
||||
}
|
||||
|
||||
@ -924,42 +924,42 @@ void PDFPage::appendPolygon( const tools::Polygon& rPoly, OStringBuffer& rBuffer
|
||||
* #108582# applications do weird things
|
||||
*/
|
||||
sal_uInt32 nBufLen = rBuffer.getLength();
|
||||
if( nPoints > 0 )
|
||||
if( nPoints <= 0 )
|
||||
return;
|
||||
|
||||
const PolyFlags* pFlagArray = rPoly.GetConstFlagAry();
|
||||
appendPoint( rPoly[0], rBuffer );
|
||||
rBuffer.append( " m\n" );
|
||||
for( sal_uInt16 i = 1; i < nPoints; i++ )
|
||||
{
|
||||
const PolyFlags* pFlagArray = rPoly.GetConstFlagAry();
|
||||
appendPoint( rPoly[0], rBuffer );
|
||||
rBuffer.append( " m\n" );
|
||||
for( sal_uInt16 i = 1; i < nPoints; i++ )
|
||||
if( pFlagArray && pFlagArray[i] == PolyFlags::Control && nPoints-i > 2 )
|
||||
{
|
||||
if( pFlagArray && pFlagArray[i] == PolyFlags::Control && nPoints-i > 2 )
|
||||
{
|
||||
// bezier
|
||||
SAL_WARN_IF( pFlagArray[i+1] != PolyFlags::Control || pFlagArray[i+2] == PolyFlags::Control, "vcl.pdfwriter", "unexpected sequence of control points" );
|
||||
appendPoint( rPoly[i], rBuffer );
|
||||
rBuffer.append( " " );
|
||||
appendPoint( rPoly[i+1], rBuffer );
|
||||
rBuffer.append( " " );
|
||||
appendPoint( rPoly[i+2], rBuffer );
|
||||
rBuffer.append( " c" );
|
||||
i += 2; // add additionally consumed points
|
||||
}
|
||||
else
|
||||
{
|
||||
// line
|
||||
appendPoint( rPoly[i], rBuffer );
|
||||
rBuffer.append( " l" );
|
||||
}
|
||||
if( (rBuffer.getLength() - nBufLen) > 65 )
|
||||
{
|
||||
rBuffer.append( "\n" );
|
||||
nBufLen = rBuffer.getLength();
|
||||
}
|
||||
else
|
||||
rBuffer.append( " " );
|
||||
// bezier
|
||||
SAL_WARN_IF( pFlagArray[i+1] != PolyFlags::Control || pFlagArray[i+2] == PolyFlags::Control, "vcl.pdfwriter", "unexpected sequence of control points" );
|
||||
appendPoint( rPoly[i], rBuffer );
|
||||
rBuffer.append( " " );
|
||||
appendPoint( rPoly[i+1], rBuffer );
|
||||
rBuffer.append( " " );
|
||||
appendPoint( rPoly[i+2], rBuffer );
|
||||
rBuffer.append( " c" );
|
||||
i += 2; // add additionally consumed points
|
||||
}
|
||||
if( bClose )
|
||||
rBuffer.append( "h\n" );
|
||||
else
|
||||
{
|
||||
// line
|
||||
appendPoint( rPoly[i], rBuffer );
|
||||
rBuffer.append( " l" );
|
||||
}
|
||||
if( (rBuffer.getLength() - nBufLen) > 65 )
|
||||
{
|
||||
rBuffer.append( "\n" );
|
||||
nBufLen = rBuffer.getLength();
|
||||
}
|
||||
else
|
||||
rBuffer.append( " " );
|
||||
}
|
||||
if( bClose )
|
||||
rBuffer.append( "h\n" );
|
||||
}
|
||||
|
||||
void PDFPage::appendPolygon( const basegfx::B2DPolygon& rPoly, OStringBuffer& rBuffer ) const
|
||||
@ -982,59 +982,59 @@ void PDFPage::appendPolygon( const basegfx::B2DPolygon& rPoly, OStringBuffer& rB
|
||||
return;
|
||||
}
|
||||
sal_uInt32 nPoints = aPoly.count();
|
||||
if( nPoints > 0 )
|
||||
if( nPoints <= 0 )
|
||||
return;
|
||||
|
||||
sal_uInt32 nBufLen = rBuffer.getLength();
|
||||
basegfx::B2DPoint aLastPoint( aPoly.getB2DPoint( 0 ) );
|
||||
appendPixelPoint( aLastPoint, rBuffer );
|
||||
rBuffer.append( " m\n" );
|
||||
for( sal_uInt32 i = 1; i <= nPoints; i++ )
|
||||
{
|
||||
sal_uInt32 nBufLen = rBuffer.getLength();
|
||||
basegfx::B2DPoint aLastPoint( aPoly.getB2DPoint( 0 ) );
|
||||
appendPixelPoint( aLastPoint, rBuffer );
|
||||
rBuffer.append( " m\n" );
|
||||
for( sal_uInt32 i = 1; i <= nPoints; i++ )
|
||||
if( i != nPoints || aPoly.isClosed() )
|
||||
{
|
||||
if( i != nPoints || aPoly.isClosed() )
|
||||
sal_uInt32 nCurPoint = i % nPoints;
|
||||
sal_uInt32 nLastPoint = i-1;
|
||||
basegfx::B2DPoint aPoint( aPoly.getB2DPoint( nCurPoint ) );
|
||||
if( aPoly.isNextControlPointUsed( nLastPoint ) &&
|
||||
aPoly.isPrevControlPointUsed( nCurPoint ) )
|
||||
{
|
||||
sal_uInt32 nCurPoint = i % nPoints;
|
||||
sal_uInt32 nLastPoint = i-1;
|
||||
basegfx::B2DPoint aPoint( aPoly.getB2DPoint( nCurPoint ) );
|
||||
if( aPoly.isNextControlPointUsed( nLastPoint ) &&
|
||||
aPoly.isPrevControlPointUsed( nCurPoint ) )
|
||||
{
|
||||
appendPixelPoint( aPoly.getNextControlPoint( nLastPoint ), rBuffer );
|
||||
rBuffer.append( ' ' );
|
||||
appendPixelPoint( aPoly.getPrevControlPoint( nCurPoint ), rBuffer );
|
||||
rBuffer.append( ' ' );
|
||||
appendPixelPoint( aPoint, rBuffer );
|
||||
rBuffer.append( " c" );
|
||||
}
|
||||
else if( aPoly.isNextControlPointUsed( nLastPoint ) )
|
||||
{
|
||||
appendPixelPoint( aPoly.getNextControlPoint( nLastPoint ), rBuffer );
|
||||
rBuffer.append( ' ' );
|
||||
appendPixelPoint( aPoint, rBuffer );
|
||||
rBuffer.append( " y" );
|
||||
}
|
||||
else if( aPoly.isPrevControlPointUsed( nCurPoint ) )
|
||||
{
|
||||
appendPixelPoint( aPoly.getPrevControlPoint( nCurPoint ), rBuffer );
|
||||
rBuffer.append( ' ' );
|
||||
appendPixelPoint( aPoint, rBuffer );
|
||||
rBuffer.append( " v" );
|
||||
}
|
||||
else
|
||||
{
|
||||
appendPixelPoint( aPoint, rBuffer );
|
||||
rBuffer.append( " l" );
|
||||
}
|
||||
if( (rBuffer.getLength() - nBufLen) > 65 )
|
||||
{
|
||||
rBuffer.append( "\n" );
|
||||
nBufLen = rBuffer.getLength();
|
||||
}
|
||||
else
|
||||
rBuffer.append( " " );
|
||||
appendPixelPoint( aPoly.getNextControlPoint( nLastPoint ), rBuffer );
|
||||
rBuffer.append( ' ' );
|
||||
appendPixelPoint( aPoly.getPrevControlPoint( nCurPoint ), rBuffer );
|
||||
rBuffer.append( ' ' );
|
||||
appendPixelPoint( aPoint, rBuffer );
|
||||
rBuffer.append( " c" );
|
||||
}
|
||||
else if( aPoly.isNextControlPointUsed( nLastPoint ) )
|
||||
{
|
||||
appendPixelPoint( aPoly.getNextControlPoint( nLastPoint ), rBuffer );
|
||||
rBuffer.append( ' ' );
|
||||
appendPixelPoint( aPoint, rBuffer );
|
||||
rBuffer.append( " y" );
|
||||
}
|
||||
else if( aPoly.isPrevControlPointUsed( nCurPoint ) )
|
||||
{
|
||||
appendPixelPoint( aPoly.getPrevControlPoint( nCurPoint ), rBuffer );
|
||||
rBuffer.append( ' ' );
|
||||
appendPixelPoint( aPoint, rBuffer );
|
||||
rBuffer.append( " v" );
|
||||
}
|
||||
else
|
||||
{
|
||||
appendPixelPoint( aPoint, rBuffer );
|
||||
rBuffer.append( " l" );
|
||||
}
|
||||
if( (rBuffer.getLength() - nBufLen) > 65 )
|
||||
{
|
||||
rBuffer.append( "\n" );
|
||||
nBufLen = rBuffer.getLength();
|
||||
}
|
||||
else
|
||||
rBuffer.append( " " );
|
||||
}
|
||||
rBuffer.append( "h\n" );
|
||||
}
|
||||
rBuffer.append( "h\n" );
|
||||
}
|
||||
|
||||
void PDFPage::appendPolyPolygon( const tools::PolyPolygon& rPolyPoly, OStringBuffer& rBuffer ) const
|
||||
@ -7339,31 +7339,31 @@ void PDFWriterImpl::drawTransparent( const tools::PolyPolygon& rPolyPoly, sal_uI
|
||||
|
||||
void PDFWriterImpl::pushResource( ResourceKind eKind, const OString& rResource, sal_Int32 nObject )
|
||||
{
|
||||
if( nObject >= 0 )
|
||||
if( nObject < 0 )
|
||||
return;
|
||||
|
||||
switch( eKind )
|
||||
{
|
||||
switch( eKind )
|
||||
{
|
||||
case ResourceKind::XObject:
|
||||
m_aGlobalResourceDict.m_aXObjects[ rResource ] = nObject;
|
||||
if( ! m_aOutputStreams.empty() )
|
||||
m_aOutputStreams.front().m_aResourceDict.m_aXObjects[ rResource ] = nObject;
|
||||
break;
|
||||
case ResourceKind::ExtGState:
|
||||
m_aGlobalResourceDict.m_aExtGStates[ rResource ] = nObject;
|
||||
if( ! m_aOutputStreams.empty() )
|
||||
m_aOutputStreams.front().m_aResourceDict.m_aExtGStates[ rResource ] = nObject;
|
||||
break;
|
||||
case ResourceKind::Shading:
|
||||
m_aGlobalResourceDict.m_aShadings[ rResource ] = nObject;
|
||||
if( ! m_aOutputStreams.empty() )
|
||||
m_aOutputStreams.front().m_aResourceDict.m_aShadings[ rResource ] = nObject;
|
||||
break;
|
||||
case ResourceKind::Pattern:
|
||||
m_aGlobalResourceDict.m_aPatterns[ rResource ] = nObject;
|
||||
if( ! m_aOutputStreams.empty() )
|
||||
m_aOutputStreams.front().m_aResourceDict.m_aPatterns[ rResource ] = nObject;
|
||||
break;
|
||||
}
|
||||
case ResourceKind::XObject:
|
||||
m_aGlobalResourceDict.m_aXObjects[ rResource ] = nObject;
|
||||
if( ! m_aOutputStreams.empty() )
|
||||
m_aOutputStreams.front().m_aResourceDict.m_aXObjects[ rResource ] = nObject;
|
||||
break;
|
||||
case ResourceKind::ExtGState:
|
||||
m_aGlobalResourceDict.m_aExtGStates[ rResource ] = nObject;
|
||||
if( ! m_aOutputStreams.empty() )
|
||||
m_aOutputStreams.front().m_aResourceDict.m_aExtGStates[ rResource ] = nObject;
|
||||
break;
|
||||
case ResourceKind::Shading:
|
||||
m_aGlobalResourceDict.m_aShadings[ rResource ] = nObject;
|
||||
if( ! m_aOutputStreams.empty() )
|
||||
m_aOutputStreams.front().m_aResourceDict.m_aShadings[ rResource ] = nObject;
|
||||
break;
|
||||
case ResourceKind::Pattern:
|
||||
m_aGlobalResourceDict.m_aPatterns[ rResource ] = nObject;
|
||||
if( ! m_aOutputStreams.empty() )
|
||||
m_aOutputStreams.front().m_aResourceDict.m_aPatterns[ rResource ] = nObject;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -7979,21 +7979,21 @@ void PDFWriterImpl::drawPolyLine( const tools::Polygon& rPoly, const PDFWriter::
|
||||
}
|
||||
writeBuffer( "Q\n", 2 );
|
||||
|
||||
if( rInfo.m_fTransparency != 0.0 )
|
||||
if( rInfo.m_fTransparency == 0.0 )
|
||||
return;
|
||||
|
||||
// FIXME: actually this may be incorrect with bezier polygons
|
||||
tools::Rectangle aBoundRect( rPoly.GetBoundRect() );
|
||||
// avoid clipping with thick lines
|
||||
if( rInfo.m_fLineWidth > 0.0 )
|
||||
{
|
||||
// FIXME: actually this may be incorrect with bezier polygons
|
||||
tools::Rectangle aBoundRect( rPoly.GetBoundRect() );
|
||||
// avoid clipping with thick lines
|
||||
if( rInfo.m_fLineWidth > 0.0 )
|
||||
{
|
||||
sal_Int32 nLW = sal_Int32(rInfo.m_fLineWidth);
|
||||
aBoundRect.AdjustTop( -nLW );
|
||||
aBoundRect.AdjustLeft( -nLW );
|
||||
aBoundRect.AdjustRight(nLW );
|
||||
aBoundRect.AdjustBottom(nLW );
|
||||
}
|
||||
endTransparencyGroup( aBoundRect, static_cast<sal_uInt16>(100.0*rInfo.m_fTransparency) );
|
||||
sal_Int32 nLW = sal_Int32(rInfo.m_fLineWidth);
|
||||
aBoundRect.AdjustTop( -nLW );
|
||||
aBoundRect.AdjustLeft( -nLW );
|
||||
aBoundRect.AdjustRight(nLW );
|
||||
aBoundRect.AdjustBottom(nLW );
|
||||
}
|
||||
endTransparencyGroup( aBoundRect, static_cast<sal_uInt16>(100.0*rInfo.m_fTransparency) );
|
||||
}
|
||||
|
||||
void PDFWriterImpl::drawPixel( const Point& rPoint, const Color& rColor )
|
||||
@ -9698,31 +9698,31 @@ void PDFWriterImpl::setClipRegion( const basegfx::B2DPolyPolygon& rRegion )
|
||||
|
||||
void PDFWriterImpl::moveClipRegion( sal_Int32 nX, sal_Int32 nY )
|
||||
{
|
||||
if( m_aGraphicsStack.front().m_bClipRegion && m_aGraphicsStack.front().m_aClipRegion.count() )
|
||||
if( !(m_aGraphicsStack.front().m_bClipRegion && m_aGraphicsStack.front().m_aClipRegion.count()) )
|
||||
return;
|
||||
|
||||
// tdf#130150 improve coordinate manipulations to double precision transformations
|
||||
basegfx::B2DHomMatrix aConvertA;
|
||||
|
||||
if(MapUnit::MapPixel == m_aGraphicsStack.front().m_aMapMode.GetMapUnit())
|
||||
{
|
||||
// tdf#130150 improve coordinate manipulations to double precision transformations
|
||||
basegfx::B2DHomMatrix aConvertA;
|
||||
|
||||
if(MapUnit::MapPixel == m_aGraphicsStack.front().m_aMapMode.GetMapUnit())
|
||||
{
|
||||
aConvertA = GetInverseViewTransformation(m_aMapMode);
|
||||
}
|
||||
else
|
||||
{
|
||||
aConvertA = LogicToLogic(m_aGraphicsStack.front().m_aMapMode, m_aMapMode);
|
||||
}
|
||||
|
||||
basegfx::B2DPoint aB2DPointA(nX, nY);
|
||||
basegfx::B2DPoint aB2DPointB(0.0, 0.0);
|
||||
aB2DPointA *= aConvertA;
|
||||
aB2DPointB *= aConvertA;
|
||||
aB2DPointA -= aB2DPointB;
|
||||
basegfx::B2DHomMatrix aMat;
|
||||
|
||||
aMat.translate(aB2DPointA.getX(), aB2DPointA.getY());
|
||||
m_aGraphicsStack.front().m_aClipRegion.transform( aMat );
|
||||
m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::ClipRegion;
|
||||
aConvertA = GetInverseViewTransformation(m_aMapMode);
|
||||
}
|
||||
else
|
||||
{
|
||||
aConvertA = LogicToLogic(m_aGraphicsStack.front().m_aMapMode, m_aMapMode);
|
||||
}
|
||||
|
||||
basegfx::B2DPoint aB2DPointA(nX, nY);
|
||||
basegfx::B2DPoint aB2DPointB(0.0, 0.0);
|
||||
aB2DPointA *= aConvertA;
|
||||
aB2DPointB *= aConvertA;
|
||||
aB2DPointA -= aB2DPointB;
|
||||
basegfx::B2DHomMatrix aMat;
|
||||
|
||||
aMat.translate(aB2DPointA.getX(), aB2DPointA.getY());
|
||||
m_aGraphicsStack.front().m_aClipRegion.transform( aMat );
|
||||
m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::ClipRegion;
|
||||
}
|
||||
|
||||
void PDFWriterImpl::intersectClipRegion( const tools::Rectangle& rRect )
|
||||
@ -10269,62 +10269,62 @@ void PDFWriterImpl::addInternalStructureContainer( PDFStructureElement& rEle )
|
||||
}
|
||||
}
|
||||
|
||||
if( rEle.m_nOwnElement != rEle.m_nParentElement )
|
||||
if( rEle.m_nOwnElement == rEle.m_nParentElement )
|
||||
return;
|
||||
|
||||
if( rEle.m_aKids.empty() )
|
||||
return;
|
||||
|
||||
if( rEle.m_aKids.size() <= ncMaxPDFArraySize ) return;
|
||||
|
||||
//then we need to add the containers for the kids elements
|
||||
// a list to be used for the new kid element
|
||||
std::list< PDFStructureElementKid > aNewKids;
|
||||
std::list< sal_Int32 > aNewChildren;
|
||||
|
||||
// add Div in RoleMap, in case no one else did (TODO: is it needed? Is it dangerous?)
|
||||
OString aAliasName("Div");
|
||||
addRoleMap(aAliasName, PDFWriter::Division);
|
||||
|
||||
while( rEle.m_aKids.size() > ncMaxPDFArraySize )
|
||||
{
|
||||
if( !rEle.m_aKids.empty() )
|
||||
sal_Int32 nCurrentStructElement = rEle.m_nOwnElement;
|
||||
sal_Int32 nNewId = sal_Int32(m_aStructure.size());
|
||||
m_aStructure.emplace_back( );
|
||||
PDFStructureElement& rEleNew = m_aStructure.back();
|
||||
rEleNew.m_aAlias = aAliasName;
|
||||
rEleNew.m_eType = PDFWriter::Division; // a new Div type container
|
||||
rEleNew.m_nOwnElement = nNewId;
|
||||
rEleNew.m_nParentElement = nCurrentStructElement;
|
||||
//inherit the same page as the first child to be reparented
|
||||
rEleNew.m_nFirstPageObject = m_aStructure[ rEle.m_aChildren.front() ].m_nFirstPageObject;
|
||||
rEleNew.m_nObject = createObject();//assign a PDF object number
|
||||
//add the object to the kid list of the parent
|
||||
aNewKids.emplace_back( rEleNew.m_nObject );
|
||||
aNewChildren.push_back( nNewId );
|
||||
|
||||
std::list< sal_Int32 >::iterator aChildEndIt( rEle.m_aChildren.begin() );
|
||||
std::list< PDFStructureElementKid >::iterator aKidEndIt( rEle.m_aKids.begin() );
|
||||
advance( aChildEndIt, ncMaxPDFArraySize );
|
||||
advance( aKidEndIt, ncMaxPDFArraySize );
|
||||
|
||||
rEleNew.m_aKids.splice( rEleNew.m_aKids.begin(),
|
||||
rEle.m_aKids,
|
||||
rEle.m_aKids.begin(),
|
||||
aKidEndIt );
|
||||
rEleNew.m_aChildren.splice( rEleNew.m_aChildren.begin(),
|
||||
rEle.m_aChildren,
|
||||
rEle.m_aChildren.begin(),
|
||||
aChildEndIt );
|
||||
// set the kid's new parent
|
||||
for (auto const& child : rEleNew.m_aChildren)
|
||||
{
|
||||
if( rEle.m_aKids.size() > ncMaxPDFArraySize ) {
|
||||
//then we need to add the containers for the kids elements
|
||||
// a list to be used for the new kid element
|
||||
std::list< PDFStructureElementKid > aNewKids;
|
||||
std::list< sal_Int32 > aNewChildren;
|
||||
|
||||
// add Div in RoleMap, in case no one else did (TODO: is it needed? Is it dangerous?)
|
||||
OString aAliasName("Div");
|
||||
addRoleMap(aAliasName, PDFWriter::Division);
|
||||
|
||||
while( rEle.m_aKids.size() > ncMaxPDFArraySize )
|
||||
{
|
||||
sal_Int32 nCurrentStructElement = rEle.m_nOwnElement;
|
||||
sal_Int32 nNewId = sal_Int32(m_aStructure.size());
|
||||
m_aStructure.emplace_back( );
|
||||
PDFStructureElement& rEleNew = m_aStructure.back();
|
||||
rEleNew.m_aAlias = aAliasName;
|
||||
rEleNew.m_eType = PDFWriter::Division; // a new Div type container
|
||||
rEleNew.m_nOwnElement = nNewId;
|
||||
rEleNew.m_nParentElement = nCurrentStructElement;
|
||||
//inherit the same page as the first child to be reparented
|
||||
rEleNew.m_nFirstPageObject = m_aStructure[ rEle.m_aChildren.front() ].m_nFirstPageObject;
|
||||
rEleNew.m_nObject = createObject();//assign a PDF object number
|
||||
//add the object to the kid list of the parent
|
||||
aNewKids.emplace_back( rEleNew.m_nObject );
|
||||
aNewChildren.push_back( nNewId );
|
||||
|
||||
std::list< sal_Int32 >::iterator aChildEndIt( rEle.m_aChildren.begin() );
|
||||
std::list< PDFStructureElementKid >::iterator aKidEndIt( rEle.m_aKids.begin() );
|
||||
advance( aChildEndIt, ncMaxPDFArraySize );
|
||||
advance( aKidEndIt, ncMaxPDFArraySize );
|
||||
|
||||
rEleNew.m_aKids.splice( rEleNew.m_aKids.begin(),
|
||||
rEle.m_aKids,
|
||||
rEle.m_aKids.begin(),
|
||||
aKidEndIt );
|
||||
rEleNew.m_aChildren.splice( rEleNew.m_aChildren.begin(),
|
||||
rEle.m_aChildren,
|
||||
rEle.m_aChildren.begin(),
|
||||
aChildEndIt );
|
||||
// set the kid's new parent
|
||||
for (auto const& child : rEleNew.m_aChildren)
|
||||
{
|
||||
m_aStructure[ child ].m_nParentElement = nNewId;
|
||||
}
|
||||
}
|
||||
//finally add the new kids resulting from the container added
|
||||
rEle.m_aKids.insert( rEle.m_aKids.begin(), aNewKids.begin(), aNewKids.end() );
|
||||
rEle.m_aChildren.insert( rEle.m_aChildren.begin(), aNewChildren.begin(), aNewChildren.end() );
|
||||
}
|
||||
m_aStructure[ child ].m_nParentElement = nNewId;
|
||||
}
|
||||
}
|
||||
//finally add the new kids resulting from the container added
|
||||
rEle.m_aKids.insert( rEle.m_aKids.begin(), aNewKids.begin(), aNewKids.end() );
|
||||
rEle.m_aChildren.insert( rEle.m_aChildren.begin(), aNewChildren.begin(), aNewChildren.end() );
|
||||
}
|
||||
|
||||
bool PDFWriterImpl::setCurrentStructureElement( sal_Int32 nEle )
|
||||
@ -10692,18 +10692,18 @@ void PDFWriterImpl::setStructureBoundingBox( const tools::Rectangle& rRect )
|
||||
if( nPageNr < 0 || nPageNr >= static_cast<sal_Int32>(m_aPages.size()) || !m_aContext.Tagged )
|
||||
return;
|
||||
|
||||
if( m_nCurrentStructElement > 0 && m_bEmitStructure )
|
||||
if( !(m_nCurrentStructElement > 0 && m_bEmitStructure) )
|
||||
return;
|
||||
|
||||
PDFWriter::StructElement eType = m_aStructure[ m_nCurrentStructElement ].m_eType;
|
||||
if( eType == PDFWriter::Figure ||
|
||||
eType == PDFWriter::Formula ||
|
||||
eType == PDFWriter::Form ||
|
||||
eType == PDFWriter::Table )
|
||||
{
|
||||
PDFWriter::StructElement eType = m_aStructure[ m_nCurrentStructElement ].m_eType;
|
||||
if( eType == PDFWriter::Figure ||
|
||||
eType == PDFWriter::Formula ||
|
||||
eType == PDFWriter::Form ||
|
||||
eType == PDFWriter::Table )
|
||||
{
|
||||
m_aStructure[ m_nCurrentStructElement ].m_aBBox = rRect;
|
||||
// convert to default user space now, since the mapmode may change
|
||||
m_aPages[nPageNr].convertRect( m_aStructure[ m_nCurrentStructElement ].m_aBBox );
|
||||
}
|
||||
m_aStructure[ m_nCurrentStructElement ].m_aBBox = rRect;
|
||||
// convert to default user space now, since the mapmode may change
|
||||
m_aPages[nPageNr].convertRect( m_aStructure[ m_nCurrentStructElement ].m_aBBox );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -153,124 +153,124 @@ void PDFWriterImpl::implWriteBitmapEx( const Point& i_rPoint, const Size& i_rSiz
|
||||
}
|
||||
|
||||
const Size aSizePixel( aBitmapEx.GetSizePixel() );
|
||||
if ( aSizePixel.Width() && aSizePixel.Height() )
|
||||
if ( !(aSizePixel.Width() && aSizePixel.Height()) )
|
||||
return;
|
||||
|
||||
if( m_aContext.ColorMode == PDFWriter::DrawGreyscale )
|
||||
{
|
||||
if( m_aContext.ColorMode == PDFWriter::DrawGreyscale )
|
||||
BmpConversion eConv = BmpConversion::N8BitGreys;
|
||||
int nDepth = aBitmapEx.GetBitmap().GetBitCount();
|
||||
if( nDepth <= 4 )
|
||||
eConv = BmpConversion::N4BitGreys;
|
||||
if( nDepth > 1 )
|
||||
aBitmapEx.Convert( eConv );
|
||||
}
|
||||
bool bUseJPGCompression = !i_rContext.m_bOnlyLosslessCompression;
|
||||
if ( bIsPng || ( aSizePixel.Width() < 32 ) || ( aSizePixel.Height() < 32 ) )
|
||||
bUseJPGCompression = false;
|
||||
|
||||
auto pStrm=std::make_shared<SvMemoryStream>();
|
||||
Bitmap aMask;
|
||||
|
||||
bool bTrueColorJPG = true;
|
||||
if ( bUseJPGCompression )
|
||||
{
|
||||
// TODO this checks could be done much earlier, saving us
|
||||
// from trying conversion & stores before...
|
||||
if ( !aBitmapEx.IsTransparent() )
|
||||
{
|
||||
BmpConversion eConv = BmpConversion::N8BitGreys;
|
||||
int nDepth = aBitmapEx.GetBitmap().GetBitCount();
|
||||
if( nDepth <= 4 )
|
||||
eConv = BmpConversion::N4BitGreys;
|
||||
if( nDepth > 1 )
|
||||
aBitmapEx.Convert( eConv );
|
||||
const auto& rCacheEntry=m_aPDFBmpCache.find(
|
||||
aBitmapEx.GetChecksum());
|
||||
if ( rCacheEntry != m_aPDFBmpCache.end() )
|
||||
{
|
||||
m_rOuterFace.DrawJPGBitmap( *rCacheEntry->second, true, aSizePixel,
|
||||
tools::Rectangle( aPoint, aSize ), aMask, i_Graphic );
|
||||
return;
|
||||
}
|
||||
}
|
||||
bool bUseJPGCompression = !i_rContext.m_bOnlyLosslessCompression;
|
||||
if ( bIsPng || ( aSizePixel.Width() < 32 ) || ( aSizePixel.Height() < 32 ) )
|
||||
bUseJPGCompression = false;
|
||||
|
||||
auto pStrm=std::make_shared<SvMemoryStream>();
|
||||
Bitmap aMask;
|
||||
|
||||
bool bTrueColorJPG = true;
|
||||
if ( bUseJPGCompression )
|
||||
sal_uInt32 nZippedFileSize = 0; // sj: we will calculate the filesize of a zipped bitmap
|
||||
if ( !bIsJpeg ) // to determine if jpeg compression is useful
|
||||
{
|
||||
// TODO this checks could be done much earlier, saving us
|
||||
// from trying conversion & stores before...
|
||||
if ( !aBitmapEx.IsTransparent() )
|
||||
{
|
||||
const auto& rCacheEntry=m_aPDFBmpCache.find(
|
||||
aBitmapEx.GetChecksum());
|
||||
if ( rCacheEntry != m_aPDFBmpCache.end() )
|
||||
{
|
||||
m_rOuterFace.DrawJPGBitmap( *rCacheEntry->second, true, aSizePixel,
|
||||
tools::Rectangle( aPoint, aSize ), aMask, i_Graphic );
|
||||
return;
|
||||
}
|
||||
}
|
||||
sal_uInt32 nZippedFileSize = 0; // sj: we will calculate the filesize of a zipped bitmap
|
||||
if ( !bIsJpeg ) // to determine if jpeg compression is useful
|
||||
{
|
||||
SvMemoryStream aTemp;
|
||||
aTemp.SetCompressMode( aTemp.GetCompressMode() | SvStreamCompressFlags::ZBITMAP );
|
||||
aTemp.SetVersion( SOFFICE_FILEFORMAT_40 ); // sj: up from version 40 our bitmap stream operator
|
||||
WriteDIBBitmapEx(aBitmapEx, aTemp); // is capable of zlib stream compression
|
||||
nZippedFileSize = aTemp.TellEnd();
|
||||
}
|
||||
if ( aBitmapEx.IsTransparent() )
|
||||
{
|
||||
if ( aBitmapEx.IsAlpha() )
|
||||
aMask = aBitmapEx.GetAlpha().GetBitmap();
|
||||
else
|
||||
aMask = aBitmapEx.GetMask();
|
||||
}
|
||||
Graphic aGraphic( aBitmapEx.GetBitmap() );
|
||||
SvMemoryStream aTemp;
|
||||
aTemp.SetCompressMode( aTemp.GetCompressMode() | SvStreamCompressFlags::ZBITMAP );
|
||||
aTemp.SetVersion( SOFFICE_FILEFORMAT_40 ); // sj: up from version 40 our bitmap stream operator
|
||||
WriteDIBBitmapEx(aBitmapEx, aTemp); // is capable of zlib stream compression
|
||||
nZippedFileSize = aTemp.TellEnd();
|
||||
}
|
||||
if ( aBitmapEx.IsTransparent() )
|
||||
{
|
||||
if ( aBitmapEx.IsAlpha() )
|
||||
aMask = aBitmapEx.GetAlpha().GetBitmap();
|
||||
else
|
||||
aMask = aBitmapEx.GetMask();
|
||||
}
|
||||
Graphic aGraphic( aBitmapEx.GetBitmap() );
|
||||
|
||||
Sequence< PropertyValue > aFilterData( 2 );
|
||||
aFilterData[ 0 ].Name = "Quality";
|
||||
aFilterData[ 0 ].Value <<= sal_Int32(i_rContext.m_nJPEGQuality);
|
||||
aFilterData[ 1 ].Name = "ColorMode";
|
||||
aFilterData[ 1 ].Value <<= sal_Int32(0);
|
||||
Sequence< PropertyValue > aFilterData( 2 );
|
||||
aFilterData[ 0 ].Name = "Quality";
|
||||
aFilterData[ 0 ].Value <<= sal_Int32(i_rContext.m_nJPEGQuality);
|
||||
aFilterData[ 1 ].Name = "ColorMode";
|
||||
aFilterData[ 1 ].Value <<= sal_Int32(0);
|
||||
|
||||
try
|
||||
{
|
||||
uno::Reference < io::XStream > xStream = new utl::OStreamWrapper( *pStrm );
|
||||
uno::Reference< io::XSeekable > xSeekable( xStream, UNO_QUERY_THROW );
|
||||
uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() );
|
||||
uno::Reference< graphic::XGraphicProvider > xGraphicProvider( graphic::GraphicProvider::create(xContext) );
|
||||
uno::Reference< graphic::XGraphic > xGraphic( aGraphic.GetXGraphic() );
|
||||
uno::Reference < io::XOutputStream > xOut( xStream->getOutputStream() );
|
||||
uno::Sequence< beans::PropertyValue > aOutMediaProperties( 3 );
|
||||
aOutMediaProperties[0].Name = "OutputStream";
|
||||
aOutMediaProperties[0].Value <<= xOut;
|
||||
aOutMediaProperties[1].Name = "MimeType";
|
||||
aOutMediaProperties[1].Value <<= OUString("image/jpeg");
|
||||
aOutMediaProperties[2].Name = "FilterData";
|
||||
aOutMediaProperties[2].Value <<= aFilterData;
|
||||
xGraphicProvider->storeGraphic( xGraphic, aOutMediaProperties );
|
||||
xOut->flush();
|
||||
if ( !bIsJpeg && xSeekable->getLength() > nZippedFileSize )
|
||||
{
|
||||
bUseJPGCompression = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
pStrm->Seek( STREAM_SEEK_TO_END );
|
||||
|
||||
xSeekable->seek( 0 );
|
||||
Sequence< PropertyValue > aArgs( 1 );
|
||||
aArgs[ 0 ].Name = "InputStream";
|
||||
aArgs[ 0 ].Value <<= xStream;
|
||||
uno::Reference< XPropertySet > xPropSet( xGraphicProvider->queryGraphicDescriptor( aArgs ) );
|
||||
if ( xPropSet.is() )
|
||||
{
|
||||
sal_Int16 nBitsPerPixel = 24;
|
||||
if ( xPropSet->getPropertyValue("BitsPerPixel") >>= nBitsPerPixel )
|
||||
{
|
||||
bTrueColorJPG = nBitsPerPixel != 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch( uno::Exception& )
|
||||
try
|
||||
{
|
||||
uno::Reference < io::XStream > xStream = new utl::OStreamWrapper( *pStrm );
|
||||
uno::Reference< io::XSeekable > xSeekable( xStream, UNO_QUERY_THROW );
|
||||
uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() );
|
||||
uno::Reference< graphic::XGraphicProvider > xGraphicProvider( graphic::GraphicProvider::create(xContext) );
|
||||
uno::Reference< graphic::XGraphic > xGraphic( aGraphic.GetXGraphic() );
|
||||
uno::Reference < io::XOutputStream > xOut( xStream->getOutputStream() );
|
||||
uno::Sequence< beans::PropertyValue > aOutMediaProperties( 3 );
|
||||
aOutMediaProperties[0].Name = "OutputStream";
|
||||
aOutMediaProperties[0].Value <<= xOut;
|
||||
aOutMediaProperties[1].Name = "MimeType";
|
||||
aOutMediaProperties[1].Value <<= OUString("image/jpeg");
|
||||
aOutMediaProperties[2].Name = "FilterData";
|
||||
aOutMediaProperties[2].Value <<= aFilterData;
|
||||
xGraphicProvider->storeGraphic( xGraphic, aOutMediaProperties );
|
||||
xOut->flush();
|
||||
if ( !bIsJpeg && xSeekable->getLength() > nZippedFileSize )
|
||||
{
|
||||
bUseJPGCompression = false;
|
||||
}
|
||||
}
|
||||
if ( bUseJPGCompression )
|
||||
{
|
||||
m_rOuterFace.DrawJPGBitmap( *pStrm, bTrueColorJPG, aSizePixel, tools::Rectangle( aPoint, aSize ), aMask, i_Graphic );
|
||||
if (!aBitmapEx.IsTransparent() && bTrueColorJPG)
|
||||
else
|
||||
{
|
||||
// Cache last jpeg export
|
||||
m_aPDFBmpCache.insert(
|
||||
{aBitmapEx.GetChecksum(), pStrm});
|
||||
pStrm->Seek( STREAM_SEEK_TO_END );
|
||||
|
||||
xSeekable->seek( 0 );
|
||||
Sequence< PropertyValue > aArgs( 1 );
|
||||
aArgs[ 0 ].Name = "InputStream";
|
||||
aArgs[ 0 ].Value <<= xStream;
|
||||
uno::Reference< XPropertySet > xPropSet( xGraphicProvider->queryGraphicDescriptor( aArgs ) );
|
||||
if ( xPropSet.is() )
|
||||
{
|
||||
sal_Int16 nBitsPerPixel = 24;
|
||||
if ( xPropSet->getPropertyValue("BitsPerPixel") >>= nBitsPerPixel )
|
||||
{
|
||||
bTrueColorJPG = nBitsPerPixel != 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( aBitmapEx.IsTransparent() )
|
||||
m_rOuterFace.DrawBitmapEx( aPoint, aSize, aBitmapEx );
|
||||
else
|
||||
m_rOuterFace.DrawBitmap( aPoint, aSize, aBitmapEx.GetBitmap(), i_Graphic );
|
||||
catch( uno::Exception& )
|
||||
{
|
||||
bUseJPGCompression = false;
|
||||
}
|
||||
}
|
||||
if ( bUseJPGCompression )
|
||||
{
|
||||
m_rOuterFace.DrawJPGBitmap( *pStrm, bTrueColorJPG, aSizePixel, tools::Rectangle( aPoint, aSize ), aMask, i_Graphic );
|
||||
if (!aBitmapEx.IsTransparent() && bTrueColorJPG)
|
||||
{
|
||||
// Cache last jpeg export
|
||||
m_aPDFBmpCache.insert(
|
||||
{aBitmapEx.GetChecksum(), pStrm});
|
||||
}
|
||||
}
|
||||
else if ( aBitmapEx.IsTransparent() )
|
||||
m_rOuterFace.DrawBitmapEx( aPoint, aSize, aBitmapEx );
|
||||
else
|
||||
m_rOuterFace.DrawBitmap( aPoint, aSize, aBitmapEx.GetBitmap(), i_Graphic );
|
||||
|
||||
}
|
||||
|
||||
@ -1090,41 +1090,41 @@ EncHashTransporter* EncHashTransporter::getEncHashTransporter( const uno::Refere
|
||||
|
||||
void PDFWriterImpl::checkAndEnableStreamEncryption( sal_Int32 nObject )
|
||||
{
|
||||
if( m_aContext.Encryption.Encrypt() )
|
||||
{
|
||||
m_bEncryptThisStream = true;
|
||||
sal_Int32 i = m_nKeyLength;
|
||||
m_aContext.Encryption.EncryptionKey[i++] = static_cast<sal_uInt8>(nObject);
|
||||
m_aContext.Encryption.EncryptionKey[i++] = static_cast<sal_uInt8>( nObject >> 8 );
|
||||
m_aContext.Encryption.EncryptionKey[i++] = static_cast<sal_uInt8>( nObject >> 16 );
|
||||
// the other location of m_nEncryptionKey is already set to 0, our fixed generation number
|
||||
// do the MD5 hash
|
||||
::std::vector<unsigned char> const nMD5Sum(::comphelper::Hash::calculateHash(
|
||||
m_aContext.Encryption.EncryptionKey.data(), i+2, ::comphelper::HashType::MD5));
|
||||
// the i+2 to take into account the generation number, always zero
|
||||
// initialize the RC4 with the key
|
||||
// key length: see algorithm 3.1, step 4: (N+5) max 16
|
||||
rtl_cipher_initARCFOUR( m_aCipher, rtl_Cipher_DirectionEncode, nMD5Sum.data(), m_nRC4KeyLength, nullptr, 0 );
|
||||
}
|
||||
if( !m_aContext.Encryption.Encrypt() )
|
||||
return;
|
||||
|
||||
m_bEncryptThisStream = true;
|
||||
sal_Int32 i = m_nKeyLength;
|
||||
m_aContext.Encryption.EncryptionKey[i++] = static_cast<sal_uInt8>(nObject);
|
||||
m_aContext.Encryption.EncryptionKey[i++] = static_cast<sal_uInt8>( nObject >> 8 );
|
||||
m_aContext.Encryption.EncryptionKey[i++] = static_cast<sal_uInt8>( nObject >> 16 );
|
||||
// the other location of m_nEncryptionKey is already set to 0, our fixed generation number
|
||||
// do the MD5 hash
|
||||
::std::vector<unsigned char> const nMD5Sum(::comphelper::Hash::calculateHash(
|
||||
m_aContext.Encryption.EncryptionKey.data(), i+2, ::comphelper::HashType::MD5));
|
||||
// the i+2 to take into account the generation number, always zero
|
||||
// initialize the RC4 with the key
|
||||
// key length: see algorithm 3.1, step 4: (N+5) max 16
|
||||
rtl_cipher_initARCFOUR( m_aCipher, rtl_Cipher_DirectionEncode, nMD5Sum.data(), m_nRC4KeyLength, nullptr, 0 );
|
||||
}
|
||||
|
||||
void PDFWriterImpl::enableStringEncryption( sal_Int32 nObject )
|
||||
{
|
||||
if( m_aContext.Encryption.Encrypt() )
|
||||
{
|
||||
sal_Int32 i = m_nKeyLength;
|
||||
m_aContext.Encryption.EncryptionKey[i++] = static_cast<sal_uInt8>(nObject);
|
||||
m_aContext.Encryption.EncryptionKey[i++] = static_cast<sal_uInt8>( nObject >> 8 );
|
||||
m_aContext.Encryption.EncryptionKey[i++] = static_cast<sal_uInt8>( nObject >> 16 );
|
||||
// the other location of m_nEncryptionKey is already set to 0, our fixed generation number
|
||||
// do the MD5 hash
|
||||
// the i+2 to take into account the generation number, always zero
|
||||
::std::vector<unsigned char> const nMD5Sum(::comphelper::Hash::calculateHash(
|
||||
m_aContext.Encryption.EncryptionKey.data(), i+2, ::comphelper::HashType::MD5));
|
||||
// initialize the RC4 with the key
|
||||
// key length: see algorithm 3.1, step 4: (N+5) max 16
|
||||
rtl_cipher_initARCFOUR( m_aCipher, rtl_Cipher_DirectionEncode, nMD5Sum.data(), m_nRC4KeyLength, nullptr, 0 );
|
||||
}
|
||||
if( !m_aContext.Encryption.Encrypt() )
|
||||
return;
|
||||
|
||||
sal_Int32 i = m_nKeyLength;
|
||||
m_aContext.Encryption.EncryptionKey[i++] = static_cast<sal_uInt8>(nObject);
|
||||
m_aContext.Encryption.EncryptionKey[i++] = static_cast<sal_uInt8>( nObject >> 8 );
|
||||
m_aContext.Encryption.EncryptionKey[i++] = static_cast<sal_uInt8>( nObject >> 16 );
|
||||
// the other location of m_nEncryptionKey is already set to 0, our fixed generation number
|
||||
// do the MD5 hash
|
||||
// the i+2 to take into account the generation number, always zero
|
||||
::std::vector<unsigned char> const nMD5Sum(::comphelper::Hash::calculateHash(
|
||||
m_aContext.Encryption.EncryptionKey.data(), i+2, ::comphelper::HashType::MD5));
|
||||
// initialize the RC4 with the key
|
||||
// key length: see algorithm 3.1, step 4: (N+5) max 16
|
||||
rtl_cipher_initARCFOUR( m_aCipher, rtl_Cipher_DirectionEncode, nMD5Sum.data(), m_nRC4KeyLength, nullptr, 0 );
|
||||
}
|
||||
|
||||
/* init the encryption engine
|
||||
|
@ -1252,26 +1252,26 @@ void Printer::ImplFindPaperFormatForUserSize( JobSetup& aJobSetup )
|
||||
// If the printer supports landscape orientation, check paper sizes again
|
||||
// with landscape orientation. This is necessary as a printer driver provides
|
||||
// all paper sizes with portrait orientation only!!
|
||||
if ( rData.GetPaperFormat() == PAPER_USER &&
|
||||
if ( !(rData.GetPaperFormat() == PAPER_USER &&
|
||||
nLandscapeAngle != 0 &&
|
||||
HasSupport( PrinterSupport::SetOrientation ))
|
||||
HasSupport( PrinterSupport::SetOrientation )))
|
||||
return;
|
||||
|
||||
const long nRotatedWidth = rData.GetPaperHeight();
|
||||
const long nRotatedHeight = rData.GetPaperWidth();
|
||||
PaperInfo aRotatedInfo(nRotatedWidth, nRotatedHeight);
|
||||
|
||||
for ( int i = 0; i < nPaperCount; i++ )
|
||||
{
|
||||
const long nRotatedWidth = rData.GetPaperHeight();
|
||||
const long nRotatedHeight = rData.GetPaperWidth();
|
||||
PaperInfo aRotatedInfo(nRotatedWidth, nRotatedHeight);
|
||||
const PaperInfo& rPaperInfo = GetPaperInfo( i );
|
||||
|
||||
for ( int i = 0; i < nPaperCount; i++ )
|
||||
if ( aRotatedInfo.sloppyEqual( rPaperInfo ) )
|
||||
{
|
||||
const PaperInfo& rPaperInfo = GetPaperInfo( i );
|
||||
|
||||
if ( aRotatedInfo.sloppyEqual( rPaperInfo ) )
|
||||
{
|
||||
rData.SetPaperFormat(
|
||||
ImplGetPaperFormat( rPaperInfo.getWidth(),
|
||||
rPaperInfo.getHeight() ));
|
||||
rData.SetOrientation( Orientation::Landscape );
|
||||
return;
|
||||
}
|
||||
rData.SetPaperFormat(
|
||||
ImplGetPaperFormat( rPaperInfo.getWidth(),
|
||||
rPaperInfo.getHeight() ));
|
||||
rData.SetOrientation( Orientation::Landscape );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1281,37 +1281,37 @@ void Printer::SetPaper( Paper ePaper )
|
||||
if ( mbInPrintPage )
|
||||
return;
|
||||
|
||||
if ( maJobSetup.ImplGetConstData().GetPaperFormat() != ePaper )
|
||||
if ( maJobSetup.ImplGetConstData().GetPaperFormat() == ePaper )
|
||||
return;
|
||||
|
||||
JobSetup aJobSetup = maJobSetup;
|
||||
ImplJobSetup& rData = aJobSetup.ImplGetData();
|
||||
|
||||
rData.SetPaperFormat( ePaper );
|
||||
if ( ePaper != PAPER_USER )
|
||||
{
|
||||
JobSetup aJobSetup = maJobSetup;
|
||||
ImplJobSetup& rData = aJobSetup.ImplGetData();
|
||||
PaperInfo aInfo(ePaper);
|
||||
rData.SetPaperWidth( aInfo.getWidth() );
|
||||
rData.SetPaperHeight( aInfo.getHeight() );
|
||||
}
|
||||
|
||||
rData.SetPaperFormat( ePaper );
|
||||
if ( ePaper != PAPER_USER )
|
||||
{
|
||||
PaperInfo aInfo(ePaper);
|
||||
rData.SetPaperWidth( aInfo.getWidth() );
|
||||
rData.SetPaperHeight( aInfo.getHeight() );
|
||||
}
|
||||
if ( IsDisplayPrinter() )
|
||||
{
|
||||
mbNewJobSetup = true;
|
||||
maJobSetup = aJobSetup;
|
||||
return;
|
||||
}
|
||||
|
||||
if ( IsDisplayPrinter() )
|
||||
{
|
||||
mbNewJobSetup = true;
|
||||
maJobSetup = aJobSetup;
|
||||
return;
|
||||
}
|
||||
|
||||
ReleaseGraphics();
|
||||
if ( ePaper == PAPER_USER )
|
||||
ImplFindPaperFormatForUserSize( aJobSetup );
|
||||
if ( mpInfoPrinter->SetData( JobSetFlags::PAPERSIZE | JobSetFlags::ORIENTATION, &rData ))
|
||||
{
|
||||
ImplUpdateJobSetupPaper( aJobSetup );
|
||||
mbNewJobSetup = true;
|
||||
maJobSetup = aJobSetup;
|
||||
ImplUpdatePageData();
|
||||
ImplUpdateFontList();
|
||||
}
|
||||
ReleaseGraphics();
|
||||
if ( ePaper == PAPER_USER )
|
||||
ImplFindPaperFormatForUserSize( aJobSetup );
|
||||
if ( mpInfoPrinter->SetData( JobSetFlags::PAPERSIZE | JobSetFlags::ORIENTATION, &rData ))
|
||||
{
|
||||
ImplUpdateJobSetupPaper( aJobSetup );
|
||||
mbNewJobSetup = true;
|
||||
maJobSetup = aJobSetup;
|
||||
ImplUpdatePageData();
|
||||
ImplUpdateFontList();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1433,29 +1433,29 @@ void Printer::SetDuplexMode( DuplexMode eDuplex )
|
||||
if ( mbInPrintPage )
|
||||
return;
|
||||
|
||||
if ( maJobSetup.ImplGetConstData().GetDuplexMode() != eDuplex )
|
||||
if ( maJobSetup.ImplGetConstData().GetDuplexMode() == eDuplex )
|
||||
return;
|
||||
|
||||
JobSetup aJobSetup = maJobSetup;
|
||||
ImplJobSetup& rData = aJobSetup.ImplGetData();
|
||||
|
||||
rData.SetDuplexMode( eDuplex );
|
||||
|
||||
if ( IsDisplayPrinter() )
|
||||
{
|
||||
JobSetup aJobSetup = maJobSetup;
|
||||
ImplJobSetup& rData = aJobSetup.ImplGetData();
|
||||
mbNewJobSetup = true;
|
||||
maJobSetup = aJobSetup;
|
||||
return;
|
||||
}
|
||||
|
||||
rData.SetDuplexMode( eDuplex );
|
||||
|
||||
if ( IsDisplayPrinter() )
|
||||
{
|
||||
mbNewJobSetup = true;
|
||||
maJobSetup = aJobSetup;
|
||||
return;
|
||||
}
|
||||
|
||||
ReleaseGraphics();
|
||||
if ( mpInfoPrinter->SetData( JobSetFlags::DUPLEXMODE, &rData ) )
|
||||
{
|
||||
ImplUpdateJobSetupPaper( aJobSetup );
|
||||
mbNewJobSetup = true;
|
||||
maJobSetup = aJobSetup;
|
||||
ImplUpdatePageData();
|
||||
ImplUpdateFontList();
|
||||
}
|
||||
ReleaseGraphics();
|
||||
if ( mpInfoPrinter->SetData( JobSetFlags::DUPLEXMODE, &rData ) )
|
||||
{
|
||||
ImplUpdateJobSetupPaper( aJobSetup );
|
||||
mbNewJobSetup = true;
|
||||
maJobSetup = aJobSetup;
|
||||
ImplUpdatePageData();
|
||||
ImplUpdateFontList();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1539,21 +1539,21 @@ void Printer::ImplStartPage()
|
||||
if ( !IsJobActive() )
|
||||
return;
|
||||
|
||||
if ( mpPrinter )
|
||||
{
|
||||
SalGraphics* pGraphics = mpPrinter->StartPage( &maJobSetup.ImplGetData(),
|
||||
mbNewJobSetup );
|
||||
if ( pGraphics )
|
||||
{
|
||||
ReleaseGraphics();
|
||||
mpJobGraphics = pGraphics;
|
||||
}
|
||||
mbDevOutput = true;
|
||||
if ( !mpPrinter )
|
||||
return;
|
||||
|
||||
// PrintJob not aborted ???
|
||||
if ( IsJobActive() )
|
||||
mbInPrintPage = true;
|
||||
SalGraphics* pGraphics = mpPrinter->StartPage( &maJobSetup.ImplGetData(),
|
||||
mbNewJobSetup );
|
||||
if ( pGraphics )
|
||||
{
|
||||
ReleaseGraphics();
|
||||
mpJobGraphics = pGraphics;
|
||||
}
|
||||
mbDevOutput = true;
|
||||
|
||||
// PrintJob not aborted ???
|
||||
if ( IsJobActive() )
|
||||
mbInPrintPage = true;
|
||||
}
|
||||
|
||||
void Printer::ImplEndPage()
|
||||
@ -1579,35 +1579,35 @@ void Printer::updatePrinters()
|
||||
ImplSVData* pSVData = ImplGetSVData();
|
||||
ImplPrnQueueList* pPrnList = pSVData->maGDIData.mpPrinterQueueList.get();
|
||||
|
||||
if ( pPrnList )
|
||||
if ( !pPrnList )
|
||||
return;
|
||||
|
||||
std::unique_ptr<ImplPrnQueueList> pNewList(new ImplPrnQueueList);
|
||||
pSVData->mpDefInst->GetPrinterQueueInfo( pNewList.get() );
|
||||
|
||||
bool bChanged = pPrnList->m_aQueueInfos.size() != pNewList->m_aQueueInfos.size();
|
||||
for( decltype(pPrnList->m_aQueueInfos)::size_type i = 0; ! bChanged && i < pPrnList->m_aQueueInfos.size(); i++ )
|
||||
{
|
||||
std::unique_ptr<ImplPrnQueueList> pNewList(new ImplPrnQueueList);
|
||||
pSVData->mpDefInst->GetPrinterQueueInfo( pNewList.get() );
|
||||
|
||||
bool bChanged = pPrnList->m_aQueueInfos.size() != pNewList->m_aQueueInfos.size();
|
||||
for( decltype(pPrnList->m_aQueueInfos)::size_type i = 0; ! bChanged && i < pPrnList->m_aQueueInfos.size(); i++ )
|
||||
ImplPrnQueueData& rInfo = pPrnList->m_aQueueInfos[i];
|
||||
ImplPrnQueueData& rNewInfo = pNewList->m_aQueueInfos[i];
|
||||
if( ! rInfo.mpSalQueueInfo || ! rNewInfo.mpSalQueueInfo || // sanity check
|
||||
rInfo.mpSalQueueInfo->maPrinterName != rNewInfo.mpSalQueueInfo->maPrinterName )
|
||||
{
|
||||
ImplPrnQueueData& rInfo = pPrnList->m_aQueueInfos[i];
|
||||
ImplPrnQueueData& rNewInfo = pNewList->m_aQueueInfos[i];
|
||||
if( ! rInfo.mpSalQueueInfo || ! rNewInfo.mpSalQueueInfo || // sanity check
|
||||
rInfo.mpSalQueueInfo->maPrinterName != rNewInfo.mpSalQueueInfo->maPrinterName )
|
||||
{
|
||||
bChanged = true;
|
||||
}
|
||||
bChanged = true;
|
||||
}
|
||||
if( bChanged )
|
||||
{
|
||||
ImplDeletePrnQueueList();
|
||||
pSVData->maGDIData.mpPrinterQueueList = std::move(pNewList);
|
||||
}
|
||||
if( !bChanged )
|
||||
return;
|
||||
|
||||
Application* pApp = GetpApp();
|
||||
if( pApp )
|
||||
{
|
||||
DataChangedEvent aDCEvt( DataChangedEventType::PRINTER );
|
||||
Application::ImplCallEventListenersApplicationDataChanged(&aDCEvt);
|
||||
Application::NotifyAllWindows( aDCEvt );
|
||||
}
|
||||
}
|
||||
ImplDeletePrnQueueList();
|
||||
pSVData->maGDIData.mpPrinterQueueList = std::move(pNewList);
|
||||
|
||||
Application* pApp = GetpApp();
|
||||
if( pApp )
|
||||
{
|
||||
DataChangedEvent aDCEvt( DataChangedEventType::PRINTER );
|
||||
Application::ImplCallEventListenersApplicationDataChanged(&aDCEvt);
|
||||
Application::NotifyAllWindows( aDCEvt );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -833,67 +833,67 @@ void PrinterController::setupPrinter( weld::Window* i_pParent )
|
||||
// Important to hold printer alive while doing setup etc.
|
||||
VclPtr< Printer > xPrinter = mpImplData->mxPrinter;
|
||||
|
||||
if( xPrinter )
|
||||
if( !xPrinter )
|
||||
return;
|
||||
|
||||
xPrinter->Push();
|
||||
xPrinter->SetMapMode(MapMode(MapUnit::Map100thMM));
|
||||
|
||||
// get current data
|
||||
Size aPaperSize(xPrinter->GetPaperSize());
|
||||
Orientation eOrientation = xPrinter->GetOrientation();
|
||||
sal_uInt16 nPaperBin = xPrinter->GetPaperBin();
|
||||
|
||||
// reset paper size back to last configured size, not
|
||||
// whatever happens to be the current page
|
||||
// (but only if the printer config has changed, otherwise
|
||||
// don't override printer page auto-detection - tdf#91362)
|
||||
if (getPrinterModified() || getPapersizeFromSetup())
|
||||
{
|
||||
xPrinter->Push();
|
||||
xPrinter->SetMapMode(MapMode(MapUnit::Map100thMM));
|
||||
|
||||
// get current data
|
||||
Size aPaperSize(xPrinter->GetPaperSize());
|
||||
Orientation eOrientation = xPrinter->GetOrientation();
|
||||
sal_uInt16 nPaperBin = xPrinter->GetPaperBin();
|
||||
|
||||
// reset paper size back to last configured size, not
|
||||
// whatever happens to be the current page
|
||||
// (but only if the printer config has changed, otherwise
|
||||
// don't override printer page auto-detection - tdf#91362)
|
||||
if (getPrinterModified() || getPapersizeFromSetup())
|
||||
{
|
||||
resetPaperToLastConfigured();
|
||||
}
|
||||
|
||||
// call driver setup
|
||||
bRet = xPrinter->Setup( i_pParent, PrinterSetupMode::SingleJob );
|
||||
SAL_WARN_IF(xPrinter != mpImplData->mxPrinter, "vcl.gdi",
|
||||
"Printer changed underneath us during setup");
|
||||
xPrinter = mpImplData->mxPrinter;
|
||||
|
||||
Size aNewPaperSize(xPrinter->GetPaperSize());
|
||||
if (bRet)
|
||||
{
|
||||
bool bInvalidateCache = false;
|
||||
setPapersizeFromSetup(xPrinter->GetPrinterSettingsPreferred());
|
||||
|
||||
// was papersize overridden ? if so we need to take action if we're
|
||||
// configured to use the driver papersize
|
||||
if (aNewPaperSize != mpImplData->maDefaultPageSize)
|
||||
{
|
||||
mpImplData->maDefaultPageSize = aNewPaperSize;
|
||||
bInvalidateCache = getPapersizeFromSetup();
|
||||
}
|
||||
|
||||
// was bin overridden ? if so we need to take action
|
||||
sal_uInt16 nNewPaperBin = xPrinter->GetPaperBin();
|
||||
if (nNewPaperBin != nPaperBin)
|
||||
{
|
||||
mpImplData->mnFixedPaperBin = nNewPaperBin;
|
||||
bInvalidateCache = true;
|
||||
}
|
||||
|
||||
if (bInvalidateCache)
|
||||
{
|
||||
mpImplData->maPageCache.invalidate();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//restore to whatever it was before we entered this method
|
||||
xPrinter->SetOrientation( eOrientation );
|
||||
if (aPaperSize != aNewPaperSize)
|
||||
xPrinter->SetPaperSizeUser(aPaperSize);
|
||||
}
|
||||
xPrinter->Pop();
|
||||
resetPaperToLastConfigured();
|
||||
}
|
||||
|
||||
// call driver setup
|
||||
bRet = xPrinter->Setup( i_pParent, PrinterSetupMode::SingleJob );
|
||||
SAL_WARN_IF(xPrinter != mpImplData->mxPrinter, "vcl.gdi",
|
||||
"Printer changed underneath us during setup");
|
||||
xPrinter = mpImplData->mxPrinter;
|
||||
|
||||
Size aNewPaperSize(xPrinter->GetPaperSize());
|
||||
if (bRet)
|
||||
{
|
||||
bool bInvalidateCache = false;
|
||||
setPapersizeFromSetup(xPrinter->GetPrinterSettingsPreferred());
|
||||
|
||||
// was papersize overridden ? if so we need to take action if we're
|
||||
// configured to use the driver papersize
|
||||
if (aNewPaperSize != mpImplData->maDefaultPageSize)
|
||||
{
|
||||
mpImplData->maDefaultPageSize = aNewPaperSize;
|
||||
bInvalidateCache = getPapersizeFromSetup();
|
||||
}
|
||||
|
||||
// was bin overridden ? if so we need to take action
|
||||
sal_uInt16 nNewPaperBin = xPrinter->GetPaperBin();
|
||||
if (nNewPaperBin != nPaperBin)
|
||||
{
|
||||
mpImplData->mnFixedPaperBin = nNewPaperBin;
|
||||
bInvalidateCache = true;
|
||||
}
|
||||
|
||||
if (bInvalidateCache)
|
||||
{
|
||||
mpImplData->maPageCache.invalidate();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//restore to whatever it was before we entered this method
|
||||
xPrinter->SetOrientation( eOrientation );
|
||||
if (aPaperSize != aNewPaperSize)
|
||||
xPrinter->SetPaperSizeUser(aPaperSize);
|
||||
}
|
||||
xPrinter->Pop();
|
||||
}
|
||||
|
||||
PrinterController::PageSize vcl::ImplPrinterControllerData::modifyJobSetup( const css::uno::Sequence< css::beans::PropertyValue >& i_rProps )
|
||||
@ -1075,20 +1075,20 @@ static void appendSubPage( GDIMetaFile& o_rMtf, const tools::Rectangle& i_rClipR
|
||||
o_rMtf.AddAction( new MetaPopAction() );
|
||||
|
||||
// draw a border
|
||||
if( i_bDrawBorder )
|
||||
{
|
||||
// save gstate
|
||||
o_rMtf.AddAction( new MetaPushAction( PushFlags::LINECOLOR | PushFlags::FILLCOLOR | PushFlags::CLIPREGION | PushFlags::MAPMODE ) );
|
||||
o_rMtf.AddAction( new MetaMapModeAction( MapMode( MapUnit::Map100thMM ) ) );
|
||||
if( !i_bDrawBorder )
|
||||
return;
|
||||
|
||||
tools::Rectangle aBorderRect( i_rClipRect );
|
||||
o_rMtf.AddAction( new MetaLineColorAction( COL_BLACK, true ) );
|
||||
o_rMtf.AddAction( new MetaFillColorAction( COL_TRANSPARENT, false ) );
|
||||
o_rMtf.AddAction( new MetaRectAction( aBorderRect ) );
|
||||
// save gstate
|
||||
o_rMtf.AddAction( new MetaPushAction( PushFlags::LINECOLOR | PushFlags::FILLCOLOR | PushFlags::CLIPREGION | PushFlags::MAPMODE ) );
|
||||
o_rMtf.AddAction( new MetaMapModeAction( MapMode( MapUnit::Map100thMM ) ) );
|
||||
|
||||
// restore gstate
|
||||
o_rMtf.AddAction( new MetaPopAction() );
|
||||
}
|
||||
tools::Rectangle aBorderRect( i_rClipRect );
|
||||
o_rMtf.AddAction( new MetaLineColorAction( COL_BLACK, true ) );
|
||||
o_rMtf.AddAction( new MetaFillColorAction( COL_TRANSPARENT, false ) );
|
||||
o_rMtf.AddAction( new MetaRectAction( aBorderRect ) );
|
||||
|
||||
// restore gstate
|
||||
o_rMtf.AddAction( new MetaPopAction() );
|
||||
}
|
||||
|
||||
PrinterController::PageSize PrinterController::getFilteredPageFile( int i_nFilteredPage, GDIMetaFile& o_rMtf, bool i_bMayUseCache )
|
||||
|
@ -87,28 +87,28 @@ ImplRegionBand::ImplRegionBand(
|
||||
pSep = pSep->mpNextSep;
|
||||
}
|
||||
|
||||
if ( ! bIgnorePoints)
|
||||
if ( bIgnorePoints)
|
||||
return;
|
||||
|
||||
// Copy points.
|
||||
ImplRegionBandPoint* pPoint = rRegionBand.mpFirstBandPoint;
|
||||
ImplRegionBandPoint* pPrevPointCopy = nullptr;
|
||||
while (pPoint != nullptr)
|
||||
{
|
||||
// Copy points.
|
||||
ImplRegionBandPoint* pPoint = rRegionBand.mpFirstBandPoint;
|
||||
ImplRegionBandPoint* pPrevPointCopy = nullptr;
|
||||
while (pPoint != nullptr)
|
||||
{
|
||||
ImplRegionBandPoint* pPointCopy = new ImplRegionBandPoint;
|
||||
pPointCopy->mpNextBandPoint = nullptr;
|
||||
pPointCopy->mnX = pPoint->mnX;
|
||||
pPointCopy->mnLineId = pPoint->mnLineId;
|
||||
pPointCopy->mbEndPoint = pPoint->mbEndPoint;
|
||||
pPointCopy->meLineType = pPoint->meLineType;
|
||||
ImplRegionBandPoint* pPointCopy = new ImplRegionBandPoint;
|
||||
pPointCopy->mpNextBandPoint = nullptr;
|
||||
pPointCopy->mnX = pPoint->mnX;
|
||||
pPointCopy->mnLineId = pPoint->mnLineId;
|
||||
pPointCopy->mbEndPoint = pPoint->mbEndPoint;
|
||||
pPointCopy->meLineType = pPoint->meLineType;
|
||||
|
||||
if (pPrevPointCopy != nullptr)
|
||||
pPrevPointCopy->mpNextBandPoint = pPointCopy;
|
||||
else
|
||||
mpFirstBandPoint = pPointCopy;
|
||||
if (pPrevPointCopy != nullptr)
|
||||
pPrevPointCopy->mpNextBandPoint = pPointCopy;
|
||||
else
|
||||
mpFirstBandPoint = pPointCopy;
|
||||
|
||||
pPrevPointCopy = pPointCopy;
|
||||
pPoint = pPoint->mpNextBandPoint;
|
||||
}
|
||||
pPrevPointCopy = pPointCopy;
|
||||
pPoint = pPoint->mpNextBandPoint;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -380,26 +380,26 @@ void vcl::Region::ImplCreatePolyPolyRegion( const tools::PolyPolygon& rPolyPoly
|
||||
{
|
||||
const sal_uInt16 nPolyCount = rPolyPoly.Count();
|
||||
|
||||
if(nPolyCount)
|
||||
if(!nPolyCount)
|
||||
return;
|
||||
|
||||
// polypolygon empty? -> empty region
|
||||
const tools::Rectangle aRect(rPolyPoly.GetBoundRect());
|
||||
|
||||
if(aRect.IsEmpty())
|
||||
return;
|
||||
|
||||
// width OR height == 1 ? => Rectangular region
|
||||
if((1 == aRect.GetWidth()) || (1 == aRect.GetHeight()) || rPolyPoly.IsRect())
|
||||
{
|
||||
// polypolygon empty? -> empty region
|
||||
const tools::Rectangle aRect(rPolyPoly.GetBoundRect());
|
||||
|
||||
if(!aRect.IsEmpty())
|
||||
{
|
||||
// width OR height == 1 ? => Rectangular region
|
||||
if((1 == aRect.GetWidth()) || (1 == aRect.GetHeight()) || rPolyPoly.IsRect())
|
||||
{
|
||||
mpRegionBand = std::make_shared<RegionBand>(aRect);
|
||||
}
|
||||
else
|
||||
{
|
||||
mpPolyPolygon = std::make_shared<tools::PolyPolygon>(rPolyPoly);
|
||||
}
|
||||
|
||||
mbIsNull = false;
|
||||
}
|
||||
mpRegionBand = std::make_shared<RegionBand>(aRect);
|
||||
}
|
||||
else
|
||||
{
|
||||
mpPolyPolygon = std::make_shared<tools::PolyPolygon>(rPolyPoly);
|
||||
}
|
||||
|
||||
mbIsNull = false;
|
||||
}
|
||||
|
||||
void vcl::Region::ImplCreatePolyPolyRegion( const basegfx::B2DPolyPolygon& rPolyPoly )
|
||||
|
@ -146,57 +146,57 @@ inline long SalGraphics::GetDeviceWidth(const OutputDevice* pOutDev) const
|
||||
void SalGraphics::mirror( long& x, const OutputDevice *pOutDev ) const
|
||||
{
|
||||
const long w = GetDeviceWidth(pOutDev);
|
||||
if( w )
|
||||
if( !w )
|
||||
return;
|
||||
|
||||
if( pOutDev && pOutDev->ImplIsAntiparallel() )
|
||||
{
|
||||
if( pOutDev && pOutDev->ImplIsAntiparallel() )
|
||||
OutputDevice *pOutDevRef = const_cast<OutputDevice*>(pOutDev);
|
||||
// mirror this window back
|
||||
if( m_nLayout & SalLayoutFlags::BiDiRtl )
|
||||
{
|
||||
OutputDevice *pOutDevRef = const_cast<OutputDevice*>(pOutDev);
|
||||
// mirror this window back
|
||||
if( m_nLayout & SalLayoutFlags::BiDiRtl )
|
||||
{
|
||||
long devX = w-pOutDevRef->GetOutputWidthPixel()-pOutDevRef->GetOutOffXPixel(); // re-mirrored mnOutOffX
|
||||
x = devX + (x - pOutDevRef->GetOutOffXPixel());
|
||||
}
|
||||
else
|
||||
{
|
||||
long devX = pOutDevRef->GetOutOffXPixel(); // re-mirrored mnOutOffX
|
||||
x = pOutDevRef->GetOutputWidthPixel() - (x - devX) + pOutDevRef->GetOutOffXPixel() - 1;
|
||||
}
|
||||
long devX = w-pOutDevRef->GetOutputWidthPixel()-pOutDevRef->GetOutOffXPixel(); // re-mirrored mnOutOffX
|
||||
x = devX + (x - pOutDevRef->GetOutOffXPixel());
|
||||
}
|
||||
else
|
||||
{
|
||||
long devX = pOutDevRef->GetOutOffXPixel(); // re-mirrored mnOutOffX
|
||||
x = pOutDevRef->GetOutputWidthPixel() - (x - devX) + pOutDevRef->GetOutOffXPixel() - 1;
|
||||
}
|
||||
else if( m_nLayout & SalLayoutFlags::BiDiRtl )
|
||||
x = w-1-x;
|
||||
}
|
||||
else if( m_nLayout & SalLayoutFlags::BiDiRtl )
|
||||
x = w-1-x;
|
||||
}
|
||||
|
||||
void SalGraphics::mirror( long& x, long nWidth, const OutputDevice *pOutDev, bool bBack ) const
|
||||
{
|
||||
const long w = GetDeviceWidth(pOutDev);
|
||||
if( w )
|
||||
if( !w )
|
||||
return;
|
||||
|
||||
if( pOutDev && pOutDev->ImplIsAntiparallel() )
|
||||
{
|
||||
if( pOutDev && pOutDev->ImplIsAntiparallel() )
|
||||
OutputDevice *pOutDevRef = const_cast<OutputDevice*>(pOutDev);
|
||||
// mirror this window back
|
||||
if( m_nLayout & SalLayoutFlags::BiDiRtl )
|
||||
{
|
||||
OutputDevice *pOutDevRef = const_cast<OutputDevice*>(pOutDev);
|
||||
// mirror this window back
|
||||
if( m_nLayout & SalLayoutFlags::BiDiRtl )
|
||||
{
|
||||
long devX = w-pOutDevRef->GetOutputWidthPixel()-pOutDevRef->GetOutOffXPixel(); // re-mirrored mnOutOffX
|
||||
if( bBack )
|
||||
x = x - devX + pOutDevRef->GetOutOffXPixel();
|
||||
else
|
||||
x = devX + (x - pOutDevRef->GetOutOffXPixel());
|
||||
}
|
||||
long devX = w-pOutDevRef->GetOutputWidthPixel()-pOutDevRef->GetOutOffXPixel(); // re-mirrored mnOutOffX
|
||||
if( bBack )
|
||||
x = x - devX + pOutDevRef->GetOutOffXPixel();
|
||||
else
|
||||
{
|
||||
long devX = pOutDevRef->GetOutOffXPixel(); // re-mirrored mnOutOffX
|
||||
if( bBack )
|
||||
x = devX + (pOutDevRef->GetOutputWidthPixel() + devX) - (x + nWidth);
|
||||
else
|
||||
x = pOutDevRef->GetOutputWidthPixel() - (x - devX) + pOutDevRef->GetOutOffXPixel() - nWidth;
|
||||
}
|
||||
x = devX + (x - pOutDevRef->GetOutOffXPixel());
|
||||
}
|
||||
else
|
||||
{
|
||||
long devX = pOutDevRef->GetOutOffXPixel(); // re-mirrored mnOutOffX
|
||||
if( bBack )
|
||||
x = devX + (pOutDevRef->GetOutputWidthPixel() + devX) - (x + nWidth);
|
||||
else
|
||||
x = pOutDevRef->GetOutputWidthPixel() - (x - devX) + pOutDevRef->GetOutOffXPixel() - nWidth;
|
||||
}
|
||||
else if( m_nLayout & SalLayoutFlags::BiDiRtl )
|
||||
x = w-nWidth-x;
|
||||
}
|
||||
else if( m_nLayout & SalLayoutFlags::BiDiRtl )
|
||||
x = w-nWidth-x;
|
||||
}
|
||||
|
||||
bool SalGraphics::mirror( sal_uInt32 nPoints, const SalPoint *pPtAry, SalPoint *pPtAry2, const OutputDevice *pOutDev ) const
|
||||
|
@ -1483,22 +1483,22 @@ void MultiSalLayout::GetCaretPositions( int nMaxIndex, long* pCaretXArray ) cons
|
||||
SalLayout& rLayout = *mpLayouts[ 0 ];
|
||||
rLayout.GetCaretPositions( nMaxIndex, pCaretXArray );
|
||||
|
||||
if( mnLevel > 1 )
|
||||
if( mnLevel <= 1 )
|
||||
return;
|
||||
|
||||
std::unique_ptr<long[]> const pTempPos(new long[nMaxIndex]);
|
||||
for( int n = 1; n < mnLevel; ++n )
|
||||
{
|
||||
std::unique_ptr<long[]> const pTempPos(new long[nMaxIndex]);
|
||||
for( int n = 1; n < mnLevel; ++n )
|
||||
{
|
||||
mpLayouts[ n ]->GetCaretPositions( nMaxIndex, pTempPos.get() );
|
||||
double fUnitMul = mnUnitsPerPixel;
|
||||
fUnitMul /= mpLayouts[n]->GetUnitsPerPixel();
|
||||
for( int i = 0; i < nMaxIndex; ++i )
|
||||
if( pTempPos[i] >= 0 )
|
||||
{
|
||||
long w = pTempPos[i];
|
||||
w = static_cast<long>(w*fUnitMul + 0.5);
|
||||
pCaretXArray[i] = w;
|
||||
}
|
||||
}
|
||||
mpLayouts[ n ]->GetCaretPositions( nMaxIndex, pTempPos.get() );
|
||||
double fUnitMul = mnUnitsPerPixel;
|
||||
fUnitMul /= mpLayouts[n]->GetUnitsPerPixel();
|
||||
for( int i = 0; i < nMaxIndex; ++i )
|
||||
if( pTempPos[i] >= 0 )
|
||||
{
|
||||
long w = pTempPos[i];
|
||||
w = static_cast<long>(w*fUnitMul + 0.5);
|
||||
pCaretXArray[i] = w;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -177,83 +177,83 @@ void VectorGraphicData::ensureReplacement()
|
||||
|
||||
void VectorGraphicData::ensureSequenceAndRange()
|
||||
{
|
||||
if (!mbSequenceCreated && maVectorGraphicDataArray.hasElements())
|
||||
if (mbSequenceCreated || !maVectorGraphicDataArray.hasElements())
|
||||
return;
|
||||
|
||||
// import SVG to maSequence, also set maRange
|
||||
maRange.reset();
|
||||
|
||||
// create Vector Graphic Data interpreter
|
||||
uno::Reference<uno::XComponentContext> xContext(::comphelper::getProcessComponentContext());
|
||||
|
||||
switch (getVectorGraphicDataType())
|
||||
{
|
||||
// import SVG to maSequence, also set maRange
|
||||
maRange.reset();
|
||||
|
||||
// create Vector Graphic Data interpreter
|
||||
uno::Reference<uno::XComponentContext> xContext(::comphelper::getProcessComponentContext());
|
||||
|
||||
switch (getVectorGraphicDataType())
|
||||
case VectorGraphicDataType::Svg:
|
||||
{
|
||||
case VectorGraphicDataType::Svg:
|
||||
{
|
||||
const uno::Reference< graphic::XSvgParser > xSvgParser = graphic::SvgTools::create(xContext);
|
||||
const uno::Reference< io::XInputStream > myInputStream(new comphelper::SequenceInputStream(maVectorGraphicDataArray));
|
||||
const uno::Reference< graphic::XSvgParser > xSvgParser = graphic::SvgTools::create(xContext);
|
||||
const uno::Reference< io::XInputStream > myInputStream(new comphelper::SequenceInputStream(maVectorGraphicDataArray));
|
||||
|
||||
if (myInputStream.is())
|
||||
maSequence = comphelper::sequenceToContainer<std::deque<css::uno::Reference< css::graphic::XPrimitive2D >>>(xSvgParser->getDecomposition(myInputStream, maPath));
|
||||
if (myInputStream.is())
|
||||
maSequence = comphelper::sequenceToContainer<std::deque<css::uno::Reference< css::graphic::XPrimitive2D >>>(xSvgParser->getDecomposition(myInputStream, maPath));
|
||||
|
||||
break;
|
||||
}
|
||||
case VectorGraphicDataType::Emf:
|
||||
case VectorGraphicDataType::Wmf:
|
||||
{
|
||||
const uno::Reference< graphic::XEmfParser > xEmfParser = graphic::EmfTools::create(xContext);
|
||||
const uno::Reference< io::XInputStream > myInputStream(new comphelper::SequenceInputStream(maVectorGraphicDataArray));
|
||||
uno::Sequence< ::beans::PropertyValue > aSequence;
|
||||
|
||||
if (mpExternalHeader)
|
||||
{
|
||||
aSequence = mpExternalHeader->getSequence();
|
||||
}
|
||||
|
||||
if (myInputStream.is())
|
||||
maSequence = comphelper::sequenceToContainer<std::deque<css::uno::Reference< css::graphic::XPrimitive2D >>>(xEmfParser->getDecomposition(myInputStream, maPath, aSequence));
|
||||
|
||||
break;
|
||||
}
|
||||
case VectorGraphicDataType::Pdf:
|
||||
{
|
||||
const uno::Reference<graphic::XPdfDecomposer> xPdfDecomposer = graphic::PdfTools::create(xContext);
|
||||
uno::Sequence<beans::PropertyValue> aDecompositionParameters = comphelper::InitPropertySequence({
|
||||
{"PageIndex", uno::makeAny<sal_Int32>(mnPageIndex)},
|
||||
});
|
||||
auto xPrimitive2D = xPdfDecomposer->getDecomposition(maVectorGraphicDataArray, aDecompositionParameters);
|
||||
maSequence = comphelper::sequenceToContainer<std::deque<uno::Reference<graphic::XPrimitive2D>>>(xPrimitive2D);
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(!maSequence.empty())
|
||||
case VectorGraphicDataType::Emf:
|
||||
case VectorGraphicDataType::Wmf:
|
||||
{
|
||||
const sal_Int32 nCount(maSequence.size());
|
||||
geometry::RealRectangle2D aRealRect;
|
||||
uno::Sequence< beans::PropertyValue > aViewParameters;
|
||||
const uno::Reference< graphic::XEmfParser > xEmfParser = graphic::EmfTools::create(xContext);
|
||||
const uno::Reference< io::XInputStream > myInputStream(new comphelper::SequenceInputStream(maVectorGraphicDataArray));
|
||||
uno::Sequence< ::beans::PropertyValue > aSequence;
|
||||
|
||||
for(sal_Int32 a(0); a < nCount; a++)
|
||||
if (mpExternalHeader)
|
||||
{
|
||||
// get reference
|
||||
const css::uno::Reference< css::graphic::XPrimitive2D > xReference(maSequence[a]);
|
||||
|
||||
if(xReference.is())
|
||||
{
|
||||
aRealRect = xReference->getRange(aViewParameters);
|
||||
|
||||
maRange.expand(
|
||||
basegfx::B2DRange(
|
||||
aRealRect.X1,
|
||||
aRealRect.Y1,
|
||||
aRealRect.X2,
|
||||
aRealRect.Y2));
|
||||
}
|
||||
aSequence = mpExternalHeader->getSequence();
|
||||
}
|
||||
|
||||
if (myInputStream.is())
|
||||
maSequence = comphelper::sequenceToContainer<std::deque<css::uno::Reference< css::graphic::XPrimitive2D >>>(xEmfParser->getDecomposition(myInputStream, maPath, aSequence));
|
||||
|
||||
break;
|
||||
}
|
||||
case VectorGraphicDataType::Pdf:
|
||||
{
|
||||
const uno::Reference<graphic::XPdfDecomposer> xPdfDecomposer = graphic::PdfTools::create(xContext);
|
||||
uno::Sequence<beans::PropertyValue> aDecompositionParameters = comphelper::InitPropertySequence({
|
||||
{"PageIndex", uno::makeAny<sal_Int32>(mnPageIndex)},
|
||||
});
|
||||
auto xPrimitive2D = xPdfDecomposer->getDecomposition(maVectorGraphicDataArray, aDecompositionParameters);
|
||||
maSequence = comphelper::sequenceToContainer<std::deque<uno::Reference<graphic::XPrimitive2D>>>(xPrimitive2D);
|
||||
|
||||
break;
|
||||
}
|
||||
mNestedBitmapSize = estimateSize(maSequence);
|
||||
mbSequenceCreated = true;
|
||||
}
|
||||
|
||||
if(!maSequence.empty())
|
||||
{
|
||||
const sal_Int32 nCount(maSequence.size());
|
||||
geometry::RealRectangle2D aRealRect;
|
||||
uno::Sequence< beans::PropertyValue > aViewParameters;
|
||||
|
||||
for(sal_Int32 a(0); a < nCount; a++)
|
||||
{
|
||||
// get reference
|
||||
const css::uno::Reference< css::graphic::XPrimitive2D > xReference(maSequence[a]);
|
||||
|
||||
if(xReference.is())
|
||||
{
|
||||
aRealRect = xReference->getRange(aViewParameters);
|
||||
|
||||
maRange.expand(
|
||||
basegfx::B2DRange(
|
||||
aRealRect.X1,
|
||||
aRealRect.Y1,
|
||||
aRealRect.X2,
|
||||
aRealRect.Y2));
|
||||
}
|
||||
}
|
||||
}
|
||||
mNestedBitmapSize = estimateSize(maSequence);
|
||||
mbSequenceCreated = true;
|
||||
}
|
||||
|
||||
auto VectorGraphicData::getSizeBytes() const -> std::pair<State, size_t>
|
||||
|
Loading…
x
Reference in New Issue
Block a user