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 #pragma once
21 
22 #include <drawinglayer/drawinglayerdllapi.h>
23 #include <drawinglayer/primitive2d/Primitive2DContainer.hxx>
24 #include <drawinglayer/primitive2d/textlayoutdevice.hxx>
25 #include <basegfx/matrix/b2dhommatrixtools.hxx>
26 
27 namespace drawinglayer::primitive2d { class TextSimplePortionPrimitive2D; }
28 
29 
30 namespace drawinglayer::primitive2d
31 {
32         enum class BreakupUnit
33         {
34             Character,
35             Word
36         };
37 
38         class DRAWINGLAYER_DLLPUBLIC TextBreakupHelper
39         {
40         private:
41             const TextSimplePortionPrimitive2D&     mrSource;
42             Primitive2DContainer                       mxResult;
43             TextLayouterDevice                      maTextLayouter;
44             basegfx::utils::B2DHomMatrixBufferedOnDemandDecompose maDecTrans;
45 
46             bool                                    mbNoDXArray : 1;
47 
48             /// create a portion from nIndex to nLength and append to rTempResult
49             void breakupPortion(Primitive2DContainer& rTempResult, sal_Int32 nIndex, sal_Int32 nLength, bool bWordLineMode);
50 
51             /// breakup complete primitive
52             void breakup(BreakupUnit aBreakupUnit);
53 
54         protected:
55             /// allow user callback to allow changes to the new TextTransformation. Default
56             /// does nothing. Retval defines if a primitive gets created, e.g. return false
57             /// to suppress creation
58             virtual bool allowChange(sal_uInt32 nCount, basegfx::B2DHomMatrix& rNewTransform, sal_uInt32 nIndex, sal_uInt32 nLength);
59 
60             /// allow read access to evtl. useful local parts
getTextLayouter() const61             const TextLayouterDevice& getTextLayouter() const { return maTextLayouter; }
getSource() const62             const TextSimplePortionPrimitive2D& getSource() const { return mrSource; }
63 
64         public:
65             TextBreakupHelper(const TextSimplePortionPrimitive2D& rSource);
66             virtual ~TextBreakupHelper();
67 
68             /// get result
69             const Primitive2DContainer& getResult(BreakupUnit aBreakupUnit = BreakupUnit::Character) const;
70         };
71 
72 } // end of namespace drawinglayer::primitive2d
73 
74 
75 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
76