blob: 261b1699422d5252ec427ee3cb5e4e28bb220392 [file] [log] [blame]
reed@android.com671cd652009-05-22 20:44:12 +00001#include "SkOSWindow_SDL.h"
2#include "SkCanvas.h"
reed@android.comc3a8c5f2009-05-26 13:27:48 +00003#include "SkColorPriv.h"
reed@android.com671cd652009-05-22 20:44:12 +00004#include "SkOSMenu.h"
5#include "SkTime.h"
6
7static void post_SkEvent_event() {
8 SDL_Event evt;
9 evt.type = SDL_USEREVENT;
10 evt.user.type = SDL_USEREVENT;
11 evt.user.code = 0;
12 evt.user.data1 = NULL;
13 evt.user.data2 = NULL;
14 SDL_PushEvent(&evt);
15}
16
17static bool skia_setBitmapFromSurface(SkBitmap* dst, SDL_Surface* src) {
18 SkBitmap::Config config;
19
20 switch (src->format->BytesPerPixel) {
21 case 2:
22 config = SkBitmap::kRGB_565_Config;
23 break;
24 case 4:
25 config = SkBitmap::kARGB_8888_Config;
26 break;
27 default:
28 return false;
29 }
30
31 dst->setConfig(config, src->w, src->h, src->pitch);
32 dst->setPixels(src->pixels);
33 return true;
34}
35
reed@android.comc3a8c5f2009-05-26 13:27:48 +000036SkOSWindow::SkOSWindow(void* screen) {
37 fScreen = reinterpret_cast<SDL_Surface*>(screen);
38 this->resize(fScreen->w, fScreen->h);
39
40 uint32_t rmask = SK_R32_MASK << SK_R32_SHIFT;
41 uint32_t gmask = SK_G32_MASK << SK_G32_SHIFT;
42 uint32_t bmask = SK_B32_MASK << SK_B32_SHIFT;
43 uint32_t amask = SK_A32_MASK << SK_A32_SHIFT;
44
45 fSurface = SDL_CreateRGBSurface(SDL_SWSURFACE, fScreen->w, fScreen->h, 32,
46 rmask, gmask, bmask, amask);
47}
48
49SkOSWindow::~SkOSWindow() {
50 SDL_FreeSurface(fSurface);
reed@android.com671cd652009-05-22 20:44:12 +000051}
52
53void SkOSWindow::doDraw() {
54 if ( SDL_MUSTLOCK(fSurface) ) {
55 if ( SDL_LockSurface(fSurface) < 0 ) {
56 return;
57 }
58 }
59
60 SkBitmap bitmap;
61
62 if (skia_setBitmapFromSurface(&bitmap, fSurface)) {
63 SkCanvas canvas(bitmap);
64 this->draw(&canvas);
65 }
66
67 if ( SDL_MUSTLOCK(fSurface) ) {
68 SDL_UnlockSurface(fSurface);
69 }
reed@android.comc3a8c5f2009-05-26 13:27:48 +000070
71 int result = SDL_BlitSurface(fSurface, NULL, fScreen, NULL);
72 if (result) {
73 SkDebugf("------- SDL_BlitSurface returned %d\n", result);
74 }
75 SDL_UpdateRect(fScreen, 0, 0, fScreen->w, fScreen->h);
reed@android.com671cd652009-05-22 20:44:12 +000076}
77
78static SkKey find_skkey(SDLKey src) {
79 // this array must match the enum order in SkKey.h
80 static const SDLKey gKeys[] = {
81 SDLK_UNKNOWN,
82 SDLK_UNKNOWN, // left softkey
83 SDLK_UNKNOWN, // right softkey
84 SDLK_UNKNOWN, // home
85 SDLK_UNKNOWN, // back
86 SDLK_UNKNOWN, // send
87 SDLK_UNKNOWN, // end
88 SDLK_0,
89 SDLK_1,
90 SDLK_2,
91 SDLK_3,
92 SDLK_4,
93 SDLK_5,
94 SDLK_6,
95 SDLK_7,
96 SDLK_8,
97 SDLK_9,
98 SDLK_ASTERISK,
99 SDLK_HASH,
100 SDLK_UP,
101 SDLK_DOWN,
102 SDLK_LEFT,
103 SDLK_RIGHT,
104 SDLK_RETURN, // OK
105 SDLK_UNKNOWN, // volume up
106 SDLK_UNKNOWN, // volume down
107 SDLK_UNKNOWN, // power
108 SDLK_UNKNOWN, // camera
109 };
110
111 const SDLKey* array = gKeys;
112 for (size_t i = 0; i < SK_ARRAY_COUNT(gKeys); i++) {
113 if (array[i] == src) {
114 return static_cast<SkKey>(i);
115 }
116 }
117 return kNONE_SkKey;
118}
119
120void SkOSWindow::handleSDLEvent(const SDL_Event& event) {
121 switch (event.type) {
122 case SDL_VIDEORESIZE:
123 this->resize(event.resize.w, event.resize.h);
124 break;
125 case SDL_VIDEOEXPOSE:
126 this->doDraw();
127 break;
128 case SDL_MOUSEMOTION:
129 if (event.motion.state == SDL_PRESSED) {
130 this->handleClick(event.motion.x, event.motion.y,
131 SkView::Click::kMoved_State);
132 }
133 break;
134 case SDL_MOUSEBUTTONDOWN:
135 case SDL_MOUSEBUTTONUP:
136 this->handleClick(event.button.x, event.button.y,
137 event.button.state == SDL_PRESSED ?
138 SkView::Click::kDown_State :
139 SkView::Click::kUp_State);
140 break;
141 case SDL_KEYDOWN: {
142 SkKey sk = find_skkey(event.key.keysym.sym);
143 if (kNONE_SkKey != sk) {
144 if (event.key.state == SDL_PRESSED) {
145 this->handleKey(sk);
146 } else {
147 this->handleKeyUp(sk);
148 }
149 }
150 break;
151 }
152 case SDL_USEREVENT:
153 if (SkEvent::ProcessEvent()) {
154 post_SkEvent_event();
155 }
156 break;
157 }
158}
159
160void SkOSWindow::onHandleInval(const SkIRect& r) {
161 SDL_Event evt;
162 evt.type = SDL_VIDEOEXPOSE;
163 evt.expose.type = SDL_VIDEOEXPOSE;
164 SDL_PushEvent(&evt);
165}
166
167void SkOSWindow::onSetTitle(const char title[]) {
168 SDL_WM_SetCaption(title, NULL);
169}
170
171void SkOSWindow::onAddMenu(const SkOSMenu* sk_menu) {}
172
173///////////////////////////////////////////////////////////////////////////////////////
174
175void SkEvent::SignalNonEmptyQueue() {
176 SkDebugf("-------- signal nonempty\n");
177 post_SkEvent_event();
178}
179
180static Uint32 timer_callback(Uint32 interval) {
181// SkDebugf("-------- timercallback %d\n", interval);
182 SkEvent::ServiceQueueTimer();
183 return 0;
184}
185
186void SkEvent::SignalQueueTimer(SkMSec delay)
187{
188 SDL_SetTimer(0, NULL);
189 if (delay) {
190 SDL_SetTimer(delay, timer_callback);
191 }
192}
193