gfx/skia/trunk/src/views/sdl/SkOSWindow_SDL.cpp

changeset 0
6474c204b198
     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 +}

mercurial