]> Pileus Git - ~andy/gtk/blob - gdk-pixbuf/io-gdip-jpeg.c
8bd3058606239dbacb445da1fda602fe4cca3e3a
[~andy/gtk] / gdk-pixbuf / io-gdip-jpeg.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\r
2 /* GdkPixbuf library - Win32 GDI+ Pixbuf Loader\r
3  *\r
4  * Copyright (C) 2008 Dominic Lachowicz\r
5  * Copyright (C) 2008 Alberto Ruiz\r
6  *\r
7  * Authors: Dominic Lachowicz <domlachowicz@gmail.com>\r
8  *          Alberto Ruiz <aruiz@gnome.org>\r
9  *\r
10  * This library is free software; you can redistribute it and/or\r
11  * modify it under the terms of the GNU Lesser General Public\r
12  * License as published by the Free Software Foundation; either\r
13  * version 2 of the License, or (at your option) any later version.\r
14  *\r
15  * This library is distributed in the hope that it will be useful,\r
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
18  * Lesser General Public License for more  * You should have received a copy of the GNU Lesser General Public\r
19  * License along with this library; if not, write to the\r
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,\r
21  * Boston, MA 02111-1307, USA.\r
22  */\r
23 \r
24 #define INITGUID\r
25 #include "io-gdip-utils.h"\r
26 \r
27 DEFINE_GUID(EncoderQuality, 0x1d5be4b5,0xfa4a,0x452d,0x9c,0xdd,0x5d,0xb3,0x51,0x05,0xe7,0xeb);\r
28 \r
29 static gboolean\r
30 gdk_pixbuf__gdip_image_save_JPEG_to_callback (GdkPixbufSaveFunc   save_func,\r
31                                               gpointer            user_data,\r
32                                               GdkPixbuf          *pixbuf,\r
33                                               gchar             **keys,\r
34                                               gchar             **values,\r
35                                               GError            **error)\r
36 {\r
37   EncoderParameters encoder_params;\r
38   LONG quality = 75; /* default; must be between 0 and 100 */\r
39 \r
40   if (keys && *keys) {\r
41     gchar **kiter = keys;\r
42     gchar **viter = values;\r
43     \r
44     while (*kiter) {\r
45       if (strcmp (*kiter, "quality") == 0) {\r
46         char *endptr = NULL;\r
47         quality = strtol (*viter, &endptr, 10);\r
48         \r
49         if (endptr == *viter) {\r
50           g_set_error (error,\r
51                        GDK_PIXBUF_ERROR,\r
52                        GDK_PIXBUF_ERROR_BAD_OPTION,\r
53                        _("JPEG quality must be a value between 0 and 100; value '%s' could not be parsed."),\r
54                        *viter);\r
55           \r
56           return FALSE;\r
57         }\r
58         \r
59         if (quality < 0 ||\r
60             quality > 100) {\r
61           /* This is a user-visible error;\r
62            * lets people skip the range-checking\r
63            * in their app.\r
64            */\r
65           g_set_error (error,\r
66                        GDK_PIXBUF_ERROR,\r
67                        GDK_PIXBUF_ERROR_BAD_OPTION,\r
68                        _("JPEG quality must be a value between 0 and 100; value '%d' is not allowed."),\r
69                        (int)quality);\r
70           \r
71           return FALSE;\r
72         }\r
73       } else {\r
74         g_warning ("Unrecognized parameter (%s) passed to JPEG saver.", *kiter);\r
75       }\r
76       \r
77       ++kiter;\r
78       ++viter;\r
79     }\r
80   }\r
81 \r
82   encoder_params.Count = 1;\r
83   encoder_params.Parameter[0].Guid = EncoderQuality;\r
84   encoder_params.Parameter[0].Type = EncoderParameterValueTypeLong;\r
85   encoder_params.Parameter[0].NumberOfValues = 1;\r
86   encoder_params.Parameter[0].Value = &quality;\r
87      \r
88   return gdip_save_pixbuf (pixbuf, L"image/jpeg", &encoder_params, save_func, user_data, error);\r
89 }\r
90 \r
91 static gboolean\r
92 gdk_pixbuf__gdip_image_save_JPEG (FILE         *f,\r
93                                  GdkPixbuf     *pixbuf,\r
94                                  gchar        **keys,\r
95                                  gchar        **values,\r
96                                  GError       **error)\r
97 {\r
98   return gdk_pixbuf__gdip_image_save_JPEG_to_callback (gdip_save_to_file_callback, f, pixbuf, keys, values, error);\r
99 }\r
100 \r
101 #ifndef INCLUDE_gdiplus\r
102 #define MODULE_ENTRY(function) G_MODULE_EXPORT void function\r
103 #else\r
104 #define MODULE_ENTRY(function) void _gdk_pixbuf__gdip_jpeg_ ## function\r
105 #endif\r
106 \r
107 MODULE_ENTRY (fill_vtable) (GdkPixbufModule *module)\r
108 {\r
109   gdip_fill_vtable (module);\r
110 \r
111   module->save_to_callback = gdk_pixbuf__gdip_image_save_JPEG_to_callback;\r
112   module->save = gdk_pixbuf__gdip_image_save_JPEG; /* for gtk < 2.14, you need to implement both. otherwise gdk-pixbuf-queryloaders fails */\r
113 }\r
114 \r
115 MODULE_ENTRY (fill_info) (GdkPixbufFormat *info)\r
116 {\r
117   static GdkPixbufModulePattern signature[] = {\r
118     { "\xff\xd8", NULL, 100 }, /* JPEG */\r
119     { NULL, NULL, 0 }\r
120   };\r
121 \r
122   static gchar *mime_types[] = {\r
123     "image/jpeg",\r
124     NULL\r
125   };\r
126 \r
127   static gchar *extensions[] = {\r
128     "jpeg",\r
129     "jpe",\r
130     "jpg",\r
131     NULL\r
132   };\r
133 \r
134   info->name        = "jpeg";\r
135   info->signature   = signature;\r
136   info->description = _("The JPEG image format");\r
137   info->mime_types  = mime_types;\r
138   info->extensions  = extensions;\r
139   info->flags       = GDK_PIXBUF_FORMAT_WRITABLE | GDK_PIXBUF_FORMAT_THREADSAFE;\r
140   info->license     = "LGPL";\r
141 }\r