summaryrefslogtreecommitdiff
path: root/include/drawinglayer/primitive2d/borderlineprimitive2d.hxx
blob: cb57e40fbe8a21b5025a1890c9b38742cab20291 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */

#ifndef INCLUDED_DRAWINGLAYER_PRIMITIVE2D_BORDERLINEPRIMITIVE2D_HXX
#define INCLUDED_DRAWINGLAYER_PRIMITIVE2D_BORDERLINEPRIMITIVE2D_HXX

#include <drawinglayer/drawinglayerdllapi.h>

#include <drawinglayer/primitive2d/baseprimitive2d.hxx>
#include <basegfx/color/bcolor.hxx>
#include <basegfx/matrix/b2dhommatrix.hxx>
#include <basegfx/polygon/b2dpolypolygon.hxx>
#include <drawinglayer/attribute/lineattribute.hxx>
#include <drawinglayer/attribute/strokeattribute.hxx>

enum class SvxBorderLineStyle : sal_Int16;

namespace drawinglayer
{
    namespace primitive2d
    {
        /** BorderLine class
        Helper class holding the style definition for a single part of a full BorderLine definition.
        Line extends are for start/end and for Left/Right, seen in vector direction. If
        Left != Right that means the line has a diagonal start/end
        */
        class DRAWINGLAYER_DLLPUBLIC BorderLine
        {
        private:
            // line attribute containing Width, Color and others
            drawinglayer::attribute::LineAttribute  maLineAttribute;

            // line extends
            double              mfStartLeft;
            double              mfStartRight;
            double              mfEndLeft;
            double              mfEndRight;

            // if this is a gap, this is set to true
            bool                mbIsGap;

        public:
            // Constructor for visible BorderLine segments
            BorderLine(
                const drawinglayer::attribute::LineAttribute& rLineAttribute,
                double fStartLeft = 0.0,
                double fStartRight = 0.0,
                double fEndLeft = 0.0,
                double fEndRight = 0.0);

            // Constructor for gap BorderLine segments
            BorderLine(double fWidth);

            ~BorderLine();

            const drawinglayer::attribute::LineAttribute& getLineAttribute() const { return maLineAttribute; }
            double getStartLeft() const { return mfStartLeft; }
            double getStartRight() const { return mfStartRight; }
            double getEndLeft() const { return mfEndLeft; }
            double getEndRight() const { return mfEndRight; }
            bool isGap() const { return mbIsGap; }

            /// helper to get adapted width (maximum)
            double getAdaptedWidth(double fMinWidth) const;

            /// compare operator
            bool operator==(const BorderLine& rBorderLine) const;
        };

        /// helper to try to merge two instances of BorderLinePrimitive2D. If it was possible,
        /// a merged version is in the returned Primitive2DReference. Lots of preconditions
        /// have to be met to allow that, see implementation (and maybe even expand)
        Primitive2DReference DRAWINGLAYER_DLLPUBLIC tryMergeBorderLinePrimitive2D(
            const Primitive2DReference& rCandidateA,
            const Primitive2DReference& rCandidateB);

        /** BorderLinePrimitive2D class

        This is the basic primitive to build frames around objects, e.g. tables.
        It defines a single or double line from Start to End using the LeftWidth,
        Distance and RightWidth definitions.
        The LineStart/End overlap is defined in the BorderLines definitions (see
        class BorderLine above).
        */
        class DRAWINGLAYER_DLLPUBLIC BorderLinePrimitive2D : public BufferedDecompositionPrimitive2D
        {
        private:
            /// the line definition
            basegfx::B2DPoint                               maStart;
            basegfx::B2DPoint                               maEnd;

            /// the single BorderLine style definition(s), one or three mostly used
            std::vector< BorderLine >                       maBorderLines;

            /// common style definitions
            const drawinglayer::attribute::StrokeAttribute  maStrokeAttribute;

            // for view dependent decomposition in the case with existing gaps,
            // remember the smallest allowed concrete gap distance, see get2DDecomposition
            // implementation
            double                                          mfSmallestAllowedDiscreteGapDistance;

            /// create local decomposition
            virtual void create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const override;

            /// helper to find smallest defined gap in maBorderLines
            bool getSmallestGap(double& rfSmallestGap) const;

            /// helper to get the full width taking mfSmallestAllowedDiscreteGapDistance into account
            double getFullWidth() const;

        public:
            /// simplified constructor for BorderLine with single edge
            BorderLinePrimitive2D(
                const basegfx::B2DPoint& rStart,
                const basegfx::B2DPoint& rEnd,
                const std::vector< BorderLine >& rBorderLines,
                const drawinglayer::attribute::StrokeAttribute& rStrokeAttribute);

            /// data read access
            const basegfx::B2DPoint& getStart() const { return maStart; }
            const basegfx::B2DPoint& getEnd() const { return maEnd; }
            const std::vector< BorderLine >& getBorderLines() const { return maBorderLines; }
            const drawinglayer::attribute::StrokeAttribute& getStrokeAttribute() const { return maStrokeAttribute; }

            /// helper to decide if AntiAliasing should be used
            bool isHorizontalOrVertical(const geometry::ViewInformation2D& rViewInformation) const;

            /// compare operator
            virtual bool operator==(const BasePrimitive2D& rPrimitive) const override;

            /// Override standard getDecomposition to be view-dependent here
            virtual void get2DDecomposition(Primitive2DDecompositionVisitor& rVisitor, const geometry::ViewInformation2D& rViewInformation) const override;

            /// provide unique ID
            DeclPrimitive2DIDBlock()
        };
    } // end of namespace primitive2d
} // end of namespace drawinglayer


#endif //INCLUDED_DRAWINGLAYER_PRIMITIVE2D_BORDERLINEPRIMITIVE2D_HXX

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */