/src/backend/directfb/ftk_display_dfb.c

http://ftk.googlecode.com/ · C · 219 lines · 150 code · 40 blank · 29 comment · 19 complexity · a2fc588ac1a410c255742f6c2301f3cc MD5 · raw file

  1. /*
  2. * File: ftk_display_dfb.h
  3. * Author: Li XianJing <xianjimli@hotmail.com>
  4. * Brief: display directfb implementation.
  5. *
  6. * Copyright (c) 2009 - 2010 Li XianJing <xianjimli@hotmail.com>
  7. *
  8. * Licensed under the Academic Free License version 2.1
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  23. */
  24. /*
  25. * History:
  26. * ================================================================
  27. * 2009-11-28 Li XianJing <xianjimli@hotmail.com> created
  28. *
  29. */
  30. #include <directfb.h>
  31. #include "ftk_globals.h"
  32. #include "ftk_source_dfb.h"
  33. #include "ftk_display_dfb.h"
  34. #define DFBCHECK(x) x
  35. typedef struct _PrivInfo
  36. {
  37. int width;
  38. int height;
  39. IDirectFB* dfb;
  40. IDirectFBWindow* window;
  41. IDirectFBSurface* window_surface;
  42. IDirectFBEventBuffer* event_buffer;
  43. IDirectFBDisplayLayer* layer;
  44. }PrivInfo;
  45. static Ret ftk_display_dfb_update(FtkDisplay* thiz, FtkBitmap* bitmap, FtkRect* rect, int xoffset, int yoffset)
  46. {
  47. Ret ret = RET_OK;
  48. DECL_PRIV(thiz, priv);
  49. DFBRectangle r = {0};
  50. int display_width = ftk_display_width(thiz);
  51. int display_height = ftk_display_height(thiz);
  52. IDirectFBSurface* surface = (IDirectFBSurface*)ftk_bitmap_get_native(bitmap);
  53. r.w = display_width;
  54. r.h = display_height;
  55. priv->window_surface->Blit(priv->window_surface, surface, &r, 0, 0);
  56. priv->window_surface->Flip(priv->window_surface, NULL, 0);
  57. return ret;
  58. }
  59. static int ftk_display_dfb_width(FtkDisplay* thiz)
  60. {
  61. DECL_PRIV(thiz, priv);
  62. return_val_if_fail(priv != NULL, 0);
  63. return priv->width;
  64. }
  65. static int ftk_display_dfb_height(FtkDisplay* thiz)
  66. {
  67. DECL_PRIV(thiz, priv);
  68. return_val_if_fail(priv != NULL, 0);
  69. return priv->height;
  70. }
  71. static Ret ftk_display_dfb_snap(FtkDisplay* thiz, FtkRect* r, FtkBitmap* bitmap)
  72. {
  73. int pitch = 0;
  74. void *data = NULL;
  75. FtkRect rect = {0};
  76. DECL_PRIV(thiz, priv);
  77. int w = ftk_display_width(thiz);
  78. int h = ftk_display_height(thiz);
  79. int bw = ftk_bitmap_width(bitmap);
  80. int bh = ftk_bitmap_height(bitmap);
  81. IDirectFBSurface* surface = priv->window_surface;
  82. surface->Lock(surface, DSLF_READ | DSLF_WRITE, &data, &pitch);
  83. rect.x = r->x;
  84. rect.y = r->y;
  85. rect.width = FTK_MIN(bw, r->width);
  86. rect.height = FTK_MIN(bh, r->height);
  87. ftk_bitmap_copy_from_data_bgra32(bitmap, data, w, h, &rect);
  88. surface->Unlock(surface);
  89. return RET_OK;
  90. }
  91. static void ftk_display_dfb_destroy(FtkDisplay* thiz)
  92. {
  93. if(thiz != NULL)
  94. {
  95. DECL_PRIV(thiz, priv);
  96. if(priv->event_buffer != NULL)
  97. {
  98. priv->event_buffer->Release(priv->event_buffer);
  99. priv->event_buffer = NULL;
  100. }
  101. if(priv->window_surface != NULL)
  102. {
  103. priv->window_surface->Release(priv->window_surface);
  104. priv->window_surface = NULL;
  105. }
  106. if(priv->window != NULL)
  107. {
  108. priv->window->Release(priv->window);
  109. priv->window= NULL;
  110. }
  111. if(priv->layer != NULL)
  112. {
  113. priv->layer->Release(priv->layer);
  114. priv->layer= NULL;
  115. }
  116. if(priv->dfb != NULL)
  117. {
  118. priv->dfb->Release( priv->dfb );
  119. priv->dfb = NULL;
  120. }
  121. FTK_ZFREE(thiz, sizeof(FtkDisplay) + sizeof(PrivInfo));
  122. }
  123. return;
  124. }
  125. static Ret ftk_display_dfb_init(FtkDisplay* thiz, IDirectFB* dfb)
  126. {
  127. DECL_PRIV(thiz, priv);
  128. int display_height = 0;
  129. int display_width = 0;
  130. FtkSource* source = NULL;
  131. DFBWindowDescription win_desc;
  132. IDirectFBWindow* window = NULL;
  133. IDirectFBDisplayLayer* layer = NULL;
  134. IDirectFBSurface* window_surface = NULL;
  135. IDirectFBEventBuffer* event_buffer = NULL;
  136. DFBDisplayLayerConfig layer_config;
  137. DFBCHECK(dfb->GetDisplayLayer( dfb, DLID_PRIMARY, &layer ));
  138. layer->SetCooperativeLevel( layer, DLSCL_ADMINISTRATIVE );
  139. layer->GetConfiguration( layer, &layer_config );
  140. display_width = layer_config.width;
  141. display_height = layer_config.height;
  142. win_desc.posx = 0;
  143. win_desc.posy = 0;
  144. win_desc.width = display_width;
  145. win_desc.height = display_height;
  146. win_desc.flags = ( DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT);
  147. DFBCHECK(layer->CreateWindow( layer, &win_desc, &window ));
  148. window->GetSurface( window, &window_surface );
  149. window->CreateEventBuffer( window, &event_buffer );
  150. priv->dfb = dfb;
  151. priv->layer = layer;
  152. priv->width = display_width;
  153. priv->height = display_height;
  154. priv->window = window;
  155. priv->event_buffer = event_buffer;
  156. priv->window_surface = window_surface;
  157. window->SetOpacity( window, 0xFF );
  158. if((source = ftk_source_dfb_create(dfb, event_buffer)) != NULL)
  159. {
  160. ftk_sources_manager_add(ftk_default_sources_manager(), source);
  161. }
  162. return RET_OK;
  163. }
  164. FtkDisplay* ftk_display_dfb_create(IDirectFB* dfb)
  165. {
  166. FtkDisplay* thiz = NULL;
  167. return_val_if_fail(dfb != NULL, NULL);
  168. thiz = FTK_ZALLOC(sizeof(FtkDisplay)+sizeof(PrivInfo));
  169. if(thiz != NULL)
  170. {
  171. thiz->update = ftk_display_dfb_update;
  172. thiz->width = ftk_display_dfb_width;
  173. thiz->height = ftk_display_dfb_height;
  174. thiz->snap = ftk_display_dfb_snap;
  175. thiz->destroy = ftk_display_dfb_destroy;
  176. ftk_display_dfb_init(thiz, dfb);
  177. }
  178. return thiz;
  179. }