1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This library is free software; you can redistribute it and/or
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modify it under the terms of the GNU Library General Public
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * License as published by the Free Software Foundation; either
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * version 2 of the License, or (at your option) any later version.
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This library is distributed in the hope that it will be useful,
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * but WITHOUT ANY WARRANTY; without even the implied warranty of
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Library General Public License for more details.
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * You should have received a copy of the GNU Library General Public License
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * along with this library; see the file COPYING.LIB.  If not, write to
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Boston, MA 02110-1301, USA.
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef StepRange_h
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define StepRange_h
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
24dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/Forward.h>
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/Noncopyable.h>
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebCore {
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass HTMLInputElement;
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
31ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass StepRange {
32ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WTF_MAKE_NONCOPYABLE(StepRange);
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic:
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool hasStep;
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double step;
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double minimum;
37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double maximum; // maximum must be >= minimum.
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    explicit StepRange(const HTMLInputElement*);
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double clampValue(double value);
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double clampValue(const String& stringValue);
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Clamp the middle value according to the step
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double defaultValue()
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return clampValue((minimum + maximum) / 2);
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Map value into 0-1 range
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double proportionFromValue(double value)
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (minimum == maximum)
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return 0;
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return (value - minimum) / (maximum - minimum);
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Map from 0-1 range to value
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double valueFromProportion(double proportion)
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return minimum + proportion * (maximum - minimum);
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double valueFromElement(HTMLInputElement*, bool* wasClamped = 0);
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif // StepRange_h
70