/src/backend/android/ftk_display_android_gles.c

http://ftk.googlecode.com/ · C · 186 lines · 149 code · 35 blank · 2 comment · 14 complexity · b311f3d3da20187937d34ca040de1235 MD5 · raw file

  1. #include "ftk_jni.h"
  2. #include "ftk_event.h"
  3. #include "ftk_globals.h"
  4. #include "ftk_display_android.h"
  5. #include <GLES/gl.h>
  6. #include <GLES/glext.h>
  7. typedef struct _PrivInfo
  8. {
  9. FtkBitmap* bitmap;
  10. }PrivInfo;
  11. static int screen_width = 320;
  12. static int screen_height = 480;
  13. void Android_SetScreenResolution(int width, int height)
  14. {
  15. screen_width = width;
  16. screen_height = height;
  17. }
  18. static Ret ftk_display_android_handle_event(FtkDisplay* thiz, FtkEvent* event)
  19. {
  20. Ret ret = RET_OK;
  21. DECL_PRIV(thiz, priv);
  22. return_val_if_fail(priv != NULL && event != NULL, RET_FAIL);
  23. switch(event->type)
  24. {
  25. case FTK_EVT_OS_SCREEN_ROTATED:
  26. {
  27. ftk_wnd_manager_set_rotate(ftk_default_wnd_manager(), (FtkRotate)event->u.extra);
  28. ret = RET_REMOVE;
  29. break;
  30. }
  31. default:break;
  32. }
  33. return ret;
  34. }
  35. static int display_bitmap(PrivInfo* priv, FtkBitmap* bitmap, int x, int y, int width, int height, int xoffset, int yoffset)
  36. {
  37. GLint crop[4] = {0};
  38. crop[0] = x;
  39. crop[1] = y;
  40. crop[2] = width;
  41. crop[3] = height;
  42. if(Android_PreRender() != RET_OK)
  43. {
  44. return 0;
  45. }
  46. glColor4f(1,1,1,1);
  47. glBindTexture(GL_TEXTURE_2D, 0);
  48. glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
  49. glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  50. glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  51. glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  52. glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  53. glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  54. glEnable(GL_TEXTURE_2D);
  55. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ftk_bitmap_width(bitmap), ftk_bitmap_height(bitmap),
  56. 0, GL_RGBA, GL_UNSIGNED_BYTE, ftk_bitmap_lock(bitmap));
  57. glDrawTexiOES(xoffset, yoffset, 0, width, height);
  58. Android_Render();
  59. return 0;
  60. }
  61. static Ret ftk_display_android_update(FtkDisplay* thiz, FtkBitmap* bitmap, FtkRect* rect, int xoffset, int yoffset)
  62. {
  63. int i = 0;
  64. Ret ret = RET_OK;
  65. DECL_PRIV(thiz, priv);
  66. int width = rect->width;
  67. int height = rect->height;
  68. int src_width = ftk_bitmap_width(bitmap);
  69. int src_height = ftk_bitmap_height(bitmap);
  70. int dst_width = ftk_bitmap_width(priv->bitmap);
  71. int dst_height = ftk_bitmap_height(priv->bitmap);
  72. FtkColor* src = ftk_bitmap_lock(bitmap);
  73. FtkColor* dst = ftk_bitmap_lock(priv->bitmap);
  74. return_val_if_fail(rect->x < src_width && rect->y < src_height
  75. && xoffset < dst_width && yoffset < dst_height, RET_FAIL);
  76. width = (xoffset + width) >= dst_width ? dst_width - xoffset : width;
  77. height = (yoffset + height) >= dst_height ? dst_height - yoffset : height;
  78. yoffset = dst_height - yoffset - height - 1;
  79. src += rect->y * src_width + rect->x;
  80. dst += (yoffset + height) * dst_width + xoffset;
  81. for(i = 0; i < height; i++)
  82. {
  83. memcpy(dst, src, sizeof(FtkColor) * width);
  84. dst -= dst_width;
  85. src += src_width;
  86. }
  87. #if 0
  88. display_bitmap(priv, priv->bitmap, xoffset, yoffset, width, height, xoffset, yoffset);
  89. #else
  90. display_bitmap(priv, priv->bitmap, 0, 0, screen_width, screen_height, 0, 0);
  91. #endif
  92. return ret;
  93. }
  94. static Ret ftk_display_android_snap(FtkDisplay* thiz, FtkRect* r, FtkBitmap* bitmap)
  95. {
  96. int i = 0;
  97. int xoffset = r->x;
  98. int yoffset = r->y;
  99. int width = r->width;
  100. int height = r->height;
  101. DECL_PRIV(thiz, priv);
  102. FtkColor* dst = ftk_bitmap_lock(bitmap);
  103. FtkColor* src = ftk_bitmap_lock(priv->bitmap);
  104. /*TODO*/
  105. //glReadPixels(r->x, r->y, r->width, r->height, GL_RGBA, GL_UNSIGNED_BYTE, ftk_bitmap_lock(bitmap));
  106. return RET_OK;
  107. }
  108. static int ftk_display_android_width(FtkDisplay* thiz)
  109. {
  110. return screen_width;
  111. }
  112. static int ftk_display_android_height(FtkDisplay* thiz)
  113. {
  114. return screen_height;
  115. }
  116. static void ftk_display_android_destroy(FtkDisplay* thiz)
  117. {
  118. if(thiz != NULL)
  119. {
  120. DECL_PRIV(thiz, priv);
  121. ftk_wnd_manager_remove_global_listener(ftk_default_wnd_manager(),
  122. (FtkListener)ftk_display_android_handle_event, thiz);
  123. ftk_bitmap_unref(priv->bitmap);
  124. FTK_ZFREE(thiz, sizeof(FtkDisplay) + sizeof(PrivInfo));
  125. }
  126. return;
  127. }
  128. FtkDisplay* ftk_display_android_create(void)
  129. {
  130. FtkDisplay* thiz = NULL;
  131. thiz = (FtkDisplay*)FTK_ZALLOC(sizeof(FtkDisplay) + sizeof(PrivInfo));
  132. if(thiz != NULL)
  133. {
  134. FtkColor bg;
  135. DECL_PRIV(thiz, priv);
  136. thiz->update = ftk_display_android_update;
  137. thiz->width = ftk_display_android_width;
  138. thiz->height = ftk_display_android_height;
  139. thiz->snap = ftk_display_android_snap;
  140. thiz->destroy = ftk_display_android_destroy;
  141. bg.a = 0xff;
  142. bg.r = 0xff;
  143. bg.g = 0xff;
  144. bg.b = 0xff;
  145. priv->bitmap = ftk_bitmap_create(screen_width, screen_height, bg);
  146. ftk_wnd_manager_add_global_listener(ftk_default_wnd_manager(),
  147. (FtkListener)ftk_display_android_handle_event, thiz);
  148. Android_InitEGL();
  149. }
  150. return thiz;
  151. }