aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Formula/ghostscript.rb
blob: 9f17167c0dfe48d807c5bb5aed34fa58219cd13b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
require 'formula'

class GhostscriptFonts < Formula
  url 'http://downloads.sourceforge.net/project/gs-fonts/gs-fonts/8.11%20%28base%2035%2C%20GPL%29/ghostscript-fonts-std-8.11.tar.gz'
  homepage 'http://sourceforge.net/projects/gs-fonts/'
  md5 '6865682b095f8c4500c54b285ff05ef6'
end

class Ghostscript < Formula
  url 'http://downloads.ghostscript.com/public/ghostscript-9.02.tar.bz2'
  homepage 'http://www.ghostscript.com/'
  md5 'f67151444bd56a7904579fc75a083dd6'

  depends_on 'pkg-config' => :build
  depends_on 'jpeg'
  depends_on 'libtiff'
  depends_on 'jasper'

  # The patches fix compilation against libpng 1.5, provided by Lion.
  # Patch by @CharlieRoot
  def patches
    DATA
  end

  def move_included_source_copies
    # If the install version of any of these doesn't match
    # the version included in ghostscript, we get errors
    # Taken from the MacPorts portfile - http://bit.ly/ghostscript-portfile
    renames = [ "jpeg", "libpng", "zlib", "jasper", "expat", "tiff" ]
    renames << "freetype" if 10.7 <= MACOS_VERSION
    renames.each do |lib|
      mv lib, "#{lib}_local"
    end
  end

  def install
    ENV.libpng
    ENV.deparallelize
    # O4 takes an ungodly amount of time
    ENV.O3
    # ghostscript configure ignores LDFLAGs apparently
    ENV['LIBS']="-L/usr/X11/lib"

    move_included_source_copies

    system "./configure", "--prefix=#{prefix}", "--disable-debug",
                          # the cups component adamantly installs to /usr so fuck it
                          "--disable-cups",
                          "--disable-compile-inits",
                          "--disable-gtk"

    # versioned stuff in main tree is pointless for us
    inreplace 'Makefile', '/$(GS_DOT_VERSION)', ''
    system "make install"

    GhostscriptFonts.new.brew do
      Dir.chdir '..'
      (share+'ghostscript').install 'fonts'
    end

    (man+'de').rmtree
  end
end

__END__
diff --git a/base/gdevpng.c b/base/gdevpng.c
index f58c4eb..3477fe3 100644
--- a/base/gdevpng.c
+++ b/base/gdevpng.c
@@ -274,13 +274,30 @@ png_print_page(gx_device_printer * pdev, FILE * file)
     char software_key[80];
     char software_text[256];
     png_text text_png;
