933ccb1cf143d4060c717fdb95c9c92c32110661
[profile/ivi/ico-uxf-homescreen.git] / lib / system-controller / CicoSCLayer.cpp
1 /*
2  * Copyright (c) 2013, TOYOTA MOTOR CORPORATION.
3  *
4  * This program is licensed under the terms and conditions of the
5  * Apache License, version 2.0.  The full text of the Apache License is at
6  * http://www.apache.org/licenses/LICENSE-2.0
7  *
8  */
9
10 /*========================================================================*/
11 /**
12  *  @file   CicoSCLayer.cpp
13  *
14  *  @brief  This file is implementation of CicoSCLayer class
15  */
16 /*========================================================================*/
17
18 #include <stdlib.h>
19 #include <string.h>
20 #include "CicoSCLayer.h"
21 #include "CicoLog.h"
22
23 //--------------------------------------------------------------------------
24 /**
25  *  @brief  default constructor
26  */
27 //--------------------------------------------------------------------------
28 CicoSCLayer::CicoSCLayer()
29     : layerid(-1), type(-1), width(-1), height(-1),
30       displayid(-1), numsurfaces(0), menuoverlap(false)
31
32 {
33     surfaceids = (int *)malloc(ICO_SC_LAYER_TABLE_INITIAL * sizeof(int));
34     if (surfaceids) {
35         maxsurfaces = ICO_SC_LAYER_TABLE_INITIAL;
36     }
37     else    {
38         maxsurfaces = 0;
39     }
40 }
41
42 //--------------------------------------------------------------------------
43 /**
44  *  @brief  destructor
45  */
46 //--------------------------------------------------------------------------
47 CicoSCLayer::~CicoSCLayer()
48 {
49     if (surfaceids) {
50         maxsurfaces = 0;
51         numsurfaces = 0;
52         free(surfaceids);
53         surfaceids = NULL;
54     }
55 }
56
57 //--------------------------------------------------------------------------
58 /**
59  *  @brief  addSurface
60  */
61 //--------------------------------------------------------------------------
62 void
63 CicoSCLayer::addSurface(int surfaceid, bool top)
64 {
65     int     idx, idx2;
66     int     *wksurfaceids;
67     ICO_DBG("CicoSCLayer::addSurface(%d,%08x,%d)", layerid, surfaceid, top);
68
69     idx2 = 0;
70     for (idx = 0; idx < numsurfaces; idx++) {
71         if (surfaceids[idx] != surfaceid)   {
72             surfaceids[idx2++] = surfaceids[idx];
73         }
74     }
75     numsurfaces = idx2;
76
77     if (numsurfaces >= maxsurfaces) {
78         maxsurfaces = numsurfaces + ICO_SC_LAYER_TABLE_EXTENSION;
79         wksurfaceids = (int *)malloc(maxsurfaces * sizeof(int));
80         if (! wksurfaceids) {
81             ICO_ERR("CicoSCLayer::addSurface: Out of Memory");
82             return;
83         }
84         if (surfaceids) {
85             memcpy(wksurfaceids, surfaceids, numsurfaces * sizeof(int));
86             free(surfaceids);
87         }
88         surfaceids = wksurfaceids;
89     }
90     if (top)    {
91         surfaceids[numsurfaces] = surfaceid;
92     }
93     else    {
94         for (idx = numsurfaces; idx > 0; idx--) {
95             surfaceids[idx] = surfaceids[idx-1];
96         }
97         surfaceids[0] = surfaceid;
98     }
99     numsurfaces ++;
100 }
101
102 //--------------------------------------------------------------------------
103 /**
104  *  @brief  removeSurface
105  */
106 //--------------------------------------------------------------------------
107 void
108 CicoSCLayer::removeSurface(int surfaceid)
109 {
110     int     idx, idx2;
111     ICO_DBG("CicoSCLayer::removeSurface(%d,%08x)", layerid, surfaceid);
112
113     idx2 = 0;
114     for (idx = 0; idx < numsurfaces; idx++) {
115         if (surfaceids[idx] != surfaceid)   {
116             surfaceids[idx2++] = surfaceids[idx];
117         }
118     }
119     numsurfaces = idx2;
120 }
121
122 //--------------------------------------------------------------------------
123 /**
124  *  @brief  is_topSurface
125  */
126 //--------------------------------------------------------------------------
127 bool
128 CicoSCLayer::is_topSurface(int surfaceid)
129 {
130     return (numsurfaces > 0) && (surfaceids[numsurfaces-1] == surfaceid);
131 }
132
133 //--------------------------------------------------------------------------
134 /**
135  *  @brief  is_buttomSurface
136  */
137 //--------------------------------------------------------------------------
138 bool
139 CicoSCLayer::is_buttomSurface(int surfaceid)
140 {
141     return (numsurfaces > 0) && (surfaceids[0] == surfaceid);
142 }
143
144 //--------------------------------------------------------------------------
145 /**
146  *  @brief  getSurfaces
147  */
148 //--------------------------------------------------------------------------
149 const int *
150 CicoSCLayer::getSurfaces(int *retsurfaces)
151 {
152     *retsurfaces = numsurfaces;
153     return surfaceids;
154 }
155
156 //--------------------------------------------------------------------------
157 /**
158  *  @brief  dump log this class member variables
159  */
160 //--------------------------------------------------------------------------
161 void
162 CicoSCLayer::dump(void)
163 {
164     ICO_DBG("CicoSCLayer: layerid=%d type=%d width=%d height=%d "
165             "displayid =%d menuoverlap=%s",
166             layerid, type, width, height, displayid,
167             menuoverlap ? "true" : "false");
168 }
169 // vim:set expandtab ts=4 sw=4: