[Libreoffice-commits] core.git: vcl/source

Miklos Vajna vmiklos at collabora.co.uk
Tue May 23 19:00:42 UTC 2017


 vcl/source/filter/graphicfilter.cxx |   69 +++++++++++++++++++++++++++++++++++-
 1 file changed, 68 insertions(+), 1 deletion(-)

New commits:
commit 9a5abf25c9bcabbd77cf37ae9c6a91cb4172df60
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue May 23 16:37:36 2017 +0200

    vcl GraphicFilter: invoke JPEG import directly in ImportGraphics()
    
    So that later the two ImportJPEG() calls can be invoked in separate for
    loops.
    
    Change-Id: I7b806d7c604d406411d5113731229eb9f761eee4
    Reviewed-on: https://gerrit.libreoffice.org/37955
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx
index da1396aa31f3..01807dc71ac8 100644
--- a/vcl/source/filter/graphicfilter.cxx
+++ b/vcl/source/filter/graphicfilter.cxx
@@ -1325,7 +1325,74 @@ void GraphicFilter::ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGra
         if (pStream)
         {
             auto pG = o3tl::make_unique<Graphic>();
-            if (ImportGraphic(*pG, "", *pStream) == GRFILTER_OK)
+            sal_uInt16 nStatus = GRFILTER_OK;
+
+            // Detect the format.
+            ResetLastError();
+            sal_uLong nStreamBegin = pStream->Tell();
+            sal_uInt16 nFormat = GRFILTER_FORMAT_DONTKNOW;
+            nStatus = ImpTestOrFindFormat(OUString(), *pStream, nFormat);
+            pStream->Seek(nStreamBegin);
+
+            // Import the graphic.
+            if (nStatus == GRFILTER_OK && !pStream->GetError())
+            {
+                OUString aFilterName = pConfig->GetImportFilterName(nFormat);
+                GfxLinkType eLinkType = GfxLinkType::NONE;
+
+                if (aFilterName.equalsIgnoreAsciiCase(IMP_JPEG))
+                {
+                    GraphicFilterImportFlags nImportFlags = GraphicFilterImportFlags::SetLogsizeForJpeg;
+
+                    sal_uInt64 nPosition = pStream->Tell();
+                    if (!ImportJPEG( *pStream, *pG, nImportFlags | GraphicFilterImportFlags::OnlyCreateBitmap, nullptr))
+                        nStatus = GRFILTER_FILTERERROR;
+                    else
+                    {
+                        Bitmap& rBitmap = const_cast<Bitmap&>(pG->GetBitmapExRef().GetBitmapRef());
+                        Bitmap::ScopedWriteAccess pWriteAccess(rBitmap);
+                        pStream->Seek(nPosition);
+                        if (!ImportJPEG(*pStream, *pG, nImportFlags | GraphicFilterImportFlags::UseExistingBitmap, &pWriteAccess))
+                            nStatus = GRFILTER_FILTERERROR;
+                        else
+                            eLinkType = GfxLinkType::NativeJpg;
+                    }
+                }
+                else
+                    nStatus = GRFILTER_FILTERERROR;
+
+                if (nStatus == GRFILTER_OK && (eLinkType != GfxLinkType::NONE) && !pG->GetContext())
+                {
+                    std::unique_ptr<sal_uInt8[]> pGraphicContent;
+
+                    const sal_uLong nStreamEnd = pStream->Tell();
+                    sal_Int32 nGraphicContentSize = nStreamEnd - nStreamBegin;
+
+                    if (nGraphicContentSize > 0)
+                    {
+                        try
+                        {
+                            pGraphicContent =  std::unique_ptr<sal_uInt8[]>(new sal_uInt8[nGraphicContentSize]);
+                        }
+                        catch (const std::bad_alloc&)
+                        {
+                            nStatus = GRFILTER_TOOBIG;
+                        }
+
+                        if (nStatus == GRFILTER_OK)
+                        {
+                            pStream->Seek(nStreamBegin);
+                            pStream->ReadBytes(pGraphicContent.get(), nGraphicContentSize);
+                        }
+                    }
+
+                    if (nStatus == GRFILTER_OK)
+                        pG->SetLink(GfxLink(std::move(pGraphicContent), nGraphicContentSize, eLinkType));
+                }
+            }
+
+            // If import went fine, store the graphic.
+            if (nStatus == GRFILTER_OK)
                 pGraphic = pG.release();
         }
 


More information about the Libreoffice-commits mailing list