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