include/svtools/htmlout.hxx             |    4 
 svtools/source/svhtml/htmlout.cxx       |   15 ++-
 sw/inc/shellio.hxx                      |    7 +
 sw/source/filter/html/css1atr.cxx       |   77 +++++++++++----
 sw/source/filter/html/htmlatr.cxx       |    3 
 sw/source/filter/html/htmlflywriter.cxx |  156 +++++++++++++++++++++++++++-----
 sw/source/filter/html/htmlnumwriter.cxx |    3 
 sw/source/filter/html/htmlplug.cxx      |   23 ++++
 sw/source/filter/html/wrthtml.cxx       |   39 ++++++--
 sw/source/filter/html/wrthtml.hxx       |   11 +-
 sw/source/filter/writer/writer.cxx      |   63 ++++++++++++
 sw/source/ui/dbui/mmresultdialogs.cxx   |    9 +
 12 files changed, 344 insertions(+), 66 deletions(-)

New commits:
commit 46fa816aa0a713c54836b9689fa7a1c9ff55ef5a
Author: Oliver Specht <oliver.spe...@cib.de>
Date:   Fri Mar 18 15:57:17 2016 +0100

    tdf#63211: saving embedded images to HTML optional
    
    This change re-introduces linked images in HTML export
    but keeps embedded image export in mailmerge e-Mail function
    
    Change-Id: I9e956b590f4c675b5954e19e4d3948c36b55f1e6
    Reviewed-on: https://gerrit.libreoffice.org/23359
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Oliver Specht <oliver.spe...@cib.de>

diff --git a/include/svtools/htmlout.hxx b/include/svtools/htmlout.hxx
index 1547550..715f0ba 100644
--- a/include/svtools/htmlout.hxx
+++ b/include/svtools/htmlout.hxx
@@ -66,7 +66,8 @@ struct HTMLOutFuncs
     SVT_DLLPUBLIC static SvStream& Out_String( SvStream&, const OUString&,
                         rtl_TextEncoding eDestEnc = RTL_TEXTENCODING_MS_1252,
                         OUString *pNonConvertableChars = nullptr );
-    SVT_DLLPUBLIC static SvStream& Out_Hex( SvStream&, sal_uLong nHex, 
sal_uInt8 nLen );
+    SVT_DLLPUBLIC static SvStream& Out_Hex( SvStream&, sal_uLong nHex, 
sal_uInt8 nLen,
+                        rtl_TextEncoding eDestEnc = RTL_TEXTENCODING_MS_1252 );
     SVT_DLLPUBLIC static SvStream& Out_Color( SvStream&, const Color&,
                         rtl_TextEncoding eDestEnc = RTL_TEXTENCODING_MS_1252 );
     SVT_DLLPUBLIC static SvStream& Out_ImageMap( SvStream&, const OUString&, 
const ImageMap&, const OUString&,
@@ -103,6 +104,7 @@ struct HTMLOutFuncs
                 SvNumberFormatter& rFormatter,
                 rtl_TextEncoding eDestEnc = RTL_TEXTENCODING_MS_1252,
                 OUString *pNonConvertableChars = nullptr);
+    SVT_DLLPUBLIC static bool PrivateURLToInternalImg( OUString& rURL );
 };
 
 struct HtmlWriterHelper
diff --git a/svtools/source/svhtml/htmlout.cxx 
b/svtools/source/svhtml/htmlout.cxx
index 477c24d..99d9e38 100644
--- a/svtools/source/svhtml/htmlout.cxx
+++ b/svtools/source/svhtml/htmlout.cxx
@@ -558,7 +558,8 @@ SvStream& HTMLOutFuncs::FlushToAscii( SvStream& rStream,
     return rStream;
 }
 
-SvStream& HTMLOutFuncs::Out_Hex( SvStream& rStream, sal_uLong nHex, sal_uInt8 
nLen )
+SvStream& HTMLOutFuncs::Out_Hex( SvStream& rStream, sal_uLong nHex, sal_uInt8 
nLen,
+                                   rtl_TextEncoding )
 {                                                  // in einen Stream aus
     sal_Char aNToABuf[] = "0000000000000000";
 
@@ -977,6 +978,18 @@ OString HTMLOutFuncs::CreateTableDataOptionsValNum(
     return aStrTD.makeStringAndClear();
 }
 
+bool HTMLOutFuncs::PrivateURLToInternalImg( OUString& rURL )
+{
+    if( rURL.getLength() > 14 &&
+        rURL.compareTo( OOO_STRING_SVTOOLS_HTML_private_image, 14 ) == 0 )
+    {
+        rURL = rURL.copy( 14 );
+        return true;
+    }
+
+    return false;
+}
+
 void HtmlWriterHelper::applyColor(HtmlWriter& rHtmlWriter, const OString 
&aAttributeName, const Color& rColor)
 {
     OStringBuffer sBuffer;
diff --git a/sw/inc/shellio.hxx b/sw/inc/shellio.hxx
index b23e1be..9d492b3 100644
--- a/sw/inc/shellio.hxx
+++ b/sw/inc/shellio.hxx
@@ -374,7 +374,7 @@ protected:
     bool CopyNextPam( SwPaM ** );
 
     void PutNumFormatFontsInAttrPool();
-    void PutEditEngFontsInAttrPool();
+    void PutEditEngFontsInAttrPool( bool bIncl_CJK_CTL = true );
 
     virtual sal_uLong WriteStream() = 0;
     void                SetBaseURL( const OUString& rURL ) { sBaseURL = rURL; }
@@ -415,6 +415,8 @@ public:
 
     void SetShowProgress( bool bFlag )  { bShowProgress = bFlag; }
 
+    const OUString* GetOrigFileName() const       { return pOrigFileName; }
+
     const SwAsciiOptions& GetAsciiOptions() const { return aAscOpts; }
     void SetAsciiOptions( const SwAsciiOptions& rOpt ) { aAscOpts = rOpt; }
 
@@ -434,6 +436,9 @@ public:
     static SwPaM * NewSwPaM(SwDoc & rDoc,
                             sal_uLong const nStartIdx, sal_uLong const 
nEndIdx);
 
+    // If applicable copy a local file into internet.
+    bool CopyLocalFileToINet( OUString& rFileNm );
+
     // Stream-specific routines. Do not use in storage-writer!
 
     // Optimizing output on stream.
diff --git a/sw/source/filter/html/css1atr.cxx 
b/sw/source/filter/html/css1atr.cxx
index 547f28d..35f4861 100644
--- a/sw/source/filter/html/css1atr.cxx
+++ b/sw/source/filter/html/css1atr.cxx
@@ -143,7 +143,8 @@ static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
                                         const SfxItemSet& rItemSet,
                                         bool bDeep );
 static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt,
-                                 sal_uInt16 nMode );
+                                 sal_uInt16 nMode,
+                                 const OUString *pGraphicName );
 static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt );
 static Writer& OutCSS1_SwFormatFrameSize( Writer& rWrt, const SfxPoolItem& rHt,
                                      sal_uInt16 nMode );
