X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpdf-scheme.cc;h=61cf382e6b45e21955f87d34df57609fc39b48a7;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=c0cfa8d9872b1218ca730efad15306e2f9f557da;hpb=0c61221b46addec50e2406e04af44a7d460443d4;p=lilypond.git diff --git a/lily/pdf-scheme.cc b/lily/pdf-scheme.cc index c0cfa8d987..61cf382e6b 100644 --- a/lily/pdf-scheme.cc +++ b/lily/pdf-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011 Reinhold Kainhofer + Copyright (C) 2011--2015 Reinhold Kainhofer LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,10 +36,25 @@ LY_DEFINE (ly_encode_string_for_pdf, "ly:encode-string-for-pdf", char const *charset = "UTF-8"; // Input is ALWAYS UTF-8! gsize bytes_written = 0; +#if 0 + /* First, try to convert to ISO-8859-1 (no encodings required). This will * fail, if the string contains accented characters, so we do not check * for errors. */ g = g_convert (p, -1, "ISO-8859-1", charset, 0, &bytes_written, 0); + +#else + + /* In contrast to the above comment, we do _not_ try full ISO-8859-1 + * since a number of Ghostscript versions fail to properly convert + * this into PDF. UTF-16BE, in contrast, works better with recent + * versions of Ghostscript. + */ + + g = g_convert (p, -1, "ASCII", charset, 0, &bytes_written, 0); + +#endif + /* If that fails, we have to resolve to full UTF-16BE */ if (!g) { @@ -69,14 +84,16 @@ LY_DEFINE (ly_encode_string_for_pdf, "ly:encode-string-for-pdf", free (p); /* Convert back to SCM object and return it */ - /* FIXME guile-2.0: With guile 2.0 the internal representation of a string - * has changed (char vector rather than binary bytes in - * UTF-8). However, with guile 2.0, ly:encode-string-for-pdf - * is no longer needed and can be replaced by the new - * (string->utf16 str 'big) - */ if (g) - return scm_take_str (g, bytes_written); // scm_take_str eventually frees g! + { + /* + * Return the raw byte representation of the UTF-16BE encoded string, + * in a locale independent way. + */ + SCM string = scm_from_latin1_stringn (g, bytes_written); + free(g); + return string; + } else return str; }