1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #ifndef INCLUDED_DRAWINGLAYER_PRIMITIVE2D_TEXTLAYOUTDEVICE_HXX
21 #define INCLUDED_DRAWINGLAYER_PRIMITIVE2D_TEXTLAYOUTDEVICE_HXX
22 
23 #include <drawinglayer/drawinglayerdllapi.h>
24 
25 #include <basegfx/range/b2drange.hxx>
26 #include <vector>
27 #include <basegfx/polygon/b2dpolypolygon.hxx>
28 #include <vcl/svapp.hxx>
29 
30 // predefines
31 class VirtualDevice;
32 namespace vcl { class Font; }
33 class GDIMetaFile;
34 namespace tools { class Rectangle; }
35 enum class DrawTextFlags;
36 namespace drawinglayer { namespace attribute {
37     class FontAttribute;
38 }}
39 
40 namespace com::sun::star::lang { struct Locale; }
41 
42 // access to one global impTimedRefDev incarnation in namespace drawinglayer::primitive
43 
44 namespace drawinglayer
45 {
46     namespace primitive2d
47     {
48         /** TextLayouterDevice class
49 
50             This helper class exists to isolate all accesses to VCL
51             text formatting/handling functionality for primitive implementations.
52             When in the future FontHandling may move to an own library independent
53             from VCL, primitives will be prepared.
54          */
55         class DRAWINGLAYER_DLLPUBLIC TextLayouterDevice
56         {
57             /// internally used VirtualDevice
58             SolarMutexGuard                 maSolarGuard;
59             VirtualDevice&                  mrDevice;
60 
61         public:
62             /// constructor/destructor
63             TextLayouterDevice();
64             ~TextLayouterDevice() COVERITY_NOEXCEPT_FALSE;
65 
66             /// tooling methods
67             void setFont(const vcl::Font& rFont);
68             void setFontAttribute(
69                 const attribute::FontAttribute& rFontAttribute,
70                 double fFontScaleX,
71                 double fFontScaleY,
72                 const css::lang::Locale & rLocale);
73 
74             double getTextHeight() const;
75             double getOverlineHeight() const;
76             double getOverlineOffset() const;
77             double getUnderlineHeight() const;
78             double getUnderlineOffset() const;
79             double getStrikeoutOffset() const;
80 
81             double getTextWidth(
82                 const OUString& rText,
83                 sal_uInt32 nIndex,
84                 sal_uInt32 nLength) const;
85 
86             void getTextOutlines(
87                 basegfx::B2DPolyPolygonVector&,
88                 const OUString& rText,
89                 sal_uInt32 nIndex,
90                 sal_uInt32 nLength,
91                 const ::std::vector< double >& rDXArray) const;
92 
93             basegfx::B2DRange getTextBoundRect(
94                 const OUString& rText,
95                 sal_uInt32 nIndex,
96                 sal_uInt32 nLength) const;
97 
98             double getFontAscent() const;
99             double getFontDescent() const;
100 
101             void addTextRectActions(
102                 const tools::Rectangle& rRectangle,
103                 const OUString& rText,
104                 DrawTextFlags nStyle,
105                 GDIMetaFile& rGDIMetaFile) const;
106 
107             ::std::vector< double > getTextArray(
108                 const OUString& rText,
109                 sal_uInt32 nIndex,
110                 sal_uInt32 nLength) const;
111         };
112     } // end of namespace primitive2d
113 } // end of namespace drawinglayer
114 
115 // helper methods for vcl font handling
116 
117 namespace drawinglayer
118 {
119     namespace primitive2d
120     {
121         /** Create a VCL-Font based on the definitions in FontAttribute
122             and the given FontScaling. The FontScaling defines the FontHeight
123             (fFontScaleY) and the FontWidth (fFontScaleX). The combination of
124             both defines FontStretching, where no stretching happens at
125             fFontScaleY == fFontScaleX
126          */
127         vcl::Font DRAWINGLAYER_DLLPUBLIC getVclFontFromFontAttribute(
128             const attribute::FontAttribute& rFontAttribute,
129             double fFontScaleX,
130             double fFontScaleY,
131             double fFontRotation,
132             const css::lang::Locale & rLocale);
133 
134         /** Generate FontAttribute DataSet derived from the given VCL-Font.
135             The FontScaling with fFontScaleY, fFontScaleX relationship (see
136             above) will be set in return parameter o_rSize to allow further
137             processing
138          */
139         attribute::FontAttribute DRAWINGLAYER_DLLPUBLIC getFontAttributeFromVclFont(
140             basegfx::B2DVector& o_rSize,
141             const vcl::Font& rFont,
142             bool bRTL,
143             bool bBiDiStrong);
144 
145     } // end of namespace primitive2d
146 } // end of namespace drawinglayer
147 
148 #endif //_DRAWINGLAYER_TEXTLAYOUTDEVICE_HXX
149 
150 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
151