[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-5.1' - desktop/Library_sofficeapp.mk desktop/qa desktop/source

Henry Castro hcastro at collabora.com
Tue Nov 22 02:09:24 UTC 2016


 desktop/Library_sofficeapp.mk               |    8 +++
 desktop/qa/desktop_lib/test_desktop_lib.cxx |   27 ++++++++++++
 desktop/source/lib/init.cxx                 |   59 ++++++++++++++++++++++++++++
 3 files changed, 93 insertions(+), 1 deletion(-)

New commits:
commit 714c8772de4255108aa9a0739a37ad422522ff7e
Author: Henry Castro <hcastro at collabora.com>
Date:   Sun Nov 20 19:37:25 2016 -0400

    lok: add command values .uno:FontSubset
    
    Conflicts:
    	desktop/Library_sofficeapp.mk
    
    Reviewed-on: https://gerrit.libreoffice.org/31033
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Henry Castro <hcastro at collabora.com>
    
    Conflicts:
    	desktop/CppunitTest_desktop_app.mk
    	desktop/Library_sofficeapp.mk
    
    Change-Id: Id36a98c32f0eb5e88e4e9a714e260a71d7465c05

diff --git a/desktop/Library_sofficeapp.mk b/desktop/Library_sofficeapp.mk
index 4b77bb3..a59ca02 100644
--- a/desktop/Library_sofficeapp.mk
+++ b/desktop/Library_sofficeapp.mk
@@ -23,7 +23,12 @@ $(eval $(call gb_Library_add_libs,sofficeapp,\
     ) \
 ))
 