@@ -534,7 +535,7 @@ void SwHTMLWriter::OutCSS1_SfxItemSet( const SfxItemSet& 
rItemSet,
     }
 }
 
-void SwHTMLWriter::OutStyleSheet( const SwPageDesc& rPageDesc )
+void SwHTMLWriter::OutStyleSheet( const SwPageDesc& rPageDesc, bool bUsed )
 {
     m_bFirstCSS1Rule = true;
 
@@ -603,7 +604,7 @@ void SwHTMLWriter::OutStyleSheet( const SwPageDesc& 
rPageDesc )
     {
         const SwTextFormatColl* pColl = (*pDoc->GetTextFormatColls())[i];
         sal_uInt16 nPoolId = pColl->GetPoolFormatId();
-        if( nPoolId == RES_POOLCOLL_TEXT ||
+        if( !bUsed || nPoolId == RES_POOLCOLL_TEXT ||
             pDoc->IsUsed( *pColl ) )
             OutCSS1_SwFormat( *this, *pColl, 
&pDoc->getIDocumentStylePoolAccess(), m_pTemplate );
     }
@@ -614,7 +615,7 @@ void SwHTMLWriter::OutStyleSheet( const SwPageDesc& 
rPageDesc )
     {
         const SwCharFormat *pCFormat = (*pDoc->GetCharFormats())[i];
         sal_uInt16 nPoolId = pCFormat->GetPoolFormatId();
-        if( nPoolId == RES_POOLCHR_INET_NORMAL ||
+        if( !bUsed || nPoolId == RES_POOLCHR_INET_NORMAL ||
             nPoolId == RES_POOLCHR_INET_VISIT ||
             pDoc->IsUsed( *pCFormat ) )
             OutCSS1_SwFormat( *this, *pCFormat, 
&pDoc->getIDocumentStylePoolAccess(), m_pTemplate );
@@ -1832,7 +1833,8 @@ static Writer& OutCSS1_SwFootnoteInfo( Writer& rWrt, 
const SwEndNoteInfo& rInfo,
     return rWrt;
 }
 
-Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet )
+Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet,
+                                    const OUString& rEmbeddedGraphicName )
 {
     SwHTMLWriter& rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt);
 
@@ -1847,7 +1849,7 @@ Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const 
SfxItemSet& rItemSet )
     if( SfxItemState::SET == rItemSet.GetItemState( RES_BACKGROUND, false,
                                                &pItem ) )
     {
-        OutCSS1_SvxBrush( rWrt, *pItem, CSS1_BACKGROUND_PAGE );
+        OutCSS1_SvxBrush( rWrt, *pItem, CSS1_BACKGROUND_PAGE, 
&rEmbeddedGraphicName );
     }
 
     if( SfxItemState::SET == rItemSet.GetItemState( RES_BOX, false,
@@ -1916,7 +1918,7 @@ Writer& OutCSS1_TableBGStyleOpt( Writer& rWrt, const 
SfxPoolItem& rHt )
     SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
                                    CSS1_OUTMODE_ENCODE|
                                    CSS1_OUTMODE_TABLEBOX, nullptr );
-    OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_TABLE );
+    OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_TABLE, 0 );
 
     if( !rHTMLWrt.m_bFirstCSS1Property )
         rWrt.Strm().WriteChar( '\"' );
@@ -2163,7 +2165,7 @@ void SwHTMLWriter::OutCSS1_TableFrameFormatOptions( const 
SwFrameFormat& rFrameF
     const SfxPoolItem *pItem;
     const SfxItemSet& rItemSet = rFrameFormat.GetAttrSet();
     if( SfxItemState::SET==rItemSet.GetItemState( RES_BACKGROUND, false, 
&pItem ) )
-        OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_TABLE );
+        OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_TABLE, 0 );
 
     if( IsHTMLMode( HTMLMODE_PRINT_EXT ) )
         OutCSS1_SvxFormatBreak_SwFormatPDesc_SvxFormatKeep( *this, rItemSet, 
false );
@@ -2195,7 +2197,7 @@ void SwHTMLWriter::OutCSS1_SectionFormatOptions( const 
SwFrameFormat& rFrameForm
     const SfxPoolItem *pItem;
     const SfxItemSet& rItemSet = rFrameFormat.GetAttrSet();
     if( SfxItemState::SET==rItemSet.GetItemState( RES_BACKGROUND, false, 
&pItem ) )
-        OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_SECTION );
+        OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_SECTION, 0 );
 
     if (pCol)
     {
@@ -2217,7 +2219,7 @@ static bool OutCSS1_FrameFormatBrush( SwHTMLWriter& rWrt,
         nullptr != rBrushItem.GetGraphicLink() ||
         0 != rBrushItem.GetGraphicPos() )
     {
-        OutCSS1_SvxBrush( rWrt, rBrushItem, CSS1_BACKGROUND_FLY );
+        OutCSS1_SvxBrush( rWrt, rBrushItem, CSS1_BACKGROUND_FLY, 0 );
         bWritten = true;
     }
     return bWritten;
@@ -3195,12 +3197,13 @@ static Writer& 
OutCSS1_SvxFormatBreak_SwFormatPDesc_SvxFormatKeep( Writer& rWrt,
 // Wrapper for OutCSS1_SfxItemSet etc.
 static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt )
 {
-    OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_ATTR );
+    OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_ATTR, 0 );
     return rWrt;
 }
 
 static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt,
-                                 sal_uInt16 nMode)
+                                 sal_uInt16 nMode,
+                                 const OUString* pGraphicName)
 {
     SwHTMLWriter& rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt);
 
@@ -3213,7 +3216,15 @@ static Writer& OutCSS1_SvxBrush( Writer& rWrt, const 
SfxPoolItem& rHt,
     // start getting a few values
 //  const Brush &rBrush = static_cast<const SvxBrushItem &>(rHt).GetBrush();
     const Color & rColor = static_cast<const SvxBrushItem &>(rHt).GetColor();
+    OUString aLink = pGraphicName ? *pGraphicName
+                            : ((const SvxBrushItem &)rHt).GetGraphicLink();
     SvxGraphicPosition ePos = static_cast<const SvxBrushItem 
&>(rHt).GetGraphicPos();
+    if( CSS1_BACKGROUND_PAGE==nMode && !rHTMLWrt.mbEmbedImages )
+    {
+        // page style images are exported if not tiled
+        if( aLink.isEmpty() || GPOS_TILED==ePos )
+            return rWrt;
+    }
 
     // get the color
     bool bColor = false;
@@ -3228,24 +3239,35 @@ static Writer& OutCSS1_SvxBrush( Writer& rWrt, const 
SfxPoolItem& rHt,
 
     // and now the Graphic
     OUString aGraphicInBase64;
+    OUString aGraphicAsLink;
 
     // Embedded Grafic -> export WriteEmbedded
-    const Graphic* pGrf = static_cast<const SvxBrushItem &>(rHt).GetGraphic();
-    if( pGrf )
+    const Graphic* pGrf = 0;
+    if( rHTMLWrt.mbEmbedImages || aLink.isEmpty())
     {
-        if( !XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64) )
+        pGrf = static_cast<const SvxBrushItem &>(rHt).GetGraphic();
+        if( pGrf )
         {
-            rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
+            if( !XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64) )
+            {
+                rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
+            }
         }
+        aLink.clear();
+    }
+    else if( !pGraphicName && rHTMLWrt.m_bCfgCpyLinkedGrfs )
+    {
+        aGraphicAsLink = aLink;
+        rWrt.CopyLocalFileToINet( aGraphicAsLink );
+        aLink = aGraphicAsLink;
     }
-
     // In tables we only export something if there is a Graphic
-    if( CSS1_BACKGROUND_TABLE==nMode && !pGrf )
+    if( CSS1_BACKGROUND_TABLE==nMode && !pGrf && !aLink.isEmpty())
         return rWrt;
 
     // if necessary, add the orientation of the Graphic
     const sal_Char *pRepeat = nullptr, *pHori = nullptr, *pVert = nullptr;
