Kaydet (Commit) e8a05109 authored tarafından Miklos Vajna's avatar Miklos Vajna

vcl: split jpeg import into two parts

Split the import into two:

1) Just create the bitmap, this part is not thread-safe (e.g.
OpenGLContext::makeCurrent() is called when OpenGL is enabled).

2) Import the image into an existing bitmap.

The point is that the second part takes much more time than the first,
and in the future that part may be executed on a thread, while without
such a split the whole ImportJPEG() can't do that. For now
GraphicFilter::ImportGraphic() simply invokes the two parts after each
other, so no real functional changes yet.

Change-Id: Iee742a2cd3c581aeaf1a1ed9f55cd543955a85e0
Reviewed-on: https://gerrit.libreoffice.org/37397Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
Tested-by: 's avatarJenkins <ci@libreoffice.org>
üst b88103c7
...@@ -71,6 +71,8 @@ public: ...@@ -71,6 +71,8 @@ public:
TransparentType GetTransparentType() const { return eTransparent; } TransparentType GetTransparentType() const { return eTransparent; }
Bitmap GetBitmap( const Color* pTransReplaceColor = nullptr ) const; Bitmap GetBitmap( const Color* pTransReplaceColor = nullptr ) const;
/// Gives direct access to the contained bitmap.
const Bitmap& GetBitmapRef() const;
Bitmap GetMask() const; Bitmap GetMask() const;
bool IsAlpha() const; bool IsAlpha() const;
......
...@@ -147,6 +147,8 @@ public: ...@@ -147,6 +147,8 @@ public:
// before. // before.
Bitmap GetBitmap(const GraphicConversionParameters& rParameters = GraphicConversionParameters()) const; Bitmap GetBitmap(const GraphicConversionParameters& rParameters = GraphicConversionParameters()) const;
BitmapEx GetBitmapEx(const GraphicConversionParameters& rParameters = GraphicConversionParameters()) const; BitmapEx GetBitmapEx(const GraphicConversionParameters& rParameters = GraphicConversionParameters()) const;
/// Gives direct access to the contained BitmapEx.
const BitmapEx& GetBitmapExRef() const;
Animation GetAnimation() const; Animation GetAnimation() const;
const GDIMetaFile& GetGDIMetaFile() const; const GDIMetaFile& GetGDIMetaFile() const;
......
...@@ -56,10 +56,14 @@ enum class GraphicFilterImportFlags ...@@ -56,10 +56,14 @@ enum class GraphicFilterImportFlags
DontSetLogsizeForJpeg = 0x002, DontSetLogsizeForJpeg = 0x002,
ForPreview = 0x004, ForPreview = 0x004,
AllowPartialStreamRead = 0x010, AllowPartialStreamRead = 0x010,
/// Only create a bitmap, do not read pixel data.
OnlyCreateBitmap = 0x020,
/// Read pixel data into an existing bitmap.
UseExistingBitmap = 0x040,
}; };
namespace o3tl namespace o3tl
{ {
template<> struct typed_flags<GraphicFilterImportFlags> : is_typed_flags<GraphicFilterImportFlags, 0x0017> {}; template<> struct typed_flags<GraphicFilterImportFlags> : is_typed_flags<GraphicFilterImportFlags, 0x0077> {};
} }
#define IMP_BMP "SVBMP" #define IMP_BMP "SVBMP"
......
...@@ -85,6 +85,8 @@ private: ...@@ -85,6 +85,8 @@ private:
Bitmap ImplGetBitmap(const GraphicConversionParameters& rParameters) const; Bitmap ImplGetBitmap(const GraphicConversionParameters& rParameters) const;
BitmapEx ImplGetBitmapEx(const GraphicConversionParameters& rParameters) const; BitmapEx ImplGetBitmapEx(const GraphicConversionParameters& rParameters) const;
/// Gives direct access to the contained BitmapEx.
const BitmapEx& ImplGetBitmapExRef() const;
Animation ImplGetAnimation() const; Animation ImplGetAnimation() const;
const GDIMetaFile& ImplGetGDIMetaFile() const; const GDIMetaFile& ImplGetGDIMetaFile() const;
......
...@@ -1493,10 +1493,19 @@ sal_uInt16 GraphicFilter::ImportGraphic( Graphic& rGraphic, const OUString& rPat ...@@ -1493,10 +1493,19 @@ sal_uInt16 GraphicFilter::ImportGraphic( Graphic& rGraphic, const OUString& rPat
if( !( nImportFlags & GraphicFilterImportFlags::DontSetLogsizeForJpeg ) ) if( !( nImportFlags & GraphicFilterImportFlags::DontSetLogsizeForJpeg ) )
nImportFlags |= GraphicFilterImportFlags::SetLogsizeForJpeg; nImportFlags |= GraphicFilterImportFlags::SetLogsizeForJpeg;
if( !ImportJPEG( rIStream, rGraphic, nImportFlags ) ) sal_uInt64 nPosition = rIStream.Tell();
if( !ImportJPEG( rIStream, rGraphic, nImportFlags | GraphicFilterImportFlags::OnlyCreateBitmap, nullptr ) )
nStatus = GRFILTER_FILTERERROR; nStatus = GRFILTER_FILTERERROR;
else else
eLinkType = GfxLinkType::NativeJpg; {
Bitmap& rBitmap = const_cast<Bitmap&>(rGraphic.GetBitmapExRef().GetBitmapRef());
Bitmap::ScopedWriteAccess pWriteAccess(rBitmap);
rIStream.Seek(nPosition);
if( !ImportJPEG( rIStream, rGraphic, nImportFlags | GraphicFilterImportFlags::UseExistingBitmap, &pWriteAccess ) )
nStatus = GRFILTER_FILTERERROR;
else
eLinkType = GfxLinkType::NativeJpg;
}
} }
else if( aFilterName.equalsIgnoreAsciiCase( IMP_SVG ) ) else if( aFilterName.equalsIgnoreAsciiCase( IMP_SVG ) )
{ {
......
...@@ -161,13 +161,19 @@ void jpeg_svstream_src (j_decompress_ptr cinfo, void* input) ...@@ -161,13 +161,19 @@ void jpeg_svstream_src (j_decompress_ptr cinfo, void* input)
source->pub.next_input_byte = nullptr; /* until buffer loaded */ source->pub.next_input_byte = nullptr; /* until buffer loaded */
} }
JPEGReader::JPEGReader( SvStream& rStream, bool bSetLogSize ) : JPEGReader::JPEGReader( SvStream& rStream, GraphicFilterImportFlags nImportFlags ) :
mrStream ( rStream ), mrStream ( rStream ),
mnLastPos ( rStream.Tell() ), mnLastPos ( rStream.Tell() ),
mnLastLines ( 0 ), mnLastLines ( 0 ),
mbSetLogSize ( bSetLogSize ) mbSetLogSize ( nImportFlags & GraphicFilterImportFlags::SetLogsizeForJpeg )
{ {
maUpperName = "SVIJPEG"; maUpperName = "SVIJPEG";
if (!(nImportFlags & GraphicFilterImportFlags::UseExistingBitmap))
{
mpBitmap.reset(new Bitmap());
mpIncompleteAlpha.reset(new Bitmap());
}
} }
JPEGReader::~JPEGReader() JPEGReader::~JPEGReader()
...@@ -185,7 +191,7 @@ bool JPEGReader::CreateBitmap(JPEGCreateBitmapParam& rParam) ...@@ -185,7 +191,7 @@ bool JPEGReader::CreateBitmap(JPEGCreateBitmapParam& rParam)
Size aSize(rParam.nWidth, rParam.nHeight); Size aSize(rParam.nWidth, rParam.nHeight);
bool bGray = rParam.bGray; bool bGray = rParam.bGray;
maBitmap = Bitmap(); mpBitmap.reset(new Bitmap());
sal_uInt64 nSize = aSize.Width() * aSize.Height(); sal_uInt64 nSize = aSize.Width() * aSize.Height();
...@@ -202,11 +208,11 @@ bool JPEGReader::CreateBitmap(JPEGCreateBitmapParam& rParam) ...@@ -202,11 +208,11 @@ bool JPEGReader::CreateBitmap(JPEGCreateBitmapParam& rParam)
aGrayPal[ n ] = BitmapColor( cGray, cGray, cGray ); aGrayPal[ n ] = BitmapColor( cGray, cGray, cGray );
} }
maBitmap = Bitmap(aSize, 8, &aGrayPal); mpBitmap.reset(new Bitmap(aSize, 8, &aGrayPal));
} }
else else
{ {
maBitmap = Bitmap(aSize, 24); mpBitmap.reset(new Bitmap(aSize, 24));
} }
if (mbSetLogSize) if (mbSetLogSize)
...@@ -221,8 +227,8 @@ bool JPEGReader::CreateBitmap(JPEGCreateBitmapParam& rParam) ...@@ -221,8 +227,8 @@ bool JPEGReader::CreateBitmap(JPEGCreateBitmapParam& rParam)
MapMode aMapMode( nUnit == 1 ? MapUnit::MapInch : MapUnit::MapCM, aEmptyPoint, aFractX, aFractY ); MapMode aMapMode( nUnit == 1 ? MapUnit::MapInch : MapUnit::MapCM, aEmptyPoint, aFractX, aFractY );
Size aPrefSize = OutputDevice::LogicToLogic( aSize, aMapMode, MapUnit::Map100thMM ); Size aPrefSize = OutputDevice::LogicToLogic( aSize, aMapMode, MapUnit::Map100thMM );
maBitmap.SetPrefSize(aPrefSize); mpBitmap->SetPrefSize(aPrefSize);
maBitmap.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); mpBitmap->SetPrefMapMode(MapMode(MapUnit::Map100thMM));
} }
} }
...@@ -232,12 +238,12 @@ bool JPEGReader::CreateBitmap(JPEGCreateBitmapParam& rParam) ...@@ -232,12 +238,12 @@ bool JPEGReader::CreateBitmap(JPEGCreateBitmapParam& rParam)
Graphic JPEGReader::CreateIntermediateGraphic(long nLines) Graphic JPEGReader::CreateIntermediateGraphic(long nLines)
{ {
Graphic aGraphic; Graphic aGraphic;
const Size aSizePixel(maBitmap.GetSizePixel()); const Size aSizePixel(mpBitmap->GetSizePixel());
if (!mnLastLines) if (!mnLastLines)
{ {
maIncompleteAlpha = Bitmap(aSizePixel, 1); mpIncompleteAlpha.reset(new Bitmap(aSizePixel, 1));
maIncompleteAlpha.Erase(Color(COL_WHITE)); mpIncompleteAlpha->Erase(Color(COL_WHITE));
} }
if (nLines && (nLines < aSizePixel.Height())) if (nLines && (nLines < aSizePixel.Height()))
...@@ -247,21 +253,21 @@ Graphic JPEGReader::CreateIntermediateGraphic(long nLines) ...@@ -247,21 +253,21 @@ Graphic JPEGReader::CreateIntermediateGraphic(long nLines)
if (nNewLines > 0) if (nNewLines > 0)
{ {
{ {
Bitmap::ScopedWriteAccess pAccess(maIncompleteAlpha); Bitmap::ScopedWriteAccess pAccess(*mpIncompleteAlpha);
pAccess->SetFillColor(Color(COL_BLACK)); pAccess->SetFillColor(Color(COL_BLACK));
pAccess->FillRect(tools::Rectangle(Point(0, mnLastLines), Size(pAccess->Width(), nNewLines))); pAccess->FillRect(tools::Rectangle(Point(0, mnLastLines), Size(pAccess->Width(), nNewLines)));
} }
aGraphic = BitmapEx(maBitmap, maIncompleteAlpha); aGraphic = BitmapEx(*mpBitmap, *mpIncompleteAlpha);
} }
else else
{ {
aGraphic = maBitmap; aGraphic = *mpBitmap;
} }
} }
else else
{ {
aGraphic = maBitmap; aGraphic = *mpBitmap;
} }
mnLastLines = nLines; mnLastLines = nLines;
...@@ -269,7 +275,7 @@ Graphic JPEGReader::CreateIntermediateGraphic(long nLines) ...@@ -269,7 +275,7 @@ Graphic JPEGReader::CreateIntermediateGraphic(long nLines)
return aGraphic; return aGraphic;
} }
ReadState JPEGReader::Read( Graphic& rGraphic ) ReadState JPEGReader::Read( Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, Bitmap::ScopedWriteAccess* ppAccess )
{ {
ReadState eReadState; ReadState eReadState;
bool bRet = false; bool bRet = false;
...@@ -279,9 +285,10 @@ ReadState JPEGReader::Read( Graphic& rGraphic ) ...@@ -279,9 +285,10 @@ ReadState JPEGReader::Read( Graphic& rGraphic )
// read the (partial) image // read the (partial) image
long nLines; long nLines;
ReadJPEG( this, &mrStream, &nLines, GetPreviewSize() ); ReadJPEG( this, &mrStream, &nLines, GetPreviewSize(), nImportFlags, ppAccess );
if (!maBitmap.IsEmpty()) auto bUseExistingBitmap = static_cast<bool>(nImportFlags & GraphicFilterImportFlags::UseExistingBitmap);
if (bUseExistingBitmap || !mpBitmap->IsEmpty())
{ {
if( mrStream.GetError() == ERRCODE_IO_PENDING ) if( mrStream.GetError() == ERRCODE_IO_PENDING )
{ {
...@@ -289,7 +296,8 @@ ReadState JPEGReader::Read( Graphic& rGraphic ) ...@@ -289,7 +296,8 @@ ReadState JPEGReader::Read( Graphic& rGraphic )
} }
else else
{ {
rGraphic = maBitmap; if (!bUseExistingBitmap)
rGraphic = *mpBitmap;
} }
bRet = true; bRet = true;
......
...@@ -21,10 +21,13 @@ ...@@ -21,10 +21,13 @@
#define INCLUDED_VCL_SOURCE_FILTER_JPEG_JPEGREADER_HXX #define INCLUDED_VCL_SOURCE_FILTER_JPEG_JPEGREADER_HXX
#include <vcl/graph.hxx> #include <vcl/graph.hxx>
#include <vcl/bitmap.hxx>
#include <vcl/fltcall.hxx> #include <vcl/fltcall.hxx>
#include <com/sun/star/beans/PropertyValue.hpp> #include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/task/XStatusIndicator.hpp> #include <com/sun/star/task/XStatusIndicator.hpp>
enum class GraphicFilterImportFlags;
enum ReadState enum ReadState
{ {
JPEGREAD_OK, JPEGREAD_OK,
...@@ -46,8 +49,8 @@ struct JPEGCreateBitmapParam ...@@ -46,8 +49,8 @@ struct JPEGCreateBitmapParam
class JPEGReader : public GraphicReader class JPEGReader : public GraphicReader
{ {
SvStream& mrStream; SvStream& mrStream;
Bitmap maBitmap; std::unique_ptr<Bitmap> mpBitmap;
Bitmap maIncompleteAlpha; std::unique_ptr<Bitmap> mpIncompleteAlpha;
long mnLastPos; long mnLastPos;
long mnLastLines; long mnLastLines;
...@@ -56,14 +59,14 @@ class JPEGReader : public GraphicReader ...@@ -56,14 +59,14 @@ class JPEGReader : public GraphicReader
Graphic CreateIntermediateGraphic(long nLines); Graphic CreateIntermediateGraphic(long nLines);
public: public:
JPEGReader( SvStream& rStream, bool bSetLogSize ); JPEGReader( SvStream& rStream, GraphicFilterImportFlags nImportFlags );
virtual ~JPEGReader() override; virtual ~JPEGReader() override;
ReadState Read(Graphic& rGraphic); ReadState Read(Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, Bitmap::ScopedWriteAccess* ppAccess);
bool CreateBitmap(JPEGCreateBitmapParam& param); bool CreateBitmap(JPEGCreateBitmapParam& param);
Bitmap& GetBitmap() { return maBitmap; } Bitmap& GetBitmap() { return *mpBitmap; }
}; };
#endif // INCLUDED_VCL_SOURCE_FILTER_JPEG_JPEGREADER_HXX #endif // INCLUDED_VCL_SOURCE_FILTER_JPEG_JPEGREADER_HXX
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include <vcl/FilterConfigItem.hxx> #include <vcl/FilterConfigItem.hxx>
#include <vcl/graphicfilter.hxx> #include <vcl/graphicfilter.hxx>
VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, Graphic& rGraphic, GraphicFilterImportFlags nImportFlags ) VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, Bitmap::ScopedWriteAccess* ppAccess )
{ {
bool bReturn = true; bool bReturn = true;
...@@ -34,7 +34,7 @@ VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, Graphic& rGraphic, Graphi ...@@ -34,7 +34,7 @@ VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, Graphic& rGraphic, Graphi
JPEGReader* pJPEGReader = dynamic_cast<JPEGReader*>( pContext.get() ); JPEGReader* pJPEGReader = dynamic_cast<JPEGReader*>( pContext.get() );
if (!pJPEGReader) if (!pJPEGReader)
{ {
pContext = std::make_shared<JPEGReader>( rInputStream, bool( nImportFlags & GraphicFilterImportFlags::SetLogsizeForJpeg ) ); pContext = std::make_shared<JPEGReader>( rInputStream, nImportFlags );
pJPEGReader = static_cast<JPEGReader*>( pContext.get() ); pJPEGReader = static_cast<JPEGReader*>( pContext.get() );
} }
...@@ -47,7 +47,7 @@ VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, Graphic& rGraphic, Graphi ...@@ -47,7 +47,7 @@ VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, Graphic& rGraphic, Graphi
pJPEGReader->DisablePreviewMode(); pJPEGReader->DisablePreviewMode();
} }
ReadState eReadState = pJPEGReader->Read( rGraphic ); ReadState eReadState = pJPEGReader->Read( rGraphic, nImportFlags, ppAccess );
if( eReadState == JPEGREAD_ERROR ) if( eReadState == JPEGREAD_ERROR )
{ {
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <com/sun/star/uno/Reference.hxx> #include <com/sun/star/uno/Reference.hxx>
#include <sal/types.h> #include <sal/types.h>
#include <basegfx/vector/b2dsize.hxx> #include <basegfx/vector/b2dsize.hxx>
#include <vcl/bitmap.hxx>
#include <jpeglib.h> #include <jpeglib.h>
...@@ -35,6 +36,7 @@ class JPEGReader; ...@@ -35,6 +36,7 @@ class JPEGReader;
class JPEGWriter; class JPEGWriter;
class Size; class Size;
class SvStream; class SvStream;
enum class GraphicFilterImportFlags;
void jpeg_svstream_src (j_decompress_ptr cinfo, void* infile); void jpeg_svstream_src (j_decompress_ptr cinfo, void* infile);
...@@ -46,7 +48,8 @@ bool WriteJPEG( JPEGWriter* pJPEGWriter, void* pOutputStream, ...@@ -46,7 +48,8 @@ bool WriteJPEG( JPEGWriter* pJPEGWriter, void* pOutputStream,
css::uno::Reference<css::task::XStatusIndicator> const & status); css::uno::Reference<css::task::XStatusIndicator> const & status);
void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, long* pLines, void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, long* pLines,
Size const & previewSize ); Size const & previewSize, GraphicFilterImportFlags nImportFlags,
Bitmap::ScopedWriteAccess* ppAccess );
void Transform(void* pInputStream, void* pOutputStream, long nAngle); void Transform(void* pInputStream, void* pOutputStream, long nAngle);
......
...@@ -23,11 +23,12 @@ ...@@ -23,11 +23,12 @@
#include <vcl/graph.hxx> #include <vcl/graph.hxx>
#include <vcl/graphicfilter.hxx> #include <vcl/graphicfilter.hxx>
#include <vcl/fltcall.hxx> #include <vcl/fltcall.hxx>
#include <vcl/bitmap.hxx>
#include <com/sun/star/uno/Sequence.h> #include <com/sun/star/uno/Sequence.h>
#include <com/sun/star/beans/PropertyValue.hpp> #include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/task/XStatusIndicator.hpp> #include <com/sun/star/task/XStatusIndicator.hpp>
VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, Graphic& rGraphic, GraphicFilterImportFlags nImportFlags ); VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, Bitmap::ScopedWriteAccess* ppAccess );
bool ExportJPEG(SvStream& rOutputStream, bool ExportJPEG(SvStream& rOutputStream,
const Graphic& rGraphic, const Graphic& rGraphic,
......
...@@ -36,6 +36,7 @@ extern "C" { ...@@ -36,6 +36,7 @@ extern "C" {
#include <JpegWriter.hxx> #include <JpegWriter.hxx>
#include <memory> #include <memory>
#include <vcl/bitmapaccess.hxx> #include <vcl/bitmapaccess.hxx>
#include <vcl/graphicfilter.hxx>
extern "C" void errorExit (j_common_ptr cinfo) extern "C" void errorExit (j_common_ptr cinfo)
{ {
...@@ -81,7 +82,8 @@ private: ...@@ -81,7 +82,8 @@ private:
}; };
void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, long* pLines, void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, long* pLines,
Size const & previewSize ) Size const & previewSize, GraphicFilterImportFlags nImportFlags,
Bitmap::ScopedWriteAccess* ppAccess )
{ {
try try
{ {
...@@ -159,11 +161,23 @@ void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, long* pLines, ...@@ -159,11 +161,23 @@ void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, long* pLines,
aCreateBitmapParam.Y_density = cinfo.Y_density; aCreateBitmapParam.Y_density = cinfo.Y_density;
aCreateBitmapParam.bGray = bGray; aCreateBitmapParam.bGray = bGray;
bool bBitmapCreated = pJPEGReader->CreateBitmap(aCreateBitmapParam); const auto bOnlyCreateBitmap = static_cast<bool>(nImportFlags & GraphicFilterImportFlags::OnlyCreateBitmap);
const auto bUseExistingBitmap = static_cast<bool>(nImportFlags & GraphicFilterImportFlags::UseExistingBitmap);
bool bBitmapCreated = bUseExistingBitmap;
if (!bBitmapCreated)
bBitmapCreated = pJPEGReader->CreateBitmap(aCreateBitmapParam);
if (bBitmapCreated) if (bBitmapCreated && !bOnlyCreateBitmap)
{ {
Bitmap::ScopedWriteAccess pAccess(pJPEGReader->GetBitmap()); std::unique_ptr<Bitmap::ScopedWriteAccess> pScopedAccess;
if (nImportFlags & GraphicFilterImportFlags::UseExistingBitmap)
// ppAccess must be set if this flag is used.
assert(ppAccess);
else
pScopedAccess.reset(new Bitmap::ScopedWriteAccess(pJPEGReader->GetBitmap()));
Bitmap::ScopedWriteAccess& pAccess = bUseExistingBitmap ? *ppAccess : *pScopedAccess.get();
if (pAccess) if (pAccess)
{ {
...@@ -251,7 +265,7 @@ void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, long* pLines, ...@@ -251,7 +265,7 @@ void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, long* pLines,
} }
} }
if (bBitmapCreated) if (bBitmapCreated && !bOnlyCreateBitmap)
{ {
jpeg_finish_decompress( &cinfo ); jpeg_finish_decompress( &cinfo );
} }
......
...@@ -235,6 +235,11 @@ bool BitmapEx::IsAlpha() const ...@@ -235,6 +235,11 @@ bool BitmapEx::IsAlpha() const
return( IsTransparent() && bAlpha ); return( IsTransparent() && bAlpha );
} }
const Bitmap& BitmapEx::GetBitmapRef() const
{
return aBitmap;
}
Bitmap BitmapEx::GetBitmap( const Color* pTransReplaceColor ) const Bitmap BitmapEx::GetBitmap( const Color* pTransReplaceColor ) const
{ {
Bitmap aRetBmp( aBitmap ); Bitmap aRetBmp( aBitmap );
......
...@@ -352,6 +352,11 @@ const GDIMetaFile& Graphic::GetGDIMetaFile() const ...@@ -352,6 +352,11 @@ const GDIMetaFile& Graphic::GetGDIMetaFile() const
return mxImpGraphic->ImplGetGDIMetaFile(); return mxImpGraphic->ImplGetGDIMetaFile();
} }
const BitmapEx& Graphic::GetBitmapExRef() const
{
return mxImpGraphic->ImplGetBitmapExRef();
}
uno::Reference< graphic::XGraphic > Graphic::GetXGraphic() const uno::Reference< graphic::XGraphic > Graphic::GetXGraphic() const
{ {
uno::Reference< graphic::XGraphic > xRet; uno::Reference< graphic::XGraphic > xRet;
......
...@@ -584,6 +584,11 @@ Animation ImpGraphic::ImplGetAnimation() const ...@@ -584,6 +584,11 @@ Animation ImpGraphic::ImplGetAnimation() const
return aAnimation; return aAnimation;
} }
const BitmapEx& ImpGraphic::ImplGetBitmapExRef() const
{
return maEx;
}
const GDIMetaFile& ImpGraphic::ImplGetGDIMetaFile() const const GDIMetaFile& ImpGraphic::ImplGetGDIMetaFile() const
{ {
if (GraphicType::Bitmap == meType && !maMetaFile.GetActionSize()) if (GraphicType::Bitmap == meType && !maMetaFile.GetActionSize())
......
...@@ -120,7 +120,7 @@ try_again: ...@@ -120,7 +120,7 @@ try_again:
{ {
Graphic aGraphic; Graphic aGraphic;
SvFileStream aFileStream(out, StreamMode::READ); SvFileStream aFileStream(out, StreamMode::READ);
ret = (int) ImportJPEG(aFileStream, aGraphic, GraphicFilterImportFlags::NONE); ret = (int) ImportJPEG(aFileStream, aGraphic, GraphicFilterImportFlags::NONE, nullptr);
} }
else if (strcmp(argv[2], "gif") == 0) else if (strcmp(argv[2], "gif") == 0)
{ {
......
...@@ -21,7 +21,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) ...@@ -21,7 +21,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
{ {
SvMemoryStream aStream(const_cast<uint8_t*>(data), size, StreamMode::READ); SvMemoryStream aStream(const_cast<uint8_t*>(data), size, StreamMode::READ);
Graphic aGraphic; Graphic aGraphic;
(void)ImportJPEG(aStream, aGraphic, GraphicFilterImportFlags::NONE); (void)ImportJPEG(aStream, aGraphic, GraphicFilterImportFlags::NONE, nullptr);
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment