diff options
Diffstat (limited to 'filter')
-rw-r--r-- | filter/Library_gie.mk | 56 | ||||
-rw-r--r-- | filter/Module_filter.mk | 1 | ||||
-rw-r--r-- | filter/source/config/fragments/internalgraphicfilters/gif_Export.xcu | 21 | ||||
-rw-r--r-- | filter/source/graphicfilter/egif/egif.cxx | 549 | ||||
-rw-r--r-- | filter/source/graphicfilter/egif/giflzwc.cxx | 225 | ||||
-rw-r--r-- | filter/source/graphicfilter/egif/giflzwc.hxx | 55 |
6 files changed, 11 insertions, 896 deletions
diff --git a/filter/Library_gie.mk b/filter/Library_gie.mk deleted file mode 100644 index b40da250a183..000000000000 --- a/filter/Library_gie.mk +++ /dev/null @@ -1,56 +0,0 @@ -# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- -# -# 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 . -# - -$(eval $(call gb_Library_Library,gie)) - -$(eval $(call gb_Library_set_include,gie,\ - $$(INCLUDE) \ - -I$(SRCDIR)/filter/inc \ -)) - -$(eval $(call gb_Library_use_external,gie,boost_headers)) - -$(eval $(call gb_Library_use_sdk_api,gie)) - -$(eval $(call gb_Library_use_custom_headers,gie,\ - officecfg/registry \ -)) - -$(eval $(call gb_Library_use_common_precompiled_header,gie)) - -$(eval $(call gb_Library_use_libraries,gie,\ - basegfx \ - comphelper \ - i18nlangtag \ - svt \ - vcl \ - utl \ - tl \ - tk \ - cppu \ - sal \ - salhelper \ -)) - -$(eval $(call gb_Library_add_exception_objects,gie,\ - filter/source/graphicfilter/egif/egif \ - filter/source/graphicfilter/egif/giflzwc \ -)) - -# vim: set noet sw=4 ts=4: diff --git a/filter/Module_filter.mk b/filter/Module_filter.mk index 2fb2e4c0c8e3..42a82bacf5c0 100644 --- a/filter/Module_filter.mk +++ b/filter/Module_filter.mk @@ -21,7 +21,6 @@ $(eval $(call gb_Module_Module,filter)) $(eval $(call gb_Module_add_targets,filter,\ Configuration_filter \ CustomTarget_svg \ - Library_gie \ Library_filterconfig \ Library_icg \ Library_msfilter \ diff --git a/filter/source/config/fragments/internalgraphicfilters/gif_Export.xcu b/filter/source/config/fragments/internalgraphicfilters/gif_Export.xcu index 7f021c1b9a7f..f55d1ba55385 100644 --- a/filter/source/config/fragments/internalgraphicfilters/gif_Export.xcu +++ b/filter/source/config/fragments/internalgraphicfilters/gif_Export.xcu @@ -15,13 +15,14 @@ * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . --> - <node oor:name="gif_Export" oor:op="replace" > - <prop oor:name="Type"><value>gif_Graphics_Interchange</value></prop> - <prop oor:name="FormatName"><value>egi</value></prop> - <prop oor:name="RealFilterName"/> - <prop oor:name="UIComponent"><value>com.sun.star.svtools.SvFilterOptionsDialog</value></prop> - <prop oor:name="UIName"> - <value xml:lang="en-US">GIF - Graphics Interchange Format</value> - </prop> - <prop oor:name="Flags"><value>EXPORT</value></prop> - </node> + +<node oor:name="gif_Export" oor:op="replace" > + <prop oor:name="Type"><value>gif_Graphics_Interchange</value></prop> + <prop oor:name="FormatName"><value>SVEGIF</value></prop> + <prop oor:name="RealFilterName"/> + <prop oor:name="UIComponent"><value>com.sun.star.svtools.SvFilterOptionsDialog</value></prop> + <prop oor:name="UIName"> + <value xml:lang="en-US">GIF - Graphics Interchange Format</value> + </prop> + <prop oor:name="Flags"><value>EXPORT</value></prop> +</node> diff --git a/filter/source/graphicfilter/egif/egif.cxx b/filter/source/graphicfilter/egif/egif.cxx deleted file mode 100644 index 7a70d337e6c5..000000000000 --- a/filter/source/graphicfilter/egif/egif.cxx +++ /dev/null @@ -1,549 +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 <tools/stream.hxx> -#include <tools/debug.hxx> -#include <vcl/BitmapReadAccess.hxx> -#include <vcl/graph.hxx> -#include <vcl/outdev.hxx> -#include <vcl/FilterConfigItem.hxx> -#include <com/sun/star/task/XStatusIndicator.hpp> -#include "giflzwc.hxx" -#include <memory> - -namespace { - -class GIFWriter -{ - Bitmap aAccBmp; - SvStream& m_rGIF; - BitmapReadAccess* m_pAcc; - sal_uInt32 nMinPercent; - sal_uInt32 nMaxPercent; - sal_uInt32 nLastPercent; - tools::Long nActX; - tools::Long nActY; - sal_Int32 nInterlaced; - bool bStatus; - bool bTransparent; - - void MayCallback(sal_uInt32 nPercent); - void WriteSignature( bool bGIF89a ); - void WriteGlobalHeader( const Size& rSize ); - void WriteLoopExtension( const Animation& rAnimation ); - void WriteLogSizeExtension( const Size& rSize100 ); - void WriteImageExtension( tools::Long nTimer, Disposal eDisposal ); - void WriteLocalHeader(); - void WritePalette(); - void WriteAccess(); - void WriteTerminator(); - - bool CreateAccess( const BitmapEx& rBmpEx ); - void DestroyAccess(); - - void WriteAnimation( const Animation& rAnimation ); - void WriteBitmapEx( const BitmapEx& rBmpEx, const Point& rPoint, bool bExtended, - tools::Long nTimer = 0, Disposal eDisposal = Disposal::Not ); - - css::uno::Reference< css::task::XStatusIndicator > xStatusIndicator; - -public: - - explicit GIFWriter(SvStream &rStream); - - bool WriteGIF( const Graphic& rGraphic, FilterConfigItem* pConfigItem ); -}; - -} - -GIFWriter::GIFWriter(SvStream &rStream) - : m_rGIF(rStream) - , m_pAcc(nullptr) - , nMinPercent(0) - , nMaxPercent(0) - , nLastPercent(0) - , nActX(0) - , nActY(0) - , nInterlaced(0) - , bStatus(false) - , bTransparent(false) -{ -} - - -bool GIFWriter::WriteGIF(const Graphic& rGraphic, FilterConfigItem* pFilterConfigItem) -{ - if ( pFilterConfigItem ) - { - xStatusIndicator = pFilterConfigItem->GetStatusIndicator(); - if ( xStatusIndicator.is() ) - { - xStatusIndicator->start( OUString(), 100 ); - } - } - - Size aSize100; - const MapMode aMap( rGraphic.GetPrefMapMode() ); - bool bLogSize = ( aMap.GetMapUnit() != MapUnit::MapPixel ); - - if( bLogSize ) - aSize100 = OutputDevice::LogicToLogic(rGraphic.GetPrefSize(), aMap, MapMode(MapUnit::Map100thMM)); - - bStatus = true; - nLastPercent = 0; - nInterlaced = 0; - m_pAcc = nullptr; - - if ( pFilterConfigItem ) - nInterlaced = pFilterConfigItem->ReadInt32( "Interlaced", 0 ); - - m_rGIF.SetEndian( SvStreamEndian::LITTLE ); - - if( rGraphic.IsAnimated() ) - { - const Animation& rAnimation = rGraphic.GetAnimation(); - - WriteSignature( true ); - - if ( bStatus ) - { - WriteGlobalHeader( rAnimation.GetDisplaySizePixel() ); - - if( bStatus ) - { - WriteLoopExtension( rAnimation ); - - if( bStatus ) - WriteAnimation( rAnimation ); - } - } - } - else - { - const bool bGrafTrans = rGraphic.IsTransparent(); - - BitmapEx aBmpEx = rGraphic.GetBitmapEx(); - - nMinPercent = 0; - nMaxPercent = 100; - - WriteSignature( bGrafTrans || bLogSize ); - - if( bStatus ) - { - WriteGlobalHeader( aBmpEx.GetSizePixel() ); - - if( bStatus ) - WriteBitmapEx( aBmpEx, Point(), bGrafTrans ); - } - } - - if( bStatus ) - { - if( bLogSize ) - WriteLogSizeExtension( aSize100 ); - - WriteTerminator(); - } - - if ( xStatusIndicator.is() ) - xStatusIndicator->end(); - - return bStatus; -} - - -void GIFWriter::WriteBitmapEx( const BitmapEx& rBmpEx, const Point& rPoint, - bool bExtended, tools::Long nTimer, Disposal eDisposal ) -{ - if( !CreateAccess( rBmpEx ) ) - return; - - nActX = rPoint.X(); - nActY = rPoint.Y(); - - if( bExtended ) - WriteImageExtension( nTimer, eDisposal ); - - if( bStatus ) - { - WriteLocalHeader(); - - if( bStatus ) - { - WritePalette(); - - if( bStatus ) - WriteAccess(); - } - } - - DestroyAccess(); -} - - -void GIFWriter::WriteAnimation( const Animation& rAnimation ) -{ - const sal_uInt16 nCount = rAnimation.Count(); - - if( !nCount ) - return; - - const double fStep = 100. / nCount; - - nMinPercent = 0; - nMaxPercent = static_cast<sal_uInt32>(fStep); - - for( sal_uInt16 i = 0; i < nCount; i++ ) - { - const AnimationBitmap& rAnimationBitmap = rAnimation.Get( i ); - - WriteBitmapEx(rAnimationBitmap.maBitmapEx, rAnimationBitmap.maPositionPixel, true, - rAnimationBitmap.mnWait, rAnimationBitmap.meDisposal ); - nMinPercent = nMaxPercent; - nMaxPercent = static_cast<sal_uInt32>(nMaxPercent + fStep); - } -} - - -void GIFWriter::MayCallback(sal_uInt32 nPercent) -{ - if ( xStatusIndicator.is() ) - { - if( nPercent >= nLastPercent + 3 ) - { - nLastPercent = nPercent; - if ( nPercent <= 100 ) - xStatusIndicator->setValue( nPercent ); - } - } -} - - -bool GIFWriter::CreateAccess( const BitmapEx& rBmpEx ) -{ - if( bStatus ) - { - Bitmap aMask( rBmpEx.GetMask() ); - - aAccBmp = rBmpEx.GetBitmap(); - bTransparent = false; - - if( !!aMask ) - { - if( aAccBmp.Convert( BmpConversion::N8BitTrans ) ) - { - aMask.Convert( BmpConversion::N1BitThreshold ); - aAccBmp.Replace( aMask, BMP_COL_TRANS ); - bTransparent = true; - } - else - aAccBmp.Convert( BmpConversion::N8BitColors ); - } - else - aAccBmp.Convert( BmpConversion::N8BitColors ); - - m_pAcc = aAccBmp.AcquireReadAccess(); - - if( !m_pAcc ) - bStatus = false; - } - - return bStatus; -} - - -void GIFWriter::DestroyAccess() -{ - Bitmap::ReleaseAccess( m_pAcc ); - m_pAcc = nullptr; -} - - -void GIFWriter::WriteSignature( bool bGIF89a ) -{ - if( bStatus ) - { - m_rGIF.WriteBytes(bGIF89a ? "GIF89a" : "GIF87a" , 6); - - if( m_rGIF.GetError() ) - bStatus = false; - } -} - - -void GIFWriter::WriteGlobalHeader( const Size& rSize ) -{ - if( !bStatus ) - return; - - // 256 colors - const sal_uInt16 nWidth = static_cast<sal_uInt16>(rSize.Width()); - const sal_uInt16 nHeight = static_cast<sal_uInt16>(rSize.Height()); - const sal_uInt8 cFlags = 128 | ( 7 << 4 ); - - // write values - m_rGIF.WriteUInt16( nWidth ); - m_rGIF.WriteUInt16( nHeight ); - m_rGIF.WriteUChar( cFlags ); - m_rGIF.WriteUChar( 0x00 ); - m_rGIF.WriteUChar( 0x00 ); - - // write dummy palette with two entries (black/white); - // we do this only because of a bug in Photoshop, since those can't - // read pictures without a global color palette - m_rGIF.WriteUInt16( 0 ); - m_rGIF.WriteUInt16( 255 ); - m_rGIF.WriteUInt16( 65535 ); - - if( m_rGIF.GetError() ) - bStatus = false; -} - - -void GIFWriter::WriteLoopExtension( const Animation& rAnimation ) -{ - DBG_ASSERT( rAnimation.Count() > 0, "Animation has no bitmaps!" ); - - sal_uInt16 nLoopCount = static_cast<sal_uInt16>(rAnimation.GetLoopCount()); - - // if only one run should take place - // the LoopExtension won't be written - // The default in this case is a single run - if( nLoopCount == 1 ) - return; - - // Netscape interprets the LoopCount - // as the sole number of _repetitions_ - if( nLoopCount ) - nLoopCount--; - - const sal_uInt8 cLoByte = static_cast<sal_uInt8>(nLoopCount); - const sal_uInt8 cHiByte = static_cast<sal_uInt8>( nLoopCount >> 8 ); - - m_rGIF.WriteUChar( 0x21 ); - m_rGIF.WriteUChar( 0xff ); - m_rGIF.WriteUChar( 0x0b ); - m_rGIF.WriteBytes( "NETSCAPE2.0", 11 ); - m_rGIF.WriteUChar( 0x03 ); - m_rGIF.WriteUChar( 0x01 ); - m_rGIF.WriteUChar( cLoByte ); - m_rGIF.WriteUChar( cHiByte ); - m_rGIF.WriteUChar( 0x00 ); -} - - -void GIFWriter::WriteLogSizeExtension( const Size& rSize100 ) -{ - // writer PrefSize in 100th-mm as ApplicationExtension - if( rSize100.Width() && rSize100.Height() ) - { - m_rGIF.WriteUChar( 0x21 ); - m_rGIF.WriteUChar( 0xff ); - m_rGIF.WriteUChar( 0x0b ); - m_rGIF.WriteBytes( "STARDIV 5.0", 11 ); - m_rGIF.WriteUChar( 0x09 ); - m_rGIF.WriteUChar( 0x01 ); - m_rGIF.WriteUInt32( rSize100.Width() ); - m_rGIF.WriteUInt32( rSize100.Height() ); - m_rGIF.WriteUChar( 0x00 ); - } -} - - -void GIFWriter::WriteImageExtension( tools::Long nTimer, Disposal eDisposal ) -{ - if( !bStatus ) - return; - - const sal_uInt16 nDelay = static_cast<sal_uInt16>(nTimer); - sal_uInt8 cFlags = 0; - - // set Transparency-Flag - if( bTransparent ) - cFlags |= 1; - - // set Disposal-value - if( eDisposal == Disposal::Back ) - cFlags |= ( 2 << 2 ); - else if( eDisposal == Disposal::Previous ) - cFlags |= ( 3 << 2 ); - - m_rGIF.WriteUChar( 0x21 ); - m_rGIF.WriteUChar( 0xf9 ); - m_rGIF.WriteUChar( 0x04 ); - m_rGIF.WriteUChar( cFlags ); - m_rGIF.WriteUInt16( nDelay ); - m_rGIF.WriteUChar( m_pAcc->GetBestPaletteIndex( BMP_COL_TRANS ) ); - m_rGIF.WriteUChar( 0x00 ); - - if( m_rGIF.GetError() ) - bStatus = false; -} - - -void GIFWriter::WriteLocalHeader() -{ - if( !bStatus ) - return; - - const sal_uInt16 nPosX = static_cast<sal_uInt16>(nActX); - const sal_uInt16 nPosY = static_cast<sal_uInt16>(nActY); - const sal_uInt16 nWidth = static_cast<sal_uInt16>(m_pAcc->Width()); - const sal_uInt16 nHeight = static_cast<sal_uInt16>(m_pAcc->Height()); - sal_uInt8 cFlags = static_cast<sal_uInt8>( m_pAcc->GetBitCount() - 1 ); - - // set Interlaced-Flag - if( nInterlaced ) - cFlags |= 0x40; - - // set Flag for the local color palette - cFlags |= 0x80; - - m_rGIF.WriteUChar( 0x2c ); - m_rGIF.WriteUInt16( nPosX ); - m_rGIF.WriteUInt16( nPosY ); - m_rGIF.WriteUInt16( nWidth ); - m_rGIF.WriteUInt16( nHeight ); - m_rGIF.WriteUChar( cFlags ); - - if( m_rGIF.GetError() ) - bStatus = false; -} - - -void GIFWriter::WritePalette() -{ - if( !(bStatus && m_pAcc->HasPalette()) ) - return; - - const sal_uInt16 nCount = m_pAcc->GetPaletteEntryCount(); - const sal_uInt16 nMaxCount = ( 1 << m_pAcc->GetBitCount() ); - - for ( sal_uInt16 i = 0; i < nCount; i++ ) - { - const BitmapColor& rColor = m_pAcc->GetPaletteColor( i ); - - m_rGIF.WriteUChar( rColor.GetRed() ); - m_rGIF.WriteUChar( rColor.GetGreen() ); - m_rGIF.WriteUChar( rColor.GetBlue() ); - } - - // fill up the rest with 0 - if( nCount < nMaxCount ) - m_rGIF.SeekRel( ( nMaxCount - nCount ) * 3 ); - - if( m_rGIF.GetError() ) - bStatus = false; -} - - -void GIFWriter::WriteAccess() -{ - GIFLZWCompressor aCompressor; - const tools::Long nWidth = m_pAcc->Width(); - const tools::Long nHeight = m_pAcc->Height(); - std::unique_ptr<sal_uInt8[]> pBuffer; - bool bNative = m_pAcc->GetScanlineFormat() == ScanlineFormat::N8BitPal; - - if( !bNative ) - pBuffer.reset(new sal_uInt8[ nWidth ]); - - if( !(bStatus && ( 8 == m_pAcc->GetBitCount() ) && m_pAcc->HasPalette()) ) - return; - - aCompressor.StartCompression( m_rGIF, m_pAcc->GetBitCount() ); - - tools::Long nY, nT; - - for( tools::Long i = 0; i < nHeight; ++i ) - { - if( nInterlaced ) - { - nY = i << 3; - - if( nY >= nHeight ) - { - nT = i - ( ( nHeight + 7 ) >> 3 ); - nY= ( nT << 3 ) + 4; - - if( nY >= nHeight ) - { - nT -= ( nHeight + 3 ) >> 3; - nY = ( nT << 2 ) + 2; - - if ( nY >= nHeight ) - { - nT -= ( ( nHeight + 1 ) >> 2 ); - nY = ( nT << 1 ) + 1; - } - } - } - } - else - nY = i; - - if( bNative ) - aCompressor.Compress( m_pAcc->GetScanline( nY ), nWidth ); - else - { - Scanline pScanline = m_pAcc->GetScanline( nY ); - for( tools::Long nX = 0; nX < nWidth; nX++ ) - pBuffer[ nX ] = m_pAcc->GetIndexFromData( pScanline, nX ); - - aCompressor.Compress( pBuffer.get(), nWidth ); - } - - if ( m_rGIF.GetError() ) - bStatus = false; - - MayCallback( nMinPercent + ( nMaxPercent - nMinPercent ) * i / nHeight ); - - if( !bStatus ) - break; - } - - aCompressor.EndCompression(); - - if ( m_rGIF.GetError() ) - bStatus = false; -} - - -void GIFWriter::WriteTerminator() -{ - if( bStatus ) - { - m_rGIF.WriteUChar( 0x3b ); - - if( m_rGIF.GetError() ) - bStatus = false; - } -} - - -extern "C" SAL_DLLPUBLIC_EXPORT bool -egiGraphicExport( SvStream& rStream, Graphic& rGraphic, FilterConfigItem* pConfigItem ) -{ - GIFWriter aWriter(rStream); - return aWriter.WriteGIF(rGraphic, pConfigItem); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/filter/source/graphicfilter/egif/giflzwc.cxx b/filter/source/graphicfilter/egif/giflzwc.cxx deleted file mode 100644 index 41c65d2da4c2..000000000000 --- a/filter/source/graphicfilter/egif/giflzwc.cxx +++ /dev/null @@ -1,225 +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 <tools/stream.hxx> -#include "giflzwc.hxx" -#include <array> - - -class GIFImageDataOutputStream -{ -private: - - void FlushBlockBuf(); - inline void FlushBitsBufsFullBytes(); - - SvStream& rStream; - std::array<sal_uInt8, 255> - pBlockBuf; - sal_uInt8 nBlockBufSize; - sal_uInt32 nBitsBuf; - sal_uInt16 nBitsBufSize; - -public: - - GIFImageDataOutputStream( SvStream & rGIF, sal_uInt8 nLZWDataSize ); - ~GIFImageDataOutputStream(); - - inline void WriteBits( sal_uInt16 nCode, sal_uInt16 nCodeLen ); -}; - - -inline void GIFImageDataOutputStream::FlushBitsBufsFullBytes() -{ - while (nBitsBufSize>=8) - { - if( nBlockBufSize==255 ) - FlushBlockBuf(); - - pBlockBuf[nBlockBufSize++] = static_cast<sal_uInt8>(nBitsBuf); - nBitsBuf >>= 8; - nBitsBufSize -= 8; - } -} - - -inline void GIFImageDataOutputStream::WriteBits( sal_uInt16 nCode, sal_uInt16 nCodeLen ) -{ - if( nBitsBufSize+nCodeLen>32 ) - FlushBitsBufsFullBytes(); - - nBitsBuf |= static_cast<sal_uInt32>(nCode) << nBitsBufSize; - nBitsBufSize = nBitsBufSize + nCodeLen; -} - - -GIFImageDataOutputStream::GIFImageDataOutputStream( SvStream & rGIF, sal_uInt8 nLZWDataSize ) : - rStream(rGIF), nBlockBufSize(0), nBitsBuf(0), nBitsBufSize(0) -{ - rStream.WriteUChar( nLZWDataSize ); -} - - -GIFImageDataOutputStream::~GIFImageDataOutputStream() -{ - WriteBits(0,7); - FlushBitsBufsFullBytes(); - FlushBlockBuf(); - rStream.WriteUChar( 0 ); -} - - -void GIFImageDataOutputStream::FlushBlockBuf() -{ - if( nBlockBufSize ) - { - rStream.WriteUChar( nBlockBufSize ); - rStream.WriteBytes(pBlockBuf.data(), nBlockBufSize); - nBlockBufSize = 0; - } -} - - -struct GIFLZWCTreeNode -{ - - GIFLZWCTreeNode* pBrother; // next node which has the same father - GIFLZWCTreeNode* pFirstChild; // first - sal_uInt16 nCode; // the code for the string of pixel values which comes about - sal_uInt16 nValue; // the pixel value -}; - - -GIFLZWCompressor::GIFLZWCompressor() - : pPrefix(nullptr), nDataSize(0), nClearCode(0), - nEOICode(0), nTableSize(0), nCodeSize(0) -{ -} - - -GIFLZWCompressor::~GIFLZWCompressor() -{ - if (pIDOS!=nullptr) EndCompression(); -} - - -void GIFLZWCompressor::StartCompression( SvStream& rGIF, sal_uInt16 nPixelSize ) -{ - if( pIDOS ) - return; - - sal_uInt16 i; - - nDataSize = nPixelSize; - - if( nDataSize < 2 ) - nDataSize=2; - - nClearCode=1<<nDataSize; - nEOICode=nClearCode+1; - nTableSize=nEOICode+1; - nCodeSize=nDataSize+1; - - pIDOS.reset(new GIFImageDataOutputStream(rGIF,static_cast<sal_uInt8>(nDataSize))); - pTable.reset(new GIFLZWCTreeNode[4096]); - - for (i=0; i<4096; i++) - { - pTable[i].pBrother = pTable[i].pFirstChild = nullptr; - pTable[i].nCode = i; - pTable[i].nValue = static_cast<sal_uInt8>( i ); - } - - pPrefix = nullptr; - pIDOS->WriteBits( nClearCode,nCodeSize ); -} - -void GIFLZWCompressor::Compress(sal_uInt8* pSrc, sal_uInt32 nSize) -{ - if( !pIDOS ) - return; - - GIFLZWCTreeNode* p; - sal_uInt16 i; - sal_uInt8 nV; - - if( !pPrefix && nSize ) - { - pPrefix=&pTable[*pSrc++]; - nSize--; - } - - while( nSize ) - { - nSize--; - nV=*pSrc++; - for( p=pPrefix->pFirstChild; p!=nullptr; p=p->pBrother ) - { - if (p->nValue==nV) - break; - } - - if( p) - pPrefix=p; - else - { - pIDOS->WriteBits(pPrefix->nCode,nCodeSize); - - if (nTableSize==4096) - { - pIDOS->WriteBits(nClearCode,nCodeSize); - - for (i=0; i<nClearCode; i++) - pTable[i].pFirstChild=nullptr; - - nCodeSize=nDataSize+1; - nTableSize=nEOICode+1; - } - else - { - if(nTableSize==static_cast<sal_uInt16>(1<<nCodeSize)) - nCodeSize++; - - p=&pTable[nTableSize++]; - p->pBrother=pPrefix->pFirstChild; - pPrefix->pFirstChild=p; - p->nValue=nV; - p->pFirstChild=nullptr; - } - - pPrefix=&pTable[nV]; - } - } -} - -void GIFLZWCompressor::EndCompression() -{ - if( pIDOS ) - { - if( pPrefix ) - pIDOS->WriteBits(pPrefix->nCode,nCodeSize); - - pIDOS->WriteBits( nEOICode,nCodeSize ); - pTable.reset(); - pIDOS.reset(); - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/filter/source/graphicfilter/egif/giflzwc.hxx b/filter/source/graphicfilter/egif/giflzwc.hxx deleted file mode 100644 index 057710c85230..000000000000 --- a/filter/source/graphicfilter/egif/giflzwc.hxx +++ /dev/null @@ -1,55 +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_FILTER_SOURCE_GRAPHICFILTER_EGIF_GIFLZWC_HXX -#define INCLUDED_FILTER_SOURCE_GRAPHICFILTER_EGIF_GIFLZWC_HXX - -#include <vcl/mapmod.hxx> - - -class GIFImageDataOutputStream; -struct GIFLZWCTreeNode; - - -class GIFLZWCompressor -{ -private: - - std::unique_ptr<GIFImageDataOutputStream> pIDOS; - std::unique_ptr<GIFLZWCTreeNode[]> pTable; - GIFLZWCTreeNode* pPrefix; - sal_uInt16 nDataSize; - sal_uInt16 nClearCode; - sal_uInt16 nEOICode; - sal_uInt16 nTableSize; - sal_uInt16 nCodeSize; - -public: - - GIFLZWCompressor(); - ~GIFLZWCompressor(); - - void StartCompression( SvStream& rGIF, sal_uInt16 nPixelSize ); - void Compress(sal_uInt8* pSrc, sal_uInt32 nSize); - void EndCompression(); -}; - -#endif // INCLUDED_FILTER_SOURCE_GRAPHICFILTER_EGIF_GIFLZWC_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |