/src/os/wince/ftk_image_wince_decoder.cpp

http://ftk.googlecode.com/ · C++ · 127 lines · 117 code · 10 blank · 0 comment · 25 complexity · 8cb046b846282f709784b9baa5ea489e MD5 · raw file

  1. #include "ftk_wince.h"
  2. #include "ftk_image_wince_decoder.h"
  3. #include "ftk_log.h"
  4. #include <initguid.h>
  5. #include <Imaging.h>
  6. static Ret ftk_image_wince_decoder_match(FtkImageDecoder* thiz, const char* filename)
  7. {
  8. return_val_if_fail(filename != NULL, RET_FAIL);
  9. return (strstr(filename, "bmp") != NULL
  10. || strstr(filename, ".png") != NULL
  11. || strstr(filename, ".jpg") != NULL
  12. || strstr(filename, ".jpeg") != NULL) ? RET_OK : RET_FAIL;
  13. }
  14. static FtkBitmap* load_image(const char *filename)
  15. {
  16. int x = 0;
  17. int y = 0;
  18. int w = 0;
  19. int h = 0;
  20. FtkColor bg = {0};
  21. FtkBitmap* bitmap = NULL;
  22. HRESULT hr;
  23. IImagingFactory *img_factory = NULL;
  24. IImage *img = NULL;
  25. IBitmapImage *bmp = NULL;
  26. SIZE size;
  27. BitmapData bmp_data;
  28. RECT rect;
  29. wchar_t buf[MAX_PATH];
  30. if (MultiByteToWideChar(CP_ACP, 0, filename, -1, buf, MAX_PATH) == 0)
  31. {
  32. return NULL;
  33. }
  34. hr = CoCreateInstance(CLSID_ImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IImagingFactory, (void **) &img_factory);
  35. if (FAILED(hr))
  36. {
  37. ftk_loge("CoCreateInstance(CLSID_ImagingFactory) failed\n");
  38. return NULL;
  39. }
  40. hr = img_factory->CreateImageFromFile(buf, &img);
  41. if (FAILED(hr))
  42. {
  43. ftk_loge("CreateImageFromFile() failed (%s)\n", filename);
  44. img_factory->Release();
  45. return NULL;
  46. }
  47. hr = img_factory->CreateBitmapFromImage(img, 0, 0, PixelFormatDontCare, InterpolationHintDefault, &bmp);
  48. if (FAILED(hr))
  49. {
  50. ftk_loge("CreateBitmapFromImage() failed\n");
  51. img->Release();
  52. img_factory->Release();
  53. return NULL;
  54. }
  55. size.cx = 0;
  56. size.cy = 0;
  57. hr = bmp->GetSize(&size);
  58. if (FAILED(hr))
  59. {
  60. ftk_loge("GetSize() failed\n");
  61. }
  62. if (size.cx == 0 || size.cy == 0)
  63. {
  64. bmp->Release();
  65. img->Release();
  66. img_factory->Release();
  67. return NULL;
  68. }
  69. w = size.cx;
  70. h = size.cy;
  71. bg.a = 0xff;
  72. bitmap = ftk_bitmap_create(w, h, bg);
  73. rect.left = 0;
  74. rect.top = 0;
  75. rect.right = w;
  76. rect.bottom = h;
  77. hr = bmp->LockBits(&rect, ImageLockModeRead, PixelFormat32bppARGB, &bmp_data);
  78. FtkColor* src = (FtkColor*)bmp_data.Scan0;
  79. FtkColor* dst = ftk_bitmap_lock(bitmap);
  80. for(y = 0; y < h; y++)
  81. {
  82. for(x = 0; x < w; x++)
  83. {
  84. *dst = *src;
  85. dst++;
  86. src++;
  87. }
  88. }
  89. hr = bmp->UnlockBits(&bmp_data);
  90. bmp->Release();
  91. img->Release();
  92. img_factory->Release();
  93. return bitmap;
  94. }
  95. static FtkBitmap* ftk_image_wince_decoder_decode(FtkImageDecoder* thiz, const char* filename)
  96. {
  97. return_val_if_fail(ftk_image_wince_decoder_match(thiz, filename) == RET_OK, NULL);
  98. return load_image(filename);
  99. }
  100. static void ftk_image_wince_decoder_destroy(FtkImageDecoder* thiz)
  101. {
  102. if(thiz != NULL)
  103. {
  104. FTK_ZFREE(thiz, sizeof(thiz));
  105. }
  106. }
  107. FtkImageDecoder* ftk_image_wince_decoder_create(void)
  108. {
  109. FtkImageDecoder* thiz = (FtkImageDecoder*)FTK_ZALLOC(sizeof(FtkImageDecoder));
  110. if(thiz != NULL)
  111. {
  112. thiz->match = ftk_image_wince_decoder_match;
  113. thiz->decode = ftk_image_wince_decoder_decode;
  114. thiz->destroy = ftk_image_wince_decoder_destroy;
  115. }
  116. return thiz;
  117. }