/src/backend/android/ftk_display_android_skia.c

http://ftk.googlecode.com/ · C · 142 lines · 111 code · 29 blank · 2 comment · 12 complexity · 04d22abff2677075382da05274f3f6b9 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. typedef struct _PrivInfo
  6. {
  7. int unused;
  8. }PrivInfo;
  9. static int screen_width = 320;
  10. static int screen_height = 480;
  11. void Android_SetScreenResolution(int width, int height)
  12. {
  13. screen_width = width;
  14. screen_height = height;
  15. }
  16. static Ret ftk_display_android_skia_handle_event(FtkDisplay* thiz, FtkEvent* event)
  17. {
  18. Ret ret = RET_OK;
  19. DECL_PRIV(thiz, priv);
  20. return_val_if_fail(priv != NULL && event != NULL, RET_FAIL);
  21. switch(event->type)
  22. {
  23. case FTK_EVT_OS_SCREEN_ROTATED:
  24. {
  25. ftk_wnd_manager_set_rotate(ftk_default_wnd_manager(), (FtkRotate)event->u.extra);
  26. ret = RET_REMOVE;
  27. break;
  28. }
  29. default:break;
  30. }
  31. return ret;
  32. }
  33. static Ret ftk_display_android_skia_update(FtkDisplay* thiz, FtkBitmap* bitmap, FtkRect* rect, int xoffset, int yoffset)
  34. {
  35. int i = 0;
  36. Ret ret = RET_OK;
  37. DECL_PRIV(thiz, priv);
  38. int width = rect->width;
  39. int height = rect->height;
  40. int src_width = ftk_bitmap_width(bitmap);
  41. int src_height = ftk_bitmap_height(bitmap);
  42. FtkColor* src = ftk_bitmap_lock(bitmap);
  43. int dst_width = screen_width;
  44. int dst_height = screen_height;
  45. int* pixels = Android_GetBitmapPixels();
  46. FtkColor* dst = (FtkColor*)pixels;
  47. return_val_if_fail(rect->x < src_width && rect->y < src_height
  48. && xoffset < dst_width && yoffset < dst_height, RET_FAIL);
  49. width = (xoffset + width) >= dst_width ? dst_width - xoffset : width;
  50. height = (yoffset + height) >= dst_height ? dst_height - yoffset : height;
  51. src += rect->y * src_width + rect->x;
  52. dst += yoffset * dst_width + xoffset;
  53. for(i = 0; i < height; i++)
  54. {
  55. memcpy(dst, src, sizeof(FtkColor) * width);
  56. dst += dst_width;
  57. src += src_width;
  58. }
  59. Android_ReleaseBitmapPixels(pixels);
  60. #if 0
  61. Android_DrawBitmap(yoffset * screen_width + xoffset, screen_width, xoffset, yoffset, width, height);
  62. #else
  63. Android_DrawBitmap(0, screen_width, 0, 0, screen_width, screen_height);
  64. #endif
  65. return ret;
  66. }
  67. static Ret ftk_display_android_skia_snap(FtkDisplay* thiz, FtkRect* r, FtkBitmap* bitmap)
  68. {
  69. int i = 0;
  70. int xoffset = r->x;
  71. int yoffset = r->y;
  72. int width = r->width;
  73. int height = r->height;
  74. DECL_PRIV(thiz, priv);
  75. FtkColor* dst = ftk_bitmap_lock(bitmap);
  76. //FtkColor* src = ftk_bitmap_lock(priv->bitmap);
  77. /*TODO*/
  78. return RET_OK;
  79. }
  80. static int ftk_display_android_skia_width(FtkDisplay* thiz)
  81. {
  82. return screen_width;
  83. }
  84. static int ftk_display_android_skia_height(FtkDisplay* thiz)
  85. {
  86. return screen_height;
  87. }
  88. static void ftk_display_android_skia_destroy(FtkDisplay* thiz)
  89. {
  90. if(thiz != NULL)
  91. {
  92. ftk_wnd_manager_remove_global_listener(ftk_default_wnd_manager(),
  93. (FtkListener)ftk_display_android_skia_handle_event, thiz);
  94. FTK_ZFREE(thiz, sizeof(FtkDisplay) + sizeof(PrivInfo));
  95. }
  96. return;
  97. }
  98. FtkDisplay* ftk_display_android_create(void)
  99. {
  100. FtkDisplay* thiz = NULL;
  101. thiz = (FtkDisplay*)FTK_ZALLOC(sizeof(FtkDisplay) + sizeof(PrivInfo));
  102. if(thiz != NULL)
  103. {
  104. thiz->update = ftk_display_android_skia_update;
  105. thiz->width = ftk_display_android_skia_width;
  106. thiz->height = ftk_display_android_skia_height;
  107. thiz->snap = ftk_display_android_skia_snap;
  108. thiz->destroy = ftk_display_android_skia_destroy;
  109. ftk_wnd_manager_add_global_listener(ftk_default_wnd_manager(),
  110. (FtkListener)ftk_display_android_skia_handle_event, thiz);
  111. }
  112. return thiz;
  113. }