-$(eval $(call gb_Library_use_external,sofficeapp,boost_headers))
+$(eval $(call gb_Library_use_externals,sofficeapp, \
+    boost_headers \
+    icu_headers \
+    icui18n \
+    icuuc \
+))
 
 $(eval $(call gb_Library_use_custom_headers,sofficeapp,\
 	officecfg/registry \
@@ -54,6 +59,7 @@ $(eval $(call gb_Library_use_libraries,sofficeapp,\
     sb \
     sfx \
     svl \
+    svx \
     svxcore \
     svt \
     tk \
diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx
index 03f3262..d38a6a0 100644
--- a/desktop/qa/desktop_lib/test_desktop_lib.cxx
+++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx
@@ -19,6 +19,7 @@
 #include <com/sun/star/text/TextContentAnchorType.hpp>
 #include <boost/property_tree/json_parser.hpp>
 #include <comphelper/processfactory.hxx>
+#include <rtl/uri.hxx>
 #include <sfx2/objsh.hxx>
 #include <sfx2/lokhelper.hxx>
 #include <test/unoapi_test.hxx>
@@ -103,6 +104,7 @@ public:
     void testRedlineCalc();
     void testPaintPartTile();
     void testWriterCommentInsertCursor();
+    void testGetFontSubset();
 
     CPPUNIT_TEST_SUITE(DesktopLOKTest);
     CPPUNIT_TEST(testGetStyles);
@@ -135,6 +137,7 @@ public:
     CPPUNIT_TEST(testRedlineCalc);
     CPPUNIT_TEST(testPaintPartTile);
     CPPUNIT_TEST(testWriterCommentInsertCursor);
+    CPPUNIT_TEST(testGetFontSubset);
     CPPUNIT_TEST_SUITE_END();
 
     uno::Reference<lang::XComponent> mxComponent;
@@ -1389,6 +1392,30 @@ void DesktopLOKTest::testWriterCommentInsertCursor()
     comphelper::LibreOfficeKit::setActive(false);
 }
 
+void DesktopLOKTest::testGetFontSubset()
+{
+    comphelper::LibreOfficeKit::setActive();
+    LibLODocument_Impl* pDocument = loadDoc("blank_text.odt");
+    OUString aFontName = rtl::Uri::encode(
+        OUString("Liberation Sans"),
+        rtl_UriCharClassRelSegment,
+        rtl_UriEncodeKeepEscapes,
+        RTL_TEXTENCODING_UTF8
+    );
+    OUString aUnoFontSubset(".uno:FontSubset&name=");
+    OString aCommand = OUStringToOString(aUnoFontSubset + aFontName, RTL_TEXTENCODING_UTF8);
+    boost::property_tree::ptree aTree;
+    char* pJSON = pDocument->m_pDocumentClass->getCommandValues(pDocument, aCommand.getStr());
+    std::stringstream aStream(pJSON);
+    boost::property_tree::read_json(aStream, aTree);
+    CPPUNIT_ASSERT( aTree.size() > 0 );
+    CPPUNIT_ASSERT( aTree.get_child("commandName").get_value<std::string>() == ".uno:FontSubset" );
+    boost::property_tree::ptree aValues = aTree.get_child("commandValues");
+    CPPUNIT_ASSERT( aValues.size() > 0 );
+    free(pJSON);
+    comphelper::LibreOfficeKit::setActive(false);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(DesktopLOKTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 3155ef0..bc724a6 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -67,6 +67,7 @@
 #include <svx/dialmgr.hxx>
 #include <svx/dialogs.hrc>
 #include <svx/svxids.hrc>
+#include <svx/ucsubset.hxx>
 #include <vcl/svapp.hxx>
 #include <vcl/svpforlokit.hxx>
 #include <tools/resmgr.hxx>
@@ -77,6 +78,7 @@
 #include <vcl/sysdata.hxx>
 #include <vcl/virdev.hxx>
 #include <vcl/ITiledRenderable.hxx>
+#include <unicode/uchar.h>
 #include <unotools/configmgr.hxx>
 #include <unotools/syslocaleoptions.hxx>
 #include <unotools/mediadescriptor.hxx>
@@ -2056,6 +2058,58 @@ static char* getFonts (const char* pCommand)
     return pJson;
 }
 
+static char* getFontSubset (const OString& aFontName)
+{
+    OUString aFoundFont(::rtl::Uri::decode(OStringToOUString(aFontName, RTL_TEXTENCODING_UTF8), rtl_UriDecodeStrict, RTL_TEXTENCODING_UTF8));
+    SfxObjectShell* pDocSh = SfxObjectShell::Current();
+    const SvxFontListItem* pFonts = static_cast<const SvxFontListItem*>(
+        pDocSh->GetItem(SID_ATTR_CHAR_FONTLIST));
+    const FontList* pList = pFonts ? pFonts->GetFontList() : nullptr;
+
+    boost::property_tree::ptree aTree;
+    aTree.put("commandName", ".uno:FontSubset");
+    boost::property_tree::ptree aValues;
+
+    if ( pList && !aFoundFont.isEmpty() )
+    {
+        sal_uInt16 nFontCount = pList->GetFontNameCount();
+        sal_uInt16 nItFont = 0;
+        for (; nItFont < nFontCount; ++nItFont)
+        {
+            if (aFoundFont.equals(pList->GetFontName(nItFont).GetFamilyName()))
+            {
+                break;
+            }
+        }
+
+        if ( nItFont < nFontCount )
+        {
+            FontCharMapPtr pFontCharMap;
+            auto aDevice(VclPtr<VirtualDevice>::Create(nullptr, Size(1, 1), DeviceFormat::DEFAULT));
+            vcl::Font aFont(pList->GetFontName(nItFont));
+
+            aDevice->SetFont(aFont);
+            aDevice->GetFontCharMap(pFontCharMap);
+            SubsetMap aSubMap(pFontCharMap);
+
+            for(const Subset* pItSub = aSubMap.GetNextSubset(true); pItSub; pItSub = aSubMap.GetNextSubset(false))
+            {
+                boost::property_tree::ptree aChild;
+                aChild.put("", static_cast<int>(ublock_getCode(pItSub->GetRangeMin())));
+                aValues.push_back(std::make_pair("", aChild));
+            }
+        }
+    }
+
+    aTree.add_child("commandValues", aValues);
+    std::stringstream aStream;
+    boost::property_tree::write_json(aStream, aTree);
+    char* pJson = static_cast<char*>(malloc(aStream.str().size() + 1));
+    strcpy(pJson, aStream.str().c_str());
+    pJson[aStream.str().size()] = '\0';
+    return pJson;
+}
+
 static char* getStyles(LibreOfficeKitDocument* pThis, const char* pCommand)
 {
     LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
@@ -2265,6 +2319,7 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo
     OString aCommand(pCommand);
     static const OString aViewRowColumnHeaders(".uno:ViewRowColumnHeaders");
     static const OString aCellCursor(".uno:CellCursor");
+    static const OString aFontSubset(".uno:FontSubset&name=");
 
     if (!strcmp(pCommand, ".uno:CharFontName"))
     {
@@ -2395,6 +2450,10 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo
         strcpy(pMemory, aString.getStr());
         return pMemory;
     }
+    else if (aCommand.startsWith(aFontSubset))
+    {
+        return getFontSubset(OString(pCommand + aFontSubset.getLength()));
+    }
     else
     {
         gImpl->maLastExceptionMsg = "Unknown command, no values returned";


More information about the Libreoffice-commits mailing list