sanity.c 6.33 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* The GIMP -- an image manipulation program
 * Copyright (C) 1995 Spencer Kimball and Peter Mattis
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#include "config.h"

21
#include <glib.h>
22
23
24
#include <fontconfig/fontconfig.h>
#include <pango/pangoft2.h>

25
26
#include "libgimpbase/gimpenv.h"

27
28
#include "sanity.h"

29
30
#include "gimp-intl.h"

31

32
33
34
35
36
static gchar * sanity_check_glib              (void);
static gchar * sanity_check_fontconfig        (void);
static gchar * sanity_check_freetype          (void);
static gchar * sanity_check_filename_encoding (void);

37

38
/*  public functions  */
39

40
const gchar *
41
sanity_check (void)
42
{
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  gchar *abort_message = sanity_check_glib ();

  if (! abort_message)
    abort_message = sanity_check_fontconfig ();

  if (! abort_message)
    abort_message = sanity_check_freetype ();

  if (! abort_message)
    abort_message = sanity_check_filename_encoding ();

  return abort_message;
}


/*  private functions  */

static gchar *
sanity_check_glib (void)
{
  const gchar *mismatch;

#define GLIB_REQUIRED_MAJOR 2
Michael Natterer's avatar
Michael Natterer committed
66
#define GLIB_REQUIRED_MINOR 8
67
#define GLIB_REQUIRED_MICRO 2
68

Michael Natterer's avatar
Michael Natterer committed
69
70
71
  mismatch = glib_check_version (GLIB_REQUIRED_MAJOR,
                                 GLIB_REQUIRED_MINOR,
                                 GLIB_REQUIRED_MICRO);
72
73
74
75
76

  if (mismatch)
    {
      return g_strdup_printf
        ("%s\n\n"
Sven Neumann's avatar
Sven Neumann committed
77
         "GIMP requires GLib version %d.%d.%d or later.\n"
78
         "Installed GLib version is %d.%d.%d.\n\n"
79
         "Somehow you or your software packager managed\n"
Sven Neumann's avatar
Sven Neumann committed
80
         "to install GIMP with an older GLib version.\n\n"
81
         "Please upgrade to GLib version %d.%d.%d or later.",
82
83
84
85
86
         mismatch,
         GLIB_REQUIRED_MAJOR, GLIB_REQUIRED_MINOR, GLIB_REQUIRED_MICRO,
         glib_major_version, glib_minor_version, glib_micro_version,
         GLIB_REQUIRED_MAJOR, GLIB_REQUIRED_MINOR, GLIB_REQUIRED_MICRO);
    }
87

88
89
90
91
92
93
94
95
96
97
#undef GLIB_REQUIRED_MAJOR
#undef GLIB_REQUIRED_MINOR
#undef GLIB_REQUIRED_MICRO

  return NULL;
}

static gchar *
sanity_check_fontconfig (void)
{
98
99
100
101
  gint   fc_version       = FcGetVersion ();
  gint   fc_major_version = fc_version / 100 / 100;
  gint   fc_minor_version = fc_version / 100 % 100;
  gint   fc_micro_version = fc_version % 100;
102
103
104
105
106

#define FC_REQUIRED_MAJOR 2
#define FC_REQUIRED_MINOR 2
#define FC_REQUIRED_MICRO 0

107
108
109
110
  if (fc_version < ((FC_REQUIRED_MAJOR * 10000) +
                    (FC_REQUIRED_MINOR *   100) +
                    (FC_REQUIRED_MICRO *     1)))
    {
111
      return g_strdup_printf
112
        ("The Fontconfig version being used is too old!\n\n"
Sven Neumann's avatar
Sven Neumann committed
113
114
         "GIMP requires Fontconfig version %d.%d.%d or later.\n"
         "The Fontconfig version loaded by GIMP is %d.%d.%d.\n\n"
115
116
117
118
119
120
         "This may be caused by another instance of libfontconfig.so.1\n"
         "being installed in the system, probably in /usr/X11R6/lib.\n"
         "Please correct the situation or report it to someone who can.",
         FC_REQUIRED_MAJOR, FC_REQUIRED_MINOR, FC_REQUIRED_MICRO,
         fc_major_version, fc_minor_version, fc_micro_version);
    }
121
122
123
124

#undef FC_REQUIRED_MAJOR
#undef FC_REQUIRED_MINOR
#undef FC_REQUIRED_MICRO
125

126
127
  return NULL;
}
128

