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:
Noel Grandin 2020-08-04 00:16:03 +02:00
parent ce47b1a9c6
commit 750a6bddf1
20 changed files with 1292 additions and 1292 deletions

View File

@ -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;
}
}
}

View File

@ -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)

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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) );
}
}
}

View File

@ -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));
}
}
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}

View File

@ -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 )

View File

@ -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: */

View File

@ -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() );
}
}

View File

@ -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 );
}
}

View File

@ -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

View File

@ -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 );
}
}

View File

@ -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 )

View File

@ -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;
}
}

View File

@ -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 )

View File

@ -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

View File

@ -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;
}
}
}

View File

@ -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>