include/vcl/pngwrite.hxx           |   60 ---
 vcl/IwyuFilter_vcl.yaml            |    4 
 vcl/Library_vcl.mk                 |    1 
 vcl/source/filter/png/pngwrite.cxx |  660 -------------------------------------
 4 files changed, 725 deletions(-)

New commits:
commit 65f1903921c448da61733ca0d47c2ffc862b201d
Author:     offtkp <parisop...@gmail.com>
AuthorDate: Sat Jul 16 21:13:10 2022 +0300
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Wed Jul 20 08:13:27 2022 +0200

    Remove pngwrite.hxx and .cxx as it is replaced by PngImageWriter
    
    pngwrite is now replaced by PngImageWriter which uses libpng so these
    old files are removed.
    
    Change-Id: Ie91c314f30b8f56682890000b90009f408a79094
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137140
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/include/vcl/pngwrite.hxx b/include/vcl/pngwrite.hxx
deleted file mode 100644
index de2b1c6e168d..000000000000
--- a/include/vcl/pngwrite.hxx
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifndef INCLUDED_VCL_PNGWRITE_HXX
-#define INCLUDED_VCL_PNGWRITE_HXX
-
-#include <vcl/dllapi.h>
-#include <memory>
-#include <vector>
-
-namespace com::sun::star::beans { struct PropertyValue; }
-namespace com::sun::star::uno { template <typename > class Sequence; }
-
-class BitmapEx;
-class SvStream;
-
-namespace vcl
-{
-    class PNGWriterImpl;
-
-    class VCL_DLLPUBLIC PNGWriter
-    {
-        const std::unique_ptr<PNGWriterImpl> mpImpl;
-
-    public:
-
-        explicit PNGWriter(const BitmapEx&, const 
css::uno::Sequence<css::beans::PropertyValue>* pFilterData = nullptr);
-        ~PNGWriter();
-
-        bool Write(SvStream& rStream);
-
-        // additional method to be able to modify all chunk before they are 
stored
-        struct ChunkData
-        {
-            sal_uInt32                  nType;
-            std::vector<sal_uInt8>    aData;
-        };
-        std::vector<vcl::PNGWriter::ChunkData>& GetChunks();
-    };
-}
-
-#endif // INCLUDED_VCL_PNGWRITE_HXX
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/IwyuFilter_vcl.yaml b/vcl/IwyuFilter_vcl.yaml
index 150dc6519da4..f31df6e8c1f5 100644
--- a/vcl/IwyuFilter_vcl.yaml
+++ b/vcl/IwyuFilter_vcl.yaml
@@ -50,10 +50,6 @@ excludelist:
     vcl/source/filter/jpeg/JpegWriter.hxx:
     # Needed for direct member access
     - vcl/BitmapReadAccess.hxx
-    vcl/source/filter/png/pngwrite.cxx:
-    # Actually these are used
-    - com/sun/star/beans/PropertyValue.hpp
-    - com/sun/star/uno/Sequence.hxx
     vcl/source/filter/wmf/wmfexternal.cxx:
     # Actually these are used
     - com/sun/star/beans/PropertyValue.hpp
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index b265467d2696..cc5940cf61d0 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -473,7 +473,6 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\
     vcl/source/filter/wmf/wmfwr \
     vcl/source/filter/png/PngImageReader \
     vcl/source/filter/png/PngImageWriter \
-    vcl/source/filter/png/pngwrite \
     vcl/source/filter/webp/reader \
     vcl/source/filter/webp/writer \
     vcl/source/font/DirectFontSubstitution \
diff --git a/vcl/source/filter/png/pngwrite.cxx 
b/vcl/source/filter/png/pngwrite.cxx
deleted file mode 100644
index 865fe38ebee7..000000000000
--- a/vcl/source/filter/png/pngwrite.cxx
+++ /dev/null
@@ -1,660 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <vcl/pngwrite.hxx>
-#include <vcl/bitmapex.hxx>
-
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <com/sun/star/uno/Sequence.hxx>
-
-#include <limits>
-#include <rtl/crc.h>
-#include <tools/solar.h>
-#include <tools/zcodec.hxx>
-#include <tools/stream.hxx>
-#include <vcl/BitmapReadAccess.hxx>
-#include <vcl/alpha.hxx>
-#include <osl/endian.h>
-#include <memory>
-#include <vcl/BitmapTools.hxx>
-
-#define PNG_DEF_COMPRESSION 6
-
-#define PNGCHUNK_IHDR 0x49484452
-#define PNGCHUNK_PLTE 0x504c5445
-#define PNGCHUNK_IDAT 0x49444154
-#define PNGCHUNK_IEND 0x49454e44
-#define PNGCHUNK_pHYs 0x70485973
-
-namespace vcl
-{
-class PNGWriterImpl
-{
-public:
-    PNGWriterImpl(const BitmapEx& BmpEx,
-                  const css::uno::Sequence<css::beans::PropertyValue>* 
pFilterData);
-
-    bool Write(SvStream& rOutStream);
-
-    std::vector<vcl::PNGWriter::ChunkData>& GetChunks() { return maChunkSeq; }
-
-private:
-    std::vector<vcl::PNGWriter::ChunkData> maChunkSeq;
-
-    sal_Int32 mnCompLevel;
-    sal_Int32 mnInterlaced;
-    sal_uInt32 mnMaxChunkSize;
-    bool mbStatus;
-
-    Bitmap::ScopedReadAccess mpAccess;
-    BitmapReadAccess* mpMaskAccess;
-    ZCodec mpZCodec;
-
-    std::unique_ptr<sal_uInt8[]>
-        mpDeflateInBuf; // as big as the size of a scanline + alphachannel + 1
-    std::unique_ptr<sal_uInt8[]> mpPreviousScan; // as big as mpDeflateInBuf
-    std::unique_ptr<sal_uInt8[]> mpCurrentScan;
-    sal_uLong mnDeflateInSize;
-
-    sal_uLong mnWidth;
-    sal_uLong mnHeight;
-    sal_uInt8 mnBitsPerPixel;
-    sal_uInt8 mnFilterType; // 0 or 4;
-    sal_uLong mnBBP; // bytes per pixel ( needed for filtering )
-    bool mbTrueAlpha;
-
-    void ImplWritepHYs(const BitmapEx& rBitmapEx);
-    void ImplWriteIDAT();
-    sal_uLong ImplGetFilter(sal_uLong nY, sal_uLong nXStart = 0, sal_uLong 
nXAdd = 1);
-    void ImplClearFirstScanline();
-    bool ImplWriteHeader();
-    void ImplWritePalette();
-    void ImplOpenChunk(sal_uLong nChunkType);
-    void ImplWriteChunk(sal_uInt8 nNumb);
-    void ImplWriteChunk(sal_uInt32 nNumb);
-    void ImplWriteChunk(unsigned char const* pSource, sal_uInt32 nDatSize);
-};
-
-PNGWriterImpl::PNGWriterImpl(const BitmapEx& rBitmapEx,
-                             const 
css::uno::Sequence<css::beans::PropertyValue>* pFilterData)
-    : mnCompLevel(PNG_DEF_COMPRESSION)
-    , mnInterlaced(0)
-    , mnMaxChunkSize(0)
-    , mbStatus(true)
-    , mpMaskAccess(nullptr)
-    , mnDeflateInSize(0)
-    , mnWidth(0)
-    , mnHeight(0)
-    , mnBitsPerPixel(0)
-    , mnFilterType(0)
-    , mnBBP(0)
-    , mbTrueAlpha(false)
-{
-    if (rBitmapEx.IsEmpty())
-        return;
-
-    BitmapEx aBitmapEx;
-
-    if (rBitmapEx.GetBitmap().getPixelFormat() == vcl::PixelFormat::N32_BPP)
-    {
-        if (!vcl::bitmap::convertBitmap32To24Plus8(rBitmapEx, aBitmapEx))
-            return;
-    }
-    else
-    {
-        aBitmapEx = rBitmapEx;
-    }
-
-    Bitmap aBmp(aBitmapEx.GetBitmap());
-
-    mnMaxChunkSize = std::numeric_limits<sal_uInt32>::max();
-    bool bTranslucent = true;
-
-    if (pFilterData)
-    {
-        for (const auto& rPropVal : *pFilterData)
-        {
-            if (rPropVal.Name == "Compression")
-                rPropVal.Value >>= mnCompLevel;
-            else if (rPropVal.Name == "Interlaced")
-                rPropVal.Value >>= mnInterlaced;
-            else if (rPropVal.Name == "Translucent")
-            {
-                tools::Long nTmp = 0;
-                rPropVal.Value >>= nTmp;
-                if (!nTmp)
-                    bTranslucent = false;
-            }
-            else if (rPropVal.Name == "MaxChunkSize")
-            {
-                sal_Int32 nVal = 0;
-                if (rPropVal.Value >>= nVal)
-                    mnMaxChunkSize = static_cast<sal_uInt32>(nVal);
-            }
-        }
-    }
-    mnBitsPerPixel = 
sal_uInt8(vcl::pixelFormatBitCount(aBmp.getPixelFormat()));
-
-    if (aBitmapEx.IsAlpha() && bTranslucent)
-    {
-        if (mnBitsPerPixel <= 8)
-        {
-            aBmp.Convert(BmpConversion::N24Bit);
-            mnBitsPerPixel = 24;
-        }
-
-        mpAccess = Bitmap::ScopedReadAccess(aBmp); // true RGB with 
alphachannel
-        if (mpAccess)
-        {
-            mbTrueAlpha = true;
-            AlphaMask aMask(aBitmapEx.GetAlpha());
-            mpMaskAccess = aMask.AcquireReadAccess();
-            if (mpMaskAccess)
-            {
-                if (ImplWriteHeader())
-                {
-                    ImplWritepHYs(aBitmapEx);
-                    ImplWriteIDAT();
-                }
-                aMask.ReleaseAccess(mpMaskAccess);
-                mpMaskAccess = nullptr;
-            }
-            else
-            {
-                mbStatus = false;
-            }
-            mpAccess.reset();
-        }
-        else
-        {
-            mbStatus = false;
-        }
-    }
-    else
-    {
-        mpAccess = Bitmap::ScopedReadAccess(aBmp); // palette + RGB without 
alphachannel
-        if (mpAccess)
-        {
-            if (ImplWriteHeader())
-            {
-                ImplWritepHYs(aBitmapEx);
-                if (mpAccess->HasPalette())
-                    ImplWritePalette();
-
-                ImplWriteIDAT();
-            }
-            mpAccess.reset();
-        }
-        else
-        {
-            mbStatus = false;
-        }
-    }
-
-    if (mbStatus)
-    {
-        ImplOpenChunk(PNGCHUNK_IEND); // create an IEND chunk
-    }
-}
-
-bool PNGWriterImpl::Write(SvStream& rOStm)
-{
-    /* png signature is always an array of 8 bytes */
-    SvStreamEndian nOldMode = rOStm.GetEndian();
-    rOStm.SetEndian(SvStreamEndian::BIG);
-    rOStm.WriteUInt32(0x89504e47);
-    rOStm.WriteUInt32(0x0d0a1a0a);
-
-    for (auto const& chunk : maChunkSeq)
-    {
-        sal_uInt32 nType = chunk.nType;
-#if defined(__LITTLEENDIAN) || defined(OSL_LITENDIAN)
-        nType = OSL_SWAPDWORD(nType);
-#endif
-        sal_uInt32 nCRC = rtl_crc32(0, &nType, 4);
-        sal_uInt32 nDataSize = chunk.aData.size();
-        if (nDataSize)
-            nCRC = rtl_crc32(nCRC, chunk.aData.data(), nDataSize);
-        rOStm.WriteUInt32(nDataSize);
-        rOStm.WriteUInt32(chunk.nType);
-        if (nDataSize)
-            rOStm.WriteBytes(chunk.aData.data(), nDataSize);
-        rOStm.WriteUInt32(nCRC);
-    }
-    rOStm.SetEndian(nOldMode);
-    return mbStatus;
-}
-
-bool PNGWriterImpl::ImplWriteHeader()
-{
-    ImplOpenChunk(PNGCHUNK_IHDR);
-    mnWidth = mpAccess->Width();
-    ImplWriteChunk(sal_uInt32(mnWidth));
-    mnHeight = mpAccess->Height();
-    ImplWriteChunk(sal_uInt32(mnHeight));
-
-    if (mnWidth && mnHeight && mnBitsPerPixel && mbStatus)
-    {
-        sal_uInt8 nBitDepth = mnBitsPerPixel;
-        if (mnBitsPerPixel <= 8)
-            mnFilterType = 0;
-        else
-            mnFilterType = 4;
-
-        sal_uInt8 nColorType = 2; // colortype:
-
-        // bit 0 -> palette is used
-        if (mpAccess->HasPalette()) // bit 1 -> color is used
-            nColorType |= 1; // bit 2 -> alpha channel is used
-        else
-            nBitDepth /= 3;
-
-        if (mpMaskAccess)
-            nColorType |= 4;
-
-        ImplWriteChunk(nBitDepth);
-        ImplWriteChunk(nColorType); // colortype
-        ImplWriteChunk(static_cast<sal_uInt8>(0)); // compression type
-        ImplWriteChunk(static_cast<sal_uInt8>(0)); // filter type - is not 
supported in this version
-        ImplWriteChunk(static_cast<sal_uInt8>(mnInterlaced)); // interlace type
-    }
-    else
-    {
-        mbStatus = false;
-    }
-    return mbStatus;
-}
-
-void PNGWriterImpl::ImplWritePalette()
-{
-    const sal_uLong nCount = mpAccess->GetPaletteEntryCount();
-    std::unique_ptr<sal_uInt8[]> pTempBuf(new sal_uInt8[nCount * 3]);
-    sal_uInt8* pTmp = pTempBuf.get();
-
-    ImplOpenChunk(PNGCHUNK_PLTE);
-
-    for (sal_uLong i = 0; i < nCount; i++)
-    {
-        const BitmapColor& rColor = mpAccess->GetPaletteColor(i);
-        *pTmp++ = rColor.GetRed();
-        *pTmp++ = rColor.GetGreen();
-        *pTmp++ = rColor.GetBlue();
-    }
-    ImplWriteChunk(pTempBuf.get(), nCount * 3);
-}
-
-void PNGWriterImpl::ImplWritepHYs(const BitmapEx& rBmpEx)
-{
-    if (rBmpEx.GetPrefMapMode().GetMapUnit() != MapUnit::Map100thMM)
-        return;
-
-    Size aPrefSize(rBmpEx.GetPrefSize());
-
-    if (aPrefSize.Width() && aPrefSize.Height() && mnWidth && mnHeight)
-    {
-        ImplOpenChunk(PNGCHUNK_pHYs);
-        sal_uInt32 nPrefSizeX = static_cast<sal_uInt32>(
-            100000.0 / (static_cast<double>(aPrefSize.Width()) / mnWidth) + 
0.5);
-        sal_uInt32 nPrefSizeY = static_cast<sal_uInt32>(
-            100000.0 / (static_cast<double>(aPrefSize.Height()) / mnHeight) + 
0.5);
-        ImplWriteChunk(nPrefSizeX);
-        ImplWriteChunk(nPrefSizeY);
-        ImplWriteChunk(sal_uInt8(1)); // nMapUnit
-    }
-}
-
-void PNGWriterImpl::ImplWriteIDAT()
-{
-    mnDeflateInSize = mnBitsPerPixel;
-
-    if (mpMaskAccess)
-        mnDeflateInSize += 8;
-
-    mnBBP = (mnDeflateInSize + 7) >> 3;
-
-    mnDeflateInSize = mnBBP * mnWidth + 1;
-
-    mpDeflateInBuf.reset(new sal_uInt8[mnDeflateInSize]);
-
-    if (mnFilterType) // using filter type 4 we need memory for the scanline 3 
times
-    {
-        mpPreviousScan.reset(new sal_uInt8[mnDeflateInSize]);
-        mpCurrentScan.reset(new sal_uInt8[mnDeflateInSize]);
-        ImplClearFirstScanline();
-    }
-    mpZCodec.BeginCompression(mnCompLevel);
-    SvMemoryStream aOStm;
-    if (mnInterlaced == 0)
-    {
-        for (sal_uLong nY = 0; nY < mnHeight; nY++)
-        {
-            mpZCodec.Write(aOStm, mpDeflateInBuf.get(), ImplGetFilter(nY));
-        }
-    }
-    else
-    {
-        // interlace mode
-        sal_uLong nY;
-        for (nY = 0; nY < mnHeight; nY += 8) // pass 1
-        {
-            mpZCodec.Write(aOStm, mpDeflateInBuf.get(), ImplGetFilter(nY, 0, 
8));
-        }
-        ImplClearFirstScanline();
-
-        for (nY = 0; nY < mnHeight; nY += 8) // pass 2
-        {
-            mpZCodec.Write(aOStm, mpDeflateInBuf.get(), ImplGetFilter(nY, 4, 
8));
-        }
-        ImplClearFirstScanline();
-
-        if (mnHeight >= 5) // pass 3
-        {
-            for (nY = 4; nY < mnHeight; nY += 8)
-            {
-                mpZCodec.Write(aOStm, mpDeflateInBuf.get(), ImplGetFilter(nY, 
0, 4));
-            }
-            ImplClearFirstScanline();
-        }
-
-        for (nY = 0; nY < mnHeight; nY += 4) // pass 4
-        {
-            mpZCodec.Write(aOStm, mpDeflateInBuf.get(), ImplGetFilter(nY, 2, 
4));
-        }
-        ImplClearFirstScanline();
-
-        if (mnHeight >= 3) // pass 5
-        {
-            for (nY = 2; nY < mnHeight; nY += 4)
-            {
-                mpZCodec.Write(aOStm, mpDeflateInBuf.get(), ImplGetFilter(nY, 
0, 2));
-            }
-            ImplClearFirstScanline();
-        }
-
-        for (nY = 0; nY < mnHeight; nY += 2) // pass 6
-        {
-            mpZCodec.Write(aOStm, mpDeflateInBuf.get(), ImplGetFilter(nY, 1, 
2));
-        }
-        ImplClearFirstScanline();
-
-        if (mnHeight >= 2) // pass 7
-        {
-            for (nY = 1; nY < mnHeight; nY += 2)
-            {
-                mpZCodec.Write(aOStm, mpDeflateInBuf.get(), ImplGetFilter(nY));
-            }
-        }
-    }
-    mpZCodec.EndCompression();
-
-    if (mnFilterType) // using filter type 4 we need memory for the scanline 3 
times
-    {
-        mpCurrentScan.reset();
-        mpPreviousScan.reset();
-    }
-    mpDeflateInBuf.reset();
-
-    sal_uInt32 nIDATSize = aOStm.Tell();
-    sal_uInt32 nBytes, nBytesToWrite = nIDATSize;
-    while (nBytesToWrite)
-    {
-        nBytes = nBytesToWrite <= mnMaxChunkSize ? nBytesToWrite : 
mnMaxChunkSize;
-        ImplOpenChunk(PNGCHUNK_IDAT);
-        ImplWriteChunk(
-            const_cast<unsigned char*>(static_cast<unsigned char 
const*>(aOStm.GetData()))
-                + (nIDATSize - nBytesToWrite),
-            nBytes);
-        nBytesToWrite -= nBytes;
-    }
-}
-
-// ImplGetFilter writes the complete Scanline (nY) - in interlace mode the 
parameter nXStart and nXAdd
-// appends to the currently used pass
-// the complete size of scanline will be returned - in interlace mode zero is 
possible!
-
-sal_uLong PNGWriterImpl::ImplGetFilter(sal_uLong nY, sal_uLong nXStart, 
sal_uLong nXAdd)
-{
-    sal_uInt8* pDest;
-
-    if (mnFilterType)
-        pDest = mpCurrentScan.get();
-    else
-        pDest = mpDeflateInBuf.get();
-
-    if (nXStart < mnWidth)
-    {
-        *pDest++ = mnFilterType; // in this version the filter type is either 
0 or 4
-
-        if (mpAccess
-                ->HasPalette()) // alphachannel is not allowed by pictures 
including palette entries
-        {
-            switch (mnBitsPerPixel)
-            {
-                case 1:
-                {
-                    Scanline pScanline = mpAccess->GetScanline(nY);
-                    sal_uLong nX, nXIndex;
-                    for (nX = nXStart, nXIndex = 0; nX < mnWidth; nX += nXAdd, 
nXIndex++)
-                    {
-                        sal_uLong nShift = (nXIndex & 7) ^ 7;
-                        if (nShift == 7)
-                            *pDest = mpAccess->GetIndexFromData(pScanline, nX) 
<< nShift;
-                        else if (nShift == 0)
-                            *pDest++ |= mpAccess->GetIndexFromData(pScanline, 
nX) << nShift;
-                        else
-                            *pDest |= mpAccess->GetIndexFromData(pScanline, 
nX) << nShift;
-                    }
-                    if ((nXIndex & 7) != 0)
-                        pDest++; // byte is not completely used, so the 
bufferpointer is to correct
-                }
-                break;
-
-                case 4:
-                {
-                    Scanline pScanline = mpAccess->GetScanline(nY);
-                    sal_uLong nX, nXIndex;
-                    for (nX = nXStart, nXIndex = 0; nX < mnWidth; nX += nXAdd, 
nXIndex++)
-                    {
-                        if (nXIndex & 1)
-                            *pDest++ |= mpAccess->GetIndexFromData(pScanline, 
nX);
-                        else
-                            *pDest = mpAccess->GetIndexFromData(pScanline, nX) 
<< 4;
-                    }
-                    if (nXIndex & 1)
-                        pDest++;
-                }
-                break;
-
-                case 8:
-                {
-                    Scanline pScanline = mpAccess->GetScanline(nY);
-                    for (sal_uLong nX = nXStart; nX < mnWidth; nX += nXAdd)
-                    {
-                        *pDest++ = mpAccess->GetIndexFromData(pScanline, nX);
-                    }
-                }
-                break;
-
-                default:
-                    mbStatus = false;
-                    break;
-            }
-        }
-        else
-        {
-            if (mpMaskAccess) // mpMaskAccess != NULL -> alphachannel is to 
create
-            {
-                if (mbTrueAlpha)
-                {
-                    Scanline pScanline = mpAccess->GetScanline(nY);
-                    Scanline pScanlineMask = mpMaskAccess->GetScanline(nY);
-                    for (sal_uLong nX = nXStart; nX < mnWidth; nX += nXAdd)
-                    {
-                        const BitmapColor& rColor = 
mpAccess->GetPixelFromData(pScanline, nX);
-                        *pDest++ = rColor.GetRed();
-                        *pDest++ = rColor.GetGreen();
-                        *pDest++ = rColor.GetBlue();
-                        *pDest++ = 255 - 
mpMaskAccess->GetIndexFromData(pScanlineMask, nX);
-                    }
-                }
-                else
-                {
-                    const BitmapColor 
aTrans(mpMaskAccess->GetBestMatchingColor(COL_WHITE));
-                    Scanline pScanline = mpAccess->GetScanline(nY);
-                    Scanline pScanlineMask = mpMaskAccess->GetScanline(nY);
-
-                    for (sal_uLong nX = nXStart; nX < mnWidth; nX += nXAdd)
-                    {
-                        const BitmapColor& rColor = 
mpAccess->GetPixelFromData(pScanline, nX);
-                        *pDest++ = rColor.GetRed();
-                        *pDest++ = rColor.GetGreen();
-                        *pDest++ = rColor.GetBlue();
-
-                        if (mpMaskAccess->GetPixelFromData(pScanlineMask, nX) 
== aTrans)
-                            *pDest++ = 0;
-                        else
-                            *pDest++ = 0xff;
-                    }
-                }
-            }
-            else
-            {
-                Scanline pScanline = mpAccess->GetScanline(nY);
-                for (sal_uLong nX = nXStart; nX < mnWidth; nX += nXAdd)
-                {
-                    const BitmapColor& rColor = 
mpAccess->GetPixelFromData(pScanline, nX);
-                    *pDest++ = rColor.GetRed();
-                    *pDest++ = rColor.GetGreen();
-                    *pDest++ = rColor.GetBlue();
-                }
-            }
-        }
-    }
-    // filter type4 ( PAETH ) will be used only for 24bit graphics
-    if (mnFilterType)
-    {
-        mnDeflateInSize = pDest - mpCurrentScan.get();
-        pDest = mpDeflateInBuf.get();
-        *pDest++ = 4; // filter type
-
-        sal_uInt8* p1 = mpCurrentScan.get() + 1; // Current Pixel
-        sal_uInt8* p2 = p1 - mnBBP; // left pixel
-        sal_uInt8* p3 = mpPreviousScan.get(); // upper pixel
-        sal_uInt8* p4 = p3 - mnBBP; // upperleft Pixel;
-
-        while (pDest < mpDeflateInBuf.get() + mnDeflateInSize)
-        {
-            sal_uLong nb = *p3++;
-            sal_uLong na, nc;
-            if (p2 >= mpCurrentScan.get() + 1)
-            {
-                na = *p2;
-                nc = *p4;
-            }
-            else
-            {
-                na = nc = 0;
-            }
-
-            tools::Long np = na + nb - nc;
-            tools::Long npa = np - na;
-            tools::Long npb = np - nb;
-            tools::Long npc = np - nc;
-
-            if (npa < 0)
-                npa = -npa;
-            if (npb < 0)
-                npb = -npb;
-            if (npc < 0)
-                npc = -npc;
-
-            if (npa <= npb && npa <= npc)
-                *pDest++ = *p1++ - static_cast<sal_uInt8>(na);
-            else if (npb <= npc)
-                *pDest++ = *p1++ - static_cast<sal_uInt8>(nb);
-            else
-                *pDest++ = *p1++ - static_cast<sal_uInt8>(nc);
-
-            p4++;
-            p2++;
-        }
-        for (tools::Long i = 0; i < static_cast<tools::Long>(mnDeflateInSize - 
1); i++)
-        {
-            mpPreviousScan[i] = mpCurrentScan[i + 1];
-        }
-    }
-    else
-    {
-        mnDeflateInSize = pDest - mpDeflateInBuf.get();
-    }
-    return mnDeflateInSize;
-}
-
-void PNGWriterImpl::ImplClearFirstScanline()
-{
-    if (mnFilterType)
-        memset(mpPreviousScan.get(), 0, mnDeflateInSize);
-}
-
-void PNGWriterImpl::ImplOpenChunk(sal_uLong nChunkType)
-{
-    maChunkSeq.emplace_back();
-    maChunkSeq.back().nType = nChunkType;
-}
-
-void PNGWriterImpl::ImplWriteChunk(sal_uInt8 nSource)
-{
-    maChunkSeq.back().aData.push_back(nSource);
-}
-
-void PNGWriterImpl::ImplWriteChunk(sal_uInt32 nSource)
-{
-    vcl::PNGWriter::ChunkData& rChunkData = maChunkSeq.back();
-    rChunkData.aData.push_back(static_cast<sal_uInt8>(nSource >> 24));
-    rChunkData.aData.push_back(static_cast<sal_uInt8>(nSource >> 16));
-    rChunkData.aData.push_back(static_cast<sal_uInt8>(nSource >> 8));
-    rChunkData.aData.push_back(static_cast<sal_uInt8>(nSource));
-}
-
-void PNGWriterImpl::ImplWriteChunk(unsigned char const* pSource, sal_uInt32 
nDatSize)
-{
-    if (nDatSize)
-    {
-        vcl::PNGWriter::ChunkData& rChunkData = maChunkSeq.back();
-        sal_uInt32 nSize = rChunkData.aData.size();
-        rChunkData.aData.resize(nSize + nDatSize);
-        memcpy(&rChunkData.aData[nSize], pSource, nDatSize);
-    }
-}
-
-PNGWriter::PNGWriter(const BitmapEx& rBmpEx,
-                     const css::uno::Sequence<css::beans::PropertyValue>* 
pFilterData)
-    : mpImpl(new vcl::PNGWriterImpl(rBmpEx, pFilterData))
-{
-}
-
-PNGWriter::~PNGWriter() {}
-
-bool PNGWriter::Write(SvStream& rStream) { return mpImpl->Write(rStream); }
-
-std::vector<vcl::PNGWriter::ChunkData>& PNGWriter::GetChunks() { return 
mpImpl->GetChunks(); }
-
-} // namespace vcl
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to