-    if( pGrf )
+    if( pGrf || !aLink.isEmpty() )
     {
         if( GPOS_TILED==ePos )
         {
@@ -3308,7 +3330,7 @@ static Writer& OutCSS1_SvxBrush( Writer& rWrt, const 
SfxPoolItem& rHt,
 
     // now build the string
     OUString sOut;
-    if( !pGrf && !bColor )
+    if( !pGrf && aLink.isEmpty() && !bColor )
     {
         // no color and no Link, but a transparent Brush
         if( bTransparent && CSS1_BACKGROUND_FLY != nMode )
@@ -3322,13 +3344,22 @@ static Writer& OutCSS1_SvxBrush( Writer& rWrt, const 
SfxPoolItem& rHt,
             sOut += OStringToOUString(sTmp, RTL_TEXTENCODING_ASCII_US);
         }
 
-        if( pGrf )
+        if( pGrf || !aLink.isEmpty() )
         {
             if( bColor )
                 sOut += " ";
 
-            sOut += OStringToOUString(sCSS1_url, RTL_TEXTENCODING_ASCII_US) +
-                "(\'" OOO_STRING_SVTOOLS_HTML_O_data ":" + aGraphicInBase64 + 
"\')";
+            if(pGrf)
+            {
+                sOut += OStringToOUString(sCSS1_url, 
RTL_TEXTENCODING_ASCII_US) +
+                    "(\'" OOO_STRING_SVTOOLS_HTML_O_data ":" + 
aGraphicInBase64 + "\')";
+            }
+            else
+            {
+                sOut += OStringToOUString(sCSS1_url, 
RTL_TEXTENCODING_ASCII_US)+
+                     "(" +  
URIHelper::simpleNormalizedMakeRelative(rWrt.GetBaseURL(),
+                             aLink) + ")";
+            }
 
             if( pRepeat )
             {
diff --git a/sw/source/filter/html/htmlatr.cxx 
b/sw/source/filter/html/htmlatr.cxx
index b285c90..fe8597e 100644
--- a/sw/source/filter/html/htmlatr.cxx
+++ b/sw/source/filter/html/htmlatr.cxx
@@ -953,7 +953,8 @@ void OutHTML_SwFormat( Writer& rWrt, const SwFormat& 
rFormat,
         OSL_ENSURE( aNumInfo.GetNumRule(), "Wo ist die Numerierung 
geblieben???" );
         OSL_ENSURE( nBulletGrfLvl < MAXLEVEL, "So viele Ebenen gibt's nicht" );
         const SwNumFormat& rNumFormat = 
aNumInfo.GetNumRule()->Get(nBulletGrfLvl);
-        OutHTML_BulletImage( rWrt, OOO_STRING_SVTOOLS_HTML_image, 
rNumFormat.GetBrush() );
+        OutHTML_BulletImage( rWrt, OOO_STRING_SVTOOLS_HTML_image, 
rNumFormat.GetBrush(),
+                rHWrt.m_aBulletGrfs[nBulletGrfLvl]);
     }
 
     rHWrt.GetNumInfo() = aNumInfo;
diff --git a/sw/source/filter/html/htmlflywriter.cxx 
b/sw/source/filter/html/htmlflywriter.cxx
index 1eacca5..5b27c3b 100644
--- a/sw/source/filter/html/htmlflywriter.cxx
+++ b/sw/source/filter/html/htmlflywriter.cxx
@@ -520,9 +520,10 @@ void SwHTMLWriter::OutFrameFormat( sal_uInt8 nMode, const 
SwFrameFormat& rFrameF
 
 OString SwHTMLWriter::OutFrameFormatOptions( const SwFrameFormat &rFrameFormat,
                                      const OUString& rAlternateText,
-                                     sal_uInt32 nFrameOpts )
+                                     sal_uInt32 nFrameOpts,
+                                     const OString &rEndTags )
 {
-    OString sRetEndTags;
+    OString sRetEndTags(rEndTags);
     OStringBuffer sOut;
     const SfxPoolItem* pItem;
     const SfxItemSet& rItemSet = rFrameFormat.GetAttrSet();
@@ -795,10 +796,11 @@ OString SwHTMLWriter::OutFrameFormatOptions( const 
SwFrameFormat &rFrameFormat,
         {
             sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_linebreak).
                 append(' ').append(OOO_STRING_SVTOOLS_HTML_O_clear).
-                append("=\"").append(pStr).append("\">");
+                append("=\"").append(pStr).append("\">").append(rEndTags);
             sRetEndTags = sOut.makeStringAndClear();
         }
     }
+    assert(sRetEndTags.endsWith(rEndTags)); // fdo#58286
     return sRetEndTags;
 }
 
@@ -1200,6 +1202,7 @@ OUString lclWriteOutImap(SwHTMLWriter& rHTMLWrt, const 
SfxItemSet& rItemSet, con
 }
 
 Writer& OutHTML_Image( Writer& rWrt, const SwFrameFormat &rFrameFormat,
+                       const OUString& rGraphicURL,
                        Graphic& rGraphic, const OUString& rAlternateText,
                        const Size &rRealSize, sal_uInt32 nFrameOpts,
                        const sal_Char *pMarkType,
@@ -1217,6 +1220,10 @@ Writer& OutHTML_Image( Writer& rWrt, const SwFrameFormat 
&rFrameFormat,
         OutHTML_INetFormat( rWrt, *pINetFormat, false );
     }
 
+    OUString aGraphicURL( rGraphicURL );
+    if( !rHTMLWrt.mbEmbedImages && 
!HTMLOutFuncs::PrivateURLToInternalImg(aGraphicURL) )
+        aGraphicURL = URIHelper::simpleNormalizedMakeRelative( 
rWrt.GetBaseURL(), aGraphicURL);
+
     const SfxPoolItem* pItem;
     const SfxItemSet& rItemSet = rFrameFormat.GetAttrSet();
 
@@ -1362,10 +1369,18 @@ Writer& OutHTML_Image( Writer& rWrt, const 
SwFrameFormat &rFrameFormat,
     }
 
     OStringBuffer sBuffer;
-    sBuffer.append(OOO_STRING_SVTOOLS_HTML_O_data);
-    sBuffer.append(":");
-    sBuffer.append(OUStringToOString(aGraphicInBase64, RTL_TEXTENCODING_UTF8));
-    aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_src, 
sBuffer.makeStringAndClear().getStr());
+    if(rHTMLWrt.mbEmbedImages)
+    {
+        sBuffer.append(OOO_STRING_SVTOOLS_HTML_O_data);
+        sBuffer.append(":");
+        sBuffer.append(OUStringToOString(aGraphicInBase64, 
RTL_TEXTENCODING_UTF8));
+        aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_src, 
sBuffer.makeStringAndClear().getStr());
+    }
+    else
+    {
+        sBuffer.append(OUStringToOString(aGraphicURL, RTL_TEXTENCODING_UTF8));
+        aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_src, 
sBuffer.makeStringAndClear().getStr());
+    }
 
     // Events
     if (SfxItemState::SET == rItemSet.GetItemState(RES_FRMMACRO, true, &pItem))
@@ -1412,21 +1427,44 @@ Writer& OutHTML_Image( Writer& rWrt, const 
SwFrameFormat &rFrameFormat,
 
 Writer& OutHTML_BulletImage( Writer& rWrt,
                              const sal_Char *pTag,
-                             const SvxBrushItem* pBrush )
+                             const SvxBrushItem* pBrush,
+                             const OUString &rGraphicURL)
 {
     SwHTMLWriter & rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt);
 
     OUString aGraphicInBase64;
+    OUString aLink;
     if( pBrush )
     {
-        const Graphic* pGrf = pBrush->GetGraphic();
-        if( pGrf )
+        aLink = pBrush->GetGraphicLink();
+        if(rHTMLWrt.mbEmbedImages || aLink.isEmpty())
         {
-            if( !XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64) )
+            const Graphic* pGrf = pBrush->GetGraphic();
+            if( pGrf )
             {
-                rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
+                if( !XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64) )
+                {
+                    rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
+                }
             }
         }
+        else if(!aLink.isEmpty())
+        {
+            if( rHTMLWrt.m_bCfgCpyLinkedGrfs )
+            {
+                rHTMLWrt.CopyLocalFileToINet( aLink );
+            }
+
+        }
+    }
+    else if(!rHTMLWrt.mbEmbedImages)
+    {
+        aLink = rGraphicURL;
+    }
+    if(!aLink.isEmpty())
+    {
+        if( !HTMLOutFuncs::PrivateURLToInternalImg(aLink) )
+            aLink = URIHelper::simpleNormalizedMakeRelative( 
rWrt.GetBaseURL(), aLink);
     }
 
     OStringBuffer sOut;
@@ -1434,12 +1472,22 @@ Writer& OutHTML_BulletImage( Writer& rWrt,
         sOut.append('<').append(pTag);
 
     sOut.append(' ');
-    sOut.append(OOO_STRING_SVTOOLS_HTML_O_style).append("=\"").
-    append("list-style-image: ").append("url(").
-    append(OOO_STRING_SVTOOLS_HTML_O_data).append(":");
-    rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
-    HTMLOutFuncs::Out_String( rWrt.Strm(), aGraphicInBase64, 
rHTMLWrt.m_eDestEnc, &rHTMLWrt.m_aNonConvertableCharacters );
-    sOut.append(");").append('\"');
+    sOut.append(OOO_STRING_SVTOOLS_HTML_O_style).append("=\"");
+    if(!aLink.isEmpty())
+    {
+        sOut.append(OOO_STRING_SVTOOLS_HTML_O_src).append("=\"");
+        rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
+        HTMLOutFuncs::Out_String( rWrt.Strm(), aLink, rHTMLWrt.m_eDestEnc, 
&rHTMLWrt.m_aNonConvertableCharacters );
+    }
+    else
+    {
+        sOut.append("list-style-image: ").append("url(").
+        append(OOO_STRING_SVTOOLS_HTML_O_data).append(":");
+        rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
+        HTMLOutFuncs::Out_String( rWrt.Strm(), aGraphicInBase64, 
rHTMLWrt.m_eDestEnc, &rHTMLWrt.m_aNonConvertableCharacters );
+        sOut.append(");");
+    }
+    sOut.append('\"');
 
     if (pTag)
         sOut.append('>');
@@ -1678,7 +1726,28 @@ static Writer & OutHTML_FrameFormatAsImage( Writer& 
rWrt, const SwFrameFormat& r
     ImageMap aIMap;
     Graphic aGraphic( ((SwFrameFormat &)rFrameFormat).MakeGraphic( &aIMap ) );
     Size aSz( 0, 0 );
-    OutHTML_Image( rWrt, rFrameFormat, aGraphic, rFrameFormat.GetName(), aSz,
+    OUString GraphicURL;
+    if(!rHTMLWrt.mbEmbedImages)
+    {
+        if( rHTMLWrt.GetOrigFileName() )
+            GraphicURL = *rHTMLWrt.GetOrigFileName();
+        if( aGraphic.GetType() == GRAPHIC_NONE ||
+            XOutBitmap::WriteGraphic( aGraphic, GraphicURL,
+                                      OUString("JPG"),
+                                      (XOUTBMP_USE_GIF_IF_POSSIBLE|
+                                       XOUTBMP_USE_NATIVE_IF_POSSIBLE) ) != 0 )
+        {
+            // leer oder fehlerhaft, da ist nichts auszugeben
+            rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
+            return rWrt;
+        }
+
+        GraphicURL = URIHelper::SmartRel2Abs(
+            INetURLObject(rWrt.GetBaseURL()), GraphicURL,
+            URIHelper::GetMaybeFileHdl() );
+
+    }
+    OutHTML_Image( rWrt, rFrameFormat, GraphicURL, aGraphic, 
rFrameFormat.GetName(), aSz,
                     HTML_FRMOPTS_GENIMG, "frame",
                     aIMap.GetIMapObjectCount() ? &aIMap : nullptr );
 
@@ -1705,7 +1774,54 @@ static Writer& OutHTML_FrameFormatGrfNode( Writer& rWrt, 
const SwFrameFormat& rF
          nFrameFlags |= HTML_FRMOPTS_IMG_CSS1;
 
     Graphic aGraphic = pGrfNd->GetGraphic();
-    OutHTML_Image( rWrt, rFrameFormat, aGraphic, pGrfNd->GetTitle(),
+    OUString aGraphicURL;
+    if(!rHTMLWrt.mbEmbedImages)
+    {
+        const SwMirrorGrf& rMirror = pGrfNd->GetSwAttrSet().GetMirrorGrf();
+
+        if( !pGrfNd->IsLinkedFile() || RES_MIRROR_GRAPH_DONT != 
rMirror.GetValue() )
+        {
+            // create a (mirrored) jpeg file
+            if( rHTMLWrt.GetOrigFileName() )
+                aGraphicURL = *rHTMLWrt.GetOrigFileName();
+            pGrfNd->GetGrf( sal_True );
+
+            sal_uLong nFlags = XOUTBMP_USE_GIF_IF_SENSIBLE |
+                           XOUTBMP_USE_NATIVE_IF_POSSIBLE;
+            switch( rMirror.GetValue() )
+            {
+            case RES_MIRROR_GRAPH_VERT: nFlags = XOUTBMP_MIRROR_HORZ; break;
+            case RES_MIRROR_GRAPH_HOR:    nFlags = XOUTBMP_MIRROR_VERT; break;
+            case RES_MIRROR_GRAPH_BOTH:
+                nFlags = XOUTBMP_MIRROR_VERT | XOUTBMP_MIRROR_HORZ;
+                break;
+            }
+
+            Size aMM100Size;
+            const SwFormatFrameSize& rSize = rFrameFormat.GetFrameSize();
+            aMM100Size = OutputDevice::LogicToLogic( rSize.GetSize(),
+                            MapMode( MAP_TWIP ), MapMode( MAP_100TH_MM ));
+
+            sal_uInt16 nErr = XOutBitmap::WriteGraphic( pGrfNd->GetGrf(), 
aGraphicURL,
+                    OUString("JPG"), nFlags, &aMM100Size );
+            if( nErr )
+            {
+                rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
+                return rWrt;
+            }
+            aGraphicURL = URIHelper::SmartRel2Abs(
+                INetURLObject(rWrt.GetBaseURL()), aGraphicURL,
+                URIHelper::GetMaybeFileHdl() );
+        }
+        else
+        {
+            pGrfNd->GetFileFilterNms( &aGraphicURL, 0 );
+            if( rHTMLWrt.m_bCfgCpyLinkedGrfs )
+                rWrt.CopyLocalFileToINet( aGraphicURL );
+        }
+
+    }
+    OutHTML_Image( rWrt, rFrameFormat, aGraphicURL, aGraphic, 
pGrfNd->GetTitle(),
                   pGrfNd->GetTwipSize(), nFrameFlags, "graphic" );
 
     return rWrt;
diff --git a/sw/source/filter/html/htmlnumwriter.cxx 
b/sw/source/filter/html/htmlnumwriter.cxx
index 5afc06a..9042b5a 100644
--- a/sw/source/filter/html/htmlnumwriter.cxx
+++ b/sw/source/filter/html/htmlnumwriter.cxx
@@ -219,7 +219,8 @@ Writer& OutHTML_NumBulListStart( SwHTMLWriter& rWrt,
             rWrt.Strm().WriteOString( sOut );
             OutHTML_BulletImage( rWrt,
                                     nullptr,
-                                    rNumFormat.GetBrush() );
+                                    rNumFormat.GetBrush(),
+                                    rWrt.m_aBulletGrfs[i]);
         }
         else
         {
diff --git a/sw/source/filter/html/htmlplug.cxx 
b/sw/source/filter/html/htmlplug.cxx
index 1ecfa94..f85ab2e 100644
--- a/sw/source/filter/html/htmlplug.cxx
+++ b/sw/source/filter/html/htmlplug.cxx
@@ -1315,9 +1315,30 @@ Writer& OutHTML_FrameFormatOLENodeGrf( Writer& rWrt, 
const SwFrameFormat& rFrame
     }
 
     Graphic aGraphic( *pOLENd->GetGraphic() );
+    OUString aGraphicURL;
+    if(!rHTMLWrt.mbEmbedImages)
+    {
+        const OUString* pTempFileName = rHTMLWrt.GetOrigFileName();
+        if(pTempFileName)
+            aGraphicURL = *pTempFileName;
+
+        sal_uInt16 nErr = XOutBitmap::WriteGraphic( aGraphic, aGraphicURL,
+                                    OUString("JPG"),
+                                    (XOUTBMP_USE_GIF_IF_POSSIBLE |
+                                     XOUTBMP_USE_NATIVE_IF_POSSIBLE) );
+        if( nErr )              // fehlerhaft, da ist nichts auszugeben
+        {
+            rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
+            return rWrt;
+        }
+        aGraphicURL = URIHelper::SmartRel2Abs(
+            INetURLObject(rWrt.GetBaseURL()), aGraphicURL,
+            URIHelper::GetMaybeFileHdl() );
+
+    }
     sal_uLong nFlags = bInCntnr ? HTML_FRMOPTS_GENIMG_CNTNR
         : HTML_FRMOPTS_GENIMG;
-    OutHTML_Image( rWrt, rFrameFormat, aGraphic,
+    OutHTML_Image( rWrt, rFrameFormat, aGraphicURL, aGraphic,
             pOLENd->GetTitle(), pOLENd->GetTwipSize(),
             nFlags, "ole" );
 
diff --git a/sw/source/filter/html/wrthtml.cxx 
b/sw/source/filter/html/wrthtml.cxx
index 57978fb..1bb9512 100644
--- a/sw/source/filter/html/wrthtml.cxx
+++ b/sw/source/filter/html/wrthtml.cxx
@@ -155,6 +155,7 @@ SwHTMLWriter::SwHTMLWriter( const OUString& rBaseURL )
     , m_bCfgNetscape4( false )
     , mbSkipImages(false)
     , mbSkipHeaderFooter(false)
+    , mbEmbedImages(false)
     , m_bCfgPrintLayout( false )
     , m_bParaDotLeaders( false )
 {
@@ -186,6 +187,10 @@ void SwHTMLWriter::SetupFilterOptions(SfxMedium& rMedium)
     {
         mbSkipHeaderFooter = true;
     }
+    else if (sFilterOptions == "EmbedImages" )
+    {
+        mbEmbedImages = true;
+    }
 }
 
 sal_uLong SwHTMLWriter::WriteStream()
@@ -1057,8 +1062,10 @@ const SwPageDesc *SwHTMLWriter::MakeHeader( sal_uInt16 
&rHeaderAttrs )
         OutDirection( m_nDirection );
 
         if( m_bCfgOutStyles )
-            OutCSS1_BodyTagStyleOpt( *this, rItemSet );
-
+        {
+            OUString dummy;
+            OutCSS1_BodyTagStyleOpt( *this, rItemSet, dummy );
+        }
         // Events anhaengen
         if( pDoc->GetDocShell() )   // nur mit DocShell ist Basic moeglich
             OutBasicBodyEvents();
@@ -1230,15 +1237,31 @@ void SwHTMLWriter::OutBackground( const SvxBrushItem 
*pBrushItem, bool bGraphic
 
     OUString aGraphicInBase64;
     const Graphic* pGrf = pBrushItem->GetGraphic();
-    if( pGrf )
+    OUString GraphicURL = pBrushItem->GetGraphicLink();
+    if( mbEmbedImages || GraphicURL.isEmpty())
     {
-        if( !XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64) )
+        if( pGrf )
         {
-            m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
+            if( !XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64) )
+            {
+                m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
+            }
+            Strm().WriteCharPtr( " " OOO_STRING_SVTOOLS_HTML_O_background 
"=\"" );
+            Strm().WriteCharPtr( OOO_STRING_SVTOOLS_HTML_O_data ":" );
+            HTMLOutFuncs::Out_String( Strm(), aGraphicInBase64, m_eDestEnc, 
&m_aNonConvertableCharacters ).WriteChar( '\"' );
         }
-        Strm().WriteCharPtr( " " OOO_STRING_SVTOOLS_HTML_O_background "=\"" );
-        Strm().WriteCharPtr( OOO_STRING_SVTOOLS_HTML_O_data ":" );
-        HTMLOutFuncs::Out_String( Strm(), aGraphicInBase64, m_eDestEnc, 
&m_aNonConvertableCharacters ).WriteChar( '\"' );
+    }
+    else
+    {
+        if( m_bCfgCpyLinkedGrfs )
+        {
+            CopyLocalFileToINet( GraphicURL );
+        }
+        OUString s( URIHelper::simpleNormalizedMakeRelative( GetBaseURL(), 
GraphicURL));
+        Strm().WriteCharPtr(" " OOO_STRING_SVTOOLS_HTML_O_background "=\"" );
+        HTMLOutFuncs::Out_String( Strm(), s, m_eDestEnc, 
&m_aNonConvertableCharacters );
+        Strm().WriteCharPtr("\"");
+
     }
 }
 
diff --git a/sw/source/filter/html/wrthtml.hxx 
b/sw/source/filter/html/wrthtml.hxx
index 09eab5f..70e6be4 100644
--- a/sw/source/filter/html/wrthtml.hxx
+++ b/sw/source/filter/html/wrthtml.hxx
@@ -387,6 +387,7 @@ public:
     bool mbSkipImages : 1;
     /// If HTML header and footer should be written as well, or just the 
content itself.
     bool mbSkipHeaderFooter : 1;
+    bool mbEmbedImages : 1;
 
 #define sCSS2_P_CLASS_leaders "leaders"
     bool m_bCfgPrintLayout : 1;       // PrintLayout option for TOC dot leaders
@@ -433,7 +434,7 @@ public:
 
     void OutAndSetDefList( sal_uInt16 nNewLvl );
 
-    void OutStyleSheet( const SwPageDesc& rPageDesc );
+    void OutStyleSheet( const SwPageDesc& rPageDesc, bool bUsed=true );
 
     inline void OutCSS1_PropertyAscii( const sal_Char *pProp,
                                        const sal_Char *pVal );
@@ -463,7 +464,7 @@ public:
     // Frame-Formats ausgeben und ggf. ein <BR CLEAR=...> vorne an
     // rEndTags anhaengen
     OString OutFrameFormatOptions( const SwFrameFormat& rFrameFormat, const 
OUString& rAltText,
-        sal_uInt32 nFrameOpts );
+        sal_uInt32 nFrameOpts, const OString& rEndTags = OString() );
 
     void writeFrameFormatOptions(HtmlWriter& aHtml, const SwFrameFormat& 
rFrameFormat, const OUString& rAltText, sal_uInt32 nFrameOpts);
 
@@ -643,19 +644,21 @@ Writer& OutHTML_HeaderFooter( Writer& rWrt, const 
SwFrameFormat& rFrameFormat,
                               bool bHeader );
 
 Writer& OutHTML_Image( Writer&, const SwFrameFormat& rFormat,
+                       const OUString& rGraphicURL,
                        Graphic& rGraphic, const OUString& rAlternateText,
                        const Size& rRealSize, sal_uInt32 nFrameOpts,
                        const sal_Char *pMarkType = nullptr,
                        const ImageMap *pGenImgMap = nullptr );
 
 Writer& OutHTML_BulletImage( Writer& rWrt, const sal_Char *pTag,
-                             const SvxBrushItem* pBrush );
+                             const SvxBrushItem* pBrush,
+                             const OUString& rGraphicURL);
 
 Writer& OutHTML_SwFormatField( Writer& rWrt, const SfxPoolItem& rHt );
 Writer& OutHTML_SwFormatFootnote( Writer& rWrt, const SfxPoolItem& rHt );
 Writer& OutHTML_INetFormat( Writer&, const SwFormatINetFormat& rINetFormat, 
bool bOn );
 
-Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet );
+Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet, 
const OUString& rGraphicURL );
 Writer& OutCSS1_ParaTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet );
 
 Writer& OutCSS1_HintSpanTag( Writer& rWrt, const SfxPoolItem& rHt );
diff --git a/sw/source/filter/writer/writer.cxx 
b/sw/source/filter/writer/writer.cxx
index fb22f18..caae537 100644
--- a/sw/source/filter/writer/writer.cxx
+++ b/sw/source/filter/writer/writer.cxx
@@ -63,6 +63,7 @@ struct Writer_Impl
 {
     SvStream * m_pStream;
 
+    std::auto_ptr< std::map<OUString, OUString> > pFileNameMap;
     std::vector<const SvxFontItem*> aFontRemoveLst;
     SwBookmarkNodeTable aBkmkNodePos;
 
@@ -301,6 +302,59 @@ sal_uLong Writer::Write( SwPaM&, const uno::Reference < 
embed::XStorage >&, cons
     return ERR_SWG_WRITE_ERROR;
 }
 
+bool Writer::CopyLocalFileToINet( OUString& rFileNm )
+{
+    if( !pOrigFileName )                // can be happen, by example if we
+        return false;                   // write into the clipboard
+
+    bool bRet = false;
+    INetURLObject aFileUrl( rFileNm ), aTargetUrl( *pOrigFileName );
+
+// this is our old without the Mail-Export
+    if( ! ( INetProtocol::File == aFileUrl.GetProtocol() &&
+            INetProtocol::File != aTargetUrl.GetProtocol() &&
+            INetProtocol::Ftp <= aTargetUrl.GetProtocol() &&
+            INetProtocol::VndSunStarWebdav >= aTargetUrl.GetProtocol() ) )
+        return bRet;
+
+    if (m_pImpl->pFileNameMap.get())
+    {
+        // has the file been moved?
+        std::map<OUString, OUString>::iterator it = 
m_pImpl->pFileNameMap->find( rFileNm );
+        if ( it != m_pImpl->pFileNameMap->end() )
+        {
+            rFileNm = it->second;
+            return true;
+        }
+    }
+    else
+    {
+        m_pImpl->pFileNameMap.reset( new std::map<OUString, OUString>() );
+    }
+
+    OUString aSrc  = rFileNm;
+    OUString aDest = aTargetUrl.GetPartBeforeLastName();
+    aDest += OUString(aFileUrl.GetName());
+
+    SfxMedium aSrcFile( aSrc, StreamMode::READ );
+    SfxMedium aDstFile( aDest, StreamMode::WRITE | StreamMode::SHARE_DENYNONE 
);
+
+    aDstFile.GetOutStream()->WriteStream( *aSrcFile.GetInStream() );
+
+    aSrcFile.Close();
+    aDstFile.Commit();
+
+    bRet = 0 == aDstFile.GetError();
+
+    if( bRet )
+    {
+        m_pImpl->pFileNameMap->insert( std::make_pair( aSrc, aDest ) );
+        rFileNm = aDest;
+    }
+
+    return bRet;
+}
+
 void Writer::PutNumFormatFontsInAttrPool()
 {
     // then there are a few fonts in the NumRules
@@ -337,14 +391,17 @@ void Writer::PutNumFormatFontsInAttrPool()
                 }
 }
 
-void Writer::PutEditEngFontsInAttrPool()
+void Writer::PutEditEngFontsInAttrPool( bool bIncl_CJK_CTL )
 {
     SfxItemPool& rPool = pDoc->GetAttrPool();
     if( rPool.GetSecondaryPool() )
     {
         _AddFontItems( rPool, EE_CHAR_FONTINFO );
-        _AddFontItems( rPool, EE_CHAR_FONTINFO_CJK );
-        _AddFontItems( rPool, EE_CHAR_FONTINFO_CTL );
+        if( bIncl_CJK_CTL )
+        {
+            _AddFontItems( rPool, EE_CHAR_FONTINFO_CJK );
+            _AddFontItems( rPool, EE_CHAR_FONTINFO_CTL );
+        }
     }
 }
 
diff --git a/sw/source/ui/dbui/mmresultdialogs.cxx 
b/sw/source/ui/dbui/mmresultdialogs.cxx
index bb99902..fd8f128 100644
--- a/sw/source/ui/dbui/mmresultdialogs.cxx
+++ b/sw/source/ui/dbui/mmresultdialogs.cxx
@@ -1049,6 +1049,10 @@ IMPL_LINK_TYPED(SwMMResultEmailDialog, 
SendDocumentsHdl_Impl, Button*, pButton,
         aOpt.SetParaFlags( LINEEND_CR );
         aOpt.WriteUserData( sFilterOptions );
     }
+    else if(MM_DOCTYPE_HTML == nDocType)
+    {
+        sFilterOptions = "EmbedImages";
+    }
     OUString sTargetTempURL = URIHelper::SmartRel2Abs(
         INetURLObject(), utl::TempFile::CreateTempName(),
         URIHelper::GetMaybeFileHdl());
@@ -1106,11 +1110,12 @@ IMPL_LINK_TYPED(SwMMResultEmailDialog, 
SendDocumentsHdl_Impl, Button*, pButton,
                     URIHelper::GetMaybeFileHdl()) );
 
         {
-            uno::Sequence< beans::PropertyValue > 
aFilterValues(MM_DOCTYPE_TEXT == nDocType ? 2 : 1);
+            bool withFilterOptions = MM_DOCTYPE_TEXT == nDocType || 
MM_DOCTYPE_HTML == nDocType;
+            uno::Sequence< beans::PropertyValue > 
aFilterValues(withFilterOptions ? 2 : 1);
             beans::PropertyValue* pFilterValues = aFilterValues.getArray();
             pFilterValues[0].Name = "FilterName";
             pFilterValues[0].Value <<= OUString(pSfxFlt->GetFilterName());
-            if(MM_DOCTYPE_TEXT == nDocType)
+            if(withFilterOptions)
             {
                 pFilterValues[1].Name = "FilterOptions";
                 pFilterValues[1].Value <<= sFilterOptions;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to