+#if PNG_LIBPNG_VER >= 10500
+    int color_type = 0;
+    png_color* palette = NULL;
+#define PNG_SET_IHDR(bit, color) \
+    png_set_IHDR(png_ptr, info_ptr, pdev->width, pdev->height, (bit), (color_type = (color)), \
+                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+#define COLOR_TYPE color_type
+#define PALETTE palette
+#define PNG_JMPBUF png_jmpbuf(png_ptr)
+#else
+#define PNG_SET_IHDR(bit, color) \
+    info_ptr->bit_depth = (bit); \
+    info_ptr->color_type = (color);
+#define COLOR_TYPE info_ptr->color_type
+#define PALETTE info_ptr->palette
+#define PNG_JMPBUF png_ptr->jmpbuf
+#endif
 
     if (row == 0 || png_ptr == 0 || info_ptr == 0) {
 	code = gs_note_error(gs_error_VMerror);
 	goto done;
     }
     /* set error handling */
-    if (setjmp(png_ptr->jmpbuf)) {
+    if (setjmp(PNG_JMPBUF)) {
 	/* If we get here, we had a problem reading the file */
 	code = gs_note_error(gs_error_VMerror);
 	goto done;
@@ -289,6 +306,12 @@ png_print_page(gx_device_printer * pdev, FILE * file)
     /* set up the output control */
     png_init_io(png_ptr, file);
 
+#if PNG_LIBPNG_VER >= 10500
+    png_set_pHYs(png_ptr, info_ptr, 
+                 (png_uint_32) (pdev->HWResolution[0] * (100.0 / 2.54)),
+                 (png_uint_32) (pdev->HWResolution[1] * (100.0 / 2.54)),
+                 PNG_RESOLUTION_METER);
+#else
     /* set the file information here */
     info_ptr->width = pdev->width;
     info_ptr->height = pdev->height;
@@ -299,10 +322,10 @@ png_print_page(gx_device_printer * pdev, FILE * file)
 	(png_uint_32) (pdev->HWResolution[1] * (100.0 / 2.54));
     info_ptr->phys_unit_type = PNG_RESOLUTION_METER;
     info_ptr->valid |= PNG_INFO_pHYs;
+#endif
     switch (depth) {
 	case 32:
-	    info_ptr->bit_depth = 8;
-	    info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
+        PNG_SET_IHDR(8, PNG_COLOR_TYPE_RGB_ALPHA);
 	    png_set_invert_alpha(png_ptr);
 	    {   gx_device_pngalpha *ppdev = (gx_device_pngalpha *)pdev;
 		png_color_16 background;
@@ -315,75 +338,78 @@ png_print_page(gx_device_printer * pdev, FILE * file)
 	    }
 	    break;
 	case 48:
-	    info_ptr->bit_depth = 16;
-	    info_ptr->color_type = PNG_COLOR_TYPE_RGB;
+        PNG_SET_IHDR(16, PNG_COLOR_TYPE_RGB);
 #if defined(ARCH_IS_BIG_ENDIAN) && (!ARCH_IS_BIG_ENDIAN) 
 	    png_set_swap(png_ptr);
 #endif
 	    break;
 	case 24:
-	    info_ptr->bit_depth = 8;
-	    info_ptr->color_type = PNG_COLOR_TYPE_RGB;
+        PNG_SET_IHDR(8, PNG_COLOR_TYPE_RGB);
 	    break;
 	case 8:
-	    info_ptr->bit_depth = 8;
-	    if (gx_device_has_color(pdev))
-		info_ptr->color_type = PNG_COLOR_TYPE_PALETTE;
-	    else
-		info_ptr->color_type = PNG_COLOR_TYPE_GRAY;
+        PNG_SET_IHDR(8, (gx_device_has_color(pdev) ? PNG_COLOR_TYPE_PALETTE : PNG_COLOR_TYPE_GRAY));
 	    break;
 	case 4:
-	    info_ptr->bit_depth = 4;
-	    info_ptr->color_type = PNG_COLOR_TYPE_PALETTE;
+        PNG_SET_IHDR(4, PNG_COLOR_TYPE_PALETTE);
 	    break;
 	case 1:
-	    info_ptr->bit_depth = 1;
-	    info_ptr->color_type = PNG_COLOR_TYPE_GRAY;
+        PNG_SET_IHDR(1, PNG_COLOR_TYPE_GRAY);
 	    /* invert monocrome pixels */
 	    png_set_invert_mono(png_ptr);
 	    break;
     }
 
     /* set the palette if there is one */
-    if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) {
+    if (COLOR_TYPE == PNG_COLOR_TYPE_PALETTE) {
 	int i;
 	int num_colors = 1 << depth;
 	gx_color_value rgb[3];
 
-	info_ptr->palette =
+	PALETTE =
 	    (void *)gs_alloc_bytes(mem, 256 * sizeof(png_color),
 				   "png palette");
-	if (info_ptr->palette == 0) {
+	if (PALETTE == 0) {
 	    code = gs_note_error(gs_error_VMerror);
 	    goto done;
 	}
+#if PNG_LIBPNG_VER < 10500
 	info_ptr->num_palette = num_colors;
 	info_ptr->valid |= PNG_INFO_PLTE;
+#endif
 	for (i = 0; i < num_colors; i++) {
 	    (*dev_proc(pdev, map_color_rgb)) ((gx_device *) pdev,
 					      (gx_color_index) i, rgb);
-	    info_ptr->palette[i].red = gx_color_value_to_byte(rgb[0]);
-	    info_ptr->palette[i].green = gx_color_value_to_byte(rgb[1]);
-	    info_ptr->palette[i].blue = gx_color_value_to_byte(rgb[2]);
+	    PALETTE[i].red = gx_color_value_to_byte(rgb[0]);
+	    PALETTE[i].green = gx_color_value_to_byte(rgb[1]);
+	    PALETTE[i].blue = gx_color_value_to_byte(rgb[2]);
 	}
+#if PNG_LIBPNG_VER >= 10500
+    png_set_PLTE(png_ptr, info_ptr, PALETTE, num_colors);
+#endif
     }
     /* add comment */
     strncpy(software_key, "Software", sizeof(software_key));
     sprintf(software_text, "%s %d.%02d", gs_product,
 	    (int)(gs_revision / 100), (int)(gs_revision % 100));
-    text_png.compression = -1;	/* uncompressed */
+    text_png.compression = PNG_TEXT_COMPRESSION_NONE;	/* uncompressed */
     text_png.key = software_key;
     text_png.text = software_text;
     text_png.text_length = strlen(software_text);
+#if PNG_LIBPNG_VER >= 10500
+    png_set_text(png_ptr, info_ptr, &text_png, 1); 
+#else
     info_ptr->text = &text_png;
     info_ptr->num_text = 1;
+#endif
 
     /* write the file information */
     png_write_info(png_ptr, info_ptr);
 
+#if PNG_LIBPNG_VER < 10500
     /* don't write the comments twice */
     info_ptr->num_text = 0;
     info_ptr->text = NULL;
+#endif
 
     /* Write the contents of the image. */
     for (y = 0; y < height; y++) {
@@ -395,7 +421,7 @@ png_print_page(gx_device_printer * pdev, FILE * file)
     png_write_end(png_ptr, info_ptr);
 
     /* if you alloced the palette, free it here */
-    gs_free_object(mem, info_ptr->palette, "png palette");
+    gs_free_object(mem, PALETTE, "png palette");
 
   done:
     /* free the structures */
diff --git a/base/Makefile.in b/base/Makefile.in
index 5b7847d..85e1a32 100644
--- a/base/Makefile.in
+++ b/base/Makefile.in
@@ -362,7 +362,7 @@ LDFLAGS=@LDFLAGS@ $(XLDFLAGS)
 # Solaris may need -lnsl -lsocket -lposix4.
 # (Libraries required by individual drivers are handled automatically.)
 
-EXTRALIBS=@LIBS@ @DYNAMIC_LIBS@ @FONTCONFIG_LIBS@
+EXTRALIBS=@LIBS@ @DYNAMIC_LIBS@ @FONTCONFIG_LIBS@ @FT_LIBS@
 
 # Define the standard libraries to search at the end of linking.
 # Most platforms require -lpthread for the POSIX threads library;