1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef _BGFX_TOOLS_KEYSTOPLERP_HXX
25*b1cdbd2cSJim Jagielski #define _BGFX_TOOLS_KEYSTOPLERP_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <basegfx/numeric/ftools.hxx>
28*b1cdbd2cSJim Jagielski #include <vector>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski namespace com{ namespace sun{ namespace star{ namespace uno {
31*b1cdbd2cSJim Jagielski     template<typename T> class Sequence;
32*b1cdbd2cSJim Jagielski }}}}
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski namespace basegfx
35*b1cdbd2cSJim Jagielski {
36*b1cdbd2cSJim Jagielski     namespace tools
37*b1cdbd2cSJim Jagielski     {
38*b1cdbd2cSJim Jagielski         /** Lerp in a vector of key stops
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski             This class holds a key stop vector and provides the
41*b1cdbd2cSJim Jagielski             functionality to lerp inside it. Useful e.g. for
42*b1cdbd2cSJim Jagielski             multi-stop gradients, or the SMIL key time activity.
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski             For those, given a global [0,1] lerp alpha, one need to
45*b1cdbd2cSJim Jagielski             find the suitable bucket index from key stop vector, and
46*b1cdbd2cSJim Jagielski             then calculate the relative alpha between the two buckets
47*b1cdbd2cSJim Jagielski             found.
48*b1cdbd2cSJim Jagielski          */
49*b1cdbd2cSJim Jagielski         class KeyStopLerp
50*b1cdbd2cSJim Jagielski         {
51*b1cdbd2cSJim Jagielski         public:
52*b1cdbd2cSJim Jagielski             typedef std::pair<std::ptrdiff_t,double> ResultType;
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski             /** Create lerper with given vector of stops
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski                 @param rKeyStops
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski                 Vector of stops, must contain at least two elements
59*b1cdbd2cSJim Jagielski                 (though preferrably more, otherwise you probably don't
60*b1cdbd2cSJim Jagielski                 need key stop lerping in the first place). All
61*b1cdbd2cSJim Jagielski                 elements must be of monotonically increasing value.
62*b1cdbd2cSJim Jagielski              */
63*b1cdbd2cSJim Jagielski             explicit KeyStopLerp( const std::vector<double>& rKeyStops );
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski             /** Create lerper with given sequence of stops
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski                 @param rKeyStops
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski                 Sequence of stops, must contain at least two elements
70*b1cdbd2cSJim Jagielski                 (though preferrably more, otherwise you probably don't
71*b1cdbd2cSJim Jagielski                 need key stop lerping in the first place). All
72*b1cdbd2cSJim Jagielski                 elements must be of monotonically increasing value.
73*b1cdbd2cSJim Jagielski              */
74*b1cdbd2cSJim Jagielski             explicit KeyStopLerp( const ::com::sun::star::uno::Sequence<double>& rKeyStops );
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski             /** Find two nearest bucket index & interpolate
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski                 @param fAlpha
79*b1cdbd2cSJim Jagielski                 Find bucket index i, with keyStops[i] < fAlpha <=
80*b1cdbd2cSJim Jagielski                 keyStops[i+1]. Return new alpha value in [0,1),
81*b1cdbd2cSJim Jagielski                 proportional to fAlpha's position between keyStops[i]
82*b1cdbd2cSJim Jagielski                 and keyStops[i+1]
83*b1cdbd2cSJim Jagielski              */
84*b1cdbd2cSJim Jagielski             ResultType lerp(double fAlpha) const;
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski         private:
87*b1cdbd2cSJim Jagielski             std::vector<double>    maKeyStops;
88*b1cdbd2cSJim Jagielski             mutable std::ptrdiff_t mnLastIndex;
89*b1cdbd2cSJim Jagielski         };
90*b1cdbd2cSJim Jagielski     }
91*b1cdbd2cSJim Jagielski }
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski #endif
94