summaryrefslogtreecommitdiff
path: root/svx/inc/svx/framelink.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/inc/svx/framelink.hxx')
-rw-r--r--svx/inc/svx/framelink.hxx727
1 files changed, 727 insertions, 0 deletions
diff --git a/svx/inc/svx/framelink.hxx b/svx/inc/svx/framelink.hxx
new file mode 100644
index 000000000000..9d5e2cd3b1c6
--- /dev/null
+++ b/svx/inc/svx/framelink.hxx
@@ -0,0 +1,727 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef SVX_FRAMELINK_HXX
+#define SVX_FRAMELINK_HXX
+
+#include <algorithm>
+#include <sal/types.h>
+#include <tools/gen.hxx>
+#include <tools/color.hxx>
+#include "svx/svxdllapi.h"
+
+class OutputDevice;
+class SvxBorderLine;
+
+namespace svx {
+namespace frame {
+
+// ============================================================================
+// Enums
+// ============================================================================
+
+/** Specifies how the reference points for frame borders are used.
+ */
+enum RefMode
+{
+ /** Frame borders are drawn centered to the reference points. */
+ REFMODE_CENTERED,
+
+ /** The reference points specify the begin of the frame border width.
+
+ The result is that horizontal lines are drawn below, and vertical lines
+ are drawn right of the reference points.
+ */
+ REFMODE_BEGIN,
+
+ /** The reference points specify the end of the frame border width.
+
+ The result is that horizontal lines are drawn above, and vertical lines
+ are drawn left of the reference points.
+ */
+ REFMODE_END
+};
+
+// ============================================================================
+// Classes
+// ============================================================================
+
+/** Contains the widths of primary and secondary line of a frame style.
+
+ In the following, "frame style" is a complete style of one frame border,
+ i.e. the double line at the left side of the frame. A "line" is always a
+ trivial single line, i.e. the first line of a double frame style.
+
+ The following states of the members of this struct are valid:
+
+ mnPrim mnDist mnSecn frame style
+ -------------------------------------------------
+ 0 0 0 invisible
+ >0 0 0 single
+ >0 >0 >0 double
+
+ The behaviour of the member functions for other states is not defined.
+
+ Per definition the primary line in double frame styles is:
+ - The top line for horizontal frame borders.
+ - The left line for vertical frame borders.
+ - The bottom-left line for top-left to bottom-right diagonal frame borders.
+ - The top-left line for bottom-left to top-right diagonal frame borders.
+
+ The following picture shows the upper end of a vertical double frame
+ border.
+
+ |<---------------- GetWidth() ----------------->|
+ | |
+ |<----- mnPrim ----->||<- mnDist ->||<- mnSecn >|
+ | || || |
+ ###################### #############
+ ###################### #############
+ ###################### #############
+ ###################### #############
+ ###################### | #############
+ ###################### | #############
+ |
+ |<- middle of the frame border
+ */
+class SVX_DLLPUBLIC Style
+{
+public:
+ /** Constructs an invisible frame style. */
+ inline explicit Style() : meRefMode( REFMODE_CENTERED ), mnPrim( 0 ), mnDist( 0 ), mnSecn( 0 ), mbDotted( false ) {}
+ /** Constructs a frame style with passed line widths. */
+ inline explicit Style( sal_uInt16 nP, sal_uInt16 nD, sal_uInt16 nS ) :
+ meRefMode( REFMODE_CENTERED ), mbDotted( false )
+ { Set( nP, nD, nS ); }
+ /** Constructs a frame style with passed color and line widths. */
+ inline explicit Style( const Color& rColor, sal_uInt16 nP, sal_uInt16 nD, sal_uInt16 nS ) :
+ meRefMode( REFMODE_CENTERED ), mbDotted( false )
+ { Set( rColor, nP, nD, nS ); }
+ /** Constructs a frame style from the passed SvxBorderLine struct. */
+ inline explicit Style( const SvxBorderLine& rBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16, bool /*bUseDots*/ = false ) :
+ meRefMode( REFMODE_CENTERED ) { Set( rBorder, fScale, nMaxWidth ); }
+ /** Constructs a frame style from the passed SvxBorderLine struct. Clears the style, if pBorder is 0. */
+ inline explicit Style( const SvxBorderLine* pBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16, bool /*bUseDots*/ = false ) :
+ meRefMode( REFMODE_CENTERED ) { Set( pBorder, fScale, nMaxWidth ); }
+
+ inline RefMode GetRefMode() const { return meRefMode; }
+ inline const Color& GetColor() const { return maColor; }
+ inline sal_uInt16 Prim() const { return mnPrim; }
+ inline sal_uInt16 Dist() const { return mnDist; }
+ inline sal_uInt16 Secn() const { return mnSecn; }
+ inline bool Dotted() const { return mbDotted; }
+
+ /** Returns the total width of this frame style. */
+ inline sal_uInt16 GetWidth() const { return mnPrim + mnDist + mnSecn; }
+
+
+ /** Sets the frame style to invisible state. */
+ void Clear();
+ /** Sets the frame style to the passed line widths. */
+ void Set( sal_uInt16 nP, sal_uInt16 nD, sal_uInt16 nS );
+ /** Sets the frame style to the passed line widths. */
+ void Set( const Color& rColor, sal_uInt16 nP, sal_uInt16 nD, sal_uInt16 nS );
+ /** Sets the frame style to the passed SvxBorderLine struct. */
+ void Set( const SvxBorderLine& rBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16, bool /*bUseDots*/ = false );
+ /** Sets the frame style to the passed SvxBorderLine struct. Clears the style, if pBorder is 0. */
+ void Set( const SvxBorderLine* pBorder, double fScale = 1.0, sal_uInt16 nMaxWidth = SAL_MAX_UINT16, bool /*bUseDots*/ = false );
+
+ /** Sets a new reference point handling mode, does not modify other settings. */
+ inline void SetRefMode( RefMode eRefMode ) { meRefMode = eRefMode; }
+ /** Sets a new color, does not modify other settings. */
+ inline void SetColor( const Color& rColor ) { maColor = rColor; }
+ /** Sets whether to use dotted style for single hair lines. */
+ inline void SetDotted( bool bDotted ) { mbDotted = bDotted; }
+
+ /** Scales the style by the specified scaling factor. Ensures that visible lines keep visible. */
+ Style& ScaleSelf( double fScale, sal_uInt16 nMaxWidth = SAL_MAX_UINT16 );
+ /** Returns this style scaled by the specified scaling factor. Ensures that visible lines keep visible. */
+ Style Scale( double fScale, sal_uInt16 nMaxWidth = SAL_MAX_UINT16 ) const;
+
+ /** Mirrors this style (exchanges primary and secondary), if it is a double frame style. */
+ Style& MirrorSelf();
+ /** Returns this style mirrored, if it is a double frame style, otherwise a simple copy. */
+ Style Mirror() const;
+
+private:
+ Color maColor; /// The color of the line(s) of this frame border.
+ RefMode meRefMode; /// Reference point handling for this frame border.
+ sal_uInt16 mnPrim; /// Width of primary (single, left, or top) line.
+ sal_uInt16 mnDist; /// Distance between primary and secondary line.
+ sal_uInt16 mnSecn; /// Width of secondary (right or bottom) line.
+ bool mbDotted; /// true = Draw dotted lines; false = Draw solid lines.
+};
+
+bool operator==( const Style& rL, const Style& rR );
+SVX_DLLPUBLIC bool operator<( const Style& rL, const Style& rR );
+
+inline bool operator!=( const Style& rL, const Style& rR ) { return !(rL == rR); }
+inline bool operator>( const Style& rL, const Style& rR ) { return rR < rL; }
+inline bool operator<=( const Style& rL, const Style& rR ) { return !(rR < rL); }
+inline bool operator>=( const Style& rL, const Style& rR ) { return !(rL < rR); }
+
+// ----------------------------------------------------------------------------
+
+/** Extends the Style struct with an angle for diagonal frame borders.
+
+ The angle is specified in radian (a full circle is equivalent to 2*PI).
+ It is dependent on the context, how the value is interpreted, i.e. it may
+ specify the angle to a horizontal or vertical frame border.
+ */
+class DiagStyle : public Style
+{
+public:
+ /** Constructs an invisible diagonal frame style. */
+ inline explicit DiagStyle() : mfAngle( 0.0 ) {}
+ /** Constructs a diagonal frame style passed style and angle. */
+ inline explicit DiagStyle( const Style& rStyle, double fAngle ) :
+ Style( rStyle ), mfAngle( fAngle ) {}
+
+ inline double GetAngle() const { return mfAngle; }
+
+ /** Returns this style mirrored, if it is a double frame style, otherwise a simple copy. */
+ inline DiagStyle Mirror() const { return DiagStyle( Style::Mirror(), mfAngle ); }
+
+private:
+ double mfAngle; /// Angle between this and hor. or vert. border.
+};
+
+// ============================================================================
+// Various helper functions
+// ============================================================================
+
+/** Returns the angle between horizontal border of a rectangle and its diagonal.
+
+ The returned values represents the inner angle between the diagonals and
+ horizontal borders, and is therefore in the range [0,PI/2] (inclusive). The
+ passed sizes may be negative, calculation is done with absolute values.
+ */
+SVX_DLLPUBLIC double GetHorDiagAngle( long nWidth, long nHeight );
+
+/** Returns the angle between horizontal border of a rectangle and its diagonal.
+
+ The returned values represents the inner angle between the diagonals and
+ horizontal borders, and is therefore in the range [0,PI/2] (inclusive). The
+ passed rectangle positions may be unordered, they are adjusted internally.
+ */
+inline double GetHorDiagAngle( long nX1, long nX2, long nY1, long nY2 )
+{ return GetHorDiagAngle( nX2 - nX1, nY2 - nY1 ); }
+
+/** Returns the angle between horizontal border of a rectangle and its diagonal.
+
+ The returned values represents the inner angle between the diagonals and
+ horizontal borders, and is therefore in the range [0,PI/2] (inclusive). The
+ passed rectangle edges may be unordered, they are adjusted internally.
+ */
+inline double GetHorDiagAngle( const Point& rP1, const Point& rP2 )
+{ return GetHorDiagAngle( rP2.X() - rP1.X(), rP2.Y() - rP1.Y() ); }
+
+/** Returns the angle between horizontal border of a rectangle and its diagonal.
+
+ The returned values represents the inner angle between the diagonals and
+ horizontal borders, and is therefore in the range [0,PI/2] (inclusive).
+ */
+inline double GetHorDiagAngle( const Rectangle& rRect )
+{ return GetHorDiagAngle( rRect.GetWidth(), rRect.GetHeight() ); }
+
+// ----------------------------------------------------------------------------
+
+/** Returns the angle between vertical border of a rectangle and its diagonal.
+
+ The returned values represents the inner angle between the diagonals and
+ vertical borders, and is therefore in the range [0,PI/2] (inclusive). The
+ passed sizes may be negative, calculation is done with absolute values.
+ */
+inline double GetVerDiagAngle( long nWidth, long nHeight )
+{ return GetHorDiagAngle( nHeight, nWidth ); }
+
+/** Returns the angle between vertical border of a rectangle and its diagonal.
+
+ The returned values represents the inner angle between the diagonals and
+ vertical borders, and is therefore in the range [0,PI/2] (inclusive). The
+ passed rectangle positions may be unordered, they are adjusted internally.
+ */
+inline double GetVerDiagAngle( long nX1, long nX2, long nY1, long nY2 )
+{ return GetVerDiagAngle( nX2 - nX1, nY2 - nY1 ); }
+
+/** Returns the angle between vertical border of a rectangle and its diagonal.
+
+ The returned values represents the inner angle between the diagonals and
+ vertical borders, and is therefore in the range [0,PI/2] (inclusive). The
+ passed rectangle edges may be unordered, they are adjusted internally.
+ */
+inline double GetVerDiagAngle( const Point& rP1, const Point& rP2 )
+{ return GetVerDiagAngle( rP2.X() - rP1.X(), rP2.Y() - rP1.Y() ); }
+
+/** Returns the angle between vertical border of a rectangle and its diagonal.
+
+ The returned values represents the inner angle between the diagonals and
+ vertical borders, and is therefore in the range [0,PI/2] (inclusive).
+ */
+inline double GetVerDiagAngle( const Rectangle& rRect )
+{ return GetVerDiagAngle( rRect.GetWidth(), rRect.GetHeight() ); }
+
+// ============================================================================
+
+/** Returns an X coordinate for a diagonal frame border in the specified height.
+
+ This function is for usage with the top-left end of a top-left to
+ bottom-right diagonal frame border, connected to the left end of a
+ horizontal frame border.
+
+ The function returns the relative X position (i.e. for a polygon) of the
+ diagonal frame border according to the specified relative Y position. The
+ mentioned positions are relative to the reference point of both frame
+ borders.
+
+ +----------------------------------------------------------
+ | The horizontal frame border.
+ | |
+ - - - - - - | --+-- <---- Reference point for horizontal and diagonal frame borders.
+ ^ | \ | \
+ nVerOffs | \ \ <--- The diagonal frame border.
+ v +---\ \------------------------------------------------
+ - - - - - - - - -\- - -X <----- The function calculates the X position of i.e.
+ \ \ this point (relative from X of reference point).
+ \ \
+ Primary -->\ \<-- Secondary
+
+ @param nVerOffs
+ The vertical position of the point to be calculated, relative to the Y
+ coordinate of the reference point.
+ @param nDiagOffs
+ The width offset across the diagonal frame border (0 = middle),
+ regardless of the gradient of the diagonal frame border (always
+ vertical to the direction of the diagonal frame border). This value is
+ not related in any way to the reference point. For details about
+ relative width offsets, see description of class Style.
+ @param fAngle
+ Inner (right) angle between diagonal and horizontal frame border.
+ */
+SVX_DLLPUBLIC long GetTLDiagOffset( long nVerOffs, long nDiagOffs, double fAngle );
+
+/** Returns an X coordinate for a diagonal frame border in the specified height.
+
+ This function is for usage with the bottom-left end of a bottom-left to
+ top-right diagonal frame border, connected to the left end of a horizontal
+ frame border.
+
+ The function returns the relative X position (i.e. for a polygon) of the
+ diagonal frame border according to the specified relative Y position. The
+ mentioned positions are relative to the reference point of both frame
+ borders.
+
+ Primary -->/ /<--- Secondary
+ / /
+ / / The function calculates the X position of i.e.
+ - - - - - - - - -/- - -X <----- this point (relative from X of reference point).
+ ^ +---/ /------------------------------------------------
+ nVerOffs | / / <--- The diagonal frame border.
+ v | / | /
+ - - - - - - | --+-- <---- Reference point for horizontal and diagonal frame borders.
+ | |
+ | The horizontal frame border.
+ +----------------------------------------------------------
+
+ @param nVerOffs
+ The vertical position of the point to be calculated, relative to the Y
+ coordinate of the reference point.
+ @param nDiagOffs
+ The width offset across the diagonal frame border (0 = middle),
+ regardless of the gradient of the diagonal frame border (always
+ vertical to the direction of the diagonal frame border). This value is
+ not related in any way to the reference point. For details about
+ relative width offsets, see description of class Style.
+ @param fAngle
+ Inner (right) angle between diagonal and horizontal frame border.
+ */
+long GetBLDiagOffset( long nVerOffs, long nDiagOffs, double fAngle );
+
+/** Returns an X coordinate for a diagonal frame border in the specified height.
+
+ This function is for usage with the bottom-right end of a top-left to
+ bottom-right diagonal frame border, connected to the right end of a
+ horizontal frame border.
+
+ @param nVerOffs
+ The vertical position of the point to be calculated, relative to the Y
+ coordinate of the reference point.
+ @param nDiagOffs
+ The width offset across the diagonal frame border (0 = middle),
+ regardless of the gradient of the diagonal frame border (always
+ vertical to the direction of the diagonal frame border). This value is
+ not related in any way to the reference point. For details about
+ relative width offsets, see description of class Style.
+ @param fAngle
+ Inner (left) angle between diagonal and horizontal frame border.
+ */
+long GetBRDiagOffset( long nVerOffs, long nDiagOffs, double fAngle );
+
+/** Returns an X coordinate for a diagonal frame border in the specified height.
+
+ This function is for usage with the top-right end of a bottom-left to
+ top-right diagonal frame border, connected to the right end of a horizontal
+ frame border.
+
+ @param nVerOffs
+ The vertical position of the point to be calculated, relative to the Y
+ coordinate of the reference point.
+ @param nDiagOffs
+ The width offset across the diagonal frame border (0 = middle),
+ regardless of the gradient of the diagonal frame border (always
+ vertical to the direction of the diagonal frame border). This value is
+ not related in any way to the reference point. For details about
+ relative width offsets, see description of class Style.
+ @param fAngle
+ Inner (left) angle between diagonal and horizontal frame border.
+ */
+long GetTRDiagOffset( long nVerOffs, long nDiagOffs, double fAngle );
+
+// ============================================================================
+
+/** Checks whether two horizontal frame borders are "connectable".
+
+ Two borders are "connectable" in terms of this function, if both can be
+ drawn with only one call of a border drawing function. This means, the two
+ frame borders must have equal style and color, and none of the other
+ vertical and diagonal frame borders break the lines of the two borders in
+ any way (i.e. two vertical double frame borders would break the horizonal
+ frame borders). Of course this function can be used for vertical frame
+ borders as well.
+
+ The follong picture shows the meaning of all passed parameters:
+
+ \ rTFromT /
+ \ | /
+ rTFromTL | rTFromTR
+ \ | /
+ \ | /
+ ======== rLBorder ========= ========== rRBorder =======
+ / | \
+ / | \
+ rBFromBL | rBFromBR
+ / | \
+ / rBFromB \
+
+ @return
+ True, if rLBorder and rRBorder can be drawn in one step without
+ interruption at their connection point.
+ */
+SVX_DLLPUBLIC bool CheckFrameBorderConnectable(
+ const Style& rLBorder, /// Style of the left frame border to connect.
+ const Style& rRBorder, /// Style of the right frame border to connect.
+
+ const Style& rTFromTL, /// Diagonal frame border from top-left to connection point.
+ const Style& rTFromT, /// Vertical frame border from top to connection point.
+ const Style& rTFromTR, /// Horizontal frame border from top-right to connection point.
+
+ const Style& rBFromBL, /// Diagonal frame border from bottom-left to connection point.
+ const Style& rBFromB, /// Vertical frame border from bottom to connection point.
+ const Style& rBFromBR /// Horizontal frame border from bottom-right to connection point.
+);
+
+// ============================================================================
+// Drawing functions
+// ============================================================================
+
+/** Draws a horizontal frame border, regards all connected frame styles.
+
+ The frame style to draw is passed as parameter rBorder. The function
+ calculates the adjustment in X direction for left and right end of primary
+ and secondary line of the frame border (the style may present a double
+ line). The line ends may differ according to the connected frame styles
+ coming from top, bottom, left, right, and/or diagonal.
+
+ Thick frame styles are always drawn centered (in width) to the passed
+ reference points. The Y coordinates of both reference points must be equal
+ (the line cannot be drawn slanted).
+
+ The function preserves all settings of the passed output device.
+
+ All parameters starting with "rL" refer to the left end of the processed
+ frame border, all parameters starting with "rR" refer to the right end.
+ The following part of the parameter name starting with "From" specifies
+ where the frame border comes from. Example: "rLFromTR" means the frame
+ border coming from top-right, connected to the left end of rBorder (and
+ therefore a diagonal frame border).
+
+ The follong picture shows the meaning of all passed parameters:
+
+ rLFromT / \ rRFromT
+ | / \ |
+ | rLFromTR rRFromTL |
+ | / \ |
+ | / \ |
+ --- rLFromL --- ============== rBorder ============== --- rRFromR ---
+ | \ / |
+ | \ / |
+ | rLFromBR rRFromBL |
+ | \ / |
+ rLFromB \ / rRFromB
+ */
+SVX_DLLPUBLIC void DrawHorFrameBorder(
+ OutputDevice& rDev, /// The output device used to draw the frame border.
+
+ const Point& rLPos, /// Reference point for left end of the processed frame border.
+ const Point& rRPos, /// Reference point for right end of the processed frame border.
+ const Style& rBorder, /// Style of the processed frame border.
+
+ const DiagStyle& rLFromTR, /// Diagonal frame border from top-right to left end of rBorder.
+ const Style& rLFromT, /// Vertical frame border from top to left end of rBorder.
+ const Style& rLFromL, /// Horizontal frame border from left to left end of rBorder.
+ const Style& rLFromB, /// Vertical frame border from bottom to left end of rBorder.
+ const DiagStyle& rLFromBR, /// Diagonal frame border from bottom-right to left end of rBorder.
+
+ const DiagStyle& rRFromTL, /// Diagonal frame border from top-left to right end of rBorder.
+ const Style& rRFromT, /// Vertical frame border from top to right end of rBorder.
+ const Style& rRFromR, /// Horizontal frame border from right to right end of rBorder.
+ const Style& rRFromB, /// Vertical frame border from bottom to right end of rBorder.
+ const DiagStyle& rRFromBL, /// Diagonal frame border from bottom-left to right end of rBorder.
+
+ const Color* pForceColor = 0 /// If specified, overrides frame border color.
+);
+
+// ----------------------------------------------------------------------------
+
+/** Draws a horizontal frame border, regards all connected frame styles.
+
+ This is a simplified version of the DrawHorFrameBorder() function described
+ above. It does not support diagonal connected frame borders. See description
+ above for additional details about the parameters.
+
+ The function preserves all settings of the passed output device.
+ */
+void SVX_DLLPUBLIC DrawHorFrameBorder(
+ OutputDevice& rDev, /// The output device used to draw the frame border.
+
+ const Point& rLPos, /// Reference point for left end of the processed frame border.
+ const Point& rRPos, /// Reference point for right end of the processed frame border.
+ const Style& rBorder, /// Style of the processed frame border.
+
+ const Style& rLFromT, /// Vertical frame border from top to left end of rBorder.
+ const Style& rLFromL, /// Horizontal frame border from left to left end of rBorder.
+ const Style& rLFromB, /// Vertical frame border from bottom to left end of rBorder.
+
+ const Style& rRFromT, /// Vertical frame border from top to right end of rBorder.
+ const Style& rRFromR, /// Horizontal frame border from right to right end of rBorder.
+ const Style& rRFromB, /// Vertical frame border from bottom to right end of rBorder.
+
+ const Color* pForceColor = 0 /// If specified, overrides frame border color.
+);
+
+// ----------------------------------------------------------------------------
+
+/** Draws a horizontal frame border without connected frame styles.
+
+ This is the most simplified version of the DrawHorFrameBorder() function
+ described above. See description above for additional details about the
+ parameters.
+
+ The function preserves all settings of the passed output device.
+ */
+void SVX_DLLPUBLIC DrawHorFrameBorder(
+ OutputDevice& rDev, /// The output device used to draw the frame border.
+ const Point& rLPos, /// Reference point for left end of the processed frame border.
+ const Point& rRPos, /// Reference point for right end of the processed frame border.
+ const Style& rBorder, /// Style of the frame border to draw.
+ const Color* pForceColor = 0 /// If specified, overrides frame border color.
+);
+
+// ============================================================================
+
+/** Draws a vertical frame border, regards all connected frame styles.
+
+ The frame style to draw is passed as parameter rBorder. The function
+ calculates the adjustment in Y direction for top and bottom end of primary
+ and secondary line of the frame border (the style may present a double
+ line). The line ends may differ according to the connected frame styles
+ coming from left, right, top, bottom, and/or diagonal.
+
+ Thick frame styles are always drawn centered (in width) to the passed
+ reference points. The X coordinates of both reference points must be equal
+ (the line cannot be drawn slanted).
+
+ The function preserves all settings of the passed output device.
+
+ All parameters starting with "rT" refer to the top end of the processed
+ frame border, all parameters starting with "rB" refer to the bottom end.
+ The following part of the parameter name starting with "From" specifies
+ where the frame border comes from. Example: "rTFromBL" means the frame
+ border coming from bottom-left, connected to the top end of rBorder (and
+ therefore a diagonal frame border).
+
+ The follong picture shows the meaning of all passed parameters:
+
+ |
+ rTFromT
+ |
+ |
+ --- rTFromL --- --- rTFromR ---
+ / # \
+ / # \
+ rTFromBL # rTFromBR
+ / # \
+ / # \
+ #
+ rBorder
+ #
+ \ # /
+ \ # /
+ rBFromTL # rBFromTR
+ \ # /
+ \ # /
+ --- rBFromL --- --- rBFromR ---
+ |
+ |
+ rBFromB
+ |
+ */
+SVX_DLLPUBLIC void DrawVerFrameBorder(
+ OutputDevice& rDev, /// The output device used to draw the frame border.
+
+ const Point& rTPos, /// Reference point for top end of the processed frame border.
+ const Point& rBPos, /// Reference point for bottom end of the processed frame border.
+ const Style& rBorder, /// Style of the processed frame border.
+
+ const DiagStyle& rTFromBL, /// Diagonal frame border from bottom-right to top end of rBorder.
+ const Style& rTFromL, /// Horizontal frame border from left to top end of rBorder.
+ const Style& rTFromT, /// Vertical frame border from top to top end of rBorder.
+ const Style& rTFromR, /// Horizontal frame border from right to top end of rBorder.
+ const DiagStyle& rTFromBR, /// Diagonal frame border from bottom-right to top end of rBorder.
+
+ const DiagStyle& rBFromTL, /// Diagonal frame border from top-left to bottom end of rBorder.
+ const Style& rBFromL, /// Horizontal frame border from left to bottom end of rBorder.
+ const Style& rBFromB, /// Vertical frame border from bottom to bottom end of rBorder.
+ const Style& rBFromR, /// Horizontal frame border from right to bottom end of rBorder.
+ const DiagStyle& rBFromTR, /// Diagonal frame border from top-right to bottom end of rBorder.
+
+ const Color* pForceColor = 0 /// If specified, overrides frame border color.
+);
+
+// ----------------------------------------------------------------------------
+
+/** Draws a vertical frame border, regards all connected frame styles.
+
+ This is a simplified version of the DrawVerFrameBorder() function described
+ above. It does not support diagonal connected frame borders. See description
+ above for additional details about the parameters.
+
+ The function preserves all settings of the passed output device.
+ */
+void SVX_DLLPUBLIC DrawVerFrameBorder(
+ OutputDevice& rDev, /// The output device used to draw the frame border.
+
+ const Point& rTPos, /// Reference point for top end of the processed frame border.
+ const Point& rBPos, /// Reference point for bottom end of the processed frame border.
+ const Style& rBorder, /// Style of the processed frame border.
+
+ const Style& rTFromL, /// Horizontal frame border from left to top end of rBorder.
+ const Style& rTFromT, /// Vertical frame border from top to top end of rBorder.
+ const Style& rTFromR, /// Horizontal frame border from right to top end of rBorder.
+
+ const Style& rBFromL, /// Horizontal frame border from left to bottom end of rBorder.
+ const Style& rBFromB, /// Vertical frame border from bottom to bottom end of rBorder.
+ const Style& rBFromR, /// Horizontal frame border from right to bottom end of rBorder.
+
+ const Color* pForceColor = 0 /// If specified, overrides frame border color.
+);
+
+// ----------------------------------------------------------------------------
+
+/** Draws a vertical frame border without connected frame styles.
+
+ This is the most simplified version of the DrawVerFrameBorder() function
+ described above. See description above for additional details about the
+ parameters.
+
+ The function preserves all settings of the passed output device.
+ */
+void SVX_DLLPUBLIC DrawVerFrameBorder(
+ OutputDevice& rDev, /// The output device used to draw the frame border.
+ const Point& rTPos, /// Reference point for top end of the processed frame border.
+ const Point& rBPos, /// Reference point for bottom end of the processed frame border.
+ const Style& rBorder, /// Style of the frame border to draw.
+ const Color* pForceColor = 0 /// If specified, overrides frame border color.
+);
+
+// ----------------------------------------------------------------------------
+
+/** Draws a vertical slanted frame border without connected frame styles.
+
+ This is an extended version of the simple DrawVerFrameBorder() function
+ described above. It accepts start and end reference points with different
+ X coordinates. See description above for additional details about the
+ parameters (except the restriction on the reference points).
+
+ The function preserves all settings of the passed output device.
+ */
+void SVX_DLLPUBLIC DrawVerFrameBorderSlanted(
+ OutputDevice& rDev, /// The output device used to draw the frame border.
+ const Point& rTPos, /// Reference point for top end of the processed frame border.
+ const Point& rBPos, /// Reference point for bottom end of the processed frame border.
+ const Style& rBorder, /// Style of the frame border to draw.
+ const Color* pForceColor = 0 /// If specified, overrides frame border color.
+);
+
+// ============================================================================
+
+/** Draws both diagonal frame borders, regards all connected frame styles.
+
+ One or both passed diagonal frame styles may be invisible.
+
+ The function preserves all settings of the passed output device.
+ */
+SVX_DLLPUBLIC void DrawDiagFrameBorders(
+ OutputDevice& rDev, /// The output device used to draw the frame border.
+
+ const Rectangle& rRect, /// Rectangle for both diagonal frame borders.
+ const Style& rTLBR, /// Style of the processed top-left to bottom-right diagonal frame border.
+ const Style& rBLTR, /// Style of the processed bottom-left to top-right diagonal frame border.
+
+ const Style& rTLFromB, /// Vertical frame border from bottom to top-left end of rTLBR.
+ const Style& rTLFromR, /// Horizontal frame border from right to top-left end of rTLBR.
+ const Style& rBRFromT, /// Vertical frame border from top to bottom-right end of rTLBR.
+ const Style& rBRFromL, /// Horizontal frame border from left to bottom-right end of rTLBR.
+
+ const Style& rBLFromT, /// Vertical frame border from top to bottom-left end of rBLTR.
+ const Style& rBLFromR, /// Horizontal frame border from right to bottom-left end of rBLTR.
+ const Style& rTRFromB, /// Vertical frame border from bottom to top-right end of rBLTR.
+ const Style& rTRFromL, /// Horizontal frame border from left to top-right end of rBLTR.
+
+ const Color* pForceColor = 0, /// If specified, overrides frame border color.
+ bool bDiagDblClip = false /// true = Use clipping for crossing double frame borders.
+);
+
+// ============================================================================
+
+} // namespace frame
+} // namespace svx
+
+/* Yes, I love ASCII art. :-) -DR- */
+
+#endif
+