~mzanetti/unity8/spread-blur

« back to all changes in this revision

Viewing changes to qml/Stage/Spread/MathUtils.js

  • Committer: Bileto Bot
  • Author(s): Michael Zanetti
  • Date: 2016-10-24 11:34:08 UTC
  • mfrom: (2400.6.204 unity8-unified-spread)
  • Revision ID: ci-train-bot@canonical.com-20161024113408-7ul8ivww68dqm74v
Merge all Stages into one single codebase. Apply new spread visuals.

This deletes PhoneStage, TabletStage and DesktopStage, and merges all of the functionality into Stage. Also the spread visuals have been updated by design to work with all usage modes. (LP: #1489517, #1603914, #1635800)

Approved by: Lukáš Tinkl

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2016 Canonical, Ltd.
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or modify
 
5
 * it under the terms of the GNU General Public License as published by
 
6
 * the Free Software Foundation; version 3.
 
7
 *
 
8
 * This program is distributed in the hope that it will be useful,
 
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
 * GNU General Public License for more details.
 
12
 *
 
13
 * You should have received a copy of the GNU General Public License
 
14
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
15
 */
 
16
 
 
17
.pragma library
 
18
 
 
19
/**
 
20
 * From processing.js: https://raw.githubusercontent.com/processing-js/processing-js/v1.4.8/processing.js
 
21
 *
 
22
 * Re-map a number from one range to another. In the example above, the number
 
23
 * '25' is converted from a value in the range 0..100 into a value that
 
24
 * ranges from the left edge (0) to the right edge (width) of the screen.
 
25
 * Numbers outside the range are not clamped to 0 and 1, because out-of-range
 
26
 * values are often intentional and useful.
 
27
 *
 
28
 * @param {Number} value        The incoming value to be converted
 
29
 * @param {Number} istart       Lower bound of the value's current range
 
30
 * @param {Number} istop        Upper bound of the value's current range
 
31
 * @param {Number} ostart       Lower bound of the value's target range
 
32
 * @param {Number} ostop        Upper bound of the value's target range
 
33
 *
 
34
 * @returns {Number}
 
35
 */
 
36
function map(value, istart, istop, ostart, ostop) {
 
37
  return ostart + (ostop - ostart) * ((value - istart) / (istop - istart))
 
38
}
 
39
 
 
40
/**
 
41
 * Return a value which is always between `min` and `max`
 
42
 *
 
43
 * @param {Number} value     The current value
 
44
 * @param {Number} min       The minimum value
 
45
 * @param {Number} max       The maximum value
 
46
 *
 
47
 * @returns {Number}
 
48
 */
 
49
function clamp(value, min, max) {
 
50
  if (value < min) return min
 
51
  if (value > max) return max
 
52
  return value
 
53
}
 
54
 
 
55
// calculates the distance from the middle of one rect to middle of other rect
 
56
function rectDistance(rect1, rect2) {
 
57
    return pointDistance(Qt.point(rect1.x + rect1.width / 2, rect1.y + rect1.height / 2),
 
58
                         Qt.point(rect2.x + rect2.width / 2, rect2.y + rect2.height / 2))
 
59
}
 
60
 
 
61
// calculates the distance between two points
 
62
function pointDistance(point1, point2) {
 
63
    return Math.sqrt(Math.pow(point1.x - point2.x, 2) +
 
64
                     Math.pow(point1.y - point2.y, 2)
 
65
                    )
 
66
}
 
67
 
 
68
// from http://stackoverflow.com/questions/14616829/java-method-to-find-the-rectangle-that-is-the-intersection-of-two-rectangles-usi
 
69
function intersectionRect(r1, r2) {
 
70
    var xmin = Math.max(r1.x, r2.x);
 
71
    var xmax1 = r1.x + r1.width;
 
72
    var xmax2 = r2.x + r2.width;
 
73
    var xmax = Math.min(xmax1, xmax2);
 
74
    var out = {x:0, y:0, width:0, height:0}
 
75
    if (xmax > xmin) {
 
76
        var ymin = Math.max(r1.y, r2.y);
 
77
        var ymax1 = r1.y + r1.height;
 
78
        var ymax2 = r2.y + r2.height;
 
79
        var ymax = Math.min(ymax1, ymax2);
 
80
        if (ymax > ymin) {
 
81
            out.x = xmin;
 
82
            out.y = ymin;
 
83
            out.width = xmax - xmin;
 
84
            out.height = ymax - ymin;
 
85
        }
 
86
    }
 
87
    return out;
 
88
}
 
89
 
 
90
function easeOutCubic(t) { return (--t)*t*t+1 }
 
91
 
 
92
function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
 
93
    // progress : progressDiff = value : valueDiff => value = progress * valueDiff / progressDiff
 
94
    return (progress - startProgress) * (endValue - startValue) / (endProgress - startProgress) + startValue;
 
95
}