README
1ABOUT libLASi
2=============
3
4The libLASi website is located at http://www.unifont.org/lasi/ with the project
5page located at http://sourceforge.net/projects/lasi.
6
7libLASi is a library that provides a C++ stream output interface (with
8operator<< ) to writing Postscript and Encapsulated Postscript documents
9containing any of the world's scripts supported by Unicode 4.0 and the Pango
10complex text layout engine. You can use any TrueType or OpenType fonts that
11you want. The library accomodates both left-to-right (e.g. most European
12languages) as well as right-to-left (e.g. Hebrew, Arabic) scripts, as well
13as Complex Text Layout (CTL) scripts such as Devanagari, Bengali, Thai, and
14other Indic and Indic-derived scripts. You can include any number of
15different scripts or languages in the same document without need for any
16special configuration or layout calculation on the programmer's part.
17libLASi accepts Unicode strings encoded in the UTF-8 transformation format
18which is the de facto standard on Linux and other *nix systems.
19
20Although Postscript printing capability exists in open-source toolkits such
21as Gnome and QT, libLASi was designed for projects that are independent of
22any one Graphic User Interface (GUI) toolkit or do not even make use of a
23GUI interface but still require the ability to produce Postscript output
24containing Unicode text.
25
26For installation instructions, see http://www.unifont.org/lasi/
27
28For example programs that uses libLASi, please see the examples
29directory located in the install tree at
30$prefix/share/lasi$version/examples where $prefix is the installation
31prefix and $version is the version of lasi (1.1.3 at the time of
32writing). An example is provided which tests that libLASi is robust
33against some common font issues such as a missing glyph or pango
34deciding to use a pure bitmapped font such as the popular Noto Color
35Emoji that does not provide the outline font data that libLASi needs).
36Simple and slightly more extensive examples are provided as well that
37have more interesting output. For more details concerning the examples,
38please consult examples/README.
39
40See the file COPYING for terms of copying and re-distribution.
41
42Copyright (C) 2003, 2004, 2006 Larry Siden
43Copyright (C) 2008 Ed Trager
44Copyright (C) 2008 Ritu Khanna
45Copyright (C) 2008-2019 Alan W. Irwin
46Copyright (C) 2008 Andrew Ross
47Copyright (C) 2008 Werner Smekal
48
49 This library is free software; you can redistribute it and/or
50 modify it under the terms of the GNU Library General Public
51 License as published by the Free Software Foundation; either
52 version 2 of the License, or (at your option) any later version.
53
54 This library is distributed in the hope that it will be useful,
55 but WITHOUT ANY WARRANTY; without even the implied warranty of
56 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
57 Library General Public License for more details.
58
59 You should have received a copy of the GNU Library General Public
60 License along with this library; if not, write to the
61 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
62 Boston, MA 02111-1307 USA.
63
64Original Author:
65
66 Larry Siden
67 4047 Rolling Meadow Lane
68 Pittsfield Twp., MI 48197-6619, USA
69
70 http://umich.edu/~lsiden
71 mailto:lsiden@gmail.com
72
73Contributors:
74
75 Edward H. Trager
76 ehtrager@umich.edu
77 http://eyegene.ophthy.med.umich.edu
78
79 Ritu Khanna
80 rituk@umich.edu
81
82 Alan W. Irwin
83 irwin@beluga.phys.uvic.ca
84
85 Andrew Ross
86 andrewross@users.sourceforge.net
87
88 Werner Smekal
89 smekal@iap.tuwien.ac.at
90
README.Release_Manager_Cookbook
1This is a cookbook showing the steps required to create a libLASi release at
2SourceForge.
3
4INDEX
5(1) Create and test a preliminary tarball from trunk
6(2) Finish release-related trunk changes so they will be in the release
7(3) Create and test the release tarball from trunk
8(4) Update ChangeLog and README.Release_Manager_Cookbook
9(5) Tag the release
10(6) Create and test the release tarball from the tagged version
11(7) Generate a file release at Sourceforge
12(8) Commit the tagged version
13(9) Publicity for the release announcement
14(10) Post release tweaking of this file (README.Release_Manager_Cookbook)
15
16(A1) GNU Privacy Guard (gpg).
17(A2) Setting the correct date and time on your computer.
18End of INDEX
19
20(1) Create and test a preliminary tarball from trunk
21
22 Do everything in (3) below just to make sure that the trunk
23 version is in good shape before you do the following final stages
24 of the release process.
25
26(2) Finish release-related trunk changes so they will be in the release
27
28* set environment variable for version to make directions below
29 more generic.
30
31export LASI_VERSION=1.1.3
32# Should refer to first release in this release cycle, i.e., one after
33# last release for the last release.
34export FIRST_RELEASE_REVISION=r200
35
36* Prepare a preliminary version of the ChangeLog file to see what
37 has been accomplished since the last release.
38
39# This makes the BASE used below correct.
40svn update
41
42svn log --revision ${FIRST_RELEASE_REVISION}:BASE --verbose >| ChangeLog.release_preliminary
43
44 Note the "_preliminary" suffix to distinguish this from the final
45 result below which will contain (if all goes well in the steps
46 below) a record of all but the last commit (of the ChangeLog
47 itself) for this release.
48
49 Note the order of the --revision components puts this preliminary
50 version in chronological order. But it is traditional for the
51 final version to have the result in reverse chronological order
52 (see below).
53
54* Update and commit README and cmake/module/lasi_version.cmake to
55 reflect the current version. Also, follow the instructions in
56 that latter file for updating the SOVERSION, the minor number and
57 the patch number.
58
59* Update and commit the release notes (stored in the README.release
60 file) containing a short overview of the most important changes
61 noted in the ChangeLog.release_preliminary file since the last
62 release.
63
64* Once completely satisfied with README.release insert it at the
65 start of README.cumulated release to keep a historical record in
66 reverse chronological order of the notes for all releases in that
67 file. From now on, any further tweaks to README.release should
68 be mirrored in README.cumulated release which is why this
69 insertion step should be delayed until the release manager is
70 completely satisfied with README.release.
71
72* Check that all local changes (other than this file,
73 README.Release_Manager_Cookbook, and ChangeLog) are in the
74 repository so they will be reflected in the ChangeLog, tagged
75 version of the release, and release tarball.
76
77svn status
78
79(3) Create and test the release tarball from trunk
80
81* Do the usual cmake and make in the build tree to build the user
82 and developer configurations of the Doxygen documentation in the
83 source tree. For example,
84
85cd /home/software/lasi_svn/HEAD/build_dir
86# In case this not set.
87LASI_VERSION= 1.1.3
88time (rm -rf /home/software/lasi_svn/HEAD/build_dir/* ~/lasi_svn/install; env PATH="/usr/bin:$PATH" cmake -DCMAKE_INSTALL_PREFIX=/home/software/lasi_svn/install -DBUILD_SHARED_LIBS=ON ../lasi_2019 >& cmake.out)
89make -j16 all >& all.out
90
91 Then build a preliminary version of the release tarball
92
93make package_source
94
95* Check that generated tarball by checking its table of contents as follows:
96
97tar ztvf libLASi-$LASI_VERSION.tar.gz |sed "s? *? ?g" |cut --delimiter=" " --fields="6-" |less
98
99* Unpack that tarball:
100
101tar zxf libLASi-$LASI_VERSION.tar.gz
102
103* Test that tarball with shared build, install, and shared examples build
104
105mkdir tarball_build_dir
106cd tarball_build_dir
107build_tree_dir=$(pwd)
108/usr/bin/cmake -DCMAKE_INSTALL_PREFIX=../tarball_install -DBUILD_SHARED_LIBS=ON ../libLASi-$LASI_VERSION >& cmake.out
109make -j16 >& make.out
110# Inspect EPS results. Note a white background has to be imposed because
111# these results have no background. So by default the background would be a checkerboard
112# imposed by pqiv if this --background-pattern option was not used.
113
114# Inspect same results converted (with opaque white background added) to PNG format
115# by inkscape.
116
117for CORE_NAME in MissingGlyphExample SimpleLASiExample ComplexTextLayoutExample ; do
118 pqiv -i --background-pattern=white examples/$CORE_NAME.eps
119 pqiv -i examples/$CORE_NAME.png
120done
121
122# ldd and valgrind tests of the examples including comparisons of the
123# results generated with the previous results. Note, that 2>&1
124# redirects stderr to *current" stdout (which defaults to pipe),
125# test.eps afterwards means PostScript output goes directly to that
126# file rather than stdout (so nothing more is emitted to stdout), and
127# >| test.eps afterwards means PostScript output goes to stdout (but
128# not stderr) and stdout then overwrites whatever was in test.eps
129# before.
130
131for CORE_NAME in MissingGlyphExample SimpleLASiExample ComplexTextLayoutExample ; do
132 ldd -r examples/$CORE_NAME 2>&1 | less
133 valgrind examples/$CORE_NAME 2>&1 test.eps | less
134 cmp test.eps examples/$CORE_NAME.eps
135 valgrind examples/$CORE_NAME 2>&1 >| test.eps | less
136 cmp test.eps examples/$CORE_NAME.eps
137done
138
139# Run ctest
140/usr/bin/ctest -j16 --output-log >| ctest.out
141# Compare ctest results with above make results.
142for CORE_NAME in MissingGlyphExample SimpleLASiExample ComplexTextLayoutExample ; do
143 cmp examples/ctest_examples_output_dir/$CORE_NAME.eps examples/$CORE_NAME.eps
144done
145
146make -j16 install >& make_install.out
147cd ../tarball_install/share/lasi$LASI_VERSION/examples
148make -j16 >& make.out
149
150for CORE_NAME in MissingGlyphExample SimpleLASiExample ComplexTextLayoutExample ; do
151 ldd -r $CORE_NAME 2>&1 | less
152 cmp $CORE_NAME.eps $build_tree_dir/examples/$CORE_NAME.eps
153 valgrind ./$CORE_NAME 2>&1 test.eps | less
154 cmp test.eps $CORE_NAME.eps
155 valgrind ./$CORE_NAME 2>&1 >| test.eps | less
156 cmp test.eps $CORE_NAME.eps
157done
158
159* Test that tarball with static build, install, and static examples build
160
161# Repeat all the prior test steps starting with removing prior test results with
162
163cd $build_tree_dir/..
164rm -rf tarball_*
165
166# Then follow with all the above steps starting with
167
168mkdir tarball_build_dir
169[...]
170
171# but with cmake option -DBUILD_SHARED_LIBS=ON replaced by -DBUILD_SHARED_LIBS=OFF
172
173 If these tests reveal that trunk changes are necessary, do those, commit
174them, and retest them.
175
176(4) Update ChangeLog and README.Release_Manager_Cookbook
177
178* Update this file (README.Release_Manager_Cookbook) as much as
179 possible concerning what has been done to complete this release
180 and commit that result. However, if some subsequent deviations
181 occur from the instructions in this cookbook then this file
182 should also be tweaked after the release (see (10)).
183svn commit README.Release_Manager_Cookbook
184
185* Prepare a (hopefully) final version of the ChangeLog file and commit it.
186svn update
187svn log --revision BASE:${LAST_RELEASE_REVISION} --verbose >| ChangeLog.preliminary
188mv ChangeLog.preliminary ChangeLog.release
189svn commit ChangeLog.release
190
191(5) Tag the release
192
193 Based on suggestions in the svn manual, the libLASi svn archive
194 is configured as follows:
195
196branches/
197tags/
198trunk/
199
200 For the release, you will be creating (and eventually committing)
201 what is essentially a branch of libLASi that is a snapshot record
202 of that subproject at the time of the release. This branch will
203 be located in the /tags directory and should follow the naming
204 convention tags/$LASI_VERSION although prior releases used a
205 different naming convention based on CVS (!) requirements.
206
207#ONE TIME ONLY
208# The easiest way to get started is to check out the _entire_ lasi svn
209# repository as follows:
210
211svn checkout https://svn.code.sf.net/p/lasi/code lasi_allura_complete
212
213#ONE TIME ONLY completed
214
215 If you already have this directory, you will need to make sure
216 that all your commits (probably in a different local directory)
217 have been done (see above) and that lasi_complete is up to date
218 with those commits.
219
220cd lasi_allura_complete
221svn update
222
223# Create and commit release tag of lasi
224svn copy trunk tags/$LASI_VERSION
225
226(6) Create and test the release tarball from the tagged version
227
228 Do exactly the same as (3), but for tagged source code in
229 tags/$LASI_VERSION
230
231 In the (unlikely event that problems are found in the tarball
232 generated from the tagged version during the release process,
233 corrections should be made to trunk/, the ChangeLog.release file
234 recreated and committed (see instructions above). Then merge the
235 trunk version into the tags as follows:
236
237cd tags/$LASI_VERSION
238svn merge -r A:B /path/to/trunk
239
240 Where A and B specify the range of revisions in trunk to be
241 applied to tags/$LASI_VERSION in the merge process. These can be
242 determined by commit messages.
243
244(7) Generate a file release at Sourceforge
245
246 A list of your GPG keys can be obtained using the command "gpg --list-keys <first name>"
247 where <first name> is the first name you used when creating your gpg key. The result of
248 that command for the current release manager (AWI) is
249
250pub rsa2048 2011-08-19 [SC] [expires: 2021-12-12]
251 A7CED6D2D4903103FCDDFC1E418B8FC4BB159E92
252uid [ultimate] Alan W. Irwin (Time Ephemerides key) <airwin@users.sourceforge.net>
253uid [ultimate] Alan W. Irwin (libLASi key) <airwin@users.sourceforge.net>
254uid [ultimate] Alan W. Irwin (FreeEOS key) <airwin@users.sourceforge.net>
255uid [ultimate] Alan W. Irwin (PLplot key) <airwin@users.sourceforge.net>
256
257 The A7CED6D2D4903103FCDDFC1E418B8FC4BB159E92 field above can be used for key signings,
258 but more conveniently its last 8 characters can be used for that purpose, e.g.,
259 BB159E92
260
261 Also, a new curveball thrown by the Debian Testing version of gpg
262 is you must identify the tty you are using with, e.g.,
263
264export GPG_TTY=$(tty)
265
266 (see remarks at
267 <https://www.elliotblackburn.com/importing-pgp-keys-from-keybase-into-gpg/>)
268
269 Otherwise, in my experience, gpg will refuse to sign the tag and
270 you will get the error:
271
272error: gpg failed to sign the data
273error: unable to sign the tag
274
275 But with the above trick, the following command just worked.
276
277gpg --default-key BB159E92 --detach-sign --armor libLASi-$LASI_VERSION.tar.gz
278
279 where BB159E92 is the last 8 characters of the full key
280 identification above and is sufficient to identify the public key
281 for Alan W. Irwin as taken from the above key list. N.B. it
282 appears there is no gpg model for signing with a particular user
283 id. So the signature verification below will have all UID's.
284
285 Then verify that result:
286
287gpg --verify libLASi-$LASI_VERSION.tar.gz.asc
288
289 where the output of that commmand should be similar to
290
291gpg: assuming signed data in 'libLASi-1.1.3.tar.gz'
292gpg: Signature made Wed 30 Jan 2019 10:58:19 PM PST
293gpg: using RSA key A7CED6D2D4903103FCDDFC1E418B8FC4BB159E92
294gpg: Good signature from "Alan W. Irwin (Time Ephemerides key) <airwin@users.sourceforge.net>" [ultimate]
295gpg: aka "Alan W. Irwin (libLASi key) <airwin@users.sourceforge.net>" [ultimate]
296gpg: aka "Alan W. Irwin (FreeEOS key) <airwin@users.sourceforge.net>" [ultimate]
297gpg: aka "Alan W. Irwin (PLplot key) <airwin@users.sourceforge.net>" [ultimate]
298
299 Copy the results to a more permanent location:
300
301cp libLASi-$LASI_VERSION.tar.gz* /home/software/lasi_svn/HEAD/export
302
303 Prepare a temporary file called README.release that concatenates
304 README.release and ChangeLog.release.
305
306cd lasi_allura_complete/tags/$LASI_VERSION
307
308echo "
309
310DETAILED CHANGELOG FOR THIS RELEASE
311
312" | \
313cat README.release - ChangeLog.release >| /tmp/README.release
314
315 Upload the release to SourceForge using sftp
316
317cd /home/software/lasi_svn/HEAD/export
318
319sftp airwin,lasi@frs.sourceforge.net <<EOF
320cd /home/frs/project/l/la/lasi/lasi
321mkdir "$LASI_VERSION Source"
322cd "$LASI_VERSION Source"
323put libLASi-$LASI_VERSION.tar.gz.asc
324put libLASi-$LASI_VERSION.tar.gz
325lcd /tmp
326put README.release
327quit
328EOF
329
330 Demonstrate with irwin account that can download these uploaded
331 results and verify them:
332
333SITE=https://sourceforge.net/projects/lasi/files/lasi/"$LASI_VERSION Source"
334wget "$SITE/libLASi-$LASI_VERSION.tar.gz.asc"
335wget "$SITE/libLASi-$LASI_VERSION.tar.gz"
336
337gpg --verify libLASi-$LASI_VERSION.tar.gz.asc
338
339# Belt and suspenders....
340
341diff libLASi-$LASI_VERSION.tar.gz.asc /home/software/lasi_svn/HEAD/export
342diff libLASi-$LASI_VERSION.tar.gz /home/software/lasi_svn/HEAD/export
343
344 Login to sf.net
345
346 Go to the file-release area at
347 sf.net/projects/lasi/files/lasi/<LASI_VERSION> Source
348
349 (where <LASI_VERSION> stands for whatever you have set
350 LASI_VERSION to above)
351
352 Click on the "i" or "info" button to mark the tar.gz file as the
353 default file to download for all platforms.
354
355(8) Commit the tagged version
356cd lasi_allura_complete
357svn commit tags/$LASI_VERSION
358
359(9) Publicity for the release announcement
360
361 Create a news item for the Release:
362 Click on the news menu item and then click on
363
364 Click "Submit" for the news feature.
365
366 Experience shows you should edit a temporary file with no line
367 feeds except at paragraph breaks, and all URL's should be
368 mentioned as-is with no html formatting. Then cat that file, and
369 cut and paste the result to the form generated above. SF then
370 turns that result into something readable as HTML with the URL's
371 turned into clickable links.
372
373 Other publicity:
374
375 Barbara: linuxtoday.com, lwn.net, lxer.com
376
377(10) Post release tweaking of this file (README.Release_Manager_Cookbook)
378
379 This only needs to be done if the actual procedure followed for
380 the release differed in any detail from the previously updated
381 instructions in this file.
382
383DONE! :-)
384
385--- Appendix ---
386
387(A1) GNU Privacy Guard (gpg)
388A brief summary of developer relevant gpg commands, see also:
389http://dewinter.com/gnupg_howto/english/GPGMiniHowto.html,
390man gpg, and http://www.gnupg.org/faq/GnuPG-FAQ.html.
391
392* Configure key-server (if you haven't done that already) by editing
393 $HOME/.gnupg/gpg.conf. Also specify the auto-key-retrieve option
394 for convenience.
395
396* List keys on your keyring that have been retrieved or generated so far:
397
398gpg --list-keys irwin
399
400* Search for any previously published keys that you might want to
401 revoke. (Note the search phrase is case insensitive but the search
402 is done on the Boolean AND of the terms so the following search would
403 miss any key generated in the past by Alan Irwin because of the
404 middle initial "W." that is specified for the search). OTOH, I
405 always use my middle initial for publications to reduce name clashes.
406
407gpg --search-keys Alan W. Irwin
408
409* Create a new key:
410
411gpg --gen-key
412
413 With gnupg 1.4.10, I chose the following options when creating a new key:
414
415Please select what kind of key you want:
416 (1) RSA and RSA (default)
417
418What keysize do you want?
4192048 (default)
4205-year expiration date.
421
422....
423
424Real name: Alan W. Irwin
425Email address: irwin@users.sourceforge.net
426Comment: Time Ephemerides key
427You selected this USER-ID:
428 "Alan W. Irwin (Time Ephemerides key) <irwin@users.sourceforge.net>"
429
430
431N.B. nameofkey below is the name of the key, usually specified by the
432second number after the slash for the first pub line given by
433"gpg --list-keys". For example, the above key gives the following
434result:
435
436software@raven> gpg --list-keys irwin
437pub 2048R/BB159E92 2011-08-19 [expires: 2016-08-17]
438uid Alan W. Irwin (Time Ephemerides key) <irwin@users.sourceforge.net>
439sub 2048R/C5ECCF77 2011-08-19 [expires: 2016-08-17]
440
441So the name could be BB159E92. Other possibilities exist as well such
442as "irwin", but that might not be unique.
443
444* N.B. Made a mistake in the above. My SF e-mail address is airwin@....
445not irwin@... GRRR. So fix it.
446
447Under --edit-key command
448
449adduid (fill in correct e-mail address this time)
450uid number (to select uid to work on for further commands
451revuid (revoke bad e-mail one)
452primary (to make the new one the primary one, I am not sure that is necessary)
453trust (to make the new one ultimately trusted, again, not sure that is necessary. N.B. didn't seem to change trust value, but that was just bad output)
454
455save (to get out again)
456
457When edited the next time showed ultimate trust value for correct id, but
458I don't know whether that was the above primary/trust subcommands or
459whether those were necessary at all. It turned out those were not
460necessary at all as I later used the above sequence to generate
461a libLASi key and a FreeEOS uid key.
462
463* Generate a revocation certificate. Note this requires the pass phrase
464 specified at the time of key generation so keep that pass phrase in
465 a safe place or else generate the revocation certificate right after
466 generating the key, and keep that certificate in a safe place. I chose
467 the former course (keep the pass phrase safe). N.B. the options should
468 appear below in the order given!
469
470gpg --armor -o nameofkey-revocation.asc --gen-revoke nameofkey
471
472* Publicly revoke old key (from FAQ):
473
474gpg --import old-revocation.asc
475gpg --send-keys nameofkey
476
477* Upload your (public) key to GPG key server so that others can obtain it to
478verify your signature on the release tarball.
479gpg --send-keys nameofkey
480
481gpg --refresh-keys (to update from the server all keys including your own).
482
483This verified that the bad irwin address was revoked even though
484gpg --search-keys Alan W. Irwin
485
486still shows revoked uid as the #1 uid.
487
488(A2) Setting the correct date and time on your computer.
489
490(While it is useful to have the correct time on your computer, this is no
491longer strictly necessary).
492Verify that your computer has the right date and time using the command date.
493The easiest way to make sure the time and date are correct is to do the
494following:
4951. Install the debian ntpdate package.
4962. Execute the command "/usr/sbin/ntpdate pool.ntp.org", which you will
497 have to do as root.
498This will immediately change your system clock. It is not recommended if you
499have other apps running on your system that expect time to increase in a
500smooth and linear fashion.
501
502If you would like your computer to always have the correct time and date, you
503can install the debian ntp package, which must be properly configured to work.
504Some notes about how to do this can be found in the PLplot mailing list
505archive. Look for the thread titled "PLplot 5.7.2 is now available" dated
506Jan 22/23 2007.
507
README.cumulated_release
1libLASi Release 1.1.3
2~~~~~~~~~~~~~~~~~~~~~
3This is a maintenance release of libLASi that reflect the ongoing
4efforts of the libLASi developers to respond to bug reports for this
5stable and convenient library for creating PostScript documents that
6can contain characters from any of the script and symbol blocks
7supported in Unicode and by the Pango layout engine.
8
9If you encounter a problem with libLASi, then please send a bug report to
10the libLASi developers via the lasi-devel mailing list described at
11http://lists.sourceforge.net/lists/listinfo/lasi-devel.
12
13Please see the license under which this software is distributed (LGPL), and
14the disclaimer of all warranties, given in the COPYING.LIB file.
15
16INDEX
17
181. OFFICIAL NOTICES FOR USERS
19
201.1 CMake version compatibility
211.2 Backwards-incompatible libLASi API changes
221.3 Need help getting rid of deprecation build warnings
23
242. Changes relative to our previous release (version 1.1.2) in decreasing order of importance
25
262.1 Improve libLASi's response when pango/fontconfig chooses pure bitmapped fonts
272.2 Make glyph names have a one-to-one relationship with glyphs
282.3 Set target property POSITION_INDEPENDENT_CODE ON for the libLASi library
292.4 Make "MissingGlyphExample" a more stringent test of font or glyph issues for libLASi
302.5 Replace deprecated lower-case variants of Freetype macro constants with preferred upper-case form
312.6 Add bounding boxes to the "MissingGlyphExample" and "ComplexTextLayoutExample" examples
322.7 Rename example applications and results using consistent and descriptive core names
332.8 Fix low-resolution boundary box issue
342.9 Update doxygen configuration files from doxygen version 1.8.1.2 to 1.8.13
352.10 Change the minimum version of CMake from 2.8.9 to 3.13.2
36
373. Testing of this release.
38
39END of INDEX
40
411. OFFICIAL NOTICES FOR USERS
42
431.1 CMake version compatibility
44
45 Our build system is implemented using CMake. The minimum version
46 of CMake we allow is 3.13.2 on all platforms. That version is the
47 one we have used to test this release of libLASi (see Section 3
48 below). However, if you try later CMake versions as they are
49 released during the life of this libLASi release, our build system
50 will likely continue to work well because CMake has an excellent
51 reputation for preserving backwards compatibility.
52
531.2 Backwards-incompatible libLASi API changes
54
55 The bug fixes in this release required backwards-incompatible
56 changes to the libLASi API (a change in the argument list of the
57 PostscriptDocument::GlyphId::GlyphId protected method that is
58 designed for internal use only and the addition of the
59 PostscriptDocument::PangoItem_do protected method that is also
60 designed for internal use only). Therefore, the SOVERSION for
61 libLASi has been bumped from 1 to 2 to force source code that
62 depends on this library (e.g., the PLplot psttf device driver) to
63 be recompiled. However, such source code will not require changes
64 to adjust to this backwards-incompatible change in the libLASi
65 API.
66
671.3 Need help getting rid of deprecation build warnings
68
69This release has deprecation warning build issues which are
70
71* "warning: dynamic exception specifications are deprecated in C++11 [-Wdeprecated]"
72
73* "warning: ‘PangoContext* pango_ft2_get_context(double, double)’ is deprecated: Use 'pango_font_map_create_context' instead [-Wdeprecated-declarations]"
74
75* "warning: ‘FT_FaceRec_* pango_ft2_font_get_face(PangoFont*)’ is deprecated: Use 'pango_fc_font_lock_face' instead [-Wdeprecated-declarations]"
76
77All of these are beyond my current C++ and pango skill level to fix so
78help with cleaning up any of these deprecation build warnings messages
79would be much appreciated!
80
812. Changes relative to our previous release (version 1.1.2) in decreasing order of importance
82
832.1 Improve libLASi's response when pango/fontconfig chooses pure bitmapped fonts
84
85 This change was the primary motivation for this release.
86
87 Previous to this change when pango chose the popular Noto Color
88 Emoji font to help render the Aries glyph, libLASi threw an error
89 and aborted since such pure bitmap fonts are not suitable for
90 libLASi's outline font needs. Such a response completely stops
91 PLplot tests when PLplot standard example 7 attempts to render an
92 Aries glyph with either the psttf or psttfc devices. So this
93 previous response was completely unacceptable, and the fix for it
94 is important.
95
96 This change fixes that previous response by replacing all glyphs
97 for a PangoItem where pango chooses a non-outline font with the
98 default glyph used to represent missing glyphs. Of course, a
99 much better procedure would be to request pango to limit its
100 choices to outline fonts, but as far as I know there is no method
101 for doing that (outside of having one fontconfig configuration
102 for libLASi use and another for all other situations), and, in
103 any case, the present workaround is "good enough for now" because
104 pure bitmap fonts are rare (for example, it is possible that Noto
105 Color Emoji in the future may become available in the outline
106 form generally preferred for modern fonts), and Pango/fontconfig
107 chooses such pure bitmap fonts for relatively few glyphs.
108
1092.2 Make glyph names have a one-to-one relationship with glyphs
110
111 This change is an important motivation for this release.
112
113 This change is confined to the case when fonts don't follow
114 standards so that they cannot be interrogated for the glyph name,
115 i.e., FT_HAS_GLYPH_NAMES(face) is false. Before this change,
116 libLASi computed its own unique glyph name using the template
117
118LASi_glyph_<unique number>
119
120 where <unique number> was incremented whenever the code decided a
121 new glyph had been encountered. This scheme had the following
122 disadvantages:
123
124* The logic for deciding when new glyphs were encountered was
125 faulty with the result that the same glyph would have multiple
126 glyph names and therefore redundant glyph information stored in
127 the PostScript header whenever, for example, both
128
129doc.osBody() << show(string)
130
131 and
132
133doc.get_dimensions(string,&lineSpacing,&xAdvance,&yMinimum,&yMaximum);
134
135 (a common combination when bounding boxes are being determined)
136 were called for the same string.
137
138* The glyph name depended on the order with which strings were
139 processed with the result that PLplot octave results (where all
140 standard octave examples were run from one instance of octave)
141 had different glyph names than PLplot C results (where all
142 standard C examples were run using separate executables for each
143 example).
144
145* The glyph names were completely meaningless to humans reading
146 through the PostScript code in the results.
147
148 All these issues were addressed by borrowing a static function
149 from PLplot (whose LGPL'd code allows us to do that) to calculate
150 the UCS4 (32-bit unsigned) encoding of unicode for each glyph
151 encountered in the UTF-8 encoded input string. With the result
152 that the glyph names now have the template
153
154LASi_glyph_U+<UCS4 hexadecimal code for the glyph>
155
156 where by definition the UCS4 hexadecimal code completely
157 identifies the glyph in a unique way which is easy to look up,
158 e.g., with the gucharmap application.
159
160 The net result of this change is the PLplot test_diff_device
161 target for the case when -DPLPLOT_TEST_DEVICE=psttfc now gives a
162 clean report for the first time ever. So this change is an
163 important one.
164
1652.3 Set target property POSITION_INDEPENDENT_CODE ON for the libLASi library
166
167 This change is an important motivation for this release.
168
169 This bug fix allows the static version of libLASi to be used with
170 shared builds of external software that depend on libLASi such as
171 the PLplot psttf device driver.
172
1732.4 Make "MissingGlyphExample" a more stringent test of font or glyph issues for libLASi
174
175 The most important change here was to add
176
177"Unicode U+2648 ARIES (twice): ♈♈"
178"Embedded newlines a\\nb\\nc: a\nb\nc"
179
180 to the strings that are rendered to PostScript by this example.
181
182 For the first of these, the Debian Buster version of pango
183 (likely due to the default fontconfig configuration) decides to
184 use the popular Noto Color Emoji font to render the Aries glyphs,
185 but the problem for that font is it is a pure bitmap font with no
186 outline information that is required by libLASi. So this line
187 tests the response of libLASi to this situation.
188
189 For the second of these the linefeed "\n" glyph is a non-printing
190 glyph. It appears for all such glyphs there is a "missing glyph"
191 issue so regardless of future font improvements this line seems
192 to be a reliable way to trigger missing-glyph issues to test the
193 response of libLASi to this situation.
194
1952.5 Replace deprecated lower-case variants of Freetype macro constants with preferred upper-case form
196
1972.6 Add bounding boxes to the "MissingGlyphExample" and "ComplexTextLayoutExample" examples
198
199 The resulting MissingGlyphExample.eps and
200 ComplexTextLayoutExample.eps files join SimpleLASiExample.eps as
201 being properly formatted EPS (Encapsulated PostScript) files.
202
203 Note also that for the "Complex Text Layout" case, I implemented
204 some generally useful C++ code macros (called
205 LASI_SHOW_AND_UPDATE_BB, LASI_SCALED_SHOW_AND_UPDATE_BB, and
206 LASI_ROTATED_SHOW_AND_UPDATE_BB), which made it straightforward
207 to handle even complex cases such as determining the bounding box
208 of text that has undergone anamorphic scaling or rotation. For
209 example, the LASI_ROTATED_SHOW_AND_UPDATE_BB macro includes C++
210 code to apply the rotation matrix to determine the x,y
211 coordinates of the corners of the rotated text box and use those
212 corner coordinates to help determine the overall bounding box.
213
2142.7 Rename example applications and results using consistent and descriptive core names
215
216 Those core names are " MissingGlyphExample", "SimpleLASiExample",
217 and "ComplexTextLayoutExample". As a result the example source
218 code name is <core name>.cpp, the example application name is
219 <core name> (or <core name>.exe on Windows platforms), the EPS
220 (Encapsulated PostScript) results are named <core name>.eps, and
221 the PNG results (generated from the EPS results using inkscape)
222 are named <core name>.png.
223
2242.8 Fix low-resolution boundary box issue
225
226 As a result of this change the low-res (int) BB (bounding box)
227 limits are calculated from the high-res (double) BB limits with
228 the appropriate combinations of floor and ceil so the low-res
229 limits always lie on or outside (by up to but not including 1
230 point) the high-res limits. Previously this calculation was done
231 incorrectly with floor for all limits.
232
2332.9 Update doxygen configuration files from doxygen version 1.8.1.2 to 1.8.13
234
235 These changes were done in the usual way by running the following
236 commands:
237
238doxygen -u Doxyfile.developer
239doxygen -u Doxyfile.user
240
2412.10 Change the minimum version of CMake from 2.8.9 to 3.13.2
242
243 This change was motivated by the bug fixes in later CMake
244 versions and also the much better checking of the build system
245 that occurs for the policies automatically used for 3.13.2.
246
2473. Testing of this release.
248
249This release has been successfully built and run-tested (following the
250prescription in README.Release_Manager_Cookbook) for both the shared
251and static library case on Linux (Debian Buster) using CMake-3.13.2
252(the minimum allowed version of CMake for libLASi), libpango-1.42.4,
253libcairo-1.16.0, libfreetype-2.9.1, and libfontconfig-2.13.1.
254
255This release has not been tested (yet) on Mac OS X or Windows
256platforms, but we anticipate no difficulties on those platforms since
257previous versions of libLASi have worked well on those platforms. In
258other words, the cross-platform nature of libLASi appears to have been
259well supported by CMake in the past, and we feel that happy state will
260continue with this release as well.
261
262libLASi Release 1.1.2
263~~~~~~~~~~~~~~~~~~~~~
264This is a maintenance release of libLASi that reflect the ongoing
265efforts of the libLASi developers to respond to bug reports for this
266stable and convenient library for creating PostScript documents that
267can contain characters from any of the script and symbol blocks
268supported in Unicode and by the Pango layout engine.
269
270If you encounter a problem with libLASi, then please send a bug report to
271the libLASi developers via the lasi-devel mailing list described at
272http://lists.sourceforge.net/lists/listinfo/lasi-devel.
273
274Please see the license under which this software is distributed (LGPL), and
275the disclaimer of all warranties, given in the COPYING.LIB file.
276
277INDEX
278
2791. Changes relative to our previous release (version 1.1.1).
280
2812. Testing of this release.
282
2831.1 Update of examples/MissingGlyphExample.cpp
2841.2 #include FreeType headers in recommended (by FreeType) way.
2851.3 Make all install locations configurable.
2861.4 Fix FreetypeGlyphMgr::FreetypeGlyphMgr(FT_Glyph glyph) initialization bug.
2871.5 Fix long-standing file repeatability issue.
288
2891.1 Update of examples/MissingGlyphExample.cpp
290
291The whole point of this example was to make sure that libLASi
292responded well to missing glyphs, but the example had gotten seriously
293outdated because for modern Linux systems with the normal system
294fonts, the chosen unicode characters were no longer missing! That
295issue has now been addressed by using a larger variety of obscure
296unicode glyphs in the examples based on some glyphs that gucharmap
297says are missing for the particular Debian stable platform where this
298release is being created. At the same time, I took the opportunity to
299improve the look of the PostScript results of this example by
300indicating its purpose and keeping results for the various test
301glyphs separate from each other. The results are good (no build or
302run-time errors, the PostScript results are now self-explanatory, and
303the missing glyphs are indicated by empty boxes).
304
3051.2 #include FreeType headers in recommended (by FreeType) way.
306
307This fixes <https://sourceforge.net/p/lasi/bugs/2/>, does not disrupt
308the previous success with building libLASi against FreeType version
3092.4.9, and for the first time allows libLASi to build against FreeType
310version 2.5.1 and later. So this is a high-impact fix for use of
311libLASi with the latest FreeType versions and is also the fundamental
312motivation for this maintenance release.
313
3141.3 Make all install locations configurable.
315
316This fixes <https://sourceforge.net/p/lasi/bugs/3/> and makes it more
317convenient to package libLASi.
318
3191.4 Fix FreetypeGlyphMgr::FreetypeGlyphMgr(FT_Glyph glyph) initialization bug.
320
321This fixes <https://sourceforge.net/p/lasi/bugs/4/>. The particular
322method being fixed here is not used in any of our examples, and was
323only caught by compiler warning messages rather than a bug report
324about actual use of this method so this is likely a low-impact
325fix.
326
3271.5 Fix long-standing file repeatability issue.
328
329This bug <https://sourceforge.net/p/lasi/bugs/5/> was discovered while
330testing a pre-release version of 1.1.2, but apparently also appeared
331in all prior releases of libLASi. The issue was glyphs without a name
332available in the font data were assigned a unique name by libLASi
333using rand, but those unique names were not repeatable from one run of
334an application linked to libLASi to the next (presumably because
335libraries that libLASi depends on were fiddling with the rand seed in
336some threaded way that was not repeatable). An initial fix that used
337rand_r and a unique seed for libLASi solved the issue, but ultimately
338it was decided to solve the issue by using the libLASi assigned names
339LASi_glyph_1, LASi_glyph_2, etc., which should be unique until the
340integer overflow limit is encountered, and which should not name clash
341with glyph names that are included with font data.
342
3432. Testing of this release.
344
345This release has been successfully build and run tested on Linux using
346(1) libpango-1.30.0, libcairo-1.12.2, and libfreetype-2.4.9 and (2)
347libpango-1.35.0, libcairo-1.12.14, and libfreetype-2.5.3.
348
349Thanks to the kind testing help of Arjen Markus, this release has also
350been successfully build and run tested on Windows using the build
351procedure for that platform given at <http://www.unifont.org/lasi/>
352using the gtk+ all-in-one Windows bundle downloaded from
353<http://www.gtk.org/download/win32.php> which includes
354libpango-1.30.1, libcairo-1.10.2, and libfreetype-2.4.11.
355
356Although there has been no specific testing of this release on Mac OS
357X, we do not anticipate any difficulties for that platform since
358previous releases of libLASi (patched for the above freetype header
359issue) have worked fine on that platform according to reports at
360https://sourceforge.net/p/lasi/bugs/2/.
361
362libLASi Release 1.1.1
363~~~~~~~~~~~~~~~~~~~~~
364This is a stable release of libLASi. It represents the ongoing efforts
365of the libLASi developers to improve the libLASi library for creating
366PostScript documents that can contain characters from any of the
367script and symbol blocks supported in Unicode and by the Pango layout engine.
368
369If you encounter a problem with libLASi, then please send a bug report to
370the libLASI developers via the lasi-devel mailing list described at
371http://lists.sourceforge.net/lists/listinfo/lasi-devel.
372
373Please see the license under which this software is distributed (LGPL), and
374the disclaimer of all warrantees, given in the COPYING.LIB file.
375
376INDEX
377
3781. Changes relative to our previous release (version 1.1.0).
379
3801.1 Make declaration and definition of setFont arguments consistent.
3811.2 Fix alignment of diacritical marks.
3821.3 Build system improvements.
3831.4 Reduction of symbol visibility for gcc.
384
3851.1 Make declaration and definition of setFont arguments consistent.
386
387Thanks to John Ellson's bug report (link failure with Sun's CC - ID:
3882797964) we found out that the arguments of setFont had inconsistent
389const attributes between the declaration in LASi.h and the definition
390in psDoc.cpp. We have now fixed that inconsistency by using John's
391patch to drop the const attribute from the appropriate definition
392arguments.
393
3941.2 Fix alignment of diacritical marks.
395
396Thanks to Yotam Medini for supplying a patch which we have applied to
397correct the positioning of diacritical marks. This change means there
398must be an extra bool applyOffset = false argument to the
399PostscriptDocument::for_each_glyph_do method (see Lasi.h). This
400method is called internally by other libLASi routines with applyOffset
401both true and false depending on circumstances/needs to obtain
402correct offsets for diacritical marks.
403
404This method is also available for external use so this added argument
405is a backwards-incompatible API change requiring rebuilding of
406apps/libraries that use this method, and the soversion of the library
407has been bumped from 0 to 1 consistent with this API change. However,
408this external API change issue is not relevant for the libLASi
409examples that are part of this release and also to the psttf device driver
410for PLplot that depends on libLASi because those applications and device
411driver plug-ins do not call the for_each_glyph_do method.
412
4131.3 Build system improvements.
414
415Our CMake-based build system has been updated to determine pkg-config
416results in a way that is much more useful for CMake. (We simply
417adopted PLplot's method of handling this). The result is that modern
418CMake (tested on CMake-2.6.4 and CMake-2.8.1) warnings about
419inconsistent library handling by Policy CMP0003 are no longer present.
420The minimum version of CMake has been updated from 2.4.5 (!) to 2.6.4.
421
4221.4 Reduction of symbol visibility for gcc.
423
424The infrastructure in LASi.h for exporting symbols for the Windows
425version of this library has been generalized for the gcc-4.x case for
426Unix platforms following the well-tested implementation used for
427the PLplot libraries.
428
429The net effect of this change is that Windows visibility of symbols
430should be unchanged and similarly for Unix _except_ for the case of
431gcc on Unix where the user specifies the gcc -fvisibility=hidden
432option. For that case, the exported symbols are reduced to those
433exported in the Windows case. The difference in results between using
434default visibility and -fvisibility=hidden for gcc-4.x on Unix is the
435number of visible symbols in libLASi.so is reduced from 164 to the 128
436actually needed by users of the library which should give a modest but
437still significant reduction in load times.
438
439libLASi Release 1.1.0
440~~~~~~~~~~~~~~~~~~~~~
441This is a stable release of libLASi. It represents the ongoing efforts
442of the libLASi developers to improve the libLASi library for creating
443PostScript documents that can contain characters from any of the
444script and symbol blocks supported in Unicode and by the Pango layout engine.
445
446If you encounter a problem with libLASi, then please send a bug report to
447the libLASI developers via the lasi-devel mailing list described at
448http://lists.sourceforge.net/lists/listinfo/lasi-devel.
449
450Please see the license under which this software is distributed (LGPL), and
451the disclaimer of all warrantees, given in the COPYING.LIB file.
452
453INDEX
454
4551. Changes relative to our previous release (version 1.0.5p1 for FreeType
456versions less than 2.2 and version 1.0.6 for FreeType 2.2+).
457
4581.1 Replace autotools-based build system with a CMake-based build system.
4591.2 libLASi can now be built both on Unix and Windows.
4601.3 The examples have been reorganized and extended.
4611.4 libLASi is now more robust against font/glyph issues.
462
463
4641.1 Replace autotools-based build system with a CMake-based build system.
465
466The build system is now based on CMake. It has been tested on Linux,
467Mac OS-X and Windows platforms. For directions on how to use CMake to
468build libLASi, please consult http://www.unifont.org/lasi/. In particular,
469the new build system has the capability of detecting the FreeType version
470so the previous split release (1.0.5p1 and 1.0.6) is no longer necessary.
471
4721.2 libLASi can now be built both on Unix and Windows
473
474Our new CMake-based build system allows building libLASi on both Unix
475(Linux, Mac OS X, and proprietary Unices) and Windows (Cygwin, MinGW/MSYS,
476and Microsoft proprietary build environments) platforms. Instructions
477for various platforms have been collected at http://www.unifont.org/lasi/.
478
4791.3 The examples have been reorganized and extended and can now be built
480in both the build tree and install tree.
481
482After running "cmake" (which configures libLASi) and "make" (which builds
483the libLASi library and examples which use that library in the build tree,
484see instructions at http://www.unifont.org/lasi/), you can run ctest in the
485build tree to run the examples. If ctest shows no errors, the PostScript
486results of that test of the libLASi library are collected in the
487examples/example[0-2].ps files in the build tree. See examples/README
488in the source tree for descriptions of these test examples.
489
490The examples can also independently be built and run in the install tree
491created by "make install" as well using
492
493cd $version/share/lasi$lasi_version/examples
494make
495
496where $version is the installation prefix specified as a command-line option
497for the cmake command, and $lasi_version is currently 1.1.0. The make
498command uses pkg-config to specify the correct C++ flags and link flags, and
499users with independent applications that link to libLASi are advised to use
500the same method as well.
501
5021.4 libLASi is now more robust against font/glyph issues.
503
504Missing glyphs are now rendered as a blank rather than being the cause of
505showstopping errors seen in previous libLASi releases.
506
507Some font installations were occasionally returning non-outline glyphs that
508were causing segfault errors for older libLASi versions. The libLASi code
509has now been changed to render a blank for such cases and only attempt to
510render results for the outline glyphs it was designed for.
511
README.release
1libLASi Release 1.1.3
2~~~~~~~~~~~~~~~~~~~~~
3This is a maintenance release of libLASi that reflect the ongoing
4efforts of the libLASi developers to respond to bug reports for this
5stable and convenient library for creating PostScript documents that
6can contain characters from any of the script and symbol blocks
7supported in Unicode and by the Pango layout engine.
8
9If you encounter a problem with libLASi, then please send a bug report to
10the libLASi developers via the lasi-devel mailing list described at
11http://lists.sourceforge.net/lists/listinfo/lasi-devel.
12
13Please see the license under which this software is distributed (LGPL), and
14the disclaimer of all warranties, given in the COPYING.LIB file.
15
16INDEX
17
181. OFFICIAL NOTICES FOR USERS
19
201.1 CMake version compatibility
211.2 Backwards-incompatible libLASi API changes
221.3 Need help getting rid of deprecation build warnings
23
242. Changes relative to our previous release (version 1.1.2) in decreasing order of importance
25
262.1 Improve libLASi's response when pango/fontconfig chooses pure bitmapped fonts
272.2 Make glyph names have a one-to-one relationship with glyphs
282.3 Set target property POSITION_INDEPENDENT_CODE ON for the libLASi library
292.4 Make "MissingGlyphExample" a more stringent test of font or glyph issues for libLASi
302.5 Replace deprecated lower-case variants of Freetype macro constants with preferred upper-case form
312.6 Add bounding boxes to the "MissingGlyphExample" and "ComplexTextLayoutExample" examples
322.7 Rename example applications and results using consistent and descriptive core names
332.8 Fix low-resolution boundary box issue
342.9 Update doxygen configuration files from doxygen version 1.8.1.2 to 1.8.13
352.10 Change the minimum version of CMake from 2.8.9 to 3.13.2
36
373. Testing of this release.
38
39END of INDEX
40
411. OFFICIAL NOTICES FOR USERS
42
431.1 CMake version compatibility
44
45 Our build system is implemented using CMake. The minimum version
46 of CMake we allow is 3.13.2 on all platforms. That version is the
47 one we have used to test this release of libLASi (see Section 3
48 below). However, if you try later CMake versions as they are
49 released during the life of this libLASi release, our build system
50 will likely continue to work well because CMake has an excellent
51 reputation for preserving backwards compatibility.
52
531.2 Backwards-incompatible libLASi API changes
54
55 The bug fixes in this release required backwards-incompatible
56 changes to the libLASi API (a change in the argument list of the
57 PostscriptDocument::GlyphId::GlyphId protected method that is
58 designed for internal use only and the addition of the
59 PostscriptDocument::PangoItem_do protected method that is also
60 designed for internal use only). Therefore, the SOVERSION for
61 libLASi has been bumped from 1 to 2 to force source code that
62 depends on this library (e.g., the PLplot psttf device driver) to
63 be recompiled. However, such source code will not require changes
64 to adjust to this backwards-incompatible change in the libLASi
65 API.
66
671.3 Need help getting rid of deprecation build warnings
68
69This release has deprecation warning build issues which are
70
71* "warning: dynamic exception specifications are deprecated in C++11 [-Wdeprecated]"
72
73* "warning: ‘PangoContext* pango_ft2_get_context(double, double)’ is deprecated: Use 'pango_font_map_create_context' instead [-Wdeprecated-declarations]"
74
75* "warning: ‘FT_FaceRec_* pango_ft2_font_get_face(PangoFont*)’ is deprecated: Use 'pango_fc_font_lock_face' instead [-Wdeprecated-declarations]"
76
77All of these are beyond my current C++ and pango skill level to fix so
78help with cleaning up any of these deprecation build warnings messages
79would be much appreciated!
80
812. Changes relative to our previous release (version 1.1.2) in decreasing order of importance
82
832.1 Improve libLASi's response when pango/fontconfig chooses pure bitmapped fonts
84
85 This change was the primary motivation for this release.
86
87 Previous to this change when pango chose the popular Noto Color
88 Emoji font to help render the Aries glyph, libLASi threw an error
89 and aborted since such pure bitmap fonts are not suitable for
90 libLASi's outline font needs. Such a response completely stops
91 PLplot tests when PLplot standard example 7 attempts to render an
92 Aries glyph with either the psttf or psttfc devices. So this
93 previous response was completely unacceptable, and the fix for it
94 is important.
95
96 This change fixes that previous response by replacing all glyphs
97 for a PangoItem where pango chooses a non-outline font with the
98 default glyph used to represent missing glyphs. Of course, a
99 much better procedure would be to request pango to limit its
100 choices to outline fonts, but as far as I know there is no method
101 for doing that (outside of having one fontconfig configuration
102 for libLASi use and another for all other situations), and, in
103 any case, the present workaround is "good enough for now" because
104 pure bitmap fonts are rare (for example, it is possible that Noto
105 Color Emoji in the future may become available in the outline
106 form generally preferred for modern fonts), and Pango/fontconfig
107 chooses such pure bitmap fonts for relatively few glyphs.
108
1092.2 Make glyph names have a one-to-one relationship with glyphs
110
111 This change is an important motivation for this release.
112
113 This change is confined to the case when fonts don't follow
114 standards so that they cannot be interrogated for the glyph name,
115 i.e., FT_HAS_GLYPH_NAMES(face) is false. Before this change,
116 libLASi computed its own unique glyph name using the template
117
118LASi_glyph_<unique number>
119
120 where <unique number> was incremented whenever the code decided a
121 new glyph had been encountered. This scheme had the following
122 disadvantages:
123
124* The logic for deciding when new glyphs were encountered was
125 faulty with the result that the same glyph would have multiple
126 glyph names and therefore redundant glyph information stored in
127 the PostScript header whenever, for example, both
128
129doc.osBody() << show(string)
130
131 and
132
133doc.get_dimensions(string,&lineSpacing,&xAdvance,&yMinimum,&yMaximum);
134
135 (a common combination when bounding boxes are being determined)
136 were called for the same string.
137
138* The glyph name depended on the order with which strings were
139 processed with the result that PLplot octave results (where all
140 standard octave examples were run from one instance of octave)
141 had different glyph names than PLplot C results (where all
142 standard C examples were run using separate executables for each
143 example).
144
145* The glyph names were completely meaningless to humans reading
146 through the PostScript code in the results.
147
148 All these issues were addressed by borrowing a static function
149 from PLplot (whose LGPL'd code allows us to do that) to calculate
150 the UCS4 (32-bit unsigned) encoding of unicode for each glyph
151 encountered in the UTF-8 encoded input string. With the result
152 that the glyph names now have the template
153
154LASi_glyph_U+<UCS4 hexadecimal code for the glyph>
155
156 where by definition the UCS4 hexadecimal code completely
157 identifies the glyph in a unique way which is easy to look up,
158 e.g., with the gucharmap application.
159
160 The net result of this change is the PLplot test_diff_device
161 target for the case when -DPLPLOT_TEST_DEVICE=psttfc now gives a
162 clean report for the first time ever. So this change is an
163 important one.
164
1652.3 Set target property POSITION_INDEPENDENT_CODE ON for the libLASi library
166
167 This change is an important motivation for this release.
168
169 This bug fix allows the static version of libLASi to be used with
170 shared builds of external software that depend on libLASi such as
171 the PLplot psttf device driver.
172
1732.4 Make "MissingGlyphExample" a more stringent test of font or glyph issues for libLASi
174
175 The most important change here was to add
176
177"Unicode U+2648 ARIES (twice): ♈♈"
178"Embedded newlines a\\nb\\nc: a\nb\nc"
179
180 to the strings that are rendered to PostScript by this example.
181
182 For the first of these, the Debian Buster version of pango
183 (likely due to the default fontconfig configuration) decides to
184 use the popular Noto Color Emoji font to render the Aries glyphs,
185 but the problem for that font is it is a pure bitmap font with no
186 outline information that is required by libLASi. So this line
187 tests the response of libLASi to this situation.
188
189 For the second of these the linefeed "\n" glyph is a non-printing
190 glyph. It appears for all such glyphs there is a "missing glyph"
191 issue so regardless of future font improvements this line seems
192 to be a reliable way to trigger missing-glyph issues to test the
193 response of libLASi to this situation.
194
1952.5 Replace deprecated lower-case variants of Freetype macro constants with preferred upper-case form
196
1972.6 Add bounding boxes to the "MissingGlyphExample" and "ComplexTextLayoutExample" examples
198
199 The resulting MissingGlyphExample.eps and
200 ComplexTextLayoutExample.eps files join SimpleLASiExample.eps as
201 being properly formatted EPS (Encapsulated PostScript) files.
202
203 Note also that for the "Complex Text Layout" case, I implemented
204 some generally useful C++ code macros (called
205 LASI_SHOW_AND_UPDATE_BB, LASI_SCALED_SHOW_AND_UPDATE_BB, and
206 LASI_ROTATED_SHOW_AND_UPDATE_BB), which made it straightforward
207 to handle even complex cases such as determining the bounding box
208 of text that has undergone anamorphic scaling or rotation. For
209 example, the LASI_ROTATED_SHOW_AND_UPDATE_BB macro includes C++
210 code to apply the rotation matrix to determine the x,y
211 coordinates of the corners of the rotated text box and use those
212 corner coordinates to help determine the overall bounding box.
213
2142.7 Rename example applications and results using consistent and descriptive core names
215
216 Those core names are " MissingGlyphExample", "SimpleLASiExample",
217 and "ComplexTextLayoutExample". As a result the example source
218 code name is <core name>.cpp, the example application name is
219 <core name> (or <core name>.exe on Windows platforms), the EPS
220 (Encapsulated PostScript) results are named <core name>.eps, and
221 the PNG results (generated from the EPS results using inkscape)
222 are named <core name>.png.
223
2242.8 Fix low-resolution boundary box issue
225
226 As a result of this change the low-res (int) BB (bounding box)
227 limits are calculated from the high-res (double) BB limits with
228 the appropriate combinations of floor and ceil so the low-res
229 limits always lie on or outside (by up to but not including 1
230 point) the high-res limits. Previously this calculation was done
231 incorrectly with floor for all limits.
232
2332.9 Update doxygen configuration files from doxygen version 1.8.1.2 to 1.8.13
234
235 These changes were done in the usual way by running the following
236 commands:
237
238doxygen -u Doxyfile.developer
239doxygen -u Doxyfile.user
240
2412.10 Change the minimum version of CMake from 2.8.9 to 3.13.2
242
243 This change was motivated by the bug fixes in later CMake
244 versions and also the much better checking of the build system
245 that occurs for the policies automatically used for 3.13.2.
246
2473. Testing of this release.
248
249This release has been successfully built and run-tested (following the
250prescription in README.Release_Manager_Cookbook) for both the shared
251and static library case on Linux (Debian Buster) using CMake-3.13.2
252(the minimum allowed version of CMake for libLASi), libpango-1.42.4,
253libcairo-1.16.0, libfreetype-2.9.1, and libfontconfig-2.13.1.
254
255This release has not been tested (yet) on Mac OS X or Windows
256platforms, but we anticipate no difficulties on those platforms since
257previous versions of libLASi have worked well on those platforms. In
258other words, the cross-platform nature of libLASi appears to have been
259well supported by CMake in the past, and we feel that happy state will
260continue with this release as well.
261