129
130
131
132
133
134
135
136
static gchar *
sanity_check_freetype (void)
{
  FT_Library ft_library;
  FT_Int     ft_major_version;
  FT_Int     ft_minor_version;
  FT_Int     ft_micro_version;
  FT_Int     ft_version;
137
138
139
140
141

#define FT_REQUIRED_MAJOR 2
#define FT_REQUIRED_MINOR 1
#define FT_REQUIRED_MICRO 7

142
143
144
145
146
147
148
  if (FT_Init_FreeType (&ft_library) != 0)
    g_error ("FT_Init_FreeType() failed");

  FT_Library_Version (ft_library,
                      &ft_major_version,
                      &ft_minor_version,
                      &ft_micro_version);
149

150
151
152
153
154
155
156
157
158
159
160
161
162
  if (FT_Done_FreeType (ft_library) != 0)
    g_error ("FT_Done_FreeType() failed");

  ft_version = (ft_major_version * 10000 +
                ft_minor_version *   100 +
                ft_micro_version *     1);

  if (ft_version < ((FT_REQUIRED_MAJOR * 10000) +
                    (FT_REQUIRED_MINOR *   100) +
                    (FT_REQUIRED_MICRO *     1)))
    {
      return g_strdup_printf
        ("FreeType version too old!\n\n"
Sven Neumann's avatar
Sven Neumann committed
163
         "GIMP requires FreeType version %d.%d.%d or later.\n"
164
165
         "Installed FreeType version is %d.%d.%d.\n\n"
         "Somehow you or your software packager managed\n"
Sven Neumann's avatar
Sven Neumann committed
166
         "to install GIMP with an older FreeType version.\n\n"
167
168
169
170
171
         "Please upgrade to FreeType version %d.%d.%d or later.",
         FT_REQUIRED_MAJOR, FT_REQUIRED_MINOR, FT_REQUIRED_MICRO,
         ft_major_version, ft_minor_version, ft_micro_version,
         FT_REQUIRED_MAJOR, FT_REQUIRED_MINOR, FT_REQUIRED_MICRO);
    }
172
173
174
175
176

#undef FT_REQUIRED_MAJOR
#undef FT_REQUIRED_MINOR
#undef FT_REQUIRED_MICRO

177
  return NULL;
178
}
179
180
181
182
183
184
185

static gchar *
sanity_check_filename_encoding (void)
{
  gchar  *result;
  GError *error = NULL;

186
  result = g_filename_to_utf8 ("", -1, NULL, NULL, &error);
187

188
  if (! result)
189
    {
190
191
192
193
194
195
196
197
198
      gchar *msg =
        g_strdup_printf
        (_("The configured filename encoding cannot be converted to UTF-8: "
           "%s\n\n"
           "Please check the value of the environment variable "
           "G_FILENAME_ENCODING."),
         error->message);

      g_error_free (error);
199

200
      return msg;
201
    }
202
203
204
205
206
207

  g_free (result);

  result = g_filename_to_utf8 (gimp_directory (), -1, NULL, NULL, &error);

  if (! result)
208
209
210
    {
      gchar *msg =
        g_strdup_printf
211
212
213
        (_("The name of the directory holding the GIMP user configuration "
           "cannot be converted to UTF-8: "
           "%s\n\n"
214
215
           "Your filesystem probably stores files in an encoding "
           "other than UTF-8 and you didn't tell GLib about this. "
216
           "Please set the environment variable G_FILENAME_ENCODING."),
217
218
219
220
221
222
         error->message);

      g_error_free (error);

      return msg;
    }
223
224
225
226

  g_free (result);

  return NULL;
227
}