From 8d2c21e31220540af83665b5e8ad2d9b66be6b3e Mon Sep 17 00:00:00 2001 From: Marco Cecchetti Date: Sun, 3 Sep 2017 20:29:05 +0200 Subject: lok - support for watermark Extends doc_renderFont in order to generate text of requested size. Change-Id: I0ebd48f8714b7772b764f3aba3e13754869c5117 Reviewed-on: https://gerrit.libreoffice.org/42015 Reviewed-by: Jan Holesovsky Tested-by: Jan Holesovsky --- desktop/source/lib/init.cxx | 49 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 748f409437ff..174649ec6072 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -2881,6 +2881,8 @@ unsigned char* doc_renderFont(LibreOfficeKitDocument* /*pThis*/, pDocSh->GetItem(SID_ATTR_CHAR_FONTLIST)); const FontList* pList = pFonts ? pFonts->GetFontList() : nullptr; + const int nDefaultFontSize = 25; + if ( pList ) { sal_uInt16 nFontCount = pList->GetFontNameCount(); @@ -2899,30 +2901,67 @@ unsigned char* doc_renderFont(LibreOfficeKitDocument* /*pThis*/, nullptr, Size(1, 1), DeviceFormat::DEFAULT)); ::Rectangle aRect; vcl::Font aFont(rFontMetric); - aFont.SetFontSize(Size(0, 25)); + aFont.SetFontSize(Size(0, nDefaultFontSize)); aDevice->SetFont(aFont); aDevice->GetTextBoundRect(aRect, aText); if (aRect.IsEmpty()) break; int nFontWidth = aRect.BottomRight().X() + 1; - *pFontWidth = nFontWidth; int nFontHeight = aRect.BottomRight().Y() + 1; - *pFontHeight = nFontHeight; + if (!(nFontWidth > 0 && nFontHeight > 0)) break; + if (*pFontWidth > 0 && *pFontHeight > 0) + { + double fScaleX = *pFontWidth / static_cast(nFontWidth); + double fScaleY = *pFontHeight / static_cast(nFontHeight); + + double fScale = std::min(fScaleX, fScaleY); + + if (fScale >= 1.0) + { + int nFontSize = fScale * nDefaultFontSize; + aFont.SetFontSize(Size(0, nFontSize)); + aDevice->SetFont(aFont); + } + + aRect = tools::Rectangle(0, 0, *pFontWidth, *pFontHeight); + + nFontWidth = *pFontWidth; + nFontHeight = *pFontHeight; + + } + unsigned char* pBuffer = static_cast(malloc(4 * nFontWidth * nFontHeight)); if (!pBuffer) break; memset(pBuffer, 0, nFontWidth * nFontHeight * 4); - aDevice->SetBackground(Wallpaper(COL_TRANSPARENT)); aDevice->SetOutputSizePixelScaleOffsetAndBuffer( Size(nFontWidth, nFontHeight), Fraction(1.0), Point(), pBuffer); - aDevice->DrawText(Point(0,0), aText); + + if (*pFontWidth > 0 && *pFontHeight > 0) + { + DrawTextFlags nStyle = + DrawTextFlags::Center + | DrawTextFlags::VCenter + | DrawTextFlags::MultiLine + | DrawTextFlags::WordBreakHyphenation;// | DrawTextFlags::WordBreak ; + + aDevice->DrawText(aRect, aText, nStyle); + } + else + { + *pFontWidth = nFontWidth; + *pFontHeight = nFontHeight; + + aDevice->DrawText(Point(0,0), aText); + } + return pBuffer; } -- cgit v1.2.3