[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-4.1' - 18 commits - curl/ExternalProject_curl.mk editeng/source i18npool/qa i18npool/source librelogo/source sc/Library_scfilt.mk sc/source sc/util sw/source unoidl/source vcl/generic vcl/source

Markus Mohrhard markus.mohrhard at googlemail.com
Sun Nov 3 09:51:53 CET 2013


 curl/ExternalProject_curl.mk                               |    4 
 editeng/source/editeng/impedit2.cxx                        |    2 
 editeng/source/editeng/impedit4.cxx                        |    4 
 i18npool/qa/cppunit/test_characterclassification.cxx       |   26 +
 i18npool/source/breakiterator/breakiterator_th.cxx         |    3 
 i18npool/source/characterclassification/cclass_unicode.cxx |   12 
 librelogo/source/LibreLogo/LibreLogo.py                    |   38 ++
 sc/Library_scfilt.mk                                       |    1 
 sc/source/core/data/column.cxx                             |    6 
 sc/source/core/tool/interpr1.cxx                           |    4 
 sc/source/core/tool/interpr2.cxx                           |   14 
 sc/source/filter/excel/xestream.cxx                        |   10 
 sc/source/filter/inc/ooxformulaparser.hxx                  |  110 +++++++
 sc/source/filter/oox/ooxformulaparser.cxx                  |  196 +++++++++++++
 sc/source/filter/oox/sheetdatabuffer.cxx                   |    4 
 sc/source/ui/view/output2.cxx                              |    7 
 sc/util/scfilt.component                                   |    3 
 sw/source/core/layout/wsfrm.cxx                            |   11 
 sw/source/core/text/portxt.cxx                             |    3 
 sw/source/ui/docvw/edtwin.cxx                              |    2 
 unoidl/source/unoidl.cxx                                   |  112 +++++--
 vcl/generic/glyphs/gcach_layout.cxx                        |   26 +
 vcl/source/filter/jpeg/Exif.cxx                            |   55 +++
 vcl/source/filter/jpeg/Exif.hxx                            |    3 
 vcl/source/gdi/sallayout.cxx                               |   21 +
 25 files changed, 600 insertions(+), 77 deletions(-)

New commits:
commit a514f73d9b00185670561ebc73e008f17e7c937a
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sat Nov 2 17:04:34 2013 +0100

    remember column style during XLSX import, fdo#70315
    
    WE overwrote the column style that was set earlier with the default
    style.
    
    Change-Id: I4c02e1cdd3e72f27d75b8153e2af45b5658ff456
    (cherry picked from commit 512a14438c4098ca2e30d0b10b6e18506c8475f1)
    Reviewed-on: https://gerrit.libreoffice.org/6528
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/sc/source/filter/oox/sheetdatabuffer.cxx b/sc/source/filter/oox/sheetdatabuffer.cxx
index 174842a..2b9f4ce 100644
--- a/sc/source/filter/oox/sheetdatabuffer.cxx
+++ b/sc/source/filter/oox/sheetdatabuffer.cxx
@@ -50,6 +50,7 @@
 #include "document.hxx"
 #include "scitems.hxx"
 #include "formulacell.hxx"
+#include "docpool.hxx"
 
 namespace oox {
 namespace xls {
@@ -468,7 +469,8 @@ void SheetDataBuffer::finalizeImport()
         {
             ScAttrEntry aEntry;
             aEntry.nRow = MAXROW;
-            aEntry.pPattern = rDoc.GetDefPattern();
+            aEntry.pPattern = rDoc.GetPattern(nScCol, 0, getSheetIndex());
+            rDoc.GetPool()->Put(*aEntry.pPattern);
             aAttrs.push_back(aEntry);
         }
 
commit 2c0c07d9b30922ac0ca35728932ca4c25ed8916e
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sat Nov 2 20:30:14 2013 +0100

    no default LTR mode does not mean RTL, fdo#68097
    
    Change-Id: Ice4957077e7eda5f7bb93042d6e2ba745935ef8b
    (cherry picked from commit 045e037b7acde9d8e63fbb977c28b167e8815278)
    Reviewed-on: https://gerrit.libreoffice.org/6527
    Tested-by: Eike Rathke <erack at redhat.com>
    Reviewed-by: Eike Rathke <erack at redhat.com>

diff --git a/sc/source/ui/view/output2.cxx b/sc/source/ui/view/output2.cxx
index 8c64393..cf7be64 100644
--- a/sc/source/ui/view/output2.cxx
+++ b/sc/source/ui/view/output2.cxx
@@ -1666,8 +1666,13 @@ void ScOutputData::DrawStrings( sal_Bool bPixelToLogic )
                     {
                         const SfxPoolItem* pItem =  mpDoc->GetAttr( nCellX, nCellY, nTab, ATTR_WRITINGDIR );
                         const SvxFrameDirectionItem* pCurrentWritingMode = (const SvxFrameDirectionItem*) pItem;
-                        if (pCurrentWritingMode->GetValue() == FRMDIR_HORI_LEFT_TOP)
+                        sal_uInt16 aDirection = pCurrentWritingMode->GetValue();
+                        if ( aDirection == FRMDIR_HORI_LEFT_TOP || aDirection == FRMDIR_VERT_TOP_LEFT )
                             eOutHorJust = SVX_HOR_JUSTIFY_LEFT;
+                        else if ( aDirection == FRMDIR_ENVIRONMENT )
+                        {
+                            eOutHorJust = mpDoc->IsLayoutRTL(nTab) ? SVX_HOR_JUSTIFY_RIGHT : SVX_HOR_JUSTIFY_LEFT;
+                        }
                         else
                             eOutHorJust = SVX_HOR_JUSTIFY_RIGHT;
                     }
commit 4adaf2292c77b3ff524524ea75acdc2f0407e308
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Oct 31 10:08:46 2013 +0000

    Resolves: fdo#70358 crash when deleting tables
    
    Change-Id: I87282e363425a1bb6d9ab92e07717f66ee56a6c5
    (cherry picked from commit e8e12b32ae23ee9b1613ef7794b83adbde27e9f8)
    Reviewed-on: https://gerrit.libreoffice.org/6509
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx
index de45f50..007de68 100644
--- a/sw/source/core/layout/wsfrm.cxx
+++ b/sw/source/core/layout/wsfrm.cxx
@@ -2650,8 +2650,15 @@ SwTwips SwLayoutFrm::ShrinkFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo )
         {
             _InvalidateAll();
             InvalidatePage( pPage );
-            const SvxGraphicPosition ePos = GetFmt()->GetBackground().GetGraphicPos();
-            if ( GPOS_NONE != ePos && GPOS_TILED != ePos )
+            bool bCompletePaint = true;
+            const SwFrmFmt* pFmt = GetFmt();
+            if (pFmt)
+            {
+                const SvxGraphicPosition ePos = pFmt->GetBackground().GetGraphicPos();
+                if ( GPOS_NONE == ePos || GPOS_TILED == ePos )
+                    bCompletePaint = false;
+            }
+            if (bCompletePaint)
                 SetCompletePaint();
         }
 
commit 7ae1a289344991472ced55d3ba40373ab94823f5
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Nov 1 13:10:39 2013 +0000

    Resolves: fdo#71106 editing dde function crashes
    
    Change-Id: Id2f4bffb7de7201ddeb8f75daaa2723cc42c59b0
    (cherry picked from commit 3b27470860cfa377dfc0cb940bba204d827434ad)
    Reviewed-on: https://gerrit.libreoffice.org/6520
    Reviewed-by: Kohei Yoshida <libreoffice at kohei.us>
    Tested-by: Kohei Yoshida <libreoffice at kohei.us>

diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index aec003e..7cc59de 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -2124,7 +2124,7 @@ void ScInterpreter::ScDde()
         //! Dde-Links (zusaetzlich) effizienter am Dokument speichern !!!!!
         //      ScDdeLink* pLink = pDok->GetDdeLink( aAppl, aTopic, aItem );
 
-        bool bWasError = ( pMyFormulaCell->GetRawError() != 0 );
+        bool bWasError = ( pMyFormulaCell && pMyFormulaCell->GetRawError() != 0 );
 
         if (!pLink)
         {
@@ -2140,19 +2140,23 @@ void ScInterpreter::ScDde()
                                     //! asynchron auswerten ???
             pLink->TryUpdate();     //  TryUpdate ruft Update nicht mehrfach auf
 
-            // StartListening erst nach dem Update, sonst circular reference
-            pMyFormulaCell->StartListening( *pLink );
+            if (pMyFormulaCell)
+            {
+                // StartListening erst nach dem Update, sonst circular reference
+                pMyFormulaCell->StartListening( *pLink );
+            }
         }
         else
         {
-            pMyFormulaCell->StartListening( *pLink );
+            if (pMyFormulaCell)
+                pMyFormulaCell->StartListening( *pLink );
         }
 
         //  Wenn aus dem Reschedule beim Ausfuehren des Links ein Fehler
         //  (z.B. zirkulaere Referenz) entstanden ist, der vorher nicht da war,
         //  das Fehler-Flag zuruecksetzen:
 
-        if ( pMyFormulaCell->GetRawError() && !bWasError )
+        if ( pMyFormulaCell && pMyFormulaCell->GetRawError() && !bWasError )
             pMyFormulaCell->SetErrCode(0);
 
             //  Wert abfragen
commit e0279f0148b215b6c1020b6fa2cce23313e6063d
Author: Khaled Hosny <khaledhosny at eglug.org>
Date:   Wed Oct 30 09:34:38 2013 +0200

    fdo#70968: Incorrect rendering of Devanagari short 'i' vowel
    
    It seems that some Indic fonts assign 'mark' glyph class to combining
    spacing marks (spacing not non spacing) so my reliance on the glyph
    class to set the IS_DIACRITIC flags broke those fonts. This is a bandaid
    to get around the issue, plus some long rant! (at this rate, I'll be
    writing "The VCL haters handbook" pretty soon).
    
    Change-Id: I3ff892acf746d50182573f94e7e8c3c6f9464ae0
    Reviewed-on: https://gerrit.libreoffice.org/6485
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/generic/glyphs/gcach_layout.cxx b/vcl/generic/glyphs/gcach_layout.cxx
index 848f4cb..c8fbda7 100644
--- a/vcl/generic/glyphs/gcach_layout.cxx
+++ b/vcl/generic/glyphs/gcach_layout.cxx
@@ -475,20 +475,36 @@ bool HbLayoutEngine::layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs)
             if (bInCluster)
                 nGlyphFlags |= GlyphItem::IS_IN_CLUSTER;
 
+            // The whole IS_DIACRITIC concept is a stupid hack that was
+            // introduced ages ago to work around the utter brokenness of the
+            // way justification adjustments are applied (the DXArray fiasco).
+            // Since it is such a stupid hack, there is no sane way to directly
+            // map to concepts of the "outside" world, so we do some rather
+            // ugly hacks:
+            // * If the font has a GDEF table, we check for glyphs with mark
+            //   glyph class which is sensible, except that some fonts
+            //   (fdo#70968) assign mark class to spacing marks (which is wrong
+            //   but usually harmless), so we try to sniff what HarfBuzz thinks
+            //   about this glyph by checking if it gives it a zero advance
+            //   width.
+            // * If the font has no GDEF table, we just check if the glyph has
+            //   zero advance width, but this is stupid and can be wrong. A
+            //   better way would to check the character's Unicode combining
+            //   class, but unfortunately glyph gives combining marks the
+            //   cluster value of its base character, so nCharPos will be
+            //   pointing to the wrong character (but HarfBuzz might change
+            //   this in the future).
             bool bDiacritic = false;
             if (hb_ot_layout_has_glyph_classes(mpHbFace))
             {
                 // the font has GDEF table
-                if (hb_ot_layout_get_glyph_class(mpHbFace, nGlyphIndex) == HB_OT_LAYOUT_GLYPH_CLASS_MARK)
+                bool bMark = hb_ot_layout_get_glyph_class(mpHbFace, nGlyphIndex) == HB_OT_LAYOUT_GLYPH_CLASS_MARK;
+                if (bMark && pHbPositions[i].x_advance == 0)
                     bDiacritic = true;
             }
             else
             {
                 // the font lacks GDEF table
-                // HACK: if the resolved glyph advance is zero assume it is a
-                // combining mark.  The whole IS_DIACRITIC concept is a hack to
-                // fix the other hacks we use to second-guess glyph advances in
-                // ApplyDXArray and the likes and it needs to die
                 if (pHbPositions[i].x_advance == 0)
                     bDiacritic = true;
             }
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index 2340502..6b88e5c 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -1012,6 +1012,27 @@ void GenericSalLayout::AdjustLayout( ImplLayoutArgs& rArgs )
 
 // -----------------------------------------------------------------------
 
+// This DXArray thing is one of the stupidest ideas I have ever seen (I've been
+// told that it probably a one-to-one mapping of some Windows 3.1 API, which is
+// telling). To justify a text string, Writer calls OutputDevice::GetTextArray()
+// to get an array that maps input characters (not glyphs) to their absolute
+// position, GetTextArray() in turn calls SalLayout::FillDXArray() to get an
+// array of character widths that it converts to absolute positions.
+//
+// Writer would then apply justification adjustments to that array of absolute
+// character positions and return to OutputDevice, which eventually calls
+// ApplyDXArray(), which needs to extract the individual adjustments for each
+// character to apply it to corresponding glyphs, and since that information is
+// already lost it tries to do some heuristics to guess it again. Those
+// heuristics often fail, and have always been a source of all sorts of weird
+// text layout bugs, and instead of fixing the broken design a hack after hack
+// have been applied on top of it, making it a complete mess that nobody
+// understands.
+//
+// As you can see by now, this is utterly stupid, why Writer does not just send
+// us directly the advance width transformations it wants to apply to each
+// character instead of this whole mess?
+
 void GenericSalLayout::ApplyDXArray( ImplLayoutArgs& rArgs )
 {
     if( m_GlyphItems.empty())
commit 6d88afd9a1bfc4e59fbb6d7465b30238b03a2674
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Oct 31 15:28:58 2013 +0100

    resolved fdo#70815 broadcast emptied cell in ScColumn::SwapRow()
    
    Change-Id: Ie939f12a54d0b4cf8bedc34683e20fb924f1bf3b
    Reviewed-on: https://gerrit.libreoffice.org/6516
    Tested-by: Kohei Yoshida <libreoffice at kohei.us>
    Reviewed-by: Kohei Yoshida <libreoffice at kohei.us>

diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 800c200..305eeb5 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -901,6 +901,12 @@ void ScColumn::SwapRow(SCROW nRow1, SCROW nRow2)
 
             // insert ColEntry at new position.
             Insert( nRow2, pCell1 );
+
+            // A broadcaster that exists at cell 1 will have no effect in a
+            // subsequent SetDirty(ScRange) that broadcasts only existing cells
+            // so broadcast the change here. fdo#70815
+            // Delete(SCROW) does broadcast for other cases below.
+            pDocument->Broadcast( ScHint( SC_HINT_DATACHANGED, ScAddress( nCol, nRow1, nTab)));
         }
 
         return;
commit b75edeb94d0e434b9759cd2426602187808d7313
Author: Eike Rathke <erack at redhat.com>
Date:   Mon Oct 28 22:46:01 2013 +0100

    resolved fdo#56209 reviving FilterFormulaParser
    
    First it was moved from oox to sc without carrying over the component
    factory bits, then subsequent commits removed the remaining bits in
    steps as it appeared to be unused:
    
    8ada1cd2846e5e60ad63250c68ddea3a9356546f
    887d7945addeb823e0d3f783609c4e79d92ad4a7
    effda59a12cedd3cf200d2e9f5186a623b0855bb
    f2fd2a66ee827024b31a310d67804cb7cb18d2da
    
    (cherry picked from commit 20e0afa76087e20f95247406d265a122263a8c6f)
    
    Backported.
    
    Change-Id: I445b11c95daff6f30b3654936d0f22a113158f97
    Reviewed-on: https://gerrit.libreoffice.org/6469
    Reviewed-by: David Tardon <dtardon at redhat.com>
    Tested-by: David Tardon <dtardon at redhat.com>

diff --git a/sc/Library_scfilt.mk b/sc/Library_scfilt.mk
index 5b383c4..3cc4b1a 100644
--- a/sc/Library_scfilt.mk
+++ b/sc/Library_scfilt.mk
@@ -188,6 +188,7 @@ $(eval $(call gb_Library_add_exception_objects,scfilt,\
 	sc/source/filter/oox/formulabuffer \
 	sc/source/filter/oox/formulaparser \
 	sc/source/filter/oox/numberformatsbuffer \
+	sc/source/filter/oox/ooxformulaparser \
 	sc/source/filter/oox/pagesettings \
 	sc/source/filter/oox/pivotcachebuffer \
 	sc/source/filter/oox/pivotcachefragment \
diff --git a/sc/source/filter/excel/xestream.cxx b/sc/source/filter/excel/xestream.cxx
index bf9c1d8..8421006 100644
--- a/sc/source/filter/excel/xestream.cxx
+++ b/sc/source/filter/excel/xestream.cxx
@@ -1179,6 +1179,11 @@ namespace oox { namespace xls {
     Sequence< OUString > SAL_CALL ExcelFilter_getSupportedServiceNames() throw();
     Reference< XInterface > SAL_CALL ExcelFilter_createInstance(
         const Reference< XComponentContext >& rxContext ) throw( Exception );
+
+    OUString SAL_CALL OOXMLFormulaParser_getImplementationName() throw();
+    Sequence< OUString > SAL_CALL OOXMLFormulaParser_getSupportedServiceNames() throw();
+    Reference< XInterface > SAL_CALL OOXMLFormulaParser_create(
+        const Reference< XComponentContext >& rxContext ) throw();
 } }
 
 #ifdef __cplusplus
@@ -1201,6 +1206,11 @@ extern "C"
         oox::xls::ExcelFilter_getSupportedServiceNames, ::cppu::createSingleComponentFactory,
         0, 0
     },
+    {
+        oox::xls::OOXMLFormulaParser_create, oox::xls::OOXMLFormulaParser_getImplementationName,
+        oox::xls::OOXMLFormulaParser_getSupportedServiceNames, ::cppu::createSingleComponentFactory,
+        0, 0
+    },
     { 0, 0, 0, 0, 0, 0 }
 };
 
diff --git a/sc/source/filter/inc/ooxformulaparser.hxx b/sc/source/filter/inc/ooxformulaparser.hxx
new file mode 100644
index 0000000..e6c5797
--- /dev/null
+++ b/sc/source/filter/inc/ooxformulaparser.hxx
@@ -0,0 +1,110 @@
+/* -*- 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 OOX_XLS_OOXFORMULAPARSER_HXX
+#define OOX_XLS_OOXFORMULAPARSER_HXX
+
+#include <boost/shared_ptr.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/sheet/XFilterFormulaParser.hpp>
+#include <cppuhelper/implbase3.hxx>
+
+namespace oox {
+namespace xls {
+
+class OOXMLFormulaParserImpl;
+
+// ============================================================================
+
+typedef ::cppu::WeakImplHelper3<
+    ::com::sun::star::lang::XServiceInfo,
+    ::com::sun::star::lang::XInitialization,
+    ::com::sun::star::sheet::XFilterFormulaParser > OOXMLFormulaParser_BASE;
+
+/** OOXML formula parser/compiler service for usage in ODF filters. */
+class OOXMLFormulaParser : public OOXMLFormulaParser_BASE
+{
+public:
+    explicit            OOXMLFormulaParser();
+    virtual             ~OOXMLFormulaParser();
+
+    // com.sun.star.lang.XServiceInfo interface -------------------------------
+
+    virtual ::rtl::OUString SAL_CALL
+                        getImplementationName() throw( ::com::sun::star::uno::RuntimeException );
+
+    virtual sal_Bool SAL_CALL
+                        supportsService( const ::rtl::OUString& rService )
+                            throw( ::com::sun::star::uno::RuntimeException );
+
+    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL
+                        getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException );
+
+    // com.sun.star.lang.XInitialization interface ----------------------------
+
+    virtual void SAL_CALL initialize(
+                            const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rArgs )
+                            throw( ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException );
+
+    // com.sun.star.sheet.XFilterFormulaParser interface ----------------------
+
+    virtual ::rtl::OUString SAL_CALL
+                        getSupportedNamespace()
+                            throw( ::com::sun::star::uno::RuntimeException );
+
+    // com.sun.star.sheet.XFormulaParser interface ----------------------------
+
+    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::FormulaToken > SAL_CALL
+                        parseFormula(
+                            const ::rtl::OUString& rFormula,
+                            const ::com::sun::star::table::CellAddress& rReferencePos )
+                        throw( ::com::sun::star::uno::RuntimeException );
+
+    virtual ::rtl::OUString SAL_CALL
+                        printFormula(
+                            const ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::FormulaToken >& rTokens,
+                            const ::com::sun::star::table::CellAddress& rReferencePos )
+                        throw( ::com::sun::star::uno::RuntimeException );
+
+private:
+    typedef ::boost::shared_ptr< OOXMLFormulaParserImpl >   ParserImplRef;
+
+    ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >
+                        mxComponent;
+    ParserImplRef       mxParserImpl;       /// Implementation of import parser.
+};
+
+css::uno::Reference< css::uno::XInterface > SAL_CALL OOXMLFormulaParser_create(
+    css::uno::Reference< css::uno::XComponentContext > const & context);
+
+OUString SAL_CALL OOXMLFormulaParser_getImplementationName();
+
+css::uno::Sequence< OUString > SAL_CALL OOXMLFormulaParser_getSupportedServiceNames();
+
+// ============================================================================
+
+} // namespace xls
+} // namespace oox
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/filter/oox/ooxformulaparser.cxx b/sc/source/filter/oox/ooxformulaparser.cxx
new file mode 100644
index 0000000..9b91c79
--- /dev/null
+++ b/sc/source/filter/oox/ooxformulaparser.cxx
@@ -0,0 +1,196 @@
+/* -*- 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 "ooxformulaparser.hxx"
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include "formulaparser.hxx"
+
+namespace oox {
+namespace xls {
+
+// ============================================================================
+
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::sheet;
+using namespace ::com::sun::star::table;
+using namespace ::com::sun::star::uno;
+
+using ::rtl::OUString;
+
+// ============================================================================
+
+class OOXMLFormulaParserImpl : private FormulaFinalizer
+{
+public:
+    explicit            OOXMLFormulaParserImpl( const Reference< XMultiServiceFactory >& rxModelFactory );
+
+    Sequence< FormulaToken > parseFormula( const OUString& rFormula, const CellAddress& rReferencePos );
+
+protected:
+    virtual const FunctionInfo* resolveBadFuncName( const OUString& rTokenData ) const;
+
+private:
+    ApiParserWrapper    maApiParser;
+};
+
+// ----------------------------------------------------------------------------
+
+OOXMLFormulaParserImpl::OOXMLFormulaParserImpl( const Reference< XMultiServiceFactory >& rxModelFactory ) :
+    FormulaFinalizer( OpCodeProvider( rxModelFactory, FILTER_OOXML, BIFF_UNKNOWN, true ) ),
+    maApiParser( rxModelFactory, *this )
+{
+}
+
+Sequence< FormulaToken > OOXMLFormulaParserImpl::parseFormula( const OUString& rFormula, const CellAddress& rReferencePos )
+{
+    return finalizeTokenArray( maApiParser.parseFormula( rFormula, rReferencePos ) );
+}
+
+const FunctionInfo* OOXMLFormulaParserImpl::resolveBadFuncName( const OUString& rTokenData ) const
+{
+    /*  Try to parse calls to library functions. The format of such a function
+        call is assumed to be
+            "'<path-to-office-install>\Library\<libname>'!<funcname>". */
+
+    // the string has to start with an apostroph (followed by the library URL)
+    if( (rTokenData.getLength() >= 6) && (rTokenData[ 0 ] == '\'') )
+    {
+        // library URL and function name are separated by an exclamation mark
+        sal_Int32 nExclamPos = rTokenData.lastIndexOf( '!' );
+        if( (1 < nExclamPos) && (nExclamPos + 1 < rTokenData.getLength()) && (rTokenData[ nExclamPos - 1 ] == '\'') )
+        {
+            // find the last backslash that separates library path and name
+            sal_Int32 nFileSep = rTokenData.lastIndexOf( '\\', nExclamPos - 2 );
+            if( nFileSep > 1 )
+            {
+                // find preceding backslash that separates the last directory name
+                sal_Int32 nDirSep = rTokenData.lastIndexOf( '\\', nFileSep - 1 );
+                // function library is located in a directory called 'library'
+                if( (nDirSep > 0) && rTokenData.matchIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "\\LIBRARY\\" ), nDirSep ) )
+                {
+                    // try to find a function info for the function name
+                    OUString aFuncName = rTokenData.copy( nExclamPos + 1 ).toAsciiUpperCase();
+                    const FunctionInfo* pFuncInfo = getFuncInfoFromOoxFuncName( aFuncName );
+                    if( pFuncInfo && (pFuncInfo->meFuncLibType != FUNCLIB_UNKNOWN) )
+                    {
+                        // check that the name of the library matches
+                        OUString aLibName = rTokenData.copy( nFileSep + 1, nExclamPos - nFileSep - 2 );
+                        if( pFuncInfo->meFuncLibType == getFuncLibTypeFromLibraryName( aLibName ) )
+                            return pFuncInfo;
+                    }
+                }
+            }
+        }
+    }
+    return 0;
+}
+
+// ============================================================================
+
+Sequence< OUString > OOXMLFormulaParser_getSupportedServiceNames()
+{
+    Sequence< OUString > aServiceNames( 1 );
+    aServiceNames[ 0 ] =  "com.sun.star.sheet.FilterFormulaParser";
+    return aServiceNames;
+}
+
+OUString OOXMLFormulaParser_getImplementationName()
+{
+    return OUString( "com.sun.star.comp.oox.xls.FormulaParser");
+}
+
+Reference< XInterface > OOXMLFormulaParser_create( const Reference< XComponentContext >& )
+{
+    return static_cast< ::cppu::OWeakObject* >( new OOXMLFormulaParser );
+}
+
+// ============================================================================
+
+OOXMLFormulaParser::OOXMLFormulaParser()
+{
+}
+
+OOXMLFormulaParser::~OOXMLFormulaParser()
+{
+}
+
+// com.sun.star.lang.XServiceInfo interface -----------------------------------
+
+OUString SAL_CALL OOXMLFormulaParser::getImplementationName() throw( RuntimeException )
+{
+    return OOXMLFormulaParser_getImplementationName();
+}
+
+sal_Bool SAL_CALL OOXMLFormulaParser::supportsService( const OUString& rService ) throw( RuntimeException )
+{
+    const Sequence< OUString > aServices( OOXMLFormulaParser_getSupportedServiceNames() );
+    const OUString* pArray = aServices.getConstArray();
+    const OUString* pArrayEnd = pArray + aServices.getLength();
+    return ::std::find( pArray, pArrayEnd, rService ) != pArrayEnd;
+}
+
+Sequence< OUString > SAL_CALL OOXMLFormulaParser::getSupportedServiceNames() throw( RuntimeException )
+{
+    return OOXMLFormulaParser_getSupportedServiceNames();
+}
+
+// com.sun.star.lang.XInitialization interface --------------------------------
+
+void SAL_CALL OOXMLFormulaParser::initialize( const Sequence< Any >& rArgs ) throw( Exception, RuntimeException )
+{
+    OSL_ENSURE( rArgs.hasElements(), "OOXMLFormulaParser::initialize - missing arguments" );
+    if( !rArgs.hasElements() )
+        throw RuntimeException();
+    mxComponent.set( rArgs[ 0 ], UNO_QUERY_THROW );
+}
+
+// com.sun.star.sheet.XFilterFormulaParser interface --------------------------
+
+OUString SAL_CALL OOXMLFormulaParser::getSupportedNamespace() throw( RuntimeException )
+{
+    return OUString( "http://schemas.microsoft.com/office/excel/formula");
+}
+
+// com.sun.star.sheet.XFormulaParser interface --------------------------------
+
+Sequence< FormulaToken > SAL_CALL OOXMLFormulaParser::parseFormula(
+        const OUString& rFormula, const CellAddress& rReferencePos ) throw( RuntimeException )
+{
+    if( !mxParserImpl )
+    {
+        Reference< XMultiServiceFactory > xModelFactory( mxComponent, UNO_QUERY_THROW );
+        mxParserImpl.reset( new OOXMLFormulaParserImpl( xModelFactory ) );
+    }
+    return mxParserImpl->parseFormula( rFormula, rReferencePos );
+}
+
+OUString SAL_CALL OOXMLFormulaParser::printFormula(
+        const Sequence< FormulaToken >& /*rTokens*/, const CellAddress& /*rReferencePos*/ ) throw( RuntimeException )
+{
+    // not implemented
+    throw RuntimeException();
+}
+
+// ============================================================================
+
+} // namespace xls
+} // namespace oox
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/util/scfilt.component b/sc/util/scfilt.component
index 13b884b..292fbd4 100644
--- a/sc/util/scfilt.component
+++ b/sc/util/scfilt.component
@@ -26,4 +26,7 @@
     <service name="com.sun.star.document.ImportFilter"/>
     <service name="com.sun.star.document.ExportFilter"/>
   </implementation>
+  <implementation name="com.sun.star.comp.oox.xls.FormulaParser">
+    <service name="com.sun.star.sheet.FilterFormulaParser"/>
+  </implementation>
 </component>
commit 4b895784c3041fb9b8520ca5acc7d482fdc4d324
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Oct 30 13:06:25 2013 +0100

    curl: set the right RPATH too
    
    Change-Id: I409bb44541748ad69b5087243f4ea8142e424fe0
    (cherry picked from commit 07a31ccc02f3553f1be3e8bb5ff67e6e6f7ce016)
    Reviewed-on: https://gerrit.libreoffice.org/6489
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/curl/ExternalProject_curl.mk b/curl/ExternalProject_curl.mk
index 23dce11..142a782 100644
--- a/curl/ExternalProject_curl.mk
+++ b/curl/ExternalProject_curl.mk
@@ -21,7 +21,7 @@ $(eval $(call gb_ExternalProject_register_targets,curl,\
 ifneq ($(OS),WNT)
 
 curl_CPPFLAGS :=
-curl_LDFLAGS :=
+curl_LDFLAGS := $(if $(filter LINUX FREEBSD,$(OS)),"-Wl$(COMMA)-z$(COMMA)origin -Wl$(COMMA)-rpath$(COMMA)\\"\$$\$$ORIGIN:'\'\$$\$$ORIGIN/../ure-link/lib)
 
 ifneq ($(SYSBASE),)
 curl_CPPFLAGS += -I$(SYSBASE)/usr/include
@@ -36,7 +36,7 @@ endif
 $(call gb_ExternalProject_get_state_target,curl,build):
 	$(call gb_ExternalProject_run,build,\
 		CPPFLAGS="$(curl_CPPFLAGS)" \
-		LDFLAGS="$(curl_LDFLAGS)" \
+		LDFLAGS=$(curl_LDFLAGS) \
 		./configure \
 			--with-nss$(if $(filter NO,$(SYSTEM_NSS)),="$(call gb_UnpackedTarball_get_dir,nss)/mozilla/dist/out") \
 			--without-ssl \
commit 003b308d219f6afd779c02268755dedd346a17d7
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Oct 24 10:19:36 2013 +0100

    Resolves: fdo#70571 don't crash when clicking link in toc
    
    when link is in a toc, and Cursor in protected areas is
    disabled, causing the cursor to leap before the toc
    before trying to see what's under the cursor in order
    to jump to it
    
    Change-Id: Iaf348e3621df02628b4d2ac8c1165df7082237ed
    (cherry picked from commit e9ce405103036b2fa0ae26d331a6cfc3465de10b)
    Reviewed-on: https://gerrit.libreoffice.org/6416
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx
index 6e208f0..3dd87c0 100644
--- a/sw/source/ui/docvw/edtwin.cxx
+++ b/sw/source/ui/docvw/edtwin.cxx
@@ -4368,7 +4368,7 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
                             }
                             else
                             {
-                                if ( bExecHyperlinks )
+                                if ( bExecHyperlinks && aCntntAtPos.aFnd.pAttr )
                                     rSh.ClickToINetAttr( *(SwFmtINetFmt*)aCntntAtPos.aFnd.pAttr, nFilter );
                             }
 
commit 2a0076563f2f6b94605055d7abcb810e29be3f48
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Oct 29 10:58:18 2013 +0000

    Resolves: fdo#69510 don't access beyond end of string
    
    Change-Id: Ib5d60159ad75791371a7805ef8e211a4010d7608
    (cherry picked from commit 47690627565bec866ea2de74b5504160479cff74)
    Reviewed-on: https://gerrit.libreoffice.org/6472
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/sw/source/core/text/portxt.cxx b/sw/source/core/text/portxt.cxx
index 7dff0bd..fd04016 100644
--- a/sw/source/core/text/portxt.cxx
+++ b/sw/source/core/text/portxt.cxx
@@ -160,7 +160,8 @@ static sal_Int32 lcl_AddSpace( const SwTxtSizeInfo &rInf, const OUString* pStr,
     if ( bDoNotAddSpace )
         return nCnt;
 
-    for ( ; nPos < nEnd; ++nPos )
+    sal_Int32 nTxtEnd = std::min(nEnd, pStr->getLength());
+    for ( ; nPos < nTxtEnd; ++nPos )
     {
         if( CH_BLANK == (*pStr)[ nPos ] )
             ++nCnt;
commit f6c028bbc82d8a6d9fcd92f0252853de084de550
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Oct 15 10:21:35 2013 +0100

    swap if the host endianness doesn't match the file formats
    
    Change-Id: I0b4c2ba6679c8d2754f2a7cd8b8f693db335e004
    Reviewed-on: https://gerrit.libreoffice.org/6408
    Tested-by: Caolán McNamara <caolanm at redhat.com>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/source/filter/jpeg/Exif.cxx b/vcl/source/filter/jpeg/Exif.cxx
index 3a4b2d3..cf64f9b 100644
--- a/vcl/source/filter/jpeg/Exif.cxx
+++ b/vcl/source/filter/jpeg/Exif.cxx
@@ -156,7 +156,7 @@ bool Exif::processJpeg(SvStream& rStream, bool bSetValue)
     return false;
 }
 
-bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffset, sal_uInt16 aNumberOfTags, bool bSetValue, bool bMoto)
+bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffset, sal_uInt16 aNumberOfTags, bool bSetValue, bool bSwap)
 {
     ExifIFD* ifd = NULL;
 
@@ -164,7 +164,7 @@ bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffs
     {
         ifd = (ExifIFD*) &pExifData[aOffset];
         sal_uInt16 tag = ifd->tag;
-        if (bMoto)
+        if (bSwap)
         {
             tag = OSL_SWAPWORD(ifd->tag);
         }
@@ -177,7 +177,7 @@ bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffs
                 ifd->type = 3;
                 ifd->count = 1;
                 ifd->offset = maOrientation;
-                if (bMoto)
+                if (bSwap)
                 {
                     ifd->tag = OSL_SWAPWORD(ifd->tag);
                     ifd->offset = OSL_SWAPWORD(ifd->offset);
@@ -186,7 +186,7 @@ bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffs
             else
             {
                 sal_uInt32 nIfdOffset = ifd->offset;
-                if (bMoto)
+                if (bSwap)
                     nIfdOffset = OSL_SWAPWORD(ifd->offset);
                 maOrientation = convertToOrientation(nIfdOffset);
             }
@@ -224,37 +224,46 @@ bool Exif::processExif(SvStream& rStream, sal_uInt16 aSectionLength, bool bSetVa
 
     TiffHeader* aTiffHeader = (TiffHeader*) &aExifData[0];
 
-    if(!(
-        (0x4949 == aTiffHeader->byteOrder && 0x2A00 != aTiffHeader->tagAlign ) || // Intel format
-        ( 0x4D4D == aTiffHeader->byteOrder && 0x002A != aTiffHeader->tagAlign ) // Motorola format
-        )
-      )
+    bool bIntel = aTiffHeader->byteOrder == 0x4949;      //big-endian
+    bool bMotorola = aTiffHeader->byteOrder == 0x4D4D;   //little-endian
+
+    if (!bIntel && !bMotorola)
     {
         delete[] aExifData;
         return false;
     }
 
-    bool bMoto = true; // Motorola, big-endian by default
+    bool bSwap = false;
+
+#ifdef OSL_BIGENDIAN
+    if (bIntel)
+        bSwap = true;
+#else
+    if (bMotorola)
+        bSwap = true;
+#endif
 
-    if (aTiffHeader->byteOrder == 0x4949)
+    if (bSwap)
     {
-        bMoto = false; // little-endian
+        aTiffHeader->tagAlign = OSL_SWAPWORD(aTiffHeader->tagAlign);
+        aTiffHeader->offset = OSL_SWAPDWORD(aTiffHeader->offset);
     }
 
-    sal_uInt16 aOffset = 0;
-    aOffset = aTiffHeader->offset;
-    if (bMoto)
+    if (aTiffHeader->tagAlign != 0x002A) // TIFF tag
     {
-        aOffset = OSL_SWAPDWORD(aTiffHeader->offset);
+        delete[] aExifData;
+        return false;
     }
 
+    sal_uInt16 aOffset = aTiffHeader->offset;
+
     sal_uInt16 aNumberOfTags = aExifData[aOffset];
-    if (bMoto)
+    if (bSwap)
     {
         aNumberOfTags = ((aExifData[aOffset] << 8) | aExifData[aOffset+1]);
     }
 
-    processIFD(aExifData, aLength, aOffset+2, aNumberOfTags, bSetValue, bMoto);
+    processIFD(aExifData, aLength, aOffset+2, aNumberOfTags, bSetValue, bSwap);
 
     if (bSetValue)
     {
commit 1e2265022d1fd9f10abb64a6bbbf7db2cbeb9040
Author: Julien Nabet <serval2412 at yahoo.fr>
Date:   Tue Oct 15 07:57:52 2013 +0200

    fdo#57659: fix exif processing
    
    Change-Id: I93bd132b1d536843d4d8627230bfa9ef22cd623b
    Reviewed-on: https://gerrit.libreoffice.org/6245
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>
    Reviewed-on: https://gerrit.libreoffice.org/6407

diff --git a/vcl/source/filter/jpeg/Exif.cxx b/vcl/source/filter/jpeg/Exif.cxx
index f44b54f..3a4b2d3 100644
--- a/vcl/source/filter/jpeg/Exif.cxx
+++ b/vcl/source/filter/jpeg/Exif.cxx
@@ -156,15 +156,20 @@ bool Exif::processJpeg(SvStream& rStream, bool bSetValue)
     return false;
 }
 
-bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffset, sal_uInt16 aNumberOfTags, bool bSetValue)
+bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffset, sal_uInt16 aNumberOfTags, bool bSetValue, bool bMoto)
 {
     ExifIFD* ifd = NULL;
 
     while (aOffset <= aLength - 12 && aNumberOfTags > 0)
     {
         ifd = (ExifIFD*) &pExifData[aOffset];
+        sal_uInt16 tag = ifd->tag;
+        if (bMoto)
+        {
+            tag = OSL_SWAPWORD(ifd->tag);
+        }
 
-        if (ifd->tag == ORIENTATION)
+        if (tag == ORIENTATION)
         {
             if(bSetValue)
             {
@@ -172,10 +177,18 @@ bool Exif::processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffs
                 ifd->type = 3;
                 ifd->count = 1;
                 ifd->offset = maOrientation;
+                if (bMoto)
+                {
+                    ifd->tag = OSL_SWAPWORD(ifd->tag);
+                    ifd->offset = OSL_SWAPWORD(ifd->offset);
+                }
             }
             else
             {
-                maOrientation = convertToOrientation(ifd->offset);
+                sal_uInt32 nIfdOffset = ifd->offset;
+                if (bMoto)
+                    nIfdOffset = OSL_SWAPWORD(ifd->offset);
+                maOrientation = convertToOrientation(nIfdOffset);
             }
         }
 
@@ -211,20 +224,37 @@ bool Exif::processExif(SvStream& rStream, sal_uInt16 aSectionLength, bool bSetVa
 
     TiffHeader* aTiffHeader = (TiffHeader*) &aExifData[0];
 
-    if( 0x4949 != aTiffHeader->byteOrder || 0x002A != aTiffHeader->tagAlign )
+    if(!(
+        (0x4949 == aTiffHeader->byteOrder && 0x2A00 != aTiffHeader->tagAlign ) || // Intel format
+        ( 0x4D4D == aTiffHeader->byteOrder && 0x002A != aTiffHeader->tagAlign ) // Motorola format
+        )
+      )
     {
         delete[] aExifData;
         return false;
     }
 
-    sal_uInt16 aOffset = aTiffHeader->offset;
+    bool bMoto = true; // Motorola, big-endian by default
+
+    if (aTiffHeader->byteOrder == 0x4949)
+    {
+        bMoto = false; // little-endian
+    }
+
+    sal_uInt16 aOffset = 0;
+    aOffset = aTiffHeader->offset;
+    if (bMoto)
+    {
+        aOffset = OSL_SWAPDWORD(aTiffHeader->offset);
+    }
 
     sal_uInt16 aNumberOfTags = aExifData[aOffset];
-    aNumberOfTags = aExifData[aOffset + 1];
-    aNumberOfTags <<= 8;
-    aNumberOfTags += aExifData[aOffset];
+    if (bMoto)
+    {
+        aNumberOfTags = ((aExifData[aOffset] << 8) | aExifData[aOffset+1]);
+    }
 
-    processIFD(aExifData, aLength, aOffset+2, aNumberOfTags, bSetValue);
+    processIFD(aExifData, aLength, aOffset+2, aNumberOfTags, bSetValue, bMoto);
 
     if (bSetValue)
     {
diff --git a/vcl/source/filter/jpeg/Exif.hxx b/vcl/source/filter/jpeg/Exif.hxx
index 490f144..40faa58 100644
--- a/vcl/source/filter/jpeg/Exif.hxx
+++ b/vcl/source/filter/jpeg/Exif.hxx
@@ -20,6 +20,7 @@
 #ifndef _EXIF_HXX
 #define _EXIF_HXX
 
+#include <osl/endian.h>
 #include <vcl/graph.hxx>
 #include <vcl/fltcall.hxx>
 #include <com/sun/star/uno/Sequence.h>
@@ -53,7 +54,7 @@ private:
 
     bool processJpeg(SvStream& rStream, bool bSetValue);
     bool processExif(SvStream& rStream, sal_uInt16 aLength, bool bSetValue);
-    bool processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffset, sal_uInt16 aNumberOfTags, bool bSetValue);
+    bool processIFD(sal_uInt8* pExifData, sal_uInt16 aLength, sal_uInt16 aOffset, sal_uInt16 aNumberOfTags, bool bSetValue, bool bMoto);
 
     struct ExifIFD {
         sal_uInt16 tag;
commit 48067a8101ed32f8ad26e0684883c9470f00e410
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Thu Oct 24 09:48:13 2013 +0200

    fdo#67725 unoidl::AggregatingCursor must wrap modules for aggregation, too
    
    Otherwise cppuhelper::TypeManager::createTypeDescriptionEnumeration, sitting on
    top such an AggregatingCursor, will miss any entities from provider P' in module
    M if any previous provider P contains the same module M.
    
    That happened when climaker generates cli_oootypes.dll, where the enumeration
    missed everything from offapi in top-level module "com" because it had already
    seen udkapi's "com", and only reported the handful of entities under offapi's
    other top-level module "org" (which does not appear in udkapi).
    
    Change-Id: If538391bde22bcc346417b5988cf12023f0d4172
    (cherry picked from commit bdd55e28fc7788c2968daaf87b782f8e6189ee2d)
    Reviewed-on: https://gerrit.libreoffice.org/6415
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/unoidl/source/unoidl.cxx b/unoidl/source/unoidl.cxx
index a9939e4..c55e02b 100644
--- a/unoidl/source/unoidl.cxx
+++ b/unoidl/source/unoidl.cxx
@@ -23,41 +23,101 @@ namespace unoidl {
 
 namespace {
 
+class AggregatingModule: public ModuleEntity {
+public:
+    AggregatingModule(
+        std::vector< rtl::Reference< Provider > > const & providers,
+        OUString const & name):
+        providers_(providers), name_(name)
+    {}
+
+private:
+    virtual ~AggregatingModule() throw () {}
+
+    virtual std::vector< OUString > getMemberNames() const;
+
+    virtual rtl::Reference< MapCursor > createCursor() const;
+
+    std::vector< rtl::Reference< Provider > > providers_;
+    OUString name_;
+};
+
+std::vector< OUString > AggregatingModule::getMemberNames() const {
+    std::set< OUString > names;
+    for (std::vector< rtl::Reference< Provider > >::const_iterator i(
+             providers_.begin());
+         i != providers_.end(); ++i)
+    {
+        rtl::Reference< Entity > ent((*i)->findEntity(name_));
+        if (ent.is() && ent->getSort() == Entity::SORT_MODULE) {
+            std::vector< OUString > ns(
+                static_cast< ModuleEntity * >(ent.get())->getMemberNames());
+            names.insert(ns.begin(), ns.end());
+        }
+    }
+    return std::vector< OUString >(names.begin(), names.end());
+}
+
 class AggregatingCursor: public MapCursor {
 public:
     AggregatingCursor(
-        std::vector< rtl::Reference< MapCursor > > const & cursors):
-        cursors_(cursors), iterator_(cursors_.begin())
-    {}
+        std::vector< rtl::Reference< Provider > > const & providers,
+        OUString const & name):
+        providers_(providers), name_(name), iterator_(providers_.begin())
+    { findCursor(); }
 
 private:
     virtual ~AggregatingCursor() throw () {}
 
-    virtual rtl::Reference< Entity > getNext(rtl::OUString * name);
+    virtual rtl::Reference< Entity > getNext(OUString * name);
 
-    std::vector< rtl::Reference< MapCursor > > cursors_;
-    std::vector< rtl::Reference< MapCursor > >::iterator iterator_;
-    std::set< rtl::OUString > seenMembers;
+    void findCursor();
+
+    std::vector< rtl::Reference< Provider > > providers_;
+    OUString name_;
+    std::vector< rtl::Reference< Provider > >::iterator iterator_;
+    rtl::Reference< MapCursor > cursor_;
+    std::set< OUString > seen_;
 };
 
-rtl::Reference< Entity > AggregatingCursor::getNext(rtl::OUString * name) {
-    for (;;) {
-        if (iterator_ == cursors_.end()) {
-            return rtl::Reference< Entity >();
-        }
-        rtl::OUString n;
-        rtl::Reference< Entity > ent((*iterator_)->getNext(&n));
+rtl::Reference< Entity > AggregatingCursor::getNext(OUString * name) {
+    while (cursor_.is()) {
+        OUString n;
+        rtl::Reference< Entity > ent(cursor_->getNext(&n));
         if (ent.is()) {
-            if (seenMembers.insert(n).second) {
+            if (seen_.insert(n).second) {
                 if (name != 0) {
                     *name = n;
                 }
-                return ent;
+                return ent->getSort() == Entity::SORT_MODULE
+                    ? new AggregatingModule(
+                        providers_, (name_.isEmpty() ? name_ : name_ + ".") + n)
+                    : ent;
             }
         } else {
-            ++iterator_;
+            cursor_.clear();
+            findCursor();
         }
     }
+    return rtl::Reference< Entity >();
+}
+
+void AggregatingCursor::findCursor() {
+    for (; !cursor_.is() && iterator_ != providers_.end(); ++iterator_) {
+        if (name_.isEmpty()) {
+            cursor_ = (*iterator_)->createRootCursor();
+        } else {
+            rtl::Reference< Entity > ent((*iterator_)->findEntity(name_));
+            if (ent.is() && ent->getSort() == Entity::SORT_MODULE) {
+                cursor_ = static_cast< ModuleEntity * >(ent.get())->
+                    createCursor();
+            }
+        }
+    }
+}
+
+rtl::Reference< MapCursor > AggregatingModule::createCursor() const {
+    return new AggregatingCursor(providers_, name_);
 }
 
 }
@@ -139,23 +199,7 @@ rtl::Reference< Entity > Manager::findEntity(rtl::OUString const & name) const {
 rtl::Reference< MapCursor > Manager::createCursor(rtl::OUString const & name)
     const
 {
-    std::vector< rtl::Reference< MapCursor > > curs;
-    for (std::vector< rtl::Reference< Provider > >::const_iterator i(
-             providers_.begin());
-         i != providers_.end(); ++i)
-    {
-        if (name.isEmpty()) {
-            curs.push_back((*i)->createRootCursor());
-        } else {
-            rtl::Reference< Entity > ent((*i)->findEntity(name));
-            if (ent.is() && ent->getSort() == Entity::SORT_MODULE) {
-                curs.push_back(
-                    static_cast< ModuleEntity * >(ent.get())->createCursor());
-            }
-        }
-    }
-    return curs.empty()
-        ? rtl::Reference< MapCursor >() : new AggregatingCursor(curs);
+    return new AggregatingCursor(providers_, name);
 }
 
 Manager::~Manager() throw () {}
commit e45c0ffb0b24f23846ebb977a1c225a901c1cf6b
Author: László Németh <nemeth at numbertext.org>
Date:   Fri Oct 25 11:46:45 2013 +0200

    fdo#70858 librelogo: fix Logo program halt at font settings (Windows)
    
    Change-Id: I3c51ba693caa80c8b530a9eee932a48a125e2eca
    (cherry picked from commit 317d255aa7f1497cdfb929b884066202f721672c)
    Reviewed-on: https://gerrit.libreoffice.org/6431
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/librelogo/source/LibreLogo/LibreLogo.py b/librelogo/source/LibreLogo/LibreLogo.py
index 366c6a1..913ae6b 100644
--- a/librelogo/source/LibreLogo/LibreLogo.py
+++ b/librelogo/source/LibreLogo/LibreLogo.py
@@ -1320,6 +1320,30 @@ def __float__(x): # handle eg. float("10,5cm")
         x = eval(x)
     return float(x)
 
+def fontheight(n = -1):
+    if n != -1:
+        _.fontheight = n
+    else:
+        return _.fontheight
+
+def fontweight(n = -1):
+    if n != -1:
+        _.fontweight = n
+    else:
+        return _.fontweight
+
+def fontfamily(s = -1):
+    if s != -1:
+        _.fontfamily = s
+    else:
+        return _.fontfamily
+
+def fontstyle(n = -1):
+    if n != -1:
+        _.fontstyle = n
+    else:
+        return _.fontstyle
+
 def __loadlang__(lang, a):
     global comp, __colors__
     __colors__[lang] = {}
@@ -1390,13 +1414,13 @@ def __loadlang__(lang, a):
     [r"(?<!:)\b(?:%s)(\s+|$)" % a['FILLCOLOR'], "\n)fillcolor("],
     [r"(?<!:)\b(?:%s)(\s+|$)" % a['FILLSTYLE'], "\n)fillstyle("],
     [r"(?<!:)\b(?:%s)(\s+|$)" % a['FONTCOLOR'], "\n)fontcolor("],
-    [r"(?<!:)\b(?:%s)(\s+|$)" % a['FONTFAMILY'], "\nglobal _\n_.fontfamily="],
-    [r"(?<!:)\b(?:%s)(\s+|$)" % a['FONTHEIGHT'], "\nglobal _\n_.fontheight="],
-    [r"(?<!:)\b(?:%s)(\s+|$)" % a['FONTWEIGHT'], "\nglobal _\n_.fontweight="],
-    [r"(?<!:)\b(?:%s)(\s+|$)" % a['FONTSTYLE'], "\nglobal _\n_.fontstyle="],
+    [r"(?<!:)\b(?:%s)(\s+|$)" % a['FONTFAMILY'], "\n)fontfamily("],
+    [r"(?<!:)\b(?:%s)(\s+|$)" % a['FONTHEIGHT'], "\n)fontheight("],
+    [r"(?<!:)\b(?:%s)(\s+|$)" % a['FONTWEIGHT'], "\n)fontweight("],
+    [r"(?<!:)\b(?:%s)(\s+|$)" % a['FONTSTYLE'], "\n)fontstyle("],
     [r"(?<!:)\b(?:%s)(\s+|$)" % a['PENWIDTH'], "\n)pensize("],
-    [r"(?<!:)\b(?:%s)\b" % a['PENDOWN'], "\nglobal _\n__pen__(1)"],
-    [r"(?<!:)\b(?:%s)\b" % a['PENUP'], "\nglobal _\n__pen__(0)"],
+    [r"(?<!:)\b(?:%s)\b" % a['PENDOWN'], "\n__pen__(1)"],
+    [r"(?<!:)\b(?:%s)\b" % a['PENUP'], "\n__pen__(0)"],
     [r"(?<!:)\b(?:%s)\b" % a['HIDETURTLE'], "\nhideturtle()"],
     [r"(?<!:)\b(?:%s)\b" % a['SHOWTURTLE'], "\nshowturtle()"],
     [r"(?<!:)\b(?:%s)\b\[" % a['POSITION'], "position()["],
commit 22bc730c7de7865efe17b229fe6909fa524f502d
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Mon Oct 28 15:39:20 2013 +0000

    Related: fdo#69641 double iterateCodePoints doesn't make sense to me
    
    This came in with 04212c3015cd4ab118a0aec2bb04bc153a64af41 but
    the bug number of #i86439# appears to be the wrong id. It doesn't
    make sense to me. Rework cclass_Unicode::getStringType to iterate
    safely over the codepoints of the requested range. Perhaps that
    was the reason for the original commit.
    
    Change-Id: Ice4287eb6f9fc6a9705845c0cf995263815de2e7
    (cherry picked from commit 507e627d83dbfb6a35677450a3fc42d10c79a82e)
    
    Related: fdo#69641 check index against length before iterateCodePoints
    
    Change-Id: I71346b12fcfe3e02015038c3c78db574ada873d6
    (cherry picked from commit 08b7af126e546bdbd175023429f544baa9861dba)
    
    Related: fdo#69641 add a regression test
    
    Change-Id: Icf3324a224d02425acd679a286f3c4a0b7e3ed1c
    (cherry picked from commit 9d5b07b9085f97edfff5d4ac474e9711036bb0c4)
    
    lets be super sure in the face of falling between surrogates
    
    Change-Id: I6d8259df3d4f2e73f9236b7c0547f87c89801082
    (cherry picked from commit 8f0ecf253531963144d3d1c9ee5c12a6cda99c4e)
    Reviewed-on: https://gerrit.libreoffice.org/6473
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/i18npool/qa/cppunit/test_characterclassification.cxx b/i18npool/qa/cppunit/test_characterclassification.cxx
index a683c3a..92066c7 100644
--- a/i18npool/qa/cppunit/test_characterclassification.cxx
+++ b/i18npool/qa/cppunit/test_characterclassification.cxx
@@ -27,9 +27,11 @@ public:
     virtual void tearDown();
 
     void testTitleCase();
+    void testStringType();
 
     CPPUNIT_TEST_SUITE(TestCharacterClassification);
     CPPUNIT_TEST(testTitleCase);
+    CPPUNIT_TEST(testStringType);
     CPPUNIT_TEST_SUITE_END();
 private:
     uno::Reference<i18n::XCharacterClassification> m_xCC;
@@ -68,6 +70,30 @@ void TestCharacterClassification::testTitleCase()
     }
 }
 
+//https://bugs.freedesktop.org/show_bug.cgi?id=69641
+void TestCharacterClassification::testStringType()
+{
+    lang::Locale aLocale;
+    aLocale.Language = OUString("en");
+    aLocale.Country = OUString("US");
+
+    {
+        //simple case
+        OUString sTest("Some text");
+        sal_Int32 nResult = m_xCC->getStringType(sTest, 0, sTest.getLength(), aLocale);
+        CPPUNIT_ASSERT_EQUAL(nResult, sal_Int32(230));
+    }
+
+    {
+        //tricky case
+        const sal_Unicode MATHEMATICAL_ITALIC_SMALL_THETA[] = { 0xD835, 0xDF03 };
+        OUString sTest(MATHEMATICAL_ITALIC_SMALL_THETA, SAL_N_ELEMENTS(MATHEMATICAL_ITALIC_SMALL_THETA));
+        sal_Int32 nResult = m_xCC->getStringType(sTest, 0, sTest.getLength(), aLocale);
+        CPPUNIT_ASSERT_EQUAL(nResult, sal_Int32(228));
+    }
+
+}
+
 void TestCharacterClassification::setUp()
 {
     BootstrapFixtureBase::setUp();
diff --git a/i18npool/source/characterclassification/cclass_unicode.cxx b/i18npool/source/characterclassification/cclass_unicode.cxx
index 045de39..a729ca8 100644
--- a/i18npool/source/characterclassification/cclass_unicode.cxx
+++ b/i18npool/source/characterclassification/cclass_unicode.cxx
@@ -132,7 +132,6 @@ cclass_Unicode::getCharType( const OUString& Text, sal_Int32* nPos, sal_Int32 in
     using namespace ::com::sun::star::i18n::KCharacterType;
 
     sal_uInt32 ch = Text.iterateCodePoints(nPos, increment);
-    if (increment > 0) ch = Text.iterateCodePoints(nPos, 0);
     switch ( u_charType(ch) ) {
     // Upper
     case U_UPPERCASE_LETTER :
@@ -204,9 +203,16 @@ sal_Int32 SAL_CALL
 cclass_Unicode::getStringType( const OUString& Text, sal_Int32 nPos, sal_Int32 nCount, const Locale& /*rLocale*/ ) throw(RuntimeException) {
     if ( nPos < 0 || Text.getLength() <= nPos ) return 0;
 
-    sal_Int32 result = getCharType(Text, &nPos, 0);
-    for (sal_Int32 i = 1; i < nCount && nPos < Text.getLength(); i++)
+    sal_Int32 result = 0;
+
+    while (nCount > 0 && nPos < Text.getLength())
+    {
+        sal_Int32 nOrigPos = nPos;
         result |= getCharType(Text, &nPos, 1);
+        sal_Int32 nUtf16Units = nPos - nOrigPos;
+        nCount -= nUtf16Units;
+    }
+
     return result;
 }
 
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 29050bb..a03b13a 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -3467,11 +3467,11 @@ void ScInterpreter::ScNumberValue()
     {
         OUString aTemporary( nDecSep >= 0 ? aInputString.copy( 0, nDecSep ) : aInputString );
         sal_Int32 nIndex = 0;
-        do
+        while (nIndex < aGroupSeparator.getLength())
         {
             sal_uInt32 nChar = aGroupSeparator.iterateCodePoints( &nIndex );
             aTemporary = aTemporary.replaceAll( OUString( &nChar, 1 ), "" );
-        } while ( nIndex < aGroupSeparator.getLength() );
+        }
         if ( nDecSep >= 0 )
             aInputString = aTemporary + aInputString.copy( nDecSep );
         else
commit dea4b762f8aec783f33827a8f29ab732c0d1f5f2
Author: László Németh <nemeth at numbertext.org>
Date:   Mon Oct 28 14:03:46 2013 +0100

    fdo#70951 librelogo: fix parsing problem of functions
    
    (almost cherry picked from commit 850871e04e247262242836180d8a5cf59b2f95ef)
    
    Change-Id: I6cbe99d405cf45c0d7b04f0ad76a555096024f65
    Reviewed-on: https://gerrit.libreoffice.org/6462
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/librelogo/source/LibreLogo/LibreLogo.py b/librelogo/source/LibreLogo/LibreLogo.py
index 5076c7c..366c6a1 100644
--- a/librelogo/source/LibreLogo/LibreLogo.py
+++ b/librelogo/source/LibreLogo/LibreLogo.py
@@ -1516,7 +1516,7 @@ def __compil__(s):
             (?:[^\n]*(?<!\b(%(END)s))\n)* # 0 or more lines (not END)
             [^\n]*\b(?:%(OUTPUT)s)\b[^\n]*\n # line with OUTPUT (functions = procedures with OUTPUT)
             (?:[^\n]*(?<!\b(?:%(END)s))\n)* # 0 or more lines (not END)
-            (?:%(END)s)\b""" % __l12n__(_.lng), s, re.X) ] # final END (XXX multiple names of "END" doesn't supported)
+            [ \t]*\b(?:%(END)s)\b""" % __l12n__(_.lng), s, re.X) ] # final END (XXX multiple names of "END" doesn't supported)
         # add line breaks before procedure calls
         procedures = set(subnames) - set(functions)
         if len(procedures) > 0:
commit 60f1b154e680ba2d2945a9e9c1fddcc535d1b206
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Mon Oct 28 18:03:47 2013 +0100

    Do not access nextCellIndex (nor Text) past the end
    
    At least for Winfried CppunitTest_sd_import_tests aborts with triggering the
    assert in OUString::operator[] at (presumably past-the-end) index 18 from
    
    com::sun::star::i18n::BreakIterator_th::makeIndex (this=0x2b775adf9440,
      Text=..., nStartPos=18) at
      i18npool/source/breakiterator/breakiterator_th.cxx:122
    com::sun::star::i18n::BreakIterator_CTL::previousCharacters
      (this=0x2b775adf9440, Text=..., nStartPos=18,
      rLocale=..., nCharacterIteratorMode=1, nCount=1, nDone=@0x7fff9a84a8fc: 0) at
      i18npool/source/breakiterator/breakiterator_ctl.cxx:62
    com::sun::star::i18n::BreakIteratorImpl::previousCharacters
      (this=0x2b775ae00a98, Text=..., nStartPos=18, rLocale=...,
      nCharacterIteratorMode=1, nCount=1, nDone=@0x7fff9a84a8fc: 0) at
      i18npool/source/breakiterator/breakiteratorImpl.cxx:65
    ServerFontLayout::setNeedFallback (this=0xfba5d0, rArgs=..., nCharPos=17,
      bRightToLeft=false) at vcl/generic/glyphs/gcach_layout.cxx:114
    HbLayoutEngine::layout (this=0xfba670, rLayout=..., rArgs=...) at
      vcl/generic/glyphs/gcach_layout.cxx:437
    ...
    
    and from the preceding if block in BreakIterator_th::makeIndex it indeed looks
    like the invariant is that nextCellIndex need not be larger than cellIndexSize
    which needs not be larger than Text (ake cachedText) getLength().
    
    Change-Id: Ib92a76020b2bb3902c5e58aa2e6c4e679e51b94a
    (cherry picked from commit b2ad9eecf1cda725b1d7fcabd1ebd06895843d20)
    Reviewed-on: https://gerrit.libreoffice.org/6467
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/i18npool/source/breakiterator/breakiterator_th.cxx b/i18npool/source/breakiterator/breakiterator_th.cxx
index b5683d2..74527f6 100644
--- a/i18npool/source/breakiterator/breakiterator_th.cxx
+++ b/i18npool/source/breakiterator/breakiterator_th.cxx
@@ -119,7 +119,8 @@ void SAL_CALL BreakIterator_th::makeIndex(const OUString& Text, sal_Int32 nStart
         // reset nextCell for new Text
         memset(nextCellIndex, 0, cellIndexSize * sizeof(sal_Int32));
     }
-    else if (nextCellIndex[nStartPos] > 0 || ! is_Thai(Text[nStartPos]))
+    else if (nStartPos >= Text.getLength() || nextCellIndex[nStartPos] > 0
+             || !is_Thai(Text[nStartPos]))
         return;
 
     const sal_Unicode* str = cachedText.getStr();
commit 16c945883e4f9ea35ece9bb52fc4fed3774388c6
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Oct 18 15:36:28 2013 +0100

    Related: rhbz#1020712 wrong default font shown in editengine
    
    Only in editengine could we have this fiasco.
    
    There are two ImpEditEngine::GetScriptType's
    
    a) sal_uInt16 ImpEditEngine::GetScriptType(const EditPaM& rPaM, sal_uInt16* pEndPos) const
    this one returns i18n::ScriptType
    
    b) sal_uInt16 ImpEditEngine::GetScriptType(const EditSelection& rSel) const
    this one returns SCRIPTTYPE
    
    Could there be a better way to ensure that mistakes will be made.
    
    Anyway, within variant b, with an empty edit engine
    ImpEditEngine::GetScriptType calls GetI18NScriptTypeOfLanguage but *that*
    returns i18n::ScriptType's not SCRIPTTYPEs but when there is content then a
    SCRIPTTYPE is truly returned.
    
    Change-Id: I3a4a7c8746728e0fdfb25d961004c8339a24c93d
    (cherry picked from commit e63a0d5657c7b9c7431525ba669b3edab0e56af3)
    
    Related: rhbz#1020712 more i18n::ScriptType being compared against SCRIPTTYPE
    
    Change-Id: I5da9114a3fd8330df2b63dc9187323765d305791
    (cherry picked from commit b57ffef61afd61b57087150b1a9245e21079e15b)
    Reviewed-on: https://gerrit.libreoffice.org/6363
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx
index 4bc6d70..c613e8d 100644
--- a/editeng/source/editeng/impedit2.cxx
+++ b/editeng/source/editeng/impedit2.cxx
@@ -1813,7 +1813,7 @@ sal_uInt16 ImpEditEngine::GetScriptType( const EditSelection& rSel ) const
             }
         }
     }
-    return nScriptType ? nScriptType : GetI18NScriptTypeOfLanguage( GetDefaultLanguage() );
+    return nScriptType ? nScriptType : SvtLanguageOptions::GetScriptTypeOfLanguage( GetDefaultLanguage() );
 }
 
 sal_Bool ImpEditEngine::IsScriptChange( const EditPaM& rPaM ) const
diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx
index 39e8156..5e0fa09 100644
--- a/editeng/source/editeng/impedit4.cxx
+++ b/editeng/source/editeng/impedit4.cxx
@@ -2124,7 +2124,7 @@ void ImpEditEngine::ApplyChangedSentence(EditView& rEditView,
                     rEditView.pImpEditView->SetEditSelection( aCurrentOldPosition->Max() );
                 }
 
-                sal_uInt16 nScriptType = GetI18NScriptTypeOfLanguage( aCurrentNewPortion->eLanguage );
+                sal_uInt16 nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( aCurrentNewPortion->eLanguage );
                 sal_uInt16 nLangWhichId = EE_CHAR_LANGUAGE;
                 switch(nScriptType)
                 {
@@ -2171,7 +2171,7 @@ void ImpEditEngine::ApplyChangedSentence(EditView& rEditView,
                 LanguageType eCurLanguage = GetLanguage( aCurrentPaM );
                 if(eCurLanguage != aCurrentNewPortion->eLanguage)
                 {
-                    sal_uInt16 nScriptType = GetI18NScriptTypeOfLanguage( aCurrentNewPortion->eLanguage );
+                    sal_uInt16 nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( aCurrentNewPortion->eLanguage );
                     sal_uInt16 nLangWhichId = EE_CHAR_LANGUAGE;
                     switch(nScriptType)
                     {


More information about the Libreoffice-commits mailing list