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 _BGFX_TOOLS_TOOLS_HXX 25 #define _BGFX_TOOLS_TOOLS_HXX 26 27 #include <sal/types.h> 28 #include <basegfx/basegfxdllapi.h> 29 30 namespace basegfx 31 { 32 class B2DPoint; 33 class B2DRange; 34 35 namespace tools 36 { 37 /** Liang-Barsky 2D line clipping algorithm 38 39 This function clips a line given by two points against the 40 given rectangle. The resulting line is returned in the 41 given points. 42 43 @param io_rStart 44 Start point of the line. On return, contains the clipped 45 start point. 46 47 @param io_rEnd 48 End point of the line. On return, contains the clipped 49 end point. 50 51 @param rClipRect 52 The rectangle to clip against 53 54 @return true, when at least part of the line is visible 55 after the clip, false otherwise 56 */ 57 BASEGFX_DLLPUBLIC bool liangBarskyClip2D( ::basegfx::B2DPoint& io_rStart, 58 ::basegfx::B2DPoint& io_rEnd, 59 const ::basegfx::B2DRange& rClipRect ); 60 61 /** Expand given parallelogram, such that it extends beyond 62 bound rect in a given direction. 63 64 This method is useful when e.g. generating one-dimensional 65 gradients, such as linear or axial gradients: those 66 gradients vary only in one direction, the other has 67 constant color. Most of the time, those gradients extends 68 infinitely in the direction with the constant color, but 69 practically, one always has a limiting bound rect into 70 which the gradient is painted. The method at hand now 71 extends a given parallelogram (e.g. the transformed 72 bounding box of a gradient) virtually into infinity to the 73 top and to the bottom (i.e. normal to the line io_rLeftTop 74 io_rRightTop), such that the given rectangle is guaranteed 75 to be covered in that direction. 76 77 @attention There might be some peculiarities with this 78 method, that might limit its usage to the described 79 gradients. One of them is the fact that when determining 80 how far the parallelogram has to be extended to the top or 81 the bottom, the upper and lower border are assumed to be 82 infinite lines. 83 84 @param io_rLeftTop 85 Left, top edge of the parallelogramm. Note that this need 86 not be the left, top edge geometrically, it's just used 87 when determining the extension direction. Thus, it's 88 perfectly legal to affine-transform a rectangle, and given 89 the transformed point here. On method return, this 90 parameter will contain the adapted output. 91 92 @param io_rLeftBottom 93 Left, bottom edge of the parallelogramm. Note that this need 94 not be the left, bottom edge geometrically, it's just used 95 when determining the extension direction. Thus, it's 96 perfectly legal to affine-transform a rectangle, and given 97 the transformed point here. On method return, this 98 parameter will contain the adapted output. 99 100 @param io_rRightTop 101 Right, top edge of the parallelogramm. Note that this need 102 not be the right, top edge geometrically, it's just used 103 when determining the extension direction. Thus, it's 104 perfectly legal to affine-transform a rectangle, and given 105 the transformed point here. On method return, this 106 parameter will contain the adapted output. 107 108 @param io_rRightBottom 109 Right, bottom edge of the parallelogramm. Note that this need 110 not be the right, bottom edge geometrically, it's just used 111 when determining the extension direction. Thus, it's 112 perfectly legal to affine-transform a rectangle, and given 113 the transformed point here. On method return, this 114 parameter will contain the adapted output. 115 116 @param rFitTarget 117 The rectangle to fit the parallelogram into. 118 */ 119 BASEGFX_DLLPUBLIC void infiniteLineFromParallelogram( ::basegfx::B2DPoint& io_rLeftTop, 120 ::basegfx::B2DPoint& io_rLeftBottom, 121 ::basegfx::B2DPoint& io_rRightTop, 122 ::basegfx::B2DPoint& io_rRightBottom, 123 const ::basegfx::B2DRange& rFitTarget ); 124 125 } 126 } 127 128 #endif /* _BGFX_TOOLS_TOOLS_HXX */ 129