/src/os/gtk/ftk_image_gtk_decoder.c

http://ftk.googlecode.com/ · C · 100 lines · 82 code · 17 blank · 1 comment · 26 complexity · 19f79855cd8bbe16d32a3495331fd42e MD5 · raw file

  1. #include "ftk_typedef.h"
  2. #include "ftk_log.h"
  3. #include "ftk_image_gtk_decoder.h"
  4. #include <gdk-pixbuf/gdk-pixbuf.h>
  5. static Ret ftk_image_gtk_decoder_match(FtkImageDecoder* thiz, const char* filename)
  6. {
  7. return_val_if_fail(thiz != NULL && filename != NULL, RET_FAIL);
  8. return (strstr(filename, "bmp") != NULL
  9. || strstr(filename, ".png") != NULL
  10. || strstr(filename, ".jpg") != NULL
  11. || strstr(filename, ".jpeg") != NULL) ? RET_OK : RET_FAIL;
  12. }
  13. static FtkBitmap* ftk_image_gtk_decoder_decode(FtkImageDecoder* thiz, const char* filename)
  14. {
  15. int x = 0;
  16. int y = 0;
  17. int w = 0;
  18. int h = 0;
  19. FtkColor bg = {0};
  20. FtkBitmap* bitmap = NULL;
  21. FtkColor* src = NULL;
  22. FtkColor* dst = NULL;
  23. int bpp = 0;
  24. GError *error = NULL;
  25. GdkPixbuf* img = NULL;
  26. return_val_if_fail(thiz != NULL && filename != NULL, NULL);
  27. img = gdk_pixbuf_new_from_file(filename, &error);
  28. if(img == NULL)
  29. {
  30. ftk_loge("gdk_pixbuf_new_from_file() \"%s\" failed\n", filename);
  31. return NULL;
  32. }
  33. w = gdk_pixbuf_get_width(img);
  34. h = gdk_pixbuf_get_height(img);
  35. bpp = gdk_pixbuf_get_rowstride(img) / w * 8;
  36. bg.a = 0xff;
  37. bitmap = ftk_bitmap_create(w, h, bg);
  38. src = (FtkColor*)gdk_pixbuf_get_pixels(img);
  39. dst = ftk_bitmap_lock(bitmap);
  40. ftk_logd("ftk_image_gtk_decoder_decode() bpp:%d\n", bpp);
  41. // TODO: bpp
  42. for(y = 0; y < h; y++)
  43. {
  44. for(x = 0; x < w; x++)
  45. {
  46. if(bpp == 32)
  47. {
  48. *dst = *src;
  49. dst++;
  50. src++;
  51. }
  52. else if(bpp == 24)
  53. {
  54. dst->b = src->b;
  55. dst->g = src->g;
  56. dst->r = src->r;
  57. dst->a = 0xff;
  58. dst++;
  59. src = (FtkColor*)((unsigned char*)src + 3);
  60. }
  61. }
  62. }
  63. g_object_unref(img);
  64. return bitmap;
  65. }
  66. static void ftk_image_gtk_decoder_destroy(FtkImageDecoder* thiz)
  67. {
  68. if(thiz != NULL)
  69. {
  70. FTK_ZFREE(thiz, sizeof(FtkImageDecoder));
  71. }
  72. }
  73. FtkImageDecoder* ftk_image_gtk_decoder_create(void)
  74. {
  75. FtkImageDecoder* thiz = (FtkImageDecoder*)FTK_ZALLOC(sizeof(FtkImageDecoder));
  76. if(thiz != NULL)
  77. {
  78. thiz->match = ftk_image_gtk_decoder_match;
  79. thiz->decode = ftk_image_gtk_decoder_decode;
  80. thiz->destroy = ftk_image_gtk_decoder_destroy;
  81. }
  82. return thiz;
  83. }