• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2005 The Android Open Source Project
3 //
4 // Simulated device data.
5 //
6 
7 // For compilers that support precompilation, include "wx/wx.h".
8 #include "wx/wxprec.h"
9 
10 // Otherwise, include all standard headers
11 #ifndef WX_PRECOMP
12 # include "wx/wx.h"
13 #endif
14 #include "wx/image.h"   // needed for Windows build
15 
16 #include "LinuxKeys.h"
17 #include "PhoneButton.h"
18 
19 using namespace android;
20 
21 
22 /*
23  * Create a PhoneButton without a backing image.
24  */
Create(const char * label)25 bool PhoneButton::Create(const char* label)
26 {
27     assert(!mHasImage);     // quick check for re-use
28 
29     mKeyCode = LookupKeyCode(label);
30     if (mKeyCode == kKeyCodeUnknown) {
31         fprintf(stderr, "WARNING: key code '%s' not recognized\n", label);
32         // keep going
33     }
34 
35     return true;
36 }
37 
38 /*
39  * Create a PhoneButton with an associated image.  Don't load the image yet.
40  */
Create(const char * label,const char * imageFileName,int x,int y)41 bool PhoneButton::Create(const char* label, const char* imageFileName,
42     int x, int y)
43 {
44     if (!Create(label))
45         return false;
46 
47     if (mSelectedImage.Create(imageFileName, x, y))
48         mHasImage = true;
49     else
50         fprintf(stderr, "Warning: image create (%s, %d, %d) failed\n",
51             imageFileName, x, y);
52 
53     return true;
54 }
55 
56 /*
57  * Load the image, if any.
58  */
LoadResources(void)59 bool PhoneButton::LoadResources(void)
60 {
61     if (!mHasImage)
62         return true;        // no image associated with this button
63 
64     bool result = mSelectedImage.LoadResources();
65     if (result)
66         CreateHighlightedBitmap();
67     return result;
68 }
69 
70 /*
71  * Unload the image if we loaded one.
72  */
UnloadResources(void)73 bool PhoneButton::UnloadResources(void)
74 {
75     if (!mHasImage)
76         return true;
77 
78     return mSelectedImage.UnloadResources();
79 }
80 
81 /* use an inline instead of macro so we don't evaluate args multiple times */
MinVal(int a,int b)82 static inline int MinVal(int a, int b) { return (a < b ? a : b); }
83 
84 /*
85  * Create the "highlighted" bitmap from the "selected" image.
86  */
CreateHighlightedBitmap(void)87 void PhoneButton::CreateHighlightedBitmap(void)
88 {
89     wxBitmap* src = mSelectedImage.GetBitmap();
90     assert(src != NULL);
91     wxImage tmpImage = src->ConvertToImage();
92 
93     unsigned char* pRGB = tmpImage.GetData();       // top-left RGBRGB...
94     int x, y;
95 
96     /*
97      * Modify the color used for the "highlight" image.
98      */
99     for (y = tmpImage.GetHeight()-1; y >= 0; --y) {
100         for (x = tmpImage.GetWidth()-1; x >= 0; --x) {
101             *(pRGB)   = MinVal(*(pRGB)   + *(pRGB) / 8, 255);
102             *(pRGB+1) = MinVal(*(pRGB+1) + *(pRGB+1) / 8, 255);
103             *(pRGB+2) = *(pRGB+2) * 5 / 8;
104 
105             pRGB += 3;
106         }
107     }
108 
109     mHighlightedBitmap = wxBitmap(tmpImage);
110 }
111 
112 /*
113  * Check to see if the button "collides" with the specified point.
114  *
115  * This is currently a simple rectangle check, but could be modified
116  * to take image transparency into account.
117  */
CheckCollision(int x,int y) const118 bool PhoneButton::CheckCollision(int x, int y) const
119 {
120     if (!mHasImage)
121         return false;
122 
123     return (x >= mSelectedImage.GetX() &&
124             x < mSelectedImage.GetX() + mSelectedImage.GetWidth() &&
125             y >= mSelectedImage.GetY() &&
126             y < mSelectedImage.GetY() + mSelectedImage.GetHeight());
127 }
128 
129 /*
130  * Look up a key code based on a string.
131  *
132  * Returns kKeyCodeUnknown if the label doesn't match anything.
133  */
LookupKeyCode(const char * label) const134 KeyCode PhoneButton::LookupKeyCode(const char* label) const
135 {
136     static const struct {
137         const char* label;
138         int keyCode;
139     } codeList[] = {
140         { "soft-left",      KEY_MENU },
141         { "soft-right",     KEY_KBDILLUMUP },
142         { "home",           KEY_HOME },
143         { "back",           KEY_BACK },
144         { "call",           KEY_F3 },
145         { "phone-dial",     KEY_F3 },
146         { "end-call",       KEY_F4 },
147         { "phone-hangup",   KEY_F4 },
148         { "0",              KEY_0 },
149         { "1",              KEY_1 },
150         { "2",              KEY_2 },
151         { "3",              KEY_3 },
152         { "4",              KEY_4 },
153         { "5",              KEY_5 },
154         { "6",              KEY_6 },
155         { "7",              KEY_7 },
156         { "8",              KEY_8 },
157         { "9",              KEY_9 },
158         { "star",           KEY_SWITCHVIDEOMODE },
159         { "pound",          KEY_KBDILLUMTOGGLE },
160         { "dpad-up",        KEY_UP },
161         { "dpad-down",      KEY_DOWN },
162         { "dpad-left",      KEY_LEFT },
163         { "dpad-right",     KEY_RIGHT },
164         { "dpad-center",    KEY_REPLY },
165         { "volume-up",      KEY_VOLUMEUP },
166         { "volume-down",    KEY_VOLUMEDOWN },
167         { "power",          KEY_POWER },
168         { "camera",         KEY_CAMERA },
169         //{ "clear",          kKeyCodeClear },
170     };
171     const int numCodes = sizeof(codeList) / sizeof(codeList[0]);
172 
173     for (int i = 0; i < numCodes; i++) {
174         if (strcmp(label, codeList[i].label) == 0)
175             return (KeyCode) codeList[i].keyCode;
176     }
177 
178     return kKeyCodeUnknown;
179 };
180 
181