diff options
author | Mihai Varga <mihai.varga@collabora.com> | 2015-11-27 16:19:09 +0200 |
---|---|---|
committer | Mihai Varga <mihai.mv13@gmail.com> | 2015-11-30 12:58:01 +0200 |
commit | 24d981998b5859c7601d5c804e0ee70c5fec280f (patch) | |
tree | 68b16ab67d27dc42e77f78fc1685259669bfb6f9 /desktop | |
parent | 88ab9d4aa09a8ce09fa4d03faefa32e57c530746 (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.cxx | 53 |
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); |