homebrew-core/Formula/ghostscript.rb
CharlieRoot 619bec9327 Ghostscript: fix build on 10.7
Fix Ghostscript build with system libpng 1.5 plus make it use system expat and
freetype2 and homebrew jasper and libtiff Do not try to use system freetype if
OS version is below 10.7

Signed-off-by: Adam Vandenberg <flangy@gmail.com>
2011-08-04 09:29:50 -07:00

249 lines
8.2 KiB
Ruby

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;