1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/views/sdl/SkOSWindow_SDL.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,226 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2011 Google Inc. 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 +#include "SkOSWindow_SDL.h" 1.12 +#include "SkCanvas.h" 1.13 +#include "SkColorPriv.h" 1.14 +#include "SkGLCanvas.h" 1.15 +#include "SkOSMenu.h" 1.16 +#include "SkTime.h" 1.17 + 1.18 +static void post_SkEvent_event() { 1.19 + SDL_Event evt; 1.20 + evt.type = SDL_USEREVENT; 1.21 + evt.user.type = SDL_USEREVENT; 1.22 + evt.user.code = 0; 1.23 + evt.user.data1 = NULL; 1.24 + evt.user.data2 = NULL; 1.25 + SDL_PushEvent(&evt); 1.26 +} 1.27 + 1.28 +static bool skia_setBitmapFromSurface(SkBitmap* dst, SDL_Surface* src) { 1.29 + SkBitmap::Config config; 1.30 + 1.31 + switch (src->format->BytesPerPixel) { 1.32 + case 2: 1.33 + config = SkBitmap::kRGB_565_Config; 1.34 + break; 1.35 + case 4: 1.36 + config = SkBitmap::kARGB_8888_Config; 1.37 + break; 1.38 + default: 1.39 + return false; 1.40 + } 1.41 + 1.42 + dst->setConfig(config, src->w, src->h, src->pitch); 1.43 + dst->setPixels(src->pixels); 1.44 + return true; 1.45 +} 1.46 + 1.47 +SkOSWindow::SkOSWindow(void* screen) { 1.48 + fScreen = reinterpret_cast<SDL_Surface*>(screen); 1.49 + this->resize(fScreen->w, fScreen->h); 1.50 + 1.51 + uint32_t rmask = SK_R32_MASK << SK_R32_SHIFT; 1.52 + uint32_t gmask = SK_G32_MASK << SK_G32_SHIFT; 1.53 + uint32_t bmask = SK_B32_MASK << SK_B32_SHIFT; 1.54 + uint32_t amask = SK_A32_MASK << SK_A32_SHIFT; 1.55 + 1.56 + if (fScreen->flags & SDL_OPENGL) { 1.57 + fSurface = NULL; 1.58 + fGLCanvas = new SkGLCanvas; 1.59 + fGLCanvas->setViewport(fScreen->w, fScreen->h); 1.60 + } else { 1.61 + fGLCanvas = NULL; 1.62 + fSurface = SDL_CreateRGBSurface(SDL_SWSURFACE, fScreen->w, fScreen->h, 1.63 + 32, rmask, gmask, bmask, amask); 1.64 + } 1.65 +} 1.66 + 1.67 +SkOSWindow::~SkOSWindow() { 1.68 + delete fGLCanvas; 1.69 + if (fSurface) { 1.70 + SDL_FreeSurface(fSurface); 1.71 + } 1.72 +} 1.73 + 1.74 +#include <OpenGL/gl.h> 1.75 + 1.76 +void SkOSWindow::doDraw() { 1.77 + if (fGLCanvas) { 1.78 + glEnable(GL_BLEND); 1.79 + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 1.80 + glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE); 1.81 + glEnable(GL_TEXTURE_2D); 1.82 + glClearColor(0, 0, 0, 0); 1.83 + glClear(GL_COLOR_BUFFER_BIT); 1.84 + 1.85 + int count = fGLCanvas->save(); 1.86 + this->draw(fGLCanvas); 1.87 + fGLCanvas->restoreToCount(count); 1.88 + SDL_GL_SwapBuffers( ); 1.89 + } else { 1.90 + if ( SDL_MUSTLOCK(fSurface) ) { 1.91 + if ( SDL_LockSurface(fSurface) < 0 ) { 1.92 + return; 1.93 + } 1.94 + } 1.95 + 1.96 + SkBitmap bitmap; 1.97 + 1.98 + if (skia_setBitmapFromSurface(&bitmap, fSurface)) { 1.99 + SkCanvas canvas(bitmap); 1.100 + this->draw(&canvas); 1.101 + } 1.102 + 1.103 + if ( SDL_MUSTLOCK(fSurface) ) { 1.104 + SDL_UnlockSurface(fSurface); 1.105 + } 1.106 + 1.107 + int result = SDL_BlitSurface(fSurface, NULL, fScreen, NULL); 1.108 + if (result) { 1.109 + SkDebugf("------- SDL_BlitSurface returned %d\n", result); 1.110 + } 1.111 + SDL_UpdateRect(fScreen, 0, 0, fScreen->w, fScreen->h); 1.112 + } 1.113 +} 1.114 + 1.115 +static SkKey find_skkey(SDLKey src) { 1.116 + // this array must match the enum order in SkKey.h 1.117 + static const SDLKey gKeys[] = { 1.118 + SDLK_UNKNOWN, 1.119 + SDLK_UNKNOWN, // left softkey 1.120 + SDLK_UNKNOWN, // right softkey 1.121 + SDLK_UNKNOWN, // home 1.122 + SDLK_UNKNOWN, // back 1.123 + SDLK_UNKNOWN, // send 1.124 + SDLK_UNKNOWN, // end 1.125 + SDLK_0, 1.126 + SDLK_1, 1.127 + SDLK_2, 1.128 + SDLK_3, 1.129 + SDLK_4, 1.130 + SDLK_5, 1.131 + SDLK_6, 1.132 + SDLK_7, 1.133 + SDLK_8, 1.134 + SDLK_9, 1.135 + SDLK_ASTERISK, 1.136 + SDLK_HASH, 1.137 + SDLK_UP, 1.138 + SDLK_DOWN, 1.139 + SDLK_LEFT, 1.140 + SDLK_RIGHT, 1.141 + SDLK_RETURN, // OK 1.142 + SDLK_UNKNOWN, // volume up 1.143 + SDLK_UNKNOWN, // volume down 1.144 + SDLK_UNKNOWN, // power 1.145 + SDLK_UNKNOWN, // camera 1.146 + }; 1.147 + 1.148 + const SDLKey* array = gKeys; 1.149 + for (size_t i = 0; i < SK_ARRAY_COUNT(gKeys); i++) { 1.150 + if (array[i] == src) { 1.151 + return static_cast<SkKey>(i); 1.152 + } 1.153 + } 1.154 + return kNONE_SkKey; 1.155 +} 1.156 + 1.157 +void SkOSWindow::handleSDLEvent(const SDL_Event& event) { 1.158 + switch (event.type) { 1.159 + case SDL_VIDEORESIZE: 1.160 + this->resize(event.resize.w, event.resize.h); 1.161 + break; 1.162 + case SDL_VIDEOEXPOSE: 1.163 + this->doDraw(); 1.164 + break; 1.165 + case SDL_MOUSEMOTION: 1.166 + if (event.motion.state == SDL_PRESSED) { 1.167 + this->handleClick(event.motion.x, event.motion.y, 1.168 + SkView::Click::kMoved_State); 1.169 + } 1.170 + break; 1.171 + case SDL_MOUSEBUTTONDOWN: 1.172 + case SDL_MOUSEBUTTONUP: 1.173 + this->handleClick(event.button.x, event.button.y, 1.174 + event.button.state == SDL_PRESSED ? 1.175 + SkView::Click::kDown_State : 1.176 + SkView::Click::kUp_State); 1.177 + break; 1.178 + case SDL_KEYDOWN: { 1.179 + SkKey sk = find_skkey(event.key.keysym.sym); 1.180 + if (kNONE_SkKey != sk) { 1.181 + if (event.key.state == SDL_PRESSED) { 1.182 + this->handleKey(sk); 1.183 + } else { 1.184 + this->handleKeyUp(sk); 1.185 + } 1.186 + } 1.187 + break; 1.188 + } 1.189 + case SDL_USEREVENT: 1.190 + if (SkEvent::ProcessEvent()) { 1.191 + post_SkEvent_event(); 1.192 + } 1.193 + break; 1.194 + } 1.195 +} 1.196 + 1.197 +void SkOSWindow::onHandleInval(const SkIRect& r) { 1.198 + SDL_Event evt; 1.199 + evt.type = SDL_VIDEOEXPOSE; 1.200 + evt.expose.type = SDL_VIDEOEXPOSE; 1.201 + SDL_PushEvent(&evt); 1.202 +} 1.203 + 1.204 +void SkOSWindow::onSetTitle(const char title[]) { 1.205 + SDL_WM_SetCaption(title, NULL); 1.206 +} 1.207 + 1.208 +void SkOSWindow::onAddMenu(const SkOSMenu* sk_menu) {} 1.209 + 1.210 +/////////////////////////////////////////////////////////////////////////////////////// 1.211 + 1.212 +void SkEvent::SignalNonEmptyQueue() { 1.213 + SkDebugf("-------- signal nonempty\n"); 1.214 + post_SkEvent_event(); 1.215 +} 1.216 + 1.217 +static Uint32 timer_callback(Uint32 interval) { 1.218 +// SkDebugf("-------- timercallback %d\n", interval); 1.219 + SkEvent::ServiceQueueTimer(); 1.220 + return 0; 1.221 +} 1.222 + 1.223 +void SkEvent::SignalQueueTimer(SkMSec delay) 1.224 +{ 1.225 + SDL_SetTimer(0, NULL); 1.226 + if (delay) { 1.227 + SDL_SetTimer(delay, timer_callback); 1.228 + } 1.229 +}