aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/evas/src/modules/savers/tiff/evas_image_save_tiff.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/evas/src/modules/savers/tiff/evas_image_save_tiff.c')
-rw-r--r--libraries/evas/src/modules/savers/tiff/evas_image_save_tiff.c139
1 files changed, 139 insertions, 0 deletions
diff --git a/libraries/evas/src/modules/savers/tiff/evas_image_save_tiff.c b/libraries/evas/src/modules/savers/tiff/evas_image_save_tiff.c
new file mode 100644
index 0000000..8148f51
--- /dev/null
+++ b/libraries/evas/src/modules/savers/tiff/evas_image_save_tiff.c
@@ -0,0 +1,139 @@
1#include "evas_common.h"
2#include "evas_private.h"
3
4#include <tiffio.h>
5
6static int evas_image_save_file_tiff(RGBA_Image *im, const char *file, const char *key, int quality, int compress);
7
8static Evas_Image_Save_Func evas_image_save_tiff_func =
9{
10 evas_image_save_file_tiff
11};
12
13static int
14save_image_tiff(RGBA_Image *im, const char *file, int compress __UNUSED__, int interlace __UNUSED__)
15{
16 TIFF *tif = NULL;
17 uint8 *buf = NULL;
18 DATA32 pixel;
19 DATA32 *data;
20 uint32 x, y;
21 uint8 r, g, b, a = 0;
22 int i = 0;
23 int has_alpha;
24
25 if (!im || !im->image.data || !file)
26 return 0;
27
28 has_alpha = im->cache_entry.flags.alpha;
29 data = im->image.data;
30
31 tif = TIFFOpen(file, "w");
32 if (!tif)
33 return 0;
34
35 /* None of the TIFFSetFields are checked for errors, but since they */
36 /* shouldn't fail, this shouldn't be a problem */
37
38 TIFFSetField(tif, TIFFTAG_IMAGELENGTH, im->cache_entry.h);
39 TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, im->cache_entry.w);
40 TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
41 TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
42 TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
43 TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE);
44
45 /* By default uses patent-free use COMPRESSION_DEFLATE,
46 * another lossless compression technique */
47 TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE);
48
49 if (has_alpha)
50 {
51 uint16 extras[] = { EXTRASAMPLE_ASSOCALPHA };
52 TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 4);
53 TIFFSetField(tif, TIFFTAG_EXTRASAMPLES, 1, extras);
54 }
55 else
56 {
57 TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3);
58 }
59
60 TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
61 TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, 0));
62
63 buf = (uint8 *) _TIFFmalloc(TIFFScanlineSize(tif));
64 if (!buf)
65 {
66 TIFFClose(tif);
67 return 0;
68 }
69
70 for (y = 0; y < im->cache_entry.h; y++)
71 {
72 i = 0;
73 for (x = 0; x < im->cache_entry.w; x++)
74 {
75 pixel = data[(y * im->cache_entry.w) + x];
76
77 r = (pixel >> 16) & 0xff;
78 g = (pixel >> 8) & 0xff;
79 b = pixel & 0xff;
80 if (has_alpha)
81 a = (pixel >> 24) & 0xff;
82
83 /* This might be endian dependent */
84 buf[i++] = r;
85 buf[i++] = g;
86 buf[i++] = b;
87 if (has_alpha)
88 buf[i++] = a;
89 }
90
91 if (!TIFFWriteScanline(tif, buf, y, 0))
92 {
93 _TIFFfree(buf);
94 TIFFClose(tif);
95 return 0;
96 }
97 }
98
99 _TIFFfree(buf);
100 TIFFClose(tif);
101
102 return 1;
103}
104
105static int evas_image_save_file_tiff(RGBA_Image *im, const char *file, const char *key __UNUSED__, int quality __UNUSED__, int compress)
106{
107 return save_image_tiff(im, file, compress, 0);
108}
109
110static int
111module_open(Evas_Module *em)
112{
113 if (!em) return 0;
114 em->functions = (void *)(&evas_image_save_tiff_func);
115 return 1;
116}
117
118static void
119module_close(Evas_Module *em __UNUSED__)
120{
121}
122
123static Evas_Module_Api evas_modapi =
124{
125 EVAS_MODULE_API_VERSION,
126 "tiff",
127 "none",
128 {
129 module_open,
130 module_close
131 }
132};
133
134EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_SAVER, image_saver, tiff);
135
136#ifndef EVAS_STATIC_BUILD_TIFF
137EVAS_EINA_MODULE_DEFINE(image_saver, tiff);
138#endif
139