/src/backend/sdl/ftk_display_sdl.c

http://ftk.googlecode.com/ · C · 180 lines · 147 code · 30 blank · 3 comment · 16 complexity · c49a0d414fa8067c4dbd52b7b9881c59 MD5 · raw file

  1. #include "ftk_typedef.h"
  2. #include "ftk.h"
  3. #include "ftk_event.h"
  4. #include "ftk_globals.h"
  5. #include "ftk_display_rotate.h"
  6. #include "ftk_display_sdl.h"
  7. #include <SDL.h>
  8. #ifdef WEBOS
  9. #include <PDL.h>
  10. #endif
  11. typedef struct _PrivInfo
  12. {
  13. SDL_Surface* screen;
  14. SDL_Surface* surface;
  15. int width;
  16. int height;
  17. FtkEvent event;
  18. }PrivInfo;
  19. static Ret ftk_display_sdl_update(FtkDisplay* thiz, FtkBitmap* bitmap, FtkRect* rect, int xoffset, int yoffset)
  20. {
  21. SDL_Rect paint_rect;
  22. DECL_PRIV(thiz, priv);
  23. #if 1
  24. SDL_LockSurface(priv->surface);
  25. ftk_bitmap_copy_to_data_rgba32(bitmap, rect, priv->surface->pixels, xoffset, yoffset, priv->width, priv->height);
  26. SDL_UnlockSurface(priv->surface);
  27. #if 0
  28. paint_rect.x = xoffset;
  29. paint_rect.y = xoffset;
  30. paint_rect.w = (xoffset + rect->width) >= priv->width ? priv->width - xoffset : rect->width;
  31. paint_rect.h = (yoffset + rect->height) >= priv->height ? priv->height - yoffset : rect->height;
  32. #else
  33. paint_rect.x = 0;
  34. paint_rect.y = 0;
  35. paint_rect.w = priv->width;
  36. paint_rect.h = priv->height;
  37. #endif
  38. SDL_BlitSurface(priv->surface, &paint_rect, priv->screen, &paint_rect);
  39. if((priv->screen->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF)
  40. {
  41. SDL_Flip(priv->screen);
  42. }
  43. else
  44. {
  45. SDL_UpdateRects(priv->screen, 1, &paint_rect);
  46. }
  47. #else
  48. SDL_GL_Lock();
  49. ftk_bitmap_copy_to_data_rgba32(bitmap, rect, priv->surface->pixels, xoffset, yoffset, priv->width, priv->height);
  50. SDL_GL_Unlock();
  51. paint_rect.x = 0;
  52. paint_rect.y = 0;
  53. paint_rect.w = priv->width;
  54. paint_rect.h = priv->height;
  55. SDL_BlitSurface(priv->surface, &paint_rect, priv->screen, &paint_rect);
  56. if((priv->screen->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF)
  57. {
  58. SDL_GL_SwapBuffers();
  59. }
  60. else
  61. {
  62. SDL_GL_UpdateRects(1, &paint_rect);
  63. }
  64. #endif
  65. return RET_OK;
  66. }
  67. static Ret ftk_display_sdl_snap(FtkDisplay* thiz, FtkRect* r, FtkBitmap* bitmap)
  68. {
  69. #if 0
  70. int i = 0;
  71. int xoffset = r->x;
  72. int yoffset = r->y;
  73. int width = r->width;
  74. int height = r->height;
  75. DECL_PRIV(thiz, priv);
  76. FtkColor* dst = ftk_bitmap_lock(bitmap);
  77. FtkColor* src = ftk_bitmap_lock(priv->bitmap);
  78. /*TODO*/
  79. #endif
  80. return RET_OK;
  81. }
  82. static int ftk_display_sdl_width(FtkDisplay* thiz)
  83. {
  84. DECL_PRIV(thiz, priv);
  85. return_val_if_fail(priv != NULL, 0);
  86. return priv->width;
  87. }
  88. static int ftk_display_sdl_height(FtkDisplay* thiz)
  89. {
  90. DECL_PRIV(thiz, priv);
  91. return_val_if_fail(priv != NULL, 0);
  92. return priv->height;
  93. }
  94. static void ftk_display_sdl_destroy(FtkDisplay* thiz)
  95. {
  96. if(thiz != NULL)
  97. {
  98. DECL_PRIV(thiz, priv);
  99. SDL_FreeSurface(priv->surface);
  100. FTK_ZFREE(thiz, sizeof(FtkDisplay) + sizeof(PrivInfo));
  101. #ifdef WEBOS
  102. PDL_Quit();
  103. #endif
  104. SDL_Quit();
  105. }
  106. }
  107. FtkDisplay* ftk_display_sdl_create(void)
  108. {
  109. SDL_VideoInfo *vi;
  110. FtkDisplay* thiz;
  111. thiz = (FtkDisplay*)FTK_ZALLOC(sizeof(FtkDisplay) + sizeof(PrivInfo));
  112. if(thiz != NULL)
  113. {
  114. DECL_PRIV(thiz, priv);
  115. thiz->update = ftk_display_sdl_update;
  116. thiz->width = ftk_display_sdl_width;
  117. thiz->height = ftk_display_sdl_height;
  118. thiz->snap = ftk_display_sdl_snap;
  119. thiz->destroy = ftk_display_sdl_destroy;
  120. priv->width = 320;
  121. priv->height = 480;
  122. ftk_logd("%d-%d\n", priv->width, priv->height);
  123. SDL_Init(SDL_INIT_VIDEO/*|SDL_INIT_NOPARACHUTE*/);
  124. #ifdef WEBOS
  125. PDL_Init(0);
  126. #endif
  127. /* SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); */
  128. vi = (SDL_VideoInfo*)SDL_GetVideoInfo();
  129. if(vi == NULL)
  130. {
  131. ftk_loge("SDL_GetVideoInfo() failed\n");
  132. return NULL;
  133. }
  134. ftk_logd("bpp: %d\n", vi->vfmt->BitsPerPixel);
  135. priv->screen = SDL_SetVideoMode(priv->width, priv->height, vi->vfmt->BitsPerPixel, SDL_HWSURFACE/*SDL_OPENGL*/);
  136. if(priv->screen == NULL)
  137. {
  138. ftk_loge("SDL_SetVideoMode() failed\n");
  139. /* TODO: cleanup */
  140. return NULL;
  141. }
  142. priv->surface = SDL_CreateRGBSurface(SDL_SWSURFACE, priv->width, priv->height, 32, 0, 0, 0, 0);
  143. if(priv->surface == NULL)
  144. {
  145. ftk_loge("SDL_CreateRGBSurface() failed\n");
  146. return NULL;
  147. }
  148. }
  149. return thiz;
  150. }