Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2010 VMware, Inc.
  4.  * All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the
  8.  * "Software"), to deal in the Software without restriction, including
  9.  * without limitation the rights to use, copy, modify, merge, publish,
  10.  * distribute, sub license, and/or sell copies of the Software, and to
  11.  * permit persons to whom the Software is furnished to do so, subject to
  12.  * the following conditions:
  13.  *
  14.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16.  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  17.  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
  18.  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  19.  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  20.  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  21.  *
  22.  * The above copyright notice and this permission notice (including the
  23.  * next paragraph) shall be included in all copies or substantial portions
  24.  * of the Software.
  25.  *
  26.  *
  27.  **************************************************************************/
  28.  
  29. #include "gdi/gdi_sw_winsys.h"
  30. #include "pipe/p_screen.h"
  31. #include "state_tracker/graw.h"
  32. #include "target-helpers/inline_debug_helper.h"
  33. #include "target-helpers/inline_sw_helper.h"
  34. #include <windows.h>
  35.  
  36.  
  37. static LRESULT CALLBACK
  38. window_proc(HWND hWnd,
  39.             UINT uMsg,
  40.             WPARAM wParam,
  41.             LPARAM lParam)
  42. {
  43.    switch (uMsg) {
  44.    case WM_DESTROY:
  45.       PostQuitMessage(0);
  46.       break;
  47.  
  48.    default:
  49.       return DefWindowProc(hWnd, uMsg, wParam, lParam);
  50.    }
  51.  
  52.    return 0;
  53. }
  54.  
  55. static struct {
  56.    void (* draw)(void);
  57. } graw;
  58.  
  59. struct pipe_screen *
  60. graw_create_window_and_screen(int x,
  61.                               int y,
  62.                               unsigned width,
  63.                               unsigned height,
  64.                               enum pipe_format format,
  65.                               void **handle)
  66. {
  67.    struct sw_winsys *winsys = NULL;
  68.    struct pipe_screen *screen = NULL;
  69.    WNDCLASSEX wc;
  70.    UINT style = WS_VISIBLE | WS_TILEDWINDOW;
  71.    RECT rect;
  72.    HWND hWnd = NULL;
  73.    HDC hDC = NULL;
  74.  
  75.    if (format != PIPE_FORMAT_R8G8B8A8_UNORM)
  76.       goto fail;
  77.  
  78.    winsys = gdi_create_sw_winsys();
  79.    if (winsys == NULL)
  80.       goto fail;
  81.  
  82.    screen = sw_screen_create(winsys);
  83.    if (screen == NULL)
  84.       goto fail;
  85.  
  86.    memset(&wc, 0, sizeof wc);
  87.    wc.cbSize = sizeof wc;
  88.    wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
  89.    wc.lpfnWndProc = window_proc;
  90.    wc.lpszClassName = "graw-gdi";
  91.    wc.hInstance = GetModuleHandle(NULL);
  92.    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  93.    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  94.    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
  95.    RegisterClassEx(&wc);
  96.  
  97.    SetRect(&rect, 0, 0, width, height);
  98.    AdjustWindowRectEx(&rect, style, FALSE, 0);
  99.  
  100.    hWnd = CreateWindowEx(0,
  101.                          wc.lpszClassName,
  102.                          wc.lpszClassName,
  103.                          style,
  104.                          x,
  105.                          y,
  106.                          rect.right - rect.left,
  107.                          rect.bottom - rect.top,
  108.                          NULL,
  109.                          NULL,
  110.                          wc.hInstance,
  111.                          0);
  112.    if (hWnd == NULL)
  113.       goto fail;
  114.  
  115.    hDC = GetDC(hWnd);
  116.    if (hDC == NULL)
  117.       goto fail;
  118.  
  119.    *handle = (void *)hDC;
  120.  
  121.    return debug_screen_wrap(screen);
  122.  
  123. fail:
  124.    if (hWnd)
  125.       DestroyWindow(hWnd);
  126.  
  127.    if (screen)
  128.       screen->destroy(screen);
  129.  
  130.    return NULL;
  131. }
  132.  
  133. void
  134. graw_set_display_func(void (* draw)(void))
  135. {
  136.    graw.draw = draw;
  137. }
  138.  
  139. void
  140. graw_main_loop(void)
  141. {
  142.    for (;;) {
  143.       MSG msg;
  144.  
  145.       while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
  146.          if (msg.message == WM_QUIT) {
  147.             return;
  148.          }
  149.          TranslateMessage(&msg);
  150.          DispatchMessage(&msg);
  151.       }
  152.  
  153.       if (graw.draw) {
  154.          graw.draw();
  155.       }
  156.  
  157.       Sleep(0);
  158.    }
  159. }
  160.