/src/canvas/win32/ftk_bitmap_win32.cpp

http://ftk.googlecode.com/ · C++ · 160 lines · 126 code · 34 blank · 0 comment · 32 complexity · 0d1a07e152543a2fd18043c8125cdd5a MD5 · raw file

  1. #include "ftk_bitmap.h"
  2. #include "ftk_globals.h"
  3. #ifdef VC6
  4. #define ULONG_PTR unsigned long*
  5. #endif
  6. #include <windows.h>
  7. #include <gdiplus.h>
  8. #include "ftk_win32.h"
  9. FtkBitmap* ftk_bitmap_create(int w, int h, FtkColor color)
  10. {
  11. Bitmap* bitmap = NULL;
  12. FtkColor* bits = NULL;
  13. FtkBitmap* thiz = (FtkBitmap*)FTK_ZALLOC(sizeof(FtkBitmap));
  14. if(thiz != NULL)
  15. {
  16. thiz->ref = 1;
  17. bits = FTK_ZALLOC(w * h * 4);
  18. if(bits != NULL)
  19. {
  20. bitmap = new Bitmap(w, h, w * 4, PixelFormat32bppARGB, (char*)bits);
  21. if(bitmap != NULL)
  22. {
  23. thiz->data = bitmap;
  24. thiz->data1 = bits;
  25. }
  26. else
  27. {
  28. FTK_FREE(bits);
  29. FTK_FREE(thiz);
  30. }
  31. }
  32. else
  33. {
  34. FTK_FREE(thiz);
  35. }
  36. }
  37. return thiz;
  38. }
  39. FtkBitmap* ftk_bitmap_create_with_native(void* bitmap)
  40. {
  41. FtkBitmap* thiz = (FtkBitmap*)FTK_ZALLOC(sizeof(FtkBitmap));
  42. if(thiz != NULL)
  43. {
  44. thiz->ref = 1;
  45. thiz->data = bitmap;
  46. }
  47. return thiz;
  48. }
  49. void* ftk_bitmap_get_native(FtkBitmap* thiz)
  50. {
  51. return_val_if_fail(thiz != NULL, NULL);
  52. return thiz->data;
  53. }
  54. int ftk_bitmap_width(FtkBitmap* thiz)
  55. {
  56. Bitmap* bitmap = NULL;
  57. return_val_if_fail(thiz != NULL && thiz->data != NULL, 0);
  58. bitmap = (Bitmap*)thiz->data;
  59. return bitmap->GetWidth();
  60. }
  61. int ftk_bitmap_height(FtkBitmap* thiz)
  62. {
  63. Bitmap* bitmap = NULL;
  64. return_val_if_fail(thiz != NULL && thiz->data != NULL, 0);
  65. bitmap = (Bitmap*)thiz->data;
  66. return bitmap->GetHeight();
  67. }
  68. FtkColor* ftk_bitmap_lock(FtkBitmap* thiz)
  69. {
  70. Rect r(0, 0, w, h);
  71. Bitmap* bitmap = NULL;
  72. BitmapData *bitmapData = new BitmapData();
  73. return_val_if_fail(thiz != NULL && thiz->data != NULL, 0);
  74. bitmap = (Bitmap*)thiz->data;
  75. #ifdef VC6
  76. bitmap->LockBits(r, ImageLockModeRead, PixelFormat32bppARGB, bitmapData);
  77. #else
  78. bitmap->LockBits(&r, ImageLockModeRead, PixelFormat32bppARGB, bitmapData);
  79. #endif
  80. thiz->data2 = bitmapData;
  81. return (FtkColor*)bitmapData->Scan0;
  82. }
  83. void ftk_bitmap_unlock(FtkBitmap* thiz)
  84. {
  85. Bitmap* bitmap = NULL;
  86. BitmapData *bitmapData = NULL;
  87. return_val_if_fail(thiz != NULL && thiz->data != NULL, 0);
  88. bitmap = (Bitmap*)thiz->data;
  89. bitmapData = (BitmapData)thiz->data2;
  90. bitmap->UnlockBits(bitmapData);
  91. delete bitmapData;
  92. thiz->data2 = NULL;
  93. return;
  94. }
  95. FtkColor ftk_bitmap_get_pixel(FtkBitmap* thiz, int x, int y)
  96. {
  97. FtkColor c;
  98. Color cc = {0};
  99. Bitmap* bitmap = NULL;
  100. return_val_if_fail(thiz != NULL && thiz->data != NULL
  101. && x < ftk_bitmap_width(thiz) && y < ftk_bitmap_height(thiz), c);
  102. bitmap = (Bitmap*)thiz->data;
  103. bitmap->GetPixel(x, y, &cc);
  104. c.a = cc.GetA();
  105. c.r = cc.GetR();
  106. c.g = cc.GetG();
  107. c.b = cc.GetB();
  108. return c;
  109. }
  110. void ftk_bitmap_destroy(FtkBitmap* thiz)
  111. {
  112. if(thiz != NULL)
  113. {
  114. Bitmap* bitmap = (Bitmap*)thiz->data;
  115. if(bitmap != NULL)
  116. {
  117. delete bitmap;
  118. }
  119. if(thiz->data1 != NULL)
  120. {
  121. FTK_FREE(thiz->data1);
  122. }
  123. FTK_ZFREE(thiz, sizeof(FtkBitmap));
  124. }
  125. return;
  126. }