LCOV - code coverage report
Current view: top level - libreoffice/svx/inc/svx - framelink.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 16 33 48.5 %
Date: 2012-12-17 Functions: 13 23 56.5 %
Legend: Lines: hit not hit

          Line data    Source code
       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 SVX_FRAMELINK_HXX
      21             : #define SVX_FRAMELINK_HXX
      22             : 
      23             : #include <algorithm>
      24             : #include <sal/types.h>
      25             : #include <tools/gen.hxx>
      26             : #include <tools/color.hxx>
      27             : #include "svx/svxdllapi.h"
      28             : #include <vcl/outdev.hxx>
      29             : #include <editeng/borderline.hxx>
      30             : 
      31             : #include <drawinglayer/primitive2d/baseprimitive2d.hxx>
      32             : 
      33             : class OutputDevice;
      34             : 
      35             : namespace svx {
      36             : namespace frame {
      37             : 
      38             : // ============================================================================
      39             : // Enums
      40             : // ============================================================================
      41             : 
      42             : /** Specifies how the reference points for frame borders are used.
      43             :  */
      44             : enum RefMode
      45             : {
      46             :     /** Frame borders are drawn centered to the reference points. */
      47             :     REFMODE_CENTERED,
      48             : 
      49             :     /** The reference points specify the begin of the frame border width.
      50             : 
      51             :         The result is that horizontal lines are drawn below, and vertical lines
      52             :         are drawn right of the reference points.
      53             :      */
      54             :     REFMODE_BEGIN,
      55             : 
      56             :     /** The reference points specify the end of the frame border width.
      57             : 
      58             :         The result is that horizontal lines are drawn above, and vertical lines
      59             :         are drawn left of the reference points.
      60             :      */
      61             :     REFMODE_END
      62             : };
      63             : 
      64             : // ============================================================================
      65             : // Classes
      66             : // ============================================================================
      67             : 
      68             : /** Contains the widths of primary and secondary line of a frame style.
      69             : 
      70             :     In the following, "frame style" is a complete style of one frame border,
      71             :     i.e. the double line at the left side of the frame. A "line" is always a
      72             :     trivial single line, i.e. the first line of a double frame style.
      73             : 
      74             :     The following states of the members of this struct are valid:
      75             : 
      76             :     mnPrim      mnDist      mnSecn      frame style
      77             :     -------------------------------------------------
      78             :     0           0           0           invisible
      79             :     >0          0           0           single
      80             :     >0          >0          >0          double
      81             : 
      82             :     The behaviour of the member functions for other states is not defined.
      83             : 
      84             :     Per definition the primary line in double frame styles is:
      85             :     -   The top line for horizontal frame borders.
      86             :     -   The left line for vertical frame borders.
      87             :     -   The bottom-left line for top-left to bottom-right diagonal frame borders.
      88             :     -   The top-left line for bottom-left to top-right diagonal frame borders.
      89             : 
      90             :     The following picture shows the upper end of a vertical double frame
      91             :     border.
      92             : 
      93             :         |<---------------- GetWidth() ----------------->|
      94             :         |                                               |
      95             :         |<----- mnPrim ----->||<- mnDist ->||<- mnSecn >|
      96             :         |                    ||            ||           |
      97             :         ######################              #############
      98             :         ######################              #############
      99             :         ######################              #############
     100             :         ######################              #############
     101             :         ######################  |           #############
     102             :         ######################  |           #############
     103             :                                 |
     104             :                                 |<- middle of the frame border
     105             :  */
     106             : class SVX_DLLPUBLIC Style
     107             : {
     108             : public:
     109             :     /** Constructs an invisible frame style. */
     110      358698 :     inline explicit     Style()
     111             :         : meRefMode( REFMODE_CENTERED )
     112      358698 :         , mnType( ::com::sun::star::table::BorderLineStyle::SOLID )
     113      358698 :     { Clear(); }
     114             :     /** Constructs a frame style with passed line widths. */
     115           0 :     inline explicit     Style( double nP, double nD, double nS, editeng::SvxBorderStyle nType ) :
     116           0 :                             meRefMode( REFMODE_CENTERED ), mnType( nType )
     117           0 :                             { Clear(); Set( nP, nD, nS ); }
     118             :     /** Constructs a frame style with passed color and line widths. */
     119           0 :     inline explicit     Style( const Color& rColorPrim, const Color& rColorSecn, const Color& rColorGap, bool bUseGapColor,
     120             :                             double nP, double nD, double nS, editeng::SvxBorderStyle nType ) :
     121           0 :                             meRefMode( REFMODE_CENTERED ), mnType( nType )
     122           0 :                             { Set( rColorPrim, rColorSecn, rColorGap, bUseGapColor, nP, nD, nS ); }
     123             :     /** Constructs a frame style from the passed SvxBorderLine struct. */
     124             :     inline explicit     Style( const editeng::SvxBorderLine& rBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16 ) :
     125             :                             meRefMode( REFMODE_CENTERED ) { Set( rBorder, fScale, nMaxWidth ); }
     126             :     /** Constructs a frame style from the passed SvxBorderLine struct. Clears the style, if pBorder is 0. */
     127             :     inline explicit     Style( const editeng::SvxBorderLine* pBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16 ) :
     128             :                             meRefMode( REFMODE_CENTERED ) { Set( pBorder, fScale, nMaxWidth ); }
     129             : 
     130       10448 :     inline RefMode      GetRefMode() const { return meRefMode; }
     131       10892 :     inline const Color& GetColorPrim() const { return maColorPrim; }
     132       10892 :     inline const Color& GetColorSecn() const { return maColorSecn; }
     133       10892 :     inline const Color& GetColorGap() const { return maColorGap; }
     134       10892 :     inline bool         UseGapColor() const { return mbUseGapColor; }
     135       11356 :     inline double       Prim() const { return mnPrim; }
     136       10892 :     inline double       Dist() const { return mnDist; }
     137       82048 :     inline double       Secn() const { return mnSecn; }
     138       10892 :     inline editeng::SvxBorderStyle Type() const { return mnType; }
     139             : 
     140             :     /** Returns the total width of this frame style. */
     141       55508 :     inline double       GetWidth() const { return mnPrim + mnDist + mnSecn; }
     142             : 
     143             :     /** Sets the frame style to invisible state. */
     144             :     void                Clear();
     145             :     /** Sets the frame style to the passed line widths. */
     146             :     void                Set( double nP, double nD, double nS );
     147             :     /** Sets the frame style to the passed line widths. */
     148             :     void                Set( const Color& rColorPrim, const Color& rColorSecn, const Color& rColorGap, bool bUseGapColor,
     149             :                             double nP, double nD, double nS );
     150             :     /** Sets the frame style to the passed SvxBorderLine struct. */
     151             :     void                Set( const editeng::SvxBorderLine& rBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16 );
     152             :     /** Sets the frame style to the passed SvxBorderLine struct. Clears the style, if pBorder is 0. */
     153             :     void                Set( const editeng::SvxBorderLine* pBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16 );
     154             : 
     155             :     /** Sets a new reference point handling mode, does not modify other settings. */
     156             :     inline void         SetRefMode( RefMode eRefMode ) { meRefMode = eRefMode; }
     157             :     /** Sets a new color, does not modify other settings. */
     158           0 :     inline void         SetColorPrim( const Color& rColor ) { maColorPrim = rColor; }
     159           0 :     inline void         SetColorSecn( const Color& rColor ) { maColorSecn = rColor; }
     160             :     inline void         SetColorGap( bool bUseIt, const Color& rColor ) { maColorGap = rColor; mbUseGapColor = bUseIt; }
     161             :     /** Sets whether to use dotted style for single hair lines. */
     162             :     inline void         SetType( editeng::SvxBorderStyle nType ) { mnType = nType; }
     163             : 
     164             :     /** Mirrors this style (exchanges primary and secondary), if it is a double frame style. */
     165             :     Style&              MirrorSelf();
     166             :     /** Returns this style mirrored, if it is a double frame style, otherwise a simple copy. */
     167             :     Style               Mirror() const;
     168             : 
     169             : private:
     170             :     Color               maColorPrim;
     171             :     Color               maColorSecn;
     172             :     Color               maColorGap;
     173             :     bool                mbUseGapColor;
     174             :     RefMode             meRefMode;  /// Reference point handling for this frame border.
     175             :     double              mnPrim;     /// Width of primary (single, left, or top) line.
     176             :     double              mnDist;     /// Distance between primary and secondary line.
     177             :     double              mnSecn;     /// Width of secondary (right or bottom) line.
     178             :     editeng::SvxBorderStyle      mnType;
     179             : };
     180             : 
     181             : bool operator==( const Style& rL, const Style& rR );
     182             : SVX_DLLPUBLIC bool operator<( const Style& rL, const Style& rR );
     183             : 
     184             : inline bool operator!=( const Style& rL, const Style& rR ) { return !(rL == rR); }
     185             : inline bool operator>( const Style& rL, const Style& rR ) { return rR < rL; }
     186           0 : inline bool operator<=( const Style& rL, const Style& rR ) { return !(rR < rL); }
     187             : inline bool operator>=( const Style& rL, const Style& rR ) { return !(rL < rR); }
     188             : 
     189             : // ----------------------------------------------------------------------------
     190             : 
     191             : /** Extends the Style struct with an angle for diagonal frame borders.
     192             : 
     193             :     The angle is specified in radian (a full circle is equivalent to 2*PI).
     194             :     It is dependent on the context, how the value is interpreted, i.e. it may
     195             :     specify the angle to a horizontal or vertical frame border.
     196             :  */
     197             : class DiagStyle : public Style
     198             : {
     199             : public:
     200             :     /** Constructs an invisible diagonal frame style. */
     201        1776 :     inline explicit     DiagStyle() : mfAngle( 0.0 ) {}
     202             :     /** Constructs a diagonal frame style passed style and angle. */
     203       22752 :     inline explicit     DiagStyle( const Style& rStyle, double fAngle ) :
     204       22752 :                             Style( rStyle ), mfAngle( fAngle ) {}
     205             : 
     206           0 :     inline double       GetAngle() const { return mfAngle; }
     207             : 
     208             :     /** Returns this style mirrored, if it is a double frame style, otherwise a simple copy. */
     209           0 :     inline DiagStyle    Mirror() const { return DiagStyle( Style::Mirror(), mfAngle ); }
     210             : 
     211             : private:
     212             :     double              mfAngle;    /// Angle between this and hor. or vert. border.
     213             : };
     214             : 
     215             : // ============================================================================
     216             : // Various helper functions
     217             : // ============================================================================
     218             : 
     219             : /** Returns the angle between horizontal border of a rectangle and its diagonal.
     220             : 
     221             :     The returned values represents the inner angle between the diagonals and
     222             :     horizontal borders, and is therefore in the range [0,PI/2] (inclusive). The
     223             :     passed sizes may be negative, calculation is done with absolute values.
     224             :  */
     225             : SVX_DLLPUBLIC double GetHorDiagAngle( long nWidth, long nHeight );
     226             : 
     227             : /** Returns the angle between horizontal border of a rectangle and its diagonal.
     228             : 
     229             :     The returned values represents the inner angle between the diagonals and
     230             :     horizontal borders, and is therefore in the range [0,PI/2] (inclusive). The
     231             :     passed rectangle positions may be unordered, they are adjusted internally.
     232             :  */
     233             : inline double GetHorDiagAngle( long nX1, long nX2, long nY1, long nY2 )
     234             : { return GetHorDiagAngle( nX2 - nX1, nY2 - nY1 ); }
     235             : 
     236             : /** Returns the angle between horizontal border of a rectangle and its diagonal.
     237             : 
     238             :     The returned values represents the inner angle between the diagonals and
     239             :     horizontal borders, and is therefore in the range [0,PI/2] (inclusive). The
     240             :     passed rectangle edges may be unordered, they are adjusted internally.
     241             :  */
     242             : inline double GetHorDiagAngle( const Point& rP1, const Point& rP2 )
     243             : { return GetHorDiagAngle( rP2.X() - rP1.X(), rP2.Y() - rP1.Y() ); }
     244             : 
     245             : /** Returns the angle between horizontal border of a rectangle and its diagonal.
     246             : 
     247             :     The returned values represents the inner angle between the diagonals and
     248             :     horizontal borders, and is therefore in the range [0,PI/2] (inclusive).
     249             :  */
     250           0 : inline double GetHorDiagAngle( const Rectangle& rRect )
     251           0 : { return GetHorDiagAngle( rRect.GetWidth(), rRect.GetHeight() ); }
     252             : 
     253             : // ----------------------------------------------------------------------------
     254             : 
     255             : /** Returns the angle between vertical border of a rectangle and its diagonal.
     256             : 
     257             :     The returned values represents the inner angle between the diagonals and
     258             :     vertical borders, and is therefore in the range [0,PI/2] (inclusive). The
     259             :     passed sizes may be negative, calculation is done with absolute values.
     260             :  */
     261           0 : inline double GetVerDiagAngle( long nWidth, long nHeight )
     262           0 : { return GetHorDiagAngle( nHeight, nWidth ); }
     263             : 
     264             : /** Returns the angle between vertical border of a rectangle and its diagonal.
     265             : 
     266             :     The returned values represents the inner angle between the diagonals and
     267             :     vertical borders, and is therefore in the range [0,PI/2] (inclusive). The
     268             :     passed rectangle positions may be unordered, they are adjusted internally.
     269             :  */
     270             : inline double GetVerDiagAngle( long nX1, long nX2, long nY1, long nY2 )
     271             : { return GetVerDiagAngle( nX2 - nX1, nY2 - nY1 ); }
     272             : 
     273             : /** Returns the angle between vertical border of a rectangle and its diagonal.
     274             : 
     275             :     The returned values represents the inner angle between the diagonals and
     276             :     vertical borders, and is therefore in the range [0,PI/2] (inclusive). The
     277             :     passed rectangle edges may be unordered, they are adjusted internally.
     278             :  */
     279             : inline double GetVerDiagAngle( const Point& rP1, const Point& rP2 )
     280             : { return GetVerDiagAngle( rP2.X() - rP1.X(), rP2.Y() - rP1.Y() ); }
     281             : 
     282             : /** Returns the angle between vertical border of a rectangle and its diagonal.
     283             : 
     284             :     The returned values represents the inner angle between the diagonals and
     285             :     vertical borders, and is therefore in the range [0,PI/2] (inclusive).
     286             :  */
     287           0 : inline double GetVerDiagAngle( const Rectangle& rRect )
     288           0 : { return GetVerDiagAngle( rRect.GetWidth(), rRect.GetHeight() ); }
     289             : 
     290             : // ============================================================================
     291             : 
     292             : /** Returns an X coordinate for a diagonal frame border in the specified height.
     293             : 
     294             :     This function is for usage with the top-left end of a top-left to
     295             :     bottom-right diagonal frame border, connected to the left end of a
     296             :     horizontal frame border.
     297             : 
     298             :     The function returns the relative X position (i.e. for a polygon) of the
     299             :     diagonal frame border according to the specified relative Y position. The
     300             :     mentioned positions are relative to the reference point of both frame
     301             :     borders.
     302             : 
     303             :                 +----------------------------------------------------------
     304             :                 |               The horizontal frame border.
     305             :                 |    |
     306             :     - - - - - - |  --+--  <---- Reference point for horizontal and diagonal frame borders.
     307             :       ^         | \  |  \
     308             :      nVerOffs   |  \     \ <--- The diagonal frame border.
     309             :       v         +---\     \------------------------------------------------
     310             :     - - - - - - - - -\- - -X <----- The function calculates the X position of i.e.
     311             :                       \     \       this point (relative from X of reference point).
     312             :                        \     \
     313             :              Primary -->\     \<-- Secondary
     314             : 
     315             :     @param nVerOffs
     316             :         The vertical position of the point to be calculated, relative to the Y
     317             :         coordinate of the reference point.
     318             :     @param nDiagOffs
     319             :         The width offset across the diagonal frame border (0 = middle),
     320             :         regardless of the gradient of the diagonal frame border (always
     321             :         vertical to the direction of the diagonal frame border). This value is
     322             :         not related in any way to the reference point. For details about
     323             :         relative width offsets, see description of class Style.
     324             :     @param fAngle
     325             :         Inner (right) angle between diagonal and horizontal frame border.
     326             :  */
     327             : SVX_DLLPUBLIC long GetTLDiagOffset( long nVerOffs, long nDiagOffs, double fAngle );
     328             : 
     329             : /** Returns an X coordinate for a diagonal frame border in the specified height.
     330             : 
     331             :     This function is for usage with the bottom-left end of a bottom-left to
     332             :     top-right diagonal frame border, connected to the left end of a horizontal
     333             :     frame border.
     334             : 
     335             :     The function returns the relative X position (i.e. for a polygon) of the
     336             :     diagonal frame border according to the specified relative Y position. The
     337             :     mentioned positions are relative to the reference point of both frame
     338             :     borders.
     339             : 
     340             :              Primary -->/     /<--- Secondary
     341             :                        /     /
     342             :                       /     /       The function calculates the X position of i.e.
     343             :     - - - - - - - - -/- - -X <----- this point (relative from X of reference point).
     344             :       ^         +---/     /------------------------------------------------
     345             :      nVerOffs   |  /     / <--- The diagonal frame border.
     346             :       v         | /  |  /
     347             :     - - - - - - |  --+--  <---- Reference point for horizontal and diagonal frame borders.
     348             :                 |    |
     349             :                 |               The horizontal frame border.
     350             :                 +----------------------------------------------------------
     351             : 
     352             :     @param nVerOffs
     353             :         The vertical position of the point to be calculated, relative to the Y
     354             :         coordinate of the reference point.
     355             :     @param nDiagOffs
     356             :         The width offset across the diagonal frame border (0 = middle),
     357             :         regardless of the gradient of the diagonal frame border (always
     358             :         vertical to the direction of the diagonal frame border). This value is
     359             :         not related in any way to the reference point. For details about
     360             :         relative width offsets, see description of class Style.
     361             :     @param fAngle
     362             :         Inner (right) angle between diagonal and horizontal frame border.
     363             :  */
     364             : long GetBLDiagOffset( long nVerOffs, long nDiagOffs, double fAngle );
     365             : 
     366             : /** Returns an X coordinate for a diagonal frame border in the specified height.
     367             : 
     368             :     This function is for usage with the bottom-right end of a top-left to
     369             :     bottom-right diagonal frame border, connected to the right end of a
     370             :     horizontal frame border.
     371             : 
     372             :     @param nVerOffs
     373             :         The vertical position of the point to be calculated, relative to the Y
     374             :         coordinate of the reference point.
     375             :     @param nDiagOffs
     376             :         The width offset across the diagonal frame border (0 = middle),
     377             :         regardless of the gradient of the diagonal frame border (always
     378             :         vertical to the direction of the diagonal frame border). This value is
     379             :         not related in any way to the reference point. For details about
     380             :         relative width offsets, see description of class Style.
     381             :     @param fAngle
     382             :         Inner (left) angle between diagonal and horizontal frame border.
     383             :  */
     384             : long GetBRDiagOffset( long nVerOffs, long nDiagOffs, double fAngle );
     385             : 
     386             : /** Returns an X coordinate for a diagonal frame border in the specified height.
     387             : 
     388             :     This function is for usage with the top-right end of a bottom-left to
     389             :     top-right diagonal frame border, connected to the right end of a horizontal
     390             :     frame border.
     391             : 
     392             :     @param nVerOffs
     393             :         The vertical position of the point to be calculated, relative to the Y
     394             :         coordinate of the reference point.
     395             :     @param nDiagOffs
     396             :         The width offset across the diagonal frame border (0 = middle),
     397             :         regardless of the gradient of the diagonal frame border (always
     398             :         vertical to the direction of the diagonal frame border). This value is
     399             :         not related in any way to the reference point. For details about
     400             :         relative width offsets, see description of class Style.
     401             :     @param fAngle
     402             :         Inner (left) angle between diagonal and horizontal frame border.
     403             :  */
     404             : long GetTRDiagOffset( long nVerOffs, long nDiagOffs, double fAngle );
     405             : 
     406             : // ============================================================================
     407             : 
     408             : /** Checks whether two horizontal frame borders are "connectable".
     409             : 
     410             :     Two borders are "connectable" in terms of this function, if both can be
     411             :     drawn with only one call of a border drawing function. This means, the two
     412             :     frame borders must have equal style and color, and none of the other
     413             :     vertical and diagonal frame borders break the lines of the two borders in
     414             :     any way (i.e. two vertical double frame borders would break the horizonal
     415             :     frame borders). Of course this function can be used for vertical frame
     416             :     borders as well.
     417             : 
     418             :     The follong picture shows the meaning of all passed parameters:
     419             : 
     420             :                       \      rTFromT      /
     421             :                         \       |       /
     422             :                    rTFromTL     |   rTFromTR
     423             :                             \   |   /
     424             :                               \ | /
     425             :     ======== rLBorder =========   ========== rRBorder =======
     426             :                               / | \
     427             :                             /   |   \
     428             :                    rBFromBL     |   rBFromBR
     429             :                         /       |       \
     430             :                       /      rBFromB      \
     431             : 
     432             :     @return
     433             :         True, if rLBorder and rRBorder can be drawn in one step without
     434             :         interruption at their connection point.
     435             :  */
     436             : SVX_DLLPUBLIC bool CheckFrameBorderConnectable(
     437             :     const Style&        rLBorder,       /// Style of the left frame border to connect.
     438             :     const Style&        rRBorder,       /// Style of the right frame border to connect.
     439             : 
     440             :     const Style&        rTFromTL,       /// Diagonal frame border from top-left to connection point.
     441             :     const Style&        rTFromT,        /// Vertical frame border from top to connection point.
     442             :     const Style&        rTFromTR,       /// Horizontal frame border from top-right to connection point.
     443             : 
     444             :     const Style&        rBFromBL,       /// Diagonal frame border from bottom-left to connection point.
     445             :     const Style&        rBFromB,        /// Vertical frame border from bottom to connection point.
     446             :     const Style&        rBFromBR        /// Horizontal frame border from bottom-right to connection point.
     447             : );
     448             : 
     449             : // ============================================================================
     450             : // Drawing functions
     451             : // ============================================================================
     452             : 
     453             : /** Draws a horizontal frame border, regards all connected frame styles.
     454             : 
     455             :     The frame style to draw is passed as parameter rBorder. The function
     456             :     calculates the adjustment in X direction for left and right end of primary
     457             :     and secondary line of the frame border (the style may present a double
     458             :     line). The line ends may differ according to the connected frame styles
     459             :     coming from top, bottom, left, right, and/or diagonal.
     460             : 
     461             :     Thick frame styles are always drawn centered (in width) to the passed
     462             :     reference points. The Y coordinates of both reference points must be equal
     463             :     (the line cannot be drawn slanted).
     464             : 
     465             :     The function preserves all settings of the passed output device.
     466             : 
     467             :     All parameters starting with "rL" refer to the left end of the processed
     468             :     frame border, all parameters starting with "rR" refer to the right end.
     469             :     The following part of the parameter name starting with "From" specifies
     470             :     where the frame border comes from. Example: "rLFromTR" means the frame
     471             :     border coming from top-right, connected to the left end of rBorder (and
     472             :     therefore a diagonal frame border).
     473             : 
     474             :     The follong picture shows the meaning of all passed parameters:
     475             : 
     476             :                  rLFromT      /                   \      rRFromT
     477             :                     |       /                       \       |
     478             :                     |   rLFromTR               rRFromTL     |
     479             :                     |   /                               \   |
     480             :                     | /                                   \ |
     481             :     --- rLFromL ---   ============== rBorder ==============   --- rRFromR ---
     482             :                     | \                                   / |
     483             :                     |   \                               /   |
     484             :                     |   rLFromBR               rRFromBL     |
     485             :                     |       \                       /       |
     486             :                  rLFromB      \                   /      rRFromB
     487             :  */
     488             : SVX_DLLPUBLIC drawinglayer::primitive2d::Primitive2DSequence CreateBorderPrimitives(
     489             :     const Point&        rLPos,          /// Reference point for left end of the processed frame border.
     490             :     const Point&        rRPos,          /// Reference point for right end of the processed frame border.
     491             :     const Style&        rBorder,        /// Style of the processed frame border.
     492             : 
     493             :     const DiagStyle&    rLFromTR,       /// Diagonal frame border from top-right to left end of rBorder.
     494             :     const Style&        rLFromT,        /// Vertical frame border from top to left end of rBorder.
     495             :     const Style&        rLFromL,        /// Horizontal frame border from left to left end of rBorder.
     496             :     const Style&        rLFromB,        /// Vertical frame border from bottom to left end of rBorder.
     497             :     const DiagStyle&    rLFromBR,       /// Diagonal frame border from bottom-right to left end of rBorder.
     498             : 
     499             :     const DiagStyle&    rRFromTL,       /// Diagonal frame border from top-left to right end of rBorder.
     500             :     const Style&        rRFromT,        /// Vertical frame border from top to right end of rBorder.
     501             :     const Style&        rRFromR,        /// Horizontal frame border from right to right end of rBorder.
     502             :     const Style&        rRFromB,        /// Vertical frame border from bottom to right end of rBorder.
     503             :     const DiagStyle&    rRFromBL,       /// Diagonal frame border from bottom-left to right end of rBorder.
     504             : 
     505             :     const Color*        pForceColor = 0,/// If specified, overrides frame border color.
     506             :     const long&         rRotationT = 9000, /// Angle of the top slanted frames in 100th of degree
     507             :     const long&         rRotationB = 9000  /// Angle of the bottom slanted frames in 100th of degree
     508             : );
     509             : 
     510             : SVX_DLLPUBLIC drawinglayer::primitive2d::Primitive2DSequence CreateBorderPrimitives(
     511             :     const Point&        rLPos,          /// Reference point for left end of the processed frame border.
     512             :     const Point&        rRPos,          /// Reference point for right end of the processed frame border.
     513             :     const Style&        rBorder,        /// Style of the processed frame border.
     514             : 
     515             :     const Style&        rLFromT,        /// Vertical frame border from top to left end of rBorder.
     516             :     const Style&        rLFromL,        /// Horizontal frame border from left to left end of rBorder.
     517             :     const Style&        rLFromB,        /// Vertical frame border from bottom to left end of rBorder.
     518             : 
     519             :     const Style&        rRFromT,        /// Vertical frame border from top to right end of rBorder.
     520             :     const Style&        rRFromR,        /// Horizontal frame border from right to right end of rBorder.
     521             :     const Style&        rRFromB,        /// Vertical frame border from bottom to right end of rBorder.
     522             : 
     523             :     const Color*        pForceColor = 0,/// If specified, overrides frame border color.
     524             :     const long&         rRotationT = 9000, /// Angle of the top slanted frame in 100th of degrees
     525             :     const long&         rRotationB = 9000  /// Angle of the bottom slanted frame in 100th of degrees
     526             : );
     527             : 
     528             : SVX_DLLPUBLIC drawinglayer::primitive2d::Primitive2DSequence CreateClippedBorderPrimitives (
     529             :         const Point& rStart, const Point& rEnd, const Style& rBorder,
     530             :         const Rectangle& rClipRect );
     531             : 
     532             : /** Draws a horizontal frame border, regards all connected frame styles.
     533             : 
     534             :     The frame style to draw is passed as parameter rBorder. The function
     535             :     calculates the adjustment in X direction for left and right end of primary
     536             :     and secondary line of the frame border (the style may present a double
     537             :     line). The line ends may differ according to the connected frame styles
     538             :     coming from top, bottom, left, right, and/or diagonal.
     539             : 
     540             :     Thick frame styles are always drawn centered (in width) to the passed
     541             :     reference points. The Y coordinates of both reference points must be equal
     542             :     (the line cannot be drawn slanted).
     543             : 
     544             :     The function preserves all settings of the passed output device.
     545             : 
     546             :     All parameters starting with "rL" refer to the left end of the processed
     547             :     frame border, all parameters starting with "rR" refer to the right end.
     548             :     The following part of the parameter name starting with "From" specifies
     549             :     where the frame border comes from. Example: "rLFromTR" means the frame
     550             :     border coming from top-right, connected to the left end of rBorder (and
     551             :     therefore a diagonal frame border).
     552             : 
     553             :     The follong picture shows the meaning of all passed parameters:
     554             : 
     555             :                  rLFromT      /                   \      rRFromT
     556             :                     |       /                       \       |
     557             :                     |   rLFromTR               rRFromTL     |
     558             :                     |   /                               \   |
     559             :                     | /                                   \ |
     560             :     --- rLFromL ---   ============== rBorder ==============   --- rRFromR ---
     561             :                     | \                                   / |
     562             :                     |   \                               /   |
     563             :                     |   rLFromBR               rRFromBL     |
     564             :                     |       \                       /       |
     565             :                  rLFromB      \                   /      rRFromB
     566             :  */
     567             : SVX_DLLPUBLIC void DrawHorFrameBorder(
     568             :     OutputDevice&       rDev,           /// The output device used to draw the frame border.
     569             : 
     570             :     const Point&        rLPos,          /// Reference point for left end of the processed frame border.
     571             :     const Point&        rRPos,          /// Reference point for right end of the processed frame border.
     572             :     const Style&        rBorder,        /// Style of the processed frame border.
     573             : 
     574             :     const DiagStyle&    rLFromTR,       /// Diagonal frame border from top-right to left end of rBorder.
     575             :     const Style&        rLFromT,        /// Vertical frame border from top to left end of rBorder.
     576             :     const Style&        rLFromL,        /// Horizontal frame border from left to left end of rBorder.
     577             :     const Style&        rLFromB,        /// Vertical frame border from bottom to left end of rBorder.
     578             :     const DiagStyle&    rLFromBR,       /// Diagonal frame border from bottom-right to left end of rBorder.
     579             : 
     580             :     const DiagStyle&    rRFromTL,       /// Diagonal frame border from top-left to right end of rBorder.
     581             :     const Style&        rRFromT,        /// Vertical frame border from top to right end of rBorder.
     582             :     const Style&        rRFromR,        /// Horizontal frame border from right to right end of rBorder.
     583             :     const Style&        rRFromB,        /// Vertical frame border from bottom to right end of rBorder.
     584             :     const DiagStyle&    rRFromBL,       /// Diagonal frame border from bottom-left to right end of rBorder.
     585             : 
     586             :     const Color*        pForceColor = 0 /// If specified, overrides frame border color.
     587             : );
     588             : 
     589             : // ============================================================================
     590             : 
     591             : /** Draws a vertical frame border, regards all connected frame styles.
     592             : 
     593             :     The frame style to draw is passed as parameter rBorder. The function
     594             :     calculates the adjustment in Y direction for top and bottom end of primary
     595             :     and secondary line of the frame border (the style may present a double
     596             :     line). The line ends may differ according to the connected frame styles
     597             :     coming from left, right, top, bottom, and/or diagonal.
     598             : 
     599             :     Thick frame styles are always drawn centered (in width) to the passed
     600             :     reference points. The X coordinates of both reference points must be equal
     601             :     (the line cannot be drawn slanted).
     602             : 
     603             :     The function preserves all settings of the passed output device.
     604             : 
     605             :     All parameters starting with "rT" refer to the top end of the processed
     606             :     frame border, all parameters starting with "rB" refer to the bottom end.
     607             :     The following part of the parameter name starting with "From" specifies
     608             :     where the frame border comes from. Example: "rTFromBL" means the frame
     609             :     border coming from bottom-left, connected to the top end of rBorder (and
     610             :     therefore a diagonal frame border).
     611             : 
     612             :     The follong picture shows the meaning of all passed parameters:
     613             : 
     614             :                     |
     615             :                  rTFromT
     616             :                     |
     617             :                     |
     618             :     --- rTFromL ---   --- rTFromR ---
     619             :                   / # \
     620             :                 /   #   \
     621             :         rTFromBL    #   rTFromBR
     622             :             /       #       \
     623             :           /         #         \
     624             :                     #
     625             :                  rBorder
     626             :                     #
     627             :           \         #         /
     628             :             \       #       /
     629             :         rBFromTL    #   rBFromTR
     630             :                 \   #   /
     631             :                   \ # /
     632             :     --- rBFromL ---   --- rBFromR ---
     633             :                     |
     634             :                     |
     635             :                  rBFromB
     636             :                     |
     637             :  */
     638             : SVX_DLLPUBLIC void DrawVerFrameBorder(
     639             :     OutputDevice&       rDev,           /// The output device used to draw the frame border.
     640             : 
     641             :     const Point&        rTPos,          /// Reference point for top end of the processed frame border.
     642             :     const Point&        rBPos,          /// Reference point for bottom end of the processed frame border.
     643             :     const Style&        rBorder,        /// Style of the processed frame border.
     644             : 
     645             :     const DiagStyle&    rTFromBL,       /// Diagonal frame border from bottom-right to top end of rBorder.
     646             :     const Style&        rTFromL,        /// Horizontal frame border from left to top end of rBorder.
     647             :     const Style&        rTFromT,        /// Vertical frame border from top to top end of rBorder.
     648             :     const Style&        rTFromR,        /// Horizontal frame border from right to top end of rBorder.
     649             :     const DiagStyle&    rTFromBR,       /// Diagonal frame border from bottom-right to top end of rBorder.
     650             : 
     651             :     const DiagStyle&    rBFromTL,       /// Diagonal frame border from top-left to bottom end of rBorder.
     652             :     const Style&        rBFromL,        /// Horizontal frame border from left to bottom end of rBorder.
     653             :     const Style&        rBFromB,        /// Vertical frame border from bottom to bottom end of rBorder.
     654             :     const Style&        rBFromR,        /// Horizontal frame border from right to bottom end of rBorder.
     655             :     const DiagStyle&    rBFromTR,       /// Diagonal frame border from top-right to bottom end of rBorder.
     656             : 
     657             :     const Color*        pForceColor = 0 /// If specified, overrides frame border color.
     658             : );
     659             : 
     660             : // ============================================================================
     661             : 
     662             : /** Draws both diagonal frame borders, regards all connected frame styles.
     663             : 
     664             :     One or both passed diagonal frame styles may be invisible.
     665             : 
     666             :     The function preserves all settings of the passed output device.
     667             :  */
     668             : SVX_DLLPUBLIC void DrawDiagFrameBorders(
     669             :     OutputDevice&       rDev,           /// The output device used to draw the frame border.
     670             : 
     671             :     const Rectangle&    rRect,          /// Rectangle for both diagonal frame borders.
     672             :     const Style&        rTLBR,          /// Style of the processed top-left to bottom-right diagonal frame border.
     673             :     const Style&        rBLTR,          /// Style of the processed bottom-left to top-right diagonal frame border.
     674             : 
     675             :     const Style&        rTLFromB,       /// Vertical frame border from bottom to top-left end of rTLBR.
     676             :     const Style&        rTLFromR,       /// Horizontal frame border from right to top-left end of rTLBR.
     677             :     const Style&        rBRFromT,       /// Vertical frame border from top to bottom-right end of rTLBR.
     678             :     const Style&        rBRFromL,       /// Horizontal frame border from left to bottom-right end of rTLBR.
     679             : 
     680             :     const Style&        rBLFromT,       /// Vertical frame border from top to bottom-left end of rBLTR.
     681             :     const Style&        rBLFromR,       /// Horizontal frame border from right to bottom-left end of rBLTR.
     682             :     const Style&        rTRFromB,       /// Vertical frame border from bottom to top-right end of rBLTR.
     683             :     const Style&        rTRFromL,       /// Horizontal frame border from left to top-right end of rBLTR.
     684             : 
     685             :     const Color*        pForceColor = 0,        /// If specified, overrides frame border color.
     686             :     bool                bDiagDblClip = false    /// true = Use clipping for crossing double frame borders.
     687             : );
     688             : 
     689             : // ============================================================================
     690             : 
     691             : } // namespace frame
     692             : } // namespace svx
     693             : 
     694             : /* Yes, I love ASCII art. :-) -DR- */
     695             : 
     696             : #endif
     697             : 
     698             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10