23 #include <com/sun/star/beans/PropertyValue.hpp>
24 #include <com/sun/star/uno/Sequence.hxx>
32 #include <osl/endian.h>
36 #define PNG_DEF_COMPRESSION 6
38 #define PNGCHUNK_IHDR 0x49484452
39 #define PNGCHUNK_PLTE 0x504c5445
40 #define PNGCHUNK_IDAT 0x49444154
41 #define PNGCHUNK_IEND 0x49454e44
42 #define PNGCHUNK_pHYs 0x70485973
43 #define PNGCHUNK_tRNS 0x74524e53
51 const css::uno::Sequence<css::beans::PropertyValue>* pFilterData);
69 std::unique_ptr<sal_uInt8[]>
92 void ImplWriteChunk(
unsigned char const* pSource, sal_uInt32 nDatSize);
96 const css::uno::Sequence<css::beans::PropertyValue>* pFilterData)
101 , mpMaskAccess(nullptr)
122 aBitmapEx = rBitmapEx;
131 for (
const auto& rPropVal : *pFilterData)
133 if (rPropVal.Name ==
"Compression")
135 else if (rPropVal.Name ==
"Interlaced")
137 else if (rPropVal.Name ==
"MaxChunkSize")
140 if (rPropVal.Value >>= nVal)
141 mnMaxChunkSize =
static_cast<sal_uInt32
>(nVal);
194 aMask.ReleaseAccess(mpMaskAccess);
195 mpMaskAccess =
nullptr;
214 mpMaskAccess =
nullptr;
266 sal_uInt32
nType = chunk.nType;
267 #if defined(__LITTLEENDIAN) || defined(OSL_LITENDIAN)
268 nType = OSL_SWAPDWORD(nType);
270 sal_uInt32 nCRC = rtl_crc32(0, &nType, 4);
271 sal_uInt32 nDataSize = chunk.aData.size();
273 nCRC = rtl_crc32(nCRC, chunk.aData.data(), nDataSize);
277 rOStm.
WriteBytes(chunk.aData.data(), nDataSize);
327 std::unique_ptr<sal_uInt8[]> pTempBuf(
new sal_uInt8[nCount * 3]);
335 *pTmp++ = rColor.
GetRed();
351 : static_cast<sal_uInt8>(0xff));
365 sal_uInt32 nPrefSizeX =
static_cast<sal_uInt32
>(
366 100000.0 / (
static_cast<double>(aPrefSize.Width()) /
mnWidth) + 0.5);
367 sal_uInt32 nPrefSizeY =
static_cast<sal_uInt32
>(
368 100000.0 / (
static_cast<double>(aPrefSize.Height()) /
mnHeight) + 0.5);
407 for (nY = 0; nY <
mnHeight; nY += 8)
413 for (nY = 0; nY <
mnHeight; nY += 8)
421 for (nY = 4; nY <
mnHeight; nY += 8)
428 for (nY = 0; nY <
mnHeight; nY += 4)
436 for (nY = 2; nY <
mnHeight; nY += 4)
443 for (nY = 0; nY <
mnHeight; nY += 2)
451 for (nY = 1; nY <
mnHeight; nY += 2)
466 sal_uInt32 nIDATSize = aOStm.
Tell();
467 sal_uInt32 nBytes, nBytesToWrite = nIDATSize;
468 while (nBytesToWrite)
473 const_cast<unsigned char*>(static_cast<unsigned char const*>(aOStm.
GetData()))
474 + (nIDATSize - nBytesToWrite),
476 nBytesToWrite -= nBytes;
506 for (nX = nXStart, nXIndex = 0; nX <
mnWidth; nX += nXAdd, nXIndex++)
511 else if (nShift == 0)
516 if ((nXIndex & 7) != 0)
525 for (nX = nXStart, nXIndex = 0; nX <
mnWidth; nX += nXAdd, nXIndex++)
563 *pDest++ = rColor.
GetRed();
578 *pDest++ = rColor.
GetRed();
595 *pDest++ = rColor.
GetRed();
640 if (npa <= npb && npa <= npc)
641 *pDest++ = *p1++ -
static_cast<sal_uInt8>(na);
643 *pDest++ = *p1++ -
static_cast<sal_uInt8>(nb);
645 *pDest++ = *p1++ -
static_cast<sal_uInt8>(nc);
682 rChunkData.
aData.push_back(static_cast<sal_uInt8>(nSource >> 24));
683 rChunkData.
aData.push_back(static_cast<sal_uInt8>(nSource >> 16));
684 rChunkData.
aData.push_back(static_cast<sal_uInt8>(nSource >> 8));
685 rChunkData.
aData.push_back(static_cast<sal_uInt8>(nSource));
693 sal_uInt32 nSize = rChunkData.
aData.size();
694 rChunkData.
aData.resize(nSize + nDatSize);
695 memcpy(&rChunkData.
aData[nSize], pSource, nDatSize);
700 const css::uno::Sequence<css::beans::PropertyValue>* pFilterData)
sal_uInt8 GetIndexFromData(const sal_uInt8 *pData, tools::Long nX) const
Bitmap::ScopedReadAccess mpAccess
tools::Long Height() const
bool Write(SvStream &rOutStream)
void ImplWritepHYs(const BitmapEx &rBitmapEx)
const MapMode & GetPrefMapMode() const
std::vector< vcl::PNGWriter::ChunkData > maChunkSeq
sal_uInt16 GetBestPaletteIndex(const BitmapColor &rBitmapColor) const
void ImplWriteChunk(sal_uInt8 nNumb)
const std::unique_ptr< PNGWriterImpl > mpImpl
std::unique_ptr< sal_uInt8[]> mpDeflateInBuf
sal_uLong ImplGetFilter(sal_uLong nY, sal_uLong nXStart=0, sal_uLong nXAdd=1)
Scanline GetScanline(tools::Long nY) const
const Size & GetPrefSize() const
sal_uLong mnDeflateInSize
SvStream & WriteUInt32(sal_uInt32 nUInt32)
sal_uInt8 GetBlue() const
PNGWriter(const BitmapEx &, const css::uno::Sequence< css::beans::PropertyValue > *pFilterData=nullptr)
vcl::ScopedBitmapAccess< BitmapReadAccess, Bitmap,&Bitmap::AcquireReadAccess > ScopedReadAccess
std::vector< vcl::PNGWriter::ChunkData > & GetChunks()
PNGWriterImpl(const BitmapEx &BmpEx, const css::uno::Sequence< css::beans::PropertyValue > *pFilterData)
void ImplClearFirstScanline()
std::vector< vcl::PNGWriter::ChunkData > & GetChunks()
tools::Long Width() const
std::size_t WriteBytes(const void *pData, std::size_t nSize)
void BeginCompression(int nCompressLevel=ZCODEC_DEFAULT_COMPRESSION, bool gzLib=false)
tools::Long EndCompression()
bool Write(SvStream &rStream)
static void ReleaseAccess(BitmapInfoAccess *pAccess)
MapUnit GetMapUnit() const
sal_uInt32 mnMaxChunkSize
bool IsTransparent() const
sal_uInt16 GetPaletteEntryCount() const
BitmapReadAccess * mpMaskAccess
Bitmap GetBitmap(Color aTransparentReplaceColor) const
sal_uInt8 GetGreen() const
SvStreamEndian GetEndian() const
AlphaMask GetAlpha() const
#define PNG_DEF_COMPRESSION
void SetEndian(SvStreamEndian SvStreamEndian)
const ::std::vector< Color > ImpSvNumberformatScan::StandardColor COL_WHITE
bool convertBitmap32To24Plus8(BitmapEx const &rInput, BitmapEx &rResult)
BitmapColor GetPixelFromData(const sal_uInt8 *pData, tools::Long nX) const
const BitmapColor & GetPaletteColor(sal_uInt16 nColor) const
sal_uInt16 GetBitCount() const
std::unique_ptr< sal_uInt8[]> mpPreviousScan
void ImplOpenChunk(sal_uLong nChunkType)
std::unique_ptr< sal_uInt8[]> mpCurrentScan
std::vector< sal_uInt8 > aData
BitmapColor GetBestMatchingColor(const BitmapColor &rBitmapColor)
void Write(SvStream &rOStm, const sal_uInt8 *pData, sal_uInt32 nSize)
void ImplWriteTransparent()