summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorMihai Varga <mihai.varga@collabora.com>2015-11-27 16:19:09 +0200
committerMihai Varga <mihai.mv13@gmail.com>2015-11-30 12:58:01 +0200
commit24d981998b5859c7601d5c804e0ee70c5fec280f (patch)
tree68b16ab67d27dc42e77f78fc1685259669bfb6f9 /desktop
parent88ab9d4aa09a8ce09fa4d03faefa32e57c530746 (diff)
LOK: renderFont method
Renders the given font in a virtual output device. For now it iterates over a list of fonts until it finds the one that matches the requested font. Change-Id: Ie4ecc3a1441519840d8f4f4a890e92670759b4fc
Diffstat (limited to 'desktop')
-rw-r--r--desktop/source/lib/init.cxx53
1 files changed, 53 insertions, 0 deletions
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 8682ce810cc4..d2f14de1c186 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -364,6 +364,10 @@ static void doc_destroyView(LibreOfficeKitDocument* pThis, int nId);
static void doc_setView(LibreOfficeKitDocument* pThis, int nId);
static int doc_getView(LibreOfficeKitDocument* pThis);
static int doc_getViews(LibreOfficeKitDocument* pThis);
+static unsigned char* doc_renderFont(LibreOfficeKitDocument* pThis,
+ const char *pFontName,
+ int* pFontWidth,
+ int* pFontHeight);
LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XComponent> &xComponent)
: mxComponent(xComponent)
@@ -385,6 +389,7 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone
m_pDocumentClass->setPart = doc_setPart;
m_pDocumentClass->getPartName = doc_getPartName;
m_pDocumentClass->setPartMode = doc_setPartMode;
+ m_pDocumentClass->renderFont = doc_renderFont;
m_pDocumentClass->paintTile = doc_paintTile;
m_pDocumentClass->getTileMode = doc_getTileMode;
m_pDocumentClass->getDocumentSize = doc_getDocumentSize;
@@ -1536,6 +1541,54 @@ static int doc_getViews(LibreOfficeKitDocument* /*pThis*/)
return SfxLokHelper::getViews();
}
+unsigned char* doc_renderFont(LibreOfficeKitDocument* /*pThis*/,
+ const char* pFontName,
+ int* pFontWidth,
+ int* pFontHeight)
+{
+ OString aSearchedFontName(pFontName);
+ SfxObjectShell* pDocSh = SfxObjectShell::Current();
+ const SvxFontListItem* pFonts = static_cast<const SvxFontListItem*>(
+ pDocSh->GetItem(SID_ATTR_CHAR_FONTLIST));
+ const FontList* pList = pFonts ? pFonts->GetFontList() : nullptr;
+
+ if ( pList )
+ {
+ sal_uInt16 nFontCount = pList->GetFontNameCount();
+ for (sal_uInt16 i = 0; i < nFontCount; ++i)
+ {
+ const vcl::FontInfo& rInfo = pList->GetFontName(i);
+ OUString aFontName = rInfo.GetName();
+ if (!aSearchedFontName.equals(aFontName.toUtf8().getStr()))
+ continue;
+
+ VirtualDevice aDevice(nullptr, Size(1, 1), DeviceFormat::DEFAULT);
+ ::Rectangle aRect;
+ vcl::Font aFont(rInfo);
+ aFont.SetSize(Size(0, 25));
+ aDevice.SetFont(aFont);
+ aDevice.GetTextBoundRect(aRect, aFontName);
+ int nFontWidth = aRect.BottomRight().X() + 1;
+ *pFontWidth = nFontWidth;
+ int nFontHeight = aRect.BottomRight().Y() + 1;
+ *pFontHeight = nFontHeight;
+
+ unsigned char* pBuffer = static_cast<unsigned char*>(malloc(4 * nFontWidth * nFontHeight));
+ memset(pBuffer, 0, nFontWidth * nFontHeight * 4);
+ boost::shared_array<sal_uInt8> aBuffer(pBuffer, NoDelete< sal_uInt8 >());
+
+ aDevice.SetBackground(Wallpaper(COL_TRANSPARENT));
+ aDevice.SetOutputSizePixelScaleOffsetAndBuffer(
+ Size(nFontWidth, nFontHeight), Fraction(1.0), Point(),
+ aBuffer, nullptr);
+ aDevice.DrawText(Point(0,0), aFontName);
+
+ return pBuffer;
+ }
+ }
+ return nullptr;
+}
+
static char* lo_getError (LibreOfficeKit *pThis)
{
LibLibreOffice_Impl* pLib = static_cast<LibLibreOffice_Impl*>(pThis);