summaryrefslogtreecommitdiff
path: root/LayerManagerBase/src/GraphicalSurface.cpp
blob: 5e6bcd422a44047be60a6879c16b573ea90b00af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/***************************************************************************
 *
 * Copyright 2011 Valeo
 *
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 ****************************************************************************/

#include "GraphicalSurface.h"


bool GraphicalSurface::isInside(unsigned int x_DestCoordinateSyst, unsigned int y_DestCoordinateSyst) const
{
    bool ret;

    switch (m_orientation)
    {
    case Zero:
        ret = ((x_DestCoordinateSyst >= m_destinationViewport.x)
            && (x_DestCoordinateSyst < m_destinationViewport.x + m_destinationViewport.width)
            && (y_DestCoordinateSyst >= m_destinationViewport.y)
            && (y_DestCoordinateSyst < m_destinationViewport.y + m_destinationViewport.height));
        break;

    case Ninety:
    case OneEighty:
    case TwoSeventy:
        /* Not yet supported */
        ret = false;
        break;

    default:
        ret = false;
        break;
    }

    return ret;
}



/**
 * We are going to change of coordinate system.
 * The input coordinates are in the Dest system, we have to change them to the Source system.
 * For this, 4 operations have to be undone, in order :
 *  - translation in source system
 *  - scaling
 *  - translation in destination system
 *  - rotation (not yet implemented)
 *
 */
bool GraphicalSurface::DestToSourceCoordinates(int *x, int *y, bool check) const
{
    bool     ret;
    int       TVxD;   /* Translation vector x in destination system */
    int       TVyD;   /* Translation vector y in destination system */
    int       TVxS;   /* Translation vector x in source system */
    int       TVyS;   /* Translation vector y in source system */
    float     SFx;    /* Scaling factor x  */
    float     SFy;    /* Scaling factor y  */

    if (!check || isInside(*x, *y))
    {
        /* The translation vector in the Destination system */
        TVxD = m_destinationViewport.x;
        TVyD = m_destinationViewport.y;

        /* The translation vector in the Source system */
        TVxS = m_sourceViewport.x;
        TVyS = m_sourceViewport.y;

        /* Compute the scaling factors */
        SFx = (float) m_sourceViewport.width  / (float) m_destinationViewport.width;
        SFy = (float) m_sourceViewport.height / (float) m_destinationViewport.height;

        /* Compute the rotation */
        // To be done ...

        /* Apply the transformations */
        *x = ((*x - TVxD) * SFx) + TVxS;
        *y = ((*y - TVyD) * SFy) + TVyS;

        ret = true;
    }
    else
    {
        ret = false;
    }

    return ret;
}