SDL_sysmouse.cc
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_sysmouse.cc,v 1.4 2002/04/22 21:38:04 wmay Exp $";
  21. #endif
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <AppKit.h>
  25. #include <GameKit.h>
  26. #include "SDL_error.h"
  27. #include "SDL_BWin.h"
  28. extern "C" {
  29. #include "SDL_sysmouse_c.h"
  30. /* Convert bits to padded bytes */
  31. #define PADDED_BITS(bits)  ((bits+7)/8)
  32. /* The implementation dependent data for the window manager cursor */
  33. struct WMcursor {
  34. char *bits;
  35. };
  36. /* Can this be done in the BeOS? */
  37. WMcursor *BE_CreateWMCursor(_THIS,
  38. Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
  39. {
  40. WMcursor *cursor;
  41. int allowed_x;
  42. int allowed_y;
  43. int run, pad, i;
  44. char *cptr;
  45. allowed_x = 16; /* BeOS limitation */
  46. allowed_y = 16; /* BeOS limitation */
  47. if ( (w > allowed_x) || (h > allowed_y) ) {
  48. SDL_SetError("Only cursors of dimension (%dx%d) are allowed",
  49. allowed_x, allowed_y);
  50. return(NULL);
  51. }
  52. /* Allocate the cursor */
  53. cursor = (WMcursor *)malloc(sizeof(WMcursor));
  54. if ( cursor == NULL ) {
  55. SDL_OutOfMemory();
  56. return(NULL);
  57. }
  58. cursor->bits = (char *)malloc(4+2*((allowed_x/8)*allowed_y));
  59. if ( cursor->bits == NULL ) {
  60. free(cursor);
  61. SDL_OutOfMemory();
  62. return(NULL);
  63. }
  64. cursor->bits[0] = allowed_y; /* Size of the cursor */
  65. cursor->bits[1] = 1; /* Bit depth of cursor */
  66. cursor->bits[2] = hot_y;
  67. cursor->bits[3] = hot_x;
  68. cptr = &cursor->bits[4];
  69. /* Pad out to the normal cursor size */
  70. run = PADDED_BITS(w);
  71. pad = PADDED_BITS(allowed_x)-run;
  72. for ( i=0; i<h; ++i ) {
  73. memcpy(cptr, data, run);
  74. memset(cptr+run, 0, pad);
  75. data += run;
  76. cptr += (run+pad);
  77. }
  78. for ( ; i<allowed_y; ++i ) {
  79. memset(cptr, 0, run+pad);
  80. cptr += (run+pad);
  81. }
  82. for ( i=0; i<h; ++i ) {
  83. /* FIXME: The mask should be OR'd with the data to turn 
  84.    inverted color pixels black, since inverted color pixels
  85.    aren't supported under BeOS.
  86.  */
  87. memcpy(cptr, mask, run);
  88. memset(cptr+run, 0, pad);
  89. mask += run;
  90. cptr += (run+pad);
  91. }
  92. for ( ; i<allowed_y; ++i ) {
  93. memset(cptr, 0, run+pad);
  94. cptr += (run+pad);
  95. }
  96. return(cursor);
  97. }
  98. int BE_ShowWMCursor(_THIS, WMcursor *cursor)
  99. {
  100. if ( be_app->Lock() ) {
  101. if ( cursor == NULL ) {
  102. if ( SDL_BlankCursor != NULL ) {
  103. be_app->SetCursor(SDL_BlankCursor->bits);
  104. }
  105. } else {
  106. be_app->SetCursor(cursor->bits);
  107. }
  108. be_app->Unlock();
  109. }
  110. return(1);
  111. }
  112. void BE_FreeWMCursor(_THIS, WMcursor *cursor)
  113. {
  114. free(cursor->bits);
  115. free(cursor);
  116. }
  117. /* Implementation by Christian Bauer <cbauer@student.physik.uni-mainz.de> */
  118. void BE_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
  119. {
  120. BPoint pt(x, y);
  121. SDL_Win->Lock();
  122. SDL_Win->ConvertToScreen(&pt);
  123. SDL_Win->Unlock();
  124. set_mouse_position((int32)pt.x, (int32)pt.y);
  125. }
  126. }; /* Extern C */