From 8a365ef6540973d4db3ea2dd6b07d5656bd8aba6 Mon Sep 17 00:00:00 2001 From: hanxi Date: Fri, 16 May 2014 18:05:50 +0800 Subject: [PATCH 1/4] add android --- android/AndroidManifest.xml | 31 + android/README.md | 31 + android/build.xml | 92 + android/build_native.sh | 29 + android/jni/Android.mk | 73 + android/jni/Application.mk | 2 + android/jni/main.c | 356 + android/jni/ndk_modules/freetype/Android.mk | 49 + android/jni/ndk_modules/freetype/CleanSpec.mk | 49 + .../jni/ndk_modules/freetype/builds/ft2unix.h | 61 + .../include/freetype/config/ftconfig.h | 528 ++ .../include/freetype/config/ftheader.h | 780 ++ .../include/freetype/config/ftmodule.h | 24 + .../include/freetype/config/ftoption.h | 733 ++ .../include/freetype/config/ftstdlib.h | 173 + .../freetype/include/freetype/freetype.h | 3919 ++++++++ .../freetype/include/freetype/ftadvanc.h | 179 + .../freetype/include/freetype/ftbbox.h | 94 + .../freetype/include/freetype/ftbdf.h | 209 + .../freetype/include/freetype/ftbitmap.h | 227 + .../freetype/include/freetype/ftcache.h | 1125 +++ .../freetype/include/freetype/ftchapters.h | 103 + .../freetype/include/freetype/ftcid.h | 166 + .../freetype/include/freetype/fterrdef.h | 244 + .../freetype/include/freetype/fterrors.h | 206 + .../freetype/include/freetype/ftgasp.h | 120 + .../freetype/include/freetype/ftglyph.h | 613 ++ .../freetype/include/freetype/ftgxval.h | 358 + .../freetype/include/freetype/ftgzip.h | 102 + .../freetype/include/freetype/ftimage.h | 1301 +++ .../freetype/include/freetype/ftincrem.h | 353 + .../freetype/include/freetype/ftlcdfil.h | 213 + .../freetype/include/freetype/ftlist.h | 277 + .../freetype/include/freetype/ftlzw.h | 99 + .../freetype/include/freetype/ftmac.h | 274 + .../freetype/include/freetype/ftmm.h | 378 + .../freetype/include/freetype/ftmodapi.h | 483 + .../freetype/include/freetype/ftmoderr.h | 155 + .../freetype/include/freetype/ftotval.h | 203 + .../freetype/include/freetype/ftoutln.h | 537 ++ .../freetype/include/freetype/ftpfr.h | 172 + .../freetype/include/freetype/ftrender.h | 230 + .../freetype/include/freetype/ftsizes.h | 159 + .../freetype/include/freetype/ftsnames.h | 200 + .../freetype/include/freetype/ftstroke.h | 716 ++ .../freetype/include/freetype/ftsynth.h | 80 + .../freetype/include/freetype/ftsystem.h | 347 + .../freetype/include/freetype/fttrigon.h | 350 + .../freetype/include/freetype/fttypes.h | 588 ++ .../freetype/include/freetype/ftwinfnt.h | 274 + .../freetype/include/freetype/ftxf86.h | 83 + .../include/freetype/internal/autohint.h | 231 + .../include/freetype/internal/ftcalc.h | 179 + .../include/freetype/internal/ftdebug.h | 250 + .../include/freetype/internal/ftdriver.h | 422 + .../include/freetype/internal/ftgloadr.h | 168 + .../include/freetype/internal/ftmemory.h | 380 + .../include/freetype/internal/ftobjs.h | 1428 +++ .../include/freetype/internal/ftpic.h | 67 + .../include/freetype/internal/ftrfork.h | 196 + .../include/freetype/internal/ftserv.h | 620 ++ .../include/freetype/internal/ftstream.h | 539 ++ .../include/freetype/internal/fttrace.h | 139 + .../include/freetype/internal/ftvalid.h | 150 + .../include/freetype/internal/internal.h | 51 + .../include/freetype/internal/pcftypes.h | 56 + .../include/freetype/internal/psaux.h | 873 ++ .../include/freetype/internal/pshints.h | 712 ++ .../freetype/internal/services/svbdf.h | 77 + .../freetype/internal/services/svcid.h | 83 + .../freetype/internal/services/svgldict.h | 82 + .../freetype/internal/services/svgxval.h | 72 + .../freetype/internal/services/svkern.h | 51 + .../include/freetype/internal/services/svmm.h | 104 + .../freetype/internal/services/svotval.h | 55 + .../freetype/internal/services/svpfr.h | 66 + .../freetype/internal/services/svpostnm.h | 79 + .../freetype/internal/services/svpscmap.h | 164 + .../freetype/internal/services/svpsinfo.h | 92 + .../freetype/internal/services/svsfnt.h | 102 + .../freetype/internal/services/svttcmap.h | 106 + .../freetype/internal/services/svtteng.h | 53 + .../freetype/internal/services/svttglyf.h | 67 + .../freetype/internal/services/svwinfnt.h | 50 + .../freetype/internal/services/svxf86nm.h | 55 + .../freetype/include/freetype/internal/sfnt.h | 897 ++ .../include/freetype/internal/t1types.h | 270 + .../include/freetype/internal/tttypes.h | 1543 ++++ .../freetype/include/freetype/t1tables.h | 504 + .../freetype/include/freetype/ttnameid.h | 1247 +++ .../freetype/include/freetype/tttables.h | 759 ++ .../freetype/include/freetype/tttags.h | 107 + .../freetype/include/freetype/ttunpat.h | 59 + .../ndk_modules/freetype/include/ft2build.h | 39 + .../freetype/src/autofit/afangles.c | 292 + .../freetype/src/autofit/afangles.h | 7 + .../ndk_modules/freetype/src/autofit/afcjk.c | 1512 +++ .../ndk_modules/freetype/src/autofit/afcjk.h | 57 + .../freetype/src/autofit/afdummy.c | 60 + .../freetype/src/autofit/afdummy.h | 42 + .../freetype/src/autofit/aferrors.h | 40 + .../freetype/src/autofit/afglobal.c | 323 + .../freetype/src/autofit/afglobal.h | 71 + .../freetype/src/autofit/afhints.c | 1142 +++ .../freetype/src/autofit/afhints.h | 332 + .../freetype/src/autofit/afindic.c | 130 + .../freetype/src/autofit/afindic.h | 40 + .../freetype/src/autofit/aflatin.c | 2227 +++++ .../freetype/src/autofit/aflatin.h | 212 + .../freetype/src/autofit/aflatin2.c | 2345 +++++ .../freetype/src/autofit/aflatin2.h | 39 + .../freetype/src/autofit/afloader.c | 539 ++ .../freetype/src/autofit/afloader.h | 73 + .../freetype/src/autofit/afmodule.c | 94 + .../freetype/src/autofit/afmodule.h | 37 + .../ndk_modules/freetype/src/autofit/afpic.c | 94 + .../ndk_modules/freetype/src/autofit/afpic.h | 64 + .../freetype/src/autofit/aftypes.h | 403 + .../ndk_modules/freetype/src/autofit/afwarp.c | 338 + .../ndk_modules/freetype/src/autofit/afwarp.h | 64 + .../freetype/src/autofit/autofit.c | 41 + .../ndk_modules/freetype/src/base/basepic.c | 83 + .../ndk_modules/freetype/src/base/basepic.h | 62 + .../ndk_modules/freetype/src/base/ftadvanc.c | 163 + .../jni/ndk_modules/freetype/src/base/ftapi.c | 121 + .../ndk_modules/freetype/src/base/ftbase.c | 41 + .../ndk_modules/freetype/src/base/ftbase.h | 57 + .../ndk_modules/freetype/src/base/ftbbox.c | 662 ++ .../ndk_modules/freetype/src/base/ftbitmap.c | 663 ++ .../ndk_modules/freetype/src/base/ftcalc.c | 957 ++ .../ndk_modules/freetype/src/base/ftdbgmem.c | 997 ++ .../ndk_modules/freetype/src/base/ftdebug.c | 246 + .../ndk_modules/freetype/src/base/ftgasp.c | 61 + .../ndk_modules/freetype/src/base/ftgloadr.c | 401 + .../ndk_modules/freetype/src/base/ftglyph.c | 627 ++ .../ndk_modules/freetype/src/base/ftinit.c | 253 + .../ndk_modules/freetype/src/base/ftlcdfil.c | 376 + .../jni/ndk_modules/freetype/src/base/ftmm.c | 202 + .../ndk_modules/freetype/src/base/ftobjs.c | 4647 ++++++++++ .../ndk_modules/freetype/src/base/ftoutln.c | 1129 +++ .../ndk_modules/freetype/src/base/ftpatent.c | 286 + .../jni/ndk_modules/freetype/src/base/ftpic.c | 54 + .../ndk_modules/freetype/src/base/ftrfork.c | 821 ++ .../ndk_modules/freetype/src/base/ftsnames.c | 94 + .../ndk_modules/freetype/src/base/ftstream.c | 864 ++ .../ndk_modules/freetype/src/base/ftstroke.c | 2039 +++++ .../ndk_modules/freetype/src/base/ftsynth.c | 160 + .../ndk_modules/freetype/src/base/ftsystem.c | 307 + .../ndk_modules/freetype/src/base/fttrigon.c | 546 ++ .../ndk_modules/freetype/src/base/ftutil.c | 501 + .../ndk_modules/freetype/src/base/ftwinfnt.c | 51 + .../ndk_modules/freetype/src/base/ftxf86.c | 40 + .../jni/ndk_modules/freetype/src/cff/cff.c | 30 + .../ndk_modules/freetype/src/cff/cffcmap.c | 208 + .../ndk_modules/freetype/src/cff/cffcmap.h | 67 + .../ndk_modules/freetype/src/cff/cffdrivr.c | 671 ++ .../ndk_modules/freetype/src/cff/cffdrivr.h | 38 + .../ndk_modules/freetype/src/cff/cfferrs.h | 41 + .../ndk_modules/freetype/src/cff/cffgload.c | 2972 ++++++ .../ndk_modules/freetype/src/cff/cffgload.h | 201 + .../ndk_modules/freetype/src/cff/cffload.c | 1671 ++++ .../ndk_modules/freetype/src/cff/cffload.h | 83 + .../ndk_modules/freetype/src/cff/cffobjs.c | 1008 ++ .../ndk_modules/freetype/src/cff/cffobjs.h | 181 + .../ndk_modules/freetype/src/cff/cffparse.c | 924 ++ .../ndk_modules/freetype/src/cff/cffparse.h | 102 + .../jni/ndk_modules/freetype/src/cff/cffpic.c | 101 + .../jni/ndk_modules/freetype/src/cff/cffpic.h | 80 + .../ndk_modules/freetype/src/cff/cfftoken.h | 97 + .../ndk_modules/freetype/src/cff/cfftypes.h | 281 + .../ndk_modules/freetype/src/psaux/afmparse.c | 964 ++ .../ndk_modules/freetype/src/psaux/afmparse.h | 88 + .../ndk_modules/freetype/src/psaux/psaux.c | 34 + .../ndk_modules/freetype/src/psaux/psauxerr.h | 41 + .../ndk_modules/freetype/src/psaux/psauxmod.c | 139 + .../ndk_modules/freetype/src/psaux/psauxmod.h | 42 + .../ndk_modules/freetype/src/psaux/psconv.c | 472 + .../ndk_modules/freetype/src/psaux/psconv.h | 71 + .../ndk_modules/freetype/src/psaux/psobjs.c | 1711 ++++ .../ndk_modules/freetype/src/psaux/psobjs.h | 212 + .../ndk_modules/freetype/src/psaux/t1cmap.c | 341 + .../ndk_modules/freetype/src/psaux/t1cmap.h | 105 + .../ndk_modules/freetype/src/psaux/t1decode.c | 1598 ++++ .../ndk_modules/freetype/src/psaux/t1decode.h | 64 + .../freetype/src/pshinter/pshalgo.c | 2308 +++++ .../freetype/src/pshinter/pshalgo.h | 255 + .../freetype/src/pshinter/pshglob.c | 750 ++ .../freetype/src/pshinter/pshglob.h | 196 + .../freetype/src/pshinter/pshinter.c | 29 + .../freetype/src/pshinter/pshmod.c | 118 + .../freetype/src/pshinter/pshmod.h | 39 + .../freetype/src/pshinter/pshnterr.h | 40 + .../freetype/src/pshinter/pshpic.c | 69 + .../freetype/src/pshinter/pshpic.h | 53 + .../freetype/src/pshinter/pshrec.c | 1224 +++ .../freetype/src/pshinter/pshrec.h | 176 + .../freetype/src/psnames/psmodule.c | 597 ++ .../freetype/src/psnames/psmodule.h | 38 + .../freetype/src/psnames/psnamerr.h | 41 + .../freetype/src/psnames/psnames.c | 26 + .../ndk_modules/freetype/src/psnames/pspic.c | 79 + .../ndk_modules/freetype/src/psnames/pspic.h | 54 + .../freetype/src/psnames/pstables.h | 4095 +++++++++ .../ndk_modules/freetype/src/raster/ftmisc.h | 121 + .../freetype/src/raster/ftraster.c | 3565 ++++++++ .../freetype/src/raster/ftraster.h | 46 + .../ndk_modules/freetype/src/raster/ftrend1.c | 291 + .../ndk_modules/freetype/src/raster/ftrend1.h | 44 + .../ndk_modules/freetype/src/raster/raster.c | 27 + .../freetype/src/raster/rasterrs.h | 41 + .../ndk_modules/freetype/src/raster/rastpic.c | 90 + .../ndk_modules/freetype/src/raster/rastpic.h | 50 + .../ndk_modules/freetype/src/sfnt/sfdriver.c | 651 ++ .../ndk_modules/freetype/src/sfnt/sfdriver.h | 38 + .../ndk_modules/freetype/src/sfnt/sferrors.h | 41 + .../jni/ndk_modules/freetype/src/sfnt/sfnt.c | 42 + .../ndk_modules/freetype/src/sfnt/sfntpic.c | 102 + .../ndk_modules/freetype/src/sfnt/sfntpic.h | 88 + .../ndk_modules/freetype/src/sfnt/sfobjs.c | 1149 +++ .../ndk_modules/freetype/src/sfnt/sfobjs.h | 54 + .../jni/ndk_modules/freetype/src/sfnt/ttbdf.c | 250 + .../jni/ndk_modules/freetype/src/sfnt/ttbdf.h | 46 + .../ndk_modules/freetype/src/sfnt/ttcmap.c | 3512 +++++++ .../ndk_modules/freetype/src/sfnt/ttcmap.h | 125 + .../ndk_modules/freetype/src/sfnt/ttcmapc.h | 55 + .../ndk_modules/freetype/src/sfnt/ttkern.c | 306 + .../ndk_modules/freetype/src/sfnt/ttkern.h | 52 + .../ndk_modules/freetype/src/sfnt/ttload.c | 1262 +++ .../ndk_modules/freetype/src/sfnt/ttload.h | 112 + .../jni/ndk_modules/freetype/src/sfnt/ttmtx.c | 468 + .../jni/ndk_modules/freetype/src/sfnt/ttmtx.h | 55 + .../ndk_modules/freetype/src/sfnt/ttpost.c | 521 ++ .../ndk_modules/freetype/src/sfnt/ttpost.h | 46 + .../ndk_modules/freetype/src/sfnt/ttsbit.c | 1508 +++ .../ndk_modules/freetype/src/sfnt/ttsbit.h | 79 + .../ndk_modules/freetype/src/sfnt/ttsbit0.c | 1011 ++ .../ndk_modules/freetype/src/smooth/ftgrays.c | 2091 +++++ .../ndk_modules/freetype/src/smooth/ftgrays.h | 58 + .../freetype/src/smooth/ftsmerrs.h | 41 + .../freetype/src/smooth/ftsmooth.c | 481 + .../freetype/src/smooth/ftsmooth.h | 49 + .../ndk_modules/freetype/src/smooth/ftspic.c | 98 + .../ndk_modules/freetype/src/smooth/ftspic.h | 50 + .../ndk_modules/freetype/src/smooth/smooth.c | 27 + .../freetype/src/truetype/truetype.c | 37 + .../freetype/src/truetype/ttdriver.c | 487 + .../freetype/src/truetype/ttdriver.h | 38 + .../freetype/src/truetype/tterrors.h | 40 + .../freetype/src/truetype/ttgload.c | 2144 +++++ .../freetype/src/truetype/ttgload.h | 63 + .../freetype/src/truetype/ttgxvar.c | 1548 ++++ .../freetype/src/truetype/ttgxvar.h | 182 + .../freetype/src/truetype/ttinterp.c | 8138 +++++++++++++++++ .../freetype/src/truetype/ttinterp.h | 319 + .../freetype/src/truetype/ttobjs.c | 951 ++ .../freetype/src/truetype/ttobjs.h | 431 + .../ndk_modules/freetype/src/truetype/ttpic.c | 81 + .../ndk_modules/freetype/src/truetype/ttpic.h | 59 + .../freetype/src/truetype/ttpload.c | 572 ++ .../freetype/src/truetype/ttpload.h | 75 + android/jni/ndk_modules/miniunz/Android.mk | 16 + .../ndk_modules/miniunz/MiniZip64_info.txt | 74 + android/jni/ndk_modules/miniunz/ioapi.c | 246 + android/jni/ndk_modules/miniunz/ioapi.h | 214 + android/jni/ndk_modules/miniunz/miniunz.c | 705 ++ android/jni/ndk_modules/miniunz/miniunz.h | 14 + android/jni/ndk_modules/miniunz/unzip.c | 2125 +++++ android/jni/ndk_modules/miniunz/unzip.h | 437 + android/jni/winfont.c | 140 + android/jni/winfw.c | 131 + android/jni/winfw.h | 19 + android/local.properties | 10 + android/proguard-project.txt | 20 + android/project.properties | 14 + android/res/values/strings.xml | 4 + 275 files changed, 122423 insertions(+) create mode 100644 android/AndroidManifest.xml create mode 100644 android/README.md create mode 100644 android/build.xml create mode 100755 android/build_native.sh create mode 100644 android/jni/Android.mk create mode 100644 android/jni/Application.mk create mode 100644 android/jni/main.c create mode 100644 android/jni/ndk_modules/freetype/Android.mk create mode 100644 android/jni/ndk_modules/freetype/CleanSpec.mk create mode 100644 android/jni/ndk_modules/freetype/builds/ft2unix.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/config/ftconfig.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/config/ftheader.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/config/ftmodule.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/config/ftoption.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/config/ftstdlib.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/freetype.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftadvanc.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftbbox.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftbdf.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftbitmap.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftcache.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftchapters.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftcid.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/fterrdef.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/fterrors.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftgasp.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftglyph.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftgxval.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftgzip.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftimage.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftincrem.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftlcdfil.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftlist.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftlzw.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftmac.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftmm.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftmodapi.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftmoderr.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftotval.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftoutln.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftpfr.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftrender.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftsizes.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftsnames.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftstroke.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftsynth.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftsystem.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/fttrigon.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/fttypes.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftwinfnt.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftxf86.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/autohint.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftcalc.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftdebug.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftdriver.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftgloadr.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftmemory.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftobjs.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftpic.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftrfork.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftserv.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftstream.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/fttrace.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftvalid.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/internal.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/pcftypes.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/psaux.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/pshints.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svbdf.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svcid.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svgldict.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svgxval.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svkern.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svmm.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svotval.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svpfr.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svpostnm.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svpscmap.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svpsinfo.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svsfnt.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svttcmap.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svtteng.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svttglyf.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svwinfnt.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svxf86nm.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/sfnt.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/t1types.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/tttypes.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/t1tables.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ttnameid.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/tttables.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/tttags.h create mode 100644 android/jni/ndk_modules/freetype/include/freetype/ttunpat.h create mode 100644 android/jni/ndk_modules/freetype/include/ft2build.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afangles.c create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afangles.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afcjk.c create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afcjk.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afdummy.c create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afdummy.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/aferrors.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afglobal.c create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afglobal.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afhints.c create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afhints.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afindic.c create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afindic.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/aflatin.c create mode 100644 android/jni/ndk_modules/freetype/src/autofit/aflatin.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/aflatin2.c create mode 100644 android/jni/ndk_modules/freetype/src/autofit/aflatin2.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afloader.c create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afloader.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afmodule.c create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afmodule.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afpic.c create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afpic.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/aftypes.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afwarp.c create mode 100644 android/jni/ndk_modules/freetype/src/autofit/afwarp.h create mode 100644 android/jni/ndk_modules/freetype/src/autofit/autofit.c create mode 100644 android/jni/ndk_modules/freetype/src/base/basepic.c create mode 100644 android/jni/ndk_modules/freetype/src/base/basepic.h create mode 100644 android/jni/ndk_modules/freetype/src/base/ftadvanc.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftapi.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftbase.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftbase.h create mode 100644 android/jni/ndk_modules/freetype/src/base/ftbbox.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftbitmap.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftcalc.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftdbgmem.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftdebug.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftgasp.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftgloadr.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftglyph.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftinit.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftlcdfil.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftmm.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftobjs.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftoutln.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftpatent.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftpic.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftrfork.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftsnames.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftstream.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftstroke.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftsynth.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftsystem.c create mode 100644 android/jni/ndk_modules/freetype/src/base/fttrigon.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftutil.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftwinfnt.c create mode 100644 android/jni/ndk_modules/freetype/src/base/ftxf86.c create mode 100644 android/jni/ndk_modules/freetype/src/cff/cff.c create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffcmap.c create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffcmap.h create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffdrivr.c create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffdrivr.h create mode 100644 android/jni/ndk_modules/freetype/src/cff/cfferrs.h create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffgload.c create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffgload.h create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffload.c create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffload.h create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffobjs.c create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffobjs.h create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffparse.c create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffparse.h create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffpic.c create mode 100644 android/jni/ndk_modules/freetype/src/cff/cffpic.h create mode 100644 android/jni/ndk_modules/freetype/src/cff/cfftoken.h create mode 100644 android/jni/ndk_modules/freetype/src/cff/cfftypes.h create mode 100644 android/jni/ndk_modules/freetype/src/psaux/afmparse.c create mode 100644 android/jni/ndk_modules/freetype/src/psaux/afmparse.h create mode 100644 android/jni/ndk_modules/freetype/src/psaux/psaux.c create mode 100644 android/jni/ndk_modules/freetype/src/psaux/psauxerr.h create mode 100644 android/jni/ndk_modules/freetype/src/psaux/psauxmod.c create mode 100644 android/jni/ndk_modules/freetype/src/psaux/psauxmod.h create mode 100644 android/jni/ndk_modules/freetype/src/psaux/psconv.c create mode 100644 android/jni/ndk_modules/freetype/src/psaux/psconv.h create mode 100644 android/jni/ndk_modules/freetype/src/psaux/psobjs.c create mode 100644 android/jni/ndk_modules/freetype/src/psaux/psobjs.h create mode 100644 android/jni/ndk_modules/freetype/src/psaux/t1cmap.c create mode 100644 android/jni/ndk_modules/freetype/src/psaux/t1cmap.h create mode 100644 android/jni/ndk_modules/freetype/src/psaux/t1decode.c create mode 100644 android/jni/ndk_modules/freetype/src/psaux/t1decode.h create mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshalgo.c create mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshalgo.h create mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshglob.c create mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshglob.h create mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshinter.c create mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshmod.c create mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshmod.h create mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshnterr.h create mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshpic.c create mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshpic.h create mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshrec.c create mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshrec.h create mode 100644 android/jni/ndk_modules/freetype/src/psnames/psmodule.c create mode 100644 android/jni/ndk_modules/freetype/src/psnames/psmodule.h create mode 100644 android/jni/ndk_modules/freetype/src/psnames/psnamerr.h create mode 100644 android/jni/ndk_modules/freetype/src/psnames/psnames.c create mode 100644 android/jni/ndk_modules/freetype/src/psnames/pspic.c create mode 100644 android/jni/ndk_modules/freetype/src/psnames/pspic.h create mode 100644 android/jni/ndk_modules/freetype/src/psnames/pstables.h create mode 100644 android/jni/ndk_modules/freetype/src/raster/ftmisc.h create mode 100644 android/jni/ndk_modules/freetype/src/raster/ftraster.c create mode 100644 android/jni/ndk_modules/freetype/src/raster/ftraster.h create mode 100644 android/jni/ndk_modules/freetype/src/raster/ftrend1.c create mode 100644 android/jni/ndk_modules/freetype/src/raster/ftrend1.h create mode 100644 android/jni/ndk_modules/freetype/src/raster/raster.c create mode 100644 android/jni/ndk_modules/freetype/src/raster/rasterrs.h create mode 100644 android/jni/ndk_modules/freetype/src/raster/rastpic.c create mode 100644 android/jni/ndk_modules/freetype/src/raster/rastpic.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfdriver.c create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfdriver.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sferrors.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfnt.c create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfntpic.c create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfntpic.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfobjs.c create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfobjs.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttbdf.c create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttbdf.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttcmap.c create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttcmap.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttcmapc.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttkern.c create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttkern.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttload.c create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttload.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttmtx.c create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttmtx.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttpost.c create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttpost.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttsbit.c create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttsbit.h create mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttsbit0.c create mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftgrays.c create mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftgrays.h create mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftsmerrs.h create mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftsmooth.c create mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftsmooth.h create mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftspic.c create mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftspic.h create mode 100644 android/jni/ndk_modules/freetype/src/smooth/smooth.c create mode 100644 android/jni/ndk_modules/freetype/src/truetype/truetype.c create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttdriver.c create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttdriver.h create mode 100644 android/jni/ndk_modules/freetype/src/truetype/tterrors.h create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttgload.c create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttgload.h create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttgxvar.c create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttgxvar.h create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttinterp.c create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttinterp.h create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttobjs.c create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttobjs.h create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttpic.c create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttpic.h create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttpload.c create mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttpload.h create mode 100644 android/jni/ndk_modules/miniunz/Android.mk create mode 100644 android/jni/ndk_modules/miniunz/MiniZip64_info.txt create mode 100644 android/jni/ndk_modules/miniunz/ioapi.c create mode 100644 android/jni/ndk_modules/miniunz/ioapi.h create mode 100644 android/jni/ndk_modules/miniunz/miniunz.c create mode 100644 android/jni/ndk_modules/miniunz/miniunz.h create mode 100644 android/jni/ndk_modules/miniunz/unzip.c create mode 100644 android/jni/ndk_modules/miniunz/unzip.h create mode 100644 android/jni/winfont.c create mode 100644 android/jni/winfw.c create mode 100644 android/jni/winfw.h create mode 100644 android/local.properties create mode 100644 android/proguard-project.txt create mode 100644 android/project.properties create mode 100644 android/res/values/strings.xml diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml new file mode 100644 index 00000000..7989c4c1 --- /dev/null +++ b/android/AndroidManifest.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/README.md b/android/README.md new file mode 100644 index 00000000..561c4226 --- /dev/null +++ b/android/README.md @@ -0,0 +1,31 @@ +start Android project +==== + +For Linux , + +* Install android-sdk +* Install android-ndk +* Install ant +* Install glew 1.9 +* Install freetype 2 + +this project use ant build tools to generate apk file. + +#### 1. update your android project + +``` + /tools/android update project -p -t +``` + +#### 2. build it + +``` + $ cd ejoy2d/android + $ sh build_native.sh +``` + +it will generate apk "ejoy2d/android/bin/ejoy2d-debug.apk". + +install the apk in phone or simulator to show examples. + + diff --git a/android/build.xml b/android/build.xml new file mode 100644 index 00000000..8e3838a2 --- /dev/null +++ b/android/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/build_native.sh b/android/build_native.sh new file mode 100755 index 00000000..f5490a62 --- /dev/null +++ b/android/build_native.sh @@ -0,0 +1,29 @@ +DIR=$(cd "$( dirname "$0")"; pwd) +APP_ROOT="$DIR"/.. +if [ -f "$DIR"/assets/game.zip ]; then + rm -rf "$DIR"/assets/game.zip +fi +if [ -d "$DIR"/assets/examples ]; then + rm -rf "$DIR"/assets/examples +fi +if [ -d "$DIR"/assets/ejoy2d ]; then + rm -rf "$DIR"/assets/ejoy2d +fi +mkdir -p "$DIR"/assets +chmod 755 "$DIR"/assets +cp -rf "$APP_ROOT"/examples "$DIR"/assets/ +cp -rf "$APP_ROOT"/ejoy2d "$DIR"/assets/ + +cd "$DIR"/assets +zip -r game.zip . && rm -rf examples ejoy2d +cd - + +if [ -d "$DIR"/bin ]; then + rm -rf "$DIR"/bin +fi + +ndk-build -C "." $* "NDK_MODULE_PATH=jni/ndk_modules" +ant debug -q +#adb uninstall com.example.ejoy2d +#adb install bin/ejoy2d-debug.apk +#adb logcat diff --git a/android/jni/Android.mk b/android/jni/Android.mk new file mode 100644 index 00000000..11f99661 --- /dev/null +++ b/android/jni/Android.mk @@ -0,0 +1,73 @@ +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE := native-activity +LOCAL_SRC_FILES := main.c winfont.c winfw.c \ + ../../lib/shader.c \ + ../../lib/lshader.c \ + ../../lib/ejoy2dgame.c \ + ../../lib/fault.c \ + ../../lib/screen.c \ + ../../lib/texture.c \ + ../../lib/ppm.c \ + ../../lib/spritepack.c \ + ../../lib/sprite.c \ + ../../lib/lsprite.c \ + ../../lib/matrix.c \ + ../../lib/lmatrix.c \ + ../../lib/dfont.c \ + ../../lib/label.c \ + ../../lib/particle.c \ + ../../lib/lparticle.c \ + ../../lib/scissor.c + +LOCAL_SRC_FILES += \ + ../../lua/lapi.c \ + ../../lua/lauxlib.c \ + ../../lua/lbaselib.c \ + ../../lua/lbitlib.c \ + ../../lua/lcode.c \ + ../../lua/lcorolib.c \ + ../../lua/lctype.c \ + ../../lua/ldblib.c \ + ../../lua/ldebug.c \ + ../../lua/ldo.c \ + ../../lua/ldump.c \ + ../../lua/lfunc.c \ + ../../lua/lgc.c \ + ../../lua/linit.c \ + ../../lua/liolib.c \ + ../../lua/llex.c \ + ../../lua/lmathlib.c \ + ../../lua/lmem.c \ + ../../lua/loadlib.c \ + ../../lua/lobject.c \ + ../../lua/lopcodes.c \ + ../../lua/loslib.c \ + ../../lua/lparser.c \ + ../../lua/lstate.c \ + ../../lua/lstring.c \ + ../../lua/lstrlib.c \ + ../../lua/ltable.c \ + ../../lua/ltablib.c \ + ../../lua/ltm.c \ + ../../lua/lundump.c \ + ../../lua/lvm.c \ + ../../lua/lzio.c + +LOCAL_C_INCLUDES := $(LOCAL_PATH) \ + $(LOCAL_PATH)/../../lib \ + $(LOCAL_PATH)/../../lua + + +LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2 -lz +LOCAL_STATIC_LIBRARIES := android_native_app_glue \ + freetype \ + miniunz + +include $(BUILD_SHARED_LIBRARY) + +$(call import-module,android/native_app_glue) +$(call import-module,freetype) +$(call import-module,miniunz) + diff --git a/android/jni/Application.mk b/android/jni/Application.mk new file mode 100644 index 00000000..731dafc1 --- /dev/null +++ b/android/jni/Application.mk @@ -0,0 +1,2 @@ +APP_PLATFORM := android-10 +#APP_CFLAGS += -Wno-error=format-security diff --git a/android/jni/main.c b/android/jni/main.c new file mode 100644 index 00000000..919408e9 --- /dev/null +++ b/android/jni/main.c @@ -0,0 +1,356 @@ +#include "winfw.h" +#include "platform_print.h" +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define MAXFILENAME (1024) +#define UPDATE_INTERVAL 1 /* 10ms */ + +void font_init(const char* fontname); + +/** + * Our saved state data. + */ +struct saved_state { + float angle; + int32_t x; + int32_t y; +}; + +/** + * Shared state for our app. + */ +struct engine { + struct android_app* app; + + int animating; + EGLDisplay display; + EGLSurface surface; + EGLContext context; + int32_t width; + int32_t height; + struct saved_state state; + const char* writeablePath; +}; + +/** + * Initialize an EGL context for the current display. + */ +static int engine_init_display(struct engine* engine) { + /* Here specify the attributes of the desired configuration. + * Below, we select an EGLConfig with at least 8 bits per color + * component compatible with on-screen windows + */ + const EGLint attribs[] = { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_BLUE_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_RED_SIZE, 8, + EGL_NONE + }; + EGLint w,h,format; + EGLint numConfigs; + EGLConfig config; + EGLSurface surface; + EGLContext context; + + EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + + eglInitialize(display, 0, 0); + + /* Here, the application chooses the configuration it desires. In this + * sample, we have a very simplified selection process, where we pick + * the first EGLConfig that matches our criteria */ + eglChooseConfig(display, attribs, &config, 1, &numConfigs); + + /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is + * guaranteed to be accepted by ANativeWindow_setBuffersGeometry(). + * As soon as we picked a EGLConfig, we can safely reconfigure the + * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */ + eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format); + + ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format); + surface = eglCreateWindowSurface(display, config, engine->app->window, NULL); + + /* for opengles 2.0 */ + const EGLint ContextAttribList[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + context = eglCreateContext(display, config, EGL_NO_CONTEXT, ContextAttribList); + + if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) { + pf_log("Unable to eglMakeCurrent"); + return -1; + } + + eglQuerySurface(display, surface, EGL_WIDTH, &w); + eglQuerySurface(display, surface, EGL_HEIGHT, &h); + pf_log("device:width=%d,height=%d",w,h); + + engine->animating = 1; + engine->display = display; + engine->context = context; + engine->surface = surface; + engine->width = w; + engine->height = h; + engine->state.angle = 0; + + char fontname[MAXFILENAME+16] = ""; + snprintf(fontname,MAXFILENAME,"%s/examples/asset/kaiti_GB2312.ttf", + engine->writeablePath); + font_init(fontname); + ejoy2d_win_init(engine->width, engine->height, engine->writeablePath); + return 0; +} + +/** + * Just the current frame in the display. + */ +static void engine_draw_frame(struct engine* engine) { + if (engine->display == NULL) { + pf_log("engine_draw_frame : No display."); + return; + } + + ejoy2d_win_frame(); + eglSwapBuffers(engine->display, engine->surface); +} + +/** + * Tear down the EGL context currently associated with the display. + */ +static void engine_term_display(struct engine* engine) { + if (engine->display != EGL_NO_DISPLAY) { + eglMakeCurrent(engine->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (engine->context != EGL_NO_CONTEXT) { + eglDestroyContext(engine->display, engine->context); + } + if (engine->surface != EGL_NO_SURFACE) { + eglDestroySurface(engine->display, engine->surface); + } + eglTerminate(engine->display); + } + engine->animating = 0; + engine->display = EGL_NO_DISPLAY; + engine->context = EGL_NO_CONTEXT; + engine->surface = EGL_NO_SURFACE; +} + +/** + * Process the next input event. + */ +static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) { + struct engine* engine = (struct engine*)app->userData; + if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) { + int32_t x = AMotionEvent_getX(event, 0); + int32_t y = AMotionEvent_getY(event, 0); + switch (AMotionEvent_getAction(event)) { + case AMOTION_EVENT_ACTION_MOVE: + ejoy2d_win_touch(x, y, TOUCH_MOVE); + break; + case AMOTION_EVENT_ACTION_DOWN: + ejoy2d_win_touch(x, y, TOUCH_BEGIN); + break; + case AMOTION_EVENT_ACTION_UP: + ejoy2d_win_touch(x, y, TOUCH_END); + break; + } + engine->state.x = x; + engine->state.y = y; + return 1; + } + return 0; +} + +/** + * Process the next main command. + */ +static void engine_handle_cmd(struct android_app* app, int32_t cmd) { + struct engine* engine = (struct engine*)app->userData; + switch (cmd) { + case APP_CMD_SAVE_STATE: + // The system has asked us to save our current state. Do so. + engine->app->savedState = malloc(sizeof(struct saved_state)); + *((struct saved_state*)engine->app->savedState) = engine->state; + engine->app->savedStateSize = sizeof(struct saved_state); + break; + case APP_CMD_INIT_WINDOW: + // The window is being shown, get it ready. + if (engine->app->window != NULL) { + engine_init_display(engine); + engine_draw_frame(engine); + } + break; + case APP_CMD_TERM_WINDOW: + // The window is being hidden or closed, clean it up. + engine_term_display(engine); + break; + case APP_CMD_GAINED_FOCUS: + // When our app gains focus, we start monitoring the accelerometer. + engine->animating = 1; + ejoy2d_win_resume(); + break; + case APP_CMD_LOST_FOCUS: + // Also stop animating. + engine->animating = 0; + engine_draw_frame(engine); + break; + case APP_CMD_CONFIG_CHANGED: + if (engine->app->window != NULL + && ((engine->width != ANativeWindow_getWidth(app->window)) + || (engine->height != ANativeWindow_getHeight(app->window)))) { + engine_handle_cmd(app, APP_CMD_TERM_WINDOW); + engine_handle_cmd(app, APP_CMD_INIT_WINDOW); + } + break; + } +} + +int copyAssetFile(AAssetManager *mgr, const char* writeablePath) { + struct stat sb; + int32_t res = stat(writeablePath, &sb); + if (0 == res && sb.st_mode & S_IFDIR) { + pf_log("'files/' dir already in app's internal data storage."); + } + else if (ENOENT == errno) { + res = mkdir(writeablePath, 0770); + } + if (0 == res) { + const char *fname = "game.zip"; + char tofname[MAXFILENAME+16] = ""; + FILE *file = NULL; + + snprintf(tofname,MAXFILENAME,"%s/%s",writeablePath,fname); + file = fopen(tofname, "rb"); + if (file) { + fclose(file); + pf_log("file already exist : %s",tofname); + return 0; + } + + // copy file is not exist + AAsset *asset = AAssetManager_open(mgr, fname, AASSET_MODE_UNKNOWN); + if (asset==NULL) { + pf_log("no file : assets/%s",fname); + return 1; + } + + off_t fz = AAsset_getLength(asset); + const void* buf = AAsset_getBuffer(asset); + file = fopen(tofname, "wb"); + if (file) { + fwrite(buf, sizeof(char), fz, file); + fclose(file); + } + else { + pf_log("open file error : %s",tofname); + } + AAsset_close(asset); + res = unzip(tofname, writeablePath); + } + return res; +} + +const char* getWriteablePath(ANativeActivity *activity) { + if (activity->internalDataPath) { + pf_log("writeablePath : %s",activity->internalDataPath); + return activity->internalDataPath; + } + // android 2.3 must use jni. + JavaVM* vm = activity->vm; + JNIEnv* env = activity->env; + jint res = (*vm)->AttachCurrentThread(vm,&env, 0); + if (res!=0) { + pf_log("getWriteablePath error."); + } + jclass clazz = (*env)->GetObjectClass(env,activity->clazz); + jmethodID mid_getFilesDir = (*env)->GetMethodID(env,clazz, "getFilesDir", "()Ljava/io/File;"); + jobject obj_File = (*env)->CallObjectMethod(env,activity->clazz, mid_getFilesDir); + jclass cls_File = (*env)->GetObjectClass(env,obj_File); + jmethodID mid_getAbsolutePath = (*env)->GetMethodID(env,cls_File, "getAbsolutePath", "()Ljava/lang/String;"); + jstring path = (jstring)(*env)->CallObjectMethod(env,obj_File, mid_getAbsolutePath); + const char* writeablePath = (*env)->GetStringUTFChars(env,path, NULL); + pf_log("writeablePath by jni: %s",writeablePath); + (*vm)->DetachCurrentThread(vm); + return writeablePath; +} + +/** + * This is the main entry point of a native application that is using + * android_native_app_glue. It runs in its own thread, with its own + * event loop for receiving input events and doing other things. + */ +void android_main(struct android_app* state) { + struct engine engine; + uint32_t timestamp = 0; + + // Make sure glue isn't stripped. + app_dummy(); + + memset(&engine, 0, sizeof(engine)); + engine.writeablePath = getWriteablePath(state->activity); + state->userData = &engine; + state->onAppCmd = engine_handle_cmd; + state->onInputEvent = engine_handle_input; + engine.app = state; + + // init res : copy assets file to writeable path + copyAssetFile(state->activity->assetManager,engine.writeablePath); + + if (state->savedState != NULL) { + // We are starting with a previous saved state; restore from it. + engine.state = *(struct saved_state*)state->savedState; + } + + // loop waiting for stuff to do. + while (1) { + // Read all pending events. + int ident; + int events; + struct android_poll_source* source; + + // If not animating, we will block forever waiting for events. + // If animating, we loop until all events are read, then continue + // to draw the next frame of animation. + while ((ident=ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events, + (void**)&source)) >= 0) { + + // Process this event. + if (source != NULL) { + source->process(state, source); + } + + // Check if we are exiting. + if (state->destroyRequested != 0) { + engine_term_display(&engine); + return; + } + } + + if (engine.animating) { + // Done with events; draw next animation frame. + engine.state.angle += 0.1f; + if (engine.state.angle >= UPDATE_INTERVAL) { + engine.state.angle = 0; + ejoy2d_win_update(); + engine_draw_frame(&engine); + } + else { + usleep(1000); + } + } + } +} + diff --git a/android/jni/ndk_modules/freetype/Android.mk b/android/jni/ndk_modules/freetype/Android.mk new file mode 100644 index 00000000..e9eeb058 --- /dev/null +++ b/android/jni/ndk_modules/freetype/Android.mk @@ -0,0 +1,49 @@ +# this is now the default FreeType build for Android +# +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE := libfreetype + +# compile in ARM mode, since the glyph loader/renderer is a hotspot +# when loading complex pages in the browser +# +LOCAL_ARM_MODE := arm + +LOCAL_SRC_FILES:= \ + src/base/ftbbox.c \ + src/base/ftbitmap.c \ + src/base/ftglyph.c \ + src/base/ftstroke.c \ + src/base/ftxf86.c \ + src/base/ftbase.c \ + src/base/ftsystem.c \ + src/base/ftinit.c \ + src/base/ftgasp.c \ + src/raster/raster.c \ + src/sfnt/sfnt.c \ + src/smooth/smooth.c \ + src/autofit/autofit.c \ + src/truetype/truetype.c \ + src/cff/cff.c \ + src/psnames/psnames.c \ + src/pshinter/pshinter.c + +LOCAL_C_INCLUDES := \ + $(LOCAL_PATH)/builds \ + $(LOCAL_PATH)/include + +LOCAL_MODULE:= freetype +LOCAL_MODULE_FILENAME:= libfreetype + +LOCAL_EXPORT_C_INCLUDES := \ + $(LOCAL_PATH)/builds \ + $(LOCAL_PATH)/include + +#LOCAL_CFLAGS += -W -Wall +#LOCAL_CFLAGS += -fPIC -DPIC +LOCAL_CFLAGS += "-DDARWIN_NO_CARBON" +LOCAL_CFLAGS += "-DFT2_BUILD_LIBRARY" +#LOCAL_CFLAGS += -O2 + +include $(BUILD_STATIC_LIBRARY) diff --git a/android/jni/ndk_modules/freetype/CleanSpec.mk b/android/jni/ndk_modules/freetype/CleanSpec.mk new file mode 100644 index 00000000..b84e1b65 --- /dev/null +++ b/android/jni/ndk_modules/freetype/CleanSpec.mk @@ -0,0 +1,49 @@ +# Copyright (C) 2007 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# If you don't need to do a full clean build but would like to touch +# a file or delete some intermediate files, add a clean step to the end +# of the list. These steps will only be run once, if they haven't been +# run before. +# +# E.g.: +# $(call add-clean-step, touch -c external/sqlite/sqlite3.h) +# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates) +# +# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with +# files that are missing or have been moved. +# +# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory. +# Use $(OUT_DIR) to refer to the "out" directory. +# +# If you need to re-do something that's already mentioned, just copy +# the command and add it to the bottom of the list. E.g., if a change +# that you made last week required touching a file and a change you +# made today requires touching the same file, just copy the old +# touch step and add it to the end of the list. +# +# ************************************************ +# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST +# ************************************************ + +# For example: +#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates) +#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates) +#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f) +#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*) + +# ************************************************ +# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST +# ************************************************ diff --git a/android/jni/ndk_modules/freetype/builds/ft2unix.h b/android/jni/ndk_modules/freetype/builds/ft2unix.h new file mode 100644 index 00000000..6a3b8d90 --- /dev/null +++ b/android/jni/ndk_modules/freetype/builds/ft2unix.h @@ -0,0 +1,61 @@ +/***************************************************************************/ +/* */ +/* ft2build.h */ +/* */ +/* Build macros of the FreeType 2 library. */ +/* */ +/* Copyright 1996-2001, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This is a Unix-specific version of that should be used */ + /* exclusively *after* installation of the library. */ + /* */ + /* It assumes that `/usr/local/include/freetype2' (or whatever is */ + /* returned by the `freetype-config --cflags' or `pkg-config --cflags' */ + /* command) is in your compilation include path. */ + /* */ + /* We don't need to do anything special in this release. However, for */ + /* a future FreeType 2 release, the following installation changes will */ + /* be performed: */ + /* */ + /* - The contents of `freetype-2.x/include/freetype' will be installed */ + /* to `/usr/local/include/freetype2' instead of */ + /* `/usr/local/include/freetype2/freetype'. */ + /* */ + /* - This file will #include , instead */ + /* of . */ + /* */ + /* - The contents of `ftheader.h' will be processed with `sed' to */ + /* replace all `' with `'. */ + /* */ + /* - Adding `/usr/local/include/freetype2' to your compilation include */ + /* path will not be necessary anymore. */ + /* */ + /* These changes will be transparent to client applications which use */ + /* freetype-config (or pkg-config). No modifications will be necessary */ + /* to compile with the new scheme. */ + /* */ + /*************************************************************************/ + + +#ifndef __FT2_BUILD_UNIX_H__ +#define __FT2_BUILD_UNIX_H__ + + /* `/include/freetype2' must be in your current inclusion path */ +#include + +#endif /* __FT2_BUILD_UNIX_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/config/ftconfig.h b/android/jni/ndk_modules/freetype/include/freetype/config/ftconfig.h new file mode 100644 index 00000000..cbe30f26 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/config/ftconfig.h @@ -0,0 +1,528 @@ +/***************************************************************************/ +/* */ +/* ftconfig.h */ +/* */ +/* ANSI-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This header file contains a number of macro definitions that are used */ + /* by the rest of the engine. Most of the macros here are automatically */ + /* determined at compile time, and you should not need to change it to */ + /* port FreeType, except to compile the library with a non-ANSI */ + /* compiler. */ + /* */ + /* Note however that if some specific modifications are needed, we */ + /* advise you to place a modified copy in your build directory. */ + /* */ + /* The build directory is usually `freetype/builds/', and */ + /* contains system-specific files that are always included first when */ + /* building the library. */ + /* */ + /* This ANSI version should stay in `include/freetype/config'. */ + /* */ + /*************************************************************************/ + +#ifndef __FTCONFIG_H__ +#define __FTCONFIG_H__ + +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled to suit a specific system. The current */ + /* ones are defaults used to compile FreeType in an ANSI C environment */ + /* (16bit compilers are also supported). Copy this file to your own */ + /* `freetype/builds/' directory, and edit it to port the engine. */ + /* */ + /*************************************************************************/ + + + /* There are systems (like the Texas Instruments 'C54x) where a `char' */ + /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ + /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ + /* `char' type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT +#endif + + + /* The size of an `int' type. */ +#if FT_UINT_MAX == 0xFFFFUL +#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) +#elif FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) +#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `int' type!" +#endif + + /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ + /* DM642) is recognized but avoided. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `long' type!" +#endif + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* FT_UNUSED is a macro used to indicate that a given parameter is not */ + /* used -- this is only used to get rid of unpleasant compiler warnings */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /*************************************************************************/ + /* */ + /* AUTOMATIC CONFIGURATION MACROS */ + /* */ + /* These macros are computed from the ones defined above. Don't touch */ + /* their definition, unless you know precisely what you are doing. No */ + /* porter should need to mess with them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Mac support */ + /* */ + /* This is the only necessary change, so it is defined here instead */ + /* providing a new configuration file. */ + /* */ +#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ + ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* no Carbon frameworks for 64bit 10.4.x */ +#include "AvailabilityMacros.h" +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#define DARWIN_NO_CARBON 1 +#else +#define FT_MACINTOSH 1 +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif + + + /*************************************************************************/ + /* */ + /*
*/ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Int16 */ + /* */ + /* */ + /* A typedef for a 16bit signed integer type. */ + /* */ + typedef signed short FT_Int16; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_UInt16 */ + /* */ + /* */ + /* A typedef for a 16bit unsigned integer type. */ + /* */ + typedef unsigned short FT_UInt16; + + /* */ + + + /* this #if 0 ... #endif clause is for documentation purposes */ +#if 0 + + /*************************************************************************/ + /* */ + /* */ + /* FT_Int32 */ + /* */ + /* */ + /* A typedef for a 32bit signed integer type. The size depends on */ + /* the configuration. */ + /* */ + typedef signed XXX FT_Int32; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_UInt32 */ + /* */ + /* A typedef for a 32bit unsigned integer type. The size depends on */ + /* the configuration. */ + /* */ + typedef unsigned XXX FT_UInt32; + + /* */ + +#endif + +#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT) + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT) + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + + /* look up an integer type that is at least 32 bits */ +#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT) + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT) + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit int type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of __BORLANDC__ in order */ + /* to test the compiler version. */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long' type */ +#define FT_LONG64 +#define FT_INT64 long long int + +#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ + + + /*************************************************************************/ + /* */ + /* A 64-bit data type will create compilation problems if you compile */ + /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */ + /* is defined. You can however ignore this rule by defining the */ + /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ + /* */ +#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#ifdef __STDC__ + + /* undefine the 64-bit macros in strict ANSI compilation mode */ +#undef FT_LONG64 +#undef FT_INT64 + +#endif /* __STDC__ */ + +#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + + +#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER + /* Provide assembler fragments for performance-critical functions. */ + /* These must be defined `static __inline__' with GCC. */ + +#if defined( __CC_ARM ) || defined( __ARMCC__ ) /* RVCT */ +#define FT_MULFIX_ASSEMBLER FT_MulFix_arm + + /* documentation is in freetype.h */ + + static __inline FT_Int32 + FT_MulFix_arm( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 t, t2; + + + __asm + { + smull t2, t, b, a /* (lo=t2,hi=t) = a*b */ + mov a, t, asr #31 /* a = (hi >> 31) */ + add a, a, #0x8000 /* a += 0x8000 */ + adds t2, t2, a /* t2 += a */ + adc t, t, #0 /* t += carry */ + mov a, t2, lsr #16 /* a = t2 >> 16 */ + orr a, a, t, lsl #16 /* a |= t << 16 */ + } + return a; + } + +#endif /* __CC_ARM || __ARMCC__ */ + + +#ifdef __GNUC__ + +#if defined( __arm__ ) && !defined( __thumb__ ) && \ + !( defined( __CC_ARM ) || defined( __ARMCC__ ) ) +#define FT_MULFIX_ASSEMBLER FT_MulFix_arm + + /* documentation is in freetype.h */ + + static __inline__ FT_Int32 + FT_MulFix_arm( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 t, t2; + + + asm __volatile__ ( + "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ + "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ + "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ + "adds %1, %1, %0\n\t" /* %1 += %0 */ + "adc %2, %2, #0\n\t" /* %2 += carry */ + "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ + "orr %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ + : "=r"(a), "=&r"(t2), "=&r"(t) + : "r"(a), "r"(b) ); + return a; + } + +#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */ + +#if defined( __i386__ ) +#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 + + /* documentation is in freetype.h */ + + static __inline__ FT_Int32 + FT_MulFix_i386( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 result; + + + __asm__ __volatile__ ( + "imul %%edx\n" + "movl %%edx, %%ecx\n" + "sarl $31, %%ecx\n" + "addl $0x8000, %%ecx\n" + "addl %%ecx, %%eax\n" + "adcl $0, %%edx\n" + "shrl $16, %%eax\n" + "shll $16, %%edx\n" + "addl %%edx, %%eax\n" + : "=a"(result), "=d"(b) + : "a"(a), "d"(b) + : "%ecx", "cc" ); + return result; + } + +#endif /* i386 */ + +#endif /* __GNUC__ */ + +#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ + + +#ifdef FT_CONFIG_OPTION_INLINE_MULFIX +#ifdef FT_MULFIX_ASSEMBLER +#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER +#endif +#endif + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#ifdef __cplusplus +#define FT_LOCAL( x ) extern "C" x +#define FT_LOCAL_DEF( x ) extern "C" x +#else +#define FT_LOCAL( x ) extern x +#define FT_LOCAL_DEF( x ) x +#endif + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + + +#ifndef FT_BASE + +#ifdef __cplusplus +#define FT_BASE( x ) extern "C" x +#else +#define FT_BASE( x ) extern x +#endif + +#endif /* !FT_BASE */ + + +#ifndef FT_BASE_DEF + +#ifdef __cplusplus +#define FT_BASE_DEF( x ) x +#else +#define FT_BASE_DEF( x ) x +#endif + +#endif /* !FT_BASE_DEF */ + + +#ifndef FT_EXPORT + +#ifdef __cplusplus +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#endif /* !FT_EXPORT */ + + +#ifndef FT_EXPORT_DEF + +#ifdef __cplusplus +#define FT_EXPORT_DEF( x ) extern "C" x +#else +#define FT_EXPORT_DEF( x ) extern x +#endif + +#endif /* !FT_EXPORT_DEF */ + + +#ifndef FT_EXPORT_VAR + +#ifdef __cplusplus +#define FT_EXPORT_VAR( x ) extern "C" x +#else +#define FT_EXPORT_VAR( x ) extern x +#endif + +#endif /* !FT_EXPORT_VAR */ + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"' for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl' or `__fastcall' declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + + +FT_END_HEADER + + +#endif /* __FTCONFIG_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/config/ftheader.h b/android/jni/ndk_modules/freetype/include/freetype/config/ftheader.h new file mode 100644 index 00000000..b63945dc --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/config/ftheader.h @@ -0,0 +1,780 @@ +/***************************************************************************/ +/* */ +/* ftheader.h */ +/* */ +/* Build macros of the FreeType 2 library. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __FT_HEADER_H__ +#define __FT_HEADER_H__ + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_BEGIN_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_END_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }' block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_BEGIN_HEADER extern "C" { +#else +#define FT_BEGIN_HEADER /* nothing */ +#endif + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_END_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_BEGIN_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }' block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_END_HEADER } +#else +#define FT_END_HEADER /* nothing */ +#endif + + + /*************************************************************************/ + /* */ + /* Aliases for the FreeType 2 public and configuration files. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /*
*/ + /* header_file_macros */ + /* */ + /* */ + /* Header File Macros */ + /* */ + /* <Abstract> */ + /* Macro definitions used to #include specific header files. */ + /* */ + /* <Description> */ + /* The following macros are defined to the name of specific */ + /* FreeType~2 header files. They can be used directly in #include */ + /* statements as in: */ + /* */ + /* { */ + /* #include FT_FREETYPE_H */ + /* #include FT_MULTIPLE_MASTERS_H */ + /* #include FT_GLYPH_H */ + /* } */ + /* */ + /* There are several reasons why we are now using macros to name */ + /* public header files. The first one is that such macros are not */ + /* limited to the infamous 8.3~naming rule required by DOS (and */ + /* `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h'). */ + /* */ + /* The second reason is that it allows for more flexibility in the */ + /* way FreeType~2 is installed on a given system. */ + /* */ + /*************************************************************************/ + + + /* configuration files */ + + /************************************************************************* + * + * @macro: + * FT_CONFIG_CONFIG_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType~2 configuration data. + * + */ +#ifndef FT_CONFIG_CONFIG_H +#define FT_CONFIG_CONFIG_H <freetype/config/ftconfig.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_STANDARD_LIBRARY_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType~2 interface to the standard C library functions. + * + */ +#ifndef FT_CONFIG_STANDARD_LIBRARY_H +#define FT_CONFIG_STANDARD_LIBRARY_H <freetype/config/ftstdlib.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_OPTIONS_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType~2 project-specific configuration options. + * + */ +#ifndef FT_CONFIG_OPTIONS_H +#define FT_CONFIG_OPTIONS_H <freetype/config/ftoption.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_MODULES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType~2 modules that are statically linked to new library + * instances in @FT_Init_FreeType. + * + */ +#ifndef FT_CONFIG_MODULES_H +#define FT_CONFIG_MODULES_H <freetype/config/ftmodule.h> +#endif + + /* */ + + /* public headers */ + + /************************************************************************* + * + * @macro: + * FT_FREETYPE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * base FreeType~2 API. + * + */ +#define FT_FREETYPE_H <freetype/freetype.h> + + + /************************************************************************* + * + * @macro: + * FT_ERRORS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType~2 error codes (and messages). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_ERRORS_H <freetype/fterrors.h> + + + /************************************************************************* + * + * @macro: + * FT_MODULE_ERRORS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType~2 module error offsets (and messages). + * + */ +#define FT_MODULE_ERRORS_H <freetype/ftmoderr.h> + + + /************************************************************************* + * + * @macro: + * FT_SYSTEM_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 interface to low-level operations (i.e., memory management + * and stream i/o). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_SYSTEM_H <freetype/ftsystem.h> + + + /************************************************************************* + * + * @macro: + * FT_IMAGE_H + * + * @description: + * A macro used in #include statements to name the file containing type + * definitions related to glyph images (i.e., bitmaps, outlines, + * scan-converter parameters). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_IMAGE_H <freetype/ftimage.h> + + + /************************************************************************* + * + * @macro: + * FT_TYPES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * basic data types defined by FreeType~2. + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_TYPES_H <freetype/fttypes.h> + + + /************************************************************************* + * + * @macro: + * FT_LIST_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list management API of FreeType~2. + * + * (Most applications will never need to include this file.) + * + */ +#define FT_LIST_H <freetype/ftlist.h> + + + /************************************************************************* + * + * @macro: + * FT_OUTLINE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * scalable outline management API of FreeType~2. + * + */ +#define FT_OUTLINE_H <freetype/ftoutln.h> + + + /************************************************************************* + * + * @macro: + * FT_SIZES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API which manages multiple @FT_Size objects per face. + * + */ +#define FT_SIZES_H <freetype/ftsizes.h> + + + /************************************************************************* + * + * @macro: + * FT_MODULE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * module management API of FreeType~2. + * + */ +#define FT_MODULE_H <freetype/ftmodapi.h> + + + /************************************************************************* + * + * @macro: + * FT_RENDER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * renderer module management API of FreeType~2. + * + */ +#define FT_RENDER_H <freetype/ftrender.h> + + + /************************************************************************* + * + * @macro: + * FT_TYPE1_TABLES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * types and API specific to the Type~1 format. + * + */ +#define FT_TYPE1_TABLES_H <freetype/t1tables.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_IDS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * enumeration values which identify name strings, languages, encodings, + * etc. This file really contains a _large_ set of constant macro + * definitions, taken from the TrueType and OpenType specifications. + * + */ +#define FT_TRUETYPE_IDS_H <freetype/ttnameid.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_TABLES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * types and API specific to the TrueType (as well as OpenType) format. + * + */ +#define FT_TRUETYPE_TABLES_H <freetype/tttables.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_TAGS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of TrueType four-byte `tags' which identify blocks in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_TRUETYPE_TAGS_H <freetype/tttags.h> + + + /************************************************************************* + * + * @macro: + * FT_BDF_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which accesses BDF-specific strings from a + * face. + * + */ +#define FT_BDF_H <freetype/ftbdf.h> + + + /************************************************************************* + * + * @macro: + * FT_CID_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which access CID font information from a + * face. + * + */ +#define FT_CID_H <freetype/ftcid.h> + + + /************************************************************************* + * + * @macro: + * FT_GZIP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports gzip-compressed files. + * + */ +#define FT_GZIP_H <freetype/ftgzip.h> + + + /************************************************************************* + * + * @macro: + * FT_LZW_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports LZW-compressed files. + * + */ +#define FT_LZW_H <freetype/ftlzw.h> + + + /************************************************************************* + * + * @macro: + * FT_WINFONTS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports Windows FNT files. + * + */ +#define FT_WINFONTS_H <freetype/ftwinfnt.h> + + + /************************************************************************* + * + * @macro: + * FT_GLYPH_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional glyph management component. + * + */ +#define FT_GLYPH_H <freetype/ftglyph.h> + + + /************************************************************************* + * + * @macro: + * FT_BITMAP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional bitmap conversion component. + * + */ +#define FT_BITMAP_H <freetype/ftbitmap.h> + + + /************************************************************************* + * + * @macro: + * FT_BBOX_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional exact bounding box computation routines. + * + */ +#define FT_BBOX_H <freetype/ftbbox.h> + + + /************************************************************************* + * + * @macro: + * FT_CACHE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional FreeType~2 cache sub-system. + * + */ +#define FT_CACHE_H <freetype/ftcache.h> + + + /************************************************************************* + * + * @macro: + * FT_CACHE_IMAGE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `glyph image' API of the FreeType~2 cache sub-system. + * + * It is used to define a cache for @FT_Glyph elements. You can also + * use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to + * store small glyph bitmaps, as it will use less memory. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * glyph image-related cache declarations. + * + */ +#define FT_CACHE_IMAGE_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_CACHE_SMALL_BITMAPS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `small bitmaps' API of the FreeType~2 cache sub-system. + * + * It is used to define a cache for small glyph bitmaps in a relatively + * memory-efficient way. You can also use the API defined in + * @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images, + * including scalable outlines. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * small bitmaps-related cache declarations. + * + */ +#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_CACHE_CHARMAP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `charmap' API of the FreeType~2 cache sub-system. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * charmap-based cache declarations. + * + */ +#define FT_CACHE_CHARMAP_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_MAC_H + * + * @description: + * A macro used in #include statements to name the file containing the + * Macintosh-specific FreeType~2 API. The latter is used to access + * fonts embedded in resource forks. + * + * This header file must be explicitly included by client applications + * compiled on the Mac (note that the base API still works though). + * + */ +#define FT_MAC_H <freetype/ftmac.h> + + + /************************************************************************* + * + * @macro: + * FT_MULTIPLE_MASTERS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional multiple-masters management API of FreeType~2. + * + */ +#define FT_MULTIPLE_MASTERS_H <freetype/ftmm.h> + + + /************************************************************************* + * + * @macro: + * FT_SFNT_NAMES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType~2 API which accesses embedded `name' strings in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_SFNT_NAMES_H <freetype/ftsnames.h> + + + /************************************************************************* + * + * @macro: + * FT_OPENTYPE_VALIDATE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType~2 API which validates OpenType tables (BASE, GDEF, + * GPOS, GSUB, JSTF). + * + */ +#define FT_OPENTYPE_VALIDATE_H <freetype/ftotval.h> + + + /************************************************************************* + * + * @macro: + * FT_GX_VALIDATE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat, + * mort, morx, bsln, just, kern, opbd, trak, prop). + * + */ +#define FT_GX_VALIDATE_H <freetype/ftgxval.h> + + + /************************************************************************* + * + * @macro: + * FT_PFR_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which accesses PFR-specific data. + * + */ +#define FT_PFR_H <freetype/ftpfr.h> + + + /************************************************************************* + * + * @macro: + * FT_STROKER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which provides functions to stroke outline paths. + */ +#define FT_STROKER_H <freetype/ftstroke.h> + + + /************************************************************************* + * + * @macro: + * FT_SYNTHESIS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs artificial obliquing and emboldening. + */ +#define FT_SYNTHESIS_H <freetype/ftsynth.h> + + + /************************************************************************* + * + * @macro: + * FT_XFREE86_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which provides functions specific to the XFree86 and + * X.Org X11 servers. + */ +#define FT_XFREE86_H <freetype/ftxf86.h> + + + /************************************************************************* + * + * @macro: + * FT_TRIGONOMETRY_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs trigonometric computations (e.g., + * cosines and arc tangents). + */ +#define FT_TRIGONOMETRY_H <freetype/fttrigon.h> + + + /************************************************************************* + * + * @macro: + * FT_LCD_FILTER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_LCD_FILTER_H <freetype/ftlcdfil.h> + + + /************************************************************************* + * + * @macro: + * FT_UNPATENTED_HINTING_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_UNPATENTED_HINTING_H <freetype/ttunpat.h> + + + /************************************************************************* + * + * @macro: + * FT_INCREMENTAL_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_INCREMENTAL_H <freetype/ftincrem.h> + + + /************************************************************************* + * + * @macro: + * FT_GASP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which returns entries from the TrueType GASP table. + */ +#define FT_GASP_H <freetype/ftgasp.h> + + + /************************************************************************* + * + * @macro: + * FT_ADVANCES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which returns individual and ranged glyph advances. + */ +#define FT_ADVANCES_H <freetype/ftadvanc.h> + + + /* */ + +#define FT_ERROR_DEFINITIONS_H <freetype/fterrdef.h> + + + /* The internals of the cache sub-system are no longer exposed. We */ + /* default to FT_CACHE_H at the moment just in case, but we know of */ + /* no rogue client that uses them. */ + /* */ +#define FT_CACHE_MANAGER_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_MRU_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_MANAGER_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_CACHE_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_GLYPH_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_IMAGE_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_SBITS_H <freetype/ftcache.h> + + +#define FT_INCREMENTAL_H <freetype/ftincrem.h> + +#define FT_TRUETYPE_UNPATENTED_H <freetype/ttunpat.h> + + + /* + * Include internal headers definitions from <freetype/internal/...> + * only when building the library. + */ +#ifdef FT2_BUILD_LIBRARY +#define FT_INTERNAL_INTERNAL_H <freetype/internal/internal.h> +#include FT_INTERNAL_INTERNAL_H +#endif /* FT2_BUILD_LIBRARY */ + + +#endif /* __FT2_BUILD_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/config/ftmodule.h b/android/jni/ndk_modules/freetype/include/freetype/config/ftmodule.h new file mode 100644 index 00000000..e145790d --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/config/ftmodule.h @@ -0,0 +1,24 @@ +/* + * This file registers the FreeType modules compiled into the library. + * + * If you use GNU make, this file IS NOT USED! Instead, it is created in + * the objects directory (normally `<topdir>/objs/') based on information + * from `<topdir>/modules.cfg'. + * + * Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile + * FreeType without GNU make. + * + */ + +FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) +FT_USE_MODULE( FT_Module_Class, psnames_module_class ) +FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) +FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) + +/* EOF */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/config/ftoption.h b/android/jni/ndk_modules/freetype/include/freetype/config/ftoption.h new file mode 100644 index 00000000..22056e11 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/config/ftoption.h @@ -0,0 +1,733 @@ +/***************************************************************************/ +/* */ +/* ftoption.h */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOPTION_H__ +#define __FTOPTION_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* USER-SELECTABLE CONFIGURATION MACROS */ + /* */ + /* This file contains the default configuration macro definitions for */ + /* a standard build of the FreeType library. There are three ways to */ + /* use this file to build project-specific versions of the library: */ + /* */ + /* - You can modify this file by hand, but this is not recommended in */ + /* cases where you would like to build several versions of the */ + /* library from a single source directory. */ + /* */ + /* - You can put a copy of this file in your build directory, more */ + /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */ + /* is the name of a directory that is included _before_ the FreeType */ + /* include path during compilation. */ + /* */ + /* The default FreeType Makefiles and Jamfiles use the build */ + /* directory `builds/<system>' by default, but you can easily change */ + /* that for your own projects. */ + /* */ + /* - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it */ + /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */ + /* locate this file during the build. For example, */ + /* */ + /* #define FT_CONFIG_OPTIONS_H <myftoptions.h> */ + /* #include <freetype/config/ftheader.h> */ + /* */ + /* will use `$BUILD/myftoptions.h' instead of this file for macro */ + /* definitions. */ + /* */ + /* Note also that you can similarly pre-define the macro */ + /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */ + /* that are statically linked to the library at compile time. By */ + /* default, this file is <freetype/config/ftmodule.h>. */ + /* */ + /* We highly recommend using the third method whenever possible. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Uncomment the line below if you want to activate sub-pixel rendering */ + /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */ + /* */ + /* Note that this feature is covered by several Microsoft patents */ + /* and should not be activated in any default build of the library. */ + /* */ + /* This macro has no impact on the FreeType API, only on its */ + /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */ + /* FT_Render_Glyph still generates a bitmap that is 3 times wider than */ + /* the original size in case this macro isn't defined; however, each */ + /* triplet of subpixels has R=G=B. */ + /* */ + /* This is done to allow FreeType clients to run unmodified, forcing */ + /* them to display normal gray-level anti-aliased glyphs. */ + /* */ +/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + + /*************************************************************************/ + /* */ + /* Many compilers provide a non-ANSI 64-bit data type that can be used */ + /* by FreeType to speed up some computations. However, this will create */ + /* some problems when compiling the library in strict ANSI mode. */ + /* */ + /* For this reason, the use of 64-bit integers is normally disabled when */ + /* the __STDC__ macro is defined. You can however disable this by */ + /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */ + /* */ + /* For most compilers, this will only create compilation warnings when */ + /* building the library. */ + /* */ + /* ObNote: The compiler-specific 64-bit integers are detected in the */ + /* file `ftconfig.h' either statically or through the */ + /* `configure' script on supported platforms. */ + /* */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + + + /*************************************************************************/ + /* */ + /* If this macro is defined, do not try to use an assembler version of */ + /* performance-critical functions (e.g. FT_MulFix). You should only do */ + /* that to verify that the assembler function works properly, or to */ + /* execute benchmark tests of the various implementations. */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + + + /*************************************************************************/ + /* */ + /* If this macro is defined, try to use an inlined assembler version of */ + /* the `FT_MulFix' function, which is a `hotspot' when loading and */ + /* hinting glyphs, and which should be executed as fast as possible. */ + /* */ + /* Note that if your compiler or CPU is not supported, this will default */ + /* to the standard and portable implementation found in `ftcalc.c'. */ + /* */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + + + /*************************************************************************/ + /* */ + /* LZW-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `compress' program. This is mostly used to parse many of the PCF */ + /* files that come with various X11 distributions. The implementation */ + /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ + /* (see src/lzw/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ +#define FT_CONFIG_OPTION_USE_LZW + + + /*************************************************************************/ + /* */ + /* Gzip-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `gzip' program. This is mostly used to parse many of the PCF files */ + /* that come with XFree86. The implementation uses `zlib' to */ + /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. See also */ + /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ + /* */ +#define FT_CONFIG_OPTION_USE_ZLIB + + + /*************************************************************************/ + /* */ + /* ZLib library selection */ + /* */ + /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ + /* It allows FreeType's `ftgzip' component to link to the system's */ + /* installation of the ZLib library. This is useful on systems like */ + /* Unix or VMS where it generally is already available. */ + /* */ + /* If you let it undefined, the component will use its own copy */ + /* of the zlib sources instead. These have been modified to be */ + /* included directly within the component and *not* export external */ + /* function names. This allows you to link any program with FreeType */ + /* _and_ ZLib without linking conflicts. */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + + /*************************************************************************/ + /* */ + /* DLL export compilation */ + /* */ + /* When compiling FreeType as a DLL, some systems/compilers need a */ + /* special keyword in front OR after the return type of function */ + /* declarations. */ + /* */ + /* Two macros are used within the FreeType source code to define */ + /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */ + /* */ + /* FT_EXPORT( return_type ) */ + /* */ + /* is used in a function declaration, as in */ + /* */ + /* FT_EXPORT( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ); */ + /* */ + /* */ + /* FT_EXPORT_DEF( return_type ) */ + /* */ + /* is used in a function definition, as in */ + /* */ + /* FT_EXPORT_DEF( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ) */ + /* { */ + /* ... some code ... */ + /* return FT_Err_Ok; */ + /* } */ + /* */ + /* You can provide your own implementation of FT_EXPORT and */ + /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */ + /* will be later automatically defined as `extern return_type' to */ + /* allow normal compilation. */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_EXPORT(x) extern x */ +/* #define FT_EXPORT_DEF(x) x */ + + + /*************************************************************************/ + /* */ + /* Glyph Postscript Names handling */ + /* */ + /* By default, FreeType 2 is compiled with the `psnames' module. This */ + /* module is in charge of converting a glyph name string into a */ + /* Unicode value, or return a Macintosh standard glyph name for the */ + /* use with the TrueType `post' table. */ + /* */ + /* Undefine this macro if you do not want `psnames' compiled in your */ + /* build of FreeType. This has the following effects: */ + /* */ + /* - The TrueType driver will provide its own set of glyph names, */ + /* if you build it to support postscript names in the TrueType */ + /* `post' table. */ + /* */ + /* - The Type 1 driver will not be able to synthesize a Unicode */ + /* charmap out of the glyphs found in the fonts. */ + /* */ + /* You would normally undefine this configuration macro when building */ + /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */ + /* */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Postscript Names to Unicode Values support */ + /* */ + /* By default, FreeType 2 is built with the `PSNames' module compiled */ + /* in. Among other things, the module is used to convert a glyph name */ + /* into a Unicode value. This is especially useful in order to */ + /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */ + /* through a big table named the `Adobe Glyph List' (AGL). */ + /* */ + /* Undefine this macro if you do not want the Adobe Glyph List */ + /* compiled in your `PSNames' module. The Type 1 driver will not be */ + /* able to synthesize a Unicode charmap out of the glyphs found in the */ + /* fonts. */ + /* */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /*************************************************************************/ + /* */ + /* Support for Mac fonts */ + /* */ + /* Define this macro if you want support for outline fonts in Mac */ + /* format (mac dfont, mac resource, macbinary containing a mac */ + /* resource) on non-Mac platforms. */ + /* */ + /* Note that the `FOND' resource isn't checked. */ + /* */ +#define FT_CONFIG_OPTION_MAC_FONTS + + + /*************************************************************************/ + /* */ + /* Guessing methods to access embedded resource forks */ + /* */ + /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ + /* GNU/Linux). */ + /* */ + /* Resource forks which include fonts data are stored sometimes in */ + /* locations which users or developers don't expected. In some cases, */ + /* resource forks start with some offset from the head of a file. In */ + /* other cases, the actual resource fork is stored in file different */ + /* from what the user specifies. If this option is activated, */ + /* FreeType tries to guess whether such offsets or different file */ + /* names must be used. */ + /* */ + /* Note that normal, direct access of resource forks is controlled via */ + /* the FT_CONFIG_OPTION_MAC_FONTS option. */ + /* */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + + /*************************************************************************/ + /* */ + /* Allow the use of FT_Incremental_Interface to load typefaces that */ + /* contain no glyph data, but supply it via a callback function. */ + /* This is required by clients supporting document formats which */ + /* supply font data incrementally as the document is parsed, such */ + /* as the Ghostscript interpreter for the PostScript language. */ + /* */ +/* #define FT_CONFIG_OPTION_INCREMENTAL */ + + + /*************************************************************************/ + /* */ + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ + /* */ + /* This must be greater than 4KByte if you use FreeType to rasterize */ + /* glyphs; otherwise, you may set it to zero to avoid unnecessary */ + /* allocation of the render pool. */ + /* */ +#define FT_RENDER_POOL_SIZE 16384L + + + /*************************************************************************/ + /* */ + /* FT_MAX_MODULES */ + /* */ + /* The maximum number of modules that can be registered in a single */ + /* FreeType library object. 32 is the default. */ + /* */ +#define FT_MAX_MODULES 32 + + + /*************************************************************************/ + /* */ + /* Debug level */ + /* */ + /* FreeType can be compiled in debug or trace mode. In debug mode, */ + /* errors are reported through the `ftdebug' component. In trace */ + /* mode, additional messages are sent to the standard output during */ + /* execution. */ + /* */ + /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */ + /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */ + /* */ + /* Don't define any of these macros to compile in `release' mode! */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_DEBUG_LEVEL_ERROR */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* Memory Debugging */ + /* */ + /* FreeType now comes with an integrated memory debugger that is */ + /* capable of detecting simple errors like memory leaks or double */ + /* deletes. To compile it within your build of the library, you */ + /* should define FT_DEBUG_MEMORY here. */ + /* */ + /* Note that the memory debugger is only activated at runtime when */ + /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +/* #define FT_DEBUG_MEMORY */ + + + /*************************************************************************/ + /* */ + /* Module errors */ + /* */ + /* If this macro is set (which is _not_ the default), the higher byte */ + /* of an error code gives the module in which the error has occurred, */ + /* while the lower byte is the real error code. */ + /* */ + /* Setting this macro makes sense for debugging purposes only, since */ + /* it would break source compatibility of certain programs that use */ + /* FreeType 2. */ + /* */ + /* More details can be found in the files ftmoderr.h and fterrors.h. */ + /* */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + + + /*************************************************************************/ + /* */ + /* Position Independent Code */ + /* */ + /* If this macro is set (which is _not_ the default), FreeType2 will */ + /* avoid creating constants that require address fixups. Instead the */ + /* constants will be moved into a struct and additional intialization */ + /* code will be used. */ + /* */ + /* Setting this macro is needed for systems that prohibit address */ + /* fixups, such as BREW. */ + /* */ +/* #define FT_CONFIG_OPTION_PIC */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */ + /* embedded bitmaps in all formats using the SFNT module (namely */ + /* TrueType & OpenType). */ + /* */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */ + /* load and enumerate the glyph Postscript names in a TrueType or */ + /* OpenType file. */ + /* */ + /* Note that when you do not compile the `PSNames' module by undefining */ + /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */ + /* contain additional code used to read the PS Names table from a font. */ + /* */ + /* (By default, the module uses `PSNames' to extract glyph names.) */ + /* */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */ + /* access the internal name table in a SFNT-based format like TrueType */ + /* or OpenType. The name table contains various strings used to */ + /* describe the font, like family name, copyright, version, etc. It */ + /* does not contain any glyph name though. */ + /* */ + /* Accessing SFNT names is done through the functions declared in */ + /* `freetype/ftsnames.h'. */ + /* */ +#define TT_CONFIG_OPTION_SFNT_NAMES + + + /*************************************************************************/ + /* */ + /* TrueType CMap support */ + /* */ + /* Here you can fine-tune which TrueType CMap table format shall be */ + /* supported. */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_13 +#define TT_CONFIG_CMAP_FORMAT_14 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ + /* a bytecode interpreter in the TrueType driver. */ + /* */ + /* By undefining this, you will only compile the code necessary to load */ + /* TrueType glyphs without hinting. */ + /* */ + /* Do not #undef this macro here, since the build system might */ + /* define it for certain configurations only. */ + /* */ +/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */ + /* of the TrueType bytecode interpreter is used that doesn't implement */ + /* any of the patented opcodes and algorithms. The patents related to */ + /* TrueType hinting have expired worldwide since May 2010; this option */ + /* is now deprecated. */ + /* */ + /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* */ + /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, */ + /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */ + /* */ + /* This macro is only useful for a small number of font files (mostly */ + /* for Asian scripts) that require bytecode interpretation to properly */ + /* load glyphs. For all other fonts, this produces unpleasant results, */ + /* thus the unpatented interpreter is never used to load glyphs from */ + /* TrueType fonts unless one of the following two options is used. */ + /* */ + /* - The unpatented interpreter is explicitly activated by the user */ + /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */ + /* when opening the FT_Face. */ + /* */ + /* - FreeType detects that the FT_Face corresponds to one of the */ + /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */ + /* contains a hard-coded list of font names and other matching */ + /* parameters (see function `tt_face_init' in file */ + /* `src/truetype/ttobjs.c'). */ + /* */ + /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */ + /* */ + /* { */ + /* FT_Parameter parameter; */ + /* FT_Open_Args open_args; */ + /* */ + /* */ + /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */ + /* */ + /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */ + /* open_args.pathname = my_font_pathname; */ + /* open_args.num_params = 1; */ + /* open_args.params = ¶meter; */ + /* */ + /* error = FT_Open_Face( library, &open_args, index, &face ); */ + /* ... */ + /* } */ + /* */ +#define TT_CONFIG_OPTION_UNPATENTED_HINTING + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */ + /* bytecode interpreter with a huge switch statement, rather than a call */ + /* table. This results in smaller and faster code for a number of */ + /* architectures. */ + /* */ + /* Note however that on some compiler/processor combinations, undefining */ + /* this macro will generate faster, though larger, code. */ + /* */ +#define TT_CONFIG_OPTION_INTERPRETER_SWITCH + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */ + /* TrueType glyph loader to use Apple's definition of how to handle */ + /* component offsets in composite glyphs. */ + /* */ + /* Apple and MS disagree on the default behavior of component offsets */ + /* in composites. Apple says that they should be scaled by the scaling */ + /* factors in the transformation matrix (roughly, it's more complex) */ + /* while MS says they should not. OpenType defines two bits in the */ + /* composite flags array which can be used to disambiguate, but old */ + /* fonts will not have them. */ + /* */ + /* http://partners.adobe.com/asn/developer/opentype/glyf.html */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */ + /* */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */ + /* support for Apple's distortable font technology (fvar, gvar, cvar, */ + /* and avar tables). This has many similarities to Type 1 Multiple */ + /* Masters support. */ + /* */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ + /* an embedded `BDF ' table within SFNT-based bitmap formats. */ + /* */ +#define TT_CONFIG_OPTION_BDF + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* T1_MAX_DICT_DEPTH is the maximal depth of nest dictionaries and */ + /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */ + /* required. */ + /* */ +#define T1_MAX_DICT_DEPTH 5 + + + /*************************************************************************/ + /* */ + /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ + /* calls during glyph loading. */ + /* */ +#define T1_MAX_SUBRS_CALLS 16 + + + /*************************************************************************/ + /* */ + /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ + /* minimum of 16 is required. */ + /* */ + /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */ + /* */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of `t1afm', which is in charge of reading Type 1 AFM */ + /* files into an existing face. Note that if set, the T1 driver will be */ + /* unable to produce kerning distances. */ + /* */ +#undef T1_CONFIG_OPTION_NO_AFM + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of the Multiple Masters font support in the Type 1 */ + /* driver. */ + /* */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */ + /* support. */ + /* */ +#define AF_CONFIG_OPTION_CJK + + /*************************************************************************/ + /* */ + /* Compile autofit module with Indic script support. */ + /* */ +#define AF_CONFIG_OPTION_INDIC + + /* */ + + + /* + * Define this variable if you want to keep the layout of internal + * structures that was used prior to FreeType 2.2. This also compiles in + * a few obsolete functions to avoid linking problems on typical Unix + * distributions. + * + * For embedded systems or building a new distribution from scratch, it + * is recommended to disable the macro since it reduces the library's code + * size and activates a few memory-saving optimizations as well. + */ +#define FT_CONFIG_OPTION_OLD_INTERNALS + + + /* + * To detect legacy cache-lookup call from a rogue client (<= 2.1.7), + * we restrict the number of charmaps in a font. The current API of + * FTC_CMapCache_Lookup() takes cmap_index & charcode, but old API + * takes charcode only. To determine the passed value is for cmap_index + * or charcode, the possible cmap_index is restricted not to exceed + * the minimum possible charcode by a rogue client. It is also very + * unlikely that a rogue client is interested in Unicode values 0 to 15. + * + * NOTE: The original threshold was 4 deduced from popular number of + * cmap subtables in UCS-4 TrueType fonts, but now it is not + * irregular for OpenType fonts to have more than 4 subtables, + * because variation selector subtables are available for Apple + * and Microsoft platforms. + */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS +#define FT_MAX_CHARMAP_CACHEABLE 15 +#endif + + + /* + * This macro is defined if either unpatented or native TrueType + * hinting is requested by the definitions above. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#define TT_USE_BYTECODE_INTERPRETER +#undef TT_CONFIG_OPTION_UNPATENTED_HINTING +#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING +#define TT_USE_BYTECODE_INTERPRETER +#endif + +FT_END_HEADER + + +#endif /* __FTOPTION_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/config/ftstdlib.h b/android/jni/ndk_modules/freetype/include/freetype/config/ftstdlib.h new file mode 100644 index 00000000..30ec14e7 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/config/ftstdlib.h @@ -0,0 +1,173 @@ +/***************************************************************************/ +/* */ +/* ftstdlib.h */ +/* */ +/* ANSI-specific library and header configuration file (specification */ +/* only). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to group all #includes to the ANSI C library that */ + /* FreeType normally requires. It also defines macros to rename the */ + /* standard functions within the FreeType source code. */ + /* */ + /* Load a file which defines __FTSTDLIB_H__ before this one to override */ + /* it. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSTDLIB_H__ +#define __FTSTDLIB_H__ + + +#include <stddef.h> + +#define ft_ptrdiff_t ptrdiff_t + + + /**********************************************************************/ + /* */ + /* integer limits */ + /* */ + /* UINT_MAX and ULONG_MAX are used to automatically compute the size */ + /* of `int' and `long' in bytes at compile-time. So far, this works */ + /* for all platforms the library has been tested on. */ + /* */ + /* Note that on the extremely rare platforms that do not provide */ + /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some */ + /* old Crays where `int' is 36 bits), we do not make any guarantee */ + /* about the correct behaviour of FT2 with all fonts. */ + /* */ + /* In these case, `ftconfig.h' will refuse to compile anyway with a */ + /* message like `couldn't find 32-bit type' or something similar. */ + /* */ + /**********************************************************************/ + + +#include <limits.h> + +#define FT_CHAR_BIT CHAR_BIT +#define FT_INT_MAX INT_MAX +#define FT_INT_MIN INT_MIN +#define FT_UINT_MAX UINT_MAX +#define FT_ULONG_MAX ULONG_MAX + + + /**********************************************************************/ + /* */ + /* character and string processing */ + /* */ + /**********************************************************************/ + + +#include <string.h> + +#define ft_memchr memchr +#define ft_memcmp memcmp +#define ft_memcpy memcpy +#define ft_memmove memmove +#define ft_memset memset +#define ft_strcat strcat +#define ft_strcmp strcmp +#define ft_strcpy strcpy +#define ft_strlen strlen +#define ft_strncmp strncmp +#define ft_strncpy strncpy +#define ft_strrchr strrchr +#define ft_strstr strstr + + + /**********************************************************************/ + /* */ + /* file handling */ + /* */ + /**********************************************************************/ + + +#include <stdio.h> + +#define FT_FILE FILE +#define ft_fclose fclose +#define ft_fopen fopen +#define ft_fread fread +#define ft_fseek fseek +#define ft_ftell ftell +#define ft_sprintf sprintf + + + /**********************************************************************/ + /* */ + /* sorting */ + /* */ + /**********************************************************************/ + + +#include <stdlib.h> + +#define ft_qsort qsort + + + /**********************************************************************/ + /* */ + /* memory allocation */ + /* */ + /**********************************************************************/ + + +#define ft_scalloc calloc +#define ft_sfree free +#define ft_smalloc malloc +#define ft_srealloc realloc + + + /**********************************************************************/ + /* */ + /* miscellaneous */ + /* */ + /**********************************************************************/ + + +#define ft_atol atol +#define ft_labs labs + + + /**********************************************************************/ + /* */ + /* execution control */ + /* */ + /**********************************************************************/ + + +#include <setjmp.h> + +#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ + /* jmp_buf is defined as a macro */ + /* on certain platforms */ + +#define ft_longjmp longjmp +#define ft_setjmp( b ) setjmp( *(jmp_buf*) &(b) ) /* same thing here */ + + + /* the following is only used for debugging purposes, i.e., if */ + /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */ + +#include <stdarg.h> + + +#endif /* __FTSTDLIB_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/freetype.h b/android/jni/ndk_modules/freetype/include/freetype/freetype.h new file mode 100644 index 00000000..7799b70b --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/freetype.h @@ -0,0 +1,3919 @@ +/***************************************************************************/ +/* */ +/* freetype.h */ +/* */ +/* FreeType high-level API and common types (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef FT_FREETYPE_H +#error "`ft2build.h' hasn't been included yet!" +#error "Please always use macros to include FreeType header files." +#error "Example:" +#error " #include <ft2build.h>" +#error " #include FT_FREETYPE_H" +#endif + + +#ifndef __FREETYPE_H__ +#define __FREETYPE_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_ERRORS_H +#include FT_TYPES_H + + +FT_BEGIN_HEADER + + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* user_allocation */ + /* */ + /* <Title> */ + /* User allocation */ + /* */ + /* <Abstract> */ + /* How client applications should allocate FreeType data structures. */ + /* */ + /* <Description> */ + /* FreeType assumes that structures allocated by the user and passed */ + /* as arguments are zeroed out except for the actual data. In other */ + /* words, it is recommended to use `calloc' (or variants of it) */ + /* instead of `malloc' for allocation. */ + /* */ + /*************************************************************************/ + + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S I C T Y P E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* base_interface */ + /* */ + /* <Title> */ + /* Base Interface */ + /* */ + /* <Abstract> */ + /* The FreeType~2 base font interface. */ + /* */ + /* <Description> */ + /* This section describes the public high-level API of FreeType~2. */ + /* */ + /* <Order> */ + /* FT_Library */ + /* FT_Face */ + /* FT_Size */ + /* FT_GlyphSlot */ + /* FT_CharMap */ + /* FT_Encoding */ + /* */ + /* FT_FaceRec */ + /* */ + /* FT_FACE_FLAG_SCALABLE */ + /* FT_FACE_FLAG_FIXED_SIZES */ + /* FT_FACE_FLAG_FIXED_WIDTH */ + /* FT_FACE_FLAG_HORIZONTAL */ + /* FT_FACE_FLAG_VERTICAL */ + /* FT_FACE_FLAG_SFNT */ + /* FT_FACE_FLAG_KERNING */ + /* FT_FACE_FLAG_MULTIPLE_MASTERS */ + /* FT_FACE_FLAG_GLYPH_NAMES */ + /* FT_FACE_FLAG_EXTERNAL_STREAM */ + /* FT_FACE_FLAG_FAST_GLYPHS */ + /* FT_FACE_FLAG_HINTER */ + /* */ + /* FT_STYLE_FLAG_BOLD */ + /* FT_STYLE_FLAG_ITALIC */ + /* */ + /* FT_SizeRec */ + /* FT_Size_Metrics */ + /* */ + /* FT_GlyphSlotRec */ + /* FT_Glyph_Metrics */ + /* FT_SubGlyph */ + /* */ + /* FT_Bitmap_Size */ + /* */ + /* FT_Init_FreeType */ + /* FT_Done_FreeType */ + /* */ + /* FT_New_Face */ + /* FT_Done_Face */ + /* FT_New_Memory_Face */ + /* FT_Open_Face */ + /* FT_Open_Args */ + /* FT_Parameter */ + /* FT_Attach_File */ + /* FT_Attach_Stream */ + /* */ + /* FT_Set_Char_Size */ + /* FT_Set_Pixel_Sizes */ + /* FT_Request_Size */ + /* FT_Select_Size */ + /* FT_Size_Request_Type */ + /* FT_Size_Request */ + /* FT_Set_Transform */ + /* FT_Load_Glyph */ + /* FT_Get_Char_Index */ + /* FT_Get_Name_Index */ + /* FT_Load_Char */ + /* */ + /* FT_OPEN_MEMORY */ + /* FT_OPEN_STREAM */ + /* FT_OPEN_PATHNAME */ + /* FT_OPEN_DRIVER */ + /* FT_OPEN_PARAMS */ + /* */ + /* FT_LOAD_DEFAULT */ + /* FT_LOAD_RENDER */ + /* FT_LOAD_MONOCHROME */ + /* FT_LOAD_LINEAR_DESIGN */ + /* FT_LOAD_NO_SCALE */ + /* FT_LOAD_NO_HINTING */ + /* FT_LOAD_NO_BITMAP */ + /* FT_LOAD_CROP_BITMAP */ + /* */ + /* FT_LOAD_VERTICAL_LAYOUT */ + /* FT_LOAD_IGNORE_TRANSFORM */ + /* FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH */ + /* FT_LOAD_FORCE_AUTOHINT */ + /* FT_LOAD_NO_RECURSE */ + /* FT_LOAD_PEDANTIC */ + /* */ + /* FT_LOAD_TARGET_NORMAL */ + /* FT_LOAD_TARGET_LIGHT */ + /* FT_LOAD_TARGET_MONO */ + /* FT_LOAD_TARGET_LCD */ + /* FT_LOAD_TARGET_LCD_V */ + /* */ + /* FT_Render_Glyph */ + /* FT_Render_Mode */ + /* FT_Get_Kerning */ + /* FT_Kerning_Mode */ + /* FT_Get_Track_Kerning */ + /* FT_Get_Glyph_Name */ + /* FT_Get_Postscript_Name */ + /* */ + /* FT_CharMapRec */ + /* FT_Select_Charmap */ + /* FT_Set_Charmap */ + /* FT_Get_Charmap_Index */ + /* */ + /* FT_FSTYPE_INSTALLABLE_EMBEDDING */ + /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING */ + /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING */ + /* FT_FSTYPE_EDITABLE_EMBEDDING */ + /* FT_FSTYPE_NO_SUBSETTING */ + /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY */ + /* */ + /* FT_Get_FSType_Flags */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Glyph_Metrics */ + /* */ + /* <Description> */ + /* A structure used to model the metrics of a single glyph. The */ + /* values are expressed in 26.6 fractional pixel format; if the flag */ + /* @FT_LOAD_NO_SCALE has been used while loading the glyph, values */ + /* are expressed in font units instead. */ + /* */ + /* <Fields> */ + /* width :: */ + /* The glyph's width. */ + /* */ + /* height :: */ + /* The glyph's height. */ + /* */ + /* horiBearingX :: */ + /* Left side bearing for horizontal layout. */ + /* */ + /* horiBearingY :: */ + /* Top side bearing for horizontal layout. */ + /* */ + /* horiAdvance :: */ + /* Advance width for horizontal layout. */ + /* */ + /* vertBearingX :: */ + /* Left side bearing for vertical layout. */ + /* */ + /* vertBearingY :: */ + /* Top side bearing for vertical layout. */ + /* */ + /* vertAdvance :: */ + /* Advance height for vertical layout. */ + /* */ + /* <Note> */ + /* If not disabled with @FT_LOAD_NO_HINTING, the values represent */ + /* dimensions of the hinted glyph (in case hinting is applicable). */ + /* */ + typedef struct FT_Glyph_Metrics_ + { + FT_Pos width; + FT_Pos height; + + FT_Pos horiBearingX; + FT_Pos horiBearingY; + FT_Pos horiAdvance; + + FT_Pos vertBearingX; + FT_Pos vertBearingY; + FT_Pos vertAdvance; + + } FT_Glyph_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Bitmap_Size */ + /* */ + /* <Description> */ + /* This structure models the metrics of a bitmap strike (i.e., a set */ + /* of glyphs for a given point size and resolution) in a bitmap font. */ + /* It is used for the `available_sizes' field of @FT_Face. */ + /* */ + /* <Fields> */ + /* height :: The vertical distance, in pixels, between two */ + /* consecutive baselines. It is always positive. */ + /* */ + /* width :: The average width, in pixels, of all glyphs in the */ + /* strike. */ + /* */ + /* size :: The nominal size of the strike in 26.6 fractional */ + /* points. This field is not very useful. */ + /* */ + /* x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional */ + /* pixels. */ + /* */ + /* y_ppem :: The vertical ppem (nominal height) in 26.6 fractional */ + /* pixels. */ + /* */ + /* <Note> */ + /* Windows FNT: */ + /* The nominal size given in a FNT font is not reliable. Thus when */ + /* the driver finds it incorrect, it sets `size' to some calculated */ + /* values and sets `x_ppem' and `y_ppem' to the pixel width and */ + /* height given in the font, respectively. */ + /* */ + /* TrueType embedded bitmaps: */ + /* `size', `width', and `height' values are not contained in the */ + /* bitmap strike itself. They are computed from the global font */ + /* parameters. */ + /* */ + typedef struct FT_Bitmap_Size_ + { + FT_Short height; + FT_Short width; + + FT_Pos size; + + FT_Pos x_ppem; + FT_Pos y_ppem; + + } FT_Bitmap_Size; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Library */ + /* */ + /* <Description> */ + /* A handle to a FreeType library instance. Each `library' is */ + /* completely independent from the others; it is the `root' of a set */ + /* of objects like fonts, faces, sizes, etc. */ + /* */ + /* It also embeds a memory manager (see @FT_Memory), as well as a */ + /* scan-line converter object (see @FT_Raster). */ + /* */ + /* For multi-threading applications each thread should have its own */ + /* FT_Library object. */ + /* */ + /* <Note> */ + /* Library objects are normally created by @FT_Init_FreeType, and */ + /* destroyed with @FT_Done_FreeType. */ + /* */ + typedef struct FT_LibraryRec_ *FT_Library; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Module */ + /* */ + /* <Description> */ + /* A handle to a given FreeType module object. Each module can be a */ + /* font driver, a renderer, or anything else that provides services */ + /* to the formers. */ + /* */ + typedef struct FT_ModuleRec_* FT_Module; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Driver */ + /* */ + /* <Description> */ + /* A handle to a given FreeType font driver object. Each font driver */ + /* is a special module capable of creating faces from font files. */ + /* */ + typedef struct FT_DriverRec_* FT_Driver; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Renderer */ + /* */ + /* <Description> */ + /* A handle to a given FreeType renderer. A renderer is a special */ + /* module in charge of converting a glyph image to a bitmap, when */ + /* necessary. Each renderer supports a given glyph image format, and */ + /* one or more target surface depths. */ + /* */ + typedef struct FT_RendererRec_* FT_Renderer; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Face */ + /* */ + /* <Description> */ + /* A handle to a given typographic face object. A face object models */ + /* a given typeface, in a given style. */ + /* */ + /* <Note> */ + /* Each face object also owns a single @FT_GlyphSlot object, as well */ + /* as one or more @FT_Size objects. */ + /* */ + /* Use @FT_New_Face or @FT_Open_Face to create a new face object from */ + /* a given filepathname or a custom input stream. */ + /* */ + /* Use @FT_Done_Face to destroy it (along with its slot and sizes). */ + /* */ + /* <Also> */ + /* See @FT_FaceRec for the publicly accessible fields of a given face */ + /* object. */ + /* */ + typedef struct FT_FaceRec_* FT_Face; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Size */ + /* */ + /* <Description> */ + /* A handle to an object used to model a face scaled to a given */ + /* character size. */ + /* */ + /* <Note> */ + /* Each @FT_Face has an _active_ @FT_Size object that is used by */ + /* functions like @FT_Load_Glyph to determine the scaling */ + /* transformation which is used to load and hint glyphs and metrics. */ + /* */ + /* You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, */ + /* @FT_Request_Size or even @FT_Select_Size to change the content */ + /* (i.e., the scaling values) of the active @FT_Size. */ + /* */ + /* You can use @FT_New_Size to create additional size objects for a */ + /* given @FT_Face, but they won't be used by other functions until */ + /* you activate it through @FT_Activate_Size. Only one size can be */ + /* activated at any given time per face. */ + /* */ + /* <Also> */ + /* See @FT_SizeRec for the publicly accessible fields of a given size */ + /* object. */ + /* */ + typedef struct FT_SizeRec_* FT_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to a given `glyph slot'. A slot is a container where it */ + /* is possible to load any of the glyphs contained in its parent */ + /* face. */ + /* */ + /* In other words, each time you call @FT_Load_Glyph or */ + /* @FT_Load_Char, the slot's content is erased by the new glyph data, */ + /* i.e., the glyph's metrics, its image (bitmap or outline), and */ + /* other control information. */ + /* */ + /* <Also> */ + /* See @FT_GlyphSlotRec for the publicly accessible glyph fields. */ + /* */ + typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_CharMap */ + /* */ + /* <Description> */ + /* A handle to a given character map. A charmap is used to translate */ + /* character codes in a given encoding into glyph indexes for its */ + /* parent's face. Some font formats may provide several charmaps per */ + /* font. */ + /* */ + /* Each face object owns zero or more charmaps, but only one of them */ + /* can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char. */ + /* */ + /* The list of available charmaps in a face is available through the */ + /* `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec. */ + /* */ + /* The currently active charmap is available as `face->charmap'. */ + /* You should call @FT_Set_Charmap to change it. */ + /* */ + /* <Note> */ + /* When a new face is created (either through @FT_New_Face or */ + /* @FT_Open_Face), the library looks for a Unicode charmap within */ + /* the list and automatically activates it. */ + /* */ + /* <Also> */ + /* See @FT_CharMapRec for the publicly accessible fields of a given */ + /* character map. */ + /* */ + typedef struct FT_CharMapRec_* FT_CharMap; + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_ENC_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags into an unsigned long. It is */ + /* used to define `encoding' identifiers (see @FT_Encoding). */ + /* */ + /* <Note> */ + /* Since many 16-bit compilers don't like 32-bit enumerations, you */ + /* should redefine this macro in case of problems to something like */ + /* this: */ + /* */ + /* { */ + /* #define FT_ENC_TAG( value, a, b, c, d ) value */ + /* } */ + /* */ + /* to get a simple enumeration without assigning special numbers. */ + /* */ + +#ifndef FT_ENC_TAG +#define FT_ENC_TAG( value, a, b, c, d ) \ + value = ( ( (FT_UInt32)(a) << 24 ) | \ + ( (FT_UInt32)(b) << 16 ) | \ + ( (FT_UInt32)(c) << 8 ) | \ + (FT_UInt32)(d) ) + +#endif /* FT_ENC_TAG */ + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Encoding */ + /* */ + /* <Description> */ + /* An enumeration used to specify character sets supported by */ + /* charmaps. Used in the @FT_Select_Charmap API function. */ + /* */ + /* <Note> */ + /* Despite the name, this enumeration lists specific character */ + /* repertories (i.e., charsets), and not text encoding methods (e.g., */ + /* UTF-8, UTF-16, etc.). */ + /* */ + /* Other encodings might be defined in the future. */ + /* */ + /* <Values> */ + /* FT_ENCODING_NONE :: */ + /* The encoding value~0 is reserved. */ + /* */ + /* FT_ENCODING_UNICODE :: */ + /* Corresponds to the Unicode character set. This value covers */ + /* all versions of the Unicode repertoire, including ASCII and */ + /* Latin-1. Most fonts include a Unicode charmap, but not all */ + /* of them. */ + /* */ + /* For example, if you want to access Unicode value U+1F028 (and */ + /* the font contains it), use value 0x1F028 as the input value for */ + /* @FT_Get_Char_Index. */ + /* */ + /* FT_ENCODING_MS_SYMBOL :: */ + /* Corresponds to the Microsoft Symbol encoding, used to encode */ + /* mathematical symbols in the 32..255 character code range. For */ + /* more information, see `http://www.ceviz.net/symbol.htm'. */ + /* */ + /* FT_ENCODING_SJIS :: */ + /* Corresponds to Japanese SJIS encoding. More info at */ + /* at `http://langsupport.japanreference.com/encoding.shtml'. */ + /* See note on multi-byte encodings below. */ + /* */ + /* FT_ENCODING_GB2312 :: */ + /* Corresponds to an encoding system for Simplified Chinese as used */ + /* used in mainland China. */ + /* */ + /* FT_ENCODING_BIG5 :: */ + /* Corresponds to an encoding system for Traditional Chinese as */ + /* used in Taiwan and Hong Kong. */ + /* */ + /* FT_ENCODING_WANSUNG :: */ + /* Corresponds to the Korean encoding system known as Wansung. */ + /* For more information see */ + /* `http://www.microsoft.com/typography/unicode/949.txt'. */ + /* */ + /* FT_ENCODING_JOHAB :: */ + /* The Korean standard character set (KS~C 5601-1992), which */ + /* corresponds to MS Windows code page 1361. This character set */ + /* includes all possible Hangeul character combinations. */ + /* */ + /* FT_ENCODING_ADOBE_LATIN_1 :: */ + /* Corresponds to a Latin-1 encoding as defined in a Type~1 */ + /* PostScript font. It is limited to 256 character codes. */ + /* */ + /* FT_ENCODING_ADOBE_STANDARD :: */ + /* Corresponds to the Adobe Standard encoding, as found in Type~1, */ + /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ + /* codes. */ + /* */ + /* FT_ENCODING_ADOBE_EXPERT :: */ + /* Corresponds to the Adobe Expert encoding, as found in Type~1, */ + /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ + /* codes. */ + /* */ + /* FT_ENCODING_ADOBE_CUSTOM :: */ + /* Corresponds to a custom encoding, as found in Type~1, CFF, and */ + /* OpenType/CFF fonts. It is limited to 256 character codes. */ + /* */ + /* FT_ENCODING_APPLE_ROMAN :: */ + /* Corresponds to the 8-bit Apple roman encoding. Many TrueType */ + /* and OpenType fonts contain a charmap for this encoding, since */ + /* older versions of Mac OS are able to use it. */ + /* */ + /* FT_ENCODING_OLD_LATIN_2 :: */ + /* This value is deprecated and was never used nor reported by */ + /* FreeType. Don't use or test for it. */ + /* */ + /* FT_ENCODING_MS_SJIS :: */ + /* Same as FT_ENCODING_SJIS. Deprecated. */ + /* */ + /* FT_ENCODING_MS_GB2312 :: */ + /* Same as FT_ENCODING_GB2312. Deprecated. */ + /* */ + /* FT_ENCODING_MS_BIG5 :: */ + /* Same as FT_ENCODING_BIG5. Deprecated. */ + /* */ + /* FT_ENCODING_MS_WANSUNG :: */ + /* Same as FT_ENCODING_WANSUNG. Deprecated. */ + /* */ + /* FT_ENCODING_MS_JOHAB :: */ + /* Same as FT_ENCODING_JOHAB. Deprecated. */ + /* */ + /* <Note> */ + /* By default, FreeType automatically synthesizes a Unicode charmap */ + /* for PostScript fonts, using their glyph names dictionaries. */ + /* However, it also reports the encodings defined explicitly in the */ + /* font file, for the cases when they are needed, with the Adobe */ + /* values as well. */ + /* */ + /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */ + /* is neither Unicode nor ISO-8859-1 (otherwise it is set to */ + /* FT_ENCODING_UNICODE). Use @FT_Get_BDF_Charset_ID to find out */ + /* which encoding is really present. If, for example, the */ + /* `cs_registry' field is `KOI8' and the `cs_encoding' field is `R', */ + /* the font is encoded in KOI8-R. */ + /* */ + /* FT_ENCODING_NONE is always set (with a single exception) by the */ + /* winfonts driver. Use @FT_Get_WinFNT_Header and examine the */ + /* `charset' field of the @FT_WinFNT_HeaderRec structure to find out */ + /* which encoding is really present. For example, */ + /* @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for */ + /* Russian). */ + /* */ + /* FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */ + /* and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to */ + /* FT_ENCODING_APPLE_ROMAN). */ + /* */ + /* If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function */ + /* @FT_Get_CMap_Language_ID to query the Mac language ID which may */ + /* be needed to be able to distinguish Apple encoding variants. See */ + /* */ + /* http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT */ + /* */ + /* to get an idea how to do that. Basically, if the language ID */ + /* is~0, don't use it, otherwise subtract 1 from the language ID. */ + /* Then examine `encoding_id'. If, for example, `encoding_id' is */ + /* @TT_MAC_ID_ROMAN and the language ID (minus~1) is */ + /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */ + /* @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi */ + /* variant the Arabic encoding. */ + /* */ + typedef enum FT_Encoding_ + { + FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), + + FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), + FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), + + FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), + FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ), + FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), + FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), + FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), + + /* for backwards compatibility */ + FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, + FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312, + FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, + FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, + FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, + + FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), + + FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), + + FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) + + } FT_Encoding; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_encoding_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated; use the corresponding @FT_Encoding */ + /* values instead. */ + /* */ +#define ft_encoding_none FT_ENCODING_NONE +#define ft_encoding_unicode FT_ENCODING_UNICODE +#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL +#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 +#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 +#define ft_encoding_sjis FT_ENCODING_SJIS +#define ft_encoding_gb2312 FT_ENCODING_GB2312 +#define ft_encoding_big5 FT_ENCODING_BIG5 +#define ft_encoding_wansung FT_ENCODING_WANSUNG +#define ft_encoding_johab FT_ENCODING_JOHAB + +#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD +#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT +#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM +#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_CharMapRec */ + /* */ + /* <Description> */ + /* The base charmap structure. */ + /* */ + /* <Fields> */ + /* face :: A handle to the parent face object. */ + /* */ + /* encoding :: An @FT_Encoding tag identifying the charmap. Use */ + /* this with @FT_Select_Charmap. */ + /* */ + /* platform_id :: An ID number describing the platform for the */ + /* following encoding ID. This comes directly from */ + /* the TrueType specification and should be emulated */ + /* for other formats. */ + /* */ + /* encoding_id :: A platform specific encoding number. This also */ + /* comes from the TrueType specification and should be */ + /* emulated similarly. */ + /* */ + typedef struct FT_CharMapRec_ + { + FT_Face face; + FT_Encoding encoding; + FT_UShort platform_id; + FT_UShort encoding_id; + + } FT_CharMapRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S E O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Face_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Face_InternalRec' structure, used to */ + /* model private data of a given @FT_Face object. */ + /* */ + /* This structure might change between releases of FreeType~2 and is */ + /* not generally available to client applications. */ + /* */ + typedef struct FT_Face_InternalRec_* FT_Face_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_FaceRec */ + /* */ + /* <Description> */ + /* FreeType root face class structure. A face object models a */ + /* typeface in a font file. */ + /* */ + /* <Fields> */ + /* num_faces :: The number of faces in the font file. Some */ + /* font formats can have multiple faces in */ + /* a font file. */ + /* */ + /* face_index :: The index of the face in the font file. It */ + /* is set to~0 if there is only one face in */ + /* the font file. */ + /* */ + /* face_flags :: A set of bit flags that give important */ + /* information about the face; see */ + /* @FT_FACE_FLAG_XXX for the details. */ + /* */ + /* style_flags :: A set of bit flags indicating the style of */ + /* the face; see @FT_STYLE_FLAG_XXX for the */ + /* details. */ + /* */ + /* num_glyphs :: The number of glyphs in the face. If the */ + /* face is scalable and has sbits (see */ + /* `num_fixed_sizes'), it is set to the number */ + /* of outline glyphs. */ + /* */ + /* For CID-keyed fonts, this value gives the */ + /* highest CID used in the font. */ + /* */ + /* family_name :: The face's family name. This is an ASCII */ + /* string, usually in English, which describes */ + /* the typeface's family (like `Times New */ + /* Roman', `Bodoni', `Garamond', etc). This */ + /* is a least common denominator used to list */ + /* fonts. Some formats (TrueType & OpenType) */ + /* provide localized and Unicode versions of */ + /* this string. Applications should use the */ + /* format specific interface to access them. */ + /* Can be NULL (e.g., in fonts embedded in a */ + /* PDF file). */ + /* */ + /* style_name :: The face's style name. This is an ASCII */ + /* string, usually in English, which describes */ + /* the typeface's style (like `Italic', */ + /* `Bold', `Condensed', etc). Not all font */ + /* formats provide a style name, so this field */ + /* is optional, and can be set to NULL. As */ + /* for `family_name', some formats provide */ + /* localized and Unicode versions of this */ + /* string. Applications should use the format */ + /* specific interface to access them. */ + /* */ + /* num_fixed_sizes :: The number of bitmap strikes in the face. */ + /* Even if the face is scalable, there might */ + /* still be bitmap strikes, which are called */ + /* `sbits' in that case. */ + /* */ + /* available_sizes :: An array of @FT_Bitmap_Size for all bitmap */ + /* strikes in the face. It is set to NULL if */ + /* there is no bitmap strike. */ + /* */ + /* num_charmaps :: The number of charmaps in the face. */ + /* */ + /* charmaps :: An array of the charmaps of the face. */ + /* */ + /* generic :: A field reserved for client uses. See the */ + /* @FT_Generic type description. */ + /* */ + /* bbox :: The font bounding box. Coordinates are */ + /* expressed in font units (see */ + /* `units_per_EM'). The box is large enough */ + /* to contain any glyph from the font. Thus, */ + /* `bbox.yMax' can be seen as the `maximal */ + /* ascender', and `bbox.yMin' as the `minimal */ + /* descender'. Only relevant for scalable */ + /* formats. */ + /* */ + /* Note that the bounding box might be off by */ + /* (at least) one pixel for hinted fonts. See */ + /* @FT_Size_Metrics for further discussion. */ + /* */ + /* units_per_EM :: The number of font units per EM square for */ + /* this face. This is typically 2048 for */ + /* TrueType fonts, and 1000 for Type~1 fonts. */ + /* Only relevant for scalable formats. */ + /* */ + /* ascender :: The typographic ascender of the face, */ + /* expressed in font units. For font formats */ + /* not having this information, it is set to */ + /* `bbox.yMax'. Only relevant for scalable */ + /* formats. */ + /* */ + /* descender :: The typographic descender of the face, */ + /* expressed in font units. For font formats */ + /* not having this information, it is set to */ + /* `bbox.yMin'. Note that this field is */ + /* usually negative. Only relevant for */ + /* scalable formats. */ + /* */ + /* height :: The height is the vertical distance */ + /* between two consecutive baselines, */ + /* expressed in font units. It is always */ + /* positive. Only relevant for scalable */ + /* formats. */ + /* */ + /* max_advance_width :: The maximal advance width, in font units, */ + /* for all glyphs in this face. This can be */ + /* used to make word wrapping computations */ + /* faster. Only relevant for scalable */ + /* formats. */ + /* */ + /* max_advance_height :: The maximal advance height, in font units, */ + /* for all glyphs in this face. This is only */ + /* relevant for vertical layouts, and is set */ + /* to `height' for fonts that do not provide */ + /* vertical metrics. Only relevant for */ + /* scalable formats. */ + /* */ + /* underline_position :: The position, in font units, of the */ + /* underline line for this face. It is the */ + /* center of the underlining stem. Only */ + /* relevant for scalable formats. */ + /* */ + /* underline_thickness :: The thickness, in font units, of the */ + /* underline for this face. Only relevant for */ + /* scalable formats. */ + /* */ + /* glyph :: The face's associated glyph slot(s). */ + /* */ + /* size :: The current active size for this face. */ + /* */ + /* charmap :: The current active charmap for this face. */ + /* */ + /* <Note> */ + /* Fields may be changed after a call to @FT_Attach_File or */ + /* @FT_Attach_Stream. */ + /* */ + typedef struct FT_FaceRec_ + { + FT_Long num_faces; + FT_Long face_index; + + FT_Long face_flags; + FT_Long style_flags; + + FT_Long num_glyphs; + + FT_String* family_name; + FT_String* style_name; + + FT_Int num_fixed_sizes; + FT_Bitmap_Size* available_sizes; + + FT_Int num_charmaps; + FT_CharMap* charmaps; + + FT_Generic generic; + + /*# The following member variables (down to `underline_thickness') */ + /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ + /*# for bitmap fonts. */ + FT_BBox bbox; + + FT_UShort units_per_EM; + FT_Short ascender; + FT_Short descender; + FT_Short height; + + FT_Short max_advance_width; + FT_Short max_advance_height; + + FT_Short underline_position; + FT_Short underline_thickness; + + FT_GlyphSlot glyph; + FT_Size size; + FT_CharMap charmap; + + /*@private begin */ + + FT_Driver driver; + FT_Memory memory; + FT_Stream stream; + + FT_ListRec sizes_list; + + FT_Generic autohint; + void* extensions; + + FT_Face_Internal internal; + + /*@private end */ + + } FT_FaceRec; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_FACE_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit flags used in the `face_flags' field of the */ + /* @FT_FaceRec structure. They inform client applications of */ + /* properties of the corresponding face. */ + /* */ + /* <Values> */ + /* FT_FACE_FLAG_SCALABLE :: */ + /* Indicates that the face contains outline glyphs. This doesn't */ + /* prevent bitmap strikes, i.e., a face can have both this and */ + /* and @FT_FACE_FLAG_FIXED_SIZES set. */ + /* */ + /* FT_FACE_FLAG_FIXED_SIZES :: */ + /* Indicates that the face contains bitmap strikes. See also the */ + /* `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec. */ + /* */ + /* FT_FACE_FLAG_FIXED_WIDTH :: */ + /* Indicates that the face contains fixed-width characters (like */ + /* Courier, Lucido, MonoType, etc.). */ + /* */ + /* FT_FACE_FLAG_SFNT :: */ + /* Indicates that the face uses the `sfnt' storage scheme. For */ + /* now, this means TrueType and OpenType. */ + /* */ + /* FT_FACE_FLAG_HORIZONTAL :: */ + /* Indicates that the face contains horizontal glyph metrics. This */ + /* should be set for all common formats. */ + /* */ + /* FT_FACE_FLAG_VERTICAL :: */ + /* Indicates that the face contains vertical glyph metrics. This */ + /* is only available in some formats, not all of them. */ + /* */ + /* FT_FACE_FLAG_KERNING :: */ + /* Indicates that the face contains kerning information. If set, */ + /* the kerning distance can be retrieved through the function */ + /* @FT_Get_Kerning. Otherwise the function always return the */ + /* vector (0,0). Note that FreeType doesn't handle kerning data */ + /* from the `GPOS' table (as present in some OpenType fonts). */ + /* */ + /* FT_FACE_FLAG_FAST_GLYPHS :: */ + /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */ + /* */ + /* FT_FACE_FLAG_MULTIPLE_MASTERS :: */ + /* Indicates that the font contains multiple masters and is capable */ + /* of interpolating between them. See the multiple-masters */ + /* specific API for details. */ + /* */ + /* FT_FACE_FLAG_GLYPH_NAMES :: */ + /* Indicates that the font contains glyph names that can be */ + /* retrieved through @FT_Get_Glyph_Name. Note that some TrueType */ + /* fonts contain broken glyph name tables. Use the function */ + /* @FT_Has_PS_Glyph_Names when needed. */ + /* */ + /* FT_FACE_FLAG_EXTERNAL_STREAM :: */ + /* Used internally by FreeType to indicate that a face's stream was */ + /* provided by the client application and should not be destroyed */ + /* when @FT_Done_Face is called. Don't read or test this flag. */ + /* */ + /* FT_FACE_FLAG_HINTER :: */ + /* Set if the font driver has a hinting machine of its own. For */ + /* example, with TrueType fonts, it makes sense to use data from */ + /* the SFNT `gasp' table only if the native TrueType hinting engine */ + /* (with the bytecode interpreter) is available and active. */ + /* */ + /* FT_FACE_FLAG_CID_KEYED :: */ + /* Set if the font is CID-keyed. In that case, the font is not */ + /* accessed by glyph indices but by CID values. For subsetted */ + /* CID-keyed fonts this has the consequence that not all index */ + /* values are a valid argument to FT_Load_Glyph. Only the CID */ + /* values for which corresponding glyphs in the subsetted font */ + /* exist make FT_Load_Glyph return successfully; in all other cases */ + /* you get an `FT_Err_Invalid_Argument' error. */ + /* */ + /* Note that CID-keyed fonts which are in an SFNT wrapper don't */ + /* have this flag set since the glyphs are accessed in the normal */ + /* way (using contiguous indices); the `CID-ness' isn't visible to */ + /* the application. */ + /* */ + /* FT_FACE_FLAG_TRICKY :: */ + /* Set if the font is `tricky', this is, it always needs the */ + /* font format's native hinting engine to get a reasonable result. */ + /* A typical example is the Chinese font `mingli.ttf' which uses */ + /* TrueType bytecode instructions to move and scale all of its */ + /* subglyphs. */ + /* */ + /* It is not possible to autohint such fonts using */ + /* @FT_LOAD_FORCE_AUTOHINT; it will also ignore */ + /* @FT_LOAD_NO_HINTING. You have to set both FT_LOAD_NO_HINTING */ + /* and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */ + /* probably never want this except for demonstration purposes. */ + /* */ + /* Currently, there are six TrueType fonts in the list of tricky */ + /* fonts; they are hard-coded in file `ttobjs.c'. */ + /* */ +#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) +#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) +#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) +#define FT_FACE_FLAG_SFNT ( 1L << 3 ) +#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) +#define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) +#define FT_FACE_FLAG_KERNING ( 1L << 6 ) +#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) +#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) +#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) +#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) +#define FT_FACE_FLAG_HINTER ( 1L << 11 ) +#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 ) +#define FT_FACE_FLAG_TRICKY ( 1L << 13 ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_HORIZONTAL( face ) + * + * @description: + * A macro that returns true whenever a face object contains + * horizontal metrics (this is true for all font formats though). + * + * @also: + * @FT_HAS_VERTICAL can be used to check for vertical metrics. + * + */ +#define FT_HAS_HORIZONTAL( face ) \ + ( face->face_flags & FT_FACE_FLAG_HORIZONTAL ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_VERTICAL( face ) + * + * @description: + * A macro that returns true whenever a face object contains vertical + * metrics. + * + */ +#define FT_HAS_VERTICAL( face ) \ + ( face->face_flags & FT_FACE_FLAG_VERTICAL ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_KERNING( face ) + * + * @description: + * A macro that returns true whenever a face object contains kerning + * data that can be accessed with @FT_Get_Kerning. + * + */ +#define FT_HAS_KERNING( face ) \ + ( face->face_flags & FT_FACE_FLAG_KERNING ) + + + /************************************************************************* + * + * @macro: + * FT_IS_SCALABLE( face ) + * + * @description: + * A macro that returns true whenever a face object contains a scalable + * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF, + * and PFR font formats. + * + */ +#define FT_IS_SCALABLE( face ) \ + ( face->face_flags & FT_FACE_FLAG_SCALABLE ) + + + /************************************************************************* + * + * @macro: + * FT_IS_SFNT( face ) + * + * @description: + * A macro that returns true whenever a face object contains a font + * whose format is based on the SFNT storage scheme. This usually + * means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded + * bitmap fonts. + * + * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and + * @FT_TRUETYPE_TABLES_H are available. + * + */ +#define FT_IS_SFNT( face ) \ + ( face->face_flags & FT_FACE_FLAG_SFNT ) + + + /************************************************************************* + * + * @macro: + * FT_IS_FIXED_WIDTH( face ) + * + * @description: + * A macro that returns true whenever a face object contains a font face + * that contains fixed-width (or `monospace', `fixed-pitch', etc.) + * glyphs. + * + */ +#define FT_IS_FIXED_WIDTH( face ) \ + ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_FIXED_SIZES( face ) + * + * @description: + * A macro that returns true whenever a face object contains some + * embedded bitmaps. See the `available_sizes' field of the + * @FT_FaceRec structure. + * + */ +#define FT_HAS_FIXED_SIZES( face ) \ + ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_FAST_GLYPHS( face ) + * + * @description: + * Deprecated. + * + */ +#define FT_HAS_FAST_GLYPHS( face ) 0 + + + /************************************************************************* + * + * @macro: + * FT_HAS_GLYPH_NAMES( face ) + * + * @description: + * A macro that returns true whenever a face object contains some glyph + * names that can be accessed through @FT_Get_Glyph_Name. + * + */ +#define FT_HAS_GLYPH_NAMES( face ) \ + ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_MULTIPLE_MASTERS( face ) + * + * @description: + * A macro that returns true whenever a face object contains some + * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H + * are then available to choose the exact design you want. + * + */ +#define FT_HAS_MULTIPLE_MASTERS( face ) \ + ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) + + + /************************************************************************* + * + * @macro: + * FT_IS_CID_KEYED( face ) + * + * @description: + * A macro that returns true whenever a face object contains a CID-keyed + * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more + * details. + * + * If this macro is true, all functions defined in @FT_CID_H are + * available. + * + */ +#define FT_IS_CID_KEYED( face ) \ + ( face->face_flags & FT_FACE_FLAG_CID_KEYED ) + + + /************************************************************************* + * + * @macro: + * FT_IS_TRICKY( face ) + * + * @description: + * A macro that returns true whenever a face represents a `tricky' font. + * See the discussion of @FT_FACE_FLAG_TRICKY for more details. + * + */ +#define FT_IS_TRICKY( face ) \ + ( face->face_flags & FT_FACE_FLAG_TRICKY ) + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* FT_STYLE_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit-flags used to indicate the style of a given face. */ + /* These are used in the `style_flags' field of @FT_FaceRec. */ + /* */ + /* <Values> */ + /* FT_STYLE_FLAG_ITALIC :: */ + /* Indicates that a given face style is italic or oblique. */ + /* */ + /* FT_STYLE_FLAG_BOLD :: */ + /* Indicates that a given face is bold. */ + /* */ + /* <Note> */ + /* The style information as provided by FreeType is very basic. More */ + /* details are beyond the scope and should be done on a higher level */ + /* (for example, by analyzing various fields of the `OS/2' table in */ + /* SFNT based fonts). */ + /* */ +#define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) +#define FT_STYLE_FLAG_BOLD ( 1 << 1 ) + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Size_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Size_InternalRec' structure, used to */ + /* model private data of a given @FT_Size object. */ + /* */ + typedef struct FT_Size_InternalRec_* FT_Size_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_Metrics */ + /* */ + /* <Description> */ + /* The size metrics structure gives the metrics of a size object. */ + /* */ + /* <Fields> */ + /* x_ppem :: The width of the scaled EM square in pixels, hence */ + /* the term `ppem' (pixels per EM). It is also */ + /* referred to as `nominal width'. */ + /* */ + /* y_ppem :: The height of the scaled EM square in pixels, */ + /* hence the term `ppem' (pixels per EM). It is also */ + /* referred to as `nominal height'. */ + /* */ + /* x_scale :: A 16.16 fractional scaling value used to convert */ + /* horizontal metrics from font units to 26.6 */ + /* fractional pixels. Only relevant for scalable */ + /* font formats. */ + /* */ + /* y_scale :: A 16.16 fractional scaling value used to convert */ + /* vertical metrics from font units to 26.6 */ + /* fractional pixels. Only relevant for scalable */ + /* font formats. */ + /* */ + /* ascender :: The ascender in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* descender :: The descender in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* height :: The height in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* max_advance :: The maximal advance width in 26.6 fractional */ + /* pixels. See @FT_FaceRec for the details. */ + /* */ + /* <Note> */ + /* The scaling values, if relevant, are determined first during a */ + /* size changing operation. The remaining fields are then set by the */ + /* driver. For scalable formats, they are usually set to scaled */ + /* values of the corresponding fields in @FT_FaceRec. */ + /* */ + /* Note that due to glyph hinting, these values might not be exact */ + /* for certain fonts. Thus they must be treated as unreliable */ + /* with an error margin of at least one pixel! */ + /* */ + /* Indeed, the only way to get the exact metrics is to render _all_ */ + /* glyphs. As this would be a definite performance hit, it is up to */ + /* client applications to perform such computations. */ + /* */ + /* The FT_Size_Metrics structure is valid for bitmap fonts also. */ + /* */ + typedef struct FT_Size_Metrics_ + { + FT_UShort x_ppem; /* horizontal pixels per EM */ + FT_UShort y_ppem; /* vertical pixels per EM */ + + FT_Fixed x_scale; /* scaling values used to convert font */ + FT_Fixed y_scale; /* units to 26.6 fractional pixels */ + + FT_Pos ascender; /* ascender in 26.6 frac. pixels */ + FT_Pos descender; /* descender in 26.6 frac. pixels */ + FT_Pos height; /* text height in 26.6 frac. pixels */ + FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ + + } FT_Size_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SizeRec */ + /* */ + /* <Description> */ + /* FreeType root size class structure. A size object models a face */ + /* object at a given size. */ + /* */ + /* <Fields> */ + /* face :: Handle to the parent face object. */ + /* */ + /* generic :: A typeless pointer, which is unused by the FreeType */ + /* library or any of its drivers. It can be used by */ + /* client applications to link their own data to each size */ + /* object. */ + /* */ + /* metrics :: Metrics for this size object. This field is read-only. */ + /* */ + typedef struct FT_SizeRec_ + { + FT_Face face; /* parent face object */ + FT_Generic generic; /* generic pointer for client uses */ + FT_Size_Metrics metrics; /* size metrics */ + FT_Size_Internal internal; + + } FT_SizeRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SubGlyph */ + /* */ + /* <Description> */ + /* The subglyph structure is an internal object used to describe */ + /* subglyphs (for example, in the case of composites). */ + /* */ + /* <Note> */ + /* The subglyph implementation is not part of the high-level API, */ + /* hence the forward structure declaration. */ + /* */ + /* You can however retrieve subglyph information with */ + /* @FT_Get_SubGlyph_Info. */ + /* */ + typedef struct FT_SubGlyphRec_* FT_SubGlyph; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Slot_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Slot_InternalRec' structure, used to */ + /* model private data of a given @FT_GlyphSlot object. */ + /* */ + typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphSlotRec */ + /* */ + /* <Description> */ + /* FreeType root glyph slot class structure. A glyph slot is a */ + /* container where individual glyphs can be loaded, be they in */ + /* outline or bitmap format. */ + /* */ + /* <Fields> */ + /* library :: A handle to the FreeType library instance */ + /* this slot belongs to. */ + /* */ + /* face :: A handle to the parent face object. */ + /* */ + /* next :: In some cases (like some font tools), several */ + /* glyph slots per face object can be a good */ + /* thing. As this is rare, the glyph slots are */ + /* listed through a direct, single-linked list */ + /* using its `next' field. */ + /* */ + /* generic :: A typeless pointer which is unused by the */ + /* FreeType library or any of its drivers. It */ + /* can be used by client applications to link */ + /* their own data to each glyph slot object. */ + /* */ + /* metrics :: The metrics of the last loaded glyph in the */ + /* slot. The returned values depend on the last */ + /* load flags (see the @FT_Load_Glyph API */ + /* function) and can be expressed either in 26.6 */ + /* fractional pixels or font units. */ + /* */ + /* Note that even when the glyph image is */ + /* transformed, the metrics are not. */ + /* */ + /* linearHoriAdvance :: The advance width of the unhinted glyph. */ + /* Its value is expressed in 16.16 fractional */ + /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ + /* when loading the glyph. This field can be */ + /* important to perform correct WYSIWYG layout. */ + /* Only relevant for outline glyphs. */ + /* */ + /* linearVertAdvance :: The advance height of the unhinted glyph. */ + /* Its value is expressed in 16.16 fractional */ + /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ + /* when loading the glyph. This field can be */ + /* important to perform correct WYSIWYG layout. */ + /* Only relevant for outline glyphs. */ + /* */ + /* advance :: This shorthand is, depending on */ + /* @FT_LOAD_IGNORE_TRANSFORM, the transformed */ + /* advance width for the glyph (in 26.6 */ + /* fractional pixel format). As specified with */ + /* @FT_LOAD_VERTICAL_LAYOUT, it uses either the */ + /* `horiAdvance' or the `vertAdvance' value of */ + /* `metrics' field. */ + /* */ + /* format :: This field indicates the format of the image */ + /* contained in the glyph slot. Typically */ + /* @FT_GLYPH_FORMAT_BITMAP, */ + /* @FT_GLYPH_FORMAT_OUTLINE, or */ + /* @FT_GLYPH_FORMAT_COMPOSITE, but others are */ + /* possible. */ + /* */ + /* bitmap :: This field is used as a bitmap descriptor */ + /* when the slot format is */ + /* @FT_GLYPH_FORMAT_BITMAP. Note that the */ + /* address and content of the bitmap buffer can */ + /* change between calls of @FT_Load_Glyph and a */ + /* few other functions. */ + /* */ + /* bitmap_left :: This is the bitmap's left bearing expressed */ + /* in integer pixels. Of course, this is only */ + /* valid if the format is */ + /* @FT_GLYPH_FORMAT_BITMAP. */ + /* */ + /* bitmap_top :: This is the bitmap's top bearing expressed in */ + /* integer pixels. Remember that this is the */ + /* distance from the baseline to the top-most */ + /* glyph scanline, upwards y~coordinates being */ + /* *positive*. */ + /* */ + /* outline :: The outline descriptor for the current glyph */ + /* image if its format is */ + /* @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is */ + /* loaded, `outline' can be transformed, */ + /* distorted, embolded, etc. However, it must */ + /* not be freed. */ + /* */ + /* num_subglyphs :: The number of subglyphs in a composite glyph. */ + /* This field is only valid for the composite */ + /* glyph format that should normally only be */ + /* loaded with the @FT_LOAD_NO_RECURSE flag. */ + /* For now this is internal to FreeType. */ + /* */ + /* subglyphs :: An array of subglyph descriptors for */ + /* composite glyphs. There are `num_subglyphs' */ + /* elements in there. Currently internal to */ + /* FreeType. */ + /* */ + /* control_data :: Certain font drivers can also return the */ + /* control data for a given glyph image (e.g. */ + /* TrueType bytecode, Type~1 charstrings, etc.). */ + /* This field is a pointer to such data. */ + /* */ + /* control_len :: This is the length in bytes of the control */ + /* data. */ + /* */ + /* other :: Really wicked formats can use this pointer to */ + /* present their own glyph image to client */ + /* applications. Note that the application */ + /* needs to know about the image format. */ + /* */ + /* lsb_delta :: The difference between hinted and unhinted */ + /* left side bearing while autohinting is */ + /* active. Zero otherwise. */ + /* */ + /* rsb_delta :: The difference between hinted and unhinted */ + /* right side bearing while autohinting is */ + /* active. Zero otherwise. */ + /* */ + /* <Note> */ + /* If @FT_Load_Glyph is called with default flags (see */ + /* @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in */ + /* its native format (e.g., an outline glyph for TrueType and Type~1 */ + /* formats). */ + /* */ + /* This image can later be converted into a bitmap by calling */ + /* @FT_Render_Glyph. This function finds the current renderer for */ + /* the native image's format, then invokes it. */ + /* */ + /* The renderer is in charge of transforming the native image through */ + /* the slot's face transformation fields, then converting it into a */ + /* bitmap that is returned in `slot->bitmap'. */ + /* */ + /* Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */ + /* to specify the position of the bitmap relative to the current pen */ + /* position (e.g., coordinates (0,0) on the baseline). Of course, */ + /* `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP. */ + /* */ + /* <Note> */ + /* Here a small pseudo code fragment which shows how to use */ + /* `lsb_delta' and `rsb_delta': */ + /* */ + /* { */ + /* FT_Pos origin_x = 0; */ + /* FT_Pos prev_rsb_delta = 0; */ + /* */ + /* */ + /* for all glyphs do */ + /* <compute kern between current and previous glyph and add it to */ + /* `origin_x'> */ + /* */ + /* <load glyph with `FT_Load_Glyph'> */ + /* */ + /* if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 ) */ + /* origin_x -= 64; */ + /* else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 ) */ + /* origin_x += 64; */ + /* */ + /* prev_rsb_delta = face->glyph->rsb_delta; */ + /* */ + /* <save glyph image, or render glyph, or ...> */ + /* */ + /* origin_x += face->glyph->advance.x; */ + /* endfor */ + /* } */ + /* */ + typedef struct FT_GlyphSlotRec_ + { + FT_Library library; + FT_Face face; + FT_GlyphSlot next; + FT_UInt reserved; /* retained for binary compatibility */ + FT_Generic generic; + + FT_Glyph_Metrics metrics; + FT_Fixed linearHoriAdvance; + FT_Fixed linearVertAdvance; + FT_Vector advance; + + FT_Glyph_Format format; + + FT_Bitmap bitmap; + FT_Int bitmap_left; + FT_Int bitmap_top; + + FT_Outline outline; + + FT_UInt num_subglyphs; + FT_SubGlyph subglyphs; + + void* control_data; + long control_len; + + FT_Pos lsb_delta; + FT_Pos rsb_delta; + + void* other; + + FT_Slot_Internal internal; + + } FT_GlyphSlotRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* F U N C T I O N S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Init_FreeType */ + /* */ + /* <Description> */ + /* Initialize a new FreeType library object. The set of modules */ + /* that are registered by this function is determined at build time. */ + /* */ + /* <Output> */ + /* alibrary :: A handle to a new library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* In case you want to provide your own memory allocating routines, */ + /* use @FT_New_Library instead, followed by a call to */ + /* @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module). */ + /* */ + FT_EXPORT( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_FreeType */ + /* */ + /* <Description> */ + /* Destroy a given FreeType library object and all of its children, */ + /* including resources, drivers, faces, sizes, etc. */ + /* */ + /* <Input> */ + /* library :: A handle to the target library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_FreeType( FT_Library library ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_OPEN_XXX */ + /* */ + /* <Description> */ + /* A list of bit-field constants used within the `flags' field of the */ + /* @FT_Open_Args structure. */ + /* */ + /* <Values> */ + /* FT_OPEN_MEMORY :: This is a memory-based stream. */ + /* */ + /* FT_OPEN_STREAM :: Copy the stream from the `stream' field. */ + /* */ + /* FT_OPEN_PATHNAME :: Create a new input stream from a C~path */ + /* name. */ + /* */ + /* FT_OPEN_DRIVER :: Use the `driver' field. */ + /* */ + /* FT_OPEN_PARAMS :: Use the `num_params' and `params' fields. */ + /* */ + /* ft_open_memory :: Deprecated; use @FT_OPEN_MEMORY instead. */ + /* */ + /* ft_open_stream :: Deprecated; use @FT_OPEN_STREAM instead. */ + /* */ + /* ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead. */ + /* */ + /* ft_open_driver :: Deprecated; use @FT_OPEN_DRIVER instead. */ + /* */ + /* ft_open_params :: Deprecated; use @FT_OPEN_PARAMS instead. */ + /* */ + /* <Note> */ + /* The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME' */ + /* flags are mutually exclusive. */ + /* */ +#define FT_OPEN_MEMORY 0x1 +#define FT_OPEN_STREAM 0x2 +#define FT_OPEN_PATHNAME 0x4 +#define FT_OPEN_DRIVER 0x8 +#define FT_OPEN_PARAMS 0x10 + +#define ft_open_memory FT_OPEN_MEMORY /* deprecated */ +#define ft_open_stream FT_OPEN_STREAM /* deprecated */ +#define ft_open_pathname FT_OPEN_PATHNAME /* deprecated */ +#define ft_open_driver FT_OPEN_DRIVER /* deprecated */ +#define ft_open_params FT_OPEN_PARAMS /* deprecated */ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Parameter */ + /* */ + /* <Description> */ + /* A simple structure used to pass more or less generic parameters to */ + /* @FT_Open_Face. */ + /* */ + /* <Fields> */ + /* tag :: A four-byte identification tag. */ + /* */ + /* data :: A pointer to the parameter data. */ + /* */ + /* <Note> */ + /* The ID and function of parameters are driver-specific. See the */ + /* various FT_PARAM_TAG_XXX flags for more information. */ + /* */ + typedef struct FT_Parameter_ + { + FT_ULong tag; + FT_Pointer data; + + } FT_Parameter; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Open_Args */ + /* */ + /* <Description> */ + /* A structure used to indicate how to open a new font file or */ + /* stream. A pointer to such a structure can be used as a parameter */ + /* for the functions @FT_Open_Face and @FT_Attach_Stream. */ + /* */ + /* <Fields> */ + /* flags :: A set of bit flags indicating how to use the */ + /* structure. */ + /* */ + /* memory_base :: The first byte of the file in memory. */ + /* */ + /* memory_size :: The size in bytes of the file in memory. */ + /* */ + /* pathname :: A pointer to an 8-bit file pathname. */ + /* */ + /* stream :: A handle to a source stream object. */ + /* */ + /* driver :: This field is exclusively used by @FT_Open_Face; */ + /* it simply specifies the font driver to use to open */ + /* the face. If set to~0, FreeType tries to load the */ + /* face with each one of the drivers in its list. */ + /* */ + /* num_params :: The number of extra parameters. */ + /* */ + /* params :: Extra parameters passed to the font driver when */ + /* opening a new face. */ + /* */ + /* <Note> */ + /* The stream type is determined by the contents of `flags' which */ + /* are tested in the following order by @FT_Open_Face: */ + /* */ + /* If the `FT_OPEN_MEMORY' bit is set, assume that this is a */ + /* memory file of `memory_size' bytes, located at `memory_address'. */ + /* The data are are not copied, and the client is responsible for */ + /* releasing and destroying them _after_ the corresponding call to */ + /* @FT_Done_Face. */ + /* */ + /* Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a */ + /* custom input stream `stream' is used. */ + /* */ + /* Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this */ + /* is a normal file and use `pathname' to open it. */ + /* */ + /* If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to */ + /* open the file with the driver whose handler is in `driver'. */ + /* */ + /* If the `FT_OPEN_PARAMS' bit is set, the parameters given by */ + /* `num_params' and `params' is used. They are ignored otherwise. */ + /* */ + /* Ideally, both the `pathname' and `params' fields should be tagged */ + /* as `const'; this is missing for API backwards compatibility. In */ + /* other words, applications should treat them as read-only. */ + /* */ + typedef struct FT_Open_Args_ + { + FT_UInt flags; + const FT_Byte* memory_base; + FT_Long memory_size; + FT_String* pathname; + FT_Stream stream; + FT_Module driver; + FT_Int num_params; + FT_Parameter* params; + + } FT_Open_Args; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face */ + /* */ + /* <Description> */ + /* This function calls @FT_Open_Face to open a font by its pathname. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* pathname :: A path to the font file. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index~0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See @FT_Open_Face for more details. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face( FT_Library library, + const char* filepathname, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Memory_Face */ + /* */ + /* <Description> */ + /* This function calls @FT_Open_Face to open a font which has been */ + /* loaded into memory. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* file_base :: A pointer to the beginning of the font data. */ + /* */ + /* file_size :: The size of the memory chunk used by the font data. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index~0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See @FT_Open_Face for more details. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* You must not deallocate the memory before calling @FT_Done_Face. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Open_Face */ + /* */ + /* <Description> */ + /* Create a face object from a given resource described by */ + /* @FT_Open_Args. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* args :: A pointer to an `FT_Open_Args' structure which must */ + /* be filled by the caller. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index~0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See note below. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* Unlike FreeType 1.x, this function automatically creates a glyph */ + /* slot for the face object which can be accessed directly through */ + /* `face->glyph'. */ + /* */ + /* FT_Open_Face can be used to quickly check whether the font */ + /* format of a given font resource is supported by FreeType. If the */ + /* `face_index' field is negative, the function's return value is~0 */ + /* if the font format is recognized, or non-zero otherwise; */ + /* the function returns a more or less empty face handle in `*aface' */ + /* (if `aface' isn't NULL). The only useful field in this special */ + /* case is `face->num_faces' which gives the number of faces within */ + /* the font file. After examination, the returned @FT_Face structure */ + /* should be deallocated with a call to @FT_Done_Face. */ + /* */ + /* Each new face object created with this function also owns a */ + /* default @FT_Size object, accessible as `face->size'. */ + /* */ + /* See the discussion of reference counters in the description of */ + /* @FT_Reference_Face. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Attach_File */ + /* */ + /* <Description> */ + /* This function calls @FT_Attach_Stream to attach a file. */ + /* */ + /* <InOut> */ + /* face :: The target face object. */ + /* */ + /* <Input> */ + /* filepathname :: The pathname. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Attach_Stream */ + /* */ + /* <Description> */ + /* `Attach' data to a face object. Normally, this is used to read */ + /* additional information for the face object. For example, you can */ + /* attach an AFM file that comes with a Type~1 font to get the */ + /* kerning values and other metrics. */ + /* */ + /* <InOut> */ + /* face :: The target face object. */ + /* */ + /* <Input> */ + /* parameters :: A pointer to @FT_Open_Args which must be filled by */ + /* the caller. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The meaning of the `attach' (i.e., what really happens when the */ + /* new file is read) is not fixed by FreeType itself. It really */ + /* depends on the font format (and thus the font driver). */ + /* */ + /* Client applications are expected to know what they are doing */ + /* when invoking this function. Most drivers simply do not implement */ + /* file attachments. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Attach_Stream( FT_Face face, + FT_Open_Args* parameters ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Reference_Face */ + /* */ + /* <Description> */ + /* A counter gets initialized to~1 at the time an @FT_Face structure */ + /* is created. This function increments the counter. @FT_Done_Face */ + /* then only destroys a face if the counter is~1, otherwise it simply */ + /* decrements the counter. */ + /* */ + /* This function helps in managing life-cycles of structures which */ + /* reference @FT_Face objects. */ + /* */ + /* <Input> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Since> */ + /* 2.4.2 */ + /* */ + FT_EXPORT( FT_Error ) + FT_Reference_Face( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Face */ + /* */ + /* <Description> */ + /* Discard a given face object, as well as all of its child slots and */ + /* sizes. */ + /* */ + /* <Input> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* See the discussion of reference counters in the description of */ + /* @FT_Reference_Face. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Face( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Select_Size */ + /* */ + /* <Description> */ + /* Select a bitmap strike. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* strike_index :: The index of the bitmap strike in the */ + /* `available_sizes' field of @FT_FaceRec structure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Size_Request_Type */ + /* */ + /* <Description> */ + /* An enumeration type that lists the supported size request types. */ + /* */ + /* <Values> */ + /* FT_SIZE_REQUEST_TYPE_NOMINAL :: */ + /* The nominal size. The `units_per_EM' field of @FT_FaceRec is */ + /* used to determine both scaling values. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_REAL_DIM :: */ + /* The real dimension. The sum of the the `Ascender' and (minus */ + /* of) the `Descender' fields of @FT_FaceRec are used to determine */ + /* both scaling values. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_BBOX :: */ + /* The font bounding box. The width and height of the `bbox' field */ + /* of @FT_FaceRec are used to determine the horizontal and vertical */ + /* scaling value, respectively. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_CELL :: */ + /* The `max_advance_width' field of @FT_FaceRec is used to */ + /* determine the horizontal scaling value; the vertical scaling */ + /* value is determined the same way as */ + /* @FT_SIZE_REQUEST_TYPE_REAL_DIM does. Finally, both scaling */ + /* values are set to the smaller one. This type is useful if you */ + /* want to specify the font size for, say, a window of a given */ + /* dimension and 80x24 cells. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_SCALES :: */ + /* Specify the scaling values directly. */ + /* */ + /* <Note> */ + /* The above descriptions only apply to scalable formats. For bitmap */ + /* formats, the behaviour is up to the driver. */ + /* */ + /* See the note section of @FT_Size_Metrics if you wonder how size */ + /* requesting relates to scaling values. */ + /* */ + typedef enum FT_Size_Request_Type_ + { + FT_SIZE_REQUEST_TYPE_NOMINAL, + FT_SIZE_REQUEST_TYPE_REAL_DIM, + FT_SIZE_REQUEST_TYPE_BBOX, + FT_SIZE_REQUEST_TYPE_CELL, + FT_SIZE_REQUEST_TYPE_SCALES, + + FT_SIZE_REQUEST_TYPE_MAX + + } FT_Size_Request_Type; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_RequestRec */ + /* */ + /* <Description> */ + /* A structure used to model a size request. */ + /* */ + /* <Fields> */ + /* type :: See @FT_Size_Request_Type. */ + /* */ + /* width :: The desired width. */ + /* */ + /* height :: The desired height. */ + /* */ + /* horiResolution :: The horizontal resolution. If set to zero, */ + /* `width' is treated as a 26.6 fractional pixel */ + /* value. */ + /* */ + /* vertResolution :: The vertical resolution. If set to zero, */ + /* `height' is treated as a 26.6 fractional pixel */ + /* value. */ + /* */ + /* <Note> */ + /* If `width' is zero, then the horizontal scaling value is set equal */ + /* to the vertical scaling value, and vice versa. */ + /* */ + typedef struct FT_Size_RequestRec_ + { + FT_Size_Request_Type type; + FT_Long width; + FT_Long height; + FT_UInt horiResolution; + FT_UInt vertResolution; + + } FT_Size_RequestRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_Request */ + /* */ + /* <Description> */ + /* A handle to a size request structure. */ + /* */ + typedef struct FT_Size_RequestRec_ *FT_Size_Request; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Request_Size */ + /* */ + /* <Description> */ + /* Resize the scale of the active @FT_Size object in a face. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* req :: A pointer to a @FT_Size_RequestRec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* Although drivers may select the bitmap strike matching the */ + /* request, you should not rely on this if you intend to select a */ + /* particular bitmap strike. Use @FT_Select_Size instead in that */ + /* case. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Char_Size */ + /* */ + /* <Description> */ + /* This function calls @FT_Request_Size to request the nominal size */ + /* (in points). */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* char_width :: The nominal width, in 26.6 fractional points. */ + /* */ + /* char_height :: The nominal height, in 26.6 fractional points. */ + /* */ + /* horz_resolution :: The horizontal resolution in dpi. */ + /* */ + /* vert_resolution :: The vertical resolution in dpi. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* If either the character width or height is zero, it is set equal */ + /* to the other value. */ + /* */ + /* If either the horizontal or vertical resolution is zero, it is set */ + /* equal to the other value. */ + /* */ + /* A character width or height smaller than 1pt is set to 1pt; if */ + /* both resolution values are zero, they are set to 72dpi. */ + /* */ + /* Don't use this function if you are using the FreeType cache API. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Pixel_Sizes */ + /* */ + /* <Description> */ + /* This function calls @FT_Request_Size to request the nominal size */ + /* (in pixels). */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* pixel_width :: The nominal width, in pixels. */ + /* */ + /* pixel_height :: The nominal height, in pixels. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Load_Glyph */ + /* */ + /* <Description> */ + /* A function used to load a single glyph into the glyph slot of a */ + /* face object. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object where the glyph */ + /* is loaded. */ + /* */ + /* <Input> */ + /* glyph_index :: The index of the glyph in the font file. For */ + /* CID-keyed fonts (either in PS or in CFF format) */ + /* this argument specifies the CID value. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* @FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The loaded glyph may be transformed. See @FT_Set_Transform for */ + /* the details. */ + /* */ + /* For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is */ + /* returned for invalid CID values (this is, for CID values which */ + /* don't have a corresponding glyph in the font). See the discussion */ + /* of the @FT_FACE_FLAG_CID_KEYED flag for more details. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Load_Char */ + /* */ + /* <Description> */ + /* A function used to load a single glyph into the glyph slot of a */ + /* face object, according to its character code. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object where the glyph */ + /* is loaded. */ + /* */ + /* <Input> */ + /* char_code :: The glyph's character code, according to the */ + /* current charmap used in the face. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* @FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ); + + + /************************************************************************* + * + * @enum: + * FT_LOAD_XXX + * + * @description: + * A list of bit-field constants used with @FT_Load_Glyph to indicate + * what kind of operations to perform during glyph loading. + * + * @values: + * FT_LOAD_DEFAULT :: + * Corresponding to~0, this value is used as the default glyph load + * operation. In this case, the following happens: + * + * 1. FreeType looks for a bitmap for the glyph corresponding to the + * face's current size. If one is found, the function returns. + * The bitmap data can be accessed from the glyph slot (see note + * below). + * + * 2. If no embedded bitmap is searched or found, FreeType looks for a + * scalable outline. If one is found, it is loaded from the font + * file, scaled to device pixels, then `hinted' to the pixel grid + * in order to optimize it. The outline data can be accessed from + * the glyph slot (see note below). + * + * Note that by default, the glyph loader doesn't render outlines into + * bitmaps. The following flags are used to modify this default + * behaviour to more specific and useful cases. + * + * FT_LOAD_NO_SCALE :: + * Don't scale the outline glyph loaded, but keep it in font units. + * + * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and + * unsets @FT_LOAD_RENDER. + * + * FT_LOAD_NO_HINTING :: + * Disable hinting. This generally generates `blurrier' bitmap glyph + * when the glyph is rendered in any of the anti-aliased modes. See + * also the note below. + * + * This flag is implied by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_RENDER :: + * Call @FT_Render_Glyph after the glyph is loaded. By default, the + * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be + * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME. + * + * This flag is unset by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_NO_BITMAP :: + * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this + * flag. + * + * @FT_LOAD_NO_SCALE always sets this flag. + * + * FT_LOAD_VERTICAL_LAYOUT :: + * Load the glyph for vertical text layout. _Don't_ use it as it is + * problematic currently. + * + * FT_LOAD_FORCE_AUTOHINT :: + * Indicates that the auto-hinter is preferred over the font's native + * hinter. See also the note below. + * + * FT_LOAD_CROP_BITMAP :: + * Indicates that the font driver should crop the loaded bitmap glyph + * (i.e., remove all space around its black bits). Not all drivers + * implement this. + * + * FT_LOAD_PEDANTIC :: + * Indicates that the font driver should perform pedantic verifications + * during glyph loading. This is mostly used to detect broken glyphs + * in fonts. By default, FreeType tries to handle broken fonts also. + * + * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH :: + * Indicates that the font driver should ignore the global advance + * width defined in the font. By default, that value is used as the + * advance width for all glyphs when the face has + * @FT_FACE_FLAG_FIXED_WIDTH set. + * + * This flag exists for historical reasons (to support buggy CJK + * fonts). + * + * FT_LOAD_NO_RECURSE :: + * This flag is only used internally. It merely indicates that the + * font driver should not load composite glyphs recursively. Instead, + * it should set the `num_subglyph' and `subglyphs' values of the + * glyph slot accordingly, and set `glyph->format' to + * @FT_GLYPH_FORMAT_COMPOSITE. + * + * The description of sub-glyphs is not available to client + * applications for now. + * + * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM. + * + * FT_LOAD_IGNORE_TRANSFORM :: + * Indicates that the transform matrix set by @FT_Set_Transform should + * be ignored. + * + * FT_LOAD_MONOCHROME :: + * This flag is used with @FT_LOAD_RENDER to indicate that you want to + * render an outline glyph to a 1-bit monochrome bitmap glyph, with + * 8~pixels packed into each byte of the bitmap data. + * + * Note that this has no effect on the hinting algorithm used. You + * should rather use @FT_LOAD_TARGET_MONO so that the + * monochrome-optimized hinting algorithm is used. + * + * FT_LOAD_LINEAR_DESIGN :: + * Indicates that the `linearHoriAdvance' and `linearVertAdvance' + * fields of @FT_GlyphSlotRec should be kept in font units. See + * @FT_GlyphSlotRec for details. + * + * FT_LOAD_NO_AUTOHINT :: + * Disable auto-hinter. See also the note below. + * + * @note: + * By default, hinting is enabled and the font's native hinter (see + * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can + * disable hinting by setting @FT_LOAD_NO_HINTING or change the + * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set + * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be + * used at all. + * + * See the description of @FT_FACE_FLAG_TRICKY for a special exception + * (affecting only a handful of Asian fonts). + * + * Besides deciding which hinter to use, you can also decide which + * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details. + * + */ +#define FT_LOAD_DEFAULT 0x0 +#define FT_LOAD_NO_SCALE 0x1 +#define FT_LOAD_NO_HINTING 0x2 +#define FT_LOAD_RENDER 0x4 +#define FT_LOAD_NO_BITMAP 0x8 +#define FT_LOAD_VERTICAL_LAYOUT 0x10 +#define FT_LOAD_FORCE_AUTOHINT 0x20 +#define FT_LOAD_CROP_BITMAP 0x40 +#define FT_LOAD_PEDANTIC 0x80 +#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH 0x200 +#define FT_LOAD_NO_RECURSE 0x400 +#define FT_LOAD_IGNORE_TRANSFORM 0x800 +#define FT_LOAD_MONOCHROME 0x1000 +#define FT_LOAD_LINEAR_DESIGN 0x2000 +#define FT_LOAD_NO_AUTOHINT 0x8000U + + /* */ + + /* used internally only by certain font drivers! */ +#define FT_LOAD_ADVANCE_ONLY 0x100 +#define FT_LOAD_SBITS_ONLY 0x4000 + + + /************************************************************************** + * + * @enum: + * FT_LOAD_TARGET_XXX + * + * @description: + * A list of values that are used to select a specific hinting algorithm + * to use by the hinter. You should OR one of these values to your + * `load_flags' when calling @FT_Load_Glyph. + * + * Note that font's native hinters may ignore the hinting algorithm you + * have specified (e.g., the TrueType bytecode interpreter). You can set + * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used. + * + * Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it + * always implies @FT_LOAD_FORCE_AUTOHINT. + * + * @values: + * FT_LOAD_TARGET_NORMAL :: + * This corresponds to the default hinting algorithm, optimized for + * standard gray-level rendering. For monochrome output, use + * @FT_LOAD_TARGET_MONO instead. + * + * FT_LOAD_TARGET_LIGHT :: + * A lighter hinting algorithm for non-monochrome modes. Many + * generated glyphs are more fuzzy but better resemble its original + * shape. A bit like rendering on Mac OS~X. + * + * As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT. + * + * FT_LOAD_TARGET_MONO :: + * Strong hinting algorithm that should only be used for monochrome + * output. The result is probably unpleasant if the glyph is rendered + * in non-monochrome modes. + * + * FT_LOAD_TARGET_LCD :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally + * decimated LCD displays. + * + * FT_LOAD_TARGET_LCD_V :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically + * decimated LCD displays. + * + * @note: + * You should use only _one_ of the FT_LOAD_TARGET_XXX values in your + * `load_flags'. They can't be ORed. + * + * If @FT_LOAD_RENDER is also set, the glyph is rendered in the + * corresponding mode (i.e., the mode which matches the used algorithm + * best) unless @FT_LOAD_MONOCHROME is set. + * + * You can use a hinting algorithm that doesn't correspond to the same + * rendering mode. As an example, it is possible to use the `light' + * hinting algorithm and have the results rendered in horizontal LCD + * pixel mode, with code like + * + * { + * FT_Load_Glyph( face, glyph_index, + * load_flags | FT_LOAD_TARGET_LIGHT ); + * + * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); + * } + * + */ +#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) + +#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) +#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) +#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) +#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ) +#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ) + + + /************************************************************************** + * + * @macro: + * FT_LOAD_TARGET_MODE + * + * @description: + * Return the @FT_Render_Mode corresponding to a given + * @FT_LOAD_TARGET_XXX value. + * + */ +#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Transform */ + /* */ + /* <Description> */ + /* A function used to set the transformation that is applied to glyph */ + /* images when they are loaded into a glyph slot through */ + /* @FT_Load_Glyph. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the transformation's 2x2 matrix. Use~0 for */ + /* the identity matrix. */ + /* delta :: A pointer to the translation vector. Use~0 for the null */ + /* vector. */ + /* */ + /* <Note> */ + /* The transformation is only applied to scalable image formats after */ + /* the glyph has been loaded. It means that hinting is unaltered by */ + /* the transformation and is performed on the character size given in */ + /* the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. */ + /* */ + /* Note that this also transforms the `face.glyph.advance' field, but */ + /* *not* the values in `face.glyph.metrics'. */ + /* */ + FT_EXPORT( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Render_Mode */ + /* */ + /* <Description> */ + /* An enumeration type that lists the render modes supported by */ + /* FreeType~2. Each mode corresponds to a specific type of scanline */ + /* conversion performed on the outline. */ + /* */ + /* For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode' */ + /* field in the @FT_GlyphSlotRec structure gives the format of the */ + /* returned bitmap. */ + /* */ + /* All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity. */ + /* */ + /* <Values> */ + /* FT_RENDER_MODE_NORMAL :: */ + /* This is the default render mode; it corresponds to 8-bit */ + /* anti-aliased bitmaps. */ + /* */ + /* FT_RENDER_MODE_LIGHT :: */ + /* This is equivalent to @FT_RENDER_MODE_NORMAL. It is only */ + /* defined as a separate value because render modes are also used */ + /* indirectly to define hinting algorithm selectors. See */ + /* @FT_LOAD_TARGET_XXX for details. */ + /* */ + /* FT_RENDER_MODE_MONO :: */ + /* This mode corresponds to 1-bit bitmaps (with 2~levels of */ + /* opacity). */ + /* */ + /* FT_RENDER_MODE_LCD :: */ + /* This mode corresponds to horizontal RGB and BGR sub-pixel */ + /* displays like LCD screens. It produces 8-bit bitmaps that are */ + /* 3~times the width of the original glyph outline in pixels, and */ + /* which use the @FT_PIXEL_MODE_LCD mode. */ + /* */ + /* FT_RENDER_MODE_LCD_V :: */ + /* This mode corresponds to vertical RGB and BGR sub-pixel displays */ + /* (like PDA screens, rotated LCD displays, etc.). It produces */ + /* 8-bit bitmaps that are 3~times the height of the original */ + /* glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode. */ + /* */ + /* <Note> */ + /* The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */ + /* filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */ + /* (not active in the default builds). It is up to the caller to */ + /* either call @FT_Library_SetLcdFilter (if available) or do the */ + /* filtering itself. */ + /* */ + /* The selected render mode only affects vector glyphs of a font. */ + /* Embedded bitmaps often have a different pixel mode like */ + /* @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform */ + /* them into 8-bit pixmaps. */ + /* */ + typedef enum FT_Render_Mode_ + { + FT_RENDER_MODE_NORMAL = 0, + FT_RENDER_MODE_LIGHT, + FT_RENDER_MODE_MONO, + FT_RENDER_MODE_LCD, + FT_RENDER_MODE_LCD_V, + + FT_RENDER_MODE_MAX + + } FT_Render_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_render_mode_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated. Use the corresponding */ + /* @FT_Render_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL */ + /* ft_render_mode_mono :: see @FT_RENDER_MODE_MONO */ + /* */ +#define ft_render_mode_normal FT_RENDER_MODE_NORMAL +#define ft_render_mode_mono FT_RENDER_MODE_MONO + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Render_Glyph */ + /* */ + /* <Description> */ + /* Convert a given glyph image to a bitmap. It does so by inspecting */ + /* the glyph image format, finding the relevant renderer, and */ + /* invoking it. */ + /* */ + /* <InOut> */ + /* slot :: A handle to the glyph slot containing the image to */ + /* convert. */ + /* */ + /* <Input> */ + /* render_mode :: This is the render mode used to render the glyph */ + /* image into a bitmap. See @FT_Render_Mode for a */ + /* list of possible values. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Kerning_Mode */ + /* */ + /* <Description> */ + /* An enumeration used to specify which kerning values to return in */ + /* @FT_Get_Kerning. */ + /* */ + /* <Values> */ + /* FT_KERNING_DEFAULT :: Return scaled and grid-fitted kerning */ + /* distances (value is~0). */ + /* */ + /* FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning */ + /* distances. */ + /* */ + /* FT_KERNING_UNSCALED :: Return the kerning vector in original font */ + /* units. */ + /* */ + typedef enum FT_Kerning_Mode_ + { + FT_KERNING_DEFAULT = 0, + FT_KERNING_UNFITTED, + FT_KERNING_UNSCALED + + } FT_Kerning_Mode; + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_default */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_DEFAULT */ + /* instead. */ + /* */ +#define ft_kerning_default FT_KERNING_DEFAULT + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_unfitted */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_UNFITTED */ + /* instead. */ + /* */ +#define ft_kerning_unfitted FT_KERNING_UNFITTED + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_unscaled */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_UNSCALED */ + /* instead. */ + /* */ +#define ft_kerning_unscaled FT_KERNING_UNSCALED + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Kerning */ + /* */ + /* <Description> */ + /* Return the kerning vector between two glyphs of a same face. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* kern_mode :: See @FT_Kerning_Mode for more information. */ + /* Determines the scale and dimension of the returned */ + /* kerning vector. */ + /* */ + /* <Output> */ + /* akerning :: The kerning vector. This is either in font units */ + /* or in pixels (26.6 format) for scalable formats, */ + /* and in pixels for fixed-sizes formats. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this method. Other layouts, or more sophisticated */ + /* kernings, are out of the scope of this API function -- they can be */ + /* implemented through format-specific interfaces. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Track_Kerning */ + /* */ + /* <Description> */ + /* Return the track kerning for a given face object at a given size. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* point_size :: The point size in 16.16 fractional points. */ + /* */ + /* degree :: The degree of tightness. */ + /* */ + /* <Output> */ + /* akerning :: The kerning in 16.16 fractional points. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Glyph_Name */ + /* */ + /* <Description> */ + /* Retrieve the ASCII name of a given glyph in a face. This only */ + /* works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* buffer_max :: The maximal number of bytes available in the */ + /* buffer. */ + /* */ + /* <Output> */ + /* buffer :: A pointer to a target buffer where the name is */ + /* copied to. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* An error is returned if the face doesn't provide glyph names or if */ + /* the glyph index is invalid. In all cases of failure, the first */ + /* byte of `buffer' is set to~0 to indicate an empty name. */ + /* */ + /* The glyph name is truncated to fit within the buffer if it is too */ + /* long. The returned string is always zero-terminated. */ + /* */ + /* This function is not compiled within the library if the config */ + /* macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in */ + /* `include/freetype/config/ftoptions.h'. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Postscript_Name */ + /* */ + /* <Description> */ + /* Retrieve the ASCII PostScript name of a given face, if available. */ + /* This only works with PostScript and TrueType fonts. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Return> */ + /* A pointer to the face's PostScript name. NULL if unavailable. */ + /* */ + /* <Note> */ + /* The returned pointer is owned by the face and is destroyed with */ + /* it. */ + /* */ + FT_EXPORT( const char* ) + FT_Get_Postscript_Name( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Select_Charmap */ + /* */ + /* <Description> */ + /* Select a given charmap by its encoding tag (as listed in */ + /* `freetype.h'). */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* encoding :: A handle to the selected encoding. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function returns an error if no charmap in the face */ + /* corresponds to the encoding queried here. */ + /* */ + /* Because many fonts contain more than a single cmap for Unicode */ + /* encoding, this function has some special code to select the one */ + /* which covers Unicode best (`best' in the sense that a UCS-4 cmap */ + /* is preferred to a UCS-2 cmap). It is thus preferable to */ + /* @FT_Set_Charmap in this case. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Charmap */ + /* */ + /* <Description> */ + /* Select a given charmap for character code to glyph index mapping. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* charmap :: A handle to the selected charmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function returns an error if the charmap is not part of */ + /* the face (i.e., if it is not listed in the `face->charmaps' */ + /* table). */ + /* */ + /* It also fails if a type~14 charmap is selected. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ); + + + /************************************************************************* + * + * @function: + * FT_Get_Charmap_Index + * + * @description: + * Retrieve index of a given charmap. + * + * @input: + * charmap :: + * A handle to a charmap. + * + * @return: + * The index into the array of character maps within the face to which + * `charmap' belongs. If an error occurs, -1 is returned. + * + */ + FT_EXPORT( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Char_Index */ + /* */ + /* <Description> */ + /* Return the glyph index of a given character code. This function */ + /* uses a charmap object to do the mapping. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* charcode :: The character code. */ + /* */ + /* <Return> */ + /* The glyph index. 0~means `undefined character code'. */ + /* */ + /* <Note> */ + /* If you use FreeType to manipulate the contents of font files */ + /* directly, be aware that the glyph index returned by this function */ + /* doesn't always correspond to the internal indices used within */ + /* the file. This is done to ensure that value~0 always corresponds */ + /* to the `missing glyph'. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_First_Char */ + /* */ + /* <Description> */ + /* This function is used to return the first character code in the */ + /* current charmap of a given face. It also returns the */ + /* corresponding glyph index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Output> */ + /* agindex :: Glyph index of first character code. 0~if charmap is */ + /* empty. */ + /* */ + /* <Return> */ + /* The charmap's first character code. */ + /* */ + /* <Note> */ + /* You should use this function with @FT_Get_Next_Char to be able to */ + /* parse all character codes available in a given charmap. The code */ + /* should look like this: */ + /* */ + /* { */ + /* FT_ULong charcode; */ + /* FT_UInt gindex; */ + /* */ + /* */ + /* charcode = FT_Get_First_Char( face, &gindex ); */ + /* while ( gindex != 0 ) */ + /* { */ + /* ... do something with (charcode,gindex) pair ... */ + /* */ + /* charcode = FT_Get_Next_Char( face, charcode, &gindex ); */ + /* } */ + /* } */ + /* */ + /* Note that `*agindex' is set to~0 if the charmap is empty. The */ + /* result itself can be~0 in two cases: if the charmap is empty or */ + /* if the value~0 is the first valid character code. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Next_Char */ + /* */ + /* <Description> */ + /* This function is used to return the next character code in the */ + /* current charmap of a given face following the value `char_code', */ + /* as well as the corresponding glyph index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* char_code :: The starting character code. */ + /* */ + /* <Output> */ + /* agindex :: Glyph index of next character code. 0~if charmap */ + /* is empty. */ + /* */ + /* <Return> */ + /* The charmap's next character code. */ + /* */ + /* <Note> */ + /* You should use this function with @FT_Get_First_Char to walk */ + /* over all character codes available in a given charmap. See the */ + /* note for this function for a simple code example. */ + /* */ + /* Note that `*agindex' is set to~0 when there are no more codes in */ + /* the charmap. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong char_code, + FT_UInt *agindex ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Name_Index */ + /* */ + /* <Description> */ + /* Return the glyph index of a given glyph name. This function uses */ + /* driver specific objects to do the translation. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* glyph_name :: The glyph name. */ + /* */ + /* <Return> */ + /* The glyph index. 0~means `undefined character code'. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + FT_String* glyph_name ); + + + /************************************************************************* + * + * @macro: + * FT_SUBGLYPH_FLAG_XXX + * + * @description: + * A list of constants used to describe subglyphs. Please refer to the + * TrueType specification for the meaning of the various flags. + * + * @values: + * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS :: + * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES :: + * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID :: + * FT_SUBGLYPH_FLAG_SCALE :: + * FT_SUBGLYPH_FLAG_XY_SCALE :: + * FT_SUBGLYPH_FLAG_2X2 :: + * FT_SUBGLYPH_FLAG_USE_MY_METRICS :: + * + */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 + + + /************************************************************************* + * + * @func: + * FT_Get_SubGlyph_Info + * + * @description: + * Retrieve a description of a given subglyph. Only use it if + * `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is + * returned otherwise. + * + * @input: + * glyph :: + * The source glyph slot. + * + * sub_index :: + * The index of the subglyph. Must be less than + * `glyph->num_subglyphs'. + * + * @output: + * p_index :: + * The glyph index of the subglyph. + * + * p_flags :: + * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX. + * + * p_arg1 :: + * The subglyph's first argument (if any). + * + * p_arg2 :: + * The subglyph's second argument (if any). + * + * p_transform :: + * The subglyph transformation (if any). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The values of `*p_arg1', `*p_arg2', and `*p_transform' must be + * interpreted depending on the flags returned in `*p_flags'. See the + * TrueType specification for details. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_FSTYPE_XXX */ + /* */ + /* <Description> */ + /* A list of bit flags used in the `fsType' field of the OS/2 table */ + /* in a TrueType or OpenType font and the `FSType' entry in a */ + /* PostScript font. These bit flags are returned by */ + /* @FT_Get_FSType_Flags; they inform client applications of embedding */ + /* and subsetting restrictions associated with a font. */ + /* */ + /* See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for */ + /* more details. */ + /* */ + /* <Values> */ + /* FT_FSTYPE_INSTALLABLE_EMBEDDING :: */ + /* Fonts with no fsType bit set may be embedded and permanently */ + /* installed on the remote system by an application. */ + /* */ + /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: */ + /* Fonts that have only this bit set must not be modified, embedded */ + /* or exchanged in any manner without first obtaining permission of */ + /* the font software copyright owner. */ + /* */ + /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: */ + /* If this bit is set, the font may be embedded and temporarily */ + /* loaded on the remote system. Documents containing Preview & */ + /* Print fonts must be opened `read-only'; no edits can be applied */ + /* to the document. */ + /* */ + /* FT_FSTYPE_EDITABLE_EMBEDDING :: */ + /* If this bit is set, the font may be embedded but must only be */ + /* installed temporarily on other systems. In contrast to Preview */ + /* & Print fonts, documents containing editable fonts may be opened */ + /* for reading, editing is permitted, and changes may be saved. */ + /* */ + /* FT_FSTYPE_NO_SUBSETTING :: */ + /* If this bit is set, the font may not be subsetted prior to */ + /* embedding. */ + /* */ + /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: */ + /* If this bit is set, only bitmaps contained in the font may be */ + /* embedded; no outline data may be embedded. If there are no */ + /* bitmaps available in the font, then the font is unembeddable. */ + /* */ + /* <Note> */ + /* While the fsType flags can indicate that a font may be embedded, a */ + /* license with the font vendor may be separately required to use the */ + /* font in this way. */ + /* */ +#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000 +#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002 +#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004 +#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008 +#define FT_FSTYPE_NO_SUBSETTING 0x0100 +#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200 + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_FSType_Flags */ + /* */ + /* <Description> */ + /* Return the fsType flags for a font. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Return> */ + /* The fsType flags, @FT_FSTYPE_XXX. */ + /* */ + /* <Note> */ + /* Use this function rather than directly reading the `fs_type' field */ + /* in the @PS_FontInfoRec structure which is only guaranteed to */ + /* return the correct results for Type~1 fonts. */ + /* */ + FT_EXPORT( FT_UShort ) + FT_Get_FSType_Flags( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* glyph_variants */ + /* */ + /* <Title> */ + /* Glyph Variants */ + /* */ + /* <Abstract> */ + /* The FreeType~2 interface to Unicode Ideographic Variation */ + /* Sequences (IVS), using the SFNT cmap format~14. */ + /* */ + /* <Description> */ + /* Many CJK characters have variant forms. They are a sort of grey */ + /* area somewhere between being totally irrelevant and semantically */ + /* distinct; for this reason, the Unicode consortium decided to */ + /* introduce Ideographic Variation Sequences (IVS), consisting of a */ + /* Unicode base character and one of 240 variant selectors */ + /* (U+E0100-U+E01EF), instead of further extending the already huge */ + /* code range for CJK characters. */ + /* */ + /* An IVS is registered and unique; for further details please refer */ + /* to Unicode Technical Report #37, the Ideographic Variation */ + /* Database. To date (October 2007), the character with the most */ + /* variants is U+908A, having 8~such IVS. */ + /* */ + /* Adobe and MS decided to support IVS with a new cmap subtable */ + /* (format~14). It is an odd subtable because it is not a mapping of */ + /* input code points to glyphs, but contains lists of all variants */ + /* supported by the font. */ + /* */ + /* A variant may be either `default' or `non-default'. A default */ + /* variant is the one you will get for that code point if you look it */ + /* up in the standard Unicode cmap. A non-default variant is a */ + /* different glyph. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetCharVariantIndex */ + /* */ + /* <Description> */ + /* Return the glyph index of a given character code as modified by */ + /* the variation selector. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* charcode :: */ + /* The character code point in Unicode. */ + /* */ + /* variantSelector :: */ + /* The Unicode code point of the variation selector. */ + /* */ + /* <Return> */ + /* The glyph index. 0~means either `undefined character code', or */ + /* `undefined selector code', or `no variation selector cmap */ + /* subtable', or `current CharMap is not Unicode'. */ + /* */ + /* <Note> */ + /* If you use FreeType to manipulate the contents of font files */ + /* directly, be aware that the glyph index returned by this function */ + /* doesn't always correspond to the internal indices used within */ + /* the file. This is done to ensure that value~0 always corresponds */ + /* to the `missing glyph'. */ + /* */ + /* This function is only meaningful if */ + /* a) the font has a variation selector cmap sub table, */ + /* and */ + /* b) the current charmap has a Unicode encoding. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetCharVariantIsDefault */ + /* */ + /* <Description> */ + /* Check whether this variant of this Unicode character is the one to */ + /* be found in the `cmap'. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* charcode :: */ + /* The character codepoint in Unicode. */ + /* */ + /* variantSelector :: */ + /* The Unicode codepoint of the variation selector. */ + /* */ + /* <Return> */ + /* 1~if found in the standard (Unicode) cmap, 0~if found in the */ + /* variation selector cmap, or -1 if it is not a variant. */ + /* */ + /* <Note> */ + /* This function is only meaningful if the font has a variation */ + /* selector cmap subtable. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetVariantSelectors */ + /* */ + /* <Description> */ + /* Return a zero-terminated list of Unicode variant selectors found */ + /* in the font. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* <Return> */ + /* A pointer to an array of selector code points, or NULL if there is */ + /* no valid variant selector cmap subtable. */ + /* */ + /* <Note> */ + /* The last item in the array is~0; the array is owned by the */ + /* @FT_Face object but can be overwritten or released on the next */ + /* call to a FreeType function. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetVariantsOfChar */ + /* */ + /* <Description> */ + /* Return a zero-terminated list of Unicode variant selectors found */ + /* for the specified character code. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* charcode :: */ + /* The character codepoint in Unicode. */ + /* */ + /* <Return> */ + /* A pointer to an array of variant selector code points which are */ + /* active for the given character, or NULL if the corresponding list */ + /* is empty. */ + /* */ + /* <Note> */ + /* The last item in the array is~0; the array is owned by the */ + /* @FT_Face object but can be overwritten or released on the next */ + /* call to a FreeType function. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetCharsOfVariant */ + /* */ + /* <Description> */ + /* Return a zero-terminated list of Unicode character codes found for */ + /* the specified variant selector. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* variantSelector :: */ + /* The variant selector code point in Unicode. */ + /* */ + /* <Return> */ + /* A list of all the code points which are specified by this selector */ + /* (both default and non-default codes are returned) or NULL if there */ + /* is no valid cmap or the variant selector is invalid. */ + /* */ + /* <Note> */ + /* The last item in the array is~0; the array is owned by the */ + /* @FT_Face object but can be overwritten or released on the next */ + /* call to a FreeType function. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /* <Title> */ + /* Computations */ + /* */ + /* <Abstract> */ + /* Crunching fixed numbers and vectors. */ + /* */ + /* <Description> */ + /* This section contains various functions used to perform */ + /* computations on 16.16 fixed-float numbers or 2d vectors. */ + /* */ + /* <Order> */ + /* FT_MulDiv */ + /* FT_MulFix */ + /* FT_DivFix */ + /* FT_RoundFix */ + /* FT_CeilFix */ + /* FT_FloorFix */ + /* FT_Vector_Transform */ + /* FT_Matrix_Multiply */ + /* FT_Matrix_Invert */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulDiv */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation `(a*b)/c' */ + /* with maximal accuracy (it uses a 64-bit intermediate integer */ + /* whenever necessary). */ + /* */ + /* This function isn't necessarily as fast as some processor specific */ + /* operations, but is at least completely portable. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. */ + /* c :: The divisor. */ + /* */ + /* <Return> */ + /* The result of `(a*b)/c'. This function never traps when trying to */ + /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ + /* on the signs of `a' and `b'. */ + /* */ + FT_EXPORT( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ); + + + /* */ + + /* The following #if 0 ... #endif is for the documentation formatter, */ + /* hiding the internal `FT_MULFIX_INLINED' macro. */ + +#if 0 + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulFix */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation */ + /* `(a*b)/0x10000' with maximal accuracy. Most of the time this is */ + /* used to multiply a given value by a 16.16 fixed float factor. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. Use a 16.16 factor here whenever */ + /* possible (see note below). */ + /* */ + /* <Return> */ + /* The result of `(a*b)/0x10000'. */ + /* */ + /* <Note> */ + /* This function has been optimized for the case where the absolute */ + /* value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */ + /* As this happens mainly when scaling from notional units to */ + /* fractional pixels in FreeType, it resulted in noticeable speed */ + /* improvements between versions 2.x and 1.x. */ + /* */ + /* As a conclusion, always try to place a 16.16 factor as the */ + /* _second_ argument of this function; this can make a great */ + /* difference. */ + /* */ + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); + + /* */ +#endif + +#ifdef FT_MULFIX_INLINED +#define FT_MulFix( a, b ) FT_MULFIX_INLINED( a, b ) +#else + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); +#endif + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_DivFix */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation */ + /* `(a*0x10000)/b' with maximal accuracy. Most of the time, this is */ + /* used to divide a given value by a 16.16 fixed float factor. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. Use a 16.16 factor here whenever */ + /* possible (see note below). */ + /* */ + /* <Return> */ + /* The result of `(a*0x10000)/b'. */ + /* */ + /* <Note> */ + /* The optimization for FT_DivFix() is simple: If (a~<<~16) fits in */ + /* 32~bits, then the division is computed directly. Otherwise, we */ + /* use a specialized version of @FT_MulDiv. */ + /* */ + FT_EXPORT( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_RoundFix */ + /* */ + /* <Description> */ + /* A very simple function used to round a 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number to be rounded. */ + /* */ + /* <Return> */ + /* The result of `(a + 0x8000) & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_RoundFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_CeilFix */ + /* */ + /* <Description> */ + /* A very simple function used to compute the ceiling function of a */ + /* 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number for which the ceiling function is to be computed. */ + /* */ + /* <Return> */ + /* The result of `(a + 0x10000 - 1) & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_CeilFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_FloorFix */ + /* */ + /* <Description> */ + /* A very simple function used to compute the floor function of a */ + /* 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number for which the floor function is to be computed. */ + /* */ + /* <Return> */ + /* The result of `a & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_FloorFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Vector_Transform */ + /* */ + /* <Description> */ + /* Transform a single vector through a 2x2 matrix. */ + /* */ + /* <InOut> */ + /* vector :: The target vector to transform. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the source 2x2 matrix. */ + /* */ + /* <Note> */ + /* The result is undefined if either `vector' or `matrix' is invalid. */ + /* */ + FT_EXPORT( void ) + FT_Vector_Transform( FT_Vector* vec, + const FT_Matrix* matrix ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* version */ + /* */ + /* <Title> */ + /* FreeType Version */ + /* */ + /* <Abstract> */ + /* Functions and macros related to FreeType versions. */ + /* */ + /* <Description> */ + /* Note that those functions and macros are of limited use because */ + /* even a new release of FreeType with only documentation changes */ + /* increases the version number. */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @enum: + * FREETYPE_XXX + * + * @description: + * These three macros identify the FreeType source code version. + * Use @FT_Library_Version to access them at runtime. + * + * @values: + * FREETYPE_MAJOR :: The major version number. + * FREETYPE_MINOR :: The minor version number. + * FREETYPE_PATCH :: The patch level. + * + * @note: + * The version number of FreeType if built as a dynamic link library + * with the `libtool' package is _not_ controlled by these three + * macros. + * + */ +#define FREETYPE_MAJOR 2 +#define FREETYPE_MINOR 4 +#define FREETYPE_PATCH 2 + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Library_Version */ + /* */ + /* <Description> */ + /* Return the version of the FreeType library being used. This is */ + /* useful when dynamically linking to the library, since one cannot */ + /* use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and */ + /* @FREETYPE_PATCH. */ + /* */ + /* <Input> */ + /* library :: A source library handle. */ + /* */ + /* <Output> */ + /* amajor :: The major version number. */ + /* */ + /* aminor :: The minor version number. */ + /* */ + /* apatch :: The patch version number. */ + /* */ + /* <Note> */ + /* The reason why this function takes a `library' argument is because */ + /* certain programs implement library initialization in a custom way */ + /* that doesn't use @FT_Init_FreeType. */ + /* */ + /* In such cases, the library version might not be available before */ + /* the library object has been created. */ + /* */ + FT_EXPORT( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_CheckTrueTypePatents */ + /* */ + /* <Description> */ + /* Parse all bytecode instructions of a TrueType font file to check */ + /* whether any of the patented opcodes are used. This is only useful */ + /* if you want to be able to use the unpatented hinter with */ + /* fonts that do *not* use these opcodes. */ + /* */ + /* Note that this function parses *all* glyph instructions in the */ + /* font file, which may be slow. */ + /* */ + /* <Input> */ + /* face :: A face handle. */ + /* */ + /* <Return> */ + /* 1~if this is a TrueType font that uses one of the patented */ + /* opcodes, 0~otherwise. */ + /* */ + /* <Note> */ + /* Since May 2010, TrueType hinting is no longer patented. */ + /* */ + /* <Since> */ + /* 2.3.5 */ + /* */ + FT_EXPORT( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_SetUnpatentedHinting */ + /* */ + /* <Description> */ + /* Enable or disable the unpatented hinter for a given face. */ + /* Only enable it if you have determined that the face doesn't */ + /* use any patented opcodes (see @FT_Face_CheckTrueTypePatents). */ + /* */ + /* <Input> */ + /* face :: A face handle. */ + /* */ + /* value :: New boolean setting. */ + /* */ + /* <Return> */ + /* The old setting value. This will always be false if this is not */ + /* an SFNT font, or if the unpatented hinter is not compiled in this */ + /* instance of the library. */ + /* */ + /* <Note> */ + /* Since May 2010, TrueType hinting is no longer patented. */ + /* */ + /* <Since> */ + /* 2.3.5 */ + /* */ + FT_EXPORT( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ); + + /* */ + + +FT_END_HEADER + +#endif /* __FREETYPE_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftadvanc.h b/android/jni/ndk_modules/freetype/include/freetype/ftadvanc.h new file mode 100644 index 00000000..b2451bec --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftadvanc.h @@ -0,0 +1,179 @@ +/***************************************************************************/ +/* */ +/* ftadvanc.h */ +/* */ +/* Quick computation of advance widths (specification only). */ +/* */ +/* Copyright 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTADVANC_H__ +#define __FTADVANC_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * quick_advance + * + * @title: + * Quick retrieval of advance values + * + * @abstract: + * Retrieve horizontal and vertical advance values without processing + * glyph outlines, if possible. + * + * @description: + * This section contains functions to quickly extract advance values + * without handling glyph outlines, if possible. + */ + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* FT_ADVANCE_FLAG_FAST_ONLY */ + /* */ + /* <Description> */ + /* A bit-flag to be OR-ed with the `flags' parameter of the */ + /* @FT_Get_Advance and @FT_Get_Advances functions. */ + /* */ + /* If set, it indicates that you want these functions to fail if the */ + /* corresponding hinting mode or font driver doesn't allow for very */ + /* quick advance computation. */ + /* */ + /* Typically, glyphs which are either unscaled, unhinted, bitmapped, */ + /* or light-hinted can have their advance width computed very */ + /* quickly. */ + /* */ + /* Normal and bytecode hinted modes, which require loading, scaling, */ + /* and hinting of the glyph outline, are extremely slow by */ + /* comparison. */ + /* */ +#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000UL + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Advance */ + /* */ + /* <Description> */ + /* Retrieve the advance value of a given glyph outline in an */ + /* @FT_Face. By default, the unhinted advance is returned in font */ + /* units. */ + /* */ + /* <Input> */ + /* face :: The source @FT_Face handle. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* load_flags :: A set of bit flags similar to those used when */ + /* calling @FT_Load_Glyph, used to determine what kind */ + /* of advances you need. */ + /* <Output> */ + /* padvance :: The advance value, in either font units or 16.16 */ + /* format. */ + /* */ + /* If @FT_LOAD_VERTICAL_LAYOUT is set, this is the */ + /* vertical advance corresponding to a vertical layout. */ + /* Otherwise, it is the horizontal advance in a */ + /* horizontal layout. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */ + /* if the corresponding font backend doesn't have a quick way to */ + /* retrieve the advances. */ + /* */ + /* A scaled advance is returned in 16.16 format but isn't transformed */ + /* by the affine transformation specified by @FT_Set_Transform. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 load_flags, + FT_Fixed *padvance ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Advances */ + /* */ + /* <Description> */ + /* Retrieve the advance values of several glyph outlines in an */ + /* @FT_Face. By default, the unhinted advances are returned in font */ + /* units. */ + /* */ + /* <Input> */ + /* face :: The source @FT_Face handle. */ + /* */ + /* start :: The first glyph index. */ + /* */ + /* count :: The number of advance values you want to retrieve. */ + /* */ + /* load_flags :: A set of bit flags similar to those used when */ + /* calling @FT_Load_Glyph. */ + /* */ + /* <Output> */ + /* padvance :: The advances, in either font units or 16.16 format. */ + /* This array must contain at least `count' elements. */ + /* */ + /* If @FT_LOAD_VERTICAL_LAYOUT is set, these are the */ + /* vertical advances corresponding to a vertical layout. */ + /* Otherwise, they are the horizontal advances in a */ + /* horizontal layout. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */ + /* if the corresponding font backend doesn't have a quick way to */ + /* retrieve the advances. */ + /* */ + /* Scaled advances are returned in 16.16 format but aren't */ + /* transformed by the affine transformation specified by */ + /* @FT_Set_Transform. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 load_flags, + FT_Fixed *padvances ); + +/* */ + + +FT_END_HEADER + +#endif /* __FTADVANC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftbbox.h b/android/jni/ndk_modules/freetype/include/freetype/ftbbox.h new file mode 100644 index 00000000..01fe3fb0 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftbbox.h @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* ftbbox.h */ +/* */ +/* FreeType exact bbox computation (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component has a _single_ role: to compute exact outline bounding */ + /* boxes. */ + /* */ + /* It is separated from the rest of the engine for various technical */ + /* reasons. It may well be integrated in `ftoutln' later. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTBBOX_H__ +#define __FTBBOX_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_BBox */ + /* */ + /* <Description> */ + /* Compute the exact bounding box of an outline. This is slower */ + /* than computing the control box. However, it uses an advanced */ + /* algorithm which returns _very_ quickly when the two boxes */ + /* coincide. Otherwise, the outline Bézier arcs are traversed to */ + /* extract their extrema. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source outline. */ + /* */ + /* <Output> */ + /* abbox :: The outline's exact bounding box. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTBBOX_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftbdf.h b/android/jni/ndk_modules/freetype/include/freetype/ftbdf.h new file mode 100644 index 00000000..4f8baf84 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftbdf.h @@ -0,0 +1,209 @@ +/***************************************************************************/ +/* */ +/* ftbdf.h */ +/* */ +/* FreeType API for accessing BDF-specific strings (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBDF_H__ +#define __FTBDF_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* bdf_fonts */ + /* */ + /* <Title> */ + /* BDF and PCF Files */ + /* */ + /* <Abstract> */ + /* BDF and PCF specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions specific to BDF */ + /* and PCF fonts. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @enum: + * FT_PropertyType + * + * @description: + * A list of BDF property types. + * + * @values: + * BDF_PROPERTY_TYPE_NONE :: + * Value~0 is used to indicate a missing property. + * + * BDF_PROPERTY_TYPE_ATOM :: + * Property is a string atom. + * + * BDF_PROPERTY_TYPE_INTEGER :: + * Property is a 32-bit signed integer. + * + * BDF_PROPERTY_TYPE_CARDINAL :: + * Property is a 32-bit unsigned integer. + */ + typedef enum BDF_PropertyType_ + { + BDF_PROPERTY_TYPE_NONE = 0, + BDF_PROPERTY_TYPE_ATOM = 1, + BDF_PROPERTY_TYPE_INTEGER = 2, + BDF_PROPERTY_TYPE_CARDINAL = 3 + + } BDF_PropertyType; + + + /********************************************************************** + * + * @type: + * BDF_Property + * + * @description: + * A handle to a @BDF_PropertyRec structure to model a given + * BDF/PCF property. + */ + typedef struct BDF_PropertyRec_* BDF_Property; + + + /********************************************************************** + * + * @struct: + * BDF_PropertyRec + * + * @description: + * This structure models a given BDF/PCF property. + * + * @fields: + * type :: + * The property type. + * + * u.atom :: + * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM. + * + * u.integer :: + * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER. + * + * u.cardinal :: + * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL. + */ + typedef struct BDF_PropertyRec_ + { + BDF_PropertyType type; + union { + const char* atom; + FT_Int32 integer; + FT_UInt32 cardinal; + + } u; + + } BDF_PropertyRec; + + + /********************************************************************** + * + * @function: + * FT_Get_BDF_Charset_ID + * + * @description: + * Retrieve a BDF font character set identity, according to + * the BDF specification. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * acharset_encoding :: + * Charset encoding, as a C~string, owned by the face. + * + * acharset_registry :: + * Charset registry, as a C~string, owned by the face. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with BDF faces, returning an error otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + + /********************************************************************** + * + * @function: + * FT_Get_BDF_Property + * + * @description: + * Retrieve a BDF property from a BDF or PCF font file. + * + * @input: + * face :: A handle to the input face. + * + * name :: The property name. + * + * @output: + * aproperty :: The property. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function works with BDF _and_ PCF fonts. It returns an error + * otherwise. It also returns an error if the property is not in the + * font. + * + * A `property' is a either key-value pair within the STARTPROPERTIES + * ... ENDPROPERTIES block of a BDF font or a key-value pair from the + * `info->props' array within a `FontRec' structure of a PCF font. + * + * Integer properties are always stored as `signed' within PCF fonts; + * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value + * for BDF fonts only. + * + * In case of error, `aproperty->type' is always set to + * @BDF_PROPERTY_TYPE_NONE. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + /* */ + +FT_END_HEADER + +#endif /* __FTBDF_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftbitmap.h b/android/jni/ndk_modules/freetype/include/freetype/ftbitmap.h new file mode 100644 index 00000000..92742369 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftbitmap.h @@ -0,0 +1,227 @@ +/***************************************************************************/ +/* */ +/* ftbitmap.h */ +/* */ +/* FreeType utility functions for bitmaps (specification). */ +/* */ +/* Copyright 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBITMAP_H__ +#define __FTBITMAP_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* bitmap_handling */ + /* */ + /* <Title> */ + /* Bitmap Handling */ + /* */ + /* <Abstract> */ + /* Handling FT_Bitmap objects. */ + /* */ + /* <Description> */ + /* This section contains functions for converting FT_Bitmap objects. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_New */ + /* */ + /* <Description> */ + /* Initialize a pointer to an @FT_Bitmap structure. */ + /* */ + /* <InOut> */ + /* abitmap :: A pointer to the bitmap structure. */ + /* */ + FT_EXPORT( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Copy */ + /* */ + /* <Description> */ + /* Copy a bitmap into another one. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* source :: A handle to the source bitmap. */ + /* */ + /* <Output> */ + /* target :: A handle to the target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Embolden */ + /* */ + /* <Description> */ + /* Embolden a bitmap. The new bitmap will be about `xStrength' */ + /* pixels wider and `yStrength' pixels higher. The left and bottom */ + /* borders are kept unchanged. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* xStrength :: How strong the glyph is emboldened horizontally. */ + /* Expressed in 26.6 pixel format. */ + /* */ + /* yStrength :: How strong the glyph is emboldened vertically. */ + /* Expressed in 26.6 pixel format. */ + /* */ + /* <InOut> */ + /* bitmap :: A handle to the target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The current implementation restricts `xStrength' to be less than */ + /* or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. */ + /* */ + /* If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, */ + /* you should call @FT_GlyphSlot_Own_Bitmap on the slot first. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Convert */ + /* */ + /* <Description> */ + /* Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, or 8bpp to a */ + /* bitmap object with depth 8bpp, making the number of used bytes per */ + /* line (a.k.a. the `pitch') a multiple of `alignment'. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* source :: The source bitmap. */ + /* */ + /* alignment :: The pitch of the bitmap is a multiple of this */ + /* parameter. Common values are 1, 2, or 4. */ + /* */ + /* <Output> */ + /* target :: The target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* It is possible to call @FT_Bitmap_Convert multiple times without */ + /* calling @FT_Bitmap_Done (the memory is simply reallocated). */ + /* */ + /* Use @FT_Bitmap_Done to finally remove the bitmap object. */ + /* */ + /* The `library' argument is taken to have access to FreeType's */ + /* memory handling functions. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GlyphSlot_Own_Bitmap */ + /* */ + /* <Description> */ + /* Make sure that a glyph slot owns `slot->bitmap'. */ + /* */ + /* <Input> */ + /* slot :: The glyph slot. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function is to be used in combination with */ + /* @FT_Bitmap_Embolden. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Done */ + /* */ + /* <Description> */ + /* Destroy a bitmap object created with @FT_Bitmap_New. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* bitmap :: The bitmap object to be freed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `library' argument is taken to have access to FreeType's */ + /* memory handling functions. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTBITMAP_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftcache.h b/android/jni/ndk_modules/freetype/include/freetype/ftcache.h new file mode 100644 index 00000000..a9e1237b --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftcache.h @@ -0,0 +1,1125 @@ +/***************************************************************************/ +/* */ +/* ftcache.h */ +/* */ +/* FreeType Cache subsystem (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCACHE_H__ +#define __FTCACHE_H__ + + +#include <ft2build.h> +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************* + * + * <Section> + * cache_subsystem + * + * <Title> + * Cache Sub-System + * + * <Abstract> + * How to cache face, size, and glyph data with FreeType~2. + * + * <Description> + * This section describes the FreeType~2 cache sub-system, which is used + * to limit the number of concurrently opened @FT_Face and @FT_Size + * objects, as well as caching information like character maps and glyph + * images while limiting their maximum memory usage. + * + * Note that all types and functions begin with the `FTC_' prefix. + * + * The cache is highly portable and thus doesn't know anything about the + * fonts installed on your system, or how to access them. This implies + * the following scheme: + * + * First, available or installed font faces are uniquely identified by + * @FTC_FaceID values, provided to the cache by the client. Note that + * the cache only stores and compares these values, and doesn't try to + * interpret them in any way. + * + * Second, the cache calls, only when needed, a client-provided function + * to convert a @FTC_FaceID into a new @FT_Face object. The latter is + * then completely managed by the cache, including its termination + * through @FT_Done_Face. + * + * Clients are free to map face IDs to anything else. The most simple + * usage is to associate them to a (pathname,face_index) pair that is + * used to call @FT_New_Face. However, more complex schemes are also + * possible. + * + * Note that for the cache to work correctly, the face ID values must be + * *persistent*, which means that the contents they point to should not + * change at runtime, or that their value should not become invalid. + * + * If this is unavoidable (e.g., when a font is uninstalled at runtime), + * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let + * the cache get rid of any references to the old @FTC_FaceID it may + * keep internally. Failure to do so will lead to incorrect behaviour + * or even crashes. + * + * To use the cache, start with calling @FTC_Manager_New to create a new + * @FTC_Manager object, which models a single cache instance. You can + * then look up @FT_Face and @FT_Size objects with + * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively. + * + * If you want to use the charmap caching, call @FTC_CMapCache_New, then + * later use @FTC_CMapCache_Lookup to perform the equivalent of + * @FT_Get_Char_Index, only much faster. + * + * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then + * later use @FTC_ImageCache_Lookup to retrieve the corresponding + * @FT_Glyph objects from the cache. + * + * If you need lots of small bitmaps, it is much more memory efficient + * to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This + * returns @FTC_SBitRec structures, which are used to store small + * bitmaps directly. (A small bitmap is one whose metrics and + * dimensions all fit into 8-bit integers). + * + * We hope to also provide a kerning cache in the near future. + * + * + * <Order> + * FTC_Manager + * FTC_FaceID + * FTC_Face_Requester + * + * FTC_Manager_New + * FTC_Manager_Reset + * FTC_Manager_Done + * FTC_Manager_LookupFace + * FTC_Manager_LookupSize + * FTC_Manager_RemoveFaceID + * + * FTC_Node + * FTC_Node_Unref + * + * FTC_ImageCache + * FTC_ImageCache_New + * FTC_ImageCache_Lookup + * + * FTC_SBit + * FTC_SBitCache + * FTC_SBitCache_New + * FTC_SBitCache_Lookup + * + * FTC_CMapCache + * FTC_CMapCache_New + * FTC_CMapCache_Lookup + * + *************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC TYPE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: FTC_FaceID + * + * @description: + * An opaque pointer type that is used to identity face objects. The + * contents of such objects is application-dependent. + * + * These pointers are typically used to point to a user-defined + * structure containing a font file path, and face index. + * + * @note: + * Never use NULL as a valid @FTC_FaceID. + * + * Face IDs are passed by the client to the cache manager, which calls, + * when needed, the @FTC_Face_Requester to translate them into new + * @FT_Face objects. + * + * If the content of a given face ID changes at runtime, or if the value + * becomes invalid (e.g., when uninstalling a font), you should + * immediately call @FTC_Manager_RemoveFaceID before any other cache + * function. + * + * Failure to do so will result in incorrect behaviour or even + * memory leaks and crashes. + */ + typedef FT_Pointer FTC_FaceID; + + + /************************************************************************ + * + * @functype: + * FTC_Face_Requester + * + * @description: + * A callback function provided by client applications. It is used by + * the cache manager to translate a given @FTC_FaceID into a new valid + * @FT_Face object, on demand. + * + * <Input> + * face_id :: + * The face ID to resolve. + * + * library :: + * A handle to a FreeType library object. + * + * req_data :: + * Application-provided request data (see note below). + * + * <Output> + * aface :: + * A new @FT_Face handle. + * + * <Return> + * FreeType error code. 0~means success. + * + * <Note> + * The third parameter `req_data' is the same as the one passed by the + * client when @FTC_Manager_New is called. + * + * The face requester should not perform funny things on the returned + * face object, like creating a new @FT_Size for it, or setting a + * transformation through @FT_Set_Transform! + */ + typedef FT_Error + (*FTC_Face_Requester)( FTC_FaceID face_id, + FT_Library library, + FT_Pointer request_data, + FT_Face* aface ); + + /* */ + +#define FT_POINTER_TO_ULONG( p ) ( (FT_ULong)(FT_Pointer)(p) ) + +#define FTC_FACE_ID_HASH( i ) \ + ((FT_UInt32)(( FT_POINTER_TO_ULONG( i ) >> 3 ) ^ \ + ( FT_POINTER_TO_ULONG( i ) << 7 ) ) ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_Manager */ + /* */ + /* <Description> */ + /* This object corresponds to one instance of the cache-subsystem. */ + /* It is used to cache one or more @FT_Face objects, along with */ + /* corresponding @FT_Size objects. */ + /* */ + /* The manager intentionally limits the total number of opened */ + /* @FT_Face and @FT_Size objects to control memory usage. See the */ + /* `max_faces' and `max_sizes' parameters of @FTC_Manager_New. */ + /* */ + /* The manager is also used to cache `nodes' of various types while */ + /* limiting their total memory usage. */ + /* */ + /* All limitations are enforced by keeping lists of managed objects */ + /* in most-recently-used order, and flushing old nodes to make room */ + /* for new ones. */ + /* */ + typedef struct FTC_ManagerRec_* FTC_Manager; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_Node */ + /* */ + /* <Description> */ + /* An opaque handle to a cache node object. Each cache node is */ + /* reference-counted. A node with a count of~0 might be flushed */ + /* out of a full cache whenever a lookup request is performed. */ + /* */ + /* If you look up nodes, you have the ability to `acquire' them, */ + /* i.e., to increment their reference count. This will prevent the */ + /* node from being flushed out of the cache until you explicitly */ + /* `release' it (see @FTC_Node_Unref). */ + /* */ + /* See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. */ + /* */ + typedef struct FTC_NodeRec_* FTC_Node; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_New */ + /* */ + /* <Description> */ + /* Create a new cache manager. */ + /* */ + /* <Input> */ + /* library :: The parent FreeType library handle to use. */ + /* */ + /* max_faces :: Maximum number of opened @FT_Face objects managed by */ + /* this cache instance. Use~0 for defaults. */ + /* */ + /* max_sizes :: Maximum number of opened @FT_Size objects managed by */ + /* this cache instance. Use~0 for defaults. */ + /* */ + /* max_bytes :: Maximum number of bytes to use for cached data nodes. */ + /* Use~0 for defaults. Note that this value does not */ + /* account for managed @FT_Face and @FT_Size objects. */ + /* */ + /* requester :: An application-provided callback used to translate */ + /* face IDs into real @FT_Face objects. */ + /* */ + /* req_data :: A generic pointer that is passed to the requester */ + /* each time it is called (see @FTC_Face_Requester). */ + /* */ + /* <Output> */ + /* amanager :: A handle to a new manager object. 0~in case of */ + /* failure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_New( FT_Library library, + FT_UInt max_faces, + FT_UInt max_sizes, + FT_ULong max_bytes, + FTC_Face_Requester requester, + FT_Pointer req_data, + FTC_Manager *amanager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_Reset */ + /* */ + /* <Description> */ + /* Empty a given cache manager. This simply gets rid of all the */ + /* currently cached @FT_Face and @FT_Size objects within the manager. */ + /* */ + /* <InOut> */ + /* manager :: A handle to the manager. */ + /* */ + FT_EXPORT( void ) + FTC_Manager_Reset( FTC_Manager manager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_Done */ + /* */ + /* <Description> */ + /* Destroy a given manager after emptying it. */ + /* */ + /* <Input> */ + /* manager :: A handle to the target cache manager object. */ + /* */ + FT_EXPORT( void ) + FTC_Manager_Done( FTC_Manager manager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_LookupFace */ + /* */ + /* <Description> */ + /* Retrieve the @FT_Face object that corresponds to a given face ID */ + /* through a cache manager. */ + /* */ + /* <Input> */ + /* manager :: A handle to the cache manager. */ + /* */ + /* face_id :: The ID of the face object. */ + /* */ + /* <Output> */ + /* aface :: A handle to the face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned @FT_Face object is always owned by the manager. You */ + /* should never try to discard it yourself. */ + /* */ + /* The @FT_Face object doesn't necessarily have a current size object */ + /* (i.e., face->size can be 0). If you need a specific `font size', */ + /* use @FTC_Manager_LookupSize instead. */ + /* */ + /* Never change the face's transformation matrix (i.e., never call */ + /* the @FT_Set_Transform function) on a returned face! If you need */ + /* to transform glyphs, do it yourself after glyph loading. */ + /* */ + /* When you perform a lookup, out-of-memory errors are detected */ + /* _within_ the lookup and force incremental flushes of the cache */ + /* until enough memory is released for the lookup to succeed. */ + /* */ + /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ + /* already been completely flushed, and still no memory was available */ + /* for the operation. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_ScalerRec */ + /* */ + /* <Description> */ + /* A structure used to describe a given character size in either */ + /* pixels or points to the cache manager. See */ + /* @FTC_Manager_LookupSize. */ + /* */ + /* <Fields> */ + /* face_id :: The source face ID. */ + /* */ + /* width :: The character width. */ + /* */ + /* height :: The character height. */ + /* */ + /* pixel :: A Boolean. If 1, the `width' and `height' fields are */ + /* interpreted as integer pixel character sizes. */ + /* Otherwise, they are expressed as 1/64th of points. */ + /* */ + /* x_res :: Only used when `pixel' is value~0 to indicate the */ + /* horizontal resolution in dpi. */ + /* */ + /* y_res :: Only used when `pixel' is value~0 to indicate the */ + /* vertical resolution in dpi. */ + /* */ + /* <Note> */ + /* This type is mainly used to retrieve @FT_Size objects through the */ + /* cache manager. */ + /* */ + typedef struct FTC_ScalerRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int pixel; + FT_UInt x_res; + FT_UInt y_res; + + } FTC_ScalerRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_Scaler */ + /* */ + /* <Description> */ + /* A handle to an @FTC_ScalerRec structure. */ + /* */ + typedef struct FTC_ScalerRec_* FTC_Scaler; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_LookupSize */ + /* */ + /* <Description> */ + /* Retrieve the @FT_Size object that corresponds to a given */ + /* @FTC_ScalerRec pointer through a cache manager. */ + /* */ + /* <Input> */ + /* manager :: A handle to the cache manager. */ + /* */ + /* scaler :: A scaler handle. */ + /* */ + /* <Output> */ + /* asize :: A handle to the size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned @FT_Size object is always owned by the manager. You */ + /* should never try to discard it by yourself. */ + /* */ + /* You can access the parent @FT_Face object simply as `size->face' */ + /* if you need it. Note that this object is also owned by the */ + /* manager. */ + /* */ + /* <Note> */ + /* When you perform a lookup, out-of-memory errors are detected */ + /* _within_ the lookup and force incremental flushes of the cache */ + /* until enough memory is released for the lookup to succeed. */ + /* */ + /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ + /* already been completely flushed, and still no memory is available */ + /* for the operation. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Node_Unref */ + /* */ + /* <Description> */ + /* Decrement a cache node's internal reference count. When the count */ + /* reaches 0, it is not destroyed but becomes eligible for subsequent */ + /* cache flushes. */ + /* */ + /* <Input> */ + /* node :: The cache node handle. */ + /* */ + /* manager :: The cache manager handle. */ + /* */ + FT_EXPORT( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ); + + + /************************************************************************* + * + * @function: + * FTC_Manager_RemoveFaceID + * + * @description: + * A special function used to indicate to the cache manager that + * a given @FTC_FaceID is no longer valid, either because its + * content changed, or because it was deallocated or uninstalled. + * + * @input: + * manager :: + * The cache manager handle. + * + * face_id :: + * The @FTC_FaceID to be removed. + * + * @note: + * This function flushes all nodes from the cache corresponding to this + * `face_id', with the exception of nodes with a non-null reference + * count. + * + * Such nodes are however modified internally so as to never appear + * in later lookups with the same `face_id' value, and to be immediately + * destroyed when released by all their users. + * + */ + FT_EXPORT( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * FTC_CMapCache + * + * @description: + * An opaque handle used to model a charmap cache. This cache is to + * hold character codes -> glyph indices mappings. + * + */ + typedef struct FTC_CMapCacheRec_* FTC_CMapCache; + + + /************************************************************************* + * + * @function: + * FTC_CMapCache_New + * + * @description: + * Create a new charmap cache. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * @output: + * acache :: + * A new cache handle. NULL in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Like all other caches, this one will be destroyed with the cache + * manager. + * + */ + FT_EXPORT( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ); + + + /************************************************************************ + * + * @function: + * FTC_CMapCache_Lookup + * + * @description: + * Translate a character code into a glyph index, using the charmap + * cache. + * + * @input: + * cache :: + * A charmap cache handle. + * + * face_id :: + * The source face ID. + * + * cmap_index :: + * The index of the charmap in the source face. Any negative value + * means to use the cache @FT_Face's default charmap. + * + * char_code :: + * The character code (in the corresponding charmap). + * + * @return: + * Glyph index. 0~means `no glyph'. + * + */ + FT_EXPORT( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** IMAGE CACHE OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************* + * + * @struct: + * FTC_ImageTypeRec + * + * @description: + * A structure used to model the type of images in a glyph cache. + * + * @fields: + * face_id :: + * The face ID. + * + * width :: + * The width in pixels. + * + * height :: + * The height in pixels. + * + * flags :: + * The load flags, as in @FT_Load_Glyph. + * + */ + typedef struct FTC_ImageTypeRec_ + { + FTC_FaceID face_id; + FT_Int width; + FT_Int height; + FT_Int32 flags; + + } FTC_ImageTypeRec; + + + /************************************************************************* + * + * @type: + * FTC_ImageType + * + * @description: + * A handle to an @FTC_ImageTypeRec structure. + * + */ + typedef struct FTC_ImageTypeRec_* FTC_ImageType; + + + /* */ + + +#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ + ( (d1)->face_id == (d2)->face_id && \ + (d1)->width == (d2)->width && \ + (d1)->flags == (d2)->flags ) + +#define FTC_IMAGE_TYPE_HASH( d ) \ + (FT_UFast)( FTC_FACE_ID_HASH( (d)->face_id ) ^ \ + ( (d)->width << 8 ) ^ (d)->height ^ \ + ( (d)->flags << 4 ) ) + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_ImageCache */ + /* */ + /* <Description> */ + /* A handle to an glyph image cache object. They are designed to */ + /* hold many distinct glyph images while not exceeding a certain */ + /* memory threshold. */ + /* */ + typedef struct FTC_ImageCacheRec_* FTC_ImageCache; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_New */ + /* */ + /* <Description> */ + /* Create a new glyph image cache. */ + /* */ + /* <Input> */ + /* manager :: The parent manager for the image cache. */ + /* */ + /* <Output> */ + /* acache :: A handle to the new glyph image cache object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_Lookup */ + /* */ + /* <Description> */ + /* Retrieve a given glyph image from a glyph image cache. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* type :: A pointer to a glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* <Output> */ + /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */ + /* failure. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the glyph image, after increasing its reference */ + /* count. This ensures that the node (as well as the @FT_Glyph) will */ + /* always be kept in the cache until you call @FTC_Node_Unref to */ + /* `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the @FT_Glyph could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_LookupScaler */ + /* */ + /* <Description> */ + /* A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec */ + /* to specify the face ID and its size. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* scaler :: A pointer to a scaler descriptor. */ + /* */ + /* load_flags :: The corresponding load flags. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* <Output> */ + /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */ + /* failure. */ + /* */ + /* anode :: Used to return the address of of the corresponding */ + /* cache node after incrementing its reference count */ + /* (see note below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the glyph image, after increasing its reference */ + /* count. This ensures that the node (as well as the @FT_Glyph) will */ + /* always be kept in the cache until you call @FTC_Node_Unref to */ + /* `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the @FT_Glyph could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + /* Calls to @FT_Set_Char_Size and friends have no effect on cached */ + /* glyphs; you should always use the FreeType cache API instead. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_LookupScaler( FTC_ImageCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_SBit */ + /* */ + /* <Description> */ + /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */ + /* structure for details. */ + /* */ + typedef struct FTC_SBitRec_* FTC_SBit; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_SBitRec */ + /* */ + /* <Description> */ + /* A very compact structure used to describe a small glyph bitmap. */ + /* */ + /* <Fields> */ + /* width :: The bitmap width in pixels. */ + /* */ + /* height :: The bitmap height in pixels. */ + /* */ + /* left :: The horizontal distance from the pen position to the */ + /* left bitmap border (a.k.a. `left side bearing', or */ + /* `lsb'). */ + /* */ + /* top :: The vertical distance from the pen position (on the */ + /* baseline) to the upper bitmap border (a.k.a. `top */ + /* side bearing'). The distance is positive for upwards */ + /* y~coordinates. */ + /* */ + /* format :: The format of the glyph bitmap (monochrome or gray). */ + /* */ + /* max_grays :: Maximum gray level value (in the range 1 to~255). */ + /* */ + /* pitch :: The number of bytes per bitmap line. May be positive */ + /* or negative. */ + /* */ + /* xadvance :: The horizontal advance width in pixels. */ + /* */ + /* yadvance :: The vertical advance height in pixels. */ + /* */ + /* buffer :: A pointer to the bitmap pixels. */ + /* */ + typedef struct FTC_SBitRec_ + { + FT_Byte width; + FT_Byte height; + FT_Char left; + FT_Char top; + + FT_Byte format; + FT_Byte max_grays; + FT_Short pitch; + FT_Char xadvance; + FT_Char yadvance; + + FT_Byte* buffer; + + } FTC_SBitRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_SBitCache */ + /* */ + /* <Description> */ + /* A handle to a small bitmap cache. These are special cache objects */ + /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */ + /* much more efficient way than the traditional glyph image cache */ + /* implemented by @FTC_ImageCache. */ + /* */ + typedef struct FTC_SBitCacheRec_* FTC_SBitCache; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_New */ + /* */ + /* <Description> */ + /* Create a new cache to store small glyph bitmaps. */ + /* */ + /* <Input> */ + /* manager :: A handle to the source cache manager. */ + /* */ + /* <Output> */ + /* acache :: A handle to the new sbit cache. NULL in case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_Lookup */ + /* */ + /* <Description> */ + /* Look up a given small glyph bitmap in a given sbit cache and */ + /* `lock' it to prevent its flushing from the cache until needed. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* type :: A pointer to the glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* <Output> */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to~0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the bitmap, after increasing its reference count. */ + /* This ensures that the node (as well as the image) will always be */ + /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the bitmap could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_LookupScaler */ + /* */ + /* <Description> */ + /* A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec */ + /* to specify the face ID and its size. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* scaler :: A pointer to the scaler descriptor. */ + /* */ + /* load_flags :: The corresponding load flags. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* <Output> */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* anode :: Used to return the address of of the corresponding */ + /* cache node after incrementing its reference count */ + /* (see note below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to~0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the bitmap, after increasing its reference count. */ + /* This ensures that the node (as well as the image) will always be */ + /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the bitmap could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_LookupScaler( FTC_SBitCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /* */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*@***********************************************************************/ + /* */ + /* <Struct> */ + /* FTC_FontRec */ + /* */ + /* <Description> */ + /* A simple structure used to describe a given `font' to the cache */ + /* manager. Note that a `font' is the combination of a given face */ + /* with a given character size. */ + /* */ + /* <Fields> */ + /* face_id :: The ID of the face to use. */ + /* */ + /* pix_width :: The character width in integer pixels. */ + /* */ + /* pix_height :: The character height in integer pixels. */ + /* */ + typedef struct FTC_FontRec_ + { + FTC_FaceID face_id; + FT_UShort pix_width; + FT_UShort pix_height; + + } FTC_FontRec; + + + /* */ + + +#define FTC_FONT_COMPARE( f1, f2 ) \ + ( (f1)->face_id == (f2)->face_id && \ + (f1)->pix_width == (f2)->pix_width && \ + (f1)->pix_height == (f2)->pix_height ) + +#define FTC_FONT_HASH( f ) \ + (FT_UInt32)( FTC_FACE_ID_HASH((f)->face_id) ^ \ + ((f)->pix_width << 8) ^ \ + ((f)->pix_height) ) + + typedef FTC_FontRec* FTC_Font; + + + FT_EXPORT( FT_Error ) + FTC_Manager_Lookup_Face( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + FT_EXPORT( FT_Error ) + FTC_Manager_Lookup_Size( FTC_Manager manager, + FTC_Font font, + FT_Face *aface, + FT_Size *asize ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* */ + +FT_END_HEADER + +#endif /* __FTCACHE_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftchapters.h b/android/jni/ndk_modules/freetype/include/freetype/ftchapters.h new file mode 100644 index 00000000..7775a6bb --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftchapters.h @@ -0,0 +1,103 @@ +/***************************************************************************/ +/* */ +/* This file defines the structure of the FreeType reference. */ +/* It is used by the python script which generates the HTML files. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* general_remarks */ +/* */ +/* <Title> */ +/* General Remarks */ +/* */ +/* <Sections> */ +/* user_allocation */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* core_api */ +/* */ +/* <Title> */ +/* Core API */ +/* */ +/* <Sections> */ +/* version */ +/* basic_types */ +/* base_interface */ +/* glyph_variants */ +/* glyph_management */ +/* mac_specific */ +/* sizes_management */ +/* header_file_macros */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* format_specific */ +/* */ +/* <Title> */ +/* Format-Specific API */ +/* */ +/* <Sections> */ +/* multiple_masters */ +/* truetype_tables */ +/* type1_tables */ +/* sfnt_names */ +/* bdf_fonts */ +/* cid_fonts */ +/* pfr_fonts */ +/* winfnt_fonts */ +/* font_formats */ +/* gasp_table */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* cache_subsystem */ +/* */ +/* <Title> */ +/* Cache Sub-System */ +/* */ +/* <Sections> */ +/* cache_subsystem */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* support_api */ +/* */ +/* <Title> */ +/* Support API */ +/* */ +/* <Sections> */ +/* computations */ +/* list_processing */ +/* outline_processing */ +/* quick_advance */ +/* bitmap_handling */ +/* raster */ +/* glyph_stroker */ +/* system_interface */ +/* module_management */ +/* gzip */ +/* lzw */ +/* lcd_filtering */ +/* */ +/***************************************************************************/ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftcid.h b/android/jni/ndk_modules/freetype/include/freetype/ftcid.h new file mode 100644 index 00000000..203a30ca --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftcid.h @@ -0,0 +1,166 @@ +/***************************************************************************/ +/* */ +/* ftcid.h */ +/* */ +/* FreeType API for accessing CID font information (specification). */ +/* */ +/* Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCID_H__ +#define __FTCID_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cid_fonts */ + /* */ + /* <Title> */ + /* CID Fonts */ + /* */ + /* <Abstract> */ + /* CID-keyed font specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of CID-keyed font specific */ + /* functions. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @function: + * FT_Get_CID_Registry_Ordering_Supplement + * + * @description: + * Retrieve the Registry/Ordering/Supplement triple (also known as the + * "R/O/S") from a CID-keyed font. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * registry :: + * The registry, as a C~string, owned by the face. + * + * ordering :: + * The ordering, as a C~string, owned by the face. + * + * supplement :: + * The supplement. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces, returning an error + * otherwise. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement); + + + /********************************************************************** + * + * @function: + * FT_Get_CID_Is_Internally_CID_Keyed + * + * @description: + * Retrieve the type of the input face, CID keyed or not. In + * constrast to the @FT_IS_CID_KEYED macro this function returns + * successfully also for CID-keyed fonts in an SNFT wrapper. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * is_cid :: + * The type of the face as an @FT_Bool. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, + * returning an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, + FT_Bool *is_cid ); + + + /********************************************************************** + * + * @function: + * FT_Get_CID_From_Glyph_Index + * + * @description: + * Retrieve the CID of the input glyph index. + * + * @input: + * face :: + * A handle to the input face. + * + * glyph_index :: + * The input glyph index. + * + * @output: + * cid :: + * The CID as an @FT_UInt. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, + * returning an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_From_Glyph_Index( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + /* */ + +FT_END_HEADER + +#endif /* __FTCID_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/fterrdef.h b/android/jni/ndk_modules/freetype/include/freetype/fterrdef.h new file mode 100644 index 00000000..bf522206 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/fterrdef.h @@ -0,0 +1,244 @@ +/***************************************************************************/ +/* */ +/* fterrdef.h */ +/* */ +/* FreeType error codes (specification). */ +/* */ +/* Copyright 2002, 2004, 2006, 2007, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST OF ERROR CODES/MESSAGES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + + /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */ + /* including this file. */ + + + /* generic errors */ + + FT_NOERRORDEF_( Ok, 0x00, \ + "no error" ) + + FT_ERRORDEF_( Cannot_Open_Resource, 0x01, \ + "cannot open resource" ) + FT_ERRORDEF_( Unknown_File_Format, 0x02, \ + "unknown file format" ) + FT_ERRORDEF_( Invalid_File_Format, 0x03, \ + "broken file" ) + FT_ERRORDEF_( Invalid_Version, 0x04, \ + "invalid FreeType version" ) + FT_ERRORDEF_( Lower_Module_Version, 0x05, \ + "module version is too low" ) + FT_ERRORDEF_( Invalid_Argument, 0x06, \ + "invalid argument" ) + FT_ERRORDEF_( Unimplemented_Feature, 0x07, \ + "unimplemented feature" ) + FT_ERRORDEF_( Invalid_Table, 0x08, \ + "broken table" ) + FT_ERRORDEF_( Invalid_Offset, 0x09, \ + "broken offset within table" ) + FT_ERRORDEF_( Array_Too_Large, 0x0A, \ + "array allocation size too large" ) + + /* glyph/character errors */ + + FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, \ + "invalid glyph index" ) + FT_ERRORDEF_( Invalid_Character_Code, 0x11, \ + "invalid character code" ) + FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, \ + "unsupported glyph image format" ) + FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, \ + "cannot render this glyph format" ) + FT_ERRORDEF_( Invalid_Outline, 0x14, \ + "invalid outline" ) + FT_ERRORDEF_( Invalid_Composite, 0x15, \ + "invalid composite glyph" ) + FT_ERRORDEF_( Too_Many_Hints, 0x16, \ + "too many hints" ) + FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, \ + "invalid pixel size" ) + + /* handle errors */ + + FT_ERRORDEF_( Invalid_Handle, 0x20, \ + "invalid object handle" ) + FT_ERRORDEF_( Invalid_Library_Handle, 0x21, \ + "invalid library handle" ) + FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, \ + "invalid module handle" ) + FT_ERRORDEF_( Invalid_Face_Handle, 0x23, \ + "invalid face handle" ) + FT_ERRORDEF_( Invalid_Size_Handle, 0x24, \ + "invalid size handle" ) + FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, \ + "invalid glyph slot handle" ) + FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, \ + "invalid charmap handle" ) + FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, \ + "invalid cache manager handle" ) + FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, \ + "invalid stream handle" ) + + /* driver errors */ + + FT_ERRORDEF_( Too_Many_Drivers, 0x30, \ + "too many modules" ) + FT_ERRORDEF_( Too_Many_Extensions, 0x31, \ + "too many extensions" ) + + /* memory errors */ + + FT_ERRORDEF_( Out_Of_Memory, 0x40, \ + "out of memory" ) + FT_ERRORDEF_( Unlisted_Object, 0x41, \ + "unlisted object" ) + + /* stream errors */ + + FT_ERRORDEF_( Cannot_Open_Stream, 0x51, \ + "cannot open stream" ) + FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, \ + "invalid stream seek" ) + FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, \ + "invalid stream skip" ) + FT_ERRORDEF_( Invalid_Stream_Read, 0x54, \ + "invalid stream read" ) + FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, \ + "invalid stream operation" ) + FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, \ + "invalid frame operation" ) + FT_ERRORDEF_( Nested_Frame_Access, 0x57, \ + "nested frame access" ) + FT_ERRORDEF_( Invalid_Frame_Read, 0x58, \ + "invalid frame read" ) + + /* raster errors */ + + FT_ERRORDEF_( Raster_Uninitialized, 0x60, \ + "raster uninitialized" ) + FT_ERRORDEF_( Raster_Corrupted, 0x61, \ + "raster corrupted" ) + FT_ERRORDEF_( Raster_Overflow, 0x62, \ + "raster overflow" ) + FT_ERRORDEF_( Raster_Negative_Height, 0x63, \ + "negative height while rastering" ) + + /* cache errors */ + + FT_ERRORDEF_( Too_Many_Caches, 0x70, \ + "too many registered caches" ) + + /* TrueType and SFNT errors */ + + FT_ERRORDEF_( Invalid_Opcode, 0x80, \ + "invalid opcode" ) + FT_ERRORDEF_( Too_Few_Arguments, 0x81, \ + "too few arguments" ) + FT_ERRORDEF_( Stack_Overflow, 0x82, \ + "stack overflow" ) + FT_ERRORDEF_( Code_Overflow, 0x83, \ + "code overflow" ) + FT_ERRORDEF_( Bad_Argument, 0x84, \ + "bad argument" ) + FT_ERRORDEF_( Divide_By_Zero, 0x85, \ + "division by zero" ) + FT_ERRORDEF_( Invalid_Reference, 0x86, \ + "invalid reference" ) + FT_ERRORDEF_( Debug_OpCode, 0x87, \ + "found debug opcode" ) + FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, \ + "found ENDF opcode in execution stream" ) + FT_ERRORDEF_( Nested_DEFS, 0x89, \ + "nested DEFS" ) + FT_ERRORDEF_( Invalid_CodeRange, 0x8A, \ + "invalid code range" ) + FT_ERRORDEF_( Execution_Too_Long, 0x8B, \ + "execution context too long" ) + FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, \ + "too many function definitions" ) + FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, \ + "too many instruction definitions" ) + FT_ERRORDEF_( Table_Missing, 0x8E, \ + "SFNT font table missing" ) + FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, \ + "horizontal header (hhea) table missing" ) + FT_ERRORDEF_( Locations_Missing, 0x90, \ + "locations (loca) table missing" ) + FT_ERRORDEF_( Name_Table_Missing, 0x91, \ + "name table missing" ) + FT_ERRORDEF_( CMap_Table_Missing, 0x92, \ + "character map (cmap) table missing" ) + FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, \ + "horizontal metrics (hmtx) table missing" ) + FT_ERRORDEF_( Post_Table_Missing, 0x94, \ + "PostScript (post) table missing" ) + FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, \ + "invalid horizontal metrics" ) + FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, \ + "invalid character map (cmap) format" ) + FT_ERRORDEF_( Invalid_PPem, 0x97, \ + "invalid ppem value" ) + FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, \ + "invalid vertical metrics" ) + FT_ERRORDEF_( Could_Not_Find_Context, 0x99, \ + "could not find context" ) + FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, \ + "invalid PostScript (post) table format" ) + FT_ERRORDEF_( Invalid_Post_Table, 0x9B, \ + "invalid PostScript (post) table" ) + + /* CFF, CID, and Type 1 errors */ + + FT_ERRORDEF_( Syntax_Error, 0xA0, \ + "opcode syntax error" ) + FT_ERRORDEF_( Stack_Underflow, 0xA1, \ + "argument stack underflow" ) + FT_ERRORDEF_( Ignore, 0xA2, \ + "ignore" ) + FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, \ + "no Unicode glyph name found" ) + + + /* BDF errors */ + + FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, \ + "`STARTFONT' field missing" ) + FT_ERRORDEF_( Missing_Font_Field, 0xB1, \ + "`FONT' field missing" ) + FT_ERRORDEF_( Missing_Size_Field, 0xB2, \ + "`SIZE' field missing" ) + FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, \ + "`FONTBOUNDINGBOX' field missing" ) + FT_ERRORDEF_( Missing_Chars_Field, 0xB4, \ + "`CHARS' field missing" ) + FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, \ + "`STARTCHAR' field missing" ) + FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, \ + "`ENCODING' field missing" ) + FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, \ + "`BBX' field missing" ) + FT_ERRORDEF_( Bbx_Too_Big, 0xB8, \ + "`BBX' too big" ) + FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, \ + "Font header corrupted or missing fields" ) + FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, \ + "Font glyphs corrupted or missing fields" ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/fterrors.h b/android/jni/ndk_modules/freetype/include/freetype/fterrors.h new file mode 100644 index 00000000..6600dadd --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/fterrors.h @@ -0,0 +1,206 @@ +/***************************************************************************/ +/* */ +/* fterrors.h */ +/* */ +/* FreeType error code handling (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This special header file is used to define the handling of FT2 */ + /* enumeration constants. It can also be used to generate error message */ + /* strings with a small macro trick explained below. */ + /* */ + /* I - Error Formats */ + /* ----------------- */ + /* */ + /* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be */ + /* defined in ftoption.h in order to make the higher byte indicate */ + /* the module where the error has happened (this is not compatible */ + /* with standard builds of FreeType 2). You can then use the macro */ + /* FT_ERROR_BASE macro to extract the generic error code from an */ + /* FT_Error value. */ + /* */ + /* */ + /* II - Error Message strings */ + /* -------------------------- */ + /* */ + /* The error definitions below are made through special macros that */ + /* allow client applications to build a table of error message strings */ + /* if they need it. The strings are not included in a normal build of */ + /* FreeType 2 to save space (most client applications do not use */ + /* them). */ + /* */ + /* To do so, you have to define the following macros before including */ + /* this file: */ + /* */ + /* FT_ERROR_START_LIST :: */ + /* This macro is called before anything else to define the start of */ + /* the error list. It is followed by several FT_ERROR_DEF calls */ + /* (see below). */ + /* */ + /* FT_ERROR_DEF( e, v, s ) :: */ + /* This macro is called to define one single error. */ + /* `e' is the error code identifier (e.g. FT_Err_Invalid_Argument). */ + /* `v' is the error numerical value. */ + /* `s' is the corresponding error string. */ + /* */ + /* FT_ERROR_END_LIST :: */ + /* This macro ends the list. */ + /* */ + /* Additionally, you have to undefine __FTERRORS_H__ before #including */ + /* this file. */ + /* */ + /* Here is a simple example: */ + /* */ + /* { */ + /* #undef __FTERRORS_H__ */ + /* #define FT_ERRORDEF( e, v, s ) { e, s }, */ + /* #define FT_ERROR_START_LIST { */ + /* #define FT_ERROR_END_LIST { 0, 0 } }; */ + /* */ + /* const struct */ + /* { */ + /* int err_code; */ + /* const char* err_msg; */ + /* } ft_errors[] = */ + /* */ + /* #include FT_ERRORS_H */ + /* } */ + /* */ + /*************************************************************************/ + + +#ifndef __FTERRORS_H__ +#define __FTERRORS_H__ + + + /* include module base error codes */ +#include FT_MODULE_ERRORS_H + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#undef FT_ERR_XCAT +#undef FT_ERR_CAT + +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + + + /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ + /* By default, we use `FT_Err_'. */ + /* */ +#ifndef FT_ERR_PREFIX +#define FT_ERR_PREFIX FT_Err_ +#endif + + + /* FT_ERR_BASE is used as the base for module-specific errors. */ + /* */ +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS + +#ifndef FT_ERR_BASE +#define FT_ERR_BASE FT_Mod_Err_Base +#endif + +#else + +#undef FT_ERR_BASE +#define FT_ERR_BASE 0 + +#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ + + + /* If FT_ERRORDEF is not defined, we need to define a simple */ + /* enumeration type. */ + /* */ +#ifndef FT_ERRORDEF + +#define FT_ERRORDEF( e, v, s ) e = v, +#define FT_ERROR_START_LIST enum { +#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_ERRORDEF */ + + + /* this macro is used to define an error */ +#define FT_ERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) + + /* this is only used for <module>_Err_Ok, which must be 0! */ +#define FT_NOERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) + + +#ifdef FT_ERROR_START_LIST + FT_ERROR_START_LIST +#endif + + + /* now include the error codes */ +#include FT_ERROR_DEFINITIONS_H + + +#ifdef FT_ERROR_END_LIST + FT_ERROR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SIMPLE CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_ERROR_START_LIST +#undef FT_ERROR_END_LIST + +#undef FT_ERRORDEF +#undef FT_ERRORDEF_ +#undef FT_NOERRORDEF_ + +#undef FT_NEED_EXTERN_C +#undef FT_ERR_CONCAT +#undef FT_ERR_BASE + + /* FT_KEEP_ERR_PREFIX is needed for ftvalid.h */ +#ifndef FT_KEEP_ERR_PREFIX +#undef FT_ERR_PREFIX +#endif + +#endif /* __FTERRORS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftgasp.h b/android/jni/ndk_modules/freetype/include/freetype/ftgasp.h new file mode 100644 index 00000000..91a769e5 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftgasp.h @@ -0,0 +1,120 @@ +/***************************************************************************/ +/* */ +/* ftgasp.h */ +/* */ +/* Access of TrueType's `gasp' table (specification). */ +/* */ +/* Copyright 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef _FT_GASP_H_ +#define _FT_GASP_H_ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + + /*************************************************************************** + * + * @section: + * gasp_table + * + * @title: + * Gasp Table + * + * @abstract: + * Retrieving TrueType `gasp' table entries. + * + * @description: + * The function @FT_Get_Gasp can be used to query a TrueType or OpenType + * font for specific entries in its `gasp' table, if any. This is + * mainly useful when implementing native TrueType hinting with the + * bytecode interpreter to duplicate the Windows text rendering results. + */ + + /************************************************************************* + * + * @enum: + * FT_GASP_XXX + * + * @description: + * A list of values and/or bit-flags returned by the @FT_Get_Gasp + * function. + * + * @values: + * FT_GASP_NO_TABLE :: + * This special value means that there is no GASP table in this face. + * It is up to the client to decide what to do. + * + * FT_GASP_DO_GRIDFIT :: + * Grid-fitting and hinting should be performed at the specified ppem. + * This *really* means TrueType bytecode interpretation. + * + * FT_GASP_DO_GRAY :: + * Anti-aliased rendering should be performed at the specified ppem. + * + * FT_GASP_SYMMETRIC_SMOOTHING :: + * Smoothing along multiple axes must be used with ClearType. + * + * FT_GASP_SYMMETRIC_GRIDFIT :: + * Grid-fitting must be used with ClearType's symmetric smoothing. + * + * @note: + * `ClearType' is Microsoft's implementation of LCD rendering, partly + * protected by patents. + * + * @since: + * 2.3.0 + */ +#define FT_GASP_NO_TABLE -1 +#define FT_GASP_DO_GRIDFIT 0x01 +#define FT_GASP_DO_GRAY 0x02 +#define FT_GASP_SYMMETRIC_SMOOTHING 0x08 +#define FT_GASP_SYMMETRIC_GRIDFIT 0x10 + + + /************************************************************************* + * + * @func: + * FT_Get_Gasp + * + * @description: + * Read the `gasp' table from a TrueType or OpenType font file and + * return the entry corresponding to a given character pixel size. + * + * @input: + * face :: The source face handle. + * ppem :: The vertical character pixel size. + * + * @return: + * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no + * `gasp' table in the face. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ); + +/* */ + +#endif /* _FT_GASP_H_ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftglyph.h b/android/jni/ndk_modules/freetype/include/freetype/ftglyph.h new file mode 100644 index 00000000..0b8f0c04 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftglyph.h @@ -0,0 +1,613 @@ +/***************************************************************************/ +/* */ +/* ftglyph.h */ +/* */ +/* FreeType convenience functions to handle glyphs (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file contains the definition of several convenience functions */ + /* that can be used by client applications to easily retrieve glyph */ + /* bitmaps and outlines from a given face. */ + /* */ + /* These functions should be optional if you are writing a font server */ + /* or text layout engine on top of FreeType. However, they are pretty */ + /* handy for many other simple uses of the library. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTGLYPH_H__ +#define __FTGLYPH_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* glyph_management */ + /* */ + /* <Title> */ + /* Glyph Management */ + /* */ + /* <Abstract> */ + /* Generic interface to manage individual glyph data. */ + /* */ + /* <Description> */ + /* This section contains definitions used to manage glyph data */ + /* through generic FT_Glyph objects. Each of them can contain a */ + /* bitmap, a vector outline, or even images in other formats. */ + /* */ + /*************************************************************************/ + + + /* forward declaration to a private type */ + typedef struct FT_Glyph_Class_ FT_Glyph_Class; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Glyph */ + /* */ + /* <Description> */ + /* Handle to an object used to model generic glyph images. It is a */ + /* pointer to the @FT_GlyphRec structure and can contain a glyph */ + /* bitmap or pointer. */ + /* */ + /* <Note> */ + /* Glyph objects are not owned by the library. You must thus release */ + /* them manually (through @FT_Done_Glyph) _before_ calling */ + /* @FT_Done_FreeType. */ + /* */ + typedef struct FT_GlyphRec_* FT_Glyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphRec */ + /* */ + /* <Description> */ + /* The root glyph structure contains a given glyph image plus its */ + /* advance width in 16.16 fixed float format. */ + /* */ + /* <Fields> */ + /* library :: A handle to the FreeType library object. */ + /* */ + /* clazz :: A pointer to the glyph's class. Private. */ + /* */ + /* format :: The format of the glyph's image. */ + /* */ + /* advance :: A 16.16 vector that gives the glyph's advance width. */ + /* */ + typedef struct FT_GlyphRec_ + { + FT_Library library; + const FT_Glyph_Class* clazz; + FT_Glyph_Format format; + FT_Vector advance; + + } FT_GlyphRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_BitmapGlyph */ + /* */ + /* <Description> */ + /* A handle to an object used to model a bitmap glyph image. This is */ + /* a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. */ + /* */ + typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_BitmapGlyphRec */ + /* */ + /* <Description> */ + /* A structure used for bitmap glyph images. This really is a */ + /* `sub-class' of @FT_GlyphRec. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Glyph fields. */ + /* */ + /* left :: The left-side bearing, i.e., the horizontal distance */ + /* from the current pen position to the left border of the */ + /* glyph bitmap. */ + /* */ + /* top :: The top-side bearing, i.e., the vertical distance from */ + /* the current pen position to the top border of the glyph */ + /* bitmap. This distance is positive for upwards~y! */ + /* */ + /* bitmap :: A descriptor for the bitmap. */ + /* */ + /* <Note> */ + /* You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have */ + /* `glyph->format == FT_GLYPH_FORMAT_BITMAP'. This lets you access */ + /* the bitmap's contents easily. */ + /* */ + /* The corresponding pixel buffer is always owned by @FT_BitmapGlyph */ + /* and is thus created and destroyed with it. */ + /* */ + typedef struct FT_BitmapGlyphRec_ + { + FT_GlyphRec root; + FT_Int left; + FT_Int top; + FT_Bitmap bitmap; + + } FT_BitmapGlyphRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_OutlineGlyph */ + /* */ + /* <Description> */ + /* A handle to an object used to model an outline glyph image. This */ + /* is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */ + /* */ + typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_OutlineGlyphRec */ + /* */ + /* <Description> */ + /* A structure used for outline (vectorial) glyph images. This */ + /* really is a `sub-class' of @FT_GlyphRec. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Glyph fields. */ + /* */ + /* outline :: A descriptor for the outline. */ + /* */ + /* <Note> */ + /* You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have */ + /* `glyph->format == FT_GLYPH_FORMAT_OUTLINE'. This lets you access */ + /* the outline's content easily. */ + /* */ + /* As the outline is extracted from a glyph slot, its coordinates are */ + /* expressed normally in 26.6 pixels, unless the flag */ + /* @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */ + /* */ + /* The outline's tables are always owned by the object and are */ + /* destroyed with it. */ + /* */ + typedef struct FT_OutlineGlyphRec_ + { + FT_GlyphRec root; + FT_Outline outline; + + } FT_OutlineGlyphRec; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Glyph */ + /* */ + /* <Description> */ + /* A function used to extract a glyph image from a slot. Note that */ + /* the created @FT_Glyph object must be released with @FT_Done_Glyph. */ + /* */ + /* <Input> */ + /* slot :: A handle to the source glyph slot. */ + /* */ + /* <Output> */ + /* aglyph :: A handle to the glyph object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Copy */ + /* */ + /* <Description> */ + /* A function used to copy a glyph image. Note that the created */ + /* @FT_Glyph object must be released with @FT_Done_Glyph. */ + /* */ + /* <Input> */ + /* source :: A handle to the source glyph object. */ + /* */ + /* <Output> */ + /* target :: A handle to the target glyph object. 0~in case of */ + /* error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Transform */ + /* */ + /* <Description> */ + /* Transform a glyph image if its format is scalable. */ + /* */ + /* <InOut> */ + /* glyph :: A handle to the target glyph object. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to a 2x2 matrix to apply. */ + /* */ + /* delta :: A pointer to a 2d vector to apply. Coordinates are */ + /* expressed in 1/64th of a pixel. */ + /* */ + /* <Return> */ + /* FreeType error code (if not 0, the glyph format is not scalable). */ + /* */ + /* <Note> */ + /* The 2x2 transformation matrix is also applied to the glyph's */ + /* advance vector. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Glyph_BBox_Mode */ + /* */ + /* <Description> */ + /* The mode how the values of @FT_Glyph_Get_CBox are returned. */ + /* */ + /* <Values> */ + /* FT_GLYPH_BBOX_UNSCALED :: */ + /* Return unscaled font units. */ + /* */ + /* FT_GLYPH_BBOX_SUBPIXELS :: */ + /* Return unfitted 26.6 coordinates. */ + /* */ + /* FT_GLYPH_BBOX_GRIDFIT :: */ + /* Return grid-fitted 26.6 coordinates. */ + /* */ + /* FT_GLYPH_BBOX_TRUNCATE :: */ + /* Return coordinates in integer pixels. */ + /* */ + /* FT_GLYPH_BBOX_PIXELS :: */ + /* Return grid-fitted pixel coordinates. */ + /* */ + typedef enum FT_Glyph_BBox_Mode_ + { + FT_GLYPH_BBOX_UNSCALED = 0, + FT_GLYPH_BBOX_SUBPIXELS = 0, + FT_GLYPH_BBOX_GRIDFIT = 1, + FT_GLYPH_BBOX_TRUNCATE = 2, + FT_GLYPH_BBOX_PIXELS = 3 + + } FT_Glyph_BBox_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_glyph_bbox_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated. Use the corresponding */ + /* @FT_Glyph_BBox_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_glyph_bbox_unscaled :: See @FT_GLYPH_BBOX_UNSCALED. */ + /* ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS. */ + /* ft_glyph_bbox_gridfit :: See @FT_GLYPH_BBOX_GRIDFIT. */ + /* ft_glyph_bbox_truncate :: See @FT_GLYPH_BBOX_TRUNCATE. */ + /* ft_glyph_bbox_pixels :: See @FT_GLYPH_BBOX_PIXELS. */ + /* */ +#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED +#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS +#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT +#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE +#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Get_CBox */ + /* */ + /* <Description> */ + /* Return a glyph's `control box'. The control box encloses all the */ + /* outline's points, including Bézier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* which contains Bézier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component which is dedicated to this single task. */ + /* */ + /* <Input> */ + /* glyph :: A handle to the source glyph object. */ + /* */ + /* mode :: The mode which indicates how to interpret the returned */ + /* bounding box values. */ + /* */ + /* <Output> */ + /* acbox :: The glyph coordinate bounding box. Coordinates are */ + /* expressed in 1/64th of pixels if it is grid-fitted. */ + /* */ + /* <Note> */ + /* Coordinates are relative to the glyph origin, using the y~upwards */ + /* convention. */ + /* */ + /* If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode' */ + /* must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font */ + /* units in 26.6 pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS */ + /* is another name for this constant. */ + /* */ + /* Note that the maximum coordinates are exclusive, which means that */ + /* one can compute the width and height of the glyph image (be it in */ + /* integer or 26.6 pixels) as: */ + /* */ + /* { */ + /* width = bbox.xMax - bbox.xMin; */ + /* height = bbox.yMax - bbox.yMin; */ + /* } */ + /* */ + /* Note also that for 26.6 coordinates, if `bbox_mode' is set to */ + /* @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, */ + /* which corresponds to: */ + /* */ + /* { */ + /* bbox.xMin = FLOOR(bbox.xMin); */ + /* bbox.yMin = FLOOR(bbox.yMin); */ + /* bbox.xMax = CEILING(bbox.xMax); */ + /* bbox.yMax = CEILING(bbox.yMax); */ + /* } */ + /* */ + /* To get the bbox in pixel coordinates, set `bbox_mode' to */ + /* @FT_GLYPH_BBOX_TRUNCATE. */ + /* */ + /* To get the bbox in grid-fitted pixel coordinates, set `bbox_mode' */ + /* to @FT_GLYPH_BBOX_PIXELS. */ + /* */ + FT_EXPORT( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_To_Bitmap */ + /* */ + /* <Description> */ + /* Convert a given glyph object to a bitmap glyph object. */ + /* */ + /* <InOut> */ + /* the_glyph :: A pointer to a handle to the target glyph. */ + /* */ + /* <Input> */ + /* render_mode :: An enumeration that describes how the data is */ + /* rendered. */ + /* */ + /* origin :: A pointer to a vector used to translate the glyph */ + /* image before rendering. Can be~0 (if no */ + /* translation). The origin is expressed in */ + /* 26.6 pixels. */ + /* */ + /* destroy :: A boolean that indicates that the original glyph */ + /* image should be destroyed by this function. It is */ + /* never destroyed in case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function does nothing if the glyph format isn't scalable. */ + /* */ + /* The glyph image is translated with the `origin' vector before */ + /* rendering. */ + /* */ + /* The first parameter is a pointer to an @FT_Glyph handle, that will */ + /* be _replaced_ by this function (with newly allocated data). */ + /* Typically, you would use (omitting error handling): */ + /* */ + /* */ + /* { */ + /* FT_Glyph glyph; */ + /* FT_BitmapGlyph glyph_bitmap; */ + /* */ + /* */ + /* // load glyph */ + /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT ); */ + /* */ + /* // extract glyph image */ + /* error = FT_Get_Glyph( face->glyph, &glyph ); */ + /* */ + /* // convert to a bitmap (default render mode + destroying old) */ + /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */ + /* { */ + /* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, */ + /* 0, 1 ); */ + /* if ( error ) // `glyph' unchanged */ + /* ... */ + /* } */ + /* */ + /* // access bitmap content by typecasting */ + /* glyph_bitmap = (FT_BitmapGlyph)glyph; */ + /* */ + /* // do funny stuff with it, like blitting/drawing */ + /* ... */ + /* */ + /* // discard glyph image (bitmap or not) */ + /* FT_Done_Glyph( glyph ); */ + /* } */ + /* */ + /* */ + /* Here another example, again without error handling: */ + /* */ + /* */ + /* { */ + /* FT_Glyph glyphs[MAX_GLYPHS] */ + /* */ + /* */ + /* ... */ + /* */ + /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ + /* error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || */ + /* FT_Get_Glyph ( face->glyph, &glyph[idx] ); */ + /* */ + /* ... */ + /* */ + /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ + /* { */ + /* FT_Glyph bitmap = glyphs[idx]; */ + /* */ + /* */ + /* ... */ + /* */ + /* // after this call, `bitmap' no longer points into */ + /* // the `glyphs' array (and the old value isn't destroyed) */ + /* FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); */ + /* */ + /* ... */ + /* */ + /* FT_Done_Glyph( bitmap ); */ + /* } */ + /* */ + /* ... */ + /* */ + /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ + /* FT_Done_Glyph( glyphs[idx] ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + FT_Vector* origin, + FT_Bool destroy ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Glyph */ + /* */ + /* <Description> */ + /* Destroy a given glyph. */ + /* */ + /* <Input> */ + /* glyph :: A handle to the target glyph object. */ + /* */ + FT_EXPORT( void ) + FT_Done_Glyph( FT_Glyph glyph ); + + /* */ + + + /* other helpful functions */ + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Matrix_Multiply */ + /* */ + /* <Description> */ + /* Perform the matrix operation `b = a*b'. */ + /* */ + /* <Input> */ + /* a :: A pointer to matrix `a'. */ + /* */ + /* <InOut> */ + /* b :: A pointer to matrix `b'. */ + /* */ + /* <Note> */ + /* The result is undefined if either `a' or `b' is zero. */ + /* */ + FT_EXPORT( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix* b ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Matrix_Invert */ + /* */ + /* <Description> */ + /* Invert a 2x2 matrix. Return an error if it can't be inverted. */ + /* */ + /* <InOut> */ + /* matrix :: A pointer to the target matrix. Remains untouched in */ + /* case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTGLYPH_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftgxval.h b/android/jni/ndk_modules/freetype/include/freetype/ftgxval.h new file mode 100644 index 00000000..497015c1 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftgxval.h @@ -0,0 +1,358 @@ +/***************************************************************************/ +/* */ +/* ftgxval.h */ +/* */ +/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ +/* */ +/* Copyright 2004, 2005, 2006 by */ +/* Masatake YAMATO, Redhat K.K, */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGXVAL_H__ +#define __FTGXVAL_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* gx_validation */ + /* */ + /* <Title> */ + /* TrueTypeGX/AAT Validation */ + /* */ + /* <Abstract> */ + /* An API to validate TrueTypeGX/AAT tables. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions to validate */ + /* some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, */ + /* trak, prop, lcar). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* Warning: Use FT_VALIDATE_XXX to validate a table. */ + /* Following definitions are for gxvalid developers. */ + /* */ + /* */ + /*************************************************************************/ + +#define FT_VALIDATE_feat_INDEX 0 +#define FT_VALIDATE_mort_INDEX 1 +#define FT_VALIDATE_morx_INDEX 2 +#define FT_VALIDATE_bsln_INDEX 3 +#define FT_VALIDATE_just_INDEX 4 +#define FT_VALIDATE_kern_INDEX 5 +#define FT_VALIDATE_opbd_INDEX 6 +#define FT_VALIDATE_trak_INDEX 7 +#define FT_VALIDATE_prop_INDEX 8 +#define FT_VALIDATE_lcar_INDEX 9 +#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX + + + /************************************************************************* + * + * @macro: + * FT_VALIDATE_GX_LENGTH + * + * @description: + * The number of tables checked in this module. Use it as a parameter + * for the `table-length' argument of function @FT_TrueTypeGX_Validate. + */ +#define FT_VALIDATE_GX_LENGTH (FT_VALIDATE_GX_LAST_INDEX + 1) + + /* */ + + /* Up to 0x1000 is used by otvalid. + Ox2xxx is reserved for feature OT extension. */ +#define FT_VALIDATE_GX_START 0x4000 +#define FT_VALIDATE_GX_BITFIELD( tag ) \ + ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX ) + + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_GXXXX + * + * @description: + * A list of bit-field constants used with @FT_TrueTypeGX_Validate to + * indicate which TrueTypeGX/AAT Type tables should be validated. + * + * @values: + * FT_VALIDATE_feat :: + * Validate `feat' table. + * + * FT_VALIDATE_mort :: + * Validate `mort' table. + * + * FT_VALIDATE_morx :: + * Validate `morx' table. + * + * FT_VALIDATE_bsln :: + * Validate `bsln' table. + * + * FT_VALIDATE_just :: + * Validate `just' table. + * + * FT_VALIDATE_kern :: + * Validate `kern' table. + * + * FT_VALIDATE_opbd :: + * Validate `opbd' table. + * + * FT_VALIDATE_trak :: + * Validate `trak' table. + * + * FT_VALIDATE_prop :: + * Validate `prop' table. + * + * FT_VALIDATE_lcar :: + * Validate `lcar' table. + * + * FT_VALIDATE_GX :: + * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern, + * opbd, trak, prop and lcar). + * + */ + +#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat ) +#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort ) +#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx ) +#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln ) +#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just ) +#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern ) +#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd ) +#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak ) +#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop ) +#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar ) + +#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \ + FT_VALIDATE_mort | \ + FT_VALIDATE_morx | \ + FT_VALIDATE_bsln | \ + FT_VALIDATE_just | \ + FT_VALIDATE_kern | \ + FT_VALIDATE_opbd | \ + FT_VALIDATE_trak | \ + FT_VALIDATE_prop | \ + FT_VALIDATE_lcar ) + + + /* */ + + /********************************************************************** + * + * @function: + * FT_TrueTypeGX_Validate + * + * @description: + * Validate various TrueTypeGX tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without + * error checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the tables to be validated. See + * @FT_VALIDATE_GXXXX for possible values. + * + * table_length :: + * The size of the `tables' array. Normally, @FT_VALIDATE_GX_LENGTH + * should be passed. + * + * @output: + * tables :: + * The array where all validated sfnt tables are stored. + * The array itself must be allocated by a client. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with TrueTypeGX fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the buffers pointed to by + * each `tables' element, by calling @FT_TrueTypeGX_Free. A NULL value + * indicates that the table either doesn't exist in the font, the + * application hasn't asked for validation, or the validator doesn't have + * the ability to validate the sfnt table. + */ + FT_EXPORT( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + /* */ + + /********************************************************************** + * + * @function: + * FT_TrueTypeGX_Free + * + * @description: + * Free the buffer allocated by TrueTypeGX validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer allocated by + * @FT_TrueTypeGX_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_TrueTypeGX_Validate only. + */ + FT_EXPORT( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_CKERNXXX + * + * @description: + * A list of bit-field constants used with @FT_ClassicKern_Validate + * to indicate the classic kern dialect or dialects. If the selected + * type doesn't fit, @FT_ClassicKern_Validate regards the table as + * invalid. + * + * @values: + * FT_VALIDATE_MS :: + * Handle the `kern' table as a classic Microsoft kern table. + * + * FT_VALIDATE_APPLE :: + * Handle the `kern' table as a classic Apple kern table. + * + * FT_VALIDATE_CKERN :: + * Handle the `kern' as either classic Apple or Microsoft kern table. + */ +#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 ) +#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 ) + +#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE ) + + + /* */ + + /********************************************************************** + * + * @function: + * FT_ClassicKern_Validate + * + * @description: + * Validate classic (16-bit format) kern table to assure that the offsets + * and indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * The `kern' table validator in @FT_TrueTypeGX_Validate deals with both + * the new 32-bit format and the classic 16-bit format, while + * FT_ClassicKern_Validate only supports the classic 16-bit format. + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the dialect to be validated. See + * @FT_VALIDATE_CKERNXXX for possible values. + * + * @output: + * ckern_table :: + * A pointer to the kern table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * After use, the application should deallocate the buffers pointed to by + * `ckern_table', by calling @FT_ClassicKern_Free. A NULL value + * indicates that the table doesn't exist in the font. + */ + FT_EXPORT( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ); + + + /* */ + + /********************************************************************** + * + * @function: + * FT_ClassicKern_Free + * + * @description: + * Free the buffer allocated by classic Kern validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_ClassicKern_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_ClassicKern_Validate only. + */ + FT_EXPORT( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTGXVAL_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftgzip.h b/android/jni/ndk_modules/freetype/include/freetype/ftgzip.h new file mode 100644 index 00000000..acbc4f03 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftgzip.h @@ -0,0 +1,102 @@ +/***************************************************************************/ +/* */ +/* ftgzip.h */ +/* */ +/* Gzip-compressed stream support. */ +/* */ +/* Copyright 2002, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGZIP_H__ +#define __FTGZIP_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* gzip */ + /* */ + /* <Title> */ + /* GZIP Streams */ + /* */ + /* <Abstract> */ + /* Using gzip-compressed font files. */ + /* */ + /* <Description> */ + /* This section contains the declaration of Gzip-specific functions. */ + /* */ + /*************************************************************************/ + + + /************************************************************************ + * + * @function: + * FT_Stream_OpenGzip + * + * @description: + * Open a new stream to parse gzip-compressed font files. This is + * mainly used to support the compressed `*.pcf.gz' fonts that come + * with XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close' on the new stream will + * *not* call `FT_Stream_Close' on the source stream. None of the stream + * objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream. + * + * In certain builds of the library, gzip compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a gzipped stream from + * it and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature' if your build + * of FreeType was not compiled with zlib support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTGZIP_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftimage.h b/android/jni/ndk_modules/freetype/include/freetype/ftimage.h new file mode 100644 index 00000000..0272e92d --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftimage.h @@ -0,0 +1,1301 @@ +/***************************************************************************/ +/* */ +/* ftimage.h */ +/* */ +/* FreeType glyph image formats and default raster interface */ +/* (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Note: A `raster' is simply a scan-line converter, used to render */ + /* FT_Outlines into FT_Bitmaps. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTIMAGE_H__ +#define __FTIMAGE_H__ + + + /* _STANDALONE_ is from ftgrays.c */ +#ifndef _STANDALONE_ +#include <ft2build.h> +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Pos */ + /* */ + /* <Description> */ + /* The type FT_Pos is used to store vectorial coordinates. Depending */ + /* on the context, these can represent distances in integer font */ + /* units, or 16.16, or 26.6 fixed float pixel coordinates. */ + /* */ + typedef signed long FT_Pos; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Vector */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2D vector; coordinates are of */ + /* the FT_Pos type. */ + /* */ + /* <Fields> */ + /* x :: The horizontal coordinate. */ + /* y :: The vertical coordinate. */ + /* */ + typedef struct FT_Vector_ + { + FT_Pos x; + FT_Pos y; + + } FT_Vector; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_BBox */ + /* */ + /* <Description> */ + /* A structure used to hold an outline's bounding box, i.e., the */ + /* coordinates of its extrema in the horizontal and vertical */ + /* directions. */ + /* */ + /* <Fields> */ + /* xMin :: The horizontal minimum (left-most). */ + /* */ + /* yMin :: The vertical minimum (bottom-most). */ + /* */ + /* xMax :: The horizontal maximum (right-most). */ + /* */ + /* yMax :: The vertical maximum (top-most). */ + /* */ + /* <Note> */ + /* The bounding box is specified with the coordinates of the lower */ + /* left and the upper right corner. In PostScript, those values are */ + /* often called (llx,lly) and (urx,ury), respectively. */ + /* */ + /* If `yMin' is negative, this value gives the glyph's descender. */ + /* Otherwise, the glyph doesn't descend below the baseline. */ + /* Similarly, if `ymax' is positive, this value gives the glyph's */ + /* ascender. */ + /* */ + /* `xMin' gives the horizontal distance from the glyph's origin to */ + /* the left edge of the glyph's bounding box. If `xMin' is negative, */ + /* the glyph extends to the left of the origin. */ + /* */ + typedef struct FT_BBox_ + { + FT_Pos xMin, yMin; + FT_Pos xMax, yMax; + + } FT_BBox; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Pixel_Mode */ + /* */ + /* <Description> */ + /* An enumeration type used to describe the format of pixels in a */ + /* given bitmap. Note that additional formats may be added in the */ + /* future. */ + /* */ + /* <Values> */ + /* FT_PIXEL_MODE_NONE :: */ + /* Value~0 is reserved. */ + /* */ + /* FT_PIXEL_MODE_MONO :: */ + /* A monochrome bitmap, using 1~bit per pixel. Note that pixels */ + /* are stored in most-significant order (MSB), which means that */ + /* the left-most pixel in a byte has value 128. */ + /* */ + /* FT_PIXEL_MODE_GRAY :: */ + /* An 8-bit bitmap, generally used to represent anti-aliased glyph */ + /* images. Each pixel is stored in one byte. Note that the number */ + /* of `gray' levels is stored in the `num_grays' field of the */ + /* @FT_Bitmap structure (it generally is 256). */ + /* */ + /* FT_PIXEL_MODE_GRAY2 :: */ + /* A 2-bit per pixel bitmap, used to represent embedded */ + /* anti-aliased bitmaps in font files according to the OpenType */ + /* specification. We haven't found a single font using this */ + /* format, however. */ + /* */ + /* FT_PIXEL_MODE_GRAY4 :: */ + /* A 4-bit per pixel bitmap, representing embedded anti-aliased */ + /* bitmaps in font files according to the OpenType specification. */ + /* We haven't found a single font using this format, however. */ + /* */ + /* FT_PIXEL_MODE_LCD :: */ + /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */ + /* used for display on LCD displays; the bitmap is three times */ + /* wider than the original glyph image. See also */ + /* @FT_RENDER_MODE_LCD. */ + /* */ + /* FT_PIXEL_MODE_LCD_V :: */ + /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */ + /* used for display on rotated LCD displays; the bitmap is three */ + /* times taller than the original glyph image. See also */ + /* @FT_RENDER_MODE_LCD_V. */ + /* */ + typedef enum FT_Pixel_Mode_ + { + FT_PIXEL_MODE_NONE = 0, + FT_PIXEL_MODE_MONO, + FT_PIXEL_MODE_GRAY, + FT_PIXEL_MODE_GRAY2, + FT_PIXEL_MODE_GRAY4, + FT_PIXEL_MODE_LCD, + FT_PIXEL_MODE_LCD_V, + + FT_PIXEL_MODE_MAX /* do not remove */ + + } FT_Pixel_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_pixel_mode_xxx */ + /* */ + /* <Description> */ + /* A list of deprecated constants. Use the corresponding */ + /* @FT_Pixel_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_pixel_mode_none :: See @FT_PIXEL_MODE_NONE. */ + /* ft_pixel_mode_mono :: See @FT_PIXEL_MODE_MONO. */ + /* ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY. */ + /* ft_pixel_mode_pal2 :: See @FT_PIXEL_MODE_GRAY2. */ + /* ft_pixel_mode_pal4 :: See @FT_PIXEL_MODE_GRAY4. */ + /* */ +#define ft_pixel_mode_none FT_PIXEL_MODE_NONE +#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO +#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY +#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 +#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 + + /* */ + +#if 0 + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Palette_Mode */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT! */ + /* */ + /* An enumeration type to describe the format of a bitmap palette, */ + /* used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8. */ + /* */ + /* <Values> */ + /* ft_palette_mode_rgb :: The palette is an array of 3-byte RGB */ + /* records. */ + /* */ + /* ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA */ + /* records. */ + /* */ + /* <Note> */ + /* As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by */ + /* FreeType, these types are not handled by the library itself. */ + /* */ + typedef enum FT_Palette_Mode_ + { + ft_palette_mode_rgb = 0, + ft_palette_mode_rgba, + + ft_palette_mode_max /* do not remove */ + + } FT_Palette_Mode; + + /* */ + +#endif + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Bitmap */ + /* */ + /* <Description> */ + /* A structure used to describe a bitmap or pixmap to the raster. */ + /* Note that we now manage pixmaps of various depths through the */ + /* `pixel_mode' field. */ + /* */ + /* <Fields> */ + /* rows :: The number of bitmap rows. */ + /* */ + /* width :: The number of pixels in bitmap row. */ + /* */ + /* pitch :: The pitch's absolute value is the number of bytes */ + /* taken by one bitmap row, including padding. */ + /* However, the pitch is positive when the bitmap has */ + /* a `down' flow, and negative when it has an `up' */ + /* flow. In all cases, the pitch is an offset to add */ + /* to a bitmap pointer in order to go down one row. */ + /* */ + /* For the B/W rasterizer, `pitch' is always an even */ + /* number. */ + /* */ + /* buffer :: A typeless pointer to the bitmap buffer. This */ + /* value should be aligned on 32-bit boundaries in */ + /* most cases. */ + /* */ + /* num_grays :: This field is only used with */ + /* @FT_PIXEL_MODE_GRAY; it gives the number of gray */ + /* levels used in the bitmap. */ + /* */ + /* pixel_mode :: The pixel mode, i.e., how pixel bits are stored. */ + /* See @FT_Pixel_Mode for possible values. */ + /* */ + /* palette_mode :: This field is intended for paletted pixel modes; */ + /* it indicates how the palette is stored. Not */ + /* used currently. */ + /* */ + /* palette :: A typeless pointer to the bitmap palette; this */ + /* field is intended for paletted pixel modes. Not */ + /* used currently. */ + /* */ + /* <Note> */ + /* For now, the only pixel modes supported by FreeType are mono and */ + /* grays. However, drivers might be added in the future to support */ + /* more `colorful' options. */ + /* */ + typedef struct FT_Bitmap_ + { + int rows; + int width; + int pitch; + unsigned char* buffer; + short num_grays; + char pixel_mode; + char palette_mode; + void* palette; + + } FT_Bitmap; + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Outline */ + /* */ + /* <Description> */ + /* This structure is used to describe an outline to the scan-line */ + /* converter. */ + /* */ + /* <Fields> */ + /* n_contours :: The number of contours in the outline. */ + /* */ + /* n_points :: The number of points in the outline. */ + /* */ + /* points :: A pointer to an array of `n_points' @FT_Vector */ + /* elements, giving the outline's point coordinates. */ + /* */ + /* tags :: A pointer to an array of `n_points' chars, giving */ + /* each outline point's type. */ + /* */ + /* If bit~0 is unset, the point is `off' the curve, */ + /* i.e., a Bézier control point, while it is `on' if */ + /* set. */ + /* */ + /* Bit~1 is meaningful for `off' points only. If set, */ + /* it indicates a third-order Bézier arc control point; */ + /* and a second-order control point if unset. */ + /* */ + /* If bit~2 is set, bits 5-7 contain the drop-out mode */ + /* (as defined in the OpenType specification; the value */ + /* is the same as the argument to the SCANMODE */ + /* instruction). */ + /* */ + /* Bits 3 and~4 are reserved for internal purposes. */ + /* */ + /* contours :: An array of `n_contours' shorts, giving the end */ + /* point of each contour within the outline. For */ + /* example, the first contour is defined by the points */ + /* `0' to `contours[0]', the second one is defined by */ + /* the points `contours[0]+1' to `contours[1]', etc. */ + /* */ + /* flags :: A set of bit flags used to characterize the outline */ + /* and give hints to the scan-converter and hinter on */ + /* how to convert/grid-fit it. See @FT_OUTLINE_FLAGS. */ + /* */ + /* <Note> */ + /* The B/W rasterizer only checks bit~2 in the `tags' array for the */ + /* first point of each contour. The drop-out mode as given with */ + /* @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and */ + /* @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden. */ + /* */ + typedef struct FT_Outline_ + { + short n_contours; /* number of contours in glyph */ + short n_points; /* number of points in the glyph */ + + FT_Vector* points; /* the outline's points */ + char* tags; /* the points flags */ + short* contours; /* the contour end points */ + + int flags; /* outline masks */ + + } FT_Outline; + + /* Following limits must be consistent with */ + /* FT_Outline.{n_contours,n_points} */ +#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX +#define FT_OUTLINE_POINTS_MAX SHRT_MAX + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_OUTLINE_FLAGS */ + /* */ + /* <Description> */ + /* A list of bit-field constants use for the flags in an outline's */ + /* `flags' field. */ + /* */ + /* <Values> */ + /* FT_OUTLINE_NONE :: */ + /* Value~0 is reserved. */ + /* */ + /* FT_OUTLINE_OWNER :: */ + /* If set, this flag indicates that the outline's field arrays */ + /* (i.e., `points', `flags', and `contours') are `owned' by the */ + /* outline object, and should thus be freed when it is destroyed. */ + /* */ + /* FT_OUTLINE_EVEN_ODD_FILL :: */ + /* By default, outlines are filled using the non-zero winding rule. */ + /* If set to 1, the outline will be filled using the even-odd fill */ + /* rule (only works with the smooth rasterizer). */ + /* */ + /* FT_OUTLINE_REVERSE_FILL :: */ + /* By default, outside contours of an outline are oriented in */ + /* clock-wise direction, as defined in the TrueType specification. */ + /* This flag is set if the outline uses the opposite direction */ + /* (typically for Type~1 fonts). This flag is ignored by the scan */ + /* converter. */ + /* */ + /* FT_OUTLINE_IGNORE_DROPOUTS :: */ + /* By default, the scan converter will try to detect drop-outs in */ + /* an outline and correct the glyph bitmap to ensure consistent */ + /* shape continuity. If set, this flag hints the scan-line */ + /* converter to ignore such cases. See below for more information. */ + /* */ + /* FT_OUTLINE_SMART_DROPOUTS :: */ + /* Select smart dropout control. If unset, use simple dropout */ + /* control. Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See */ + /* below for more information. */ + /* */ + /* FT_OUTLINE_INCLUDE_STUBS :: */ + /* If set, turn pixels on for `stubs', otherwise exclude them. */ + /* Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for */ + /* more information. */ + /* */ + /* FT_OUTLINE_HIGH_PRECISION :: */ + /* This flag indicates that the scan-line converter should try to */ + /* convert this outline to bitmaps with the highest possible */ + /* quality. It is typically set for small character sizes. Note */ + /* that this is only a hint that might be completely ignored by a */ + /* given scan-converter. */ + /* */ + /* FT_OUTLINE_SINGLE_PASS :: */ + /* This flag is set to force a given scan-converter to only use a */ + /* single pass over the outline to render a bitmap glyph image. */ + /* Normally, it is set for very large character sizes. It is only */ + /* a hint that might be completely ignored by a given */ + /* scan-converter. */ + /* */ + /* <Note> */ + /* The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */ + /* and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth */ + /* rasterizer. */ + /* */ + /* There exists a second mechanism to pass the drop-out mode to the */ + /* B/W rasterizer; see the `tags' field in @FT_Outline. */ + /* */ + /* Please refer to the description of the `SCANTYPE' instruction in */ + /* the OpenType specification (in file `ttinst1.doc') how simple */ + /* drop-outs, smart drop-outs, and stubs are defined. */ + /* */ +#define FT_OUTLINE_NONE 0x0 +#define FT_OUTLINE_OWNER 0x1 +#define FT_OUTLINE_EVEN_ODD_FILL 0x2 +#define FT_OUTLINE_REVERSE_FILL 0x4 +#define FT_OUTLINE_IGNORE_DROPOUTS 0x8 +#define FT_OUTLINE_SMART_DROPOUTS 0x10 +#define FT_OUTLINE_INCLUDE_STUBS 0x20 + +#define FT_OUTLINE_HIGH_PRECISION 0x100 +#define FT_OUTLINE_SINGLE_PASS 0x200 + + + /************************************************************************* + * + * @enum: + * ft_outline_flags + * + * @description: + * These constants are deprecated. Please use the corresponding + * @FT_OUTLINE_FLAGS values. + * + * @values: + * ft_outline_none :: See @FT_OUTLINE_NONE. + * ft_outline_owner :: See @FT_OUTLINE_OWNER. + * ft_outline_even_odd_fill :: See @FT_OUTLINE_EVEN_ODD_FILL. + * ft_outline_reverse_fill :: See @FT_OUTLINE_REVERSE_FILL. + * ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS. + * ft_outline_high_precision :: See @FT_OUTLINE_HIGH_PRECISION. + * ft_outline_single_pass :: See @FT_OUTLINE_SINGLE_PASS. + */ +#define ft_outline_none FT_OUTLINE_NONE +#define ft_outline_owner FT_OUTLINE_OWNER +#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL +#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL +#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS +#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION +#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS + + /* */ + +#define FT_CURVE_TAG( flag ) ( flag & 3 ) + +#define FT_CURVE_TAG_ON 1 +#define FT_CURVE_TAG_CONIC 0 +#define FT_CURVE_TAG_CUBIC 2 + +#define FT_CURVE_TAG_HAS_SCANMODE 4 + +#define FT_CURVE_TAG_TOUCH_X 8 /* reserved for the TrueType hinter */ +#define FT_CURVE_TAG_TOUCH_Y 16 /* reserved for the TrueType hinter */ + +#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ + FT_CURVE_TAG_TOUCH_Y ) + +#define FT_Curve_Tag_On FT_CURVE_TAG_ON +#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC +#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC +#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X +#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_MoveToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `move */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `move to' is emitted to start a new contour in an outline. */ + /* */ + /* <Input> */ + /* to :: A pointer to the target point of the `move to'. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of the */ + /* decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_MoveToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_LineToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `line */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `line to' is emitted to indicate a segment in the outline. */ + /* */ + /* <Input> */ + /* to :: A pointer to the target point of the `line to'. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of the */ + /* decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_LineToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_LineTo_Func FT_Outline_LineToFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_ConicToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `conic */ + /* to' function during outline walking or decomposition. */ + /* */ + /* A `conic to' is emitted to indicate a second-order Bézier arc in */ + /* the outline. */ + /* */ + /* <Input> */ + /* control :: An intermediate control point between the last position */ + /* and the new target in `to'. */ + /* */ + /* to :: A pointer to the target end point of the conic arc. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of */ + /* the decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_ConicToFunc)( const FT_Vector* control, + const FT_Vector* to, + void* user ); + +#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_CubicToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `cubic */ + /* to' function during outline walking or decomposition. */ + /* */ + /* A `cubic to' is emitted to indicate a third-order Bézier arc. */ + /* */ + /* <Input> */ + /* control1 :: A pointer to the first Bézier control point. */ + /* */ + /* control2 :: A pointer to the second Bézier control point. */ + /* */ + /* to :: A pointer to the target end point. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of */ + /* the decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_CubicToFunc)( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* user ); + +#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Outline_Funcs */ + /* */ + /* <Description> */ + /* A structure to hold various function pointers used during outline */ + /* decomposition in order to emit segments, conic, and cubic Béziers. */ + /* */ + /* <Fields> */ + /* move_to :: The `move to' emitter. */ + /* */ + /* line_to :: The segment emitter. */ + /* */ + /* conic_to :: The second-order Bézier arc emitter. */ + /* */ + /* cubic_to :: The third-order Bézier arc emitter. */ + /* */ + /* shift :: The shift that is applied to coordinates before they */ + /* are sent to the emitter. */ + /* */ + /* delta :: The delta that is applied to coordinates before they */ + /* are sent to the emitter, but after the shift. */ + /* */ + /* <Note> */ + /* The point coordinates sent to the emitters are the transformed */ + /* version of the original coordinates (this is important for high */ + /* accuracy during scan-conversion). The transformation is simple: */ + /* */ + /* { */ + /* x' = (x << shift) - delta */ + /* y' = (x << shift) - delta */ + /* } */ + /* */ + /* Set the values of `shift' and `delta' to~0 to get the original */ + /* point coordinates. */ + /* */ + typedef struct FT_Outline_Funcs_ + { + FT_Outline_MoveToFunc move_to; + FT_Outline_LineToFunc line_to; + FT_Outline_ConicToFunc conic_to; + FT_Outline_CubicToFunc cubic_to; + + int shift; + FT_Pos delta; + + } FT_Outline_Funcs; + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_IMAGE_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags to an unsigned long type. */ + /* */ + /* <Note> */ + /* Since many 16-bit compilers don't like 32-bit enumerations, you */ + /* should redefine this macro in case of problems to something like */ + /* this: */ + /* */ + /* { */ + /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value */ + /* } */ + /* */ + /* to get a simple enumeration without assigning special numbers. */ + /* */ +#ifndef FT_IMAGE_TAG +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ + value = ( ( (unsigned long)_x1 << 24 ) | \ + ( (unsigned long)_x2 << 16 ) | \ + ( (unsigned long)_x3 << 8 ) | \ + (unsigned long)_x4 ) +#endif /* FT_IMAGE_TAG */ + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Glyph_Format */ + /* */ + /* <Description> */ + /* An enumeration type used to describe the format of a given glyph */ + /* image. Note that this version of FreeType only supports two image */ + /* formats, even though future font drivers will be able to register */ + /* their own format. */ + /* */ + /* <Values> */ + /* FT_GLYPH_FORMAT_NONE :: */ + /* The value~0 is reserved. */ + /* */ + /* FT_GLYPH_FORMAT_COMPOSITE :: */ + /* The glyph image is a composite of several other images. This */ + /* format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to */ + /* report compound glyphs (like accented characters). */ + /* */ + /* FT_GLYPH_FORMAT_BITMAP :: */ + /* The glyph image is a bitmap, and can be described as an */ + /* @FT_Bitmap. You generally need to access the `bitmap' field of */ + /* the @FT_GlyphSlotRec structure to read it. */ + /* */ + /* FT_GLYPH_FORMAT_OUTLINE :: */ + /* The glyph image is a vectorial outline made of line segments */ + /* and Bézier arcs; it can be described as an @FT_Outline; you */ + /* generally want to access the `outline' field of the */ + /* @FT_GlyphSlotRec structure to read it. */ + /* */ + /* FT_GLYPH_FORMAT_PLOTTER :: */ + /* The glyph image is a vectorial path with no inside and outside */ + /* contours. Some Type~1 fonts, like those in the Hershey family, */ + /* contain glyphs in this format. These are described as */ + /* @FT_Outline, but FreeType isn't currently capable of rendering */ + /* them correctly. */ + /* */ + typedef enum FT_Glyph_Format_ + { + FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), + + FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ) + + } FT_Glyph_Format; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_glyph_format_xxx */ + /* */ + /* <Description> */ + /* A list of deprecated constants. Use the corresponding */ + /* @FT_Glyph_Format values instead. */ + /* */ + /* <Values> */ + /* ft_glyph_format_none :: See @FT_GLYPH_FORMAT_NONE. */ + /* ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE. */ + /* ft_glyph_format_bitmap :: See @FT_GLYPH_FORMAT_BITMAP. */ + /* ft_glyph_format_outline :: See @FT_GLYPH_FORMAT_OUTLINE. */ + /* ft_glyph_format_plotter :: See @FT_GLYPH_FORMAT_PLOTTER. */ + /* */ +#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE +#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE +#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP +#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE +#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** R A S T E R D E F I N I T I O N S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* A raster is a scan converter, in charge of rendering an outline into */ + /* a a bitmap. This section contains the public API for rasters. */ + /* */ + /* Note that in FreeType 2, all rasters are now encapsulated within */ + /* specific modules called `renderers'. See `freetype/ftrender.h' for */ + /* more details on renderers. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* raster */ + /* */ + /* <Title> */ + /* Scanline Converter */ + /* */ + /* <Abstract> */ + /* How vectorial outlines are converted into bitmaps and pixmaps. */ + /* */ + /* <Description> */ + /* This section contains technical definitions. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Raster */ + /* */ + /* <Description> */ + /* A handle (pointer) to a raster object. Each object can be used */ + /* independently to convert an outline into a bitmap or pixmap. */ + /* */ + typedef struct FT_RasterRec_* FT_Raster; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Span */ + /* */ + /* <Description> */ + /* A structure used to model a single span of gray (or black) pixels */ + /* when rendering a monochrome or anti-aliased bitmap. */ + /* */ + /* <Fields> */ + /* x :: The span's horizontal start position. */ + /* */ + /* len :: The span's length in pixels. */ + /* */ + /* coverage :: The span color/coverage, ranging from 0 (background) */ + /* to 255 (foreground). Only used for anti-aliased */ + /* rendering. */ + /* */ + /* <Note> */ + /* This structure is used by the span drawing callback type named */ + /* @FT_SpanFunc which takes the y~coordinate of the span as a */ + /* a parameter. */ + /* */ + /* The coverage value is always between 0 and 255. If you want less */ + /* gray values, the callback function has to reduce them. */ + /* */ + typedef struct FT_Span_ + { + short x; + unsigned short len; + unsigned char coverage; + + } FT_Span; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_SpanFunc */ + /* */ + /* <Description> */ + /* A function used as a call-back by the anti-aliased renderer in */ + /* order to let client applications draw themselves the gray pixel */ + /* spans on each scan line. */ + /* */ + /* <Input> */ + /* y :: The scanline's y~coordinate. */ + /* */ + /* count :: The number of spans to draw on this scanline. */ + /* */ + /* spans :: A table of `count' spans to draw on the scanline. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Note> */ + /* This callback allows client applications to directly render the */ + /* gray spans of the anti-aliased bitmap to any kind of surfaces. */ + /* */ + /* This can be used to write anti-aliased outlines directly to a */ + /* given background bitmap, and even perform translucency. */ + /* */ + /* Note that the `count' field cannot be greater than a fixed value */ + /* defined by the `FT_MAX_GRAY_SPANS' configuration macro in */ + /* `ftoption.h'. By default, this value is set to~32, which means */ + /* that if there are more than 32~spans on a given scanline, the */ + /* callback is called several times with the same `y' parameter in */ + /* order to draw all callbacks. */ + /* */ + /* Otherwise, the callback is only called once per scan-line, and */ + /* only for those scanlines that do have `gray' pixels on them. */ + /* */ + typedef void + (*FT_SpanFunc)( int y, + int count, + const FT_Span* spans, + void* user ); + +#define FT_Raster_Span_Func FT_SpanFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_BitTest_Func */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ + /* */ + /* A function used as a call-back by the monochrome scan-converter */ + /* to test whether a given target pixel is already set to the drawing */ + /* `color'. These tests are crucial to implement drop-out control */ + /* per-se the TrueType spec. */ + /* */ + /* <Input> */ + /* y :: The pixel's y~coordinate. */ + /* */ + /* x :: The pixel's x~coordinate. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Return> */ + /* 1~if the pixel is `set', 0~otherwise. */ + /* */ + typedef int + (*FT_Raster_BitTest_Func)( int y, + int x, + void* user ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_BitSet_Func */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ + /* */ + /* A function used as a call-back by the monochrome scan-converter */ + /* to set an individual target pixel. This is crucial to implement */ + /* drop-out control according to the TrueType specification. */ + /* */ + /* <Input> */ + /* y :: The pixel's y~coordinate. */ + /* */ + /* x :: The pixel's x~coordinate. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Return> */ + /* 1~if the pixel is `set', 0~otherwise. */ + /* */ + typedef void + (*FT_Raster_BitSet_Func)( int y, + int x, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_RASTER_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit flag constants as used in the `flags' field of a */ + /* @FT_Raster_Params structure. */ + /* */ + /* <Values> */ + /* FT_RASTER_FLAG_DEFAULT :: This value is 0. */ + /* */ + /* FT_RASTER_FLAG_AA :: This flag is set to indicate that an */ + /* anti-aliased glyph image should be */ + /* generated. Otherwise, it will be */ + /* monochrome (1-bit). */ + /* */ + /* FT_RASTER_FLAG_DIRECT :: This flag is set to indicate direct */ + /* rendering. In this mode, client */ + /* applications must provide their own span */ + /* callback. This lets them directly */ + /* draw or compose over an existing bitmap. */ + /* If this bit is not set, the target */ + /* pixmap's buffer _must_ be zeroed before */ + /* rendering. */ + /* */ + /* Note that for now, direct rendering is */ + /* only possible with anti-aliased glyphs. */ + /* */ + /* FT_RASTER_FLAG_CLIP :: This flag is only used in direct */ + /* rendering mode. If set, the output will */ + /* be clipped to a box specified in the */ + /* `clip_box' field of the */ + /* @FT_Raster_Params structure. */ + /* */ + /* Note that by default, the glyph bitmap */ + /* is clipped to the target pixmap, except */ + /* in direct rendering mode where all spans */ + /* are generated if no clipping box is set. */ + /* */ +#define FT_RASTER_FLAG_DEFAULT 0x0 +#define FT_RASTER_FLAG_AA 0x1 +#define FT_RASTER_FLAG_DIRECT 0x2 +#define FT_RASTER_FLAG_CLIP 0x4 + + /* deprecated */ +#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT +#define ft_raster_flag_aa FT_RASTER_FLAG_AA +#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT +#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Raster_Params */ + /* */ + /* <Description> */ + /* A structure to hold the arguments used by a raster's render */ + /* function. */ + /* */ + /* <Fields> */ + /* target :: The target bitmap. */ + /* */ + /* source :: A pointer to the source glyph image (e.g., an */ + /* @FT_Outline). */ + /* */ + /* flags :: The rendering flags. */ + /* */ + /* gray_spans :: The gray span drawing callback. */ + /* */ + /* black_spans :: The black span drawing callback. UNIMPLEMENTED! */ + /* */ + /* bit_test :: The bit test callback. UNIMPLEMENTED! */ + /* */ + /* bit_set :: The bit set callback. UNIMPLEMENTED! */ + /* */ + /* user :: User-supplied data that is passed to each drawing */ + /* callback. */ + /* */ + /* clip_box :: An optional clipping box. It is only used in */ + /* direct rendering mode. Note that coordinates here */ + /* should be expressed in _integer_ pixels (and not in */ + /* 26.6 fixed-point units). */ + /* */ + /* <Note> */ + /* An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA */ + /* bit flag is set in the `flags' field, otherwise a monochrome */ + /* bitmap is generated. */ + /* */ + /* If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the */ + /* raster will call the `gray_spans' callback to draw gray pixel */ + /* spans, in the case of an aa glyph bitmap, it will call */ + /* `black_spans', and `bit_test' and `bit_set' in the case of a */ + /* monochrome bitmap. This allows direct composition over a */ + /* pre-existing bitmap through user-provided callbacks to perform the */ + /* span drawing/composition. */ + /* */ + /* Note that the `bit_test' and `bit_set' callbacks are required when */ + /* rendering a monochrome bitmap, as they are crucial to implement */ + /* correct drop-out control as defined in the TrueType specification. */ + /* */ + typedef struct FT_Raster_Params_ + { + const FT_Bitmap* target; + const void* source; + int flags; + FT_SpanFunc gray_spans; + FT_SpanFunc black_spans; /* doesn't work! */ + FT_Raster_BitTest_Func bit_test; /* doesn't work! */ + FT_Raster_BitSet_Func bit_set; /* doesn't work! */ + void* user; + FT_BBox clip_box; + + } FT_Raster_Params; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_NewFunc */ + /* */ + /* <Description> */ + /* A function used to create a new raster object. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory allocator. */ + /* */ + /* <Output> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `memory' parameter is a typeless pointer in order to avoid */ + /* un-wanted dependencies on the rest of the FreeType code. In */ + /* practice, it is an @FT_Memory object, i.e., a handle to the */ + /* standard FreeType memory allocator. However, this field can be */ + /* completely ignored by a given raster implementation. */ + /* */ + typedef int + (*FT_Raster_NewFunc)( void* memory, + FT_Raster* raster ); + +#define FT_Raster_New_Func FT_Raster_NewFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_DoneFunc */ + /* */ + /* <Description> */ + /* A function used to destroy a given raster object. */ + /* */ + /* <Input> */ + /* raster :: A handle to the raster object. */ + /* */ + typedef void + (*FT_Raster_DoneFunc)( FT_Raster raster ); + +#define FT_Raster_Done_Func FT_Raster_DoneFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_ResetFunc */ + /* */ + /* <Description> */ + /* FreeType provides an area of memory called the `render pool', */ + /* available to all registered rasters. This pool can be freely used */ + /* during a given scan-conversion but is shared by all rasters. Its */ + /* content is thus transient. */ + /* */ + /* This function is called each time the render pool changes, or just */ + /* after a new raster object is created. */ + /* */ + /* <Input> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* pool_base :: The address in memory of the render pool. */ + /* */ + /* pool_size :: The size in bytes of the render pool. */ + /* */ + /* <Note> */ + /* Rasters can ignore the render pool and rely on dynamic memory */ + /* allocation if they want to (a handle to the memory allocator is */ + /* passed to the raster constructor). However, this is not */ + /* recommended for efficiency purposes. */ + /* */ + typedef void + (*FT_Raster_ResetFunc)( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ); + +#define FT_Raster_Reset_Func FT_Raster_ResetFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_SetModeFunc */ + /* */ + /* <Description> */ + /* This function is a generic facility to change modes or attributes */ + /* in a given raster. This can be used for debugging purposes, or */ + /* simply to allow implementation-specific `features' in a given */ + /* raster module. */ + /* */ + /* <Input> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* mode :: A 4-byte tag used to name the mode or property. */ + /* */ + /* args :: A pointer to the new mode/property to use. */ + /* */ + typedef int + (*FT_Raster_SetModeFunc)( FT_Raster raster, + unsigned long mode, + void* args ); + +#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_RenderFunc */ + /* */ + /* <Description> */ + /* Invoke a given raster to scan-convert a given glyph image into a */ + /* target bitmap. */ + /* */ + /* <Input> */ + /* raster :: A handle to the raster object. */ + /* */ + /* params :: A pointer to an @FT_Raster_Params structure used to */ + /* store the rendering parameters. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + /* <Note> */ + /* The exact format of the source image depends on the raster's glyph */ + /* format defined in its @FT_Raster_Funcs structure. It can be an */ + /* @FT_Outline or anything else in order to support a large array of */ + /* glyph formats. */ + /* */ + /* Note also that the render function can fail and return a */ + /* `FT_Err_Unimplemented_Feature' error code if the raster used does */ + /* not support direct composition. */ + /* */ + /* XXX: For now, the standard raster doesn't support direct */ + /* composition but this should change for the final release (see */ + /* the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c' */ + /* for examples of distinct implementations which support direct */ + /* composition). */ + /* */ + typedef int + (*FT_Raster_RenderFunc)( FT_Raster raster, + const FT_Raster_Params* params ); + +#define FT_Raster_Render_Func FT_Raster_RenderFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Raster_Funcs */ + /* */ + /* <Description> */ + /* A structure used to describe a given raster class to the library. */ + /* */ + /* <Fields> */ + /* glyph_format :: The supported glyph format for this raster. */ + /* */ + /* raster_new :: The raster constructor. */ + /* */ + /* raster_reset :: Used to reset the render pool within the raster. */ + /* */ + /* raster_render :: A function to render a glyph into a given bitmap. */ + /* */ + /* raster_done :: The raster destructor. */ + /* */ + typedef struct FT_Raster_Funcs_ + { + FT_Glyph_Format glyph_format; + FT_Raster_NewFunc raster_new; + FT_Raster_ResetFunc raster_reset; + FT_Raster_SetModeFunc raster_set_mode; + FT_Raster_RenderFunc raster_render; + FT_Raster_DoneFunc raster_done; + + } FT_Raster_Funcs; + + + /* */ + + +FT_END_HEADER + +#endif /* __FTIMAGE_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftincrem.h b/android/jni/ndk_modules/freetype/include/freetype/ftincrem.h new file mode 100644 index 00000000..aaf689ff --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftincrem.h @@ -0,0 +1,353 @@ +/***************************************************************************/ +/* */ +/* ftincrem.h */ +/* */ +/* FreeType incremental loading (specification). */ +/* */ +/* Copyright 2002, 2003, 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTINCREM_H__ +#define __FTINCREM_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************** + * + * @section: + * incremental + * + * @title: + * Incremental Loading + * + * @abstract: + * Custom Glyph Loading. + * + * @description: + * This section contains various functions used to perform so-called + * `incremental' glyph loading. This is a mode where all glyphs loaded + * from a given @FT_Face are provided by the client application, + * + * Apart from that, all other tables are loaded normally from the font + * file. This mode is useful when FreeType is used within another + * engine, e.g., a PostScript Imaging Processor. + * + * To enable this mode, you must use @FT_Open_Face, passing an + * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an + * @FT_Incremental_Interface value. See the comments for + * @FT_Incremental_InterfaceRec for an example. + * + */ + + + /*************************************************************************** + * + * @type: + * FT_Incremental + * + * @description: + * An opaque type describing a user-provided object used to implement + * `incremental' glyph loading within FreeType. This is used to support + * embedded fonts in certain environments (e.g., PostScript interpreters), + * where the glyph data isn't in the font file, or must be overridden by + * different values. + * + * @note: + * It is up to client applications to create and implement @FT_Incremental + * objects, as long as they provide implementations for the methods + * @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc + * and @FT_Incremental_GetGlyphMetricsFunc. + * + * See the description of @FT_Incremental_InterfaceRec to understand how + * to use incremental objects with FreeType. + * + */ + typedef struct FT_IncrementalRec_* FT_Incremental; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_MetricsRec + * + * @description: + * A small structure used to contain the basic glyph metrics returned + * by the @FT_Incremental_GetGlyphMetricsFunc method. + * + * @fields: + * bearing_x :: + * Left bearing, in font units. + * + * bearing_y :: + * Top bearing, in font units. + * + * advance :: + * Horizontal component of glyph advance, in font units. + * + * advance_v :: + * Vertical component of glyph advance, in font units. + * + * @note: + * These correspond to horizontal or vertical metrics depending on the + * value of the `vertical' argument to the function + * @FT_Incremental_GetGlyphMetricsFunc. + * + */ + typedef struct FT_Incremental_MetricsRec_ + { + FT_Long bearing_x; + FT_Long bearing_y; + FT_Long advance; + FT_Long advance_v; /* since 2.3.12 */ + + } FT_Incremental_MetricsRec; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_Metrics + * + * @description: + * A handle to an @FT_Incremental_MetricsRec structure. + * + */ + typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics; + + + /*************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphDataFunc + * + * @description: + * A function called by FreeType to access a given glyph's data bytes + * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is + * enabled. + * + * Note that the format of the glyph's data bytes depends on the font + * file format. For TrueType, it must correspond to the raw bytes within + * the `glyf' table. For PostScript formats, it must correspond to the + * *unencrypted* charstring bytes, without any `lenIV' header. It is + * undefined for any other format. + * + * @input: + * incremental :: + * Handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * @output: + * adata :: + * A structure describing the returned glyph data bytes (which will be + * accessed as a read-only byte block). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If this function returns successfully the method + * @FT_Incremental_FreeGlyphDataFunc will be called later to release + * the data bytes. + * + * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for + * compound glyphs. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Data* adata ); + + + /*************************************************************************** + * + * @type: + * FT_Incremental_FreeGlyphDataFunc + * + * @description: + * A function used to release the glyph data bytes returned by a + * successful call to @FT_Incremental_GetGlyphDataFunc. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * data :: + * A structure describing the glyph data bytes (which will be accessed + * as a read-only byte block). + * + */ + typedef void + (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, + FT_Data* data ); + + + /*************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphMetricsFunc + * + * @description: + * A function used to retrieve the basic metrics of a given glyph index + * before accessing its data. This is necessary because, in certain + * formats like TrueType, the metrics are stored in a different place from + * the glyph images proper. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * vertical :: + * If true, return vertical metrics. + * + * ametrics :: + * This parameter is used for both input and output. + * The original glyph metrics, if any, in font units. If metrics are + * not available all the values must be set to zero. + * + * @output: + * ametrics :: + * The replacement glyph metrics in font units. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphMetricsFunc) + ( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Bool vertical, + FT_Incremental_MetricsRec *ametrics ); + + + /************************************************************************** + * + * @struct: + * FT_Incremental_FuncsRec + * + * @description: + * A table of functions for accessing fonts that load data + * incrementally. Used in @FT_Incremental_InterfaceRec. + * + * @fields: + * get_glyph_data :: + * The function to get glyph data. Must not be null. + * + * free_glyph_data :: + * The function to release glyph data. Must not be null. + * + * get_glyph_metrics :: + * The function to get glyph metrics. May be null if the font does + * not provide overriding glyph metrics. + * + */ + typedef struct FT_Incremental_FuncsRec_ + { + FT_Incremental_GetGlyphDataFunc get_glyph_data; + FT_Incremental_FreeGlyphDataFunc free_glyph_data; + FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; + + } FT_Incremental_FuncsRec; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_InterfaceRec + * + * @description: + * A structure to be used with @FT_Open_Face to indicate that the user + * wants to support incremental glyph loading. You should use it with + * @FT_PARAM_TAG_INCREMENTAL as in the following example: + * + * { + * FT_Incremental_InterfaceRec inc_int; + * FT_Parameter parameter; + * FT_Open_Args open_args; + * + * + * // set up incremental descriptor + * inc_int.funcs = my_funcs; + * inc_int.object = my_object; + * + * // set up optional parameter + * parameter.tag = FT_PARAM_TAG_INCREMENTAL; + * parameter.data = &inc_int; + * + * // set up FT_Open_Args structure + * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; + * open_args.pathname = my_font_pathname; + * open_args.num_params = 1; + * open_args.params = ¶meter; // we use one optional argument + * + * // open the font + * error = FT_Open_Face( library, &open_args, index, &face ); + * ... + * } + * + */ + typedef struct FT_Incremental_InterfaceRec_ + { + const FT_Incremental_FuncsRec* funcs; + FT_Incremental object; + + } FT_Incremental_InterfaceRec; + + + /*************************************************************************** + * + * @type: + * FT_Incremental_Interface + * + * @description: + * A pointer to an @FT_Incremental_InterfaceRec structure. + * + */ + typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface; + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_INCREMENTAL + * + * @description: + * A constant used as the tag of @FT_Parameter structures to indicate + * an incremental loading object to be used by FreeType. + * + */ +#define FT_PARAM_TAG_INCREMENTAL FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) + + /* */ + +FT_END_HEADER + +#endif /* __FTINCREM_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftlcdfil.h b/android/jni/ndk_modules/freetype/include/freetype/ftlcdfil.h new file mode 100644 index 00000000..0b55ebee --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftlcdfil.h @@ -0,0 +1,213 @@ +/***************************************************************************/ +/* */ +/* ftlcdfil.h */ +/* */ +/* FreeType API for color filtering of subpixel bitmap glyphs */ +/* (specification). */ +/* */ +/* Copyright 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_LCD_FILTER_H__ +#define __FT_LCD_FILTER_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************** + * + * @section: + * lcd_filtering + * + * @title: + * LCD Filtering + * + * @abstract: + * Reduce color fringes of LCD-optimized bitmaps. + * + * @description: + * The @FT_Library_SetLcdFilter API can be used to specify a low-pass + * filter which is then applied to LCD-optimized bitmaps generated + * through @FT_Render_Glyph. This is useful to reduce color fringes + * which would occur with unfiltered rendering. + * + * Note that no filter is active by default, and that this function is + * *not* implemented in default builds of the library. You need to + * #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file + * in order to activate it. + */ + + + /**************************************************************************** + * + * @enum: + * FT_LcdFilter + * + * @description: + * A list of values to identify various types of LCD filters. + * + * @values: + * FT_LCD_FILTER_NONE :: + * Do not perform filtering. When used with subpixel rendering, this + * results in sometimes severe color fringes. + * + * FT_LCD_FILTER_DEFAULT :: + * The default filter reduces color fringes considerably, at the cost + * of a slight blurriness in the output. + * + * FT_LCD_FILTER_LIGHT :: + * The light filter is a variant that produces less blurriness at the + * cost of slightly more color fringes than the default one. It might + * be better, depending on taste, your monitor, or your personal vision. + * + * FT_LCD_FILTER_LEGACY :: + * This filter corresponds to the original libXft color filter. It + * provides high contrast output but can exhibit really bad color + * fringes if glyphs are not extremely well hinted to the pixel grid. + * In other words, it only works well if the TrueType bytecode + * interpreter is enabled *and* high-quality hinted fonts are used. + * + * This filter is only provided for comparison purposes, and might be + * disabled or stay unsupported in the future. + * + * @since: + * 2.3.0 + */ + typedef enum FT_LcdFilter_ + { + FT_LCD_FILTER_NONE = 0, + FT_LCD_FILTER_DEFAULT = 1, + FT_LCD_FILTER_LIGHT = 2, + FT_LCD_FILTER_LEGACY = 16, + + FT_LCD_FILTER_MAX /* do not remove */ + + } FT_LcdFilter; + + + /************************************************************************** + * + * @func: + * FT_Library_SetLcdFilter + * + * @description: + * This function is used to apply color filtering to LCD decimated + * bitmaps, like the ones used when calling @FT_Render_Glyph with + * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V. + * + * @input: + * library :: + * A handle to the target library instance. + * + * filter :: + * The filter type. + * + * You can use @FT_LCD_FILTER_NONE here to disable this feature, or + * @FT_LCD_FILTER_DEFAULT to use a default filter that should work + * well on most LCD screens. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This feature is always disabled by default. Clients must make an + * explicit call to this function with a `filter' value other than + * @FT_LCD_FILTER_NONE in order to enable it. + * + * Due to *PATENTS* covering subpixel rendering, this function doesn't + * do anything except returning `FT_Err_Unimplemented_Feature' if the + * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not + * defined in your build of the library, which should correspond to all + * default builds of FreeType. + * + * The filter affects glyph bitmaps rendered through @FT_Render_Glyph, + * @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char. + * + * It does _not_ affect the output of @FT_Outline_Render and + * @FT_Outline_Get_Bitmap. + * + * If this feature is activated, the dimensions of LCD glyph bitmaps are + * either larger or taller than the dimensions of the corresponding + * outline with regards to the pixel grid. For example, for + * @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and + * up to 3~pixels to the right. + * + * The bitmap offset values are adjusted correctly, so clients shouldn't + * need to modify their layout and glyph positioning code when enabling + * the filter. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ); + + + /************************************************************************** + * + * @func: + * FT_Library_SetLcdFilterWeights + * + * @description: + * Use this function to override the filter weights selected by + * @FT_Library_SetLcdFilter. By default, FreeType uses the quintuple + * (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10, + * 0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and + * FT_LCD_FILTER_LEGACY. + * + * @input: + * library :: + * A handle to the target library instance. + * + * weights :: + * A pointer to an array; the function copies the first five bytes and + * uses them to specify the filter weights. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Due to *PATENTS* covering subpixel rendering, this function doesn't + * do anything except returning `FT_Err_Unimplemented_Feature' if the + * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not + * defined in your build of the library, which should correspond to all + * default builds of FreeType. + * + * This function must be called after @FT_Library_SetLcdFilter to have + * any effect. + * + * @since: + * 2.4.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ); + + /* */ + + +FT_END_HEADER + +#endif /* __FT_LCD_FILTER_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftlist.h b/android/jni/ndk_modules/freetype/include/freetype/ftlist.h new file mode 100644 index 00000000..bb6f7f11 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftlist.h @@ -0,0 +1,277 @@ +/***************************************************************************/ +/* */ +/* ftlist.h */ +/* */ +/* Generic list support for FreeType (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2007, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file implements functions relative to list processing. Its */ + /* data structures are defined in `freetype.h'. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTLIST_H__ +#define __FTLIST_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* list_processing */ + /* */ + /* <Title> */ + /* List Processing */ + /* */ + /* <Abstract> */ + /* Simple management of lists. */ + /* */ + /* <Description> */ + /* This section contains various definitions related to list */ + /* processing using doubly-linked nodes. */ + /* */ + /* <Order> */ + /* FT_List */ + /* FT_ListNode */ + /* FT_ListRec */ + /* FT_ListNodeRec */ + /* */ + /* FT_List_Add */ + /* FT_List_Insert */ + /* FT_List_Find */ + /* FT_List_Remove */ + /* FT_List_Up */ + /* FT_List_Iterate */ + /* FT_List_Iterator */ + /* FT_List_Finalize */ + /* FT_List_Destructor */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Find */ + /* */ + /* <Description> */ + /* Find the list node for a given listed object. */ + /* */ + /* <Input> */ + /* list :: A pointer to the parent list. */ + /* data :: The address of the listed object. */ + /* */ + /* <Return> */ + /* List node. NULL if it wasn't found. */ + /* */ + FT_EXPORT( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Add */ + /* */ + /* <Description> */ + /* Append an element to the end of a list. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* node :: The node to append. */ + /* */ + FT_EXPORT( void ) + FT_List_Add( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Insert */ + /* */ + /* <Description> */ + /* Insert an element at the head of a list. */ + /* */ + /* <InOut> */ + /* list :: A pointer to parent list. */ + /* node :: The node to insert. */ + /* */ + FT_EXPORT( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Remove */ + /* */ + /* <Description> */ + /* Remove a node from a list. This function doesn't check whether */ + /* the node is in the list! */ + /* */ + /* <Input> */ + /* node :: The node to remove. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* */ + FT_EXPORT( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Up */ + /* */ + /* <Description> */ + /* Move a node to the head/top of a list. Used to maintain LRU */ + /* lists. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* node :: The node to move. */ + /* */ + FT_EXPORT( void ) + FT_List_Up( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_List_Iterator */ + /* */ + /* <Description> */ + /* An FT_List iterator function which is called during a list parse */ + /* by @FT_List_Iterate. */ + /* */ + /* <Input> */ + /* node :: The current iteration list node. */ + /* */ + /* user :: A typeless pointer passed to @FT_List_Iterate. */ + /* Can be used to point to the iteration's state. */ + /* */ + typedef FT_Error + (*FT_List_Iterator)( FT_ListNode node, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Iterate */ + /* */ + /* <Description> */ + /* Parse a list and calls a given iterator function on each element. */ + /* Note that parsing is stopped as soon as one of the iterator calls */ + /* returns a non-zero value. */ + /* */ + /* <Input> */ + /* list :: A handle to the list. */ + /* iterator :: An iterator function, called on each node of the list. */ + /* user :: A user-supplied field which is passed as the second */ + /* argument to the iterator. */ + /* */ + /* <Return> */ + /* The result (a FreeType error code) of the last iterator call. */ + /* */ + FT_EXPORT( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_List_Destructor */ + /* */ + /* <Description> */ + /* An @FT_List iterator function which is called during a list */ + /* finalization by @FT_List_Finalize to destroy all elements in a */ + /* given list. */ + /* */ + /* <Input> */ + /* system :: The current system object. */ + /* */ + /* data :: The current object to destroy. */ + /* */ + /* user :: A typeless pointer passed to @FT_List_Iterate. It can */ + /* be used to point to the iteration's state. */ + /* */ + typedef void + (*FT_List_Destructor)( FT_Memory memory, + void* data, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Finalize */ + /* */ + /* <Description> */ + /* Destroy all elements in the list as well as the list itself. */ + /* */ + /* <Input> */ + /* list :: A handle to the list. */ + /* */ + /* destroy :: A list destructor that will be applied to each element */ + /* of the list. */ + /* */ + /* memory :: The current memory object which handles deallocation. */ + /* */ + /* user :: A user-supplied field which is passed as the last */ + /* argument to the destructor. */ + /* */ + /* <Note> */ + /* This function expects that all nodes added by @FT_List_Add or */ + /* @FT_List_Insert have been dynamically allocated. */ + /* */ + FT_EXPORT( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTLIST_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftlzw.h b/android/jni/ndk_modules/freetype/include/freetype/ftlzw.h new file mode 100644 index 00000000..00d40169 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftlzw.h @@ -0,0 +1,99 @@ +/***************************************************************************/ +/* */ +/* ftlzw.h */ +/* */ +/* LZW-compressed stream support. */ +/* */ +/* Copyright 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTLZW_H__ +#define __FTLZW_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* lzw */ + /* */ + /* <Title> */ + /* LZW Streams */ + /* */ + /* <Abstract> */ + /* Using LZW-compressed font files. */ + /* */ + /* <Description> */ + /* This section contains the declaration of LZW-specific functions. */ + /* */ + /*************************************************************************/ + + /************************************************************************ + * + * @function: + * FT_Stream_OpenLZW + * + * @description: + * Open a new stream to parse LZW-compressed font files. This is + * mainly used to support the compressed `*.pcf.Z' fonts that come + * with XFree86. + * + * @input: + * stream :: The target embedding stream. + * + * source :: The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close' on the new stream will + * *not* call `FT_Stream_Close' on the source stream. None of the stream + * objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream + * + * In certain builds of the library, LZW compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a LZW stream from it + * and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature' if your build + * of FreeType was not compiled with LZW support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTLZW_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftmac.h b/android/jni/ndk_modules/freetype/include/freetype/ftmac.h new file mode 100644 index 00000000..ab5bab51 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftmac.h @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* ftmac.h */ +/* */ +/* Additional Mac-specific API. */ +/* */ +/* Copyright 1996-2001, 2004, 2006, 2007 by */ +/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* NOTE: Include this file after <freetype/freetype.h> and after any */ +/* Mac-specific headers (because this header uses Mac types such as */ +/* Handle, FSSpec, FSRef, etc.) */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMAC_H__ +#define __FTMAC_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + +/* gcc-3.4.1 and later can warn about functions tagged as deprecated */ +#ifndef FT_DEPRECATED_ATTRIBUTE +#if defined(__GNUC__) && \ + ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) +#define FT_DEPRECATED_ATTRIBUTE __attribute__((deprecated)) +#else +#define FT_DEPRECATED_ATTRIBUTE +#endif +#endif + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* mac_specific */ + /* */ + /* <Title> */ + /* Mac Specific Interface */ + /* */ + /* <Abstract> */ + /* Only available on the Macintosh. */ + /* */ + /* <Description> */ + /* The following definitions are only available if FreeType is */ + /* compiled on a Macintosh. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FOND */ + /* */ + /* <Description> */ + /* Create a new face object from a FOND resource. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* fond :: A FOND resource. */ + /* */ + /* face_index :: Only supported for the -1 `sanity check' special */ + /* case. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Notes> */ + /* This function can be used to create @FT_Face objects from fonts */ + /* that are installed in the system as follows. */ + /* */ + /* { */ + /* fond = GetResource( 'FOND', fontName ); */ + /* error = FT_New_Face_From_FOND( library, fond, 0, &face ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFile_From_Mac_Name */ + /* */ + /* <Description> */ + /* Return an FSSpec for the disk file containing the named font. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font (e.g., Times New Roman */ + /* Bold). */ + /* */ + /* <Output> */ + /* pathSpec :: FSSpec to the file. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* face_index :: Index of the face. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFile_From_Mac_ATS_Name */ + /* */ + /* <Description> */ + /* Return an FSSpec for the disk file containing the named font. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font in ATS framework. */ + /* */ + /* <Output> */ + /* pathSpec :: FSSpec to the file. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* face_index :: Index of the face. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFilePath_From_Mac_ATS_Name */ + /* */ + /* <Description> */ + /* Return a pathname of the disk file and face index for given font */ + /* name which is handled by ATS framework. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font in ATS framework. */ + /* */ + /* <Output> */ + /* path :: Buffer to store pathname of the file. For passing */ + /* to @FT_New_Face. The client must allocate this */ + /* buffer before calling this function. */ + /* */ + /* maxPathSize :: Lengths of the buffer `path' that client allocated. */ + /* */ + /* face_index :: Index of the face. For passing to @FT_New_Face. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSSpec */ + /* */ + /* <Description> */ + /* Create a new face object from a given resource and typeface index */ + /* using an FSSpec to the font file. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* spec :: FSSpec to the font file. */ + /* */ + /* face_index :: The index of the face within the resource. The */ + /* first face has index~0. */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* @FT_New_Face_From_FSSpec is identical to @FT_New_Face except */ + /* it accepts an FSSpec instead of a path. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec *spec, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSRef */ + /* */ + /* <Description> */ + /* Create a new face object from a given resource and typeface index */ + /* using an FSRef to the font file. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* spec :: FSRef to the font file. */ + /* */ + /* face_index :: The index of the face within the resource. The */ + /* first face has index~0. */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* @FT_New_Face_From_FSRef is identical to @FT_New_Face except */ + /* it accepts an FSRef instead of a path. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef *ref, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + /* */ + + +FT_END_HEADER + + +#endif /* __FTMAC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftmm.h b/android/jni/ndk_modules/freetype/include/freetype/ftmm.h new file mode 100644 index 00000000..3aefb9e4 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftmm.h @@ -0,0 +1,378 @@ +/***************************************************************************/ +/* */ +/* ftmm.h */ +/* */ +/* FreeType Multiple Master font interface (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMM_H__ +#define __FTMM_H__ + + +#include <ft2build.h> +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* multiple_masters */ + /* */ + /* <Title> */ + /* Multiple Masters */ + /* */ + /* <Abstract> */ + /* How to manage Multiple Masters fonts. */ + /* */ + /* <Description> */ + /* The following types and functions are used to manage Multiple */ + /* Master fonts, i.e., the selection of specific design instances by */ + /* setting design axis coordinates. */ + /* */ + /* George Williams has extended this interface to make it work with */ + /* both Type~1 Multiple Masters fonts and GX distortable (var) */ + /* fonts. Some of these routines only work with MM fonts, others */ + /* will work with both types. They are similar enough that a */ + /* consistent interface makes sense. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_MM_Axis */ + /* */ + /* <Description> */ + /* A simple structure used to model a given axis in design space for */ + /* Multiple Masters fonts. */ + /* */ + /* This structure can't be used for GX var fonts. */ + /* */ + /* <Fields> */ + /* name :: The axis's name. */ + /* */ + /* minimum :: The axis's minimum design coordinate. */ + /* */ + /* maximum :: The axis's maximum design coordinate. */ + /* */ + typedef struct FT_MM_Axis_ + { + FT_String* name; + FT_Long minimum; + FT_Long maximum; + + } FT_MM_Axis; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Multi_Master */ + /* */ + /* <Description> */ + /* A structure used to model the axes and space of a Multiple Masters */ + /* font. */ + /* */ + /* This structure can't be used for GX var fonts. */ + /* */ + /* <Fields> */ + /* num_axis :: Number of axes. Cannot exceed~4. */ + /* */ + /* num_designs :: Number of designs; should be normally 2^num_axis */ + /* even though the Type~1 specification strangely */ + /* allows for intermediate designs to be present. This */ + /* number cannot exceed~16. */ + /* */ + /* axis :: A table of axis descriptors. */ + /* */ + typedef struct FT_Multi_Master_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_MM_Axis axis[T1_MAX_MM_AXIS]; + + } FT_Multi_Master; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Var_Axis */ + /* */ + /* <Description> */ + /* A simple structure used to model a given axis in design space for */ + /* Multiple Masters and GX var fonts. */ + /* */ + /* <Fields> */ + /* name :: The axis's name. */ + /* Not always meaningful for GX. */ + /* */ + /* minimum :: The axis's minimum design coordinate. */ + /* */ + /* def :: The axis's default design coordinate. */ + /* FreeType computes meaningful default values for MM; it */ + /* is then an integer value, not in 16.16 format. */ + /* */ + /* maximum :: The axis's maximum design coordinate. */ + /* */ + /* tag :: The axis's tag (the GX equivalent to `name'). */ + /* FreeType provides default values for MM if possible. */ + /* */ + /* strid :: The entry in `name' table (another GX version of */ + /* `name'). */ + /* Not meaningful for MM. */ + /* */ + typedef struct FT_Var_Axis_ + { + FT_String* name; + + FT_Fixed minimum; + FT_Fixed def; + FT_Fixed maximum; + + FT_ULong tag; + FT_UInt strid; + + } FT_Var_Axis; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Var_Named_Style */ + /* */ + /* <Description> */ + /* A simple structure used to model a named style in a GX var font. */ + /* */ + /* This structure can't be used for MM fonts. */ + /* */ + /* <Fields> */ + /* coords :: The design coordinates for this style. */ + /* This is an array with one entry for each axis. */ + /* */ + /* strid :: The entry in `name' table identifying this style. */ + /* */ + typedef struct FT_Var_Named_Style_ + { + FT_Fixed* coords; + FT_UInt strid; + + } FT_Var_Named_Style; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_MM_Var */ + /* */ + /* <Description> */ + /* A structure used to model the axes and space of a Multiple Masters */ + /* or GX var distortable font. */ + /* */ + /* Some fields are specific to one format and not to the other. */ + /* */ + /* <Fields> */ + /* num_axis :: The number of axes. The maximum value is~4 for */ + /* MM; no limit in GX. */ + /* */ + /* num_designs :: The number of designs; should be normally */ + /* 2^num_axis for MM fonts. Not meaningful for GX */ + /* (where every glyph could have a different */ + /* number of designs). */ + /* */ + /* num_namedstyles :: The number of named styles; only meaningful for */ + /* GX which allows certain design coordinates to */ + /* have a string ID (in the `name' table) */ + /* associated with them. The font can tell the */ + /* user that, for example, Weight=1.5 is `Bold'. */ + /* */ + /* axis :: A table of axis descriptors. */ + /* GX fonts contain slightly more data than MM. */ + /* */ + /* namedstyles :: A table of named styles. */ + /* Only meaningful with GX. */ + /* */ + typedef struct FT_MM_Var_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_UInt num_namedstyles; + FT_Var_Axis* axis; + FT_Var_Named_Style* namedstyle; + + } FT_MM_Var; + + + /* */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Multi_Master */ + /* */ + /* <Description> */ + /* Retrieve the Multiple Master descriptor of a given font. */ + /* */ + /* This function can't be used with GX fonts. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Output> */ + /* amaster :: The Multiple Masters descriptor. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_MM_Var */ + /* */ + /* <Description> */ + /* Retrieve the Multiple Master/GX var descriptor of a given font. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Output> */ + /* amaster :: The Multiple Masters/GX var descriptor. */ + /* Allocates a data structure, which the user must free */ + /* (a single call to FT_FREE will do it). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_MM_Design_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Masters fonts, choose an interpolated font design */ + /* through design coordinates. */ + /* */ + /* This function can't be used with GX fonts. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: An array of design coordinates. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Var_Design_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Master or GX Var fonts, choose an interpolated font */ + /* design through design coordinates. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: An array of design coordinates. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_MM_Blend_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Masters and GX var fonts, choose an interpolated font */ + /* design through normalized blend coordinates. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: The design coordinates array (each element must be */ + /* between 0 and 1.0). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Var_Blend_Coordinates */ + /* */ + /* <Description> */ + /* This is another name of @FT_Set_MM_Blend_Coordinates. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTMM_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftmodapi.h b/android/jni/ndk_modules/freetype/include/freetype/ftmodapi.h new file mode 100644 index 00000000..8f2e0179 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftmodapi.h @@ -0,0 +1,483 @@ +/***************************************************************************/ +/* */ +/* ftmodapi.h */ +/* */ +/* FreeType modules public interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMODAPI_H__ +#define __FTMODAPI_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* module_management */ + /* */ + /* <Title> */ + /* Module Management */ + /* */ + /* <Abstract> */ + /* How to add, upgrade, and remove modules from FreeType. */ + /* */ + /* <Description> */ + /* The definitions below are used to manage modules within FreeType. */ + /* Modules can be added, upgraded, and removed at runtime. */ + /* */ + /*************************************************************************/ + + + /* module bit flags */ +#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ +#define FT_MODULE_RENDERER 2 /* this module is a renderer */ +#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ +#define FT_MODULE_STYLER 8 /* this module is a styler */ + +#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ + /* scalable fonts */ +#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ + /* support vector outlines */ +#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ + /* own hinter */ + + + /* deprecated values */ +#define ft_module_font_driver FT_MODULE_FONT_DRIVER +#define ft_module_renderer FT_MODULE_RENDERER +#define ft_module_hinter FT_MODULE_HINTER +#define ft_module_styler FT_MODULE_STYLER + +#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE +#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES +#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER + + + typedef FT_Pointer FT_Module_Interface; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Constructor */ + /* */ + /* <Description> */ + /* A function used to initialize (not create) a new module object. */ + /* */ + /* <Input> */ + /* module :: The module to initialize. */ + /* */ + typedef FT_Error + (*FT_Module_Constructor)( FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Destructor */ + /* */ + /* <Description> */ + /* A function used to finalize (not destroy) a given module object. */ + /* */ + /* <Input> */ + /* module :: The module to finalize. */ + /* */ + typedef void + (*FT_Module_Destructor)( FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Requester */ + /* */ + /* <Description> */ + /* A function used to query a given module for a specific interface. */ + /* */ + /* <Input> */ + /* module :: The module to finalize. */ + /* */ + /* name :: The name of the interface in the module. */ + /* */ + typedef FT_Module_Interface + (*FT_Module_Requester)( FT_Module module, + const char* name ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Module_Class */ + /* */ + /* <Description> */ + /* The module class descriptor. */ + /* */ + /* <Fields> */ + /* module_flags :: Bit flags describing the module. */ + /* */ + /* module_size :: The size of one module object/instance in */ + /* bytes. */ + /* */ + /* module_name :: The name of the module. */ + /* */ + /* module_version :: The version, as a 16.16 fixed number */ + /* (major.minor). */ + /* */ + /* module_requires :: The version of FreeType this module requires, */ + /* as a 16.16 fixed number (major.minor). Starts */ + /* at version 2.0, i.e., 0x20000. */ + /* */ + /* module_init :: The initializing function. */ + /* */ + /* module_done :: The finalizing function. */ + /* */ + /* get_interface :: The interface requesting function. */ + /* */ + typedef struct FT_Module_Class_ + { + FT_ULong module_flags; + FT_Long module_size; + const FT_String* module_name; + FT_Fixed module_version; + FT_Fixed module_requires; + + const void* module_interface; + + FT_Module_Constructor module_init; + FT_Module_Destructor module_done; + FT_Module_Requester get_interface; + + } FT_Module_Class; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Add_Module */ + /* */ + /* <Description> */ + /* Add a new module to a given library instance. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* clazz :: A pointer to class descriptor for the module. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* An error will be returned if a module already exists by that name, */ + /* or if the module requires a version of FreeType that is too great. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Module */ + /* */ + /* <Description> */ + /* Find a module by its name. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* <Return> */ + /* A module handle. 0~if none was found. */ + /* */ + /* <Note> */ + /* FreeType's internal modules aren't documented very well, and you */ + /* should look up the source code for details. */ + /* */ + FT_EXPORT( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Remove_Module */ + /* */ + /* <Description> */ + /* Remove a given module from a library instance. */ + /* */ + /* <InOut> */ + /* library :: A handle to a library object. */ + /* */ + /* <Input> */ + /* module :: A handle to a module object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The module object is destroyed by the function in case of success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Reference_Library */ + /* */ + /* <Description> */ + /* A counter gets initialized to~1 at the time an @FT_Library */ + /* structure is created. This function increments the counter. */ + /* @FT_Done_Library then only destroys a library if the counter is~1, */ + /* otherwise it simply decrements the counter. */ + /* */ + /* This function helps in managing life-cycles of structures which */ + /* reference @FT_Library objects. */ + /* */ + /* <Input> */ + /* library :: A handle to a target library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Since> */ + /* 2.4.2 */ + /* */ + FT_EXPORT( FT_Error ) + FT_Reference_Library( FT_Library library ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Library */ + /* */ + /* <Description> */ + /* This function is used to create a new FreeType library instance */ + /* from a given memory object. It is thus possible to use libraries */ + /* with distinct memory allocators within the same program. */ + /* */ + /* Normally, you would call this function (followed by a call to */ + /* @FT_Add_Default_Modules or a series of calls to @FT_Add_Module) */ + /* instead of @FT_Init_FreeType to initialize the FreeType library. */ + /* */ + /* Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a */ + /* library instance. */ + /* */ + /* <Input> */ + /* memory :: A handle to the original memory object. */ + /* */ + /* <Output> */ + /* alibrary :: A pointer to handle of a new library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* See the discussion of reference counters in the description of */ + /* @FT_Reference_Library. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Library */ + /* */ + /* <Description> */ + /* Discard a given library object. This closes all drivers and */ + /* discards all resource objects. */ + /* */ + /* <Input> */ + /* library :: A handle to the target library. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* See the discussion of reference counters in the description of */ + /* @FT_Reference_Library. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Library( FT_Library library ); + +/* */ + + typedef void + (*FT_DebugHook_Func)( void* arg ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Debug_Hook */ + /* */ + /* <Description> */ + /* Set a debug hook function for debugging the interpreter of a font */ + /* format. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* hook_index :: The index of the debug hook. You should use the */ + /* values defined in `ftobjs.h', e.g., */ + /* `FT_DEBUG_HOOK_TRUETYPE'. */ + /* */ + /* debug_hook :: The function used to debug the interpreter. */ + /* */ + /* <Note> */ + /* Currently, four debug hook slots are available, but only two (for */ + /* the TrueType and the Type~1 interpreter) are defined. */ + /* */ + /* Since the internal headers of FreeType are no longer installed, */ + /* the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly. */ + /* This is a bug and will be fixed in a forthcoming release. */ + /* */ + FT_EXPORT( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Add_Default_Modules */ + /* */ + /* <Description> */ + /* Add the set of default drivers to a given library object. */ + /* This is only useful when you create a library object with */ + /* @FT_New_Library (usually to plug a custom memory manager). */ + /* */ + /* <InOut> */ + /* library :: A handle to a new library object. */ + /* */ + FT_EXPORT( void ) + FT_Add_Default_Modules( FT_Library library ); + + + + /************************************************************************** + * + * @section: + * truetype_engine + * + * @title: + * The TrueType Engine + * + * @abstract: + * TrueType bytecode support. + * + * @description: + * This section contains a function used to query the level of TrueType + * bytecode support compiled in this version of the library. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_TrueTypeEngineType + * + * @description: + * A list of values describing which kind of TrueType bytecode + * engine is implemented in a given FT_Library instance. It is used + * by the @FT_Get_TrueType_Engine_Type function. + * + * @values: + * FT_TRUETYPE_ENGINE_TYPE_NONE :: + * The library doesn't implement any kind of bytecode interpreter. + * + * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED :: + * The library implements a bytecode interpreter that doesn't + * support the patented operations of the TrueType virtual machine. + * + * Its main use is to load certain Asian fonts which position and + * scale glyph components with bytecode instructions. It produces + * bad output for most other fonts. + * + * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: + * The library implements a bytecode interpreter that covers + * the full instruction set of the TrueType virtual machine (this + * was governed by patents until May 2010, hence the name). + * + * @since: + * 2.2 + * + */ + typedef enum FT_TrueTypeEngineType_ + { + FT_TRUETYPE_ENGINE_TYPE_NONE = 0, + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED, + FT_TRUETYPE_ENGINE_TYPE_PATENTED + + } FT_TrueTypeEngineType; + + + /************************************************************************** + * + * @func: + * FT_Get_TrueType_Engine_Type + * + * @description: + * Return an @FT_TrueTypeEngineType value to indicate which level of + * the TrueType virtual machine a given library instance supports. + * + * @input: + * library :: + * A library instance. + * + * @return: + * A value indicating which level is supported. + * + * @since: + * 2.2 + * + */ + FT_EXPORT( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTMODAPI_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftmoderr.h b/android/jni/ndk_modules/freetype/include/freetype/ftmoderr.h new file mode 100644 index 00000000..b0115dd0 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftmoderr.h @@ -0,0 +1,155 @@ +/***************************************************************************/ +/* */ +/* ftmoderr.h */ +/* */ +/* FreeType module error offsets (specification). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the FreeType module error offsets. */ + /* */ + /* The lower byte gives the error code, the higher byte gives the */ + /* module. The base module has error offset 0. For example, the error */ + /* `FT_Err_Invalid_File_Format' has value 0x003, the error */ + /* `TT_Err_Invalid_File_Format' has value 0x1103, the error */ + /* `T1_Err_Invalid_File_Format' has value 0x1203, etc. */ + /* */ + /* Undefine the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in ftoption.h */ + /* to make the higher byte always zero (disabling the module error */ + /* mechanism). */ + /* */ + /* It can also be used to create a module error message table easily */ + /* with something like */ + /* */ + /* { */ + /* #undef __FTMODERR_H__ */ + /* #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, */ + /* #define FT_MODERR_START_LIST { */ + /* #define FT_MODERR_END_LIST { 0, 0 } }; */ + /* */ + /* const struct */ + /* { */ + /* int mod_err_offset; */ + /* const char* mod_err_msg */ + /* } ft_mod_errors[] = */ + /* */ + /* #include FT_MODULE_ERRORS_H */ + /* } */ + /* */ + /* To use such a table, all errors must be ANDed with 0xFF00 to remove */ + /* the error code. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTMODERR_H__ +#define __FTMODERR_H__ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#ifndef FT_MODERRDEF + +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v, +#else +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0, +#endif + +#define FT_MODERR_START_LIST enum { +#define FT_MODERR_END_LIST FT_Mod_Err_Max }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_MODERRDEF */ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST MODULE ERROR BASES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_MODERR_START_LIST + FT_MODERR_START_LIST +#endif + + + FT_MODERRDEF( Base, 0x000, "base module" ) + FT_MODERRDEF( Autofit, 0x100, "autofitter module" ) + FT_MODERRDEF( BDF, 0x200, "BDF module" ) + FT_MODERRDEF( Cache, 0x300, "cache module" ) + FT_MODERRDEF( CFF, 0x400, "CFF module" ) + FT_MODERRDEF( CID, 0x500, "CID module" ) + FT_MODERRDEF( Gzip, 0x600, "Gzip module" ) + FT_MODERRDEF( LZW, 0x700, "LZW module" ) + FT_MODERRDEF( OTvalid, 0x800, "OpenType validation module" ) + FT_MODERRDEF( PCF, 0x900, "PCF module" ) + FT_MODERRDEF( PFR, 0xA00, "PFR module" ) + FT_MODERRDEF( PSaux, 0xB00, "PS auxiliary module" ) + FT_MODERRDEF( PShinter, 0xC00, "PS hinter module" ) + FT_MODERRDEF( PSnames, 0xD00, "PS names module" ) + FT_MODERRDEF( Raster, 0xE00, "raster module" ) + FT_MODERRDEF( SFNT, 0xF00, "SFNT module" ) + FT_MODERRDEF( Smooth, 0x1000, "smooth raster module" ) + FT_MODERRDEF( TrueType, 0x1100, "TrueType module" ) + FT_MODERRDEF( Type1, 0x1200, "Type 1 module" ) + FT_MODERRDEF( Type42, 0x1300, "Type 42 module" ) + FT_MODERRDEF( Winfonts, 0x1400, "Windows FON/FNT module" ) + + +#ifdef FT_MODERR_END_LIST + FT_MODERR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_MODERR_START_LIST +#undef FT_MODERR_END_LIST +#undef FT_MODERRDEF +#undef FT_NEED_EXTERN_C + + +#endif /* __FTMODERR_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftotval.h b/android/jni/ndk_modules/freetype/include/freetype/ftotval.h new file mode 100644 index 00000000..027f2e88 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftotval.h @@ -0,0 +1,203 @@ +/***************************************************************************/ +/* */ +/* ftotval.h */ +/* */ +/* FreeType API for validating OpenType tables (specification). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* */ +/* Warning: This module might be moved to a different library in the */ +/* future to avoid a tight dependency between FreeType and the */ +/* OpenType specification. */ +/* */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOTVAL_H__ +#define __FTOTVAL_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* ot_validation */ + /* */ + /* <Title> */ + /* OpenType Validation */ + /* */ + /* <Abstract> */ + /* An API to validate OpenType tables. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions to validate */ + /* some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_OTXXX + * + * @description: + * A list of bit-field constants used with @FT_OpenType_Validate to + * indicate which OpenType tables should be validated. + * + * @values: + * FT_VALIDATE_BASE :: + * Validate BASE table. + * + * FT_VALIDATE_GDEF :: + * Validate GDEF table. + * + * FT_VALIDATE_GPOS :: + * Validate GPOS table. + * + * FT_VALIDATE_GSUB :: + * Validate GSUB table. + * + * FT_VALIDATE_JSTF :: + * Validate JSTF table. + * + * FT_VALIDATE_MATH :: + * Validate MATH table. + * + * FT_VALIDATE_OT :: + * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). + * + */ +#define FT_VALIDATE_BASE 0x0100 +#define FT_VALIDATE_GDEF 0x0200 +#define FT_VALIDATE_GPOS 0x0400 +#define FT_VALIDATE_GSUB 0x0800 +#define FT_VALIDATE_JSTF 0x1000 +#define FT_VALIDATE_MATH 0x2000 + +#define FT_VALIDATE_OT FT_VALIDATE_BASE | \ + FT_VALIDATE_GDEF | \ + FT_VALIDATE_GPOS | \ + FT_VALIDATE_GSUB | \ + FT_VALIDATE_JSTF | \ + FT_VALIDATE_MATH + + /* */ + + /********************************************************************** + * + * @function: + * FT_OpenType_Validate + * + * @description: + * Validate various OpenType tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without + * error checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the tables to be validated. See + * @FT_VALIDATE_OTXXX for possible values. + * + * @output: + * BASE_table :: + * A pointer to the BASE table. + * + * GDEF_table :: + * A pointer to the GDEF table. + * + * GPOS_table :: + * A pointer to the GPOS table. + * + * GSUB_table :: + * A pointer to the GSUB table. + * + * JSTF_table :: + * A pointer to the JSTF table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with OpenType fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the five tables with + * @FT_OpenType_Free. A NULL value indicates that the table either + * doesn't exist in the font, or the application hasn't asked for + * validation. + */ + FT_EXPORT( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ); + + /* */ + + /********************************************************************** + * + * @function: + * FT_OpenType_Free + * + * @description: + * Free the buffer allocated by OpenType validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_OpenType_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_OpenType_Validate only. + */ + FT_EXPORT( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTOTVAL_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftoutln.h b/android/jni/ndk_modules/freetype/include/freetype/ftoutln.h new file mode 100644 index 00000000..2829a05c --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftoutln.h @@ -0,0 +1,537 @@ +/***************************************************************************/ +/* */ +/* ftoutln.h */ +/* */ +/* Support for the FT_Outline type used to store glyph shapes of */ +/* most scalable font formats (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOUTLN_H__ +#define __FTOUTLN_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /* <Title> */ + /* Outline Processing */ + /* */ + /* <Abstract> */ + /* Functions to create, transform, and render vectorial glyph images. */ + /* */ + /* <Description> */ + /* This section contains routines used to create and destroy scalable */ + /* glyph images known as `outlines'. These can also be measured, */ + /* transformed, and converted into bitmaps and pixmaps. */ + /* */ + /* <Order> */ + /* FT_Outline */ + /* FT_OUTLINE_FLAGS */ + /* FT_Outline_New */ + /* FT_Outline_Done */ + /* FT_Outline_Copy */ + /* FT_Outline_Translate */ + /* FT_Outline_Transform */ + /* FT_Outline_Embolden */ + /* FT_Outline_Reverse */ + /* FT_Outline_Check */ + /* */ + /* FT_Outline_Get_CBox */ + /* FT_Outline_Get_BBox */ + /* */ + /* FT_Outline_Get_Bitmap */ + /* FT_Outline_Render */ + /* */ + /* FT_Outline_Decompose */ + /* FT_Outline_Funcs */ + /* FT_Outline_MoveTo_Func */ + /* FT_Outline_LineTo_Func */ + /* FT_Outline_ConicTo_Func */ + /* FT_Outline_CubicTo_Func */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Decompose */ + /* */ + /* <Description> */ + /* Walk over an outline's structure to decompose it into individual */ + /* segments and Bézier arcs. This function also emits `move to' */ + /* operations to indicate the start of new contours in the outline. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source target. */ + /* */ + /* func_interface :: A table of `emitters', i.e., function pointers */ + /* called during decomposition to indicate path */ + /* operations. */ + /* */ + /* <InOut> */ + /* user :: A typeless pointer which is passed to each */ + /* emitter during the decomposition. It can be */ + /* used to store the state during the */ + /* decomposition. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_New */ + /* */ + /* <Description> */ + /* Create a new outline of a given size. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object from where the */ + /* outline is allocated. Note however that the new */ + /* outline will *not* necessarily be *freed*, when */ + /* destroying the library, by @FT_Done_FreeType. */ + /* */ + /* numPoints :: The maximal number of points within the outline. */ + /* */ + /* numContours :: The maximal number of contours within the outline. */ + /* */ + /* <Output> */ + /* anoutline :: A handle to the new outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The reason why this function takes a `library' parameter is simply */ + /* to use the library's memory allocator. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + FT_EXPORT( FT_Error ) + FT_Outline_New_Internal( FT_Memory memory, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Done */ + /* */ + /* <Description> */ + /* Destroy an outline created with @FT_Outline_New. */ + /* */ + /* <Input> */ + /* library :: A handle of the library object used to allocate the */ + /* outline. */ + /* */ + /* outline :: A pointer to the outline object to be discarded. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* If the outline's `owner' field is not set, only the outline */ + /* descriptor will be released. */ + /* */ + /* The reason why this function takes an `library' parameter is */ + /* simply to use ft_mem_free(). */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ); + + + FT_EXPORT( FT_Error ) + FT_Outline_Done_Internal( FT_Memory memory, + FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Check */ + /* */ + /* <Description> */ + /* Check the contents of an outline descriptor. */ + /* */ + /* <Input> */ + /* outline :: A handle to a source outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Check( FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_CBox */ + /* */ + /* <Description> */ + /* Return an outline's `control box'. The control box encloses all */ + /* the outline's points, including Bézier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* which contains Bézier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component which is dedicated to this single task. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <Output> */ + /* acbox :: The outline's control box. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Translate */ + /* */ + /* <Description> */ + /* Apply a simple translation to the points of an outline. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Input> */ + /* xOffset :: The horizontal offset. */ + /* */ + /* yOffset :: The vertical offset. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Copy */ + /* */ + /* <Description> */ + /* Copy an outline into another one. Both objects must have the */ + /* same sizes (number of points & number of contours) when this */ + /* function is called. */ + /* */ + /* <Input> */ + /* source :: A handle to the source outline. */ + /* */ + /* <Output> */ + /* target :: A handle to the target outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Transform */ + /* */ + /* <Description> */ + /* Apply a simple 2x2 matrix to all of an outline's points. Useful */ + /* for applying rotations, slanting, flipping, etc. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the transformation matrix. */ + /* */ + /* <Note> */ + /* You can use @FT_Outline_Translate if you need to translate the */ + /* outline's points. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Embolden */ + /* */ + /* <Description> */ + /* Embolden an outline. The new outline will be at most 4~times */ + /* `strength' pixels wider and higher. You may think of the left and */ + /* bottom borders as unchanged. */ + /* */ + /* Negative `strength' values to reduce the outline thickness are */ + /* possible also. */ + /* */ + /* <InOut> */ + /* outline :: A handle to the target outline. */ + /* */ + /* <Input> */ + /* strength :: How strong the glyph is emboldened. Expressed in */ + /* 26.6 pixel format. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The used algorithm to increase or decrease the thickness of the */ + /* glyph doesn't change the number of points; this means that certain */ + /* situations like acute angles or intersections are sometimes */ + /* handled incorrectly. */ + /* */ + /* If you need `better' metrics values you should call */ + /* @FT_Outline_Get_CBox ot @FT_Outline_Get_BBox. */ + /* */ + /* Example call: */ + /* */ + /* { */ + /* FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); */ + /* if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE ) */ + /* FT_Outline_Embolden( &face->slot->outline, strength ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Reverse */ + /* */ + /* <Description> */ + /* Reverse the drawing direction of an outline. This is used to */ + /* ensure consistent fill conventions for mirrored glyphs. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Note> */ + /* This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in */ + /* the outline's `flags' field. */ + /* */ + /* It shouldn't be used by a normal client application, unless it */ + /* knows what it is doing. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Reverse( FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_Bitmap */ + /* */ + /* <Description> */ + /* Render an outline within a bitmap. The outline's image is simply */ + /* OR-ed to the target bitmap. */ + /* */ + /* <Input> */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <InOut> */ + /* abitmap :: A pointer to the target bitmap descriptor. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function does NOT CREATE the bitmap, it only renders an */ + /* outline image within the one you pass to it! Consequently, the */ + /* various fields in `abitmap' should be set accordingly. */ + /* */ + /* It will use the raster corresponding to the default glyph format. */ + /* */ + /* The value of the `num_grays' field in `abitmap' is ignored. If */ + /* you select the gray-level rasterizer, and you want less than 256 */ + /* gray levels, you have to use @FT_Outline_Render directly. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Render */ + /* */ + /* <Description> */ + /* Render an outline within a bitmap using the current scan-convert. */ + /* This function uses an @FT_Raster_Params structure as an argument, */ + /* allowing advanced features like direct composition, translucency, */ + /* etc. */ + /* */ + /* <Input> */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <InOut> */ + /* params :: A pointer to an @FT_Raster_Params structure used to */ + /* describe the rendering operation. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* You should know what you are doing and how @FT_Raster_Params works */ + /* to use this function. */ + /* */ + /* The field `params.source' will be set to `outline' before the scan */ + /* converter is called, which means that the value you give to it is */ + /* actually ignored. */ + /* */ + /* The gray-level rasterizer always uses 256 gray levels. If you */ + /* want less gray levels, you have to provide your own span callback. */ + /* See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the */ + /* @FT_Raster_Params structure for more details. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ); + + + /************************************************************************** + * + * @enum: + * FT_Orientation + * + * @description: + * A list of values used to describe an outline's contour orientation. + * + * The TrueType and PostScript specifications use different conventions + * to determine whether outline contours should be filled or unfilled. + * + * @values: + * FT_ORIENTATION_TRUETYPE :: + * According to the TrueType specification, clockwise contours must + * be filled, and counter-clockwise ones must be unfilled. + * + * FT_ORIENTATION_POSTSCRIPT :: + * According to the PostScript specification, counter-clockwise contours + * must be filled, and clockwise ones must be unfilled. + * + * FT_ORIENTATION_FILL_RIGHT :: + * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to + * remember that in TrueType, everything that is to the right of + * the drawing direction of a contour must be filled. + * + * FT_ORIENTATION_FILL_LEFT :: + * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to + * remember that in PostScript, everything that is to the left of + * the drawing direction of a contour must be filled. + * + * FT_ORIENTATION_NONE :: + * The orientation cannot be determined. That is, different parts of + * the glyph have different orientation. + * + */ + typedef enum FT_Orientation_ + { + FT_ORIENTATION_TRUETYPE = 0, + FT_ORIENTATION_POSTSCRIPT = 1, + FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, + FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, + FT_ORIENTATION_NONE + + } FT_Orientation; + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Orientation + * + * @description: + * This function analyzes a glyph outline and tries to compute its + * fill orientation (see @FT_Orientation). This is done by computing + * the direction of each global horizontal and/or vertical extrema + * within the outline. + * + * Note that this will return @FT_ORIENTATION_TRUETYPE for empty + * outlines. + * + * @input: + * outline :: + * A handle to the source outline. + * + * @return: + * The orientation. + * + */ + FT_EXPORT( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTOUTLN_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftpfr.h b/android/jni/ndk_modules/freetype/include/freetype/ftpfr.h new file mode 100644 index 00000000..0b7b7d42 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftpfr.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* ftpfr.h */ +/* */ +/* FreeType API for accessing PFR-specific data (specification only). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTPFR_H__ +#define __FTPFR_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* pfr_fonts */ + /* */ + /* <Title> */ + /* PFR Fonts */ + /* */ + /* <Abstract> */ + /* PFR/TrueDoc specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of PFR-specific functions. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Metrics + * + * @description: + * Return the outline and metrics resolutions of a given PFR face. + * + * @input: + * face :: Handle to the input face. It can be a non-PFR face. + * + * @output: + * aoutline_resolution :: + * Outline resolution. This is equivalent to `face->units_per_EM' + * for non-PFR fonts. Optional (parameter can be NULL). + * + * ametrics_resolution :: + * Metrics resolution. This is equivalent to `outline_resolution' + * for non-PFR fonts. Optional (parameter can be NULL). + * + * ametrics_x_scale :: + * A 16.16 fixed-point number used to scale distance expressed + * in metrics units to device sub-pixels. This is equivalent to + * `face->size->x_scale', but for metrics only. Optional (parameter + * can be NULL). + * + * ametrics_y_scale :: + * Same as `ametrics_x_scale' but for the vertical direction. + * optional (parameter can be NULL). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the input face is not a PFR, this function will return an error. + * However, in all cases, it will return valid values. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ); + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Kerning + * + * @description: + * Return the kerning pair corresponding to two glyphs in a PFR face. + * The distance is expressed in metrics units, unlike the result of + * @FT_Get_Kerning. + * + * @input: + * face :: A handle to the input face. + * + * left :: Index of the left glyph. + * + * right :: Index of the right glyph. + * + * @output: + * avector :: A kerning vector. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function always return distances in original PFR metrics + * units. This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED + * mode, which always returns distances converted to outline units. + * + * You can use the value of the `x_scale' and `y_scale' parameters + * returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Advance + * + * @description: + * Return a given glyph advance, expressed in original metrics units, + * from a PFR font. + * + * @input: + * face :: A handle to the input face. + * + * gindex :: The glyph index. + * + * @output: + * aadvance :: The glyph advance in metrics units. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics + * to convert the advance to device sub-pixels (i.e., 1/64th of pixels). + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTPFR_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftrender.h b/android/jni/ndk_modules/freetype/include/freetype/ftrender.h new file mode 100644 index 00000000..e06a8142 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftrender.h @@ -0,0 +1,230 @@ +/***************************************************************************/ +/* */ +/* ftrender.h */ +/* */ +/* FreeType renderer modules public interface (specification). */ +/* */ +/* Copyright 1996-2001, 2005, 2006, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTRENDER_H__ +#define __FTRENDER_H__ + + +#include <ft2build.h> +#include FT_MODULE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* module_management */ + /* */ + /*************************************************************************/ + + + /* create a new glyph object */ + typedef FT_Error + (*FT_Glyph_InitFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + + /* destroys a given glyph object */ + typedef void + (*FT_Glyph_DoneFunc)( FT_Glyph glyph ); + + typedef void + (*FT_Glyph_TransformFunc)( FT_Glyph glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + typedef void + (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph, + FT_BBox* abbox ); + + typedef FT_Error + (*FT_Glyph_CopyFunc)( FT_Glyph source, + FT_Glyph target ); + + typedef FT_Error + (*FT_Glyph_PrepareFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + +/* deprecated */ +#define FT_Glyph_Init_Func FT_Glyph_InitFunc +#define FT_Glyph_Done_Func FT_Glyph_DoneFunc +#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc +#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc +#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc +#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc + + + struct FT_Glyph_Class_ + { + FT_Long glyph_size; + FT_Glyph_Format glyph_format; + FT_Glyph_InitFunc glyph_init; + FT_Glyph_DoneFunc glyph_done; + FT_Glyph_CopyFunc glyph_copy; + FT_Glyph_TransformFunc glyph_transform; + FT_Glyph_GetBBoxFunc glyph_bbox; + FT_Glyph_PrepareFunc glyph_prepare; + }; + + + typedef FT_Error + (*FT_Renderer_RenderFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_UInt mode, + const FT_Vector* origin ); + + typedef FT_Error + (*FT_Renderer_TransformFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + + typedef void + (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_BBox* cbox ); + + + typedef FT_Error + (*FT_Renderer_SetModeFunc)( FT_Renderer renderer, + FT_ULong mode_tag, + FT_Pointer mode_ptr ); + +/* deprecated identifiers */ +#define FTRenderer_render FT_Renderer_RenderFunc +#define FTRenderer_transform FT_Renderer_TransformFunc +#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc +#define FTRenderer_setMode FT_Renderer_SetModeFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Renderer_Class */ + /* */ + /* <Description> */ + /* The renderer module class descriptor. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Module_Class fields. */ + /* */ + /* glyph_format :: The glyph image format this renderer handles. */ + /* */ + /* render_glyph :: A method used to render the image that is in a */ + /* given glyph slot into a bitmap. */ + /* */ + /* transform_glyph :: A method used to transform the image that is in */ + /* a given glyph slot. */ + /* */ + /* get_glyph_cbox :: A method used to access the glyph's cbox. */ + /* */ + /* set_mode :: A method used to pass additional parameters. */ + /* */ + /* raster_class :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */ + /* This is a pointer to its raster's class. */ + /* */ + typedef struct FT_Renderer_Class_ + { + FT_Module_Class root; + + FT_Glyph_Format glyph_format; + + FT_Renderer_RenderFunc render_glyph; + FT_Renderer_TransformFunc transform_glyph; + FT_Renderer_GetCBoxFunc get_glyph_cbox; + FT_Renderer_SetModeFunc set_mode; + + FT_Raster_Funcs* raster_class; + + } FT_Renderer_Class; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Renderer */ + /* */ + /* <Description> */ + /* Retrieve the current renderer for a given glyph format. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* format :: The glyph format. */ + /* */ + /* <Return> */ + /* A renderer handle. 0~if none found. */ + /* */ + /* <Note> */ + /* An error will be returned if a module already exists by that name, */ + /* or if the module requires a version of FreeType that is too great. */ + /* */ + /* To add a new renderer, simply use @FT_Add_Module. To retrieve a */ + /* renderer by its name, use @FT_Get_Module. */ + /* */ + FT_EXPORT( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Renderer */ + /* */ + /* <Description> */ + /* Set the current renderer to use, and set additional mode. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* renderer :: A handle to the renderer object. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* parameters :: Additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* In case of success, the renderer will be used to convert glyph */ + /* images in the renderer's known format into bitmaps. */ + /* */ + /* This doesn't change the current renderer for other formats. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTRENDER_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftsizes.h b/android/jni/ndk_modules/freetype/include/freetype/ftsizes.h new file mode 100644 index 00000000..3e548cc3 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftsizes.h @@ -0,0 +1,159 @@ +/***************************************************************************/ +/* */ +/* ftsizes.h */ +/* */ +/* FreeType size objects management (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Typical application would normally not need to use these functions. */ + /* However, they have been placed in a public API for the rare cases */ + /* where they are needed. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSIZES_H__ +#define __FTSIZES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* sizes_management */ + /* */ + /* <Title> */ + /* Size Management */ + /* */ + /* <Abstract> */ + /* Managing multiple sizes per face. */ + /* */ + /* <Description> */ + /* When creating a new face object (e.g., with @FT_New_Face), an */ + /* @FT_Size object is automatically created and used to store all */ + /* pixel-size dependent information, available in the `face->size' */ + /* field. */ + /* */ + /* It is however possible to create more sizes for a given face, */ + /* mostly in order to manage several character pixel sizes of the */ + /* same font family and style. See @FT_New_Size and @FT_Done_Size. */ + /* */ + /* Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only */ + /* modify the contents of the current `active' size; you thus need */ + /* to use @FT_Activate_Size to change it. */ + /* */ + /* 99% of applications won't need the functions provided here, */ + /* especially if they use the caching sub-system, so be cautious */ + /* when using these. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Size */ + /* */ + /* <Description> */ + /* Create a new size object from a given face object. */ + /* */ + /* <Input> */ + /* face :: A handle to a parent face object. */ + /* */ + /* <Output> */ + /* asize :: A handle to a new size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* You need to call @FT_Activate_Size in order to select the new size */ + /* for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, */ + /* @FT_Load_Glyph, @FT_Load_Char, etc. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size* size ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Size */ + /* */ + /* <Description> */ + /* Discard a given size object. Note that @FT_Done_Face */ + /* automatically discards all size objects allocated with */ + /* @FT_New_Size. */ + /* */ + /* <Input> */ + /* size :: A handle to a target size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Size( FT_Size size ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Activate_Size */ + /* */ + /* <Description> */ + /* Even though it is possible to create several size objects for a */ + /* given face (see @FT_New_Size for details), functions like */ + /* @FT_Load_Glyph or @FT_Load_Char only use the one which has been */ + /* activated last to determine the `current character pixel size'. */ + /* */ + /* This function can be used to `activate' a previously created size */ + /* object. */ + /* */ + /* <Input> */ + /* size :: A handle to a target size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* If `face' is the size's parent face object, this function changes */ + /* the value of `face->size' to the input size handle. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Activate_Size( FT_Size size ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTSIZES_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftsnames.h b/android/jni/ndk_modules/freetype/include/freetype/ftsnames.h new file mode 100644 index 00000000..485e4e16 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftsnames.h @@ -0,0 +1,200 @@ +/***************************************************************************/ +/* */ +/* ftsnames.h */ +/* */ +/* Simple interface to access SFNT name tables (which are used */ +/* to hold font names, copyright info, notices, etc.) (specification). */ +/* */ +/* This is _not_ used to retrieve glyph names! */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_SFNT_NAMES_H__ +#define __FT_SFNT_NAMES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* sfnt_names */ + /* */ + /* <Title> */ + /* SFNT Names */ + /* */ + /* <Abstract> */ + /* Access the names embedded in TrueType and OpenType files. */ + /* */ + /* <Description> */ + /* The TrueType and OpenType specifications allow the inclusion of */ + /* a special `names table' in font files. This table contains */ + /* textual (and internationalized) information regarding the font, */ + /* like family name, copyright, version, etc. */ + /* */ + /* The definitions below are used to access them if available. */ + /* */ + /* Note that this has nothing to do with glyph names! */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SfntName */ + /* */ + /* <Description> */ + /* A structure used to model an SFNT `name' table entry. */ + /* */ + /* <Fields> */ + /* platform_id :: The platform ID for `string'. */ + /* */ + /* encoding_id :: The encoding ID for `string'. */ + /* */ + /* language_id :: The language ID for `string'. */ + /* */ + /* name_id :: An identifier for `string'. */ + /* */ + /* string :: The `name' string. Note that its format differs */ + /* depending on the (platform,encoding) pair. It can */ + /* be a Pascal String, a UTF-16 one, etc. */ + /* */ + /* Generally speaking, the string is not */ + /* zero-terminated. Please refer to the TrueType */ + /* specification for details. */ + /* */ + /* string_len :: The length of `string' in bytes. */ + /* */ + /* <Note> */ + /* Possible values for `platform_id', `encoding_id', `language_id', */ + /* and `name_id' are given in the file `ttnameid.h'. For details */ + /* please refer to the TrueType or OpenType specification. */ + /* */ + /* See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, */ + /* @TT_ISO_ID_XXX, and @TT_MS_ID_XXX. */ + /* */ + typedef struct FT_SfntName_ + { + FT_UShort platform_id; + FT_UShort encoding_id; + FT_UShort language_id; + FT_UShort name_id; + + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntName; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Name_Count */ + /* */ + /* <Description> */ + /* Retrieve the number of name strings in the SFNT `name' table. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Return> */ + /* The number of strings in the `name' table. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Name */ + /* */ + /* <Description> */ + /* Retrieve a string of the SFNT `name' table for a given index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* idx :: The index of the `name' string. */ + /* */ + /* <Output> */ + /* aname :: The indexed @FT_SfntName structure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `string' array returned in the `aname' structure is not */ + /* null-terminated. The application should deallocate it if it is no */ + /* longer in use. */ + /* */ + /* Use @FT_Get_Sfnt_Name_Count to get the total number of available */ + /* `name' table entries, then do a loop until you get the right */ + /* platform, encoding, and name ID. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ); + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY + * + * @description: + * A constant used as the tag of @FT_Parameter structures to make + * FT_Open_Face() ignore preferred family subfamily names in `name' + * table since OpenType version 1.4. For backwards compatibility with + * legacy systems which has 4-face-per-family restriction. + * + */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY FT_MAKE_TAG( 'i', 'g', 'p', 'f' ) + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY + * + * @description: + * A constant used as the tag of @FT_Parameter structures to make + * FT_Open_Face() ignore preferred subfamily names in `name' table since + * OpenType version 1.4. For backwards compatibility with legacy + * systems which has 4-face-per-family restriction. + * + */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY FT_MAKE_TAG( 'i', 'g', 'p', 's' ) + + /* */ + + +FT_END_HEADER + +#endif /* __FT_SFNT_NAMES_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftstroke.h b/android/jni/ndk_modules/freetype/include/freetype/ftstroke.h new file mode 100644 index 00000000..3afb87df --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftstroke.h @@ -0,0 +1,716 @@ +/***************************************************************************/ +/* */ +/* ftstroke.h */ +/* */ +/* FreeType path stroker (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_STROKE_H__ +#define __FT_STROKE_H__ + +#include <ft2build.h> +#include FT_OUTLINE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************ + * + * @section: + * glyph_stroker + * + * @title: + * Glyph Stroker + * + * @abstract: + * Generating bordered and stroked glyphs. + * + * @description: + * This component generates stroked outlines of a given vectorial + * glyph. It also allows you to retrieve the `outside' and/or the + * `inside' borders of the stroke. + * + * This can be useful to generate `bordered' glyph, i.e., glyphs + * displayed with a coloured (and anti-aliased) border around their + * shape. + */ + + + /************************************************************** + * + * @type: + * FT_Stroker + * + * @description: + * Opaque handler to a path stroker object. + */ + typedef struct FT_StrokerRec_* FT_Stroker; + + + /************************************************************** + * + * @enum: + * FT_Stroker_LineJoin + * + * @description: + * These values determine how two joining lines are rendered + * in a stroker. + * + * @values: + * FT_STROKER_LINEJOIN_ROUND :: + * Used to render rounded line joins. Circular arcs are used + * to join two lines smoothly. + * + * FT_STROKER_LINEJOIN_BEVEL :: + * Used to render beveled line joins; i.e., the two joining lines + * are extended until they intersect. + * + * FT_STROKER_LINEJOIN_MITER :: + * Same as beveled rendering, except that an additional line + * break is added if the angle between the two joining lines + * is too closed (this is useful to avoid unpleasant spikes + * in beveled rendering). + */ + typedef enum FT_Stroker_LineJoin_ + { + FT_STROKER_LINEJOIN_ROUND = 0, + FT_STROKER_LINEJOIN_BEVEL, + FT_STROKER_LINEJOIN_MITER + + } FT_Stroker_LineJoin; + + + /************************************************************** + * + * @enum: + * FT_Stroker_LineCap + * + * @description: + * These values determine how the end of opened sub-paths are + * rendered in a stroke. + * + * @values: + * FT_STROKER_LINECAP_BUTT :: + * The end of lines is rendered as a full stop on the last + * point itself. + * + * FT_STROKER_LINECAP_ROUND :: + * The end of lines is rendered as a half-circle around the + * last point. + * + * FT_STROKER_LINECAP_SQUARE :: + * The end of lines is rendered as a square around the + * last point. + */ + typedef enum FT_Stroker_LineCap_ + { + FT_STROKER_LINECAP_BUTT = 0, + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINECAP_SQUARE + + } FT_Stroker_LineCap; + + + /************************************************************** + * + * @enum: + * FT_StrokerBorder + * + * @description: + * These values are used to select a given stroke border + * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. + * + * @values: + * FT_STROKER_BORDER_LEFT :: + * Select the left border, relative to the drawing direction. + * + * FT_STROKER_BORDER_RIGHT :: + * Select the right border, relative to the drawing direction. + * + * @note: + * Applications are generally interested in the `inside' and `outside' + * borders. However, there is no direct mapping between these and the + * `left' and `right' ones, since this really depends on the glyph's + * drawing orientation, which varies between font formats. + * + * You can however use @FT_Outline_GetInsideBorder and + * @FT_Outline_GetOutsideBorder to get these. + */ + typedef enum FT_StrokerBorder_ + { + FT_STROKER_BORDER_LEFT = 0, + FT_STROKER_BORDER_RIGHT + + } FT_StrokerBorder; + + + /************************************************************** + * + * @function: + * FT_Outline_GetInsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the + * `inside' borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Outline_GetOutsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the + * `outside' borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_New + * + * @description: + * Create a new stroker object. + * + * @input: + * library :: + * FreeType library handle. + * + * @output: + * astroker :: + * A new stroker object handle. NULL in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Set + * + * @description: + * Reset a stroker object's attributes. + * + * @input: + * stroker :: + * The target stroker handle. + * + * radius :: + * The border radius. + * + * line_cap :: + * The line cap style. + * + * line_join :: + * The line join style. + * + * miter_limit :: + * The miter limit for the FT_STROKER_LINEJOIN_MITER style, + * expressed as 16.16 fixed point value. + * + * @note: + * The radius is expressed in the same units as the outline + * coordinates. + */ + FT_EXPORT( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Rewind + * + * @description: + * Reset a stroker object without changing its attributes. + * You should call this function before beginning a new + * series of calls to @FT_Stroker_BeginSubPath or + * @FT_Stroker_EndSubPath. + * + * @input: + * stroker :: + * The target stroker handle. + */ + FT_EXPORT( void ) + FT_Stroker_Rewind( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ParseOutline + * + * @description: + * A convenience function used to parse a whole outline with + * the stroker. The resulting outline(s) can be retrieved + * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The source outline. + * + * opened :: + * A boolean. If~1, the outline is treated as an open path instead + * of a closed one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `opened' is~0 (the default), the outline is treated as a closed + * path, and the stroker generates two distinct `border' outlines. + * + * If `opened' is~1, the outline is processed as an open path, and the + * stroker generates a single `stroke' outline. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ); + + + /************************************************************** + * + * @function: + * FT_Stroker_BeginSubPath + * + * @description: + * Start a new sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the start vector. + * + * open :: + * A boolean. If~1, the sub-path is treated as an open one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function is useful when you need to stroke a path that is + * not stored as an @FT_Outline object. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ); + + + /************************************************************** + * + * @function: + * FT_Stroker_EndSubPath + * + * @description: + * Close the current sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function after @FT_Stroker_BeginSubPath. + * If the subpath was not `opened', this function `draws' a + * single line segment to the start position when needed. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_LineTo + * + * @description: + * `Draw' a single line segment in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ConicTo + * + * @description: + * `Draw' a single quadratic Bézier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control :: + * A pointer to a Bézier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_CubicTo + * + * @description: + * `Draw' a single cubic Bézier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control1 :: + * A pointer to the first Bézier control point. + * + * control2 :: + * A pointer to second Bézier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_GetBorderCounts + * + * @description: + * Call this function once you have finished parsing your paths + * with the stroker. It returns the number of points and + * contours necessary to export one of the `border' or `stroke' + * outlines generated by the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * When an outline, or a sub-path, is `closed', the stroker generates + * two independent `border' outlines, named `left' and `right'. + * + * When the outline, or a sub-path, is `opened', the stroker merges + * the `border' outlines with caps. The `left' border receives all + * points, while the `right' border becomes empty. + * + * Use the function @FT_Stroker_GetCounts instead if you want to + * retrieve the counts associated to both borders. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ExportBorder + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to + * export the corresponding border to your own @FT_Outline + * structure. + * + * Note that this function appends the border points and + * contours to your outline, but does not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * outline :: + * The target outline handle. + * + * @note: + * Always call this function after @FT_Stroker_GetBorderCounts to + * get sure that there is enough room in your @FT_Outline object to + * receive all new data. + * + * When an outline, or a sub-path, is `closed', the stroker generates + * two independent `border' outlines, named `left' and `right' + * + * When the outline, or a sub-path, is `opened', the stroker merges + * the `border' outlines with caps. The `left' border receives all + * points, while the `right' border becomes empty. + * + * Use the function @FT_Stroker_Export instead if you want to + * retrieve all borders at once. + */ + FT_EXPORT( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_GetCounts + * + * @description: + * Call this function once you have finished parsing your paths + * with the stroker. It returns the number of points and + * contours necessary to export all points/borders from the stroked + * outline/path. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Export + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to + * export all borders to your own @FT_Outline structure. + * + * Note that this function appends the border points and + * contours to your outline, but does not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The target outline handle. + */ + FT_EXPORT( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Done + * + * @description: + * Destroy a stroker object. + * + * @input: + * stroker :: + * A stroker handle. Can be NULL. + */ + FT_EXPORT( void ) + FT_Stroker_Done( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Glyph_Stroke + * + * @description: + * Stroke a given outline glyph object with a given stroker. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed + * on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ); + + + /************************************************************** + * + * @function: + * FT_Glyph_StrokeBorder + * + * @description: + * Stroke a given outline glyph object with a given stroker, but + * only return either its inside or outside border. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * inside :: + * A Boolean. If~1, return the inside border, otherwise + * the outside border. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed + * on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ); + + /* */ + +FT_END_HEADER + +#endif /* __FT_STROKE_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftsynth.h b/android/jni/ndk_modules/freetype/include/freetype/ftsynth.h new file mode 100644 index 00000000..a068b792 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftsynth.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* ftsynth.h */ +/* */ +/* FreeType synthesizing code for emboldening and slanting */ +/* (specification). */ +/* */ +/* Copyright 2000-2001, 2003, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS ALPHA CODE! THIS API *********/ + /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ + /********* FREETYPE DEVELOPMENT TEAM *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Main reason for not lifting the functions in this module to a */ + /* `standard' API is that the used parameters for emboldening and */ + /* slanting are not configurable. Consider the functions as a */ + /* code resource which should be copied into the application and */ + /* adapted to the particular needs. */ + + +#ifndef __FTSYNTH_H__ +#define __FTSYNTH_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /* Embolden a glyph by a `reasonable' value (which is highly a matter of */ + /* taste). This function is actually a convenience function, providing */ + /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */ + /* */ + /* For emboldened outlines the metrics are estimates only; if you need */ + /* precise values you should call @FT_Outline_Get_CBox. */ + FT_EXPORT( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); + + /* Slant an outline glyph to the right by about 12 degrees. */ + FT_EXPORT( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); + + /* */ + +FT_END_HEADER + +#endif /* __FTSYNTH_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftsystem.h b/android/jni/ndk_modules/freetype/include/freetype/ftsystem.h new file mode 100644 index 00000000..e07460c5 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftsystem.h @@ -0,0 +1,347 @@ +/***************************************************************************/ +/* */ +/* ftsystem.h */ +/* */ +/* FreeType low-level system interface definition (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSYSTEM_H__ +#define __FTSYSTEM_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* system_interface */ + /* */ + /* <Title> */ + /* System Interface */ + /* */ + /* <Abstract> */ + /* How FreeType manages memory and i/o. */ + /* */ + /* <Description> */ + /* This section contains various definitions related to memory */ + /* management and i/o access. You need to understand this */ + /* information if you want to use a custom memory manager or you own */ + /* i/o streams. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* M E M O R Y M A N A G E M E N T */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Memory + * + * @description: + * A handle to a given memory manager object, defined with an + * @FT_MemoryRec structure. + * + */ + typedef struct FT_MemoryRec_* FT_Memory; + + + /************************************************************************* + * + * @functype: + * FT_Alloc_Func + * + * @description: + * A function used to allocate `size' bytes from `memory'. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * size :: + * The size in bytes to allocate. + * + * @return: + * Address of new memory block. 0~in case of failure. + * + */ + typedef void* + (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + + /************************************************************************* + * + * @functype: + * FT_Free_Func + * + * @description: + * A function used to release a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * block :: + * The address of the target memory block. + * + */ + typedef void + (*FT_Free_Func)( FT_Memory memory, + void* block ); + + + /************************************************************************* + * + * @functype: + * FT_Realloc_Func + * + * @description: + * A function used to re-allocate a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * cur_size :: + * The block's current size in bytes. + * + * new_size :: + * The block's requested new size. + * + * block :: + * The block's current address. + * + * @return: + * New block address. 0~in case of memory shortage. + * + * @note: + * In case of error, the old block must still be available. + * + */ + typedef void* + (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + + /************************************************************************* + * + * @struct: + * FT_MemoryRec + * + * @description: + * A structure used to describe a given memory manager to FreeType~2. + * + * @fields: + * user :: + * A generic typeless pointer for user data. + * + * alloc :: + * A pointer type to an allocation function. + * + * free :: + * A pointer type to an memory freeing function. + * + * realloc :: + * A pointer type to a reallocation function. + * + */ + struct FT_MemoryRec_ + { + void* user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + }; + + + /*************************************************************************/ + /* */ + /* I / O M A N A G E M E N T */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Stream + * + * @description: + * A handle to an input stream. + * + */ + typedef struct FT_StreamRec_* FT_Stream; + + + /************************************************************************* + * + * @struct: + * FT_StreamDesc + * + * @description: + * A union type used to store either a long or a pointer. This is used + * to store a file descriptor or a `FILE*' in an input stream. + * + */ + typedef union FT_StreamDesc_ + { + long value; + void* pointer; + + } FT_StreamDesc; + + + /************************************************************************* + * + * @functype: + * FT_Stream_IoFunc + * + * @description: + * A function used to seek and read data from a given input stream. + * + * @input: + * stream :: + * A handle to the source stream. + * + * offset :: + * The offset of read in stream (always from start). + * + * buffer :: + * The address of the read buffer. + * + * count :: + * The number of bytes to read from the stream. + * + * @return: + * The number of bytes effectively read by the stream. + * + * @note: + * This function might be called to perform a seek or skip operation + * with a `count' of~0. A non-zero return value then indicates an + * error. + * + */ + typedef unsigned long + (*FT_Stream_IoFunc)( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ); + + + /************************************************************************* + * + * @functype: + * FT_Stream_CloseFunc + * + * @description: + * A function used to close a given input stream. + * + * @input: + * stream :: + * A handle to the target stream. + * + */ + typedef void + (*FT_Stream_CloseFunc)( FT_Stream stream ); + + + /************************************************************************* + * + * @struct: + * FT_StreamRec + * + * @description: + * A structure used to describe an input stream. + * + * @input: + * base :: + * For memory-based streams, this is the address of the first stream + * byte in memory. This field should always be set to NULL for + * disk-based streams. + * + * size :: + * The stream size in bytes. + * + * pos :: + * The current position within the stream. + * + * descriptor :: + * This field is a union that can hold an integer or a pointer. It is + * used by stream implementations to store file descriptors or `FILE*' + * pointers. + * + * pathname :: + * This field is completely ignored by FreeType. However, it is often + * useful during debugging to use it to store the stream's filename + * (where available). + * + * read :: + * The stream's input function. + * + * close :: + * The stream's close function. + * + * memory :: + * The memory manager to use to preload frames. This is set + * internally by FreeType and shouldn't be touched by stream + * implementations. + * + * cursor :: + * This field is set and used internally by FreeType when parsing + * frames. + * + * limit :: + * This field is set and used internally by FreeType when parsing + * frames. + * + */ + typedef struct FT_StreamRec_ + { + unsigned char* base; + unsigned long size; + unsigned long pos; + + FT_StreamDesc descriptor; + FT_StreamDesc pathname; + FT_Stream_IoFunc read; + FT_Stream_CloseFunc close; + + FT_Memory memory; + unsigned char* cursor; + unsigned char* limit; + + } FT_StreamRec; + + + /* */ + + +FT_END_HEADER + +#endif /* __FTSYSTEM_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/fttrigon.h b/android/jni/ndk_modules/freetype/include/freetype/fttrigon.h new file mode 100644 index 00000000..6b77d2ee --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/fttrigon.h @@ -0,0 +1,350 @@ +/***************************************************************************/ +/* */ +/* fttrigon.h */ +/* */ +/* FreeType trigonometric functions (specification). */ +/* */ +/* Copyright 2001, 2003, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTTRIGON_H__ +#define __FTTRIGON_H__ + +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Angle + * + * @description: + * This type is used to model angle values in FreeType. Note that the + * angle is a 16.16 fixed float value expressed in degrees. + * + */ + typedef FT_Fixed FT_Angle; + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI + * + * @description: + * The angle pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI ( 180L << 16 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_2PI + * + * @description: + * The angle 2*pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI2 + * + * @description: + * The angle pi/2 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI4 + * + * @description: + * The angle pi/4 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 ) + + + /************************************************************************* + * + * @function: + * FT_Sin + * + * @description: + * Return the sinus of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The sinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Sin( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Cos + * + * @description: + * Return the cosinus of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The cosinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Cos( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Tan + * + * @description: + * Return the tangent of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The tangent value. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Tan( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Atan2 + * + * @description: + * Return the arc-tangent corresponding to a given vector (x,y) in + * the 2d plane. + * + * @input: + * x :: + * The horizontal vector coordinate. + * + * y :: + * The vertical vector coordinate. + * + * @return: + * The arc-tangent value (i.e. angle). + * + */ + FT_EXPORT( FT_Angle ) + FT_Atan2( FT_Fixed x, + FT_Fixed y ); + + + /************************************************************************* + * + * @function: + * FT_Angle_Diff + * + * @description: + * Return the difference between two angles. The result is always + * constrained to the ]-PI..PI] interval. + * + * @input: + * angle1 :: + * First angle. + * + * angle2 :: + * Second angle. + * + * @return: + * Constrained value of `value2-value1'. + * + */ + FT_EXPORT( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Unit + * + * @description: + * Return the unit vector corresponding to a given angle. After the + * call, the value of `vec.x' will be `sin(angle)', and the value of + * `vec.y' will be `cos(angle)'. + * + * This function is useful to retrieve both the sinus and cosinus of a + * given angle quickly. + * + * @output: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The address of angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Rotate + * + * @description: + * Rotate a vector by a given angle. + * + * @inout: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The address of angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Length + * + * @description: + * Return the length of a given vector. + * + * @input: + * vec :: + * The address of target vector. + * + * @return: + * The vector length, expressed in the same units that the original + * vector coordinates. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Polarize + * + * @description: + * Compute both the length and angle of a given vector. + * + * @input: + * vec :: + * The address of source vector. + * + * @output: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_From_Polar + * + * @description: + * Compute vector coordinates from a length and angle. + * + * @output: + * vec :: + * The address of source vector. + * + * @input: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTTRIGON_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/fttypes.h b/android/jni/ndk_modules/freetype/include/freetype/fttypes.h new file mode 100644 index 00000000..a57ffa69 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/fttypes.h @@ -0,0 +1,588 @@ +/***************************************************************************/ +/* */ +/* fttypes.h */ +/* */ +/* FreeType simple types definitions (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTTYPES_H__ +#define __FTTYPES_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_SYSTEM_H +#include FT_IMAGE_H + +#include <stddef.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /* <Title> */ + /* Basic Data Types */ + /* */ + /* <Abstract> */ + /* The basic data types defined by the library. */ + /* */ + /* <Description> */ + /* This section contains the basic data types defined by FreeType~2, */ + /* ranging from simple scalar types to bitmap descriptors. More */ + /* font-specific structures are defined in a different section. */ + /* */ + /* <Order> */ + /* FT_Byte */ + /* FT_Bytes */ + /* FT_Char */ + /* FT_Int */ + /* FT_UInt */ + /* FT_Int16 */ + /* FT_UInt16 */ + /* FT_Int32 */ + /* FT_UInt32 */ + /* FT_Short */ + /* FT_UShort */ + /* FT_Long */ + /* FT_ULong */ + /* FT_Bool */ + /* FT_Offset */ + /* FT_PtrDist */ + /* FT_String */ + /* FT_Tag */ + /* FT_Error */ + /* FT_Fixed */ + /* FT_Pointer */ + /* FT_Pos */ + /* FT_Vector */ + /* FT_BBox */ + /* FT_Matrix */ + /* FT_FWord */ + /* FT_UFWord */ + /* FT_F2Dot14 */ + /* FT_UnitVector */ + /* FT_F26Dot6 */ + /* */ + /* */ + /* FT_Generic */ + /* FT_Generic_Finalizer */ + /* */ + /* FT_Bitmap */ + /* FT_Pixel_Mode */ + /* FT_Palette_Mode */ + /* FT_Glyph_Format */ + /* FT_IMAGE_TAG */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Bool */ + /* */ + /* <Description> */ + /* A typedef of unsigned char, used for simple booleans. As usual, */ + /* values 1 and~0 represent true and false, respectively. */ + /* */ + typedef unsigned char FT_Bool; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_FWord */ + /* */ + /* <Description> */ + /* A signed 16-bit integer used to store a distance in original font */ + /* units. */ + /* */ + typedef signed short FT_FWord; /* distance in FUnits */ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UFWord */ + /* */ + /* <Description> */ + /* An unsigned 16-bit integer used to store a distance in original */ + /* font units. */ + /* */ + typedef unsigned short FT_UFWord; /* unsigned distance */ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Char */ + /* */ + /* <Description> */ + /* A simple typedef for the _signed_ char type. */ + /* */ + typedef signed char FT_Char; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Byte */ + /* */ + /* <Description> */ + /* A simple typedef for the _unsigned_ char type. */ + /* */ + typedef unsigned char FT_Byte; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Bytes */ + /* */ + /* <Description> */ + /* A typedef for constant memory areas. */ + /* */ + typedef const FT_Byte* FT_Bytes; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Tag */ + /* */ + /* <Description> */ + /* A typedef for 32-bit tags (as used in the SFNT format). */ + /* */ + typedef FT_UInt32 FT_Tag; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_String */ + /* */ + /* <Description> */ + /* A simple typedef for the char type, usually used for strings. */ + /* */ + typedef char FT_String; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Short */ + /* */ + /* <Description> */ + /* A typedef for signed short. */ + /* */ + typedef signed short FT_Short; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UShort */ + /* */ + /* <Description> */ + /* A typedef for unsigned short. */ + /* */ + typedef unsigned short FT_UShort; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Int */ + /* */ + /* <Description> */ + /* A typedef for the int type. */ + /* */ + typedef signed int FT_Int; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UInt */ + /* */ + /* <Description> */ + /* A typedef for the unsigned int type. */ + /* */ + typedef unsigned int FT_UInt; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Long */ + /* */ + /* <Description> */ + /* A typedef for signed long. */ + /* */ + typedef signed long FT_Long; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_ULong */ + /* */ + /* <Description> */ + /* A typedef for unsigned long. */ + /* */ + typedef unsigned long FT_ULong; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_F2Dot14 */ + /* */ + /* <Description> */ + /* A signed 2.14 fixed float type used for unit vectors. */ + /* */ + typedef signed short FT_F2Dot14; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_F26Dot6 */ + /* */ + /* <Description> */ + /* A signed 26.6 fixed float type used for vectorial pixel */ + /* coordinates. */ + /* */ + typedef signed long FT_F26Dot6; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Fixed */ + /* */ + /* <Description> */ + /* This type is used to store 16.16 fixed float values, like scaling */ + /* values or matrix coefficients. */ + /* */ + typedef signed long FT_Fixed; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Error */ + /* */ + /* <Description> */ + /* The FreeType error code type. A value of~0 is always interpreted */ + /* as a successful operation. */ + /* */ + typedef int FT_Error; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Pointer */ + /* */ + /* <Description> */ + /* A simple typedef for a typeless pointer. */ + /* */ + typedef void* FT_Pointer; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Offset */ + /* */ + /* <Description> */ + /* This is equivalent to the ANSI~C `size_t' type, i.e., the largest */ + /* _unsigned_ integer type used to express a file size or position, */ + /* or a memory block size. */ + /* */ + typedef size_t FT_Offset; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_PtrDist */ + /* */ + /* <Description> */ + /* This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the */ + /* largest _signed_ integer type used to express the distance */ + /* between two pointers. */ + /* */ + typedef ft_ptrdiff_t FT_PtrDist; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_UnitVector */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2D vector unit vector. Uses */ + /* FT_F2Dot14 types. */ + /* */ + /* <Fields> */ + /* x :: Horizontal coordinate. */ + /* */ + /* y :: Vertical coordinate. */ + /* */ + typedef struct FT_UnitVector_ + { + FT_F2Dot14 x; + FT_F2Dot14 y; + + } FT_UnitVector; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Matrix */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2x2 matrix. Coefficients are */ + /* in 16.16 fixed float format. The computation performed is: */ + /* */ + /* { */ + /* x' = x*xx + y*xy */ + /* y' = x*yx + y*yy */ + /* } */ + /* */ + /* <Fields> */ + /* xx :: Matrix coefficient. */ + /* */ + /* xy :: Matrix coefficient. */ + /* */ + /* yx :: Matrix coefficient. */ + /* */ + /* yy :: Matrix coefficient. */ + /* */ + typedef struct FT_Matrix_ + { + FT_Fixed xx, xy; + FT_Fixed yx, yy; + + } FT_Matrix; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Data */ + /* */ + /* <Description> */ + /* Read-only binary data represented as a pointer and a length. */ + /* */ + /* <Fields> */ + /* pointer :: The data. */ + /* */ + /* length :: The length of the data in bytes. */ + /* */ + typedef struct FT_Data_ + { + const FT_Byte* pointer; + FT_Int length; + + } FT_Data; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Generic_Finalizer */ + /* */ + /* <Description> */ + /* Describe a function used to destroy the `client' data of any */ + /* FreeType object. See the description of the @FT_Generic type for */ + /* details of usage. */ + /* */ + /* <Input> */ + /* The address of the FreeType object which is under finalization. */ + /* Its client data is accessed through its `generic' field. */ + /* */ + typedef void (*FT_Generic_Finalizer)(void* object); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Generic */ + /* */ + /* <Description> */ + /* Client applications often need to associate their own data to a */ + /* variety of FreeType core objects. For example, a text layout API */ + /* might want to associate a glyph cache to a given size object. */ + /* */ + /* Most FreeType object contains a `generic' field, of type */ + /* FT_Generic, which usage is left to client applications and font */ + /* servers. */ + /* */ + /* It can be used to store a pointer to client-specific data, as well */ + /* as the address of a `finalizer' function, which will be called by */ + /* FreeType when the object is destroyed (for example, the previous */ + /* client example would put the address of the glyph cache destructor */ + /* in the `finalizer' field). */ + /* */ + /* <Fields> */ + /* data :: A typeless pointer to any client-specified data. This */ + /* field is completely ignored by the FreeType library. */ + /* */ + /* finalizer :: A pointer to a `generic finalizer' function, which */ + /* will be called when the object is destroyed. If this */ + /* field is set to NULL, no code will be called. */ + /* */ + typedef struct FT_Generic_ + { + void* data; + FT_Generic_Finalizer finalizer; + + } FT_Generic; + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_MAKE_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags which are used to label */ + /* TrueType tables into an unsigned long to be used within FreeType. */ + /* */ + /* <Note> */ + /* The produced values *must* be 32-bit integers. Don't redefine */ + /* this macro. */ + /* */ +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + (FT_Tag) \ + ( ( (FT_ULong)_x1 << 24 ) | \ + ( (FT_ULong)_x2 << 16 ) | \ + ( (FT_ULong)_x3 << 8 ) | \ + (FT_ULong)_x4 ) + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* L I S T M A N A G E M E N T */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* list_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_ListNode */ + /* */ + /* <Description> */ + /* Many elements and objects in FreeType are listed through an */ + /* @FT_List record (see @FT_ListRec). As its name suggests, an */ + /* FT_ListNode is a handle to a single list element. */ + /* */ + typedef struct FT_ListNodeRec_* FT_ListNode; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_List */ + /* */ + /* <Description> */ + /* A handle to a list record (see @FT_ListRec). */ + /* */ + typedef struct FT_ListRec_* FT_List; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ListNodeRec */ + /* */ + /* <Description> */ + /* A structure used to hold a single list element. */ + /* */ + /* <Fields> */ + /* prev :: The previous element in the list. NULL if first. */ + /* */ + /* next :: The next element in the list. NULL if last. */ + /* */ + /* data :: A typeless pointer to the listed object. */ + /* */ + typedef struct FT_ListNodeRec_ + { + FT_ListNode prev; + FT_ListNode next; + void* data; + + } FT_ListNodeRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ListRec */ + /* */ + /* <Description> */ + /* A structure used to hold a simple doubly-linked list. These are */ + /* used in many parts of FreeType. */ + /* */ + /* <Fields> */ + /* head :: The head (first element) of doubly-linked list. */ + /* */ + /* tail :: The tail (last element) of doubly-linked list. */ + /* */ + typedef struct FT_ListRec_ + { + FT_ListNode head; + FT_ListNode tail; + + } FT_ListRec; + + + /* */ + +#define FT_IS_EMPTY( list ) ( (list).head == 0 ) + + /* return base error code (without module-specific prefix) */ +#define FT_ERROR_BASE( x ) ( (x) & 0xFF ) + + /* return module error code */ +#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) + +#define FT_BOOL( x ) ( (FT_Bool)( x ) ) + +FT_END_HEADER + +#endif /* __FTTYPES_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftwinfnt.h b/android/jni/ndk_modules/freetype/include/freetype/ftwinfnt.h new file mode 100644 index 00000000..ea333535 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftwinfnt.h @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* ftwinfnt.h */ +/* */ +/* FreeType API for accessing Windows fnt-specific data. */ +/* */ +/* Copyright 2003, 2004, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTWINFNT_H__ +#define __FTWINFNT_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* winfnt_fonts */ + /* */ + /* <Title> */ + /* Window FNT Files */ + /* */ + /* <Abstract> */ + /* Windows FNT specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of Windows FNT specific */ + /* functions. */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @enum: + * FT_WinFNT_ID_XXX + * + * @description: + * A list of valid values for the `charset' byte in + * @FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX + * encodings (except for cp1361) can be found at ftp://ftp.unicode.org + * in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is + * roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT. + * + * @values: + * FT_WinFNT_ID_DEFAULT :: + * This is used for font enumeration and font creation as a + * `don't care' value. Valid font files don't contain this value. + * When querying for information about the character set of the font + * that is currently selected into a specified device context, this + * return value (of the related Windows API) simply denotes failure. + * + * FT_WinFNT_ID_SYMBOL :: + * There is no known mapping table available. + * + * FT_WinFNT_ID_MAC :: + * Mac Roman encoding. + * + * FT_WinFNT_ID_OEM :: + * From Michael Pöttgen <michael@poettgen.de>: + * + * The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM + * is used for the charset of vector fonts, like `modern.fon', + * `roman.fon', and `script.fon' on Windows. + * + * The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value + * specifies a character set that is operating-system dependent. + * + * The `IFIMETRICS' documentation from the `Windows Driver + * Development Kit' says: This font supports an OEM-specific + * character set. The OEM character set is system dependent. + * + * In general OEM, as opposed to ANSI (i.e., cp1252), denotes the + * second default codepage that most international versions of + * Windows have. It is one of the OEM codepages from + * + * http://www.microsoft.com/globaldev/reference/cphome.mspx, + * + * and is used for the `DOS boxes', to support legacy applications. + * A German Windows version for example usually uses ANSI codepage + * 1252 and OEM codepage 850. + * + * FT_WinFNT_ID_CP874 :: + * A superset of Thai TIS 620 and ISO 8859-11. + * + * FT_WinFNT_ID_CP932 :: + * A superset of Japanese Shift-JIS (with minor deviations). + * + * FT_WinFNT_ID_CP936 :: + * A superset of simplified Chinese GB 2312-1980 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP949 :: + * A superset of Korean Hangul KS~C 5601-1987 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP950 :: + * A superset of traditional Chinese Big~5 ETen (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP1250 :: + * A superset of East European ISO 8859-2 (with slightly different + * ordering). + * + * FT_WinFNT_ID_CP1251 :: + * A superset of Russian ISO 8859-5 (with different ordering). + * + * FT_WinFNT_ID_CP1252 :: + * ANSI encoding. A superset of ISO 8859-1. + * + * FT_WinFNT_ID_CP1253 :: + * A superset of Greek ISO 8859-7 (with minor modifications). + * + * FT_WinFNT_ID_CP1254 :: + * A superset of Turkish ISO 8859-9. + * + * FT_WinFNT_ID_CP1255 :: + * A superset of Hebrew ISO 8859-8 (with some modifications). + * + * FT_WinFNT_ID_CP1256 :: + * A superset of Arabic ISO 8859-6 (with different ordering). + * + * FT_WinFNT_ID_CP1257 :: + * A superset of Baltic ISO 8859-13 (with some deviations). + * + * FT_WinFNT_ID_CP1258 :: + * For Vietnamese. This encoding doesn't cover all necessary + * characters. + * + * FT_WinFNT_ID_CP1361 :: + * Korean (Johab). + */ + +#define FT_WinFNT_ID_CP1252 0 +#define FT_WinFNT_ID_DEFAULT 1 +#define FT_WinFNT_ID_SYMBOL 2 +#define FT_WinFNT_ID_MAC 77 +#define FT_WinFNT_ID_CP932 128 +#define FT_WinFNT_ID_CP949 129 +#define FT_WinFNT_ID_CP1361 130 +#define FT_WinFNT_ID_CP936 134 +#define FT_WinFNT_ID_CP950 136 +#define FT_WinFNT_ID_CP1253 161 +#define FT_WinFNT_ID_CP1254 162 +#define FT_WinFNT_ID_CP1258 163 +#define FT_WinFNT_ID_CP1255 177 +#define FT_WinFNT_ID_CP1256 178 +#define FT_WinFNT_ID_CP1257 186 +#define FT_WinFNT_ID_CP1251 204 +#define FT_WinFNT_ID_CP874 222 +#define FT_WinFNT_ID_CP1250 238 +#define FT_WinFNT_ID_OEM 255 + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_WinFNT_HeaderRec */ + /* */ + /* <Description> */ + /* Windows FNT Header info. */ + /* */ + typedef struct FT_WinFNT_HeaderRec_ + { + FT_UShort version; + FT_ULong file_size; + FT_Byte copyright[60]; + FT_UShort file_type; + FT_UShort nominal_point_size; + FT_UShort vertical_resolution; + FT_UShort horizontal_resolution; + FT_UShort ascent; + FT_UShort internal_leading; + FT_UShort external_leading; + FT_Byte italic; + FT_Byte underline; + FT_Byte strike_out; + FT_UShort weight; + FT_Byte charset; + FT_UShort pixel_width; + FT_UShort pixel_height; + FT_Byte pitch_and_family; + FT_UShort avg_width; + FT_UShort max_width; + FT_Byte first_char; + FT_Byte last_char; + FT_Byte default_char; + FT_Byte break_char; + FT_UShort bytes_per_row; + FT_ULong device_offset; + FT_ULong face_name_offset; + FT_ULong bits_pointer; + FT_ULong bits_offset; + FT_Byte reserved; + FT_ULong flags; + FT_UShort A_space; + FT_UShort B_space; + FT_UShort C_space; + FT_UShort color_table_offset; + FT_ULong reserved1[4]; + + } FT_WinFNT_HeaderRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_WinFNT_Header */ + /* */ + /* <Description> */ + /* A handle to an @FT_WinFNT_HeaderRec structure. */ + /* */ + typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header; + + + /********************************************************************** + * + * @function: + * FT_Get_WinFNT_Header + * + * @description: + * Retrieve a Windows FNT font info header. + * + * @input: + * face :: A handle to the input face. + * + * @output: + * aheader :: The WinFNT header. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with Windows FNT faces, returning an error + * otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + + /* */ + +FT_END_HEADER + +#endif /* __FTWINFNT_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftxf86.h b/android/jni/ndk_modules/freetype/include/freetype/ftxf86.h new file mode 100644 index 00000000..8c68afdc --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ftxf86.h @@ -0,0 +1,83 @@ +/***************************************************************************/ +/* */ +/* ftxf86.h */ +/* */ +/* Support functions for X11. */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTXF86_H__ +#define __FTXF86_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* font_formats */ + /* */ + /* <Title> */ + /* Font Formats */ + /* */ + /* <Abstract> */ + /* Getting the font format. */ + /* */ + /* <Description> */ + /* The single function in this section can be used to get the font */ + /* format. Note that this information is not needed normally; */ + /* however, there are special cases (like in PDF devices) where it is */ + /* important to differentiate, in spite of FreeType's uniform API. */ + /* */ + /* This function is in the X11/xf86 namespace for historical reasons */ + /* and in no way depends on that windowing system. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_X11_Font_Format */ + /* */ + /* <Description> */ + /* Return a string describing the format of a given face, using values */ + /* which can be used as an X11 FONT_PROPERTY. Possible values are */ + /* `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */ + /* `PFR', and `Windows~FNT'. */ + /* */ + /* <Input> */ + /* face :: */ + /* Input face handle. */ + /* */ + /* <Return> */ + /* Font format string. NULL in case of error. */ + /* */ + FT_EXPORT( const char* ) + FT_Get_X11_Font_Format( FT_Face face ); + + /* */ + +FT_END_HEADER + +#endif /* __FTXF86_H__ */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/autohint.h b/android/jni/ndk_modules/freetype/include/freetype/internal/autohint.h new file mode 100644 index 00000000..7e3a08a0 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/autohint.h @@ -0,0 +1,231 @@ +/***************************************************************************/ +/* */ +/* autohint.h */ +/* */ +/* High-level `autohint' module-specific interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The auto-hinter is used to load and automatically hint glyphs if a */ + /* format-specific hinter isn't available. */ + /* */ + /*************************************************************************/ + + +#ifndef __AUTOHINT_H__ +#define __AUTOHINT_H__ + + + /*************************************************************************/ + /* */ + /* A small technical note regarding automatic hinting in order to */ + /* clarify this module interface. */ + /* */ + /* An automatic hinter might compute two kinds of data for a given face: */ + /* */ + /* - global hints: Usually some metrics that describe global properties */ + /* of the face. It is computed by scanning more or less */ + /* aggressively the glyphs in the face, and thus can be */ + /* very slow to compute (even if the size of global */ + /* hints is really small). */ + /* */ + /* - glyph hints: These describe some important features of the glyph */ + /* outline, as well as how to align them. They are */ + /* generally much faster to compute than global hints. */ + /* */ + /* The current FreeType auto-hinter does a pretty good job while */ + /* performing fast computations for both global and glyph hints. */ + /* However, we might be interested in introducing more complex and */ + /* powerful algorithms in the future, like the one described in the John */ + /* D. Hobby paper, which unfortunately requires a lot more horsepower. */ + /* */ + /* Because a sufficiently sophisticated font management system would */ + /* typically implement an LRU cache of opened face objects to reduce */ + /* memory usage, it is a good idea to be able to avoid recomputing */ + /* global hints every time the same face is re-opened. */ + /* */ + /* We thus provide the ability to cache global hints outside of the face */ + /* object, in order to speed up font re-opening time. Of course, this */ + /* feature is purely optional, so most client programs won't even notice */ + /* it. */ + /* */ + /* I initially thought that it would be a good idea to cache the glyph */ + /* hints too. However, my general idea now is that if you really need */ + /* to cache these too, you are simply in need of a new font format, */ + /* where all this information could be stored within the font file and */ + /* decoded on the fly. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + typedef struct FT_AutoHinterRec_ *FT_AutoHinter; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlobalGetFunc */ + /* */ + /* <Description> */ + /* Retrieves the global hints computed for a given face object the */ + /* resulting data is dissociated from the face and will survive a */ + /* call to FT_Done_Face(). It must be discarded through the API */ + /* FT_AutoHinter_GlobalDoneFunc(). */ + /* */ + /* <Input> */ + /* hinter :: A handle to the source auto-hinter. */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* <Output> */ + /* global_hints :: A typeless pointer to the global hints. */ + /* */ + /* global_len :: The size in bytes of the global hints. */ + /* */ + typedef void + (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter, + FT_Face face, + void** global_hints, + long* global_len ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlobalDoneFunc */ + /* */ + /* <Description> */ + /* Discards the global hints retrieved through */ + /* FT_AutoHinter_GlobalGetFunc(). This is the only way these hints */ + /* are freed from memory. */ + /* */ + /* <Input> */ + /* hinter :: A handle to the auto-hinter module. */ + /* */ + /* global :: A pointer to retrieved global hints to discard. */ + /* */ + typedef void + (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter, + void* global ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlobalResetFunc */ + /* */ + /* <Description> */ + /* This function is used to recompute the global metrics in a given */ + /* font. This is useful when global font data changes (e.g. Multiple */ + /* Masters fonts where blend coordinates change). */ + /* */ + /* <Input> */ + /* hinter :: A handle to the source auto-hinter. */ + /* */ + /* face :: A handle to the face. */ + /* */ + typedef void + (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter, + FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlyphLoadFunc */ + /* */ + /* <Description> */ + /* This function is used to load, scale, and automatically hint a */ + /* glyph from a given face. */ + /* */ + /* <Input> */ + /* face :: A handle to the face. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* load_flags :: The load flags. */ + /* */ + /* <Note> */ + /* This function is capable of loading composite glyphs by hinting */ + /* each sub-glyph independently (which improves quality). */ + /* */ + /* It will call the font driver with FT_Load_Glyph(), with */ + /* FT_LOAD_NO_SCALE set. */ + /* */ + typedef FT_Error + (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_AutoHinter_ServiceRec */ + /* */ + /* <Description> */ + /* The auto-hinter module's interface. */ + /* */ + typedef struct FT_AutoHinter_ServiceRec_ + { + FT_AutoHinter_GlobalResetFunc reset_face; + FT_AutoHinter_GlobalGetFunc get_global_hints; + FT_AutoHinter_GlobalDoneFunc done_global_hints; + FT_AutoHinter_GlyphLoadFunc load_glyph; + + } FT_AutoHinter_ServiceRec, *FT_AutoHinter_Service; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_AUTOHINTER_SERVICE(class_, reset_face_, get_global_hints_, \ + done_global_hints_, load_glyph_) \ + FT_CALLBACK_TABLE_DEF \ + const FT_AutoHinter_ServiceRec class_ = \ + { \ + reset_face_, get_global_hints_, done_global_hints_, load_glyph_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_AUTOHINTER_SERVICE(class_, reset_face_, get_global_hints_, \ + done_global_hints_, load_glyph_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_AutoHinter_ServiceRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->reset_face = reset_face_; \ + clazz->get_global_hints = get_global_hints_; \ + clazz->done_global_hints = done_global_hints_; \ + clazz->load_glyph = load_glyph_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + +FT_END_HEADER + +#endif /* __AUTOHINT_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftcalc.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftcalc.h new file mode 100644 index 00000000..f8b43247 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/ftcalc.h @@ -0,0 +1,179 @@ +/***************************************************************************/ +/* */ +/* ftcalc.h */ +/* */ +/* Arithmetic computations (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCALC_H__ +#define __FTCALC_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_FixedSqrt */ + /* */ + /* <Description> */ + /* Computes the square root of a 16.16 fixed point value. */ + /* */ + /* <Input> */ + /* x :: The value to compute the root for. */ + /* */ + /* <Return> */ + /* The result of `sqrt(x)'. */ + /* */ + /* <Note> */ + /* This function is not very fast. */ + /* */ + FT_BASE( FT_Int32 ) + FT_SqrtFixed( FT_Int32 x ); + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Sqrt32 */ + /* */ + /* <Description> */ + /* Computes the square root of an Int32 integer (which will be */ + /* handled as an unsigned long value). */ + /* */ + /* <Input> */ + /* x :: The value to compute the root for. */ + /* */ + /* <Return> */ + /* The result of `sqrt(x)'. */ + /* */ + FT_EXPORT( FT_Int32 ) + FT_Sqrt32( FT_Int32 x ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulDiv_No_Round */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation `(a*b)/c' */ + /* (without rounding) with maximal accuracy (it uses a 64-bit */ + /* intermediate integer whenever necessary). */ + /* */ + /* This function isn't necessarily as fast as some processor specific */ + /* operations, but is at least completely portable. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. */ + /* c :: The divisor. */ + /* */ + /* <Return> */ + /* The result of `(a*b)/c'. This function never traps when trying to */ + /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ + /* on the signs of `a' and `b'. */ + /* */ + FT_BASE( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* + * A variant of FT_Matrix_Multiply which scales its result afterwards. + * The idea is that both `a' and `b' are scaled by factors of 10 so that + * the values are as precise as possible to get a correct result during + * the 64bit multiplication. Let `sa' and `sb' be the scaling factors of + * `a' and `b', respectively, then the scaling factor of the result is + * `sa*sb'. + */ + FT_BASE( void ) + FT_Matrix_Multiply_Scaled( const FT_Matrix* a, + FT_Matrix *b, + FT_Long scaling ); + + + /* + * A variant of FT_Vector_Transform. See comments for + * FT_Matrix_Multiply_Scaled. + */ + + FT_BASE( void ) + FT_Vector_Transform_Scaled( FT_Vector* vector, + const FT_Matrix* matrix, + FT_Long scaling ); + + + /* + * Return -1, 0, or +1, depending on the orientation of a given corner. + * We use the Cartesian coordinate system, with positive vertical values + * going upwards. The function returns +1 if the corner turns to the + * left, -1 to the right, and 0 for undecidable cases. + */ + FT_BASE( FT_Int ) + ft_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ); + + /* + * Return TRUE if a corner is flat or nearly flat. This is equivalent to + * saying that the angle difference between the `in' and `out' vectors is + * very small. + */ + FT_BASE( FT_Int ) + ft_corner_is_flat( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ); + + +#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 ) +#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 ) +#define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 ) +#define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) << 2 ) +#define FLOAT_TO_FIXED( x ) ( (FT_Long)( x * 65536.0 ) ) +#define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 ) + +#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \ + : ( -( ( 32 - (x) ) & -64 ) ) ) + + +FT_END_HEADER + +#endif /* __FTCALC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftdebug.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftdebug.h new file mode 100644 index 00000000..7baae353 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/ftdebug.h @@ -0,0 +1,250 @@ +/***************************************************************************/ +/* */ +/* ftdebug.h */ +/* */ +/* Debugging and logging component (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/* */ +/* IMPORTANT: A description of FreeType's debugging support can be */ +/* found in `docs/DEBUG.TXT'. Read it if you need to use or */ +/* understand this code. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTDEBUG_H__ +#define __FTDEBUG_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */ + /* is already defined; this simplifies the following #ifdefs */ + /* */ +#ifdef FT_DEBUG_LEVEL_TRACE +#undef FT_DEBUG_LEVEL_ERROR +#define FT_DEBUG_LEVEL_ERROR +#endif + + + /*************************************************************************/ + /* */ + /* Define the trace enums as well as the trace levels array when they */ + /* are needed. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define FT_TRACE_DEF( x ) trace_ ## x , + + /* defining the enumeration */ + typedef enum FT_Trace_ + { +#include FT_INTERNAL_TRACE_H + trace_count + + } FT_Trace; + + + /* defining the array of trace levels, provided by `src/base/ftdebug.c' */ + extern int ft_trace_levels[trace_count]; + +#undef FT_TRACE_DEF + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* Define the FT_TRACE macro */ + /* */ + /* IMPORTANT! */ + /* */ + /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */ + /* value before using any TRACE macro. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define FT_TRACE( level, varformat ) \ + do \ + { \ + if ( ft_trace_levels[FT_COMPONENT] >= level ) \ + FT_Message varformat; \ + } while ( 0 ) + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define FT_TRACE( level, varformat ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Trace_Get_Count */ + /* */ + /* <Description> */ + /* Return the number of available trace components. */ + /* */ + /* <Return> */ + /* The number of trace components. 0 if FreeType 2 is not built with */ + /* FT_DEBUG_LEVEL_TRACE definition. */ + /* */ + /* <Note> */ + /* This function may be useful if you want to access elements of */ + /* the internal `ft_trace_levels' array by an index. */ + /* */ + FT_BASE( FT_Int ) + FT_Trace_Get_Count( void ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Trace_Get_Name */ + /* */ + /* <Description> */ + /* Return the name of a trace component. */ + /* */ + /* <Input> */ + /* The index of the trace component. */ + /* */ + /* <Return> */ + /* The name of the trace component. This is a statically allocated */ + /* C string, so do not free it after use. NULL if FreeType 2 is not */ + /* built with FT_DEBUG_LEVEL_TRACE definition. */ + /* */ + /* <Note> */ + /* Use @FT_Trace_Get_Count to get the number of available trace */ + /* components. */ + /* */ + /* This function may be useful if you want to control FreeType 2's */ + /* debug level in your application. */ + /* */ + FT_BASE( const char * ) + FT_Trace_Get_Name( FT_Int idx ); + + + /*************************************************************************/ + /* */ + /* You need two opening and closing parentheses! */ + /* */ + /* Example: FT_TRACE0(( "Value is %i", foo )) */ + /* */ + /* Output of the FT_TRACEX macros is sent to stderr. */ + /* */ + /*************************************************************************/ + +#define FT_TRACE0( varformat ) FT_TRACE( 0, varformat ) +#define FT_TRACE1( varformat ) FT_TRACE( 1, varformat ) +#define FT_TRACE2( varformat ) FT_TRACE( 2, varformat ) +#define FT_TRACE3( varformat ) FT_TRACE( 3, varformat ) +#define FT_TRACE4( varformat ) FT_TRACE( 4, varformat ) +#define FT_TRACE5( varformat ) FT_TRACE( 5, varformat ) +#define FT_TRACE6( varformat ) FT_TRACE( 6, varformat ) +#define FT_TRACE7( varformat ) FT_TRACE( 7, varformat ) + + + /*************************************************************************/ + /* */ + /* Define the FT_ERROR macro. */ + /* */ + /* Output of this macro is sent to stderr. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define FT_ERROR( varformat ) FT_Message varformat + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +#define FT_ERROR( varformat ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /*************************************************************************/ + /* */ + /* Define the FT_ASSERT macro. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define FT_ASSERT( condition ) \ + do \ + { \ + if ( !( condition ) ) \ + FT_Panic( "assertion failed on line %d of file %s\n", \ + __LINE__, __FILE__ ); \ + } while ( 0 ) + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +#define FT_ASSERT( condition ) do { } while ( 0 ) + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /*************************************************************************/ + /* */ + /* Define `FT_Message' and `FT_Panic' when needed. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#include "stdio.h" /* for vfprintf() */ + + /* print a message */ + FT_BASE( void ) + FT_Message( const char* fmt, + ... ); + + /* print a message and exit */ + FT_BASE( void ) + FT_Panic( const char* fmt, + ... ); + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + FT_BASE( void ) + ft_debug_init( void ); + + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + + /* We disable the warning `conditional expression is constant' here */ + /* in order to compile cleanly with the maximum level of warnings. */ +#pragma warning( disable : 4127 ) + +#endif /* _MSC_VER */ + + +FT_END_HEADER + +#endif /* __FTDEBUG_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftdriver.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftdriver.h new file mode 100644 index 00000000..1d06997b --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/ftdriver.h @@ -0,0 +1,422 @@ +/***************************************************************************/ +/* */ +/* ftdriver.h */ +/* */ +/* FreeType font driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTDRIVER_H__ +#define __FTDRIVER_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + typedef FT_Error + (*FT_Face_InitFunc)( FT_Stream stream, + FT_Face face, + FT_Int typeface_index, + FT_Int num_params, + FT_Parameter* parameters ); + + typedef void + (*FT_Face_DoneFunc)( FT_Face face ); + + + typedef FT_Error + (*FT_Size_InitFunc)( FT_Size size ); + + typedef void + (*FT_Size_DoneFunc)( FT_Size size ); + + + typedef FT_Error + (*FT_Slot_InitFunc)( FT_GlyphSlot slot ); + + typedef void + (*FT_Slot_DoneFunc)( FT_GlyphSlot slot ); + + + typedef FT_Error + (*FT_Size_RequestFunc)( FT_Size size, + FT_Size_Request req ); + + typedef FT_Error + (*FT_Size_SelectFunc)( FT_Size size, + FT_ULong size_index ); + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + typedef FT_Error + (*FT_Size_ResetPointsFunc)( FT_Size size, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + typedef FT_Error + (*FT_Size_ResetPixelsFunc)( FT_Size size, + FT_UInt pixel_width, + FT_UInt pixel_height ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + typedef FT_Error + (*FT_Slot_LoadFunc)( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + typedef FT_UInt + (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap, + FT_Long charcode ); + + typedef FT_Long + (*FT_CharMap_CharNextFunc)( FT_CharMap charmap, + FT_Long charcode ); + + + typedef FT_Error + (*FT_Face_GetKerningFunc)( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ); + + + typedef FT_Error + (*FT_Face_AttachFunc)( FT_Face face, + FT_Stream stream ); + + + typedef FT_Error + (*FT_Face_GetAdvancesFunc)( FT_Face face, + FT_UInt first, + FT_UInt count, + FT_Int32 flags, + FT_Fixed* advances ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Driver_ClassRec */ + /* */ + /* <Description> */ + /* The font driver class. This structure mostly contains pointers to */ + /* driver methods. */ + /* */ + /* <Fields> */ + /* root :: The parent module. */ + /* */ + /* face_object_size :: The size of a face object in bytes. */ + /* */ + /* size_object_size :: The size of a size object in bytes. */ + /* */ + /* slot_object_size :: The size of a glyph object in bytes. */ + /* */ + /* init_face :: The format-specific face constructor. */ + /* */ + /* done_face :: The format-specific face destructor. */ + /* */ + /* init_size :: The format-specific size constructor. */ + /* */ + /* done_size :: The format-specific size destructor. */ + /* */ + /* init_slot :: The format-specific slot constructor. */ + /* */ + /* done_slot :: The format-specific slot destructor. */ + /* */ + /* */ + /* load_glyph :: A function handle to load a glyph to a slot. */ + /* This field is mandatory! */ + /* */ + /* get_kerning :: A function handle to return the unscaled */ + /* kerning for a given pair of glyphs. Can be */ + /* set to 0 if the format doesn't support */ + /* kerning. */ + /* */ + /* attach_file :: This function handle is used to read */ + /* additional data for a face from another */ + /* file/stream. For example, this can be used to */ + /* add data from AFM or PFM files on a Type 1 */ + /* face, or a CIDMap on a CID-keyed face. */ + /* */ + /* get_advances :: A function handle used to return advance */ + /* widths of `count' glyphs (in font units), */ + /* starting at `first'. The `vertical' flag must */ + /* be set to get vertical advance heights. The */ + /* `advances' buffer is caller-allocated. */ + /* Currently not implemented. The idea of this */ + /* function is to be able to perform */ + /* device-independent text layout without loading */ + /* a single glyph image. */ + /* */ + /* request_size :: A handle to a function used to request the new */ + /* character size. Can be set to 0 if the */ + /* scaling done in the base layer suffices. */ + /* */ + /* select_size :: A handle to a function used to select a new */ + /* fixed size. It is used only if */ + /* @FT_FACE_FLAG_FIXED_SIZES is set. Can be set */ + /* to 0 if the scaling done in the base layer */ + /* suffices. */ + /* <Note> */ + /* Most function pointers, with the exception of `load_glyph', can be */ + /* set to 0 to indicate a default behaviour. */ + /* */ + typedef struct FT_Driver_ClassRec_ + { + FT_Module_Class root; + + FT_Long face_object_size; + FT_Long size_object_size; + FT_Long slot_object_size; + + FT_Face_InitFunc init_face; + FT_Face_DoneFunc done_face; + + FT_Size_InitFunc init_size; + FT_Size_DoneFunc done_size; + + FT_Slot_InitFunc init_slot; + FT_Slot_DoneFunc done_slot; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_Size_ResetPointsFunc set_char_sizes; + FT_Size_ResetPixelsFunc set_pixel_sizes; + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_Slot_LoadFunc load_glyph; + + FT_Face_GetKerningFunc get_kerning; + FT_Face_AttachFunc attach_file; + FT_Face_GetAdvancesFunc get_advances; + + /* since version 2.2 */ + FT_Size_RequestFunc request_size; + FT_Size_SelectFunc select_size; + + } FT_Driver_ClassRec, *FT_Driver_Class; + + + /* + * The following functions are used as stubs for `set_char_sizes' and + * `set_pixel_sizes'; the code uses `request_size' and `select_size' + * functions instead. + * + * Implementation is in `src/base/ftobjs.c'. + */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE( FT_Error ) + ft_stub_set_char_sizes( FT_Size size, + FT_F26Dot6 width, + FT_F26Dot6 height, + FT_UInt horz_res, + FT_UInt vert_res ); + + FT_BASE( FT_Error ) + ft_stub_set_pixel_sizes( FT_Size size, + FT_UInt width, + FT_UInt height ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DECLARE_DRIVER */ + /* */ + /* <Description> */ + /* Used to create a forward declaration of a */ + /* FT_Driver_ClassRec stract instance. */ + /* */ + /* <Macro> */ + /* FT_DEFINE_DRIVER */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Driver_ClassRec struct. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ + /* to called with a pointer where the allocated stracture is returned.*/ + /* And when it is no longer needed a Destroy function needs */ + /* to be called to release that allocation. */ + /* fcinit.c (ft_create_default_module_classes) already contains */ + /* a mechanism to call these functions for the default modules */ + /* described in ftmodule.h */ + /* */ + /* Notice that the created Create and Destroy functions call */ + /* pic_init and pic_free function to allow you to manually allocate */ + /* and initialize any additional global data, like module specific */ + /* interface, and put them in the global pic container defined in */ + /* ftpic.h. if you don't need them just implement the functions as */ + /* empty to resolve the link error. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS +#define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) \ + a_, b_, +#else + #define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) +#endif + +#define FT_DECLARE_DRIVER(class_) \ + FT_CALLBACK_TABLE \ + const FT_Driver_ClassRec class_; + +#define FT_DEFINE_DRIVER(class_, \ + flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_, \ + face_object_size_, size_object_size_, \ + slot_object_size_, init_face_, done_face_, \ + init_size_, done_size_, init_slot_, done_slot_, \ + old_set_char_sizes_, old_set_pixel_sizes_, \ + load_glyph_, get_kerning_, attach_file_, \ + get_advances_, request_size_, select_size_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Driver_ClassRec class_ = \ + { \ + FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_,interface_, \ + init_,done_,get_interface_) \ + \ + face_object_size_, \ + size_object_size_, \ + slot_object_size_, \ + \ + init_face_, \ + done_face_, \ + \ + init_size_, \ + done_size_, \ + \ + init_slot_, \ + done_slot_, \ + \ + FT_DEFINE_DRIVERS_OLD_INTERNALS(old_set_char_sizes_, old_set_pixel_sizes_) \ + \ + load_glyph_, \ + \ + get_kerning_, \ + attach_file_, \ + get_advances_, \ + \ + request_size_, \ + select_size_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS +#define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) \ + clazz->set_char_sizes = a_; \ + clazz->set_pixel_sizes = b_; +#else + #define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) +#endif + +#define FT_DECLARE_DRIVER(class_) FT_DECLARE_MODULE(class_) + +#define FT_DEFINE_DRIVER(class_, \ + flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_, \ + face_object_size_, size_object_size_, \ + slot_object_size_, init_face_, done_face_, \ + init_size_, done_size_, init_slot_, done_slot_, \ + old_set_char_sizes_, old_set_pixel_sizes_, \ + load_glyph_, get_kerning_, attach_file_, \ + get_advances_, request_size_, select_size_ ) \ + void class_##_pic_free( FT_Library library ); \ + FT_Error class_##_pic_init( FT_Library library ); \ + \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_Module_Class* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + FT_Driver_Class dclazz = (FT_Driver_Class)clazz; \ + class_##_pic_free( library ); \ + if ( dclazz ) \ + FT_FREE( dclazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_Module_Class** output_class ) \ + { \ + FT_Driver_Class clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz) ) ) \ + return error; \ + \ + error = class_##_pic_init( library ); \ + if(error) \ + { \ + FT_FREE( clazz ); \ + return error; \ + } \ + \ + FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_,interface_, \ + init_,done_,get_interface_) \ + \ + clazz->face_object_size = face_object_size_; \ + clazz->size_object_size = size_object_size_; \ + clazz->slot_object_size = slot_object_size_; \ + \ + clazz->init_face = init_face_; \ + clazz->done_face = done_face_; \ + \ + clazz->init_size = init_size_; \ + clazz->done_size = done_size_; \ + \ + clazz->init_slot = init_slot_; \ + clazz->done_slot = done_slot_; \ + \ + FT_DEFINE_DRIVERS_OLD_INTERNALS(old_set_char_sizes_, old_set_pixel_sizes_) \ + \ + clazz->load_glyph = load_glyph_; \ + \ + clazz->get_kerning = get_kerning_; \ + clazz->attach_file = attach_file_; \ + clazz->get_advances = get_advances_; \ + \ + clazz->request_size = request_size_; \ + clazz->select_size = select_size_; \ + \ + *output_class = (FT_Module_Class*)clazz; \ + return FT_Err_Ok; \ + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + +FT_END_HEADER + +#endif /* __FTDRIVER_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftgloadr.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftgloadr.h new file mode 100644 index 00000000..ce4dc6c9 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/ftgloadr.h @@ -0,0 +1,168 @@ +/***************************************************************************/ +/* */ +/* ftgloadr.h */ +/* */ +/* The FreeType glyph loader (specification). */ +/* */ +/* Copyright 2002, 2003, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGLOADR_H__ +#define __FTGLOADR_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphLoader */ + /* */ + /* <Description> */ + /* The glyph loader is an internal object used to load several glyphs */ + /* together (for example, in the case of composites). */ + /* */ + /* <Note> */ + /* The glyph loader implementation is not part of the high-level API, */ + /* hence the forward structure declaration. */ + /* */ + typedef struct FT_GlyphLoaderRec_* FT_GlyphLoader ; + + +#if 0 /* moved to freetype.h in version 2.2 */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 +#endif + + + typedef struct FT_SubGlyphRec_ + { + FT_Int index; + FT_UShort flags; + FT_Int arg1; + FT_Int arg2; + FT_Matrix transform; + + } FT_SubGlyphRec; + + + typedef struct FT_GlyphLoadRec_ + { + FT_Outline outline; /* outline */ + FT_Vector* extra_points; /* extra points table */ + FT_Vector* extra_points2; /* second extra points table */ + FT_UInt num_subglyphs; /* number of subglyphs */ + FT_SubGlyph subglyphs; /* subglyphs */ + + } FT_GlyphLoadRec, *FT_GlyphLoad; + + + typedef struct FT_GlyphLoaderRec_ + { + FT_Memory memory; + FT_UInt max_points; + FT_UInt max_contours; + FT_UInt max_subglyphs; + FT_Bool use_extra; + + FT_GlyphLoadRec base; + FT_GlyphLoadRec current; + + void* other; /* for possible future extension? */ + + } FT_GlyphLoaderRec; + + + /* create new empty glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader *aloader ); + + /* add an extra points table to a glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ); + + /* destroy a glyph loader */ + FT_BASE( void ) + FT_GlyphLoader_Done( FT_GlyphLoader loader ); + + /* reset a glyph loader (frees everything int it) */ + FT_BASE( void ) + FT_GlyphLoader_Reset( FT_GlyphLoader loader ); + + /* rewind a glyph loader */ + FT_BASE( void ) + FT_GlyphLoader_Rewind( FT_GlyphLoader loader ); + + /* check that there is enough space to add `n_points' and `n_contours' */ + /* to the glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, + FT_UInt n_points, + FT_UInt n_contours ); + + +#define FT_GLYPHLOADER_CHECK_P( _loader, _count ) \ + ( (_count) == 0 || ((_loader)->base.outline.n_points + \ + (_loader)->current.outline.n_points + \ + (unsigned long)(_count)) <= (_loader)->max_points ) + +#define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \ + ( (_count) == 0 || ((_loader)->base.outline.n_contours + \ + (_loader)->current.outline.n_contours + \ + (unsigned long)(_count)) <= (_loader)->max_contours ) + +#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours ) \ + ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points ) && \ + FT_GLYPHLOADER_CHECK_C( _loader, _contours ) ) \ + ? 0 \ + : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) ) + + + /* check that there is enough space to add `n_subs' sub-glyphs to */ + /* a glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, + FT_UInt n_subs ); + + /* prepare a glyph loader, i.e. empty the current glyph */ + FT_BASE( void ) + FT_GlyphLoader_Prepare( FT_GlyphLoader loader ); + + /* add the current glyph to the base glyph */ + FT_BASE( void ) + FT_GlyphLoader_Add( FT_GlyphLoader loader ); + + /* copy points from one glyph loader to another */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, + FT_GlyphLoader source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTGLOADR_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftmemory.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftmemory.h new file mode 100644 index 00000000..026aa63e --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/ftmemory.h @@ -0,0 +1,380 @@ +/***************************************************************************/ +/* */ +/* ftmemory.h */ +/* */ +/* The FreeType memory management macros (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMEMORY_H__ +#define __FTMEMORY_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_SET_ERROR */ + /* */ + /* <Description> */ + /* This macro is used to set an implicit `error' variable to a given */ + /* expression's value (usually a function call), and convert it to a */ + /* boolean which is set whenever the value is != 0. */ + /* */ +#undef FT_SET_ERROR +#define FT_SET_ERROR( expression ) \ + ( ( error = (expression) ) != 0 ) + + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M E M O R Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* + * C++ refuses to handle statements like p = (void*)anything, with `p' a + * typed pointer. Since we don't have a `typeof' operator in standard + * C++, we have to use a template to emulate it. + */ + +#ifdef __cplusplus + + extern "C++" + template <typename T> inline T* + cplusplus_typeof( T*, + void *v ) + { + return static_cast <T*> ( v ); + } + +#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) ) + +#else + +#define FT_ASSIGNP( p, val ) (p) = (val) + +#endif + + + +#ifdef FT_DEBUG_MEMORY + + FT_BASE( const char* ) _ft_debug_file; + FT_BASE( long ) _ft_debug_lineno; + +#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \ + _ft_debug_lineno = __LINE__, \ + (exp) ) + +#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \ + _ft_debug_lineno = __LINE__, \ + FT_ASSIGNP( p, exp ) ) + +#else /* !FT_DEBUG_MEMORY */ + +#define FT_DEBUG_INNER( exp ) (exp) +#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp ) + +#endif /* !FT_DEBUG_MEMORY */ + + + /* + * The allocation functions return a pointer, and the error code + * is written to through the `p_error' parameter. See below for + * for documentation. + */ + + FT_BASE( FT_Pointer ) + ft_mem_alloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_qalloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_realloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_qrealloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ); + + FT_BASE( void ) + ft_mem_free( FT_Memory memory, + const void* P ); + + +#define FT_MEM_ALLOC( ptr, size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) ) + +#define FT_MEM_FREE( ptr ) \ + FT_BEGIN_STMNT \ + ft_mem_free( memory, (ptr) ); \ + (ptr) = NULL; \ + FT_END_STMNT + +#define FT_MEM_NEW( ptr ) \ + FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) ) + +#define FT_MEM_REALLOC( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, 1, \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_QALLOC( ptr, size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, (size), &error ) ) + +#define FT_MEM_QNEW( ptr ) \ + FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) ) + +#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, 1, \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (item_size), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (itmsz), \ + (oldcnt), (newcnt), \ + (ptr), &error ) ) + +#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (item_size), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (itmsz), \ + (oldcnt), (newcnt), \ + (ptr), &error ) ) + + +#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 ) + + +#define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count ) + +#define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count ) + +#define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count ) + + +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) + +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) + + +#define FT_ARRAY_ZERO( dest, count ) \ + FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) ) + +#define FT_ARRAY_COPY( dest, source, count ) \ + FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) ) + +#define FT_ARRAY_MOVE( dest, source, count ) \ + FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) ) + + + /* + * Return the maximum number of addressable elements in an array. + * We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid + * any problems. + */ +#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) ) + +#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) ) + + + /*************************************************************************/ + /* */ + /* The following functions macros expect that their pointer argument is */ + /* _typed_ in order to automatically compute array element sizes. */ + /* */ + +#define FT_MEM_NEW_ARRAY( ptr, count ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_QNEW_ARRAY( ptr, count ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ + (cursz), (newsz), \ + (ptr), &error ) ) + + +#define FT_ALLOC( ptr, size ) \ + FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) ) + +#define FT_REALLOC( ptr, cursz, newsz ) \ + FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) ) + +#define FT_ALLOC_MULT( ptr, count, item_size ) \ + FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) ) + +#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \ + newcnt, itmsz ) ) + +#define FT_QALLOC( ptr, size ) \ + FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) ) + +#define FT_QREALLOC( ptr, cursz, newsz ) \ + FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) ) + +#define FT_QALLOC_MULT( ptr, count, item_size ) \ + FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) ) + +#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \ + newcnt, itmsz ) ) + +#define FT_FREE( ptr ) FT_MEM_FREE( ptr ) + +#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) ) + +#define FT_NEW_ARRAY( ptr, count ) \ + FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) + +#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \ + FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) + +#define FT_QNEW( ptr ) \ + FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) ) + +#define FT_QNEW_ARRAY( ptr, count ) \ + FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) + +#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \ + FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE( FT_Error ) + FT_Alloc( FT_Memory memory, + FT_Long size, + void* *P ); + + FT_BASE( FT_Error ) + FT_QAlloc( FT_Memory memory, + FT_Long size, + void* *p ); + + FT_BASE( FT_Error ) + FT_Realloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *P ); + + FT_BASE( FT_Error ) + FT_QRealloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *p ); + + FT_BASE( void ) + FT_Free( FT_Memory memory, + void* *P ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + FT_BASE( FT_Pointer ) + ft_mem_strdup( FT_Memory memory, + const char* str, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_dup( FT_Memory memory, + const void* address, + FT_ULong size, + FT_Error *p_error ); + +#define FT_MEM_STRDUP( dst, str ) \ + (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error ) + +#define FT_STRDUP( dst, str ) \ + FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) ) + +#define FT_MEM_DUP( dst, address, size ) \ + (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error ) + +#define FT_DUP( dst, address, size ) \ + FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) ) + + + /* Return >= 1 if a truncation occurs. */ + /* Return 0 if the source string fits the buffer. */ + /* This is *not* the same as strlcpy(). */ + FT_BASE( FT_Int ) + ft_mem_strcpyn( char* dst, + const char* src, + FT_ULong size ); + +#define FT_STRCPYN( dst, src, size ) \ + ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) ) + + /* */ + + +FT_END_HEADER + +#endif /* __FTMEMORY_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftobjs.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftobjs.h new file mode 100644 index 00000000..670eb78a --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/ftobjs.h @@ -0,0 +1,1428 @@ +/***************************************************************************/ +/* */ +/* ftobjs.h */ +/* */ +/* The FreeType private base classes (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file contains the definition of all internal FreeType classes. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTOBJS_H__ +#define __FTOBJS_H__ + +#include <ft2build.h> +#include FT_RENDER_H +#include FT_SIZES_H +#include FT_LCD_FILTER_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_GLYPH_LOADER_H +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_AUTOHINT_H +#include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_PIC_H + +#ifdef FT_CONFIG_OPTION_INCREMENTAL +#include FT_INCREMENTAL_H +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* Some generic definitions. */ + /* */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void*)0 +#endif + + + /*************************************************************************/ + /* */ + /* The min and max functions missing in C. As usual, be careful not to */ + /* write things like FT_MIN( a++, b++ ) to avoid side effects. */ + /* */ +#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) +#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) + +#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) + + +#define FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) ) +#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + ((n)/2), n ) +#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + ((n)-1), n ) + +#define FT_PIX_FLOOR( x ) ( (x) & ~63 ) +#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 ) +#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) + + + /* + * Return the highest power of 2 that is <= value; this correspond to + * the highest bit in a given 32-bit value. + */ + FT_BASE( FT_UInt32 ) + ft_highpow2( FT_UInt32 value ); + + + /* + * character classification functions -- since these are used to parse + * font files, we must not use those in <ctypes.h> which are + * locale-dependent + */ +#define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U ) + +#define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \ + ( (unsigned)(x) - 'a' ) < 6U || \ + ( (unsigned)(x) - 'A' ) < 6U ) + + /* the next two macros assume ASCII representation */ +#define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U ) +#define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U ) + +#define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) ) +#define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C H A R M A P S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to internal charmap object */ + typedef struct FT_CMapRec_* FT_CMap; + + /* handle to charmap class structure */ + typedef const struct FT_CMap_ClassRec_* FT_CMap_Class; + + /* internal charmap object structure */ + typedef struct FT_CMapRec_ + { + FT_CharMapRec charmap; + FT_CMap_Class clazz; + + } FT_CMapRec; + + /* typecase any pointer to a charmap handle */ +#define FT_CMAP( x ) ((FT_CMap)( x )) + + /* obvious macros */ +#define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id +#define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id +#define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding +#define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face + + + /* class method definitions */ + typedef FT_Error + (*FT_CMap_InitFunc)( FT_CMap cmap, + FT_Pointer init_data ); + + typedef void + (*FT_CMap_DoneFunc)( FT_CMap cmap ); + + typedef FT_UInt + (*FT_CMap_CharIndexFunc)( FT_CMap cmap, + FT_UInt32 char_code ); + + typedef FT_UInt + (*FT_CMap_CharNextFunc)( FT_CMap cmap, + FT_UInt32 *achar_code ); + + typedef FT_UInt + (*FT_CMap_CharVarIndexFunc)( FT_CMap cmap, + FT_CMap unicode_cmap, + FT_UInt32 char_code, + FT_UInt32 variant_selector ); + + typedef FT_Bool + (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap cmap, + FT_UInt32 char_code, + FT_UInt32 variant_selector ); + + typedef FT_UInt32 * + (*FT_CMap_VariantListFunc)( FT_CMap cmap, + FT_Memory mem ); + + typedef FT_UInt32 * + (*FT_CMap_CharVariantListFunc)( FT_CMap cmap, + FT_Memory mem, + FT_UInt32 char_code ); + + typedef FT_UInt32 * + (*FT_CMap_VariantCharListFunc)( FT_CMap cmap, + FT_Memory mem, + FT_UInt32 variant_selector ); + + + typedef struct FT_CMap_ClassRec_ + { + FT_ULong size; + FT_CMap_InitFunc init; + FT_CMap_DoneFunc done; + FT_CMap_CharIndexFunc char_index; + FT_CMap_CharNextFunc char_next; + + /* Subsequent entries are special ones for format 14 -- the variant */ + /* selector subtable which behaves like no other */ + + FT_CMap_CharVarIndexFunc char_var_index; + FT_CMap_CharVarIsDefaultFunc char_var_default; + FT_CMap_VariantListFunc variant_list; + FT_CMap_CharVariantListFunc charvariant_list; + FT_CMap_VariantCharListFunc variantchar_list; + + } FT_CMap_ClassRec; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DECLARE_CMAP_CLASS(class_) \ + FT_CALLBACK_TABLE const FT_CMap_ClassRec class_; + +#define FT_DEFINE_CMAP_CLASS(class_, size_, init_, done_, char_index_, \ + char_next_, char_var_index_, char_var_default_, variant_list_, \ + charvariant_list_, variantchar_list_) \ + FT_CALLBACK_TABLE_DEF \ + const FT_CMap_ClassRec class_ = \ + { \ + size_, init_, done_, char_index_, char_next_, char_var_index_, \ + char_var_default_, variant_list_, charvariant_list_, variantchar_list_ \ + }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DECLARE_CMAP_CLASS(class_) \ + void FT_Init_Class_##class_( FT_Library library, FT_CMap_ClassRec* clazz); + +#define FT_DEFINE_CMAP_CLASS(class_, size_, init_, done_, char_index_, \ + char_next_, char_var_index_, char_var_default_, variant_list_, \ + charvariant_list_, variantchar_list_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_CMap_ClassRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->size = size_; \ + clazz->init = init_; \ + clazz->done = done_; \ + clazz->char_index = char_index_; \ + clazz->char_next = char_next_; \ + clazz->char_var_index = char_var_index_; \ + clazz->char_var_default = char_var_default_; \ + clazz->variant_list = variant_list_; \ + clazz->charvariant_list = charvariant_list_; \ + clazz->variantchar_list = variantchar_list_; \ + } +#endif /* FT_CONFIG_OPTION_PIC */ + + /* create a new charmap and add it to charmap->face */ + FT_BASE( FT_Error ) + FT_CMap_New( FT_CMap_Class clazz, + FT_Pointer init_data, + FT_CharMap charmap, + FT_CMap *acmap ); + + /* destroy a charmap and remove it from face's list */ + FT_BASE( void ) + FT_CMap_Done( FT_CMap cmap ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Face_InternalRec */ + /* */ + /* <Description> */ + /* This structure contains the internal fields of each FT_Face */ + /* object. These fields may change between different releases of */ + /* FreeType. */ + /* */ + /* <Fields> */ + /* max_points :: */ + /* The maximal number of points used to store the vectorial outline */ + /* of any glyph in this face. If this value cannot be known in */ + /* advance, or if the face isn't scalable, this should be set to 0. */ + /* Only relevant for scalable formats. */ + /* */ + /* max_contours :: */ + /* The maximal number of contours used to store the vectorial */ + /* outline of any glyph in this face. If this value cannot be */ + /* known in advance, or if the face isn't scalable, this should be */ + /* set to 0. Only relevant for scalable formats. */ + /* */ + /* transform_matrix :: */ + /* A 2x2 matrix of 16.16 coefficients used to transform glyph */ + /* outlines after they are loaded from the font. Only used by the */ + /* convenience functions. */ + /* */ + /* transform_delta :: */ + /* A translation vector used to transform glyph outlines after they */ + /* are loaded from the font. Only used by the convenience */ + /* functions. */ + /* */ + /* transform_flags :: */ + /* Some flags used to classify the transform. Only used by the */ + /* convenience functions. */ + /* */ + /* services :: */ + /* A cache for frequently used services. It should be only */ + /* accessed with the macro `FT_FACE_LOOKUP_SERVICE'. */ + /* */ + /* incremental_interface :: */ + /* If non-null, the interface through which glyph data and metrics */ + /* are loaded incrementally for faces that do not provide all of */ + /* this data when first opened. This field exists only if */ + /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ + /* */ + /* ignore_unpatented_hinter :: */ + /* This boolean flag instructs the glyph loader to ignore the */ + /* native font hinter, if one is found. This is exclusively used */ + /* in the case when the unpatented hinter is compiled within the */ + /* library. */ + /* */ + /* refcount :: */ + /* A counter initialized to~1 at the time an @FT_Face structure is */ + /* created. @FT_Reference_Face increments this counter, and */ + /* @FT_Done_Face only destroys a face if the counter is~1, */ + /* otherwise it simply decrements it. */ + /* */ + typedef struct FT_Face_InternalRec_ + { +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_UShort reserved1; + FT_Short reserved2; +#endif + FT_Matrix transform_matrix; + FT_Vector transform_delta; + FT_Int transform_flags; + + FT_ServiceCacheRec services; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Incremental_InterfaceRec* incremental_interface; +#endif + + FT_Bool ignore_unpatented_hinter; + FT_UInt refcount; + + } FT_Face_InternalRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Slot_InternalRec */ + /* */ + /* <Description> */ + /* This structure contains the internal fields of each FT_GlyphSlot */ + /* object. These fields may change between different releases of */ + /* FreeType. */ + /* */ + /* <Fields> */ + /* loader :: The glyph loader object used to load outlines */ + /* into the glyph slot. */ + /* */ + /* flags :: Possible values are zero or */ + /* FT_GLYPH_OWN_BITMAP. The latter indicates */ + /* that the FT_GlyphSlot structure owns the */ + /* bitmap buffer. */ + /* */ + /* glyph_transformed :: Boolean. Set to TRUE when the loaded glyph */ + /* must be transformed through a specific */ + /* font transformation. This is _not_ the same */ + /* as the face transform set through */ + /* FT_Set_Transform(). */ + /* */ + /* glyph_matrix :: The 2x2 matrix corresponding to the glyph */ + /* transformation, if necessary. */ + /* */ + /* glyph_delta :: The 2d translation vector corresponding to */ + /* the glyph transformation, if necessary. */ + /* */ + /* glyph_hints :: Format-specific glyph hints management. */ + /* */ + +#define FT_GLYPH_OWN_BITMAP 0x1 + + typedef struct FT_Slot_InternalRec_ + { + FT_GlyphLoader loader; + FT_UInt flags; + FT_Bool glyph_transformed; + FT_Matrix glyph_matrix; + FT_Vector glyph_delta; + void* glyph_hints; + + } FT_GlyphSlot_InternalRec; + + +#if 0 + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_InternalRec */ + /* */ + /* <Description> */ + /* This structure contains the internal fields of each FT_Size */ + /* object. Currently, it's empty. */ + /* */ + /*************************************************************************/ + + typedef struct FT_Size_InternalRec_ + { + /* empty */ + + } FT_Size_InternalRec; + +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M O D U L E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ModuleRec */ + /* */ + /* <Description> */ + /* A module object instance. */ + /* */ + /* <Fields> */ + /* clazz :: A pointer to the module's class. */ + /* */ + /* library :: A handle to the parent library object. */ + /* */ + /* memory :: A handle to the memory manager. */ + /* */ + /* generic :: A generic structure for user-level extensibility (?). */ + /* */ + typedef struct FT_ModuleRec_ + { + FT_Module_Class* clazz; + FT_Library library; + FT_Memory memory; + FT_Generic generic; + + } FT_ModuleRec; + + + /* typecast an object to a FT_Module */ +#define FT_MODULE( x ) ((FT_Module)( x )) +#define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz +#define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library +#define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory + + +#define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_FONT_DRIVER ) + +#define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_RENDERER ) + +#define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_HINTER ) + +#define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_STYLER ) + +#define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_SCALABLE ) + +#define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_NO_OUTLINES ) + +#define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_HAS_HINTER ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Module_Interface */ + /* */ + /* <Description> */ + /* Finds a module and returns its specific interface as a typeless */ + /* pointer. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* <Return> */ + /* A module-specific interface if available, 0 otherwise. */ + /* */ + /* <Note> */ + /* You should better be familiar with FreeType internals to know */ + /* which module to look for, and what its interface is :-) */ + /* */ + FT_BASE( const void* ) + FT_Get_Module_Interface( FT_Library library, + const char* mod_name ); + + FT_BASE( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id ); + + /* */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* a few macros used to perform easy typecasts with minimal brain damage */ + +#define FT_FACE( x ) ((FT_Face)(x)) +#define FT_SIZE( x ) ((FT_Size)(x)) +#define FT_SLOT( x ) ((FT_GlyphSlot)(x)) + +#define FT_FACE_DRIVER( x ) FT_FACE( x )->driver +#define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library +#define FT_FACE_MEMORY( x ) FT_FACE( x )->memory +#define FT_FACE_STREAM( x ) FT_FACE( x )->stream + +#define FT_SIZE_FACE( x ) FT_SIZE( x )->face +#define FT_SLOT_FACE( x ) FT_SLOT( x )->face + +#define FT_FACE_SLOT( x ) FT_FACE( x )->glyph +#define FT_FACE_SIZE( x ) FT_FACE( x )->size + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_GlyphSlot */ + /* */ + /* <Description> */ + /* It is sometimes useful to have more than one glyph slot for a */ + /* given face object. This function is used to create additional */ + /* slots. All of them are automatically discarded when the face is */ + /* destroyed. */ + /* */ + /* <Input> */ + /* face :: A handle to a parent face object. */ + /* */ + /* <Output> */ + /* aslot :: A handle to a new glyph slot object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_BASE( FT_Error ) + FT_New_GlyphSlot( FT_Face face, + FT_GlyphSlot *aslot ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_GlyphSlot */ + /* */ + /* <Description> */ + /* Destroys a given glyph slot. Remember however that all slots are */ + /* automatically destroyed with its parent. Using this function is */ + /* not always mandatory. */ + /* */ + /* <Input> */ + /* slot :: A handle to a target glyph slot. */ + /* */ + FT_BASE( void ) + FT_Done_GlyphSlot( FT_GlyphSlot slot ); + + /* */ + +#define FT_REQUEST_WIDTH( req ) \ + ( (req)->horiResolution \ + ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \ + : (req)->width ) + +#define FT_REQUEST_HEIGHT( req ) \ + ( (req)->vertResolution \ + ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \ + : (req)->height ) + + + /* Set the metrics according to a bitmap strike. */ + FT_BASE( void ) + FT_Select_Metrics( FT_Face face, + FT_ULong strike_index ); + + + /* Set the metrics according to a size request. */ + FT_BASE( void ) + FT_Request_Metrics( FT_Face face, + FT_Size_Request req ); + + + /* Match a size request against `available_sizes'. */ + FT_BASE( FT_Error ) + FT_Match_Size( FT_Face face, + FT_Size_Request req, + FT_Bool ignore_width, + FT_ULong* size_index ); + + + /* Use the horizontal metrics to synthesize the vertical metrics. */ + /* If `advance' is zero, it is also synthesized. */ + FT_BASE( void ) + ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, + FT_Pos advance ); + + + /* Free the bitmap of a given glyphslot when needed (i.e., only when it */ + /* was allocated with ft_glyphslot_alloc_bitmap). */ + FT_BASE( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ); + + + /* Allocate a new bitmap buffer in a glyph slot. */ + FT_BASE( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ); + + + /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */ + /* will not be freed by a later call to ft_glyphslot_free_bitmap. */ + FT_BASE( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Byte* buffer ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** R E N D E R E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define FT_RENDERER( x ) ((FT_Renderer)( x )) +#define FT_GLYPH( x ) ((FT_Glyph)( x )) +#define FT_BITMAP_GLYPH( x ) ((FT_BitmapGlyph)( x )) +#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x )) + + + typedef struct FT_RendererRec_ + { + FT_ModuleRec root; + FT_Renderer_Class* clazz; + FT_Glyph_Format glyph_format; + FT_Glyph_Class glyph_class; + + FT_Raster raster; + FT_Raster_Render_Func raster_render; + FT_Renderer_RenderFunc render; + + } FT_RendererRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F O N T D R I V E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* typecast a module into a driver easily */ +#define FT_DRIVER( x ) ((FT_Driver)(x)) + + /* typecast a module as a driver, and get its driver class */ +#define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_DriverRec */ + /* */ + /* <Description> */ + /* The root font driver class. A font driver is responsible for */ + /* managing and loading font files of a given format. */ + /* */ + /* <Fields> */ + /* root :: Contains the fields of the root module class. */ + /* */ + /* clazz :: A pointer to the font driver's class. Note that */ + /* this is NOT root.clazz. `class' wasn't used */ + /* as it is a reserved word in C++. */ + /* */ + /* faces_list :: The list of faces currently opened by this */ + /* driver. */ + /* */ + /* extensions :: A typeless pointer to the driver's extensions */ + /* registry, if they are supported through the */ + /* configuration macro FT_CONFIG_OPTION_EXTENSIONS. */ + /* */ + /* glyph_loader :: The glyph loader for all faces managed by this */ + /* driver. This object isn't defined for unscalable */ + /* formats. */ + /* */ + typedef struct FT_DriverRec_ + { + FT_ModuleRec root; + FT_Driver_Class clazz; + + FT_ListRec faces_list; + void* extensions; + + FT_GlyphLoader glyph_loader; + + } FT_DriverRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** L I B R A R I E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* This hook is used by the TrueType debugger. It must be set to an */ + /* alternate truetype bytecode interpreter function. */ +#define FT_DEBUG_HOOK_TRUETYPE 0 + + + /* Set this debug hook to a non-null pointer to force unpatented hinting */ + /* for all faces when both TT_USE_BYTECODE_INTERPRETER and */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined. This is only used */ + /* during debugging. */ +#define FT_DEBUG_HOOK_UNPATENTED_HINTING 1 + + + typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap, + FT_Render_Mode render_mode, + FT_Library library ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_LibraryRec */ + /* */ + /* <Description> */ + /* The FreeType library class. This is the root of all FreeType */ + /* data. Use FT_New_Library() to create a library object, and */ + /* FT_Done_Library() to discard it and all child objects. */ + /* */ + /* <Fields> */ + /* memory :: The library's memory object. Manages memory */ + /* allocation. */ + /* */ + /* generic :: Client data variable. Used to extend the */ + /* Library class by higher levels and clients. */ + /* */ + /* version_major :: The major version number of the library. */ + /* */ + /* version_minor :: The minor version number of the library. */ + /* */ + /* version_patch :: The current patch level of the library. */ + /* */ + /* num_modules :: The number of modules currently registered */ + /* within this library. This is set to 0 for new */ + /* libraries. New modules are added through the */ + /* FT_Add_Module() API function. */ + /* */ + /* modules :: A table used to store handles to the currently */ + /* registered modules. Note that each font driver */ + /* contains a list of its opened faces. */ + /* */ + /* renderers :: The list of renderers currently registered */ + /* within the library. */ + /* */ + /* cur_renderer :: The current outline renderer. This is a */ + /* shortcut used to avoid parsing the list on */ + /* each call to FT_Outline_Render(). It is a */ + /* handle to the current renderer for the */ + /* FT_GLYPH_FORMAT_OUTLINE format. */ + /* */ + /* auto_hinter :: XXX */ + /* */ + /* raster_pool :: The raster object's render pool. This can */ + /* ideally be changed dynamically at run-time. */ + /* */ + /* raster_pool_size :: The size of the render pool in bytes. */ + /* */ + /* debug_hooks :: XXX */ + /* */ + /* lcd_filter :: If subpixel rendering is activated, the */ + /* selected LCD filter mode. */ + /* */ + /* lcd_extra :: If subpixel rendering is activated, the number */ + /* of extra pixels needed for the LCD filter. */ + /* */ + /* lcd_weights :: If subpixel rendering is activated, the LCD */ + /* filter weights, if any. */ + /* */ + /* lcd_filter_func :: If subpixel rendering is activated, the LCD */ + /* filtering callback function. */ + /* */ + /* pic_container :: Contains global structs and tables, instead */ + /* of defining them globallly. */ + /* */ + /* refcount :: A counter initialized to~1 at the time an */ + /* @FT_Library structure is created. */ + /* @FT_Reference_Library increments this counter, */ + /* and @FT_Done_Library only destroys a library */ + /* if the counter is~1, otherwise it simply */ + /* decrements it. */ + /* */ + typedef struct FT_LibraryRec_ + { + FT_Memory memory; /* library's memory manager */ + + FT_Generic generic; + + FT_Int version_major; + FT_Int version_minor; + FT_Int version_patch; + + FT_UInt num_modules; + FT_Module modules[FT_MAX_MODULES]; /* module objects */ + + FT_ListRec renderers; /* list of renderers */ + FT_Renderer cur_renderer; /* current outline renderer */ + FT_Module auto_hinter; + + FT_Byte* raster_pool; /* scan-line conversion */ + /* render pool */ + FT_ULong raster_pool_size; /* size of render pool in bytes */ + + FT_DebugHook_Func debug_hooks[4]; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + FT_LcdFilter lcd_filter; + FT_Int lcd_extra; /* number of extra pixels */ + FT_Byte lcd_weights[7]; /* filter weights, if any */ + FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ +#endif + +#ifdef FT_CONFIG_OPTION_PIC + FT_PIC_Container pic_container; +#endif + + FT_UInt refcount; + + } FT_LibraryRec; + + + FT_BASE( FT_Renderer ) + FT_Lookup_Renderer( FT_Library library, + FT_Glyph_Format format, + FT_ListNode* node ); + + FT_BASE( FT_Error ) + FT_Render_Glyph_Internal( FT_Library library, + FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + typedef const char* + (*FT_Face_GetPostscriptNameFunc)( FT_Face face ); + + typedef FT_Error + (*FT_Face_GetGlyphNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, + FT_String* glyph_name ); + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Memory */ + /* */ + /* <Description> */ + /* Creates a new memory object. */ + /* */ + /* <Return> */ + /* A pointer to the new memory object. 0 in case of error. */ + /* */ + FT_BASE( FT_Memory ) + FT_New_Memory( void ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Memory */ + /* */ + /* <Description> */ + /* Discards memory manager. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory manager. */ + /* */ + FT_BASE( void ) + FT_Done_Memory( FT_Memory memory ); + +#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + + + /* Define default raster's interface. The default raster is located in */ + /* `src/base/ftraster.c'. */ + /* */ + /* Client applications can register new rasters through the */ + /* FT_Set_Raster() API. */ + +#ifndef FT_NO_DEFAULT_RASTER + FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster; +#endif + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** PIC-Support Macros for ftimage.h ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DEFINE_OUTLINE_FUNCS */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Outline_Funcs struct. */ + /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ + /* called with a pre-allocated stracture to be filled. */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_OUTLINE_FUNCS(class_, move_to_, line_to_, conic_to_, \ + cubic_to_, shift_, delta_) \ + static const FT_Outline_Funcs class_ = \ + { \ + move_to_, line_to_, conic_to_, cubic_to_, shift_, delta_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_OUTLINE_FUNCS(class_, move_to_, line_to_, conic_to_, \ + cubic_to_, shift_, delta_) \ + static FT_Error \ + Init_Class_##class_( FT_Outline_Funcs* clazz ) \ + { \ + clazz->move_to = move_to_; \ + clazz->line_to = line_to_; \ + clazz->conic_to = conic_to_; \ + clazz->cubic_to = cubic_to_; \ + clazz->shift = shift_; \ + clazz->delta = delta_; \ + return FT_Err_Ok; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DEFINE_RASTER_FUNCS */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Raster_Funcs struct. */ + /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ + /* called with a pre-allocated stracture to be filled. */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_RASTER_FUNCS(class_, glyph_format_, raster_new_, \ + raster_reset_, raster_set_mode_, \ + raster_render_, raster_done_) \ + const FT_Raster_Funcs class_ = \ + { \ + glyph_format_, raster_new_, raster_reset_, \ + raster_set_mode_, raster_render_, raster_done_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_RASTER_FUNCS(class_, glyph_format_, raster_new_, \ + raster_reset_, raster_set_mode_, raster_render_, raster_done_) \ + void \ + FT_Init_Class_##class_( FT_Raster_Funcs* clazz ) \ + { \ + clazz->glyph_format = glyph_format_; \ + clazz->raster_new = raster_new_; \ + clazz->raster_reset = raster_reset_; \ + clazz->raster_set_mode = raster_set_mode_; \ + clazz->raster_render = raster_render_; \ + clazz->raster_done = raster_done_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** PIC-Support Macros for ftrender.h ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DEFINE_GLYPH */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Glyph_Class struct. */ + /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ + /* called with a pre-allocated stracture to be filled. */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_GLYPH(class_, size_, format_, init_, done_, copy_, \ + transform_, bbox_, prepare_) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Glyph_Class class_ = \ + { \ + size_, format_, init_, done_, copy_, transform_, bbox_, prepare_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_GLYPH(class_, size_, format_, init_, done_, copy_, \ + transform_, bbox_, prepare_) \ + void \ + FT_Init_Class_##class_( FT_Glyph_Class* clazz ) \ + { \ + clazz->glyph_size = size_; \ + clazz->glyph_format = format_; \ + clazz->glyph_init = init_; \ + clazz->glyph_done = done_; \ + clazz->glyph_copy = copy_; \ + clazz->glyph_transform = transform_; \ + clazz->glyph_bbox = bbox_; \ + clazz->glyph_prepare = prepare_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DECLARE_RENDERER */ + /* */ + /* <Description> */ + /* Used to create a forward declaration of a */ + /* FT_Renderer_Class stract instance. */ + /* */ + /* <Macro> */ + /* FT_DEFINE_RENDERER */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Renderer_Class struct. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ + /* to called with a pointer where the allocated stracture is returned.*/ + /* And when it is no longer needed a Destroy function needs */ + /* to be called to release that allocation. */ + /* fcinit.c (ft_create_default_module_classes) already contains */ + /* a mechanism to call these functions for the default modules */ + /* described in ftmodule.h */ + /* */ + /* Notice that the created Create and Destroy functions call */ + /* pic_init and pic_free function to allow you to manually allocate */ + /* and initialize any additional global data, like module specific */ + /* interface, and put them in the global pic container defined in */ + /* ftpic.h. if you don't need them just implement the functions as */ + /* empty to resolve the link error. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DECLARE_RENDERER(class_) \ + FT_EXPORT_VAR( const FT_Renderer_Class ) class_; + +#define FT_DEFINE_RENDERER(class_, \ + flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_, \ + glyph_format_, render_glyph_, transform_glyph_, \ + get_glyph_cbox_, set_mode_, raster_class_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Renderer_Class class_ = \ + { \ + FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_, \ + interface_,init_,done_,get_interface_) \ + glyph_format_, \ + \ + render_glyph_, \ + transform_glyph_, \ + get_glyph_cbox_, \ + set_mode_, \ + \ + raster_class_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DECLARE_RENDERER(class_) FT_DECLARE_MODULE(class_) + +#define FT_DEFINE_RENDERER(class_, \ + flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_, \ + glyph_format_, render_glyph_, transform_glyph_, \ + get_glyph_cbox_, set_mode_, raster_class_ ) \ + void class_##_pic_free( FT_Library library ); \ + FT_Error class_##_pic_init( FT_Library library ); \ + \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_Module_Class* clazz ) \ + { \ + FT_Renderer_Class* rclazz = (FT_Renderer_Class*)clazz; \ + FT_Memory memory = library->memory; \ + class_##_pic_free( library ); \ + if ( rclazz ) \ + FT_FREE( rclazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_Module_Class** output_class ) \ + { \ + FT_Renderer_Class* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz) ) ) \ + return error; \ + \ + error = class_##_pic_init( library ); \ + if(error) \ + { \ + FT_FREE( clazz ); \ + return error; \ + } \ + \ + FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_, \ + interface_,init_,done_,get_interface_) \ + \ + clazz->glyph_format = glyph_format_; \ + \ + clazz->render_glyph = render_glyph_; \ + clazz->transform_glyph = transform_glyph_; \ + clazz->get_glyph_cbox = get_glyph_cbox_; \ + clazz->set_mode = set_mode_; \ + \ + clazz->raster_class = raster_class_; \ + \ + *output_class = (FT_Module_Class*)clazz; \ + return FT_Err_Ok; \ + } + + + +#endif /* FT_CONFIG_OPTION_PIC */ + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** PIC-Support Macros for ftmodapi.h ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef FT_CONFIG_OPTION_PIC + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Creator */ + /* */ + /* <Description> */ + /* A function used to create (allocate) a new module class object. */ + /* The object's members are initialized, but the module itself is */ + /* not. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory manager. */ + /* output_class :: Initialized with the newly allocated class. */ + /* */ + typedef FT_Error + (*FT_Module_Creator)( FT_Memory memory, + FT_Module_Class** output_class ); + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Destroyer */ + /* */ + /* <Description> */ + /* A function used to destroy (deallocate) a module class object. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory manager. */ + /* clazz :: Module class to destroy. */ + /* */ + typedef void + (*FT_Module_Destroyer)( FT_Memory memory, + FT_Module_Class* clazz ); + +#endif + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DECLARE_MODULE */ + /* */ + /* <Description> */ + /* Used to create a forward declaration of a */ + /* FT_Module_Class stract instance. */ + /* */ + /* <Macro> */ + /* FT_DEFINE_MODULE */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Module_Class struct. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ + /* to called with a pointer where the allocated stracture is returned.*/ + /* And when it is no longer needed a Destroy function needs */ + /* to be called to release that allocation. */ + /* fcinit.c (ft_create_default_module_classes) already contains */ + /* a mechanism to call these functions for the default modules */ + /* described in ftmodule.h */ + /* */ + /* Notice that the created Create and Destroy functions call */ + /* pic_init and pic_free function to allow you to manually allocate */ + /* and initialize any additional global data, like module specific */ + /* interface, and put them in the global pic container defined in */ + /* ftpic.h. if you don't need them just implement the functions as */ + /* empty to resolve the link error. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ + /* <Macro> */ + /* FT_DEFINE_ROOT_MODULE */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Module_Class struct inside */ + /* another stract that contains it or in a function that initializes */ + /* that containing stract */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DECLARE_MODULE(class_) \ + FT_CALLBACK_TABLE \ + const FT_Module_Class class_; \ + +#define FT_DEFINE_ROOT_MODULE(flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_) \ + { \ + flags_, \ + size_, \ + \ + name_, \ + version_, \ + requires_, \ + \ + interface_, \ + \ + init_, \ + done_, \ + get_interface_, \ + }, + +#define FT_DEFINE_MODULE(class_, flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Module_Class class_ = \ + { \ + flags_, \ + size_, \ + \ + name_, \ + version_, \ + requires_, \ + \ + interface_, \ + \ + init_, \ + done_, \ + get_interface_, \ + }; + + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DECLARE_MODULE(class_) \ + FT_Error FT_Create_Class_##class_( FT_Library library, \ + FT_Module_Class** output_class ); \ + void FT_Destroy_Class_##class_( FT_Library library, \ + FT_Module_Class* clazz ); + +#define FT_DEFINE_ROOT_MODULE(flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_) \ + clazz->root.module_flags = flags_; \ + clazz->root.module_size = size_; \ + clazz->root.module_name = name_; \ + clazz->root.module_version = version_; \ + clazz->root.module_requires = requires_; \ + \ + clazz->root.module_interface = interface_; \ + \ + clazz->root.module_init = init_; \ + clazz->root.module_done = done_; \ + clazz->root.get_interface = get_interface_; + +#define FT_DEFINE_MODULE(class_, flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_) \ + void class_##_pic_free( FT_Library library ); \ + FT_Error class_##_pic_init( FT_Library library ); \ + \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_Module_Class* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + class_##_pic_free( library ); \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_Module_Class** output_class ) \ + { \ + FT_Memory memory = library->memory; \ + FT_Module_Class* clazz; \ + FT_Error error; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz) ) ) \ + return error; \ + error = class_##_pic_init( library ); \ + if(error) \ + { \ + FT_FREE( clazz ); \ + return error; \ + } \ + \ + clazz->module_flags = flags_; \ + clazz->module_size = size_; \ + clazz->module_name = name_; \ + clazz->module_version = version_; \ + clazz->module_requires = requires_; \ + \ + clazz->module_interface = interface_; \ + \ + clazz->module_init = init_; \ + clazz->module_done = done_; \ + clazz->get_interface = get_interface_; \ + \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +FT_END_HEADER + +#endif /* __FTOBJS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftpic.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftpic.h new file mode 100644 index 00000000..1b31957d --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/ftpic.h @@ -0,0 +1,67 @@ +/***************************************************************************/ +/* */ +/* ftpic.h */ +/* */ +/* The FreeType position independent code services (declaration). */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Modules that ordinarily have const global data that need address */ + /* can instead define pointers here. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTPIC_H__ +#define __FTPIC_H__ + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC + + typedef struct FT_PIC_Container_ + { + /* pic containers for base */ + void* base; + /* pic containers for modules */ + void* autofit; + void* cff; + void* pshinter; + void* psnames; + void* raster; + void* sfnt; + void* smooth; + void* truetype; + } FT_PIC_Container; + + /* Initialize the various function tables, structs, etc. stored in the container. */ + FT_BASE( FT_Error ) + ft_pic_container_init( FT_Library library ); + + + /* Destroy the contents of the container. */ + FT_BASE( void ) + ft_pic_container_destroy( FT_Library library ); + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __FTPIC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftrfork.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftrfork.h new file mode 100644 index 00000000..aa573c87 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/ftrfork.h @@ -0,0 +1,196 @@ +/***************************************************************************/ +/* */ +/* ftrfork.h */ +/* */ +/* Embedded resource forks accessor (specification). */ +/* */ +/* Copyright 2004, 2006, 2007 by */ +/* Masatake YAMATO and Redhat K.K. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* Development of the code in this file is support of */ +/* Information-technology Promotion Agency, Japan. */ +/***************************************************************************/ + + +#ifndef __FTRFORK_H__ +#define __FTRFORK_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* Number of guessing rules supported in `FT_Raccess_Guess'. */ + /* Don't forget to increment the number if you add a new guessing rule. */ +#define FT_RACCESS_N_RULES 9 + + + /* A structure to describe a reference in a resource by its resource ID */ + /* and internal offset. The `POST' resource expects to be concatenated */ + /* by the order of resource IDs instead of its appearance in the file. */ + + typedef struct FT_RFork_Ref_ + { + FT_UShort res_id; + FT_ULong offset; + + } FT_RFork_Ref; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Guess */ + /* */ + /* <Description> */ + /* Guess a file name and offset where the actual resource fork is */ + /* stored. The macro FT_RACCESS_N_RULES holds the number of */ + /* guessing rules; the guessed result for the Nth rule is */ + /* represented as a triplet: a new file name (new_names[N]), a file */ + /* offset (offsets[N]), and an error code (errors[N]). */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* base_name :: */ + /* The (base) file name of the resource fork used for some */ + /* guessing rules. */ + /* */ + /* <Output> */ + /* new_names :: */ + /* An array of guessed file names in which the resource forks may */ + /* exist. If `new_names[N]' is NULL, the guessed file name is */ + /* equal to `base_name'. */ + /* */ + /* offsets :: */ + /* An array of guessed file offsets. `offsets[N]' holds the file */ + /* offset of the possible start of the resource fork in file */ + /* `new_names[N]'. */ + /* */ + /* errors :: */ + /* An array of FreeType error codes. `errors[N]' is the error */ + /* code of Nth guessing rule function. If `errors[N]' is not */ + /* FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless. */ + /* */ + FT_BASE( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char** new_names, + FT_Long* offsets, + FT_Error* errors ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Get_HeaderInfo */ + /* */ + /* <Description> */ + /* Get the information from the header of resource fork. The */ + /* information includes the file offset where the resource map */ + /* starts, and the file offset where the resource data starts. */ + /* `FT_Raccess_Get_DataOffsets' requires these two data. */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* rfork_offset :: */ + /* The file offset where the resource fork starts. */ + /* */ + /* <Output> */ + /* map_offset :: */ + /* The file offset where the resource map starts. */ + /* */ + /* rdata_pos :: */ + /* The file offset where the resource data starts. */ + /* */ + /* <Return> */ + /* FreeType error code. FT_Err_Ok means success. */ + /* */ + FT_BASE( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Get_DataOffsets */ + /* */ + /* <Description> */ + /* Get the data offsets for a tag in a resource fork. Offsets are */ + /* stored in an array because, in some cases, resources in a resource */ + /* fork have the same tag. */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* map_offset :: */ + /* The file offset where the resource map starts. */ + /* */ + /* rdata_pos :: */ + /* The file offset where the resource data starts. */ + /* */ + /* tag :: */ + /* The resource tag. */ + /* */ + /* <Output> */ + /* offsets :: */ + /* The stream offsets for the resource data specified by `tag'. */ + /* This array is allocated by the function, so you have to call */ + /* @ft_mem_free after use. */ + /* */ + /* count :: */ + /* The length of offsets array. */ + /* */ + /* <Return> */ + /* FreeType error code. FT_Err_Ok means success. */ + /* */ + /* <Note> */ + /* Normally you should use `FT_Raccess_Get_HeaderInfo' to get the */ + /* value for `map_offset' and `rdata_pos'. */ + /* */ + FT_BASE( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Long **offsets, + FT_Long *count ); + + +FT_END_HEADER + +#endif /* __FTRFORK_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftserv.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftserv.h new file mode 100644 index 00000000..569b9f7e --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/ftserv.h @@ -0,0 +1,620 @@ +/***************************************************************************/ +/* */ +/* ftserv.h */ +/* */ +/* The FreeType services (specification only). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Each module can export one or more `services'. Each service is */ + /* identified by a constant string and modeled by a pointer; the latter */ + /* generally corresponds to a structure containing function pointers. */ + /* */ + /* Note that a service's data cannot be a mere function pointer because */ + /* in C it is possible that function pointers might be implemented */ + /* differently than data pointers (e.g. 48 bits instead of 32). */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSERV_H__ +#define __FTSERV_H__ + + +FT_BEGIN_HEADER + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + + /* we disable the warning `conditional expression is constant' here */ + /* in order to compile cleanly with the maximum level of warnings */ +#pragma warning( disable : 4127 ) + +#endif /* _MSC_VER */ + + /* + * @macro: + * FT_FACE_FIND_SERVICE + * + * @description: + * This macro is used to look up a service from a face's driver module. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's + * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * `multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_'. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be NULL + * if not found. + */ +#ifdef __cplusplus + +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + if ( module->clazz->get_interface ) \ + _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + *_pptr_ = _tmp_; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ + \ + if ( module->clazz->get_interface ) \ + _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + ptr = _tmp_; \ + FT_END_STMNT + +#endif /* !C++ */ + + /* + * @macro: + * FT_FACE_FIND_GLOBAL_SERVICE + * + * @description: + * This macro is used to look up a service from all modules. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's + * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * `multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_'. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be NULL + * if not found. + */ +#ifdef __cplusplus + +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ + *_pptr_ = _tmp_; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ + ptr = _tmp_; \ + FT_END_STMNT + +#endif /* !C++ */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E D E S C R I P T O R S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The following structure is used to _describe_ a given service + * to the library. This is useful to build simple static service lists. + */ + typedef struct FT_ServiceDescRec_ + { + const char* serv_id; /* service name */ + const void* serv_data; /* service pointer/data */ + + } FT_ServiceDescRec; + + typedef const FT_ServiceDescRec* FT_ServiceDesc; + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DEFINE_SERVICEDESCREC1 .. FT_DEFINE_SERVICEDESCREC6 */ + /* */ + /* <Description> */ + /* Used to initialize an array of FT_ServiceDescRec structs. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ + /* to called with a pointer where the allocated array is returned. */ + /* And when it is no longer needed a Destroy function needs */ + /* to be called to release that allocation. */ + /* */ + /* These functions should be manyally called from the pic_init and */ + /* pic_free functions of your module (see FT_DEFINE_MODULE) */ + /* */ + /* When FT_CONFIG_OPTION_PIC is not defined the array will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \ + static const FT_ServiceDescRec class_[] = \ + { \ + {serv_id_1, serv_data_1}, \ + {NULL, NULL} \ + }; +#define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2) \ + static const FT_ServiceDescRec class_[] = \ + { \ + {serv_id_1, serv_data_1}, \ + {serv_id_2, serv_data_2}, \ + {NULL, NULL} \ + }; +#define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3) \ + static const FT_ServiceDescRec class_[] = \ + { \ + {serv_id_1, serv_data_1}, \ + {serv_id_2, serv_data_2}, \ + {serv_id_3, serv_data_3}, \ + {NULL, NULL} \ + }; +#define FT_DEFINE_SERVICEDESCREC4(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4) \ + static const FT_ServiceDescRec class_[] = \ + { \ + {serv_id_1, serv_data_1}, \ + {serv_id_2, serv_data_2}, \ + {serv_id_3, serv_data_3}, \ + {serv_id_4, serv_data_4}, \ + {NULL, NULL} \ + }; +#define FT_DEFINE_SERVICEDESCREC5(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, serv_id_5, serv_data_5) \ + static const FT_ServiceDescRec class_[] = \ + { \ + {serv_id_1, serv_data_1}, \ + {serv_id_2, serv_data_2}, \ + {serv_id_3, serv_data_3}, \ + {serv_id_4, serv_data_4}, \ + {serv_id_5, serv_data_5}, \ + {NULL, NULL} \ + }; +#define FT_DEFINE_SERVICEDESCREC6(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6) \ + static const FT_ServiceDescRec class_[] = \ + { \ + {serv_id_1, serv_data_1}, \ + {serv_id_2, serv_data_2}, \ + {serv_id_3, serv_data_3}, \ + {serv_id_4, serv_data_4}, \ + {serv_id_5, serv_data_5}, \ + {serv_id_6, serv_data_6}, \ + {NULL, NULL} \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz)*2 ) ) \ + return error; \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = NULL; \ + clazz[1].serv_data = NULL; \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2) \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz)*3 ) ) \ + return error; \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = NULL; \ + clazz[2].serv_data = NULL; \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3) \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz)*4 ) ) \ + return error; \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = NULL; \ + clazz[3].serv_data = NULL; \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC4(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4) \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz)*5 ) ) \ + return error; \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = NULL; \ + clazz[4].serv_data = NULL; \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC5(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3, serv_id_4, \ + serv_data_4, serv_id_5, serv_data_5) \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz)*6 ) ) \ + return error; \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = serv_id_5; \ + clazz[4].serv_data = serv_data_5; \ + clazz[5].serv_id = NULL; \ + clazz[5].serv_data = NULL; \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC6(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6) \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz)*7 ) ) \ + return error; \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = serv_id_5; \ + clazz[4].serv_data = serv_data_5; \ + clazz[5].serv_id = serv_id_6; \ + clazz[5].serv_data = serv_data_6; \ + clazz[6].serv_id = NULL; \ + clazz[6].serv_data = NULL; \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } +#endif /* FT_CONFIG_OPTION_PIC */ + + /* + * Parse a list of FT_ServiceDescRec descriptors and look for + * a specific service by ID. Note that the last element in the + * array must be { NULL, NULL }, and that the function should + * return NULL if the service isn't available. + * + * This function can be used by modules to implement their + * `get_service' method. + */ + FT_BASE( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E S C A C H E *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * This structure is used to store a cache for several frequently used + * services. It is the type of `face->internal->services'. You + * should only use FT_FACE_LOOKUP_SERVICE to access it. + * + * All fields should have the type FT_Pointer to relax compilation + * dependencies. We assume the developer isn't completely stupid. + * + * Each field must be named `service_XXXX' where `XXX' corresponds to + * the correct FT_SERVICE_ID_XXXX macro. See the definition of + * FT_FACE_LOOKUP_SERVICE below how this is implemented. + * + */ + typedef struct FT_ServiceCacheRec_ + { + FT_Pointer service_POSTSCRIPT_FONT_NAME; + FT_Pointer service_MULTI_MASTERS; + FT_Pointer service_GLYPH_DICT; + FT_Pointer service_PFR_METRICS; + FT_Pointer service_WINFNT; + + } FT_ServiceCacheRec, *FT_ServiceCache; + + + /* + * A magic number used within the services cache. + */ +#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)-2) /* magic number */ + + + /* + * @macro: + * FT_FACE_LOOKUP_SERVICE + * + * @description: + * This macro is used to lookup a service from a face's driver module + * using its cache. + * + * @input: + * face:: + * The source face handle containing the cache. + * + * field :: + * The field name in the cache. + * + * id :: + * The service ID. + * + * @output: + * ptr :: + * A variable receiving the service data. NULL if not available. + */ +#ifdef __cplusplus + +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + *Pptr = svc; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + ptr = svc; \ + FT_END_STMNT + +#endif /* !C++ */ + + /* + * A macro used to define new service structure types. + */ + +#define FT_DEFINE_SERVICE( name ) \ + typedef struct FT_Service_ ## name ## Rec_ \ + FT_Service_ ## name ## Rec ; \ + typedef struct FT_Service_ ## name ## Rec_ \ + const * FT_Service_ ## name ; \ + struct FT_Service_ ## name ## Rec_ + + /* */ + + /* + * The header files containing the services. + */ + +#define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h> +#define FT_SERVICE_CID_H <freetype/internal/services/svcid.h> +#define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h> +#define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h> +#define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h> +#define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h> +#define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h> +#define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h> +#define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h> +#define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h> +#define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h> +#define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h> +#define FT_SERVICE_TRUETYPE_ENGINE_H <freetype/internal/services/svtteng.h> +#define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h> +#define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h> +#define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h> +#define FT_SERVICE_TRUETYPE_GLYF_H <freetype/internal/services/svttglyf.h> + + /* */ + +FT_END_HEADER + +#endif /* __FTSERV_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftstream.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftstream.h new file mode 100644 index 00000000..a91eb72d --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/ftstream.h @@ -0,0 +1,539 @@ +/***************************************************************************/ +/* */ +/* ftstream.h */ +/* */ +/* Stream handling (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSTREAM_H__ +#define __FTSTREAM_H__ + + +#include <ft2build.h> +#include FT_SYSTEM_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* format of an 8-bit frame_op value: */ + /* */ + /* bit 76543210 */ + /* xxxxxxes */ + /* */ + /* s is set to 1 if the value is signed. */ + /* e is set to 1 if the value is little-endian. */ + /* xxx is a command. */ + +#define FT_FRAME_OP_SHIFT 2 +#define FT_FRAME_OP_SIGNED 1 +#define FT_FRAME_OP_LITTLE 2 +#define FT_FRAME_OP_COMMAND( x ) ( x >> FT_FRAME_OP_SHIFT ) + +#define FT_MAKE_FRAME_OP( command, little, sign ) \ + ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign ) + +#define FT_FRAME_OP_END 0 +#define FT_FRAME_OP_START 1 /* start a new frame */ +#define FT_FRAME_OP_BYTE 2 /* read 1-byte value */ +#define FT_FRAME_OP_SHORT 3 /* read 2-byte value */ +#define FT_FRAME_OP_LONG 4 /* read 4-byte value */ +#define FT_FRAME_OP_OFF3 5 /* read 3-byte value */ +#define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */ + + + typedef enum FT_Frame_Op_ + { + ft_frame_end = 0, + ft_frame_start = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ), + + ft_frame_byte = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 0 ), + ft_frame_schar = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 1 ), + + ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ), + ft_frame_short_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ), + ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ), + ft_frame_short_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ), + + ft_frame_ulong_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ), + ft_frame_long_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ), + ft_frame_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ), + ft_frame_long_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ), + + ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ), + ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ), + ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ), + ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ), + + ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ), + ft_frame_skip = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 ) + + } FT_Frame_Op; + + + typedef struct FT_Frame_Field_ + { + FT_Byte value; + FT_Byte size; + FT_UShort offset; + + } FT_Frame_Field; + + + /* Construct an FT_Frame_Field out of a structure type and a field name. */ + /* The structure type must be set in the FT_STRUCTURE macro before */ + /* calling the FT_FRAME_START() macro. */ + /* */ +#define FT_FIELD_SIZE( f ) \ + (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f ) + +#define FT_FIELD_SIZE_DELTA( f ) \ + (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] ) + +#define FT_FIELD_OFFSET( f ) \ + (FT_UShort)( offsetof( FT_STRUCTURE, f ) ) + +#define FT_FRAME_FIELD( frame_op, field ) \ + { \ + frame_op, \ + FT_FIELD_SIZE( field ), \ + FT_FIELD_OFFSET( field ) \ + } + +#define FT_MAKE_EMPTY_FIELD( frame_op ) { frame_op, 0, 0 } + +#define FT_FRAME_START( size ) { ft_frame_start, 0, size } +#define FT_FRAME_END { ft_frame_end, 0, 0 } + +#define FT_FRAME_LONG( f ) FT_FRAME_FIELD( ft_frame_long_be, f ) +#define FT_FRAME_ULONG( f ) FT_FRAME_FIELD( ft_frame_ulong_be, f ) +#define FT_FRAME_SHORT( f ) FT_FRAME_FIELD( ft_frame_short_be, f ) +#define FT_FRAME_USHORT( f ) FT_FRAME_FIELD( ft_frame_ushort_be, f ) +#define FT_FRAME_OFF3( f ) FT_FRAME_FIELD( ft_frame_off3_be, f ) +#define FT_FRAME_UOFF3( f ) FT_FRAME_FIELD( ft_frame_uoff3_be, f ) +#define FT_FRAME_BYTE( f ) FT_FRAME_FIELD( ft_frame_byte, f ) +#define FT_FRAME_CHAR( f ) FT_FRAME_FIELD( ft_frame_schar, f ) + +#define FT_FRAME_LONG_LE( f ) FT_FRAME_FIELD( ft_frame_long_le, f ) +#define FT_FRAME_ULONG_LE( f ) FT_FRAME_FIELD( ft_frame_ulong_le, f ) +#define FT_FRAME_SHORT_LE( f ) FT_FRAME_FIELD( ft_frame_short_le, f ) +#define FT_FRAME_USHORT_LE( f ) FT_FRAME_FIELD( ft_frame_ushort_le, f ) +#define FT_FRAME_OFF3_LE( f ) FT_FRAME_FIELD( ft_frame_off3_le, f ) +#define FT_FRAME_UOFF3_LE( f ) FT_FRAME_FIELD( ft_frame_uoff3_le, f ) + +#define FT_FRAME_SKIP_LONG { ft_frame_long_be, 0, 0 } +#define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 } +#define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 } + +#define FT_FRAME_BYTES( field, count ) \ + { \ + ft_frame_bytes, \ + count, \ + FT_FIELD_OFFSET( field ) \ + } + +#define FT_FRAME_SKIP_BYTES( count ) { ft_frame_skip, count, 0 } + + + /*************************************************************************/ + /* */ + /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */ + /* type `char*' or equivalent (1-byte elements). */ + /* */ + +#define FT_BYTE_( p, i ) ( ((const FT_Byte*)(p))[(i)] ) +#define FT_INT8_( p, i ) ( ((const FT_Char*)(p))[(i)] ) + +#define FT_INT16( x ) ( (FT_Int16)(x) ) +#define FT_UINT16( x ) ( (FT_UInt16)(x) ) +#define FT_INT32( x ) ( (FT_Int32)(x) ) +#define FT_UINT32( x ) ( (FT_UInt32)(x) ) + +#define FT_BYTE_I16( p, i, s ) ( FT_INT16( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_I32( p, i, s ) ( FT_INT32( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) ) + +#define FT_INT8_I16( p, i, s ) ( FT_INT16( FT_INT8_( p, i ) ) << (s) ) +#define FT_INT8_U16( p, i, s ) ( FT_UINT16( FT_INT8_( p, i ) ) << (s) ) +#define FT_INT8_I32( p, i, s ) ( FT_INT32( FT_INT8_( p, i ) ) << (s) ) +#define FT_INT8_U32( p, i, s ) ( FT_UINT32( FT_INT8_( p, i ) ) << (s) ) + + +#define FT_PEEK_SHORT( p ) FT_INT16( FT_INT8_I16( p, 0, 8) | \ + FT_BYTE_I16( p, 1, 0) ) + +#define FT_PEEK_USHORT( p ) FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \ + FT_BYTE_U16( p, 1, 0 ) ) + +#define FT_PEEK_LONG( p ) FT_INT32( FT_INT8_I32( p, 0, 24 ) | \ + FT_BYTE_I32( p, 1, 16 ) | \ + FT_BYTE_I32( p, 2, 8 ) | \ + FT_BYTE_I32( p, 3, 0 ) ) + +#define FT_PEEK_ULONG( p ) FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \ + FT_BYTE_U32( p, 1, 16 ) | \ + FT_BYTE_U32( p, 2, 8 ) | \ + FT_BYTE_U32( p, 3, 0 ) ) + +#define FT_PEEK_OFF3( p ) FT_INT32( FT_INT8_I32( p, 0, 16 ) | \ + FT_BYTE_I32( p, 1, 8 ) | \ + FT_BYTE_I32( p, 2, 0 ) ) + +#define FT_PEEK_UOFF3( p ) FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 2, 0 ) ) + +#define FT_PEEK_SHORT_LE( p ) FT_INT16( FT_INT8_I16( p, 1, 8 ) | \ + FT_BYTE_I16( p, 0, 0 ) ) + +#define FT_PEEK_USHORT_LE( p ) FT_UINT16( FT_BYTE_U16( p, 1, 8 ) | \ + FT_BYTE_U16( p, 0, 0 ) ) + +#define FT_PEEK_LONG_LE( p ) FT_INT32( FT_INT8_I32( p, 3, 24 ) | \ + FT_BYTE_I32( p, 2, 16 ) | \ + FT_BYTE_I32( p, 1, 8 ) | \ + FT_BYTE_I32( p, 0, 0 ) ) + +#define FT_PEEK_ULONG_LE( p ) FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \ + FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + +#define FT_PEEK_OFF3_LE( p ) FT_INT32( FT_INT8_I32( p, 2, 16 ) | \ + FT_BYTE_I32( p, 1, 8 ) | \ + FT_BYTE_I32( p, 0, 0 ) ) + +#define FT_PEEK_UOFF3_LE( p ) FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + + +#define FT_NEXT_CHAR( buffer ) \ + ( (signed char)*buffer++ ) + +#define FT_NEXT_BYTE( buffer ) \ + ( (unsigned char)*buffer++ ) + +#define FT_NEXT_SHORT( buffer ) \ + ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) ) + +#define FT_NEXT_USHORT( buffer ) \ + ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) ) + +#define FT_NEXT_OFF3( buffer ) \ + ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) ) + +#define FT_NEXT_UOFF3( buffer ) \ + ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) ) + +#define FT_NEXT_LONG( buffer ) \ + ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) ) + +#define FT_NEXT_ULONG( buffer ) \ + ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) ) + + +#define FT_NEXT_SHORT_LE( buffer ) \ + ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) ) + +#define FT_NEXT_USHORT_LE( buffer ) \ + ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) ) + +#define FT_NEXT_OFF3_LE( buffer ) \ + ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) ) + +#define FT_NEXT_UOFF3_LE( buffer ) \ + ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) ) + +#define FT_NEXT_LONG_LE( buffer ) \ + ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) ) + +#define FT_NEXT_ULONG_LE( buffer ) \ + ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) ) + + + /*************************************************************************/ + /* */ + /* Each GET_xxxx() macro uses an implicit `stream' variable. */ + /* */ +#if 0 +#define FT_GET_MACRO( type ) FT_NEXT_ ## type ( stream->cursor ) + +#define FT_GET_CHAR() FT_GET_MACRO( CHAR ) +#define FT_GET_BYTE() FT_GET_MACRO( BYTE ) +#define FT_GET_SHORT() FT_GET_MACRO( SHORT ) +#define FT_GET_USHORT() FT_GET_MACRO( USHORT ) +#define FT_GET_OFF3() FT_GET_MACRO( OFF3 ) +#define FT_GET_UOFF3() FT_GET_MACRO( UOFF3 ) +#define FT_GET_LONG() FT_GET_MACRO( LONG ) +#define FT_GET_ULONG() FT_GET_MACRO( ULONG ) +#define FT_GET_TAG4() FT_GET_MACRO( ULONG ) + +#define FT_GET_SHORT_LE() FT_GET_MACRO( SHORT_LE ) +#define FT_GET_USHORT_LE() FT_GET_MACRO( USHORT_LE ) +#define FT_GET_LONG_LE() FT_GET_MACRO( LONG_LE ) +#define FT_GET_ULONG_LE() FT_GET_MACRO( ULONG_LE ) + +#else +#define FT_GET_MACRO( func, type ) ( (type)func( stream ) ) + +#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetChar, FT_Char ) +#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetChar, FT_Byte ) +#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_Short ) +#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_UShort ) +#define FT_GET_OFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_Long ) +#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_ULong ) +#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetLong, FT_Long ) +#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong ) +#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong ) + +#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_Short ) +#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_UShort ) +#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_Long ) +#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_ULong ) +#endif + +#define FT_READ_MACRO( func, type, var ) \ + ( var = (type)func( stream, &error ), \ + error != FT_Err_Ok ) + +#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var ) +#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var ) +#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_Short, var ) +#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_UShort, var ) +#define FT_READ_OFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_Long, var ) +#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_ULong, var ) +#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_Long, var ) +#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_ULong, var ) + +#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_Short, var ) +#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_UShort, var ) +#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_Long, var ) +#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_ULong, var ) + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /* initialize a stream for reading a regular system stream */ + FT_BASE( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ); + +#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + + + /* create a new (input) stream from an FT_Open_Args structure */ + FT_BASE( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ); + + /* free a stream */ + FT_BASE( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ); + + /* initialize a stream for reading in-memory data */ + FT_BASE( void ) + FT_Stream_OpenMemory( FT_Stream stream, + const FT_Byte* base, + FT_ULong size ); + + /* close a stream (does not destroy the stream structure) */ + FT_BASE( void ) + FT_Stream_Close( FT_Stream stream ); + + + /* seek within a stream. position is relative to start of stream */ + FT_BASE( FT_Error ) + FT_Stream_Seek( FT_Stream stream, + FT_ULong pos ); + + /* skip bytes in a stream */ + FT_BASE( FT_Error ) + FT_Stream_Skip( FT_Stream stream, + FT_Long distance ); + + /* return current stream position */ + FT_BASE( FT_Long ) + FT_Stream_Pos( FT_Stream stream ); + + /* read bytes from a stream into a user-allocated buffer, returns an */ + /* error if not all bytes could be read. */ + FT_BASE( FT_Error ) + FT_Stream_Read( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + /* read bytes from a stream at a given position */ + FT_BASE( FT_Error ) + FT_Stream_ReadAt( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ); + + /* try to read bytes at the end of a stream; return number of bytes */ + /* really available */ + FT_BASE( FT_ULong ) + FT_Stream_TryRead( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + /* Enter a frame of `count' consecutive bytes in a stream. Returns an */ + /* error if the frame could not be read/accessed. The caller can use */ + /* the FT_Stream_Get_XXX functions to retrieve frame data without */ + /* error checks. */ + /* */ + /* You must _always_ call FT_Stream_ExitFrame() once you have entered */ + /* a stream frame! */ + /* */ + FT_BASE( FT_Error ) + FT_Stream_EnterFrame( FT_Stream stream, + FT_ULong count ); + + /* exit a stream frame */ + FT_BASE( void ) + FT_Stream_ExitFrame( FT_Stream stream ); + + /* Extract a stream frame. If the stream is disk-based, a heap block */ + /* is allocated and the frame bytes are read into it. If the stream */ + /* is memory-based, this function simply set a pointer to the data. */ + /* */ + /* Useful to optimize access to memory-based streams transparently. */ + /* */ + /* All extracted frames must be `freed' with a call to the function */ + /* FT_Stream_ReleaseFrame(). */ + /* */ + FT_BASE( FT_Error ) + FT_Stream_ExtractFrame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ); + + /* release an extract frame (see FT_Stream_ExtractFrame) */ + FT_BASE( void ) + FT_Stream_ReleaseFrame( FT_Stream stream, + FT_Byte** pbytes ); + + /* read a byte from an entered frame */ + FT_BASE( FT_Char ) + FT_Stream_GetChar( FT_Stream stream ); + + /* read a 16-bit big-endian integer from an entered frame */ + FT_BASE( FT_Short ) + FT_Stream_GetShort( FT_Stream stream ); + + /* read a 24-bit big-endian integer from an entered frame */ + FT_BASE( FT_Long ) + FT_Stream_GetOffset( FT_Stream stream ); + + /* read a 32-bit big-endian integer from an entered frame */ + FT_BASE( FT_Long ) + FT_Stream_GetLong( FT_Stream stream ); + + /* read a 16-bit little-endian integer from an entered frame */ + FT_BASE( FT_Short ) + FT_Stream_GetShortLE( FT_Stream stream ); + + /* read a 32-bit little-endian integer from an entered frame */ + FT_BASE( FT_Long ) + FT_Stream_GetLongLE( FT_Stream stream ); + + + /* read a byte from a stream */ + FT_BASE( FT_Char ) + FT_Stream_ReadChar( FT_Stream stream, + FT_Error* error ); + + /* read a 16-bit big-endian integer from a stream */ + FT_BASE( FT_Short ) + FT_Stream_ReadShort( FT_Stream stream, + FT_Error* error ); + + /* read a 24-bit big-endian integer from a stream */ + FT_BASE( FT_Long ) + FT_Stream_ReadOffset( FT_Stream stream, + FT_Error* error ); + + /* read a 32-bit big-endian integer from a stream */ + FT_BASE( FT_Long ) + FT_Stream_ReadLong( FT_Stream stream, + FT_Error* error ); + + /* read a 16-bit little-endian integer from a stream */ + FT_BASE( FT_Short ) + FT_Stream_ReadShortLE( FT_Stream stream, + FT_Error* error ); + + /* read a 32-bit little-endian integer from a stream */ + FT_BASE( FT_Long ) + FT_Stream_ReadLongLE( FT_Stream stream, + FT_Error* error ); + + /* Read a structure from a stream. The structure must be described */ + /* by an array of FT_Frame_Field records. */ + FT_BASE( FT_Error ) + FT_Stream_ReadFields( FT_Stream stream, + const FT_Frame_Field* fields, + void* structure ); + + +#define FT_STREAM_POS() \ + FT_Stream_Pos( stream ) + +#define FT_STREAM_SEEK( position ) \ + FT_SET_ERROR( FT_Stream_Seek( stream, position ) ) + +#define FT_STREAM_SKIP( distance ) \ + FT_SET_ERROR( FT_Stream_Skip( stream, distance ) ) + +#define FT_STREAM_READ( buffer, count ) \ + FT_SET_ERROR( FT_Stream_Read( stream, \ + (FT_Byte*)buffer, \ + count ) ) + +#define FT_STREAM_READ_AT( position, buffer, count ) \ + FT_SET_ERROR( FT_Stream_ReadAt( stream, \ + position, \ + (FT_Byte*)buffer, \ + count ) ) + +#define FT_STREAM_READ_FIELDS( fields, object ) \ + FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) ) + + +#define FT_FRAME_ENTER( size ) \ + FT_SET_ERROR( \ + FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, size ) ) ) + +#define FT_FRAME_EXIT() \ + FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) ) + +#define FT_FRAME_EXTRACT( size, bytes ) \ + FT_SET_ERROR( \ + FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, size, \ + (FT_Byte**)&(bytes) ) ) ) + +#define FT_FRAME_RELEASE( bytes ) \ + FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream, \ + (FT_Byte**)&(bytes) ) ) + + +FT_END_HEADER + +#endif /* __FTSTREAM_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/fttrace.h b/android/jni/ndk_modules/freetype/include/freetype/internal/fttrace.h new file mode 100644 index 00000000..e9b383a5 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/fttrace.h @@ -0,0 +1,139 @@ +/***************************************************************************/ +/* */ +/* fttrace.h */ +/* */ +/* Tracing handling (specification only). */ +/* */ +/* Copyright 2002, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* definitions of trace levels for FreeType 2 */ + + /* the first level must always be `trace_any' */ +FT_TRACE_DEF( any ) + + /* base components */ +FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */ +FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */ +FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */ +FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */ +FT_TRACE_DEF( list ) /* list management (ftlist.c) */ +FT_TRACE_DEF( init ) /* initialization (ftinit.c) */ +FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */ +FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */ +FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */ +FT_TRACE_DEF( gloader ) /* glyph loader (ftgloadr.c) */ + +FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */ +FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */ +FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */ +FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */ +FT_TRACE_DEF( synth ) /* bold/slant synthesizer (ftsynth.c) */ + + /* Cache sub-system */ +FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ + + /* SFNT driver components */ +FT_TRACE_DEF( sfdriver ) /* SFNT font driver (sfdriver.c) */ +FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ +FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ +FT_TRACE_DEF( ttkern ) /* kerning handler (ttkern.c) */ +FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */ +FT_TRACE_DEF( ttmtx ) /* metrics-related tables (ttmtx.c) */ +FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */ +FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */ +FT_TRACE_DEF( ttbdf ) /* TrueType embedded BDF (ttbdf.c) */ + + /* TrueType driver components */ +FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */ +FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */ +FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */ +FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */ +FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */ +FT_TRACE_DEF( ttgxvar ) /* TrueType GX var handler (ttgxvar.c) */ + + /* Type 1 driver components */ +FT_TRACE_DEF( t1afm ) +FT_TRACE_DEF( t1driver ) +FT_TRACE_DEF( t1gload ) +FT_TRACE_DEF( t1hint ) +FT_TRACE_DEF( t1load ) +FT_TRACE_DEF( t1objs ) +FT_TRACE_DEF( t1parse ) + + /* PostScript helper module `psaux' */ +FT_TRACE_DEF( t1decode ) +FT_TRACE_DEF( psobjs ) + + /* PostScript hinting module `pshinter' */ +FT_TRACE_DEF( pshrec ) +FT_TRACE_DEF( pshalgo1 ) +FT_TRACE_DEF( pshalgo2 ) + + /* Type 2 driver components */ +FT_TRACE_DEF( cffdriver ) +FT_TRACE_DEF( cffgload ) +FT_TRACE_DEF( cffload ) +FT_TRACE_DEF( cffobjs ) +FT_TRACE_DEF( cffparse ) + + /* Type 42 driver component */ +FT_TRACE_DEF( t42 ) + + /* CID driver components */ +FT_TRACE_DEF( cidafm ) +FT_TRACE_DEF( ciddriver ) +FT_TRACE_DEF( cidgload ) +FT_TRACE_DEF( cidload ) +FT_TRACE_DEF( cidobjs ) +FT_TRACE_DEF( cidparse ) + + /* Windows font component */ +FT_TRACE_DEF( winfnt ) + + /* PCF font components */ +FT_TRACE_DEF( pcfdriver ) +FT_TRACE_DEF( pcfread ) + + /* BDF font components */ +FT_TRACE_DEF( bdfdriver ) +FT_TRACE_DEF( bdflib ) + + /* PFR font component */ +FT_TRACE_DEF( pfr ) + + /* OpenType validation components */ +FT_TRACE_DEF( otvmodule ) +FT_TRACE_DEF( otvcommon ) +FT_TRACE_DEF( otvbase ) +FT_TRACE_DEF( otvgdef ) +FT_TRACE_DEF( otvgpos ) +FT_TRACE_DEF( otvgsub ) +FT_TRACE_DEF( otvjstf ) +FT_TRACE_DEF( otvmath ) + + /* TrueTypeGX/AAT validation components */ +FT_TRACE_DEF( gxvmodule ) +FT_TRACE_DEF( gxvcommon ) +FT_TRACE_DEF( gxvfeat ) +FT_TRACE_DEF( gxvmort ) +FT_TRACE_DEF( gxvmorx ) +FT_TRACE_DEF( gxvbsln ) +FT_TRACE_DEF( gxvjust ) +FT_TRACE_DEF( gxvkern ) +FT_TRACE_DEF( gxvopbd ) +FT_TRACE_DEF( gxvtrak ) +FT_TRACE_DEF( gxvprop ) +FT_TRACE_DEF( gxvlcar ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftvalid.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftvalid.h new file mode 100644 index 00000000..00cd85e7 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/ftvalid.h @@ -0,0 +1,150 @@ +/***************************************************************************/ +/* */ +/* ftvalid.h */ +/* */ +/* FreeType validation support (specification). */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTVALID_H__ +#define __FTVALID_H__ + +#include <ft2build.h> +#include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_setjmp and ft_longjmp */ + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** V A L I D A T I O N ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to a validation object */ + typedef struct FT_ValidatorRec_ volatile* FT_Validator; + + + /*************************************************************************/ + /* */ + /* There are three distinct validation levels defined here: */ + /* */ + /* FT_VALIDATE_DEFAULT :: */ + /* A table that passes this validation level can be used reliably by */ + /* FreeType. It generally means that all offsets have been checked to */ + /* prevent out-of-bound reads, that array counts are correct, etc. */ + /* */ + /* FT_VALIDATE_TIGHT :: */ + /* A table that passes this validation level can be used reliably and */ + /* doesn't contain invalid data. For example, a charmap table that */ + /* returns invalid glyph indices will not pass, even though it can */ + /* be used with FreeType in default mode (the library will simply */ + /* return an error later when trying to load the glyph). */ + /* */ + /* It also checks that fields which must be a multiple of 2, 4, or 8, */ + /* don't have incorrect values, etc. */ + /* */ + /* FT_VALIDATE_PARANOID :: */ + /* Only for font debugging. Checks that a table follows the */ + /* specification by 100%. Very few fonts will be able to pass this */ + /* level anyway but it can be useful for certain tools like font */ + /* editors/converters. */ + /* */ + typedef enum FT_ValidationLevel_ + { + FT_VALIDATE_DEFAULT = 0, + FT_VALIDATE_TIGHT, + FT_VALIDATE_PARANOID + + } FT_ValidationLevel; + + + /* validator structure */ + typedef struct FT_ValidatorRec_ + { + const FT_Byte* base; /* address of table in memory */ + const FT_Byte* limit; /* `base' + sizeof(table) in memory */ + FT_ValidationLevel level; /* validation level */ + FT_Error error; /* error returned. 0 means success */ + + ft_jmp_buf jump_buffer; /* used for exception handling */ + + } FT_ValidatorRec; + + +#define FT_VALIDATOR( x ) ((FT_Validator)( x )) + + + FT_BASE( void ) + ft_validator_init( FT_Validator valid, + const FT_Byte* base, + const FT_Byte* limit, + FT_ValidationLevel level ); + + /* Do not use this. It's broken and will cause your validator to crash */ + /* if you run it on an invalid font. */ + FT_BASE( FT_Int ) + ft_validator_run( FT_Validator valid ); + + /* Sets the error field in a validator, then calls `longjmp' to return */ + /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */ + /* error checks within the validation routines. */ + /* */ + FT_BASE( void ) + ft_validator_error( FT_Validator valid, + FT_Error error ); + + + /* Calls ft_validate_error. Assumes that the `valid' local variable */ + /* holds a pointer to the current validator object. */ + /* */ + /* Use preprocessor prescan to pass FT_ERR_PREFIX. */ + /* */ +#define FT_INVALID( _prefix, _error ) FT_INVALID_( _prefix, _error ) +#define FT_INVALID_( _prefix, _error ) \ + ft_validator_error( valid, _prefix ## _error ) + + /* called when a broken table is detected */ +#define FT_INVALID_TOO_SHORT \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) + + /* called when an invalid offset is detected */ +#define FT_INVALID_OFFSET \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Offset ) + + /* called when an invalid format/value is detected */ +#define FT_INVALID_FORMAT \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) + + /* called when an invalid glyph index is detected */ +#define FT_INVALID_GLYPH_ID \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index ) + + /* called when an invalid field value is detected */ +#define FT_INVALID_DATA \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) + + +FT_END_HEADER + +#endif /* __FTVALID_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/internal.h b/android/jni/ndk_modules/freetype/include/freetype/internal/internal.h new file mode 100644 index 00000000..f500a651 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/internal.h @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* internal.h */ +/* */ +/* Internal header files (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is automatically included by `ft2build.h'. */ + /* Do not include it manually! */ + /* */ + /*************************************************************************/ + + +#define FT_INTERNAL_OBJECTS_H <freetype/internal/ftobjs.h> +#define FT_INTERNAL_PIC_H <freetype/internal/ftpic.h> +#define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h> +#define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h> +#define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h> +#define FT_INTERNAL_CALC_H <freetype/internal/ftcalc.h> +#define FT_INTERNAL_DRIVER_H <freetype/internal/ftdriver.h> +#define FT_INTERNAL_TRACE_H <freetype/internal/fttrace.h> +#define FT_INTERNAL_GLYPH_LOADER_H <freetype/internal/ftgloadr.h> +#define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h> +#define FT_INTERNAL_SERVICE_H <freetype/internal/ftserv.h> +#define FT_INTERNAL_RFORK_H <freetype/internal/ftrfork.h> +#define FT_INTERNAL_VALIDATE_H <freetype/internal/ftvalid.h> + +#define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h> +#define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h> + +#define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h> +#define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h> +#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h> + +#define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h> + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/pcftypes.h b/android/jni/ndk_modules/freetype/include/freetype/internal/pcftypes.h new file mode 100644 index 00000000..382796ff --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/pcftypes.h @@ -0,0 +1,56 @@ +/* pcftypes.h + + FreeType font driver for pcf fonts + + Copyright (C) 2000, 2001, 2002 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __PCFTYPES_H__ +#define __PCFTYPES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + typedef struct PCF_Public_FaceRec_ + { + FT_FaceRec root; + FT_StreamRec gzip_stream; + FT_Stream gzip_source; + + char* charset_encoding; + char* charset_registry; + + } PCF_Public_FaceRec, *PCF_Public_Face; + + +FT_END_HEADER + +#endif /* __PCFTYPES_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/psaux.h b/android/jni/ndk_modules/freetype/include/freetype/internal/psaux.h new file mode 100644 index 00000000..a96e0dfa --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/psaux.h @@ -0,0 +1,873 @@ +/***************************************************************************/ +/* */ +/* psaux.h */ +/* */ +/* Auxiliary functions and data structures related to PostScript fonts */ +/* (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSAUX_H__ +#define __PSAUX_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct PS_TableRec_* PS_Table; + typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_Table_FuncsRec */ + /* */ + /* <Description> */ + /* A set of function pointers to manage PS_Table objects. */ + /* */ + /* <Fields> */ + /* table_init :: Used to initialize a table. */ + /* */ + /* table_done :: Finalizes resp. destroy a given table. */ + /* */ + /* table_add :: Adds a new object to a table. */ + /* */ + /* table_release :: Releases table data, then finalizes it. */ + /* */ + typedef struct PS_Table_FuncsRec_ + { + FT_Error + (*init)( PS_Table table, + FT_Int count, + FT_Memory memory ); + + void + (*done)( PS_Table table ); + + FT_Error + (*add)( PS_Table table, + FT_Int idx, + void* object, + FT_PtrDist length ); + + void + (*release)( PS_Table table ); + + } PS_Table_FuncsRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_TableRec */ + /* */ + /* <Description> */ + /* A PS_Table is a simple object used to store an array of objects in */ + /* a single memory block. */ + /* */ + /* <Fields> */ + /* block :: The address in memory of the growheap's block. This */ + /* can change between two object adds, due to */ + /* reallocation. */ + /* */ + /* cursor :: The current top of the grow heap within its block. */ + /* */ + /* capacity :: The current size of the heap block. Increments by */ + /* 1kByte chunks. */ + /* */ + /* max_elems :: The maximum number of elements in table. */ + /* */ + /* num_elems :: The current number of elements in table. */ + /* */ + /* elements :: A table of element addresses within the block. */ + /* */ + /* lengths :: A table of element sizes within the block. */ + /* */ + /* memory :: The object used for memory operations */ + /* (alloc/realloc). */ + /* */ + /* funcs :: A table of method pointers for this object. */ + /* */ + typedef struct PS_TableRec_ + { + FT_Byte* block; /* current memory block */ + FT_Offset cursor; /* current cursor in memory block */ + FT_Offset capacity; /* current size of memory block */ + FT_Long init; + + FT_Int max_elems; + FT_Int num_elems; + FT_Byte** elements; /* addresses of table elements */ + FT_PtrDist* lengths; /* lengths of table elements */ + + FT_Memory memory; + PS_Table_FuncsRec funcs; + + } PS_TableRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 FIELDS & TOKENS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PS_ParserRec_* PS_Parser; + + typedef struct T1_TokenRec_* T1_Token; + + typedef struct T1_FieldRec_* T1_Field; + + + /* simple enumeration type used to identify token types */ + typedef enum T1_TokenType_ + { + T1_TOKEN_TYPE_NONE = 0, + T1_TOKEN_TYPE_ANY, + T1_TOKEN_TYPE_STRING, + T1_TOKEN_TYPE_ARRAY, + T1_TOKEN_TYPE_KEY, /* aka `name' */ + + /* do not remove */ + T1_TOKEN_TYPE_MAX + + } T1_TokenType; + + + /* a simple structure used to identify tokens */ + typedef struct T1_TokenRec_ + { + FT_Byte* start; /* first character of token in input stream */ + FT_Byte* limit; /* first character after the token */ + T1_TokenType type; /* type of token */ + + } T1_TokenRec; + + + /* enumeration type used to identify object fields */ + typedef enum T1_FieldType_ + { + T1_FIELD_TYPE_NONE = 0, + T1_FIELD_TYPE_BOOL, + T1_FIELD_TYPE_INTEGER, + T1_FIELD_TYPE_FIXED, + T1_FIELD_TYPE_FIXED_1000, + T1_FIELD_TYPE_STRING, + T1_FIELD_TYPE_KEY, + T1_FIELD_TYPE_BBOX, + T1_FIELD_TYPE_INTEGER_ARRAY, + T1_FIELD_TYPE_FIXED_ARRAY, + T1_FIELD_TYPE_CALLBACK, + + /* do not remove */ + T1_FIELD_TYPE_MAX + + } T1_FieldType; + + + typedef enum T1_FieldLocation_ + { + T1_FIELD_LOCATION_CID_INFO, + T1_FIELD_LOCATION_FONT_DICT, + T1_FIELD_LOCATION_FONT_EXTRA, + T1_FIELD_LOCATION_FONT_INFO, + T1_FIELD_LOCATION_PRIVATE, + T1_FIELD_LOCATION_BBOX, + T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE, + T1_FIELD_LOCATION_BLEND, + + /* do not remove */ + T1_FIELD_LOCATION_MAX + + } T1_FieldLocation; + + + typedef void + (*T1_Field_ParseFunc)( FT_Face face, + FT_Pointer parser ); + + + /* structure type used to model object fields */ + typedef struct T1_FieldRec_ + { + const char* ident; /* field identifier */ + T1_FieldLocation location; + T1_FieldType type; /* type of field */ + T1_Field_ParseFunc reader; + FT_UInt offset; /* offset of field in object */ + FT_Byte size; /* size of field in bytes */ + FT_UInt array_max; /* maximal number of elements for */ + /* array */ + FT_UInt count_offset; /* offset of element count for */ + /* arrays; must not be zero if in */ + /* use -- in other words, a */ + /* `num_FOO' element must not */ + /* start the used structure if we */ + /* parse a `FOO' array */ + FT_UInt dict; /* where we expect it */ + } T1_FieldRec; + +#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */ +#define T1_FIELD_DICT_PRIVATE ( 1 << 1 ) + + + +#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE( _fname ), \ + 0, 0, \ + _dict \ + }, + +#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \ + { \ + _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ + (T1_Field_ParseFunc)_reader, \ + 0, 0, \ + 0, 0, \ + _dict \ + }, + +#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, \ + FT_FIELD_OFFSET( num_ ## _fname ), \ + _dict \ + }, + +#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, 0, \ + _dict \ + }, + + +#define T1_FIELD_BOOL( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict ) + +#define T1_FIELD_NUM( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict ) + +#define T1_FIELD_FIXED( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict ) + +#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \ + _dict ) + +#define T1_FIELD_STRING( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict ) + +#define T1_FIELD_KEY( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict ) + +#define T1_FIELD_BBOX( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict ) + + +#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \ + T1_NEW_CALLBACK_FIELD( _ident, _name, _dict ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs; + + typedef struct PS_Parser_FuncsRec_ + { + void + (*init)( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + void + (*done)( PS_Parser parser ); + + void + (*skip_spaces)( PS_Parser parser ); + void + (*skip_PS_token)( PS_Parser parser ); + + FT_Long + (*to_int)( PS_Parser parser ); + FT_Fixed + (*to_fixed)( PS_Parser parser, + FT_Int power_ten ); + + FT_Error + (*to_bytes)( PS_Parser parser, + FT_Byte* bytes, + FT_Offset max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ); + + FT_Int + (*to_coord_array)( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ); + FT_Int + (*to_fixed_array)( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + void + (*to_token)( PS_Parser parser, + T1_Token token ); + void + (*to_token_array)( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_Error + (*load_field)( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_Error + (*load_field_table)( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + } PS_Parser_FuncsRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_ParserRec */ + /* */ + /* <Description> */ + /* A PS_Parser is an object used to parse a Type 1 font very quickly. */ + /* */ + /* <Fields> */ + /* cursor :: The current position in the text. */ + /* */ + /* base :: Start of the processed text. */ + /* */ + /* limit :: End of the processed text. */ + /* */ + /* error :: The last error returned. */ + /* */ + /* memory :: The object used for memory operations (alloc/realloc). */ + /* */ + /* funcs :: A table of functions for the parser. */ + /* */ + typedef struct PS_ParserRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + FT_Error error; + FT_Memory memory; + + PS_Parser_FuncsRec funcs; + + } PS_ParserRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_BuilderRec_* T1_Builder; + + + typedef FT_Error + (*T1_Builder_Check_Points_Func)( T1_Builder builder, + FT_Int count ); + + typedef void + (*T1_Builder_Add_Point_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + typedef FT_Error + (*T1_Builder_Add_Point1_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + typedef FT_Error + (*T1_Builder_Add_Contour_Func)( T1_Builder builder ); + + typedef FT_Error + (*T1_Builder_Start_Point_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + typedef void + (*T1_Builder_Close_Contour_Func)( T1_Builder builder ); + + + typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs; + + typedef struct T1_Builder_FuncsRec_ + { + void + (*init)( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Bool hinting ); + + void + (*done)( T1_Builder builder ); + + T1_Builder_Check_Points_Func check_points; + T1_Builder_Add_Point_Func add_point; + T1_Builder_Add_Point1_Func add_point1; + T1_Builder_Add_Contour_Func add_contour; + T1_Builder_Start_Point_Func start_point; + T1_Builder_Close_Contour_Func close_contour; + + } T1_Builder_FuncsRec; + + + /* an enumeration type to handle charstring parsing states */ + typedef enum T1_ParseState_ + { + T1_Parse_Start, + T1_Parse_Have_Width, + T1_Parse_Have_Moveto, + T1_Parse_Have_Path + + } T1_ParseState; + + + /*************************************************************************/ + /* */ + /* <Structure> */ + /* T1_BuilderRec */ + /* */ + /* <Description> */ + /* A structure used during glyph loading to store its outline. */ + /* */ + /* <Fields> */ + /* memory :: The current memory object. */ + /* */ + /* face :: The current face object. */ + /* */ + /* glyph :: The current glyph slot. */ + /* */ + /* loader :: XXX */ + /* */ + /* base :: The base glyph outline. */ + /* */ + /* current :: The current glyph outline. */ + /* */ + /* max_points :: maximum points in builder outline */ + /* */ + /* max_contours :: Maximal number of contours in builder outline. */ + /* */ + /* pos_x :: The horizontal translation (if composite glyph). */ + /* */ + /* pos_y :: The vertical translation (if composite glyph). */ + /* */ + /* left_bearing :: The left side bearing point. */ + /* */ + /* advance :: The horizontal advance vector. */ + /* */ + /* bbox :: Unused. */ + /* */ + /* parse_state :: An enumeration which controls the charstring */ + /* parsing state. */ + /* */ + /* load_points :: If this flag is not set, no points are loaded. */ + /* */ + /* no_recurse :: Set but not used. */ + /* */ + /* metrics_only :: A boolean indicating that we only want to compute */ + /* the metrics of a given glyph, not load all of its */ + /* points. */ + /* */ + /* funcs :: An array of function pointers for the builder. */ + /* */ + typedef struct T1_BuilderRec_ + { + FT_Memory memory; + FT_Face face; + FT_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Pos pos_x; + FT_Pos pos_y; + + FT_Vector left_bearing; + FT_Vector advance; + + FT_BBox bbox; /* bounding box */ + T1_ParseState parse_state; + FT_Bool load_points; + FT_Bool no_recurse; + + FT_Bool metrics_only; + + void* hints_funcs; /* hinter-specific */ + void* hints_globals; /* hinter-specific */ + + T1_Builder_FuncsRec funcs; + + } T1_BuilderRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 DECODER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 0 + + /*************************************************************************/ + /* */ + /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ + /* calls during glyph loading. */ + /* */ +#define T1_MAX_SUBRS_CALLS 8 + + + /*************************************************************************/ + /* */ + /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ + /* minimum of 16 is required. */ + /* */ +#define T1_MAX_CHARSTRINGS_OPERANDS 32 + +#endif /* 0 */ + + + typedef struct T1_Decoder_ZoneRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + + } T1_Decoder_ZoneRec, *T1_Decoder_Zone; + + + typedef struct T1_DecoderRec_* T1_Decoder; + typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs; + + + typedef FT_Error + (*T1_Decoder_Callback)( T1_Decoder decoder, + FT_UInt glyph_index ); + + + typedef struct T1_Decoder_FuncsRec_ + { + FT_Error + (*init)( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback callback ); + + void + (*done)( T1_Decoder decoder ); + + FT_Error + (*parse_charstrings)( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); + + } T1_Decoder_FuncsRec; + + + typedef struct T1_DecoderRec_ + { + T1_BuilderRec builder; + + FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; + FT_Long* top; + + T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; + T1_Decoder_Zone zone; + + FT_Service_PsCMaps psnames; /* for seac */ + FT_UInt num_glyphs; + FT_Byte** glyph_names; + + FT_Int lenIV; /* internal for sub routine calls */ + FT_UInt num_subrs; + FT_Byte** subrs; + FT_PtrDist* subrs_len; /* array of subrs length (optional) */ + + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + PS_Blend blend; /* for multiple master support */ + + FT_Render_Mode hint_mode; + + T1_Decoder_Callback parse_callback; + T1_Decoder_FuncsRec funcs; + + FT_Long* buildchar; + FT_UInt len_buildchar; + + FT_Bool seac; + + } T1_DecoderRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** AFM PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AFM_ParserRec_* AFM_Parser; + + typedef struct AFM_Parser_FuncsRec_ + { + FT_Error + (*init)( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ); + + void + (*done)( AFM_Parser parser ); + + FT_Error + (*parse)( AFM_Parser parser ); + + } AFM_Parser_FuncsRec; + + + typedef struct AFM_StreamRec_* AFM_Stream; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* AFM_ParserRec */ + /* */ + /* <Description> */ + /* An AFM_Parser is a parser for the AFM files. */ + /* */ + /* <Fields> */ + /* memory :: The object used for memory operations (alloc and */ + /* realloc). */ + /* */ + /* stream :: This is an opaque object. */ + /* */ + /* FontInfo :: The result will be stored here. */ + /* */ + /* get_index :: A user provided function to get a glyph index by its */ + /* name. */ + /* */ + typedef struct AFM_ParserRec_ + { + FT_Memory memory; + AFM_Stream stream; + + AFM_FontInfo FontInfo; + + FT_Int + (*get_index)( const char* name, + FT_Offset len, + void* user_data ); + + void* user_data; + + } AFM_ParserRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CHARMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes; + + typedef struct T1_CMap_ClassesRec_ + { + FT_CMap_Class standard; + FT_CMap_Class expert; + FT_CMap_Class custom; + FT_CMap_Class unicode; + + } T1_CMap_ClassesRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PSAux Module Interface *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSAux_ServiceRec_ + { + /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */ + const PS_Table_FuncsRec* ps_table_funcs; + const PS_Parser_FuncsRec* ps_parser_funcs; + const T1_Builder_FuncsRec* t1_builder_funcs; + const T1_Decoder_FuncsRec* t1_decoder_funcs; + + void + (*t1_decrypt)( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ); + + T1_CMap_Classes t1_cmap_classes; + + /* fields after this comment line were added after version 2.1.10 */ + const AFM_Parser_FuncsRec* afm_parser_funcs; + + } PSAux_ServiceRec, *PSAux_Service; + + /* backwards-compatible type definition */ + typedef PSAux_ServiceRec PSAux_Interface; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Some convenience functions *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define IS_PS_NEWLINE( ch ) \ + ( (ch) == '\r' || \ + (ch) == '\n' ) + +#define IS_PS_SPACE( ch ) \ + ( (ch) == ' ' || \ + IS_PS_NEWLINE( ch ) || \ + (ch) == '\t' || \ + (ch) == '\f' || \ + (ch) == '\0' ) + +#define IS_PS_SPECIAL( ch ) \ + ( (ch) == '/' || \ + (ch) == '(' || (ch) == ')' || \ + (ch) == '<' || (ch) == '>' || \ + (ch) == '[' || (ch) == ']' || \ + (ch) == '{' || (ch) == '}' || \ + (ch) == '%' ) + +#define IS_PS_DELIM( ch ) \ + ( IS_PS_SPACE( ch ) || \ + IS_PS_SPECIAL( ch ) ) + +#define IS_PS_DIGIT( ch ) \ + ( (ch) >= '0' && (ch) <= '9' ) + +#define IS_PS_XDIGIT( ch ) \ + ( IS_PS_DIGIT( ch ) || \ + ( (ch) >= 'A' && (ch) <= 'F' ) || \ + ( (ch) >= 'a' && (ch) <= 'f' ) ) + +#define IS_PS_BASE85( ch ) \ + ( (ch) >= '!' && (ch) <= 'u' ) + +#define IS_PS_TOKEN( cur, limit, token ) \ + ( (char)(cur)[0] == (token)[0] && \ + ( (cur) + sizeof ( (token) ) == (limit) || \ + ( (cur) + sizeof( (token) ) < (limit) && \ + IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \ + ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 ) + + +FT_END_HEADER + +#endif /* __PSAUX_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/pshints.h b/android/jni/ndk_modules/freetype/include/freetype/internal/pshints.h new file mode 100644 index 00000000..0c357651 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/pshints.h @@ -0,0 +1,712 @@ +/***************************************************************************/ +/* */ +/* pshints.h */ +/* */ +/* Interface to Postscript-specific (Type 1 and Type 2) hints */ +/* recorders (specification only). These are used to support native */ +/* T1/T2 hints in the `type1', `cid', and `cff' font drivers. */ +/* */ +/* Copyright 2001, 2002, 2003, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHINTS_H__ +#define __PSHINTS_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** INTERNAL REPRESENTATION OF GLOBALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSH_GlobalsRec_* PSH_Globals; + + typedef FT_Error + (*PSH_Globals_NewFunc)( FT_Memory memory, + T1_Private* private_dict, + PSH_Globals* aglobals ); + + typedef FT_Error + (*PSH_Globals_SetScaleFunc)( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ); + + typedef void + (*PSH_Globals_DestroyFunc)( PSH_Globals globals ); + + + typedef struct PSH_Globals_FuncsRec_ + { + PSH_Globals_NewFunc create; + PSH_Globals_SetScaleFunc set_scale; + PSH_Globals_DestroyFunc destroy; + + } PSH_Globals_FuncsRec, *PSH_Globals_Funcs; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PUBLIC TYPE 1 HINTS RECORDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * T1_Hints + * + * @description: + * This is a handle to an opaque structure used to record glyph hints + * from a Type 1 character glyph character string. + * + * The methods used to operate on this object are defined by the + * @T1_Hints_FuncsRec structure. Recording glyph hints is normally + * achieved through the following scheme: + * + * - Open a new hint recording session by calling the `open' method. + * This rewinds the recorder and prepare it for new input. + * + * - For each hint found in the glyph charstring, call the corresponding + * method (`stem', `stem3', or `reset'). Note that these functions do + * not return an error code. + * + * - Close the recording session by calling the `close' method. It + * returns an error code if the hints were invalid or something + * strange happened (e.g., memory shortage). + * + * The hints accumulated in the object can later be used by the + * PostScript hinter. + * + */ + typedef struct T1_HintsRec_* T1_Hints; + + + /************************************************************************* + * + * @type: + * T1_Hints_Funcs + * + * @description: + * A pointer to the @T1_Hints_FuncsRec structure that defines the API of + * a given @T1_Hints object. + * + */ + typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs; + + + /************************************************************************* + * + * @functype: + * T1_Hints_OpenFunc + * + * @description: + * A method of the @T1_Hints class used to prepare it for a new Type 1 + * hints recording session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * @note: + * You should always call the @T1_Hints_CloseFunc method in order to + * close an opened recording session. + * + */ + typedef void + (*T1_Hints_OpenFunc)( T1_Hints hints ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_SetStemFunc + * + * @description: + * A method of the @T1_Hints class used to record a new horizontal or + * vertical stem. This corresponds to the Type 1 `hstem' and `vstem' + * operators. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * dimension :: + * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). + * + * coords :: + * Array of 2 coordinates in 16.16 format, used as (position,length) + * stem descriptor. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * `coords[0]' is the absolute stem position (lowest coordinate); + * `coords[1]' is the length. + * + * The length can be negative, in which case it must be either -20 or + * -21. It is interpreted as a `ghost' stem, according to the Type 1 + * specification. + * + * If the length is -21 (corresponding to a bottom ghost stem), then + * the real stem position is `coords[0]+coords[1]'. + * + */ + typedef void + (*T1_Hints_SetStemFunc)( T1_Hints hints, + FT_UInt dimension, + FT_Fixed* coords ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_SetStem3Func + * + * @description: + * A method of the @T1_Hints class used to record three + * counter-controlled horizontal or vertical stems at once. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * dimension :: + * 0 for horizontal stems, 1 for vertical ones. + * + * coords :: + * An array of 6 values in 16.16 format, holding 3 (position,length) + * pairs for the counter-controlled stems. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * The lengths cannot be negative (ghost stems are never + * counter-controlled). + * + */ + typedef void + (*T1_Hints_SetStem3Func)( T1_Hints hints, + FT_UInt dimension, + FT_Fixed* coords ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_ResetFunc + * + * @description: + * A method of the @T1_Hints class used to reset the stems hints in a + * recording session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph in which the + * previously defined hints apply. + * + */ + typedef void + (*T1_Hints_ResetFunc)( T1_Hints hints, + FT_UInt end_point ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_CloseFunc + * + * @description: + * A method of the @T1_Hints class used to close a hint recording + * session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The error code is set to indicate that an error occurred during the + * recording session. + * + */ + typedef FT_Error + (*T1_Hints_CloseFunc)( T1_Hints hints, + FT_UInt end_point ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_ApplyFunc + * + * @description: + * A method of the @T1_Hints class used to apply hints to the + * corresponding glyph outline. Must be called once all hints have been + * recorded. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * outline :: + * A pointer to the target outline descriptor. + * + * globals :: + * The hinter globals for this font. + * + * hint_mode :: + * Hinting information. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * On input, all points within the outline are in font coordinates. On + * output, they are in 1/64th of pixels. + * + * The scaling transformation is taken from the `globals' object which + * must correspond to the same font as the glyph. + * + */ + typedef FT_Error + (*T1_Hints_ApplyFunc)( T1_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + + /************************************************************************* + * + * @struct: + * T1_Hints_FuncsRec + * + * @description: + * The structure used to provide the API to @T1_Hints objects. + * + * @fields: + * hints :: + * A handle to the T1 Hints recorder. + * + * open :: + * The function to open a recording session. + * + * close :: + * The function to close a recording session. + * + * stem :: + * The function to set a simple stem. + * + * stem3 :: + * The function to set counter-controlled stems. + * + * reset :: + * The function to reset stem hints. + * + * apply :: + * The function to apply the hints to the corresponding glyph outline. + * + */ + typedef struct T1_Hints_FuncsRec_ + { + T1_Hints hints; + T1_Hints_OpenFunc open; + T1_Hints_CloseFunc close; + T1_Hints_SetStemFunc stem; + T1_Hints_SetStem3Func stem3; + T1_Hints_ResetFunc reset; + T1_Hints_ApplyFunc apply; + + } T1_Hints_FuncsRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PUBLIC TYPE 2 HINTS RECORDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * T2_Hints + * + * @description: + * This is a handle to an opaque structure used to record glyph hints + * from a Type 2 character glyph character string. + * + * The methods used to operate on this object are defined by the + * @T2_Hints_FuncsRec structure. Recording glyph hints is normally + * achieved through the following scheme: + * + * - Open a new hint recording session by calling the `open' method. + * This rewinds the recorder and prepare it for new input. + * + * - For each hint found in the glyph charstring, call the corresponding + * method (`stems', `hintmask', `counters'). Note that these + * functions do not return an error code. + * + * - Close the recording session by calling the `close' method. It + * returns an error code if the hints were invalid or something + * strange happened (e.g., memory shortage). + * + * The hints accumulated in the object can later be used by the + * Postscript hinter. + * + */ + typedef struct T2_HintsRec_* T2_Hints; + + + /************************************************************************* + * + * @type: + * T2_Hints_Funcs + * + * @description: + * A pointer to the @T2_Hints_FuncsRec structure that defines the API of + * a given @T2_Hints object. + * + */ + typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs; + + + /************************************************************************* + * + * @functype: + * T2_Hints_OpenFunc + * + * @description: + * A method of the @T2_Hints class used to prepare it for a new Type 2 + * hints recording session. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * @note: + * You should always call the @T2_Hints_CloseFunc method in order to + * close an opened recording session. + * + */ + typedef void + (*T2_Hints_OpenFunc)( T2_Hints hints ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_StemsFunc + * + * @description: + * A method of the @T2_Hints class used to set the table of stems in + * either the vertical or horizontal dimension. Equivalent to the + * `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * dimension :: + * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). + * + * count :: + * The number of stems. + * + * coords :: + * An array of `count' (position,length) pairs in 16.16 format. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * There are `2*count' elements in the `coords' array. Each even + * element is an absolute position in font units, each odd element is a + * length in font units. + * + * A length can be negative, in which case it must be either -20 or + * -21. It is interpreted as a `ghost' stem, according to the Type 1 + * specification. + * + */ + typedef void + (*T2_Hints_StemsFunc)( T2_Hints hints, + FT_UInt dimension, + FT_UInt count, + FT_Fixed* coordinates ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_MaskFunc + * + * @description: + * A method of the @T2_Hints class used to set a given hintmask (this + * corresponds to the `hintmask' Type 2 operator). + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * The glyph index of the last point to which the previously defined + * or activated hints apply. + * + * bit_count :: + * The number of bits in the hint mask. + * + * bytes :: + * An array of bytes modelling the hint mask. + * + * @note: + * If the hintmask starts the charstring (before any glyph point + * definition), the value of `end_point' should be 0. + * + * `bit_count' is the number of meaningful bits in the `bytes' array; it + * must be equal to the total number of hints defined so far (i.e., + * horizontal+verticals). + * + * The `bytes' array can come directly from the Type 2 charstring and + * respects the same format. + * + */ + typedef void + (*T2_Hints_MaskFunc)( T2_Hints hints, + FT_UInt end_point, + FT_UInt bit_count, + const FT_Byte* bytes ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_CounterFunc + * + * @description: + * A method of the @T2_Hints class used to set a given counter mask + * (this corresponds to the `hintmask' Type 2 operator). + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * A glyph index of the last point to which the previously defined or + * active hints apply. + * + * bit_count :: + * The number of bits in the hint mask. + * + * bytes :: + * An array of bytes modelling the hint mask. + * + * @note: + * If the hintmask starts the charstring (before any glyph point + * definition), the value of `end_point' should be 0. + * + * `bit_count' is the number of meaningful bits in the `bytes' array; it + * must be equal to the total number of hints defined so far (i.e., + * horizontal+verticals). + * + * The `bytes' array can come directly from the Type 2 charstring and + * respects the same format. + * + */ + typedef void + (*T2_Hints_CounterFunc)( T2_Hints hints, + FT_UInt bit_count, + const FT_Byte* bytes ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_CloseFunc + * + * @description: + * A method of the @T2_Hints class used to close a hint recording + * session. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The error code is set to indicate that an error occurred during the + * recording session. + * + */ + typedef FT_Error + (*T2_Hints_CloseFunc)( T2_Hints hints, + FT_UInt end_point ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_ApplyFunc + * + * @description: + * A method of the @T2_Hints class used to apply hints to the + * corresponding glyph outline. Must be called after the `close' + * method. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * outline :: + * A pointer to the target outline descriptor. + * + * globals :: + * The hinter globals for this font. + * + * hint_mode :: + * Hinting information. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * On input, all points within the outline are in font coordinates. On + * output, they are in 1/64th of pixels. + * + * The scaling transformation is taken from the `globals' object which + * must correspond to the same font than the glyph. + * + */ + typedef FT_Error + (*T2_Hints_ApplyFunc)( T2_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + + /************************************************************************* + * + * @struct: + * T2_Hints_FuncsRec + * + * @description: + * The structure used to provide the API to @T2_Hints objects. + * + * @fields: + * hints :: + * A handle to the T2 hints recorder object. + * + * open :: + * The function to open a recording session. + * + * close :: + * The function to close a recording session. + * + * stems :: + * The function to set the dimension's stems table. + * + * hintmask :: + * The function to set hint masks. + * + * counter :: + * The function to set counter masks. + * + * apply :: + * The function to apply the hints on the corresponding glyph outline. + * + */ + typedef struct T2_Hints_FuncsRec_ + { + T2_Hints hints; + T2_Hints_OpenFunc open; + T2_Hints_CloseFunc close; + T2_Hints_StemsFunc stems; + T2_Hints_MaskFunc hintmask; + T2_Hints_CounterFunc counter; + T2_Hints_ApplyFunc apply; + + } T2_Hints_FuncsRec; + + + /* */ + + + typedef struct PSHinter_Interface_ + { + PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module ); + T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module ); + T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module ); + + } PSHinter_Interface; + + typedef PSHinter_Interface* PSHinter_Service; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_PSHINTER_INTERFACE(class_, get_globals_funcs_, \ + get_t1_funcs_, get_t2_funcs_) \ + static const PSHinter_Interface class_ = \ + { \ + get_globals_funcs_, get_t1_funcs_, get_t2_funcs_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_PSHINTER_INTERFACE(class_, get_globals_funcs_, \ + get_t1_funcs_, get_t2_funcs_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + PSHinter_Interface* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->get_globals_funcs = get_globals_funcs_; \ + clazz->get_t1_funcs = get_t1_funcs_; \ + clazz->get_t2_funcs = get_t2_funcs_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + +FT_END_HEADER + +#endif /* __PSHINTS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svbdf.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svbdf.h new file mode 100644 index 00000000..92642391 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svbdf.h @@ -0,0 +1,77 @@ +/***************************************************************************/ +/* */ +/* svbdf.h */ +/* */ +/* The FreeType BDF services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVBDF_H__ +#define __SVBDF_H__ + +#include FT_BDF_H +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_BDF "bdf" + + typedef FT_Error + (*FT_BDF_GetCharsetIdFunc)( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + typedef FT_Error + (*FT_BDF_GetPropertyFunc)( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + + FT_DEFINE_SERVICE( BDF ) + { + FT_BDF_GetCharsetIdFunc get_charset_id; + FT_BDF_GetPropertyFunc get_property; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_BDFRec(class_, get_charset_id_, get_property_) \ + static const FT_Service_BDFRec class_ = \ + { \ + get_charset_id_, get_property_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_BDFRec(class_, get_charset_id_, get_property_) \ + void \ + FT_Init_Class_##class_( FT_Service_BDFRec* clazz ) \ + { \ + clazz->get_charset_id = get_charset_id_; \ + clazz->get_property = get_property_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVBDF_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svcid.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svcid.h new file mode 100644 index 00000000..9b874b5e --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svcid.h @@ -0,0 +1,83 @@ +/***************************************************************************/ +/* */ +/* svcid.h */ +/* */ +/* The FreeType CID font services (specification). */ +/* */ +/* Copyright 2007, 2009 by Derek Clegg, Michael Toftdal. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVCID_H__ +#define __SVCID_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_CID "CID" + + typedef FT_Error + (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ); + typedef FT_Error + (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face face, + FT_Bool *is_cid ); + typedef FT_Error + (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + FT_DEFINE_SERVICE( CID ) + { + FT_CID_GetRegistryOrderingSupplementFunc get_ros; + FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid; + FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_CIDREC(class_, get_ros_, \ + get_is_cid_, get_cid_from_glyph_index_ ) \ + static const FT_Service_CIDRec class_ = \ + { \ + get_ros_, get_is_cid_, get_cid_from_glyph_index_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_CIDREC(class_, get_ros_, \ + get_is_cid_, get_cid_from_glyph_index_ ) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_Service_CIDRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->get_ros = get_ros_; \ + clazz->get_is_cid = get_is_cid_; \ + clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVCID_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svgldict.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svgldict.h new file mode 100644 index 00000000..d66a41d5 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svgldict.h @@ -0,0 +1,82 @@ +/***************************************************************************/ +/* */ +/* svgldict.h */ +/* */ +/* The FreeType glyph dictionary services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVGLDICT_H__ +#define __SVGLDICT_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service used to retrieve glyph names, as well as to find the + * index of a given glyph name in a font. + * + */ + +#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict" + + + typedef FT_Error + (*FT_GlyphDict_GetNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_GlyphDict_NameIndexFunc)( FT_Face face, + FT_String* glyph_name ); + + + FT_DEFINE_SERVICE( GlyphDict ) + { + FT_GlyphDict_GetNameFunc get_name; + FT_GlyphDict_NameIndexFunc name_index; /* optional */ + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_GLYPHDICTREC(class_, get_name_, name_index_) \ + static const FT_Service_GlyphDictRec class_ = \ + { \ + get_name_, name_index_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_GLYPHDICTREC(class_, get_name_, name_index_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_Service_GlyphDictRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->get_name = get_name_; \ + clazz->name_index = name_index_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVGLDICT_H__ */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svgxval.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svgxval.h new file mode 100644 index 00000000..2cdab506 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svgxval.h @@ -0,0 +1,72 @@ +/***************************************************************************/ +/* */ +/* svgxval.h */ +/* */ +/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ +/* */ +/* Copyright 2004, 2005 by */ +/* Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVGXVAL_H__ +#define __SVGXVAL_H__ + +#include FT_GX_VALIDATE_H +#include FT_INTERNAL_VALIDATE_H + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_GX_VALIDATE "truetypegx-validate" +#define FT_SERVICE_ID_CLASSICKERN_VALIDATE "classickern-validate" + + typedef FT_Error + (*gxv_validate_func)( FT_Face face, + FT_UInt gx_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + typedef FT_Error + (*ckern_validate_func)( FT_Face face, + FT_UInt ckern_flags, + FT_Bytes *ckern_table ); + + + FT_DEFINE_SERVICE( GXvalidate ) + { + gxv_validate_func validate; + }; + + FT_DEFINE_SERVICE( CKERNvalidate ) + { + ckern_validate_func validate; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVGXVAL_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svkern.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svkern.h new file mode 100644 index 00000000..1488adf4 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svkern.h @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* svkern.h */ +/* */ +/* The FreeType Kerning service (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVKERN_H__ +#define __SVKERN_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + +#define FT_SERVICE_ID_KERNING "kerning" + + + typedef FT_Error + (*FT_Kerning_TrackGetFunc)( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + FT_DEFINE_SERVICE( Kerning ) + { + FT_Kerning_TrackGetFunc get_track; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVKERN_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svmm.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svmm.h new file mode 100644 index 00000000..66e1da22 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svmm.h @@ -0,0 +1,104 @@ +/***************************************************************************/ +/* */ +/* svmm.h */ +/* */ +/* The FreeType Multiple Masters and GX var services (specification). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVMM_H__ +#define __SVMM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service used to manage multiple-masters data in a given face. + * + * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H). + * + */ + +#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters" + + + typedef FT_Error + (*FT_Get_MM_Func)( FT_Face face, + FT_Multi_Master* master ); + + typedef FT_Error + (*FT_Get_MM_Var_Func)( FT_Face face, + FT_MM_Var* *master ); + + typedef FT_Error + (*FT_Set_MM_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + typedef FT_Error + (*FT_Set_Var_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + typedef FT_Error + (*FT_Set_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + FT_DEFINE_SERVICE( MultiMasters ) + { + FT_Get_MM_Func get_mm; + FT_Set_MM_Design_Func set_mm_design; + FT_Set_MM_Blend_Func set_mm_blend; + FT_Get_MM_Var_Func get_mm_var; + FT_Set_Var_Design_Func set_var_design; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_MULTIMASTERSREC(class_, get_mm_, set_mm_design_, \ + set_mm_blend_, get_mm_var_, set_var_design_) \ + static const FT_Service_MultiMastersRec class_ = \ + { \ + get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_MULTIMASTERSREC(class_, get_mm_, set_mm_design_, \ + set_mm_blend_, get_mm_var_, set_var_design_) \ + void \ + FT_Init_Class_##class_( FT_Service_MultiMastersRec* clazz ) \ + { \ + clazz->get_mm = get_mm_; \ + clazz->set_mm_design = set_mm_design_; \ + clazz->set_mm_blend = set_mm_blend_; \ + clazz->get_mm_var = get_mm_var_; \ + clazz->set_var_design = set_var_design_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + +#endif /* __SVMM_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svotval.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svotval.h new file mode 100644 index 00000000..970bbd57 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svotval.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* svotval.h */ +/* */ +/* The FreeType OpenType validation service (specification). */ +/* */ +/* Copyright 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVOTVAL_H__ +#define __SVOTVAL_H__ + +#include FT_OPENTYPE_VALIDATE_H +#include FT_INTERNAL_VALIDATE_H + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_OPENTYPE_VALIDATE "opentype-validate" + + + typedef FT_Error + (*otv_validate_func)( FT_Face volatile face, + FT_UInt ot_flags, + FT_Bytes *base, + FT_Bytes *gdef, + FT_Bytes *gpos, + FT_Bytes *gsub, + FT_Bytes *jstf ); + + + FT_DEFINE_SERVICE( OTvalidate ) + { + otv_validate_func validate; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVOTVAL_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpfr.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpfr.h new file mode 100644 index 00000000..462786f9 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpfr.h @@ -0,0 +1,66 @@ +/***************************************************************************/ +/* */ +/* svpfr.h */ +/* */ +/* Internal PFR service functions (specification). */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPFR_H__ +#define __SVPFR_H__ + +#include FT_PFR_H +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics" + + + typedef FT_Error + (*FT_PFR_GetMetricsFunc)( FT_Face face, + FT_UInt *aoutline, + FT_UInt *ametrics, + FT_Fixed *ax_scale, + FT_Fixed *ay_scale ); + + typedef FT_Error + (*FT_PFR_GetKerningFunc)( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + typedef FT_Error + (*FT_PFR_GetAdvanceFunc)( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + + FT_DEFINE_SERVICE( PfrMetrics ) + { + FT_PFR_GetMetricsFunc get_metrics; + FT_PFR_GetKerningFunc get_kerning; + FT_PFR_GetAdvanceFunc get_advance; + + }; + + /* */ + +FT_END_HEADER + +#endif /* __SVPFR_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpostnm.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpostnm.h new file mode 100644 index 00000000..106c54f8 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpostnm.h @@ -0,0 +1,79 @@ +/***************************************************************************/ +/* */ +/* svpostnm.h */ +/* */ +/* The FreeType PostScript name services (specification). */ +/* */ +/* Copyright 2003, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPOSTNM_H__ +#define __SVPOSTNM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + /* + * A trivial service used to retrieve the PostScript name of a given + * font when available. The `get_name' field should never be NULL. + * + * The corresponding function can return NULL to indicate that the + * PostScript name is not available. + * + * The name is owned by the face and will be destroyed with it. + */ + +#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name" + + + typedef const char* + (*FT_PsName_GetFunc)( FT_Face face ); + + + FT_DEFINE_SERVICE( PsFontName ) + { + FT_PsName_GetFunc get_ps_font_name; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_PSFONTNAMEREC(class_, get_ps_font_name_) \ + static const FT_Service_PsFontNameRec class_ = \ + { \ + get_ps_font_name_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_PSFONTNAMEREC(class_, get_ps_font_name_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_Service_PsFontNameRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->get_ps_font_name = get_ps_font_name_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPOSTNM_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpscmap.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpscmap.h new file mode 100644 index 00000000..961030cc --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpscmap.h @@ -0,0 +1,164 @@ +/***************************************************************************/ +/* */ +/* svpscmap.h */ +/* */ +/* The FreeType PostScript charmap service (specification). */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPSCMAP_H__ +#define __SVPSCMAP_H__ + +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps" + + + /* + * Adobe glyph name to unicode value. + */ + typedef FT_UInt32 + (*PS_Unicode_ValueFunc)( const char* glyph_name ); + + /* + * Macintosh name id to glyph name. NULL if invalid index. + */ + typedef const char* + (*PS_Macintosh_NameFunc)( FT_UInt name_index ); + + /* + * Adobe standard string ID to glyph name. NULL if invalid index. + */ + typedef const char* + (*PS_Adobe_Std_StringsFunc)( FT_UInt string_index ); + + + /* + * Simple unicode -> glyph index charmap built from font glyph names + * table. + */ + typedef struct PS_UniMap_ + { + FT_UInt32 unicode; /* bit 31 set: is glyph variant */ + FT_UInt glyph_index; + + } PS_UniMap; + + + typedef struct PS_UnicodesRec_* PS_Unicodes; + + typedef struct PS_UnicodesRec_ + { + FT_CMapRec cmap; + FT_UInt num_maps; + PS_UniMap* maps; + + } PS_UnicodesRec; + + + /* + * A function which returns a glyph name for a given index. Returns + * NULL if invalid index. + */ + typedef const char* + (*PS_GetGlyphNameFunc)( FT_Pointer data, + FT_UInt string_index ); + + /* + * A function used to release the glyph name returned by + * PS_GetGlyphNameFunc, when needed + */ + typedef void + (*PS_FreeGlyphNameFunc)( FT_Pointer data, + const char* name ); + + typedef FT_Error + (*PS_Unicodes_InitFunc)( FT_Memory memory, + PS_Unicodes unicodes, + FT_UInt num_glyphs, + PS_GetGlyphNameFunc get_glyph_name, + PS_FreeGlyphNameFunc free_glyph_name, + FT_Pointer glyph_data ); + + typedef FT_UInt + (*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes, + FT_UInt32 unicode ); + + typedef FT_UInt32 + (*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes, + FT_UInt32 *unicode ); + + + FT_DEFINE_SERVICE( PsCMaps ) + { + PS_Unicode_ValueFunc unicode_value; + + PS_Unicodes_InitFunc unicodes_init; + PS_Unicodes_CharIndexFunc unicodes_char_index; + PS_Unicodes_CharNextFunc unicodes_char_next; + + PS_Macintosh_NameFunc macintosh_name; + PS_Adobe_Std_StringsFunc adobe_std_strings; + const unsigned short* adobe_std_encoding; + const unsigned short* adobe_expert_encoding; + }; + + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_PSCMAPSREC(class_, unicode_value_, unicodes_init_, \ + unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ + adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_) \ + static const FT_Service_PsCMapsRec class_ = \ + { \ + unicode_value_, unicodes_init_, \ + unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ + adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_PSCMAPSREC(class_, unicode_value_, unicodes_init_, \ + unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ + adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_Service_PsCMapsRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->unicode_value = unicode_value_; \ + clazz->unicodes_init = unicodes_init_; \ + clazz->unicodes_char_index = unicodes_char_index_; \ + clazz->unicodes_char_next = unicodes_char_next_; \ + clazz->macintosh_name = macintosh_name_; \ + clazz->adobe_std_strings = adobe_std_strings_; \ + clazz->adobe_std_encoding = adobe_std_encoding_; \ + clazz->adobe_expert_encoding = adobe_expert_encoding_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPSCMAP_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpsinfo.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpsinfo.h new file mode 100644 index 00000000..91ba91e5 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpsinfo.h @@ -0,0 +1,92 @@ +/***************************************************************************/ +/* */ +/* svpsinfo.h */ +/* */ +/* The FreeType PostScript info service (specification). */ +/* */ +/* Copyright 2003, 2004, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPSINFO_H__ +#define __SVPSINFO_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info" + + + typedef FT_Error + (*PS_GetFontInfoFunc)( FT_Face face, + PS_FontInfoRec* afont_info ); + + typedef FT_Error + (*PS_GetFontExtraFunc)( FT_Face face, + PS_FontExtraRec* afont_extra ); + + typedef FT_Int + (*PS_HasGlyphNamesFunc)( FT_Face face ); + + typedef FT_Error + (*PS_GetFontPrivateFunc)( FT_Face face, + PS_PrivateRec* afont_private ); + + + FT_DEFINE_SERVICE( PsInfo ) + { + PS_GetFontInfoFunc ps_get_font_info; + PS_GetFontExtraFunc ps_get_font_extra; + PS_HasGlyphNamesFunc ps_has_glyph_names; + PS_GetFontPrivateFunc ps_get_font_private; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_PSINFOREC(class_, get_font_info_, \ + ps_get_font_extra_, has_glyph_names_, get_font_private_) \ + static const FT_Service_PsInfoRec class_ = \ + { \ + get_font_info_, ps_get_font_extra_, has_glyph_names_, \ + get_font_private_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_PSINFOREC(class_, get_font_info_, \ + ps_get_font_extra_, has_glyph_names_, get_font_private_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_Service_PsInfoRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->ps_get_font_info = get_font_info_; \ + clazz->ps_get_font_extra = ps_get_font_extra_; \ + clazz->ps_has_glyph_names = has_glyph_names_; \ + clazz->ps_get_font_private = get_font_private_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPSINFO_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svsfnt.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svsfnt.h new file mode 100644 index 00000000..30bb1620 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svsfnt.h @@ -0,0 +1,102 @@ +/***************************************************************************/ +/* */ +/* svsfnt.h */ +/* */ +/* The FreeType SFNT table loading service (specification). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVSFNT_H__ +#define __SVSFNT_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table" + + + /* + * Used to implement FT_Load_Sfnt_Table(). + */ + typedef FT_Error + (*FT_SFNT_TableLoadFunc)( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + /* + * Used to implement FT_Get_Sfnt_Table(). + */ + typedef void* + (*FT_SFNT_TableGetFunc)( FT_Face face, + FT_Sfnt_Tag tag ); + + + /* + * Used to implement FT_Sfnt_Table_Info(). + */ + typedef FT_Error + (*FT_SFNT_TableInfoFunc)( FT_Face face, + FT_UInt idx, + FT_ULong *tag, + FT_ULong *offset, + FT_ULong *length ); + + + FT_DEFINE_SERVICE( SFNT_Table ) + { + FT_SFNT_TableLoadFunc load_table; + FT_SFNT_TableGetFunc get_table; + FT_SFNT_TableInfoFunc table_info; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_SFNT_TABLEREC(class_, load_, get_, info_) \ + static const FT_Service_SFNT_TableRec class_ = \ + { \ + load_, get_, info_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_SFNT_TABLEREC(class_, load_, get_, info_) \ + void \ + FT_Init_Class_##class_( FT_Service_SFNT_TableRec* clazz ) \ + { \ + clazz->load_table = load_; \ + clazz->get_table = get_; \ + clazz->table_info = info_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVSFNT_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svttcmap.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svttcmap.h new file mode 100644 index 00000000..8af00351 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svttcmap.h @@ -0,0 +1,106 @@ +/***************************************************************************/ +/* */ +/* svttcmap.h */ +/* */ +/* The FreeType TrueType/sfnt cmap extra information service. */ +/* */ +/* Copyright 2003 by */ +/* Masatake YAMATO, Redhat K.K. */ +/* */ +/* Copyright 2003, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/* Development of this service is support of + Information-technology Promotion Agency, Japan. */ + +#ifndef __SVTTCMAP_H__ +#define __SVTTCMAP_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_CMAP "tt-cmaps" + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_CMapInfo */ + /* */ + /* <Description> */ + /* A structure used to store TrueType/sfnt specific cmap information */ + /* which is not covered by the generic @FT_CharMap structure. This */ + /* structure can be accessed with the @FT_Get_TT_CMap_Info function. */ + /* */ + /* <Fields> */ + /* language :: */ + /* The language ID used in Mac fonts. Definitions of values are in */ + /* freetype/ttnameid.h. */ + /* */ + /* format :: */ + /* The cmap format. OpenType 1.5 defines the formats 0 (byte */ + /* encoding table), 2~(high-byte mapping through table), 4~(segment */ + /* mapping to delta values), 6~(trimmed table mapping), 8~(mixed */ + /* 16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented */ + /* coverage), and 14 (Unicode Variation Sequences). */ + /* */ + typedef struct TT_CMapInfo_ + { + FT_ULong language; + FT_Long format; + + } TT_CMapInfo; + + + typedef FT_Error + (*TT_CMap_Info_GetFunc)( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + + FT_DEFINE_SERVICE( TTCMaps ) + { + TT_CMap_Info_GetFunc get_cmap_info; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_TTCMAPSREC(class_, get_cmap_info_) \ + static const FT_Service_TTCMapsRec class_ = \ + { \ + get_cmap_info_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_TTCMAPSREC(class_, get_cmap_info_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_Service_TTCMapsRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->get_cmap_info = get_cmap_info_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + +#endif /* __SVTTCMAP_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svtteng.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svtteng.h new file mode 100644 index 00000000..58e02a6f --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svtteng.h @@ -0,0 +1,53 @@ +/***************************************************************************/ +/* */ +/* svtteng.h */ +/* */ +/* The FreeType TrueType engine query service (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVTTENG_H__ +#define __SVTTENG_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_TRUETYPE_ENGINE "truetype-engine" + + /* + * Used to implement FT_Get_TrueType_Engine_Type + */ + + FT_DEFINE_SERVICE( TrueTypeEngine ) + { + FT_TrueTypeEngineType engine_type; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVTTENG_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svttglyf.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svttglyf.h new file mode 100644 index 00000000..ab2dc9a9 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svttglyf.h @@ -0,0 +1,67 @@ +/***************************************************************************/ +/* */ +/* svttglyf.h */ +/* */ +/* The FreeType TrueType glyph service. */ +/* */ +/* Copyright 2007 by David Turner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __SVTTGLYF_H__ +#define __SVTTGLYF_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_GLYF "tt-glyf" + + + typedef FT_ULong + (*TT_Glyf_GetLocationFunc)( FT_Face face, + FT_UInt gindex, + FT_ULong *psize ); + + FT_DEFINE_SERVICE( TTGlyf ) + { + TT_Glyf_GetLocationFunc get_location; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_TTGLYFREC(class_, get_location_ ) \ + static const FT_Service_TTGlyfRec class_ = \ + { \ + get_location_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_TTGLYFREC(class_, get_location_ ) \ + void \ + FT_Init_Class_##class_( FT_Service_TTGlyfRec* clazz ) \ + { \ + clazz->get_location = get_location_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + +#endif /* __SVTTGLYF_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svwinfnt.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svwinfnt.h new file mode 100644 index 00000000..57f7765d --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svwinfnt.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* svwinfnt.h */ +/* */ +/* The FreeType Windows FNT/FONT service (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVWINFNT_H__ +#define __SVWINFNT_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_WINFONTS_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_WINFNT "winfonts" + + typedef FT_Error + (*FT_WinFnt_GetHeaderFunc)( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + + FT_DEFINE_SERVICE( WinFnt ) + { + FT_WinFnt_GetHeaderFunc get_header; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVWINFNT_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svxf86nm.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svxf86nm.h new file mode 100644 index 00000000..ca5d884a --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svxf86nm.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* svxf86nm.h */ +/* */ +/* The FreeType XFree86 services (specification only). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVXF86NM_H__ +#define __SVXF86NM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A trivial service used to return the name of a face's font driver, + * according to the XFree86 nomenclature. Note that the service data + * is a simple constant string pointer. + */ + +#define FT_SERVICE_ID_XF86_NAME "xf86-driver-name" + +#define FT_XF86_FORMAT_TRUETYPE "TrueType" +#define FT_XF86_FORMAT_TYPE_1 "Type 1" +#define FT_XF86_FORMAT_BDF "BDF" +#define FT_XF86_FORMAT_PCF "PCF" +#define FT_XF86_FORMAT_TYPE_42 "Type 42" +#define FT_XF86_FORMAT_CID "CID Type 1" +#define FT_XF86_FORMAT_CFF "CFF" +#define FT_XF86_FORMAT_PFR "PFR" +#define FT_XF86_FORMAT_WINFNT "Windows FNT" + + /* */ + + +FT_END_HEADER + + +#endif /* __SVXF86NM_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/sfnt.h b/android/jni/ndk_modules/freetype/include/freetype/internal/sfnt.h new file mode 100644 index 00000000..6326debd --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/sfnt.h @@ -0,0 +1,897 @@ +/***************************************************************************/ +/* */ +/* sfnt.h */ +/* */ +/* High-level `sfnt' driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFNT_H__ +#define __SFNT_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Init_Face_Func */ + /* */ + /* <Description> */ + /* First part of the SFNT face object initialization. This finds */ + /* the face in a SFNT file or collection, and load its format tag in */ + /* face->format_tag. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* params :: Optional additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the font file's origin. */ + /* */ + /* This function recognizes fonts embedded in a `TrueType */ + /* collection'. */ + /* */ + /* Once the format tag has been validated by the font driver, it */ + /* should then call the TT_Load_Face_Func() callback to read the rest */ + /* of the SFNT tables in the object. */ + /* */ + typedef FT_Error + (*TT_Init_Face_Func)( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Face_Func */ + /* */ + /* <Description> */ + /* Second part of the SFNT face object initialization. This loads */ + /* the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the */ + /* face object. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* params :: Optional additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function must be called after TT_Init_Face_Func(). */ + /* */ + typedef FT_Error + (*TT_Load_Face_Func)( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Done_Face_Func */ + /* */ + /* <Description> */ + /* A callback used to delete the common SFNT data from a face. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Note> */ + /* This function does NOT destroy the face object. */ + /* */ + typedef void + (*TT_Done_Face_Func)( TT_Face face ); + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SFNT_HeaderRec_Func */ + /* */ + /* <Description> */ + /* Loads the header of a SFNT font file. Supports collections. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection. */ + /* */ + /* <Output> */ + /* sfnt :: The SFNT header. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the font file's origin. */ + /* */ + /* This function recognizes fonts embedded in a `TrueType */ + /* collection'. */ + /* */ + /* This function checks that the header is valid by looking at the */ + /* values of `search_range', `entry_selector', and `range_shift'. */ + /* */ + typedef FT_Error + (*TT_Load_SFNT_HeaderRec_Func)( TT_Face face, + FT_Stream stream, + FT_Long face_index, + SFNT_Header sfnt ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Directory_Func */ + /* */ + /* <Description> */ + /* Loads the table directory into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* sfnt :: The SFNT header. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be on the first byte after the 4-byte font */ + /* format tag. This is the case just after a call to */ + /* TT_Load_Format_Tag(). */ + /* */ + typedef FT_Error + (*TT_Load_Directory_Func)( TT_Face face, + FT_Stream stream, + SFNT_Header sfnt ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Any_Func */ + /* */ + /* <Description> */ + /* Load any font table into client memory. */ + /* */ + /* <Input> */ + /* face :: The face object to look for. */ + /* */ + /* tag :: The tag of table to load. Use the value 0 if you want */ + /* to access the whole font file, else set this parameter */ + /* to a valid TrueType table tag that you can forge with */ + /* the MAKE_TT_TAG macro. */ + /* */ + /* offset :: The starting offset in the table (or the file if */ + /* tag == 0). */ + /* */ + /* length :: The address of the decision variable: */ + /* */ + /* If length == NULL: */ + /* Loads the whole table. Returns an error if */ + /* `offset' == 0! */ + /* */ + /* If *length == 0: */ + /* Exits immediately; returning the length of the given */ + /* table or of the font file, depending on the value of */ + /* `tag'. */ + /* */ + /* If *length != 0: */ + /* Loads the next `length' bytes of table or font, */ + /* starting at offset `offset' (in table or font too). */ + /* */ + /* <Output> */ + /* buffer :: The address of target buffer. */ + /* */ + /* <Return> */ + /* TrueType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Load_Any_Func)( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte *buffer, + FT_ULong* length ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Find_SBit_Image_Func */ + /* */ + /* <Description> */ + /* Check whether an embedded bitmap (an `sbit') exists for a given */ + /* glyph, at a given strike. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike_index :: The current strike index. */ + /* */ + /* <Output> */ + /* arange :: The SBit range containing the glyph index. */ + /* */ + /* astrike :: The SBit strike containing the glyph index. */ + /* */ + /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns */ + /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */ + /* glyph. */ + /* */ + typedef FT_Error + (*TT_Find_SBit_Image_Func)( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SBit_Metrics_Func */ + /* */ + /* <Description> */ + /* Get the big metrics for a given embedded bitmap. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* range :: The SBit range containing the glyph. */ + /* */ + /* <Output> */ + /* big_metrics :: A big SBit metrics structure for the glyph. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be positioned at the glyph's offset within */ + /* the `EBDT' table before the call. */ + /* */ + /* If the image format uses variable metrics, the stream cursor is */ + /* positioned just after the metrics header in the `EBDT' table on */ + /* function exit. */ + /* */ + typedef FT_Error + (*TT_Load_SBit_Metrics_Func)( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SBit_Image_Func */ + /* */ + /* <Description> */ + /* Load a given glyph sbit image from the font resource. This also */ + /* returns its metrics. */ + /* */ + /* <Input> */ + /* face :: */ + /* The target face object. */ + /* */ + /* strike_index :: */ + /* The strike index. */ + /* */ + /* glyph_index :: */ + /* The current glyph index. */ + /* */ + /* load_flags :: */ + /* The current load flags. */ + /* */ + /* stream :: */ + /* The input stream. */ + /* */ + /* <Output> */ + /* amap :: */ + /* The target pixmap. */ + /* */ + /* ametrics :: */ + /* A big sbit metrics structure for the glyph image. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* glyph sbit exists for the index. */ + /* */ + /* <Note> */ + /* The `map.buffer' field is always freed before the glyph is loaded. */ + /* */ + typedef FT_Error + (*TT_Load_SBit_Image_Func)( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *amap, + TT_SBit_MetricsRec *ametrics ); + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Set_SBit_Strike_OldFunc */ + /* */ + /* <Description> */ + /* Select an sbit strike for a given size request. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* req :: The size request. */ + /* */ + /* <Output> */ + /* astrike_index :: The index of the sbit strike. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* sbit strike exists for the selected ppem values. */ + /* */ + typedef FT_Error + (*TT_Set_SBit_Strike_OldFunc)( TT_Face face, + FT_UInt x_ppem, + FT_UInt y_ppem, + FT_ULong* astrike_index ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_CharMap_Load_Func */ + /* */ + /* <Description> */ + /* Loads a given TrueType character map into memory. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face object. */ + /* */ + /* stream :: A handle to the current stream object. */ + /* */ + /* <InOut> */ + /* cmap :: A pointer to a cmap object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The function assumes that the stream is already in use (i.e., */ + /* opened). In case of error, all partially allocated tables are */ + /* released. */ + /* */ + typedef FT_Error + (*TT_CharMap_Load_Func)( TT_Face face, + void* cmap, + FT_Stream input ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_CharMap_Free_Func */ + /* */ + /* <Description> */ + /* Destroys a character mapping table. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face object. */ + /* */ + /* cmap :: A handle to a cmap object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_CharMap_Free_Func)( TT_Face face, + void* cmap ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Set_SBit_Strike_Func */ + /* */ + /* <Description> */ + /* Select an sbit strike for a given size request. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* req :: The size request. */ + /* */ + /* <Output> */ + /* astrike_index :: The index of the sbit strike. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* sbit strike exists for the selected ppem values. */ + /* */ + typedef FT_Error + (*TT_Set_SBit_Strike_Func)( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Strike_Metrics_Func */ + /* */ + /* <Description> */ + /* Load the metrics of a given strike. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* strike_index :: The strike index. */ + /* */ + /* <Output> */ + /* metrics :: the metrics of the strike. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* such sbit strike exists. */ + /* */ + typedef FT_Error + (*TT_Load_Strike_Metrics_Func)( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Get_PS_Name_Func */ + /* */ + /* <Description> */ + /* Get the PostScript glyph name of a glyph. */ + /* */ + /* <Input> */ + /* idx :: The glyph index. */ + /* */ + /* PSname :: The address of a string pointer. Will be NULL in case */ + /* of error, otherwise it is a pointer to the glyph name. */ + /* */ + /* You must not modify the returned string! */ + /* */ + /* <Output> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Get_PS_Name_Func)( TT_Face face, + FT_UInt idx, + FT_String** PSname ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Metrics_Func */ + /* */ + /* <Description> */ + /* Load a metrics table, which is a table with a horizontal and a */ + /* vertical version. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load the vertical one. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Load_Metrics_Func)( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Get_Metrics_Func */ + /* */ + /* <Description> */ + /* Load the horizontal or vertical header in a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load vertical metrics. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Get_Metrics_Func)( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Table_Func */ + /* */ + /* <Description> */ + /* Load a given TrueType table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The function uses `face->goto_table' to seek the stream to the */ + /* start of the table, except while loading the font directory. */ + /* */ + typedef FT_Error + (*TT_Load_Table_Func)( TT_Face face, + FT_Stream stream ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Free_Table_Func */ + /* */ + /* <Description> */ + /* Free a given TrueType table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + typedef void + (*TT_Free_Table_Func)( TT_Face face ); + + + /* + * @functype: + * TT_Face_GetKerningFunc + * + * @description: + * Return the horizontal kerning value between two glyphs. + * + * @input: + * face :: A handle to the source face object. + * left_glyph :: The left glyph index. + * right_glyph :: The right glyph index. + * + * @return: + * The kerning value in font units. + */ + typedef FT_Int + (*TT_Face_GetKerningFunc)( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* SFNT_Interface */ + /* */ + /* <Description> */ + /* This structure holds pointers to the functions used to load and */ + /* free the basic tables that are required in a `sfnt' font file. */ + /* */ + /* <Fields> */ + /* Check the various xxx_Func() descriptions for details. */ + /* */ + typedef struct SFNT_Interface_ + { + TT_Loader_GotoTableFunc goto_table; + + TT_Init_Face_Func init_face; + TT_Load_Face_Func load_face; + TT_Done_Face_Func done_face; + FT_Module_Requester get_interface; + + TT_Load_Any_Func load_any; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_Load_SFNT_HeaderRec_Func load_sfnt_header; + TT_Load_Directory_Func load_directory; +#endif + + /* these functions are called by `load_face' but they can also */ + /* be called from external modules, if there is a need to do so */ + TT_Load_Table_Func load_head; + TT_Load_Metrics_Func load_hhea; + TT_Load_Table_Func load_cmap; + TT_Load_Table_Func load_maxp; + TT_Load_Table_Func load_os2; + TT_Load_Table_Func load_post; + + TT_Load_Table_Func load_name; + TT_Free_Table_Func free_name; + + /* optional tables */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_Load_Table_Func load_hdmx_stub; + TT_Free_Table_Func free_hdmx_stub; +#endif + + /* this field was called `load_kerning' up to version 2.1.10 */ + TT_Load_Table_Func load_kern; + + TT_Load_Table_Func load_gasp; + TT_Load_Table_Func load_pclt; + + /* see `ttload.h'; this field was called `load_bitmap_header' up to */ + /* version 2.1.10 */ + TT_Load_Table_Func load_bhed; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* see `ttsbit.h' */ + TT_Set_SBit_Strike_OldFunc set_sbit_strike_stub; + TT_Load_Table_Func load_sbits_stub; + + /* + * The following two fields appeared in version 2.1.8, and were placed + * between `load_sbits' and `load_sbit_image'. We support them as a + * special exception since they are used by Xfont library within the + * X.Org xserver, and because the probability that other rogue clients + * use the other version 2.1.7 fields below is _extremely_ low. + * + * Note that this forces us to disable an interesting memory-saving + * optimization though... + */ + + TT_Find_SBit_Image_Func find_sbit_image; + TT_Load_SBit_Metrics_Func load_sbit_metrics; + +#endif + + TT_Load_SBit_Image_Func load_sbit_image; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_Free_Table_Func free_sbits_stub; +#endif + + /* see `ttpost.h' */ + TT_Get_PS_Name_Func get_psname; + TT_Free_Table_Func free_psnames; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_CharMap_Load_Func load_charmap_stub; + TT_CharMap_Free_Func free_charmap_stub; +#endif + + /* starting here, the structure differs from version 2.1.7 */ + + /* this field was introduced in version 2.1.8, named `get_psname' */ + TT_Face_GetKerningFunc get_kerning; + + /* new elements introduced after version 2.1.10 */ + + /* load the font directory, i.e., the offset table and */ + /* the table directory */ + TT_Load_Table_Func load_font_dir; + TT_Load_Metrics_Func load_hmtx; + + TT_Load_Table_Func load_eblc; + TT_Free_Table_Func free_eblc; + + TT_Set_SBit_Strike_Func set_sbit_strike; + TT_Load_Strike_Metrics_Func load_strike_metrics; + + TT_Get_Metrics_Func get_metrics; + + } SFNT_Interface; + + + /* transitional */ + typedef SFNT_Interface* SFNT_Service; + +#ifndef FT_CONFIG_OPTION_PIC + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS +#define FT_DEFINE_DRIVERS_OLD_INTERNAL(a) \ + a, +#else + #define FT_DEFINE_DRIVERS_OLD_INTERNAL(a) +#endif +#define FT_INTERNAL(a) \ + a, + +#define FT_DEFINE_SFNT_INTERFACE(class_, \ + goto_table_, init_face_, load_face_, done_face_, get_interface_, \ + load_any_, load_sfnt_header_, load_directory_, load_head_, \ + load_hhea_, load_cmap_, load_maxp_, load_os2_, load_post_, \ + load_name_, free_name_, load_hdmx_stub_, free_hdmx_stub_, \ + load_kern_, load_gasp_, load_pclt_, load_bhed_, \ + set_sbit_strike_stub_, load_sbits_stub_, find_sbit_image_, \ + load_sbit_metrics_, load_sbit_image_, free_sbits_stub_, \ + get_psname_, free_psnames_, load_charmap_stub_, free_charmap_stub_, \ + get_kerning_, load_font_dir_, load_hmtx_, load_eblc_, free_eblc_, \ + set_sbit_strike_, load_strike_metrics_, get_metrics_ ) \ + static const SFNT_Interface class_ = \ + { \ + FT_INTERNAL(goto_table_) \ + FT_INTERNAL(init_face_) \ + FT_INTERNAL(load_face_) \ + FT_INTERNAL(done_face_) \ + FT_INTERNAL(get_interface_) \ + FT_INTERNAL(load_any_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sfnt_header_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_directory_) \ + FT_INTERNAL(load_head_) \ + FT_INTERNAL(load_hhea_) \ + FT_INTERNAL(load_cmap_) \ + FT_INTERNAL(load_maxp_) \ + FT_INTERNAL(load_os2_) \ + FT_INTERNAL(load_post_) \ + FT_INTERNAL(load_name_) \ + FT_INTERNAL(free_name_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_hdmx_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(free_hdmx_stub_) \ + FT_INTERNAL(load_kern_) \ + FT_INTERNAL(load_gasp_) \ + FT_INTERNAL(load_pclt_) \ + FT_INTERNAL(load_bhed_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(set_sbit_strike_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbits_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(find_sbit_image_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbit_metrics_) \ + FT_INTERNAL(load_sbit_image_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(free_sbits_stub_) \ + FT_INTERNAL(get_psname_) \ + FT_INTERNAL(free_psnames_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_charmap_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(free_charmap_stub_) \ + FT_INTERNAL(get_kerning_) \ + FT_INTERNAL(load_font_dir_) \ + FT_INTERNAL(load_hmtx_) \ + FT_INTERNAL(load_eblc_) \ + FT_INTERNAL(free_eblc_) \ + FT_INTERNAL(set_sbit_strike_) \ + FT_INTERNAL(load_strike_metrics_) \ + FT_INTERNAL(get_metrics_) \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS +#define FT_DEFINE_DRIVERS_OLD_INTERNAL(a, a_) \ + clazz->a = a_; +#else + #define FT_DEFINE_DRIVERS_OLD_INTERNAL(a, a_) +#endif +#define FT_INTERNAL(a, a_) \ + clazz->a = a_; + +#define FT_DEFINE_SFNT_INTERFACE(class_, \ + goto_table_, init_face_, load_face_, done_face_, get_interface_, \ + load_any_, load_sfnt_header_, load_directory_, load_head_, \ + load_hhea_, load_cmap_, load_maxp_, load_os2_, load_post_, \ + load_name_, free_name_, load_hdmx_stub_, free_hdmx_stub_, \ + load_kern_, load_gasp_, load_pclt_, load_bhed_, \ + set_sbit_strike_stub_, load_sbits_stub_, find_sbit_image_, \ + load_sbit_metrics_, load_sbit_image_, free_sbits_stub_, \ + get_psname_, free_psnames_, load_charmap_stub_, free_charmap_stub_, \ + get_kerning_, load_font_dir_, load_hmtx_, load_eblc_, free_eblc_, \ + set_sbit_strike_, load_strike_metrics_, get_metrics_ ) \ + void \ + FT_Init_Class_##class_( FT_Library library, SFNT_Interface* clazz ) \ + { \ + FT_UNUSED(library); \ + FT_INTERNAL(goto_table,goto_table_) \ + FT_INTERNAL(init_face,init_face_) \ + FT_INTERNAL(load_face,load_face_) \ + FT_INTERNAL(done_face,done_face_) \ + FT_INTERNAL(get_interface,get_interface_) \ + FT_INTERNAL(load_any,load_any_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sfnt_header,load_sfnt_header_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_directory,load_directory_) \ + FT_INTERNAL(load_head,load_head_) \ + FT_INTERNAL(load_hhea,load_hhea_) \ + FT_INTERNAL(load_cmap,load_cmap_) \ + FT_INTERNAL(load_maxp,load_maxp_) \ + FT_INTERNAL(load_os2,load_os2_) \ + FT_INTERNAL(load_post,load_post_) \ + FT_INTERNAL(load_name,load_name_) \ + FT_INTERNAL(free_name,free_name_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_hdmx_stub,load_hdmx_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(free_hdmx_stub,free_hdmx_stub_) \ + FT_INTERNAL(load_kern,load_kern_) \ + FT_INTERNAL(load_gasp,load_gasp_) \ + FT_INTERNAL(load_pclt,load_pclt_) \ + FT_INTERNAL(load_bhed,load_bhed_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(set_sbit_strike_stub,set_sbit_strike_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbits_stub,load_sbits_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(find_sbit_image,find_sbit_image_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbit_metrics,load_sbit_metrics_) \ + FT_INTERNAL(load_sbit_image,load_sbit_image_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(free_sbits_stub,free_sbits_stub_) \ + FT_INTERNAL(get_psname,get_psname_) \ + FT_INTERNAL(free_psnames,free_psnames_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_charmap_stub,load_charmap_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(free_charmap_stub,free_charmap_stub_) \ + FT_INTERNAL(get_kerning,get_kerning_) \ + FT_INTERNAL(load_font_dir,load_font_dir_) \ + FT_INTERNAL(load_hmtx,load_hmtx_) \ + FT_INTERNAL(load_eblc,load_eblc_) \ + FT_INTERNAL(free_eblc,free_eblc_) \ + FT_INTERNAL(set_sbit_strike,set_sbit_strike_) \ + FT_INTERNAL(load_strike_metrics,load_strike_metrics_) \ + FT_INTERNAL(get_metrics,get_metrics_) \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + +FT_END_HEADER + +#endif /* __SFNT_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/t1types.h b/android/jni/ndk_modules/freetype/include/freetype/internal/t1types.h new file mode 100644 index 00000000..5f730637 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/t1types.h @@ -0,0 +1,270 @@ +/***************************************************************************/ +/* */ +/* t1types.h */ +/* */ +/* Basic Type1/Type2 type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1TYPES_H__ +#define __T1TYPES_H__ + + +#include <ft2build.h> +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_EncodingRec */ + /* */ + /* <Description> */ + /* A structure modeling a custom encoding. */ + /* */ + /* <Fields> */ + /* num_chars :: The number of character codes in the encoding. */ + /* Usually 256. */ + /* */ + /* code_first :: The lowest valid character code in the encoding. */ + /* */ + /* code_last :: The highest valid character code in the encoding */ + /* + 1. When equal to code_first there are no valid */ + /* character codes. */ + /* */ + /* char_index :: An array of corresponding glyph indices. */ + /* */ + /* char_name :: An array of corresponding glyph names. */ + /* */ + typedef struct T1_EncodingRecRec_ + { + FT_Int num_chars; + FT_Int code_first; + FT_Int code_last; + + FT_UShort* char_index; + FT_String** char_name; + + } T1_EncodingRec, *T1_Encoding; + + + typedef enum T1_EncodingType_ + { + T1_ENCODING_TYPE_NONE = 0, + T1_ENCODING_TYPE_ARRAY, + T1_ENCODING_TYPE_STANDARD, + T1_ENCODING_TYPE_ISOLATIN1, + T1_ENCODING_TYPE_EXPERT + + } T1_EncodingType; + + + /* used to hold extra data of PS_FontInfoRec that + * cannot be stored in the publicly defined structure. + * + * Note these can't be blended with multiple-masters. + */ + typedef struct PS_FontExtraRec_ + { + FT_UShort fs_type; + + } PS_FontExtraRec; + + + typedef struct T1_FontRec_ + { + PS_FontInfoRec font_info; /* font info dictionary */ + PS_FontExtraRec font_extra; /* font info extra fields */ + PS_PrivateRec private_dict; /* private dictionary */ + FT_String* font_name; /* top-level dictionary */ + + T1_EncodingType encoding_type; + T1_EncodingRec encoding; + + FT_Byte* subrs_block; + FT_Byte* charstrings_block; + FT_Byte* glyph_names_block; + + FT_Int num_subrs; + FT_Byte** subrs; + FT_PtrDist* subrs_len; + + FT_Int num_glyphs; + FT_String** glyph_names; /* array of glyph names */ + FT_Byte** charstrings; /* array of glyph charstrings */ + FT_PtrDist* charstrings_len; + + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + FT_BBox font_bbox; + FT_Long font_id; + + FT_Fixed stroke_width; + + } T1_FontRec, *T1_Font; + + + typedef struct CID_SubrsRec_ + { + FT_UInt num_subrs; + FT_Byte** code; + + } CID_SubrsRec, *CID_Subrs; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** AFM FONT INFORMATION STRUCTURES ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AFM_TrackKernRec_ + { + FT_Int degree; + FT_Fixed min_ptsize; + FT_Fixed min_kern; + FT_Fixed max_ptsize; + FT_Fixed max_kern; + + } AFM_TrackKernRec, *AFM_TrackKern; + + typedef struct AFM_KernPairRec_ + { + FT_Int index1; + FT_Int index2; + FT_Int x; + FT_Int y; + + } AFM_KernPairRec, *AFM_KernPair; + + typedef struct AFM_FontInfoRec_ + { + FT_Bool IsCIDFont; + FT_BBox FontBBox; + FT_Fixed Ascender; + FT_Fixed Descender; + AFM_TrackKern TrackKerns; /* free if non-NULL */ + FT_Int NumTrackKern; + AFM_KernPair KernPairs; /* free if non-NULL */ + FT_Int NumKernPair; + + } AFM_FontInfoRec, *AFM_FontInfo; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL T1_FACE CLASS DEFINITION ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_FaceRec_* T1_Face; + typedef struct CID_FaceRec_* CID_Face; + + + typedef struct T1_FaceRec_ + { + FT_FaceRec root; + T1_FontRec type1; + const void* psnames; + const void* psaux; + const void* afm_data; + FT_CharMapRec charmaprecs[2]; + FT_CharMap charmaps[2]; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + PS_Unicodes unicode_map; +#endif + + /* support for Multiple Masters fonts */ + PS_Blend blend; + + /* undocumented, optional: indices of subroutines that express */ + /* the NormalizeDesignVector and the ConvertDesignVector procedure, */ + /* respectively, as Type 2 charstrings; -1 if keywords not present */ + FT_Int ndv_idx; + FT_Int cdv_idx; + + /* undocumented, optional: has the same meaning as len_buildchar */ + /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25 */ + FT_UInt len_buildchar; + FT_Long* buildchar; + + /* since version 2.1 - interface to PostScript hinter */ + const void* pshinter; + + } T1_FaceRec; + + + typedef struct CID_FaceRec_ + { + FT_FaceRec root; + void* psnames; + void* psaux; + CID_FaceInfoRec cid; + PS_FontExtraRec font_extra; +#if 0 + void* afm_data; +#endif + CID_Subrs subrs; + + /* since version 2.1 - interface to PostScript hinter */ + void* pshinter; + + /* since version 2.1.8, but was originally positioned after `afm_data' */ + FT_Byte* binary_data; /* used if hex data has been converted */ + FT_Stream cid_stream; + + } CID_FaceRec; + + +FT_END_HEADER + +#endif /* __T1TYPES_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/tttypes.h b/android/jni/ndk_modules/freetype/include/freetype/internal/tttypes.h new file mode 100644 index 00000000..acbb863b --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/internal/tttypes.h @@ -0,0 +1,1543 @@ +/***************************************************************************/ +/* */ +/* tttypes.h */ +/* */ +/* Basic SFNT/TrueType type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTTYPES_H__ +#define __TTTYPES_H__ + + +#include <ft2build.h> +#include FT_TRUETYPE_TABLES_H +#include FT_INTERNAL_OBJECTS_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TTC_HeaderRec */ + /* */ + /* <Description> */ + /* TrueType collection header. This table contains the offsets of */ + /* the font headers of each distinct TrueType face in the file. */ + /* */ + /* <Fields> */ + /* tag :: Must be `ttc ' to indicate a TrueType collection. */ + /* */ + /* version :: The version number. */ + /* */ + /* count :: The number of faces in the collection. The */ + /* specification says this should be an unsigned long, but */ + /* we use a signed long since we need the value -1 for */ + /* specific purposes. */ + /* */ + /* offsets :: The offsets of the font headers, one per face. */ + /* */ + typedef struct TTC_HeaderRec_ + { + FT_ULong tag; + FT_Fixed version; + FT_Long count; + FT_ULong* offsets; + + } TTC_HeaderRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* SFNT_HeaderRec */ + /* */ + /* <Description> */ + /* SFNT file format header. */ + /* */ + /* <Fields> */ + /* format_tag :: The font format tag. */ + /* */ + /* num_tables :: The number of tables in file. */ + /* */ + /* search_range :: Must be `16 * (max power of 2 <= num_tables)'. */ + /* */ + /* entry_selector :: Must be log2 of `search_range / 16'. */ + /* */ + /* range_shift :: Must be `num_tables * 16 - search_range'. */ + /* */ + typedef struct SFNT_HeaderRec_ + { + FT_ULong format_tag; + FT_UShort num_tables; + FT_UShort search_range; + FT_UShort entry_selector; + FT_UShort range_shift; + + FT_ULong offset; /* not in file */ + + } SFNT_HeaderRec, *SFNT_Header; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_TableRec */ + /* */ + /* <Description> */ + /* This structure describes a given table of a TrueType font. */ + /* */ + /* <Fields> */ + /* Tag :: A four-bytes tag describing the table. */ + /* */ + /* CheckSum :: The table checksum. This value can be ignored. */ + /* */ + /* Offset :: The offset of the table from the start of the TrueType */ + /* font in its resource. */ + /* */ + /* Length :: The table length (in bytes). */ + /* */ + typedef struct TT_TableRec_ + { + FT_ULong Tag; /* table type */ + FT_ULong CheckSum; /* table checksum */ + FT_ULong Offset; /* table file offset */ + FT_ULong Length; /* table length */ + + } TT_TableRec, *TT_Table; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_LongMetricsRec */ + /* */ + /* <Description> */ + /* A structure modeling the long metrics of the `hmtx' and `vmtx' */ + /* TrueType tables. The values are expressed in font units. */ + /* */ + /* <Fields> */ + /* advance :: The advance width or height for the glyph. */ + /* */ + /* bearing :: The left-side or top-side bearing for the glyph. */ + /* */ + typedef struct TT_LongMetricsRec_ + { + FT_UShort advance; + FT_Short bearing; + + } TT_LongMetricsRec, *TT_LongMetrics; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_ShortMetrics */ + /* */ + /* <Description> */ + /* A simple type to model the short metrics of the `hmtx' and `vmtx' */ + /* tables. */ + /* */ + typedef FT_Short TT_ShortMetrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_NameEntryRec */ + /* */ + /* <Description> */ + /* A structure modeling TrueType name records. Name records are used */ + /* to store important strings like family name, style name, */ + /* copyright, etc. in _localized_ versions (i.e., language, encoding, */ + /* etc). */ + /* */ + /* <Fields> */ + /* platformID :: The ID of the name's encoding platform. */ + /* */ + /* encodingID :: The platform-specific ID for the name's encoding. */ + /* */ + /* languageID :: The platform-specific ID for the name's language. */ + /* */ + /* nameID :: The ID specifying what kind of name this is. */ + /* */ + /* stringLength :: The length of the string in bytes. */ + /* */ + /* stringOffset :: The offset to the string in the `name' table. */ + /* */ + /* string :: A pointer to the string's bytes. Note that these */ + /* are usually UTF-16 encoded characters. */ + /* */ + typedef struct TT_NameEntryRec_ + { + FT_UShort platformID; + FT_UShort encodingID; + FT_UShort languageID; + FT_UShort nameID; + FT_UShort stringLength; + FT_ULong stringOffset; + + /* this last field is not defined in the spec */ + /* but used by the FreeType engine */ + + FT_Byte* string; + + } TT_NameEntryRec, *TT_NameEntry; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_NameTableRec */ + /* */ + /* <Description> */ + /* A structure modeling the TrueType name table. */ + /* */ + /* <Fields> */ + /* format :: The format of the name table. */ + /* */ + /* numNameRecords :: The number of names in table. */ + /* */ + /* storageOffset :: The offset of the name table in the `name' */ + /* TrueType table. */ + /* */ + /* names :: An array of name records. */ + /* */ + /* stream :: the file's input stream. */ + /* */ + typedef struct TT_NameTableRec_ + { + FT_UShort format; + FT_UInt numNameRecords; + FT_UInt storageOffset; + TT_NameEntryRec* names; + FT_Stream stream; + + } TT_NameTableRec, *TT_NameTable; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GaspRangeRec */ + /* */ + /* <Description> */ + /* A tiny structure used to model a gasp range according to the */ + /* TrueType specification. */ + /* */ + /* <Fields> */ + /* maxPPEM :: The maximum ppem value to which `gaspFlag' applies. */ + /* */ + /* gaspFlag :: A flag describing the grid-fitting and anti-aliasing */ + /* modes to be used. */ + /* */ + typedef struct TT_GaspRangeRec_ + { + FT_UShort maxPPEM; + FT_UShort gaspFlag; + + } TT_GaspRangeRec, *TT_GaspRange; + + +#define TT_GASP_GRIDFIT 0x01 +#define TT_GASP_DOGRAY 0x02 + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GaspRec */ + /* */ + /* <Description> */ + /* A structure modeling the TrueType `gasp' table used to specify */ + /* grid-fitting and anti-aliasing behaviour. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* numRanges :: The number of gasp ranges in table. */ + /* */ + /* gaspRanges :: An array of gasp ranges. */ + /* */ + typedef struct TT_Gasp_ + { + FT_UShort version; + FT_UShort numRanges; + TT_GaspRange gaspRanges; + + } TT_GaspRec; + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HdmxEntryRec */ + /* */ + /* <Description> */ + /* A small structure used to model the pre-computed widths of a given */ + /* size. They are found in the `hdmx' table. */ + /* */ + /* <Fields> */ + /* ppem :: The pixels per EM value at which these metrics apply. */ + /* */ + /* max_width :: The maximum advance width for this metric. */ + /* */ + /* widths :: An array of widths. Note: These are 8-bit bytes. */ + /* */ + typedef struct TT_HdmxEntryRec_ + { + FT_Byte ppem; + FT_Byte max_width; + FT_Byte* widths; + + } TT_HdmxEntryRec, *TT_HdmxEntry; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HdmxRec */ + /* */ + /* <Description> */ + /* A structure used to model the `hdmx' table, which contains */ + /* pre-computed widths for a set of given sizes/dimensions. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* num_records :: The number of hdmx records. */ + /* */ + /* records :: An array of hdmx records. */ + /* */ + typedef struct TT_HdmxRec_ + { + FT_UShort version; + FT_Short num_records; + TT_HdmxEntry records; + + } TT_HdmxRec, *TT_Hdmx; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Kern0_PairRec */ + /* */ + /* <Description> */ + /* A structure used to model a kerning pair for the kerning table */ + /* format 0. The engine now loads this table if it finds one in the */ + /* font file. */ + /* */ + /* <Fields> */ + /* left :: The index of the left glyph in pair. */ + /* */ + /* right :: The index of the right glyph in pair. */ + /* */ + /* value :: The kerning distance. A positive value spaces the */ + /* glyphs, a negative one makes them closer. */ + /* */ + typedef struct TT_Kern0_PairRec_ + { + FT_UShort left; /* index of left glyph in pair */ + FT_UShort right; /* index of right glyph in pair */ + FT_FWord value; /* kerning value */ + + } TT_Kern0_PairRec, *TT_Kern0_Pair; + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BITMAPS SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_MetricsRec */ + /* */ + /* <Description> */ + /* A structure used to hold the big metrics of a given glyph bitmap */ + /* in a TrueType or OpenType font. These are usually found in the */ + /* `EBDT' (Microsoft) or `bloc' (Apple) table. */ + /* */ + /* <Fields> */ + /* height :: The glyph height in pixels. */ + /* */ + /* width :: The glyph width in pixels. */ + /* */ + /* horiBearingX :: The horizontal left bearing. */ + /* */ + /* horiBearingY :: The horizontal top bearing. */ + /* */ + /* horiAdvance :: The horizontal advance. */ + /* */ + /* vertBearingX :: The vertical left bearing. */ + /* */ + /* vertBearingY :: The vertical top bearing. */ + /* */ + /* vertAdvance :: The vertical advance. */ + /* */ + typedef struct TT_SBit_MetricsRec_ + { + FT_Byte height; + FT_Byte width; + + FT_Char horiBearingX; + FT_Char horiBearingY; + FT_Byte horiAdvance; + + FT_Char vertBearingX; + FT_Char vertBearingY; + FT_Byte vertAdvance; + + } TT_SBit_MetricsRec, *TT_SBit_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_SmallMetricsRec */ + /* */ + /* <Description> */ + /* A structure used to hold the small metrics of a given glyph bitmap */ + /* in a TrueType or OpenType font. These are usually found in the */ + /* `EBDT' (Microsoft) or the `bdat' (Apple) table. */ + /* */ + /* <Fields> */ + /* height :: The glyph height in pixels. */ + /* */ + /* width :: The glyph width in pixels. */ + /* */ + /* bearingX :: The left-side bearing. */ + /* */ + /* bearingY :: The top-side bearing. */ + /* */ + /* advance :: The advance width or height. */ + /* */ + typedef struct TT_SBit_Small_Metrics_ + { + FT_Byte height; + FT_Byte width; + + FT_Char bearingX; + FT_Char bearingY; + FT_Byte advance; + + } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_LineMetricsRec */ + /* */ + /* <Description> */ + /* A structure used to describe the text line metrics of a given */ + /* bitmap strike, for either a horizontal or vertical layout. */ + /* */ + /* <Fields> */ + /* ascender :: The ascender in pixels. */ + /* */ + /* descender :: The descender in pixels. */ + /* */ + /* max_width :: The maximum glyph width in pixels. */ + /* */ + /* caret_slope_enumerator :: Rise of the caret slope, typically set */ + /* to 1 for non-italic fonts. */ + /* */ + /* caret_slope_denominator :: Rise of the caret slope, typically set */ + /* to 0 for non-italic fonts. */ + /* */ + /* caret_offset :: Offset in pixels to move the caret for */ + /* proper positioning. */ + /* */ + /* min_origin_SB :: Minimum of horiBearingX (resp. */ + /* vertBearingY). */ + /* min_advance_SB :: Minimum of */ + /* */ + /* horizontal advance - */ + /* ( horiBearingX + width ) */ + /* */ + /* resp. */ + /* */ + /* vertical advance - */ + /* ( vertBearingY + height ) */ + /* */ + /* max_before_BL :: Maximum of horiBearingY (resp. */ + /* vertBearingY). */ + /* */ + /* min_after_BL :: Minimum of */ + /* */ + /* horiBearingY - height */ + /* */ + /* resp. */ + /* */ + /* vertBearingX - width */ + /* */ + /* pads :: Unused (to make the size of the record */ + /* a multiple of 32 bits. */ + /* */ + typedef struct TT_SBit_LineMetricsRec_ + { + FT_Char ascender; + FT_Char descender; + FT_Byte max_width; + FT_Char caret_slope_numerator; + FT_Char caret_slope_denominator; + FT_Char caret_offset; + FT_Char min_origin_SB; + FT_Char min_advance_SB; + FT_Char max_before_BL; + FT_Char min_after_BL; + FT_Char pads[2]; + + } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_RangeRec */ + /* */ + /* <Description> */ + /* A TrueType/OpenType subIndexTable as defined in the `EBLC' */ + /* (Microsoft) or `bloc' (Apple) tables. */ + /* */ + /* <Fields> */ + /* first_glyph :: The first glyph index in the range. */ + /* */ + /* last_glyph :: The last glyph index in the range. */ + /* */ + /* index_format :: The format of index table. Valid values are 1 */ + /* to 5. */ + /* */ + /* image_format :: The format of `EBDT' image data. */ + /* */ + /* image_offset :: The offset to image data in `EBDT'. */ + /* */ + /* image_size :: For index formats 2 and 5. This is the size in */ + /* bytes of each glyph bitmap. */ + /* */ + /* big_metrics :: For index formats 2 and 5. This is the big */ + /* metrics for each glyph bitmap. */ + /* */ + /* num_glyphs :: For index formats 4 and 5. This is the number of */ + /* glyphs in the code array. */ + /* */ + /* glyph_offsets :: For index formats 1 and 3. */ + /* */ + /* glyph_codes :: For index formats 4 and 5. */ + /* */ + /* table_offset :: The offset of the index table in the `EBLC' */ + /* table. Only used during strike loading. */ + /* */ + typedef struct TT_SBit_RangeRec_ + { + FT_UShort first_glyph; + FT_UShort last_glyph; + + FT_UShort index_format; + FT_UShort image_format; + FT_ULong image_offset; + + FT_ULong image_size; + TT_SBit_MetricsRec metrics; + FT_ULong num_glyphs; + + FT_ULong* glyph_offsets; + FT_UShort* glyph_codes; + + FT_ULong table_offset; + + } TT_SBit_RangeRec, *TT_SBit_Range; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_StrikeRec */ + /* */ + /* <Description> */ + /* A structure used describe a given bitmap strike in the `EBLC' */ + /* (Microsoft) or `bloc' (Apple) tables. */ + /* */ + /* <Fields> */ + /* num_index_ranges :: The number of index ranges. */ + /* */ + /* index_ranges :: An array of glyph index ranges. */ + /* */ + /* color_ref :: Unused. `color_ref' is put in for future */ + /* enhancements, but these fields are already */ + /* in use by other platforms (e.g. Newton). */ + /* For details, please see */ + /* */ + /* http://fonts.apple.com/ */ + /* TTRefMan/RM06/Chap6bloc.html */ + /* */ + /* hori :: The line metrics for horizontal layouts. */ + /* */ + /* vert :: The line metrics for vertical layouts. */ + /* */ + /* start_glyph :: The lowest glyph index for this strike. */ + /* */ + /* end_glyph :: The highest glyph index for this strike. */ + /* */ + /* x_ppem :: The number of horizontal pixels per EM. */ + /* */ + /* y_ppem :: The number of vertical pixels per EM. */ + /* */ + /* bit_depth :: The bit depth. Valid values are 1, 2, 4, */ + /* and 8. */ + /* */ + /* flags :: Is this a vertical or horizontal strike? For */ + /* details, please see */ + /* */ + /* http://fonts.apple.com/ */ + /* TTRefMan/RM06/Chap6bloc.html */ + /* */ + typedef struct TT_SBit_StrikeRec_ + { + FT_Int num_ranges; + TT_SBit_Range sbit_ranges; + FT_ULong ranges_offset; + + FT_ULong color_ref; + + TT_SBit_LineMetricsRec hori; + TT_SBit_LineMetricsRec vert; + + FT_UShort start_glyph; + FT_UShort end_glyph; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte bit_depth; + FT_Char flags; + + } TT_SBit_StrikeRec, *TT_SBit_Strike; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_ComponentRec */ + /* */ + /* <Description> */ + /* A simple structure to describe a compound sbit element. */ + /* */ + /* <Fields> */ + /* glyph_code :: The element's glyph index. */ + /* */ + /* x_offset :: The element's left bearing. */ + /* */ + /* y_offset :: The element's top bearing. */ + /* */ + typedef struct TT_SBit_ComponentRec_ + { + FT_UShort glyph_code; + FT_Char x_offset; + FT_Char y_offset; + + } TT_SBit_ComponentRec, *TT_SBit_Component; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_ScaleRec */ + /* */ + /* <Description> */ + /* A structure used describe a given bitmap scaling table, as defined */ + /* in the `EBSC' table. */ + /* */ + /* <Fields> */ + /* hori :: The horizontal line metrics. */ + /* */ + /* vert :: The vertical line metrics. */ + /* */ + /* x_ppem :: The number of horizontal pixels per EM. */ + /* */ + /* y_ppem :: The number of vertical pixels per EM. */ + /* */ + /* x_ppem_substitute :: Substitution x_ppem value. */ + /* */ + /* y_ppem_substitute :: Substitution y_ppem value. */ + /* */ + typedef struct TT_SBit_ScaleRec_ + { + TT_SBit_LineMetricsRec hori; + TT_SBit_LineMetricsRec vert; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte x_ppem_substitute; + FT_Byte y_ppem_substitute; + + } TT_SBit_ScaleRec, *TT_SBit_Scale; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Post_20Rec */ + /* */ + /* <Description> */ + /* Postscript names sub-table, format 2.0. Stores the PS name of */ + /* each glyph in the font face. */ + /* */ + /* <Fields> */ + /* num_glyphs :: The number of named glyphs in the table. */ + /* */ + /* num_names :: The number of PS names stored in the table. */ + /* */ + /* glyph_indices :: The indices of the glyphs in the names arrays. */ + /* */ + /* glyph_names :: The PS names not in Mac Encoding. */ + /* */ + typedef struct TT_Post_20Rec_ + { + FT_UShort num_glyphs; + FT_UShort num_names; + FT_UShort* glyph_indices; + FT_Char** glyph_names; + + } TT_Post_20Rec, *TT_Post_20; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Post_25Rec */ + /* */ + /* <Description> */ + /* Postscript names sub-table, format 2.5. Stores the PS name of */ + /* each glyph in the font face. */ + /* */ + /* <Fields> */ + /* num_glyphs :: The number of glyphs in the table. */ + /* */ + /* offsets :: An array of signed offsets in a normal Mac */ + /* Postscript name encoding. */ + /* */ + typedef struct TT_Post_25_ + { + FT_UShort num_glyphs; + FT_Char* offsets; + + } TT_Post_25Rec, *TT_Post_25; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Post_NamesRec */ + /* */ + /* <Description> */ + /* Postscript names table, either format 2.0 or 2.5. */ + /* */ + /* <Fields> */ + /* loaded :: A flag to indicate whether the PS names are loaded. */ + /* */ + /* format_20 :: The sub-table used for format 2.0. */ + /* */ + /* format_25 :: The sub-table used for format 2.5. */ + /* */ + typedef struct TT_Post_NamesRec_ + { + FT_Bool loaded; + + union + { + TT_Post_20Rec format_20; + TT_Post_25Rec format_25; + + } names; + + } TT_Post_NamesRec, *TT_Post_Names; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** GX VARIATION TABLE SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + typedef struct GX_BlendRec_ *GX_Blend; +#endif + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * These types are used to support a `BDF ' table that isn't part of the + * official TrueType specification. It is mainly used in SFNT-based + * bitmap fonts that were generated from a set of BDF fonts. + * + * The format of the table is as follows. + * + * USHORT version `BDF ' table version number, should be 0x0001. + * USHORT strikeCount Number of strikes (bitmap sizes) in this table. + * ULONG stringTable Offset (from start of BDF table) to string + * table. + * + * This is followed by an array of `strikeCount' descriptors, having the + * following format. + * + * USHORT ppem Vertical pixels per EM for this strike. + * USHORT numItems Number of items for this strike (properties and + * atoms). Maximum is 255. + * + * This array in turn is followed by `strikeCount' value sets. Each + * `value set' is an array of `numItems' items with the following format. + * + * ULONG item_name Offset in string table to item name. + * USHORT item_type The item type. Possible values are + * 0 => string (e.g., COMMENT) + * 1 => atom (e.g., FONT or even SIZE) + * 2 => int32 + * 3 => uint32 + * 0x10 => A flag to indicate a properties. This + * is ORed with the above values. + * ULONG item_value For strings => Offset into string table without + * the corresponding double quotes. + * For atoms => Offset into string table. + * For integers => Direct value. + * + * All strings in the string table consist of bytes and are + * zero-terminated. + * + */ + +#ifdef TT_CONFIG_OPTION_BDF + + typedef struct TT_BDFRec_ + { + FT_Byte* table; + FT_Byte* table_end; + FT_Byte* strings; + FT_ULong strings_size; + FT_UInt num_strikes; + FT_Bool loaded; + + } TT_BDFRec, *TT_BDF; + +#endif /* TT_CONFIG_OPTION_BDF */ + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL TT_FACE CLASS DEFINITION ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This structure/class is defined here because it is common to the */ + /* following formats: TTF, OpenType-TT, and OpenType-CFF. */ + /* */ + /* Note, however, that the classes TT_Size and TT_GlyphSlot are not */ + /* shared between font drivers, and are thus defined in `ttobjs.h'. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_Face */ + /* */ + /* <Description> */ + /* A handle to a TrueType face/font object. A TT_Face encapsulates */ + /* the resolution and scaling independent parts of a TrueType font */ + /* resource. */ + /* */ + /* <Note> */ + /* The TT_Face structure is also used as a `parent class' for the */ + /* OpenType-CFF class (T2_Face). */ + /* */ + typedef struct TT_FaceRec_* TT_Face; + + + /* a function type used for the truetype bytecode interpreter hooks */ + typedef FT_Error + (*TT_Interpreter)( void* exec_context ); + + /* forward declaration */ + typedef struct TT_LoaderRec_* TT_Loader; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_GotoTableFunc */ + /* */ + /* <Description> */ + /* Seeks a stream to the start of a given TrueType table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* tag :: A 4-byte tag used to name the table. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Output> */ + /* length :: The length of the table in bytes. Set to 0 if not */ + /* needed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the font file's origin. */ + /* */ + typedef FT_Error + (*TT_Loader_GotoTableFunc)( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_StartGlyphFunc */ + /* */ + /* <Description> */ + /* Seeks a stream to the start of a given glyph element, and opens a */ + /* frame for it. */ + /* */ + /* <Input> */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + /* glyph index :: The index of the glyph to access. */ + /* */ + /* offset :: The offset of the glyph according to the */ + /* `locations' table. */ + /* */ + /* byte_count :: The size of the frame in bytes. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function is normally equivalent to FT_STREAM_SEEK(offset) */ + /* followed by FT_FRAME_ENTER(byte_count) with the loader's stream, */ + /* but alternative formats (e.g. compressed ones) might use something */ + /* different. */ + /* */ + typedef FT_Error + (*TT_Loader_StartGlyphFunc)( TT_Loader loader, + FT_UInt glyph_index, + FT_ULong offset, + FT_UInt byte_count ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_ReadGlyphFunc */ + /* */ + /* <Description> */ + /* Reads one glyph element (its header, a simple glyph, or a */ + /* composite) from the loader's current stream frame. */ + /* */ + /* <Input> */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Loader_ReadGlyphFunc)( TT_Loader loader ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_EndGlyphFunc */ + /* */ + /* <Description> */ + /* Closes the current loader stream frame for the glyph. */ + /* */ + /* <Input> */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + typedef void + (*TT_Loader_EndGlyphFunc)( TT_Loader loader ); + + + /*************************************************************************/ + /* */ + /* TrueType Face Type */ + /* */ + /* <Struct> */ + /* TT_Face */ + /* */ + /* <Description> */ + /* The TrueType face class. These objects model the resolution and */ + /* point-size independent data found in a TrueType font file. */ + /* */ + /* <Fields> */ + /* root :: The base FT_Face structure, managed by the */ + /* base layer. */ + /* */ + /* ttc_header :: The TrueType collection header, used when */ + /* the file is a `ttc' rather than a `ttf'. */ + /* For ordinary font files, the field */ + /* `ttc_header.count' is set to 0. */ + /* */ + /* format_tag :: The font format tag. */ + /* */ + /* num_tables :: The number of TrueType tables in this font */ + /* file. */ + /* */ + /* dir_tables :: The directory of TrueType tables for this */ + /* font file. */ + /* */ + /* header :: The font's font header (`head' table). */ + /* Read on font opening. */ + /* */ + /* horizontal :: The font's horizontal header (`hhea' */ + /* table). This field also contains the */ + /* associated horizontal metrics table */ + /* (`hmtx'). */ + /* */ + /* max_profile :: The font's maximum profile table. Read on */ + /* font opening. Note that some maximum */ + /* values cannot be taken directly from this */ + /* table. We thus define additional fields */ + /* below to hold the computed maxima. */ + /* */ + /* vertical_info :: A boolean which is set when the font file */ + /* contains vertical metrics. If not, the */ + /* value of the `vertical' field is */ + /* undefined. */ + /* */ + /* vertical :: The font's vertical header (`vhea' table). */ + /* This field also contains the associated */ + /* vertical metrics table (`vmtx'), if found. */ + /* IMPORTANT: The contents of this field is */ + /* undefined if the `verticalInfo' field is */ + /* unset. */ + /* */ + /* num_names :: The number of name records within this */ + /* TrueType font. */ + /* */ + /* name_table :: The table of name records (`name'). */ + /* */ + /* os2 :: The font's OS/2 table (`OS/2'). */ + /* */ + /* postscript :: The font's PostScript table (`post' */ + /* table). The PostScript glyph names are */ + /* not loaded by the driver on face opening. */ + /* See the `ttpost' module for more details. */ + /* */ + /* cmap_table :: Address of the face's `cmap' SFNT table */ + /* in memory (it's an extracted frame). */ + /* */ + /* cmap_size :: The size in bytes of the `cmap_table' */ + /* described above. */ + /* */ + /* goto_table :: A function called by each TrueType table */ + /* loader to position a stream's cursor to */ + /* the start of a given table according to */ + /* its tag. It defaults to TT_Goto_Face but */ + /* can be different for strange formats (e.g. */ + /* Type 42). */ + /* */ + /* access_glyph_frame :: A function used to access the frame of a */ + /* given glyph within the face's font file. */ + /* */ + /* forget_glyph_frame :: A function used to forget the frame of a */ + /* given glyph when all data has been loaded. */ + /* */ + /* read_glyph_header :: A function used to read a glyph header. */ + /* It must be called between an `access' and */ + /* `forget'. */ + /* */ + /* read_simple_glyph :: A function used to read a simple glyph. */ + /* It must be called after the header was */ + /* read, and before the `forget'. */ + /* */ + /* read_composite_glyph :: A function used to read a composite glyph. */ + /* It must be called after the header was */ + /* read, and before the `forget'. */ + /* */ + /* sfnt :: A pointer to the SFNT service. */ + /* */ + /* psnames :: A pointer to the PostScript names service. */ + /* */ + /* hdmx :: The face's horizontal device metrics */ + /* (`hdmx' table). This table is optional in */ + /* TrueType/OpenType fonts. */ + /* */ + /* gasp :: The grid-fitting and scaling properties */ + /* table (`gasp'). This table is optional in */ + /* TrueType/OpenType fonts. */ + /* */ + /* pclt :: The `pclt' SFNT table. */ + /* */ + /* num_sbit_strikes :: The number of sbit strikes, i.e., bitmap */ + /* sizes, embedded in this font. */ + /* */ + /* sbit_strikes :: An array of sbit strikes embedded in this */ + /* font. This table is optional in a */ + /* TrueType/OpenType font. */ + /* */ + /* num_sbit_scales :: The number of sbit scales for this font. */ + /* */ + /* sbit_scales :: Array of sbit scales embedded in this */ + /* font. This table is optional in a */ + /* TrueType/OpenType font. */ + /* */ + /* postscript_names :: A table used to store the Postscript names */ + /* of the glyphs for this font. See the */ + /* file `ttconfig.h' for comments on the */ + /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. */ + /* */ + /* num_locations :: The number of glyph locations in this */ + /* TrueType file. This should be */ + /* identical to the number of glyphs. */ + /* Ignored for Type 2 fonts. */ + /* */ + /* glyph_locations :: An array of longs. These are offsets to */ + /* glyph data within the `glyf' table. */ + /* Ignored for Type 2 font faces. */ + /* */ + /* glyf_len :: The length of the `glyf' table. Needed */ + /* for malformed `loca' tables. */ + /* */ + /* font_program_size :: Size in bytecodes of the face's font */ + /* program. 0 if none defined. Ignored for */ + /* Type 2 fonts. */ + /* */ + /* font_program :: The face's font program (bytecode stream) */ + /* executed at load time, also used during */ + /* glyph rendering. Comes from the `fpgm' */ + /* table. Ignored for Type 2 font fonts. */ + /* */ + /* cvt_program_size :: The size in bytecodes of the face's cvt */ + /* program. Ignored for Type 2 fonts. */ + /* */ + /* cvt_program :: The face's cvt program (bytecode stream) */ + /* executed each time an instance/size is */ + /* changed/reset. Comes from the `prep' */ + /* table. Ignored for Type 2 fonts. */ + /* */ + /* cvt_size :: Size of the control value table (in */ + /* entries). Ignored for Type 2 fonts. */ + /* */ + /* cvt :: The face's original control value table. */ + /* Coordinates are expressed in unscaled font */ + /* units. Comes from the `cvt ' table. */ + /* Ignored for Type 2 fonts. */ + /* */ + /* num_kern_pairs :: The number of kerning pairs present in the */ + /* font file. The engine only loads the */ + /* first horizontal format 0 kern table it */ + /* finds in the font file. Ignored for */ + /* Type 2 fonts. */ + /* */ + /* kern_table_index :: The index of the kerning table in the font */ + /* kerning directory. Ignored for Type 2 */ + /* fonts. */ + /* */ + /* interpreter :: A pointer to the TrueType bytecode */ + /* interpreters field is also used to hook */ + /* the debugger in `ttdebug'. */ + /* */ + /* unpatented_hinting :: If true, use only unpatented methods in */ + /* the bytecode interpreter. */ + /* */ + /* doblend :: A boolean which is set if the font should */ + /* be blended (this is for GX var). */ + /* */ + /* blend :: Contains the data needed to control GX */ + /* variation tables (rather like Multiple */ + /* Master data). */ + /* */ + /* extra :: Reserved for third-party font drivers. */ + /* */ + /* postscript_name :: The PS name of the font. Used by the */ + /* postscript name service. */ + /* */ + typedef struct TT_FaceRec_ + { + FT_FaceRec root; + + TTC_HeaderRec ttc_header; + + FT_ULong format_tag; + FT_UShort num_tables; + TT_Table dir_tables; + + TT_Header header; /* TrueType header table */ + TT_HoriHeader horizontal; /* TrueType horizontal header */ + + TT_MaxProfile max_profile; +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_ULong max_components; /* stubbed to 0 */ +#endif + + FT_Bool vertical_info; + TT_VertHeader vertical; /* TT Vertical header, if present */ + + FT_UShort num_names; /* number of name records */ + TT_NameTableRec name_table; /* name table */ + + TT_OS2 os2; /* TrueType OS/2 table */ + TT_Postscript postscript; /* TrueType Postscript table */ + + FT_Byte* cmap_table; /* extracted `cmap' table */ + FT_ULong cmap_size; + + TT_Loader_GotoTableFunc goto_table; + + TT_Loader_StartGlyphFunc access_glyph_frame; + TT_Loader_EndGlyphFunc forget_glyph_frame; + TT_Loader_ReadGlyphFunc read_glyph_header; + TT_Loader_ReadGlyphFunc read_simple_glyph; + TT_Loader_ReadGlyphFunc read_composite_glyph; + + /* a typeless pointer to the SFNT_Interface table used to load */ + /* the basic TrueType tables in the face object */ + void* sfnt; + + /* a typeless pointer to the FT_Service_PsCMapsRec table used to */ + /* handle glyph names <-> unicode & Mac values */ + void* psnames; + + + /***********************************************************************/ + /* */ + /* Optional TrueType/OpenType tables */ + /* */ + /***********************************************************************/ + + /* horizontal device metrics */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_HdmxRec hdmx; +#endif + + /* grid-fitting and scaling table */ + TT_GaspRec gasp; /* the `gasp' table */ + + /* PCL 5 table */ + TT_PCLT pclt; + + /* embedded bitmaps support */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_ULong num_sbit_strikes; + TT_SBit_Strike sbit_strikes; +#endif + + FT_ULong num_sbit_scales; + TT_SBit_Scale sbit_scales; + + /* postscript names table */ + TT_Post_NamesRec postscript_names; + + + /***********************************************************************/ + /* */ + /* TrueType-specific fields (ignored by the OTF-Type2 driver) */ + /* */ + /***********************************************************************/ + + /* the glyph locations */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_UShort num_locations_stub; + FT_Long* glyph_locations_stub; +#endif + + /* the font program, if any */ + FT_ULong font_program_size; + FT_Byte* font_program; + + /* the cvt program, if any */ + FT_ULong cvt_program_size; + FT_Byte* cvt_program; + + /* the original, unscaled, control value table */ + FT_ULong cvt_size; + FT_Short* cvt; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + /* the format 0 kerning table, if any */ + FT_Int num_kern_pairs; + FT_Int kern_table_index; + TT_Kern0_Pair kern_pairs; +#endif + + /* A pointer to the bytecode interpreter to use. This is also */ + /* used to hook the debugger for the `ttdebug' utility. */ + TT_Interpreter interpreter; + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + /* Use unpatented hinting only. */ + FT_Bool unpatented_hinting; +#endif + + /***********************************************************************/ + /* */ + /* Other tables or fields. This is used by derivative formats like */ + /* OpenType. */ + /* */ + /***********************************************************************/ + + FT_Generic extra; + + const char* postscript_name; + + /* since version 2.1.8, but was originally placed after */ + /* `glyph_locations_stub' */ + FT_ULong glyf_len; + + /* since version 2.1.8, but was originally placed before `extra' */ +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Bool doblend; + GX_Blend blend; +#endif + + /* since version 2.2 */ + + FT_Byte* horz_metrics; + FT_ULong horz_metrics_size; + + FT_Byte* vert_metrics; + FT_ULong vert_metrics_size; + + FT_ULong num_locations; /* in broken TTF, gid > 0xFFFF */ + FT_Byte* glyph_locations; + + FT_Byte* hdmx_table; + FT_ULong hdmx_table_size; + FT_UInt hdmx_record_count; + FT_ULong hdmx_record_size; + FT_Byte* hdmx_record_sizes; + + FT_Byte* sbit_table; + FT_ULong sbit_table_size; + FT_UInt sbit_num_strikes; + + FT_Byte* kern_table; + FT_ULong kern_table_size; + FT_UInt num_kern_tables; + FT_UInt32 kern_avail_bits; + FT_UInt32 kern_order_bits; + +#ifdef TT_CONFIG_OPTION_BDF + TT_BDFRec bdf; +#endif /* TT_CONFIG_OPTION_BDF */ + + /* since 2.3.0 */ + FT_ULong horz_metrics_offset; + FT_ULong vert_metrics_offset; + + } TT_FaceRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GlyphZoneRec */ + /* */ + /* <Description> */ + /* A glyph zone is used to load, scale and hint glyph outline */ + /* coordinates. */ + /* */ + /* <Fields> */ + /* memory :: A handle to the memory manager. */ + /* */ + /* max_points :: The maximal size in points of the zone. */ + /* */ + /* max_contours :: Max size in links contours of the zone. */ + /* */ + /* n_points :: The current number of points in the zone. */ + /* */ + /* n_contours :: The current number of contours in the zone. */ + /* */ + /* org :: The original glyph coordinates (font */ + /* units/scaled). */ + /* */ + /* cur :: The current glyph coordinates (scaled/hinted). */ + /* */ + /* tags :: The point control tags. */ + /* */ + /* contours :: The contours end points. */ + /* */ + /* first_point :: Offset of the current subglyph's first point. */ + /* */ + typedef struct TT_GlyphZoneRec_ + { + FT_Memory memory; + FT_UShort max_points; + FT_UShort max_contours; + FT_UShort n_points; /* number of points in zone */ + FT_Short n_contours; /* number of contours */ + + FT_Vector* org; /* original point coordinates */ + FT_Vector* cur; /* current point coordinates */ + FT_Vector* orus; /* original (unscaled) point coordinates */ + + FT_Byte* tags; /* current touch flags */ + FT_UShort* contours; /* contour end points */ + + FT_UShort first_point; /* offset of first (#0) point */ + + } TT_GlyphZoneRec, *TT_GlyphZone; + + + /* handle to execution context */ + typedef struct TT_ExecContextRec_* TT_ExecContext; + + /* glyph loader structure */ + typedef struct TT_LoaderRec_ + { + FT_Face face; + FT_Size size; + FT_GlyphSlot glyph; + FT_GlyphLoader gloader; + + FT_ULong load_flags; + FT_UInt glyph_index; + + FT_Stream stream; + FT_Int byte_len; + + FT_Short n_contours; + FT_BBox bbox; + FT_Int left_bearing; + FT_Int advance; + FT_Int linear; + FT_Bool linear_def; + FT_Bool preserve_pps; + FT_Vector pp1; + FT_Vector pp2; + + FT_ULong glyf_offset; + + /* the zone where we load our glyphs */ + TT_GlyphZoneRec base; + TT_GlyphZoneRec zone; + + TT_ExecContext exec; + FT_Byte* instructions; + FT_ULong ins_pos; + + /* for possible extensibility in other formats */ + void* other; + + /* since version 2.1.8 */ + FT_Int top_bearing; + FT_Int vadvance; + FT_Vector pp3; + FT_Vector pp4; + + /* since version 2.2.1 */ + FT_Byte* cursor; + FT_Byte* limit; + + } TT_LoaderRec; + + +FT_END_HEADER + +#endif /* __TTTYPES_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/t1tables.h b/android/jni/ndk_modules/freetype/include/freetype/t1tables.h new file mode 100644 index 00000000..5e2a3934 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/t1tables.h @@ -0,0 +1,504 @@ +/***************************************************************************/ +/* */ +/* t1tables.h */ +/* */ +/* Basic Type 1/Type 2 tables definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1TABLES_H__ +#define __T1TABLES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* type1_tables */ + /* */ + /* <Title> */ + /* Type 1 Tables */ + /* */ + /* <Abstract> */ + /* Type~1 (PostScript) specific font tables. */ + /* */ + /* <Description> */ + /* This section contains the definition of Type 1-specific tables, */ + /* including structures related to other PostScript font formats. */ + /* */ + /*************************************************************************/ + + + /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */ + /* structures in order to support Multiple Master fonts. */ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_FontInfoRec */ + /* */ + /* <Description> */ + /* A structure used to model a Type~1 or Type~2 FontInfo dictionary. */ + /* Note that for Multiple Master fonts, each instance has its own */ + /* FontInfo dictionary. */ + /* */ + typedef struct PS_FontInfoRec_ + { + FT_String* version; + FT_String* notice; + FT_String* full_name; + FT_String* family_name; + FT_String* weight; + FT_Long italic_angle; + FT_Bool is_fixed_pitch; + FT_Short underline_position; + FT_UShort underline_thickness; + + } PS_FontInfoRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_FontInfo */ + /* */ + /* <Description> */ + /* A handle to a @PS_FontInfoRec structure. */ + /* */ + typedef struct PS_FontInfoRec_* PS_FontInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_FontInfo */ + /* */ + /* <Description> */ + /* This type is equivalent to @PS_FontInfoRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef PS_FontInfoRec T1_FontInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_PrivateRec */ + /* */ + /* <Description> */ + /* A structure used to model a Type~1 or Type~2 private dictionary. */ + /* Note that for Multiple Master fonts, each instance has its own */ + /* Private dictionary. */ + /* */ + typedef struct PS_PrivateRec_ + { + FT_Int unique_id; + FT_Int lenIV; + + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Short blue_values[14]; + FT_Short other_blues[10]; + + FT_Short family_blues [14]; + FT_Short family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_fuzz; + + FT_UShort standard_width[1]; + FT_UShort standard_height[1]; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Bool force_bold; + FT_Bool round_stem_up; + + FT_Short snap_widths [13]; /* including std width */ + FT_Short snap_heights[13]; /* including std height */ + + FT_Fixed expansion_factor; + + FT_Long language_group; + FT_Long password; + + FT_Short min_feature[2]; + + } PS_PrivateRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_Private */ + /* */ + /* <Description> */ + /* A handle to a @PS_PrivateRec structure. */ + /* */ + typedef struct PS_PrivateRec_* PS_Private; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_Private */ + /* */ + /* <Description> */ + /* This type is equivalent to @PS_PrivateRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef PS_PrivateRec T1_Private; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* T1_Blend_Flags */ + /* */ + /* <Description> */ + /* A set of flags used to indicate which fields are present in a */ + /* given blend dictionary (font info or private). Used to support */ + /* Multiple Masters fonts. */ + /* */ + typedef enum T1_Blend_Flags_ + { + /*# required fields in a FontInfo blend dictionary */ + T1_BLEND_UNDERLINE_POSITION = 0, + T1_BLEND_UNDERLINE_THICKNESS, + T1_BLEND_ITALIC_ANGLE, + + /*# required fields in a Private blend dictionary */ + T1_BLEND_BLUE_VALUES, + T1_BLEND_OTHER_BLUES, + T1_BLEND_STANDARD_WIDTH, + T1_BLEND_STANDARD_HEIGHT, + T1_BLEND_STEM_SNAP_WIDTHS, + T1_BLEND_STEM_SNAP_HEIGHTS, + T1_BLEND_BLUE_SCALE, + T1_BLEND_BLUE_SHIFT, + T1_BLEND_FAMILY_BLUES, + T1_BLEND_FAMILY_OTHER_BLUES, + T1_BLEND_FORCE_BOLD, + + /*# never remove */ + T1_BLEND_MAX + + } T1_Blend_Flags; + + /* */ + + + /*# backwards compatible definitions */ +#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION +#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS +#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE +#define t1_blend_blue_values T1_BLEND_BLUE_VALUES +#define t1_blend_other_blues T1_BLEND_OTHER_BLUES +#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH +#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT +#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS +#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS +#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE +#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT +#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES +#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES +#define t1_blend_force_bold T1_BLEND_FORCE_BOLD +#define t1_blend_max T1_BLEND_MAX + + + /* maximum number of Multiple Masters designs, as defined in the spec */ +#define T1_MAX_MM_DESIGNS 16 + + /* maximum number of Multiple Masters axes, as defined in the spec */ +#define T1_MAX_MM_AXIS 4 + + /* maximum number of elements in a design map */ +#define T1_MAX_MM_MAP_POINTS 20 + + + /* this structure is used to store the BlendDesignMap entry for an axis */ + typedef struct PS_DesignMap_ + { + FT_Byte num_points; + FT_Long* design_points; + FT_Fixed* blend_points; + + } PS_DesignMapRec, *PS_DesignMap; + + /* backwards-compatible definition */ + typedef PS_DesignMapRec T1_DesignMap; + + + typedef struct PS_BlendRec_ + { + FT_UInt num_designs; + FT_UInt num_axis; + + FT_String* axis_names[T1_MAX_MM_AXIS]; + FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; + PS_DesignMapRec design_map[T1_MAX_MM_AXIS]; + + FT_Fixed* weight_vector; + FT_Fixed* default_weight_vector; + + PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1]; + PS_Private privates [T1_MAX_MM_DESIGNS + 1]; + + FT_ULong blend_bitflags; + + FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; + + /* since 2.3.0 */ + + /* undocumented, optional: the default design instance; */ + /* corresponds to default_weight_vector -- */ + /* num_default_design_vector == 0 means it is not present */ + /* in the font and associated metrics files */ + FT_UInt default_design_vector[T1_MAX_MM_DESIGNS]; + FT_UInt num_default_design_vector; + + } PS_BlendRec, *PS_Blend; + + + /* backwards-compatible definition */ + typedef PS_BlendRec T1_Blend; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceDictRec */ + /* */ + /* <Description> */ + /* A structure used to represent data in a CID top-level dictionary. */ + /* */ + typedef struct CID_FaceDictRec_ + { + PS_PrivateRec private_dict; + + FT_UInt len_buildchar; + FT_Fixed forcebold_threshold; + FT_Pos stroke_width; + FT_Fixed expansion_factor; + + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_UInt num_subrs; + FT_ULong subrmap_offset; + FT_Int sd_bytes; + + } CID_FaceDictRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceDict */ + /* */ + /* <Description> */ + /* A handle to a @CID_FaceDictRec structure. */ + /* */ + typedef struct CID_FaceDictRec_* CID_FaceDict; + + /* */ + + + /* backwards-compatible definition */ + typedef CID_FaceDictRec CID_FontDict; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceInfoRec */ + /* */ + /* <Description> */ + /* A structure used to represent CID Face information. */ + /* */ + typedef struct CID_FaceInfoRec_ + { + FT_String* cid_font_name; + FT_Fixed cid_version; + FT_Int cid_font_type; + + FT_String* registry; + FT_String* ordering; + FT_Int supplement; + + PS_FontInfoRec font_info; + FT_BBox font_bbox; + FT_ULong uid_base; + + FT_Int num_xuid; + FT_ULong xuid[16]; + + FT_ULong cidmap_offset; + FT_Int fd_bytes; + FT_Int gd_bytes; + FT_ULong cid_count; + + FT_Int num_dicts; + CID_FaceDict font_dicts; + + FT_ULong data_offset; + + } CID_FaceInfoRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceInfo */ + /* */ + /* <Description> */ + /* A handle to a @CID_FaceInfoRec structure. */ + /* */ + typedef struct CID_FaceInfoRec_* CID_FaceInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_Info */ + /* */ + /* <Description> */ + /* This type is equivalent to @CID_FaceInfoRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef CID_FaceInfoRec CID_Info; + + + /************************************************************************ + * + * @function: + * FT_Has_PS_Glyph_Names + * + * @description: + * Return true if a given face provides reliable PostScript glyph + * names. This is similar to using the @FT_HAS_GLYPH_NAMES macro, + * except that certain fonts (mostly TrueType) contain incorrect + * glyph name tables. + * + * When this function returns true, the caller is sure that the glyph + * names returned by @FT_Get_Glyph_Name are reliable. + * + * @input: + * face :: + * face handle + * + * @return: + * Boolean. True if glyph names are reliable. + * + */ + FT_EXPORT( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ); + + + /************************************************************************ + * + * @function: + * FT_Get_PS_Font_Info + * + * @description: + * Retrieve the @PS_FontInfoRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_info :: + * Output font info structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The string pointers within the font info structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not PostScript-based, this function will + * return the `FT_Err_Invalid_Argument' error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfo afont_info ); + + + /************************************************************************ + * + * @function: + * FT_Get_PS_Font_Private + * + * @description: + * Retrieve the @PS_PrivateRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_private :: + * Output private dictionary structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The string pointers within the @PS_PrivateRec structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not PostScript-based, this function returns + * the `FT_Err_Invalid_Argument' error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_Private afont_private ); + + /* */ + + +FT_END_HEADER + +#endif /* __T1TABLES_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ttnameid.h b/android/jni/ndk_modules/freetype/include/freetype/ttnameid.h new file mode 100644 index 00000000..66aef043 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ttnameid.h @@ -0,0 +1,1247 @@ +/***************************************************************************/ +/* */ +/* ttnameid.h */ +/* */ +/* TrueType name ID definitions (specification only). */ +/* */ +/* Copyright 1996-2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTNAMEID_H__ +#define __TTNAMEID_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* truetype_tables */ + /* */ + + + /*************************************************************************/ + /* */ + /* Possible values for the `platform' identifier code in the name */ + /* records of the TTF `name' table. */ + /* */ + /*************************************************************************/ + + + /*********************************************************************** + * + * @enum: + * TT_PLATFORM_XXX + * + * @description: + * A list of valid values for the `platform_id' identifier code in + * @FT_CharMapRec and @FT_SfntName structures. + * + * @values: + * TT_PLATFORM_APPLE_UNICODE :: + * Used by Apple to indicate a Unicode character map and/or name entry. + * See @TT_APPLE_ID_XXX for corresponding `encoding_id' values. Note + * that name entries in this format are coded as big-endian UCS-2 + * character codes _only_. + * + * TT_PLATFORM_MACINTOSH :: + * Used by Apple to indicate a MacOS-specific charmap and/or name entry. + * See @TT_MAC_ID_XXX for corresponding `encoding_id' values. Note that + * most TrueType fonts contain an Apple roman charmap to be usable on + * MacOS systems (even if they contain a Microsoft charmap as well). + * + * TT_PLATFORM_ISO :: + * This value was used to specify ISO/IEC 10646 charmaps. It is however + * now deprecated. See @TT_ISO_ID_XXX for a list of corresponding + * `encoding_id' values. + * + * TT_PLATFORM_MICROSOFT :: + * Used by Microsoft to indicate Windows-specific charmaps. See + * @TT_MS_ID_XXX for a list of corresponding `encoding_id' values. + * Note that most fonts contain a Unicode charmap using + * (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS). + * + * TT_PLATFORM_CUSTOM :: + * Used to indicate application-specific charmaps. + * + * TT_PLATFORM_ADOBE :: + * This value isn't part of any font format specification, but is used + * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec + * structure. See @TT_ADOBE_ID_XXX. + */ + +#define TT_PLATFORM_APPLE_UNICODE 0 +#define TT_PLATFORM_MACINTOSH 1 +#define TT_PLATFORM_ISO 2 /* deprecated */ +#define TT_PLATFORM_MICROSOFT 3 +#define TT_PLATFORM_CUSTOM 4 +#define TT_PLATFORM_ADOBE 7 /* artificial */ + + + /*********************************************************************** + * + * @enum: + * TT_APPLE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries. + * + * @values: + * TT_APPLE_ID_DEFAULT :: + * Unicode version 1.0. + * + * TT_APPLE_ID_UNICODE_1_1 :: + * Unicode 1.1; specifies Hangul characters starting at U+34xx. + * + * TT_APPLE_ID_ISO_10646 :: + * Deprecated (identical to preceding). + * + * TT_APPLE_ID_UNICODE_2_0 :: + * Unicode 2.0 and beyond (UTF-16 BMP only). + * + * TT_APPLE_ID_UNICODE_32 :: + * Unicode 3.1 and beyond, using UTF-32. + * + * TT_APPLE_ID_VARIANT_SELECTOR :: + * From Adobe, not Apple. Not a normal cmap. Specifies variations + * on a real cmap. + */ + +#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ +#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ +#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ +#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ +#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */ +#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */ + + + /*********************************************************************** + * + * @enum: + * TT_MAC_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_MACINTOSH charmaps and name entries. + * + * @values: + * TT_MAC_ID_ROMAN :: + * TT_MAC_ID_JAPANESE :: + * TT_MAC_ID_TRADITIONAL_CHINESE :: + * TT_MAC_ID_KOREAN :: + * TT_MAC_ID_ARABIC :: + * TT_MAC_ID_HEBREW :: + * TT_MAC_ID_GREEK :: + * TT_MAC_ID_RUSSIAN :: + * TT_MAC_ID_RSYMBOL :: + * TT_MAC_ID_DEVANAGARI :: + * TT_MAC_ID_GURMUKHI :: + * TT_MAC_ID_GUJARATI :: + * TT_MAC_ID_ORIYA :: + * TT_MAC_ID_BENGALI :: + * TT_MAC_ID_TAMIL :: + * TT_MAC_ID_TELUGU :: + * TT_MAC_ID_KANNADA :: + * TT_MAC_ID_MALAYALAM :: + * TT_MAC_ID_SINHALESE :: + * TT_MAC_ID_BURMESE :: + * TT_MAC_ID_KHMER :: + * TT_MAC_ID_THAI :: + * TT_MAC_ID_LAOTIAN :: + * TT_MAC_ID_GEORGIAN :: + * TT_MAC_ID_ARMENIAN :: + * TT_MAC_ID_MALDIVIAN :: + * TT_MAC_ID_SIMPLIFIED_CHINESE :: + * TT_MAC_ID_TIBETAN :: + * TT_MAC_ID_MONGOLIAN :: + * TT_MAC_ID_GEEZ :: + * TT_MAC_ID_SLAVIC :: + * TT_MAC_ID_VIETNAMESE :: + * TT_MAC_ID_SINDHI :: + * TT_MAC_ID_UNINTERP :: + */ + +#define TT_MAC_ID_ROMAN 0 +#define TT_MAC_ID_JAPANESE 1 +#define TT_MAC_ID_TRADITIONAL_CHINESE 2 +#define TT_MAC_ID_KOREAN 3 +#define TT_MAC_ID_ARABIC 4 +#define TT_MAC_ID_HEBREW 5 +#define TT_MAC_ID_GREEK 6 +#define TT_MAC_ID_RUSSIAN 7 +#define TT_MAC_ID_RSYMBOL 8 +#define TT_MAC_ID_DEVANAGARI 9 +#define TT_MAC_ID_GURMUKHI 10 +#define TT_MAC_ID_GUJARATI 11 +#define TT_MAC_ID_ORIYA 12 +#define TT_MAC_ID_BENGALI 13 +#define TT_MAC_ID_TAMIL 14 +#define TT_MAC_ID_TELUGU 15 +#define TT_MAC_ID_KANNADA 16 +#define TT_MAC_ID_MALAYALAM 17 +#define TT_MAC_ID_SINHALESE 18 +#define TT_MAC_ID_BURMESE 19 +#define TT_MAC_ID_KHMER 20 +#define TT_MAC_ID_THAI 21 +#define TT_MAC_ID_LAOTIAN 22 +#define TT_MAC_ID_GEORGIAN 23 +#define TT_MAC_ID_ARMENIAN 24 +#define TT_MAC_ID_MALDIVIAN 25 +#define TT_MAC_ID_SIMPLIFIED_CHINESE 25 +#define TT_MAC_ID_TIBETAN 26 +#define TT_MAC_ID_MONGOLIAN 27 +#define TT_MAC_ID_GEEZ 28 +#define TT_MAC_ID_SLAVIC 29 +#define TT_MAC_ID_VIETNAMESE 30 +#define TT_MAC_ID_SINDHI 31 +#define TT_MAC_ID_UNINTERP 32 + + + /*********************************************************************** + * + * @enum: + * TT_ISO_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_ISO charmaps and name entries. + * + * Their use is now deprecated. + * + * @values: + * TT_ISO_ID_7BIT_ASCII :: + * ASCII. + * TT_ISO_ID_10646 :: + * ISO/10646. + * TT_ISO_ID_8859_1 :: + * Also known as Latin-1. + */ + +#define TT_ISO_ID_7BIT_ASCII 0 +#define TT_ISO_ID_10646 1 +#define TT_ISO_ID_8859_1 2 + + + /*********************************************************************** + * + * @enum: + * TT_MS_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_MICROSOFT charmaps and name entries. + * + * @values: + * TT_MS_ID_SYMBOL_CS :: + * Corresponds to Microsoft symbol encoding. See + * @FT_ENCODING_MS_SYMBOL. + * + * TT_MS_ID_UNICODE_CS :: + * Corresponds to a Microsoft WGL4 charmap, matching Unicode. See + * @FT_ENCODING_UNICODE. + * + * TT_MS_ID_SJIS :: + * Corresponds to SJIS Japanese encoding. See @FT_ENCODING_SJIS. + * + * TT_MS_ID_GB2312 :: + * Corresponds to Simplified Chinese as used in Mainland China. See + * @FT_ENCODING_GB2312. + * + * TT_MS_ID_BIG_5 :: + * Corresponds to Traditional Chinese as used in Taiwan and Hong Kong. + * See @FT_ENCODING_BIG5. + * + * TT_MS_ID_WANSUNG :: + * Corresponds to Korean Wansung encoding. See @FT_ENCODING_WANSUNG. + * + * TT_MS_ID_JOHAB :: + * Corresponds to Johab encoding. See @FT_ENCODING_JOHAB. + * + * TT_MS_ID_UCS_4 :: + * Corresponds to UCS-4 or UTF-32 charmaps. This has been added to + * the OpenType specification version 1.4 (mid-2001.) + */ + +#define TT_MS_ID_SYMBOL_CS 0 +#define TT_MS_ID_UNICODE_CS 1 +#define TT_MS_ID_SJIS 2 +#define TT_MS_ID_GB2312 3 +#define TT_MS_ID_BIG_5 4 +#define TT_MS_ID_WANSUNG 5 +#define TT_MS_ID_JOHAB 6 +#define TT_MS_ID_UCS_4 10 + + + /*********************************************************************** + * + * @enum: + * TT_ADOBE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific extension! + * + * @values: + * TT_ADOBE_ID_STANDARD :: + * Adobe standard encoding. + * TT_ADOBE_ID_EXPERT :: + * Adobe expert encoding. + * TT_ADOBE_ID_CUSTOM :: + * Adobe custom encoding. + * TT_ADOBE_ID_LATIN_1 :: + * Adobe Latin~1 encoding. + */ + +#define TT_ADOBE_ID_STANDARD 0 +#define TT_ADOBE_ID_EXPERT 1 +#define TT_ADOBE_ID_CUSTOM 2 +#define TT_ADOBE_ID_LATIN_1 3 + + + /*************************************************************************/ + /* */ + /* Possible values of the language identifier field in the name records */ + /* of the TTF `name' table if the `platform' identifier code is */ + /* TT_PLATFORM_MACINTOSH. */ + /* */ + /* The canonical source for the Apple assigned Language ID's is at */ + /* */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6name.html */ + /* */ +#define TT_MAC_LANGID_ENGLISH 0 +#define TT_MAC_LANGID_FRENCH 1 +#define TT_MAC_LANGID_GERMAN 2 +#define TT_MAC_LANGID_ITALIAN 3 +#define TT_MAC_LANGID_DUTCH 4 +#define TT_MAC_LANGID_SWEDISH 5 +#define TT_MAC_LANGID_SPANISH 6 +#define TT_MAC_LANGID_DANISH 7 +#define TT_MAC_LANGID_PORTUGUESE 8 +#define TT_MAC_LANGID_NORWEGIAN 9 +#define TT_MAC_LANGID_HEBREW 10 +#define TT_MAC_LANGID_JAPANESE 11 +#define TT_MAC_LANGID_ARABIC 12 +#define TT_MAC_LANGID_FINNISH 13 +#define TT_MAC_LANGID_GREEK 14 +#define TT_MAC_LANGID_ICELANDIC 15 +#define TT_MAC_LANGID_MALTESE 16 +#define TT_MAC_LANGID_TURKISH 17 +#define TT_MAC_LANGID_CROATIAN 18 +#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19 +#define TT_MAC_LANGID_URDU 20 +#define TT_MAC_LANGID_HINDI 21 +#define TT_MAC_LANGID_THAI 22 +#define TT_MAC_LANGID_KOREAN 23 +#define TT_MAC_LANGID_LITHUANIAN 24 +#define TT_MAC_LANGID_POLISH 25 +#define TT_MAC_LANGID_HUNGARIAN 26 +#define TT_MAC_LANGID_ESTONIAN 27 +#define TT_MAC_LANGID_LETTISH 28 +#define TT_MAC_LANGID_SAAMISK 29 +#define TT_MAC_LANGID_FAEROESE 30 +#define TT_MAC_LANGID_FARSI 31 +#define TT_MAC_LANGID_RUSSIAN 32 +#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33 +#define TT_MAC_LANGID_FLEMISH 34 +#define TT_MAC_LANGID_IRISH 35 +#define TT_MAC_LANGID_ALBANIAN 36 +#define TT_MAC_LANGID_ROMANIAN 37 +#define TT_MAC_LANGID_CZECH 38 +#define TT_MAC_LANGID_SLOVAK 39 +#define TT_MAC_LANGID_SLOVENIAN 40 +#define TT_MAC_LANGID_YIDDISH 41 +#define TT_MAC_LANGID_SERBIAN 42 +#define TT_MAC_LANGID_MACEDONIAN 43 +#define TT_MAC_LANGID_BULGARIAN 44 +#define TT_MAC_LANGID_UKRAINIAN 45 +#define TT_MAC_LANGID_BYELORUSSIAN 46 +#define TT_MAC_LANGID_UZBEK 47 +#define TT_MAC_LANGID_KAZAKH 48 +#define TT_MAC_LANGID_AZERBAIJANI 49 +#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49 +#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50 +#define TT_MAC_LANGID_ARMENIAN 51 +#define TT_MAC_LANGID_GEORGIAN 52 +#define TT_MAC_LANGID_MOLDAVIAN 53 +#define TT_MAC_LANGID_KIRGHIZ 54 +#define TT_MAC_LANGID_TAJIKI 55 +#define TT_MAC_LANGID_TURKMEN 56 +#define TT_MAC_LANGID_MONGOLIAN 57 +#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57 +#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58 +#define TT_MAC_LANGID_PASHTO 59 +#define TT_MAC_LANGID_KURDISH 60 +#define TT_MAC_LANGID_KASHMIRI 61 +#define TT_MAC_LANGID_SINDHI 62 +#define TT_MAC_LANGID_TIBETAN 63 +#define TT_MAC_LANGID_NEPALI 64 +#define TT_MAC_LANGID_SANSKRIT 65 +#define TT_MAC_LANGID_MARATHI 66 +#define TT_MAC_LANGID_BENGALI 67 +#define TT_MAC_LANGID_ASSAMESE 68 +#define TT_MAC_LANGID_GUJARATI 69 +#define TT_MAC_LANGID_PUNJABI 70 +#define TT_MAC_LANGID_ORIYA 71 +#define TT_MAC_LANGID_MALAYALAM 72 +#define TT_MAC_LANGID_KANNADA 73 +#define TT_MAC_LANGID_TAMIL 74 +#define TT_MAC_LANGID_TELUGU 75 +#define TT_MAC_LANGID_SINHALESE 76 +#define TT_MAC_LANGID_BURMESE 77 +#define TT_MAC_LANGID_KHMER 78 +#define TT_MAC_LANGID_LAO 79 +#define TT_MAC_LANGID_VIETNAMESE 80 +#define TT_MAC_LANGID_INDONESIAN 81 +#define TT_MAC_LANGID_TAGALOG 82 +#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83 +#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84 +#define TT_MAC_LANGID_AMHARIC 85 +#define TT_MAC_LANGID_TIGRINYA 86 +#define TT_MAC_LANGID_GALLA 87 +#define TT_MAC_LANGID_SOMALI 88 +#define TT_MAC_LANGID_SWAHILI 89 +#define TT_MAC_LANGID_RUANDA 90 +#define TT_MAC_LANGID_RUNDI 91 +#define TT_MAC_LANGID_CHEWA 92 +#define TT_MAC_LANGID_MALAGASY 93 +#define TT_MAC_LANGID_ESPERANTO 94 +#define TT_MAC_LANGID_WELSH 128 +#define TT_MAC_LANGID_BASQUE 129 +#define TT_MAC_LANGID_CATALAN 130 +#define TT_MAC_LANGID_LATIN 131 +#define TT_MAC_LANGID_QUECHUA 132 +#define TT_MAC_LANGID_GUARANI 133 +#define TT_MAC_LANGID_AYMARA 134 +#define TT_MAC_LANGID_TATAR 135 +#define TT_MAC_LANGID_UIGHUR 136 +#define TT_MAC_LANGID_DZONGKHA 137 +#define TT_MAC_LANGID_JAVANESE 138 +#define TT_MAC_LANGID_SUNDANESE 139 + + +#if 0 /* these seem to be errors that have been dropped */ + +#define TT_MAC_LANGID_SCOTTISH_GAELIC 140 +#define TT_MAC_LANGID_IRISH_GAELIC 141 + +#endif + + + /* The following codes are new as of 2000-03-10 */ +#define TT_MAC_LANGID_GALICIAN 140 +#define TT_MAC_LANGID_AFRIKAANS 141 +#define TT_MAC_LANGID_BRETON 142 +#define TT_MAC_LANGID_INUKTITUT 143 +#define TT_MAC_LANGID_SCOTTISH_GAELIC 144 +#define TT_MAC_LANGID_MANX_GAELIC 145 +#define TT_MAC_LANGID_IRISH_GAELIC 146 +#define TT_MAC_LANGID_TONGAN 147 +#define TT_MAC_LANGID_GREEK_POLYTONIC 148 +#define TT_MAC_LANGID_GREELANDIC 149 +#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 + + + /*************************************************************************/ + /* */ + /* Possible values of the language identifier field in the name records */ + /* of the TTF `name' table if the `platform' identifier code is */ + /* TT_PLATFORM_MICROSOFT. */ + /* */ + /* The canonical source for the MS assigned LCID's (seems to) be at */ + /* */ + /* http://www.microsoft.com/globaldev/reference/lcid-all.mspx */ + /* */ + /* It used to be at various places, among them */ + /* */ + /* http://www.microsoft.com/typography/OTSPEC/lcid-cp.txt */ + /* http://www.microsoft.com/globaldev/reference/loclanghome.asp */ + /* http://support.microsoft.com/support/kb/articles/Q224/8/04.ASP */ + /* http://msdn.microsoft.com/library/en-us/passport25/ */ + /* NET_Passport_VBScript_Documentation/Single_Sign_In/ */ + /* Advanced_Single_Sign_In/Localization_and_LCIDs.asp */ + /* */ + /* Hopefully, it seems now that the Globaldev site prevails... */ + /* (updated by Antoine, 2004-02-17) */ + +#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 +#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 +#define TT_MS_LANGID_ARABIC_IRAQ 0x0801 +#define TT_MS_LANGID_ARABIC_EGYPT 0x0c01 +#define TT_MS_LANGID_ARABIC_LIBYA 0x1001 +#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 +#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 +#define TT_MS_LANGID_ARABIC_TUNISIA 0x1c01 +#define TT_MS_LANGID_ARABIC_OMAN 0x2001 +#define TT_MS_LANGID_ARABIC_YEMEN 0x2401 +#define TT_MS_LANGID_ARABIC_SYRIA 0x2801 +#define TT_MS_LANGID_ARABIC_JORDAN 0x2c01 +#define TT_MS_LANGID_ARABIC_LEBANON 0x3001 +#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 +#define TT_MS_LANGID_ARABIC_UAE 0x3801 +#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3c01 +#define TT_MS_LANGID_ARABIC_QATAR 0x4001 +#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 +#define TT_MS_LANGID_CATALAN_SPAIN 0x0403 +#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 +#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 +#define TT_MS_LANGID_CHINESE_PRC 0x0804 +#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0c04 +#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 + +#if 1 /* this looks like the correct value */ +#define TT_MS_LANGID_CHINESE_MACAU 0x1404 +#else /* but beware, Microsoft may change its mind... + the most recent Word reference has the following: */ +#define TT_MS_LANGID_CHINESE_MACAU TT_MS_LANGID_CHINESE_HONG_KONG +#endif + +#if 0 /* used only with .NET `cultures'; commented out */ +#define TT_MS_LANGID_CHINESE_TRADITIONAL 0x7C04 +#endif + +#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 +#define TT_MS_LANGID_DANISH_DENMARK 0x0406 +#define TT_MS_LANGID_GERMAN_GERMANY 0x0407 +#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 +#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0c07 +#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 +#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407 +#define TT_MS_LANGID_GREEK_GREECE 0x0408 + + /* don't ask what this one means... It is commented out currently. */ +#if 0 +#define TT_MS_LANGID_GREEK_GREECE2 0x2008 +#endif + +#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 +#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 +#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 +#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0c09 +#define TT_MS_LANGID_ENGLISH_CANADA 0x1009 +#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 +#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 +#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1c09 +#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 +#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 +#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 +#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2c09 +#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 +#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 +#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 +#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3c09 +#define TT_MS_LANGID_ENGLISH_INDIA 0x4009 +#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 +#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 +#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040a +#define TT_MS_LANGID_SPANISH_MEXICO 0x080a +#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0c0a +#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100a +#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140a +#define TT_MS_LANGID_SPANISH_PANAMA 0x180a +#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1c0a +#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200a +#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240a +#define TT_MS_LANGID_SPANISH_PERU 0x280a +#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2c0a +#define TT_MS_LANGID_SPANISH_ECUADOR 0x300a +#define TT_MS_LANGID_SPANISH_CHILE 0x340a +#define TT_MS_LANGID_SPANISH_URUGUAY 0x380a +#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3c0a +#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400a +#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440a +#define TT_MS_LANGID_SPANISH_HONDURAS 0x480a +#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4c0a +#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500a +#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540a + /* The following ID blatantly violate MS specs by using a */ + /* sublanguage > 0x1F. */ +#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40aU +#define TT_MS_LANGID_FINNISH_FINLAND 0x040b +#define TT_MS_LANGID_FRENCH_FRANCE 0x040c +#define TT_MS_LANGID_FRENCH_BELGIUM 0x080c +#define TT_MS_LANGID_FRENCH_CANADA 0x0c0c +#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100c +#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140c +#define TT_MS_LANGID_FRENCH_MONACO 0x180c +#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1c0c +#define TT_MS_LANGID_FRENCH_REUNION 0x200c +#define TT_MS_LANGID_FRENCH_CONGO 0x240c + /* which was formerly: */ +#define TT_MS_LANGID_FRENCH_ZAIRE TT_MS_LANGID_FRENCH_CONGO +#define TT_MS_LANGID_FRENCH_SENEGAL 0x280c +#define TT_MS_LANGID_FRENCH_CAMEROON 0x2c0c +#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300c +#define TT_MS_LANGID_FRENCH_MALI 0x340c +#define TT_MS_LANGID_FRENCH_MOROCCO 0x380c +#define TT_MS_LANGID_FRENCH_HAITI 0x3c0c + /* and another violation of the spec (see 0xE40aU) */ +#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40cU +#define TT_MS_LANGID_HEBREW_ISRAEL 0x040d +#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040e +#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040f +#define TT_MS_LANGID_ITALIAN_ITALY 0x0410 +#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 +#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 +#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412 +#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 +#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 +#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 +#define TT_MS_LANGID_POLISH_POLAND 0x0415 +#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 +#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 +#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417 +#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 +#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 +#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 +#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 +#define TT_MS_LANGID_CROATIAN_CROATIA 0x041a +#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081a +#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0c1a + +#if 0 /* this used to be this value, but it looks like we were wrong */ +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x101a +#else /* current sources say */ +#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101a +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141a + /* and XPsp2 Platform SDK added (2004-07-26) */ + /* Names are shortened to be significant within 40 chars. */ +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181a +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x181a +#endif + +#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041b +#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041c +#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041d +#define TT_MS_LANGID_SWEDISH_FINLAND 0x081d +#define TT_MS_LANGID_THAI_THAILAND 0x041e +#define TT_MS_LANGID_TURKISH_TURKEY 0x041f +#define TT_MS_LANGID_URDU_PAKISTAN 0x0420 +#define TT_MS_LANGID_URDU_INDIA 0x0820 +#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 +#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 +#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 +#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424 +#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 +#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 +#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 +#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 +#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 +#define TT_MS_LANGID_FARSI_IRAN 0x0429 +#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042a +#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042b +#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042c +#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082c +#define TT_MS_LANGID_BASQUE_SPAIN 0x042d +#define TT_MS_LANGID_SORBIAN_GERMANY 0x042e +#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042f +#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 +#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 +#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432 +#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 +#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434 +#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435 +#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 +#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 +#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 +#define TT_MS_LANGID_HINDI_INDIA 0x0439 +#define TT_MS_LANGID_MALTESE_MALTA 0x043a + /* Added by XPsp2 Platform SDK (2004-07-26) */ +#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043b +#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083b +#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3b +#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103b +#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143b +#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183b +#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3b +#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203b +#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243b + /* ... and we also keep our old identifier... */ +#define TT_MS_LANGID_SAAMI_LAPONIA 0x043b + +#if 0 /* this seems to be a previous inversion */ +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c +#else +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c +#endif + +#define TT_MS_LANGID_YIDDISH_GERMANY 0x043d +#define TT_MS_LANGID_MALAY_MALAYSIA 0x043e +#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083e +#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043f +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440 + /* alias declared in Windows 2000 */ +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ + TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN + +#define TT_MS_LANGID_SWAHILI_KENYA 0x0441 +#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 +#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444 +#define TT_MS_LANGID_BENGALI_INDIA 0x0445 +#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 +#define TT_MS_LANGID_PUNJABI_INDIA 0x0446 +#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 +#define TT_MS_LANGID_GUJARATI_INDIA 0x0447 +#define TT_MS_LANGID_ORIYA_INDIA 0x0448 +#define TT_MS_LANGID_TAMIL_INDIA 0x0449 +#define TT_MS_LANGID_TELUGU_INDIA 0x044a +#define TT_MS_LANGID_KANNADA_INDIA 0x044b +#define TT_MS_LANGID_MALAYALAM_INDIA 0x044c +#define TT_MS_LANGID_ASSAMESE_INDIA 0x044d +#define TT_MS_LANGID_MARATHI_INDIA 0x044e +#define TT_MS_LANGID_SANSKRIT_INDIA 0x044f +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN 0x0850 +#define TT_MS_LANGID_TIBETAN_CHINA 0x0451 + /* Don't use the next constant! It has */ + /* (1) the wrong spelling (Dzonghka) */ + /* (2) Microsoft doesn't officially define it -- */ + /* at least it is not in the List of Local */ + /* ID Values. */ + /* (3) Dzongkha is not the same language as */ + /* Tibetan, so merging it is wrong anyway. */ + /* */ + /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW. */ +#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 + +#if 0 + /* the following used to be defined */ +#define TT_MS_LANGID_TIBETAN_BHUTAN 0x0451 + /* ... but it was changed; */ +#else + /* So we will continue to #define it, but with the correct value */ +#define TT_MS_LANGID_TIBETAN_BHUTAN TT_MS_LANGID_DZONGHKA_BHUTAN +#endif + +#define TT_MS_LANGID_WELSH_WALES 0x0452 +#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 +#define TT_MS_LANGID_LAO_LAOS 0x0454 +#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 +#define TT_MS_LANGID_GALICIAN_SPAIN 0x0456 +#define TT_MS_LANGID_KONKANI_INDIA 0x0457 +#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 +#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 +#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 + /* Missing a LCID for Sindhi in Devanagari script */ +#define TT_MS_LANGID_SYRIAC_SYRIA 0x045a +#define TT_MS_LANGID_SINHALESE_SRI_LANKA 0x045b +#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045c +#define TT_MS_LANGID_INUKTITUT_CANADA 0x045d +#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045e +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045f +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN 0x085f + /* Missing a LCID for Tifinagh script */ +#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 + /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */ + /* script is yet unclear... might be Arabic, Nagari or Sharada */ +#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 + /* ... and aliased (by MS) for compatibility reasons. */ +#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA +#define TT_MS_LANGID_NEPALI_NEPAL 0x0461 +#define TT_MS_LANGID_NEPALI_INDIA 0x0861 +#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 +#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 +#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 +#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 + /* alias declared in Windows 2000 */ +#define TT_MS_LANGID_DIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES +#define TT_MS_LANGID_EDO_NIGERIA 0x0466 +#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 +#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 +#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 +#define TT_MS_LANGID_YORUBA_NIGERIA 0x046a +#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046b +#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086b +#define TT_MS_LANGID_QUECHUA_PERU 0x0c6b +#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA 0x046c + /* Also spelled by XPsp2 Platform SDK (2004-07-26) */ +#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ + TT_MS_LANGID_SEPEDI_SOUTH_AFRICA + /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */ +#define TT_MS_LANGID_IGBO_NIGERIA 0x0470 +#define TT_MS_LANGID_KANURI_NIGERIA 0x0471 +#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 +#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 +#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 + /* also spelled in the `Passport SDK' list as: */ +#define TT_MS_LANGID_TIGRIGNA_ERYTREA TT_MS_LANGID_TIGRIGNA_ERYTHREA +#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 +#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 +#define TT_MS_LANGID_LATIN 0x0476 +#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 + /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */ + /* not written (but OTOH the peculiar writing system is worth */ + /* studying). */ +#define TT_MS_LANGID_YI_CHINA 0x0478 +#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 + /* language codes from 0x047a to 0x047f are (still) unknown. */ +#define TT_MS_LANGID_UIGHUR_CHINA 0x0480 +#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 + +#if 0 /* not deemed useful for fonts */ +#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE 0x04ff +#endif + + + /*************************************************************************/ + /* */ + /* Possible values of the `name' identifier field in the name records of */ + /* the TTF `name' table. These values are platform independent. */ + /* */ +#define TT_NAME_ID_COPYRIGHT 0 +#define TT_NAME_ID_FONT_FAMILY 1 +#define TT_NAME_ID_FONT_SUBFAMILY 2 +#define TT_NAME_ID_UNIQUE_ID 3 +#define TT_NAME_ID_FULL_NAME 4 +#define TT_NAME_ID_VERSION_STRING 5 +#define TT_NAME_ID_PS_NAME 6 +#define TT_NAME_ID_TRADEMARK 7 + + /* the following values are from the OpenType spec */ +#define TT_NAME_ID_MANUFACTURER 8 +#define TT_NAME_ID_DESIGNER 9 +#define TT_NAME_ID_DESCRIPTION 10 +#define TT_NAME_ID_VENDOR_URL 11 +#define TT_NAME_ID_DESIGNER_URL 12 +#define TT_NAME_ID_LICENSE 13 +#define TT_NAME_ID_LICENSE_URL 14 + /* number 15 is reserved */ +#define TT_NAME_ID_PREFERRED_FAMILY 16 +#define TT_NAME_ID_PREFERRED_SUBFAMILY 17 +#define TT_NAME_ID_MAC_FULL_NAME 18 + + /* The following code is new as of 2000-01-21 */ +#define TT_NAME_ID_SAMPLE_TEXT 19 + + /* This is new in OpenType 1.3 */ +#define TT_NAME_ID_CID_FINDFONT_NAME 20 + + /* This is new in OpenType 1.5 */ +#define TT_NAME_ID_WWS_FAMILY 21 +#define TT_NAME_ID_WWS_SUBFAMILY 22 + + + /*************************************************************************/ + /* */ + /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */ + /* */ + /* Updated 08-Nov-2008. */ + /* */ + + /* Bit 0 Basic Latin */ +#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ + /* Bit 1 C1 Controls and Latin-1 Supplement */ +#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */ + /* Bit 2 Latin Extended-A */ +#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */ + /* Bit 3 Latin Extended-B */ +#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */ + /* Bit 4 IPA Extensions */ + /* Phonetic Extensions */ + /* Phonetic Extensions Supplement */ +#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ + /* U+1D00-U+1D7F */ + /* U+1D80-U+1DBF */ + /* Bit 5 Spacing Modifier Letters */ + /* Modifier Tone Letters */ +#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ + /* U+A700-U+A71F */ + /* Bit 6 Combining Diacritical Marks */ + /* Combining Diacritical Marks Supplement */ +#define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */ + /* U+1DC0-U+1DFF */ + /* Bit 7 Greek and Coptic */ +#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ + /* Bit 8 Coptic */ +#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */ + /* Bit 9 Cyrillic */ + /* Cyrillic Supplement */ + /* Cyrillic Extended-A */ + /* Cyrillic Extended-B */ +#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ + /* U+0500-U+052F */ + /* U+2DE0-U+2DFF */ + /* U+A640-U+A69F */ + /* Bit 10 Armenian */ +#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */ + /* Bit 11 Hebrew */ +#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */ + /* Bit 12 Vai */ +#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */ + /* Bit 13 Arabic */ + /* Arabic Supplement */ +#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ + /* U+0750-U+077F */ + /* Bit 14 NKo */ +#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */ + /* Bit 15 Devanagari */ +#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */ + /* Bit 16 Bengali */ +#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */ + /* Bit 17 Gurmukhi */ +#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */ + /* Bit 18 Gujarati */ +#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */ + /* Bit 19 Oriya */ +#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */ + /* Bit 20 Tamil */ +#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */ + /* Bit 21 Telugu */ +#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ + /* Bit 22 Kannada */ +#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */ + /* Bit 23 Malayalam */ +#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */ + /* Bit 24 Thai */ +#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */ + /* Bit 25 Lao */ +#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */ + /* Bit 26 Georgian */ + /* Georgian Supplement */ +#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ + /* U+2D00-U+2D2F */ + /* Bit 27 Balinese */ +#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */ + /* Bit 28 Hangul Jamo */ +#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ + /* Bit 29 Latin Extended Additional */ + /* Latin Extended-C */ + /* Latin Extended-D */ +#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ + /* U+2C60-U+2C7F */ + /* U+A720-U+A7FF */ + /* Bit 30 Greek Extended */ +#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ + /* Bit 31 General Punctuation */ + /* Supplemental Punctuation */ +#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ + /* U+2E00-U+2E7F */ + /* Bit 32 Superscripts And Subscripts */ +#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ + /* Bit 33 Currency Symbols */ +#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ + /* Bit 34 Combining Diacritical Marks For Symbols */ +#define TT_UCR_COMBINING_DIACRITICS_SYMB (1L << 2) /* U+20D0-U+20FF */ + /* Bit 35 Letterlike Symbols */ +#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ + /* Bit 36 Number Forms */ +#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */ + /* Bit 37 Arrows */ + /* Supplemental Arrows-A */ + /* Supplemental Arrows-B */ + /* Miscellaneous Symbols and Arrows */ +#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ + /* U+27F0-U+27FF */ + /* U+2900-U+297F */ + /* U+2B00-U+2BFF */ + /* Bit 38 Mathematical Operators */ + /* Supplemental Mathematical Operators */ + /* Miscellaneous Mathematical Symbols-A */ + /* Miscellaneous Mathematical Symbols-B */ +#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ + /* U+2A00-U+2AFF */ + /* U+27C0-U+27EF */ + /* U+2980-U+29FF */ + /* Bit 39 Miscellaneous Technical */ +#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */ + /* Bit 40 Control Pictures */ +#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */ + /* Bit 41 Optical Character Recognition */ +#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */ + /* Bit 42 Enclosed Alphanumerics */ +#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */ + /* Bit 43 Box Drawing */ +#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */ + /* Bit 44 Block Elements */ +#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */ + /* Bit 45 Geometric Shapes */ +#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */ + /* Bit 46 Miscellaneous Symbols */ +#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */ + /* Bit 47 Dingbats */ +#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */ + /* Bit 48 CJK Symbols and Punctuation */ +#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */ + /* Bit 49 Hiragana */ +#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */ + /* Bit 50 Katakana */ + /* Katakana Phonetic Extensions */ +#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ + /* U+31F0-U+31FF */ + /* Bit 51 Bopomofo */ + /* Bopomofo Extended */ +#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */ + /* U+31A0-U+31BF */ + /* Bit 52 Hangul Compatibility Jamo */ +#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */ + /* Bit 53 Phags-Pa */ +#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */ +#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */ +#define TT_UCR_PHAGSPA + /* Bit 54 Enclosed CJK Letters and Months */ +#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */ + /* Bit 55 CJK Compatibility */ +#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */ + /* Bit 56 Hangul Syllables */ +#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ + /* Bit 57 High Surrogates */ + /* High Private Use Surrogates */ + /* Low Surrogates */ + /* */ + /* According to OpenType specs v.1.3+, */ + /* setting bit 57 implies that there is */ + /* at least one codepoint beyond the */ + /* Basic Multilingual Plane that is */ + /* supported by this font. So it really */ + /* means >= U+10000 */ +#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ + /* U+DB80-U+DBFF */ + /* U+DC00-U+DFFF */ +#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES + /* Bit 58 Phoenician */ +#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/ + /* Bit 59 CJK Unified Ideographs */ + /* CJK Radicals Supplement */ + /* Kangxi Radicals */ + /* Ideographic Description Characters */ + /* CJK Unified Ideographs Extension A */ + /* CJK Unified Ideographs Extension B */ + /* Kanbun */ +#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */ + /* U+2E80-U+2EFF */ + /* U+2F00-U+2FDF */ + /* U+2FF0-U+2FFF */ + /* U+3400-U+4DB5 */ + /*U+20000-U+2A6DF*/ + /* U+3190-U+319F */ + /* Bit 60 Private Use */ +#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ + /* Bit 61 CJK Strokes */ + /* CJK Compatibility Ideographs */ + /* CJK Compatibility Ideographs Supplement */ +#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */ + /* U+F900-U+FAFF */ + /*U+2F800-U+2FA1F*/ + /* Bit 62 Alphabetic Presentation Forms */ +#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ + /* Bit 63 Arabic Presentation Forms-A */ +#define TT_UCR_ARABIC_PRESENTATIONS_A (1L << 31) /* U+FB50-U+FDFF */ + /* Bit 64 Combining Half Marks */ +#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ + /* Bit 65 Vertical forms */ + /* CJK Compatibility Forms */ +#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */ + /* U+FE30-U+FE4F */ + /* Bit 66 Small Form Variants */ +#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ + /* Bit 67 Arabic Presentation Forms-B */ +#define TT_UCR_ARABIC_PRESENTATIONS_B (1L << 3) /* U+FE70-U+FEFE */ + /* Bit 68 Halfwidth and Fullwidth Forms */ +#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ + /* Bit 69 Specials */ +#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */ + /* Bit 70 Tibetan */ +#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */ + /* Bit 71 Syriac */ +#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */ + /* Bit 72 Thaana */ +#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */ + /* Bit 73 Sinhala */ +#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */ + /* Bit 74 Myanmar */ +#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */ + /* Bit 75 Ethiopic */ + /* Ethiopic Supplement */ + /* Ethiopic Extended */ +#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ + /* U+1380-U+139F */ + /* U+2D80-U+2DDF */ + /* Bit 76 Cherokee */ +#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ + /* Bit 77 Unified Canadian Aboriginal Syllabics */ +#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */ + /* Bit 78 Ogham */ +#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */ + /* Bit 79 Runic */ +#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */ + /* Bit 80 Khmer */ + /* Khmer Symbols */ +#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ + /* U+19E0-U+19FF */ + /* Bit 81 Mongolian */ +#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */ + /* Bit 82 Braille Patterns */ +#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ + /* Bit 83 Yi Syllables */ + /* Yi Radicals */ +#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */ + /* U+A490-U+A4CF */ + /* Bit 84 Tagalog */ + /* Hanunoo */ + /* Buhid */ + /* Tagbanwa */ +#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */ + /* U+1720-U+173F */ + /* U+1740-U+175F */ + /* U+1760-U+177F */ + /* Bit 85 Old Italic */ +#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/ + /* Bit 86 Gothic */ +#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/ + /* Bit 87 Deseret */ +#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/ + /* Bit 88 Byzantine Musical Symbols */ + /* Musical Symbols */ + /* Ancient Greek Musical Notation */ +#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/ + /*U+1D100-U+1D1FF*/ + /*U+1D200-U+1D24F*/ + /* Bit 89 Mathematical Alphanumeric Symbols */ +#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/ + /* Bit 90 Private Use (plane 15) */ + /* Private Use (plane 16) */ +#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/ + /*U+100000-U+10FFFD*/ + /* Bit 91 Variation Selectors */ + /* Variation Selectors Supplement */ +#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */ + /*U+E0100-U+E01EF*/ + /* Bit 92 Tags */ +#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/ + /* Bit 93 Limbu */ +#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */ + /* Bit 94 Tai Le */ +#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */ + /* Bit 95 New Tai Lue */ +#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */ + /* Bit 96 Buginese */ +#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */ + /* Bit 97 Glagolitic */ +#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */ + /* Bit 98 Tifinagh */ +#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */ + /* Bit 99 Yijing Hexagram Symbols */ +#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */ + /* Bit 100 Syloti Nagri */ +#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */ + /* Bit 101 Linear B Syllabary */ + /* Linear B Ideograms */ + /* Aegean Numbers */ +#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/ + /*U+10080-U+100FF*/ + /*U+10100-U+1013F*/ + /* Bit 102 Ancient Greek Numbers */ +#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/ + /* Bit 103 Ugaritic */ +#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/ + /* Bit 104 Old Persian */ +#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/ + /* Bit 105 Shavian */ +#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/ + /* Bit 106 Osmanya */ +#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/ + /* Bit 107 Cypriot Syllabary */ +#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/ + /* Bit 108 Kharoshthi */ +#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/ + /* Bit 109 Tai Xuan Jing Symbols */ +#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/ + /* Bit 110 Cuneiform */ + /* Cuneiform Numbers and Punctuation */ +#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/ + /*U+12400-U+1247F*/ + /* Bit 111 Counting Rod Numerals */ +#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/ + /* Bit 112 Sundanese */ +#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */ + /* Bit 113 Lepcha */ +#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */ + /* Bit 114 Ol Chiki */ +#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */ + /* Bit 115 Saurashtra */ +#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */ + /* Bit 116 Kayah Li */ +#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */ + /* Bit 117 Rejang */ +#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */ + /* Bit 118 Cham */ +#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */ + /* Bit 119 Ancient Symbols */ +#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/ + /* Bit 120 Phaistos Disc */ +#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/ + /* Bit 121 Carian */ + /* Lycian */ + /* Lydian */ +#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/ + /*U+10280-U+1029F*/ + /*U+10920-U+1093F*/ + /* Bit 122 Domino Tiles */ + /* Mahjong Tiles */ +#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/ + /*U+1F000-U+1F02F*/ + /* Bit 123-127 Reserved for process-internal usage */ + + + /*************************************************************************/ + /* */ + /* Some compilers have a very limited length of identifiers. */ + /* */ +#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ ) +#define HAVE_LIMIT_ON_IDENTS +#endif + + +#ifndef HAVE_LIMIT_ON_IDENTS + + + /*************************************************************************/ + /* */ + /* Here some alias #defines in order to be clearer. */ + /* */ + /* These are not always #defined to stay within the 31~character limit */ + /* which some compilers have. */ + /* */ + /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern */ + /* Borland compilers (read: from BC++ 3.1 on) can increase this limit. */ + /* If you get a warning with such a compiler, use the -i40 switch. */ + /* */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_A \ + TT_UCR_ARABIC_PRESENTATIONS_A +#define TT_UCR_ARABIC_PRESENTATION_FORMS_B \ + TT_UCR_ARABIC_PRESENTATIONS_B + +#define TT_UCR_COMBINING_DIACRITICAL_MARKS \ + TT_UCR_COMBINING_DIACRITICS +#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ + TT_UCR_COMBINING_DIACRITICS_SYMB + + +#endif /* !HAVE_LIMIT_ON_IDENTS */ + + +FT_END_HEADER + +#endif /* __TTNAMEID_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/tttables.h b/android/jni/ndk_modules/freetype/include/freetype/tttables.h new file mode 100644 index 00000000..4610e501 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/tttables.h @@ -0,0 +1,759 @@ +/***************************************************************************/ +/* */ +/* tttables.h */ +/* */ +/* Basic SFNT/TrueType tables definitions and interface */ +/* (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTTABLES_H__ +#define __TTTABLES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* truetype_tables */ + /* */ + /* <Title> */ + /* TrueType Tables */ + /* */ + /* <Abstract> */ + /* TrueType specific table types and functions. */ + /* */ + /* <Description> */ + /* This section contains the definition of TrueType-specific tables */ + /* as well as some routines used to access and process them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Header */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType font header table. All */ + /* fields follow the TrueType specification. */ + /* */ + typedef struct TT_Header_ + { + FT_Fixed Table_Version; + FT_Fixed Font_Revision; + + FT_Long CheckSum_Adjust; + FT_Long Magic_Number; + + FT_UShort Flags; + FT_UShort Units_Per_EM; + + FT_Long Created [2]; + FT_Long Modified[2]; + + FT_Short xMin; + FT_Short yMin; + FT_Short xMax; + FT_Short yMax; + + FT_UShort Mac_Style; + FT_UShort Lowest_Rec_PPEM; + + FT_Short Font_Direction; + FT_Short Index_To_Loc_Format; + FT_Short Glyph_Data_Format; + + } TT_Header; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HoriHeader */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType horizontal header, the `hhea' */ + /* table, as well as the corresponding horizontal metrics table, */ + /* i.e., the `hmtx' table. */ + /* */ + /* <Fields> */ + /* Version :: The table version. */ + /* */ + /* Ascender :: The font's ascender, i.e., the distance */ + /* from the baseline to the top-most of all */ + /* glyph points found in the font. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of the */ + /* glyphs found in the font (maybe ASCII). */ + /* */ + /* You should use the `sTypoAscender' field */ + /* of the OS/2 table instead if you want */ + /* the correct one. */ + /* */ + /* Descender :: The font's descender, i.e., the distance */ + /* from the baseline to the bottom-most of */ + /* all glyph points found in the font. It */ + /* is negative. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of the */ + /* glyphs found in the font (maybe ASCII). */ + /* */ + /* You should use the `sTypoDescender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Line_Gap :: The font's line gap, i.e., the distance */ + /* to add to the ascender and descender to */ + /* get the BTB, i.e., the */ + /* baseline-to-baseline distance for the */ + /* font. */ + /* */ + /* advance_Width_Max :: This field is the maximum of all advance */ + /* widths found in the font. It can be */ + /* used to compute the maximum width of an */ + /* arbitrary string of text. */ + /* */ + /* min_Left_Side_Bearing :: The minimum left side bearing of all */ + /* glyphs within the font. */ + /* */ + /* min_Right_Side_Bearing :: The minimum right side bearing of all */ + /* glyphs within the font. */ + /* */ + /* xMax_Extent :: The maximum horizontal extent (i.e., the */ + /* `width' of a glyph's bounding box) for */ + /* all glyphs in the font. */ + /* */ + /* caret_Slope_Rise :: The rise coefficient of the cursor's */ + /* slope of the cursor (slope=rise/run). */ + /* */ + /* caret_Slope_Run :: The run coefficient of the cursor's */ + /* slope. */ + /* */ + /* Reserved :: 8~reserved bytes. */ + /* */ + /* metric_Data_Format :: Always~0. */ + /* */ + /* number_Of_HMetrics :: Number of HMetrics entries in the `hmtx' */ + /* table -- this value can be smaller than */ + /* the total number of glyphs in the font. */ + /* */ + /* long_metrics :: A pointer into the `hmtx' table. */ + /* */ + /* short_metrics :: A pointer into the `hmtx' table. */ + /* */ + /* <Note> */ + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields which */ + /* are different. */ + /* */ + /* This ensures that a single function in the `ttload' */ + /* module is able to read both the horizontal and vertical */ + /* headers. */ + /* */ + typedef struct TT_HoriHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Width_Max; /* advance width maximum */ + + FT_Short min_Left_Side_Bearing; /* minimum left-sb */ + FT_Short min_Right_Side_Bearing; /* minimum right-sb */ + FT_Short xMax_Extent; /* xmax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_HMetrics; + + /* The following fields are not defined by the TrueType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* `HMTX' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_HoriHeader; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_VertHeader */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType vertical header, the `vhea' */ + /* table, as well as the corresponding vertical metrics table, i.e., */ + /* the `vmtx' table. */ + /* */ + /* <Fields> */ + /* Version :: The table version. */ + /* */ + /* Ascender :: The font's ascender, i.e., the distance */ + /* from the baseline to the top-most of */ + /* all glyph points found in the font. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of */ + /* the glyphs found in the font (maybe */ + /* ASCII). */ + /* */ + /* You should use the `sTypoAscender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Descender :: The font's descender, i.e., the */ + /* distance from the baseline to the */ + /* bottom-most of all glyph points found */ + /* in the font. It is negative. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of */ + /* the glyphs found in the font (maybe */ + /* ASCII). */ + /* */ + /* You should use the `sTypoDescender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Line_Gap :: The font's line gap, i.e., the distance */ + /* to add to the ascender and descender to */ + /* get the BTB, i.e., the */ + /* baseline-to-baseline distance for the */ + /* font. */ + /* */ + /* advance_Height_Max :: This field is the maximum of all */ + /* advance heights found in the font. It */ + /* can be used to compute the maximum */ + /* height of an arbitrary string of text. */ + /* */ + /* min_Top_Side_Bearing :: The minimum top side bearing of all */ + /* glyphs within the font. */ + /* */ + /* min_Bottom_Side_Bearing :: The minimum bottom side bearing of all */ + /* glyphs within the font. */ + /* */ + /* yMax_Extent :: The maximum vertical extent (i.e., the */ + /* `height' of a glyph's bounding box) for */ + /* all glyphs in the font. */ + /* */ + /* caret_Slope_Rise :: The rise coefficient of the cursor's */ + /* slope of the cursor (slope=rise/run). */ + /* */ + /* caret_Slope_Run :: The run coefficient of the cursor's */ + /* slope. */ + /* */ + /* caret_Offset :: The cursor's offset for slanted fonts. */ + /* This value is `reserved' in vmtx */ + /* version 1.0. */ + /* */ + /* Reserved :: 8~reserved bytes. */ + /* */ + /* metric_Data_Format :: Always~0. */ + /* */ + /* number_Of_HMetrics :: Number of VMetrics entries in the */ + /* `vmtx' table -- this value can be */ + /* smaller than the total number of glyphs */ + /* in the font. */ + /* */ + /* long_metrics :: A pointer into the `vmtx' table. */ + /* */ + /* short_metrics :: A pointer into the `vmtx' table. */ + /* */ + /* <Note> */ + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields which */ + /* are different. */ + /* */ + /* This ensures that a single function in the `ttload' */ + /* module is able to read both the horizontal and vertical */ + /* headers. */ + /* */ + typedef struct TT_VertHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Height_Max; /* advance height maximum */ + + FT_Short min_Top_Side_Bearing; /* minimum left-sb or top-sb */ + FT_Short min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */ + FT_Short yMax_Extent; /* xmax or ymax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_VMetrics; + + /* The following fields are not defined by the TrueType specification */ + /* but they're used to connect the metrics header to the relevant */ + /* `HMTX' or `VMTX' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_VertHeader; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_OS2 */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType OS/2 table. This is the long */ + /* table version. All fields comply to the TrueType specification. */ + /* */ + /* Note that we now support old Mac fonts which do not include an */ + /* OS/2 table. In this case, the `version' field is always set to */ + /* 0xFFFF. */ + /* */ + typedef struct TT_OS2_ + { + FT_UShort version; /* 0x0001 - more or 0xFFFF */ + FT_Short xAvgCharWidth; + FT_UShort usWeightClass; + FT_UShort usWidthClass; + FT_Short fsType; + FT_Short ySubscriptXSize; + FT_Short ySubscriptYSize; + FT_Short ySubscriptXOffset; + FT_Short ySubscriptYOffset; + FT_Short ySuperscriptXSize; + FT_Short ySuperscriptYSize; + FT_Short ySuperscriptXOffset; + FT_Short ySuperscriptYOffset; + FT_Short yStrikeoutSize; + FT_Short yStrikeoutPosition; + FT_Short sFamilyClass; + + FT_Byte panose[10]; + + FT_ULong ulUnicodeRange1; /* Bits 0-31 */ + FT_ULong ulUnicodeRange2; /* Bits 32-63 */ + FT_ULong ulUnicodeRange3; /* Bits 64-95 */ + FT_ULong ulUnicodeRange4; /* Bits 96-127 */ + + FT_Char achVendID[4]; + + FT_UShort fsSelection; + FT_UShort usFirstCharIndex; + FT_UShort usLastCharIndex; + FT_Short sTypoAscender; + FT_Short sTypoDescender; + FT_Short sTypoLineGap; + FT_UShort usWinAscent; + FT_UShort usWinDescent; + + /* only version 1 tables: */ + + FT_ULong ulCodePageRange1; /* Bits 0-31 */ + FT_ULong ulCodePageRange2; /* Bits 32-63 */ + + /* only version 2 tables: */ + + FT_Short sxHeight; + FT_Short sCapHeight; + FT_UShort usDefaultChar; + FT_UShort usBreakChar; + FT_UShort usMaxContext; + + } TT_OS2; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Postscript */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType PostScript table. All fields */ + /* comply to the TrueType specification. This structure does not */ + /* reference the PostScript glyph names, which can be nevertheless */ + /* accessed with the `ttpost' module. */ + /* */ + typedef struct TT_Postscript_ + { + FT_Fixed FormatType; + FT_Fixed italicAngle; + FT_Short underlinePosition; + FT_Short underlineThickness; + FT_ULong isFixedPitch; + FT_ULong minMemType42; + FT_ULong maxMemType42; + FT_ULong minMemType1; + FT_ULong maxMemType1; + + /* Glyph names follow in the file, but we don't */ + /* load them by default. See the ttpost.c file. */ + + } TT_Postscript; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_PCLT */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType PCLT table. All fields */ + /* comply to the TrueType specification. */ + /* */ + typedef struct TT_PCLT_ + { + FT_Fixed Version; + FT_ULong FontNumber; + FT_UShort Pitch; + FT_UShort xHeight; + FT_UShort Style; + FT_UShort TypeFamily; + FT_UShort CapHeight; + FT_UShort SymbolSet; + FT_Char TypeFace[16]; + FT_Char CharacterComplement[8]; + FT_Char FileName[6]; + FT_Char StrokeWeight; + FT_Char WidthType; + FT_Byte SerifStyle; + FT_Byte Reserved; + + } TT_PCLT; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_MaxProfile */ + /* */ + /* <Description> */ + /* The maximum profile is a table containing many max values which */ + /* can be used to pre-allocate arrays. This ensures that no memory */ + /* allocation occurs during a glyph load. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* numGlyphs :: The number of glyphs in this TrueType */ + /* font. */ + /* */ + /* maxPoints :: The maximum number of points in a */ + /* non-composite TrueType glyph. See also */ + /* the structure element */ + /* `maxCompositePoints'. */ + /* */ + /* maxContours :: The maximum number of contours in a */ + /* non-composite TrueType glyph. See also */ + /* the structure element */ + /* `maxCompositeContours'. */ + /* */ + /* maxCompositePoints :: The maximum number of points in a */ + /* composite TrueType glyph. See also the */ + /* structure element `maxPoints'. */ + /* */ + /* maxCompositeContours :: The maximum number of contours in a */ + /* composite TrueType glyph. See also the */ + /* structure element `maxContours'. */ + /* */ + /* maxZones :: The maximum number of zones used for */ + /* glyph hinting. */ + /* */ + /* maxTwilightPoints :: The maximum number of points in the */ + /* twilight zone used for glyph hinting. */ + /* */ + /* maxStorage :: The maximum number of elements in the */ + /* storage area used for glyph hinting. */ + /* */ + /* maxFunctionDefs :: The maximum number of function */ + /* definitions in the TrueType bytecode for */ + /* this font. */ + /* */ + /* maxInstructionDefs :: The maximum number of instruction */ + /* definitions in the TrueType bytecode for */ + /* this font. */ + /* */ + /* maxStackElements :: The maximum number of stack elements used */ + /* during bytecode interpretation. */ + /* */ + /* maxSizeOfInstructions :: The maximum number of TrueType opcodes */ + /* used for glyph hinting. */ + /* */ + /* maxComponentElements :: The maximum number of simple (i.e., non- */ + /* composite) glyphs in a composite glyph. */ + /* */ + /* maxComponentDepth :: The maximum nesting depth of composite */ + /* glyphs. */ + /* */ + /* <Note> */ + /* This structure is only used during font loading. */ + /* */ + typedef struct TT_MaxProfile_ + { + FT_Fixed version; + FT_UShort numGlyphs; + FT_UShort maxPoints; + FT_UShort maxContours; + FT_UShort maxCompositePoints; + FT_UShort maxCompositeContours; + FT_UShort maxZones; + FT_UShort maxTwilightPoints; + FT_UShort maxStorage; + FT_UShort maxFunctionDefs; + FT_UShort maxInstructionDefs; + FT_UShort maxStackElements; + FT_UShort maxSizeOfInstructions; + FT_UShort maxComponentElements; + FT_UShort maxComponentDepth; + + } TT_MaxProfile; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Sfnt_Tag */ + /* */ + /* <Description> */ + /* An enumeration used to specify the index of an SFNT table. */ + /* Used in the @FT_Get_Sfnt_Table API function. */ + /* */ + typedef enum FT_Sfnt_Tag_ + { + ft_sfnt_head = 0, /* TT_Header */ + ft_sfnt_maxp = 1, /* TT_MaxProfile */ + ft_sfnt_os2 = 2, /* TT_OS2 */ + ft_sfnt_hhea = 3, /* TT_HoriHeader */ + ft_sfnt_vhea = 4, /* TT_VertHeader */ + ft_sfnt_post = 5, /* TT_Postscript */ + ft_sfnt_pclt = 6, /* TT_PCLT */ + + sfnt_max /* internal end mark */ + + } FT_Sfnt_Tag; + + /* */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Table */ + /* */ + /* <Description> */ + /* Return a pointer to a given SFNT table within a face. */ + /* */ + /* <Input> */ + /* face :: A handle to the source. */ + /* */ + /* tag :: The index of the SFNT table. */ + /* */ + /* <Return> */ + /* A type-less pointer to the table. This will be~0 in case of */ + /* error, or if the corresponding table was not found *OR* loaded */ + /* from the file. */ + /* */ + /* Use a typecast according to `tag' to access the structure */ + /* elements. */ + /* */ + /* <Note> */ + /* The table is owned by the face object and disappears with it. */ + /* */ + /* This function is only useful to access SFNT tables that are loaded */ + /* by the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for */ + /* a list. */ + /* */ + FT_EXPORT( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ); + + + /************************************************************************** + * + * @function: + * FT_Load_Sfnt_Table + * + * @description: + * Load any font table into client memory. + * + * @input: + * face :: + * A handle to the source face. + * + * tag :: + * The four-byte tag of the table to load. Use the value~0 if you want + * to access the whole font file. Otherwise, you can use one of the + * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new + * one with @FT_MAKE_TAG. + * + * offset :: + * The starting offset in the table (or file if tag == 0). + * + * @output: + * buffer :: + * The target buffer address. The client must ensure that the memory + * array is big enough to hold the data. + * + * @inout: + * length :: + * If the `length' parameter is NULL, then try to load the whole table. + * Return an error code if it fails. + * + * Else, if `*length' is~0, exit immediately while returning the + * table's (or file) full size in it. + * + * Else the number of bytes to read from the table or file, from the + * starting offset. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If you need to determine the table's length you should first call this + * function with `*length' set to~0, as in the following example: + * + * { + * FT_ULong length = 0; + * + * + * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); + * if ( error ) { ... table does not exist ... } + * + * buffer = malloc( length ); + * if ( buffer == NULL ) { ... not enough memory ... } + * + * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); + * if ( error ) { ... could not load table ... } + * } + */ + FT_EXPORT( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + /************************************************************************** + * + * @function: + * FT_Sfnt_Table_Info + * + * @description: + * Return information on an SFNT table. + * + * @input: + * face :: + * A handle to the source face. + * + * table_index :: + * The index of an SFNT table. The function returns + * FT_Err_Table_Missing for an invalid value. + * + * @output: + * tag :: + * The name tag of the SFNT table. + * + * length :: + * The length of the SFNT table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * SFNT tables with length zero are treated as missing. + * + */ + FT_EXPORT( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_CMap_Language_ID */ + /* */ + /* <Description> */ + /* Return TrueType/sfnt specific cmap language ID. Definitions of */ + /* language ID values are in `freetype/ttnameid.h'. */ + /* */ + /* <Input> */ + /* charmap :: */ + /* The target charmap. */ + /* */ + /* <Return> */ + /* The language ID of `charmap'. If `charmap' doesn't belong to a */ + /* TrueType/sfnt face, just return~0 as the default value. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_CMap_Format */ + /* */ + /* <Description> */ + /* Return TrueType/sfnt specific cmap format. */ + /* */ + /* <Input> */ + /* charmap :: */ + /* The target charmap. */ + /* */ + /* <Return> */ + /* The format of `charmap'. If `charmap' doesn't belong to a */ + /* TrueType/sfnt face, return -1. */ + /* */ + FT_EXPORT( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ); + + /* */ + + +FT_END_HEADER + +#endif /* __TTTABLES_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/tttags.h b/android/jni/ndk_modules/freetype/include/freetype/tttags.h new file mode 100644 index 00000000..307ce4b6 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/tttags.h @@ -0,0 +1,107 @@ +/***************************************************************************/ +/* */ +/* tttags.h */ +/* */ +/* Tags for TrueType and OpenType tables (specification only). */ +/* */ +/* Copyright 1996-2001, 2004, 2005, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTAGS_H__ +#define __TTAGS_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + +#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' ) +#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' ) +#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) +#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' ) +#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) +#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) +#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' ) +#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) +#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' ) +#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) +#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' ) +#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) +#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) +#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' ) +#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' ) +#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' ) +#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' ) +#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' ) +#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' ) +#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' ) +#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' ) +#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' ) +#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) +#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) +#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) +#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' ) +#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) +#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) +#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) +#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' ) +#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' ) +#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' ) +#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) +#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' ) +#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' ) +#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' ) +#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' ) +#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' ) +#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' ) +#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' ) +#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) +#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) +#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' ) +#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' ) +#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) +#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' ) +#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) +#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) +#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' ) +#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' ) +#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' ) +#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) +#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' ) +#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' ) +#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' ) +#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' ) +#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' ) +#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' ) +#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' ) +#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' ) +#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' ) +#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) +#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) +#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) + + +FT_END_HEADER + +#endif /* __TTAGS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ttunpat.h b/android/jni/ndk_modules/freetype/include/freetype/ttunpat.h new file mode 100644 index 00000000..a0162759 --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/freetype/ttunpat.h @@ -0,0 +1,59 @@ +/***************************************************************************/ +/* */ +/* ttunpat.h */ +/* */ +/* Definitions for the unpatented TrueType hinting system */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* Written by Graham Asher <graham.asher@btinternet.com> */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTUNPAT_H__ +#define __TTUNPAT_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_UNPATENTED_HINTING + * + * @description: + * A constant used as the tag of an @FT_Parameter structure to indicate + * that unpatented methods only should be used by the TrueType bytecode + * interpreter for a typeface opened by @FT_Open_Face. + * + */ +#define FT_PARAM_TAG_UNPATENTED_HINTING FT_MAKE_TAG( 'u', 'n', 'p', 'a' ) + + /* */ + +FT_END_HEADER + + +#endif /* __TTUNPAT_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/include/ft2build.h b/android/jni/ndk_modules/freetype/include/ft2build.h new file mode 100644 index 00000000..923d887d --- /dev/null +++ b/android/jni/ndk_modules/freetype/include/ft2build.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* ft2build.h */ +/* */ +/* FreeType 2 build and setup macros. */ +/* (Generic version) */ +/* */ +/* Copyright 1996-2001, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file corresponds to the default `ft2build.h' file for */ + /* FreeType 2. It uses the `freetype' include root. */ + /* */ + /* Note that specific platforms might use a different configuration. */ + /* See builds/unix/ft2unix.h for an example. */ + /* */ + /*************************************************************************/ + + +#ifndef __FT2_BUILD_GENERIC_H__ +#define __FT2_BUILD_GENERIC_H__ + +#include <freetype/config/ftheader.h> + +#endif /* __FT2_BUILD_GENERIC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afangles.c b/android/jni/ndk_modules/freetype/src/autofit/afangles.c new file mode 100644 index 00000000..e2360d15 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afangles.c @@ -0,0 +1,292 @@ +/***************************************************************************/ +/* */ +/* afangles.c */ +/* */ +/* Routines used to compute vector angles with limited accuracy */ +/* and very high speed. It also contains sorting routines (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "aftypes.h" + + +#if 0 + + FT_LOCAL_DEF( FT_Int ) + af_corner_is_flat( FT_Pos x_in, + FT_Pos y_in, + FT_Pos x_out, + FT_Pos y_out ) + { + FT_Pos ax = x_in; + FT_Pos ay = y_in; + + FT_Pos d_in, d_out, d_corner; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + d_in = ax + ay; + + ax = x_out; + if ( ax < 0 ) + ax = -ax; + ay = y_out; + if ( ay < 0 ) + ay = -ay; + d_out = ax + ay; + + ax = x_out + x_in; + if ( ax < 0 ) + ax = -ax; + ay = y_out + y_in; + if ( ay < 0 ) + ay = -ay; + d_corner = ax + ay; + + return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); + } + + + FT_LOCAL_DEF( FT_Int ) + af_corner_orientation( FT_Pos x_in, + FT_Pos y_in, + FT_Pos x_out, + FT_Pos y_out ) + { + FT_Pos delta; + + + delta = x_in * y_out - y_in * x_out; + + if ( delta == 0 ) + return 0; + else + return 1 - 2 * ( delta < 0 ); + } + +#endif + + + /* + * We are not using `af_angle_atan' anymore, but we keep the source + * code below just in case... + */ + + +#if 0 + + + /* + * The trick here is to realize that we don't need a very accurate angle + * approximation. We are going to use the result of `af_angle_atan' to + * only compare the sign of angle differences, or check whether its + * magnitude is very small. + * + * The approximation + * + * dy * PI / (|dx|+|dy|) + * + * should be enough, and much faster to compute. + */ + FT_LOCAL_DEF( AF_Angle ) + af_angle_atan( FT_Fixed dx, + FT_Fixed dy ) + { + AF_Angle angle; + FT_Fixed ax = dx; + FT_Fixed ay = dy; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + + ax += ay; + + if ( ax == 0 ) + angle = 0; + else + { + angle = ( AF_ANGLE_PI2 * dy ) / ( ax + ay ); + if ( dx < 0 ) + { + if ( angle >= 0 ) + angle = AF_ANGLE_PI - angle; + else + angle = -AF_ANGLE_PI - angle; + } + } + + return angle; + } + + +#elif 0 + + + /* the following table has been automatically generated with */ + /* the `mather.py' Python script */ + +#define AF_ATAN_BITS 8 + + static const FT_Byte af_arctan[1L << AF_ATAN_BITS] = + { + 0, 0, 1, 1, 1, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 5, + 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, + 10, 10, 11, 11, 11, 12, 12, 12, + 13, 13, 13, 14, 14, 14, 14, 15, + 15, 15, 16, 16, 16, 17, 17, 17, + 18, 18, 18, 18, 19, 19, 19, 20, + 20, 20, 21, 21, 21, 21, 22, 22, + 22, 23, 23, 23, 24, 24, 24, 24, + 25, 25, 25, 26, 26, 26, 26, 27, + 27, 27, 28, 28, 28, 28, 29, 29, + 29, 30, 30, 30, 30, 31, 31, 31, + 31, 32, 32, 32, 33, 33, 33, 33, + 34, 34, 34, 34, 35, 35, 35, 35, + 36, 36, 36, 36, 37, 37, 37, 38, + 38, 38, 38, 39, 39, 39, 39, 40, + 40, 40, 40, 41, 41, 41, 41, 42, + 42, 42, 42, 42, 43, 43, 43, 43, + 44, 44, 44, 44, 45, 45, 45, 45, + 46, 46, 46, 46, 46, 47, 47, 47, + 47, 48, 48, 48, 48, 48, 49, 49, + 49, 49, 50, 50, 50, 50, 50, 51, + 51, 51, 51, 51, 52, 52, 52, 52, + 52, 53, 53, 53, 53, 53, 54, 54, + 54, 54, 54, 55, 55, 55, 55, 55, + 56, 56, 56, 56, 56, 57, 57, 57, + 57, 57, 57, 58, 58, 58, 58, 58, + 59, 59, 59, 59, 59, 59, 60, 60, + 60, 60, 60, 61, 61, 61, 61, 61, + 61, 62, 62, 62, 62, 62, 62, 63, + 63, 63, 63, 63, 63, 64, 64, 64 + }; + + + FT_LOCAL_DEF( AF_Angle ) + af_angle_atan( FT_Fixed dx, + FT_Fixed dy ) + { + AF_Angle angle; + + + /* check trivial cases */ + if ( dy == 0 ) + { + angle = 0; + if ( dx < 0 ) + angle = AF_ANGLE_PI; + return angle; + } + else if ( dx == 0 ) + { + angle = AF_ANGLE_PI2; + if ( dy < 0 ) + angle = -AF_ANGLE_PI2; + return angle; + } + + angle = 0; + if ( dx < 0 ) + { + dx = -dx; + dy = -dy; + angle = AF_ANGLE_PI; + } + + if ( dy < 0 ) + { + FT_Pos tmp; + + + tmp = dx; + dx = -dy; + dy = tmp; + angle -= AF_ANGLE_PI2; + } + + if ( dx == 0 && dy == 0 ) + return 0; + + if ( dx == dy ) + angle += AF_ANGLE_PI4; + else if ( dx > dy ) + angle += af_arctan[FT_DivFix( dy, dx ) >> ( 16 - AF_ATAN_BITS )]; + else + angle += AF_ANGLE_PI2 - + af_arctan[FT_DivFix( dx, dy ) >> ( 16 - AF_ATAN_BITS )]; + + if ( angle > AF_ANGLE_PI ) + angle -= AF_ANGLE_2PI; + + return angle; + } + + +#endif /* 0 */ + + + FT_LOCAL_DEF( void ) + af_sort_pos( FT_UInt count, + FT_Pos* table ) + { + FT_UInt i, j; + FT_Pos swap; + + + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + if ( table[j] > table[j - 1] ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + + FT_LOCAL_DEF( void ) + af_sort_widths( FT_UInt count, + AF_Width table ) + { + FT_UInt i, j; + AF_WidthRec swap; + + + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + if ( table[j].org > table[j - 1].org ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afangles.h b/android/jni/ndk_modules/freetype/src/autofit/afangles.h new file mode 100644 index 00000000..f33f9e10 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afangles.h @@ -0,0 +1,7 @@ +/* + * afangles.h + * + * This is a dummy file, used to please the build system. It is never + * included by the auto-fitter sources. + * + */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afcjk.c b/android/jni/ndk_modules/freetype/src/autofit/afcjk.c new file mode 100644 index 00000000..f3b1067e --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afcjk.c @@ -0,0 +1,1512 @@ +/***************************************************************************/ +/* */ +/* afcjk.c */ +/* */ +/* Auto-fitter hinting routines for CJK script (body). */ +/* */ +/* Copyright 2006, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /* + * The algorithm is based on akito's autohint patch, available here: + * + * http://www.kde.gr.jp/~akito/patch/freetype2/ + * + */ + +#include "aftypes.h" +#include "aflatin.h" + + +#ifdef AF_CONFIG_OPTION_CJK + +#include "afcjk.h" +#include "aferrors.h" + + +#ifdef AF_USE_WARPER +#include "afwarp.h" +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + af_cjk_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_CharMap oldmap = face->charmap; + + + metrics->units_per_em = face->units_per_EM; + + /* TODO are there blues? */ + + if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) + face->charmap = NULL; + else + { + /* latin's version would suffice */ + af_latin_metrics_init_widths( metrics, face, 0x7530 ); + af_latin_metrics_check_digits( metrics, face ); + } + + FT_Set_Charmap( face, oldmap ); + + return AF_Err_Ok; + } + + + static void + af_cjk_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + AF_LatinAxis axis; + + + axis = &metrics->axis[dim]; + + if ( dim == AF_DIMENSION_HORZ ) + { + axis->scale = scaler->x_scale; + axis->delta = scaler->x_delta; + } + else + { + axis->scale = scaler->y_scale; + axis->delta = scaler->y_delta; + } + } + + + FT_LOCAL_DEF( void ) + af_cjk_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + metrics->root.scaler = *scaler; + + af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + af_cjk_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + FT_Error error; + AF_Segment seg; + + + error = af_latin_hints_compute_segments( hints, dim ); + if ( error ) + return error; + + /* a segment is round if it doesn't have successive */ + /* on-curve points. */ + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Point pt = seg->first; + AF_Point last = seg->last; + AF_Flags f0 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); + AF_Flags f1; + + + seg->flags &= ~AF_EDGE_ROUND; + + for ( ; pt != last; f0 = f1 ) + { + pt = pt->next; + f1 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); + + if ( !f0 && !f1 ) + break; + + if ( pt == last ) + seg->flags |= AF_EDGE_ROUND; + } + } + + return AF_Err_Ok; + } + + + static void + af_cjk_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Direction major_dir = axis->major_dir; + AF_Segment seg1, seg2; + FT_Pos len_threshold; + FT_Pos dist_threshold; + + + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + + dist_threshold = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + dist_threshold = FT_DivFix( 64 * 3, dist_threshold ); + + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + /* the fake segments are for metrics hinting only */ + if ( seg1->first == seg1->last ) + continue; + + if ( seg1->dir != major_dir ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg2 != seg1 && seg1->dir + seg2->dir == 0 ) + { + FT_Pos dist = seg2->pos - seg1->pos; + + + if ( dist < 0 ) + continue; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= len_threshold ) + { + if ( dist * 8 < seg1->score * 9 && + ( dist * 8 < seg1->score * 7 || seg1->len < len ) ) + { + seg1->score = dist; + seg1->len = len; + seg1->link = seg2; + } + + if ( dist * 8 < seg2->score * 9 && + ( dist * 8 < seg2->score * 7 || seg2->len < len ) ) + { + seg2->score = dist; + seg2->len = len; + seg2->link = seg1; + } + } + } + } + } + + /* + * now compute the `serif' segments + * + * In Hanzi, some strokes are wider on one or both of the ends. + * We either identify the stems on the ends as serifs or remove + * the linkage, depending on the length of the stems. + * + */ + + { + AF_Segment link1, link2; + + + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + link1 = seg1->link; + if ( !link1 || link1->link != seg1 || link1->pos <= seg1->pos ) + continue; + + if ( seg1->score >= dist_threshold ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + { + if ( seg2->pos > seg1->pos || seg1 == seg2 ) + continue; + + link2 = seg2->link; + if ( !link2 || link2->link != seg2 || link2->pos < link1->pos ) + continue; + + if ( seg1->pos == seg2->pos && link1->pos == link2->pos ) + continue; + + if ( seg2->score <= seg1->score || seg1->score * 4 <= seg2->score ) + continue; + + /* seg2 < seg1 < link1 < link2 */ + + if ( seg1->len >= seg2->len * 3 ) + { + AF_Segment seg; + + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Segment link = seg->link; + + + if ( link == seg2 ) + { + seg->link = 0; + seg->serif = link1; + } + else if ( link == link2 ) + { + seg->link = 0; + seg->serif = seg1; + } + } + } + else + { + seg1->link = link1->link = 0; + + break; + } + } + } + } + + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + seg2->num_linked++; + if ( seg2->link != seg1 ) + { + seg1->link = 0; + + if ( seg2->score < dist_threshold || seg1->score < seg2->score * 4 ) + seg1->serif = seg2->link; + else + seg2->num_linked--; + } + } + } + } + + + static FT_Error + af_cjk_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = AF_Err_Ok; + FT_Memory memory = hints->memory; + AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + FT_Fixed scale; + FT_Pos edge_distance_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + /*********************************************************************/ + /* */ + /* We begin by generating a sorted table of edges for the current */ + /* direction. To do so, we simply scan each segment and try to find */ + /* an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which is then processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the edges table is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = FT_DivFix( 64 / 4, scale ); + else + edge_distance_threshold = laxis->edge_distance_threshold; + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = 0; + FT_Pos best = 0xFFFFU; + FT_Int ee; + + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + if ( edge->dir != seg->dir ) + continue; + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && dist < best ) + { + AF_Segment link = seg->link; + + + /* check whether all linked segments of the candidate edge */ + /* can make a single edge. */ + if ( link ) + { + AF_Segment seg1 = edge->first; + AF_Segment link1; + FT_Pos dist2 = 0; + + + do + { + link1 = seg1->link; + if ( link1 ) + { + dist2 = AF_SEGMENT_DIST( link, link1 ); + if ( dist2 >= edge_distance_threshold ) + break; + } + + } while ( ( seg1 = seg1->edge_next ) != edge->first ); + + if ( dist2 >= edge_distance_threshold ) + continue; + } + + best = dist; + found = edge; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, + (AF_Direction)seg->dir, + memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->fpos = seg->pos; + edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); + seg->edge_next = seg; + edge->dir = seg->dir; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + /*********************************************************************/ + /* */ + /* Good, we now compute each edge's properties according to segments */ + /* found on its position. Basically, these are as follows. */ + /* */ + /* - edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /*********************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + /* */ + /* Note that removing this loop and setting the `edge' field of each */ + /* segment directly in the code above slows down execution speed for */ + /* some reasons on platforms like the Sun. */ + + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = (FT_Bool)( seg->serif && seg->serif->edge != edge ); + + if ( seg->link || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = AF_SEGMENT_DIST( seg, seg2 ); + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + + /* get rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = 0; + } + } + + Exit: + return error; + } + + + static FT_Error + af_cjk_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_cjk_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_cjk_hints_link_segments( hints, dim ); + + error = af_cjk_hints_compute_edges( hints, dim ); + } + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_cjk_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics ); + + /* + * correct x_scale and y_scale when needed, since they may have + * been modified af_cjk_scale_dim above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + +#ifdef AF_USE_WARPER + if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) + metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; +#endif + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels only if we don't use the `light' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + scaler_flags |= AF_SCALER_FLAG_NO_ADVANCE; + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* snap a given width in scaled coordinates to one of the */ + /* current standard widths */ + + static FT_Pos + af_cjk_snap_width( AF_Width widths, + FT_Int count, + FT_Pos width ) + { + int n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* compute the snapped width of a given stem */ + + static FT_Pos + af_cjk_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + AF_Edge_Flags base_flags, + AF_Edge_Flags stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; + AF_LatinAxis axis = & metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); + + FT_UNUSED( base_flags ); + FT_UNUSED( stem_flags ); + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + if ( axis->width_count > 0 ) + { + if ( FT_ABS( dist - axis->widths[0].cur ) < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 54 ) + dist += ( 54 - dist ) / 2 ; + else if ( dist < 3 * 64 ) + { + FT_Pos delta; + + + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + else if ( delta < 22 ) + dist += 10; + else if ( delta < 42 ) + dist += delta; + else if ( delta < 54 ) + dist += 54; + else + dist += delta; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + + dist = af_cjk_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + dist = ( dist + 22 ) & ~63; + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* align one stem edge relative to the previous stem edge */ + + static void + af_cjk_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_cjk_compute_stem_width( + hints, dim, dist, + (AF_Edge_Flags)base_edge->flags, + (AF_Edge_Flags)stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + } + + + static void + af_cjk_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + ( serif->opos - base->opos ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define AF_LIGHT_MODE_MAX_HORZ_GAP 9 +#define AF_LIGHT_MODE_MAX_VERT_GAP 15 +#define AF_LIGHT_MODE_MAX_DELTA_ABS 14 + + + static FT_Pos + af_hint_normal_stem( AF_GlyphHints hints, + AF_Edge edge, + AF_Edge edge2, + FT_Pos anchor, + AF_Dimension dim ) + { + FT_Pos org_len, cur_len, org_center; + FT_Pos cur_pos1, cur_pos2; + FT_Pos d_off1, u_off1, d_off2, u_off2, delta; + FT_Pos offset; + FT_Pos threshold = 64; + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + { + if ( ( edge->flags & AF_EDGE_ROUND ) && + ( edge2->flags & AF_EDGE_ROUND ) ) + { + if ( dim == AF_DIMENSION_VERT ) + threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP; + else + threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP; + } + else + { + if ( dim == AF_DIMENSION_VERT ) + threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP / 3; + else + threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP / 3; + } + } + + org_len = edge2->opos - edge->opos; + cur_len = af_cjk_compute_stem_width( hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + + org_center = ( edge->opos + edge2->opos ) / 2 + anchor; + cur_pos1 = org_center - cur_len / 2; + cur_pos2 = cur_pos1 + cur_len; + d_off1 = cur_pos1 - FT_PIX_FLOOR( cur_pos1 ); + d_off2 = cur_pos2 - FT_PIX_FLOOR( cur_pos2 ); + u_off1 = 64 - d_off1; + u_off2 = 64 - d_off2; + delta = 0; + + + if ( d_off1 == 0 || d_off2 == 0 ) + goto Exit; + + if ( cur_len <= threshold ) + { + if ( d_off2 < cur_len ) + { + if ( u_off1 <= d_off2 ) + delta = u_off1; + else + delta = -d_off2; + } + + goto Exit; + } + + if ( threshold < 64 ) + { + if ( d_off1 >= threshold || u_off1 >= threshold || + d_off2 >= threshold || u_off2 >= threshold ) + goto Exit; + } + + offset = cur_len % 64; + + if ( offset < 32 ) + { + if ( u_off1 <= offset || d_off2 <= offset ) + goto Exit; + } + else + offset = 64 - threshold; + + d_off1 = threshold - u_off1; + u_off1 = u_off1 - offset; + u_off2 = threshold - d_off2; + d_off2 = d_off2 - offset; + + if ( d_off1 <= u_off1 ) + u_off1 = -d_off1; + + if ( d_off2 <= u_off2 ) + u_off2 = -d_off2; + + if ( FT_ABS( u_off1 ) <= FT_ABS( u_off2 ) ) + delta = u_off1; + else + delta = u_off2; + + Exit: + +#if 1 + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + { + if ( delta > AF_LIGHT_MODE_MAX_DELTA_ABS ) + delta = AF_LIGHT_MODE_MAX_DELTA_ABS; + else if ( delta < -AF_LIGHT_MODE_MAX_DELTA_ABS ) + delta = -AF_LIGHT_MODE_MAX_DELTA_ABS; + } +#endif + + cur_pos1 += delta; + + if ( edge->opos < edge2->opos ) + { + edge->pos = cur_pos1; + edge2->pos = cur_pos1 + cur_len; + } + else + { + edge->pos = cur_pos1 + cur_len; + edge2->pos = cur_pos1; + } + + return delta; + } + + + static void + af_cjk_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + FT_PtrDist n_edges; + AF_Edge edge; + AF_Edge anchor = 0; + FT_Pos delta = 0; + FT_Int skipped = 0; + + + /* now we align all stem edges. */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + skipped++; + continue; + } + + /* now align the stem */ + + if ( edge2 < edge ) + { + af_cjk_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + continue; + } + + if ( dim != AF_DIMENSION_VERT && !anchor ) + { + +#if 0 + if ( fixedpitch ) + { + AF_Edge left = edge; + AF_Edge right = edge_limit - 1; + AF_EdgeRec left1, left2, right1, right2; + FT_Pos target, center1, center2; + FT_Pos delta1, delta2, d1, d2; + + + while ( right > left && !right->link ) + right--; + + left1 = *left; + left2 = *left->link; + right1 = *right->link; + right2 = *right; + + delta = ( ( ( hinter->pp2.x + 32 ) & -64 ) - hinter->pp2.x ) / 2; + target = left->opos + ( right->opos - left->opos ) / 2 + delta - 16; + + delta1 = delta; + delta1 += af_hint_normal_stem( hints, left, left->link, + delta1, 0 ); + + if ( left->link != right ) + af_hint_normal_stem( hints, right->link, right, delta1, 0 ); + + center1 = left->pos + ( right->pos - left->pos ) / 2; + + if ( center1 >= target ) + delta2 = delta - 32; + else + delta2 = delta + 32; + + delta2 += af_hint_normal_stem( hints, &left1, &left2, delta2, 0 ); + + if ( delta1 != delta2 ) + { + if ( left->link != right ) + af_hint_normal_stem( hints, &right1, &right2, delta2, 0 ); + + center2 = left1.pos + ( right2.pos - left1.pos ) / 2; + + d1 = center1 - target; + d2 = center2 - target; + + if ( FT_ABS( d2 ) < FT_ABS( d1 ) ) + { + left->pos = left1.pos; + left->link->pos = left2.pos; + + if ( left->link != right ) + { + right->link->pos = right1.pos; + right->pos = right2.pos; + } + + delta1 = delta2; + } + } + + delta = delta1; + right->link->flags |= AF_EDGE_DONE; + right->flags |= AF_EDGE_DONE; + } + else + +#endif /* 0 */ + + delta = af_hint_normal_stem( hints, edge, edge2, 0, + AF_DIMENSION_HORZ ); + } + else + af_hint_normal_stem( hints, edge, edge2, delta, dim ); + +#if 0 + printf( "stem (%d,%d) adjusted (%.1f,%.1f)\n", + edge - edges, edge2 - edges, + ( edge->pos - edge->opos ) / 64.0, + ( edge2->pos - edge2->opos ) / 64.0 ); +#endif + + anchor = edge; + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( edge1->link == edge1 + 1 && + edge2->link == edge2 + 1 && + edge3->link == edge3 + 1 && span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + + if ( !skipped ) + return; + + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + if ( edge->flags & AF_EDGE_DONE ) + continue; + + if ( edge->serif ) + { + af_cjk_align_serif_edge( hints, edge->serif, edge ); + edge->flags |= AF_EDGE_DONE; + skipped--; + } + } + + if ( !skipped ) + return; + + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge before, after; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + before = after = edge; + + while ( --before >= edges ) + if ( before->flags & AF_EDGE_DONE ) + break; + + while ( ++after < edge_limit ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges || after < edge_limit ) + { + if ( before < edges ) + af_cjk_align_serif_edge( hints, after, edge ); + else if ( after >= edge_limit ) + af_cjk_align_serif_edge( hints, before, edge ); + else + { + if ( after->fpos == before->fpos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->fpos - before->fpos, + after->pos - before->pos, + after->fpos - before->fpos ); + } + } + } + } + + + static void + af_cjk_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = & hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + FT_Bool snapping; + + + snapping = FT_BOOL( ( dim == AF_DIMENSION_HORZ && + AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) || + ( dim == AF_DIMENSION_VERT && + AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ); + + for ( edge = edges; edge < edge_limit; edge++ ) + { + /* move the points of each segment */ + /* in each edge to the edge's position */ + AF_Segment seg = edge->first; + + + if ( snapping ) + { + do + { + AF_Point point = seg->first; + + + for (;;) + { + if ( dim == AF_DIMENSION_HORZ ) + { + point->x = edge->pos; + point->flags |= AF_FLAG_TOUCH_X; + } + else + { + point->y = edge->pos; + point->flags |= AF_FLAG_TOUCH_Y; + } + + if ( point == seg->last ) + break; + + point = point->next; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + else + { + FT_Pos delta = edge->pos - edge->opos; + + + do + { + AF_Point point = seg->first; + + + for (;;) + { + if ( dim == AF_DIMENSION_HORZ ) + { + point->x += delta; + point->flags |= AF_FLAG_TOUCH_X; + } + else + { + point->y += delta; + point->flags |= AF_FLAG_TOUCH_Y; + } + + if ( point == seg->last ) + break; + + point = point->next; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_cjk_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ) + { + FT_Error error; + int dim; + + FT_UNUSED( metrics ); + + + error = af_glyph_hints_reload( hints, outline ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) + { + error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + error = af_cjk_hints_detect_features( hints, AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + +#ifdef AF_USE_WARPER + if ( dim == AF_DIMENSION_HORZ && + metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL ) + { + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + + + af_warper_compute( &warper, hints, dim, &scale, &delta ); + af_glyph_hints_scale_dim( hints, dim, scale, delta ); + continue; + } +#endif /* AF_USE_WARPER */ + + af_cjk_hint_edges( hints, (AF_Dimension)dim ); + af_cjk_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + +#if 0 + af_glyph_hints_dump_points( hints ); + af_glyph_hints_dump_segments( hints ); + af_glyph_hints_dump_edges( hints ); +#endif + + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static const AF_Script_UniRangeRec af_cjk_uniranges[] = + { +#if 0 + AF_UNIRANGE_REC( 0x0100UL, 0xFFFFUL ), /* why this? */ +#endif + AF_UNIRANGE_REC( 0x2E80UL, 0x2EFFUL ), /* CJK Radicals Supplement */ + AF_UNIRANGE_REC( 0x2F00UL, 0x2FDFUL ), /* Kangxi Radicals */ + AF_UNIRANGE_REC( 0x3000UL, 0x303FUL ), /* CJK Symbols and Punctuation */ + AF_UNIRANGE_REC( 0x3040UL, 0x309FUL ), /* Hiragana */ + AF_UNIRANGE_REC( 0x30A0UL, 0x30FFUL ), /* Katakana */ + AF_UNIRANGE_REC( 0x3100UL, 0x312FUL ), /* Bopomofo */ + AF_UNIRANGE_REC( 0x3130UL, 0x318FUL ), /* Hangul Compatibility Jamo */ + AF_UNIRANGE_REC( 0x31A0UL, 0x31BFUL ), /* Bopomofo Extended */ + AF_UNIRANGE_REC( 0x31C0UL, 0x31EFUL ), /* CJK Strokes */ + AF_UNIRANGE_REC( 0x31F0UL, 0x31FFUL ), /* Katakana Phonetic Extensions */ + AF_UNIRANGE_REC( 0x3200UL, 0x32FFUL ), /* Enclosed CJK Letters and Months */ + AF_UNIRANGE_REC( 0x3300UL, 0x33FFUL ), /* CJK Compatibility */ + AF_UNIRANGE_REC( 0x3400UL, 0x4DBFUL ), /* CJK Unified Ideographs Extension A */ + AF_UNIRANGE_REC( 0x4DC0UL, 0x4DFFUL ), /* Yijing Hexagram Symbols */ + AF_UNIRANGE_REC( 0x4E00UL, 0x9FFFUL ), /* CJK Unified Ideographs */ + AF_UNIRANGE_REC( 0xF900UL, 0xFAFFUL ), /* CJK Compatibility Ideographs */ + AF_UNIRANGE_REC( 0xFE30UL, 0xFE4FUL ), /* CJK Compatibility Forms */ + AF_UNIRANGE_REC( 0xFF00UL, 0xFFEFUL ), /* Halfwidth and Fullwidth Forms */ + AF_UNIRANGE_REC( 0x20000UL, 0x2A6DFUL ), /* CJK Unified Ideographs Extension B */ + AF_UNIRANGE_REC( 0x2F800UL, 0x2FA1FUL ), /* CJK Compatibility Ideographs Supplement */ + AF_UNIRANGE_REC( 0UL, 0UL ) + }; + + + AF_DEFINE_SCRIPT_CLASS(af_cjk_script_class, + AF_SCRIPT_CJK, + af_cjk_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_cjk_metrics_init, + (AF_Script_ScaleMetricsFunc)af_cjk_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_cjk_hints_init, + (AF_Script_ApplyHintsFunc) af_cjk_hints_apply + ) + +#else /* !AF_CONFIG_OPTION_CJK */ + + static const AF_Script_UniRangeRec af_cjk_uniranges[] = + { + AF_UNIRANGE_REC( 0UL, 0UL ) + }; + + + AF_DEFINE_SCRIPT_CLASS(af_cjk_script_class, + AF_SCRIPT_CJK, + af_cjk_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) NULL, + (AF_Script_ScaleMetricsFunc)NULL, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) NULL, + (AF_Script_ApplyHintsFunc) NULL + ) + +#endif /* !AF_CONFIG_OPTION_CJK */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afcjk.h b/android/jni/ndk_modules/freetype/src/autofit/afcjk.h new file mode 100644 index 00000000..0b20d4ae --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afcjk.h @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* afcjk.h */ +/* */ +/* Auto-fitter hinting routines for CJK script (specification). */ +/* */ +/* Copyright 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFCJK_H__ +#define __AFCJK_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the CJK-specific script class */ + + AF_DECLARE_SCRIPT_CLASS(af_cjk_script_class) + + + FT_LOCAL( FT_Error ) + af_cjk_metrics_init( AF_LatinMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_cjk_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ); + + FT_LOCAL( FT_Error ) + af_cjk_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ); + + FT_LOCAL( FT_Error ) + af_cjk_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ); + +/* */ + +FT_END_HEADER + +#endif /* __AFCJK_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afdummy.c b/android/jni/ndk_modules/freetype/src/autofit/afdummy.c new file mode 100644 index 00000000..42b2fcb2 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afdummy.c @@ -0,0 +1,60 @@ +/***************************************************************************/ +/* */ +/* afdummy.c */ +/* */ +/* Auto-fitter dummy routines to be used if no hinting should be */ +/* performed (body). */ +/* */ +/* Copyright 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afdummy.h" +#include "afhints.h" + + + static FT_Error + af_dummy_hints_init( AF_GlyphHints hints, + AF_ScriptMetrics metrics ) + { + af_glyph_hints_rescale( hints, + metrics ); + return 0; + } + + + static FT_Error + af_dummy_hints_apply( AF_GlyphHints hints, + FT_Outline* outline ) + { + FT_UNUSED( hints ); + FT_UNUSED( outline ); + + return 0; + } + + + AF_DEFINE_SCRIPT_CLASS(af_dummy_script_class, + AF_SCRIPT_NONE, + NULL, + + sizeof( AF_ScriptMetricsRec ), + + (AF_Script_InitMetricsFunc) NULL, + (AF_Script_ScaleMetricsFunc)NULL, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_dummy_hints_init, + (AF_Script_ApplyHintsFunc) af_dummy_hints_apply + ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afdummy.h b/android/jni/ndk_modules/freetype/src/autofit/afdummy.h new file mode 100644 index 00000000..b69ef437 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afdummy.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* afdummy.h */ +/* */ +/* Auto-fitter dummy routines to be used if no hinting should be */ +/* performed (specification). */ +/* */ +/* Copyright 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFDUMMY_H__ +#define __AFDUMMY_H__ + +#include "aftypes.h" + + +FT_BEGIN_HEADER + + /* A dummy script metrics class used when no hinting should + * be performed. This is the default for non-latin glyphs! + */ + + AF_DECLARE_SCRIPT_CLASS(af_dummy_script_class) + +/* */ + +FT_END_HEADER + + +#endif /* __AFDUMMY_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/aferrors.h b/android/jni/ndk_modules/freetype/src/autofit/aferrors.h new file mode 100644 index 00000000..c2ed5fe2 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/aferrors.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* aferrors.h */ +/* */ +/* Autofitter error codes (specification only). */ +/* */ +/* Copyright 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the Autofitter error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __AFERRORS_H__ +#define __AFERRORS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX AF_Err_ +#define FT_ERR_BASE FT_Mod_Err_Autofit + +#include FT_ERRORS_H + +#endif /* __AFERRORS_H__ */ + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afglobal.c b/android/jni/ndk_modules/freetype/src/autofit/afglobal.c new file mode 100644 index 00000000..178c884c --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afglobal.c @@ -0,0 +1,323 @@ +/***************************************************************************/ +/* */ +/* afglobal.c */ +/* */ +/* Auto-fitter routines to compute global hinting values (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afglobal.h" +#include "afdummy.h" +#include "aflatin.h" +#include "afcjk.h" +#include "afindic.h" +#include "afpic.h" + +#include "aferrors.h" + +#ifdef FT_OPTION_AUTOFIT2 +#include "aflatin2.h" +#endif + +#ifndef FT_CONFIG_OPTION_PIC + +/* when updating this table, don't forget to update + AF_SCRIPT_CLASSES_COUNT and autofit_module_class_pic_init */ + + /* populate this list when you add new scripts */ + static AF_ScriptClass const af_script_classes[] = + { + &af_dummy_script_class, +#ifdef FT_OPTION_AUTOFIT2 + &af_latin2_script_class, +#endif + &af_latin_script_class, + &af_cjk_script_class, + &af_indic_script_class, + NULL /* do not remove */ + }; + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* index of default script in `af_script_classes' */ +#define AF_SCRIPT_LIST_DEFAULT 2 + /* a bit mask indicating an uncovered glyph */ +#define AF_SCRIPT_LIST_NONE 0x7F + /* if this flag is set, we have an ASCII digit */ +#define AF_DIGIT 0x80 + + + /* + * Note that glyph_scripts[] is used to map each glyph into + * an index into the `af_script_classes' array. + * + */ + typedef struct AF_FaceGlobalsRec_ + { + FT_Face face; + FT_Long glyph_count; /* same as face->num_glyphs */ + FT_Byte* glyph_scripts; + + AF_ScriptMetrics metrics[AF_SCRIPT_MAX]; + + } AF_FaceGlobalsRec; + + + /* Compute the script index of each glyph within a given face. */ + + static FT_Error + af_face_globals_compute_script_coverage( AF_FaceGlobals globals ) + { + FT_Error error = AF_Err_Ok; + FT_Face face = globals->face; + FT_CharMap old_charmap = face->charmap; + FT_Byte* gscripts = globals->glyph_scripts; + FT_UInt ss, i; + + + /* the value 255 means `uncovered glyph' */ + FT_MEM_SET( globals->glyph_scripts, + AF_SCRIPT_LIST_NONE, + globals->glyph_count ); + + error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); + if ( error ) + { + /* + * Ignore this error; we simply use the default script. + * XXX: Shouldn't we rather disable hinting? + */ + error = AF_Err_Ok; + goto Exit; + } + + /* scan each script in a Unicode charmap */ + for ( ss = 0; AF_SCRIPT_CLASSES_GET[ss]; ss++ ) + { + AF_ScriptClass clazz = AF_SCRIPT_CLASSES_GET[ss]; + AF_Script_UniRange range; + + + if ( clazz->script_uni_ranges == NULL ) + continue; + + /* + * Scan all unicode points in the range and set the corresponding + * glyph script index. + */ + for ( range = clazz->script_uni_ranges; range->first != 0; range++ ) + { + FT_ULong charcode = range->first; + FT_UInt gindex; + + + gindex = FT_Get_Char_Index( face, charcode ); + + if ( gindex != 0 && + gindex < (FT_ULong)globals->glyph_count && + gscripts[gindex] == AF_SCRIPT_LIST_NONE ) + { + gscripts[gindex] = (FT_Byte)ss; + } + + for (;;) + { + charcode = FT_Get_Next_Char( face, charcode, &gindex ); + + if ( gindex == 0 || charcode > range->last ) + break; + + if ( gindex < (FT_ULong)globals->glyph_count && + gscripts[gindex] == AF_SCRIPT_LIST_NONE ) + { + gscripts[gindex] = (FT_Byte)ss; + } + } + } + } + + /* mark ASCII digits */ + for ( i = 0x30; i <= 0x39; i++ ) + { + FT_UInt gindex = FT_Get_Char_Index( face, i ); + + + if ( gindex != 0 && gindex < (FT_ULong)globals->glyph_count ) + gscripts[gindex] |= AF_DIGIT; + } + + Exit: + /* + * By default, all uncovered glyphs are set to the latin script. + * XXX: Shouldn't we disable hinting or do something similar? + */ + { + FT_Long nn; + + + for ( nn = 0; nn < globals->glyph_count; nn++ ) + { + if ( ( gscripts[nn] & ~AF_DIGIT ) == AF_SCRIPT_LIST_NONE ) + { + gscripts[nn] &= ~AF_SCRIPT_LIST_NONE; + gscripts[nn] |= AF_SCRIPT_LIST_DEFAULT; + } + } + } + + FT_Set_Charmap( face, old_charmap ); + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals ) + { + FT_Error error; + FT_Memory memory; + AF_FaceGlobals globals = NULL; + + + memory = face->memory; + + if ( !FT_ALLOC( globals, sizeof ( *globals ) + + face->num_glyphs * sizeof ( FT_Byte ) ) ) + { + globals->face = face; + globals->glyph_count = face->num_glyphs; + globals->glyph_scripts = (FT_Byte*)( globals + 1 ); + + error = af_face_globals_compute_script_coverage( globals ); + if ( error ) + { + af_face_globals_free( globals ); + globals = NULL; + } + } + + *aglobals = globals; + return error; + } + + + FT_LOCAL_DEF( void ) + af_face_globals_free( AF_FaceGlobals globals ) + { + if ( globals ) + { + FT_Memory memory = globals->face->memory; + FT_UInt nn; + + + for ( nn = 0; nn < AF_SCRIPT_MAX; nn++ ) + { + if ( globals->metrics[nn] ) + { + AF_ScriptClass clazz = AF_SCRIPT_CLASSES_GET[nn]; + + + FT_ASSERT( globals->metrics[nn]->clazz == clazz ); + + if ( clazz->script_metrics_done ) + clazz->script_metrics_done( globals->metrics[nn] ); + + FT_FREE( globals->metrics[nn] ); + } + } + + globals->glyph_count = 0; + globals->glyph_scripts = NULL; /* no need to free this one! */ + globals->face = NULL; + + FT_FREE( globals ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + FT_UInt options, + AF_ScriptMetrics *ametrics ) + { + AF_ScriptMetrics metrics = NULL; + FT_UInt gidx; + AF_ScriptClass clazz; + FT_UInt script = options & 15; + const FT_Offset script_max = sizeof ( AF_SCRIPT_CLASSES_GET ) / + sizeof ( AF_SCRIPT_CLASSES_GET[0] ); + FT_Error error = AF_Err_Ok; + + + if ( gindex >= (FT_ULong)globals->glyph_count ) + { + error = AF_Err_Invalid_Argument; + goto Exit; + } + + gidx = script; + if ( gidx == 0 || gidx + 1 >= script_max ) + gidx = globals->glyph_scripts[gindex] & AF_SCRIPT_LIST_NONE; + + clazz = AF_SCRIPT_CLASSES_GET[gidx]; + if ( script == 0 ) + script = clazz->script; + + metrics = globals->metrics[clazz->script]; + if ( metrics == NULL ) + { + /* create the global metrics object when needed */ + FT_Memory memory = globals->face->memory; + + + if ( FT_ALLOC( metrics, clazz->script_metrics_size ) ) + goto Exit; + + metrics->clazz = clazz; + + if ( clazz->script_metrics_init ) + { + error = clazz->script_metrics_init( metrics, globals->face ); + if ( error ) + { + if ( clazz->script_metrics_done ) + clazz->script_metrics_done( metrics ); + + FT_FREE( metrics ); + goto Exit; + } + } + + globals->metrics[clazz->script] = metrics; + } + + Exit: + *ametrics = metrics; + + return error; + } + + + FT_LOCAL_DEF( FT_Bool ) + af_face_globals_is_digit( AF_FaceGlobals globals, + FT_UInt gindex ) + { + if ( gindex < (FT_ULong)globals->glyph_count ) + return (FT_Bool)( globals->glyph_scripts[gindex] & AF_DIGIT ); + + return (FT_Bool)0; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afglobal.h b/android/jni/ndk_modules/freetype/src/autofit/afglobal.h new file mode 100644 index 00000000..2a68e196 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afglobal.h @@ -0,0 +1,71 @@ +/***************************************************************************/ +/* */ +/* afglobal.h */ +/* */ +/* Auto-fitter routines to compute global hinting values */ +/* (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AF_GLOBAL_H__ +#define __AF_GLOBAL_H__ + + +#include "aftypes.h" + + +FT_BEGIN_HEADER + + + /************************************************************************/ + /************************************************************************/ + /***** *****/ + /***** F A C E G L O B A L S *****/ + /***** *****/ + /************************************************************************/ + /************************************************************************/ + + + /* + * model the global hints data for a given face, decomposed into + * script-specific items + */ + typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals; + + + FT_LOCAL( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals ); + + FT_LOCAL( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + FT_UInt options, + AF_ScriptMetrics *ametrics ); + + FT_LOCAL( void ) + af_face_globals_free( AF_FaceGlobals globals ); + + FT_LOCAL_DEF( FT_Bool ) + af_face_globals_is_digit( AF_FaceGlobals globals, + FT_UInt gindex ); + + /* */ + + +FT_END_HEADER + +#endif /* __AF_GLOBALS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afhints.c b/android/jni/ndk_modules/freetype/src/autofit/afhints.c new file mode 100644 index 00000000..c3497091 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afhints.c @@ -0,0 +1,1142 @@ +/***************************************************************************/ +/* */ +/* afhints.c */ +/* */ +/* Auto-fitter hinting routines (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afhints.h" +#include "aferrors.h" +#include FT_INTERNAL_CALC_H + + + FT_LOCAL_DEF( FT_Error ) + af_axis_hints_new_segment( AF_AxisHints axis, + FT_Memory memory, + AF_Segment *asegment ) + { + FT_Error error = AF_Err_Ok; + AF_Segment segment = NULL; + + + if ( axis->num_segments >= axis->max_segments ) + { + FT_Int old_max = axis->max_segments; + FT_Int new_max = old_max; + FT_Int big_max = (FT_Int)( FT_INT_MAX / sizeof ( *segment ) ); + + + if ( old_max >= big_max ) + { + error = AF_Err_Out_Of_Memory; + goto Exit; + } + + new_max += ( new_max >> 2 ) + 4; + if ( new_max < old_max || new_max > big_max ) + new_max = big_max; + + if ( FT_RENEW_ARRAY( axis->segments, old_max, new_max ) ) + goto Exit; + + axis->max_segments = new_max; + } + + segment = axis->segments + axis->num_segments++; + + Exit: + *asegment = segment; + return error; + } + + + FT_LOCAL( FT_Error ) + af_axis_hints_new_edge( AF_AxisHints axis, + FT_Int fpos, + AF_Direction dir, + FT_Memory memory, + AF_Edge *aedge ) + { + FT_Error error = AF_Err_Ok; + AF_Edge edge = NULL; + AF_Edge edges; + + + if ( axis->num_edges >= axis->max_edges ) + { + FT_Int old_max = axis->max_edges; + FT_Int new_max = old_max; + FT_Int big_max = (FT_Int)( FT_INT_MAX / sizeof ( *edge ) ); + + + if ( old_max >= big_max ) + { + error = AF_Err_Out_Of_Memory; + goto Exit; + } + + new_max += ( new_max >> 2 ) + 4; + if ( new_max < old_max || new_max > big_max ) + new_max = big_max; + + if ( FT_RENEW_ARRAY( axis->edges, old_max, new_max ) ) + goto Exit; + + axis->max_edges = new_max; + } + + edges = axis->edges; + edge = edges + axis->num_edges; + + while ( edge > edges ) + { + if ( edge[-1].fpos < fpos ) + break; + + /* we want the edge with same position and minor direction */ + /* to appear before those in the major one in the list */ + if ( edge[-1].fpos == fpos && dir == axis->major_dir ) + break; + + edge[0] = edge[-1]; + edge--; + } + + axis->num_edges++; + + FT_ZERO( edge ); + edge->fpos = (FT_Short)fpos; + edge->dir = (FT_Char)dir; + + Exit: + *aedge = edge; + return error; + } + + +#ifdef AF_DEBUG + +#include FT_CONFIG_STANDARD_LIBRARY_H + + static const char* + af_dir_str( AF_Direction dir ) + { + const char* result; + + + switch ( dir ) + { + case AF_DIR_UP: + result = "up"; + break; + case AF_DIR_DOWN: + result = "down"; + break; + case AF_DIR_LEFT: + result = "left"; + break; + case AF_DIR_RIGHT: + result = "right"; + break; + default: + result = "none"; + } + + return result; + } + + +#define AF_INDEX_NUM( ptr, base ) ( (ptr) ? ( (ptr) - (base) ) : -1 ) + + + void + af_glyph_hints_dump_points( AF_GlyphHints hints ) + { + AF_Point points = hints->points; + AF_Point limit = points + hints->num_points; + AF_Point point; + + + printf( "Table of points:\n" ); + printf( " [ index | xorg | yorg | xscale | yscale " + "| xfit | yfit | flags ]\n" ); + + for ( point = points; point < limit; point++ ) + { + printf( " [ %5d | %5d | %5d | %-5.2f | %-5.2f " + "| %-5.2f | %-5.2f | %c%c%c%c%c%c ]\n", + point - points, + point->fx, + point->fy, + point->ox/64.0, + point->oy/64.0, + point->x/64.0, + point->y/64.0, + ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ? 'w' : ' ', + ( point->flags & AF_FLAG_INFLECTION ) ? 'i' : ' ', + ( point->flags & AF_FLAG_EXTREMA_X ) ? '<' : ' ', + ( point->flags & AF_FLAG_EXTREMA_Y ) ? 'v' : ' ', + ( point->flags & AF_FLAG_ROUND_X ) ? '(' : ' ', + ( point->flags & AF_FLAG_ROUND_Y ) ? 'u' : ' '); + } + printf( "\n" ); + } + + + static const char* + af_edge_flags_to_string( AF_Edge_Flags flags ) + { + static char temp[32]; + int pos = 0; + + + if ( flags & AF_EDGE_ROUND ) + { + ft_memcpy( temp + pos, "round", 5 ); + pos += 5; + } + if ( flags & AF_EDGE_SERIF ) + { + if ( pos > 0 ) + temp[pos++] = ' '; + ft_memcpy( temp + pos, "serif", 5 ); + pos += 5; + } + if ( pos == 0 ) + return "normal"; + + temp[pos] = 0; + + return temp; + } + + + /* A function to dump the array of linked segments. */ + void + af_glyph_hints_dump_segments( AF_GlyphHints hints ) + { + FT_Int dimension; + + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Segment segments = axis->segments; + AF_Segment limit = segments + axis->num_segments; + AF_Segment seg; + + + printf ( "Table of %s segments:\n", + dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ); + printf ( " [ index | pos | dir | link | serif |" + " height | extra | flags ]\n" ); + + for ( seg = segments; seg < limit; seg++ ) + { + printf ( " [ %5d | %5.2g | %5s | %4d | %5d | %5d | %5d | %s ]\n", + seg - segments, + dimension == AF_DIMENSION_HORZ ? (int)seg->first->ox / 64.0 + : (int)seg->first->oy / 64.0, + af_dir_str( (AF_Direction)seg->dir ), + AF_INDEX_NUM( seg->link, segments ), + AF_INDEX_NUM( seg->serif, segments ), + seg->height, + seg->height - ( seg->max_coord - seg->min_coord ), + af_edge_flags_to_string( seg->flags ) ); + } + printf( "\n" ); + } + } + + + void + af_glyph_hints_dump_edges( AF_GlyphHints hints ) + { + FT_Int dimension; + + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Edge edges = axis->edges; + AF_Edge limit = edges + axis->num_edges; + AF_Edge edge; + + + /* + * note: AF_DIMENSION_HORZ corresponds to _vertical_ edges + * since they have constant a X coordinate. + */ + printf ( "Table of %s edges:\n", + dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ); + printf ( " [ index | pos | dir | link |" + " serif | blue | opos | pos | flags ]\n" ); + + for ( edge = edges; edge < limit; edge++ ) + { + printf ( " [ %5d | %5.2g | %5s | %4d |" + " %5d | %c | %5.2f | %5.2f | %s ]\n", + edge - edges, + (int)edge->opos / 64.0, + af_dir_str( (AF_Direction)edge->dir ), + AF_INDEX_NUM( edge->link, edges ), + AF_INDEX_NUM( edge->serif, edges ), + edge->blue_edge ? 'y' : 'n', + edge->opos / 64.0, + edge->pos / 64.0, + af_edge_flags_to_string( edge->flags ) ); + } + printf( "\n" ); + } + } + +#else /* !AF_DEBUG */ + + /* these empty stubs are only used to link the `ftgrid' test program */ + /* when debugging is disabled */ + + void + af_glyph_hints_dump_points( AF_GlyphHints hints ) + { + FT_UNUSED( hints ); + } + + + void + af_glyph_hints_dump_segments( AF_GlyphHints hints ) + { + FT_UNUSED( hints ); + } + + + void + af_glyph_hints_dump_edges( AF_GlyphHints hints ) + { + FT_UNUSED( hints ); + } + +#endif /* !AF_DEBUG */ + + + /* compute the direction value of a given vector */ + FT_LOCAL_DEF( AF_Direction ) + af_direction_compute( FT_Pos dx, + FT_Pos dy ) + { + FT_Pos ll, ss; /* long and short arm lengths */ + AF_Direction dir; /* candidate direction */ + + + if ( dy >= dx ) + { + if ( dy >= -dx ) + { + dir = AF_DIR_UP; + ll = dy; + ss = dx; + } + else + { + dir = AF_DIR_LEFT; + ll = -dx; + ss = dy; + } + } + else /* dy < dx */ + { + if ( dy >= -dx ) + { + dir = AF_DIR_RIGHT; + ll = dx; + ss = dy; + } + else + { + dir = AF_DIR_DOWN; + ll = dy; + ss = dx; + } + } + + ss *= 14; + if ( FT_ABS( ll ) <= FT_ABS( ss ) ) + dir = AF_DIR_NONE; + + return dir; + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_init( AF_GlyphHints hints, + FT_Memory memory ) + { + FT_ZERO( hints ); + hints->memory = memory; + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_done( AF_GlyphHints hints ) + { + if ( hints && hints->memory ) + { + FT_Memory memory = hints->memory; + int dim; + + + /* + * note that we don't need to free the segment and edge + * buffers, since they are really within the hints->points array + */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_AxisHints axis = &hints->axis[dim]; + + + axis->num_segments = 0; + axis->max_segments = 0; + FT_FREE( axis->segments ); + + axis->num_edges = 0; + axis->max_edges = 0; + FT_FREE( axis->edges ); + } + + FT_FREE( hints->contours ); + hints->max_contours = 0; + hints->num_contours = 0; + + FT_FREE( hints->points ); + hints->num_points = 0; + hints->max_points = 0; + + hints->memory = NULL; + } + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_rescale( AF_GlyphHints hints, + AF_ScriptMetrics metrics ) + { + hints->metrics = metrics; + hints->scaler_flags = metrics->scaler.flags; + } + + + FT_LOCAL_DEF( FT_Error ) + af_glyph_hints_reload( AF_GlyphHints hints, + FT_Outline* outline ) + { + FT_Error error = AF_Err_Ok; + AF_Point points; + FT_UInt old_max, new_max; + FT_Fixed x_scale = hints->x_scale; + FT_Fixed y_scale = hints->y_scale; + FT_Pos x_delta = hints->x_delta; + FT_Pos y_delta = hints->y_delta; + FT_Memory memory = hints->memory; + + + hints->num_points = 0; + hints->num_contours = 0; + + hints->axis[0].num_segments = 0; + hints->axis[0].num_edges = 0; + hints->axis[1].num_segments = 0; + hints->axis[1].num_edges = 0; + + /* first of all, reallocate the contours array when necessary */ + new_max = (FT_UInt)outline->n_contours; + old_max = hints->max_contours; + if ( new_max > old_max ) + { + new_max = ( new_max + 3 ) & ~3; + + if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) ) + goto Exit; + + hints->max_contours = new_max; + } + + /* + * then reallocate the points arrays if necessary -- + * note that we reserve two additional point positions, used to + * hint metrics appropriately + */ + new_max = (FT_UInt)( outline->n_points + 2 ); + old_max = hints->max_points; + if ( new_max > old_max ) + { + new_max = ( new_max + 2 + 7 ) & ~7; + + if ( FT_RENEW_ARRAY( hints->points, old_max, new_max ) ) + goto Exit; + + hints->max_points = new_max; + } + + hints->num_points = outline->n_points; + hints->num_contours = outline->n_contours; + + /* We can't rely on the value of `FT_Outline.flags' to know the fill */ + /* direction used for a glyph, given that some fonts are broken (e.g., */ + /* the Arphic ones). We thus recompute it each time we need to. */ + /* */ + hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_UP; + hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_LEFT; + + if ( FT_Outline_Get_Orientation( outline ) == FT_ORIENTATION_POSTSCRIPT ) + { + hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_DOWN; + hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_RIGHT; + } + + hints->x_scale = x_scale; + hints->y_scale = y_scale; + hints->x_delta = x_delta; + hints->y_delta = y_delta; + + hints->xmin_delta = 0; + hints->xmax_delta = 0; + + points = hints->points; + if ( hints->num_points == 0 ) + goto Exit; + + { + AF_Point point; + AF_Point point_limit = points + hints->num_points; + + + /* compute coordinates & Bezier flags, next and prev */ + { + FT_Vector* vec = outline->points; + char* tag = outline->tags; + AF_Point end = points + outline->contours[0]; + AF_Point prev = end; + FT_Int contour_index = 0; + + + for ( point = points; point < point_limit; point++, vec++, tag++ ) + { + point->fx = (FT_Short)vec->x; + point->fy = (FT_Short)vec->y; + point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta; + point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta; + + switch ( FT_CURVE_TAG( *tag ) ) + { + case FT_CURVE_TAG_CONIC: + point->flags = AF_FLAG_CONIC; + break; + case FT_CURVE_TAG_CUBIC: + point->flags = AF_FLAG_CUBIC; + break; + default: + point->flags = 0; + } + + point->prev = prev; + prev->next = point; + prev = point; + + if ( point == end ) + { + if ( ++contour_index < outline->n_contours ) + { + end = points + outline->contours[contour_index]; + prev = end; + } + } + } + } + + /* set-up the contours array */ + { + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + short* end = outline->contours; + short idx = 0; + + + for ( ; contour < contour_limit; contour++, end++ ) + { + contour[0] = points + idx; + idx = (short)( end[0] + 1 ); + } + } + + /* compute directions of in & out vectors */ + { + AF_Point first = points; + AF_Point prev = NULL; + FT_Pos in_x = 0; + FT_Pos in_y = 0; + AF_Direction in_dir = AF_DIR_NONE; + + + for ( point = points; point < point_limit; point++ ) + { + AF_Point next; + FT_Pos out_x, out_y; + + + if ( point == first ) + { + prev = first->prev; + in_x = first->fx - prev->fx; + in_y = first->fy - prev->fy; + in_dir = af_direction_compute( in_x, in_y ); + first = prev + 1; + } + + point->in_dir = (FT_Char)in_dir; + + next = point->next; + out_x = next->fx - point->fx; + out_y = next->fy - point->fy; + + in_dir = af_direction_compute( out_x, out_y ); + point->out_dir = (FT_Char)in_dir; + + if ( point->flags & ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) ) + { + Is_Weak_Point: + point->flags |= AF_FLAG_WEAK_INTERPOLATION; + } + else if ( point->out_dir == point->in_dir ) + { + if ( point->out_dir != AF_DIR_NONE ) + goto Is_Weak_Point; + + if ( ft_corner_is_flat( in_x, in_y, out_x, out_y ) ) + goto Is_Weak_Point; + } + else if ( point->in_dir == -point->out_dir ) + goto Is_Weak_Point; + + in_x = out_x; + in_y = out_y; + prev = point; + } + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_save( AF_GlyphHints hints, + FT_Outline* outline ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + FT_Vector* vec = outline->points; + char* tag = outline->tags; + + + for ( ; point < limit; point++, vec++, tag++ ) + { + vec->x = point->x; + vec->y = point->y; + + if ( point->flags & AF_FLAG_CONIC ) + tag[0] = FT_CURVE_TAG_CONIC; + else if ( point->flags & AF_FLAG_CUBIC ) + tag[0] = FT_CURVE_TAG_CUBIC; + else + tag[0] = FT_CURVE_TAG_ON; + } + } + + + /**************************************************************** + * + * EDGE POINT GRID-FITTING + * + ****************************************************************/ + + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = & hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + + if ( dim == AF_DIMENSION_HORZ ) + { + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge edge = seg->edge; + AF_Point point, first, last; + + + if ( edge == NULL ) + continue; + + first = seg->first; + last = seg->last; + point = first; + for (;;) + { + point->x = edge->pos; + point->flags |= AF_FLAG_TOUCH_X; + + if ( point == last ) + break; + + point = point->next; + + } + } + } + else + { + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge edge = seg->edge; + AF_Point point, first, last; + + + if ( edge == NULL ) + continue; + + first = seg->first; + last = seg->last; + point = first; + for (;;) + { + point->y = edge->pos; + point->flags |= AF_FLAG_TOUCH_Y; + + if ( point == last ) + break; + + point = point->next; + } + } + } + } + + + /**************************************************************** + * + * STRONG POINT INTERPOLATION + * + ****************************************************************/ + + + /* hint the strong points -- this is equivalent to the TrueType `IP' */ + /* hinting instruction */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_strong_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_Point points = hints->points; + AF_Point point_limit = points + hints->num_points; + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Flags touch_flag; + + + if ( dim == AF_DIMENSION_HORZ ) + touch_flag = AF_FLAG_TOUCH_X; + else + touch_flag = AF_FLAG_TOUCH_Y; + + if ( edges < edge_limit ) + { + AF_Point point; + AF_Edge edge; + + + for ( point = points; point < point_limit; point++ ) + { + FT_Pos u, ou, fu; /* point position */ + FT_Pos delta; + + + if ( point->flags & touch_flag ) + continue; + + /* if this point is candidate to weak interpolation, we */ + /* interpolate it after all strong points have been processed */ + + if ( ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) && + !( point->flags & AF_FLAG_INFLECTION ) ) + continue; + + if ( dim == AF_DIMENSION_VERT ) + { + u = point->fy; + ou = point->oy; + } + else + { + u = point->fx; + ou = point->ox; + } + + fu = u; + + /* is the point before the first edge? */ + edge = edges; + delta = edge->fpos - u; + if ( delta >= 0 ) + { + u = edge->pos - ( edge->opos - ou ); + goto Store_Point; + } + + /* is the point after the last edge? */ + edge = edge_limit - 1; + delta = u - edge->fpos; + if ( delta >= 0 ) + { + u = edge->pos + ( ou - edge->opos ); + goto Store_Point; + } + + { + FT_PtrDist min, max, mid; + FT_Pos fpos; + + + /* find enclosing edges */ + min = 0; + max = edge_limit - edges; + +#if 1 + /* for small edge counts, a linear search is better */ + if ( max <= 8 ) + { + FT_PtrDist nn; + + for ( nn = 0; nn < max; nn++ ) + if ( edges[nn].fpos >= u ) + break; + + if ( edges[nn].fpos == u ) + { + u = edges[nn].pos; + goto Store_Point; + } + min = nn; + } + else +#endif + while ( min < max ) + { + mid = ( max + min ) >> 1; + edge = edges + mid; + fpos = edge->fpos; + + if ( u < fpos ) + max = mid; + else if ( u > fpos ) + min = mid + 1; + else + { + /* we are on the edge */ + u = edge->pos; + goto Store_Point; + } + } + + { + AF_Edge before = edges + min - 1; + AF_Edge after = edges + min + 0; + + + /* assert( before && after && before != after ) */ + if ( before->scale == 0 ) + before->scale = FT_DivFix( after->pos - before->pos, + after->fpos - before->fpos ); + + u = before->pos + FT_MulFix( fu - before->fpos, + before->scale ); + } + } + + Store_Point: + /* save the point position */ + if ( dim == AF_DIMENSION_HORZ ) + point->x = u; + else + point->y = u; + + point->flags |= touch_flag; + } + } + } + + + /**************************************************************** + * + * WEAK POINT INTERPOLATION + * + ****************************************************************/ + + + static void + af_iup_shift( AF_Point p1, + AF_Point p2, + AF_Point ref ) + { + AF_Point p; + FT_Pos delta = ref->u - ref->v; + + if ( delta == 0 ) + return; + + for ( p = p1; p < ref; p++ ) + p->u = p->v + delta; + + for ( p = ref + 1; p <= p2; p++ ) + p->u = p->v + delta; + } + + + static void + af_iup_interp( AF_Point p1, + AF_Point p2, + AF_Point ref1, + AF_Point ref2 ) + { + AF_Point p; + FT_Pos u; + FT_Pos v1 = ref1->v; + FT_Pos v2 = ref2->v; + FT_Pos d1 = ref1->u - v1; + FT_Pos d2 = ref2->u - v2; + + + if ( p1 > p2 ) + return; + + if ( v1 == v2 ) + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v1 ) + u += d1; + else + u += d2; + + p->u = u; + } + return; + } + + if ( v1 < v2 ) + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v1 ) + u += d1; + else if ( u >= v2 ) + u += d2; + else + u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 ); + + p->u = u; + } + } + else + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v2 ) + u += d2; + else if ( u >= v1 ) + u += d1; + else + u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 ); + + p->u = u; + } + } + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_weak_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_Point points = hints->points; + AF_Point point_limit = points + hints->num_points; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Flags touch_flag; + AF_Point point; + AF_Point end_point; + AF_Point first_point; + + + /* PASS 1: Move segment points to edge positions */ + + if ( dim == AF_DIMENSION_HORZ ) + { + touch_flag = AF_FLAG_TOUCH_X; + + for ( point = points; point < point_limit; point++ ) + { + point->u = point->x; + point->v = point->ox; + } + } + else + { + touch_flag = AF_FLAG_TOUCH_Y; + + for ( point = points; point < point_limit; point++ ) + { + point->u = point->y; + point->v = point->oy; + } + } + + point = points; + + for ( ; contour < contour_limit; contour++ ) + { + AF_Point first_touched, last_touched; + + + point = *contour; + end_point = point->prev; + first_point = point; + + /* find first touched point */ + for (;;) + { + if ( point > end_point ) /* no touched point in contour */ + goto NextContour; + + if ( point->flags & touch_flag ) + break; + + point++; + } + + first_touched = point; + last_touched = point; + + for (;;) + { + FT_ASSERT( point <= end_point && + ( point->flags & touch_flag ) != 0 ); + + /* skip any touched neighbhours */ + while ( point < end_point && ( point[1].flags & touch_flag ) != 0 ) + point++; + + last_touched = point; + + /* find the next touched point, if any */ + point ++; + for (;;) + { + if ( point > end_point ) + goto EndContour; + + if ( ( point->flags & touch_flag ) != 0 ) + break; + + point++; + } + + /* interpolate between last_touched and point */ + af_iup_interp( last_touched + 1, point - 1, + last_touched, point ); + } + + EndContour: + /* special case: only one point was touched */ + if ( last_touched == first_touched ) + { + af_iup_shift( first_point, end_point, first_touched ); + } + else /* interpolate the last part */ + { + if ( last_touched < end_point ) + af_iup_interp( last_touched + 1, end_point, + last_touched, first_touched ); + + if ( first_touched > points ) + af_iup_interp( first_point, first_touched - 1, + last_touched, first_touched ); + } + + NextContour: + ; + } + + /* now save the interpolated values back to x/y */ + if ( dim == AF_DIMENSION_HORZ ) + { + for ( point = points; point < point_limit; point++ ) + point->x = point->u; + } + else + { + for ( point = points; point < point_limit; point++ ) + point->y = point->u; + } + } + + +#ifdef AF_USE_WARPER + + FT_LOCAL_DEF( void ) + af_glyph_hints_scale_dim( AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed scale, + FT_Pos delta ) + { + AF_Point points = hints->points; + AF_Point points_limit = points + hints->num_points; + AF_Point point; + + + if ( dim == AF_DIMENSION_HORZ ) + { + for ( point = points; point < points_limit; point++ ) + point->x = FT_MulFix( point->fx, scale ) + delta; + } + else + { + for ( point = points; point < points_limit; point++ ) + point->y = FT_MulFix( point->fy, scale ) + delta; + } + } + +#endif /* AF_USE_WARPER */ + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afhints.h b/android/jni/ndk_modules/freetype/src/autofit/afhints.h new file mode 100644 index 00000000..10e673b3 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afhints.h @@ -0,0 +1,332 @@ +/***************************************************************************/ +/* */ +/* afhints.h */ +/* */ +/* Auto-fitter hinting routines (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFHINTS_H__ +#define __AFHINTS_H__ + +#include "aftypes.h" + +#define xxAF_SORT_SEGMENTS + +FT_BEGIN_HEADER + + /* + * The definition of outline glyph hints. These are shared by all + * script analysis routines (until now). + */ + + typedef enum AF_Dimension_ + { + AF_DIMENSION_HORZ = 0, /* x coordinates, */ + /* i.e., vertical segments & edges */ + AF_DIMENSION_VERT = 1, /* y coordinates, */ + /* i.e., horizontal segments & edges */ + + AF_DIMENSION_MAX /* do not remove */ + + } AF_Dimension; + + + /* hint directions -- the values are computed so that two vectors are */ + /* in opposite directions iff `dir1 + dir2 == 0' */ + typedef enum AF_Direction_ + { + AF_DIR_NONE = 4, + AF_DIR_RIGHT = 1, + AF_DIR_LEFT = -1, + AF_DIR_UP = 2, + AF_DIR_DOWN = -2 + + } AF_Direction; + + + /* point hint flags */ + typedef enum AF_Flags_ + { + AF_FLAG_NONE = 0, + + /* point type flags */ + AF_FLAG_CONIC = 1 << 0, + AF_FLAG_CUBIC = 1 << 1, + AF_FLAG_CONTROL = AF_FLAG_CONIC | AF_FLAG_CUBIC, + + /* point extremum flags */ + AF_FLAG_EXTREMA_X = 1 << 2, + AF_FLAG_EXTREMA_Y = 1 << 3, + + /* point roundness flags */ + AF_FLAG_ROUND_X = 1 << 4, + AF_FLAG_ROUND_Y = 1 << 5, + + /* point touch flags */ + AF_FLAG_TOUCH_X = 1 << 6, + AF_FLAG_TOUCH_Y = 1 << 7, + + /* candidates for weak interpolation have this flag set */ + AF_FLAG_WEAK_INTERPOLATION = 1 << 8, + + /* all inflection points in the outline have this flag set */ + AF_FLAG_INFLECTION = 1 << 9 + + } AF_Flags; + + + /* edge hint flags */ + typedef enum AF_Edge_Flags_ + { + AF_EDGE_NORMAL = 0, + AF_EDGE_ROUND = 1 << 0, + AF_EDGE_SERIF = 1 << 1, + AF_EDGE_DONE = 1 << 2 + + } AF_Edge_Flags; + + + typedef struct AF_PointRec_* AF_Point; + typedef struct AF_SegmentRec_* AF_Segment; + typedef struct AF_EdgeRec_* AF_Edge; + + + typedef struct AF_PointRec_ + { + FT_UShort flags; /* point flags used by hinter */ + FT_Char in_dir; /* direction of inwards vector */ + FT_Char out_dir; /* direction of outwards vector */ + + FT_Pos ox, oy; /* original, scaled position */ + FT_Short fx, fy; /* original, unscaled position (font units) */ + FT_Pos x, y; /* current position */ + FT_Pos u, v; /* current (x,y) or (y,x) depending on context */ + + AF_Point next; /* next point in contour */ + AF_Point prev; /* previous point in contour */ + + } AF_PointRec; + + + typedef struct AF_SegmentRec_ + { + FT_Byte flags; /* edge/segment flags for this segment */ + FT_Char dir; /* segment direction */ + FT_Short pos; /* position of segment */ + FT_Short min_coord; /* minimum coordinate of segment */ + FT_Short max_coord; /* maximum coordinate of segment */ + FT_Short height; /* the hinted segment height */ + + AF_Edge edge; /* the segment's parent edge */ + AF_Segment edge_next; /* link to next segment in parent edge */ + + AF_Segment link; /* (stem) link segment */ + AF_Segment serif; /* primary segment for serifs */ + FT_Pos num_linked; /* number of linked segments */ + FT_Pos score; /* used during stem matching */ + FT_Pos len; /* used during stem matching */ + + AF_Point first; /* first point in edge segment */ + AF_Point last; /* last point in edge segment */ + AF_Point* contour; /* ptr to first point of segment's contour */ + + } AF_SegmentRec; + + + typedef struct AF_EdgeRec_ + { + FT_Short fpos; /* original, unscaled position (font units) */ + FT_Pos opos; /* original, scaled position */ + FT_Pos pos; /* current position */ + + FT_Byte flags; /* edge flags */ + FT_Char dir; /* edge direction */ + FT_Fixed scale; /* used to speed up interpolation between edges */ + AF_Width blue_edge; /* non-NULL if this is a blue edge */ + + AF_Edge link; + AF_Edge serif; + FT_Short num_linked; + + FT_Int score; + + AF_Segment first; + AF_Segment last; + + } AF_EdgeRec; + + + typedef struct AF_AxisHintsRec_ + { + FT_Int num_segments; + FT_Int max_segments; + AF_Segment segments; +#ifdef AF_SORT_SEGMENTS + FT_Int mid_segments; +#endif + + FT_Int num_edges; + FT_Int max_edges; + AF_Edge edges; + + AF_Direction major_dir; + + } AF_AxisHintsRec, *AF_AxisHints; + + + typedef struct AF_GlyphHintsRec_ + { + FT_Memory memory; + + FT_Fixed x_scale; + FT_Pos x_delta; + + FT_Fixed y_scale; + FT_Pos y_delta; + + FT_Pos edge_distance_threshold; + + FT_Int max_points; + FT_Int num_points; + AF_Point points; + + FT_Int max_contours; + FT_Int num_contours; + AF_Point* contours; + + AF_AxisHintsRec axis[AF_DIMENSION_MAX]; + + FT_UInt32 scaler_flags; /* copy of scaler flags */ + FT_UInt32 other_flags; /* free for script-specific */ + /* implementations */ + AF_ScriptMetrics metrics; + + FT_Pos xmin_delta; /* used for warping */ + FT_Pos xmax_delta; + + } AF_GlyphHintsRec; + + +#define AF_HINTS_TEST_SCALER( h, f ) ( (h)->scaler_flags & (f) ) +#define AF_HINTS_TEST_OTHER( h, f ) ( (h)->other_flags & (f) ) + + +#ifdef AF_DEBUG + +#define AF_HINTS_DO_HORIZONTAL( h ) \ + ( !_af_debug_disable_horz_hints && \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) ) + +#define AF_HINTS_DO_VERTICAL( h ) \ + ( !_af_debug_disable_vert_hints && \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) ) + +#define AF_HINTS_DO_ADVANCE( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) + +#define AF_HINTS_DO_BLUES( h ) ( !_af_debug_disable_blue_hints ) + +#else /* !AF_DEBUG */ + +#define AF_HINTS_DO_HORIZONTAL( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) + +#define AF_HINTS_DO_VERTICAL( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) + +#define AF_HINTS_DO_ADVANCE( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) + +#define AF_HINTS_DO_BLUES( h ) 1 + +#endif /* !AF_DEBUG */ + + + FT_LOCAL( AF_Direction ) + af_direction_compute( FT_Pos dx, + FT_Pos dy ); + + + FT_LOCAL( FT_Error ) + af_axis_hints_new_segment( AF_AxisHints axis, + FT_Memory memory, + AF_Segment *asegment ); + + FT_LOCAL( FT_Error) + af_axis_hints_new_edge( AF_AxisHints axis, + FT_Int fpos, + AF_Direction dir, + FT_Memory memory, + AF_Edge *edge ); + + FT_LOCAL( void ) + af_glyph_hints_init( AF_GlyphHints hints, + FT_Memory memory ); + + + + /* + * recompute all AF_Point in a AF_GlyphHints from the definitions + * in a source outline + */ + FT_LOCAL( void ) + af_glyph_hints_rescale( AF_GlyphHints hints, + AF_ScriptMetrics metrics ); + + FT_LOCAL( FT_Error ) + af_glyph_hints_reload( AF_GlyphHints hints, + FT_Outline* outline ); + + FT_LOCAL( void ) + af_glyph_hints_save( AF_GlyphHints hints, + FT_Outline* outline ); + + FT_LOCAL( void ) + af_glyph_hints_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_align_strong_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_align_weak_points( AF_GlyphHints hints, + AF_Dimension dim ); + +#ifdef AF_USE_WARPER + FT_LOCAL( void ) + af_glyph_hints_scale_dim( AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed scale, + FT_Pos delta ); +#endif + + FT_LOCAL( void ) + af_glyph_hints_done( AF_GlyphHints hints ); + +/* */ + +#define AF_SEGMENT_LEN( seg ) ( (seg)->max_coord - (seg)->min_coord ) + +#define AF_SEGMENT_DIST( seg1, seg2 ) ( ( (seg1)->pos > (seg2)->pos ) \ + ? (seg1)->pos - (seg2)->pos \ + : (seg2)->pos - (seg1)->pos ) + + +FT_END_HEADER + +#endif /* __AFHINTS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afindic.c b/android/jni/ndk_modules/freetype/src/autofit/afindic.c new file mode 100644 index 00000000..1d9e9eaf --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afindic.c @@ -0,0 +1,130 @@ +/***************************************************************************/ +/* */ +/* afindic.c */ +/* */ +/* Auto-fitter hinting routines for Indic scripts (body). */ +/* */ +/* Copyright 2007 by */ +/* Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "aftypes.h" +#include "aflatin.h" + + +#ifdef AF_CONFIG_OPTION_INDIC + +#include "afindic.h" +#include "aferrors.h" +#include "afcjk.h" + + +#ifdef AF_USE_WARPER +#include "afwarp.h" +#endif + + + static FT_Error + af_indic_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + /* use CJK routines */ + return af_cjk_metrics_init( metrics, face ); + } + + + static void + af_indic_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + /* use CJK routines */ + af_cjk_metrics_scale( metrics, scaler ); + } + + + static FT_Error + af_indic_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + /* use CJK routines */ + return af_cjk_hints_init( hints, metrics ); + } + + + static FT_Error + af_indic_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics) + { + /* use CJK routines */ + return af_cjk_hints_apply( hints, outline, metrics ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** I N D I C S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static const AF_Script_UniRangeRec af_indic_uniranges[] = + { +#if 0 + AF_UNIRANGE_REC( 0x0100UL, 0xFFFFUL ), /* why this? */ +#endif + AF_UNIRANGE_REC( 0x0900UL, 0x0DFFUL), /* Indic Range */ + AF_UNIRANGE_REC( 0UL, 0UL) + }; + + + AF_DEFINE_SCRIPT_CLASS(af_indic_script_class, + AF_SCRIPT_INDIC, + af_indic_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_indic_metrics_init, + (AF_Script_ScaleMetricsFunc)af_indic_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_indic_hints_init, + (AF_Script_ApplyHintsFunc) af_indic_hints_apply + ) + +#else /* !AF_CONFIG_OPTION_INDIC */ + + static const AF_Script_UniRangeRec af_indic_uniranges[] = + { + { 0, 0 } + }; + + + AF_DEFINE_SCRIPT_CLASS(af_indic_script_class, + AF_SCRIPT_INDIC, + af_indic_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) NULL, + (AF_Script_ScaleMetricsFunc)NULL, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) NULL, + (AF_Script_ApplyHintsFunc) NULL + ) + +#endif /* !AF_CONFIG_OPTION_INDIC */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afindic.h b/android/jni/ndk_modules/freetype/src/autofit/afindic.h new file mode 100644 index 00000000..662a9822 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afindic.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* afindic.h */ +/* */ +/* Auto-fitter hinting routines for Indic scripts (specification). */ +/* */ +/* Copyright 2007 by */ +/* Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFINDIC_H__ +#define __AFINDIC_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the Indic-specific script class */ + + AF_DECLARE_SCRIPT_CLASS(af_indic_script_class) + + +/* */ + +FT_END_HEADER + +#endif /* __AFINDIC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/aflatin.c b/android/jni/ndk_modules/freetype/src/autofit/aflatin.c new file mode 100644 index 00000000..8c6c430b --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/aflatin.c @@ -0,0 +1,2227 @@ +/***************************************************************************/ +/* */ +/* aflatin.c */ +/* */ +/* Auto-fitter hinting routines for latin script (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_ADVANCES_H + +#include "aflatin.h" +#include "aferrors.h" + + +#ifdef AF_USE_WARPER +#include "afwarp.h" +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + af_latin_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face, + FT_ULong charcode ) + { + /* scan the array of segments in each direction */ + AF_GlyphHintsRec hints[1]; + + + af_glyph_hints_init( hints, face->memory ); + + metrics->axis[AF_DIMENSION_HORZ].width_count = 0; + metrics->axis[AF_DIMENSION_VERT].width_count = 0; + + { + FT_Error error; + FT_UInt glyph_index; + int dim; + AF_LatinMetricsRec dummy[1]; + AF_Scaler scaler = &dummy->root.scaler; + + + glyph_index = FT_Get_Char_Index( face, charcode ); + if ( glyph_index == 0 ) + goto Exit; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || face->glyph->outline.n_points <= 0 ) + goto Exit; + + FT_ZERO( dummy ); + + dummy->units_per_em = metrics->units_per_em; + scaler->x_scale = scaler->y_scale = 0x10000L; + scaler->x_delta = scaler->y_delta = 0; + scaler->face = face; + scaler->render_mode = FT_RENDER_MODE_NORMAL; + scaler->flags = 0; + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy ); + + error = af_glyph_hints_reload( hints, &face->glyph->outline ); + if ( error ) + goto Exit; + + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + AF_AxisHints axhints = &hints->axis[dim]; + AF_Segment seg, limit, link; + FT_UInt num_widths = 0; + + + error = af_latin_hints_compute_segments( hints, + (AF_Dimension)dim ); + if ( error ) + goto Exit; + + af_latin_hints_link_segments( hints, + (AF_Dimension)dim ); + + seg = axhints->segments; + limit = seg + axhints->num_segments; + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Pos dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < AF_LATIN_MAX_WIDTHS ) + axis->widths[ num_widths++ ].org = dist; + } + } + + af_sort_widths( num_widths, axis->widths ); + axis->width_count = num_widths; + } + + Exit: + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + FT_Pos stdw; + + + stdw = ( axis->width_count > 0 ) + ? axis->widths[0].org + : AF_LATIN_CONSTANT( metrics, 50 ); + + /* let's try 20% of the smallest width */ + axis->edge_distance_threshold = stdw / 5; + axis->standard_width = stdw; + axis->extra_light = 0; + } + } + + af_glyph_hints_done( hints ); + } + + + +#define AF_LATIN_MAX_TEST_CHARACTERS 12 + + + static const char af_latin_blue_chars[AF_LATIN_MAX_BLUES] + [AF_LATIN_MAX_TEST_CHARACTERS + 1] = + { + "THEZOCQS", + "HEZLOCUS", + "fijkdbh", + "xzroesc", + "xzroesc", + "pqgjy" + }; + + + static void + af_latin_metrics_init_blues( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Pos flats [AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Pos rounds[AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Int num_flats; + FT_Int num_rounds; + FT_Int bb; + AF_LatinBlue blue; + FT_Error error; + AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; + FT_GlyphSlot glyph = face->glyph; + + + /* we compute the blues simply by loading each character from the */ + /* 'af_latin_blue_chars[blues]' string, then compute its top-most or */ + /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ + + AF_LOG(( "blue zones computation\n" )); + AF_LOG(( "------------------------------------------------\n" )); + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + const char* p = af_latin_blue_chars[bb]; + const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; + FT_Pos* blue_ref; + FT_Pos* blue_shoot; + + + AF_LOG(( "blue %3d: ", bb )); + + num_flats = 0; + num_rounds = 0; + + for ( ; p < limit && *p; p++ ) + { + FT_UInt glyph_index; + FT_Pos best_y; /* same as points.y */ + FT_Int best_point, best_first, best_last; + FT_Vector* points; + FT_Bool round = 0; + + + AF_LOG(( "'%c'", *p )); + + /* load the character in the face -- skip unknown or empty ones */ + glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p ); + if ( glyph_index == 0 ) + continue; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || glyph->outline.n_points <= 0 ) + continue; + + /* now compute min or max point indices and coordinates */ + points = glyph->outline.points; + best_point = -1; + best_y = 0; /* make compiler happy */ + best_first = 0; /* ditto */ + best_last = 0; /* ditto */ + + { + FT_Int nn; + FT_Int first = 0; + FT_Int last = -1; + + + for ( nn = 0; nn < glyph->outline.n_contours; first = last+1, nn++ ) + { + FT_Int old_best_point = best_point; + FT_Int pp; + + + last = glyph->outline.contours[nn]; + + /* Avoid single-point contours since they are never rasterized. */ + /* In some fonts, they correspond to mark attachment points */ + /* which are way outside of the glyph's real outline. */ + if ( last <= first ) + continue; + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y > best_y ) + { + best_point = pp; + best_y = points[pp].y; + } + } + else + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y < best_y ) + { + best_point = pp; + best_y = points[pp].y; + } + } + + if ( best_point != old_best_point ) + { + best_first = first; + best_last = last; + } + } + AF_LOG(( "%5d", best_y )); + } + + /* now check whether the point belongs to a straight or round */ + /* segment; we first need to find in which contour the extremum */ + /* lies, then inspect its previous and next points */ + if ( best_point >= 0 ) + { + FT_Int prev, next; + FT_Pos dist; + + + /* now look for the previous and next points that are not on the */ + /* same Y coordinate. Threshold the `closeness'... */ + prev = best_point; + next = prev; + + do + { + if ( prev > best_first ) + prev--; + else + prev = best_last; + + dist = points[prev].y - best_y; + if ( dist < -5 || dist > 5 ) + break; + + } while ( prev != best_point ); + + do + { + if ( next < best_last ) + next++; + else + next = best_first; + + dist = points[next].y - best_y; + if ( dist < -5 || dist > 5 ) + break; + + } while ( next != best_point ); + + /* now, set the `round' flag depending on the segment's kind */ + round = FT_BOOL( + FT_CURVE_TAG( glyph->outline.tags[prev] ) != FT_CURVE_TAG_ON || + FT_CURVE_TAG( glyph->outline.tags[next] ) != FT_CURVE_TAG_ON ); + + AF_LOG(( "%c ", round ? 'r' : 'f' )); + } + + if ( round ) + rounds[num_rounds++] = best_y; + else + flats[num_flats++] = best_y; + } + + AF_LOG(( "\n" )); + + if ( num_flats == 0 && num_rounds == 0 ) + { + /* + * we couldn't find a single glyph to compute this blue zone, + * we will simply ignore it then + */ + AF_LOG(( "empty\n" )); + continue; + } + + /* we have computed the contents of the `rounds' and `flats' tables, */ + /* now determine the reference and overshoot position of the blue -- */ + /* we simply take the median value after a simple sort */ + af_sort_pos( num_rounds, rounds ); + af_sort_pos( num_flats, flats ); + + blue = & axis->blues[axis->blue_count]; + blue_ref = & blue->ref.org; + blue_shoot = & blue->shoot.org; + + axis->blue_count++; + + if ( num_flats == 0 ) + { + *blue_ref = + *blue_shoot = rounds[num_rounds / 2]; + } + else if ( num_rounds == 0 ) + { + *blue_ref = + *blue_shoot = flats[num_flats / 2]; + } + else + { + *blue_ref = flats[num_flats / 2]; + *blue_shoot = rounds[num_rounds / 2]; + } + + /* there are sometimes problems: if the overshoot position of top */ + /* zones is under its reference position, or the opposite for bottom */ + /* zones. We must thus check everything there and correct the errors */ + if ( *blue_shoot != *blue_ref ) + { + FT_Pos ref = *blue_ref; + FT_Pos shoot = *blue_shoot; + FT_Bool over_ref = FT_BOOL( shoot > ref ); + + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref ) + *blue_shoot = *blue_ref = ( shoot + ref ) / 2; + } + + blue->flags = 0; + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + blue->flags |= AF_LATIN_BLUE_TOP; + + /* + * The following flag is used later to adjust the y and x scales + * in order to optimize the pixel grid alignment of the top of small + * letters. + */ + if ( bb == AF_LATIN_BLUE_SMALL_TOP ) + blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; + + AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot )); + } + + return; + } + + + FT_LOCAL_DEF( void ) + af_latin_metrics_check_digits( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_UInt i; + FT_Bool started = 0, same_width = 1; + FT_Fixed advance, old_advance = 0; + + + /* check whether all ASCII digits have the same advance width; */ + /* digit `0' is 0x30 in all supported charmaps */ + for ( i = 0x30; i <= 0x39; i++ ) + { + FT_UInt glyph_index; + + + glyph_index = FT_Get_Char_Index( face, i ); + if ( glyph_index == 0 ) + continue; + + if ( FT_Get_Advance( face, glyph_index, + FT_LOAD_NO_SCALE | + FT_LOAD_NO_HINTING | + FT_LOAD_IGNORE_TRANSFORM, + &advance ) ) + continue; + + if ( started ) + { + if ( advance != old_advance ) + { + same_width = 0; + break; + } + } + else + { + old_advance = advance; + started = 1; + } + } + + metrics->root.digits_have_same_width = same_width; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Error error = AF_Err_Ok; + FT_CharMap oldmap = face->charmap; + FT_UInt ee; + + static const FT_Encoding latin_encodings[] = + { + FT_ENCODING_UNICODE, + FT_ENCODING_APPLE_ROMAN, + FT_ENCODING_ADOBE_STANDARD, + FT_ENCODING_ADOBE_LATIN_1, + FT_ENCODING_NONE /* end of list */ + }; + + + metrics->units_per_em = face->units_per_EM; + + /* do we have a latin charmap in there? */ + for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ ) + { + error = FT_Select_Charmap( face, latin_encodings[ee] ); + if ( !error ) + break; + } + + if ( !error ) + { + /* For now, compute the standard width and height from the `o'. */ + af_latin_metrics_init_widths( metrics, face, 'o' ); + af_latin_metrics_init_blues( metrics, face ); + af_latin_metrics_check_digits( metrics, face ); + } + + FT_Set_Charmap( face, oldmap ); + return AF_Err_Ok; + } + + + static void + af_latin_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + FT_Fixed scale; + FT_Pos delta; + AF_LatinAxis axis; + FT_UInt nn; + + + if ( dim == AF_DIMENSION_HORZ ) + { + scale = scaler->x_scale; + delta = scaler->x_delta; + } + else + { + scale = scaler->y_scale; + delta = scaler->y_delta; + } + + axis = &metrics->axis[dim]; + + if ( axis->org_scale == scale && axis->org_delta == delta ) + return; + + axis->org_scale = scale; + axis->org_delta = delta; + + /* + * correct X and Y scale to optimize the alignment of the top of small + * letters to the pixel grid + */ + { + AF_LatinAxis Axis = &metrics->axis[AF_DIMENSION_VERT]; + AF_LatinBlue blue = NULL; + + + for ( nn = 0; nn < Axis->blue_count; nn++ ) + { + if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) + { + blue = &Axis->blues[nn]; + break; + } + } + + if ( blue ) + { + FT_Pos scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); + FT_Pos fitted = ( scaled + 40 ) & ~63; + + + if ( scaled != fitted ) + { +#if 0 + if ( dim == AF_DIMENSION_HORZ ) + { + if ( fitted < scaled ) + scale -= scale / 50; /* scale *= 0.98 */ + } + else +#endif + if ( dim == AF_DIMENSION_VERT ) + { + scale = FT_MulDiv( scale, fitted, scaled ); + } + } + } + } + + axis->scale = scale; + axis->delta = delta; + + if ( dim == AF_DIMENSION_HORZ ) + { + metrics->root.scaler.x_scale = scale; + metrics->root.scaler.x_delta = delta; + } + else + { + metrics->root.scaler.y_scale = scale; + metrics->root.scaler.y_delta = delta; + } + + /* scale the standard widths */ + for ( nn = 0; nn < axis->width_count; nn++ ) + { + AF_Width width = axis->widths + nn; + + + width->cur = FT_MulFix( width->org, scale ); + width->fit = width->cur; + } + + /* an extra-light axis corresponds to a standard width that is */ + /* smaller than 0.75 pixels */ + axis->extra_light = + (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); + + if ( dim == AF_DIMENSION_VERT ) + { + /* scale the blue zones */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = &axis->blues[nn]; + FT_Pos dist; + + + blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; + blue->ref.fit = blue->ref.cur; + blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; + blue->shoot.fit = blue->shoot.cur; + blue->flags &= ~AF_LATIN_BLUE_ACTIVE; + + /* a blue zone is only active if it is less than 3/4 pixels tall */ + dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); + if ( dist <= 48 && dist >= -48 ) + { + FT_Pos delta1, delta2; + + + delta1 = blue->shoot.org - blue->ref.org; + delta2 = delta1; + if ( delta1 < 0 ) + delta2 = -delta2; + + delta2 = FT_MulFix( delta2, scale ); + + if ( delta2 < 32 ) + delta2 = 0; + else if ( delta2 < 64 ) + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); + else + delta2 = FT_PIX_ROUND( delta2 ); + + if ( delta1 < 0 ) + delta2 = -delta2; + + blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); + blue->shoot.fit = blue->ref.fit + delta2; + + blue->flags |= AF_LATIN_BLUE_ACTIVE; + } + } + } + } + + + FT_LOCAL_DEF( void ) + af_latin_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + metrics->root.scaler.render_mode = scaler->render_mode; + metrics->root.scaler.face = scaler->face; + + af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Memory memory = hints->memory; + FT_Error error = AF_Err_Ok; + AF_Segment segment = NULL; + AF_SegmentRec seg0; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Direction major_dir, segment_dir; + + + FT_ZERO( &seg0 ); + seg0.score = 32000; + seg0.flags = AF_EDGE_NORMAL; + + major_dir = (AF_Direction)FT_ABS( axis->major_dir ); + segment_dir = major_dir; + + axis->num_segments = 0; + + /* set up (u,v) in each point */ + if ( dim == AF_DIMENSION_HORZ ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fx; + point->v = point->fy; + } + } + else + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fy; + point->v = point->fx; + } + } + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point last = point->prev; + int on_edge = 0; + FT_Pos min_pos = 32000; /* minimum segment pos != min_coord */ + FT_Pos max_pos = -32000; /* maximum segment pos != max_coord */ + FT_Bool passed; + + + if ( point == last ) /* skip singletons -- just in case */ + continue; + + if ( FT_ABS( last->out_dir ) == major_dir && + FT_ABS( point->out_dir ) == major_dir ) + { + /* we are already on an edge, try to locate its start */ + last = point; + + for (;;) + { + point = point->prev; + if ( FT_ABS( point->out_dir ) != major_dir ) + { + point = point->next; + break; + } + if ( point == last ) + break; + } + } + + last = point; + passed = 0; + + for (;;) + { + FT_Pos u, v; + + + if ( on_edge ) + { + u = point->u; + if ( u < min_pos ) + min_pos = u; + if ( u > max_pos ) + max_pos = u; + + if ( point->out_dir != segment_dir || point == last ) + { + /* we are just leaving an edge; record a new segment! */ + segment->last = point; + segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); + + /* a segment is round if either its first or last point */ + /* is a control point */ + if ( ( segment->first->flags | point->flags ) & + AF_FLAG_CONTROL ) + segment->flags |= AF_EDGE_ROUND; + + /* compute segment size */ + min_pos = max_pos = point->v; + + v = segment->first->v; + if ( v < min_pos ) + min_pos = v; + if ( v > max_pos ) + max_pos = v; + + segment->min_coord = (FT_Short)min_pos; + segment->max_coord = (FT_Short)max_pos; + segment->height = (FT_Short)( segment->max_coord - + segment->min_coord ); + + on_edge = 0; + segment = NULL; + /* fallthrough */ + } + } + + /* now exit if we are at the start/end point */ + if ( point == last ) + { + if ( passed ) + break; + passed = 1; + } + + if ( !on_edge && FT_ABS( point->out_dir ) == major_dir ) + { + /* this is the start of a new segment! */ + segment_dir = (AF_Direction)point->out_dir; + + /* clear all segment fields */ + error = af_axis_hints_new_segment( axis, memory, &segment ); + if ( error ) + goto Exit; + + segment[0] = seg0; + segment->dir = (FT_Char)segment_dir; + min_pos = max_pos = point->u; + segment->first = point; + segment->last = point; + segment->contour = contour; + on_edge = 1; + } + + point = point->next; + } + + } /* contours */ + + + /* now slightly increase the height of segments when this makes */ + /* sense -- this is used to better detect and ignore serifs */ + { + AF_Segment segments = axis->segments; + AF_Segment segments_end = segments + axis->num_segments; + + + for ( segment = segments; segment < segments_end; segment++ ) + { + AF_Point first = segment->first; + AF_Point last = segment->last; + FT_Pos first_v = first->v; + FT_Pos last_v = last->v; + + + if ( first == last ) + continue; + + if ( first_v < last_v ) + { + AF_Point p; + + + p = first->prev; + if ( p->v < first_v ) + segment->height = (FT_Short)( segment->height + + ( ( first_v - p->v ) >> 1 ) ); + + p = last->next; + if ( p->v > last_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - last_v ) >> 1 ) ); + } + else + { + AF_Point p; + + + p = first->prev; + if ( p->v > first_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - first_v ) >> 1 ) ); + + p = last->next; + if ( p->v < last_v ) + segment->height = (FT_Short)( segment->height + + ( ( last_v - p->v ) >> 1 ) ); + } + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + FT_Pos len_threshold, len_score; + AF_Segment seg1, seg2; + + + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + if ( len_threshold == 0 ) + len_threshold = 1; + + len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); + + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + /* the fake segments are introduced to hint the metrics -- */ + /* we must never link them to anything */ + if ( seg1->dir != axis->major_dir || seg1->first == seg1->last ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos ) + { + FT_Pos pos1 = seg1->pos; + FT_Pos pos2 = seg2->pos; + FT_Pos dist = pos2 - pos1; + + + if ( dist < 0 ) + dist = -dist; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len, score; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= len_threshold ) + { + score = dist + len_score / len; + + if ( score < seg1->score ) + { + seg1->score = score; + seg1->link = seg2; + } + + if ( score < seg2->score ) + { + seg2->score = score; + seg2->link = seg1; + } + } + } + } + } + + /* now, compute the `serif' segments */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + if ( seg2->link != seg1 ) + { + seg1->link = 0; + seg1->serif = seg2->link; + } + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = AF_Err_Ok; + FT_Memory memory = hints->memory; + AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + AF_Direction up_dir; + FT_Fixed scale; + FT_Pos edge_distance_threshold; + FT_Pos segment_length_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP + : AF_DIR_RIGHT; + + /* + * We ignore all segments that are less than 1 pixels in length, + * to avoid many problems with serif fonts. We compute the + * corresponding threshold in font units. + */ + if ( dim == AF_DIMENSION_HORZ ) + segment_length_threshold = FT_DivFix( 64, hints->y_scale ); + else + segment_length_threshold = 0; + + /*********************************************************************/ + /* */ + /* We will begin by generating a sorted table of edges for the */ + /* current direction. To do so, we simply scan each segment and try */ + /* to find an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which will be processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the edges table is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = 64 / 4; + + edge_distance_threshold = FT_DivFix( edge_distance_threshold, + scale ); + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = 0; + FT_Int ee; + + + if ( seg->height < segment_length_threshold ) + continue; + + /* A special case for serif edges: If they are smaller than */ + /* 1.5 pixels we ignore them. */ + if ( seg->serif && + 2 * seg->height < 3 * segment_length_threshold ) + continue; + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && edge->dir == seg->dir ) + { + found = edge; + break; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, + (AF_Direction)seg->dir, + memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->fpos = seg->pos; + edge->dir = seg->dir; + edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); + seg->edge_next = seg; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + + /*********************************************************************/ + /* */ + /* Good, we will now compute each edge's properties according to */ + /* segments found on its position. Basically, these are: */ + /* */ + /* - edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /*********************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + + /* + * Note that removing this loop and setting the `edge' field of each + * segment directly in the code above slows down execution speed for + * some reasons on platforms like the Sun. + */ + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now, compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ + FT_Pos ups = 0; /* number of upwards segments */ + FT_Pos downs = 0; /* number of downwards segments */ + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + + /* check for segment direction */ + if ( seg->dir == up_dir ) + ups += seg->max_coord-seg->min_coord; + else + downs += seg->max_coord-seg->min_coord; + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = (FT_Bool)( seg->serif && + seg->serif->edge && + seg->serif->edge != edge ); + + if ( ( seg->link && seg->link->edge != NULL ) || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = seg->pos - seg2->pos; + if ( seg_delta < 0 ) + seg_delta = -seg_delta; + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + +#if 0 + /* set the edge's main direction */ + edge->dir = AF_DIR_NONE; + + if ( ups > downs ) + edge->dir = (FT_Char)up_dir; + + else if ( ups < downs ) + edge->dir = (FT_Char)-up_dir; + + else if ( ups == downs ) + edge->dir = 0; /* both up and down! */ +#endif + + /* gets rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = 0; + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_latin_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_latin_hints_link_segments( hints, dim ); + + error = af_latin_hints_compute_edges( hints, dim ); + } + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin_hints_compute_blue_edges( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + AF_AxisHints axis = &hints->axis[ AF_DIMENSION_VERT ]; + AF_Edge edge = axis->edges; + AF_Edge edge_limit = edge + axis->num_edges; + AF_LatinAxis latin = &metrics->axis[ AF_DIMENSION_VERT ]; + FT_Fixed scale = latin->scale; + + + /* compute which blue zones are active, i.e. have their scaled */ + /* size < 3/4 pixels */ + + /* for each horizontal edge search the blue zone which is closest */ + for ( ; edge < edge_limit; edge++ ) + { + FT_Int bb; + AF_Width best_blue = NULL; + FT_Pos best_dist; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + best_dist = FT_MulFix( metrics->units_per_em / 40, scale ); + + if ( best_dist > 64 / 2 ) + best_dist = 64 / 2; + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + AF_LatinBlue blue = latin->blues + bb; + FT_Bool is_top_blue, is_major_dir; + + + /* skip inactive blue zones (i.e., those that are too small) */ + if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + /* if it is a top zone, check for right edges -- if it is a bottom */ + /* zone, check for left edges */ + /* */ + /* of course, that's for TrueType */ + is_top_blue = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 ); + is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); + + /* if it is a top zone, the edge must be against the major */ + /* direction; if it is a bottom zone, it must be in the major */ + /* direction */ + if ( is_top_blue ^ is_major_dir ) + { + FT_Pos dist; + + + /* first of all, compare it to the reference position */ + dist = edge->fpos - blue->ref.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = & blue->ref; + } + + /* now, compare it to the overshoot position if the edge is */ + /* rounded, and if the edge is over the reference position of a */ + /* top zone, or under the reference position of a bottom zone */ + if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) + { + FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); + + + if ( is_top_blue ^ is_under_ref ) + { + blue = latin->blues + bb; + dist = edge->fpos - blue->shoot.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = & blue->shoot; + } + } + } + } + } + + if ( best_blue ) + edge->blue_edge = best_blue; + } + } + + + static FT_Error + af_latin_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + FT_Face face = metrics->root.scaler.face; + + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics ); + + /* + * correct x_scale and y_scale if needed, since they may have + * been modified `af_latin_metrics_scale_dim' above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + +#if 0 /* #ifdef AF_USE_WARPER */ + if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) + { + metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; + } +#endif + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels only if we don't use the `light' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + /* + * In `light' hinting mode we disable horizontal hinting completely. + * We also do it if the face is italic. + */ + if ( mode == FT_RENDER_MODE_LIGHT || + (face->style_flags & FT_STYLE_FLAG_ITALIC) != 0 ) + scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* snap a given width in scaled coordinates to one of the */ + /* current standard widths */ + + static FT_Pos + af_latin_snap_width( AF_Width widths, + FT_Int count, + FT_Pos width ) + { + int n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* compute the snapped width of a given stem */ + + static FT_Pos + af_latin_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + AF_Edge_Flags base_flags, + AF_Edge_Flags stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; + AF_LatinAxis axis = & metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || + axis->extra_light ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + /* leave the widths of serifs alone */ + + if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) + goto Done_Width; + + else if ( ( base_flags & AF_EDGE_ROUND ) ) + { + if ( dist < 80 ) + dist = 64; + } + else if ( dist < 56 ) + dist = 56; + + if ( axis->width_count > 0 ) + { + FT_Pos delta; + + + /* compare to standard width */ + if ( axis->width_count > 0 ) + { + delta = dist - axis->widths[0].cur; + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 3 * 64 ) + { + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + + else if ( delta < 32 ) + dist += 10; + + else if ( delta < 54 ) + dist += 54; + + else + dist += delta; + } + else + dist = ( dist + 32 ) & ~63; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + FT_Pos org_dist = dist; + + + dist = af_latin_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + { + /* We only round to an integer width if the corresponding */ + /* distortion is less than 1/4 pixel. Otherwise this */ + /* makes everything worse since the diagonals, which are */ + /* not hinted, appear a lot bolder or thinner than the */ + /* vertical stems. */ + + FT_Pos delta; + + + dist = ( dist + 22 ) & ~63; + delta = dist - org_dist; + if ( delta < 0 ) + delta = -delta; + + if (delta >= 16) + { + dist = org_dist; + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + } + } + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* align one stem edge relative to the previous stem edge */ + + static void + af_latin_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_latin_compute_stem_width( + hints, dim, dist, + (AF_Edge_Flags)base_edge->flags, + (AF_Edge_Flags)stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + + AF_LOG(( "LINK: edge %d (opos=%.2f) linked to (%.2f), " + "dist was %.2f, now %.2f\n", + stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0, + stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); + } + + + static void + af_latin_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + (serif->opos - base->opos); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + af_latin_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + FT_PtrDist n_edges; + AF_Edge edge; + AF_Edge anchor = 0; + FT_Int has_serifs = 0; + + + /* we begin by aligning all stems relative to the blue zone */ + /* if needed -- that's only for horizontal edges */ + + if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Width blue; + AF_Edge edge1, edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + blue = edge->blue_edge; + edge1 = NULL; + edge2 = edge->link; + + if ( blue ) + { + edge1 = edge; + } + else if ( edge2 && edge2->blue_edge ) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + + AF_LOG(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), " + "was (%.2f)\n", + edge1-edges, edge1->opos / 64.0, blue->fit / 64.0, + edge1->pos / 64.0 )); + + edge1->pos = blue->fit; + edge1->flags |= AF_EDGE_DONE; + + if ( edge2 && !edge2->blue_edge ) + { + af_latin_align_linked_edge( hints, dim, edge1, edge2 ); + edge2->flags |= AF_EDGE_DONE; + } + + if ( !anchor ) + anchor = edge; + } + } + + /* now we will align all stem edges, trying to maintain the */ + /* relative order of stems in the glyph */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + has_serifs++; + continue; + } + + /* now align the stem */ + + /* this should not happen, but it's better to be safe */ + if ( edge2->blue_edge ) + { + AF_LOG(( "ASSERTION FAILED for edge %d\n", edge2-edges )); + + af_latin_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + continue; + } + + if ( !anchor ) + { + FT_Pos org_len, org_center, cur_len; + FT_Pos cur_pos1, error1, error2, u_off, d_off; + + + org_len = edge2->opos - edge->opos; + cur_len = af_latin_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + if ( cur_len <= 64 ) + u_off = d_off = 32; + else + { + u_off = 38; + d_off = 26; + } + + if ( cur_len < 96 ) + { + org_center = edge->opos + ( org_len >> 1 ); + + cur_pos1 = FT_PIX_ROUND( org_center ); + + error1 = org_center - ( cur_pos1 - u_off ); + if ( error1 < 0 ) + error1 = -error1; + + error2 = org_center - ( cur_pos1 + d_off ); + if ( error2 < 0 ) + error2 = -error2; + + if ( error1 < error2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = edge->pos + cur_len; + } + else + edge->pos = FT_PIX_ROUND( edge->opos ); + + AF_LOG(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f) " + "snapped to (%.2f) (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + anchor = edge; + + edge->flags |= AF_EDGE_DONE; + + af_latin_align_linked_edge( hints, dim, edge, edge2 ); + } + else + { + FT_Pos org_pos, org_len, org_center, cur_len; + FT_Pos cur_pos1, cur_pos2, delta1, delta2; + + + org_pos = anchor->pos + ( edge->opos - anchor->opos ); + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + + if ( edge2->flags & AF_EDGE_DONE ) + edge->pos = edge2->pos - cur_len; + + else if ( cur_len < 96 ) + { + FT_Pos u_off, d_off; + + + cur_pos1 = FT_PIX_ROUND( org_center ); + + if (cur_len <= 64 ) + u_off = d_off = 32; + else + { + u_off = 38; + d_off = 26; + } + + delta1 = org_center - ( cur_pos1 - u_off ); + if ( delta1 < 0 ) + delta1 = -delta1; + + delta2 = org_center - ( cur_pos1 + d_off ); + if ( delta2 < 0 ) + delta2 = -delta2; + + if ( delta1 < delta2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = cur_pos1 + cur_len / 2; + + AF_LOG(( "STEM: %d (opos=%.2f) to %d (opos=%.2f) " + "snapped to (%.2f) and (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + } + else + { + org_pos = anchor->pos + ( edge->opos - anchor->opos ); + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + + cur_pos1 = FT_PIX_ROUND( org_pos ); + delta1 = cur_pos1 + ( cur_len >> 1 ) - org_center; + if ( delta1 < 0 ) + delta1 = -delta1; + + cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; + delta2 = cur_pos2 + ( cur_len >> 1 ) - org_center; + if ( delta2 < 0 ) + delta2 = -delta2; + + edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; + edge2->pos = edge->pos + cur_len; + + AF_LOG(( "STEM: %d (opos=%.2f) to %d (opos=%.2f) " + "snapped to (%.2f) and (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + } + + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + { + AF_LOG(( "BOUND: %d (pos=%.2f) to (%.2f)\n", + edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); + edge->pos = edge[-1].pos; + } + } + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span, delta; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + + if ( has_serifs || !anchor ) + { + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Pos delta; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + delta = 1000; + + if ( edge->serif ) + { + delta = edge->serif->opos - edge->opos; + if ( delta < 0 ) + delta = -delta; + } + + if ( delta < 64 + 16 ) + { + af_latin_align_serif_edge( hints, edge->serif, edge ); + AF_LOG(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f) " + "aligned to (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge->serif - edges, edge->serif->opos / 64.0, + edge->pos / 64.0 )); + } + else if ( !anchor ) + { + AF_LOG(( "SERIF_ANCHOR: edge %d (opos=%.2f) snapped to (%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + edge->pos = FT_PIX_ROUND( edge->opos ); + anchor = edge; + } + else + { + AF_Edge before, after; + + + for ( before = edge - 1; before >= edges; before-- ) + if ( before->flags & AF_EDGE_DONE ) + break; + + for ( after = edge + 1; after < edge_limit; after++ ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges && before < edge && + after < edge_limit && after > edge ) + { + if ( after->opos == before->opos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->opos - before->opos, + after->pos - before->pos, + after->opos - before->opos ); + AF_LOG(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f) " + "from %d (opos=%.2f)\n", + edge-edges, edge->opos / 64.0, + edge->pos / 64.0, before - edges, + before->opos / 64.0 )); + } + else + { + edge->pos = anchor->pos + + ( ( edge->opos - anchor->opos + 16 ) & ~31 ); + AF_LOG(( "SERIF_LINK2: edge %d (opos=%.2f) snapped to (%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + } + } + + edge->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + edge->pos = edge[-1].pos; + + if ( edge + 1 < edge_limit && + edge[1].flags & AF_EDGE_DONE && + edge->pos > edge[1].pos ) + edge->pos = edge[1].pos; + } + } + } + + + static FT_Error + af_latin_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ) + { + FT_Error error; + int dim; + + + error = af_glyph_hints_reload( hints, outline ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ +#ifdef AF_USE_WARPER + if ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT || + AF_HINTS_DO_HORIZONTAL( hints ) ) +#else + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) +#endif + { + error = af_latin_hints_detect_features( hints, AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + error = af_latin_hints_detect_features( hints, AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + + af_latin_hints_compute_blue_edges( hints, metrics ); + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { +#ifdef AF_USE_WARPER + if ( ( dim == AF_DIMENSION_HORZ && + metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ) ) + { + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + + + af_warper_compute( &warper, hints, dim, &scale, &delta ); + af_glyph_hints_scale_dim( hints, dim, scale, delta ); + continue; + } +#endif + + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + af_latin_hint_edges( hints, (AF_Dimension)dim ); + af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* XXX: this should probably fine tuned to differentiate better between */ + /* scripts... */ + + static const AF_Script_UniRangeRec af_latin_uniranges[] = + { + AF_UNIRANGE_REC( 0x0020UL, 0x007FUL ), /* Basic Latin (no control chars) */ + AF_UNIRANGE_REC( 0x00A0UL, 0x00FFUL ), /* Latin-1 Supplement (no control chars) */ + AF_UNIRANGE_REC( 0x0100UL, 0x017FUL ), /* Latin Extended-A */ + AF_UNIRANGE_REC( 0x0180UL, 0x024FUL ), /* Latin Extended-B */ + AF_UNIRANGE_REC( 0x0250UL, 0x02AFUL ), /* IPA Extensions */ + AF_UNIRANGE_REC( 0x02B0UL, 0x02FFUL ), /* Spacing Modifier Letters */ + AF_UNIRANGE_REC( 0x0300UL, 0x036FUL ), /* Combining Diacritical Marks */ + AF_UNIRANGE_REC( 0x0370UL, 0x03FFUL ), /* Greek and Coptic */ + AF_UNIRANGE_REC( 0x0400UL, 0x04FFUL ), /* Cyrillic */ + AF_UNIRANGE_REC( 0x0500UL, 0x052FUL ), /* Cyrillic Supplement */ + AF_UNIRANGE_REC( 0x1D00UL, 0x1D7FUL ), /* Phonetic Extensions */ + AF_UNIRANGE_REC( 0x1D80UL, 0x1DBFUL ), /* Phonetic Extensions Supplement */ + AF_UNIRANGE_REC( 0x1DC0UL, 0x1DFFUL ), /* Combining Diacritical Marks Supplement */ + AF_UNIRANGE_REC( 0x1E00UL, 0x1EFFUL ), /* Latin Extended Additional */ + AF_UNIRANGE_REC( 0x1F00UL, 0x1FFFUL ), /* Greek Extended */ + AF_UNIRANGE_REC( 0x2000UL, 0x206FUL ), /* General Punctuation */ + AF_UNIRANGE_REC( 0x2070UL, 0x209FUL ), /* Superscripts and Subscripts */ + AF_UNIRANGE_REC( 0x20A0UL, 0x20CFUL ), /* Currency Symbols */ + AF_UNIRANGE_REC( 0x2150UL, 0x218FUL ), /* Number Forms */ + AF_UNIRANGE_REC( 0x2460UL, 0x24FFUL ), /* Enclosed Alphanumerics */ + AF_UNIRANGE_REC( 0x2C60UL, 0x2C7FUL ), /* Latin Extended-C */ + AF_UNIRANGE_REC( 0x2DE0UL, 0x2DFFUL ), /* Cyrillic Extended-A */ + AF_UNIRANGE_REC( 0xA640UL, 0xA69FUL ), /* Cyrillic Extended-B */ + AF_UNIRANGE_REC( 0xA720UL, 0xA7FFUL ), /* Latin Extended-D */ + AF_UNIRANGE_REC( 0xFB00UL, 0xFB06UL ), /* Alphab. Present. Forms (Latin Ligs) */ + AF_UNIRANGE_REC( 0x1D400UL, 0x1D7FFUL ), /* Mathematical Alphanumeric Symbols */ + AF_UNIRANGE_REC( 0UL, 0UL ) + }; + + + AF_DEFINE_SCRIPT_CLASS(af_latin_script_class, + AF_SCRIPT_LATIN, + af_latin_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_latin_metrics_init, + (AF_Script_ScaleMetricsFunc)af_latin_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_latin_hints_init, + (AF_Script_ApplyHintsFunc) af_latin_hints_apply + ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/aflatin.h b/android/jni/ndk_modules/freetype/src/autofit/aflatin.h new file mode 100644 index 00000000..660b10c8 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/aflatin.h @@ -0,0 +1,212 @@ +/***************************************************************************/ +/* */ +/* aflatin.h */ +/* */ +/* Auto-fitter hinting routines for latin script (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFLATIN_H__ +#define __AFLATIN_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the latin-specific script class */ + + AF_DECLARE_SCRIPT_CLASS(af_latin_script_class) + + +/* constants are given with units_per_em == 2048 in mind */ +#define AF_LATIN_CONSTANT( metrics, c ) \ + ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* + * The following declarations could be embedded in the file `aflatin.c'; + * they have been made semi-public to allow alternate script hinters to + * re-use some of them. + */ + + + /* Latin (global) metrics management */ + + enum + { + AF_LATIN_BLUE_CAPITAL_TOP, + AF_LATIN_BLUE_CAPITAL_BOTTOM, + AF_LATIN_BLUE_SMALL_F_TOP, + AF_LATIN_BLUE_SMALL_TOP, + AF_LATIN_BLUE_SMALL_BOTTOM, + AF_LATIN_BLUE_SMALL_MINOR, + + AF_LATIN_BLUE_MAX + }; + + +#define AF_LATIN_IS_TOP_BLUE( b ) ( (b) == AF_LATIN_BLUE_CAPITAL_TOP || \ + (b) == AF_LATIN_BLUE_SMALL_F_TOP || \ + (b) == AF_LATIN_BLUE_SMALL_TOP ) + +#define AF_LATIN_MAX_WIDTHS 16 +#define AF_LATIN_MAX_BLUES AF_LATIN_BLUE_MAX + + + enum + { + AF_LATIN_BLUE_ACTIVE = 1 << 0, + AF_LATIN_BLUE_TOP = 1 << 1, + AF_LATIN_BLUE_ADJUSTMENT = 1 << 2, /* used for scale adjustment */ + /* optimization */ + AF_LATIN_BLUE_FLAG_MAX + }; + + + typedef struct AF_LatinBlueRec_ + { + AF_WidthRec ref; + AF_WidthRec shoot; + FT_UInt flags; + + } AF_LatinBlueRec, *AF_LatinBlue; + + + typedef struct AF_LatinAxisRec_ + { + FT_Fixed scale; + FT_Pos delta; + + FT_UInt width_count; + AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]; + FT_Pos edge_distance_threshold; + FT_Pos standard_width; + FT_Bool extra_light; + + /* ignored for horizontal metrics */ + FT_Bool control_overshoot; + FT_UInt blue_count; + AF_LatinBlueRec blues[AF_LATIN_BLUE_MAX]; + + FT_Fixed org_scale; + FT_Pos org_delta; + + } AF_LatinAxisRec, *AF_LatinAxis; + + + typedef struct AF_LatinMetricsRec_ + { + AF_ScriptMetricsRec root; + FT_UInt units_per_em; + AF_LatinAxisRec axis[AF_DIMENSION_MAX]; + + } AF_LatinMetricsRec, *AF_LatinMetrics; + + + FT_LOCAL( FT_Error ) + af_latin_metrics_init( AF_LatinMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_latin_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ); + + FT_LOCAL( void ) + af_latin_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face, + FT_ULong charcode ); + + FT_LOCAL( void ) + af_latin_metrics_check_digits( AF_LatinMetrics metrics, + FT_Face face ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + enum + { + AF_LATIN_HINTS_HORZ_SNAP = 1 << 0, /* enable stem width snapping */ + AF_LATIN_HINTS_VERT_SNAP = 1 << 1, /* enable stem height snapping */ + AF_LATIN_HINTS_STEM_ADJUST = 1 << 2, /* enable stem width/height */ + /* adjustment */ + AF_LATIN_HINTS_MONO = 1 << 3 /* indicate monochrome */ + /* rendering */ + }; + + +#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP ) + +#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP ) + +#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST ) + +#define AF_LATIN_HINTS_DO_MONO( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO ) + + + /* + * This shouldn't normally be exported. However, other scripts might + * like to use this function as-is. + */ + FT_LOCAL( FT_Error ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /* + * This shouldn't normally be exported. However, other scripts might + * want to use this function as-is. + */ + FT_LOCAL( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /* + * This shouldn't normally be exported. However, other scripts might + * want to use this function as-is. + */ + FT_LOCAL( FT_Error ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( FT_Error ) + af_latin_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ); + +/* */ + +FT_END_HEADER + +#endif /* __AFLATIN_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/aflatin2.c b/android/jni/ndk_modules/freetype/src/autofit/aflatin2.c new file mode 100644 index 00000000..6546475a --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/aflatin2.c @@ -0,0 +1,2345 @@ +/***************************************************************************/ +/* */ +/* aflatin.c */ +/* */ +/* Auto-fitter hinting routines for latin script (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include FT_ADVANCES_H + +#include "aflatin.h" +#include "aflatin2.h" +#include "aferrors.h" + + +#ifdef AF_USE_WARPER +#include "afwarp.h" +#endif + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL_DEF( void ) + af_latin2_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + af_latin2_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face, + FT_ULong charcode ) + { + /* scan the array of segments in each direction */ + AF_GlyphHintsRec hints[1]; + + + af_glyph_hints_init( hints, face->memory ); + + metrics->axis[AF_DIMENSION_HORZ].width_count = 0; + metrics->axis[AF_DIMENSION_VERT].width_count = 0; + + { + FT_Error error; + FT_UInt glyph_index; + int dim; + AF_LatinMetricsRec dummy[1]; + AF_Scaler scaler = &dummy->root.scaler; + + + glyph_index = FT_Get_Char_Index( face, charcode ); + if ( glyph_index == 0 ) + goto Exit; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || face->glyph->outline.n_points <= 0 ) + goto Exit; + + FT_ZERO( dummy ); + + dummy->units_per_em = metrics->units_per_em; + scaler->x_scale = scaler->y_scale = 0x10000L; + scaler->x_delta = scaler->y_delta = 0; + scaler->face = face; + scaler->render_mode = FT_RENDER_MODE_NORMAL; + scaler->flags = 0; + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy ); + + error = af_glyph_hints_reload( hints, &face->glyph->outline ); + if ( error ) + goto Exit; + + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + AF_AxisHints axhints = &hints->axis[dim]; + AF_Segment seg, limit, link; + FT_UInt num_widths = 0; + + + error = af_latin2_hints_compute_segments( hints, + (AF_Dimension)dim ); + if ( error ) + goto Exit; + + af_latin2_hints_link_segments( hints, + (AF_Dimension)dim ); + + seg = axhints->segments; + limit = seg + axhints->num_segments; + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Pos dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < AF_LATIN_MAX_WIDTHS ) + axis->widths[ num_widths++ ].org = dist; + } + } + + af_sort_widths( num_widths, axis->widths ); + axis->width_count = num_widths; + } + + Exit: + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + FT_Pos stdw; + + + stdw = ( axis->width_count > 0 ) + ? axis->widths[0].org + : AF_LATIN_CONSTANT( metrics, 50 ); + + /* let's try 20% of the smallest width */ + axis->edge_distance_threshold = stdw / 5; + axis->standard_width = stdw; + axis->extra_light = 0; + } + } + + af_glyph_hints_done( hints ); + } + + + +#define AF_LATIN_MAX_TEST_CHARACTERS 12 + + + static const char af_latin2_blue_chars[AF_LATIN_MAX_BLUES][AF_LATIN_MAX_TEST_CHARACTERS+1] = + { + "THEZOCQS", + "HEZLOCUS", + "fijkdbh", + "xzroesc", + "xzroesc", + "pqgjy" + }; + + + static void + af_latin2_metrics_init_blues( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Pos flats [AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Pos rounds[AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Int num_flats; + FT_Int num_rounds; + FT_Int bb; + AF_LatinBlue blue; + FT_Error error; + AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; + FT_GlyphSlot glyph = face->glyph; + + + /* we compute the blues simply by loading each character from the */ + /* 'af_latin2_blue_chars[blues]' string, then compute its top-most or */ + /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ + + AF_LOG(( "blue zones computation\n" )); + AF_LOG(( "------------------------------------------------\n" )); + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + const char* p = af_latin2_blue_chars[bb]; + const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; + FT_Pos* blue_ref; + FT_Pos* blue_shoot; + + + AF_LOG(( "blue %3d: ", bb )); + + num_flats = 0; + num_rounds = 0; + + for ( ; p < limit && *p; p++ ) + { + FT_UInt glyph_index; + FT_Int best_point, best_y, best_first, best_last; + FT_Vector* points; + FT_Bool round; + + + AF_LOG(( "'%c'", *p )); + + /* load the character in the face -- skip unknown or empty ones */ + glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p ); + if ( glyph_index == 0 ) + continue; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || glyph->outline.n_points <= 0 ) + continue; + + /* now compute min or max point indices and coordinates */ + points = glyph->outline.points; + best_point = -1; + best_y = 0; /* make compiler happy */ + best_first = 0; /* ditto */ + best_last = 0; /* ditto */ + + { + FT_Int nn; + FT_Int first = 0; + FT_Int last = -1; + + + for ( nn = 0; nn < glyph->outline.n_contours; first = last+1, nn++ ) + { + FT_Int old_best_point = best_point; + FT_Int pp; + + + last = glyph->outline.contours[nn]; + + /* Avoid single-point contours since they are never rasterized. */ + /* In some fonts, they correspond to mark attachment points */ + /* which are way outside of the glyph's real outline. */ + if ( last == first ) + continue; + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y > best_y ) + { + best_point = pp; + best_y = points[pp].y; + } + } + else + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y < best_y ) + { + best_point = pp; + best_y = points[pp].y; + } + } + + if ( best_point != old_best_point ) + { + best_first = first; + best_last = last; + } + } + AF_LOG(( "%5d", best_y )); + } + + /* now check whether the point belongs to a straight or round */ + /* segment; we first need to find in which contour the extremum */ + /* lies, then inspect its previous and next points */ + { + FT_Int start, end, prev, next; + FT_Pos dist; + + + /* now look for the previous and next points that are not on the */ + /* same Y coordinate. Threshold the `closeness'... */ + start = end = best_point; + + do + { + prev = start-1; + if ( prev < best_first ) + prev = best_last; + + dist = points[prev].y - best_y; + if ( dist < -5 || dist > 5 ) + break; + + start = prev; + + } while ( start != best_point ); + + do + { + next = end+1; + if ( next > best_last ) + next = best_first; + + dist = points[next].y - best_y; + if ( dist < -5 || dist > 5 ) + break; + + end = next; + + } while ( end != best_point ); + + /* now, set the `round' flag depending on the segment's kind */ + round = FT_BOOL( + FT_CURVE_TAG( glyph->outline.tags[start] ) != FT_CURVE_TAG_ON || + FT_CURVE_TAG( glyph->outline.tags[ end ] ) != FT_CURVE_TAG_ON ); + + AF_LOG(( "%c ", round ? 'r' : 'f' )); + } + + if ( round ) + rounds[num_rounds++] = best_y; + else + flats[num_flats++] = best_y; + } + + AF_LOG(( "\n" )); + + if ( num_flats == 0 && num_rounds == 0 ) + { + /* + * we couldn't find a single glyph to compute this blue zone, + * we will simply ignore it then + */ + AF_LOG(( "empty\n" )); + continue; + } + + /* we have computed the contents of the `rounds' and `flats' tables, */ + /* now determine the reference and overshoot position of the blue -- */ + /* we simply take the median value after a simple sort */ + af_sort_pos( num_rounds, rounds ); + af_sort_pos( num_flats, flats ); + + blue = & axis->blues[axis->blue_count]; + blue_ref = & blue->ref.org; + blue_shoot = & blue->shoot.org; + + axis->blue_count++; + + if ( num_flats == 0 ) + { + *blue_ref = + *blue_shoot = rounds[num_rounds / 2]; + } + else if ( num_rounds == 0 ) + { + *blue_ref = + *blue_shoot = flats[num_flats / 2]; + } + else + { + *blue_ref = flats[num_flats / 2]; + *blue_shoot = rounds[num_rounds / 2]; + } + + /* there are sometimes problems: if the overshoot position of top */ + /* zones is under its reference position, or the opposite for bottom */ + /* zones. We must thus check everything there and correct the errors */ + if ( *blue_shoot != *blue_ref ) + { + FT_Pos ref = *blue_ref; + FT_Pos shoot = *blue_shoot; + FT_Bool over_ref = FT_BOOL( shoot > ref ); + + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref ) + *blue_shoot = *blue_ref = ( shoot + ref ) / 2; + } + + blue->flags = 0; + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + blue->flags |= AF_LATIN_BLUE_TOP; + + /* + * The following flags is used later to adjust the y and x scales + * in order to optimize the pixel grid alignment of the top of small + * letters. + */ + if ( bb == AF_LATIN_BLUE_SMALL_TOP ) + blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; + + AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot )); + } + + return; + } + + + FT_LOCAL_DEF( void ) + af_latin2_metrics_check_digits( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_UInt i; + FT_Bool started = 0, same_width = 1; + FT_Fixed advance, old_advance = 0; + + + /* check whether all ASCII digits have the same advance width; */ + /* digit `0' is 0x30 in all supported charmaps */ + for ( i = 0x30; i <= 0x39; i++ ) + { + FT_UInt glyph_index; + + + glyph_index = FT_Get_Char_Index( face, i ); + if ( glyph_index == 0 ) + continue; + + if ( FT_Get_Advance( face, glyph_index, + FT_LOAD_NO_SCALE | + FT_LOAD_NO_HINTING | + FT_LOAD_IGNORE_TRANSFORM, + &advance ) ) + continue; + + if ( started ) + { + if ( advance != old_advance ) + { + same_width = 0; + break; + } + } + else + { + old_advance = advance; + started = 1; + } + } + + metrics->root.digits_have_same_width = same_width; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin2_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Error error = AF_Err_Ok; + FT_CharMap oldmap = face->charmap; + FT_UInt ee; + + static const FT_Encoding latin_encodings[] = + { + FT_ENCODING_UNICODE, + FT_ENCODING_APPLE_ROMAN, + FT_ENCODING_ADOBE_STANDARD, + FT_ENCODING_ADOBE_LATIN_1, + FT_ENCODING_NONE /* end of list */ + }; + + + metrics->units_per_em = face->units_per_EM; + + /* do we have a latin charmap in there? */ + for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ ) + { + error = FT_Select_Charmap( face, latin_encodings[ee] ); + if ( !error ) + break; + } + + if ( !error ) + { + /* For now, compute the standard width and height from the `o'. */ + af_latin2_metrics_init_widths( metrics, face, 'o' ); + af_latin2_metrics_init_blues( metrics, face ); + af_latin2_metrics_check_digits( metrics, face ); + } + + FT_Set_Charmap( face, oldmap ); + return AF_Err_Ok; + } + + + static void + af_latin2_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + FT_Fixed scale; + FT_Pos delta; + AF_LatinAxis axis; + FT_UInt nn; + + + if ( dim == AF_DIMENSION_HORZ ) + { + scale = scaler->x_scale; + delta = scaler->x_delta; + } + else + { + scale = scaler->y_scale; + delta = scaler->y_delta; + } + + axis = &metrics->axis[dim]; + + if ( axis->org_scale == scale && axis->org_delta == delta ) + return; + + axis->org_scale = scale; + axis->org_delta = delta; + + /* + * correct Y scale to optimize the alignment of the top of small + * letters to the pixel grid + */ + if ( dim == AF_DIMENSION_VERT ) + { + AF_LatinAxis vaxis = &metrics->axis[AF_DIMENSION_VERT]; + AF_LatinBlue blue = NULL; + + + for ( nn = 0; nn < vaxis->blue_count; nn++ ) + { + if ( vaxis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) + { + blue = &vaxis->blues[nn]; + break; + } + } + + if ( blue ) + { + FT_Pos scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); + FT_Pos fitted = ( scaled + 40 ) & ~63; + +#if 1 + if ( scaled != fitted ) + { + scale = FT_MulDiv( scale, fitted, scaled ); + AF_LOG(( "== scaled x-top = %.2g fitted = %.2g, scaling = %.4g\n", scaled/64.0, fitted/64.0, (fitted*1.0)/scaled )); + } +#endif + } + } + + axis->scale = scale; + axis->delta = delta; + + if ( dim == AF_DIMENSION_HORZ ) + { + metrics->root.scaler.x_scale = scale; + metrics->root.scaler.x_delta = delta; + } + else + { + metrics->root.scaler.y_scale = scale; + metrics->root.scaler.y_delta = delta; + } + + /* scale the standard widths */ + for ( nn = 0; nn < axis->width_count; nn++ ) + { + AF_Width width = axis->widths + nn; + + + width->cur = FT_MulFix( width->org, scale ); + width->fit = width->cur; + } + + /* an extra-light axis corresponds to a standard width that is */ + /* smaller than 0.75 pixels */ + axis->extra_light = + (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); + + if ( dim == AF_DIMENSION_VERT ) + { + /* scale the blue zones */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = &axis->blues[nn]; + FT_Pos dist; + + + blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; + blue->ref.fit = blue->ref.cur; + blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; + blue->shoot.fit = blue->shoot.cur; + blue->flags &= ~AF_LATIN_BLUE_ACTIVE; + + /* a blue zone is only active if it is less than 3/4 pixels tall */ + dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); + if ( dist <= 48 && dist >= -48 ) + { + FT_Pos delta1, delta2; + + delta1 = blue->shoot.org - blue->ref.org; + delta2 = delta1; + if ( delta1 < 0 ) + delta2 = -delta2; + + delta2 = FT_MulFix( delta2, scale ); + + if ( delta2 < 32 ) + delta2 = 0; + else if ( delta2 < 64 ) + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); + else + delta2 = FT_PIX_ROUND( delta2 ); + + if ( delta1 < 0 ) + delta2 = -delta2; + + blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); + blue->shoot.fit = blue->ref.fit + delta2; + + AF_LOG(( ">> activating blue zone %d: ref.cur=%.2g ref.fit=%.2g shoot.cur=%.2g shoot.fit=%.2g\n", + nn, blue->ref.cur/64.0, blue->ref.fit/64.0, + blue->shoot.cur/64.0, blue->shoot.fit/64.0 )); + + blue->flags |= AF_LATIN_BLUE_ACTIVE; + } + } + } + } + + + FT_LOCAL_DEF( void ) + af_latin2_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + metrics->root.scaler.render_mode = scaler->render_mode; + metrics->root.scaler.face = scaler->face; + + af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define SORT_SEGMENTS + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Memory memory = hints->memory; + FT_Error error = AF_Err_Ok; + AF_Segment segment = NULL; + AF_SegmentRec seg0; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Direction major_dir, segment_dir; + + + FT_ZERO( &seg0 ); + seg0.score = 32000; + seg0.flags = AF_EDGE_NORMAL; + + major_dir = (AF_Direction)FT_ABS( axis->major_dir ); + segment_dir = major_dir; + + axis->num_segments = 0; + + /* set up (u,v) in each point */ + if ( dim == AF_DIMENSION_HORZ ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fx; + point->v = point->fy; + } + } + else + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fy; + point->v = point->fx; + } + } + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point start = point; + AF_Point last = point->prev; + + + if ( point == last ) /* skip singletons -- just in case */ + continue; + + /* already on an edge ?, backtrack to find its start */ + if ( FT_ABS( point->in_dir ) == major_dir ) + { + point = point->prev; + + while ( point->in_dir == start->in_dir ) + point = point->prev; + } + else /* otherwise, find first segment start, if any */ + { + while ( FT_ABS( point->out_dir ) != major_dir ) + { + point = point->next; + + if ( point == start ) + goto NextContour; + } + } + + start = point; + + for (;;) + { + AF_Point first; + FT_Pos min_u, min_v, max_u, max_v; + + /* we're at the start of a new segment */ + FT_ASSERT( FT_ABS( point->out_dir ) == major_dir && + point->in_dir != point->out_dir ); + first = point; + + min_u = max_u = point->u; + min_v = max_v = point->v; + + point = point->next; + + while ( point->out_dir == first->out_dir ) + { + point = point->next; + + if ( point->u < min_u ) + min_u = point->u; + + if ( point->u > max_u ) + max_u = point->u; + } + + if ( point->v < min_v ) + min_v = point->v; + + if ( point->v > max_v ) + max_v = point->v; + + /* record new segment */ + error = af_axis_hints_new_segment( axis, memory, &segment ); + if ( error ) + goto Exit; + + segment[0] = seg0; + segment->dir = first->out_dir; + segment->first = first; + segment->last = point; + segment->contour = contour; + segment->pos = (FT_Short)(( min_u + max_u ) >> 1); + segment->min_coord = (FT_Short) min_v; + segment->max_coord = (FT_Short) max_v; + segment->height = (FT_Short)(max_v - min_v); + + /* a segment is round if it doesn't have successive */ + /* on-curve points. */ + { + AF_Point pt = first; + AF_Point last = point; + AF_Flags f0 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); + AF_Flags f1; + + + segment->flags &= ~AF_EDGE_ROUND; + + for ( ; pt != last; f0 = f1 ) + { + pt = pt->next; + f1 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); + + if ( !f0 && !f1 ) + break; + + if ( pt == last ) + segment->flags |= AF_EDGE_ROUND; + } + } + + /* this can happen in the case of a degenerate contour + * e.g. a 2-point vertical contour + */ + if ( point == start ) + break; + + /* jump to the start of the next segment, if any */ + while ( FT_ABS(point->out_dir) != major_dir ) + { + point = point->next; + + if ( point == start ) + goto NextContour; + } + } + + NextContour: + ; + } /* contours */ + + /* now slightly increase the height of segments when this makes */ + /* sense -- this is used to better detect and ignore serifs */ + { + AF_Segment segments = axis->segments; + AF_Segment segments_end = segments + axis->num_segments; + + + for ( segment = segments; segment < segments_end; segment++ ) + { + AF_Point first = segment->first; + AF_Point last = segment->last; + AF_Point p; + FT_Pos first_v = first->v; + FT_Pos last_v = last->v; + + + if ( first == last ) + continue; + + if ( first_v < last_v ) + { + p = first->prev; + if ( p->v < first_v ) + segment->height = (FT_Short)( segment->height + + ( ( first_v - p->v ) >> 1 ) ); + + p = last->next; + if ( p->v > last_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - last_v ) >> 1 ) ); + } + else + { + p = first->prev; + if ( p->v > first_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - first_v ) >> 1 ) ); + + p = last->next; + if ( p->v < last_v ) + segment->height = (FT_Short)( segment->height + + ( ( last_v - p->v ) >> 1 ) ); + } + } + } + +#ifdef AF_SORT_SEGMENTS + /* place all segments with a negative direction to the start + * of the array, used to speed up segment linking later... + */ + { + AF_Segment segments = axis->segments; + FT_UInt count = axis->num_segments; + FT_UInt ii, jj; + + for (ii = 0; ii < count; ii++) + { + if ( segments[ii].dir > 0 ) + { + for (jj = ii+1; jj < count; jj++) + { + if ( segments[jj].dir < 0 ) + { + AF_SegmentRec tmp; + + tmp = segments[ii]; + segments[ii] = segments[jj]; + segments[jj] = tmp; + + break; + } + } + + if ( jj == count ) + break; + } + } + axis->mid_segments = ii; + } +#endif + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin2_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; +#ifdef AF_SORT_SEGMENTS + AF_Segment segment_mid = segments + axis->mid_segments; +#endif + FT_Pos len_threshold, len_score; + AF_Segment seg1, seg2; + + + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + if ( len_threshold == 0 ) + len_threshold = 1; + + len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); + +#ifdef AF_SORT_SEGMENTS + for ( seg1 = segments; seg1 < segment_mid; seg1++ ) + { + if ( seg1->dir != axis->major_dir || seg1->first == seg1->last ) + continue; + + for ( seg2 = segment_mid; seg2 < segment_limit; seg2++ ) +#else + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + /* the fake segments are introduced to hint the metrics -- */ + /* we must never link them to anything */ + if ( seg1->dir != axis->major_dir || seg1->first == seg1->last ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos ) +#endif + { + FT_Pos pos1 = seg1->pos; + FT_Pos pos2 = seg2->pos; + FT_Pos dist = pos2 - pos1; + + + if ( dist < 0 ) + continue; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len, score; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= len_threshold ) + { + score = dist + len_score / len; + if ( score < seg1->score ) + { + seg1->score = score; + seg1->link = seg2; + } + + if ( score < seg2->score ) + { + seg2->score = score; + seg2->link = seg1; + } + } + } + } + } +#if 0 + } +#endif + + /* now, compute the `serif' segments */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + if ( seg2->link != seg1 ) + { + seg1->link = 0; + seg1->serif = seg2->link; + } + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = AF_Err_Ok; + FT_Memory memory = hints->memory; + AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + AF_Direction up_dir; + FT_Fixed scale; + FT_Pos edge_distance_threshold; + FT_Pos segment_length_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP + : AF_DIR_RIGHT; + + /* + * We want to ignore very small (mostly serif) segments, we do that + * by ignoring those that whose length is less than a given fraction + * of the standard width. If there is no standard width, we ignore + * those that are less than a given size in pixels + * + * also, unlink serif segments that are linked to segments farther + * than 50% of the standard width + */ + if ( dim == AF_DIMENSION_HORZ ) + { + if ( laxis->width_count > 0 ) + segment_length_threshold = (laxis->standard_width * 10 ) >> 4; + else + segment_length_threshold = FT_DivFix( 64, hints->y_scale ); + } + else + segment_length_threshold = 0; + + /*********************************************************************/ + /* */ + /* We will begin by generating a sorted table of edges for the */ + /* current direction. To do so, we simply scan each segment and try */ + /* to find an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which will be processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the edges table is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = 64 / 4; + + edge_distance_threshold = FT_DivFix( edge_distance_threshold, + scale ); + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = 0; + FT_Int ee; + + + if ( seg->height < segment_length_threshold ) + continue; + + /* A special case for serif edges: If they are smaller than */ + /* 1.5 pixels we ignore them. */ + if ( seg->serif ) + { + FT_Pos dist = seg->serif->pos - seg->pos; + + if (dist < 0) + dist = -dist; + + if (dist >= laxis->standard_width >> 1) + { + /* unlink this serif, it is too distant from its reference stem */ + seg->serif = NULL; + } + else if ( 2*seg->height < 3 * segment_length_threshold ) + continue; + } + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && edge->dir == seg->dir ) + { + found = edge; + break; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, seg->dir, memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->fpos = seg->pos; + edge->dir = seg->dir; + edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); + seg->edge_next = seg; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + + /*********************************************************************/ + /* */ + /* Good, we will now compute each edge's properties according to */ + /* segments found on its position. Basically, these are: */ + /* */ + /* - edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /*********************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + + /* + * Note that removing this loop and setting the `edge' field of each + * segment directly in the code above slows down execution speed for + * some reasons on platforms like the Sun. + */ + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now, compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ + FT_Pos ups = 0; /* number of upwards segments */ + FT_Pos downs = 0; /* number of downwards segments */ + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + + /* check for segment direction */ + if ( seg->dir == up_dir ) + ups += seg->max_coord-seg->min_coord; + else + downs += seg->max_coord-seg->min_coord; + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = (FT_Bool)( seg->serif && + seg->serif->edge && + seg->serif->edge != edge ); + + if ( ( seg->link && seg->link->edge != NULL ) || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = seg->pos - seg2->pos; + if ( seg_delta < 0 ) + seg_delta = -seg_delta; + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + +#if 0 + /* set the edge's main direction */ + edge->dir = AF_DIR_NONE; + + if ( ups > downs ) + edge->dir = (FT_Char)up_dir; + + else if ( ups < downs ) + edge->dir = (FT_Char)-up_dir; + + else if ( ups == downs ) + edge->dir = 0; /* both up and down! */ +#endif + + /* gets rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = 0; + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_latin2_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_latin2_hints_link_segments( hints, dim ); + + error = af_latin2_hints_compute_edges( hints, dim ); + } + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin2_hints_compute_blue_edges( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + AF_AxisHints axis = &hints->axis[ AF_DIMENSION_VERT ]; + AF_Edge edge = axis->edges; + AF_Edge edge_limit = edge + axis->num_edges; + AF_LatinAxis latin = &metrics->axis[ AF_DIMENSION_VERT ]; + FT_Fixed scale = latin->scale; + FT_Pos best_dist0; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale ); + + if ( best_dist0 > 64 / 2 ) + best_dist0 = 64 / 2; + + /* compute which blue zones are active, i.e. have their scaled */ + /* size < 3/4 pixels */ + + /* for each horizontal edge search the blue zone which is closest */ + for ( ; edge < edge_limit; edge++ ) + { + FT_Int bb; + AF_Width best_blue = NULL; + FT_Pos best_dist = best_dist0; + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + AF_LatinBlue blue = latin->blues + bb; + FT_Bool is_top_blue, is_major_dir; + + + /* skip inactive blue zones (i.e., those that are too small) */ + if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + /* if it is a top zone, check for right edges -- if it is a bottom */ + /* zone, check for left edges */ + /* */ + /* of course, that's for TrueType */ + is_top_blue = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 ); + is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); + + /* if it is a top zone, the edge must be against the major */ + /* direction; if it is a bottom zone, it must be in the major */ + /* direction */ + if ( is_top_blue ^ is_major_dir ) + { + FT_Pos dist; + AF_Width compare; + + + /* if it's a rounded edge, compare it to the overshoot position */ + /* if it's a flat edge, compare it to the reference position */ + if ( edge->flags & AF_EDGE_ROUND ) + compare = &blue->shoot; + else + compare = &blue->ref; + + dist = edge->fpos - compare->org; + if (dist < 0) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = compare; + } + +#if 0 + /* now, compare it to the overshoot position if the edge is */ + /* rounded, and if the edge is over the reference position of a */ + /* top zone, or under the reference position of a bottom zone */ + if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) + { + FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); + + + if ( is_top_blue ^ is_under_ref ) + { + blue = latin->blues + bb; + dist = edge->fpos - blue->shoot.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = & blue->shoot; + } + } + } +#endif + } + } + + if ( best_blue ) + edge->blue_edge = best_blue; + } + } + + + static FT_Error + af_latin2_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + FT_Face face = metrics->root.scaler.face; + + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics ); + + /* + * correct x_scale and y_scale if needed, since they may have + * been modified `af_latin2_metrics_scale_dim' above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + +#if 0 /* #ifdef AF_USE_WARPER */ + if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) + { + metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; + } +#endif + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels only if we don't use the `light' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + /* + * In `light' hinting mode we disable horizontal hinting completely. + * We also do it if the face is italic. + */ + if ( mode == FT_RENDER_MODE_LIGHT || + (face->style_flags & FT_STYLE_FLAG_ITALIC) != 0 ) + scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* snap a given width in scaled coordinates to one of the */ + /* current standard widths */ + + static FT_Pos + af_latin2_snap_width( AF_Width widths, + FT_Int count, + FT_Pos width ) + { + int n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* compute the snapped width of a given stem */ + + static FT_Pos + af_latin2_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + AF_Edge_Flags base_flags, + AF_Edge_Flags stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; + AF_LatinAxis axis = & metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); + + + FT_UNUSED(base_flags); + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || + axis->extra_light ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + /* leave the widths of serifs alone */ + + if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) + goto Done_Width; + +#if 0 + else if ( ( base_flags & AF_EDGE_ROUND ) ) + { + if ( dist < 80 ) + dist = 64; + } + else if ( dist < 56 ) + dist = 56; +#endif + if ( axis->width_count > 0 ) + { + FT_Pos delta; + + + /* compare to standard width */ + if ( axis->width_count > 0 ) + { + delta = dist - axis->widths[0].cur; + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 3 * 64 ) + { + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + + else if ( delta < 32 ) + dist += 10; + + else if ( delta < 54 ) + dist += 54; + + else + dist += delta; + } + else + dist = ( dist + 32 ) & ~63; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + FT_Pos org_dist = dist; + + + dist = af_latin2_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + { + /* We only round to an integer width if the corresponding */ + /* distortion is less than 1/4 pixel. Otherwise this */ + /* makes everything worse since the diagonals, which are */ + /* not hinted, appear a lot bolder or thinner than the */ + /* vertical stems. */ + + FT_Int delta; + + + dist = ( dist + 22 ) & ~63; + delta = dist - org_dist; + if ( delta < 0 ) + delta = -delta; + + if (delta >= 16) + { + dist = org_dist; + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + } + } + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* align one stem edge relative to the previous stem edge */ + + static void + af_latin2_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_latin2_compute_stem_width( + hints, dim, dist, + (AF_Edge_Flags)base_edge->flags, + (AF_Edge_Flags)stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + + AF_LOG(( "LINK: edge %d (opos=%.2f) linked to (%.2f), " + "dist was %.2f, now %.2f\n", + stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0, + stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); + } + + + static void + af_latin2_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + (serif->opos - base->opos); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + af_latin2_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + AF_Edge anchor = 0; + FT_Int has_serifs = 0; + FT_Pos anchor_drift = 0; + + + + AF_LOG(( "==== hinting %s edges =====\n", dim == AF_DIMENSION_HORZ ? "vertical" : "horizontal" )); + + /* we begin by aligning all stems relative to the blue zone */ + /* if needed -- that's only for horizontal edges */ + + if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Width blue; + AF_Edge edge1, edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + blue = edge->blue_edge; + edge1 = NULL; + edge2 = edge->link; + + if ( blue ) + { + edge1 = edge; + } + else if ( edge2 && edge2->blue_edge ) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + + AF_LOG(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), " + "was (%.2f)\n", + edge1-edges, edge1->opos / 64.0, blue->fit / 64.0, + edge1->pos / 64.0 )); + + edge1->pos = blue->fit; + edge1->flags |= AF_EDGE_DONE; + + if ( edge2 && !edge2->blue_edge ) + { + af_latin2_align_linked_edge( hints, dim, edge1, edge2 ); + edge2->flags |= AF_EDGE_DONE; + } + + if ( !anchor ) + { + anchor = edge; + + anchor_drift = (anchor->pos - anchor->opos); + if (edge2) + anchor_drift = (anchor_drift + (edge2->pos - edge2->opos)) >> 1; + } + } + } + + /* now we will align all stem edges, trying to maintain the */ + /* relative order of stems in the glyph */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + has_serifs++; + continue; + } + + /* now align the stem */ + + /* this should not happen, but it's better to be safe */ + if ( edge2->blue_edge ) + { + AF_LOG(( "ASSERTION FAILED for edge %d\n", edge2-edges )); + + af_latin2_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + continue; + } + + if ( !anchor ) + { + FT_Pos org_len, org_center, cur_len; + FT_Pos cur_pos1, error1, error2, u_off, d_off; + + + org_len = edge2->opos - edge->opos; + cur_len = af_latin2_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + if ( cur_len <= 64 ) + u_off = d_off = 32; + else + { + u_off = 38; + d_off = 26; + } + + if ( cur_len < 96 ) + { + org_center = edge->opos + ( org_len >> 1 ); + + cur_pos1 = FT_PIX_ROUND( org_center ); + + error1 = org_center - ( cur_pos1 - u_off ); + if ( error1 < 0 ) + error1 = -error1; + + error2 = org_center - ( cur_pos1 + d_off ); + if ( error2 < 0 ) + error2 = -error2; + + if ( error1 < error2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = edge->pos + cur_len; + } + else + edge->pos = FT_PIX_ROUND( edge->opos ); + + AF_LOG(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f) " + "snapped to (%.2f) (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + anchor = edge; + + edge->flags |= AF_EDGE_DONE; + + af_latin2_align_linked_edge( hints, dim, edge, edge2 ); + + edge2->flags |= AF_EDGE_DONE; + + anchor_drift = ( (anchor->pos - anchor->opos) + + (edge2->pos - edge2->opos)) >> 1; + + AF_LOG(( "DRIFT: %.2f\n", anchor_drift/64.0 )); + } + else + { + FT_Pos org_pos, org_len, org_center, cur_center, cur_len; + FT_Pos org_left, org_right; + + + org_pos = edge->opos + anchor_drift; + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin2_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + + org_left = org_pos + ((org_len - cur_len) >> 1); + org_right = org_pos + ((org_len + cur_len) >> 1); + + AF_LOG(( "ALIGN: left=%.2f right=%.2f ", org_left/64.0, org_right/64.0 )); + cur_center = org_center; + + if ( edge2->flags & AF_EDGE_DONE ) + { + AF_LOG(( "\n" )); + edge->pos = edge2->pos - cur_len; + } + else + { + /* we want to compare several displacement, and choose + * the one that increases fitness while minimizing + * distortion as well + */ + FT_Pos displacements[6], scores[6], org, fit, delta; + FT_UInt count = 0; + + /* note: don't even try to fit tiny stems */ + if ( cur_len < 32 ) + { + AF_LOG(( "tiny stem\n" )); + goto AlignStem; + } + + /* if the span is within a single pixel, don't touch it */ + if ( FT_PIX_FLOOR(org_left) == FT_PIX_CEIL(org_right) ) + { + AF_LOG(( "single pixel stem\n" )); + goto AlignStem; + } + + if (cur_len <= 96) + { + /* we want to avoid the absolute worst case which is + * when the left and right edges of the span each represent + * about 50% of the gray. we'd better want to change this + * to 25/75%, since this is much more pleasant to the eye with + * very acceptable distortion + */ + FT_Pos frac_left = (org_left) & 63; + FT_Pos frac_right = (org_right) & 63; + + if ( frac_left >= 22 && frac_left <= 42 && + frac_right >= 22 && frac_right <= 42 ) + { + org = frac_left; + fit = (org <= 32) ? 16 : 48; + delta = FT_ABS(fit - org); + displacements[count] = fit - org; + scores[count++] = delta; + AF_LOG(( "dispA=%.2f (%d) ", (fit - org)/64.0, delta )); + + org = frac_right; + fit = (org <= 32) ? 16 : 48; + delta = FT_ABS(fit - org); + displacements[count] = fit - org; + scores[count++] = delta; + AF_LOG(( "dispB=%.2f (%d) ", (fit - org)/64.0, delta )); + } + } + + /* snapping the left edge to the grid */ + org = org_left; + fit = FT_PIX_ROUND(org); + delta = FT_ABS(fit - org); + displacements[count] = fit - org; + scores[count++] = delta; + AF_LOG(( "dispC=%.2f (%d) ", (fit - org)/64.0, delta )); + + /* snapping the right edge to the grid */ + org = org_right; + fit = FT_PIX_ROUND(org); + delta = FT_ABS(fit - org); + displacements[count] = fit - org; + scores[count++] = delta; + AF_LOG(( "dispD=%.2f (%d) ", (fit - org)/64.0, delta )); + + /* now find the best displacement */ + { + FT_Pos best_score = scores[0]; + FT_Pos best_disp = displacements[0]; + FT_UInt nn; + + for (nn = 1; nn < count; nn++) + { + if (scores[nn] < best_score) + { + best_score = scores[nn]; + best_disp = displacements[nn]; + } + } + + cur_center = org_center + best_disp; + } + AF_LOG(( "\n" )); + } + + AlignStem: + edge->pos = cur_center - (cur_len >> 1); + edge2->pos = edge->pos + cur_len; + + AF_LOG(( "STEM1: %d (opos=%.2f) to %d (opos=%.2f) " + "snapped to (%.2f) and (%.2f), org_len = %.2f cur_len=%.2f\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0, + org_len / 64.0, cur_len / 64.0 )); + + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + { + AF_LOG(( "BOUND: %d (pos=%.2f) to (%.2f)\n", + edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); + edge->pos = edge[-1].pos; + } + } + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + +#if 0 + { + FT_Int n_edges = edge_limit - edges; + + + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span, delta; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + } +#endif + + if ( has_serifs || !anchor ) + { + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Pos delta; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + delta = 1000; + + if ( edge->serif ) + { + delta = edge->serif->opos - edge->opos; + if ( delta < 0 ) + delta = -delta; + } + + if ( delta < 64 + 16 ) + { + af_latin2_align_serif_edge( hints, edge->serif, edge ); + AF_LOG(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f) " + "aligned to (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge->serif - edges, edge->serif->opos / 64.0, + edge->pos / 64.0 )); + } + else if ( !anchor ) + { + AF_LOG(( "SERIF_ANCHOR: edge %d (opos=%.2f) snapped to (%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + edge->pos = FT_PIX_ROUND( edge->opos ); + anchor = edge; + } + else + { + AF_Edge before, after; + + + for ( before = edge - 1; before >= edges; before-- ) + if ( before->flags & AF_EDGE_DONE ) + break; + + for ( after = edge + 1; after < edge_limit; after++ ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges && before < edge && + after < edge_limit && after > edge ) + { + if ( after->opos == before->opos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->opos - before->opos, + after->pos - before->pos, + after->opos - before->opos ); + AF_LOG(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f) from %d (opos=%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0, before - edges, before->opos / 64.0 )); + } + else + { + edge->pos = anchor->pos + (( edge->opos - anchor->opos + 16) & ~31); + + AF_LOG(( "SERIF_LINK2: edge %d (opos=%.2f) snapped to (%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + } + } + + edge->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + edge->pos = edge[-1].pos; + + if ( edge + 1 < edge_limit && + edge[1].flags & AF_EDGE_DONE && + edge->pos > edge[1].pos ) + edge->pos = edge[1].pos; + } + } + } + + + static FT_Error + af_latin2_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ) + { + FT_Error error; + int dim; + + + error = af_glyph_hints_reload( hints, outline ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ +#ifdef AF_USE_WARPER + if ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT || + AF_HINTS_DO_HORIZONTAL( hints ) ) +#else + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) +#endif + { + error = af_latin2_hints_detect_features( hints, AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + error = af_latin2_hints_detect_features( hints, AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + + af_latin2_hints_compute_blue_edges( hints, metrics ); + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { +#ifdef AF_USE_WARPER + if ( ( dim == AF_DIMENSION_HORZ && + metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ) ) + { + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + + + af_warper_compute( &warper, hints, dim, &scale, &delta ); + af_glyph_hints_scale_dim( hints, dim, scale, delta ); + continue; + } +#endif + + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + af_latin2_hint_edges( hints, (AF_Dimension)dim ); + af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static const AF_Script_UniRangeRec af_latin2_uniranges[] = + { + AF_UNIRANGE_REC( 32UL, 127UL ), /* XXX: TODO: Add new Unicode ranges here! */ + AF_UNIRANGE_REC( 160UL, 255UL ), + AF_UNIRANGE_REC( 0UL, 0UL ) + }; + + + AF_DEFINE_SCRIPT_CLASS(af_latin2_script_class, + AF_SCRIPT_LATIN2, + af_latin2_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_latin2_metrics_init, + (AF_Script_ScaleMetricsFunc)af_latin2_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_latin2_hints_init, + (AF_Script_ApplyHintsFunc) af_latin2_hints_apply + ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/aflatin2.h b/android/jni/ndk_modules/freetype/src/autofit/aflatin2.h new file mode 100644 index 00000000..925c6214 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/aflatin2.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* aflatin2.h */ +/* */ +/* Auto-fitter hinting routines for latin script (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFLATIN2_H__ +#define __AFLATIN2_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the latin-specific script class */ + + AF_DECLARE_SCRIPT_CLASS(af_latin2_script_class) + +/* */ + +FT_END_HEADER + +#endif /* __AFLATIN_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afloader.c b/android/jni/ndk_modules/freetype/src/autofit/afloader.c new file mode 100644 index 00000000..6dd9f2a3 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afloader.c @@ -0,0 +1,539 @@ +/***************************************************************************/ +/* */ +/* afloader.c */ +/* */ +/* Auto-fitter glyph loading routines (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afloader.h" +#include "afhints.h" +#include "afglobal.h" +#include "aferrors.h" + + + FT_LOCAL_DEF( FT_Error ) + af_loader_init( AF_Loader loader, + FT_Memory memory ) + { + FT_ZERO( loader ); + + af_glyph_hints_init( &loader->hints, memory ); +#ifdef AF_DEBUG + _af_debug_hints = &loader->hints; +#endif + return FT_GlyphLoader_New( memory, &loader->gloader ); + } + + + FT_LOCAL_DEF( FT_Error ) + af_loader_reset( AF_Loader loader, + FT_Face face ) + { + FT_Error error = AF_Err_Ok; + + + loader->face = face; + loader->globals = (AF_FaceGlobals)face->autohint.data; + + FT_GlyphLoader_Rewind( loader->gloader ); + + if ( loader->globals == NULL ) + { + error = af_face_globals_new( face, &loader->globals ); + if ( !error ) + { + face->autohint.data = + (FT_Pointer)loader->globals; + face->autohint.finalizer = + (FT_Generic_Finalizer)af_face_globals_free; + } + } + + return error; + } + + + FT_LOCAL_DEF( void ) + af_loader_done( AF_Loader loader ) + { + af_glyph_hints_done( &loader->hints ); + + loader->face = NULL; + loader->globals = NULL; + +#ifdef AF_DEBUG + _af_debug_hints = NULL; +#endif + FT_GlyphLoader_Done( loader->gloader ); + loader->gloader = NULL; + } + + + static FT_Error + af_loader_load_g( AF_Loader loader, + AF_Scaler scaler, + FT_UInt glyph_index, + FT_Int32 load_flags, + FT_UInt depth ) + { + FT_Error error; + FT_Face face = loader->face; + FT_GlyphLoader gloader = loader->gloader; + AF_ScriptMetrics metrics = loader->metrics; + AF_GlyphHints hints = &loader->hints; + FT_GlyphSlot slot = face->glyph; + FT_Slot_Internal internal = slot->internal; + + + error = FT_Load_Glyph( face, glyph_index, load_flags ); + if ( error ) + goto Exit; + + loader->transformed = internal->glyph_transformed; + if ( loader->transformed ) + { + FT_Matrix inverse; + + + loader->trans_matrix = internal->glyph_matrix; + loader->trans_delta = internal->glyph_delta; + + inverse = loader->trans_matrix; + FT_Matrix_Invert( &inverse ); + FT_Vector_Transform( &loader->trans_delta, &inverse ); + } + + /* set linear metrics */ + slot->linearHoriAdvance = slot->metrics.horiAdvance; + slot->linearVertAdvance = slot->metrics.vertAdvance; + + switch ( slot->format ) + { + case FT_GLYPH_FORMAT_OUTLINE: + /* translate the loaded glyph when an internal transform is needed */ + if ( loader->transformed ) + FT_Outline_Translate( &slot->outline, + loader->trans_delta.x, + loader->trans_delta.y ); + + /* copy the outline points in the loader's current */ + /* extra points which is used to keep original glyph coordinates */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, + slot->outline.n_points + 4, + slot->outline.n_contours ); + if ( error ) + goto Exit; + + FT_ARRAY_COPY( gloader->current.outline.points, + slot->outline.points, + slot->outline.n_points ); + + FT_ARRAY_COPY( gloader->current.outline.contours, + slot->outline.contours, + slot->outline.n_contours ); + + FT_ARRAY_COPY( gloader->current.outline.tags, + slot->outline.tags, + slot->outline.n_points ); + + gloader->current.outline.n_points = slot->outline.n_points; + gloader->current.outline.n_contours = slot->outline.n_contours; + + /* compute original horizontal phantom points (and ignore */ + /* vertical ones) */ + loader->pp1.x = hints->x_delta; + loader->pp1.y = hints->y_delta; + loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance, + hints->x_scale ) + hints->x_delta; + loader->pp2.y = hints->y_delta; + + /* be sure to check for spacing glyphs */ + if ( slot->outline.n_points == 0 ) + goto Hint_Metrics; + + /* now load the slot image into the auto-outline and run the */ + /* automatic hinting process */ + if ( metrics->clazz->script_hints_apply ) + metrics->clazz->script_hints_apply( hints, + &gloader->current.outline, + metrics ); + + /* we now need to hint the metrics according to the change in */ + /* width/positioning that occurred during the hinting process */ + if ( scaler->render_mode != FT_RENDER_MODE_LIGHT ) + { + FT_Pos old_rsb, old_lsb, new_lsb; + FT_Pos pp1x_uh, pp2x_uh; + AF_AxisHints axis = &hints->axis[AF_DIMENSION_HORZ]; + AF_Edge edge1 = axis->edges; /* leftmost edge */ + AF_Edge edge2 = edge1 + + axis->num_edges - 1; /* rightmost edge */ + + + if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) ) + { + old_rsb = loader->pp2.x - edge2->opos; + old_lsb = edge1->opos; + new_lsb = edge1->pos; + + /* remember unhinted values to later account */ + /* for rounding errors */ + + pp1x_uh = new_lsb - old_lsb; + pp2x_uh = edge2->pos + old_rsb; + + /* prefer too much space over too little space */ + /* for very small sizes */ + + if ( old_lsb < 24 ) + pp1x_uh -= 8; + + if ( old_rsb < 24 ) + pp2x_uh += 8; + + loader->pp1.x = FT_PIX_ROUND( pp1x_uh ); + loader->pp2.x = FT_PIX_ROUND( pp2x_uh ); + + if ( loader->pp1.x >= new_lsb && old_lsb > 0 ) + loader->pp1.x -= 64; + + if ( loader->pp2.x <= edge2->pos && old_rsb > 0 ) + loader->pp2.x += 64; + + slot->lsb_delta = loader->pp1.x - pp1x_uh; + slot->rsb_delta = loader->pp2.x - pp2x_uh; + } + else + { + FT_Pos pp1x = loader->pp1.x; + FT_Pos pp2x = loader->pp2.x; + + + loader->pp1.x = FT_PIX_ROUND( pp1x ); + loader->pp2.x = FT_PIX_ROUND( pp2x ); + + slot->lsb_delta = loader->pp1.x - pp1x; + slot->rsb_delta = loader->pp2.x - pp2x; + } + } + else + { + FT_Pos pp1x = loader->pp1.x; + FT_Pos pp2x = loader->pp2.x; + + + loader->pp1.x = FT_PIX_ROUND( pp1x + hints->xmin_delta ); + loader->pp2.x = FT_PIX_ROUND( pp2x + hints->xmax_delta ); + + slot->lsb_delta = loader->pp1.x - pp1x; + slot->rsb_delta = loader->pp2.x - pp2x; + } + + /* good, we simply add the glyph to our loader's base */ + FT_GlyphLoader_Add( gloader ); + break; + + case FT_GLYPH_FORMAT_COMPOSITE: + { + FT_UInt nn, num_subglyphs = slot->num_subglyphs; + FT_UInt num_base_subgs, start_point; + FT_SubGlyph subglyph; + + + start_point = gloader->base.outline.n_points; + + /* first of all, copy the subglyph descriptors in the glyph loader */ + error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs ); + if ( error ) + goto Exit; + + FT_ARRAY_COPY( gloader->current.subglyphs, + slot->subglyphs, + num_subglyphs ); + + gloader->current.num_subglyphs = num_subglyphs; + num_base_subgs = gloader->base.num_subglyphs; + + /* now, read each subglyph independently */ + for ( nn = 0; nn < num_subglyphs; nn++ ) + { + FT_Vector pp1, pp2; + FT_Pos x, y; + FT_UInt num_points, num_new_points, num_base_points; + + + /* gloader.current.subglyphs can change during glyph loading due */ + /* to re-allocation -- we must recompute the current subglyph on */ + /* each iteration */ + subglyph = gloader->base.subglyphs + num_base_subgs + nn; + + pp1 = loader->pp1; + pp2 = loader->pp2; + + num_base_points = gloader->base.outline.n_points; + + error = af_loader_load_g( loader, scaler, subglyph->index, + load_flags, depth + 1 ); + if ( error ) + goto Exit; + + /* recompute subglyph pointer */ + subglyph = gloader->base.subglyphs + num_base_subgs + nn; + + if ( subglyph->flags & FT_SUBGLYPH_FLAG_USE_MY_METRICS ) + { + pp1 = loader->pp1; + pp2 = loader->pp2; + } + else + { + loader->pp1 = pp1; + loader->pp2 = pp2; + } + + num_points = gloader->base.outline.n_points; + num_new_points = num_points - num_base_points; + + /* now perform the transform required for this subglyph */ + + if ( subglyph->flags & ( FT_SUBGLYPH_FLAG_SCALE | + FT_SUBGLYPH_FLAG_XY_SCALE | + FT_SUBGLYPH_FLAG_2X2 ) ) + { + FT_Vector* cur = gloader->base.outline.points + + num_base_points; + FT_Vector* limit = cur + num_new_points; + + + for ( ; cur < limit; cur++ ) + FT_Vector_Transform( cur, &subglyph->transform ); + } + + /* apply offset */ + + if ( !( subglyph->flags & FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ) ) + { + FT_Int k = subglyph->arg1; + FT_UInt l = subglyph->arg2; + FT_Vector* p1; + FT_Vector* p2; + + + if ( start_point + k >= num_base_points || + l >= (FT_UInt)num_new_points ) + { + error = AF_Err_Invalid_Composite; + goto Exit; + } + + l += num_base_points; + + /* for now, only use the current point coordinates; */ + /* we may consider another approach in the near future */ + p1 = gloader->base.outline.points + start_point + k; + p2 = gloader->base.outline.points + start_point + l; + + x = p1->x - p2->x; + y = p1->y - p2->y; + } + else + { + x = FT_MulFix( subglyph->arg1, hints->x_scale ) + hints->x_delta; + y = FT_MulFix( subglyph->arg2, hints->y_scale ) + hints->y_delta; + + x = FT_PIX_ROUND( x ); + y = FT_PIX_ROUND( y ); + } + + { + FT_Outline dummy = gloader->base.outline; + + + dummy.points += num_base_points; + dummy.n_points = (short)num_new_points; + + FT_Outline_Translate( &dummy, x, y ); + } + } + } + break; + + default: + /* we don't support other formats (yet?) */ + error = AF_Err_Unimplemented_Feature; + } + + Hint_Metrics: + if ( depth == 0 ) + { + FT_BBox bbox; + FT_Vector vvector; + + + vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX; + vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY; + vvector.x = FT_MulFix( vvector.x, metrics->scaler.x_scale ); + vvector.y = FT_MulFix( vvector.y, metrics->scaler.y_scale ); + + /* transform the hinted outline if needed */ + if ( loader->transformed ) + { + FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix ); + FT_Vector_Transform( &vvector, &loader->trans_matrix ); + } +#if 1 + /* we must translate our final outline by -pp1.x and compute */ + /* the new metrics */ + if ( loader->pp1.x ) + FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 ); +#endif + FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); + + bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); + bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); + bbox.xMax = FT_PIX_CEIL( bbox.xMax ); + bbox.yMax = FT_PIX_CEIL( bbox.yMax ); + + slot->metrics.width = bbox.xMax - bbox.xMin; + slot->metrics.height = bbox.yMax - bbox.yMin; + slot->metrics.horiBearingX = bbox.xMin; + slot->metrics.horiBearingY = bbox.yMax; + + slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x ); + slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y ); + + /* for mono-width fonts (like Andale, Courier, etc.) we need */ + /* to keep the original rounded advance width; ditto for */ + /* digits if all have the same advance width */ +#if 0 + if ( !FT_IS_FIXED_WIDTH( slot->face ) ) + slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + else + slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, + x_scale ); +#else + if ( FT_IS_FIXED_WIDTH( slot->face ) || + ( af_face_globals_is_digit( loader->globals, glyph_index ) && + metrics->digits_have_same_width ) ) + { + slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, + metrics->scaler.x_scale ); + + /* Set delta values to 0. Otherwise code that uses them is */ + /* going to ruin the fixed advance width. */ + slot->lsb_delta = 0; + slot->rsb_delta = 0; + } + else + { + /* non-spacing glyphs must stay as-is */ + if ( slot->metrics.horiAdvance ) + slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + } +#endif + + slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance, + metrics->scaler.y_scale ); + + slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); + slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance ); + + /* now copy outline into glyph slot */ + FT_GlyphLoader_Rewind( internal->loader ); + error = FT_GlyphLoader_CopyPoints( internal->loader, gloader ); + if ( error ) + goto Exit; + + slot->outline = internal->loader->base.outline; + slot->format = FT_GLYPH_FORMAT_OUTLINE; + } + +#ifdef DEBUG_HINTER + af_debug_hinter = hinter; +#endif + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + FT_Face face, + FT_UInt gindex, + FT_UInt32 load_flags ) + { + FT_Error error; + FT_Size size = face->size; + AF_ScalerRec scaler; + + + if ( !size ) + return AF_Err_Invalid_Argument; + + FT_ZERO( &scaler ); + + scaler.face = face; + scaler.x_scale = size->metrics.x_scale; + scaler.x_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ + scaler.y_scale = size->metrics.y_scale; + scaler.y_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ + + scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); + scaler.flags = 0; /* XXX: fix this */ + + error = af_loader_reset( loader, face ); + if ( !error ) + { + AF_ScriptMetrics metrics; + FT_UInt options = 0; + + +#ifdef FT_OPTION_AUTOFIT2 + /* XXX: undocumented hook to activate the latin2 hinter */ + if ( load_flags & ( 1UL << 20 ) ) + options = 2; +#endif + + error = af_face_globals_get_metrics( loader->globals, gindex, + options, &metrics ); + if ( !error ) + { + loader->metrics = metrics; + + if ( metrics->clazz->script_metrics_scale ) + metrics->clazz->script_metrics_scale( metrics, &scaler ); + else + metrics->scaler = scaler; + + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM; + load_flags &= ~FT_LOAD_RENDER; + + if ( metrics->clazz->script_hints_init ) + { + error = metrics->clazz->script_hints_init( &loader->hints, + metrics ); + if ( error ) + goto Exit; + } + + error = af_loader_load_g( loader, &scaler, gindex, load_flags, 0 ); + } + } + Exit: + return error; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afloader.h b/android/jni/ndk_modules/freetype/src/autofit/afloader.h new file mode 100644 index 00000000..fa67c10f --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afloader.h @@ -0,0 +1,73 @@ +/***************************************************************************/ +/* */ +/* afloader.h */ +/* */ +/* Auto-fitter glyph loading routines (specification). */ +/* */ +/* Copyright 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AF_LOADER_H__ +#define __AF_LOADER_H__ + +#include "afhints.h" +#include "afglobal.h" + + +FT_BEGIN_HEADER + + typedef struct AF_LoaderRec_ + { + FT_Face face; /* current face */ + AF_FaceGlobals globals; /* current face globals */ + FT_GlyphLoader gloader; /* glyph loader */ + AF_GlyphHintsRec hints; + AF_ScriptMetrics metrics; + FT_Bool transformed; + FT_Matrix trans_matrix; + FT_Vector trans_delta; + FT_Vector pp1; + FT_Vector pp2; + /* we don't handle vertical phantom points */ + + } AF_LoaderRec, *AF_Loader; + + + FT_LOCAL( FT_Error ) + af_loader_init( AF_Loader loader, + FT_Memory memory ); + + + FT_LOCAL( FT_Error ) + af_loader_reset( AF_Loader loader, + FT_Face face ); + + + FT_LOCAL( void ) + af_loader_done( AF_Loader loader ); + + + FT_LOCAL( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + FT_Face face, + FT_UInt gindex, + FT_UInt32 load_flags ); + +/* */ + + +FT_END_HEADER + +#endif /* __AF_LOADER_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afmodule.c b/android/jni/ndk_modules/freetype/src/autofit/afmodule.c new file mode 100644 index 00000000..ec2d707c --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afmodule.c @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* afmodule.c */ +/* */ +/* Auto-fitter module implementation (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afmodule.h" +#include "afloader.h" +#include "afpic.h" + +#ifdef AF_DEBUG + int _af_debug; + int _af_debug_disable_horz_hints; + int _af_debug_disable_vert_hints; + int _af_debug_disable_blue_hints; + void* _af_debug_hints; +#endif + +#include FT_INTERNAL_OBJECTS_H + + + typedef struct FT_AutofitterRec_ + { + FT_ModuleRec root; + AF_LoaderRec loader[1]; + + } FT_AutofitterRec, *FT_Autofitter; + + + FT_CALLBACK_DEF( FT_Error ) + af_autofitter_init( FT_Autofitter module ) + { + return af_loader_init( module->loader, module->root.library->memory ); + } + + + FT_CALLBACK_DEF( void ) + af_autofitter_done( FT_Autofitter module ) + { + af_loader_done( module->loader ); + } + + + FT_CALLBACK_DEF( FT_Error ) + af_autofitter_load_glyph( FT_Autofitter module, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_UNUSED( size ); + + return af_loader_load_glyph( module->loader, slot->face, + glyph_index, load_flags ); + } + + + FT_DEFINE_AUTOHINTER_SERVICE(af_autofitter_service, + NULL, + NULL, + NULL, + (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph + ) + + FT_DEFINE_MODULE(autofit_module_class, + + FT_MODULE_HINTER, + sizeof ( FT_AutofitterRec ), + + "autofitter", + 0x10000L, /* version 1.0 of the autofitter */ + 0x20000L, /* requires FreeType 2.0 or above */ + + (const void*)&AF_AF_AUTOFITTER_SERVICE_GET, + + (FT_Module_Constructor)af_autofitter_init, + (FT_Module_Destructor) af_autofitter_done, + (FT_Module_Requester) NULL + ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afmodule.h b/android/jni/ndk_modules/freetype/src/autofit/afmodule.h new file mode 100644 index 00000000..d9792399 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afmodule.h @@ -0,0 +1,37 @@ +/***************************************************************************/ +/* */ +/* afmodule.h */ +/* */ +/* Auto-fitter module implementation (specification). */ +/* */ +/* Copyright 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFMODULE_H__ +#define __AFMODULE_H__ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_MODULE_H + + +FT_BEGIN_HEADER + +FT_DECLARE_MODULE(autofit_module_class) + + +FT_END_HEADER + +#endif /* __AFMODULE_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afpic.c b/android/jni/ndk_modules/freetype/src/autofit/afpic.c new file mode 100644 index 00000000..5b9aba69 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afpic.c @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* afpic.c */ +/* */ +/* The FreeType position independent code services for autofit module. */ +/* */ +/* Copyright 2009, 2010 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "afpic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from afmodule.c */ + void FT_Init_Class_af_autofitter_service( FT_Library, FT_AutoHinter_ServiceRec*); + + /* forward declaration of PIC init functions from script classes */ +#include "aflatin.h" +#include "aflatin2.h" +#include "afcjk.h" +#include "afdummy.h" +#include "afindic.h" + + void + autofit_module_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->autofit ) + { + FT_FREE( pic_container->autofit ); + pic_container->autofit = NULL; + } + } + + + FT_Error + autofit_module_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_UInt ss; + FT_Error error = AF_Err_Ok; + AFModulePIC* container; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->autofit = container; + + /* initialize pointer table - this is how the module usually expects this data */ + for ( ss = 0 ; ss < AF_SCRIPT_CLASSES_REC_COUNT ; ss++ ) + { + container->af_script_classes[ss] = &container->af_script_classes_rec[ss]; + } + container->af_script_classes[AF_SCRIPT_CLASSES_COUNT-1] = NULL; + + /* add call to initialization function when you add new scripts */ + ss = 0; + FT_Init_Class_af_dummy_script_class(&container->af_script_classes_rec[ss++]); +#ifdef FT_OPTION_AUTOFIT2 + FT_Init_Class_af_latin2_script_class(&container->af_script_classes_rec[ss++]); +#endif + FT_Init_Class_af_latin_script_class(&container->af_script_classes_rec[ss++]); + FT_Init_Class_af_cjk_script_class(&container->af_script_classes_rec[ss++]); + FT_Init_Class_af_indic_script_class(&container->af_script_classes_rec[ss++]); + + FT_Init_Class_af_autofitter_service(library, &container->af_autofitter_service); + +/*Exit:*/ + if(error) + autofit_module_class_pic_free(library); + return error; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afpic.h b/android/jni/ndk_modules/freetype/src/autofit/afpic.h new file mode 100644 index 00000000..80e62d39 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afpic.h @@ -0,0 +1,64 @@ +/***************************************************************************/ +/* */ +/* afpic.h */ +/* */ +/* The FreeType position independent code services for autofit module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFPIC_H__ +#define __AFPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC + +#define AF_SCRIPT_CLASSES_GET af_script_classes +#define AF_AF_AUTOFITTER_SERVICE_GET af_autofitter_service + +#else /* FT_CONFIG_OPTION_PIC */ + +#include "aftypes.h" + +/* increase these when you add new scripts, and update autofit_module_class_pic_init */ +#ifdef FT_OPTION_AUTOFIT2 + #define AF_SCRIPT_CLASSES_COUNT 6 +#else + #define AF_SCRIPT_CLASSES_COUNT 5 +#endif +#define AF_SCRIPT_CLASSES_REC_COUNT (AF_SCRIPT_CLASSES_COUNT-1) + + typedef struct AFModulePIC_ + { + AF_ScriptClass af_script_classes[AF_SCRIPT_CLASSES_COUNT]; + AF_ScriptClassRec af_script_classes_rec[AF_SCRIPT_CLASSES_REC_COUNT]; + FT_AutoHinter_ServiceRec af_autofitter_service; + } AFModulePIC; + +#define GET_PIC(lib) ((AFModulePIC*)((lib)->pic_container.autofit)) +#define AF_SCRIPT_CLASSES_GET (GET_PIC(FT_FACE_LIBRARY(globals->face))->af_script_classes) +#define AF_AF_AUTOFITTER_SERVICE_GET (GET_PIC(library)->af_autofitter_service) + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __AFPIC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/aftypes.h b/android/jni/ndk_modules/freetype/src/autofit/aftypes.h new file mode 100644 index 00000000..5574f0c3 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/aftypes.h @@ -0,0 +1,403 @@ +/***************************************************************************/ +/* */ +/* aftypes.h */ +/* */ +/* Auto-fitter types (specification only). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /************************************************************************* + * + * The auto-fitter is a complete rewrite of the old auto-hinter. + * Its main feature is the ability to differentiate between different + * scripts in order to apply language-specific rules. + * + * The code has also been compartmentized into several entities that + * should make algorithmic experimentation easier than with the old + * code. + * + * Finally, we get rid of the Catharon license, since this code is + * released under the FreeType one. + * + *************************************************************************/ + + +#ifndef __AFTYPES_H__ +#define __AFTYPES_H__ + +#include <ft2build.h> + +#include FT_FREETYPE_H +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** D E B U G G I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define xxAF_USE_WARPER /* only define to use warp hinting */ +#define xxAF_DEBUG + +#ifdef AF_DEBUG + +#include FT_CONFIG_STANDARD_LIBRARY_H + +#define AF_LOG( x ) do { if ( _af_debug ) printf x; } while ( 0 ) + +extern int _af_debug; +extern int _af_debug_disable_horz_hints; +extern int _af_debug_disable_vert_hints; +extern int _af_debug_disable_blue_hints; +extern void* _af_debug_hints; + +#else /* !AF_DEBUG */ + +#define AF_LOG( x ) do { } while ( 0 ) /* nothing */ + +#endif /* !AF_DEBUG */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** U T I L I T Y S T U F F *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AF_WidthRec_ + { + FT_Pos org; /* original position/width in font units */ + FT_Pos cur; /* current/scaled position/width in device sub-pixels */ + FT_Pos fit; /* current/fitted position/width in device sub-pixels */ + + } AF_WidthRec, *AF_Width; + + + FT_LOCAL( void ) + af_sort_pos( FT_UInt count, + FT_Pos* table ); + + FT_LOCAL( void ) + af_sort_widths( FT_UInt count, + AF_Width widths ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** A N G L E T Y P E S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The auto-fitter doesn't need a very high angular accuracy; + * this allows us to speed up some computations considerably with a + * light Cordic algorithm (see afangles.c). + */ + + typedef FT_Int AF_Angle; + + +#define AF_ANGLE_PI 256 +#define AF_ANGLE_2PI ( AF_ANGLE_PI * 2 ) +#define AF_ANGLE_PI2 ( AF_ANGLE_PI / 2 ) +#define AF_ANGLE_PI4 ( AF_ANGLE_PI / 4 ) + + +#if 0 + /* + * compute the angle of a given 2-D vector + */ + FT_LOCAL( AF_Angle ) + af_angle_atan( FT_Pos dx, + FT_Pos dy ); + + + /* + * compute `angle2 - angle1'; the result is always within + * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1] + */ + FT_LOCAL( AF_Angle ) + af_angle_diff( AF_Angle angle1, + AF_Angle angle2 ); +#endif /* 0 */ + + +#define AF_ANGLE_DIFF( result, angle1, angle2 ) \ + FT_BEGIN_STMNT \ + AF_Angle _delta = (angle2) - (angle1); \ + \ + \ + _delta %= AF_ANGLE_2PI; \ + if ( _delta < 0 ) \ + _delta += AF_ANGLE_2PI; \ + \ + if ( _delta > AF_ANGLE_PI ) \ + _delta -= AF_ANGLE_2PI; \ + \ + result = _delta; \ + FT_END_STMNT + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** O U T L I N E S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* opaque handle to glyph-specific hints -- see `afhints.h' for more + * details + */ + typedef struct AF_GlyphHintsRec_* AF_GlyphHints; + + /* This structure is used to model an input glyph outline to + * the auto-hinter. The latter will set the `hints' field + * depending on the glyph's script. + */ + typedef struct AF_OutlineRec_ + { + FT_Face face; + FT_Outline outline; + FT_UInt outline_resolution; + + FT_Int advance; + FT_UInt metrics_resolution; + + AF_GlyphHints hints; + + } AF_OutlineRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S C A L E R S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * A scaler models the target pixel device that will receive the + * auto-hinted glyph image. + */ + + typedef enum AF_ScalerFlags_ + { + AF_SCALER_FLAG_NO_HORIZONTAL = 1, /* disable horizontal hinting */ + AF_SCALER_FLAG_NO_VERTICAL = 2, /* disable vertical hinting */ + AF_SCALER_FLAG_NO_ADVANCE = 4 /* disable advance hinting */ + + } AF_ScalerFlags; + + + typedef struct AF_ScalerRec_ + { + FT_Face face; /* source font face */ + FT_Fixed x_scale; /* from font units to 1/64th device pixels */ + FT_Fixed y_scale; /* from font units to 1/64th device pixels */ + FT_Pos x_delta; /* in 1/64th device pixels */ + FT_Pos y_delta; /* in 1/64th device pixels */ + FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */ + FT_UInt32 flags; /* additional control flags, see above */ + + } AF_ScalerRec, *AF_Scaler; + + +#define AF_SCALER_EQUAL_SCALES( a, b ) \ + ( (a)->x_scale == (b)->x_scale && \ + (a)->y_scale == (b)->y_scale && \ + (a)->x_delta == (b)->x_delta && \ + (a)->y_delta == (b)->y_delta ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S C R I P T S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The list of know scripts. Each different script corresponds to the + * following information: + * + * - A set of Unicode ranges to test whether the face supports the + * script. + * + * - A specific global analyzer that will compute global metrics + * specific to the script. + * + * - A specific glyph analyzer that will compute segments and + * edges for each glyph covered by the script. + * + * - A specific grid-fitting algorithm that will distort the + * scaled glyph outline according to the results of the glyph + * analyzer. + * + * Note that a given analyzer and/or grid-fitting algorithm can be + * used by more than one script. + */ + + typedef enum AF_Script_ + { + AF_SCRIPT_NONE = 0, + AF_SCRIPT_LATIN = 1, + AF_SCRIPT_CJK = 2, + AF_SCRIPT_INDIC = 3, +#ifdef FT_OPTION_AUTOFIT2 + AF_SCRIPT_LATIN2, +#endif + + /* add new scripts here. Don't forget to update the list in */ + /* `afglobal.c'. */ + + AF_SCRIPT_MAX /* do not remove */ + + } AF_Script; + + + typedef struct AF_ScriptClassRec_ const* AF_ScriptClass; + + typedef struct AF_ScriptMetricsRec_ + { + AF_ScriptClass clazz; + AF_ScalerRec scaler; + FT_Bool digits_have_same_width; + + } AF_ScriptMetricsRec, *AF_ScriptMetrics; + + + /* This function parses an FT_Face to compute global metrics for + * a specific script. + */ + typedef FT_Error + (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics metrics, + FT_Face face ); + + typedef void + (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics metrics, + AF_Scaler scaler ); + + typedef void + (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics metrics ); + + + typedef FT_Error + (*AF_Script_InitHintsFunc)( AF_GlyphHints hints, + AF_ScriptMetrics metrics ); + + typedef void + (*AF_Script_ApplyHintsFunc)( AF_GlyphHints hints, + FT_Outline* outline, + AF_ScriptMetrics metrics ); + + + typedef struct AF_Script_UniRangeRec_ + { + FT_UInt32 first; + FT_UInt32 last; + + } AF_Script_UniRangeRec; + +#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) } + + typedef const AF_Script_UniRangeRec *AF_Script_UniRange; + + + typedef struct AF_ScriptClassRec_ + { + AF_Script script; + AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */ + + FT_Offset script_metrics_size; + AF_Script_InitMetricsFunc script_metrics_init; + AF_Script_ScaleMetricsFunc script_metrics_scale; + AF_Script_DoneMetricsFunc script_metrics_done; + + AF_Script_InitHintsFunc script_hints_init; + AF_Script_ApplyHintsFunc script_hints_apply; + + } AF_ScriptClassRec; + +/* Declare and define vtables for classes */ +#ifndef FT_CONFIG_OPTION_PIC + +#define AF_DECLARE_SCRIPT_CLASS(script_class) \ + FT_CALLBACK_TABLE const AF_ScriptClassRec \ + script_class; + +#define AF_DEFINE_SCRIPT_CLASS(script_class, script_, ranges, m_size, \ + m_init, m_scale, m_done, h_init, h_apply) \ + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec \ + script_class = \ + { \ + script_, \ + ranges, \ + \ + m_size, \ + \ + m_init, \ + m_scale, \ + m_done, \ + \ + h_init, \ + h_apply \ + }; + +#else + +#define AF_DECLARE_SCRIPT_CLASS(script_class) \ + FT_LOCAL(void) \ + FT_Init_Class_##script_class(AF_ScriptClassRec* ac); + +#define AF_DEFINE_SCRIPT_CLASS(script_class, script_, ranges, m_size, \ + m_init, m_scale, m_done, h_init, h_apply) \ + FT_LOCAL_DEF(void) \ + FT_Init_Class_##script_class(AF_ScriptClassRec* ac) \ + { \ + ac->script = script_; \ + ac->script_uni_ranges = ranges; \ + \ + ac->script_metrics_size = m_size; \ + \ + ac->script_metrics_init = m_init; \ + ac->script_metrics_scale = m_scale; \ + ac->script_metrics_done = m_done; \ + \ + ac->script_hints_init = h_init; \ + ac->script_hints_apply = h_apply; \ + } +#endif + + +/* */ + +FT_END_HEADER + +#endif /* __AFTYPES_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afwarp.c b/android/jni/ndk_modules/freetype/src/autofit/afwarp.c new file mode 100644 index 00000000..f5bb9b18 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afwarp.c @@ -0,0 +1,338 @@ +/***************************************************************************/ +/* */ +/* afwarp.c */ +/* */ +/* Auto-fitter warping algorithm (body). */ +/* */ +/* Copyright 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afwarp.h" + +#ifdef AF_USE_WARPER + +#if 1 + static const AF_WarpScore + af_warper_weights[64] = + { + 35, 32, 30, 25, 20, 15, 12, 10, 5, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -2, -5, -8,-10,-10,-20,-20,-30,-30, + + -30,-30,-20,-20,-10,-10, -8, -5, -2, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 5, 10, 12, 15, 20, 25, 30, 32, + }; +#else + static const AF_WarpScore + af_warper_weights[64] = + { + 30, 20, 10, 5, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, -2, -2, -5, -5,-10,-10,-15,-20, + + -20,-15,-15,-10,-10, -5, -5, -2, -2, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 4, 5, 10, 20, + }; +#endif + + + static void + af_warper_compute_line_best( AF_Warper warper, + FT_Fixed scale, + FT_Pos delta, + FT_Pos xx1, + FT_Pos xx2, + AF_WarpScore base_distort, + AF_Segment segments, + FT_UInt num_segments ) + { + FT_Int idx_min, idx_max, idx0; + FT_UInt nn; + AF_WarpScore scores[65]; + + + for ( nn = 0; nn < 65; nn++ ) + scores[nn] = 0; + + idx0 = xx1 - warper->t1; + + /* compute minimum and maximum indices */ + { + FT_Pos xx1min = warper->x1min; + FT_Pos xx1max = warper->x1max; + FT_Pos w = xx2 - xx1; + + + if ( xx1min + w < warper->x2min ) + xx1min = warper->x2min - w; + + xx1max = warper->x1max; + if ( xx1max + w > warper->x2max ) + xx1max = warper->x2max - w; + + idx_min = xx1min - warper->t1; + idx_max = xx1max - warper->t1; + + if ( idx_min < 0 || idx_min > idx_max || idx_max > 64 ) + { + AF_LOG(( "invalid indices:\n" + " min=%d max=%d, xx1=%ld xx2=%ld,\n" + " x1min=%ld x1max=%ld, x2min=%ld x2max=%ld\n", + idx_min, idx_max, xx1, xx2, + warper->x1min, warper->x1max, + warper->x2min, warper->x2max )); + return; + } + } + + for ( nn = 0; nn < num_segments; nn++ ) + { + FT_Pos len = segments[nn].max_coord - segments[nn].min_coord; + FT_Pos y0 = FT_MulFix( segments[nn].pos, scale ) + delta; + FT_Pos y = y0 + ( idx_min - idx0 ); + FT_Int idx; + + + for ( idx = idx_min; idx <= idx_max; idx++, y++ ) + scores[idx] += af_warper_weights[y & 63] * len; + } + + /* find best score */ + { + FT_Int idx; + + + for ( idx = idx_min; idx <= idx_max; idx++ ) + { + AF_WarpScore score = scores[idx]; + AF_WarpScore distort = base_distort + ( idx - idx0 ); + + + if ( score > warper->best_score || + ( score == warper->best_score && + distort < warper->best_distort ) ) + { + warper->best_score = score; + warper->best_distort = distort; + warper->best_scale = scale; + warper->best_delta = delta + ( idx - idx0 ); + } + } + } + } + + + FT_LOCAL_DEF( void ) + af_warper_compute( AF_Warper warper, + AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed *a_scale, + FT_Pos *a_delta ) + { + AF_AxisHints axis; + AF_Point points; + + FT_Fixed org_scale; + FT_Pos org_delta; + + FT_UInt nn, num_points, num_segments; + FT_Int X1, X2; + FT_Int w; + + AF_WarpScore base_distort; + AF_Segment segments; + + + /* get original scaling transformation */ + if ( dim == AF_DIMENSION_VERT ) + { + org_scale = hints->y_scale; + org_delta = hints->y_delta; + } + else + { + org_scale = hints->x_scale; + org_delta = hints->x_delta; + } + + warper->best_scale = org_scale; + warper->best_delta = org_delta; + warper->best_score = INT_MIN; + warper->best_distort = 0; + + axis = &hints->axis[dim]; + segments = axis->segments; + num_segments = axis->num_segments; + points = hints->points; + num_points = hints->num_points; + + *a_scale = org_scale; + *a_delta = org_delta; + + /* get X1 and X2, minimum and maximum in original coordinates */ + if ( num_segments < 1 ) + return; + +#if 1 + X1 = X2 = points[0].fx; + for ( nn = 1; nn < num_points; nn++ ) + { + FT_Int X = points[nn].fx; + + + if ( X < X1 ) + X1 = X; + if ( X > X2 ) + X2 = X; + } +#else + X1 = X2 = segments[0].pos; + for ( nn = 1; nn < num_segments; nn++ ) + { + FT_Int X = segments[nn].pos; + + + if ( X < X1 ) + X1 = X; + if ( X > X2 ) + X2 = X; + } +#endif + + if ( X1 >= X2 ) + return; + + warper->x1 = FT_MulFix( X1, org_scale ) + org_delta; + warper->x2 = FT_MulFix( X2, org_scale ) + org_delta; + + warper->t1 = AF_WARPER_FLOOR( warper->x1 ); + warper->t2 = AF_WARPER_CEIL( warper->x2 ); + + warper->x1min = warper->x1 & ~31; + warper->x1max = warper->x1min + 32; + warper->x2min = warper->x2 & ~31; + warper->x2max = warper->x2min + 32; + + if ( warper->x1max > warper->x2 ) + warper->x1max = warper->x2; + + if ( warper->x2min < warper->x1 ) + warper->x2min = warper->x1; + + warper->w0 = warper->x2 - warper->x1; + + if ( warper->w0 <= 64 ) + { + warper->x1max = warper->x1; + warper->x2min = warper->x2; + } + + warper->wmin = warper->x2min - warper->x1max; + warper->wmax = warper->x2max - warper->x1min; + +#if 1 + { + int margin = 16; + + + if ( warper->w0 <= 128 ) + { + margin = 8; + if ( warper->w0 <= 96 ) + margin = 4; + } + + if ( warper->wmin < warper->w0 - margin ) + warper->wmin = warper->w0 - margin; + + if ( warper->wmax > warper->w0 + margin ) + warper->wmax = warper->w0 + margin; + } + + if ( warper->wmin < warper->w0 * 3 / 4 ) + warper->wmin = warper->w0 * 3 / 4; + + if ( warper->wmax > warper->w0 * 5 / 4 ) + warper->wmax = warper->w0 * 5 / 4; +#else + /* no scaling, just translation */ + warper->wmin = warper->wmax = warper->w0; +#endif + + for ( w = warper->wmin; w <= warper->wmax; w++ ) + { + FT_Fixed new_scale; + FT_Pos new_delta; + FT_Pos xx1, xx2; + + + xx1 = warper->x1; + xx2 = warper->x2; + if ( w >= warper->w0 ) + { + xx1 -= w - warper->w0; + if ( xx1 < warper->x1min ) + { + xx2 += warper->x1min - xx1; + xx1 = warper->x1min; + } + } + else + { + xx1 -= w - warper->w0; + if ( xx1 > warper->x1max ) + { + xx2 -= xx1 - warper->x1max; + xx1 = warper->x1max; + } + } + + if ( xx1 < warper->x1 ) + base_distort = warper->x1 - xx1; + else + base_distort = xx1 - warper->x1; + + if ( xx2 < warper->x2 ) + base_distort += warper->x2 - xx2; + else + base_distort += xx2 - warper->x2; + + base_distort *= 10; + + new_scale = org_scale + FT_DivFix( w - warper->w0, X2 - X1 ); + new_delta = xx1 - FT_MulFix( X1, new_scale ); + + af_warper_compute_line_best( warper, new_scale, new_delta, xx1, xx2, + base_distort, + segments, num_segments ); + } + + { + FT_Fixed best_scale = warper->best_scale; + FT_Pos best_delta = warper->best_delta; + + + hints->xmin_delta = FT_MulFix( X1, best_scale - org_scale ) + + best_delta; + hints->xmax_delta = FT_MulFix( X2, best_scale - org_scale ) + + best_delta; + + *a_scale = best_scale; + *a_delta = best_delta; + } + } + +#else /* !AF_USE_WARPER */ + +char af_warper_dummy = 0; /* make compiler happy */ + +#endif /* !AF_USE_WARPER */ + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afwarp.h b/android/jni/ndk_modules/freetype/src/autofit/afwarp.h new file mode 100644 index 00000000..7343fdd5 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/afwarp.h @@ -0,0 +1,64 @@ +/***************************************************************************/ +/* */ +/* afwarp.h */ +/* */ +/* Auto-fitter warping algorithm (specification). */ +/* */ +/* Copyright 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFWARP_H__ +#define __AFWARP_H__ + +#include "afhints.h" + +FT_BEGIN_HEADER + +#define AF_WARPER_SCALE + +#define AF_WARPER_FLOOR( x ) ( (x) & ~63 ) +#define AF_WARPER_CEIL( x ) AF_WARPER_FLOOR( (x) + 63 ) + + + typedef FT_Int32 AF_WarpScore; + + typedef struct AF_WarperRec_ + { + FT_Pos x1, x2; + FT_Pos t1, t2; + FT_Pos x1min, x1max; + FT_Pos x2min, x2max; + FT_Pos w0, wmin, wmax; + + FT_Fixed best_scale; + FT_Pos best_delta; + AF_WarpScore best_score; + AF_WarpScore best_distort; + + } AF_WarperRec, *AF_Warper; + + + FT_LOCAL( void ) + af_warper_compute( AF_Warper warper, + AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed *a_scale, + FT_Fixed *a_delta ); + + +FT_END_HEADER + + +#endif /* __AFWARP_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/autofit.c b/android/jni/ndk_modules/freetype/src/autofit/autofit.c new file mode 100644 index 00000000..83b613e7 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/autofit/autofit.c @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* autofit.c */ +/* */ +/* Auto-fitter module (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include <ft2build.h> +#include "afpic.c" +#include "afangles.c" +#include "afglobal.c" +#include "afhints.c" + +#include "afdummy.c" +#include "aflatin.c" +#ifdef FT_OPTION_AUTOFIT2 +#include "aflatin2.c" +#endif +#include "afcjk.c" +#include "afindic.c" + +#include "afloader.c" +#include "afmodule.c" + +#ifdef AF_USE_WARPER +#include "afwarp.c" +#endif + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/basepic.c b/android/jni/ndk_modules/freetype/src/base/basepic.c new file mode 100644 index 00000000..c0bccb69 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/basepic.c @@ -0,0 +1,83 @@ +/***************************************************************************/ +/* */ +/* basepic.c */ +/* */ +/* The FreeType position independent code services for base. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "basepic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from ftglyph.c */ + void FT_Init_Class_ft_outline_glyph_class(FT_Glyph_Class*); + void FT_Init_Class_ft_bitmap_glyph_class(FT_Glyph_Class*); + + /* forward declaration of PIC init functions from ftinit.c */ + FT_Error ft_create_default_module_classes(FT_Library); + void ft_destroy_default_module_classes(FT_Library); + + void + ft_base_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->base ) + { + /* Destroy default module classes (in case FT_Add_Default_Modules was used) */ + ft_destroy_default_module_classes( library ); + + FT_FREE( pic_container->base ); + pic_container->base = NULL; + } + } + + + FT_Error + ft_base_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + BasePIC* container; + FT_Memory memory = library->memory; + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->base = container; + + /* initialize default modules list and pointers */ + error = ft_create_default_module_classes( library ); + if ( error ) + goto Exit; + + /* initialize pointer table - this is how the module usually expects this data */ + FT_Init_Class_ft_outline_glyph_class(&container->ft_outline_glyph_class); + FT_Init_Class_ft_bitmap_glyph_class(&container->ft_bitmap_glyph_class); + +Exit: + if(error) + ft_base_pic_free(library); + return error; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/basepic.h b/android/jni/ndk_modules/freetype/src/base/basepic.h new file mode 100644 index 00000000..bb177457 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/basepic.h @@ -0,0 +1,62 @@ +/***************************************************************************/ +/* */ +/* basepic.h */ +/* */ +/* The FreeType position independent code services for base. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __BASEPIC_H__ +#define __BASEPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC +#define FT_OUTLINE_GLYPH_CLASS_GET &ft_outline_glyph_class +#define FT_BITMAP_GLYPH_CLASS_GET &ft_bitmap_glyph_class +#define FT_DEFAULT_MODULES_GET ft_default_modules + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_GLYPH_H + + typedef struct BasePIC_ + { + FT_Module_Class** default_module_classes; + FT_Glyph_Class ft_outline_glyph_class; + FT_Glyph_Class ft_bitmap_glyph_class; + } BasePIC; + +#define GET_PIC(lib) ((BasePIC*)((lib)->pic_container.base)) +#define FT_OUTLINE_GLYPH_CLASS_GET (&GET_PIC(library)->ft_outline_glyph_class) +#define FT_BITMAP_GLYPH_CLASS_GET (&GET_PIC(library)->ft_bitmap_glyph_class) +#define FT_DEFAULT_MODULES_GET (GET_PIC(library)->default_module_classes) + + void + ft_base_pic_free( FT_Library library ); + + FT_Error + ft_base_pic_init( FT_Library library ); + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ + +FT_END_HEADER + +#endif /* __BASEPIC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftadvanc.c b/android/jni/ndk_modules/freetype/src/base/ftadvanc.c new file mode 100644 index 00000000..8ab7fcb9 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftadvanc.c @@ -0,0 +1,163 @@ +/***************************************************************************/ +/* */ +/* ftadvanc.c */ +/* */ +/* Quick computation of advance widths (body). */ +/* */ +/* Copyright 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_ADVANCES_H +#include FT_INTERNAL_OBJECTS_H + + + static FT_Error + _ft_face_scale_advances( FT_Face face, + FT_Fixed* advances, + FT_UInt count, + FT_Int32 flags ) + { + FT_Fixed scale; + FT_UInt nn; + + + if ( flags & FT_LOAD_NO_SCALE ) + return FT_Err_Ok; + + if ( face->size == NULL ) + return FT_Err_Invalid_Size_Handle; + + if ( flags & FT_LOAD_VERTICAL_LAYOUT ) + scale = face->size->metrics.y_scale; + else + scale = face->size->metrics.x_scale; + + /* this must be the same scaling as to get linear{Hori,Vert}Advance */ + /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c) */ + + for ( nn = 0; nn < count; nn++ ) + advances[nn] = FT_MulDiv( advances[nn], scale, 64 ); + + return FT_Err_Ok; + } + + + /* at the moment, we can perform fast advance retrieval only in */ + /* the following cases: */ + /* */ + /* - unscaled load */ + /* - unhinted load */ + /* - light-hinted load */ + +#define LOAD_ADVANCE_FAST_CHECK( flags ) \ + ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \ + FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT ) + + + /* documentation is in ftadvanc.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 flags, + FT_Fixed *padvance ) + { + FT_Face_GetAdvancesFunc func; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( gindex >= (FT_UInt)face->num_glyphs ) + return FT_Err_Invalid_Glyph_Index; + + func = face->driver->clazz->get_advances; + if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) ) + { + FT_Error error; + + + error = func( face, gindex, 1, flags, padvance ); + if ( !error ) + return _ft_face_scale_advances( face, padvance, 1, flags ); + + if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) ) + return error; + } + + return FT_Get_Advances( face, gindex, 1, flags, padvance ); + } + + + /* documentation is in ftadvanc.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed *padvances ) + { + FT_Face_GetAdvancesFunc func; + FT_UInt num, end, nn; + FT_Error error = FT_Err_Ok; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + num = (FT_UInt)face->num_glyphs; + end = start + count; + if ( start >= num || end < start || end > num ) + return FT_Err_Invalid_Glyph_Index; + + if ( count == 0 ) + return FT_Err_Ok; + + func = face->driver->clazz->get_advances; + if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) ) + { + error = func( face, start, count, flags, padvances ); + if ( !error ) + goto Exit; + + if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) ) + return error; + } + + error = FT_Err_Ok; + + if ( flags & FT_ADVANCE_FLAG_FAST_ONLY ) + return FT_Err_Unimplemented_Feature; + + flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; + for ( nn = 0; nn < count; nn++ ) + { + error = FT_Load_Glyph( face, start + nn, flags ); + if ( error ) + break; + + padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) + ? face->glyph->advance.y + : face->glyph->advance.x; + } + + if ( error ) + return error; + + Exit: + return _ft_face_scale_advances( face, padvances, count, flags ); + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftapi.c b/android/jni/ndk_modules/freetype/src/base/ftapi.c new file mode 100644 index 00000000..8914d1f4 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftapi.c @@ -0,0 +1,121 @@ +/***************************************************************************/ +/* */ +/* ftapi.c */ +/* */ +/* The FreeType compatibility functions (body). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_LIST_H +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TABLES_H +#include FT_OUTLINE_H + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C O M P A T I B I L I T Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* backwards compatibility API */ + + FT_BASE_DEF( void ) + FT_New_Memory_Stream( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Stream stream ) + { + FT_UNUSED( library ); + + FT_Stream_OpenMemory( stream, base, size ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Seek_Stream( FT_Stream stream, + FT_ULong pos ) + { + return FT_Stream_Seek( stream, pos ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Skip_Stream( FT_Stream stream, + FT_Long distance ) + { + return FT_Stream_Skip( stream, distance ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Read_Stream( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_Read( stream, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Read_Stream_At( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_ReadAt( stream, pos, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Extract_Frame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ) + { + return FT_Stream_ExtractFrame( stream, count, pbytes ); + } + + + FT_BASE_DEF( void ) + FT_Release_Frame( FT_Stream stream, + FT_Byte** pbytes ) + { + FT_Stream_ReleaseFrame( stream, pbytes ); + } + + FT_BASE_DEF( FT_Error ) + FT_Access_Frame( FT_Stream stream, + FT_ULong count ) + { + return FT_Stream_EnterFrame( stream, count ); + } + + + FT_BASE_DEF( void ) + FT_Forget_Frame( FT_Stream stream ) + { + FT_Stream_ExitFrame( stream ); + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftbase.c b/android/jni/ndk_modules/freetype/src/base/ftbase.c new file mode 100644 index 00000000..6a27ea95 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftbase.c @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* ftbase.c */ +/* */ +/* Single object library component (body only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "ftpic.c" +#include "basepic.c" +#include "ftadvanc.c" +#include "ftcalc.c" +#include "ftdbgmem.c" +#include "ftgloadr.c" +#include "ftobjs.c" +#include "ftoutln.c" +#include "ftrfork.c" +#include "ftsnames.c" +#include "ftstream.c" +#include "fttrigon.c" +#include "ftutil.c" + +#if defined( FT_MACINTOSH ) && !defined ( DARWIN_NO_CARBON ) +#include "ftmac.c" +#endif + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftbase.h b/android/jni/ndk_modules/freetype/src/base/ftbase.h new file mode 100644 index 00000000..1dc49f3b --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftbase.h @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* ftbase.h */ +/* */ +/* The FreeType private functions used in base module (specification). */ +/* */ +/* Copyright 2008, 2010 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBASE_H__ +#define __FTBASE_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */ + /* font, and try to load a face specified by the face_index. */ + FT_LOCAL( FT_Error ) + open_face_PS_from_sfnt_stream( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter *params, + FT_Face *aface ); + + + /* Create a new FT_Face given a buffer and a driver name. */ + /* From ftmac.c. */ + FT_LOCAL( FT_Error ) + open_face_from_buffer( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Long face_index, + const char* driver_name, + FT_Face *aface ); + + +FT_END_HEADER + +#endif /* __FTBASE_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftbbox.c b/android/jni/ndk_modules/freetype/src/base/ftbbox.c new file mode 100644 index 00000000..4b8e9112 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftbbox.c @@ -0,0 +1,662 @@ +/***************************************************************************/ +/* */ +/* ftbbox.c */ +/* */ +/* FreeType bbox computation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component has a _single_ role: to compute exact outline bounding */ + /* boxes. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_BBOX_H +#include FT_IMAGE_H +#include FT_OUTLINE_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_OBJECTS_H + + + typedef struct TBBox_Rec_ + { + FT_Vector last; + FT_BBox bbox; + + } TBBox_Rec; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Move_To */ + /* */ + /* <Description> */ + /* This function is used as a `move_to' and `line_to' emitter during */ + /* FT_Outline_Decompose(). It simply records the destination point */ + /* in `user->last'; no further computations are necessary since we */ + /* use the cbox as the starting bbox which must be refined. */ + /* */ + /* <Input> */ + /* to :: A pointer to the destination vector. */ + /* */ + /* <InOut> */ + /* user :: A pointer to the current walk context. */ + /* */ + /* <Return> */ + /* Always 0. Needed for the interface only. */ + /* */ + static int + BBox_Move_To( FT_Vector* to, + TBBox_Rec* user ) + { + user->last = *to; + + return 0; + } + + +#define CHECK_X( p, bbox ) \ + ( p->x < bbox.xMin || p->x > bbox.xMax ) + +#define CHECK_Y( p, bbox ) \ + ( p->y < bbox.yMin || p->y > bbox.yMax ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Conic_Check */ + /* */ + /* <Description> */ + /* Finds the extrema of a 1-dimensional conic Bezier curve and update */ + /* a bounding range. This version uses direct computation, as it */ + /* doesn't need square roots. */ + /* */ + /* <Input> */ + /* y1 :: The start coordinate. */ + /* */ + /* y2 :: The coordinate of the control point. */ + /* */ + /* y3 :: The end coordinate. */ + /* */ + /* <InOut> */ + /* min :: The address of the current minimum. */ + /* */ + /* max :: The address of the current maximum. */ + /* */ + static void + BBox_Conic_Check( FT_Pos y1, + FT_Pos y2, + FT_Pos y3, + FT_Pos* min, + FT_Pos* max ) + { + if ( y1 <= y3 && y2 == y1 ) /* flat arc */ + goto Suite; + + if ( y1 < y3 ) + { + if ( y2 >= y1 && y2 <= y3 ) /* ascending arc */ + goto Suite; + } + else + { + if ( y2 >= y3 && y2 <= y1 ) /* descending arc */ + { + y2 = y1; + y1 = y3; + y3 = y2; + goto Suite; + } + } + + y1 = y3 = y1 - FT_MulDiv( y2 - y1, y2 - y1, y1 - 2*y2 + y3 ); + + Suite: + if ( y1 < *min ) *min = y1; + if ( y3 > *max ) *max = y3; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Conic_To */ + /* */ + /* <Description> */ + /* This function is used as a `conic_to' emitter during */ + /* FT_Outline_Decompose(). It checks a conic Bezier curve with the */ + /* current bounding box, and computes its extrema if necessary to */ + /* update it. */ + /* */ + /* <Input> */ + /* control :: A pointer to a control point. */ + /* */ + /* to :: A pointer to the destination vector. */ + /* */ + /* <InOut> */ + /* user :: The address of the current walk context. */ + /* */ + /* <Return> */ + /* Always 0. Needed for the interface only. */ + /* */ + /* <Note> */ + /* In the case of a non-monotonous arc, we compute directly the */ + /* extremum coordinates, as it is sufficiently fast. */ + /* */ + static int + BBox_Conic_To( FT_Vector* control, + FT_Vector* to, + TBBox_Rec* user ) + { + /* we don't need to check `to' since it is always an `on' point, thus */ + /* within the bbox */ + + if ( CHECK_X( control, user->bbox ) ) + BBox_Conic_Check( user->last.x, + control->x, + to->x, + &user->bbox.xMin, + &user->bbox.xMax ); + + if ( CHECK_Y( control, user->bbox ) ) + BBox_Conic_Check( user->last.y, + control->y, + to->y, + &user->bbox.yMin, + &user->bbox.yMax ); + + user->last = *to; + + return 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Cubic_Check */ + /* */ + /* <Description> */ + /* Finds the extrema of a 1-dimensional cubic Bezier curve and */ + /* updates a bounding range. This version uses splitting because we */ + /* don't want to use square roots and extra accuracy. */ + /* */ + /* <Input> */ + /* p1 :: The start coordinate. */ + /* */ + /* p2 :: The coordinate of the first control point. */ + /* */ + /* p3 :: The coordinate of the second control point. */ + /* */ + /* p4 :: The end coordinate. */ + /* */ + /* <InOut> */ + /* min :: The address of the current minimum. */ + /* */ + /* max :: The address of the current maximum. */ + /* */ + +#if 0 + + static void + BBox_Cubic_Check( FT_Pos p1, + FT_Pos p2, + FT_Pos p3, + FT_Pos p4, + FT_Pos* min, + FT_Pos* max ) + { + FT_Pos stack[32*3 + 1], *arc; + + + arc = stack; + + arc[0] = p1; + arc[1] = p2; + arc[2] = p3; + arc[3] = p4; + + do + { + FT_Pos y1 = arc[0]; + FT_Pos y2 = arc[1]; + FT_Pos y3 = arc[2]; + FT_Pos y4 = arc[3]; + + + if ( y1 == y4 ) + { + if ( y1 == y2 && y1 == y3 ) /* flat */ + goto Test; + } + else if ( y1 < y4 ) + { + if ( y2 >= y1 && y2 <= y4 && y3 >= y1 && y3 <= y4 ) /* ascending */ + goto Test; + } + else + { + if ( y2 >= y4 && y2 <= y1 && y3 >= y4 && y3 <= y1 ) /* descending */ + { + y2 = y1; + y1 = y4; + y4 = y2; + goto Test; + } + } + + /* unknown direction -- split the arc in two */ + arc[6] = y4; + arc[1] = y1 = ( y1 + y2 ) / 2; + arc[5] = y4 = ( y4 + y3 ) / 2; + y2 = ( y2 + y3 ) / 2; + arc[2] = y1 = ( y1 + y2 ) / 2; + arc[4] = y4 = ( y4 + y2 ) / 2; + arc[3] = ( y1 + y4 ) / 2; + + arc += 3; + goto Suite; + + Test: + if ( y1 < *min ) *min = y1; + if ( y4 > *max ) *max = y4; + arc -= 3; + + Suite: + ; + } while ( arc >= stack ); + } + +#else + + static void + test_cubic_extrema( FT_Pos y1, + FT_Pos y2, + FT_Pos y3, + FT_Pos y4, + FT_Fixed u, + FT_Pos* min, + FT_Pos* max ) + { + /* FT_Pos a = y4 - 3*y3 + 3*y2 - y1; */ + FT_Pos b = y3 - 2*y2 + y1; + FT_Pos c = y2 - y1; + FT_Pos d = y1; + FT_Pos y; + FT_Fixed uu; + + FT_UNUSED ( y4 ); + + + /* The polynomial is */ + /* */ + /* P(x) = a*x^3 + 3b*x^2 + 3c*x + d , */ + /* */ + /* dP/dx = 3a*x^2 + 6b*x + 3c . */ + /* */ + /* However, we also have */ + /* */ + /* dP/dx(u) = 0 , */ + /* */ + /* which implies by subtraction that */ + /* */ + /* P(u) = b*u^2 + 2c*u + d . */ + + if ( u > 0 && u < 0x10000L ) + { + uu = FT_MulFix( u, u ); + y = d + FT_MulFix( c, 2*u ) + FT_MulFix( b, uu ); + + if ( y < *min ) *min = y; + if ( y > *max ) *max = y; + } + } + + + static void + BBox_Cubic_Check( FT_Pos y1, + FT_Pos y2, + FT_Pos y3, + FT_Pos y4, + FT_Pos* min, + FT_Pos* max ) + { + /* always compare first and last points */ + if ( y1 < *min ) *min = y1; + else if ( y1 > *max ) *max = y1; + + if ( y4 < *min ) *min = y4; + else if ( y4 > *max ) *max = y4; + + /* now, try to see if there are split points here */ + if ( y1 <= y4 ) + { + /* flat or ascending arc test */ + if ( y1 <= y2 && y2 <= y4 && y1 <= y3 && y3 <= y4 ) + return; + } + else /* y1 > y4 */ + { + /* descending arc test */ + if ( y1 >= y2 && y2 >= y4 && y1 >= y3 && y3 >= y4 ) + return; + } + + /* There are some split points. Find them. */ + { + FT_Pos a = y4 - 3*y3 + 3*y2 - y1; + FT_Pos b = y3 - 2*y2 + y1; + FT_Pos c = y2 - y1; + FT_Pos d; + FT_Fixed t; + + + /* We need to solve `ax^2+2bx+c' here, without floating points! */ + /* The trick is to normalize to a different representation in order */ + /* to use our 16.16 fixed point routines. */ + /* */ + /* We compute FT_MulFix(b,b) and FT_MulFix(a,c) after normalization. */ + /* These values must fit into a single 16.16 value. */ + /* */ + /* We normalize a, b, and c to `8.16' fixed float values to ensure */ + /* that its product is held in a `16.16' value. */ + + { + FT_ULong t1, t2; + int shift = 0; + + + /* The following computation is based on the fact that for */ + /* any value `y', if `n' is the position of the most */ + /* significant bit of `abs(y)' (starting from 0 for the */ + /* least significant bit), then `y' is in the range */ + /* */ + /* -2^n..2^n-1 */ + /* */ + /* We want to shift `a', `b', and `c' concurrently in order */ + /* to ensure that they all fit in 8.16 values, which maps */ + /* to the integer range `-2^23..2^23-1'. */ + /* */ + /* Necessarily, we need to shift `a', `b', and `c' so that */ + /* the most significant bit of its absolute values is at */ + /* _most_ at position 23. */ + /* */ + /* We begin by computing `t1' as the bitwise `OR' of the */ + /* absolute values of `a', `b', `c'. */ + + t1 = (FT_ULong)( ( a >= 0 ) ? a : -a ); + t2 = (FT_ULong)( ( b >= 0 ) ? b : -b ); + t1 |= t2; + t2 = (FT_ULong)( ( c >= 0 ) ? c : -c ); + t1 |= t2; + + /* Now we can be sure that the most significant bit of `t1' */ + /* is the most significant bit of either `a', `b', or `c', */ + /* depending on the greatest integer range of the particular */ + /* variable. */ + /* */ + /* Next, we compute the `shift', by shifting `t1' as many */ + /* times as necessary to move its MSB to position 23. This */ + /* corresponds to a value of `t1' that is in the range */ + /* 0x40_0000..0x7F_FFFF. */ + /* */ + /* Finally, we shift `a', `b', and `c' by the same amount. */ + /* This ensures that all values are now in the range */ + /* -2^23..2^23, i.e., they are now expressed as 8.16 */ + /* fixed-float numbers. This also means that we are using */ + /* 24 bits of precision to compute the zeros, independently */ + /* of the range of the original polynomial coefficients. */ + /* */ + /* This algorithm should ensure reasonably accurate values */ + /* for the zeros. Note that they are only expressed with */ + /* 16 bits when computing the extrema (the zeros need to */ + /* be in 0..1 exclusive to be considered part of the arc). */ + + if ( t1 == 0 ) /* all coefficients are 0! */ + return; + + if ( t1 > 0x7FFFFFUL ) + { + do + { + shift++; + t1 >>= 1; + + } while ( t1 > 0x7FFFFFUL ); + + /* this loses some bits of precision, but we use 24 of them */ + /* for the computation anyway */ + a >>= shift; + b >>= shift; + c >>= shift; + } + else if ( t1 < 0x400000UL ) + { + do + { + shift++; + t1 <<= 1; + + } while ( t1 < 0x400000UL ); + + a <<= shift; + b <<= shift; + c <<= shift; + } + } + + /* handle a == 0 */ + if ( a == 0 ) + { + if ( b != 0 ) + { + t = - FT_DivFix( c, b ) / 2; + test_cubic_extrema( y1, y2, y3, y4, t, min, max ); + } + } + else + { + /* solve the equation now */ + d = FT_MulFix( b, b ) - FT_MulFix( a, c ); + if ( d < 0 ) + return; + + if ( d == 0 ) + { + /* there is a single split point at -b/a */ + t = - FT_DivFix( b, a ); + test_cubic_extrema( y1, y2, y3, y4, t, min, max ); + } + else + { + /* there are two solutions; we need to filter them */ + d = FT_SqrtFixed( (FT_Int32)d ); + t = - FT_DivFix( b - d, a ); + test_cubic_extrema( y1, y2, y3, y4, t, min, max ); + + t = - FT_DivFix( b + d, a ); + test_cubic_extrema( y1, y2, y3, y4, t, min, max ); + } + } + } + } + +#endif + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Cubic_To */ + /* */ + /* <Description> */ + /* This function is used as a `cubic_to' emitter during */ + /* FT_Outline_Decompose(). It checks a cubic Bezier curve with the */ + /* current bounding box, and computes its extrema if necessary to */ + /* update it. */ + /* */ + /* <Input> */ + /* control1 :: A pointer to the first control point. */ + /* */ + /* control2 :: A pointer to the second control point. */ + /* */ + /* to :: A pointer to the destination vector. */ + /* */ + /* <InOut> */ + /* user :: The address of the current walk context. */ + /* */ + /* <Return> */ + /* Always 0. Needed for the interface only. */ + /* */ + /* <Note> */ + /* In the case of a non-monotonous arc, we don't compute directly */ + /* extremum coordinates, we subdivide instead. */ + /* */ + static int + BBox_Cubic_To( FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to, + TBBox_Rec* user ) + { + /* we don't need to check `to' since it is always an `on' point, thus */ + /* within the bbox */ + + if ( CHECK_X( control1, user->bbox ) || + CHECK_X( control2, user->bbox ) ) + BBox_Cubic_Check( user->last.x, + control1->x, + control2->x, + to->x, + &user->bbox.xMin, + &user->bbox.xMax ); + + if ( CHECK_Y( control1, user->bbox ) || + CHECK_Y( control2, user->bbox ) ) + BBox_Cubic_Check( user->last.y, + control1->y, + control2->y, + to->y, + &user->bbox.yMin, + &user->bbox.yMax ); + + user->last = *to; + + return 0; + } + +FT_DEFINE_OUTLINE_FUNCS(bbox_interface, + (FT_Outline_MoveTo_Func) BBox_Move_To, + (FT_Outline_LineTo_Func) BBox_Move_To, + (FT_Outline_ConicTo_Func)BBox_Conic_To, + (FT_Outline_CubicTo_Func)BBox_Cubic_To, + 0, 0 + ) + + /* documentation is in ftbbox.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ) + { + FT_BBox cbox; + FT_BBox bbox; + FT_Vector* vec; + FT_UShort n; + + + if ( !abbox ) + return FT_Err_Invalid_Argument; + + if ( !outline ) + return FT_Err_Invalid_Outline; + + /* if outline is empty, return (0,0,0,0) */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + { + abbox->xMin = abbox->xMax = 0; + abbox->yMin = abbox->yMax = 0; + return 0; + } + + /* We compute the control box as well as the bounding box of */ + /* all `on' points in the outline. Then, if the two boxes */ + /* coincide, we exit immediately. */ + + vec = outline->points; + bbox.xMin = bbox.xMax = cbox.xMin = cbox.xMax = vec->x; + bbox.yMin = bbox.yMax = cbox.yMin = cbox.yMax = vec->y; + vec++; + + for ( n = 1; n < outline->n_points; n++ ) + { + FT_Pos x = vec->x; + FT_Pos y = vec->y; + + + /* update control box */ + if ( x < cbox.xMin ) cbox.xMin = x; + if ( x > cbox.xMax ) cbox.xMax = x; + + if ( y < cbox.yMin ) cbox.yMin = y; + if ( y > cbox.yMax ) cbox.yMax = y; + + if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON ) + { + /* update bbox for `on' points only */ + if ( x < bbox.xMin ) bbox.xMin = x; + if ( x > bbox.xMax ) bbox.xMax = x; + + if ( y < bbox.yMin ) bbox.yMin = y; + if ( y > bbox.yMax ) bbox.yMax = y; + } + + vec++; + } + + /* test two boxes for equality */ + if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax || + cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax ) + { + /* the two boxes are different, now walk over the outline to */ + /* get the Bezier arc extrema. */ + + FT_Error error; + TBBox_Rec user; + +#ifdef FT_CONFIG_OPTION_PIC + FT_Outline_Funcs bbox_interface; + Init_Class_bbox_interface(&bbox_interface); +#endif + + user.bbox = bbox; + + error = FT_Outline_Decompose( outline, &bbox_interface, &user ); + if ( error ) + return error; + + *abbox = user.bbox; + } + else + *abbox = bbox; + + return FT_Err_Ok; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftbitmap.c b/android/jni/ndk_modules/freetype/src/base/ftbitmap.c new file mode 100644 index 00000000..46fcce61 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftbitmap.c @@ -0,0 +1,663 @@ +/***************************************************************************/ +/* */ +/* ftbitmap.c */ +/* */ +/* FreeType utility functions for bitmaps (body). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_BITMAP_H +#include FT_IMAGE_H +#include FT_INTERNAL_OBJECTS_H + + + static + const FT_Bitmap null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 }; + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ) + { + *abitmap = null_bitmap; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target) + { + FT_Memory memory = library->memory; + FT_Error error = FT_Err_Ok; + FT_Int pitch = source->pitch; + FT_ULong size; + + + if ( source == target ) + return FT_Err_Ok; + + if ( source->buffer == NULL ) + { + *target = *source; + + return FT_Err_Ok; + } + + if ( pitch < 0 ) + pitch = -pitch; + size = (FT_ULong)( pitch * source->rows ); + + if ( target->buffer ) + { + FT_Int target_pitch = target->pitch; + FT_ULong target_size; + + + if ( target_pitch < 0 ) + target_pitch = -target_pitch; + target_size = (FT_ULong)( target_pitch * target->rows ); + + if ( target_size != size ) + (void)FT_QREALLOC( target->buffer, target_size, size ); + } + else + (void)FT_QALLOC( target->buffer, size ); + + if ( !error ) + { + unsigned char *p; + + + p = target->buffer; + *target = *source; + target->buffer = p; + + FT_MEM_COPY( target->buffer, source->buffer, size ); + } + + return error; + } + + + static FT_Error + ft_bitmap_assure_buffer( FT_Memory memory, + FT_Bitmap* bitmap, + FT_UInt xpixels, + FT_UInt ypixels ) + { + FT_Error error; + int pitch; + int new_pitch; + FT_UInt bpp; + FT_Int i, width, height; + unsigned char* buffer; + + + width = bitmap->width; + height = bitmap->rows; + pitch = bitmap->pitch; + if ( pitch < 0 ) + pitch = -pitch; + + switch ( bitmap->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + bpp = 1; + new_pitch = ( width + xpixels + 7 ) >> 3; + break; + case FT_PIXEL_MODE_GRAY2: + bpp = 2; + new_pitch = ( width + xpixels + 3 ) >> 2; + break; + case FT_PIXEL_MODE_GRAY4: + bpp = 4; + new_pitch = ( width + xpixels + 1 ) >> 1; + break; + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + bpp = 8; + new_pitch = ( width + xpixels ); + break; + default: + return FT_Err_Invalid_Glyph_Format; + } + + /* if no need to allocate memory */ + if ( ypixels == 0 && new_pitch <= pitch ) + { + /* zero the padding */ + FT_Int bit_width = pitch * 8; + FT_Int bit_last = ( width + xpixels ) * bpp; + + + if ( bit_last < bit_width ) + { + FT_Byte* line = bitmap->buffer + ( bit_last >> 3 ); + FT_Byte* end = bitmap->buffer + pitch; + FT_Int shift = bit_last & 7; + FT_UInt mask = 0xFF00U >> shift; + FT_Int count = height; + + + for ( ; count > 0; count--, line += pitch, end += pitch ) + { + FT_Byte* write = line; + + + if ( shift > 0 ) + { + write[0] = (FT_Byte)( write[0] & mask ); + write++; + } + if ( write < end ) + FT_MEM_ZERO( write, end-write ); + } + } + + return FT_Err_Ok; + } + + if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) ) + return error; + + if ( bitmap->pitch > 0 ) + { + FT_Int len = ( width * bpp + 7 ) >> 3; + + + for ( i = 0; i < bitmap->rows; i++ ) + FT_MEM_COPY( buffer + new_pitch * ( ypixels + i ), + bitmap->buffer + pitch * i, len ); + } + else + { + FT_Int len = ( width * bpp + 7 ) >> 3; + + + for ( i = 0; i < bitmap->rows; i++ ) + FT_MEM_COPY( buffer + new_pitch * i, + bitmap->buffer + pitch * i, len ); + } + + FT_FREE( bitmap->buffer ); + bitmap->buffer = buffer; + + if ( bitmap->pitch < 0 ) + new_pitch = -new_pitch; + + /* set pitch only, width and height are left untouched */ + bitmap->pitch = new_pitch; + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ) + { + FT_Error error; + unsigned char* p; + FT_Int i, x, y, pitch; + FT_Int xstr, ystr; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !bitmap || !bitmap->buffer ) + return FT_Err_Invalid_Argument; + + if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) || + ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) ) + return FT_Err_Invalid_Argument; + + xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6; + ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6; + + if ( xstr == 0 && ystr == 0 ) + return FT_Err_Ok; + else if ( xstr < 0 || ystr < 0 ) + return FT_Err_Invalid_Argument; + + switch ( bitmap->pixel_mode ) + { + case FT_PIXEL_MODE_GRAY2: + case FT_PIXEL_MODE_GRAY4: + { + FT_Bitmap tmp; + FT_Int align; + + + if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY2 ) + align = ( bitmap->width + xstr + 3 ) / 4; + else + align = ( bitmap->width + xstr + 1 ) / 2; + + FT_Bitmap_New( &tmp ); + + error = FT_Bitmap_Convert( library, bitmap, &tmp, align ); + if ( error ) + return error; + + FT_Bitmap_Done( library, bitmap ); + *bitmap = tmp; + } + break; + + case FT_PIXEL_MODE_MONO: + if ( xstr > 8 ) + xstr = 8; + break; + + case FT_PIXEL_MODE_LCD: + xstr *= 3; + break; + + case FT_PIXEL_MODE_LCD_V: + ystr *= 3; + break; + } + + error = ft_bitmap_assure_buffer( library->memory, bitmap, xstr, ystr ); + if ( error ) + return error; + + pitch = bitmap->pitch; + if ( pitch > 0 ) + p = bitmap->buffer + pitch * ystr; + else + { + pitch = -pitch; + p = bitmap->buffer + pitch * ( bitmap->rows - 1 ); + } + + /* for each row */ + for ( y = 0; y < bitmap->rows ; y++ ) + { + /* + * Horizontally: + * + * From the last pixel on, make each pixel or'ed with the + * `xstr' pixels before it. + */ + for ( x = pitch - 1; x >= 0; x-- ) + { + unsigned char tmp; + + + tmp = p[x]; + for ( i = 1; i <= xstr; i++ ) + { + if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO ) + { + p[x] |= tmp >> i; + + /* the maximum value of 8 for `xstr' comes from here */ + if ( x > 0 ) + p[x] |= p[x - 1] << ( 8 - i ); + +#if 0 + if ( p[x] == 0xff ) + break; +#endif + } + else + { + if ( x - i >= 0 ) + { + if ( p[x] + p[x - i] > bitmap->num_grays - 1 ) + { + p[x] = (unsigned char)(bitmap->num_grays - 1); + break; + } + else + { + p[x] = (unsigned char)(p[x] + p[x-i]); + if ( p[x] == bitmap->num_grays - 1 ) + break; + } + } + else + break; + } + } + } + + /* + * Vertically: + * + * Make the above `ystr' rows or'ed with it. + */ + for ( x = 1; x <= ystr; x++ ) + { + unsigned char* q; + + + q = p - bitmap->pitch * x; + for ( i = 0; i < pitch; i++ ) + q[i] |= p[i]; + } + + p += bitmap->pitch; + } + + bitmap->width += xstr; + bitmap->rows += ystr; + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + memory = library->memory; + + switch ( source->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_GRAY2: + case FT_PIXEL_MODE_GRAY4: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + { + FT_Int pad; + FT_Long old_size; + + + old_size = target->rows * target->pitch; + if ( old_size < 0 ) + old_size = -old_size; + + target->pixel_mode = FT_PIXEL_MODE_GRAY; + target->rows = source->rows; + target->width = source->width; + + pad = 0; + if ( alignment > 0 ) + { + pad = source->width % alignment; + if ( pad != 0 ) + pad = alignment - pad; + } + + target->pitch = source->width + pad; + + if ( target->rows * target->pitch > old_size && + FT_QREALLOC( target->buffer, + old_size, target->rows * target->pitch ) ) + return error; + } + break; + + default: + error = FT_Err_Invalid_Argument; + } + + switch ( source->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + { + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + FT_Int i; + + + target->num_grays = 2; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_Int j; + + + /* get the full bytes */ + for ( j = source->width >> 3; j > 0; j-- ) + { + FT_Int val = ss[0]; /* avoid a byte->int cast on each line */ + + + tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 ); + tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 ); + tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 ); + tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 ); + tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 ); + tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 ); + tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 ); + tt[7] = (FT_Byte)( val & 0x01 ); + + tt += 8; + ss += 1; + } + + /* get remaining pixels (if any) */ + j = source->width & 7; + if ( j > 0 ) + { + FT_Int val = *ss; + + + for ( ; j > 0; j-- ) + { + tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7); + val <<= 1; + tt += 1; + } + } + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + { + FT_Int width = source->width; + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + FT_Int s_pitch = source->pitch; + FT_Int t_pitch = target->pitch; + FT_Int i; + + + target->num_grays = 256; + + for ( i = source->rows; i > 0; i-- ) + { + FT_ARRAY_COPY( t, s, width ); + + s += s_pitch; + t += t_pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY2: + { + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + FT_Int i; + + + target->num_grays = 4; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_Int j; + + + /* get the full bytes */ + for ( j = source->width >> 2; j > 0; j-- ) + { + FT_Int val = ss[0]; + + + tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); + tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 ); + tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 ); + tt[3] = (FT_Byte)( ( val & 0x03 ) ); + + ss += 1; + tt += 4; + } + + j = source->width & 3; + if ( j > 0 ) + { + FT_Int val = ss[0]; + + + for ( ; j > 0; j-- ) + { + tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); + val <<= 2; + tt += 1; + } + } + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY4: + { + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + FT_Int i; + + + target->num_grays = 16; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_Int j; + + + /* get the full bytes */ + for ( j = source->width >> 1; j > 0; j-- ) + { + FT_Int val = ss[0]; + + + tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 ); + tt[1] = (FT_Byte)( ( val & 0x0F ) ); + + ss += 1; + tt += 2; + } + + if ( source->width & 1 ) + tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 ); + + s += source->pitch; + t += target->pitch; + } + } + break; + + + default: + ; + } + + return error; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ) + { + if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP && + !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) + { + FT_Bitmap bitmap; + FT_Error error; + + + FT_Bitmap_New( &bitmap ); + error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap ); + if ( error ) + return error; + + slot->bitmap = bitmap; + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + } + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ) + { + FT_Memory memory; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !bitmap ) + return FT_Err_Invalid_Argument; + + memory = library->memory; + + FT_FREE( bitmap->buffer ); + *bitmap = null_bitmap; + + return FT_Err_Ok; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftcalc.c b/android/jni/ndk_modules/freetype/src/base/ftcalc.c new file mode 100644 index 00000000..3892fabf --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftcalc.c @@ -0,0 +1,957 @@ +/***************************************************************************/ +/* */ +/* ftcalc.c */ +/* */ +/* Arithmetic computations (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Support for 1-complement arithmetic has been totally dropped in this */ + /* release. You can still write your own code if you need it. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Implementing basic computation routines. */ + /* */ + /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(), */ + /* and FT_FloorFix() are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_GLYPH_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H + +#ifdef FT_MULFIX_INLINED +#undef FT_MulFix +#endif + +/* we need to define a 64-bits data type here */ + +#ifdef FT_LONG64 + + typedef FT_INT64 FT_Int64; + +#else + + typedef struct FT_Int64_ + { + FT_UInt32 lo; + FT_UInt32 hi; + + } FT_Int64; + +#endif /* FT_LONG64 */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_calc + + + /* The following three functions are available regardless of whether */ + /* FT_LONG64 is defined. */ + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_RoundFix( FT_Fixed a ) + { + return ( a >= 0 ) ? ( a + 0x8000L ) & ~0xFFFFL + : -((-a + 0x8000L ) & ~0xFFFFL ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_CeilFix( FT_Fixed a ) + { + return ( a >= 0 ) ? ( a + 0xFFFFL ) & ~0xFFFFL + : -((-a + 0xFFFFL ) & ~0xFFFFL ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_FloorFix( FT_Fixed a ) + { + return ( a >= 0 ) ? a & ~0xFFFFL + : -((-a) & ~0xFFFFL ); + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* documentation is in ftcalc.h */ + + FT_EXPORT_DEF( FT_Int32 ) + FT_Sqrt32( FT_Int32 x ) + { + FT_UInt32 val, root, newroot, mask; + + + root = 0; + mask = (FT_UInt32)0x40000000UL; + val = (FT_UInt32)x; + + do + { + newroot = root + mask; + if ( newroot <= val ) + { + val -= newroot; + root = newroot + mask; + } + + root >>= 1; + mask >>= 2; + + } while ( mask != 0 ); + + return root; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + +#ifdef FT_LONG64 + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ) + { +#ifdef FT_MULFIX_ASSEMBLER + + return FT_MULFIX_ASSEMBLER( a, b ); + +#else + + FT_Int s = 1; + FT_Long c; + + + if ( a < 0 ) + { + a = -a; + s = -1; + } + + if ( b < 0 ) + { + b = -b; + s = -s; + } + + c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 ); + + return ( s > 0 ) ? c : -c; + +#endif /* FT_MULFIX_ASSEMBLER */ + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ) + { + FT_Int32 s; + FT_UInt32 q; + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + + if ( b == 0 ) + /* check for division by 0 */ + q = 0x7FFFFFFFL; + else + /* compute result directly */ + q = (FT_UInt32)( ( ( (FT_Int64)a << 16 ) + ( b >> 1 ) ) / b ); + + return ( s < 0 ? -(FT_Long)q : (FT_Long)q ); + } + + +#else /* !FT_LONG64 */ + + + static void + ft_multo64( FT_UInt32 x, + FT_UInt32 y, + FT_Int64 *z ) + { + FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; + + + lo1 = x & 0x0000FFFFU; hi1 = x >> 16; + lo2 = y & 0x0000FFFFU; hi2 = y >> 16; + + lo = lo1 * lo2; + i1 = lo1 * hi2; + i2 = lo2 * hi1; + hi = hi1 * hi2; + + /* Check carry overflow of i1 + i2 */ + i1 += i2; + hi += (FT_UInt32)( i1 < i2 ) << 16; + + hi += i1 >> 16; + i1 = i1 << 16; + + /* Check carry overflow of i1 + lo */ + lo += i1; + hi += ( lo < i1 ); + + z->lo = lo; + z->hi = hi; + } + + + static FT_UInt32 + ft_div64by32( FT_UInt32 hi, + FT_UInt32 lo, + FT_UInt32 y ) + { + FT_UInt32 r, q; + FT_Int i; + + + q = 0; + r = hi; + + if ( r >= y ) + return (FT_UInt32)0x7FFFFFFFL; + + i = 32; + do + { + r <<= 1; + q <<= 1; + r |= lo >> 31; + + if ( r >= (FT_UInt32)y ) + { + r -= y; + q |= 1; + } + lo <<= 1; + } while ( --i ); + + return q; + } + + + static void + FT_Add64( FT_Int64* x, + FT_Int64* y, + FT_Int64 *z ) + { + register FT_UInt32 lo, hi; + + + lo = x->lo + y->lo; + hi = x->hi + y->hi + ( lo < x->lo ); + + z->lo = lo; + z->hi = hi; + } + + + /* documentation is in freetype.h */ + + /* The FT_MulDiv function has been optimized thanks to ideas from */ + /* Graham Asher. The trick is to optimize computation when everything */ + /* fits within 32-bits (a rather common case). */ + /* */ + /* we compute 'a*b+c/2', then divide it by 'c'. (positive values) */ + /* */ + /* 46340 is FLOOR(SQRT(2^31-1)). */ + /* */ + /* if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 ) */ + /* */ + /* 0x7FFFFFFF - 0x7FFEA810 = 0x157F0 */ + /* */ + /* if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF ) */ + /* */ + /* and 2*0x157F0 = 176096 */ + /* */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ) + { + long s; + + + /* XXX: this function does not allow 64-bit arguments */ + if ( a == 0 || b == c ) + return a; + + s = a; a = FT_ABS( a ); + s ^= b; b = FT_ABS( b ); + s ^= c; c = FT_ABS( c ); + + if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 ) + a = ( a * b + ( c >> 1 ) ) / c; + + else if ( c > 0 ) + { + FT_Int64 temp, temp2; + + + ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp ); + + temp2.hi = 0; + temp2.lo = (FT_UInt32)(c >> 1); + FT_Add64( &temp, &temp2, &temp ); + a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c ); + } + else + a = 0x7FFFFFFFL; + + return ( s < 0 ? -a : a ); + } + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_BASE_DEF( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ) + { + long s; + + + if ( a == 0 || b == c ) + return a; + + s = a; a = FT_ABS( a ); + s ^= b; b = FT_ABS( b ); + s ^= c; c = FT_ABS( c ); + + if ( a <= 46340L && b <= 46340L && c > 0 ) + a = a * b / c; + + else if ( c > 0 ) + { + FT_Int64 temp; + + + ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp ); + a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c ); + } + else + a = 0x7FFFFFFFL; + + return ( s < 0 ? -a : a ); + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ) + { +#ifdef FT_MULFIX_ASSEMBLER + + return FT_MULFIX_ASSEMBLER( a, b ); + +#elif 0 + + /* + * This code is nonportable. See comment below. + * + * However, on a platform where right-shift of a signed quantity fills + * the leftmost bits by copying the sign bit, it might be faster. + */ + + FT_Long sa, sb; + FT_ULong ua, ub; + + + if ( a == 0 || b == 0x10000L ) + return a; + + /* + * This is a clever way of converting a signed number `a' into its + * absolute value (stored back into `a') and its sign. The sign is + * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a' + * was negative. (Similarly for `b' and `sb'). + * + * Unfortunately, it doesn't work (at least not portably). + * + * It makes the assumption that right-shift on a negative signed value + * fills the leftmost bits by copying the sign bit. This is wrong. + * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206, + * the result of right-shift of a negative signed value is + * implementation-defined. At least one implementation fills the + * leftmost bits with 0s (i.e., it is exactly the same as an unsigned + * right shift). This means that when `a' is negative, `sa' ends up + * with the value 1 rather than -1. After that, everything else goes + * wrong. + */ + sa = ( a >> ( sizeof ( a ) * 8 - 1 ) ); + a = ( a ^ sa ) - sa; + sb = ( b >> ( sizeof ( b ) * 8 - 1 ) ); + b = ( b ^ sb ) - sb; + + ua = (FT_ULong)a; + ub = (FT_ULong)b; + + if ( ua <= 2048 && ub <= 1048576L ) + ua = ( ua * ub + 0x8000U ) >> 16; + else + { + FT_ULong al = ua & 0xFFFFU; + + + ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) + + ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 ); + } + + sa ^= sb, + ua = (FT_ULong)(( ua ^ sa ) - sa); + + return (FT_Long)ua; + +#else /* 0 */ + + FT_Long s; + FT_ULong ua, ub; + + + if ( a == 0 || b == 0x10000L ) + return a; + + s = a; a = FT_ABS( a ); + s ^= b; b = FT_ABS( b ); + + ua = (FT_ULong)a; + ub = (FT_ULong)b; + + if ( ua <= 2048 && ub <= 1048576L ) + ua = ( ua * ub + 0x8000UL ) >> 16; + else + { + FT_ULong al = ua & 0xFFFFUL; + + + ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) + + ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 ); + } + + return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua ); + +#endif /* 0 */ + + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ) + { + FT_Int32 s; + FT_UInt32 q; + + + /* XXX: this function does not allow 64-bit arguments */ + s = (FT_Int32)a; a = FT_ABS( a ); + s ^= (FT_Int32)b; b = FT_ABS( b ); + + if ( b == 0 ) + { + /* check for division by 0 */ + q = (FT_UInt32)0x7FFFFFFFL; + } + else if ( ( a >> 16 ) == 0 ) + { + /* compute result directly */ + q = (FT_UInt32)( (a << 16) + (b >> 1) ) / (FT_UInt32)b; + } + else + { + /* we need more bits; we have to do it by hand */ + FT_Int64 temp, temp2; + + temp.hi = (FT_Int32) (a >> 16); + temp.lo = (FT_UInt32)(a << 16); + temp2.hi = 0; + temp2.lo = (FT_UInt32)( b >> 1 ); + FT_Add64( &temp, &temp2, &temp ); + q = ft_div64by32( temp.hi, temp.lo, (FT_Int32)b ); + } + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + + +#if 0 + + /* documentation is in ftcalc.h */ + + FT_EXPORT_DEF( void ) + FT_MulTo64( FT_Int32 x, + FT_Int32 y, + FT_Int64 *z ) + { + FT_Int32 s; + + + s = x; x = FT_ABS( x ); + s ^= y; y = FT_ABS( y ); + + ft_multo64( x, y, z ); + + if ( s < 0 ) + { + z->lo = (FT_UInt32)-(FT_Int32)z->lo; + z->hi = ~z->hi + !( z->lo ); + } + } + + + /* apparently, the second version of this code is not compiled correctly */ + /* on Mac machines with the MPW C compiler.. tsk, tsk, tsk... */ + +#if 1 + + FT_EXPORT_DEF( FT_Int32 ) + FT_Div64by32( FT_Int64* x, + FT_Int32 y ) + { + FT_Int32 s; + FT_UInt32 q, r, i, lo; + + + s = x->hi; + if ( s < 0 ) + { + x->lo = (FT_UInt32)-(FT_Int32)x->lo; + x->hi = ~x->hi + !x->lo; + } + s ^= y; y = FT_ABS( y ); + + /* Shortcut */ + if ( x->hi == 0 ) + { + if ( y > 0 ) + q = x->lo / y; + else + q = 0x7FFFFFFFL; + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + + r = x->hi; + lo = x->lo; + + if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */ + return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL ); + /* Return Max/Min Int32 if division overflow. */ + /* This includes division by zero! */ + q = 0; + for ( i = 0; i < 32; i++ ) + { + r <<= 1; + q <<= 1; + r |= lo >> 31; + + if ( r >= (FT_UInt32)y ) + { + r -= y; + q |= 1; + } + lo <<= 1; + } + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + +#else /* 0 */ + + FT_EXPORT_DEF( FT_Int32 ) + FT_Div64by32( FT_Int64* x, + FT_Int32 y ) + { + FT_Int32 s; + FT_UInt32 q; + + + s = x->hi; + if ( s < 0 ) + { + x->lo = (FT_UInt32)-(FT_Int32)x->lo; + x->hi = ~x->hi + !x->lo; + } + s ^= y; y = FT_ABS( y ); + + /* Shortcut */ + if ( x->hi == 0 ) + { + if ( y > 0 ) + q = ( x->lo + ( y >> 1 ) ) / y; + else + q = 0x7FFFFFFFL; + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + + q = ft_div64by32( x->hi, x->lo, y ); + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + +#endif /* 0 */ + +#endif /* 0 */ + + +#endif /* FT_LONG64 */ + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix *b ) + { + FT_Fixed xx, xy, yx, yy; + + + if ( !a || !b ) + return; + + xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx ); + xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy ); + yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx ); + yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy ); + + b->xx = xx; b->xy = xy; + b->yx = yx; b->yy = yy; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ) + { + FT_Pos delta, xx, yy; + + + if ( !matrix ) + return FT_Err_Invalid_Argument; + + /* compute discriminant */ + delta = FT_MulFix( matrix->xx, matrix->yy ) - + FT_MulFix( matrix->xy, matrix->yx ); + + if ( !delta ) + return FT_Err_Invalid_Argument; /* matrix can't be inverted */ + + matrix->xy = - FT_DivFix( matrix->xy, delta ); + matrix->yx = - FT_DivFix( matrix->yx, delta ); + + xx = matrix->xx; + yy = matrix->yy; + + matrix->xx = FT_DivFix( yy, delta ); + matrix->yy = FT_DivFix( xx, delta ); + + return FT_Err_Ok; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( void ) + FT_Matrix_Multiply_Scaled( const FT_Matrix* a, + FT_Matrix *b, + FT_Long scaling ) + { + FT_Fixed xx, xy, yx, yy; + + FT_Long val = 0x10000L * scaling; + + + if ( !a || !b ) + return; + + xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val ); + xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val ); + yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val ); + yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val ); + + b->xx = xx; b->xy = xy; + b->yx = yx; b->yy = yy; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( void ) + FT_Vector_Transform_Scaled( FT_Vector* vector, + const FT_Matrix* matrix, + FT_Long scaling ) + { + FT_Pos xz, yz; + + FT_Long val = 0x10000L * scaling; + + + if ( !vector || !matrix ) + return; + + xz = FT_MulDiv( vector->x, matrix->xx, val ) + + FT_MulDiv( vector->y, matrix->xy, val ); + + yz = FT_MulDiv( vector->x, matrix->yx, val ) + + FT_MulDiv( vector->y, matrix->yy, val ); + + vector->x = xz; + vector->y = yz; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int32 ) + FT_SqrtFixed( FT_Int32 x ) + { + FT_UInt32 root, rem_hi, rem_lo, test_div; + FT_Int count; + + + root = 0; + + if ( x > 0 ) + { + rem_hi = 0; + rem_lo = x; + count = 24; + do + { + rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 ); + rem_lo <<= 2; + root <<= 1; + test_div = ( root << 1 ) + 1; + + if ( rem_hi >= test_div ) + { + rem_hi -= test_div; + root += 1; + } + } while ( --count ); + } + + return (FT_Int32)root; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int ) + ft_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + FT_Long result; /* avoid overflow on 16-bit system */ + + + /* deal with the trivial cases quickly */ + if ( in_y == 0 ) + { + if ( in_x >= 0 ) + result = out_y; + else + result = -out_y; + } + else if ( in_x == 0 ) + { + if ( in_y >= 0 ) + result = -out_x; + else + result = out_x; + } + else if ( out_y == 0 ) + { + if ( out_x >= 0 ) + result = in_y; + else + result = -in_y; + } + else if ( out_x == 0 ) + { + if ( out_y >= 0 ) + result = -in_x; + else + result = in_x; + } + else /* general case */ + { +#ifdef FT_LONG64 + + FT_Int64 delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x; + + + if ( delta == 0 ) + result = 0; + else + result = 1 - 2 * ( delta < 0 ); + +#else + + FT_Int64 z1, z2; + + + /* XXX: this function does not allow 64-bit arguments */ + ft_multo64( (FT_Int32)in_x, (FT_Int32)out_y, &z1 ); + ft_multo64( (FT_Int32)in_y, (FT_Int32)out_x, &z2 ); + + if ( z1.hi > z2.hi ) + result = +1; + else if ( z1.hi < z2.hi ) + result = -1; + else if ( z1.lo > z2.lo ) + result = +1; + else if ( z1.lo < z2.lo ) + result = -1; + else + result = 0; + +#endif + } + + /* XXX: only the sign of return value, +1/0/-1 must be used */ + return (FT_Int)result; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int ) + ft_corner_is_flat( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + FT_Pos ax = in_x; + FT_Pos ay = in_y; + + FT_Pos d_in, d_out, d_corner; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + d_in = ax + ay; + + ax = out_x; + if ( ax < 0 ) + ax = -ax; + ay = out_y; + if ( ay < 0 ) + ay = -ay; + d_out = ax + ay; + + ax = out_x + in_x; + if ( ax < 0 ) + ax = -ax; + ay = out_y + in_y; + if ( ay < 0 ) + ay = -ay; + d_corner = ax + ay; + + return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftdbgmem.c b/android/jni/ndk_modules/freetype/src/base/ftdbgmem.c new file mode 100644 index 00000000..160269d1 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftdbgmem.c @@ -0,0 +1,997 @@ +/***************************************************************************/ +/* */ +/* ftdbgmem.c */ +/* */ +/* Memory debugger (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_MEMORY_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H + + +#ifdef FT_DEBUG_MEMORY + +#define KEEPALIVE /* `Keep alive' means that freed blocks aren't released + * to the heap. This is useful to detect double-frees + * or weird heap corruption, but it uses large amounts of + * memory, however. + */ + +#include FT_CONFIG_STANDARD_LIBRARY_H + + FT_BASE_DEF( const char* ) _ft_debug_file = 0; + FT_BASE_DEF( long ) _ft_debug_lineno = 0; + + extern void + FT_DumpMemory( FT_Memory memory ); + + + typedef struct FT_MemSourceRec_* FT_MemSource; + typedef struct FT_MemNodeRec_* FT_MemNode; + typedef struct FT_MemTableRec_* FT_MemTable; + + +#define FT_MEM_VAL( addr ) ((FT_ULong)(FT_Pointer)( addr )) + + /* + * This structure holds statistics for a single allocation/release + * site. This is useful to know where memory operations happen the + * most. + */ + typedef struct FT_MemSourceRec_ + { + const char* file_name; + long line_no; + + FT_Long cur_blocks; /* current number of allocated blocks */ + FT_Long max_blocks; /* max. number of allocated blocks */ + FT_Long all_blocks; /* total number of blocks allocated */ + + FT_Long cur_size; /* current cumulative allocated size */ + FT_Long max_size; /* maximum cumulative allocated size */ + FT_Long all_size; /* total cumulative allocated size */ + + FT_Long cur_max; /* current maximum allocated size */ + + FT_UInt32 hash; + FT_MemSource link; + + } FT_MemSourceRec; + + + /* + * We don't need a resizable array for the memory sources, because + * their number is pretty limited within FreeType. + */ +#define FT_MEM_SOURCE_BUCKETS 128 + + /* + * This structure holds information related to a single allocated + * memory block. If KEEPALIVE is defined, blocks that are freed by + * FreeType are never released to the system. Instead, their `size' + * field is set to -size. This is mainly useful to detect double frees, + * at the price of large memory footprint during execution. + */ + typedef struct FT_MemNodeRec_ + { + FT_Byte* address; + FT_Long size; /* < 0 if the block was freed */ + + FT_MemSource source; + +#ifdef KEEPALIVE + const char* free_file_name; + FT_Long free_line_no; +#endif + + FT_MemNode link; + + } FT_MemNodeRec; + + + /* + * The global structure, containing compound statistics and all hash + * tables. + */ + typedef struct FT_MemTableRec_ + { + FT_ULong size; + FT_ULong nodes; + FT_MemNode* buckets; + + FT_ULong alloc_total; + FT_ULong alloc_current; + FT_ULong alloc_max; + FT_ULong alloc_count; + + FT_Bool bound_total; + FT_ULong alloc_total_max; + + FT_Bool bound_count; + FT_ULong alloc_count_max; + + FT_MemSource sources[FT_MEM_SOURCE_BUCKETS]; + + FT_Bool keep_alive; + + FT_Memory memory; + FT_Pointer memory_user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + + } FT_MemTableRec; + + +#define FT_MEM_SIZE_MIN 7 +#define FT_MEM_SIZE_MAX 13845163 + +#define FT_FILENAME( x ) ((x) ? (x) : "unknown file") + + + /* + * Prime numbers are ugly to handle. It would be better to implement + * L-Hashing, which is 10% faster and doesn't require divisions. + */ + static const FT_UInt ft_mem_primes[] = + { + 7, + 11, + 19, + 37, + 73, + 109, + 163, + 251, + 367, + 557, + 823, + 1237, + 1861, + 2777, + 4177, + 6247, + 9371, + 14057, + 21089, + 31627, + 47431, + 71143, + 106721, + 160073, + 240101, + 360163, + 540217, + 810343, + 1215497, + 1823231, + 2734867, + 4102283, + 6153409, + 9230113, + 13845163, + }; + + + static FT_ULong + ft_mem_closest_prime( FT_ULong num ) + { + FT_UInt i; + + + for ( i = 0; + i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ ) + if ( ft_mem_primes[i] > num ) + return ft_mem_primes[i]; + + return FT_MEM_SIZE_MAX; + } + + + extern void + ft_mem_debug_panic( const char* fmt, + ... ) + { + va_list ap; + + + printf( "FreeType.Debug: " ); + + va_start( ap, fmt ); + vprintf( fmt, ap ); + va_end( ap ); + + printf( "\n" ); + exit( EXIT_FAILURE ); + } + + + static FT_Pointer + ft_mem_table_alloc( FT_MemTable table, + FT_Long size ) + { + FT_Memory memory = table->memory; + FT_Pointer block; + + + memory->user = table->memory_user; + block = table->alloc( memory, size ); + memory->user = table; + + return block; + } + + + static void + ft_mem_table_free( FT_MemTable table, + FT_Pointer block ) + { + FT_Memory memory = table->memory; + + + memory->user = table->memory_user; + table->free( memory, block ); + memory->user = table; + } + + + static void + ft_mem_table_resize( FT_MemTable table ) + { + FT_ULong new_size; + + + new_size = ft_mem_closest_prime( table->nodes ); + if ( new_size != table->size ) + { + FT_MemNode* new_buckets; + FT_ULong i; + + + new_buckets = (FT_MemNode *) + ft_mem_table_alloc( table, + new_size * sizeof ( FT_MemNode ) ); + if ( new_buckets == NULL ) + return; + + FT_ARRAY_ZERO( new_buckets, new_size ); + + for ( i = 0; i < table->size; i++ ) + { + FT_MemNode node, next, *pnode; + FT_ULong hash; + + + node = table->buckets[i]; + while ( node ) + { + next = node->link; + hash = FT_MEM_VAL( node->address ) % new_size; + pnode = new_buckets + hash; + + node->link = pnode[0]; + pnode[0] = node; + + node = next; + } + } + + if ( table->buckets ) + ft_mem_table_free( table, table->buckets ); + + table->buckets = new_buckets; + table->size = new_size; + } + } + + + static FT_MemTable + ft_mem_table_new( FT_Memory memory ) + { + FT_MemTable table; + + + table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) ); + if ( table == NULL ) + goto Exit; + + FT_ZERO( table ); + + table->size = FT_MEM_SIZE_MIN; + table->nodes = 0; + + table->memory = memory; + + table->memory_user = memory->user; + + table->alloc = memory->alloc; + table->realloc = memory->realloc; + table->free = memory->free; + + table->buckets = (FT_MemNode *) + memory->alloc( memory, + table->size * sizeof ( FT_MemNode ) ); + if ( table->buckets ) + FT_ARRAY_ZERO( table->buckets, table->size ); + else + { + memory->free( memory, table ); + table = NULL; + } + + Exit: + return table; + } + + + static void + ft_mem_table_destroy( FT_MemTable table ) + { + FT_ULong i; + + + FT_DumpMemory( table->memory ); + + if ( table ) + { + FT_Long leak_count = 0; + FT_ULong leaks = 0; + + + /* remove all blocks from the table, revealing leaked ones */ + for ( i = 0; i < table->size; i++ ) + { + FT_MemNode *pnode = table->buckets + i, next, node = *pnode; + + + while ( node ) + { + next = node->link; + node->link = 0; + + if ( node->size > 0 ) + { + printf( + "leaked memory block at address %p, size %8ld in (%s:%ld)\n", + node->address, node->size, + FT_FILENAME( node->source->file_name ), + node->source->line_no ); + + leak_count++; + leaks += node->size; + + ft_mem_table_free( table, node->address ); + } + + node->address = NULL; + node->size = 0; + + ft_mem_table_free( table, node ); + node = next; + } + table->buckets[i] = 0; + } + + ft_mem_table_free( table, table->buckets ); + table->buckets = NULL; + + table->size = 0; + table->nodes = 0; + + /* remove all sources */ + for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ ) + { + FT_MemSource source, next; + + + for ( source = table->sources[i]; source != NULL; source = next ) + { + next = source->link; + ft_mem_table_free( table, source ); + } + + table->sources[i] = NULL; + } + + printf( + "FreeType: total memory allocations = %ld\n", table->alloc_total ); + printf( + "FreeType: maximum memory footprint = %ld\n", table->alloc_max ); + + ft_mem_table_free( table, table ); + + if ( leak_count > 0 ) + ft_mem_debug_panic( + "FreeType: %ld bytes of memory leaked in %ld blocks\n", + leaks, leak_count ); + + printf( "FreeType: no memory leaks detected\n" ); + } + } + + + static FT_MemNode* + ft_mem_table_get_nodep( FT_MemTable table, + FT_Byte* address ) + { + FT_ULong hash; + FT_MemNode *pnode, node; + + + hash = FT_MEM_VAL( address ); + pnode = table->buckets + ( hash % table->size ); + + for (;;) + { + node = pnode[0]; + if ( !node ) + break; + + if ( node->address == address ) + break; + + pnode = &node->link; + } + return pnode; + } + + + static FT_MemSource + ft_mem_table_get_source( FT_MemTable table ) + { + FT_UInt32 hash; + FT_MemSource node, *pnode; + + + /* cast to FT_PtrDist first since void* can be larger */ + /* than FT_UInt32 and GCC 4.1.1 emits a warning */ + hash = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file + + (FT_UInt32)( 5 * _ft_debug_lineno ); + pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS]; + + for ( ;; ) + { + node = *pnode; + if ( node == NULL ) + break; + + if ( node->file_name == _ft_debug_file && + node->line_no == _ft_debug_lineno ) + goto Exit; + + pnode = &node->link; + } + + node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) ); + if ( node == NULL ) + ft_mem_debug_panic( + "not enough memory to perform memory debugging\n" ); + + node->file_name = _ft_debug_file; + node->line_no = _ft_debug_lineno; + + node->cur_blocks = 0; + node->max_blocks = 0; + node->all_blocks = 0; + + node->cur_size = 0; + node->max_size = 0; + node->all_size = 0; + + node->cur_max = 0; + + node->link = NULL; + node->hash = hash; + *pnode = node; + + Exit: + return node; + } + + + static void + ft_mem_table_set( FT_MemTable table, + FT_Byte* address, + FT_ULong size, + FT_Long delta ) + { + FT_MemNode *pnode, node; + + + if ( table ) + { + FT_MemSource source; + + + pnode = ft_mem_table_get_nodep( table, address ); + node = *pnode; + if ( node ) + { + if ( node->size < 0 ) + { + /* This block was already freed. Our memory is now completely */ + /* corrupted! */ + /* This can only happen in keep-alive mode. */ + ft_mem_debug_panic( + "memory heap corrupted (allocating freed block)" ); + } + else + { + /* This block was already allocated. This means that our memory */ + /* is also corrupted! */ + ft_mem_debug_panic( + "memory heap corrupted (re-allocating allocated block at" + " %p, of size %ld)\n" + "org=%s:%d new=%s:%d\n", + node->address, node->size, + FT_FILENAME( node->source->file_name ), node->source->line_no, + FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); + } + } + + /* we need to create a new node in this table */ + node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) ); + if ( node == NULL ) + ft_mem_debug_panic( "not enough memory to run memory tests" ); + + node->address = address; + node->size = size; + node->source = source = ft_mem_table_get_source( table ); + + if ( delta == 0 ) + { + /* this is an allocation */ + source->all_blocks++; + source->cur_blocks++; + if ( source->cur_blocks > source->max_blocks ) + source->max_blocks = source->cur_blocks; + } + + if ( size > (FT_ULong)source->cur_max ) + source->cur_max = size; + + if ( delta != 0 ) + { + /* we are growing or shrinking a reallocated block */ + source->cur_size += delta; + table->alloc_current += delta; + } + else + { + /* we are allocating a new block */ + source->cur_size += size; + table->alloc_current += size; + } + + source->all_size += size; + + if ( source->cur_size > source->max_size ) + source->max_size = source->cur_size; + + node->free_file_name = NULL; + node->free_line_no = 0; + + node->link = pnode[0]; + + pnode[0] = node; + table->nodes++; + + table->alloc_total += size; + + if ( table->alloc_current > table->alloc_max ) + table->alloc_max = table->alloc_current; + + if ( table->nodes * 3 < table->size || + table->size * 3 < table->nodes ) + ft_mem_table_resize( table ); + } + } + + + static void + ft_mem_table_remove( FT_MemTable table, + FT_Byte* address, + FT_Long delta ) + { + if ( table ) + { + FT_MemNode *pnode, node; + + + pnode = ft_mem_table_get_nodep( table, address ); + node = *pnode; + if ( node ) + { + FT_MemSource source; + + + if ( node->size < 0 ) + ft_mem_debug_panic( + "freeing memory block at %p more than once at (%s:%ld)\n" + "block allocated at (%s:%ld) and released at (%s:%ld)", + address, + FT_FILENAME( _ft_debug_file ), _ft_debug_lineno, + FT_FILENAME( node->source->file_name ), node->source->line_no, + FT_FILENAME( node->free_file_name ), node->free_line_no ); + + /* scramble the node's content for additional safety */ + FT_MEM_SET( address, 0xF3, node->size ); + + if ( delta == 0 ) + { + source = node->source; + + source->cur_blocks--; + source->cur_size -= node->size; + + table->alloc_current -= node->size; + } + + if ( table->keep_alive ) + { + /* we simply invert the node's size to indicate that the node */ + /* was freed. */ + node->size = -node->size; + node->free_file_name = _ft_debug_file; + node->free_line_no = _ft_debug_lineno; + } + else + { + table->nodes--; + + *pnode = node->link; + + node->size = 0; + node->source = NULL; + + ft_mem_table_free( table, node ); + + if ( table->nodes * 3 < table->size || + table->size * 3 < table->nodes ) + ft_mem_table_resize( table ); + } + } + else + ft_mem_debug_panic( + "trying to free unknown block at %p in (%s:%ld)\n", + address, + FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); + } + } + + + extern FT_Pointer + ft_mem_debug_alloc( FT_Memory memory, + FT_Long size ) + { + FT_MemTable table = (FT_MemTable)memory->user; + FT_Byte* block; + + + if ( size <= 0 ) + ft_mem_debug_panic( "negative block size allocation (%ld)", size ); + + /* return NULL if the maximum number of allocations was reached */ + if ( table->bound_count && + table->alloc_count >= table->alloc_count_max ) + return NULL; + + /* return NULL if this allocation would overflow the maximum heap size */ + if ( table->bound_total && + table->alloc_total_max - table->alloc_current > (FT_ULong)size ) + return NULL; + + block = (FT_Byte *)ft_mem_table_alloc( table, size ); + if ( block ) + { + ft_mem_table_set( table, block, (FT_ULong)size, 0 ); + + table->alloc_count++; + } + + _ft_debug_file = "<unknown>"; + _ft_debug_lineno = 0; + + return (FT_Pointer)block; + } + + + extern void + ft_mem_debug_free( FT_Memory memory, + FT_Pointer block ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( block == NULL ) + ft_mem_debug_panic( "trying to free NULL in (%s:%ld)", + FT_FILENAME( _ft_debug_file ), + _ft_debug_lineno ); + + ft_mem_table_remove( table, (FT_Byte*)block, 0 ); + + if ( !table->keep_alive ) + ft_mem_table_free( table, block ); + + table->alloc_count--; + + _ft_debug_file = "<unknown>"; + _ft_debug_lineno = 0; + } + + + extern FT_Pointer + ft_mem_debug_realloc( FT_Memory memory, + FT_Long cur_size, + FT_Long new_size, + FT_Pointer block ) + { + FT_MemTable table = (FT_MemTable)memory->user; + FT_MemNode node, *pnode; + FT_Pointer new_block; + FT_Long delta; + + const char* file_name = FT_FILENAME( _ft_debug_file ); + FT_Long line_no = _ft_debug_lineno; + + + /* unlikely, but possible */ + if ( new_size == cur_size ) + return block; + + /* the following is valid according to ANSI C */ +#if 0 + if ( block == NULL || cur_size == 0 ) + ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)", + file_name, line_no ); +#endif + + /* while the following is allowed in ANSI C also, we abort since */ + /* such case should be handled by FreeType. */ + if ( new_size <= 0 ) + ft_mem_debug_panic( + "trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)", + block, cur_size, file_name, line_no ); + + /* check `cur_size' value */ + pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block ); + node = *pnode; + if ( !node ) + ft_mem_debug_panic( + "trying to reallocate unknown block at %p in (%s:%ld)", + block, file_name, line_no ); + + if ( node->size <= 0 ) + ft_mem_debug_panic( + "trying to reallocate freed block at %p in (%s:%ld)", + block, file_name, line_no ); + + if ( node->size != cur_size ) + ft_mem_debug_panic( "invalid ft_realloc request for %p. cur_size is " + "%ld instead of %ld in (%s:%ld)", + block, cur_size, node->size, file_name, line_no ); + + /* return NULL if the maximum number of allocations was reached */ + if ( table->bound_count && + table->alloc_count >= table->alloc_count_max ) + return NULL; + + delta = (FT_Long)( new_size - cur_size ); + + /* return NULL if this allocation would overflow the maximum heap size */ + if ( delta > 0 && + table->bound_total && + table->alloc_current + (FT_ULong)delta > table->alloc_total_max ) + return NULL; + + new_block = (FT_Byte *)ft_mem_table_alloc( table, new_size ); + if ( new_block == NULL ) + return NULL; + + ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta ); + + ft_memcpy( new_block, block, cur_size < new_size ? cur_size : new_size ); + + ft_mem_table_remove( table, (FT_Byte*)block, delta ); + + _ft_debug_file = "<unknown>"; + _ft_debug_lineno = 0; + + if ( !table->keep_alive ) + ft_mem_table_free( table, block ); + + return new_block; + } + + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ) + { + FT_MemTable table; + FT_Int result = 0; + + + if ( getenv( "FT2_DEBUG_MEMORY" ) ) + { + table = ft_mem_table_new( memory ); + if ( table ) + { + const char* p; + + + memory->user = table; + memory->alloc = ft_mem_debug_alloc; + memory->realloc = ft_mem_debug_realloc; + memory->free = ft_mem_debug_free; + + p = getenv( "FT2_ALLOC_TOTAL_MAX" ); + if ( p != NULL ) + { + FT_Long total_max = ft_atol( p ); + + + if ( total_max > 0 ) + { + table->bound_total = 1; + table->alloc_total_max = (FT_ULong)total_max; + } + } + + p = getenv( "FT2_ALLOC_COUNT_MAX" ); + if ( p != NULL ) + { + FT_Long total_count = ft_atol( p ); + + + if ( total_count > 0 ) + { + table->bound_count = 1; + table->alloc_count_max = (FT_ULong)total_count; + } + } + + p = getenv( "FT2_KEEP_ALIVE" ); + if ( p != NULL ) + { + FT_Long keep_alive = ft_atol( p ); + + + if ( keep_alive > 0 ) + table->keep_alive = 1; + } + + result = 1; + } + } + return result; + } + + + extern void + ft_mem_debug_done( FT_Memory memory ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( table ) + { + memory->free = table->free; + memory->realloc = table->realloc; + memory->alloc = table->alloc; + + ft_mem_table_destroy( table ); + memory->user = NULL; + } + } + + + + static int + ft_mem_source_compare( const void* p1, + const void* p2 ) + { + FT_MemSource s1 = *(FT_MemSource*)p1; + FT_MemSource s2 = *(FT_MemSource*)p2; + + + if ( s2->max_size > s1->max_size ) + return 1; + else if ( s2->max_size < s1->max_size ) + return -1; + else + return 0; + } + + + extern void + FT_DumpMemory( FT_Memory memory ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( table ) + { + FT_MemSource* bucket = table->sources; + FT_MemSource* limit = bucket + FT_MEM_SOURCE_BUCKETS; + FT_MemSource* sources; + FT_UInt nn, count; + const char* fmt; + + + count = 0; + for ( ; bucket < limit; bucket++ ) + { + FT_MemSource source = *bucket; + + + for ( ; source; source = source->link ) + count++; + } + + sources = (FT_MemSource*)ft_mem_table_alloc( + table, sizeof ( *sources ) * count ); + + count = 0; + for ( bucket = table->sources; bucket < limit; bucket++ ) + { + FT_MemSource source = *bucket; + + + for ( ; source; source = source->link ) + sources[count++] = source; + } + + ft_qsort( sources, count, sizeof ( *sources ), ft_mem_source_compare ); + + printf( "FreeType Memory Dump: " + "current=%ld max=%ld total=%ld count=%ld\n", + table->alloc_current, table->alloc_max, + table->alloc_total, table->alloc_count ); + printf( " block block sizes sizes sizes source\n" ); + printf( " count high sum highsum max location\n" ); + printf( "-------------------------------------------------\n" ); + + fmt = "%6ld %6ld %8ld %8ld %8ld %s:%d\n"; + + for ( nn = 0; nn < count; nn++ ) + { + FT_MemSource source = sources[nn]; + + + printf( fmt, + source->cur_blocks, source->max_blocks, + source->cur_size, source->max_size, source->cur_max, + FT_FILENAME( source->file_name ), + source->line_no ); + } + printf( "------------------------------------------------\n" ); + + ft_mem_table_free( table, sources ); + } + } + +#else /* !FT_DEBUG_MEMORY */ + + /* ANSI C doesn't like empty source files */ + typedef int _debug_mem_dummy; + +#endif /* !FT_DEBUG_MEMORY */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftdebug.c b/android/jni/ndk_modules/freetype/src/base/ftdebug.c new file mode 100644 index 00000000..2adbeabe --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftdebug.c @@ -0,0 +1,246 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component contains various macros and functions used to ease the */ + /* debugging of the FreeType engine. Its main purpose is in assertion */ + /* checking, tracing, and error detection. */ + /* */ + /* There are now three debugging modes: */ + /* */ + /* - trace mode */ + /* */ + /* Error and trace messages are sent to the log file (which can be the */ + /* standard error output). */ + /* */ + /* - error mode */ + /* */ + /* Only error messages are generated. */ + /* */ + /* - release mode: */ + /* */ + /* No error message is sent or generated. The code is free from any */ + /* debugging parts. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H + + +#ifdef FT_DEBUG_LEVEL_ERROR + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Message( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Panic( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + + exit( EXIT_FAILURE ); + } + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* array of trace levels, initialized to 0 */ + int ft_trace_levels[trace_count]; + + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include FT_INTERNAL_TRACE_H + NULL + }; + +#undef FT_TRACE_DEF + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return trace_count; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + int max = FT_Trace_Get_Count(); + + + if ( idx < max ) + return ft_trace_toggles[idx]; + else + return NULL; + } + + + /*************************************************************************/ + /* */ + /* Initialize the tracing sub-system. This is done by retrieving the */ + /* value of the `FT2_DEBUG' environment variable. It must be a list of */ + /* toggles, separated by spaces, `;', or `,'. Example: */ + /* */ + /* export FT2_DEBUG="any:3 memory:7 stream:5" */ + /* */ + /* This requests that all levels be set to 3, except the trace level for */ + /* the memory and stream components which are set to 7 and 5, */ + /* respectively. */ + /* */ + /* See the file <include/freetype/internal/fttrace.h> for details of the */ + /* available toggle names. */ + /* */ + /* The level must be between 0 and 7; 0 means quiet (except for serious */ + /* runtime errors), and 7 means _very_ verbose. */ + /* */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + const char* ft2_debug = getenv( "FT2_DEBUG" ); + + + if ( ft2_debug ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( *p == ':' && p > q ) + { + FT_Int n, i, len = (FT_Int)( p - q ); + FT_Int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p++ - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for `any' */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels[n] = level; + } + else + ft_trace_levels[found] = level; + } + } + } + } + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return 0; + } + + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + FT_UNUSED( idx ); + + return NULL; + } + + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftgasp.c b/android/jni/ndk_modules/freetype/src/base/ftgasp.c new file mode 100644 index 00000000..8485d292 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftgasp.c @@ -0,0 +1,61 @@ +/***************************************************************************/ +/* */ +/* ftgasp.c */ +/* */ +/* Access of TrueType's `gasp' table (body). */ +/* */ +/* Copyright 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_GASP_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + + FT_EXPORT_DEF( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ) + { + FT_Int result = FT_GASP_NO_TABLE; + + + if ( face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( ttface->gasp.numRanges > 0 ) + { + TT_GaspRange range = ttface->gasp.gaspRanges; + TT_GaspRange range_end = range + ttface->gasp.numRanges; + + + while ( ppem > range->maxPPEM ) + { + range++; + if ( range >= range_end ) + goto Exit; + } + + result = range->gaspFlag; + + /* ensure that we don't have spurious bits */ + if ( ttface->gasp.version == 0 ) + result &= 3; + } + } + Exit: + return result; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftgloadr.c b/android/jni/ndk_modules/freetype/src/base/ftgloadr.c new file mode 100644 index 00000000..84834501 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftgloadr.c @@ -0,0 +1,401 @@ +/***************************************************************************/ +/* */ +/* ftgloadr.c */ +/* */ +/* The FreeType glyph loader (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_GLYPH_LOADER_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_OBJECTS_H + +#undef FT_COMPONENT +#define FT_COMPONENT trace_gloader + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** G L Y P H L O A D E R *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* The glyph loader is a simple object which is used to load a set of */ + /* glyphs easily. It is critical for the correct loading of composites. */ + /* */ + /* Ideally, one can see it as a stack of abstract `glyph' objects. */ + /* */ + /* loader.base Is really the bottom of the stack. It describes a */ + /* single glyph image made of the juxtaposition of */ + /* several glyphs (those `in the stack'). */ + /* */ + /* loader.current Describes the top of the stack, on which a new */ + /* glyph can be loaded. */ + /* */ + /* Rewind Clears the stack. */ + /* Prepare Set up `loader.current' for addition of a new glyph */ + /* image. */ + /* Add Add the `current' glyph image to the `base' one, */ + /* and prepare for another one. */ + /* */ + /* The glyph loader is now a base object. Each driver used to */ + /* re-implement it in one way or the other, which wasted code and */ + /* energy. */ + /* */ + /*************************************************************************/ + + + /* create a new glyph loader */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader *aloader ) + { + FT_GlyphLoader loader = NULL; + FT_Error error; + + + if ( !FT_NEW( loader ) ) + { + loader->memory = memory; + *aloader = loader; + } + return error; + } + + + /* rewind the glyph loader - reset counters to 0 */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Rewind( FT_GlyphLoader loader ) + { + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + base->outline.n_points = 0; + base->outline.n_contours = 0; + base->num_subglyphs = 0; + + *current = *base; + } + + + /* reset the glyph loader, frees all allocated tables */ + /* and starts from zero */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Reset( FT_GlyphLoader loader ) + { + FT_Memory memory = loader->memory; + + + FT_FREE( loader->base.outline.points ); + FT_FREE( loader->base.outline.tags ); + FT_FREE( loader->base.outline.contours ); + FT_FREE( loader->base.extra_points ); + FT_FREE( loader->base.subglyphs ); + + loader->base.extra_points2 = NULL; + + loader->max_points = 0; + loader->max_contours = 0; + loader->max_subglyphs = 0; + + FT_GlyphLoader_Rewind( loader ); + } + + + /* delete a glyph loader */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Done( FT_GlyphLoader loader ) + { + if ( loader ) + { + FT_Memory memory = loader->memory; + + + FT_GlyphLoader_Reset( loader ); + FT_FREE( loader ); + } + } + + + /* re-adjust the `current' outline fields */ + static void + FT_GlyphLoader_Adjust_Points( FT_GlyphLoader loader ) + { + FT_Outline* base = &loader->base.outline; + FT_Outline* current = &loader->current.outline; + + + current->points = base->points + base->n_points; + current->tags = base->tags + base->n_points; + current->contours = base->contours + base->n_contours; + + /* handle extra points table - if any */ + if ( loader->use_extra ) + { + loader->current.extra_points = loader->base.extra_points + + base->n_points; + + loader->current.extra_points2 = loader->base.extra_points2 + + base->n_points; + } + } + + + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ) + { + FT_Error error; + FT_Memory memory = loader->memory; + + + if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) ) + { + loader->use_extra = 1; + loader->base.extra_points2 = loader->base.extra_points + + loader->max_points; + + FT_GlyphLoader_Adjust_Points( loader ); + } + return error; + } + + + /* re-adjust the `current' subglyphs field */ + static void + FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader loader ) + { + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + current->subglyphs = base->subglyphs + base->num_subglyphs; + } + + + /* Ensure that we can add `n_points' and `n_contours' to our glyph. */ + /* This function reallocates its outline tables if necessary. Note that */ + /* it DOESN'T change the number of points within the loader! */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, + FT_UInt n_points, + FT_UInt n_contours ) + { + FT_Memory memory = loader->memory; + FT_Error error = FT_Err_Ok; + FT_Outline* base = &loader->base.outline; + FT_Outline* current = &loader->current.outline; + FT_Bool adjust = 0; + + FT_UInt new_max, old_max; + + + /* check points & tags */ + new_max = base->n_points + current->n_points + n_points; + old_max = loader->max_points; + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + + if ( new_max > FT_OUTLINE_POINTS_MAX ) + return FT_Err_Array_Too_Large; + + if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) || + FT_RENEW_ARRAY( base->tags, old_max, new_max ) ) + goto Exit; + + if ( loader->use_extra ) + { + if ( FT_RENEW_ARRAY( loader->base.extra_points, + old_max * 2, new_max * 2 ) ) + goto Exit; + + FT_ARRAY_MOVE( loader->base.extra_points + new_max, + loader->base.extra_points + old_max, + old_max ); + + loader->base.extra_points2 = loader->base.extra_points + new_max; + } + + adjust = 1; + loader->max_points = new_max; + } + + /* check contours */ + old_max = loader->max_contours; + new_max = base->n_contours + current->n_contours + + n_contours; + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 4 ); + + if ( new_max > FT_OUTLINE_CONTOURS_MAX ) + return FT_Err_Array_Too_Large; + + if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) + goto Exit; + + adjust = 1; + loader->max_contours = new_max; + } + + if ( adjust ) + FT_GlyphLoader_Adjust_Points( loader ); + + Exit: + return error; + } + + + /* Ensure that we can add `n_subglyphs' to our glyph. this function */ + /* reallocates its subglyphs table if necessary. Note that it DOES */ + /* NOT change the number of subglyphs within the loader! */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, + FT_UInt n_subs ) + { + FT_Memory memory = loader->memory; + FT_Error error = FT_Err_Ok; + FT_UInt new_max, old_max; + + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + new_max = base->num_subglyphs + current->num_subglyphs + n_subs; + old_max = loader->max_subglyphs; + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 2 ); + if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) ) + goto Exit; + + loader->max_subglyphs = new_max; + + FT_GlyphLoader_Adjust_Subglyphs( loader ); + } + + Exit: + return error; + } + + + /* prepare loader for the addition of a new glyph on top of the base one */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Prepare( FT_GlyphLoader loader ) + { + FT_GlyphLoad current = &loader->current; + + + current->outline.n_points = 0; + current->outline.n_contours = 0; + current->num_subglyphs = 0; + + FT_GlyphLoader_Adjust_Points ( loader ); + FT_GlyphLoader_Adjust_Subglyphs( loader ); + } + + + /* add current glyph to the base image - and prepare for another */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Add( FT_GlyphLoader loader ) + { + FT_GlyphLoad base; + FT_GlyphLoad current; + + FT_UInt n_curr_contours; + FT_UInt n_base_points; + FT_UInt n; + + + if ( !loader ) + return; + + base = &loader->base; + current = &loader->current; + + n_curr_contours = current->outline.n_contours; + n_base_points = base->outline.n_points; + + base->outline.n_points = + (short)( base->outline.n_points + current->outline.n_points ); + base->outline.n_contours = + (short)( base->outline.n_contours + current->outline.n_contours ); + + base->num_subglyphs += current->num_subglyphs; + + /* adjust contours count in newest outline */ + for ( n = 0; n < n_curr_contours; n++ ) + current->outline.contours[n] = + (short)( current->outline.contours[n] + n_base_points ); + + /* prepare for another new glyph image */ + FT_GlyphLoader_Prepare( loader ); + } + + + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, + FT_GlyphLoader source ) + { + FT_Error error; + FT_UInt num_points = source->base.outline.n_points; + FT_UInt num_contours = source->base.outline.n_contours; + + + error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours ); + if ( !error ) + { + FT_Outline* out = &target->base.outline; + FT_Outline* in = &source->base.outline; + + + FT_ARRAY_COPY( out->points, in->points, + num_points ); + FT_ARRAY_COPY( out->tags, in->tags, + num_points ); + FT_ARRAY_COPY( out->contours, in->contours, + num_contours ); + + /* do we need to copy the extra points? */ + if ( target->use_extra && source->use_extra ) + { + FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points, + num_points ); + FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2, + num_points ); + } + + out->n_points = (short)num_points; + out->n_contours = (short)num_contours; + + FT_GlyphLoader_Adjust_Points( target ); + } + + return error; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftglyph.c b/android/jni/ndk_modules/freetype/src/base/ftglyph.c new file mode 100644 index 00000000..b2205080 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftglyph.c @@ -0,0 +1,627 @@ +/***************************************************************************/ +/* */ +/* ftglyph.c */ +/* */ +/* FreeType convenience functions to handle glyphs (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file contains the definition of several convenience functions */ + /* that can be used by client applications to easily retrieve glyph */ + /* bitmaps and outlines from a given face. */ + /* */ + /* These functions should be optional if you are writing a font server */ + /* or text layout engine on top of FreeType. However, they are pretty */ + /* handy for many other simple uses of the library. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_GLYPH_H +#include FT_OUTLINE_H +#include FT_BITMAP_H +#include FT_INTERNAL_OBJECTS_H + +#include "basepic.h" + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_glyph + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_BitmapGlyph support ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + ft_bitmap_glyph_init( FT_Glyph bitmap_glyph, + FT_GlyphSlot slot ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + FT_Error error = FT_Err_Ok; + FT_Library library = FT_GLYPH( glyph )->library; + + + if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) + { + error = FT_Err_Invalid_Glyph_Format; + goto Exit; + } + + glyph->left = slot->bitmap_left; + glyph->top = slot->bitmap_top; + + /* do lazy copying whenever possible */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + glyph->bitmap = slot->bitmap; + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + else + { + FT_Bitmap_New( &glyph->bitmap ); + error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap ); + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_bitmap_glyph_copy( FT_Glyph bitmap_source, + FT_Glyph bitmap_target ) + { + FT_Library library = bitmap_source->library; + FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source; + FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target; + + + target->left = source->left; + target->top = source->top; + + return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap ); + } + + + FT_CALLBACK_DEF( void ) + ft_bitmap_glyph_done( FT_Glyph bitmap_glyph ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + FT_Library library = FT_GLYPH( glyph )->library; + + + FT_Bitmap_Done( library, &glyph->bitmap ); + } + + + FT_CALLBACK_DEF( void ) + ft_bitmap_glyph_bbox( FT_Glyph bitmap_glyph, + FT_BBox* cbox ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + + + cbox->xMin = glyph->left << 6; + cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 ); + cbox->yMax = glyph->top << 6; + cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 ); + } + + + FT_DEFINE_GLYPH(ft_bitmap_glyph_class, + sizeof ( FT_BitmapGlyphRec ), + FT_GLYPH_FORMAT_BITMAP, + + ft_bitmap_glyph_init, + ft_bitmap_glyph_done, + ft_bitmap_glyph_copy, + 0, /* FT_Glyph_TransformFunc */ + ft_bitmap_glyph_bbox, + 0 /* FT_Glyph_PrepareFunc */ + ) + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_OutlineGlyph support ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_init( FT_Glyph outline_glyph, + FT_GlyphSlot slot ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + FT_Error error = FT_Err_Ok; + FT_Library library = FT_GLYPH( glyph )->library; + FT_Outline* source = &slot->outline; + FT_Outline* target = &glyph->outline; + + + /* check format in glyph slot */ + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) + { + error = FT_Err_Invalid_Glyph_Format; + goto Exit; + } + + /* allocate new outline */ + error = FT_Outline_New( library, source->n_points, source->n_contours, + &glyph->outline ); + if ( error ) + goto Exit; + + FT_Outline_Copy( source, target ); + + Exit: + return error; + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_done( FT_Glyph outline_glyph ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_copy( FT_Glyph outline_source, + FT_Glyph outline_target ) + { + FT_OutlineGlyph source = (FT_OutlineGlyph)outline_source; + FT_OutlineGlyph target = (FT_OutlineGlyph)outline_target; + FT_Error error; + FT_Library library = FT_GLYPH( source )->library; + + + error = FT_Outline_New( library, source->outline.n_points, + source->outline.n_contours, &target->outline ); + if ( !error ) + FT_Outline_Copy( &source->outline, &target->outline ); + + return error; + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_transform( FT_Glyph outline_glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + if ( matrix ) + FT_Outline_Transform( &glyph->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &glyph->outline, delta->x, delta->y ); + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_bbox( FT_Glyph outline_glyph, + FT_BBox* bbox ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + FT_Outline_Get_CBox( &glyph->outline, bbox ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_prepare( FT_Glyph outline_glyph, + FT_GlyphSlot slot ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + slot->format = FT_GLYPH_FORMAT_OUTLINE; + slot->outline = glyph->outline; + slot->outline.flags &= ~FT_OUTLINE_OWNER; + + return FT_Err_Ok; + } + + + FT_DEFINE_GLYPH( ft_outline_glyph_class, + sizeof ( FT_OutlineGlyphRec ), + FT_GLYPH_FORMAT_OUTLINE, + + ft_outline_glyph_init, + ft_outline_glyph_done, + ft_outline_glyph_copy, + ft_outline_glyph_transform, + ft_outline_glyph_bbox, + ft_outline_glyph_prepare + ) + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_Glyph class and API ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + ft_new_glyph( FT_Library library, + const FT_Glyph_Class* clazz, + FT_Glyph* aglyph ) + { + FT_Memory memory = library->memory; + FT_Error error; + FT_Glyph glyph = NULL; + + + *aglyph = 0; + + if ( !FT_ALLOC( glyph, clazz->glyph_size ) ) + { + glyph->library = library; + glyph->clazz = clazz; + glyph->format = clazz->glyph_format; + + *aglyph = glyph; + } + + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ) + { + FT_Glyph copy; + FT_Error error; + const FT_Glyph_Class* clazz; + + + /* check arguments */ + if ( !target ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + *target = 0; + + if ( !source || !source->clazz ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + clazz = source->clazz; + error = ft_new_glyph( source->library, clazz, © ); + if ( error ) + goto Exit; + + copy->advance = source->advance; + copy->format = source->format; + + if ( clazz->glyph_copy ) + error = clazz->glyph_copy( source, copy ); + + if ( error ) + FT_Done_Glyph( copy ); + else + *target = copy; + + Exit: + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ) + { + FT_Library library; + FT_Error error; + FT_Glyph glyph; + + const FT_Glyph_Class* clazz = 0; + + + if ( !slot ) + return FT_Err_Invalid_Slot_Handle; + + library = slot->library; + + if ( !aglyph ) + return FT_Err_Invalid_Argument; + + /* if it is a bitmap, that's easy :-) */ + if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + clazz = FT_BITMAP_GLYPH_CLASS_GET; + + /* if it is an outline */ + else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + clazz = FT_OUTLINE_GLYPH_CLASS_GET; + + else + { + /* try to find a renderer that supports the glyph image format */ + FT_Renderer render = FT_Lookup_Renderer( library, slot->format, 0 ); + + + if ( render ) + clazz = &render->glyph_class; + } + + if ( !clazz ) + { + error = FT_Err_Invalid_Glyph_Format; + goto Exit; + } + + /* create FT_Glyph object */ + error = ft_new_glyph( library, clazz, &glyph ); + if ( error ) + goto Exit; + + /* copy advance while converting it to 16.16 format */ + glyph->advance.x = slot->advance.x << 10; + glyph->advance.y = slot->advance.y << 10; + + /* now import the image from the glyph slot */ + error = clazz->glyph_init( glyph, slot ); + + /* if an error occurred, destroy the glyph */ + if ( error ) + FT_Done_Glyph( glyph ); + else + *aglyph = glyph; + + Exit: + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ) + { + const FT_Glyph_Class* clazz; + FT_Error error = FT_Err_Ok; + + + if ( !glyph || !glyph->clazz ) + error = FT_Err_Invalid_Argument; + else + { + clazz = glyph->clazz; + if ( clazz->glyph_transform ) + { + /* transform glyph image */ + clazz->glyph_transform( glyph, matrix, delta ); + + /* transform advance vector */ + if ( matrix ) + FT_Vector_Transform( &glyph->advance, matrix ); + } + else + error = FT_Err_Invalid_Glyph_Format; + } + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ) + { + const FT_Glyph_Class* clazz; + + + if ( !acbox ) + return; + + acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0; + + if ( !glyph || !glyph->clazz ) + return; + else + { + clazz = glyph->clazz; + if ( !clazz->glyph_bbox ) + return; + else + { + /* retrieve bbox in 26.6 coordinates */ + clazz->glyph_bbox( glyph, acbox ); + + /* perform grid fitting if needed */ + if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT || + bbox_mode == FT_GLYPH_BBOX_PIXELS ) + { + acbox->xMin = FT_PIX_FLOOR( acbox->xMin ); + acbox->yMin = FT_PIX_FLOOR( acbox->yMin ); + acbox->xMax = FT_PIX_CEIL( acbox->xMax ); + acbox->yMax = FT_PIX_CEIL( acbox->yMax ); + } + + /* convert to integer pixels if needed */ + if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE || + bbox_mode == FT_GLYPH_BBOX_PIXELS ) + { + acbox->xMin >>= 6; + acbox->yMin >>= 6; + acbox->xMax >>= 6; + acbox->yMax >>= 6; + } + } + } + return; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + FT_Vector* origin, + FT_Bool destroy ) + { + FT_GlyphSlotRec dummy; + FT_GlyphSlot_InternalRec dummy_internal; + FT_Error error = FT_Err_Ok; + FT_Glyph glyph; + FT_BitmapGlyph bitmap = NULL; + + const FT_Glyph_Class* clazz; + +#ifdef FT_CONFIG_OPTION_PIC + FT_Library library = FT_GLYPH( glyph )->library; +#endif + + + /* check argument */ + if ( !the_glyph ) + goto Bad; + + /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */ + /* then calling FT_Render_Glyph_Internal() */ + + glyph = *the_glyph; + if ( !glyph ) + goto Bad; + + clazz = glyph->clazz; + + /* when called with a bitmap glyph, do nothing and return successfully */ + if ( clazz == FT_BITMAP_GLYPH_CLASS_GET ) + goto Exit; + + if ( !clazz || !clazz->glyph_prepare ) + goto Bad; + + FT_MEM_ZERO( &dummy, sizeof ( dummy ) ); + FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) ); + dummy.internal = &dummy_internal; + dummy.library = glyph->library; + dummy.format = clazz->glyph_format; + + /* create result bitmap glyph */ + error = ft_new_glyph( glyph->library, FT_BITMAP_GLYPH_CLASS_GET, + (FT_Glyph*)(void*)&bitmap ); + if ( error ) + goto Exit; + +#if 1 + /* if `origin' is set, translate the glyph image */ + if ( origin ) + FT_Glyph_Transform( glyph, 0, origin ); +#else + FT_UNUSED( origin ); +#endif + + /* prepare dummy slot for rendering */ + error = clazz->glyph_prepare( glyph, &dummy ); + if ( !error ) + error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode ); + +#if 1 + if ( !destroy && origin ) + { + FT_Vector v; + + + v.x = -origin->x; + v.y = -origin->y; + FT_Glyph_Transform( glyph, 0, &v ); + } +#endif + + if ( error ) + goto Exit; + + /* in case of success, copy the bitmap to the glyph bitmap */ + error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy ); + if ( error ) + goto Exit; + + /* copy advance */ + bitmap->root.advance = glyph->advance; + + if ( destroy ) + FT_Done_Glyph( glyph ); + + *the_glyph = FT_GLYPH( bitmap ); + + Exit: + if ( error && bitmap ) + FT_Done_Glyph( FT_GLYPH( bitmap ) ); + + return error; + + Bad: + error = FT_Err_Invalid_Argument; + goto Exit; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Done_Glyph( FT_Glyph glyph ) + { + if ( glyph ) + { + FT_Memory memory = glyph->library->memory; + const FT_Glyph_Class* clazz = glyph->clazz; + + + if ( clazz->glyph_done ) + clazz->glyph_done( glyph ); + + FT_FREE( glyph ); + } + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftinit.c b/android/jni/ndk_modules/freetype/src/base/ftinit.c new file mode 100644 index 00000000..305177a7 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftinit.c @@ -0,0 +1,253 @@ +/***************************************************************************/ +/* */ +/* ftinit.c */ +/* */ +/* FreeType initialization layer (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* The purpose of this file is to implement the following two */ + /* functions: */ + /* */ + /* FT_Add_Default_Modules(): */ + /* This function is used to add the set of default modules to a */ + /* fresh new library object. The set is taken from the header file */ + /* `freetype/config/ftmodule.h'. See the document `FreeType 2.0 */ + /* Build System' for more information. */ + /* */ + /* FT_Init_FreeType(): */ + /* This function creates a system object for the current platform, */ + /* builds a library out of it, then calls FT_Default_Drivers(). */ + /* */ + /* Note that even if FT_Init_FreeType() uses the implementation of the */ + /* system object defined at build time, client applications are still */ + /* able to provide their own `ftsystem.c'. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_MODULE_H +#include "basepic.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_init + +#ifndef FT_CONFIG_OPTION_PIC + +#undef FT_USE_MODULE +#ifdef __cplusplus +#define FT_USE_MODULE( type, x ) extern "C" const type x; +#else +#define FT_USE_MODULE( type, x ) extern const type x; +#endif + + +#include FT_CONFIG_MODULES_H + + +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) (const FT_Module_Class*)&(x), + + static + const FT_Module_Class* const ft_default_modules[] = + { +#include FT_CONFIG_MODULES_H + 0 + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#ifdef __cplusplus +#define FT_EXTERNC extern "C" +#else +#define FT_EXTERNC extern +#endif + + /* declare the module's class creation/destruction functions */ +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) \ + FT_EXTERNC FT_Error FT_Create_Class_##x( FT_Library library, FT_Module_Class** output_class ); \ + FT_EXTERNC void FT_Destroy_Class_##x( FT_Library library, FT_Module_Class* clazz ); + +#include FT_CONFIG_MODULES_H + + + /* count all module classes */ +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) MODULE_CLASS_##x, + + enum + { +#include FT_CONFIG_MODULES_H + FT_NUM_MODULE_CLASSES + }; + + /* destroy all module classes */ +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) \ + if ( classes[i] ) { FT_Destroy_Class_##x(library, classes[i]); } \ + i++; \ + + FT_BASE_DEF( void ) + ft_destroy_default_module_classes( FT_Library library ) + { + FT_Module_Class** classes; + FT_Memory memory; + FT_UInt i; + BasePIC* pic_container = (BasePIC*)library->pic_container.base; + + if ( !pic_container->default_module_classes ) + return; + + memory = library->memory; + classes = pic_container->default_module_classes; + i = 0; + +#include FT_CONFIG_MODULES_H + + FT_FREE( classes ); + pic_container->default_module_classes = 0; + } + + /* initialize all module classes and the pointer table */ +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) \ + error = FT_Create_Class_##x(library, &clazz); \ + if (error) goto Exit; \ + classes[i++] = clazz; + + FT_BASE_DEF( FT_Error ) + ft_create_default_module_classes( FT_Library library ) + { + FT_Error error; + FT_Memory memory; + FT_Module_Class** classes; + FT_Module_Class* clazz; + FT_UInt i; + BasePIC* pic_container = (BasePIC*)library->pic_container.base; + + memory = library->memory; + pic_container->default_module_classes = 0; + + if ( FT_ALLOC(classes, sizeof(FT_Module_Class*) * (FT_NUM_MODULE_CLASSES + 1) ) ) + return error; + /* initialize all pointers to 0, especially the last one */ + for (i = 0; i < FT_NUM_MODULE_CLASSES; i++) + classes[i] = 0; + classes[FT_NUM_MODULE_CLASSES] = 0; + + i = 0; + +#include FT_CONFIG_MODULES_H + +Exit: + if (error) ft_destroy_default_module_classes( library ); + else pic_container->default_module_classes = classes; + + return error; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Add_Default_Modules( FT_Library library ) + { + FT_Error error; + const FT_Module_Class* const* cur; + + + /* test for valid `library' delayed to FT_Add_Module() */ + + cur = FT_DEFAULT_MODULES_GET; + while ( *cur ) + { + error = FT_Add_Module( library, *cur ); + /* notify errors, but don't stop */ + if ( error ) + FT_TRACE0(( "FT_Add_Default_Module:" + " Cannot install `%s', error = 0x%x\n", + (*cur)->module_name, error )); + cur++; + } + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ) + { + FT_Error error; + FT_Memory memory; + + + /* First of all, allocate a new system object -- this function is part */ + /* of the system-specific component, i.e. `ftsystem.c'. */ + + memory = FT_New_Memory(); + if ( !memory ) + { + FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" )); + return FT_Err_Unimplemented_Feature; + } + + /* build a library out of it, then fill it with the set of */ + /* default drivers. */ + + error = FT_New_Library( memory, alibrary ); + if ( error ) + FT_Done_Memory( memory ); + else + FT_Add_Default_Modules( *alibrary ); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_FreeType( FT_Library library ) + { + if ( library ) + { + FT_Memory memory = library->memory; + + + /* Discard the library object */ + FT_Done_Library( library ); + + /* discard memory manager */ + FT_Done_Memory( memory ); + } + + return FT_Err_Ok; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftlcdfil.c b/android/jni/ndk_modules/freetype/src/base/ftlcdfil.c new file mode 100644 index 00000000..0da4ba16 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftlcdfil.c @@ -0,0 +1,376 @@ +/***************************************************************************/ +/* */ +/* ftlcdfil.c */ +/* */ +/* FreeType API for color filtering of subpixel bitmap glyphs (body). */ +/* */ +/* Copyright 2006, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_LCD_FILTER_H +#include FT_IMAGE_H +#include FT_INTERNAL_OBJECTS_H + + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + +/* define USE_LEGACY to implement the legacy filter */ +#define USE_LEGACY + + /* FIR filter used by the default and light filters */ + static void + _ft_lcd_filter_fir( FT_Bitmap* bitmap, + FT_Render_Mode mode, + FT_Library library ) + { + FT_Byte* weights = library->lcd_weights; + FT_UInt width = (FT_UInt)bitmap->width; + FT_UInt height = (FT_UInt)bitmap->rows; + + + /* horizontal in-place FIR filter */ + if ( mode == FT_RENDER_MODE_LCD && width >= 4 ) + { + FT_Byte* line = bitmap->buffer; + + + for ( ; height > 0; height--, line += bitmap->pitch ) + { + FT_UInt fir[5]; + FT_UInt val1, xx; + + + val1 = line[0]; + fir[0] = weights[2] * val1; + fir[1] = weights[3] * val1; + fir[2] = weights[4] * val1; + fir[3] = 0; + fir[4] = 0; + + val1 = line[1]; + fir[0] += weights[1] * val1; + fir[1] += weights[2] * val1; + fir[2] += weights[3] * val1; + fir[3] += weights[4] * val1; + + for ( xx = 2; xx < width; xx++ ) + { + FT_UInt val, pix; + + + val = line[xx]; + pix = fir[0] + weights[0] * val; + fir[0] = fir[1] + weights[1] * val; + fir[1] = fir[2] + weights[2] * val; + fir[2] = fir[3] + weights[3] * val; + fir[3] = weights[4] * val; + + pix >>= 8; + pix |= -( pix >> 8 ); + line[xx - 2] = (FT_Byte)pix; + } + + { + FT_UInt pix; + + + pix = fir[0] >> 8; + pix |= -( pix >> 8 ); + line[xx - 2] = (FT_Byte)pix; + + pix = fir[1] >> 8; + pix |= -( pix >> 8 ); + line[xx - 1] = (FT_Byte)pix; + } + } + } + + /* vertical in-place FIR filter */ + else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 ) + { + FT_Byte* column = bitmap->buffer; + FT_Int pitch = bitmap->pitch; + + + for ( ; width > 0; width--, column++ ) + { + FT_Byte* col = column; + FT_UInt fir[5]; + FT_UInt val1, yy; + + + val1 = col[0]; + fir[0] = weights[2] * val1; + fir[1] = weights[3] * val1; + fir[2] = weights[4] * val1; + fir[3] = 0; + fir[4] = 0; + col += pitch; + + val1 = col[0]; + fir[0] += weights[1] * val1; + fir[1] += weights[2] * val1; + fir[2] += weights[3] * val1; + fir[3] += weights[4] * val1; + col += pitch; + + for ( yy = 2; yy < height; yy++ ) + { + FT_UInt val, pix; + + + val = col[0]; + pix = fir[0] + weights[0] * val; + fir[0] = fir[1] + weights[1] * val; + fir[1] = fir[2] + weights[2] * val; + fir[2] = fir[3] + weights[3] * val; + fir[3] = weights[4] * val; + + pix >>= 8; + pix |= -( pix >> 8 ); + col[-2 * pitch] = (FT_Byte)pix; + col += pitch; + } + + { + FT_UInt pix; + + + pix = fir[0] >> 8; + pix |= -( pix >> 8 ); + col[-2 * pitch] = (FT_Byte)pix; + + pix = fir[1] >> 8; + pix |= -( pix >> 8 ); + col[-pitch] = (FT_Byte)pix; + } + } + } + } + + +#ifdef USE_LEGACY + + /* intra-pixel filter used by the legacy filter */ + static void + _ft_lcd_filter_legacy( FT_Bitmap* bitmap, + FT_Render_Mode mode, + FT_Library library ) + { + FT_UInt width = (FT_UInt)bitmap->width; + FT_UInt height = (FT_UInt)bitmap->rows; + FT_Int pitch = bitmap->pitch; + + static const int filters[3][3] = + { + { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 }, + { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 }, + { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 } + }; + + FT_UNUSED( library ); + + + /* horizontal in-place intra-pixel filter */ + if ( mode == FT_RENDER_MODE_LCD && width >= 3 ) + { + FT_Byte* line = bitmap->buffer; + + + for ( ; height > 0; height--, line += pitch ) + { + FT_UInt xx; + + + for ( xx = 0; xx < width; xx += 3 ) + { + FT_UInt r = 0; + FT_UInt g = 0; + FT_UInt b = 0; + FT_UInt p; + + + p = line[xx]; + r += filters[0][0] * p; + g += filters[0][1] * p; + b += filters[0][2] * p; + + p = line[xx + 1]; + r += filters[1][0] * p; + g += filters[1][1] * p; + b += filters[1][2] * p; + + p = line[xx + 2]; + r += filters[2][0] * p; + g += filters[2][1] * p; + b += filters[2][2] * p; + + line[xx] = (FT_Byte)( r / 65536 ); + line[xx + 1] = (FT_Byte)( g / 65536 ); + line[xx + 2] = (FT_Byte)( b / 65536 ); + } + } + } + else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 ) + { + FT_Byte* column = bitmap->buffer; + + + for ( ; width > 0; width--, column++ ) + { + FT_Byte* col = column; + FT_Byte* col_end = col + height * pitch; + + + for ( ; col < col_end; col += 3 * pitch ) + { + FT_UInt r = 0; + FT_UInt g = 0; + FT_UInt b = 0; + FT_UInt p; + + + p = col[0]; + r += filters[0][0] * p; + g += filters[0][1] * p; + b += filters[0][2] * p; + + p = col[pitch]; + r += filters[1][0] * p; + g += filters[1][1] * p; + b += filters[1][2] * p; + + p = col[pitch * 2]; + r += filters[2][0] * p; + g += filters[2][1] * p; + b += filters[2][2] * p; + + col[0] = (FT_Byte)( r / 65536 ); + col[pitch] = (FT_Byte)( g / 65536 ); + col[2 * pitch] = (FT_Byte)( b / 65536 ); + } + } + } + } + +#endif /* USE_LEGACY */ + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ) + { + if ( !library || !weights ) + return FT_Err_Invalid_Argument; + + ft_memcpy( library->lcd_weights, weights, 5 ); + + return FT_Err_Ok; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ) + { + static const FT_Byte light_filter[5] = + { 0x00, 0x55, 0x56, 0x55, 0x00 }; + /* the values here sum up to a value larger than 256, */ + /* providing a cheap gamma correction */ + static const FT_Byte default_filter[5] = + { 0x10, 0x40, 0x70, 0x40, 0x10 }; + + + if ( !library ) + return FT_Err_Invalid_Argument; + + switch ( filter ) + { + case FT_LCD_FILTER_NONE: + library->lcd_filter_func = NULL; + library->lcd_extra = 0; + break; + + case FT_LCD_FILTER_DEFAULT: +#if defined( FT_FORCE_LEGACY_LCD_FILTER ) + + library->lcd_filter_func = _ft_lcd_filter_legacy; + library->lcd_extra = 0; + +#elif defined( FT_FORCE_LIGHT_LCD_FILTER ) + + ft_memcpy( library->lcd_weights, light_filter, 5 ); + library->lcd_filter_func = _ft_lcd_filter_fir; + library->lcd_extra = 2; + +#else + + ft_memcpy( library->lcd_weights, default_filter, 5 ); + library->lcd_filter_func = _ft_lcd_filter_fir; + library->lcd_extra = 2; + +#endif + + break; + + case FT_LCD_FILTER_LIGHT: + ft_memcpy( library->lcd_weights, light_filter, 5 ); + library->lcd_filter_func = _ft_lcd_filter_fir; + library->lcd_extra = 2; + break; + +#ifdef USE_LEGACY + + case FT_LCD_FILTER_LEGACY: + library->lcd_filter_func = _ft_lcd_filter_legacy; + library->lcd_extra = 0; + break; + +#endif + + default: + return FT_Err_Invalid_Argument; + } + + library->lcd_filter = filter; + + return FT_Err_Ok; + } + +#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ) + { + FT_UNUSED( library ); + FT_UNUSED( weights ); + + return FT_Err_Unimplemented_Feature; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ) + { + FT_UNUSED( library ); + FT_UNUSED( filter ); + + return FT_Err_Unimplemented_Feature; + } + +#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftmm.c b/android/jni/ndk_modules/freetype/src/base/ftmm.c new file mode 100644 index 00000000..03077298 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftmm.c @@ -0,0 +1,202 @@ +/***************************************************************************/ +/* */ +/* ftmm.c */ +/* */ +/* Multiple Master font support (body). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_MULTIPLE_MASTERS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_mm + + + static FT_Error + ft_face_get_mm_service( FT_Face face, + FT_Service_MultiMasters *aservice ) + { + FT_Error error; + + + *aservice = NULL; + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + error = FT_Err_Invalid_Argument; + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + { + FT_FACE_LOOKUP_SERVICE( face, + *aservice, + MULTI_MASTERS ); + + if ( *aservice ) + error = FT_Err_Ok; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->get_mm ) + error = service->get_mm( face, amaster ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->get_mm_var ) + error = service->get_mm_var( face, amaster ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_mm_design ) + error = service->set_mm_design( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_var_design ) + error = service->set_var_design( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_mm_blend ) + error = service->set_mm_blend( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + /* This is exactly the same as the previous function. It exists for */ + /* orthogonality. */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_mm_blend ) + error = service->set_mm_blend( face, num_coords, coords ); + } + + return error; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftobjs.c b/android/jni/ndk_modules/freetype/src/base/ftobjs.c new file mode 100644 index 00000000..7f38df0c --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftobjs.c @@ -0,0 +1,4647 @@ +/***************************************************************************/ +/* */ +/* ftobjs.c */ +/* */ +/* The FreeType private base classes (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_LIST_H +#include FT_OUTLINE_H +#include FT_INTERNAL_VALIDATE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_RFORK_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H /* for SFNT_Load_Table_Func */ +#include FT_TRUETYPE_TABLES_H +#include FT_TRUETYPE_TAGS_H +#include FT_TRUETYPE_IDS_H + +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_TT_CMAP_H +#include FT_SERVICE_KERNING_H +#include FT_SERVICE_TRUETYPE_ENGINE_H + +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#include "ftbase.h" +#endif + +#define GRID_FIT_METRICS + + + FT_BASE_DEF( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ) + { + FT_Pointer result = NULL; + FT_ServiceDesc desc = service_descriptors; + + + if ( desc && service_id ) + { + for ( ; desc->serv_id != NULL; desc++ ) + { + if ( ft_strcmp( desc->serv_id, service_id ) == 0 ) + { + result = (FT_Pointer)desc->serv_data; + break; + } + } + } + + return result; + } + + + FT_BASE_DEF( void ) + ft_validator_init( FT_Validator valid, + const FT_Byte* base, + const FT_Byte* limit, + FT_ValidationLevel level ) + { + valid->base = base; + valid->limit = limit; + valid->level = level; + valid->error = FT_Err_Ok; + } + + + FT_BASE_DEF( FT_Int ) + ft_validator_run( FT_Validator valid ) + { + /* This function doesn't work! None should call it. */ + FT_UNUSED( valid ); + + return -1; + } + + + FT_BASE_DEF( void ) + ft_validator_error( FT_Validator valid, + FT_Error error ) + { + /* since the cast below also disables the compiler's */ + /* type check, we introduce a dummy variable, which */ + /* will be optimized away */ + volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer; + + + valid->error = error; + + /* throw away volatileness; use `jump_buffer' or the */ + /* compiler may warn about an unused local variable */ + ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** S T R E A M ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* create a new input stream from an FT_Open_Args structure */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ) + { + FT_Error error; + FT_Memory memory; + FT_Stream stream; + + + *astream = 0; + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !args ) + return FT_Err_Invalid_Argument; + + memory = library->memory; + + if ( FT_NEW( stream ) ) + goto Exit; + + stream->memory = memory; + + if ( args->flags & FT_OPEN_MEMORY ) + { + /* create a memory-based stream */ + FT_Stream_OpenMemory( stream, + (const FT_Byte*)args->memory_base, + args->memory_size ); + } + else if ( args->flags & FT_OPEN_PATHNAME ) + { + /* create a normal system stream */ + error = FT_Stream_Open( stream, args->pathname ); + stream->pathname.pointer = args->pathname; + } + else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream ) + { + /* use an existing, user-provided stream */ + + /* in this case, we do not need to allocate a new stream object */ + /* since the caller is responsible for closing it himself */ + FT_FREE( stream ); + stream = args->stream; + } + else + error = FT_Err_Invalid_Argument; + + if ( error ) + FT_FREE( stream ); + else + stream->memory = memory; /* just to be certain */ + + *astream = stream; + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ) + { + if ( stream ) + { + FT_Memory memory = stream->memory; + + + FT_Stream_Close( stream ); + + if ( !external ) + FT_FREE( stream ); + } + } + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + static FT_Error + ft_glyphslot_init( FT_GlyphSlot slot ) + { + FT_Driver driver = slot->face->driver; + FT_Driver_Class clazz = driver->clazz; + FT_Memory memory = driver->root.memory; + FT_Error error = FT_Err_Ok; + FT_Slot_Internal internal = NULL; + + + slot->library = driver->root.library; + + if ( FT_NEW( internal ) ) + goto Exit; + + slot->internal = internal; + + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + error = FT_GlyphLoader_New( memory, &internal->loader ); + + if ( !error && clazz->init_slot ) + error = clazz->init_slot( slot ); + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ) + { + if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + + + FT_FREE( slot->bitmap.buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + else + { + /* assume that the bitmap buffer was stolen or not */ + /* allocated from the heap */ + slot->bitmap.buffer = NULL; + } + } + + + FT_BASE_DEF( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Byte* buffer ) + { + ft_glyphslot_free_bitmap( slot ); + + slot->bitmap.buffer = buffer; + + FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 ); + } + + + FT_BASE_DEF( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + FT_Error error; + + + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + FT_FREE( slot->bitmap.buffer ); + else + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + (void)FT_ALLOC( slot->bitmap.buffer, size ); + return error; + } + + + static void + ft_glyphslot_clear( FT_GlyphSlot slot ) + { + /* free bitmap if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* clear all public fields in the glyph slot */ + FT_ZERO( &slot->metrics ); + FT_ZERO( &slot->outline ); + + slot->bitmap.width = 0; + slot->bitmap.rows = 0; + slot->bitmap.pitch = 0; + slot->bitmap.pixel_mode = 0; + /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */ + + slot->bitmap_left = 0; + slot->bitmap_top = 0; + slot->num_subglyphs = 0; + slot->subglyphs = 0; + slot->control_data = 0; + slot->control_len = 0; + slot->other = 0; + slot->format = FT_GLYPH_FORMAT_NONE; + + slot->linearHoriAdvance = 0; + slot->linearVertAdvance = 0; + slot->lsb_delta = 0; + slot->rsb_delta = 0; + } + + + static void + ft_glyphslot_done( FT_GlyphSlot slot ) + { + FT_Driver driver = slot->face->driver; + FT_Driver_Class clazz = driver->clazz; + FT_Memory memory = driver->root.memory; + + + if ( clazz->done_slot ) + clazz->done_slot( slot ); + + /* free bitmap buffer if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* slot->internal might be NULL in out-of-memory situations */ + if ( slot->internal ) + { + /* free glyph loader */ + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + { + FT_GlyphLoader_Done( slot->internal->loader ); + slot->internal->loader = 0; + } + + FT_FREE( slot->internal ); + } + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_New_GlyphSlot( FT_Face face, + FT_GlyphSlot *aslot ) + { + FT_Error error; + FT_Driver driver; + FT_Driver_Class clazz; + FT_Memory memory; + FT_GlyphSlot slot; + + + if ( !face || !face->driver ) + return FT_Err_Invalid_Argument; + + driver = face->driver; + clazz = driver->clazz; + memory = driver->root.memory; + + FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" )); + if ( !FT_ALLOC( slot, clazz->slot_object_size ) ) + { + slot->face = face; + + error = ft_glyphslot_init( slot ); + if ( error ) + { + ft_glyphslot_done( slot ); + FT_FREE( slot ); + goto Exit; + } + + slot->next = face->glyph; + face->glyph = slot; + + if ( aslot ) + *aslot = slot; + } + else if ( aslot ) + *aslot = 0; + + + Exit: + FT_TRACE4(( "FT_New_GlyphSlot: Return %d\n", error )); + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_GlyphSlot( FT_GlyphSlot slot ) + { + if ( slot ) + { + FT_Driver driver = slot->face->driver; + FT_Memory memory = driver->root.memory; + FT_GlyphSlot prev; + FT_GlyphSlot cur; + + + /* Remove slot from its parent face's list */ + prev = NULL; + cur = slot->face->glyph; + + while ( cur ) + { + if ( cur == slot ) + { + if ( !prev ) + slot->face->glyph = cur->next; + else + prev->next = cur->next; + + ft_glyphslot_done( slot ); + FT_FREE( slot ); + break; + } + prev = cur; + cur = cur->next; + } + } + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ) + { + FT_Face_Internal internal; + + + if ( !face ) + return; + + internal = face->internal; + + internal->transform_flags = 0; + + if ( !matrix ) + { + internal->transform_matrix.xx = 0x10000L; + internal->transform_matrix.xy = 0; + internal->transform_matrix.yx = 0; + internal->transform_matrix.yy = 0x10000L; + matrix = &internal->transform_matrix; + } + else + internal->transform_matrix = *matrix; + + /* set transform_flags bit flag 0 if `matrix' isn't the identity */ + if ( ( matrix->xy | matrix->yx ) || + matrix->xx != 0x10000L || + matrix->yy != 0x10000L ) + internal->transform_flags |= 1; + + if ( !delta ) + { + internal->transform_delta.x = 0; + internal->transform_delta.y = 0; + delta = &internal->transform_delta; + } + else + internal->transform_delta = *delta; + + /* set transform_flags bit flag 1 if `delta' isn't the null vector */ + if ( delta->x | delta->y ) + internal->transform_flags |= 2; + } + + + static FT_Renderer + ft_lookup_glyph_renderer( FT_GlyphSlot slot ); + + +#ifdef GRID_FIT_METRICS + static void + ft_glyphslot_grid_fit_metrics( FT_GlyphSlot slot, + FT_Bool vertical ) + { + FT_Glyph_Metrics* metrics = &slot->metrics; + FT_Pos right, bottom; + + + if ( vertical ) + { + metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); + metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY ); + + right = FT_PIX_CEIL( metrics->vertBearingX + metrics->width ); + bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height ); + + metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); + + metrics->width = right - metrics->vertBearingX; + metrics->height = bottom - metrics->vertBearingY; + } + else + { + metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); + + right = FT_PIX_CEIL ( metrics->horiBearingX + metrics->width ); + bottom = FT_PIX_FLOOR( metrics->horiBearingY - metrics->height ); + + metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); + metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY ); + + metrics->width = right - metrics->horiBearingX; + metrics->height = metrics->horiBearingY - bottom; + } + + metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance ); + metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance ); + } +#endif /* GRID_FIT_METRICS */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + FT_Driver driver; + FT_GlyphSlot slot; + FT_Library library; + FT_Bool autohint = FALSE; + FT_Module hinter; + + + if ( !face || !face->size || !face->glyph ) + return FT_Err_Invalid_Face_Handle; + + /* The validity test for `glyph_index' is performed by the */ + /* font drivers. */ + + slot = face->glyph; + ft_glyphslot_clear( slot ); + + driver = face->driver; + library = driver->root.library; + hinter = library->auto_hinter; + + /* resolve load flags dependencies */ + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | + FT_LOAD_IGNORE_TRANSFORM; + + if ( load_flags & FT_LOAD_NO_SCALE ) + { + load_flags |= FT_LOAD_NO_HINTING | + FT_LOAD_NO_BITMAP; + + load_flags &= ~FT_LOAD_RENDER; + } + + /* + * Determine whether we need to auto-hint or not. + * The general rules are: + * + * - Do only auto-hinting if we have a hinter module, a scalable font + * format dealing with outlines, and no transforms except simple + * slants and/or rotations by integer multiples of 90 degrees. + * + * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't + * have a native font hinter. + * + * - Otherwise, auto-hint for LIGHT hinting mode. + * + * - Exception: The font is `tricky' and requires the native hinter to + * load properly. + */ + + if ( hinter && + !( load_flags & FT_LOAD_NO_HINTING ) && + !( load_flags & FT_LOAD_NO_AUTOHINT ) && + FT_DRIVER_IS_SCALABLE( driver ) && + FT_DRIVER_USES_OUTLINES( driver ) && + !FT_IS_TRICKY( face ) && + ( ( face->internal->transform_matrix.yx == 0 && + face->internal->transform_matrix.xx != 0 ) || + ( face->internal->transform_matrix.xx == 0 && + face->internal->transform_matrix.yx != 0 ) ) ) + { + if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) || + !FT_DRIVER_HAS_HINTER( driver ) ) + autohint = TRUE; + else + { + FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); + + + if ( mode == FT_RENDER_MODE_LIGHT || + face->internal->ignore_unpatented_hinter ) + autohint = TRUE; + } + } + + if ( autohint ) + { + FT_AutoHinter_Service hinting; + + + /* try to load embedded bitmaps first if available */ + /* */ + /* XXX: This is really a temporary hack that should disappear */ + /* promptly with FreeType 2.1! */ + /* */ + if ( FT_HAS_FIXED_SIZES( face ) && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + error = driver->clazz->load_glyph( slot, face->size, + glyph_index, + load_flags | FT_LOAD_SBITS_ONLY ); + + if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP ) + goto Load_Ok; + } + + { + FT_Face_Internal internal = face->internal; + FT_Int transform_flags = internal->transform_flags; + + + /* since the auto-hinter calls FT_Load_Glyph by itself, */ + /* make sure that glyphs aren't transformed */ + internal->transform_flags = 0; + + /* load auto-hinted outline */ + hinting = (FT_AutoHinter_Service)hinter->clazz->module_interface; + + error = hinting->load_glyph( (FT_AutoHinter)hinter, + slot, face->size, + glyph_index, load_flags ); + + internal->transform_flags = transform_flags; + } + } + else + { + error = driver->clazz->load_glyph( slot, + face->size, + glyph_index, + load_flags ); + if ( error ) + goto Exit; + + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* check that the loaded outline is correct */ + error = FT_Outline_Check( &slot->outline ); + if ( error ) + goto Exit; + +#ifdef GRID_FIT_METRICS + if ( !( load_flags & FT_LOAD_NO_HINTING ) ) + ft_glyphslot_grid_fit_metrics( slot, + FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) ); +#endif + } + } + + Load_Ok: + /* compute the advance */ + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + slot->advance.x = 0; + slot->advance.y = slot->metrics.vertAdvance; + } + else + { + slot->advance.x = slot->metrics.horiAdvance; + slot->advance.y = 0; + } + + /* compute the linear advance in 16.16 pixels */ + if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 && + ( FT_IS_SCALABLE( face ) ) ) + { + FT_Size_Metrics* metrics = &face->size->metrics; + + + /* it's tricky! */ + slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance, + metrics->x_scale, 64 ); + + slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance, + metrics->y_scale, 64 ); + } + + if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 ) + { + FT_Face_Internal internal = face->internal; + + + /* now, transform the glyph image if needed */ + if ( internal->transform_flags ) + { + /* get renderer */ + FT_Renderer renderer = ft_lookup_glyph_renderer( slot ); + + + if ( renderer ) + error = renderer->clazz->transform_glyph( + renderer, slot, + &internal->transform_matrix, + &internal->transform_delta ); + else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* apply `standard' transformation if no renderer is available */ + if ( &internal->transform_matrix ) + FT_Outline_Transform( &slot->outline, + &internal->transform_matrix ); + + if ( &internal->transform_delta ) + FT_Outline_Translate( &slot->outline, + internal->transform_delta.x, + internal->transform_delta.y ); + } + + /* transform advance */ + FT_Vector_Transform( &slot->advance, &internal->transform_matrix ); + } + } + + FT_TRACE5(( " x advance: %d\n" , slot->advance.x )); + FT_TRACE5(( " y advance: %d\n" , slot->advance.y )); + + FT_TRACE5(( " linear x advance: %d\n" , slot->linearHoriAdvance )); + FT_TRACE5(( " linear y advance: %d\n" , slot->linearVertAdvance )); + + /* do we need to render the image now? */ + if ( !error && + slot->format != FT_GLYPH_FORMAT_BITMAP && + slot->format != FT_GLYPH_FORMAT_COMPOSITE && + load_flags & FT_LOAD_RENDER ) + { + FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); + + + if ( mode == FT_RENDER_MODE_NORMAL && + (load_flags & FT_LOAD_MONOCHROME ) ) + mode = FT_RENDER_MODE_MONO; + + error = FT_Render_Glyph( slot, mode ); + } + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ) + { + FT_UInt glyph_index; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + glyph_index = (FT_UInt)char_code; + if ( face->charmap ) + glyph_index = FT_Get_Char_Index( face, char_code ); + + return FT_Load_Glyph( face, glyph_index, load_flags ); + } + + + /* destructor for sizes list */ + static void + destroy_size( FT_Memory memory, + FT_Size size, + FT_Driver driver ) + { + /* finalize client-specific data */ + if ( size->generic.finalizer ) + size->generic.finalizer( size ); + + /* finalize format-specific stuff */ + if ( driver->clazz->done_size ) + driver->clazz->done_size( size ); + + FT_FREE( size->internal ); + FT_FREE( size ); + } + + + static void + ft_cmap_done_internal( FT_CMap cmap ); + + + static void + destroy_charmaps( FT_Face face, + FT_Memory memory ) + { + FT_Int n; + + + if ( !face ) + return; + + for ( n = 0; n < face->num_charmaps; n++ ) + { + FT_CMap cmap = FT_CMAP( face->charmaps[n] ); + + + ft_cmap_done_internal( cmap ); + + face->charmaps[n] = NULL; + } + + FT_FREE( face->charmaps ); + face->num_charmaps = 0; + } + + + /* destructor for faces list */ + static void + destroy_face( FT_Memory memory, + FT_Face face, + FT_Driver driver ) + { + FT_Driver_Class clazz = driver->clazz; + + + /* discard auto-hinting data */ + if ( face->autohint.finalizer ) + face->autohint.finalizer( face->autohint.data ); + + /* Discard glyph slots for this face. */ + /* Beware! FT_Done_GlyphSlot() changes the field `face->glyph' */ + while ( face->glyph ) + FT_Done_GlyphSlot( face->glyph ); + + /* discard all sizes for this face */ + FT_List_Finalize( &face->sizes_list, + (FT_List_Destructor)destroy_size, + memory, + driver ); + face->size = 0; + + /* now discard client data */ + if ( face->generic.finalizer ) + face->generic.finalizer( face ); + + /* discard charmaps */ + destroy_charmaps( face, memory ); + + /* finalize format-specific stuff */ + if ( clazz->done_face ) + clazz->done_face( face ); + + /* close the stream for this face if needed */ + FT_Stream_Free( + face->stream, + ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); + + face->stream = 0; + + /* get rid of it */ + if ( face->internal ) + { + FT_FREE( face->internal ); + } + FT_FREE( face ); + } + + + static void + Destroy_Driver( FT_Driver driver ) + { + FT_List_Finalize( &driver->faces_list, + (FT_List_Destructor)destroy_face, + driver->root.memory, + driver ); + + /* check whether we need to drop the driver's glyph loader */ + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + FT_GlyphLoader_Done( driver->glyph_loader ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* find_unicode_charmap */ + /* */ + /* <Description> */ + /* This function finds a Unicode charmap, if there is one. */ + /* And if there is more than one, it tries to favour the more */ + /* extensive one, i.e., one that supports UCS-4 against those which */ + /* are limited to the BMP (said UCS-2 encoding.) */ + /* */ + /* This function is called from open_face() (just below), and also */ + /* from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ). */ + /* */ + static FT_Error + find_unicode_charmap( FT_Face face ) + { + FT_CharMap* first; + FT_CharMap* cur; + + + /* caller should have already checked that `face' is valid */ + FT_ASSERT( face ); + + first = face->charmaps; + + if ( !first ) + return FT_Err_Invalid_CharMap_Handle; + + /* + * The original TrueType specification(s) only specified charmap + * formats that are capable of mapping 8 or 16 bit character codes to + * glyph indices. + * + * However, recent updates to the Apple and OpenType specifications + * introduced new formats that are capable of mapping 32-bit character + * codes as well. And these are already used on some fonts, mainly to + * map non-BMP Asian ideographs as defined in Unicode. + * + * For compatibility purposes, these fonts generally come with + * *several* Unicode charmaps: + * + * - One of them in the "old" 16-bit format, that cannot access + * all glyphs in the font. + * + * - Another one in the "new" 32-bit format, that can access all + * the glyphs. + * + * This function has been written to always favor a 32-bit charmap + * when found. Otherwise, a 16-bit one is returned when found. + */ + + /* Since the `interesting' table, with IDs (3,10), is normally the */ + /* last one, we loop backwards. This loses with type1 fonts with */ + /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP */ + /* chars (.01% ?), and this is the same about 99.99% of the time! */ + + cur = first + face->num_charmaps; /* points after the last one */ + + for ( ; --cur >= first; ) + { + if ( cur[0]->encoding == FT_ENCODING_UNICODE ) + { + /* XXX If some new encodings to represent UCS-4 are added, */ + /* they should be added here. */ + if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT && + cur[0]->encoding_id == TT_MS_ID_UCS_4 ) || + ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ) + { +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( cur - first > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "find_unicode_charmap: UCS-4 cmap is found " + "at too late position (%d)\n", cur - first )); + continue; + } +#endif + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + } + + /* We do not have any UCS-4 charmap. */ + /* Do the loop again and search for UCS-2 charmaps. */ + cur = first + face->num_charmaps; + + for ( ; --cur >= first; ) + { + if ( cur[0]->encoding == FT_ENCODING_UNICODE ) + { +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( cur - first > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "find_unicode_charmap: UCS-2 cmap is found " + "at too late position (%d)\n", cur - first )); + continue; + } +#endif + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + + return FT_Err_Invalid_CharMap_Handle; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* find_variant_selector_charmap */ + /* */ + /* <Description> */ + /* This function finds the variant selector charmap, if there is one. */ + /* There can only be one (platform=0, specific=5, format=14). */ + /* */ + static FT_CharMap + find_variant_selector_charmap( FT_Face face ) + { + FT_CharMap* first; + FT_CharMap* end; + FT_CharMap* cur; + + + /* caller should have already checked that `face' is valid */ + FT_ASSERT( face ); + + first = face->charmaps; + + if ( !first ) + return NULL; + + end = first + face->num_charmaps; /* points after the last one */ + + for ( cur = first; cur < end; ++cur ) + { + if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR && + FT_Get_CMap_Format( cur[0] ) == 14 ) +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( cur - first > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "find_unicode_charmap: UVS cmap is found " + "at too late position (%d)\n", cur - first )); + continue; + } +#endif + return cur[0]; + } + + return NULL; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* open_face */ + /* */ + /* <Description> */ + /* This function does some work for FT_Open_Face(). */ + /* */ + static FT_Error + open_face( FT_Driver driver, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter* params, + FT_Face *aface ) + { + FT_Memory memory; + FT_Driver_Class clazz; + FT_Face face = 0; + FT_Error error, error2; + FT_Face_Internal internal = NULL; + + + clazz = driver->clazz; + memory = driver->root.memory; + + /* allocate the face object and perform basic initialization */ + if ( FT_ALLOC( face, clazz->face_object_size ) ) + goto Fail; + + if ( FT_NEW( internal ) ) + goto Fail; + + face->internal = internal; + + face->driver = driver; + face->memory = memory; + face->stream = stream; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + { + int i; + + + face->internal->incremental_interface = 0; + for ( i = 0; i < num_params && !face->internal->incremental_interface; + i++ ) + if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL ) + face->internal->incremental_interface = + (FT_Incremental_Interface)params[i].data; + } +#endif + + if ( clazz->init_face ) + error = clazz->init_face( stream, + face, + (FT_Int)face_index, + num_params, + params ); + if ( error ) + goto Fail; + + /* select Unicode charmap by default */ + error2 = find_unicode_charmap( face ); + + /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */ + /* is returned. */ + + /* no error should happen, but we want to play safe */ + if ( error2 && error2 != FT_Err_Invalid_CharMap_Handle ) + { + error = error2; + goto Fail; + } + + *aface = face; + + Fail: + if ( error ) + { + destroy_charmaps( face, memory ); + if ( clazz->done_face ) + clazz->done_face( face ); + FT_FREE( internal ); + FT_FREE( face ); + *aface = 0; + } + + return error; + } + + + /* there's a Mac-specific extended implementation of FT_New_Face() */ + /* in src/base/ftmac.c */ + +#if !defined( FT_MACINTOSH ) || defined( DARWIN_NO_CARBON ) + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Face( FT_Library library, + const char* pathname, + FT_Long face_index, + FT_Face *aface ) + { + FT_Open_Args args; + + + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ + if ( !pathname ) + return FT_Err_Invalid_Argument; + + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + args.stream = NULL; + + return FT_Open_Face( library, &args, face_index, aface ); + } + +#endif /* defined( FT_MACINTOSH ) && !defined( DARWIN_NO_CARBON ) */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ) + { + FT_Open_Args args; + + + /* test for valid `library' and `face' delayed to FT_Open_Face() */ + if ( !file_base ) + return FT_Err_Invalid_Argument; + + args.flags = FT_OPEN_MEMORY; + args.memory_base = file_base; + args.memory_size = file_size; + args.stream = NULL; + + return FT_Open_Face( library, &args, face_index, aface ); + } + + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + + /* The behavior here is very similar to that in base/ftmac.c, but it */ + /* is designed to work on non-mac systems, so no mac specific calls. */ + /* */ + /* We look at the file and determine if it is a mac dfont file or a mac */ + /* resource file, or a macbinary file containing a mac resource file. */ + /* */ + /* Unlike ftmac I'm not going to look at a `FOND'. I don't really see */ + /* the point, especially since there may be multiple `FOND' resources. */ + /* Instead I'll just look for `sfnt' and `POST' resources, ordered as */ + /* they occur in the file. */ + /* */ + /* Note that multiple `POST' resources do not mean multiple postscript */ + /* fonts; they all get jammed together to make what is essentially a */ + /* pfb file. */ + /* */ + /* We aren't interested in `NFNT' or `FONT' bitmap resources. */ + /* */ + /* As soon as we get an `sfnt' load it into memory and pass it off to */ + /* FT_Open_Face. */ + /* */ + /* If we have a (set of) `POST' resources, massage them into a (memory) */ + /* pfb file and pass that to FT_Open_Face. (As with ftmac.c I'm not */ + /* going to try to save the kerning info. After all that lives in the */ + /* `FOND' which isn't in the file containing the `POST' resources so */ + /* we don't really have access to it. */ + + + /* Finalizer for a memory stream; gets called by FT_Done_Face(). */ + /* It frees the memory it uses. */ + /* From ftmac.c. */ + static void + memory_stream_close( FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + FT_FREE( stream->base ); + + stream->size = 0; + stream->base = 0; + stream->close = 0; + } + + + /* Create a new memory stream from a buffer and a size. */ + /* From ftmac.c. */ + static FT_Error + new_memory_stream( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Stream_CloseFunc close, + FT_Stream *astream ) + { + FT_Error error; + FT_Memory memory; + FT_Stream stream; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !base ) + return FT_Err_Invalid_Argument; + + *astream = 0; + memory = library->memory; + if ( FT_NEW( stream ) ) + goto Exit; + + FT_Stream_OpenMemory( stream, base, size ); + + stream->close = close; + + *astream = stream; + + Exit: + return error; + } + + + /* Create a new FT_Face given a buffer and a driver name. */ + /* from ftmac.c */ + FT_LOCAL_DEF( FT_Error ) + open_face_from_buffer( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Long face_index, + const char* driver_name, + FT_Face *aface ) + { + FT_Open_Args args; + FT_Error error; + FT_Stream stream = NULL; + FT_Memory memory = library->memory; + + + error = new_memory_stream( library, + base, + size, + memory_stream_close, + &stream ); + if ( error ) + { + FT_FREE( base ); + return error; + } + + args.flags = FT_OPEN_STREAM; + args.stream = stream; + if ( driver_name ) + { + args.flags = args.flags | FT_OPEN_DRIVER; + args.driver = FT_Get_Module( library, driver_name ); + } + +#ifdef FT_MACINTOSH + /* At this point, face_index has served its purpose; */ + /* whoever calls this function has already used it to */ + /* locate the correct font data. We should not propagate */ + /* this index to FT_Open_Face() (unless it is negative). */ + + if ( face_index > 0 ) + face_index = 0; +#endif + + error = FT_Open_Face( library, &args, face_index, aface ); + + if ( error == FT_Err_Ok ) + (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + else +#ifdef FT_MACINTOSH + FT_Stream_Free( stream, 0 ); +#else + { + FT_Stream_Close( stream ); + FT_FREE( stream ); + } +#endif + + return error; + } + + + /* Look up `TYP1' or `CID ' table from sfnt table directory. */ + /* `offset' and `length' must exclude the binary header in tables. */ + + /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */ + /* format too. Here, since we can't expect that the TrueType font */ + /* driver is loaded unconditially, we must parse the font by */ + /* ourselves. We are only interested in the name of the table and */ + /* the offset. */ + + static FT_Error + ft_lookup_PS_in_sfnt_stream( FT_Stream stream, + FT_Long face_index, + FT_ULong* offset, + FT_ULong* length, + FT_Bool* is_sfnt_cid ) + { + FT_Error error; + FT_UShort numTables; + FT_Long pstable_index; + FT_ULong tag; + int i; + + + *offset = 0; + *length = 0; + *is_sfnt_cid = FALSE; + + /* TODO: support for sfnt-wrapped PS/CID in TTC format */ + + /* version check for 'typ1' (should be ignored?) */ + if ( FT_READ_ULONG( tag ) ) + return error; + if ( tag != TTAG_typ1 ) + return FT_Err_Unknown_File_Format; + + if ( FT_READ_USHORT( numTables ) ) + return error; + if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */ + return error; + + pstable_index = -1; + *is_sfnt_cid = FALSE; + + for ( i = 0; i < numTables; i++ ) + { + if ( FT_READ_ULONG( tag ) || FT_STREAM_SKIP( 4 ) || + FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) ) + return error; + + if ( tag == TTAG_CID ) + { + pstable_index++; + *offset += 22; + *length -= 22; + *is_sfnt_cid = TRUE; + if ( face_index < 0 ) + return FT_Err_Ok; + } + else if ( tag == TTAG_TYP1 ) + { + pstable_index++; + *offset += 24; + *length -= 24; + *is_sfnt_cid = FALSE; + if ( face_index < 0 ) + return FT_Err_Ok; + } + if ( face_index >= 0 && pstable_index == face_index ) + return FT_Err_Ok; + } + return FT_Err_Table_Missing; + } + + + FT_LOCAL_DEF( FT_Error ) + open_face_PS_from_sfnt_stream( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter *params, + FT_Face *aface ) + { + FT_Error error; + FT_Memory memory = library->memory; + FT_ULong offset, length; + FT_Long pos; + FT_Bool is_sfnt_cid; + FT_Byte* sfnt_ps; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + pos = FT_Stream_Pos( stream ); + + error = ft_lookup_PS_in_sfnt_stream( stream, + face_index, + &offset, + &length, + &is_sfnt_cid ); + if ( error ) + goto Exit; + + if ( FT_Stream_Seek( stream, pos + offset ) ) + goto Exit; + + if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) ) + goto Exit; + + error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length ); + if ( error ) + goto Exit; + + error = open_face_from_buffer( library, + sfnt_ps, + length, + face_index < 0 ? face_index : 0, + is_sfnt_cid ? "cid" : "type1", + aface ); + Exit: + { + FT_Error error1; + + + if ( error == FT_Err_Unknown_File_Format ) + { + error1 = FT_Stream_Seek( stream, pos ); + if ( error1 ) + return error1; + } + + return error; + } + } + + +#if !defined( FT_MACINTOSH ) || defined( DARWIN_NO_CARBON ) + + /* The resource header says we've got resource_cnt `POST' (type1) */ + /* resources in this file. They all need to be coalesced into */ + /* one lump which gets passed on to the type1 driver. */ + /* Here can be only one PostScript font in a file so face_index */ + /* must be 0 (or -1). */ + /* */ + static FT_Error + Mac_Read_POST_Resource( FT_Library library, + FT_Stream stream, + FT_Long *offsets, + FT_Long resource_cnt, + FT_Long face_index, + FT_Face *aface ) + { + FT_Error error = FT_Err_Cannot_Open_Resource; + FT_Memory memory = library->memory; + FT_Byte* pfb_data; + int i, type, flags; + FT_Long len; + FT_Long pfb_len, pfb_pos, pfb_lenpos; + FT_Long rlen, temp; + + + if ( face_index == -1 ) + face_index = 0; + if ( face_index != 0 ) + return error; + + /* Find the length of all the POST resources, concatenated. Assume */ + /* worst case (each resource in its own section). */ + pfb_len = 0; + for ( i = 0; i < resource_cnt; ++i ) + { + error = FT_Stream_Seek( stream, offsets[i] ); + if ( error ) + goto Exit; + if ( FT_READ_LONG( temp ) ) + goto Exit; + pfb_len += temp + 6; + } + + if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) ) + goto Exit; + + pfb_data[0] = 0x80; + pfb_data[1] = 1; /* Ascii section */ + pfb_data[2] = 0; /* 4-byte length, fill in later */ + pfb_data[3] = 0; + pfb_data[4] = 0; + pfb_data[5] = 0; + pfb_pos = 6; + pfb_lenpos = 2; + + len = 0; + type = 1; + for ( i = 0; i < resource_cnt; ++i ) + { + error = FT_Stream_Seek( stream, offsets[i] ); + if ( error ) + goto Exit2; + if ( FT_READ_LONG( rlen ) ) + goto Exit; + if ( FT_READ_USHORT( flags ) ) + goto Exit; + FT_TRACE3(( "POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n", + i, offsets[i], rlen, flags )); + + /* postpone the check of rlen longer than buffer until FT_Stream_Read() */ + if ( ( flags >> 8 ) == 0 ) /* Comment, should not be loaded */ + continue; + + /* the flags are part of the resource, so rlen >= 2. */ + /* but some fonts declare rlen = 0 for empty fragment */ + if ( rlen > 2 ) + rlen -= 2; + else + rlen = 0; + + if ( ( flags >> 8 ) == type ) + len += rlen; + else + { + if ( pfb_lenpos + 3 > pfb_len + 2 ) + goto Exit2; + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); + pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); + pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); + pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); + + if ( ( flags >> 8 ) == 5 ) /* End of font mark */ + break; + + if ( pfb_pos + 6 > pfb_len + 2 ) + goto Exit2; + pfb_data[pfb_pos++] = 0x80; + + type = flags >> 8; + len = rlen; + + pfb_data[pfb_pos++] = (FT_Byte)type; + pfb_lenpos = pfb_pos; + pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */ + pfb_data[pfb_pos++] = 0; + pfb_data[pfb_pos++] = 0; + pfb_data[pfb_pos++] = 0; + } + + error = FT_Err_Cannot_Open_Resource; + if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len ) + goto Exit2; + + error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen ); + if ( error ) + goto Exit2; + pfb_pos += rlen; + } + + if ( pfb_pos + 2 > pfb_len + 2 ) + goto Exit2; + pfb_data[pfb_pos++] = 0x80; + pfb_data[pfb_pos++] = 3; + + if ( pfb_lenpos + 3 > pfb_len + 2 ) + goto Exit2; + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); + pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); + pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); + pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); + + return open_face_from_buffer( library, + pfb_data, + pfb_pos, + face_index, + "type1", + aface ); + + Exit2: + FT_FREE( pfb_data ); + + Exit: + return error; + } + + + /* The resource header says we've got resource_cnt `sfnt' */ + /* (TrueType/OpenType) resources in this file. Look through */ + /* them for the one indicated by face_index, load it into mem, */ + /* pass it on the the truetype driver and return it. */ + /* */ + static FT_Error + Mac_Read_sfnt_Resource( FT_Library library, + FT_Stream stream, + FT_Long *offsets, + FT_Long resource_cnt, + FT_Long face_index, + FT_Face *aface ) + { + FT_Memory memory = library->memory; + FT_Byte* sfnt_data; + FT_Error error; + FT_Long flag_offset; + FT_Long rlen; + int is_cff; + FT_Long face_index_in_resource = 0; + + + if ( face_index == -1 ) + face_index = 0; + if ( face_index >= resource_cnt ) + return FT_Err_Cannot_Open_Resource; + + flag_offset = offsets[face_index]; + error = FT_Stream_Seek( stream, flag_offset ); + if ( error ) + goto Exit; + + if ( FT_READ_LONG( rlen ) ) + goto Exit; + if ( rlen == -1 ) + return FT_Err_Cannot_Open_Resource; + + error = open_face_PS_from_sfnt_stream( library, + stream, + face_index, + 0, NULL, + aface ); + if ( !error ) + goto Exit; + + /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */ + if ( FT_Stream_Seek( stream, flag_offset + 4 ) ) + goto Exit; + + if ( FT_ALLOC( sfnt_data, (FT_Long)rlen ) ) + return error; + error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, rlen ); + if ( error ) + goto Exit; + + is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); + error = open_face_from_buffer( library, + sfnt_data, + rlen, + face_index_in_resource, + is_cff ? "cff" : "truetype", + aface ); + + Exit: + return error; + } + + + /* Check for a valid resource fork header, or a valid dfont */ + /* header. In a resource fork the first 16 bytes are repeated */ + /* at the location specified by bytes 4-7. In a dfont bytes */ + /* 4-7 point to 16 bytes of zeroes instead. */ + /* */ + static FT_Error + IsMacResource( FT_Library library, + FT_Stream stream, + FT_Long resource_offset, + FT_Long face_index, + FT_Face *aface ) + { + FT_Memory memory = library->memory; + FT_Error error; + FT_Long map_offset, rdara_pos; + FT_Long *data_offsets; + FT_Long count; + + + error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset, + &map_offset, &rdara_pos ); + if ( error ) + return error; + + error = FT_Raccess_Get_DataOffsets( library, stream, + map_offset, rdara_pos, + TTAG_POST, + &data_offsets, &count ); + if ( !error ) + { + error = Mac_Read_POST_Resource( library, stream, data_offsets, count, + face_index, aface ); + FT_FREE( data_offsets ); + /* POST exists in an LWFN providing a single face */ + if ( !error ) + (*aface)->num_faces = 1; + return error; + } + + error = FT_Raccess_Get_DataOffsets( library, stream, + map_offset, rdara_pos, + TTAG_sfnt, + &data_offsets, &count ); + if ( !error ) + { + FT_Long face_index_internal = face_index % count; + + + error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count, + face_index_internal, aface ); + FT_FREE( data_offsets ); + if ( !error ) + (*aface)->num_faces = count; + } + + return error; + } + + + /* Check for a valid macbinary header, and if we find one */ + /* check that the (flattened) resource fork in it is valid. */ + /* */ + static FT_Error + IsMacBinary( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface ) + { + unsigned char header[128]; + FT_Error error; + FT_Long dlen, offset; + + + if ( NULL == stream ) + return FT_Err_Invalid_Stream_Operation; + + error = FT_Stream_Seek( stream, 0 ); + if ( error ) + goto Exit; + + error = FT_Stream_Read( stream, (FT_Byte*)header, 128 ); + if ( error ) + goto Exit; + + if ( header[ 0] != 0 || + header[74] != 0 || + header[82] != 0 || + header[ 1] == 0 || + header[ 1] > 33 || + header[63] != 0 || + header[2 + header[1]] != 0 ) + return FT_Err_Unknown_File_Format; + + dlen = ( header[0x53] << 24 ) | + ( header[0x54] << 16 ) | + ( header[0x55] << 8 ) | + header[0x56]; +#if 0 + rlen = ( header[0x57] << 24 ) | + ( header[0x58] << 16 ) | + ( header[0x59] << 8 ) | + header[0x5a]; +#endif /* 0 */ + offset = 128 + ( ( dlen + 127 ) & ~127 ); + + return IsMacResource( library, stream, offset, face_index, aface ); + + Exit: + return error; + } + + + static FT_Error + load_face_in_embedded_rfork( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface, + const FT_Open_Args *args ) + { + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + FT_Memory memory = library->memory; + FT_Error error = FT_Err_Unknown_File_Format; + int i; + + char * file_names[FT_RACCESS_N_RULES]; + FT_Long offsets[FT_RACCESS_N_RULES]; + FT_Error errors[FT_RACCESS_N_RULES]; + + FT_Open_Args args2; + FT_Stream stream2 = 0; + + + FT_Raccess_Guess( library, stream, + args->pathname, file_names, offsets, errors ); + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + if ( errors[i] ) + { + FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i )); + continue; + } + + args2.flags = FT_OPEN_PATHNAME; + args2.pathname = file_names[i] ? file_names[i] : args->pathname; + + FT_TRACE3(( "Try rule %d: %s (offset=%d) ...", + i, args2.pathname, offsets[i] )); + + error = FT_Stream_New( library, &args2, &stream2 ); + if ( error ) + { + FT_TRACE3(( "failed\n" )); + continue; + } + + error = IsMacResource( library, stream2, offsets[i], + face_index, aface ); + FT_Stream_Free( stream2, 0 ); + + FT_TRACE3(( "%s\n", error ? "failed": "successful" )); + + if ( !error ) + break; + } + + for (i = 0; i < FT_RACCESS_N_RULES; i++) + { + if ( file_names[i] ) + FT_FREE( file_names[i] ); + } + + /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */ + if ( error ) + error = FT_Err_Unknown_File_Format; + + return error; + +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + } + + + /* Check for some macintosh formats without Carbon framework. */ + /* Is this a macbinary file? If so look at the resource fork. */ + /* Is this a mac dfont file? */ + /* Is this an old style resource fork? (in data) */ + /* Else call load_face_in_embedded_rfork to try extra rules */ + /* (defined in `ftrfork.c'). */ + /* */ + static FT_Error + load_mac_face( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface, + const FT_Open_Args *args ) + { + FT_Error error; + FT_UNUSED( args ); + + + error = IsMacBinary( library, stream, face_index, aface ); + if ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format ) + { + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + FT_TRACE3(( "Try as dfont: %s ...", args->pathname )); + + error = IsMacResource( library, stream, 0, face_index, aface ); + + FT_TRACE3(( "%s\n", error ? "failed" : "successful" )); + +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + } + + if ( ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format || + FT_ERROR_BASE( error ) == FT_Err_Invalid_Stream_Operation ) && + ( args->flags & FT_OPEN_PATHNAME ) ) + error = load_face_in_embedded_rfork( library, stream, + face_index, aface, args ); + return error; + } +#endif + +#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_Stream stream = NULL; + FT_Face face = NULL; + FT_ListNode node = NULL; + FT_Bool external_stream; + FT_Module* cur; + FT_Module* limit; + + + /* test for valid `library' delayed to */ + /* FT_Stream_New() */ + + if ( ( !aface && face_index >= 0 ) || !args ) + return FT_Err_Invalid_Argument; + + external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) && + args->stream ); + + /* create input stream */ + error = FT_Stream_New( library, args, &stream ); + if ( error ) + goto Fail3; + + memory = library->memory; + + /* If the font driver is specified in the `args' structure, use */ + /* it. Otherwise, we scan the list of registered drivers. */ + if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver ) + { + driver = FT_DRIVER( args->driver ); + + /* not all modules are drivers, so check... */ + if ( FT_MODULE_IS_DRIVER( driver ) ) + { + FT_Int num_params = 0; + FT_Parameter* params = 0; + + + if ( args->flags & FT_OPEN_PARAMS ) + { + num_params = args->num_params; + params = args->params; + } + + error = open_face( driver, stream, face_index, + num_params, params, &face ); + if ( !error ) + goto Success; + } + else + error = FT_Err_Invalid_Handle; + + FT_Stream_Free( stream, external_stream ); + goto Fail; + } + else + { + /* check each font driver for an appropriate format */ + cur = library->modules; + limit = cur + library->num_modules; + + + for ( ; cur < limit; cur++ ) + { + /* not all modules are font drivers, so check... */ + if ( FT_MODULE_IS_DRIVER( cur[0] ) ) + { + FT_Int num_params = 0; + FT_Parameter* params = 0; + + + driver = FT_DRIVER( cur[0] ); + + if ( args->flags & FT_OPEN_PARAMS ) + { + num_params = args->num_params; + params = args->params; + } + + error = open_face( driver, stream, face_index, + num_params, params, &face ); + if ( !error ) + goto Success; + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + if ( ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 && + FT_ERROR_BASE( error ) == FT_Err_Table_Missing ) + { + /* TrueType but essential tables are missing */ + if ( FT_Stream_Seek( stream, 0 ) ) + break; + + error = open_face_PS_from_sfnt_stream( library, + stream, + face_index, + num_params, + params, + aface ); + if ( !error ) + { + FT_Stream_Free( stream, external_stream ); + return error; + } + } +#endif + + if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format ) + goto Fail3; + } + } + + Fail3: + /* If we are on the mac, and we get an FT_Err_Invalid_Stream_Operation */ + /* it may be because we have an empty data fork, so we need to check */ + /* the resource fork. */ + if ( FT_ERROR_BASE( error ) != FT_Err_Cannot_Open_Stream && + FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format && + FT_ERROR_BASE( error ) != FT_Err_Invalid_Stream_Operation ) + goto Fail2; + +#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS ) + error = load_mac_face( library, stream, face_index, aface, args ); + if ( !error ) + { + /* We don't want to go to Success here. We've already done that. */ + /* On the other hand, if we succeeded we still need to close this */ + /* stream (we opened a different stream which extracted the */ + /* interesting information out of this stream here. That stream */ + /* will still be open and the face will point to it). */ + FT_Stream_Free( stream, external_stream ); + return error; + } + + if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format ) + goto Fail2; +#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ + + /* no driver is able to handle this format */ + error = FT_Err_Unknown_File_Format; + + Fail2: + FT_Stream_Free( stream, external_stream ); + goto Fail; + } + + Success: + FT_TRACE4(( "FT_Open_Face: New face object, adding to list\n" )); + + /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */ + if ( external_stream ) + face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM; + + /* add the face object to its driver's list */ + if ( FT_NEW( node ) ) + goto Fail; + + node->data = face; + /* don't assume driver is the same as face->driver, so use */ + /* face->driver instead. */ + FT_List_Add( &face->driver->faces_list, node ); + + /* now allocate a glyph slot object for the face */ + FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" )); + + if ( face_index >= 0 ) + { + error = FT_New_GlyphSlot( face, NULL ); + if ( error ) + goto Fail; + + /* finally, allocate a size object for the face */ + { + FT_Size size; + + + FT_TRACE4(( "FT_Open_Face: Creating size object\n" )); + + error = FT_New_Size( face, &size ); + if ( error ) + goto Fail; + + face->size = size; + } + } + + /* some checks */ + + if ( FT_IS_SCALABLE( face ) ) + { + if ( face->height < 0 ) + face->height = (FT_Short)-face->height; + + if ( !FT_HAS_VERTICAL( face ) ) + face->max_advance_height = (FT_Short)face->height; + } + + if ( FT_HAS_FIXED_SIZES( face ) ) + { + FT_Int i; + + + for ( i = 0; i < face->num_fixed_sizes; i++ ) + { + FT_Bitmap_Size* bsize = face->available_sizes + i; + + + if ( bsize->height < 0 ) + bsize->height = (FT_Short)-bsize->height; + if ( bsize->x_ppem < 0 ) + bsize->x_ppem = (FT_Short)-bsize->x_ppem; + if ( bsize->y_ppem < 0 ) + bsize->y_ppem = -bsize->y_ppem; + } + } + + /* initialize internal face data */ + { + FT_Face_Internal internal = face->internal; + + + internal->transform_matrix.xx = 0x10000L; + internal->transform_matrix.xy = 0; + internal->transform_matrix.yx = 0; + internal->transform_matrix.yy = 0x10000L; + + internal->transform_delta.x = 0; + internal->transform_delta.y = 0; + + internal->refcount = 1; + } + + if ( aface ) + *aface = face; + else + FT_Done_Face( face ); + + goto Exit; + + Fail: + FT_Done_Face( face ); + + Exit: + FT_TRACE4(( "FT_Open_Face: Return %d\n", error )); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ) + { + FT_Open_Args open; + + + /* test for valid `face' delayed to FT_Attach_Stream() */ + + if ( !filepathname ) + return FT_Err_Invalid_Argument; + + open.stream = NULL; + open.flags = FT_OPEN_PATHNAME; + open.pathname = (char*)filepathname; + + return FT_Attach_Stream( face, &open ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Attach_Stream( FT_Face face, + FT_Open_Args* parameters ) + { + FT_Stream stream; + FT_Error error; + FT_Driver driver; + + FT_Driver_Class clazz; + + + /* test for valid `parameters' delayed to FT_Stream_New() */ + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + driver = face->driver; + if ( !driver ) + return FT_Err_Invalid_Driver_Handle; + + error = FT_Stream_New( driver->root.library, parameters, &stream ); + if ( error ) + goto Exit; + + /* we implement FT_Attach_Stream in each driver through the */ + /* `attach_file' interface */ + + error = FT_Err_Unimplemented_Feature; + clazz = driver->clazz; + if ( clazz->attach_file ) + error = clazz->attach_file( face, stream ); + + /* close the attached stream */ + FT_Stream_Free( stream, + (FT_Bool)( parameters->stream && + ( parameters->flags & FT_OPEN_STREAM ) ) ); + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Reference_Face( FT_Face face ) + { + face->internal->refcount++; + + return FT_Err_Ok; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Face( FT_Face face ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_ListNode node; + + + error = FT_Err_Invalid_Face_Handle; + if ( face && face->driver ) + { + face->internal->refcount--; + if ( face->internal->refcount > 0 ) + error = FT_Err_Ok; + else + { + driver = face->driver; + memory = driver->root.memory; + + /* find face in driver's list */ + node = FT_List_Find( &driver->faces_list, face ); + if ( node ) + { + /* remove face object from the driver's list */ + FT_List_Remove( &driver->faces_list, node ); + FT_FREE( node ); + + /* now destroy the object proper */ + destroy_face( memory, face, driver ); + error = FT_Err_Ok; + } + } + } + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size *asize ) + { + FT_Error error; + FT_Memory memory; + FT_Driver driver; + FT_Driver_Class clazz; + + FT_Size size = 0; + FT_ListNode node = 0; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !asize ) + return FT_Err_Invalid_Size_Handle; + + if ( !face->driver ) + return FT_Err_Invalid_Driver_Handle; + + *asize = 0; + + driver = face->driver; + clazz = driver->clazz; + memory = face->memory; + + /* Allocate new size object and perform basic initialisation */ + if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) ) + goto Exit; + + size->face = face; + + /* for now, do not use any internal fields in size objects */ + size->internal = 0; + + if ( clazz->init_size ) + error = clazz->init_size( size ); + + /* in case of success, add to the face's list */ + if ( !error ) + { + *asize = size; + node->data = size; + FT_List_Add( &face->sizes_list, node ); + } + + Exit: + if ( error ) + { + FT_FREE( node ); + FT_FREE( size ); + } + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Size( FT_Size size ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_Face face; + FT_ListNode node; + + + if ( !size ) + return FT_Err_Invalid_Size_Handle; + + face = size->face; + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + driver = face->driver; + if ( !driver ) + return FT_Err_Invalid_Driver_Handle; + + memory = driver->root.memory; + + error = FT_Err_Ok; + node = FT_List_Find( &face->sizes_list, size ); + if ( node ) + { + FT_List_Remove( &face->sizes_list, node ); + FT_FREE( node ); + + if ( face->size == size ) + { + face->size = 0; + if ( face->sizes_list.head ) + face->size = (FT_Size)(face->sizes_list.head->data); + } + + destroy_size( memory, size, driver ); + } + else + error = FT_Err_Invalid_Size_Handle; + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_Match_Size( FT_Face face, + FT_Size_Request req, + FT_Bool ignore_width, + FT_ULong* size_index ) + { + FT_Int i; + FT_Long w, h; + + + if ( !FT_HAS_FIXED_SIZES( face ) ) + return FT_Err_Invalid_Face_Handle; + + /* FT_Bitmap_Size doesn't provide enough info... */ + if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) + return FT_Err_Unimplemented_Feature; + + w = FT_REQUEST_WIDTH ( req ); + h = FT_REQUEST_HEIGHT( req ); + + if ( req->width && !req->height ) + h = w; + else if ( !req->width && req->height ) + w = h; + + w = FT_PIX_ROUND( w ); + h = FT_PIX_ROUND( h ); + + for ( i = 0; i < face->num_fixed_sizes; i++ ) + { + FT_Bitmap_Size* bsize = face->available_sizes + i; + + + if ( h != FT_PIX_ROUND( bsize->y_ppem ) ) + continue; + + if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width ) + { + if ( size_index ) + *size_index = (FT_ULong)i; + + return FT_Err_Ok; + } + } + + return FT_Err_Invalid_Pixel_Size; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, + FT_Pos advance ) + { + FT_Pos height = metrics->height; + + + /* compensate for glyph with bbox above/below the baseline */ + if ( metrics->horiBearingY < 0 ) + { + if ( height < metrics->horiBearingY ) + height = metrics->horiBearingY; + } + else if ( metrics->horiBearingY > 0 ) + height -= metrics->horiBearingY; + + /* the factor 1.2 is a heuristical value */ + if ( !advance ) + advance = height * 12 / 10; + + metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2; + metrics->vertBearingY = ( advance - height ) / 2; + metrics->vertAdvance = advance; + } + + + static void + ft_recompute_scaled_metrics( FT_Face face, + FT_Size_Metrics* metrics ) + { + /* Compute root ascender, descender, test height, and max_advance */ + +#ifdef GRID_FIT_METRICS + metrics->ascender = FT_PIX_CEIL( FT_MulFix( face->ascender, + metrics->y_scale ) ); + + metrics->descender = FT_PIX_FLOOR( FT_MulFix( face->descender, + metrics->y_scale ) ); + + metrics->height = FT_PIX_ROUND( FT_MulFix( face->height, + metrics->y_scale ) ); + + metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width, + metrics->x_scale ) ); +#else /* !GRID_FIT_METRICS */ + metrics->ascender = FT_MulFix( face->ascender, + metrics->y_scale ); + + metrics->descender = FT_MulFix( face->descender, + metrics->y_scale ); + + metrics->height = FT_MulFix( face->height, + metrics->y_scale ); + + metrics->max_advance = FT_MulFix( face->max_advance_width, + metrics->x_scale ); +#endif /* !GRID_FIT_METRICS */ + } + + + FT_BASE_DEF( void ) + FT_Select_Metrics( FT_Face face, + FT_ULong strike_index ) + { + FT_Size_Metrics* metrics; + FT_Bitmap_Size* bsize; + + + metrics = &face->size->metrics; + bsize = face->available_sizes + strike_index; + + metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 ); + metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 ); + + if ( FT_IS_SCALABLE( face ) ) + { + metrics->x_scale = FT_DivFix( bsize->x_ppem, + face->units_per_EM ); + metrics->y_scale = FT_DivFix( bsize->y_ppem, + face->units_per_EM ); + + ft_recompute_scaled_metrics( face, metrics ); + } + else + { + metrics->x_scale = 1L << 16; + metrics->y_scale = 1L << 16; + metrics->ascender = bsize->y_ppem; + metrics->descender = 0; + metrics->height = bsize->height << 6; + metrics->max_advance = bsize->x_ppem; + } + } + + + FT_BASE_DEF( void ) + FT_Request_Metrics( FT_Face face, + FT_Size_Request req ) + { + FT_Size_Metrics* metrics; + + + metrics = &face->size->metrics; + + if ( FT_IS_SCALABLE( face ) ) + { + FT_Long w = 0, h = 0, scaled_w = 0, scaled_h = 0; + + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + w = h = face->units_per_EM; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + w = h = face->ascender - face->descender; + break; + + case FT_SIZE_REQUEST_TYPE_BBOX: + w = face->bbox.xMax - face->bbox.xMin; + h = face->bbox.yMax - face->bbox.yMin; + break; + + case FT_SIZE_REQUEST_TYPE_CELL: + w = face->max_advance_width; + h = face->ascender - face->descender; + break; + + case FT_SIZE_REQUEST_TYPE_SCALES: + metrics->x_scale = (FT_Fixed)req->width; + metrics->y_scale = (FT_Fixed)req->height; + if ( !metrics->x_scale ) + metrics->x_scale = metrics->y_scale; + else if ( !metrics->y_scale ) + metrics->y_scale = metrics->x_scale; + goto Calculate_Ppem; + + case FT_SIZE_REQUEST_TYPE_MAX: + break; + } + + /* to be on the safe side */ + if ( w < 0 ) + w = -w; + + if ( h < 0 ) + h = -h; + + scaled_w = FT_REQUEST_WIDTH ( req ); + scaled_h = FT_REQUEST_HEIGHT( req ); + + /* determine scales */ + if ( req->width ) + { + metrics->x_scale = FT_DivFix( scaled_w, w ); + + if ( req->height ) + { + metrics->y_scale = FT_DivFix( scaled_h, h ); + + if ( req->type == FT_SIZE_REQUEST_TYPE_CELL ) + { + if ( metrics->y_scale > metrics->x_scale ) + metrics->y_scale = metrics->x_scale; + else + metrics->x_scale = metrics->y_scale; + } + } + else + { + metrics->y_scale = metrics->x_scale; + scaled_h = FT_MulDiv( scaled_w, h, w ); + } + } + else + { + metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h ); + scaled_w = FT_MulDiv( scaled_h, w, h ); + } + + Calculate_Ppem: + /* calculate the ppems */ + if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) + { + scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale ); + scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale ); + } + + metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 ); + metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 ); + + ft_recompute_scaled_metrics( face, metrics ); + } + else + { + FT_ZERO( metrics ); + metrics->x_scale = 1L << 16; + metrics->y_scale = 1L << 16; + } + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ) + { + FT_Driver_Class clazz; + + + if ( !face || !FT_HAS_FIXED_SIZES( face ) ) + return FT_Err_Invalid_Face_Handle; + + if ( strike_index < 0 || strike_index >= face->num_fixed_sizes ) + return FT_Err_Invalid_Argument; + + clazz = face->driver->clazz; + + if ( clazz->select_size ) + return clazz->select_size( face->size, (FT_ULong)strike_index ); + + FT_Select_Metrics( face, (FT_ULong)strike_index ); + + return FT_Err_Ok; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ) + { + FT_Driver_Class clazz; + FT_ULong strike_index; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !req || req->width < 0 || req->height < 0 || + req->type >= FT_SIZE_REQUEST_TYPE_MAX ) + return FT_Err_Invalid_Argument; + + clazz = face->driver->clazz; + + if ( clazz->request_size ) + return clazz->request_size( face->size, req ); + + /* + * The reason that a driver doesn't have `request_size' defined is + * either that the scaling here suffices or that the supported formats + * are bitmap-only and size matching is not implemented. + * + * In the latter case, a simple size matching is done. + */ + if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) ) + { + FT_Error error; + + + error = FT_Match_Size( face, req, 0, &strike_index ); + if ( error ) + return error; + + FT_TRACE3(( "FT_Request_Size: bitmap strike %lu matched\n", + strike_index )); + + return FT_Select_Size( face, (FT_Int)strike_index ); + } + + FT_Request_Metrics( face, req ); + + return FT_Err_Ok; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ) + { + FT_Size_RequestRec req; + + + if ( !char_width ) + char_width = char_height; + else if ( !char_height ) + char_height = char_width; + + if ( !horz_resolution ) + horz_resolution = vert_resolution; + else if ( !vert_resolution ) + vert_resolution = horz_resolution; + + if ( char_width < 1 * 64 ) + char_width = 1 * 64; + if ( char_height < 1 * 64 ) + char_height = 1 * 64; + + if ( !horz_resolution ) + horz_resolution = vert_resolution = 72; + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = char_width; + req.height = char_height; + req.horiResolution = horz_resolution; + req.vertResolution = vert_resolution; + + return FT_Request_Size( face, &req ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ) + { + FT_Size_RequestRec req; + + + if ( pixel_width == 0 ) + pixel_width = pixel_height; + else if ( pixel_height == 0 ) + pixel_height = pixel_width; + + if ( pixel_width < 1 ) + pixel_width = 1; + if ( pixel_height < 1 ) + pixel_height = 1; + + /* use `>=' to avoid potential compiler warning on 16bit platforms */ + if ( pixel_width >= 0xFFFFU ) + pixel_width = 0xFFFFU; + if ( pixel_height >= 0xFFFFU ) + pixel_height = 0xFFFFU; + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = pixel_width << 6; + req.height = pixel_height << 6; + req.horiResolution = 0; + req.vertResolution = 0; + + return FT_Request_Size( face, &req ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ) + { + FT_Error error = FT_Err_Ok; + FT_Driver driver; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !akerning ) + return FT_Err_Invalid_Argument; + + driver = face->driver; + + akerning->x = 0; + akerning->y = 0; + + if ( driver->clazz->get_kerning ) + { + error = driver->clazz->get_kerning( face, + left_glyph, + right_glyph, + akerning ); + if ( !error ) + { + if ( kern_mode != FT_KERNING_UNSCALED ) + { + akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale ); + akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale ); + + if ( kern_mode != FT_KERNING_UNFITTED ) + { + /* we scale down kerning values for small ppem values */ + /* to avoid that rounding makes them too big. */ + /* `25' has been determined heuristically. */ + if ( face->size->metrics.x_ppem < 25 ) + akerning->x = FT_MulDiv( akerning->x, + face->size->metrics.x_ppem, 25 ); + if ( face->size->metrics.y_ppem < 25 ) + akerning->y = FT_MulDiv( akerning->y, + face->size->metrics.y_ppem, 25 ); + + akerning->x = FT_PIX_ROUND( akerning->x ); + akerning->y = FT_PIX_ROUND( akerning->y ); + } + } + } + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ) + { + FT_Service_Kerning service; + FT_Error error = FT_Err_Ok; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !akerning ) + return FT_Err_Invalid_Argument; + + FT_FACE_FIND_SERVICE( face, service, KERNING ); + if ( !service ) + return FT_Err_Unimplemented_Feature; + + error = service->get_track( face, + point_size, + degree, + akerning ); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ) + { + FT_CharMap* cur; + FT_CharMap* limit; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( encoding == FT_ENCODING_NONE ) + return FT_Err_Invalid_Argument; + + /* FT_ENCODING_UNICODE is special. We try to find the `best' Unicode */ + /* charmap available, i.e., one with UCS-4 characters, if possible. */ + /* */ + /* This is done by find_unicode_charmap() above, to share code. */ + if ( encoding == FT_ENCODING_UNICODE ) + return find_unicode_charmap( face ); + + cur = face->charmaps; + if ( !cur ) + return FT_Err_Invalid_CharMap_Handle; + + limit = cur + face->num_charmaps; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0]->encoding == encoding ) + { +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "FT_Select_Charmap: requested charmap is found (%d), " + "but in too late position to cache\n", + cur - face->charmaps )); + continue; + } +#endif + face->charmap = cur[0]; + return 0; + } + } + + return FT_Err_Invalid_Argument; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ) + { + FT_CharMap* cur; + FT_CharMap* limit; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + cur = face->charmaps; + if ( !cur ) + return FT_Err_Invalid_CharMap_Handle; + if ( FT_Get_CMap_Format( charmap ) == 14 ) + return FT_Err_Invalid_Argument; + + limit = cur + face->num_charmaps; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] == charmap ) + { +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "FT_Set_Charmap: requested charmap is found (%d), " + "but in too late position to cache\n", + cur - face->charmaps )); + continue; + } +#endif + face->charmap = cur[0]; + return 0; + } + } + return FT_Err_Invalid_Argument; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ) + { + FT_Int i; + + + if ( !charmap || !charmap->face ) + return -1; + + for ( i = 0; i < charmap->face->num_charmaps; i++ ) + if ( charmap->face->charmaps[i] == charmap ) + break; + + FT_ASSERT( i < charmap->face->num_charmaps ); + +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( i > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "FT_Get_Charmap_Index: requested charmap is found (%d), " + "but in too late position to cache\n", + i )); + return -i; + } +#endif + return i; + } + + + static void + ft_cmap_done_internal( FT_CMap cmap ) + { + FT_CMap_Class clazz = cmap->clazz; + FT_Face face = cmap->charmap.face; + FT_Memory memory = FT_FACE_MEMORY(face); + + + if ( clazz->done ) + clazz->done( cmap ); + + FT_FREE( cmap ); + } + + + FT_BASE_DEF( void ) + FT_CMap_Done( FT_CMap cmap ) + { + if ( cmap ) + { + FT_Face face = cmap->charmap.face; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Error error; + FT_Int i, j; + + + for ( i = 0; i < face->num_charmaps; i++ ) + { + if ( (FT_CMap)face->charmaps[i] == cmap ) + { + FT_CharMap last_charmap = face->charmaps[face->num_charmaps - 1]; + + + if ( FT_RENEW_ARRAY( face->charmaps, + face->num_charmaps, + face->num_charmaps - 1 ) ) + return; + + /* remove it from our list of charmaps */ + for ( j = i + 1; j < face->num_charmaps; j++ ) + { + if ( j == face->num_charmaps - 1 ) + face->charmaps[j - 1] = last_charmap; + else + face->charmaps[j - 1] = face->charmaps[j]; + } + + face->num_charmaps--; + + if ( (FT_CMap)face->charmap == cmap ) + face->charmap = NULL; + + ft_cmap_done_internal( cmap ); + + break; + } + } + } + } + + + FT_BASE_DEF( FT_Error ) + FT_CMap_New( FT_CMap_Class clazz, + FT_Pointer init_data, + FT_CharMap charmap, + FT_CMap *acmap ) + { + FT_Error error = FT_Err_Ok; + FT_Face face; + FT_Memory memory; + FT_CMap cmap; + + + if ( clazz == NULL || charmap == NULL || charmap->face == NULL ) + return FT_Err_Invalid_Argument; + + face = charmap->face; + memory = FT_FACE_MEMORY( face ); + + if ( !FT_ALLOC( cmap, clazz->size ) ) + { + cmap->charmap = *charmap; + cmap->clazz = clazz; + + if ( clazz->init ) + { + error = clazz->init( cmap, init_data ); + if ( error ) + goto Fail; + } + + /* add it to our list of charmaps */ + if ( FT_RENEW_ARRAY( face->charmaps, + face->num_charmaps, + face->num_charmaps + 1 ) ) + goto Fail; + + face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap; + } + + Exit: + if ( acmap ) + *acmap = cmap; + + return error; + + Fail: + ft_cmap_done_internal( cmap ); + cmap = NULL; + goto Exit; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ) + { + FT_UInt result = 0; + + + if ( face && face->charmap ) + { + FT_CMap cmap = FT_CMAP( face->charmap ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( " 0x%x is truncated\n", charcode )); + } + result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode ); + } + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ) + { + FT_ULong result = 0; + FT_UInt gindex = 0; + + + if ( face && face->charmap && face->num_glyphs ) + { + gindex = FT_Get_Char_Index( face, 0 ); + if ( gindex == 0 || gindex >= (FT_UInt)face->num_glyphs ) + result = FT_Get_Next_Char( face, 0, &gindex ); + } + + if ( agindex ) + *agindex = gindex; + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong charcode, + FT_UInt *agindex ) + { + FT_ULong result = 0; + FT_UInt gindex = 0; + + + if ( face && face->charmap && face->num_glyphs ) + { + FT_UInt32 code = (FT_UInt32)charcode; + FT_CMap cmap = FT_CMAP( face->charmap ); + + + do { + gindex = cmap->clazz->char_next( cmap, &code ); + } while ( gindex >= (FT_UInt)face->num_glyphs ); + + result = ( gindex == 0 ) ? 0 : code; + } + + if ( agindex ) + *agindex = gindex; + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ) + { + FT_UInt result = 0; + + + if ( face && face->charmap && + face->charmap->encoding == FT_ENCODING_UNICODE ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + FT_CMap ucmap = FT_CMAP( face->charmap ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( " 0x%x is truncated\n", charcode )); + } + if ( variantSelector > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); + FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); + } + + result = vcmap->clazz->char_var_index( vcmap, ucmap, + (FT_UInt32)charcode, + (FT_UInt32)variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ) + { + FT_Int result = -1; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( " 0x%x is truncated\n", charcode )); + } + if ( variantSelector > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); + FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); + } + + result = vcmap->clazz->char_var_default( vcmap, + (FT_UInt32)charcode, + (FT_UInt32)variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + result = vcmap->clazz->variant_list( vcmap, memory ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( " 0x%x is truncated\n", charcode )); + } + + result = vcmap->clazz->charvariant_list( vcmap, memory, + (FT_UInt32)charcode ); + } + } + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + if ( variantSelector > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); + FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); + } + + result = vcmap->clazz->variantchar_list( vcmap, memory, + (FT_UInt32)variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + FT_String* glyph_name ) + { + FT_UInt result = 0; + + + if ( face && FT_HAS_GLYPH_NAMES( face ) ) + { + FT_Service_GlyphDict service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + GLYPH_DICT ); + + if ( service && service->name_index ) + result = service->name_index( face, glyph_name ); + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + /* clean up buffer */ + if ( buffer && buffer_max > 0 ) + ((FT_Byte*)buffer)[0] = 0; + + if ( face && + (FT_Long)glyph_index <= face->num_glyphs && + FT_HAS_GLYPH_NAMES( face ) ) + { + FT_Service_GlyphDict service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + GLYPH_DICT ); + + if ( service && service->get_name ) + error = service->get_name( face, glyph_index, buffer, buffer_max ); + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( const char* ) + FT_Get_Postscript_Name( FT_Face face ) + { + const char* result = NULL; + + + if ( !face ) + goto Exit; + + if ( !result ) + { + FT_Service_PsFontName service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + POSTSCRIPT_FONT_NAME ); + + if ( service && service->get_ps_font_name ) + result = service->get_ps_font_name( face ); + } + + Exit: + return result; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ) + { + void* table = 0; + FT_Service_SFNT_Table service; + + + if ( face && FT_IS_SFNT( face ) ) + { + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service != NULL ) + table = service->get_table( face, tag ); + } + + return table; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ) + { + FT_Service_SFNT_Table service; + + + if ( !face || !FT_IS_SFNT( face ) ) + return FT_Err_Invalid_Face_Handle; + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service == NULL ) + return FT_Err_Unimplemented_Feature; + + return service->load_table( face, tag, offset, buffer, length ); + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ) + { + FT_Service_SFNT_Table service; + FT_ULong offset; + + + if ( !face || !FT_IS_SFNT( face ) ) + return FT_Err_Invalid_Face_Handle; + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service == NULL ) + return FT_Err_Unimplemented_Feature; + + return service->table_info( face, table_index, tag, &offset, length ); + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ) + { + FT_Service_TTCMaps service; + FT_Face face; + TT_CMapInfo cmap_info; + + + if ( !charmap || !charmap->face ) + return 0; + + face = charmap->face; + FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); + if ( service == NULL ) + return 0; + if ( service->get_cmap_info( charmap, &cmap_info )) + return 0; + + return cmap_info.language; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ) + { + FT_Service_TTCMaps service; + FT_Face face; + TT_CMapInfo cmap_info; + + + if ( !charmap || !charmap->face ) + return -1; + + face = charmap->face; + FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); + if ( service == NULL ) + return -1; + if ( service->get_cmap_info( charmap, &cmap_info )) + return -1; + + return cmap_info.format; + } + + + /* documentation is in ftsizes.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Activate_Size( FT_Size size ) + { + FT_Face face; + + + if ( size == NULL ) + return FT_Err_Invalid_Argument; + + face = size->face; + if ( face == NULL || face->driver == NULL ) + return FT_Err_Invalid_Argument; + + /* we don't need anything more complex than that; all size objects */ + /* are already listed by the face */ + face->size = size; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** R E N D E R E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* lookup a renderer by glyph format in the library's list */ + FT_BASE_DEF( FT_Renderer ) + FT_Lookup_Renderer( FT_Library library, + FT_Glyph_Format format, + FT_ListNode* node ) + { + FT_ListNode cur; + FT_Renderer result = 0; + + + if ( !library ) + goto Exit; + + cur = library->renderers.head; + + if ( node ) + { + if ( *node ) + cur = (*node)->next; + *node = 0; + } + + while ( cur ) + { + FT_Renderer renderer = FT_RENDERER( cur->data ); + + + if ( renderer->glyph_format == format ) + { + if ( node ) + *node = cur; + + result = renderer; + break; + } + cur = cur->next; + } + + Exit: + return result; + } + + + static FT_Renderer + ft_lookup_glyph_renderer( FT_GlyphSlot slot ) + { + FT_Face face = slot->face; + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Renderer result = library->cur_renderer; + + + if ( !result || result->glyph_format != slot->format ) + result = FT_Lookup_Renderer( library, slot->format, 0 ); + + return result; + } + + + static void + ft_set_current_renderer( FT_Library library ) + { + FT_Renderer renderer; + + + renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 ); + library->cur_renderer = renderer; + } + + + static FT_Error + ft_add_renderer( FT_Module module ) + { + FT_Library library = module->library; + FT_Memory memory = library->memory; + FT_Error error; + FT_ListNode node = NULL; + + + if ( FT_NEW( node ) ) + goto Exit; + + { + FT_Renderer render = FT_RENDERER( module ); + FT_Renderer_Class* clazz = (FT_Renderer_Class*)module->clazz; + + + render->clazz = clazz; + render->glyph_format = clazz->glyph_format; + + /* allocate raster object if needed */ + if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && + clazz->raster_class->raster_new ) + { + error = clazz->raster_class->raster_new( memory, &render->raster ); + if ( error ) + goto Fail; + + render->raster_render = clazz->raster_class->raster_render; + render->render = clazz->render_glyph; + } + + /* add to list */ + node->data = module; + FT_List_Add( &library->renderers, node ); + + ft_set_current_renderer( library ); + } + + Fail: + if ( error ) + FT_FREE( node ); + + Exit: + return error; + } + + + static void + ft_remove_renderer( FT_Module module ) + { + FT_Library library = module->library; + FT_Memory memory = library->memory; + FT_ListNode node; + + + node = FT_List_Find( &library->renderers, module ); + if ( node ) + { + FT_Renderer render = FT_RENDERER( module ); + + + /* release raster object, if any */ + if ( render->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && + render->raster ) + render->clazz->raster_class->raster_done( render->raster ); + + /* remove from list */ + FT_List_Remove( &library->renderers, node ); + FT_FREE( node ); + + ft_set_current_renderer( library ); + } + } + + + /* documentation is in ftrender.h */ + + FT_EXPORT_DEF( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ) + { + /* test for valid `library' delayed to FT_Lookup_Renderer() */ + + return FT_Lookup_Renderer( library, format, 0 ); + } + + + /* documentation is in ftrender.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ) + { + FT_ListNode node; + FT_Error error = FT_Err_Ok; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !renderer ) + return FT_Err_Invalid_Argument; + + node = FT_List_Find( &library->renderers, renderer ); + if ( !node ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + FT_List_Up( &library->renderers, node ); + + if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE ) + library->cur_renderer = renderer; + + if ( num_params > 0 ) + { + FT_Renderer_SetModeFunc set_mode = renderer->clazz->set_mode; + + + for ( ; num_params > 0; num_params-- ) + { + error = set_mode( renderer, parameters->tag, parameters->data ); + if ( error ) + break; + } + } + + Exit: + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Render_Glyph_Internal( FT_Library library, + FT_GlyphSlot slot, + FT_Render_Mode render_mode ) + { + FT_Error error = FT_Err_Ok; + FT_Renderer renderer; + + + /* if it is already a bitmap, no need to do anything */ + switch ( slot->format ) + { + case FT_GLYPH_FORMAT_BITMAP: /* already a bitmap, don't do anything */ + break; + + default: + { + FT_ListNode node = 0; + FT_Bool update = 0; + + + /* small shortcut for the very common case */ + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + renderer = library->cur_renderer; + node = library->renderers.head; + } + else + renderer = FT_Lookup_Renderer( library, slot->format, &node ); + + error = FT_Err_Unimplemented_Feature; + while ( renderer ) + { + error = renderer->render( renderer, slot, render_mode, NULL ); + if ( !error || + FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph ) + break; + + /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ + /* is unsupported by the current renderer for this glyph image */ + /* format. */ + + /* now, look for another renderer that supports the same */ + /* format. */ + renderer = FT_Lookup_Renderer( library, slot->format, &node ); + update = 1; + } + + /* if we changed the current renderer for the glyph image format */ + /* we need to select it as the next current one */ + if ( !error && update && renderer ) + FT_Set_Renderer( library, renderer, 0, 0 ); + } + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ) + { + FT_Library library; + + + if ( !slot || !slot->face ) + return FT_Err_Invalid_Argument; + + library = FT_FACE_LIBRARY( slot->face ); + + return FT_Render_Glyph_Internal( library, slot, render_mode ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M O D U L E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Destroy_Module */ + /* */ + /* <Description> */ + /* Destroys a given module object. For drivers, this also destroys */ + /* all child faces. */ + /* */ + /* <InOut> */ + /* module :: A handle to the target driver object. */ + /* */ + /* <Note> */ + /* The driver _must_ be LOCKED! */ + /* */ + static void + Destroy_Module( FT_Module module ) + { + FT_Memory memory = module->memory; + FT_Module_Class* clazz = module->clazz; + FT_Library library = module->library; + + + /* finalize client-data - before anything else */ + if ( module->generic.finalizer ) + module->generic.finalizer( module ); + + if ( library && library->auto_hinter == module ) + library->auto_hinter = 0; + + /* if the module is a renderer */ + if ( FT_MODULE_IS_RENDERER( module ) ) + ft_remove_renderer( module ); + + /* if the module is a font driver, add some steps */ + if ( FT_MODULE_IS_DRIVER( module ) ) + Destroy_Driver( FT_DRIVER( module ) ); + + /* finalize the module object */ + if ( clazz->module_done ) + clazz->module_done( module ); + + /* discard it */ + FT_FREE( module ); + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ) + { + FT_Error error; + FT_Memory memory; + FT_Module module; + FT_UInt nn; + + +#define FREETYPE_VER_FIXED ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \ + FREETYPE_MINOR ) + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !clazz ) + return FT_Err_Invalid_Argument; + + /* check freetype version */ + if ( clazz->module_requires > FREETYPE_VER_FIXED ) + return FT_Err_Invalid_Version; + + /* look for a module with the same name in the library's table */ + for ( nn = 0; nn < library->num_modules; nn++ ) + { + module = library->modules[nn]; + if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 ) + { + /* this installed module has the same name, compare their versions */ + if ( clazz->module_version <= module->clazz->module_version ) + return FT_Err_Lower_Module_Version; + + /* remove the module from our list, then exit the loop to replace */ + /* it by our new version.. */ + FT_Remove_Module( library, module ); + break; + } + } + + memory = library->memory; + error = FT_Err_Ok; + + if ( library->num_modules >= FT_MAX_MODULES ) + { + error = FT_Err_Too_Many_Drivers; + goto Exit; + } + + /* allocate module object */ + if ( FT_ALLOC( module, clazz->module_size ) ) + goto Exit; + + /* base initialization */ + module->library = library; + module->memory = memory; + module->clazz = (FT_Module_Class*)clazz; + + /* check whether the module is a renderer - this must be performed */ + /* before the normal module initialization */ + if ( FT_MODULE_IS_RENDERER( module ) ) + { + /* add to the renderers list */ + error = ft_add_renderer( module ); + if ( error ) + goto Fail; + } + + /* is the module a auto-hinter? */ + if ( FT_MODULE_IS_HINTER( module ) ) + library->auto_hinter = module; + + /* if the module is a font driver */ + if ( FT_MODULE_IS_DRIVER( module ) ) + { + /* allocate glyph loader if needed */ + FT_Driver driver = FT_DRIVER( module ); + + + driver->clazz = (FT_Driver_Class)module->clazz; + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + { + error = FT_GlyphLoader_New( memory, &driver->glyph_loader ); + if ( error ) + goto Fail; + } + } + + if ( clazz->module_init ) + { + error = clazz->module_init( module ); + if ( error ) + goto Fail; + } + + /* add module to the library's table */ + library->modules[library->num_modules++] = module; + + Exit: + return error; + + Fail: + if ( FT_MODULE_IS_DRIVER( module ) ) + { + FT_Driver driver = FT_DRIVER( module ); + + + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + FT_GlyphLoader_Done( driver->glyph_loader ); + } + + if ( FT_MODULE_IS_RENDERER( module ) ) + { + FT_Renderer renderer = FT_RENDERER( module ); + + + if ( renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && + renderer->raster ) + renderer->clazz->raster_class->raster_done( renderer->raster ); + } + + FT_FREE( module ); + goto Exit; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ) + { + FT_Module result = 0; + FT_Module* cur; + FT_Module* limit; + + + if ( !library || !module_name ) + return result; + + cur = library->modules; + limit = cur + library->num_modules; + + for ( ; cur < limit; cur++ ) + if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 ) + { + result = cur[0]; + break; + } + + return result; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( const void* ) + FT_Get_Module_Interface( FT_Library library, + const char* mod_name ) + { + FT_Module module; + + + /* test for valid `library' delayed to FT_Get_Module() */ + + module = FT_Get_Module( library, mod_name ); + + return module ? module->clazz->module_interface : 0; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id ) + { + FT_Pointer result = NULL; + + if ( module ) + { + FT_ASSERT( module->clazz && module->clazz->get_interface ); + + /* first, look for the service in the module + */ + if ( module->clazz->get_interface ) + result = module->clazz->get_interface( module, service_id ); + + if ( result == NULL ) + { + /* we didn't find it, look in all other modules then + */ + FT_Library library = module->library; + FT_Module* cur = library->modules; + FT_Module* limit = cur + library->num_modules; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] != module ) + { + FT_ASSERT( cur[0]->clazz ); + + if ( cur[0]->clazz->get_interface ) + { + result = cur[0]->clazz->get_interface( cur[0], service_id ); + if ( result != NULL ) + break; + } + } + } + } + } + + return result; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ) + { + /* try to find the module from the table, then remove it from there */ + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( module ) + { + FT_Module* cur = library->modules; + FT_Module* limit = cur + library->num_modules; + + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] == module ) + { + /* remove it from the table */ + library->num_modules--; + limit--; + while ( cur < limit ) + { + cur[0] = cur[1]; + cur++; + } + limit[0] = 0; + + /* destroy the module */ + Destroy_Module( module ); + + return FT_Err_Ok; + } + } + } + return FT_Err_Invalid_Driver_Handle; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** L I B R A R Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Reference_Library( FT_Library library ) + { + library->refcount++; + + return FT_Err_Ok; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ) + { + FT_Library library = NULL; + FT_Error error; + + + if ( !memory ) + return FT_Err_Invalid_Argument; + +#ifdef FT_DEBUG_LEVEL_ERROR + /* init debugging support */ + ft_debug_init(); +#endif + + /* first of all, allocate the library object */ + if ( FT_NEW( library ) ) + return error; + + library->memory = memory; + +#ifdef FT_CONFIG_OPTION_PIC + /* initialize position independent code containers */ + error = ft_pic_container_init( library ); + if ( error ) + goto Fail; +#endif + + /* allocate the render pool */ + library->raster_pool_size = FT_RENDER_POOL_SIZE; +#if FT_RENDER_POOL_SIZE > 0 + if ( FT_ALLOC( library->raster_pool, FT_RENDER_POOL_SIZE ) ) + goto Fail; +#endif + + library->version_major = FREETYPE_MAJOR; + library->version_minor = FREETYPE_MINOR; + library->version_patch = FREETYPE_PATCH; + + library->refcount = 1; + + /* That's ok now */ + *alibrary = library; + + return FT_Err_Ok; + + Fail: +#ifdef FT_CONFIG_OPTION_PIC + ft_pic_container_destroy( library ); +#endif + FT_FREE( library ); + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ) + { + FT_Int major = 0; + FT_Int minor = 0; + FT_Int patch = 0; + + + if ( library ) + { + major = library->version_major; + minor = library->version_minor; + patch = library->version_patch; + } + + if ( amajor ) + *amajor = major; + + if ( aminor ) + *aminor = minor; + + if ( apatch ) + *apatch = patch; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Library( FT_Library library ) + { + FT_Memory memory; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + library->refcount--; + if ( library->refcount > 0 ) + goto Exit; + + memory = library->memory; + + /* Discard client-data */ + if ( library->generic.finalizer ) + library->generic.finalizer( library ); + + /* + * Close all faces in the library. If we don't do this, we can have + * some subtle memory leaks. + * + * Example: + * + * - the cff font driver uses the pshinter module in cff_size_done + * - if the pshinter module is destroyed before the cff font driver, + * opened FT_Face objects managed by the driver are not properly + * destroyed, resulting in a memory leak + * + * Some faces are dependent on other faces, like Type42 faces that + * depend on TrueType faces synthesized internally. + * + * The order of drivers should be specified in driver_name[]. + */ + { + FT_UInt m, n; + const char* driver_name[] = { "type42", NULL }; + + + for ( m = 0; + m < sizeof ( driver_name ) / sizeof ( driver_name[0] ); + m++ ) + { + for ( n = 0; n < library->num_modules; n++ ) + { + FT_Module module = library->modules[n]; + const char* module_name = module->clazz->module_name; + FT_List faces; + + + if ( driver_name[m] && + ft_strcmp( module_name, driver_name[m] ) != 0 ) + continue; + + if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 ) + continue; + + FT_TRACE7(( "FT_Done_Library: close faces for %s\n", module_name )); + + faces = &FT_DRIVER( module )->faces_list; + while ( faces->head ) + { + FT_Done_Face( FT_FACE( faces->head->data ) ); + if ( faces->head ) + FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" )); + } + } + } + } + + /* Close all other modules in the library */ +#if 1 + /* XXX Modules are removed in the reversed order so that */ + /* type42 module is removed before truetype module. This */ + /* avoids double free in some occasions. It is a hack. */ + while ( library->num_modules > 0 ) + FT_Remove_Module( library, + library->modules[library->num_modules - 1] ); +#else + { + FT_UInt n; + + + for ( n = 0; n < library->num_modules; n++ ) + { + FT_Module module = library->modules[n]; + + + if ( module ) + { + Destroy_Module( module ); + library->modules[n] = 0; + } + } + } +#endif + + /* Destroy raster objects */ + FT_FREE( library->raster_pool ); + library->raster_pool_size = 0; + +#ifdef FT_CONFIG_OPTION_PIC + /* Destroy pic container contents */ + ft_pic_container_destroy( library ); +#endif + + FT_FREE( library ); + + Exit: + return FT_Err_Ok; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ) + { + if ( library && debug_hook && + hook_index < + ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) ) + library->debug_hooks[hook_index] = debug_hook; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ) + { + FT_TrueTypeEngineType result = FT_TRUETYPE_ENGINE_TYPE_NONE; + + + if ( library ) + { + FT_Module module = FT_Get_Module( library, "truetype" ); + + + if ( module ) + { + FT_Service_TrueTypeEngine service; + + + service = (FT_Service_TrueTypeEngine) + ft_module_get_service( module, + FT_SERVICE_ID_TRUETYPE_ENGINE ); + if ( service ) + result = service->engine_type; + } + } + + return result; + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE_DEF( FT_Error ) + ft_stub_set_char_sizes( FT_Size size, + FT_F26Dot6 width, + FT_F26Dot6 height, + FT_UInt horz_res, + FT_UInt vert_res ) + { + FT_Size_RequestRec req; + FT_Driver driver = size->face->driver; + + + if ( driver->clazz->request_size ) + { + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = width; + req.height = height; + + if ( horz_res == 0 ) + horz_res = vert_res; + + if ( vert_res == 0 ) + vert_res = horz_res; + + if ( horz_res == 0 ) + horz_res = vert_res = 72; + + req.horiResolution = horz_res; + req.vertResolution = vert_res; + + return driver->clazz->request_size( size, &req ); + } + + return 0; + } + + + FT_BASE_DEF( FT_Error ) + ft_stub_set_pixel_sizes( FT_Size size, + FT_UInt width, + FT_UInt height ) + { + FT_Size_RequestRec req; + FT_Driver driver = size->face->driver; + + + if ( driver->clazz->request_size ) + { + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = width << 6; + req.height = height << 6; + req.horiResolution = 0; + req.vertResolution = 0; + + return driver->clazz->request_size( size, &req ); + } + + return 0; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( glyph && + glyph->subglyphs && + glyph->format == FT_GLYPH_FORMAT_COMPOSITE && + sub_index < glyph->num_subglyphs ) + { + FT_SubGlyph subg = glyph->subglyphs + sub_index; + + + *p_index = subg->index; + *p_flags = subg->flags; + *p_arg1 = subg->arg1; + *p_arg2 = subg->arg2; + *p_transform = subg->transform; + } + + return error; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftoutln.c b/android/jni/ndk_modules/freetype/src/base/ftoutln.c new file mode 100644 index 00000000..356b1561 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftoutln.c @@ -0,0 +1,1129 @@ +/***************************************************************************/ +/* */ +/* ftoutln.c */ +/* */ +/* FreeType outline management (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* All functions are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_TRIGONOMETRY_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_outline + + + static + const FT_Outline null_outline = { 0, 0, 0, 0, 0, 0 }; + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ) + { +#undef SCALED +#define SCALED( x ) ( ( (x) << shift ) - delta ) + + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + FT_Error error; + + FT_Int n; /* index of contour in outline */ + FT_UInt first; /* index of first point in contour */ + FT_Int tag; /* current point's state */ + + FT_Int shift; + FT_Pos delta; + + + if ( !outline || !func_interface ) + return FT_Err_Invalid_Argument; + + shift = func_interface->shift; + delta = func_interface->delta; + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + FT_Int last; /* index of last point in contour */ + + + FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); + + last = outline->contours[n]; + if ( last < 0 ) + goto Invalid_Outline; + limit = outline->points + last; + + v_start = outline->points[first]; + v_start.x = SCALED( v_start.x ); + v_start.y = SCALED( v_start.y ); + + v_last = outline->points[last]; + v_last.x = SCALED( v_last.x ); + v_last.y = SCALED( v_last.y ); + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + v_last = v_start; + } + point--; + tags--; + } + + FT_TRACE5(( " move to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->move_to( &v_start, user ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " line to (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0 )); + error = func_interface->line_to( &vec, user ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point->x ); + v_control.y = SCALED( point->y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_middle.x / 64.0, v_middle.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_start, user ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1.x = SCALED( point[-2].x ); + vec1.y = SCALED( point[-2].y ); + + vec2.x = SCALED( point[-1].x ); + vec2.y = SCALED( point[-1].y ); + + if ( point <= limit ) + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + FT_TRACE5(( " line to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + + first = last + 1; + } + + FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); + return FT_Err_Ok; + + Exit: + FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); + return error; + + Invalid_Outline: + return FT_Err_Invalid_Outline; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_New_Internal( FT_Memory memory, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ) + { + FT_Error error; + + + if ( !anoutline || !memory ) + return FT_Err_Invalid_Argument; + + *anoutline = null_outline; + + if ( FT_NEW_ARRAY( anoutline->points, numPoints ) || + FT_NEW_ARRAY( anoutline->tags, numPoints ) || + FT_NEW_ARRAY( anoutline->contours, numContours ) ) + goto Fail; + + anoutline->n_points = (FT_UShort)numPoints; + anoutline->n_contours = (FT_Short)numContours; + anoutline->flags |= FT_OUTLINE_OWNER; + + return FT_Err_Ok; + + Fail: + anoutline->flags |= FT_OUTLINE_OWNER; + FT_Outline_Done_Internal( memory, anoutline ); + + return error; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ) + { + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + return FT_Outline_New_Internal( library->memory, numPoints, + numContours, anoutline ); + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Check( FT_Outline* outline ) + { + if ( outline ) + { + FT_Int n_points = outline->n_points; + FT_Int n_contours = outline->n_contours; + FT_Int end0, end; + FT_Int n; + + + /* empty glyph? */ + if ( n_points == 0 && n_contours == 0 ) + return 0; + + /* check point and contour counts */ + if ( n_points <= 0 || n_contours <= 0 ) + goto Bad; + + end0 = end = -1; + for ( n = 0; n < n_contours; n++ ) + { + end = outline->contours[n]; + + /* note that we don't accept empty contours */ + if ( end <= end0 || end >= n_points ) + goto Bad; + + end0 = end; + } + + if ( end != n_points - 1 ) + goto Bad; + + /* XXX: check the tags array */ + return 0; + } + + Bad: + return FT_Err_Invalid_Argument; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ) + { + FT_Int is_owner; + + + if ( !source || !target || + source->n_points != target->n_points || + source->n_contours != target->n_contours ) + return FT_Err_Invalid_Argument; + + if ( source == target ) + return FT_Err_Ok; + + FT_ARRAY_COPY( target->points, source->points, source->n_points ); + + FT_ARRAY_COPY( target->tags, source->tags, source->n_points ); + + FT_ARRAY_COPY( target->contours, source->contours, source->n_contours ); + + /* copy all flags, except the `FT_OUTLINE_OWNER' one */ + is_owner = target->flags & FT_OUTLINE_OWNER; + target->flags = source->flags; + + target->flags &= ~FT_OUTLINE_OWNER; + target->flags |= is_owner; + + return FT_Err_Ok; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Done_Internal( FT_Memory memory, + FT_Outline* outline ) + { + if ( memory && outline ) + { + if ( outline->flags & FT_OUTLINE_OWNER ) + { + FT_FREE( outline->points ); + FT_FREE( outline->tags ); + FT_FREE( outline->contours ); + } + *outline = null_outline; + + return FT_Err_Ok; + } + else + return FT_Err_Invalid_Argument; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ) + { + /* check for valid `outline' in FT_Outline_Done_Internal() */ + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + return FT_Outline_Done_Internal( library->memory, outline ); + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ) + { + FT_Pos xMin, yMin, xMax, yMax; + + + if ( outline && acbox ) + { + if ( outline->n_points == 0 ) + { + xMin = 0; + yMin = 0; + xMax = 0; + yMax = 0; + } + else + { + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + outline->n_points; + + + xMin = xMax = vec->x; + yMin = yMax = vec->y; + vec++; + + for ( ; vec < limit; vec++ ) + { + FT_Pos x, y; + + + x = vec->x; + if ( x < xMin ) xMin = x; + if ( x > xMax ) xMax = x; + + y = vec->y; + if ( y < yMin ) yMin = y; + if ( y > yMax ) yMax = y; + } + } + acbox->xMin = xMin; + acbox->xMax = xMax; + acbox->yMin = yMin; + acbox->yMax = yMax; + } + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ) + { + FT_UShort n; + FT_Vector* vec; + + + if ( !outline ) + return; + + vec = outline->points; + + for ( n = 0; n < outline->n_points; n++ ) + { + vec->x += xOffset; + vec->y += yOffset; + vec++; + } + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Reverse( FT_Outline* outline ) + { + FT_UShort n; + FT_Int first, last; + + + if ( !outline ) + return; + + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + last = outline->contours[n]; + + /* reverse point table */ + { + FT_Vector* p = outline->points + first; + FT_Vector* q = outline->points + last; + FT_Vector swap; + + + while ( p < q ) + { + swap = *p; + *p = *q; + *q = swap; + p++; + q--; + } + } + + /* reverse tags table */ + { + char* p = outline->tags + first; + char* q = outline->tags + last; + char swap; + + + while ( p < q ) + { + swap = *p; + *p = *q; + *q = swap; + p++; + q--; + } + } + + first = last + 1; + } + + outline->flags ^= FT_OUTLINE_REVERSE_FILL; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ) + { + FT_Error error; + FT_Bool update = FALSE; + FT_Renderer renderer; + FT_ListNode node; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !outline || !params ) + return FT_Err_Invalid_Argument; + + renderer = library->cur_renderer; + node = library->renderers.head; + + params->source = (void*)outline; + + error = FT_Err_Cannot_Render_Glyph; + while ( renderer ) + { + error = renderer->raster_render( renderer->raster, params ); + if ( !error || FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph ) + break; + + /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ + /* is unsupported by the current renderer for this glyph image */ + /* format */ + + /* now, look for another renderer that supports the same */ + /* format */ + renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, + &node ); + update = TRUE; + } + + /* if we changed the current renderer for the glyph image format */ + /* we need to select it as the next current one */ + if ( !error && update && renderer ) + FT_Set_Renderer( library, renderer, 0, 0 ); + + return error; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ) + { + FT_Raster_Params params; + + + if ( !abitmap ) + return FT_Err_Invalid_Argument; + + /* other checks are delayed to FT_Outline_Render() */ + + params.target = abitmap; + params.flags = 0; + + if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY || + abitmap->pixel_mode == FT_PIXEL_MODE_LCD || + abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V ) + params.flags |= FT_RASTER_FLAG_AA; + + return FT_Outline_Render( library, outline, ¶ms ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Transform( FT_Vector* vector, + const FT_Matrix* matrix ) + { + FT_Pos xz, yz; + + + if ( !vector || !matrix ) + return; + + xz = FT_MulFix( vector->x, matrix->xx ) + + FT_MulFix( vector->y, matrix->xy ); + + yz = FT_MulFix( vector->x, matrix->yx ) + + FT_MulFix( vector->y, matrix->yy ); + + vector->x = xz; + vector->y = yz; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ) + { + FT_Vector* vec; + FT_Vector* limit; + + + if ( !outline || !matrix ) + return; + + vec = outline->points; + limit = vec + outline->n_points; + + for ( ; vec < limit; vec++ ) + FT_Vector_Transform( vec, matrix ); + } + + +#if 0 + +#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last ) \ + do { \ + (first) = ( c > 0 ) ? (outline)->points + \ + (outline)->contours[c - 1] + 1 \ + : (outline)->points; \ + (last) = (outline)->points + (outline)->contours[c]; \ + } while ( 0 ) + + + /* Is a point in some contour? */ + /* */ + /* We treat every point of the contour as if it */ + /* it were ON. That is, we allow false positives, */ + /* but disallow false negatives. (XXX really?) */ + static FT_Bool + ft_contour_has( FT_Outline* outline, + FT_Short c, + FT_Vector* point ) + { + FT_Vector* first; + FT_Vector* last; + FT_Vector* a; + FT_Vector* b; + FT_UInt n = 0; + + + FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); + + for ( a = first; a <= last; a++ ) + { + FT_Pos x; + FT_Int intersect; + + + b = ( a == last ) ? first : a + 1; + + intersect = ( a->y - point->y ) ^ ( b->y - point->y ); + + /* a and b are on the same side */ + if ( intersect >= 0 ) + { + if ( intersect == 0 && a->y == point->y ) + { + if ( ( a->x <= point->x && b->x >= point->x ) || + ( a->x >= point->x && b->x <= point->x ) ) + return 1; + } + + continue; + } + + x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y ); + + if ( x < point->x ) + n++; + else if ( x == point->x ) + return 1; + } + + return ( n % 2 ); + } + + + static FT_Bool + ft_contour_enclosed( FT_Outline* outline, + FT_UShort c ) + { + FT_Vector* first; + FT_Vector* last; + FT_Short i; + + + FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); + + for ( i = 0; i < outline->n_contours; i++ ) + { + if ( i != c && ft_contour_has( outline, i, first ) ) + { + FT_Vector* pt; + + + for ( pt = first + 1; pt <= last; pt++ ) + if ( !ft_contour_has( outline, i, pt ) ) + return 0; + + return 1; + } + } + + return 0; + } + + + /* This version differs from the public one in that each */ + /* part (contour not enclosed in another contour) of the */ + /* outline is checked for orientation. This is */ + /* necessary for some buggy CJK fonts. */ + static FT_Orientation + ft_outline_get_orientation( FT_Outline* outline ) + { + FT_Short i; + FT_Vector* first; + FT_Vector* last; + FT_Orientation orient = FT_ORIENTATION_NONE; + + + first = outline->points; + for ( i = 0; i < outline->n_contours; i++, first = last + 1 ) + { + FT_Vector* point; + FT_Vector* xmin_point; + FT_Pos xmin; + + + last = outline->points + outline->contours[i]; + + /* skip degenerate contours */ + if ( last < first + 2 ) + continue; + + if ( ft_contour_enclosed( outline, i ) ) + continue; + + xmin = first->x; + xmin_point = first; + + for ( point = first + 1; point <= last; point++ ) + { + if ( point->x < xmin ) + { + xmin = point->x; + xmin_point = point; + } + } + + /* check the orientation of the contour */ + { + FT_Vector* prev; + FT_Vector* next; + FT_Orientation o; + + + prev = ( xmin_point == first ) ? last : xmin_point - 1; + next = ( xmin_point == last ) ? first : xmin_point + 1; + + if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) > + FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) ) + o = FT_ORIENTATION_POSTSCRIPT; + else + o = FT_ORIENTATION_TRUETYPE; + + if ( orient == FT_ORIENTATION_NONE ) + orient = o; + else if ( orient != o ) + return FT_ORIENTATION_NONE; + } + } + + return orient; + } + +#endif /* 0 */ + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ) + { + FT_Vector* points; + FT_Vector v_prev, v_first, v_next, v_cur; + FT_Angle rotate, angle_in, angle_out; + FT_Int c, n, first; + FT_Int orientation; + + + if ( !outline ) + return FT_Err_Invalid_Argument; + + strength /= 2; + if ( strength == 0 ) + return FT_Err_Ok; + + orientation = FT_Outline_Get_Orientation( outline ); + if ( orientation == FT_ORIENTATION_NONE ) + { + if ( outline->n_contours ) + return FT_Err_Invalid_Argument; + else + return FT_Err_Ok; + } + + if ( orientation == FT_ORIENTATION_TRUETYPE ) + rotate = -FT_ANGLE_PI2; + else + rotate = FT_ANGLE_PI2; + + points = outline->points; + + first = 0; + for ( c = 0; c < outline->n_contours; c++ ) + { + int last = outline->contours[c]; + + + v_first = points[first]; + v_prev = points[last]; + v_cur = v_first; + + for ( n = first; n <= last; n++ ) + { + FT_Vector in, out; + FT_Angle angle_diff; + FT_Pos d; + FT_Fixed scale; + + + if ( n < last ) + v_next = points[n + 1]; + else + v_next = v_first; + + /* compute the in and out vectors */ + in.x = v_cur.x - v_prev.x; + in.y = v_cur.y - v_prev.y; + + out.x = v_next.x - v_cur.x; + out.y = v_next.y - v_cur.y; + + angle_in = FT_Atan2( in.x, in.y ); + angle_out = FT_Atan2( out.x, out.y ); + angle_diff = FT_Angle_Diff( angle_in, angle_out ); + scale = FT_Cos( angle_diff / 2 ); + + if ( scale < 0x4000L && scale > -0x4000L ) + in.x = in.y = 0; + else + { + d = FT_DivFix( strength, scale ); + + FT_Vector_From_Polar( &in, d, angle_in + angle_diff / 2 - rotate ); + } + + outline->points[n].x = v_cur.x + strength + in.x; + outline->points[n].y = v_cur.y + strength + in.y; + + v_prev = v_cur; + v_cur = v_next; + } + + first = last + 1; + } + + return FT_Err_Ok; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ) + { + FT_Pos xmin = 32768L; + FT_Pos xmin_ymin = 32768L; + FT_Pos xmin_ymax = -32768L; + FT_Vector* xmin_first = NULL; + FT_Vector* xmin_last = NULL; + + short* contour; + + FT_Vector* first; + FT_Vector* last; + FT_Vector* prev; + FT_Vector* point; + + int i; + FT_Pos ray_y[3]; + FT_Orientation result[3] = + { FT_ORIENTATION_NONE, FT_ORIENTATION_NONE, FT_ORIENTATION_NONE }; + + + if ( !outline || outline->n_points <= 0 ) + return FT_ORIENTATION_TRUETYPE; + + /* We use the nonzero winding rule to find the orientation. */ + /* Since glyph outlines behave much more `regular' than arbitrary */ + /* cubic or quadratic curves, this test deals with the polygon */ + /* only which is spanned up by the control points. */ + + first = outline->points; + for ( contour = outline->contours; + contour < outline->contours + outline->n_contours; + contour++, first = last + 1 ) + { + FT_Pos contour_xmin = 32768L; + FT_Pos contour_xmax = -32768L; + FT_Pos contour_ymin = 32768L; + FT_Pos contour_ymax = -32768L; + + + last = outline->points + *contour; + + /* skip degenerate contours */ + if ( last < first + 2 ) + continue; + + for ( point = first; point <= last; ++point ) + { + if ( point->x < contour_xmin ) + contour_xmin = point->x; + + if ( point->x > contour_xmax ) + contour_xmax = point->x; + + if ( point->y < contour_ymin ) + contour_ymin = point->y; + + if ( point->y > contour_ymax ) + contour_ymax = point->y; + } + + if ( contour_xmin < xmin && + contour_xmin != contour_xmax && + contour_ymin != contour_ymax ) + { + xmin = contour_xmin; + xmin_ymin = contour_ymin; + xmin_ymax = contour_ymax; + xmin_first = first; + xmin_last = last; + } + } + + if ( xmin == 32768L ) + return FT_ORIENTATION_TRUETYPE; + + ray_y[0] = ( xmin_ymin * 3 + xmin_ymax ) >> 2; + ray_y[1] = ( xmin_ymin + xmin_ymax ) >> 1; + ray_y[2] = ( xmin_ymin + xmin_ymax * 3 ) >> 2; + + for ( i = 0; i < 3; i++ ) + { + FT_Pos left_x; + FT_Pos right_x; + FT_Vector* left1; + FT_Vector* left2; + FT_Vector* right1; + FT_Vector* right2; + + + RedoRay: + left_x = 32768L; + right_x = -32768L; + + left1 = left2 = right1 = right2 = NULL; + + prev = xmin_last; + for ( point = xmin_first; point <= xmin_last; prev = point, ++point ) + { + FT_Pos tmp_x; + + + if ( point->y == ray_y[i] || prev->y == ray_y[i] ) + { + ray_y[i]++; + goto RedoRay; + } + + if ( ( point->y < ray_y[i] && prev->y < ray_y[i] ) || + ( point->y > ray_y[i] && prev->y > ray_y[i] ) ) + continue; + + tmp_x = FT_MulDiv( point->x - prev->x, + ray_y[i] - prev->y, + point->y - prev->y ) + prev->x; + + if ( tmp_x < left_x ) + { + left_x = tmp_x; + left1 = prev; + left2 = point; + } + + if ( tmp_x > right_x ) + { + right_x = tmp_x; + right1 = prev; + right2 = point; + } + } + + if ( left1 && right1 ) + { + if ( left1->y < left2->y && right1->y > right2->y ) + result[i] = FT_ORIENTATION_TRUETYPE; + else if ( left1->y > left2->y && right1->y < right2->y ) + result[i] = FT_ORIENTATION_POSTSCRIPT; + else + result[i] = FT_ORIENTATION_NONE; + } + } + + if ( result[0] != FT_ORIENTATION_NONE && + ( result[0] == result[1] || result[0] == result[2] ) ) + return result[0]; + + if ( result[1] != FT_ORIENTATION_NONE && result[1] == result[2] ) + return result[1]; + + return FT_ORIENTATION_TRUETYPE; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftpatent.c b/android/jni/ndk_modules/freetype/src/base/ftpatent.c new file mode 100644 index 00000000..501cab52 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftpatent.c @@ -0,0 +1,286 @@ +/***************************************************************************/ +/* */ +/* ftpatent.c */ +/* */ +/* FreeType API for checking patented TrueType bytecode instructions */ +/* (body). */ +/* */ +/* Copyright 2007, 2008, 2010 by David Turner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_TRUETYPE_GLYF_H + + + static FT_Bool + _tt_check_patents_in_range( FT_Stream stream, + FT_ULong size ) + { + FT_Bool result = FALSE; + FT_Error error; + FT_Bytes p, end; + + + if ( FT_FRAME_ENTER( size ) ) + return 0; + + p = stream->cursor; + end = p + size; + + while ( p < end ) + { + switch (p[0]) + { + case 0x06: /* SPvTL // */ + case 0x07: /* SPvTL + */ + case 0x08: /* SFvTL // */ + case 0x09: /* SFvTL + */ + case 0x0A: /* SPvFS */ + case 0x0B: /* SFvFS */ + result = TRUE; + goto Exit; + + case 0x40: + if ( p + 1 >= end ) + goto Exit; + + p += p[1] + 2; + break; + + case 0x41: + if ( p + 1 >= end ) + goto Exit; + + p += p[1] * 2 + 2; + break; + + case 0x71: /* DELTAP2 */ + case 0x72: /* DELTAP3 */ + case 0x73: /* DELTAC0 */ + case 0x74: /* DELTAC1 */ + case 0x75: /* DELTAC2 */ + result = TRUE; + goto Exit; + + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + p += ( p[0] - 0xB0 ) + 2; + break; + + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + p += ( p[0] - 0xB8 ) * 2 + 3; + break; + + default: + p += 1; + break; + } + } + + Exit: + FT_UNUSED( error ); + FT_FRAME_EXIT(); + return result; + } + + + static FT_Bool + _tt_check_patents_in_table( FT_Face face, + FT_ULong tag ) + { + FT_Stream stream = face->stream; + FT_Error error = FT_Err_Ok; + FT_Service_SFNT_Table service; + FT_Bool result = FALSE; + + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + + if ( service ) + { + FT_UInt i = 0; + FT_ULong tag_i = 0, offset_i = 0, length_i = 0; + + + for ( i = 0; !error && tag_i != tag ; i++ ) + error = service->table_info( face, i, + &tag_i, &offset_i, &length_i ); + + if ( error || + FT_STREAM_SEEK( offset_i ) ) + goto Exit; + + result = _tt_check_patents_in_range( stream, length_i ); + } + + Exit: + return result; + } + + + static FT_Bool + _tt_face_check_patents( FT_Face face ) + { + FT_Stream stream = face->stream; + FT_UInt gindex; + FT_Error error; + FT_Bool result; + + FT_Service_TTGlyf service; + + + result = _tt_check_patents_in_table( face, TTAG_fpgm ); + if ( result ) + goto Exit; + + result = _tt_check_patents_in_table( face, TTAG_prep ); + if ( result ) + goto Exit; + + FT_FACE_FIND_SERVICE( face, service, TT_GLYF ); + if ( service == NULL ) + goto Exit; + + for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ ) + { + FT_ULong offset, num_ins, size; + FT_Int num_contours; + + + offset = service->get_location( face, gindex, &size ); + if ( size == 0 ) + continue; + + if ( FT_STREAM_SEEK( offset ) || + FT_READ_SHORT( num_contours ) ) + continue; + + if ( num_contours >= 0 ) /* simple glyph */ + { + if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) ) + continue; + } + else /* compound glyph */ + { + FT_Bool has_instr = 0; + + + if ( FT_STREAM_SKIP( 8 ) ) + continue; + + /* now read each component */ + for (;;) + { + FT_UInt flags, toskip; + + + if( FT_READ_USHORT( flags ) ) + break; + + toskip = 2 + 1 + 1; + + if ( ( flags & ( 1 << 0 ) ) != 0 ) /* ARGS_ARE_WORDS */ + toskip += 2; + + if ( ( flags & ( 1 << 3 ) ) != 0 ) /* WE_HAVE_A_SCALE */ + toskip += 2; + else if ( ( flags & ( 1 << 6 ) ) != 0 ) /* WE_HAVE_X_Y_SCALE */ + toskip += 4; + else if ( ( flags & ( 1 << 7 ) ) != 0 ) /* WE_HAVE_A_2x2 */ + toskip += 8; + + if ( ( flags & ( 1 << 8 ) ) != 0 ) /* WE_HAVE_INSTRUCTIONS */ + has_instr = 1; + + if ( FT_STREAM_SKIP( toskip ) ) + goto NextGlyph; + + if ( ( flags & ( 1 << 5 ) ) == 0 ) /* MORE_COMPONENTS */ + break; + } + + if ( !has_instr ) + goto NextGlyph; + } + + if ( FT_READ_USHORT( num_ins ) ) + continue; + + result = _tt_check_patents_in_range( stream, num_ins ); + if ( result ) + goto Exit; + + NextGlyph: + ; + } + + Exit: + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ) + { + FT_Bool result = FALSE; + + + if ( face && FT_IS_SFNT( face ) ) + result = _tt_face_check_patents( face ); + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ) + { + FT_Bool result = FALSE; + + +#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \ + !defined( TT_CONFIG_OPTION_BYTECODE_INTEPRETER ) + if ( face && FT_IS_SFNT( face ) ) + { + result = !face->internal->ignore_unpatented_hinter; + face->internal->ignore_unpatented_hinter = !value; + } +#else + FT_UNUSED( face ); + FT_UNUSED( value ); +#endif + + return result; + } + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftpic.c b/android/jni/ndk_modules/freetype/src/base/ftpic.c new file mode 100644 index 00000000..d5271a97 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftpic.c @@ -0,0 +1,54 @@ +/***************************************************************************/ +/* */ +/* ftpic.c */ +/* */ +/* The FreeType position independent code services (body). */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "basepic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* documentation is in ftpic.h */ + + FT_BASE_DEF( FT_Error ) + ft_pic_container_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + + FT_MEM_SET( pic_container, 0, sizeof(*pic_container) ); + + error = ft_base_pic_init( library ); + if(error) + return error; + + return FT_Err_Ok; + } + + + /* Destroy the contents of the container. */ + FT_BASE_DEF( void ) + ft_pic_container_destroy( FT_Library library ) + { + ft_base_pic_free( library ); + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftrfork.c b/android/jni/ndk_modules/freetype/src/base/ftrfork.c new file mode 100644 index 00000000..f64d28b2 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftrfork.c @@ -0,0 +1,821 @@ +/***************************************************************************/ +/* */ +/* ftrfork.c */ +/* */ +/* Embedded resource forks accessor (body). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ +/* Masatake YAMATO and Redhat K.K. */ +/* */ +/* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */ +/* derived from ftobjs.c. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* Development of the code in this file is support of */ +/* Information-technology Promotion Agency, Japan. */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_RFORK_H + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** Resource fork directory access ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + FT_BASE_DEF( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ) + { + FT_Error error; + unsigned char head[16], head2[16]; + FT_Long map_pos, rdata_len; + int allzeros, allmatch, i; + FT_Long type_list; + + FT_UNUSED( library ); + + + error = FT_Stream_Seek( stream, rfork_offset ); + if ( error ) + return error; + + error = FT_Stream_Read( stream, (FT_Byte *)head, 16 ); + if ( error ) + return error; + + *rdata_pos = rfork_offset + ( ( head[0] << 24 ) | + ( head[1] << 16 ) | + ( head[2] << 8 ) | + head[3] ); + map_pos = rfork_offset + ( ( head[4] << 24 ) | + ( head[5] << 16 ) | + ( head[6] << 8 ) | + head[7] ); + rdata_len = ( head[ 8] << 24 ) | + ( head[ 9] << 16 ) | + ( head[10] << 8 ) | + head[11]; + + /* map_len = head[12] .. head[15] */ + + if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset ) + return FT_Err_Unknown_File_Format; + + error = FT_Stream_Seek( stream, map_pos ); + if ( error ) + return error; + + head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */ + + error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 ); + if ( error ) + return error; + + allzeros = 1; + allmatch = 1; + for ( i = 0; i < 16; ++i ) + { + if ( head2[i] != 0 ) + allzeros = 0; + if ( head2[i] != head[i] ) + allmatch = 0; + } + if ( !allzeros && !allmatch ) + return FT_Err_Unknown_File_Format; + + /* If we have reached this point then it is probably a mac resource */ + /* file. Now, does it contain any interesting resources? */ + /* Skip handle to next resource map, the file resource number, and */ + /* attributes. */ + (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */ + + 2 /* skip file resource number */ + + 2 ); /* skip attributes */ + + if ( FT_READ_USHORT( type_list ) ) + return error; + if ( type_list == -1 ) + return FT_Err_Unknown_File_Format; + + error = FT_Stream_Seek( stream, map_pos + type_list ); + if ( error ) + return error; + + *map_offset = map_pos + type_list; + return FT_Err_Ok; + } + + + static int + ft_raccess_sort_ref_by_id( FT_RFork_Ref* a, + FT_RFork_Ref* b ) + { + if ( a->res_id < b->res_id ) + return -1; + else if ( a->res_id > b->res_id ) + return 1; + else + return 0; + } + + + FT_BASE_DEF( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Long **offsets, + FT_Long *count ) + { + FT_Error error; + int i, j, cnt, subcnt; + FT_Long tag_internal, rpos; + FT_Memory memory = library->memory; + FT_Long temp; + FT_Long *offsets_internal; + FT_RFork_Ref *ref; + + + error = FT_Stream_Seek( stream, map_offset ); + if ( error ) + return error; + + if ( FT_READ_USHORT( cnt ) ) + return error; + cnt++; + + for ( i = 0; i < cnt; ++i ) + { + if ( FT_READ_LONG( tag_internal ) || + FT_READ_USHORT( subcnt ) || + FT_READ_USHORT( rpos ) ) + return error; + + FT_TRACE2(( "Resource tags: %c%c%c%c\n", + (char)( 0xff & ( tag_internal >> 24 ) ), + (char)( 0xff & ( tag_internal >> 16 ) ), + (char)( 0xff & ( tag_internal >> 8 ) ), + (char)( 0xff & ( tag_internal >> 0 ) ) )); + + if ( tag_internal == tag ) + { + *count = subcnt + 1; + rpos += map_offset; + + error = FT_Stream_Seek( stream, rpos ); + if ( error ) + return error; + + if ( FT_NEW_ARRAY( ref, *count ) ) + return error; + + for ( j = 0; j < *count; ++j ) + { + if ( FT_READ_USHORT( ref[j].res_id ) ) + goto Exit; + if ( FT_STREAM_SKIP( 2 ) ) /* resource name */ + goto Exit; + if ( FT_READ_LONG( temp ) ) + goto Exit; + if ( FT_STREAM_SKIP( 4 ) ) /* mbz */ + goto Exit; + + ref[j].offset = temp & 0xFFFFFFL; + } + + ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ), + ( int(*)(const void*, const void*) ) + ft_raccess_sort_ref_by_id ); + + if ( FT_NEW_ARRAY( offsets_internal, *count ) ) + goto Exit; + + /* XXX: duplicated reference ID, + * gap between reference IDs are acceptable? + * further investigation on Apple implementation is needed. + */ + for ( j = 0; j < *count; ++j ) + offsets_internal[j] = rdata_pos + ref[j].offset; + + *offsets = offsets_internal; + error = FT_Err_Ok; + + Exit: + FT_FREE( ref ); + return error; + } + } + + return FT_Err_Cannot_Open_Resource; + } + + +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** Guessing functions ****/ + /**** ****/ + /**** When you add a new guessing function, ****/ + /**** update FT_RACCESS_N_RULES in ftrfork.h. ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + typedef FT_Error + (*raccess_guess_func)( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + + static FT_Error + raccess_guess_apple_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_apple_single( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_ufs_export( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_newvfs( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_hfsplus( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_vfat( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_cap( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_netatalk( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + + /*************************************************************************/ + /**** ****/ + /**** Helper functions ****/ + /**** ****/ + /*************************************************************************/ + + static FT_Error + raccess_guess_apple_generic( FT_Library library, + FT_Stream stream, + char *base_file_name, + FT_Int32 magic, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_double_from_file_name( FT_Library library, + char * file_name, + FT_Long *result_offset ); + + static char * + raccess_make_file_name( FT_Memory memory, + const char *original_name, + const char *insertion ); + + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + FT_Long i; + + + raccess_guess_func funcs[FT_RACCESS_N_RULES] = + { + raccess_guess_apple_double, + raccess_guess_apple_single, + raccess_guess_darwin_ufs_export, + raccess_guess_darwin_newvfs, + raccess_guess_darwin_hfsplus, + raccess_guess_vfat, + raccess_guess_linux_cap, + raccess_guess_linux_double, + raccess_guess_linux_netatalk, + }; + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + if ( NULL != stream ) + errors[i] = FT_Stream_Seek( stream, 0 ); + else + errors[i] = FT_Err_Ok; + + if ( errors[i] ) + continue ; + + errors[i] = (funcs[i])( library, stream, base_name, + &(new_names[i]), &(offsets[i]) ); + } + + return; + } + + + static FT_Error + raccess_guess_apple_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + FT_Int32 magic = ( 0x00 << 24 ) | + ( 0x05 << 16 ) | + ( 0x16 << 8 ) | + 0x07; + + + *result_file_name = NULL; + if ( NULL == stream ) + return FT_Err_Cannot_Open_Stream; + + return raccess_guess_apple_generic( library, stream, base_file_name, + magic, result_offset ); + } + + + static FT_Error + raccess_guess_apple_single( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + FT_Int32 magic = ( 0x00 << 24 ) | + ( 0x05 << 16 ) | + ( 0x16 << 8 ) | + 0x00; + + + *result_file_name = NULL; + if ( NULL == stream ) + return FT_Err_Cannot_Open_Stream; + + return raccess_guess_apple_generic( library, stream, base_file_name, + magic, result_offset ); + } + + + static FT_Error + raccess_guess_darwin_ufs_export( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + newpath = raccess_make_file_name( memory, base_file_name, "._" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_darwin_hfsplus( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + /* + Only meaningful on systems with hfs+ drivers (or Macs). + */ + FT_Error error; + char* newpath; + FT_Memory memory; + FT_Long base_file_len = ft_strlen( base_file_name ); + + FT_UNUSED( stream ); + + + memory = library->memory; + + if ( base_file_len + 6 > FT_INT_MAX ) + return FT_Err_Array_Too_Large; + + if ( FT_ALLOC( newpath, base_file_len + 6 ) ) + return error; + + FT_MEM_COPY( newpath, base_file_name, base_file_len ); + FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_darwin_newvfs( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + /* + Only meaningful on systems with Mac OS X (> 10.1). + */ + FT_Error error; + char* newpath; + FT_Memory memory; + FT_Long base_file_len = ft_strlen( base_file_name ); + + FT_UNUSED( stream ); + + + memory = library->memory; + + if ( base_file_len + 18 > FT_INT_MAX ) + return FT_Err_Array_Too_Large; + + if ( FT_ALLOC( newpath, base_file_len + 18 ) ) + return error; + + FT_MEM_COPY( newpath, base_file_name, base_file_len ); + FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_vfat( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, + "resource.frk/" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_linux_cap( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, ".resource/" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_linux_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, "%" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_linux_netatalk( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, + ".AppleDouble/" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_apple_generic( FT_Library library, + FT_Stream stream, + char *base_file_name, + FT_Int32 magic, + FT_Long *result_offset ) + { + FT_Int32 magic_from_stream; + FT_Error error; + FT_Int32 version_number = 0; + FT_UShort n_of_entries; + + int i; + FT_UInt32 entry_id, entry_offset, entry_length = 0; + + const FT_UInt32 resource_fork_entry_id = 0x2; + + FT_UNUSED( library ); + FT_UNUSED( base_file_name ); + FT_UNUSED( version_number ); + FT_UNUSED( entry_length ); + + + if ( FT_READ_LONG( magic_from_stream ) ) + return error; + if ( magic_from_stream != magic ) + return FT_Err_Unknown_File_Format; + + if ( FT_READ_LONG( version_number ) ) + return error; + + /* filler */ + error = FT_Stream_Skip( stream, 16 ); + if ( error ) + return error; + + if ( FT_READ_USHORT( n_of_entries ) ) + return error; + if ( n_of_entries == 0 ) + return FT_Err_Unknown_File_Format; + + for ( i = 0; i < n_of_entries; i++ ) + { + if ( FT_READ_LONG( entry_id ) ) + return error; + if ( entry_id == resource_fork_entry_id ) + { + if ( FT_READ_LONG( entry_offset ) || + FT_READ_LONG( entry_length ) ) + continue; + *result_offset = entry_offset; + + return FT_Err_Ok; + } + else + { + error = FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */ + if ( error ) + return error; + } + } + + return FT_Err_Unknown_File_Format; + } + + + static FT_Error + raccess_guess_linux_double_from_file_name( FT_Library library, + char *file_name, + FT_Long *result_offset ) + { + FT_Open_Args args2; + FT_Stream stream2; + char * nouse = NULL; + FT_Error error; + + + args2.flags = FT_OPEN_PATHNAME; + args2.pathname = file_name; + error = FT_Stream_New( library, &args2, &stream2 ); + if ( error ) + return error; + + error = raccess_guess_apple_double( library, stream2, file_name, + &nouse, result_offset ); + + FT_Stream_Free( stream2, 0 ); + + return error; + } + + + static char* + raccess_make_file_name( FT_Memory memory, + const char *original_name, + const char *insertion ) + { + char* new_name = NULL; + const char* tmp; + const char* slash; + size_t new_length; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( error ); + + + new_length = ft_strlen( original_name ) + ft_strlen( insertion ); + if ( FT_ALLOC( new_name, new_length + 1 ) ) + return NULL; + + tmp = ft_strrchr( original_name, '/' ); + if ( tmp ) + { + ft_strncpy( new_name, original_name, tmp - original_name + 1 ); + new_name[tmp - original_name + 1] = '\0'; + slash = tmp + 1; + } + else + { + slash = original_name; + new_name[0] = '\0'; + } + + ft_strcat( new_name, insertion ); + ft_strcat( new_name, slash ); + + return new_name; + } + + +#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + + /*************************************************************************/ + /* Dummy function; just sets errors */ + /*************************************************************************/ + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char *base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + int i; + + FT_UNUSED( library ); + FT_UNUSED( stream ); + FT_UNUSED( base_name ); + + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + offsets[i] = 0; + errors[i] = FT_Err_Unimplemented_Feature; + } + } + + +#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftsnames.c b/android/jni/ndk_modules/freetype/src/base/ftsnames.c new file mode 100644 index 00000000..3447888c --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftsnames.c @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* ftsnames.c */ +/* */ +/* Simple interface to access SFNT name tables (which are used */ +/* to hold font names, copyright info, notices, etc.) (body). */ +/* */ +/* This is _not_ used to retrieve glyph names! */ +/* */ +/* Copyright 1996-2001, 2002, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_SFNT_NAMES_H +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_INTERNAL_STREAM_H + + +#ifdef TT_CONFIG_OPTION_SFNT_NAMES + + + /* documentation is in ftsnames.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ) + { + return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0; + } + + + /* documentation is in ftsnames.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( aname && face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( idx < (FT_UInt)ttface->num_names ) + { + TT_NameEntryRec* entry = ttface->name_table.names + idx; + + + /* load name on demand */ + if ( entry->stringLength > 0 && entry->string == NULL ) + { + FT_Memory memory = face->memory; + FT_Stream stream = face->stream; + + + if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || + FT_STREAM_SEEK( entry->stringOffset ) || + FT_STREAM_READ( entry->string, entry->stringLength ) ) + { + FT_FREE( entry->string ); + entry->stringLength = 0; + } + } + + aname->platform_id = entry->platformID; + aname->encoding_id = entry->encodingID; + aname->language_id = entry->languageID; + aname->name_id = entry->nameID; + aname->string = (FT_Byte*)entry->string; + aname->string_len = entry->stringLength; + + error = FT_Err_Ok; + } + } + + return error; + } + + +#endif /* TT_CONFIG_OPTION_SFNT_NAMES */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftstream.c b/android/jni/ndk_modules/freetype/src/base/ftstream.c new file mode 100644 index 00000000..210aaa48 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftstream.c @@ -0,0 +1,864 @@ +/***************************************************************************/ +/* */ +/* ftstream.c */ +/* */ +/* I/O stream support (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2004, 2005, 2006, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_stream + + + FT_BASE_DEF( void ) + FT_Stream_OpenMemory( FT_Stream stream, + const FT_Byte* base, + FT_ULong size ) + { + stream->base = (FT_Byte*) base; + stream->size = size; + stream->pos = 0; + stream->cursor = 0; + stream->read = 0; + stream->close = 0; + } + + + FT_BASE_DEF( void ) + FT_Stream_Close( FT_Stream stream ) + { + if ( stream && stream->close ) + stream->close( stream ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Seek( FT_Stream stream, + FT_ULong pos ) + { + FT_Error error = FT_Err_Ok; + + + if ( stream->read ) + { + if ( stream->read( stream, pos, 0, 0 ) ) + { + FT_ERROR(( "FT_Stream_Seek:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + } + } + /* note that seeking to the first position after the file is valid */ + else if ( pos > stream->size ) + { + FT_ERROR(( "FT_Stream_Seek:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + } + + if ( !error ) + stream->pos = pos; + + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Skip( FT_Stream stream, + FT_Long distance ) + { + if ( distance < 0 ) + return FT_Err_Invalid_Stream_Operation; + + return FT_Stream_Seek( stream, (FT_ULong)( stream->pos + distance ) ); + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_Pos( FT_Stream stream ) + { + return stream->pos; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Read( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_ReadAt( stream, stream->pos, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ReadAt( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong read_bytes; + + + if ( pos >= stream->size ) + { + FT_ERROR(( "FT_Stream_ReadAt:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + return FT_Err_Invalid_Stream_Operation; + } + + if ( stream->read ) + read_bytes = stream->read( stream, pos, buffer, count ); + else + { + read_bytes = stream->size - pos; + if ( read_bytes > count ) + read_bytes = count; + + FT_MEM_COPY( buffer, stream->base + pos, read_bytes ); + } + + stream->pos = pos + read_bytes; + + if ( read_bytes < count ) + { + FT_ERROR(( "FT_Stream_ReadAt:" + " invalid read; expected %lu bytes, got %lu\n", + count, read_bytes )); + + error = FT_Err_Invalid_Stream_Operation; + } + + return error; + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_TryRead( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong read_bytes = 0; + + + if ( stream->pos >= stream->size ) + goto Exit; + + if ( stream->read ) + read_bytes = stream->read( stream, stream->pos, buffer, count ); + else + { + read_bytes = stream->size - stream->pos; + if ( read_bytes > count ) + read_bytes = count; + + FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes ); + } + + stream->pos += read_bytes; + + Exit: + return read_bytes; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ExtractFrame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ) + { + FT_Error error; + + + error = FT_Stream_EnterFrame( stream, count ); + if ( !error ) + { + *pbytes = (FT_Byte*)stream->cursor; + + /* equivalent to FT_Stream_ExitFrame(), with no memory block release */ + stream->cursor = 0; + stream->limit = 0; + } + + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_ReleaseFrame( FT_Stream stream, + FT_Byte** pbytes ) + { + if ( stream && stream->read ) + { + FT_Memory memory = stream->memory; + +#ifdef FT_DEBUG_MEMORY + ft_mem_free( memory, *pbytes ); + *pbytes = NULL; +#else + FT_FREE( *pbytes ); +#endif + } + *pbytes = 0; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_EnterFrame( FT_Stream stream, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong read_bytes; + + + /* check for nested frame access */ + FT_ASSERT( stream && stream->cursor == 0 ); + + if ( stream->read ) + { + /* allocate the frame in memory */ + FT_Memory memory = stream->memory; + + + /* simple sanity check */ + if ( count > stream->size ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" + " frame size (%lu) larger than stream size (%lu)\n", + count, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + goto Exit; + } + +#ifdef FT_DEBUG_MEMORY + /* assume _ft_debug_file and _ft_debug_lineno are already set */ + stream->base = (unsigned char*)ft_mem_qalloc( memory, count, &error ); + if ( error ) + goto Exit; +#else + if ( FT_QALLOC( stream->base, count ) ) + goto Exit; +#endif + /* read it */ + read_bytes = stream->read( stream, stream->pos, + stream->base, count ); + if ( read_bytes < count ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" + " invalid read; expected %lu bytes, got %lu\n", + count, read_bytes )); + + FT_FREE( stream->base ); + error = FT_Err_Invalid_Stream_Operation; + } + stream->cursor = stream->base; + stream->limit = stream->cursor + count; + stream->pos += read_bytes; + } + else + { + /* check current and new position */ + if ( stream->pos >= stream->size || + stream->size - stream->pos < count ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" + " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n", + stream->pos, count, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + goto Exit; + } + + /* set cursor */ + stream->cursor = stream->base + stream->pos; + stream->limit = stream->cursor + count; + stream->pos += count; + } + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_ExitFrame( FT_Stream stream ) + { + /* IMPORTANT: The assertion stream->cursor != 0 was removed, given */ + /* that it is possible to access a frame of length 0 in */ + /* some weird fonts (usually, when accessing an array of */ + /* 0 records, like in some strange kern tables). */ + /* */ + /* In this case, the loader code handles the 0-length table */ + /* gracefully; however, stream.cursor is really set to 0 by the */ + /* FT_Stream_EnterFrame() call, and this is not an error. */ + /* */ + FT_ASSERT( stream ); + + if ( stream->read ) + { + FT_Memory memory = stream->memory; + +#ifdef FT_DEBUG_MEMORY + ft_mem_free( memory, stream->base ); + stream->base = NULL; +#else + FT_FREE( stream->base ); +#endif + } + stream->cursor = 0; + stream->limit = 0; + } + + + FT_BASE_DEF( FT_Char ) + FT_Stream_GetChar( FT_Stream stream ) + { + FT_Char result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + if ( stream->cursor < stream->limit ) + result = *stream->cursor++; + + return result; + } + + + FT_BASE_DEF( FT_Short ) + FT_Stream_GetShort( FT_Stream stream ) + { + FT_Byte* p; + FT_Short result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 1 < stream->limit ) + result = FT_NEXT_SHORT( p ); + stream->cursor = p; + + return result; + } + + + FT_BASE_DEF( FT_Short ) + FT_Stream_GetShortLE( FT_Stream stream ) + { + FT_Byte* p; + FT_Short result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 1 < stream->limit ) + result = FT_NEXT_SHORT_LE( p ); + stream->cursor = p; + + return result; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_GetOffset( FT_Stream stream ) + { + FT_Byte* p; + FT_Long result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 2 < stream->limit ) + result = FT_NEXT_OFF3( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_GetLong( FT_Stream stream ) + { + FT_Byte* p; + FT_Long result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 3 < stream->limit ) + result = FT_NEXT_LONG( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_GetLongLE( FT_Stream stream ) + { + FT_Byte* p; + FT_Long result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 3 < stream->limit ) + result = FT_NEXT_LONG_LE( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Char ) + FT_Stream_ReadChar( FT_Stream stream, + FT_Error* error ) + { + FT_Byte result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, &result, 1L ) != 1L ) + goto Fail; + } + else + { + if ( stream->pos < stream->size ) + result = stream->base[stream->pos]; + else + goto Fail; + } + stream->pos++; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadChar:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Short ) + FT_Stream_ReadShort( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[2]; + FT_Byte* p = 0; + FT_Short result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 1 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_SHORT( p ); + } + else + goto Fail; + + stream->pos += 2; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadShort:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Short ) + FT_Stream_ReadShortLE( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[2]; + FT_Byte* p = 0; + FT_Short result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 1 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_SHORT_LE( p ); + } + else + goto Fail; + + stream->pos += 2; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadShortLE:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_ReadOffset( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[3]; + FT_Byte* p = 0; + FT_Long result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 2 < stream->size ) + { + if ( stream->read ) + { + if (stream->read( stream, stream->pos, reads, 3L ) != 3L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_OFF3( p ); + } + else + goto Fail; + + stream->pos += 3; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadOffset:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_ReadLong( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[4]; + FT_Byte* p = 0; + FT_Long result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 3 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_LONG( p ); + } + else + goto Fail; + + stream->pos += 4; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadLong:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_ReadLongLE( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[4]; + FT_Byte* p = 0; + FT_Long result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 3 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_LONG_LE( p ); + } + else + goto Fail; + + stream->pos += 4; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadLongLE:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ReadFields( FT_Stream stream, + const FT_Frame_Field* fields, + void* structure ) + { + FT_Error error; + FT_Bool frame_accessed = 0; + FT_Byte* cursor; + + if ( !fields || !stream ) + return FT_Err_Invalid_Argument; + + cursor = stream->cursor; + + error = FT_Err_Ok; + do + { + FT_ULong value; + FT_Int sign_shift; + FT_Byte* p; + + + switch ( fields->value ) + { + case ft_frame_start: /* access a new frame */ + error = FT_Stream_EnterFrame( stream, fields->offset ); + if ( error ) + goto Exit; + + frame_accessed = 1; + cursor = stream->cursor; + fields++; + continue; /* loop! */ + + case ft_frame_bytes: /* read a byte sequence */ + case ft_frame_skip: /* skip some bytes */ + { + FT_UInt len = fields->size; + + + if ( cursor + len > stream->limit ) + { + error = FT_Err_Invalid_Stream_Operation; + goto Exit; + } + + if ( fields->value == ft_frame_bytes ) + { + p = (FT_Byte*)structure + fields->offset; + FT_MEM_COPY( p, cursor, len ); + } + cursor += len; + fields++; + continue; + } + + case ft_frame_byte: + case ft_frame_schar: /* read a single byte */ + value = FT_NEXT_BYTE(cursor); + sign_shift = 24; + break; + + case ft_frame_short_be: + case ft_frame_ushort_be: /* read a 2-byte big-endian short */ + value = FT_NEXT_USHORT(cursor); + sign_shift = 16; + break; + + case ft_frame_short_le: + case ft_frame_ushort_le: /* read a 2-byte little-endian short */ + value = FT_NEXT_USHORT_LE(cursor); + sign_shift = 16; + break; + + case ft_frame_long_be: + case ft_frame_ulong_be: /* read a 4-byte big-endian long */ + value = FT_NEXT_ULONG(cursor); + sign_shift = 0; + break; + + case ft_frame_long_le: + case ft_frame_ulong_le: /* read a 4-byte little-endian long */ + value = FT_NEXT_ULONG_LE(cursor); + sign_shift = 0; + break; + + case ft_frame_off3_be: + case ft_frame_uoff3_be: /* read a 3-byte big-endian long */ + value = FT_NEXT_UOFF3(cursor); + sign_shift = 8; + break; + + case ft_frame_off3_le: + case ft_frame_uoff3_le: /* read a 3-byte little-endian long */ + value = FT_NEXT_UOFF3_LE(cursor); + sign_shift = 8; + break; + + default: + /* otherwise, exit the loop */ + stream->cursor = cursor; + goto Exit; + } + + /* now, compute the signed value is necessary */ + if ( fields->value & FT_FRAME_OP_SIGNED ) + value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift ); + + /* finally, store the value in the object */ + + p = (FT_Byte*)structure + fields->offset; + switch ( fields->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)p = (FT_Byte)value; + break; + + case (16 / FT_CHAR_BIT): + *(FT_UShort*)p = (FT_UShort)value; + break; + + case (32 / FT_CHAR_BIT): + *(FT_UInt32*)p = (FT_UInt32)value; + break; + + default: /* for 64-bit systems */ + *(FT_ULong*)p = (FT_ULong)value; + } + + /* go to next field */ + fields++; + } + while ( 1 ); + + Exit: + /* close the frame if it was opened by this read */ + if ( frame_accessed ) + FT_Stream_ExitFrame( stream ); + + return error; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftstroke.c b/android/jni/ndk_modules/freetype/src/base/ftstroke.c new file mode 100644 index 00000000..75bcbded --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftstroke.c @@ -0,0 +1,2039 @@ +/***************************************************************************/ +/* */ +/* ftstroke.c */ +/* */ +/* FreeType path stroker (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_STROKER_H +#include FT_TRIGONOMETRY_H +#include FT_OUTLINE_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ) + { + FT_Orientation o = FT_Outline_Get_Orientation( outline ); + + + return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT + : FT_STROKER_BORDER_LEFT ; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ) + { + FT_Orientation o = FT_Outline_Get_Orientation( outline ); + + + return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT + : FT_STROKER_BORDER_RIGHT ; + } + + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** BEZIER COMPUTATIONS *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + +#define FT_SMALL_CONIC_THRESHOLD ( FT_ANGLE_PI / 6 ) +#define FT_SMALL_CUBIC_THRESHOLD ( FT_ANGLE_PI / 6 ) +#define FT_EPSILON 2 + +#define FT_IS_SMALL( x ) ( (x) > -FT_EPSILON && (x) < FT_EPSILON ) + + + static FT_Pos + ft_pos_abs( FT_Pos x ) + { + return x >= 0 ? x : -x ; + } + + + static void + ft_conic_split( FT_Vector* base ) + { + FT_Pos a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + } + + + static FT_Bool + ft_conic_is_small_enough( FT_Vector* base, + FT_Angle *angle_in, + FT_Angle *angle_out ) + { + FT_Vector d1, d2; + FT_Angle theta; + FT_Int close1, close2; + + + d1.x = base[1].x - base[2].x; + d1.y = base[1].y - base[2].y; + d2.x = base[0].x - base[1].x; + d2.y = base[0].y - base[1].y; + + close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); + close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); + + if ( close1 ) + { + if ( close2 ) + *angle_in = *angle_out = 0; + else + *angle_in = *angle_out = FT_Atan2( d2.x, d2.y ); + } + else if ( close2 ) + { + *angle_in = *angle_out = FT_Atan2( d1.x, d1.y ); + } + else + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_out = FT_Atan2( d2.x, d2.y ); + } + + theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) ); + + return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD ); + } + + + static void + ft_cubic_split( FT_Vector* base ) + { + FT_Pos a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c ) / 2; + base[5].x = b = ( base[3].x + d ) / 2; + c = ( c + d ) / 2; + base[2].x = a = ( a + c ) / 2; + base[4].x = b = ( b + c ) / 2; + base[3].x = ( a + b ) / 2; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c ) / 2; + base[5].y = b = ( base[3].y + d ) / 2; + c = ( c + d ) / 2; + base[2].y = a = ( a + c ) / 2; + base[4].y = b = ( b + c ) / 2; + base[3].y = ( a + b ) / 2; + } + + + static FT_Bool + ft_cubic_is_small_enough( FT_Vector* base, + FT_Angle *angle_in, + FT_Angle *angle_mid, + FT_Angle *angle_out ) + { + FT_Vector d1, d2, d3; + FT_Angle theta1, theta2; + FT_Int close1, close2, close3; + + + d1.x = base[2].x - base[3].x; + d1.y = base[2].y - base[3].y; + d2.x = base[1].x - base[2].x; + d2.y = base[1].y - base[2].y; + d3.x = base[0].x - base[1].x; + d3.y = base[0].y - base[1].y; + + close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); + close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); + close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y ); + + if ( close1 || close3 ) + { + if ( close2 ) + { + /* basically a point */ + *angle_in = *angle_out = *angle_mid = 0; + } + else if ( close1 ) + { + *angle_in = *angle_mid = FT_Atan2( d2.x, d2.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + else /* close2 */ + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_mid = *angle_out = FT_Atan2( d2.x, d2.y ); + } + } + else if ( close2 ) + { + *angle_in = *angle_mid = FT_Atan2( d1.x, d1.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + else + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_mid = FT_Atan2( d2.x, d2.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + + theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_mid ) ); + theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) ); + + return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD && + theta2 < FT_SMALL_CUBIC_THRESHOLD ); + } + + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** STROKE BORDERS *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + + typedef enum FT_StrokeTags_ + { + FT_STROKE_TAG_ON = 1, /* on-curve point */ + FT_STROKE_TAG_CUBIC = 2, /* cubic off-point */ + FT_STROKE_TAG_BEGIN = 4, /* sub-path start */ + FT_STROKE_TAG_END = 8 /* sub-path end */ + + } FT_StrokeTags; + +#define FT_STROKE_TAG_BEGIN_END (FT_STROKE_TAG_BEGIN|FT_STROKE_TAG_END) + + typedef struct FT_StrokeBorderRec_ + { + FT_UInt num_points; + FT_UInt max_points; + FT_Vector* points; + FT_Byte* tags; + FT_Bool movable; + FT_Int start; /* index of current sub-path start point */ + FT_Memory memory; + FT_Bool valid; + + } FT_StrokeBorderRec, *FT_StrokeBorder; + + + static FT_Error + ft_stroke_border_grow( FT_StrokeBorder border, + FT_UInt new_points ) + { + FT_UInt old_max = border->max_points; + FT_UInt new_max = border->num_points + new_points; + FT_Error error = FT_Err_Ok; + + + if ( new_max > old_max ) + { + FT_UInt cur_max = old_max; + FT_Memory memory = border->memory; + + + while ( cur_max < new_max ) + cur_max += ( cur_max >> 1 ) + 16; + + if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) || + FT_RENEW_ARRAY( border->tags, old_max, cur_max ) ) + goto Exit; + + border->max_points = cur_max; + } + + Exit: + return error; + } + + + static void + ft_stroke_border_close( FT_StrokeBorder border, + FT_Bool reverse ) + { + FT_UInt start = border->start; + FT_UInt count = border->num_points; + + + FT_ASSERT( border->start >= 0 ); + + /* don't record empty paths! */ + if ( count <= start + 1U ) + border->num_points = start; + else + { + /* copy the last point to the start of this sub-path, since */ + /* it contains the `adjusted' starting coordinates */ + border->num_points = --count; + border->points[start] = border->points[count]; + + if ( reverse ) + { + /* reverse the points */ + { + FT_Vector* vec1 = border->points + start + 1; + FT_Vector* vec2 = border->points + count - 1; + + + for ( ; vec1 < vec2; vec1++, vec2-- ) + { + FT_Vector tmp; + + + tmp = *vec1; + *vec1 = *vec2; + *vec2 = tmp; + } + } + + /* then the tags */ + { + FT_Byte* tag1 = border->tags + start + 1; + FT_Byte* tag2 = border->tags + count - 1; + + + for ( ; tag1 < tag2; tag1++, tag2-- ) + { + FT_Byte tmp; + + + tmp = *tag1; + *tag1 = *tag2; + *tag2 = tmp; + } + } + } + + border->tags[start ] |= FT_STROKE_TAG_BEGIN; + border->tags[count - 1] |= FT_STROKE_TAG_END; + } + + border->start = -1; + border->movable = FALSE; + } + + + static FT_Error + ft_stroke_border_lineto( FT_StrokeBorder border, + FT_Vector* to, + FT_Bool movable ) + { + FT_Error error = FT_Err_Ok; + + + FT_ASSERT( border->start >= 0 ); + + if ( border->movable ) + { + /* move last point */ + border->points[border->num_points - 1] = *to; + } + else + { + /* add one point */ + error = ft_stroke_border_grow( border, 1 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *to; + tag[0] = FT_STROKE_TAG_ON; + + border->num_points += 1; + } + } + border->movable = movable; + return error; + } + + + static FT_Error + ft_stroke_border_conicto( FT_StrokeBorder border, + FT_Vector* control, + FT_Vector* to ) + { + FT_Error error; + + + FT_ASSERT( border->start >= 0 ); + + error = ft_stroke_border_grow( border, 2 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + vec[0] = *control; + vec[1] = *to; + + tag[0] = 0; + tag[1] = FT_STROKE_TAG_ON; + + border->num_points += 2; + } + border->movable = FALSE; + return error; + } + + + static FT_Error + ft_stroke_border_cubicto( FT_StrokeBorder border, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_Error error; + + + FT_ASSERT( border->start >= 0 ); + + error = ft_stroke_border_grow( border, 3 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *control1; + vec[1] = *control2; + vec[2] = *to; + + tag[0] = FT_STROKE_TAG_CUBIC; + tag[1] = FT_STROKE_TAG_CUBIC; + tag[2] = FT_STROKE_TAG_ON; + + border->num_points += 3; + } + border->movable = FALSE; + return error; + } + + +#define FT_ARC_CUBIC_ANGLE ( FT_ANGLE_PI / 2 ) + + + static FT_Error + ft_stroke_border_arcto( FT_StrokeBorder border, + FT_Vector* center, + FT_Fixed radius, + FT_Angle angle_start, + FT_Angle angle_diff ) + { + FT_Angle total, angle, step, rotate, next, theta; + FT_Vector a, b, a2, b2; + FT_Fixed length; + FT_Error error = FT_Err_Ok; + + + /* compute start point */ + FT_Vector_From_Polar( &a, radius, angle_start ); + a.x += center->x; + a.y += center->y; + + total = angle_diff; + angle = angle_start; + rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2; + + while ( total != 0 ) + { + step = total; + if ( step > FT_ARC_CUBIC_ANGLE ) + step = FT_ARC_CUBIC_ANGLE; + + else if ( step < -FT_ARC_CUBIC_ANGLE ) + step = -FT_ARC_CUBIC_ANGLE; + + next = angle + step; + theta = step; + if ( theta < 0 ) + theta = -theta; + + theta >>= 1; + + /* compute end point */ + FT_Vector_From_Polar( &b, radius, next ); + b.x += center->x; + b.y += center->y; + + /* compute first and second control points */ + length = FT_MulDiv( radius, FT_Sin( theta ) * 4, + ( 0x10000L + FT_Cos( theta ) ) * 3 ); + + FT_Vector_From_Polar( &a2, length, angle + rotate ); + a2.x += a.x; + a2.y += a.y; + + FT_Vector_From_Polar( &b2, length, next - rotate ); + b2.x += b.x; + b2.y += b.y; + + /* add cubic arc */ + error = ft_stroke_border_cubicto( border, &a2, &b2, &b ); + if ( error ) + break; + + /* process the rest of the arc ?? */ + a = b; + total -= step; + angle = next; + } + + return error; + } + + + static FT_Error + ft_stroke_border_moveto( FT_StrokeBorder border, + FT_Vector* to ) + { + /* close current open path if any ? */ + if ( border->start >= 0 ) + ft_stroke_border_close( border, FALSE ); + + border->start = border->num_points; + border->movable = FALSE; + + return ft_stroke_border_lineto( border, to, FALSE ); + } + + + static void + ft_stroke_border_init( FT_StrokeBorder border, + FT_Memory memory ) + { + border->memory = memory; + border->points = NULL; + border->tags = NULL; + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static void + ft_stroke_border_reset( FT_StrokeBorder border ) + { + border->num_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static void + ft_stroke_border_done( FT_StrokeBorder border ) + { + FT_Memory memory = border->memory; + + + FT_FREE( border->points ); + FT_FREE( border->tags ); + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static FT_Error + ft_stroke_border_get_counts( FT_StrokeBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_Error error = FT_Err_Ok; + FT_UInt num_points = 0; + FT_UInt num_contours = 0; + + FT_UInt count = border->num_points; + FT_Vector* point = border->points; + FT_Byte* tags = border->tags; + FT_Int in_contour = 0; + + + for ( ; count > 0; count--, num_points++, point++, tags++ ) + { + if ( tags[0] & FT_STROKE_TAG_BEGIN ) + { + if ( in_contour != 0 ) + goto Fail; + + in_contour = 1; + } + else if ( in_contour == 0 ) + goto Fail; + + if ( tags[0] & FT_STROKE_TAG_END ) + { + in_contour = 0; + num_contours++; + } + } + + if ( in_contour != 0 ) + goto Fail; + + border->valid = TRUE; + + Exit: + *anum_points = num_points; + *anum_contours = num_contours; + return error; + + Fail: + num_points = 0; + num_contours = 0; + goto Exit; + } + + + static void + ft_stroke_border_export( FT_StrokeBorder border, + FT_Outline* outline ) + { + /* copy point locations */ + FT_ARRAY_COPY( outline->points + outline->n_points, + border->points, + border->num_points ); + + /* copy tags */ + { + FT_UInt count = border->num_points; + FT_Byte* read = border->tags; + FT_Byte* write = (FT_Byte*)outline->tags + outline->n_points; + + + for ( ; count > 0; count--, read++, write++ ) + { + if ( *read & FT_STROKE_TAG_ON ) + *write = FT_CURVE_TAG_ON; + else if ( *read & FT_STROKE_TAG_CUBIC ) + *write = FT_CURVE_TAG_CUBIC; + else + *write = FT_CURVE_TAG_CONIC; + } + } + + /* copy contours */ + { + FT_UInt count = border->num_points; + FT_Byte* tags = border->tags; + FT_Short* write = outline->contours + outline->n_contours; + FT_Short idx = (FT_Short)outline->n_points; + + + for ( ; count > 0; count--, tags++, idx++ ) + { + if ( *tags & FT_STROKE_TAG_END ) + { + *write++ = idx; + outline->n_contours++; + } + } + } + + outline->n_points = (short)( outline->n_points + border->num_points ); + + FT_ASSERT( FT_Outline_Check( outline ) == 0 ); + } + + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** STROKER *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + +#define FT_SIDE_TO_ROTATE( s ) ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI ) + + typedef struct FT_StrokerRec_ + { + FT_Angle angle_in; + FT_Angle angle_out; + FT_Vector center; + FT_Bool first_point; + FT_Bool subpath_open; + FT_Angle subpath_angle; + FT_Vector subpath_start; + + FT_Stroker_LineCap line_cap; + FT_Stroker_LineJoin line_join; + FT_Fixed miter_limit; + FT_Fixed radius; + + FT_Bool valid; + FT_StrokeBorderRec borders[2]; + FT_Library library; + + } FT_StrokerRec; + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ) + { + FT_Error error; + FT_Memory memory; + FT_Stroker stroker; + + + if ( !library ) + return FT_Err_Invalid_Argument; + + memory = library->memory; + + if ( !FT_NEW( stroker ) ) + { + stroker->library = library; + + ft_stroke_border_init( &stroker->borders[0], memory ); + ft_stroke_border_init( &stroker->borders[1], memory ); + } + *astroker = stroker; + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ) + { + stroker->radius = radius; + stroker->line_cap = line_cap; + stroker->line_join = line_join; + stroker->miter_limit = miter_limit; + + FT_Stroker_Rewind( stroker ); + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Rewind( FT_Stroker stroker ) + { + if ( stroker ) + { + ft_stroke_border_reset( &stroker->borders[0] ); + ft_stroke_border_reset( &stroker->borders[1] ); + } + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Done( FT_Stroker stroker ) + { + if ( stroker ) + { + FT_Memory memory = stroker->library->memory; + + + ft_stroke_border_done( &stroker->borders[0] ); + ft_stroke_border_done( &stroker->borders[1] ); + + stroker->library = NULL; + FT_FREE( stroker ); + } + } + + + /* creates a circular arc at a corner or cap */ + static FT_Error + ft_stroker_arcto( FT_Stroker stroker, + FT_Int side ) + { + FT_Angle total, rotate; + FT_Fixed radius = stroker->radius; + FT_Error error = FT_Err_Ok; + FT_StrokeBorder border = stroker->borders + side; + + + rotate = FT_SIDE_TO_ROTATE( side ); + + total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + if ( total == FT_ANGLE_PI ) + total = -rotate * 2; + + error = ft_stroke_border_arcto( border, + &stroker->center, + radius, + stroker->angle_in + rotate, + total ); + border->movable = FALSE; + return error; + } + + + /* adds a cap at the end of an opened path */ + static FT_Error + ft_stroker_cap( FT_Stroker stroker, + FT_Angle angle, + FT_Int side ) + { + FT_Error error = FT_Err_Ok; + + + if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND ) + { + /* add a round cap */ + stroker->angle_in = angle; + stroker->angle_out = angle + FT_ANGLE_PI; + error = ft_stroker_arcto( stroker, side ); + } + else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE ) + { + /* add a square cap */ + FT_Vector delta, delta2; + FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); + FT_Fixed radius = stroker->radius; + FT_StrokeBorder border = stroker->borders + side; + + + FT_Vector_From_Polar( &delta2, radius, angle + rotate ); + FT_Vector_From_Polar( &delta, radius, angle ); + + delta.x += stroker->center.x + delta2.x; + delta.y += stroker->center.y + delta2.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + FT_Vector_From_Polar( &delta2, radius, angle - rotate ); + FT_Vector_From_Polar( &delta, radius, angle ); + + delta.x += delta2.x + stroker->center.x; + delta.y += delta2.y + stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT ) + { + /* add a butt ending */ + FT_Vector delta; + FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); + FT_Fixed radius = stroker->radius; + FT_StrokeBorder border = stroker->borders + side; + + + FT_Vector_From_Polar( &delta, radius, angle + rotate ); + + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + FT_Vector_From_Polar( &delta, radius, angle - rotate ); + + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + + Exit: + return error; + } + + + /* process an inside corner, i.e. compute intersection */ + static FT_Error + ft_stroker_inside( FT_Stroker stroker, + FT_Int side) + { + FT_StrokeBorder border = stroker->borders + side; + FT_Angle phi, theta, rotate; + FT_Fixed length, thcos, sigma; + FT_Vector delta; + FT_Error error = FT_Err_Ok; + + + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute median angle */ + theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + if ( theta == FT_ANGLE_PI ) + theta = rotate; + else + theta = theta / 2; + + phi = stroker->angle_in + theta; + + thcos = FT_Cos( theta ); + sigma = FT_MulFix( stroker->miter_limit, thcos ); + + /* TODO: find better criterion to switch off the optimization */ + if ( sigma < 0x10000L ) + { + FT_Vector_From_Polar( &delta, stroker->radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + border->movable = FALSE; + } + else + { + length = FT_DivFix( stroker->radius, thcos ); + + FT_Vector_From_Polar( &delta, length, phi + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + } + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + + return error; + } + + + /* process an outside corner, i.e. compute bevel/miter/round */ + static FT_Error + ft_stroker_outside( FT_Stroker stroker, + FT_Int side ) + { + FT_StrokeBorder border = stroker->borders + side; + FT_Error error; + FT_Angle rotate; + + + if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND ) + error = ft_stroker_arcto( stroker, side ); + else + { + /* this is a mitered or beveled corner */ + FT_Fixed sigma, radius = stroker->radius; + FT_Angle theta, phi; + FT_Fixed thcos; + FT_Bool miter; + + + rotate = FT_SIDE_TO_ROTATE( side ); + miter = FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_MITER ); + + theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + if ( theta == FT_ANGLE_PI ) + { + theta = rotate; + phi = stroker->angle_in; + } + else + { + theta = theta / 2; + phi = stroker->angle_in + theta + rotate; + } + + thcos = FT_Cos( theta ); + sigma = FT_MulFix( stroker->miter_limit, thcos ); + + /* FT_Sin(x) = 0 for x <= 57 */ + if ( sigma >= 0x10000L || ft_pos_abs( theta ) <= 57 ) + miter = FALSE; + + if ( miter ) /* this is a miter (broken angle) */ + { + FT_Vector middle, delta; + FT_Fixed length; + + + /* compute middle point */ + FT_Vector_From_Polar( &middle, + FT_MulFix( radius, stroker->miter_limit ), + phi ); + middle.x += stroker->center.x; + middle.y += stroker->center.y; + + /* compute first angle point */ + length = FT_MulFix( radius, + FT_DivFix( 0x10000L - sigma, + ft_pos_abs( FT_Sin( theta ) ) ) ); + + FT_Vector_From_Polar( &delta, length, phi + rotate ); + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* compute second angle point */ + FT_Vector_From_Polar( &delta, length, phi - rotate ); + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* finally, add a movable end point */ + FT_Vector_From_Polar( &delta, radius, stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, TRUE ); + } + + else /* this is a bevel (intersection) */ + { + FT_Fixed length; + FT_Vector delta; + + + length = FT_DivFix( stroker->radius, thcos ); + + FT_Vector_From_Polar( &delta, length, phi ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* now add end point */ + FT_Vector_From_Polar( &delta, stroker->radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, TRUE ); + } + } + + Exit: + return error; + } + + + static FT_Error + ft_stroker_process_corner( FT_Stroker stroker ) + { + FT_Error error = FT_Err_Ok; + FT_Angle turn; + FT_Int inside_side; + + + turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + + /* no specific corner processing is required if the turn is 0 */ + if ( turn == 0 ) + goto Exit; + + /* when we turn to the right, the inside side is 0 */ + inside_side = 0; + + /* otherwise, the inside side is 1 */ + if ( turn < 0 ) + inside_side = 1; + + /* process the inside side */ + error = ft_stroker_inside( stroker, inside_side ); + if ( error ) + goto Exit; + + /* process the outside side */ + error = ft_stroker_outside( stroker, 1 - inside_side ); + + Exit: + return error; + } + + + /* add two points to the left and right borders corresponding to the */ + /* start of the subpath */ + static FT_Error + ft_stroker_subpath_start( FT_Stroker stroker, + FT_Angle start_angle ) + { + FT_Vector delta; + FT_Vector point; + FT_Error error; + FT_StrokeBorder border; + + + FT_Vector_From_Polar( &delta, stroker->radius, + start_angle + FT_ANGLE_PI2 ); + + point.x = stroker->center.x + delta.x; + point.y = stroker->center.y + delta.y; + + border = stroker->borders; + error = ft_stroke_border_moveto( border, &point ); + if ( error ) + goto Exit; + + point.x = stroker->center.x - delta.x; + point.y = stroker->center.y - delta.y; + + border++; + error = ft_stroke_border_moveto( border, &point ); + + /* save angle for last cap */ + stroker->subpath_angle = start_angle; + stroker->first_point = FALSE; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_StrokeBorder border; + FT_Vector delta; + FT_Angle angle; + FT_Int side; + + delta.x = to->x - stroker->center.x; + delta.y = to->y - stroker->center.y; + + angle = FT_Atan2( delta.x, delta.y ); + FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 ); + + /* process corner if necessary */ + if ( stroker->first_point ) + { + /* This is the first segment of a subpath. We need to */ + /* add a point to each border at their respective starting */ + /* point locations. */ + error = ft_stroker_subpath_start( stroker, angle ); + if ( error ) + goto Exit; + } + else + { + /* process the current corner */ + stroker->angle_out = angle; + error = ft_stroker_process_corner( stroker ); + if ( error ) + goto Exit; + } + + /* now add a line segment to both the `inside' and `outside' paths */ + + for ( border = stroker->borders, side = 1; side >= 0; side--, border++ ) + { + FT_Vector point; + + + point.x = to->x + delta.x; + point.y = to->y + delta.y; + + error = ft_stroke_border_lineto( border, &point, TRUE ); + if ( error ) + goto Exit; + + delta.x = -delta.x; + delta.y = -delta.y; + } + + stroker->angle_in = angle; + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_Vector bez_stack[34]; + FT_Vector* arc; + FT_Vector* limit = bez_stack + 30; + FT_Angle start_angle; + FT_Bool first_arc = TRUE; + + + arc = bez_stack; + arc[0] = *to; + arc[1] = *control; + arc[2] = stroker->center; + + while ( arc >= bez_stack ) + { + FT_Angle angle_in, angle_out; + + + angle_in = angle_out = 0; /* remove compiler warnings */ + + if ( arc < limit && + !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) ) + { + ft_conic_split( arc ); + arc += 2; + continue; + } + + if ( first_arc ) + { + first_arc = FALSE; + + start_angle = angle_in; + + /* process corner if necessary */ + if ( stroker->first_point ) + error = ft_stroker_subpath_start( stroker, start_angle ); + else + { + stroker->angle_out = start_angle; + error = ft_stroker_process_corner( stroker ); + } + } + + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + FT_Vector ctrl, end; + FT_Angle theta, phi, rotate; + FT_Fixed length; + FT_Int side; + + + theta = FT_Angle_Diff( angle_in, angle_out ) / 2; + phi = angle_in + theta; + length = FT_DivFix( stroker->radius, FT_Cos( theta ) ); + + for ( side = 0; side <= 1; side++ ) + { + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute control point */ + FT_Vector_From_Polar( &ctrl, length, phi + rotate ); + ctrl.x += arc[1].x; + ctrl.y += arc[1].y; + + /* compute end point */ + FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); + end.x += arc[0].x; + end.y += arc[0].y; + + error = ft_stroke_border_conicto( stroker->borders + side, + &ctrl, &end ); + if ( error ) + goto Exit; + } + } + + arc -= 2; + + if ( arc < bez_stack ) + stroker->angle_in = angle_out; + } + + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_Vector bez_stack[37]; + FT_Vector* arc; + FT_Vector* limit = bez_stack + 32; + FT_Angle start_angle; + FT_Bool first_arc = TRUE; + + + arc = bez_stack; + arc[0] = *to; + arc[1] = *control2; + arc[2] = *control1; + arc[3] = stroker->center; + + while ( arc >= bez_stack ) + { + FT_Angle angle_in, angle_mid, angle_out; + + + /* remove compiler warnings */ + angle_in = angle_out = angle_mid = 0; + + if ( arc < limit && + !ft_cubic_is_small_enough( arc, &angle_in, + &angle_mid, &angle_out ) ) + { + ft_cubic_split( arc ); + arc += 3; + continue; + } + + if ( first_arc ) + { + first_arc = FALSE; + + /* process corner if necessary */ + start_angle = angle_in; + + if ( stroker->first_point ) + error = ft_stroker_subpath_start( stroker, start_angle ); + else + { + stroker->angle_out = start_angle; + error = ft_stroker_process_corner( stroker ); + } + if ( error ) + goto Exit; + } + + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + FT_Vector ctrl1, ctrl2, end; + FT_Angle theta1, phi1, theta2, phi2, rotate; + FT_Fixed length1, length2; + FT_Int side; + + + theta1 = ft_pos_abs( angle_mid - angle_in ) / 2; + theta2 = ft_pos_abs( angle_out - angle_mid ) / 2; + phi1 = (angle_mid + angle_in ) / 2; + phi2 = (angle_mid + angle_out ) / 2; + length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) ); + length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) ); + + for ( side = 0; side <= 1; side++ ) + { + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute control points */ + FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate ); + ctrl1.x += arc[2].x; + ctrl1.y += arc[2].y; + + FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate ); + ctrl2.x += arc[1].x; + ctrl2.y += arc[1].y; + + /* compute end point */ + FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); + end.x += arc[0].x; + end.y += arc[0].y; + + error = ft_stroke_border_cubicto( stroker->borders + side, + &ctrl1, &ctrl2, &end ); + if ( error ) + goto Exit; + } + } + + arc -= 3; + if ( arc < bez_stack ) + stroker->angle_in = angle_out; + } + + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ) + { + /* We cannot process the first point, because there is not enough */ + /* information regarding its corner/cap. The latter will be processed */ + /* in the `FT_Stroker_EndSubPath' routine. */ + /* */ + stroker->first_point = TRUE; + stroker->center = *to; + stroker->subpath_open = open; + + /* record the subpath start point for each border */ + stroker->subpath_start = *to; + + return FT_Err_Ok; + } + + + static FT_Error + ft_stroker_add_reverse_left( FT_Stroker stroker, + FT_Bool open ) + { + FT_StrokeBorder right = stroker->borders + 0; + FT_StrokeBorder left = stroker->borders + 1; + FT_Int new_points; + FT_Error error = FT_Err_Ok; + + + FT_ASSERT( left->start >= 0 ); + + new_points = left->num_points - left->start; + if ( new_points > 0 ) + { + error = ft_stroke_border_grow( right, (FT_UInt)new_points ); + if ( error ) + goto Exit; + + { + FT_Vector* dst_point = right->points + right->num_points; + FT_Byte* dst_tag = right->tags + right->num_points; + FT_Vector* src_point = left->points + left->num_points - 1; + FT_Byte* src_tag = left->tags + left->num_points - 1; + + while ( src_point >= left->points + left->start ) + { + *dst_point = *src_point; + *dst_tag = *src_tag; + + if ( open ) + dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END; + else + { + FT_Byte ttag = (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END ); + + + /* switch begin/end tags if necessary */ + if ( ttag == FT_STROKE_TAG_BEGIN || + ttag == FT_STROKE_TAG_END ) + dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END; + + } + + src_point--; + src_tag--; + dst_point++; + dst_tag++; + } + } + + left->num_points = left->start; + right->num_points += new_points; + + right->movable = FALSE; + left->movable = FALSE; + } + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + /* there's a lot of magic in this function! */ + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ) + { + FT_Error error = FT_Err_Ok; + + + if ( stroker->subpath_open ) + { + FT_StrokeBorder right = stroker->borders; + + /* All right, this is an opened path, we need to add a cap between */ + /* right & left, add the reverse of left, then add a final cap */ + /* between left & right. */ + error = ft_stroker_cap( stroker, stroker->angle_in, 0 ); + if ( error ) + goto Exit; + + /* add reversed points from `left' to `right' */ + error = ft_stroker_add_reverse_left( stroker, TRUE ); + if ( error ) + goto Exit; + + /* now add the final cap */ + stroker->center = stroker->subpath_start; + error = ft_stroker_cap( stroker, + stroker->subpath_angle + FT_ANGLE_PI, 0 ); + if ( error ) + goto Exit; + + /* Now end the right subpath accordingly. The left one is */ + /* rewind and doesn't need further processing. */ + ft_stroke_border_close( right, FALSE ); + } + else + { + FT_Angle turn; + FT_Int inside_side; + + /* close the path if needed */ + if ( stroker->center.x != stroker->subpath_start.x || + stroker->center.y != stroker->subpath_start.y ) + { + error = FT_Stroker_LineTo( stroker, &stroker->subpath_start ); + if ( error ) + goto Exit; + } + + /* process the corner */ + stroker->angle_out = stroker->subpath_angle; + turn = FT_Angle_Diff( stroker->angle_in, + stroker->angle_out ); + + /* no specific corner processing is required if the turn is 0 */ + if ( turn != 0 ) + { + /* when we turn to the right, the inside side is 0 */ + inside_side = 0; + + /* otherwise, the inside side is 1 */ + if ( turn < 0 ) + inside_side = 1; + + error = ft_stroker_inside( stroker, inside_side ); + if ( error ) + goto Exit; + + /* process the outside side */ + error = ft_stroker_outside( stroker, 1 - inside_side ); + if ( error ) + goto Exit; + } + + /* then end our two subpaths */ + ft_stroke_border_close( stroker->borders + 0, TRUE ); + ft_stroke_border_close( stroker->borders + 1, FALSE ); + } + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_UInt num_points = 0, num_contours = 0; + FT_Error error; + + + if ( !stroker || border > 1 ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + error = ft_stroke_border_get_counts( stroker->borders + border, + &num_points, &num_contours ); + Exit: + if ( anum_points ) + *anum_points = num_points; + + if ( anum_contours ) + *anum_contours = num_contours; + + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_UInt count1, count2, num_points = 0; + FT_UInt count3, count4, num_contours = 0; + FT_Error error; + + + error = ft_stroke_border_get_counts( stroker->borders + 0, + &count1, &count2 ); + if ( error ) + goto Exit; + + error = ft_stroke_border_get_counts( stroker->borders + 1, + &count3, &count4 ); + if ( error ) + goto Exit; + + num_points = count1 + count3; + num_contours = count2 + count4; + + Exit: + *anum_points = num_points; + *anum_contours = num_contours; + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ) + { + if ( border == FT_STROKER_BORDER_LEFT || + border == FT_STROKER_BORDER_RIGHT ) + { + FT_StrokeBorder sborder = & stroker->borders[border]; + + + if ( sborder->valid ) + ft_stroke_border_export( sborder, outline ); + } + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ) + { + FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline ); + FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline ); + } + + + /* documentation is in ftstroke.h */ + + /* + * The following is very similar to FT_Outline_Decompose, except + * that we do support opened paths, and do not scale the outline. + */ + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ) + { + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + FT_Error error; + + FT_Int n; /* index of contour in outline */ + FT_UInt first; /* index of first point in contour */ + FT_Int tag; /* current point's state */ + + + if ( !outline || !stroker ) + return FT_Err_Invalid_Argument; + + FT_Stroker_Rewind( stroker ); + + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + FT_UInt last; /* index of last point in contour */ + + + last = outline->contours[n]; + limit = outline->points + last; + + /* skip empty points; we don't stroke these */ + if ( last <= first ) + { + first = last + 1; + continue; + } + + v_start = outline->points[first]; + v_last = outline->points[last]; + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* First point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + } + point--; + tags--; + } + + error = FT_Stroker_BeginSubPath( stroker, &v_start, opened ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = point->x; + vec.y = point->y; + + error = FT_Stroker_LineTo( stroker, &vec ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = point->x; + v_control.y = point->y; + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec = point[0]; + + if ( tag == FT_CURVE_TAG_ON ) + { + error = FT_Stroker_ConicTo( stroker, &v_control, &vec ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + error = FT_Stroker_ConicTo( stroker, &v_control, &v_start ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1 = point[-2]; + vec2 = point[-1]; + + if ( point <= limit ) + { + FT_Vector vec; + + + vec = point[0]; + + error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec ); + if ( error ) + goto Exit; + continue; + } + + error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start ); + goto Close; + } + } + } + + Close: + if ( error ) + goto Exit; + + error = FT_Stroker_EndSubPath( stroker ); + if ( error ) + goto Exit; + + first = last + 1; + } + + return FT_Err_Ok; + + Exit: + return error; + + Invalid_Outline: + return FT_Err_Invalid_Outline; + } + +/* declare an extern to access ft_outline_glyph_class global allocated + in ftglyph.c, and use the FT_OUTLINE_GLYPH_CLASS_GET macro to access + it when FT_CONFIG_OPTION_PIC is defined */ +#ifndef FT_CONFIG_OPTION_PIC + extern const FT_Glyph_Class ft_outline_glyph_class; +#endif +#include "basepic.h" + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ) + { + FT_Error error = FT_Err_Invalid_Argument; + FT_Glyph glyph = NULL; + FT_Library library = stroker->library; + FT_UNUSED(library); + + if ( pglyph == NULL ) + goto Exit; + + glyph = *pglyph; + if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) + goto Exit; + + { + FT_Glyph copy; + + + error = FT_Glyph_Copy( glyph, © ); + if ( error ) + goto Exit; + + glyph = copy; + } + + { + FT_OutlineGlyph oglyph = (FT_OutlineGlyph) glyph; + FT_Outline* outline = &oglyph->outline; + FT_UInt num_points, num_contours; + + + error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); + if ( error ) + goto Fail; + + (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, num_contours, outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_Export( stroker, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ) + { + FT_Error error = FT_Err_Invalid_Argument; + FT_Glyph glyph = NULL; + FT_Library library = stroker->library; + FT_UNUSED(library); + + if ( pglyph == NULL ) + goto Exit; + + glyph = *pglyph; + if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) + goto Exit; + + { + FT_Glyph copy; + + + error = FT_Glyph_Copy( glyph, © ); + if ( error ) + goto Exit; + + glyph = copy; + } + + { + FT_OutlineGlyph oglyph = (FT_OutlineGlyph) glyph; + FT_StrokerBorder border; + FT_Outline* outline = &oglyph->outline; + FT_UInt num_points, num_contours; + + + border = FT_Outline_GetOutsideBorder( outline ); + if ( inside ) + { + if ( border == FT_STROKER_BORDER_LEFT ) + border = FT_STROKER_BORDER_RIGHT; + else + border = FT_STROKER_BORDER_LEFT; + } + + error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); + if ( error ) + goto Fail; + + (void)FT_Stroker_GetBorderCounts( stroker, border, + &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, + num_contours, + outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_ExportBorder( stroker, border, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftsynth.c b/android/jni/ndk_modules/freetype/src/base/ftsynth.c new file mode 100644 index 00000000..ba3c633e --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftsynth.c @@ -0,0 +1,160 @@ +/***************************************************************************/ +/* */ +/* ftsynth.c */ +/* */ +/* FreeType synthesizing code for emboldening and slanting (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_SYNTHESIS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include FT_BITMAP_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_synth + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** EXPERIMENTAL OBLIQUING SUPPORT ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /* documentation is in ftsynth.h */ + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ) + { + FT_Matrix transform; + FT_Outline* outline = &slot->outline; + + + /* only oblique outline glyphs */ + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) + return; + + /* we don't touch the advance width */ + + /* For italic, simply apply a shear transform, with an angle */ + /* of about 12 degrees. */ + + transform.xx = 0x10000L; + transform.yx = 0x00000L; + + transform.xy = 0x06000L; + transform.yy = 0x10000L; + + FT_Outline_Transform( outline, &transform ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** EXPERIMENTAL EMBOLDENING/OUTLINING SUPPORT ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftsynth.h */ + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ) + { + FT_Library library = slot->library; + FT_Face face = slot->face; + FT_Error error; + FT_Pos xstr, ystr; + + + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE && + slot->format != FT_GLYPH_FORMAT_BITMAP ) + return; + + /* some reasonable strength */ + xstr = FT_MulFix( face->units_per_EM, + face->size->metrics.y_scale ) / 24; + ystr = xstr; + + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* ignore error */ + (void)FT_Outline_Embolden( &slot->outline, xstr ); + + /* this is more than enough for most glyphs; if you need accurate */ + /* values, you have to call FT_Outline_Get_CBox */ + xstr = xstr * 2; + ystr = xstr; + } + else if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + { + /* round to full pixels */ + xstr &= ~63; + if ( xstr == 0 ) + xstr = 1 << 6; + ystr &= ~63; + + /* + * XXX: overflow check for 16-bit system, for compatibility + * with FT_GlyphSlot_Embolden() since freetype-2.1.10. + * unfortunately, this function return no informations + * about the cause of error. + */ + if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN ) + { + FT_TRACE1(( "FT_GlyphSlot_Embolden:" )); + FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr )); + return; + } + error = FT_GlyphSlot_Own_Bitmap( slot ); + if ( error ) + return; + + error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr ); + if ( error ) + return; + } + + if ( slot->advance.x ) + slot->advance.x += xstr; + + if ( slot->advance.y ) + slot->advance.y += ystr; + + slot->metrics.width += xstr; + slot->metrics.height += ystr; + slot->metrics.horiBearingY += ystr; + slot->metrics.horiAdvance += xstr; + slot->metrics.vertBearingX -= xstr / 2; + slot->metrics.vertBearingY += ystr; + slot->metrics.vertAdvance += ystr; + + /* XXX: 16-bit overflow case must be excluded before here */ + if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + slot->bitmap_top += (FT_Int)( ystr >> 6 ); + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftsystem.c b/android/jni/ndk_modules/freetype/src/base/ftsystem.c new file mode 100644 index 00000000..ba86005c --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftsystem.c @@ -0,0 +1,307 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* ANSI-specific FreeType low-level system interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2006, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file contains the default interface used by FreeType to access */ + /* low-level, i.e. memory management, i/o access as well as thread */ + /* synchronisation. It can be replaced by user-specific routines if */ + /* necessary. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H + + + /*************************************************************************/ + /* */ + /* MEMORY MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* It is not necessary to do any error checking for the */ + /* allocation-related functions. This will be done by the higher level */ + /* routines like ft_mem_alloc() or ft_mem_realloc(). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_alloc */ + /* */ + /* <Description> */ + /* The memory allocation function. */ + /* */ + /* <Input> */ + /* memory :: A pointer to the memory object. */ + /* */ + /* size :: The requested size in bytes. */ + /* */ + /* <Return> */ + /* The address of newly allocated block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_alloc( FT_Memory memory, + long size ) + { + FT_UNUSED( memory ); + + return ft_smalloc( size ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_realloc */ + /* */ + /* <Description> */ + /* The memory reallocation function. */ + /* */ + /* <Input> */ + /* memory :: A pointer to the memory object. */ + /* */ + /* cur_size :: The current size of the allocated memory block. */ + /* */ + /* new_size :: The newly requested size in bytes. */ + /* */ + /* block :: The current address of the block in memory. */ + /* */ + /* <Return> */ + /* The address of the reallocated memory block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + FT_UNUSED( memory ); + FT_UNUSED( cur_size ); + + return ft_srealloc( block, new_size ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_free */ + /* */ + /* <Description> */ + /* The memory release function. */ + /* */ + /* <Input> */ + /* memory :: A pointer to the memory object. */ + /* */ + /* block :: The address of block in memory to be freed. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_free( FT_Memory memory, + void* block ) + { + FT_UNUSED( memory ); + + ft_sfree( block ); + } + + + /*************************************************************************/ + /* */ + /* RESOURCE MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_io + + /* We use the macro STREAM_FILE for convenience to extract the */ + /* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_ansi_stream_close */ + /* */ + /* <Description> */ + /* The function to close a stream. */ + /* */ + /* <Input> */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_ansi_stream_close( FT_Stream stream ) + { + ft_fclose( STREAM_FILE( stream ) ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_ansi_stream_io */ + /* */ + /* <Description> */ + /* The function to open a stream. */ + /* */ + /* <Input> */ + /* stream :: A pointer to the stream object. */ + /* */ + /* offset :: The position in the data stream to start reading. */ + /* */ + /* buffer :: The address of buffer to store the read data. */ + /* */ + /* count :: The number of bytes to read from the stream. */ + /* */ + /* <Return> */ + /* The number of bytes actually read. If `count' is zero (this is, */ + /* the function is used for seeking), a non-zero return value */ + /* indicates an error. */ + /* */ + FT_CALLBACK_DEF( unsigned long ) + ft_ansi_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_FILE* file; + + + if ( !count && offset > stream->size ) + return 1; + + file = STREAM_FILE( stream ); + + if ( stream->pos != offset ) + ft_fseek( file, offset, SEEK_SET ); + + return (unsigned long)ft_fread( buffer, 1, count, file ); + } + + + /* documentation is in ftstream.h */ + + FT_BASE_DEF( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ) + { + FT_FILE* file; + + + if ( !stream ) + return FT_Err_Invalid_Stream_Handle; + + file = ft_fopen( filepathname, "rb" ); + if ( !file ) + { + FT_ERROR(( "FT_Stream_Open:" + " could not open `%s'\n", filepathname )); + + return FT_Err_Cannot_Open_Resource; + } + + ft_fseek( file, 0, SEEK_END ); + stream->size = ft_ftell( file ); + ft_fseek( file, 0, SEEK_SET ); + + stream->descriptor.pointer = file; + stream->pathname.pointer = (char*)filepathname; + stream->pos = 0; + + stream->read = ft_ansi_stream_io; + stream->close = ft_ansi_stream_close; + + FT_TRACE1(( "FT_Stream_Open:" )); + FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", + filepathname, stream->size )); + + return FT_Err_Ok; + } + + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ); + + extern void + ft_mem_debug_done( FT_Memory memory ); + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Memory ) + FT_New_Memory( void ) + { + FT_Memory memory; + + + memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) ); + if ( memory ) + { + memory->user = 0; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init( memory ); +#endif + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_Memory( FT_Memory memory ) + { +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done( memory ); +#endif + ft_sfree( memory ); + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/fttrigon.c b/android/jni/ndk_modules/freetype/src/base/fttrigon.c new file mode 100644 index 00000000..fdf433ab --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/fttrigon.c @@ -0,0 +1,546 @@ +/***************************************************************************/ +/* */ +/* fttrigon.c */ +/* */ +/* FreeType trigonometric functions (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_TRIGONOMETRY_H + + + /* the following is 0.2715717684432231 * 2^30 */ +#define FT_TRIG_COSCALE 0x11616E8EUL + + /* this table was generated for FT_PI = 180L << 16, i.e. degrees */ +#define FT_TRIG_MAX_ITERS 23 + + static const FT_Fixed + ft_trig_arctan_table[24] = + { + 4157273L, 2949120L, 1740967L, 919879L, 466945L, 234379L, 117304L, + 58666L, 29335L, 14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L, + 57L, 29L, 14L, 7L, 4L, 2L, 1L + }; + + /* the Cordic shrink factor, multiplied by 2^32 */ +#define FT_TRIG_SCALE 1166391785UL /* 0x4585BA38UL */ + + +#ifdef FT_CONFIG_HAS_INT64 + + /* multiply a given value by the CORDIC shrink factor */ + static FT_Fixed + ft_trig_downscale( FT_Fixed val ) + { + FT_Fixed s; + FT_Int64 v; + + + s = val; + val = ( val >= 0 ) ? val : -val; + + v = ( val * (FT_Int64)FT_TRIG_SCALE ) + 0x100000000UL; + val = (FT_Fixed)( v >> 32 ); + + return ( s >= 0 ) ? val : -val; + } + +#else /* !FT_CONFIG_HAS_INT64 */ + + /* multiply a given value by the CORDIC shrink factor */ + static FT_Fixed + ft_trig_downscale( FT_Fixed val ) + { + FT_Fixed s; + FT_UInt32 v1, v2, k1, k2, hi, lo1, lo2, lo3; + + + s = val; + val = ( val >= 0 ) ? val : -val; + + v1 = (FT_UInt32)val >> 16; + v2 = (FT_UInt32)(val & 0xFFFFL); + + k1 = (FT_UInt32)FT_TRIG_SCALE >> 16; /* constant */ + k2 = (FT_UInt32)(FT_TRIG_SCALE & 0xFFFFL); /* constant */ + + hi = k1 * v1; + lo1 = k1 * v2 + k2 * v1; /* can't overflow */ + + lo2 = ( k2 * v2 ) >> 16; + lo3 = ( lo1 >= lo2 ) ? lo1 : lo2; + lo1 += lo2; + + hi += lo1 >> 16; + if ( lo1 < lo3 ) + hi += (FT_UInt32)0x10000UL; + + val = (FT_Fixed)hi; + + return ( s >= 0 ) ? val : -val; + } + +#endif /* !FT_CONFIG_HAS_INT64 */ + + + static FT_Int + ft_trig_prenorm( FT_Vector* vec ) + { + FT_Fixed x, y, z; + FT_Int shift; + + + x = vec->x; + y = vec->y; + + z = ( ( x >= 0 ) ? x : - x ) | ( (y >= 0) ? y : -y ); + shift = 0; + +#if 1 + /* determine msb bit index in `shift' */ + if ( z >= ( 1L << 16 ) ) + { + z >>= 16; + shift += 16; + } + if ( z >= ( 1L << 8 ) ) + { + z >>= 8; + shift += 8; + } + if ( z >= ( 1L << 4 ) ) + { + z >>= 4; + shift += 4; + } + if ( z >= ( 1L << 2 ) ) + { + z >>= 2; + shift += 2; + } + if ( z >= ( 1L << 1 ) ) + { + z >>= 1; + shift += 1; + } + + if ( shift <= 27 ) + { + shift = 27 - shift; + vec->x = x << shift; + vec->y = y << shift; + } + else + { + shift -= 27; + vec->x = x >> shift; + vec->y = y >> shift; + shift = -shift; + } + +#else /* 0 */ + + if ( z < ( 1L << 27 ) ) + { + do + { + shift++; + z <<= 1; + } while ( z < ( 1L << 27 ) ); + vec->x = x << shift; + vec->y = y << shift; + } + else if ( z > ( 1L << 28 ) ) + { + do + { + shift++; + z >>= 1; + } while ( z > ( 1L << 28 ) ); + + vec->x = x >> shift; + vec->y = y >> shift; + shift = -shift; + } + +#endif /* 0 */ + + return shift; + } + + + static void + ft_trig_pseudo_rotate( FT_Vector* vec, + FT_Angle theta ) + { + FT_Int i; + FT_Fixed x, y, xtemp; + const FT_Fixed *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Get angle between -90 and 90 degrees */ + while ( theta <= -FT_ANGLE_PI2 ) + { + x = -x; + y = -y; + theta += FT_ANGLE_PI; + } + + while ( theta > FT_ANGLE_PI2 ) + { + x = -x; + y = -y; + theta -= FT_ANGLE_PI; + } + + /* Initial pseudorotation, with left shift */ + arctanptr = ft_trig_arctan_table; + + if ( theta < 0 ) + { + xtemp = x + ( y << 1 ); + y = y - ( x << 1 ); + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - ( y << 1 ); + y = y + ( x << 1 ); + x = xtemp; + theta -= *arctanptr++; + } + + /* Subsequent pseudorotations, with right shifts */ + i = 0; + do + { + if ( theta < 0 ) + { + xtemp = x + ( y >> i ); + y = y - ( x >> i ); + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - ( y >> i ); + y = y + ( x >> i ); + x = xtemp; + theta -= *arctanptr++; + } + } while ( ++i < FT_TRIG_MAX_ITERS ); + + vec->x = x; + vec->y = y; + } + + + static void + ft_trig_pseudo_polarize( FT_Vector* vec ) + { + FT_Fixed theta; + FT_Fixed yi, i; + FT_Fixed x, y; + const FT_Fixed *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Get the vector into the right half plane */ + theta = 0; + if ( x < 0 ) + { + x = -x; + y = -y; + theta = 2 * FT_ANGLE_PI2; + } + + if ( y > 0 ) + theta = - theta; + + arctanptr = ft_trig_arctan_table; + + if ( y < 0 ) + { + /* Rotate positive */ + yi = y + ( x << 1 ); + x = x - ( y << 1 ); + y = yi; + theta -= *arctanptr++; /* Subtract angle */ + } + else + { + /* Rotate negative */ + yi = y - ( x << 1 ); + x = x + ( y << 1 ); + y = yi; + theta += *arctanptr++; /* Add angle */ + } + + i = 0; + do + { + if ( y < 0 ) + { + /* Rotate positive */ + yi = y + ( x >> i ); + x = x - ( y >> i ); + y = yi; + theta -= *arctanptr++; + } + else + { + /* Rotate negative */ + yi = y - ( x >> i ); + x = x + ( y >> i ); + y = yi; + theta += *arctanptr++; + } + } while ( ++i < FT_TRIG_MAX_ITERS ); + + /* round theta */ + if ( theta >= 0 ) + theta = FT_PAD_ROUND( theta, 32 ); + else + theta = -FT_PAD_ROUND( -theta, 32 ); + + vec->x = x; + vec->y = theta; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Cos( FT_Angle angle ) + { + FT_Vector v; + + + v.x = FT_TRIG_COSCALE >> 2; + v.y = 0; + ft_trig_pseudo_rotate( &v, angle ); + + return v.x / ( 1 << 12 ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Sin( FT_Angle angle ) + { + return FT_Cos( FT_ANGLE_PI2 - angle ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Tan( FT_Angle angle ) + { + FT_Vector v; + + + v.x = FT_TRIG_COSCALE >> 2; + v.y = 0; + ft_trig_pseudo_rotate( &v, angle ); + + return FT_DivFix( v.y, v.x ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Angle ) + FT_Atan2( FT_Fixed dx, + FT_Fixed dy ) + { + FT_Vector v; + + + if ( dx == 0 && dy == 0 ) + return 0; + + v.x = dx; + v.y = dy; + ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + return v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ) + { + vec->x = FT_TRIG_COSCALE >> 2; + vec->y = 0; + ft_trig_pseudo_rotate( vec, angle ); + vec->x >>= 12; + vec->y >>= 12; + } + + + /* these macros return 0 for positive numbers, + and -1 for negative ones */ +#define FT_SIGN_LONG( x ) ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) ) +#define FT_SIGN_INT( x ) ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) ) +#define FT_SIGN_INT32( x ) ( (x) >> 31 ) +#define FT_SIGN_INT16( x ) ( (x) >> 15 ) + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ) + { + FT_Int shift; + FT_Vector v; + + + v.x = vec->x; + v.y = vec->y; + + if ( angle && ( v.x != 0 || v.y != 0 ) ) + { + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_rotate( &v, angle ); + v.x = ft_trig_downscale( v.x ); + v.y = ft_trig_downscale( v.y ); + + if ( shift > 0 ) + { + FT_Int32 half = (FT_Int32)1L << ( shift - 1 ); + + + vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift; + vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift; + } + else + { + shift = -shift; + vec->x = v.x << shift; + vec->y = v.y << shift; + } + } + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ) + { + FT_Int shift; + FT_Vector v; + + + v = *vec; + + /* handle trivial cases */ + if ( v.x == 0 ) + { + return ( v.y >= 0 ) ? v.y : -v.y; + } + else if ( v.y == 0 ) + { + return ( v.x >= 0 ) ? v.x : -v.x; + } + + /* general case */ + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + if ( shift > 0 ) + return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift; + + return v.x << -shift; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ) + { + FT_Int shift; + FT_Vector v; + + + v = *vec; + + if ( v.x == 0 && v.y == 0 ) + return; + + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + *length = ( shift >= 0 ) ? ( v.x >> shift ) : ( v.x << -shift ); + *angle = v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ) + { + vec->x = length; + vec->y = 0; + + FT_Vector_Rotate( vec, angle ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ) + { + FT_Angle delta = angle2 - angle1; + + + delta %= FT_ANGLE_2PI; + if ( delta < 0 ) + delta += FT_ANGLE_2PI; + + if ( delta > FT_ANGLE_PI ) + delta -= FT_ANGLE_2PI; + + return delta; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftutil.c b/android/jni/ndk_modules/freetype/src/base/ftutil.c new file mode 100644 index 00000000..5f77be55 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftutil.c @@ -0,0 +1,501 @@ +/***************************************************************************/ +/* */ +/* ftutil.c */ +/* */ +/* FreeType utility file for memory and list management (body). */ +/* */ +/* Copyright 2002, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_OBJECTS_H +#include FT_LIST_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_memory + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** M E M O R Y M A N A G E M E N T *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_alloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ) + { + FT_Error error; + FT_Pointer block = ft_mem_qalloc( memory, size, &error ); + + if ( !error && size > 0 ) + FT_MEM_ZERO( block, size ); + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_qalloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + FT_Pointer block = NULL; + + + if ( size > 0 ) + { + block = memory->alloc( memory, size ); + if ( block == NULL ) + error = FT_Err_Out_Of_Memory; + } + else if ( size < 0 ) + { + /* may help catch/prevent security issues */ + error = FT_Err_Invalid_Argument; + } + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_realloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + + block = ft_mem_qrealloc( memory, item_size, + cur_count, new_count, block, &error ); + if ( !error && new_count > cur_count ) + FT_MEM_ZERO( (char*)block + cur_count * item_size, + ( new_count - cur_count ) * item_size ); + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_qrealloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + + + /* Note that we now accept `item_size == 0' as a valid parameter, in + * order to cover very weird cases where an ALLOC_MULT macro would be + * called. + */ + if ( cur_count < 0 || new_count < 0 || item_size < 0 ) + { + /* may help catch/prevent nasty security issues */ + error = FT_Err_Invalid_Argument; + } + else if ( new_count == 0 || item_size == 0 ) + { + ft_mem_free( memory, block ); + block = NULL; + } + else if ( new_count > FT_INT_MAX/item_size ) + { + error = FT_Err_Array_Too_Large; + } + else if ( cur_count == 0 ) + { + FT_ASSERT( block == NULL ); + + block = ft_mem_alloc( memory, new_count*item_size, &error ); + } + else + { + FT_Pointer block2; + FT_Long cur_size = cur_count*item_size; + FT_Long new_size = new_count*item_size; + + + block2 = memory->realloc( memory, cur_size, new_size, block ); + if ( block2 == NULL ) + error = FT_Err_Out_Of_Memory; + else + block = block2; + } + + *p_error = error; + return block; + } + + + FT_BASE_DEF( void ) + ft_mem_free( FT_Memory memory, + const void *P ) + { + if ( P ) + memory->free( memory, (void*)P ); + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_dup( FT_Memory memory, + const void* address, + FT_ULong size, + FT_Error *p_error ) + { + FT_Error error; + FT_Pointer p = ft_mem_qalloc( memory, size, &error ); + + + if ( !error && address ) + ft_memcpy( p, address, size ); + + *p_error = error; + return p; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_strdup( FT_Memory memory, + const char* str, + FT_Error *p_error ) + { + FT_ULong len = str ? (FT_ULong)ft_strlen( str ) + 1 + : 0; + + + return ft_mem_dup( memory, str, len, p_error ); + } + + + FT_BASE_DEF( FT_Int ) + ft_mem_strcpyn( char* dst, + const char* src, + FT_ULong size ) + { + while ( size > 1 && *src != 0 ) + { + *dst++ = *src++; + size--; + } + + *dst = 0; /* always zero-terminate */ + + return *src != 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** D O U B L Y L I N K E D L I S T S *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#undef FT_COMPONENT +#define FT_COMPONENT trace_list + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ) + { + FT_ListNode cur; + + + cur = list->head; + while ( cur ) + { + if ( cur->data == data ) + return cur; + + cur = cur->next; + } + + return (FT_ListNode)0; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Add( FT_List list, + FT_ListNode node ) + { + FT_ListNode before = list->tail; + + + node->next = 0; + node->prev = before; + + if ( before ) + before->next = node; + else + list->head = node; + + list->tail = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ) + { + FT_ListNode after = list->head; + + + node->next = after; + node->prev = 0; + + if ( !after ) + list->tail = node; + else + after->prev = node; + + list->head = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ) + { + FT_ListNode before, after; + + + before = node->prev; + after = node->next; + + if ( before ) + before->next = after; + else + list->head = after; + + if ( after ) + after->prev = before; + else + list->tail = before; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Up( FT_List list, + FT_ListNode node ) + { + FT_ListNode before, after; + + + before = node->prev; + after = node->next; + + /* check whether we are already on top of the list */ + if ( !before ) + return; + + before->next = after; + + if ( after ) + after->prev = before; + else + list->tail = before; + + node->prev = 0; + node->next = list->head; + list->head->prev = node; + list->head = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ) + { + FT_ListNode cur = list->head; + FT_Error error = FT_Err_Ok; + + + while ( cur ) + { + FT_ListNode next = cur->next; + + + error = iterator( cur, user ); + if ( error ) + break; + + cur = next; + } + + return error; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ) + { + FT_ListNode cur; + + + cur = list->head; + while ( cur ) + { + FT_ListNode next = cur->next; + void* data = cur->data; + + + if ( destroy ) + destroy( memory, data, user ); + + FT_FREE( cur ); + cur = next; + } + + list->head = 0; + list->tail = 0; + } + + + FT_BASE_DEF( FT_UInt32 ) + ft_highpow2( FT_UInt32 value ) + { + FT_UInt32 value2; + + + /* + * We simply clear the lowest bit in each iteration. When + * we reach 0, we know that the previous value was our result. + */ + for ( ;; ) + { + value2 = value & (value - 1); /* clear lowest bit */ + if ( value2 == 0 ) + break; + + value = value2; + } + return value; + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE_DEF( FT_Error ) + FT_Alloc( FT_Memory memory, + FT_Long size, + void* *P ) + { + FT_Error error; + + + (void)FT_ALLOC( *P, size ); + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_QAlloc( FT_Memory memory, + FT_Long size, + void* *p ) + { + FT_Error error; + + + (void)FT_QALLOC( *p, size ); + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Realloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *P ) + { + FT_Error error; + + + (void)FT_REALLOC( *P, current, size ); + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_QRealloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *p ) + { + FT_Error error; + + + (void)FT_QREALLOC( *p, current, size ); + return error; + } + + + FT_BASE_DEF( void ) + FT_Free( FT_Memory memory, + void* *P ) + { + if ( *P ) + FT_MEM_FREE( *P ); + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftwinfnt.c b/android/jni/ndk_modules/freetype/src/base/ftwinfnt.c new file mode 100644 index 00000000..bc2e90e1 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftwinfnt.c @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* ftwinfnt.c */ +/* */ +/* FreeType API for accessing Windows FNT specific info (body). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_WINFONTS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_WINFNT_H + + + /* documentation is in ftwinfnt.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *header ) + { + FT_Service_WinFnt service; + FT_Error error; + + + error = FT_Err_Invalid_Argument; + + if ( face != NULL ) + { + FT_FACE_LOOKUP_SERVICE( face, service, WINFNT ); + + if ( service != NULL ) + { + error = service->get_header( face, header ); + } + } + + return error; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftxf86.c b/android/jni/ndk_modules/freetype/src/base/ftxf86.c new file mode 100644 index 00000000..a4bf767d --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/base/ftxf86.c @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* ftxf86.c */ +/* */ +/* FreeType utility file for X11 support (body). */ +/* */ +/* Copyright 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_XFREE86_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_XFREE86_NAME_H + + + /* documentation is in ftxf86.h */ + + FT_EXPORT_DEF( const char* ) + FT_Get_X11_Font_Format( FT_Face face ) + { + const char* result = NULL; + + + if ( face ) + FT_FACE_FIND_SERVICE( face, result, XF86_NAME ); + + return result; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cff.c b/android/jni/ndk_modules/freetype/src/cff/cff.c new file mode 100644 index 00000000..fccfd442 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cff.c @@ -0,0 +1,30 @@ +/***************************************************************************/ +/* */ +/* cff.c */ +/* */ +/* FreeType OpenType driver component (body only). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "cffpic.c" +#include "cffdrivr.c" +#include "cffparse.c" +#include "cffload.c" +#include "cffobjs.c" +#include "cffgload.c" +#include "cffcmap.c" + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffcmap.c b/android/jni/ndk_modules/freetype/src/cff/cffcmap.c new file mode 100644 index 00000000..12983711 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffcmap.c @@ -0,0 +1,208 @@ +/***************************************************************************/ +/* */ +/* cffcmap.c */ +/* */ +/* CFF character mapping table (cmap) support (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "cffcmap.h" +#include "cffload.h" + +#include "cfferrs.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + cff_cmap_encoding_init( CFF_CMapStd cmap ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Encoding encoding = &cff->encoding; + + + cmap->gids = encoding->codes; + + return 0; + } + + + FT_CALLBACK_DEF( void ) + cff_cmap_encoding_done( CFF_CMapStd cmap ) + { + cmap->gids = NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_encoding_char_index( CFF_CMapStd cmap, + FT_UInt32 char_code ) + { + FT_UInt result = 0; + + + if ( char_code < 256 ) + result = cmap->gids[char_code]; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + cff_cmap_encoding_char_next( CFF_CMapStd cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code; + + + *pchar_code = 0; + + if ( char_code < 255 ) + { + FT_UInt code = (FT_UInt)(char_code + 1); + + + for (;;) + { + if ( code >= 256 ) + break; + + result = cmap->gids[code]; + if ( result != 0 ) + { + *pchar_code = code; + break; + } + + code++; + } + } + return result; + } + + + FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec, + sizeof ( CFF_CMapStdRec ), + + (FT_CMap_InitFunc) cff_cmap_encoding_init, + (FT_CMap_DoneFunc) cff_cmap_encoding_done, + (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, + (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, + + NULL, NULL, NULL, NULL, NULL + ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( const char* ) + cff_sid_to_glyph_name( TT_Face face, + FT_UInt idx ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_UInt sid = charset->sids[idx]; + + + return cff_index_get_sid_string( cff, sid ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_cmap_unicode_init( PS_Unicodes unicodes ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + /* can't build Unicode map for CID-keyed font */ + /* because we don't know glyph names. */ + if ( !charset->sids ) + return CFF_Err_No_Unicode_Glyph_Name; + + return psnames->unicodes_init( memory, + unicodes, + cff->num_glyphs, + (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name, + (PS_FreeGlyphNameFunc)NULL, + (FT_Pointer)face ); + } + + + FT_CALLBACK_DEF( void ) + cff_cmap_unicode_done( PS_Unicodes unicodes ) + { + FT_Face face = FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_unicode_char_index( PS_Unicodes unicodes, + FT_UInt32 char_code ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + return psnames->unicodes_char_index( unicodes, char_code ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + cff_cmap_unicode_char_next( PS_Unicodes unicodes, + FT_UInt32 *pchar_code ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + return psnames->unicodes_char_next( unicodes, pchar_code ); + } + + + FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec, + sizeof ( PS_UnicodesRec ), + + (FT_CMap_InitFunc) cff_cmap_unicode_init, + (FT_CMap_DoneFunc) cff_cmap_unicode_done, + (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, + (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, + + NULL, NULL, NULL, NULL, NULL + ) + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffcmap.h b/android/jni/ndk_modules/freetype/src/cff/cffcmap.h new file mode 100644 index 00000000..3f7f67bb --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffcmap.h @@ -0,0 +1,67 @@ +/***************************************************************************/ +/* */ +/* cffcmap.h */ +/* */ +/* CFF character mapping table (cmap) support (specification). */ +/* */ +/* Copyright 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFCMAP_H__ +#define __CFFCMAP_H__ + +#include "cffobjs.h" + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* standard (and expert) encoding cmaps */ + typedef struct CFF_CMapStdRec_* CFF_CMapStd; + + typedef struct CFF_CMapStdRec_ + { + FT_CMapRec cmap; + FT_UShort* gids; /* up to 256 elements */ + + } CFF_CMapStdRec; + + + FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* unicode (synthetic) cmaps */ + + FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec) + + +FT_END_HEADER + +#endif /* __CFFCMAP_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffdrivr.c b/android/jni/ndk_modules/freetype/src/cff/cffdrivr.c new file mode 100644 index 00000000..39f04ee1 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffdrivr.c @@ -0,0 +1,671 @@ +/***************************************************************************/ +/* */ +/* cffdrivr.c */ +/* */ +/* OpenType font driver implementation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_SERVICE_CID_H +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_TT_CMAP_H + +#include "cffdrivr.h" +#include "cffgload.h" +#include "cffload.h" +#include "cffcmap.h" +#include "cffparse.h" + +#include "cfferrs.h" +#include "cffpic.h" + +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_GLYPH_DICT_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffdriver + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#undef PAIR_TAG +#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \ + (FT_ULong)right ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_get_kerning */ + /* */ + /* <Description> */ + /* A driver method used to return the kerning vector between two */ + /* glyphs of the same face. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* <Output> */ + /* kerning :: The kerning vector. This is in font units for */ + /* scalable formats, and in pixels for fixed-sizes */ + /* formats. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this function. Other layouts, or more sophisticated */ + /* kernings, are out of scope of this method (the basic driver */ + /* interface is meant to be simple). */ + /* */ + /* They can be implemented by format-specific interfaces. */ + /* */ + FT_CALLBACK_DEF( FT_Error ) + cff_get_kerning( FT_Face ttface, /* TT_Face */ + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + TT_Face face = (TT_Face)ttface; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + + kerning->x = 0; + kerning->y = 0; + + if ( sfnt ) + kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); + + return CFF_Err_Ok; + } + + +#undef PAIR_TAG + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_Glyph */ + /* */ + /* <Description> */ + /* A driver method used to load a glyph within a given glyph slot. */ + /* */ + /* <Input> */ + /* slot :: A handle to the target slot object where the glyph */ + /* will be loaded. */ + /* */ + /* size :: A handle to the source face size at which the glyph */ + /* must be scaled, loaded, etc. */ + /* */ + /* glyph_index :: The index of the glyph in the font file. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* FT_LOAD_??? constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_CALLBACK_DEF( FT_Error ) + Load_Glyph( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */ + FT_Size cffsize, /* CFF_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot; + CFF_Size size = (CFF_Size)cffsize; + + + if ( !slot ) + return CFF_Err_Invalid_Slot_Handle; + + /* check whether we want a scaled outline or bitmap */ + if ( !size ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + /* reset the size object if necessary */ + if ( load_flags & FT_LOAD_NO_SCALE ) + size = NULL; + + if ( size ) + { + /* these two objects must have the same parent */ + if ( cffsize->face != cffslot->face ) + return CFF_Err_Invalid_Face_Handle; + } + + /* now load the glyph outline if necessary */ + error = cff_slot_load( slot, size, glyph_index, load_flags ); + + /* force drop-out mode to 2 - irrelevant now */ + /* slot->outline.dropout_mode = 2; */ + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed* advances ) + { + FT_UInt nn; + FT_Error error = CFF_Err_Ok; + FT_GlyphSlot slot = face->glyph; + + + flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; + + for ( nn = 0; nn < count; nn++ ) + { + error = Load_Glyph( slot, face->size, start + nn, flags ); + if ( error ) + break; + + advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) + ? slot->linearVertAdvance + : slot->linearHoriAdvance; + } + + return error; + } + + + /* + * GLYPH DICT SERVICE + * + */ + + static FT_Error + cff_get_glyph_name( CFF_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + CFF_Font font = (CFF_Font)face->extra.data; + FT_String* gname; + FT_UShort sid; + FT_Error error; + + + if ( !font->psnames ) + { + FT_ERROR(( "cff_get_glyph_name:" + " cannot get glyph name from CFF & CEF fonts\n" + " " + " without the `PSNames' module\n" )); + error = CFF_Err_Unknown_File_Format; + goto Exit; + } + + /* first, locate the sid in the charset table */ + sid = font->charset.sids[glyph_index]; + + /* now, lookup the name itself */ + gname = cff_index_get_sid_string( font, sid ); + + if ( gname ) + FT_STRCPYN( buffer, gname, buffer_max ); + + error = CFF_Err_Ok; + + Exit: + return error; + } + + + static FT_UInt + cff_get_name_index( CFF_Face face, + FT_String* glyph_name ) + { + CFF_Font cff; + CFF_Charset charset; + FT_Service_PsCMaps psnames; + FT_String* name; + FT_UShort sid; + FT_UInt i; + + + cff = (CFF_FontRec *)face->extra.data; + charset = &cff->charset; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + return 0; + + for ( i = 0; i < cff->num_glyphs; i++ ) + { + sid = charset->sids[i]; + + if ( sid > 390 ) + name = cff_index_get_string( cff, sid - 391 ); + else + name = (FT_String *)psnames->adobe_std_strings( sid ); + + if ( !name ) + continue; + + if ( !ft_strcmp( glyph_name, name ) ) + return i; + } + + return 0; + } + + + FT_DEFINE_SERVICE_GLYPHDICTREC(cff_service_glyph_dict, + (FT_GlyphDict_GetNameFunc) cff_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)cff_get_name_index + ) + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Int + cff_ps_has_glyph_names( FT_Face face ) + { + return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0; + } + + + static FT_Error + cff_ps_get_font_info( CFF_Face face, + PS_FontInfoRec* afont_info ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Error error = CFF_Err_Ok; + + + if ( cff && cff->font_info == NULL ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + PS_FontInfoRec *font_info; + FT_Memory memory = face->root.memory; + + + if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) ) + goto Fail; + + font_info->version = cff_index_get_sid_string( cff, + dict->version ); + font_info->notice = cff_index_get_sid_string( cff, + dict->notice ); + font_info->full_name = cff_index_get_sid_string( cff, + dict->full_name ); + font_info->family_name = cff_index_get_sid_string( cff, + dict->family_name ); + font_info->weight = cff_index_get_sid_string( cff, + dict->weight ); + font_info->italic_angle = dict->italic_angle; + font_info->is_fixed_pitch = dict->is_fixed_pitch; + font_info->underline_position = (FT_Short)dict->underline_position; + font_info->underline_thickness = (FT_Short)dict->underline_thickness; + + cff->font_info = font_info; + } + + if ( cff ) + *afont_info = *cff->font_info; + + Fail: + return error; + } + + + FT_DEFINE_SERVICE_PSINFOREC(cff_service_ps_info, + (PS_GetFontInfoFunc) cff_ps_get_font_info, + (PS_GetFontExtraFunc) NULL, + (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, + (PS_GetFontPrivateFunc)NULL /* unsupported with CFF fonts */ + ) + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + cff_get_ps_name( CFF_Face face ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + return (const char*)cff->font_name; + } + + + FT_DEFINE_SERVICE_PSFONTNAMEREC(cff_service_ps_name, + (FT_PsName_GetFunc)cff_get_ps_name + ) + + + /* + * TT CMAP INFO + * + * If the charmap is a synthetic Unicode encoding cmap or + * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO + * service defined in SFNT module. + * + * Otherwise call the service function in the sfnt module. + * + */ + static FT_Error + cff_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = FT_CMAP( charmap ); + FT_Error error = CFF_Err_Ok; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Library library = FT_FACE_LIBRARY( face ); + + + cmap_info->language = 0; + cmap_info->format = 0; + + if ( cmap->clazz != &FT_CFF_CMAP_ENCODING_CLASS_REC_GET && + cmap->clazz != &FT_CFF_CMAP_UNICODE_CLASS_REC_GET ) + { + FT_Module sfnt = FT_Get_Module( library, "sfnt" ); + FT_Service_TTCMaps service = + (FT_Service_TTCMaps)ft_module_get_service( sfnt, + FT_SERVICE_ID_TT_CMAP ); + + + if ( service && service->get_cmap_info ) + error = service->get_cmap_info( charmap, cmap_info ); + } + + return error; + } + + + FT_DEFINE_SERVICE_TTCMAPSREC(cff_service_get_cmap_info, + (TT_CMap_Info_GetFunc)cff_get_cmap_info + ) + + + /* + * CID INFO SERVICE + * + */ + static FT_Error + cff_get_ros( CFF_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ) + { + FT_Error error = CFF_Err_Ok; + CFF_Font cff = (CFF_Font)face->extra.data; + + + if ( cff ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry == 0xFFFFU ) + { + error = CFF_Err_Invalid_Argument; + goto Fail; + } + + if ( registry ) + { + if ( cff->registry == NULL ) + cff->registry = cff_index_get_sid_string( cff, + dict->cid_registry ); + *registry = cff->registry; + } + + if ( ordering ) + { + if ( cff->ordering == NULL ) + cff->ordering = cff_index_get_sid_string( cff, + dict->cid_ordering ); + *ordering = cff->ordering; + } + + /* + * XXX: According to Adobe TechNote #5176, the supplement in CFF + * can be a real number. We truncate it to fit public API + * since freetype-2.3.6. + */ + if ( supplement ) + { + if ( dict->cid_supplement < FT_INT_MIN || + dict->cid_supplement > FT_INT_MAX ) + FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n", + dict->cid_supplement )); + *supplement = (FT_Int)dict->cid_supplement; + } + } + + Fail: + return error; + } + + + static FT_Error + cff_get_is_cid( CFF_Face face, + FT_Bool *is_cid ) + { + FT_Error error = CFF_Err_Ok; + CFF_Font cff = (CFF_Font)face->extra.data; + + + *is_cid = 0; + + if ( cff ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry != 0xFFFFU ) + *is_cid = 1; + } + + return error; + } + + + static FT_Error + cff_get_cid_from_glyph_index( CFF_Face face, + FT_UInt glyph_index, + FT_UInt *cid ) + { + FT_Error error = CFF_Err_Ok; + CFF_Font cff; + + + cff = (CFF_Font)face->extra.data; + + if ( cff ) + { + FT_UInt c; + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry == 0xFFFFU ) + { + error = CFF_Err_Invalid_Argument; + goto Fail; + } + + if ( glyph_index > cff->num_glyphs ) + { + error = CFF_Err_Invalid_Argument; + goto Fail; + } + + c = cff->charset.sids[glyph_index]; + + if ( cid ) + *cid = c; + } + + Fail: + return error; + } + + + FT_DEFINE_SERVICE_CIDREC(cff_service_cid_info, + (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros, + (FT_CID_GetIsInternallyCIDKeyedFunc) cff_get_is_cid, + (FT_CID_GetCIDFromGlyphIndexFunc) cff_get_cid_from_glyph_index + ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ +#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES + FT_DEFINE_SERVICEDESCREC6(cff_services, + FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF, + FT_SERVICE_ID_POSTSCRIPT_INFO, &FT_CFF_SERVICE_PS_INFO_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_GLYPH_DICT, &FT_CFF_SERVICE_GLYPH_DICT_GET, + FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET, + FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_GET + ) +#else + FT_DEFINE_SERVICEDESCREC5(cff_services, + FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF, + FT_SERVICE_ID_POSTSCRIPT_INFO, &FT_CFF_SERVICE_PS_INFO_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET, + FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_GET + ) +#endif + + FT_CALLBACK_DEF( FT_Module_Interface ) + cff_get_interface( FT_Module driver, /* CFF_Driver */ + const char* module_interface ) + { + FT_Module sfnt; + FT_Module_Interface result; + + + result = ft_service_list_lookup( FT_CFF_SERVICES_GET, module_interface ); + if ( result != NULL ) + return result; + + if ( !driver ) + return NULL; + + /* we pass our request to the `sfnt' module */ + sfnt = FT_Get_Module( driver->library, "sfnt" ); + + return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; + } + + + /* The FT_DriverInterface structure is defined in ftdriver.h. */ + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#define CFF_SIZE_SELECT cff_size_select +#else +#define CFF_SIZE_SELECT 0 +#endif + + FT_DEFINE_DRIVER(cff_driver_class, + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + FT_MODULE_DRIVER_HAS_HINTER, + + sizeof( CFF_DriverRec ), + "cff", + 0x10000L, + 0x20000L, + + 0, /* module-specific interface */ + + cff_driver_init, + cff_driver_done, + cff_get_interface, + + /* now the specific driver fields */ + sizeof( TT_FaceRec ), + sizeof( CFF_SizeRec ), + sizeof( CFF_GlyphSlotRec ), + + cff_face_init, + cff_face_done, + cff_size_init, + cff_size_done, + cff_slot_init, + cff_slot_done, + + ft_stub_set_char_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + Load_Glyph, + + cff_get_kerning, + 0, /* FT_Face_AttachFunc */ + cff_get_advances, /* FT_Face_GetAdvancesFunc */ + + cff_size_request, + + CFF_SIZE_SELECT + ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffdrivr.h b/android/jni/ndk_modules/freetype/src/cff/cffdrivr.h new file mode 100644 index 00000000..50e81387 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffdrivr.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* cffdrivr.h */ +/* */ +/* High-level OpenType driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFDRIVER_H__ +#define __CFFDRIVER_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_DRIVER( cff_driver_class ) + + +FT_END_HEADER + +#endif /* __CFFDRIVER_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cfferrs.h b/android/jni/ndk_modules/freetype/src/cff/cfferrs.h new file mode 100644 index 00000000..1b2a5c95 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cfferrs.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* cfferrs.h */ +/* */ +/* CFF error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the CFF error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __CFFERRS_H__ +#define __CFFERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX CFF_Err_ +#define FT_ERR_BASE FT_Mod_Err_CFF + + +#include FT_ERRORS_H + +#endif /* __CFFERRS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffgload.c b/android/jni/ndk_modules/freetype/src/cff/cffgload.c new file mode 100644 index 00000000..e99ee706 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffgload.c @@ -0,0 +1,2972 @@ +/***************************************************************************/ +/* */ +/* cffgload.c */ +/* */ +/* OpenType Glyph Loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_OUTLINE_H + +#include "cffobjs.h" +#include "cffload.h" +#include "cffgload.h" + +#include "cfferrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffgload + + + typedef enum CFF_Operator_ + { + cff_op_unknown = 0, + + cff_op_rmoveto, + cff_op_hmoveto, + cff_op_vmoveto, + + cff_op_rlineto, + cff_op_hlineto, + cff_op_vlineto, + + cff_op_rrcurveto, + cff_op_hhcurveto, + cff_op_hvcurveto, + cff_op_rcurveline, + cff_op_rlinecurve, + cff_op_vhcurveto, + cff_op_vvcurveto, + + cff_op_flex, + cff_op_hflex, + cff_op_hflex1, + cff_op_flex1, + + cff_op_endchar, + + cff_op_hstem, + cff_op_vstem, + cff_op_hstemhm, + cff_op_vstemhm, + + cff_op_hintmask, + cff_op_cntrmask, + cff_op_dotsection, /* deprecated, acts as no-op */ + + cff_op_abs, + cff_op_add, + cff_op_sub, + cff_op_div, + cff_op_neg, + cff_op_random, + cff_op_mul, + cff_op_sqrt, + + cff_op_blend, + + cff_op_drop, + cff_op_exch, + cff_op_index, + cff_op_roll, + cff_op_dup, + + cff_op_put, + cff_op_get, + cff_op_store, + cff_op_load, + + cff_op_and, + cff_op_or, + cff_op_not, + cff_op_eq, + cff_op_ifelse, + + cff_op_callsubr, + cff_op_callgsubr, + cff_op_return, + + /* Type 1 opcodes: invalid but seen in real life */ + cff_op_hsbw, + cff_op_closepath, + cff_op_callothersubr, + cff_op_pop, + cff_op_seac, + cff_op_sbw, + cff_op_setcurrentpoint, + + /* do not remove */ + cff_op_max + + } CFF_Operator; + + +#define CFF_COUNT_CHECK_WIDTH 0x80 +#define CFF_COUNT_EXACT 0x40 +#define CFF_COUNT_CLEAR_STACK 0x20 + + /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are */ + /* used for checking the width and requested numbers of arguments */ + /* only; they are set to zero afterwards */ + + /* the other two flags are informative only and unused currently */ + + static const FT_Byte cff_argument_counts[] = + { + 0, /* unknown */ + + 2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */ + 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, + 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, + + 0 | CFF_COUNT_CLEAR_STACK, /* rlineto */ + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + + 0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */ + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + + 13, /* flex */ + 7, + 9, + 11, + + 0 | CFF_COUNT_CHECK_WIDTH, /* endchar */ + + 2 | CFF_COUNT_CHECK_WIDTH, /* hstem */ + 2 | CFF_COUNT_CHECK_WIDTH, + 2 | CFF_COUNT_CHECK_WIDTH, + 2 | CFF_COUNT_CHECK_WIDTH, + + 0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */ + 0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */ + 0, /* dotsection */ + + 1, /* abs */ + 2, + 2, + 2, + 1, + 0, + 2, + 1, + + 1, /* blend */ + + 1, /* drop */ + 2, + 1, + 2, + 1, + + 2, /* put */ + 1, + 4, + 3, + + 2, /* and */ + 2, + 1, + 2, + 4, + + 1, /* callsubr */ + 1, + 0, + + 2, /* hsbw */ + 0, + 0, + 0, + 5, /* seac */ + 4, /* sbw */ + 2 /* setcurrentpoint */ + }; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** GENERIC CHARSTRING PARSING *********/ + /********** *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_builder_init */ + /* */ + /* <Description> */ + /* Initializes a given glyph builder. */ + /* */ + /* <InOut> */ + /* builder :: A pointer to the glyph builder to initialize. */ + /* */ + /* <Input> */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting is active. */ + /* */ + static void + cff_builder_init( CFF_Builder* builder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot glyph, + FT_Bool hinting ) + { + builder->path_begun = 0; + builder->load_points = 1; + + builder->face = face; + builder->glyph = glyph; + builder->memory = face->root.memory; + + if ( glyph ) + { + FT_GlyphLoader loader = glyph->root.internal->loader; + + + builder->loader = loader; + builder->base = &loader->base.outline; + builder->current = &loader->current.outline; + FT_GlyphLoader_Rewind( loader ); + + builder->hints_globals = 0; + builder->hints_funcs = 0; + + if ( hinting && size ) + { + CFF_Internal internal = (CFF_Internal)size->root.internal; + + + builder->hints_globals = (void *)internal->topfont; + builder->hints_funcs = glyph->root.internal->glyph_hints; + } + } + + builder->pos_x = 0; + builder->pos_y = 0; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + builder->advance.x = 0; + builder->advance.y = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_builder_done */ + /* */ + /* <Description> */ + /* Finalizes a given glyph builder. Its contents can still be used */ + /* after the call, but the function saves important information */ + /* within the corresponding glyph slot. */ + /* */ + /* <Input> */ + /* builder :: A pointer to the glyph builder to finalize. */ + /* */ + static void + cff_builder_done( CFF_Builder* builder ) + { + CFF_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->root.outline = *builder->base; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_compute_bias */ + /* */ + /* <Description> */ + /* Computes the bias value in dependence of the number of glyph */ + /* subroutines. */ + /* */ + /* <Input> */ + /* in_charstring_type :: The `CharstringType' value of the top DICT */ + /* dictionary. */ + /* */ + /* num_subrs :: The number of glyph subroutines. */ + /* */ + /* <Return> */ + /* The bias value. */ + static FT_Int + cff_compute_bias( FT_Int in_charstring_type, + FT_UInt num_subrs ) + { + FT_Int result; + + + if ( in_charstring_type == 1 ) + result = 0; + else if ( num_subrs < 1240 ) + result = 107; + else if ( num_subrs < 33900U ) + result = 1131; + else + result = 32768U; + + return result; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_decoder_init */ + /* */ + /* <Description> */ + /* Initializes a given glyph decoder. */ + /* */ + /* <InOut> */ + /* decoder :: A pointer to the glyph builder to initialize. */ + /* */ + /* <Input> */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* slot :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting is active. */ + /* */ + /* hint_mode :: The hinting mode. */ + /* */ + FT_LOCAL_DEF( void ) + cff_decoder_init( CFF_Decoder* decoder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot slot, + FT_Bool hinting, + FT_Render_Mode hint_mode ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + /* clear everything */ + FT_MEM_ZERO( decoder, sizeof ( *decoder ) ); + + /* initialize builder */ + cff_builder_init( &decoder->builder, face, size, slot, hinting ); + + /* initialize Type2 decoder */ + decoder->cff = cff; + decoder->num_globals = cff->global_subrs_index.count; + decoder->globals = cff->global_subrs; + decoder->globals_bias = cff_compute_bias( + cff->top_font.font_dict.charstring_type, + decoder->num_globals ); + + decoder->hint_mode = hint_mode; + } + + + /* this function is used to select the subfont */ + /* and the locals subrs array */ + FT_LOCAL_DEF( FT_Error ) + cff_decoder_prepare( CFF_Decoder* decoder, + CFF_Size size, + FT_UInt glyph_index ) + { + CFF_Builder *builder = &decoder->builder; + CFF_Font cff = (CFF_Font)builder->face->extra.data; + CFF_SubFont sub = &cff->top_font; + FT_Error error = CFF_Err_Ok; + + + /* manage CID fonts */ + if ( cff->num_subfonts ) + { + FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, glyph_index ); + + + if ( fd_index >= cff->num_subfonts ) + { + FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + FT_TRACE3(( "glyph index %d (subfont %d):\n", glyph_index, fd_index )); + + sub = cff->subfonts[fd_index]; + + if ( builder->hints_funcs && size ) + { + CFF_Internal internal = (CFF_Internal)size->root.internal; + + + /* for CFFs without subfonts, this value has already been set */ + builder->hints_globals = (void *)internal->subfonts[fd_index]; + } + } +#ifdef FT_DEBUG_LEVEL_TRACE + else + FT_TRACE3(( "glyph index %d:\n", glyph_index )); +#endif + + decoder->num_locals = sub->local_subrs_index.count; + decoder->locals = sub->local_subrs; + decoder->locals_bias = cff_compute_bias( + decoder->cff->top_font.font_dict.charstring_type, + decoder->num_locals ); + + decoder->glyph_width = sub->private_dict.default_width; + decoder->nominal_width = sub->private_dict.nominal_width; + + Exit: + return error; + } + + + /* check that there is enough space for `count' more points */ + static FT_Error + check_points( CFF_Builder* builder, + FT_Int count ) + { + return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + static void + cff_builder_add_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ) + { + FT_Outline* outline = builder->current; + + + if ( builder->load_points ) + { + FT_Vector* point = outline->points + outline->n_points; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + + + point->x = x >> 16; + point->y = y >> 16; + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + } + + outline->n_points++; + } + + + /* check space for a new on-curve point, then add it */ + static FT_Error + cff_builder_add_point1( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = check_points( builder, 1 ); + if ( !error ) + cff_builder_add_point( builder, x, y, 1 ); + + return error; + } + + + /* check space for a new contour, then add it */ + static FT_Error + cff_builder_add_contour( CFF_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + if ( !builder->load_points ) + { + outline->n_contours++; + return CFF_Err_Ok; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + static FT_Error + cff_builder_start_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = CFF_Err_Ok; + + + /* test whether we are building a new contour */ + if ( !builder->path_begun ) + { + builder->path_begun = 1; + error = cff_builder_add_contour( builder ); + if ( !error ) + error = cff_builder_add_point1( builder, x, y ); + } + + return error; + } + + + /* close the current contour */ + static void + cff_builder_close_contour( CFF_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Int first; + + + if ( !outline ) + return; + + first = outline->n_contours <= 1 + ? 0 : outline->contours[outline->n_contours - 2] + 1; + + /* We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + outline->n_points - 1; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; + + + /* `delete' last point only if it coincides with the first */ + /* point and if it is not a control point (which can happen). */ + if ( p1->x == p2->x && p1->y == p2->y ) + if ( *control == FT_CURVE_TAG_ON ) + outline->n_points--; + } + + if ( outline->n_contours > 0 ) + { + /* Don't add contours only consisting of one point, i.e., */ + /* check whether begin point and last point are the same. */ + if ( first == outline->n_points - 1 ) + { + outline->n_contours--; + outline->n_points--; + } + else + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + } + + + static FT_Int + cff_lookup_glyph_by_stdcharcode( CFF_Font cff, + FT_Int charcode ) + { + FT_UInt n; + FT_UShort glyph_sid; + + + /* CID-keyed fonts don't have glyph names */ + if ( !cff->charset.sids ) + return -1; + + /* check range of standard char code */ + if ( charcode < 0 || charcode > 255 ) + return -1; + + /* Get code to SID mapping from `cff_standard_encoding'. */ + glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode ); + + for ( n = 0; n < cff->num_glyphs; n++ ) + { + if ( cff->charset.sids[n] == glyph_sid ) + return n; + } + + return -1; + } + + + static FT_Error + cff_get_glyph_data( TT_Face face, + FT_UInt glyph_index, + FT_Byte** pointer, + FT_ULong* length ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( face->root.internal->incremental_interface ) + { + FT_Data data; + FT_Error error = + face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->object, + glyph_index, &data ); + + + *pointer = (FT_Byte*)data.pointer; + *length = data.length; + + return error; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + { + CFF_Font cff = (CFF_Font)(face->extra.data); + + + return cff_index_access_element( &cff->charstrings_index, glyph_index, + pointer, length ); + } + } + + + static void + cff_free_glyph_data( TT_Face face, + FT_Byte** pointer, + FT_ULong length ) + { +#ifndef FT_CONFIG_OPTION_INCREMENTAL + FT_UNUSED( length ); +#endif + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( face->root.internal->incremental_interface ) + { + FT_Data data; + + + data.pointer = *pointer; + data.length = length; + + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, &data ); + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + { + CFF_Font cff = (CFF_Font)(face->extra.data); + + + cff_index_forget_element( &cff->charstrings_index, pointer ); + } + } + + + static FT_Error + cff_operator_seac( CFF_Decoder* decoder, + FT_Pos asb, + FT_Pos adx, + FT_Pos ady, + FT_Int bchar, + FT_Int achar ) + { + FT_Error error; + CFF_Builder* builder = &decoder->builder; + FT_Int bchar_index, achar_index; + TT_Face face = decoder->builder.face; + FT_Vector left_bearing, advance; + FT_Byte* charstring; + FT_ULong charstring_len; + FT_Pos glyph_width; + + + if ( decoder->seac ) + { + FT_ERROR(( "cff_operator_seac: invalid nested seac\n" )); + return CFF_Err_Syntax_Error; + } + + adx += decoder->builder.left_bearing.x; + ady += decoder->builder.left_bearing.y; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* Incremental fonts don't necessarily have valid charsets. */ + /* They use the character code, not the glyph index, in this case. */ + if ( face->root.internal->incremental_interface ) + { + bchar_index = bchar; + achar_index = achar; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + CFF_Font cff = (CFF_Font)(face->extra.data); + + + bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar ); + achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar ); + } + + if ( bchar_index < 0 || achar_index < 0 ) + { + FT_ERROR(( "cff_operator_seac:" + " invalid seac character code arguments\n" )); + return CFF_Err_Syntax_Error; + } + + /* If we are trying to load a composite glyph, do not load the */ + /* accent character and return the array of subglyphs. */ + if ( builder->no_recurse ) + { + FT_GlyphSlot glyph = (FT_GlyphSlot)builder->glyph; + FT_GlyphLoader loader = glyph->internal->loader; + FT_SubGlyph subg; + + + /* reallocate subglyph array if necessary */ + error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); + if ( error ) + goto Exit; + + subg = loader->current.subglyphs; + + /* subglyph 0 = base character */ + subg->index = bchar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | + FT_SUBGLYPH_FLAG_USE_MY_METRICS; + subg->arg1 = 0; + subg->arg2 = 0; + subg++; + + /* subglyph 1 = accent character */ + subg->index = achar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; + subg->arg1 = (FT_Int)( adx >> 16 ); + subg->arg2 = (FT_Int)( ady >> 16 ); + + /* set up remaining glyph fields */ + glyph->num_subglyphs = 2; + glyph->subglyphs = loader->base.subglyphs; + glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + loader->current.num_subglyphs = 2; + } + + FT_GlyphLoader_Prepare( builder->loader ); + + /* First load `bchar' in builder */ + error = cff_get_glyph_data( face, bchar_index, + &charstring, &charstring_len ); + if ( !error ) + { + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = cff_decoder_parse_charstrings( decoder, charstring, + charstring_len ); + decoder->seac = FALSE; + + cff_free_glyph_data( face, &charstring, charstring_len ); + + if ( error ) + goto Exit; + } + + /* Save the left bearing, advance and glyph width of the base */ + /* character as they will be erased by the next load. */ + + left_bearing = builder->left_bearing; + advance = builder->advance; + glyph_width = decoder->glyph_width; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + + builder->pos_x = adx - asb; + builder->pos_y = ady; + + /* Now load `achar' on top of the base outline. */ + error = cff_get_glyph_data( face, achar_index, + &charstring, &charstring_len ); + if ( !error ) + { + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = cff_decoder_parse_charstrings( decoder, charstring, + charstring_len ); + decoder->seac = FALSE; + + cff_free_glyph_data( face, &charstring, charstring_len ); + + if ( error ) + goto Exit; + } + + /* Restore the left side bearing, advance and glyph width */ + /* of the base character. */ + builder->left_bearing = left_bearing; + builder->advance = advance; + decoder->glyph_width = glyph_width; + + builder->pos_x = 0; + builder->pos_y = 0; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_decoder_parse_charstrings */ + /* */ + /* <Description> */ + /* Parses a given Type 2 charstrings program. */ + /* */ + /* <InOut> */ + /* decoder :: The current Type 1 decoder. */ + /* */ + /* <Input> */ + /* charstring_base :: The base of the charstring stream. */ + /* */ + /* charstring_len :: The length in bytes of the charstring stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + cff_decoder_parse_charstrings( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ) + { + FT_Error error; + CFF_Decoder_Zone* zone; + FT_Byte* ip; + FT_Byte* limit; + CFF_Builder* builder = &decoder->builder; + FT_Pos x, y; + FT_Fixed seed; + FT_Fixed* stack; + FT_Int charstring_type = + decoder->cff->top_font.font_dict.charstring_type; + + T2_Hints_Funcs hinter; + + + /* set default width */ + decoder->num_hints = 0; + decoder->read_width = 1; + + /* compute random seed from stack address of parameter */ + seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed ^ + (FT_PtrDist)(char*)&decoder ^ + (FT_PtrDist)(char*)&charstring_base ) & + FT_ULONG_MAX ) ; + seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; + if ( seed == 0 ) + seed = 0x7384; + + /* initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + stack = decoder->top; + + hinter = (T2_Hints_Funcs)builder->hints_funcs; + + builder->path_begun = 0; + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + error = CFF_Err_Ok; + + x = builder->pos_x; + y = builder->pos_y; + + /* begin hints recording session, if any */ + if ( hinter ) + hinter->open( hinter->hints ); + + /* now execute loop */ + while ( ip < limit ) + { + CFF_Operator op; + FT_Byte v; + + + /********************************************************************/ + /* */ + /* Decode operator or operand */ + /* */ + v = *ip++; + if ( v >= 32 || v == 28 ) + { + FT_Int shift = 16; + FT_Int32 val; + + + /* this is an operand, push it on the stack */ + if ( v == 28 ) + { + if ( ip + 1 >= limit ) + goto Syntax_Error; + val = (FT_Short)( ( (FT_Short)ip[0] << 8 ) | ip[1] ); + ip += 2; + } + else if ( v < 247 ) + val = (FT_Int32)v - 139; + else if ( v < 251 ) + { + if ( ip >= limit ) + goto Syntax_Error; + val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108; + } + else if ( v < 255 ) + { + if ( ip >= limit ) + goto Syntax_Error; + val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108; + } + else + { + if ( ip + 3 >= limit ) + goto Syntax_Error; + val = ( (FT_Int32)ip[0] << 24 ) | + ( (FT_Int32)ip[1] << 16 ) | + ( (FT_Int32)ip[2] << 8 ) | + ip[3]; + ip += 4; + if ( charstring_type == 2 ) + shift = 0; + } + if ( decoder->top - stack >= CFF_MAX_OPERANDS ) + goto Stack_Overflow; + + val <<= shift; + *decoder->top++ = val; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !( val & 0xFFFFL ) ) + FT_TRACE4(( " %ld", (FT_Int32)( val >> 16 ) )); + else + FT_TRACE4(( " %.2f", val / 65536.0 )); +#endif + + } + else + { + /* The specification says that normally arguments are to be taken */ + /* from the bottom of the stack. However, this seems not to be */ + /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */ + /* arguments similar to a PS interpreter. */ + + FT_Fixed* args = decoder->top; + FT_Int num_args = (FT_Int)( args - decoder->stack ); + FT_Int req_args; + + + /* find operator */ + op = cff_op_unknown; + + switch ( v ) + { + case 1: + op = cff_op_hstem; + break; + case 3: + op = cff_op_vstem; + break; + case 4: + op = cff_op_vmoveto; + break; + case 5: + op = cff_op_rlineto; + break; + case 6: + op = cff_op_hlineto; + break; + case 7: + op = cff_op_vlineto; + break; + case 8: + op = cff_op_rrcurveto; + break; + case 9: + op = cff_op_closepath; + break; + case 10: + op = cff_op_callsubr; + break; + case 11: + op = cff_op_return; + break; + case 12: + { + if ( ip >= limit ) + goto Syntax_Error; + v = *ip++; + + switch ( v ) + { + case 0: + op = cff_op_dotsection; + break; + case 1: /* this is actually the Type1 vstem3 operator */ + op = cff_op_vstem; + break; + case 2: /* this is actually the Type1 hstem3 operator */ + op = cff_op_hstem; + break; + case 3: + op = cff_op_and; + break; + case 4: + op = cff_op_or; + break; + case 5: + op = cff_op_not; + break; + case 6: + op = cff_op_seac; + break; + case 7: + op = cff_op_sbw; + break; + case 8: + op = cff_op_store; + break; + case 9: + op = cff_op_abs; + break; + case 10: + op = cff_op_add; + break; + case 11: + op = cff_op_sub; + break; + case 12: + op = cff_op_div; + break; + case 13: + op = cff_op_load; + break; + case 14: + op = cff_op_neg; + break; + case 15: + op = cff_op_eq; + break; + case 16: + op = cff_op_callothersubr; + break; + case 17: + op = cff_op_pop; + break; + case 18: + op = cff_op_drop; + break; + case 20: + op = cff_op_put; + break; + case 21: + op = cff_op_get; + break; + case 22: + op = cff_op_ifelse; + break; + case 23: + op = cff_op_random; + break; + case 24: + op = cff_op_mul; + break; + case 26: + op = cff_op_sqrt; + break; + case 27: + op = cff_op_dup; + break; + case 28: + op = cff_op_exch; + break; + case 29: + op = cff_op_index; + break; + case 30: + op = cff_op_roll; + break; + case 33: + op = cff_op_setcurrentpoint; + break; + case 34: + op = cff_op_hflex; + break; + case 35: + op = cff_op_flex; + break; + case 36: + op = cff_op_hflex1; + break; + case 37: + op = cff_op_flex1; + break; + default: + /* decrement ip for syntax error message */ + ip--; + } + } + break; + case 13: + op = cff_op_hsbw; + break; + case 14: + op = cff_op_endchar; + break; + case 16: + op = cff_op_blend; + break; + case 18: + op = cff_op_hstemhm; + break; + case 19: + op = cff_op_hintmask; + break; + case 20: + op = cff_op_cntrmask; + break; + case 21: + op = cff_op_rmoveto; + break; + case 22: + op = cff_op_hmoveto; + break; + case 23: + op = cff_op_vstemhm; + break; + case 24: + op = cff_op_rcurveline; + break; + case 25: + op = cff_op_rlinecurve; + break; + case 26: + op = cff_op_vvcurveto; + break; + case 27: + op = cff_op_hhcurveto; + break; + case 29: + op = cff_op_callgsubr; + break; + case 30: + op = cff_op_vhcurveto; + break; + case 31: + op = cff_op_hvcurveto; + break; + default: + break; + } + + if ( op == cff_op_unknown ) + goto Syntax_Error; + + /* check arguments */ + req_args = cff_argument_counts[op]; + if ( req_args & CFF_COUNT_CHECK_WIDTH ) + { + if ( num_args > 0 && decoder->read_width ) + { + /* If `nominal_width' is non-zero, the number is really a */ + /* difference against `nominal_width'. Else, the number here */ + /* is truly a width, not a difference against `nominal_width'. */ + /* If the font does not set `nominal_width', then */ + /* `nominal_width' defaults to zero, and so we can set */ + /* `glyph_width' to `nominal_width' plus number on the stack */ + /* -- for either case. */ + + FT_Int set_width_ok; + + + switch ( op ) + { + case cff_op_hmoveto: + case cff_op_vmoveto: + set_width_ok = num_args & 2; + break; + + case cff_op_hstem: + case cff_op_vstem: + case cff_op_hstemhm: + case cff_op_vstemhm: + case cff_op_rmoveto: + case cff_op_hintmask: + case cff_op_cntrmask: + set_width_ok = num_args & 1; + break; + + case cff_op_endchar: + /* If there is a width specified for endchar, we either have */ + /* 1 argument or 5 arguments. We like to argue. */ + set_width_ok = ( num_args == 5 ) || ( num_args == 1 ); + break; + + default: + set_width_ok = 0; + break; + } + + if ( set_width_ok ) + { + decoder->glyph_width = decoder->nominal_width + + ( stack[0] >> 16 ); + + if ( decoder->width_only ) + { + /* we only want the advance width; stop here */ + break; + } + + /* Consumed an argument. */ + num_args--; + } + } + + decoder->read_width = 0; + req_args = 0; + } + + req_args &= 0x000F; + if ( num_args < req_args ) + goto Stack_Underflow; + args -= req_args; + num_args -= req_args; + + /* At this point, `args' points to the first argument of the */ + /* operand in case `req_args' isn't zero. Otherwise, we have */ + /* to adjust `args' manually. */ + + /* Note that we only pop arguments from the stack which we */ + /* really need and can digest so that we can continue in case */ + /* of superfluous stack elements. */ + + switch ( op ) + { + case cff_op_hstem: + case cff_op_vstem: + case cff_op_hstemhm: + case cff_op_vstemhm: + /* the number of arguments is always even here */ + FT_TRACE4(( + op == cff_op_hstem ? " hstem\n" : + ( op == cff_op_vstem ? " vstem\n" : + ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) )); + + if ( hinter ) + hinter->stems( hinter->hints, + ( op == cff_op_hstem || op == cff_op_hstemhm ), + num_args / 2, + args - ( num_args & ~1 ) ); + + decoder->num_hints += num_args / 2; + args = stack; + break; + + case cff_op_hintmask: + case cff_op_cntrmask: + FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" )); + + /* implement vstem when needed -- */ + /* the specification doesn't say it, but this also works */ + /* with the 'cntrmask' operator */ + /* */ + if ( num_args > 0 ) + { + if ( hinter ) + hinter->stems( hinter->hints, + 0, + num_args / 2, + args - ( num_args & ~1 ) ); + + decoder->num_hints += num_args / 2; + } + + /* In a valid charstring there must be at least one byte */ + /* after `hintmask' or `cntrmask' (e.g., for a `return' */ + /* instruction). Additionally, there must be space for */ + /* `num_hints' bits. */ + + if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit ) + goto Syntax_Error; + + if ( hinter ) + { + if ( op == cff_op_hintmask ) + hinter->hintmask( hinter->hints, + builder->current->n_points, + decoder->num_hints, + ip ); + else + hinter->counter( hinter->hints, + decoder->num_hints, + ip ); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt maskbyte; + + + FT_TRACE4(( " (maskbytes:" )); + + for ( maskbyte = 0; + maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 ); + maskbyte++, ip++ ) + FT_TRACE4(( " 0x%02X", *ip )); + + FT_TRACE4(( ")\n" )); + } +#else + ip += ( decoder->num_hints + 7 ) >> 3; +#endif + args = stack; + break; + + case cff_op_rmoveto: + FT_TRACE4(( " rmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + x += args[-2]; + y += args[-1]; + args = stack; + break; + + case cff_op_vmoveto: + FT_TRACE4(( " vmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + y += args[-1]; + args = stack; + break; + + case cff_op_hmoveto: + FT_TRACE4(( " hmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + x += args[-1]; + args = stack; + break; + + case cff_op_rlineto: + FT_TRACE4(( " rlineto\n" )); + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, num_args / 2 ) ) + goto Fail; + + if ( num_args < 2 ) + goto Stack_Underflow; + + args -= num_args & ~1; + while ( args < decoder->top ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 1 ); + args += 2; + } + args = stack; + break; + + case cff_op_hlineto: + case cff_op_vlineto: + { + FT_Int phase = ( op == cff_op_hlineto ); + + + FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n" + : " vlineto\n" )); + + if ( num_args < 1 ) + goto Stack_Underflow; + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, num_args ) ) + goto Fail; + + args = stack; + while ( args < decoder->top ) + { + if ( phase ) + x += args[0]; + else + y += args[0]; + + if ( cff_builder_add_point1( builder, x, y ) ) + goto Fail; + + args++; + phase ^= 1; + } + args = stack; + } + break; + + case cff_op_rrcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " rrcurveto\n" )); + + if ( num_args < 6 ) + goto Stack_Underflow; + + nargs = num_args - num_args % 6; + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, nargs / 2 ) ) + goto Fail; + + args -= nargs; + while ( args < decoder->top ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[2]; + y += args[3]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[4]; + y += args[5]; + cff_builder_add_point( builder, x, y, 1 ); + args += 6; + } + args = stack; + } + break; + + case cff_op_vvcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " vvcurveto\n" )); + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 4n or 4n+1, */ + /* we reduce it to 4n+1 */ + + nargs = num_args - num_args % 4; + if ( num_args - nargs > 0 ) + nargs += 1; + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args -= nargs; + + if ( nargs & 1 ) + { + x += args[0]; + args++; + nargs--; + } + + if ( check_points( builder, 3 * ( nargs / 4 ) ) ) + goto Fail; + + while ( args < decoder->top ) + { + y += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + y += args[3]; + cff_builder_add_point( builder, x, y, 1 ); + args += 4; + } + args = stack; + } + break; + + case cff_op_hhcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " hhcurveto\n" )); + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 4n or 4n+1, */ + /* we reduce it to 4n+1 */ + + nargs = num_args - num_args % 4; + if ( num_args - nargs > 0 ) + nargs += 1; + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args -= nargs; + if ( nargs & 1 ) + { + y += args[0]; + args++; + nargs--; + } + + if ( check_points( builder, 3 * ( nargs / 4 ) ) ) + goto Fail; + + while ( args < decoder->top ) + { + x += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[3]; + cff_builder_add_point( builder, x, y, 1 ); + args += 4; + } + args = stack; + } + break; + + case cff_op_vhcurveto: + case cff_op_hvcurveto: + { + FT_Int phase; + FT_Int nargs; + + + FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n" + : " hvcurveto\n" )); + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */ + /* we reduce it to the largest one which fits */ + + nargs = num_args - num_args % 4; + if ( num_args - nargs > 0 ) + nargs += 1; + + args -= nargs; + if ( check_points( builder, ( nargs / 4 ) * 3 ) ) + goto Stack_Underflow; + + phase = ( op == cff_op_hvcurveto ); + + while ( nargs >= 4 ) + { + nargs -= 4; + if ( phase ) + { + x += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + y += args[3]; + if ( nargs == 1 ) + x += args[4]; + cff_builder_add_point( builder, x, y, 1 ); + } + else + { + y += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[3]; + if ( nargs == 1 ) + y += args[4]; + cff_builder_add_point( builder, x, y, 1 ); + } + args += 4; + phase ^= 1; + } + args = stack; + } + break; + + case cff_op_rlinecurve: + { + FT_Int num_lines; + FT_Int nargs; + + + FT_TRACE4(( " rlinecurve\n" )); + + if ( num_args < 8 ) + goto Stack_Underflow; + + nargs = num_args & ~1; + num_lines = ( nargs - 6 ) / 2; + + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, num_lines + 3 ) ) + goto Fail; + + args -= nargs; + + /* first, add the line segments */ + while ( num_lines > 0 ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 1 ); + args += 2; + num_lines--; + } + + /* then the curve */ + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[2]; + y += args[3]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[4]; + y += args[5]; + cff_builder_add_point( builder, x, y, 1 ); + args = stack; + } + break; + + case cff_op_rcurveline: + { + FT_Int num_curves; + FT_Int nargs; + + + FT_TRACE4(( " rcurveline\n" )); + + if ( num_args < 8 ) + goto Stack_Underflow; + + nargs = num_args - 2; + nargs = nargs - nargs % 6 + 2; + num_curves = ( nargs - 2 ) / 6; + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, num_curves * 3 + 2 ) ) + goto Fail; + + args -= nargs; + + /* first, add the curves */ + while ( num_curves > 0 ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[2]; + y += args[3]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[4]; + y += args[5]; + cff_builder_add_point( builder, x, y, 1 ); + args += 6; + num_curves--; + } + + /* then the final line */ + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 1 ); + args = stack; + } + break; + + case cff_op_hflex1: + { + FT_Pos start_y; + + + FT_TRACE4(( " hflex1\n" )); + + /* adding five more points: 4 control points, 1 on-curve point */ + /* -- make sure we have enough space for the start point if it */ + /* needs to be added */ + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's y position for later use */ + start_y = y; + + /* first control point */ + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 0 ); + + /* second control point */ + x += args[2]; + y += args[3]; + cff_builder_add_point( builder, x, y, 0 ); + + /* join point; on curve, with y-value the same as the last */ + /* control point's y-value */ + x += args[4]; + cff_builder_add_point( builder, x, y, 1 ); + + /* third control point, with y-value the same as the join */ + /* point's y-value */ + x += args[5]; + cff_builder_add_point( builder, x, y, 0 ); + + /* fourth control point */ + x += args[6]; + y += args[7]; + cff_builder_add_point( builder, x, y, 0 ); + + /* ending point, with y-value the same as the start */ + x += args[8]; + y = start_y; + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_hflex: + { + FT_Pos start_y; + + + FT_TRACE4(( " hflex\n" )); + + /* adding six more points; 4 control points, 2 on-curve points */ + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's y-position for later use */ + start_y = y; + + /* first control point */ + x += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + + /* second control point */ + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + + /* join point; on curve, with y-value the same as the last */ + /* control point's y-value */ + x += args[3]; + cff_builder_add_point( builder, x, y, 1 ); + + /* third control point, with y-value the same as the join */ + /* point's y-value */ + x += args[4]; + cff_builder_add_point( builder, x, y, 0 ); + + /* fourth control point */ + x += args[5]; + y = start_y; + cff_builder_add_point( builder, x, y, 0 ); + + /* ending point, with y-value the same as the start point's */ + /* y-value -- we don't add this point, though */ + x += args[6]; + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_flex1: + { + FT_Pos start_x, start_y; /* record start x, y values for */ + /* alter use */ + FT_Fixed dx = 0, dy = 0; /* used in horizontal/vertical */ + /* algorithm below */ + FT_Int horizontal, count; + FT_Fixed* temp; + + + FT_TRACE4(( " flex1\n" )); + + /* adding six more points; 4 control points, 2 on-curve points */ + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's x, y position for later use */ + start_x = x; + start_y = y; + + /* XXX: figure out whether this is supposed to be a horizontal */ + /* or vertical flex; the Type 2 specification is vague... */ + + temp = args; + + /* grab up to the last argument */ + for ( count = 5; count > 0; count-- ) + { + dx += temp[0]; + dy += temp[1]; + temp += 2; + } + + if ( dx < 0 ) + dx = -dx; + if ( dy < 0 ) + dy = -dy; + + /* strange test, but here it is... */ + horizontal = ( dx > dy ); + + for ( count = 5; count > 0; count-- ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, + (FT_Bool)( count == 3 ) ); + args += 2; + } + + /* is last operand an x- or y-delta? */ + if ( horizontal ) + { + x += args[0]; + y = start_y; + } + else + { + x = start_x; + y += args[0]; + } + + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_flex: + { + FT_UInt count; + + + FT_TRACE4(( " flex\n" )); + + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + for ( count = 6; count > 0; count-- ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, + (FT_Bool)( count == 4 || count == 1 ) ); + args += 2; + } + + args = stack; + } + break; + + case cff_op_seac: + FT_TRACE4(( " seac\n" )); + + error = cff_operator_seac( decoder, + args[0], args[1], args[2], + (FT_Int)( args[3] >> 16 ), + (FT_Int)( args[4] >> 16 ) ); + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + + /* return now! */ + FT_TRACE4(( "\n" )); + return error; + + case cff_op_endchar: + FT_TRACE4(( " endchar\n" )); + + /* We are going to emulate the seac operator. */ + if ( num_args >= 4 ) + { + /* Save glyph width so that the subglyphs don't overwrite it. */ + FT_Pos glyph_width = decoder->glyph_width; + + error = cff_operator_seac( decoder, + 0L, args[-4], args[-3], + (FT_Int)( args[-2] >> 16 ), + (FT_Int)( args[-1] >> 16 ) ); + + decoder->glyph_width = glyph_width; + } + else + { + if ( !error ) + error = CFF_Err_Ok; + + cff_builder_close_contour( builder ); + + /* close hints recording session */ + if ( hinter ) + { + if ( hinter->close( hinter->hints, + builder->current->n_points ) ) + goto Syntax_Error; + + /* apply hints to the loaded glyph outline now */ + hinter->apply( hinter->hints, + builder->current, + (PSH_Globals)builder->hints_globals, + decoder->hint_mode ); + } + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + } + + /* return now! */ + FT_TRACE4(( "\n" )); + return error; + + case cff_op_abs: + FT_TRACE4(( " abs\n" )); + + if ( args[0] < 0 ) + args[0] = -args[0]; + args++; + break; + + case cff_op_add: + FT_TRACE4(( " add\n" )); + + args[0] += args[1]; + args++; + break; + + case cff_op_sub: + FT_TRACE4(( " sub\n" )); + + args[0] -= args[1]; + args++; + break; + + case cff_op_div: + FT_TRACE4(( " div\n" )); + + args[0] = FT_DivFix( args[0], args[1] ); + args++; + break; + + case cff_op_neg: + FT_TRACE4(( " neg\n" )); + + args[0] = -args[0]; + args++; + break; + + case cff_op_random: + { + FT_Fixed Rand; + + + FT_TRACE4(( " rand\n" )); + + Rand = seed; + if ( Rand >= 0x8000L ) + Rand++; + + args[0] = Rand; + seed = FT_MulFix( seed, 0x10000L - seed ); + if ( seed == 0 ) + seed += 0x2873; + args++; + } + break; + + case cff_op_mul: + FT_TRACE4(( " mul\n" )); + + args[0] = FT_MulFix( args[0], args[1] ); + args++; + break; + + case cff_op_sqrt: + FT_TRACE4(( " sqrt\n" )); + + if ( args[0] > 0 ) + { + FT_Int count = 9; + FT_Fixed root = args[0]; + FT_Fixed new_root; + + + for (;;) + { + new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1; + if ( new_root == root || count <= 0 ) + break; + root = new_root; + } + args[0] = new_root; + } + else + args[0] = 0; + args++; + break; + + case cff_op_drop: + /* nothing */ + FT_TRACE4(( " drop\n" )); + + break; + + case cff_op_exch: + { + FT_Fixed tmp; + + + FT_TRACE4(( " exch\n" )); + + tmp = args[0]; + args[0] = args[1]; + args[1] = tmp; + args += 2; + } + break; + + case cff_op_index: + { + FT_Int idx = (FT_Int)( args[0] >> 16 ); + + + FT_TRACE4(( " index\n" )); + + if ( idx < 0 ) + idx = 0; + else if ( idx > num_args - 2 ) + idx = num_args - 2; + args[0] = args[-( idx + 1 )]; + args++; + } + break; + + case cff_op_roll: + { + FT_Int count = (FT_Int)( args[0] >> 16 ); + FT_Int idx = (FT_Int)( args[1] >> 16 ); + + + FT_TRACE4(( " roll\n" )); + + if ( count <= 0 ) + count = 1; + + args -= count; + if ( args < stack ) + goto Stack_Underflow; + + if ( idx >= 0 ) + { + while ( idx > 0 ) + { + FT_Fixed tmp = args[count - 1]; + FT_Int i; + + + for ( i = count - 2; i >= 0; i-- ) + args[i + 1] = args[i]; + args[0] = tmp; + idx--; + } + } + else + { + while ( idx < 0 ) + { + FT_Fixed tmp = args[0]; + FT_Int i; + + + for ( i = 0; i < count - 1; i++ ) + args[i] = args[i + 1]; + args[count - 1] = tmp; + idx++; + } + } + args += count; + } + break; + + case cff_op_dup: + FT_TRACE4(( " dup\n" )); + + args[1] = args[0]; + args += 2; + break; + + case cff_op_put: + { + FT_Fixed val = args[0]; + FT_Int idx = (FT_Int)( args[1] >> 16 ); + + + FT_TRACE4(( " put\n" )); + + if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS ) + decoder->buildchar[idx] = val; + } + break; + + case cff_op_get: + { + FT_Int idx = (FT_Int)( args[0] >> 16 ); + FT_Fixed val = 0; + + + FT_TRACE4(( " get\n" )); + + if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS ) + val = decoder->buildchar[idx]; + + args[0] = val; + args++; + } + break; + + case cff_op_store: + FT_TRACE4(( " store\n")); + + goto Unimplemented; + + case cff_op_load: + FT_TRACE4(( " load\n" )); + + goto Unimplemented; + + case cff_op_dotsection: + /* this operator is deprecated and ignored by the parser */ + FT_TRACE4(( " dotsection\n" )); + break; + + case cff_op_closepath: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " closepath (invalid op)\n" )); + + args = stack; + break; + + case cff_op_hsbw: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " hsbw (invalid op)\n" )); + + decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 ); + + decoder->builder.left_bearing.x = args[0]; + decoder->builder.left_bearing.y = 0; + + x = decoder->builder.pos_x + args[0]; + y = decoder->builder.pos_y; + args = stack; + break; + + case cff_op_sbw: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " sbw (invalid op)\n" )); + + decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 ); + + decoder->builder.left_bearing.x = args[0]; + decoder->builder.left_bearing.y = args[1]; + + x = decoder->builder.pos_x + args[0]; + y = decoder->builder.pos_y + args[1]; + args = stack; + break; + + case cff_op_setcurrentpoint: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " setcurrentpoint (invalid op)\n" )); + + x = decoder->builder.pos_x + args[0]; + y = decoder->builder.pos_y + args[1]; + args = stack; + break; + + case cff_op_callothersubr: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " callothersubr (invalid op)\n" )); + + /* subsequent `pop' operands should add the arguments, */ + /* this is the implementation described for `unknown' other */ + /* subroutines in the Type1 spec. */ + /* */ + /* XXX Fix return arguments (see discussion below). */ + args -= 2 + ( args[-2] >> 16 ); + if ( args < stack ) + goto Stack_Underflow; + break; + + case cff_op_pop: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " pop (invalid op)\n" )); + + /* XXX Increasing `args' is wrong: After a certain number of */ + /* `pop's we get a stack overflow. Reason for doing it is */ + /* code like this (actually found in a CFF font): */ + /* */ + /* 17 1 3 callothersubr */ + /* pop */ + /* callsubr */ + /* */ + /* Since we handle `callothersubr' as a no-op, and */ + /* `callsubr' needs at least one argument, `pop' can't be a */ + /* no-op too as it basically should be. */ + /* */ + /* The right solution would be to provide real support for */ + /* `callothersubr' as done in `t1decode.c', however, given */ + /* the fact that CFF fonts with `pop' are invalid, it is */ + /* questionable whether it is worth the time. */ + args++; + break; + + case cff_op_and: + { + FT_Fixed cond = args[0] && args[1]; + + + FT_TRACE4(( " and\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_or: + { + FT_Fixed cond = args[0] || args[1]; + + + FT_TRACE4(( " or\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_eq: + { + FT_Fixed cond = !args[0]; + + + FT_TRACE4(( " eq\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_ifelse: + { + FT_Fixed cond = ( args[2] <= args[3] ); + + + FT_TRACE4(( " ifelse\n" )); + + if ( !cond ) + args[0] = args[1]; + args++; + } + break; + + case cff_op_callsubr: + { + FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + + decoder->locals_bias ); + + + FT_TRACE4(( " callsubr(%d)\n", idx )); + + if ( idx >= decoder->num_locals ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invalid local subr index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->locals[idx]; + zone->limit = decoder->locals[idx + 1]; + zone->cursor = zone->base; + + if ( !zone->base || zone->limit == zone->base ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + } + break; + + case cff_op_callgsubr: + { + FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + + decoder->globals_bias ); + + + FT_TRACE4(( " callgsubr(%d)\n", idx )); + + if ( idx >= decoder->num_globals ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invalid global subr index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->globals[idx]; + zone->limit = decoder->globals[idx + 1]; + zone->cursor = zone->base; + + if ( !zone->base || zone->limit == zone->base ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + } + break; + + case cff_op_return: + FT_TRACE4(( " return\n" )); + + if ( decoder->zone <= decoder->zones ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " unexpected return\n" )); + goto Syntax_Error; + } + + decoder->zone--; + zone = decoder->zone; + ip = zone->cursor; + limit = zone->limit; + break; + + default: + Unimplemented: + FT_ERROR(( "Unimplemented opcode: %d", ip[-1] )); + + if ( ip[-1] == 12 ) + FT_ERROR(( " %d", ip[0] )); + FT_ERROR(( "\n" )); + + return CFF_Err_Unimplemented_Feature; + } + + decoder->top = args; + + if ( decoder->top - stack >= CFF_MAX_OPERANDS ) + goto Stack_Overflow; + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n\n" )); + + Fail: + return error; + + Syntax_Error: + FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" )); + return CFF_Err_Invalid_File_Format; + + Stack_Underflow: + FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" )); + return CFF_Err_Too_Few_Arguments; + + Stack_Overflow: + FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" )); + return CFF_Err_Stack_Overflow; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the maximum advance width of the font. It *********/ + /********** quickly processes each glyph charstring to *********/ + /********** extract the value from either a `sbw' or `seac' *********/ + /********** operator. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#if 0 /* unused until we support pure CFF fonts */ + + + FT_LOCAL_DEF( FT_Error ) + cff_compute_max_advance( TT_Face face, + FT_Int* max_advance ) + { + FT_Error error = CFF_Err_Ok; + CFF_Decoder decoder; + FT_Int glyph_index; + CFF_Font cff = (CFF_Font)face->other; + + + *max_advance = 0; + + /* Initialize load decoder */ + cff_decoder_init( &decoder, face, 0, 0, 0, 0 ); + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + /* For each glyph, parse the glyph charstring and extract */ + /* the advance width. */ + for ( glyph_index = 0; glyph_index < face->root.num_glyphs; + glyph_index++ ) + { + FT_Byte* charstring; + FT_ULong charstring_len; + + + /* now get load the unscaled outline */ + error = cff_get_glyph_data( face, glyph_index, + &charstring, &charstring_len ); + if ( !error ) + { + error = cff_decoder_prepare( &decoder, size, glyph_index ); + if ( !error ) + error = cff_decoder_parse_charstrings( &decoder, + charstring, + charstring_len ); + + cff_free_glyph_data( face, &charstring, &charstring_len ); + } + + /* ignore the error if one has occurred -- skip to next glyph */ + error = CFF_Err_Ok; + } + + *max_advance = decoder.builder.advance.x; + + return CFF_Err_Ok; + } + + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Error ) + cff_slot_load( CFF_GlyphSlot glyph, + CFF_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + CFF_Decoder decoder; + TT_Face face = (TT_Face)glyph->root.face; + FT_Bool hinting, force_scaling; + CFF_Font cff = (CFF_Font)face->extra.data; + + FT_Matrix font_matrix; + FT_Vector font_offset; + + + force_scaling = FALSE; + + /* in a CID-keyed font, consider `glyph_index' as a CID and map */ + /* it immediately to the real glyph_index -- if it isn't a */ + /* subsetted font, glyph_indices and CIDs are identical, though */ + if ( cff->top_font.font_dict.cid_registry != 0xFFFFU && + cff->charset.cids ) + { + /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */ + if ( glyph_index != 0 ) + { + glyph_index = cff_charset_cid_to_gindex( &cff->charset, + glyph_index ); + if ( glyph_index == 0 ) + return CFF_Err_Invalid_Argument; + } + } + else if ( glyph_index >= cff->num_glyphs ) + return CFF_Err_Invalid_Argument; + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + glyph->x_scale = 0x10000L; + glyph->y_scale = 0x10000L; + if ( size ) + { + glyph->x_scale = size->root.metrics.x_scale; + glyph->y_scale = size->root.metrics.y_scale; + } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* try to load embedded bitmap if any */ + /* */ + /* XXX: The convention should be emphasized in */ + /* the documents because it can be confusing. */ + if ( size ) + { + CFF_Face cff_face = (CFF_Face)size->root.face; + SFNT_Service sfnt = (SFNT_Service)cff_face->sfnt; + FT_Stream stream = cff_face->root.stream; + + + if ( size->strike_index != 0xFFFFFFFFUL && + sfnt->load_eblc && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + TT_SBit_MetricsRec metrics; + + + error = sfnt->load_sbit_image( face, + size->strike_index, + glyph_index, + (FT_Int)load_flags, + stream, + &glyph->root.bitmap, + &metrics ); + + if ( !error ) + { + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + glyph->root.metrics.width = (FT_Pos)metrics.width << 6; + glyph->root.metrics.height = (FT_Pos)metrics.height << 6; + + glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6; + glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6; + glyph->root.metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6; + + glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6; + glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6; + glyph->root.metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6; + + glyph->root.format = FT_GLYPH_FORMAT_BITMAP; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + glyph->root.bitmap_left = metrics.vertBearingX; + glyph->root.bitmap_top = metrics.vertBearingY; + } + else + { + glyph->root.bitmap_left = metrics.horiBearingX; + glyph->root.bitmap_top = metrics.horiBearingY; + } + return error; + } + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* return immediately if we only want the embedded bitmaps */ + if ( load_flags & FT_LOAD_SBITS_ONLY ) + return CFF_Err_Invalid_Argument; + + /* if we have a CID subfont, use its matrix (which has already */ + /* been multiplied with the root matrix) */ + + /* this scaling is only relevant if the PS hinter isn't active */ + if ( cff->num_subfonts ) + { + FT_ULong top_upm, sub_upm; + FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, + glyph_index ); + + if ( fd_index >= cff->num_subfonts ) + fd_index = cff->num_subfonts - 1; + + top_upm = cff->top_font.font_dict.units_per_em; + sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em; + + + font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix; + font_offset = cff->subfonts[fd_index]->font_dict.font_offset; + + if ( top_upm != sub_upm ) + { + glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm ); + glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm ); + + force_scaling = TRUE; + } + } + else + { + font_matrix = cff->top_font.font_dict.font_matrix; + font_offset = cff->top_font.font_dict.font_offset; + } + + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 && + ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); + + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */ + + { + FT_Byte* charstring; + FT_ULong charstring_len; + + + cff_decoder_init( &decoder, face, size, glyph, hinting, + FT_LOAD_TARGET_MODE( load_flags ) ); + + if ( load_flags & FT_LOAD_ADVANCE_ONLY ) + decoder.width_only = TRUE; + + decoder.builder.no_recurse = + (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE ); + + /* now load the unscaled outline */ + error = cff_get_glyph_data( face, glyph_index, + &charstring, &charstring_len ); + if ( error ) + goto Glyph_Build_Finished; + + error = cff_decoder_prepare( &decoder, size, glyph_index ); + if ( error ) + goto Glyph_Build_Finished; + + error = cff_decoder_parse_charstrings( &decoder, + charstring, + charstring_len ); + + cff_free_glyph_data( face, &charstring, charstring_len ); + + if ( error ) + goto Glyph_Build_Finished; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* Control data and length may not be available for incremental */ + /* fonts. */ + if ( face->root.internal->incremental_interface ) + { + glyph->root.control_data = 0; + glyph->root.control_len = 0; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + /* We set control_data and control_len if charstrings is loaded. */ + /* See how charstring loads at cff_index_access_element() in */ + /* cffload.c. */ + { + CFF_Index csindex = &cff->charstrings_index; + + + if ( csindex->offsets ) + { + glyph->root.control_data = csindex->bytes + + csindex->offsets[glyph_index] - 1; + glyph->root.control_len = charstring_len; + } + } + + Glyph_Build_Finished: + /* save new glyph tables, if no error */ + if ( !error ) + cff_builder_done( &decoder.builder ); + /* XXX: anything to do for broken glyph entry? */ + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* Incremental fonts can optionally override the metrics. */ + if ( !error && + face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = decoder.builder.left_bearing.x; + metrics.bearing_y = 0; + metrics.advance = decoder.builder.advance.x; + metrics.advance_v = decoder.builder.advance.y; + + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &metrics ); + + decoder.builder.left_bearing.x = metrics.bearing_x; + decoder.builder.advance.x = metrics.advance; + decoder.builder.advance.y = metrics.advance_v; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + if ( !error ) + { + /* Now, set the metrics -- this is rather simple, as */ + /* the left side bearing is the xMin, and the top side */ + /* bearing the yMax. */ + + /* For composite glyphs, return only left side bearing and */ + /* advance width. */ + if ( load_flags & FT_LOAD_NO_RECURSE ) + { + FT_Slot_Internal internal = glyph->root.internal; + + + glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x; + glyph->root.metrics.horiAdvance = decoder.glyph_width; + internal->glyph_matrix = font_matrix; + internal->glyph_delta = font_offset; + internal->glyph_transformed = 1; + } + else + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &glyph->root.metrics; + FT_Vector advance; + FT_Bool has_vertical_info; + + + /* copy the _unscaled_ advance width */ + metrics->horiAdvance = decoder.glyph_width; + glyph->root.linearHoriAdvance = decoder.glyph_width; + glyph->root.internal->glyph_transformed = 0; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + has_vertical_info = FT_BOOL( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 && + face->vertical.long_metrics ); +#else + has_vertical_info = FT_BOOL( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 ); +#endif + + /* get the vertical metrics from the vtmx table if we have one */ + if ( has_vertical_info ) + { + FT_Short vertBearingY = 0; + FT_UShort vertAdvance = 0; + + + ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, + glyph_index, + &vertBearingY, + &vertAdvance ); + metrics->vertBearingY = vertBearingY; + metrics->vertAdvance = vertAdvance; + } + else + { + /* make up vertical ones */ + if ( face->os2.version != 0xFFFFU ) + metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + else + metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender - + face->horizontal.Descender ); + } + + glyph->root.linearVertAdvance = metrics->vertAdvance; + + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; + + glyph->root.outline.flags = 0; + if ( size && size->root.metrics.y_ppem < 24 ) + glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL; + + if ( !( font_matrix.xx == 0x10000L && + font_matrix.yy == 0x10000L && + font_matrix.xy == 0 && + font_matrix.yx == 0 ) ) + FT_Outline_Transform( &glyph->root.outline, &font_matrix ); + + if ( !( font_offset.x == 0 && + font_offset.y == 0 ) ) + FT_Outline_Translate( &glyph->root.outline, + font_offset.x, font_offset.y ); + + advance.x = metrics->horiAdvance; + advance.y = 0; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->horiAdvance = advance.x + font_offset.x; + + advance.x = 0; + advance.y = metrics->vertAdvance; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->vertAdvance = advance.y + font_offset.y; + + if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling ) + { + /* scale the outline and the metrics */ + FT_Int n; + FT_Outline* cur = &glyph->root.outline; + FT_Vector* vec = cur->points; + FT_Fixed x_scale = glyph->x_scale; + FT_Fixed y_scale = glyph->y_scale; + + + /* First of all, scale the points */ + if ( !hinting || !decoder.builder.hints_funcs ) + for ( n = cur->n_points; n > 0; n--, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + + if ( has_vertical_info ) + metrics->vertBearingX = metrics->horiBearingX - + metrics->horiAdvance / 2; + else + { + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + } + } + + return error; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffgload.h b/android/jni/ndk_modules/freetype/src/cff/cffgload.h new file mode 100644 index 00000000..38937be5 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffgload.h @@ -0,0 +1,201 @@ +/***************************************************************************/ +/* */ +/* cffgload.h */ +/* */ +/* OpenType Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFGLOAD_H__ +#define __CFFGLOAD_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include "cffobjs.h" + + +FT_BEGIN_HEADER + + +#define CFF_MAX_OPERANDS 48 +#define CFF_MAX_SUBRS_CALLS 32 +#define CFF_MAX_TRANS_ELEMENTS 32 + + + /*************************************************************************/ + /* */ + /* <Structure> */ + /* CFF_Builder */ + /* */ + /* <Description> */ + /* A structure used during glyph loading to store its outline. */ + /* */ + /* <Fields> */ + /* memory :: The current memory object. */ + /* */ + /* face :: The current face object. */ + /* */ + /* glyph :: The current glyph slot. */ + /* */ + /* loader :: The current glyph loader. */ + /* */ + /* base :: The base glyph outline. */ + /* */ + /* current :: The current glyph outline. */ + /* */ + /* pos_x :: The horizontal translation (if composite glyph). */ + /* */ + /* pos_y :: The vertical translation (if composite glyph). */ + /* */ + /* left_bearing :: The left side bearing point. */ + /* */ + /* advance :: The horizontal advance vector. */ + /* */ + /* bbox :: Unused. */ + /* */ + /* path_begun :: A flag which indicates that a new path has begun. */ + /* */ + /* load_points :: If this flag is not set, no points are loaded. */ + /* */ + /* no_recurse :: Set but not used. */ + /* */ + /* metrics_only :: A boolean indicating that we only want to compute */ + /* the metrics of a given glyph, not load all of its */ + /* points. */ + /* */ + /* hints_funcs :: Auxiliary pointer for hinting. */ + /* */ + /* hints_globals :: Auxiliary pointer for hinting. */ + /* */ + typedef struct CFF_Builder_ + { + FT_Memory memory; + TT_Face face; + CFF_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Pos pos_x; + FT_Pos pos_y; + + FT_Vector left_bearing; + FT_Vector advance; + + FT_BBox bbox; /* bounding box */ + FT_Bool path_begun; + FT_Bool load_points; + FT_Bool no_recurse; + + FT_Bool metrics_only; + + void* hints_funcs; /* hinter-specific */ + void* hints_globals; /* hinter-specific */ + + } CFF_Builder; + + + /* execution context charstring zone */ + + typedef struct CFF_Decoder_Zone_ + { + FT_Byte* base; + FT_Byte* limit; + FT_Byte* cursor; + + } CFF_Decoder_Zone; + + + typedef struct CFF_Decoder_ + { + CFF_Builder builder; + CFF_Font cff; + + FT_Fixed stack[CFF_MAX_OPERANDS + 1]; + FT_Fixed* top; + + CFF_Decoder_Zone zones[CFF_MAX_SUBRS_CALLS + 1]; + CFF_Decoder_Zone* zone; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + FT_Pos glyph_width; + FT_Pos nominal_width; + + FT_Bool read_width; + FT_Bool width_only; + FT_Int num_hints; + FT_Fixed buildchar[CFF_MAX_TRANS_ELEMENTS]; + + FT_UInt num_locals; + FT_UInt num_globals; + + FT_Int locals_bias; + FT_Int globals_bias; + + FT_Byte** locals; + FT_Byte** globals; + + FT_Byte** glyph_names; /* for pure CFF fonts only */ + FT_UInt num_glyphs; /* number of glyphs in font */ + + FT_Render_Mode hint_mode; + + FT_Bool seac; + + } CFF_Decoder; + + + FT_LOCAL( void ) + cff_decoder_init( CFF_Decoder* decoder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot slot, + FT_Bool hinting, + FT_Render_Mode hint_mode ); + + FT_LOCAL( FT_Error ) + cff_decoder_prepare( CFF_Decoder* decoder, + CFF_Size size, + FT_UInt glyph_index ); + +#if 0 /* unused until we support pure CFF fonts */ + + /* Compute the maximum advance width of a font through quick parsing */ + FT_LOCAL( FT_Error ) + cff_compute_max_advance( TT_Face face, + FT_Int* max_advance ); + +#endif /* 0 */ + + FT_LOCAL( FT_Error ) + cff_decoder_parse_charstrings( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ); + + FT_LOCAL( FT_Error ) + cff_slot_load( CFF_GlyphSlot glyph, + CFF_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __CFFGLOAD_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffload.c b/android/jni/ndk_modules/freetype/src/cff/cffload.c new file mode 100644 index 00000000..42e77309 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffload.c @@ -0,0 +1,1671 @@ +/***************************************************************************/ +/* */ +/* cffload.c */ +/* */ +/* OpenType and CFF data/program tables loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include FT_TYPE1_TABLES_H + +#include "cffload.h" +#include "cffparse.h" + +#include "cfferrs.h" + + +#if 1 + + static const FT_UShort cff_isoadobe_charset[229] = + { + 0, 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 + }; + + static const FT_UShort cff_expert_charset[166] = + { + 0, 1, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, + 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 109, 110, + 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 158, 155, 163, 319, + 320, 321, 322, 323, 324, 325, 326, 150, + 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378 + }; + + static const FT_UShort cff_expertsubset_charset[87] = + { + 0, 1, 231, 232, 235, 236, 237, 238, + 13, 14, 15, 99, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 27, 28, + 249, 250, 251, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, + 266, 109, 110, 267, 268, 269, 270, 272, + 300, 301, 302, 305, 314, 315, 158, 155, + 163, 320, 321, 322, 323, 324, 325, 326, + 150, 164, 169, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346 + }; + + static const FT_UShort cff_standard_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 115, 116, + 117, 118, 119, 120, 121, 122, 0, 123, + 0, 124, 125, 126, 127, 128, 129, 130, + 131, 0, 132, 133, 0, 134, 135, 136, + 137, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 138, 0, 139, 0, 0, 0, 0, + 140, 141, 142, 143, 0, 0, 0, 0, + 0, 144, 0, 0, 0, 145, 0, 0, + 146, 147, 148, 149, 0, 0, 0, 0 + }; + + static const FT_UShort cff_expert_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 229, 230, 0, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, + 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 252, + 0, 253, 254, 255, 256, 257, 0, 0, + 0, 258, 0, 0, 259, 260, 261, 262, + 0, 0, 263, 264, 265, 0, 266, 109, + 110, 267, 268, 269, 0, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 304, 305, 306, 0, 0, 307, 308, + 309, 310, 311, 0, 312, 0, 0, 312, + 0, 0, 314, 315, 0, 0, 316, 317, + 318, 0, 0, 0, 158, 155, 163, 319, + 320, 321, 322, 323, 324, 325, 0, 0, + 326, 150, 164, 169, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378 + }; + +#endif /* 1 */ + + + FT_LOCAL_DEF( FT_UShort ) + cff_get_standard_encoding( FT_UInt charcode ) + { + return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode] + : 0 ); + } + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffload + + + /* read an offset from the index's stream current position */ + static FT_ULong + cff_index_read_offset( CFF_Index idx, + FT_Error *errorp ) + { + FT_Error error; + FT_Stream stream = idx->stream; + FT_Byte tmp[4]; + FT_ULong result = 0; + + + if ( !FT_STREAM_READ( tmp, idx->off_size ) ) + { + FT_Int nn; + + + for ( nn = 0; nn < idx->off_size; nn++ ) + result = ( result << 8 ) | tmp[nn]; + } + + *errorp = error; + return result; + } + + + static FT_Error + cff_index_init( CFF_Index idx, + FT_Stream stream, + FT_Bool load ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UShort count; + + + FT_MEM_ZERO( idx, sizeof ( *idx ) ); + + idx->stream = stream; + idx->start = FT_STREAM_POS(); + if ( !FT_READ_USHORT( count ) && + count > 0 ) + { + FT_Byte offsize; + FT_ULong size; + + + /* there is at least one element; read the offset size, */ + /* then access the offset table to compute the index's total size */ + if ( FT_READ_BYTE( offsize ) ) + goto Exit; + + if ( offsize < 1 || offsize > 4 ) + { + error = CFF_Err_Invalid_Table; + goto Exit; + } + + idx->count = count; + idx->off_size = offsize; + size = (FT_ULong)( count + 1 ) * offsize; + + idx->data_offset = idx->start + 3 + size; + + if ( FT_STREAM_SKIP( size - offsize ) ) + goto Exit; + + size = cff_index_read_offset( idx, &error ); + if ( error ) + goto Exit; + + if ( size == 0 ) + { + error = CFF_Err_Invalid_Table; + goto Exit; + } + + idx->data_size = --size; + + if ( load ) + { + /* load the data */ + if ( FT_FRAME_EXTRACT( size, idx->bytes ) ) + goto Exit; + } + else + { + /* skip the data */ + if ( FT_STREAM_SKIP( size ) ) + goto Exit; + } + } + + Exit: + if ( error ) + FT_FREE( idx->offsets ); + + return error; + } + + + static void + cff_index_done( CFF_Index idx ) + { + if ( idx->stream ) + { + FT_Stream stream = idx->stream; + FT_Memory memory = stream->memory; + + + if ( idx->bytes ) + FT_FRAME_RELEASE( idx->bytes ); + + FT_FREE( idx->offsets ); + FT_MEM_ZERO( idx, sizeof ( *idx ) ); + } + } + + + static FT_Error + cff_index_load_offsets( CFF_Index idx ) + { + FT_Error error = CFF_Err_Ok; + FT_Stream stream = idx->stream; + FT_Memory memory = stream->memory; + + + if ( idx->count > 0 && idx->offsets == NULL ) + { + FT_Byte offsize = idx->off_size; + FT_ULong data_size; + FT_Byte* p; + FT_Byte* p_end; + FT_ULong* poff; + + + data_size = (FT_ULong)( idx->count + 1 ) * offsize; + + if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) || + FT_STREAM_SEEK( idx->start + 3 ) || + FT_FRAME_ENTER( data_size ) ) + goto Exit; + + poff = idx->offsets; + p = (FT_Byte*)stream->cursor; + p_end = p + data_size; + + switch ( offsize ) + { + case 1: + for ( ; p < p_end; p++, poff++ ) + poff[0] = p[0]; + break; + + case 2: + for ( ; p < p_end; p += 2, poff++ ) + poff[0] = FT_PEEK_USHORT( p ); + break; + + case 3: + for ( ; p < p_end; p += 3, poff++ ) + poff[0] = FT_PEEK_OFF3( p ); + break; + + default: + for ( ; p < p_end; p += 4, poff++ ) + poff[0] = FT_PEEK_ULONG( p ); + } + + FT_FRAME_EXIT(); + } + + Exit: + if ( error ) + FT_FREE( idx->offsets ); + + return error; + } + + + /* Allocate a table containing pointers to an index's elements. */ + /* The `pool' argument makes this function convert the index */ + /* entries to C-style strings (this is, NULL-terminated). */ + static FT_Error + cff_index_get_pointers( CFF_Index idx, + FT_Byte*** table, + FT_Byte** pool ) + { + FT_Error error = CFF_Err_Ok; + FT_Memory memory = idx->stream->memory; + FT_Byte** t; + FT_Byte* new_bytes = NULL; + + + *table = NULL; + + if ( idx->offsets == NULL ) + { + error = cff_index_load_offsets( idx ); + if ( error ) + goto Exit; + } + + if ( idx->count > 0 && + !FT_NEW_ARRAY( t, idx->count + 1 ) && + ( !pool || !FT_ALLOC( new_bytes, + idx->data_size + idx->count ) ) ) + { + FT_ULong n, cur_offset; + FT_ULong extra = 0; + FT_Byte* org_bytes = idx->bytes; + + + /* at this point, `idx->offsets' can't be NULL */ + cur_offset = idx->offsets[0] - 1; + + /* sanity check */ + if ( cur_offset >= idx->data_size ) + { + FT_TRACE0(( "cff_index_get_pointers:" + " invalid first offset value %d set to zero\n", + cur_offset )); + cur_offset = 0; + } + + if ( !pool ) + t[0] = org_bytes + cur_offset; + else + t[0] = new_bytes + cur_offset; + + for ( n = 1; n <= idx->count; n++ ) + { + FT_ULong next_offset = idx->offsets[n] - 1; + + + /* empty slot + two sanity checks for invalid offset tables */ + if ( next_offset == 0 || + next_offset < cur_offset || + ( next_offset >= idx->data_size && n < idx->count ) ) + next_offset = cur_offset; + + if ( !pool ) + t[n] = org_bytes + next_offset; + else + { + t[n] = new_bytes + next_offset + extra; + + if ( next_offset != cur_offset ) + { + FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] ); + t[n][0] = '\0'; + t[n] += 1; + extra++; + } + } + + cur_offset = next_offset; + } + *table = t; + + if ( pool ) + *pool = new_bytes; + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_index_access_element( CFF_Index idx, + FT_UInt element, + FT_Byte** pbytes, + FT_ULong* pbyte_len ) + { + FT_Error error = CFF_Err_Ok; + + + if ( idx && idx->count > element ) + { + /* compute start and end offsets */ + FT_Stream stream = idx->stream; + FT_ULong off1, off2 = 0; + + + /* load offsets from file or the offset table */ + if ( !idx->offsets ) + { + FT_ULong pos = element * idx->off_size; + + + if ( FT_STREAM_SEEK( idx->start + 3 + pos ) ) + goto Exit; + + off1 = cff_index_read_offset( idx, &error ); + if ( error ) + goto Exit; + + if ( off1 != 0 ) + { + do + { + element++; + off2 = cff_index_read_offset( idx, &error ); + } + while ( off2 == 0 && element < idx->count ); + } + } + else /* use offsets table */ + { + off1 = idx->offsets[element]; + if ( off1 ) + { + do + { + element++; + off2 = idx->offsets[element]; + + } while ( off2 == 0 && element < idx->count ); + } + } + + /* access element */ + if ( off1 && off2 > off1 ) + { + *pbyte_len = off2 - off1; + + if ( idx->bytes ) + { + /* this index was completely loaded in memory, that's easy */ + *pbytes = idx->bytes + off1 - 1; + } + else + { + /* this index is still on disk/file, access it through a frame */ + if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) || + FT_FRAME_EXTRACT( off2 - off1, *pbytes ) ) + goto Exit; + } + } + else + { + /* empty index element */ + *pbytes = 0; + *pbyte_len = 0; + } + } + else + error = CFF_Err_Invalid_Argument; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cff_index_forget_element( CFF_Index idx, + FT_Byte** pbytes ) + { + if ( idx->bytes == 0 ) + { + FT_Stream stream = idx->stream; + + + FT_FRAME_RELEASE( *pbytes ); + } + } + + + /* get an entry from Name INDEX */ + FT_LOCAL_DEF( FT_String* ) + cff_index_get_name( CFF_Font font, + FT_UInt element ) + { + CFF_Index idx = &font->name_index; + FT_Memory memory = idx->stream->memory; + FT_Byte* bytes; + FT_ULong byte_len; + FT_Error error; + FT_String* name = 0; + + + error = cff_index_access_element( idx, element, &bytes, &byte_len ); + if ( error ) + goto Exit; + + if ( !FT_ALLOC( name, byte_len + 1 ) ) + { + FT_MEM_COPY( name, bytes, byte_len ); + name[byte_len] = 0; + } + cff_index_forget_element( idx, &bytes ); + + Exit: + return name; + } + + + /* get an entry from String INDEX */ + FT_LOCAL_DEF( FT_String* ) + cff_index_get_string( CFF_Font font, + FT_UInt element ) + { + return ( element < font->num_strings ) + ? (FT_String*)font->strings[element] + : NULL; + } + + + FT_LOCAL_DEF( FT_String* ) + cff_index_get_sid_string( CFF_Font font, + FT_UInt sid ) + { + /* value 0xFFFFU indicates a missing dictionary entry */ + if ( sid == 0xFFFFU ) + return NULL; + + /* if it is not a standard string, return it */ + if ( sid > 390 ) + return cff_index_get_string( font, sid - 391 ); + + /* CID-keyed CFF fonts don't have glyph names */ + if ( !font->psnames ) + return NULL; + + /* this is a standard string */ + return (FT_String *)font->psnames->adobe_std_strings( sid ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** FD Select table support ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + + + static void + CFF_Done_FD_Select( CFF_FDSelect fdselect, + FT_Stream stream ) + { + if ( fdselect->data ) + FT_FRAME_RELEASE( fdselect->data ); + + fdselect->data_size = 0; + fdselect->format = 0; + fdselect->range_count = 0; + } + + + static FT_Error + CFF_Load_FD_Select( CFF_FDSelect fdselect, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong offset ) + { + FT_Error error; + FT_Byte format; + FT_UInt num_ranges; + + + /* read format */ + if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) ) + goto Exit; + + fdselect->format = format; + fdselect->cache_count = 0; /* clear cache */ + + switch ( format ) + { + case 0: /* format 0, that's simple */ + fdselect->data_size = num_glyphs; + goto Load_Data; + + case 3: /* format 3, a tad more complex */ + if ( FT_READ_USHORT( num_ranges ) ) + goto Exit; + + fdselect->data_size = num_ranges * 3 + 2; + + Load_Data: + if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) ) + goto Exit; + break; + + default: /* hmm... that's wrong */ + error = CFF_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Byte ) + cff_fd_select_get( CFF_FDSelect fdselect, + FT_UInt glyph_index ) + { + FT_Byte fd = 0; + + + switch ( fdselect->format ) + { + case 0: + fd = fdselect->data[glyph_index]; + break; + + case 3: + /* first, compare to cache */ + if ( (FT_UInt)( glyph_index - fdselect->cache_first ) < + fdselect->cache_count ) + { + fd = fdselect->cache_fd; + break; + } + + /* then, lookup the ranges array */ + { + FT_Byte* p = fdselect->data; + FT_Byte* p_limit = p + fdselect->data_size; + FT_Byte fd2; + FT_UInt first, limit; + + + first = FT_NEXT_USHORT( p ); + do + { + if ( glyph_index < first ) + break; + + fd2 = *p++; + limit = FT_NEXT_USHORT( p ); + + if ( glyph_index < limit ) + { + fd = fd2; + + /* update cache */ + fdselect->cache_first = first; + fdselect->cache_count = limit-first; + fdselect->cache_fd = fd2; + break; + } + first = limit; + + } while ( p < p_limit ); + } + break; + + default: + ; + } + + return fd; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** CFF font support ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + cff_charset_compute_cids( CFF_Charset charset, + FT_UInt num_glyphs, + FT_Memory memory ) + { + FT_Error error = CFF_Err_Ok; + FT_UInt i; + FT_Long j; + FT_UShort max_cid = 0; + + + if ( charset->max_cid > 0 ) + goto Exit; + + for ( i = 0; i < num_glyphs; i++ ) + if ( charset->sids[i] > max_cid ) + max_cid = charset->sids[i]; + max_cid++; + + if ( FT_NEW_ARRAY( charset->cids, max_cid ) ) + goto Exit; + + /* When multiple GIDs map to the same CID, we choose the lowest */ + /* GID. This is not described in any spec, but it matches the */ + /* behaviour of recent Acroread versions. */ + for ( j = num_glyphs - 1; j >= 0 ; j-- ) + charset->cids[charset->sids[j]] = (FT_UShort)j; + + charset->max_cid = max_cid; + charset->num_glyphs = num_glyphs; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_UInt ) + cff_charset_cid_to_gindex( CFF_Charset charset, + FT_UInt cid ) + { + FT_UInt result = 0; + + + if ( cid < charset->max_cid ) + result = charset->cids[cid]; + + return result; + } + + + static void + cff_charset_free_cids( CFF_Charset charset, + FT_Memory memory ) + { + FT_FREE( charset->cids ); + charset->max_cid = 0; + } + + + static void + cff_charset_done( CFF_Charset charset, + FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + cff_charset_free_cids( charset, memory ); + + FT_FREE( charset->sids ); + charset->format = 0; + charset->offset = 0; + } + + + static FT_Error + cff_charset_load( CFF_Charset charset, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset, + FT_Bool invert ) + { + FT_Memory memory = stream->memory; + FT_Error error = CFF_Err_Ok; + FT_UShort glyph_sid; + + + /* If the the offset is greater than 2, we have to parse the */ + /* charset table. */ + if ( offset > 2 ) + { + FT_UInt j; + + + charset->offset = base_offset + offset; + + /* Get the format of the table. */ + if ( FT_STREAM_SEEK( charset->offset ) || + FT_READ_BYTE( charset->format ) ) + goto Exit; + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* assign the .notdef glyph */ + charset->sids[0] = 0; + + switch ( charset->format ) + { + case 0: + if ( num_glyphs > 0 ) + { + if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) ) + goto Exit; + + for ( j = 1; j < num_glyphs; j++ ) + { + FT_UShort sid = FT_GET_USHORT(); + + + /* this constant is given in the CFF specification */ + if ( sid < 65000L ) + charset->sids[j] = sid; + else + { + FT_TRACE0(( "cff_charset_load:" + " invalid SID value %d set to zero\n", sid )); + charset->sids[j] = 0; + } + } + + FT_FRAME_EXIT(); + } + break; + + case 1: + case 2: + { + FT_UInt nleft; + FT_UInt i; + + + j = 1; + + while ( j < num_glyphs ) + { + /* Read the first glyph sid of the range. */ + if ( FT_READ_USHORT( glyph_sid ) ) + goto Exit; + + /* Read the number of glyphs in the range. */ + if ( charset->format == 2 ) + { + if ( FT_READ_USHORT( nleft ) ) + goto Exit; + } + else + { + if ( FT_READ_BYTE( nleft ) ) + goto Exit; + } + + /* check whether the range contains at least one valid glyph; */ + /* the constant is given in the CFF specification */ + if ( glyph_sid >= 65000L ) + { + FT_ERROR(( "cff_charset_load: invalid SID range\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* try to rescue some of the SIDs if `nleft' is too large */ + if ( nleft > 65000L - 1L || glyph_sid >= 65000L - nleft ) + { + FT_ERROR(( "cff_charset_load: invalid SID range trimmed\n" )); + nleft = ( FT_UInt )( 65000L - 1L - glyph_sid ); + } + + /* Fill in the range of sids -- `nleft + 1' glyphs. */ + for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ ) + charset->sids[j] = glyph_sid; + } + } + break; + + default: + FT_ERROR(( "cff_charset_load: invalid table format\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + } + else + { + /* Parse default tables corresponding to offset == 0, 1, or 2. */ + /* CFF specification intimates the following: */ + /* */ + /* In order to use a predefined charset, the following must be */ + /* true: The charset constructed for the glyphs in the font's */ + /* charstrings dictionary must match the predefined charset in */ + /* the first num_glyphs. */ + + charset->offset = offset; /* record charset type */ + + switch ( (FT_UInt)offset ) + { + case 0: + if ( num_glyphs > 229 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe ISO-Latin)\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs ); + + break; + + case 1: + if ( num_glyphs > 166 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe Expert)\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs ); + + break; + + case 2: + if ( num_glyphs > 87 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe Expert Subset)\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs ); + + break; + + default: + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + } + + /* we have to invert the `sids' array for subsetted CID-keyed fonts */ + if ( invert ) + error = cff_charset_compute_cids( charset, num_glyphs, memory ); + + Exit: + /* Clean up if there was an error. */ + if ( error ) + { + FT_FREE( charset->sids ); + FT_FREE( charset->cids ); + charset->format = 0; + charset->offset = 0; + charset->sids = 0; + } + + return error; + } + + + static void + cff_encoding_done( CFF_Encoding encoding ) + { + encoding->format = 0; + encoding->offset = 0; + encoding->count = 0; + } + + + static FT_Error + cff_encoding_load( CFF_Encoding encoding, + CFF_Charset charset, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset ) + { + FT_Error error = CFF_Err_Ok; + FT_UInt count; + FT_UInt j; + FT_UShort glyph_sid; + FT_UInt glyph_code; + + + /* Check for charset->sids. If we do not have this, we fail. */ + if ( !charset->sids ) + { + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Zero out the code to gid/sid mappings. */ + for ( j = 0; j < 256; j++ ) + { + encoding->sids [j] = 0; + encoding->codes[j] = 0; + } + + /* Note: The encoding table in a CFF font is indexed by glyph index; */ + /* the first encoded glyph index is 1. Hence, we read the character */ + /* code (`glyph_code') at index j and make the assignment: */ + /* */ + /* encoding->codes[glyph_code] = j + 1 */ + /* */ + /* We also make the assignment: */ + /* */ + /* encoding->sids[glyph_code] = charset->sids[j + 1] */ + /* */ + /* This gives us both a code to GID and a code to SID mapping. */ + + if ( offset > 1 ) + { + encoding->offset = base_offset + offset; + + /* we need to parse the table to determine its size */ + if ( FT_STREAM_SEEK( encoding->offset ) || + FT_READ_BYTE( encoding->format ) || + FT_READ_BYTE( count ) ) + goto Exit; + + switch ( encoding->format & 0x7F ) + { + case 0: + { + FT_Byte* p; + + + /* By convention, GID 0 is always ".notdef" and is never */ + /* coded in the font. Hence, the number of codes found */ + /* in the table is `count+1'. */ + /* */ + encoding->count = count + 1; + + if ( FT_FRAME_ENTER( count ) ) + goto Exit; + + p = (FT_Byte*)stream->cursor; + + for ( j = 1; j <= count; j++ ) + { + glyph_code = *p++; + + /* Make sure j is not too big. */ + if ( j < num_glyphs ) + { + /* Assign code to GID mapping. */ + encoding->codes[glyph_code] = (FT_UShort)j; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = charset->sids[j]; + } + } + + FT_FRAME_EXIT(); + } + break; + + case 1: + { + FT_UInt nleft; + FT_UInt i = 1; + FT_UInt k; + + + encoding->count = 0; + + /* Parse the Format1 ranges. */ + for ( j = 0; j < count; j++, i += nleft ) + { + /* Read the first glyph code of the range. */ + if ( FT_READ_BYTE( glyph_code ) ) + goto Exit; + + /* Read the number of codes in the range. */ + if ( FT_READ_BYTE( nleft ) ) + goto Exit; + + /* Increment nleft, so we read `nleft + 1' codes/sids. */ + nleft++; + + /* compute max number of character codes */ + if ( (FT_UInt)nleft > encoding->count ) + encoding->count = nleft; + + /* Fill in the range of codes/sids. */ + for ( k = i; k < nleft + i; k++, glyph_code++ ) + { + /* Make sure k is not too big. */ + if ( k < num_glyphs && glyph_code < 256 ) + { + /* Assign code to GID mapping. */ + encoding->codes[glyph_code] = (FT_UShort)k; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = charset->sids[k]; + } + } + } + + /* simple check; one never knows what can be found in a font */ + if ( encoding->count > 256 ) + encoding->count = 256; + } + break; + + default: + FT_ERROR(( "cff_encoding_load: invalid table format\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Parse supplemental encodings, if any. */ + if ( encoding->format & 0x80 ) + { + FT_UInt gindex; + + + /* count supplements */ + if ( FT_READ_BYTE( count ) ) + goto Exit; + + for ( j = 0; j < count; j++ ) + { + /* Read supplemental glyph code. */ + if ( FT_READ_BYTE( glyph_code ) ) + goto Exit; + + /* Read the SID associated with this glyph code. */ + if ( FT_READ_USHORT( glyph_sid ) ) + goto Exit; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = glyph_sid; + + /* First, look up GID which has been assigned to */ + /* SID glyph_sid. */ + for ( gindex = 0; gindex < num_glyphs; gindex++ ) + { + if ( charset->sids[gindex] == glyph_sid ) + { + encoding->codes[glyph_code] = (FT_UShort)gindex; + break; + } + } + } + } + } + else + { + /* We take into account the fact a CFF font can use a predefined */ + /* encoding without containing all of the glyphs encoded by this */ + /* encoding (see the note at the end of section 12 in the CFF */ + /* specification). */ + + switch ( (FT_UInt)offset ) + { + case 0: + /* First, copy the code to SID mapping. */ + FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 ); + goto Populate; + + case 1: + /* First, copy the code to SID mapping. */ + FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 ); + + Populate: + /* Construct code to GID mapping from code to SID mapping */ + /* and charset. */ + + encoding->count = 0; + + error = cff_charset_compute_cids( charset, num_glyphs, + stream->memory ); + if ( error ) + goto Exit; + + for ( j = 0; j < 256; j++ ) + { + FT_UInt sid = encoding->sids[j]; + FT_UInt gid = 0; + + + if ( sid ) + gid = cff_charset_cid_to_gindex( charset, sid ); + + if ( gid != 0 ) + { + encoding->codes[j] = (FT_UShort)gid; + + if ( encoding->count < j + 1 ) + encoding->count = j + 1; + } + else + { + encoding->codes[j] = 0; + encoding->sids [j] = 0; + } + } + break; + + default: + FT_ERROR(( "cff_encoding_load: invalid table format\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + } + + Exit: + + /* Clean up if there was an error. */ + return error; + } + + + static FT_Error + cff_subfont_load( CFF_SubFont font, + CFF_Index idx, + FT_UInt font_index, + FT_Stream stream, + FT_ULong base_offset, + FT_Library library ) + { + FT_Error error; + CFF_ParserRec parser; + FT_Byte* dict = NULL; + FT_ULong dict_len; + CFF_FontRecDict top = &font->font_dict; + CFF_Private priv = &font->private_dict; + + + cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library ); + + /* set defaults */ + FT_MEM_ZERO( top, sizeof ( *top ) ); + + top->underline_position = -100L << 16; + top->underline_thickness = 50L << 16; + top->charstring_type = 2; + top->font_matrix.xx = 0x10000L; + top->font_matrix.yy = 0x10000L; + top->cid_count = 8720; + + /* we use the implementation specific SID value 0xFFFF to indicate */ + /* missing entries */ + top->version = 0xFFFFU; + top->notice = 0xFFFFU; + top->copyright = 0xFFFFU; + top->full_name = 0xFFFFU; + top->family_name = 0xFFFFU; + top->weight = 0xFFFFU; + top->embedded_postscript = 0xFFFFU; + + top->cid_registry = 0xFFFFU; + top->cid_ordering = 0xFFFFU; + top->cid_font_name = 0xFFFFU; + + error = cff_index_access_element( idx, font_index, &dict, &dict_len ); + if ( !error ) + error = cff_parser_run( &parser, dict, dict + dict_len ); + + cff_index_forget_element( idx, &dict ); + + if ( error ) + goto Exit; + + /* if it is a CID font, we stop there */ + if ( top->cid_registry != 0xFFFFU ) + goto Exit; + + /* parse the private dictionary, if any */ + if ( top->private_offset && top->private_size ) + { + /* set defaults */ + FT_MEM_ZERO( priv, sizeof ( *priv ) ); + + priv->blue_shift = 7; + priv->blue_fuzz = 1; + priv->lenIV = -1; + priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); + priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); + + cff_parser_init( &parser, CFF_CODE_PRIVATE, priv, library ); + + if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) || + FT_FRAME_ENTER( font->font_dict.private_size ) ) + goto Exit; + + error = cff_parser_run( &parser, + (FT_Byte*)stream->cursor, + (FT_Byte*)stream->limit ); + FT_FRAME_EXIT(); + if ( error ) + goto Exit; + + /* ensure that `num_blue_values' is even */ + priv->num_blue_values &= ~1; + } + + /* read the local subrs, if any */ + if ( priv->local_subrs_offset ) + { + if ( FT_STREAM_SEEK( base_offset + top->private_offset + + priv->local_subrs_offset ) ) + goto Exit; + + error = cff_index_init( &font->local_subrs_index, stream, 1 ); + if ( error ) + goto Exit; + + error = cff_index_get_pointers( &font->local_subrs_index, + &font->local_subrs, NULL ); + if ( error ) + goto Exit; + } + + Exit: + return error; + } + + + static void + cff_subfont_done( FT_Memory memory, + CFF_SubFont subfont ) + { + if ( subfont ) + { + cff_index_done( &subfont->local_subrs_index ); + FT_FREE( subfont->local_subrs ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + cff_font_load( FT_Library library, + FT_Stream stream, + FT_Int face_index, + CFF_Font font, + FT_Bool pure_cff ) + { + static const FT_Frame_Field cff_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRec + + FT_FRAME_START( 4 ), + FT_FRAME_BYTE( version_major ), + FT_FRAME_BYTE( version_minor ), + FT_FRAME_BYTE( header_size ), + FT_FRAME_BYTE( absolute_offsize ), + FT_FRAME_END + }; + + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong base_offset; + CFF_FontRecDict dict; + CFF_IndexRec string_index; + + + FT_ZERO( font ); + FT_ZERO( &string_index ); + + font->stream = stream; + font->memory = memory; + dict = &font->top_font.font_dict; + base_offset = FT_STREAM_POS(); + + /* read CFF font header */ + if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) ) + goto Exit; + + /* check format */ + if ( font->version_major != 1 || + font->header_size < 4 || + font->absolute_offsize > 4 ) + { + FT_TRACE2(( "[not a CFF font header]\n" )); + error = CFF_Err_Unknown_File_Format; + goto Exit; + } + + /* skip the rest of the header */ + if ( FT_STREAM_SKIP( font->header_size - 4 ) ) + goto Exit; + + /* read the name, top dict, string and global subrs index */ + if ( FT_SET_ERROR( cff_index_init( &font->name_index, + stream, 0 ) ) || + FT_SET_ERROR( cff_index_init( &font->font_dict_index, + stream, 0 ) ) || + FT_SET_ERROR( cff_index_init( &string_index, + stream, 1 ) ) || + FT_SET_ERROR( cff_index_init( &font->global_subrs_index, + stream, 1 ) ) || + FT_SET_ERROR( cff_index_get_pointers( &string_index, + &font->strings, + &font->string_pool ) ) ) + goto Exit; + + font->num_strings = string_index.count; + + /* well, we don't really forget the `disabled' fonts... */ + font->num_faces = font->name_index.count; + if ( face_index >= (FT_Int)font->num_faces ) + { + FT_ERROR(( "cff_font_load: incorrect face index = %d\n", + face_index )); + error = CFF_Err_Invalid_Argument; + } + + /* in case of a font format check, simply exit now */ + if ( face_index < 0 ) + goto Exit; + + /* now, parse the top-level font dictionary */ + error = cff_subfont_load( &font->top_font, + &font->font_dict_index, + face_index, + stream, + base_offset, + library ); + if ( error ) + goto Exit; + + if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) + goto Exit; + + error = cff_index_init( &font->charstrings_index, stream, 0 ); + if ( error ) + goto Exit; + + /* now, check for a CID font */ + if ( dict->cid_registry != 0xFFFFU ) + { + CFF_IndexRec fd_index; + CFF_SubFont sub; + FT_UInt idx; + + + /* this is a CID-keyed font, we must now allocate a table of */ + /* sub-fonts, then load each of them separately */ + if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) ) + goto Exit; + + error = cff_index_init( &fd_index, stream, 0 ); + if ( error ) + goto Exit; + + if ( fd_index.count > CFF_MAX_CID_FONTS ) + { + FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" )); + goto Fail_CID; + } + + /* allocate & read each font dict independently */ + font->num_subfonts = fd_index.count; + if ( FT_NEW_ARRAY( sub, fd_index.count ) ) + goto Fail_CID; + + /* set up pointer table */ + for ( idx = 0; idx < fd_index.count; idx++ ) + font->subfonts[idx] = sub + idx; + + /* now load each subfont independently */ + for ( idx = 0; idx < fd_index.count; idx++ ) + { + sub = font->subfonts[idx]; + error = cff_subfont_load( sub, &fd_index, idx, + stream, base_offset, library ); + if ( error ) + goto Fail_CID; + } + + /* now load the FD Select array */ + error = CFF_Load_FD_Select( &font->fd_select, + font->charstrings_index.count, + stream, + base_offset + dict->cid_fd_select_offset ); + + Fail_CID: + cff_index_done( &fd_index ); + + if ( error ) + goto Exit; + } + else + font->num_subfonts = 0; + + /* read the charstrings index now */ + if ( dict->charstrings_offset == 0 ) + { + FT_ERROR(( "cff_font_load: no charstrings offset\n" )); + error = CFF_Err_Unknown_File_Format; + goto Exit; + } + + font->num_glyphs = font->charstrings_index.count; + + error = cff_index_get_pointers( &font->global_subrs_index, + &font->global_subrs, NULL ); + + if ( error ) + goto Exit; + + /* read the Charset and Encoding tables if available */ + if ( font->num_glyphs > 0 ) + { + FT_Bool invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff ); + + + error = cff_charset_load( &font->charset, font->num_glyphs, stream, + base_offset, dict->charset_offset, invert ); + if ( error ) + goto Exit; + + /* CID-keyed CFFs don't have an encoding */ + if ( dict->cid_registry == 0xFFFFU ) + { + error = cff_encoding_load( &font->encoding, + &font->charset, + font->num_glyphs, + stream, + base_offset, + dict->encoding_offset ); + if ( error ) + goto Exit; + } + } + + /* get the font name (/CIDFontName for CID-keyed fonts, */ + /* /FontName otherwise) */ + font->font_name = cff_index_get_name( font, face_index ); + + Exit: + cff_index_done( &string_index ); + + return error; + } + + + FT_LOCAL_DEF( void ) + cff_font_done( CFF_Font font ) + { + FT_Memory memory = font->memory; + FT_UInt idx; + + + cff_index_done( &font->global_subrs_index ); + cff_index_done( &font->font_dict_index ); + cff_index_done( &font->name_index ); + cff_index_done( &font->charstrings_index ); + + /* release font dictionaries, but only if working with */ + /* a CID keyed CFF font */ + if ( font->num_subfonts > 0 ) + { + for ( idx = 0; idx < font->num_subfonts; idx++ ) + cff_subfont_done( memory, font->subfonts[idx] ); + + /* the subfonts array has been allocated as a single block */ + FT_FREE( font->subfonts[0] ); + } + + cff_encoding_done( &font->encoding ); + cff_charset_done( &font->charset, font->stream ); + + cff_subfont_done( memory, &font->top_font ); + + CFF_Done_FD_Select( &font->fd_select, font->stream ); + + FT_FREE( font->font_info ); + + FT_FREE( font->font_name ); + FT_FREE( font->global_subrs ); + FT_FREE( font->strings ); + FT_FREE( font->string_pool ); + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffload.h b/android/jni/ndk_modules/freetype/src/cff/cffload.h new file mode 100644 index 00000000..c755de9a --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffload.h @@ -0,0 +1,83 @@ +/***************************************************************************/ +/* */ +/* cffload.h */ +/* */ +/* OpenType & CFF data/program tables loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFLOAD_H__ +#define __CFFLOAD_H__ + + +#include <ft2build.h> +#include "cfftypes.h" + + +FT_BEGIN_HEADER + + FT_LOCAL( FT_UShort ) + cff_get_standard_encoding( FT_UInt charcode ); + + + FT_LOCAL( FT_String* ) + cff_index_get_string( CFF_Font font, + FT_UInt element ); + + FT_LOCAL( FT_String* ) + cff_index_get_sid_string( CFF_Font font, + FT_UInt sid ); + + + FT_LOCAL( FT_Error ) + cff_index_access_element( CFF_Index idx, + FT_UInt element, + FT_Byte** pbytes, + FT_ULong* pbyte_len ); + + FT_LOCAL( void ) + cff_index_forget_element( CFF_Index idx, + FT_Byte** pbytes ); + + FT_LOCAL( FT_String* ) + cff_index_get_name( CFF_Font font, + FT_UInt element ); + + + FT_LOCAL( FT_UInt ) + cff_charset_cid_to_gindex( CFF_Charset charset, + FT_UInt cid ); + + + FT_LOCAL( FT_Error ) + cff_font_load( FT_Library library, + FT_Stream stream, + FT_Int face_index, + CFF_Font font, + FT_Bool pure_cff ); + + FT_LOCAL( void ) + cff_font_done( CFF_Font font ); + + + FT_LOCAL( FT_Byte ) + cff_fd_select_get( CFF_FDSelect fdselect, + FT_UInt glyph_index ); + + +FT_END_HEADER + +#endif /* __CFFLOAD_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffobjs.c b/android/jni/ndk_modules/freetype/src/cff/cffobjs.c new file mode 100644 index 00000000..f8b07c35 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffobjs.c @@ -0,0 +1,1008 @@ +/***************************************************************************/ +/* */ +/* cffobjs.c */ +/* */ +/* OpenType objects manager (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_ERRORS_H +#include FT_TRUETYPE_IDS_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_SFNT_H +#include "cffobjs.h" +#include "cffload.h" +#include "cffcmap.h" +#include "cfferrs.h" +#include "cffpic.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffobjs + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /* Note that we store the global hints in the size's `internal' root */ + /* field. */ + /* */ + /*************************************************************************/ + + + static PSH_Globals_Funcs + cff_size_get_globals_funcs( CFF_Size size ) + { + CFF_Face face = (CFF_Face)size->root.face; + CFF_Font font = (CFF_Font)face->extra.data; + PSHinter_Service pshinter = font->pshinter; + FT_Module module; + + + module = FT_Get_Module( size->root.face->driver->root.library, + "pshinter" ); + return ( module && pshinter && pshinter->get_globals_funcs ) + ? pshinter->get_globals_funcs( module ) + : 0; + } + + + FT_LOCAL_DEF( void ) + cff_size_done( FT_Size cffsize ) /* CFF_Size */ + { + CFF_Size size = (CFF_Size)cffsize; + CFF_Face face = (CFF_Face)size->root.face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal = (CFF_Internal)cffsize->internal; + + + if ( internal ) + { + PSH_Globals_Funcs funcs; + + + funcs = cff_size_get_globals_funcs( size ); + if ( funcs ) + { + FT_UInt i; + + + funcs->destroy( internal->topfont ); + + for ( i = font->num_subfonts; i > 0; i-- ) + funcs->destroy( internal->subfonts[i - 1] ); + } + + /* `internal' is freed by destroy_size (in ftobjs.c) */ + } + } + + + /* CFF and Type 1 private dictionaries have slightly different */ + /* structures; we need to synthesize a Type 1 dictionary on the fly */ + + static void + cff_make_private_dict( CFF_SubFont subfont, + PS_Private priv ) + { + CFF_Private cpriv = &subfont->private_dict; + FT_UInt n, count; + + + FT_MEM_ZERO( priv, sizeof ( *priv ) ); + + count = priv->num_blue_values = cpriv->num_blue_values; + for ( n = 0; n < count; n++ ) + priv->blue_values[n] = (FT_Short)cpriv->blue_values[n]; + + count = priv->num_other_blues = cpriv->num_other_blues; + for ( n = 0; n < count; n++ ) + priv->other_blues[n] = (FT_Short)cpriv->other_blues[n]; + + count = priv->num_family_blues = cpriv->num_family_blues; + for ( n = 0; n < count; n++ ) + priv->family_blues[n] = (FT_Short)cpriv->family_blues[n]; + + count = priv->num_family_other_blues = cpriv->num_family_other_blues; + for ( n = 0; n < count; n++ ) + priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n]; + + priv->blue_scale = cpriv->blue_scale; + priv->blue_shift = (FT_Int)cpriv->blue_shift; + priv->blue_fuzz = (FT_Int)cpriv->blue_fuzz; + + priv->standard_width[0] = (FT_UShort)cpriv->standard_width; + priv->standard_height[0] = (FT_UShort)cpriv->standard_height; + + count = priv->num_snap_widths = cpriv->num_snap_widths; + for ( n = 0; n < count; n++ ) + priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n]; + + count = priv->num_snap_heights = cpriv->num_snap_heights; + for ( n = 0; n < count; n++ ) + priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n]; + + priv->force_bold = cpriv->force_bold; + priv->language_group = cpriv->language_group; + priv->lenIV = cpriv->lenIV; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_size_init( FT_Size cffsize ) /* CFF_Size */ + { + CFF_Size size = (CFF_Size)cffsize; + FT_Error error = CFF_Err_Ok; + PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size ); + + + if ( funcs ) + { + CFF_Face face = (CFF_Face)cffsize->face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal; + + PS_PrivateRec priv; + FT_Memory memory = cffsize->face->memory; + + FT_UInt i; + + + if ( FT_NEW( internal ) ) + goto Exit; + + cff_make_private_dict( &font->top_font, &priv ); + error = funcs->create( cffsize->face->memory, &priv, + &internal->topfont ); + if ( error ) + goto Exit; + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + + + cff_make_private_dict( sub, &priv ); + error = funcs->create( cffsize->face->memory, &priv, + &internal->subfonts[i - 1] ); + if ( error ) + goto Exit; + } + + cffsize->internal = (FT_Size_Internal)(void*)internal; + } + + size->strike_index = 0xFFFFFFFFUL; + + Exit: + return error; + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL_DEF( FT_Error ) + cff_size_select( FT_Size size, + FT_ULong strike_index ) + { + CFF_Size cffsize = (CFF_Size)size; + PSH_Globals_Funcs funcs; + + + cffsize->strike_index = strike_index; + + FT_Select_Metrics( size->face, strike_index ); + + funcs = cff_size_get_globals_funcs( cffsize ); + + if ( funcs ) + { + CFF_Face face = (CFF_Face)size->face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal = (CFF_Internal)size->internal; + + FT_ULong top_upm = font->top_font.font_dict.units_per_em; + FT_UInt i; + + + funcs->set_scale( internal->topfont, + size->metrics.x_scale, size->metrics.y_scale, + 0, 0 ); + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + FT_ULong sub_upm = sub->font_dict.units_per_em; + FT_Pos x_scale, y_scale; + + + if ( top_upm != sub_upm ) + { + x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); + y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); + } + else + { + x_scale = size->metrics.x_scale; + y_scale = size->metrics.y_scale; + } + + funcs->set_scale( internal->subfonts[i - 1], + x_scale, y_scale, 0, 0 ); + } + } + + return CFF_Err_Ok; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + FT_LOCAL_DEF( FT_Error ) + cff_size_request( FT_Size size, + FT_Size_Request req ) + { + CFF_Size cffsize = (CFF_Size)size; + PSH_Globals_Funcs funcs; + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( FT_HAS_FIXED_SIZES( size->face ) ) + { + CFF_Face cffface = (CFF_Face)size->face; + SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; + FT_ULong strike_index; + + + if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) ) + cffsize->strike_index = 0xFFFFFFFFUL; + else + return cff_size_select( size, strike_index ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + FT_Request_Metrics( size->face, req ); + + funcs = cff_size_get_globals_funcs( cffsize ); + + if ( funcs ) + { + CFF_Face cffface = (CFF_Face)size->face; + CFF_Font font = (CFF_Font)cffface->extra.data; + CFF_Internal internal = (CFF_Internal)size->internal; + + FT_ULong top_upm = font->top_font.font_dict.units_per_em; + FT_UInt i; + + + funcs->set_scale( internal->topfont, + size->metrics.x_scale, size->metrics.y_scale, + 0, 0 ); + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + FT_ULong sub_upm = sub->font_dict.units_per_em; + FT_Pos x_scale, y_scale; + + + if ( top_upm != sub_upm ) + { + x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); + y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); + } + else + { + x_scale = size->metrics.x_scale; + y_scale = size->metrics.y_scale; + } + + funcs->set_scale( internal->subfonts[i - 1], + x_scale, y_scale, 0, 0 ); + } + } + + return CFF_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* SLOT FUNCTIONS */ + /* */ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + cff_slot_done( FT_GlyphSlot slot ) + { + slot->internal->glyph_hints = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_slot_init( FT_GlyphSlot slot ) + { + CFF_Face face = (CFF_Face)slot->face; + CFF_Font font = (CFF_Font)face->extra.data; + PSHinter_Service pshinter = font->pshinter; + + + if ( pshinter ) + { + FT_Module module; + + + module = FT_Get_Module( slot->face->driver->root.library, + "pshinter" ); + if ( module ) + { + T2_Hints_Funcs funcs; + + + funcs = pshinter->get_t2_funcs( module ); + slot->internal->glyph_hints = (void*)funcs; + } + } + + return CFF_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* FACE FUNCTIONS */ + /* */ + /*************************************************************************/ + + static FT_String* + cff_strcpy( FT_Memory memory, + const FT_String* source ) + { + FT_Error error; + FT_String* result; + + + (void)FT_STRDUP( result, source ); + + FT_UNUSED( error ); + + return result; + } + + + /* Strip all subset prefixes of the form `ABCDEF+'. Usually, there */ + /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold' */ + /* have been seen in the wild. */ + + static void + remove_subset_prefix( FT_String* name ) + { + FT_Int32 idx = 0; + FT_Int32 length = strlen( name ) + 1; + FT_Bool continue_search = 1; + + + while ( continue_search ) + { + if ( length >= 7 && name[6] == '+' ) + { + for ( idx = 0; idx < 6; idx++ ) + { + /* ASCII uppercase letters */ + if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) ) + continue_search = 0; + } + + if ( continue_search ) + { + for ( idx = 7; idx < length; idx++ ) + name[idx - 7] = name[idx]; + } + } + else + continue_search = 0; + } + } + + + FT_LOCAL_DEF( FT_Error ) + cff_face_init( FT_Stream stream, + FT_Face cffface, /* CFF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + CFF_Face face = (CFF_Face)cffface; + FT_Error error; + SFNT_Service sfnt; + FT_Service_PsCMaps psnames; + PSHinter_Service pshinter; + FT_Bool pure_cff = 1; + FT_Bool sfnt_format = 0; + FT_Library library = cffface->driver->root.library; + + + sfnt = (SFNT_Service)FT_Get_Module_Interface( + library, "sfnt" ); + if ( !sfnt ) + goto Bad_Format; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + + pshinter = (PSHinter_Service)FT_Get_Module_Interface( + library, "pshinter" ); + + /* create input stream from resource */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + /* check whether we have a valid OpenType file */ + error = sfnt->init_face( stream, face, face_index, num_params, params ); + if ( !error ) + { + if ( face->format_tag != TTAG_OTTO ) /* `OTTO'; OpenType/CFF font */ + { + FT_TRACE2(( "[not a valid OpenType/CFF font]\n" )); + goto Bad_Format; + } + + /* if we are performing a simple font format check, exit immediately */ + if ( face_index < 0 ) + return CFF_Err_Ok; + + /* UNDOCUMENTED! A CFF in an SFNT can have only a single font. */ + if ( face_index > 0 ) + { + FT_ERROR(( "cff_face_init: invalid face index\n" )); + error = CFF_Err_Invalid_Argument; + goto Exit; + } + + sfnt_format = 1; + + /* now, the font can be either an OpenType/CFF font, or an SVG CEF */ + /* font; in the latter case it doesn't have a `head' table */ + error = face->goto_table( face, TTAG_head, stream, 0 ); + if ( !error ) + { + pure_cff = 0; + + /* load font directory */ + error = sfnt->load_face( stream, face, 0, num_params, params ); + if ( error ) + goto Exit; + } + else + { + /* load the `cmap' table explicitly */ + error = sfnt->load_cmap( face, stream ); + if ( error ) + goto Exit; + + /* XXX: we don't load the GPOS table, as OpenType Layout */ + /* support will be added later to a layout library on top of */ + /* FreeType 2 */ + } + + /* now load the CFF part of the file */ + error = face->goto_table( face, TTAG_CFF, stream, 0 ); + if ( error ) + goto Exit; + } + else + { + /* rewind to start of file; we are going to load a pure-CFF font */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + error = CFF_Err_Ok; + } + + /* now load and parse the CFF table in the file */ + { + CFF_Font cff; + CFF_FontRecDict dict; + FT_Memory memory = cffface->memory; + FT_Int32 flags; + FT_UInt i; + + + if ( FT_NEW( cff ) ) + goto Exit; + + face->extra.data = cff; + error = cff_font_load( library, stream, face_index, cff, pure_cff ); + if ( error ) + goto Exit; + + cff->pshinter = pshinter; + cff->psnames = psnames; + + cffface->face_index = face_index; + + /* Complement the root flags with some interesting information. */ + /* Note that this is only necessary for pure CFF and CEF fonts; */ + /* SFNT based fonts use the `name' table instead. */ + + cffface->num_glyphs = cff->num_glyphs; + + dict = &cff->top_font.font_dict; + + /* we need the `PSNames' module for CFF and CEF formats */ + /* which aren't CID-keyed */ + if ( dict->cid_registry == 0xFFFFU && !psnames ) + { + FT_ERROR(( "cff_face_init:" + " cannot open CFF & CEF fonts\n" + " " + " without the `PSNames' module\n" )); + goto Bad_Format; + } + + if ( !dict->units_per_em ) + dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM; + + /* Normalize the font matrix so that `matrix->xx' is 1; the */ + /* scaling is done with `units_per_em' then (at this point, */ + /* it already contains the scaling factor, but without */ + /* normalization of the matrix). */ + /* */ + /* Note that the offsets must be expressed in integer font */ + /* units. */ + + { + FT_Matrix* matrix = &dict->font_matrix; + FT_Vector* offset = &dict->font_offset; + FT_ULong* upm = &dict->units_per_em; + FT_Fixed temp = FT_ABS( matrix->yy ); + + + if ( temp != 0x10000L ) + { + *upm = FT_DivFix( *upm, temp ); + + matrix->xx = FT_DivFix( matrix->xx, temp ); + matrix->yx = FT_DivFix( matrix->yx, temp ); + matrix->xy = FT_DivFix( matrix->xy, temp ); + matrix->yy = FT_DivFix( matrix->yy, temp ); + offset->x = FT_DivFix( offset->x, temp ); + offset->y = FT_DivFix( offset->y, temp ); + } + + offset->x >>= 16; + offset->y >>= 16; + } + + for ( i = cff->num_subfonts; i > 0; i-- ) + { + CFF_FontRecDict sub = &cff->subfonts[i - 1]->font_dict; + CFF_FontRecDict top = &cff->top_font.font_dict; + + FT_Matrix* matrix; + FT_Vector* offset; + FT_ULong* upm; + FT_Fixed temp; + + + if ( sub->units_per_em ) + { + FT_Long scaling; + + + if ( top->units_per_em > 1 && sub->units_per_em > 1 ) + scaling = FT_MIN( top->units_per_em, sub->units_per_em ); + else + scaling = 1; + + FT_Matrix_Multiply_Scaled( &top->font_matrix, + &sub->font_matrix, + scaling ); + FT_Vector_Transform_Scaled( &sub->font_offset, + &top->font_matrix, + scaling ); + + sub->units_per_em = FT_MulDiv( sub->units_per_em, + top->units_per_em, + scaling ); + } + else + { + sub->font_matrix = top->font_matrix; + sub->font_offset = top->font_offset; + + sub->units_per_em = top->units_per_em; + } + + matrix = &sub->font_matrix; + offset = &sub->font_offset; + upm = &sub->units_per_em; + temp = FT_ABS( matrix->yy ); + + if ( temp != 0x10000L ) + { + *upm = FT_DivFix( *upm, temp ); + + /* if *upm is larger than 100*1000 we divide by 1000 -- */ + /* this can happen if e.g. there is no top-font FontMatrix */ + /* and the subfont FontMatrix already contains the complete */ + /* scaling for the subfont (see section 5.11 of the PLRM) */ + + /* 100 is a heuristic value */ + + if ( *upm > 100L * 1000L ) + *upm = ( *upm + 500 ) / 1000; + + matrix->xx = FT_DivFix( matrix->xx, temp ); + matrix->yx = FT_DivFix( matrix->yx, temp ); + matrix->xy = FT_DivFix( matrix->xy, temp ); + matrix->yy = FT_DivFix( matrix->yy, temp ); + offset->x = FT_DivFix( offset->x, temp ); + offset->y = FT_DivFix( offset->y, temp ); + } + + offset->x >>= 16; + offset->y >>= 16; + } + + if ( pure_cff ) + { + char* style_name = NULL; + + + /* set up num_faces */ + cffface->num_faces = cff->num_faces; + + /* compute number of glyphs */ + if ( dict->cid_registry != 0xFFFFU ) + cffface->num_glyphs = cff->charset.max_cid; + else + cffface->num_glyphs = cff->charstrings_index.count; + + /* set global bbox, as well as EM size */ + cffface->bbox.xMin = dict->font_bbox.xMin >> 16; + cffface->bbox.yMin = dict->font_bbox.yMin >> 16; + /* no `U' suffix here to 0xFFFF! */ + cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16; + cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16; + + cffface->units_per_EM = (FT_UShort)( dict->units_per_em ); + + cffface->ascender = (FT_Short)( cffface->bbox.yMax ); + cffface->descender = (FT_Short)( cffface->bbox.yMin ); + + cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 ); + if ( cffface->height < cffface->ascender - cffface->descender ) + cffface->height = (FT_Short)( cffface->ascender - cffface->descender ); + + cffface->underline_position = + (FT_Short)( dict->underline_position >> 16 ); + cffface->underline_thickness = + (FT_Short)( dict->underline_thickness >> 16 ); + + /* retrieve font family & style name */ + cffface->family_name = cff_index_get_name( cff, face_index ); + if ( cffface->family_name ) + { + char* full = cff_index_get_sid_string( cff, + dict->full_name ); + char* fullp = full; + char* family = cffface->family_name; + char* family_name = NULL; + + + remove_subset_prefix( cffface->family_name ); + + if ( dict->family_name ) + { + family_name = cff_index_get_sid_string( cff, + dict->family_name ); + if ( family_name ) + family = family_name; + } + + /* We try to extract the style name from the full name. */ + /* We need to ignore spaces and dashes during the search. */ + if ( full && family ) + { + while ( *fullp ) + { + /* skip common characters at the start of both strings */ + if ( *fullp == *family ) + { + family++; + fullp++; + continue; + } + + /* ignore spaces and dashes in full name during comparison */ + if ( *fullp == ' ' || *fullp == '-' ) + { + fullp++; + continue; + } + + /* ignore spaces and dashes in family name during comparison */ + if ( *family == ' ' || *family == '-' ) + { + family++; + continue; + } + + if ( !*family && *fullp ) + { + /* The full name begins with the same characters as the */ + /* family name, with spaces and dashes removed. In this */ + /* case, the remaining string in `fullp' will be used as */ + /* the style name. */ + style_name = cff_strcpy( memory, fullp ); + } + break; + } + } + } + else + { + char *cid_font_name = + cff_index_get_sid_string( cff, + dict->cid_font_name ); + + + /* do we have a `/FontName' for a CID-keyed font? */ + if ( cid_font_name ) + cffface->family_name = cff_strcpy( memory, cid_font_name ); + } + + if ( style_name ) + cffface->style_name = style_name; + else + /* assume "Regular" style if we don't know better */ + cffface->style_name = cff_strcpy( memory, (char *)"Regular" ); + + /*******************************************************************/ + /* */ + /* Compute face flags. */ + /* */ + flags = (FT_UInt32)( FT_FACE_FLAG_SCALABLE | /* scalable outlines */ + FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ + FT_FACE_FLAG_HINTER ); /* has native hinter */ + + if ( sfnt_format ) + flags |= (FT_UInt32)FT_FACE_FLAG_SFNT; + + /* fixed width font? */ + if ( dict->is_fixed_pitch ) + flags |= (FT_UInt32)FT_FACE_FLAG_FIXED_WIDTH; + + /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */ +#if 0 + /* kerning available? */ + if ( face->kern_pairs ) + flags |= (FT_UInt32)FT_FACE_FLAG_KERNING; +#endif + + cffface->face_flags = flags; + + /*******************************************************************/ + /* */ + /* Compute style flags. */ + /* */ + flags = 0; + + if ( dict->italic_angle ) + flags |= FT_STYLE_FLAG_ITALIC; + + { + char *weight = cff_index_get_sid_string( cff, + dict->weight ); + + + if ( weight ) + if ( !ft_strcmp( weight, "Bold" ) || + !ft_strcmp( weight, "Black" ) ) + flags |= FT_STYLE_FLAG_BOLD; + } + + /* double check */ + if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name ) + if ( !ft_strncmp( cffface->style_name, "Bold", 4 ) || + !ft_strncmp( cffface->style_name, "Black", 5 ) ) + flags |= FT_STYLE_FLAG_BOLD; + + cffface->style_flags = flags; + } + + +#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES + /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */ + /* has unset this flag because of the 3.0 `post' table. */ + if ( dict->cid_registry == 0xFFFFU ) + cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; +#endif + + if ( dict->cid_registry != 0xFFFFU && pure_cff ) + cffface->face_flags |= FT_FACE_FLAG_CID_KEYED; + + + /*******************************************************************/ + /* */ + /* Compute char maps. */ + /* */ + + /* Try to synthesize a Unicode charmap if there is none available */ + /* already. If an OpenType font contains a Unicode "cmap", we */ + /* will use it, whatever be in the CFF part of the file. */ + { + FT_CharMapRec cmaprec; + FT_CharMap cmap; + FT_UInt nn; + CFF_Encoding encoding = &cff->encoding; + + + for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ ) + { + cmap = cffface->charmaps[nn]; + + /* Windows Unicode? */ + if ( cmap->platform_id == TT_PLATFORM_MICROSOFT && + cmap->encoding_id == TT_MS_ID_UNICODE_CS ) + goto Skip_Unicode; + + /* Apple Unicode platform id? */ + if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE ) + goto Skip_Unicode; /* Apple Unicode */ + } + + /* since CID-keyed fonts don't contain glyph names, we can't */ + /* construct a cmap */ + if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU ) + goto Exit; + +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( nn + 1 > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "cff_face_init: no Unicode cmap is found, " + "and too many subtables (%d) to add synthesized cmap\n", + nn )); + goto Exit; + } +#endif + + /* we didn't find a Unicode charmap -- synthesize one */ + cmaprec.face = cffface; + cmaprec.platform_id = TT_PLATFORM_MICROSOFT; + cmaprec.encoding_id = TT_MS_ID_UNICODE_CS; + cmaprec.encoding = FT_ENCODING_UNICODE; + + nn = (FT_UInt)cffface->num_charmaps; + + error = FT_CMap_New( &FT_CFF_CMAP_UNICODE_CLASS_REC_GET, NULL, + &cmaprec, NULL ); + if ( error && FT_Err_No_Unicode_Glyph_Name != error ) + goto Exit; + error = FT_Err_Ok; + + /* if no Unicode charmap was previously selected, select this one */ + if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps ) + cffface->charmap = cffface->charmaps[nn]; + + Skip_Unicode: +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( nn > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "cff_face_init: Unicode cmap is found, " + "but too many preceding subtables (%d) to access\n", + nn - 1 )); + goto Exit; + } +#endif + if ( encoding->count > 0 ) + { + FT_CMap_Class clazz; + + + cmaprec.face = cffface; + cmaprec.platform_id = TT_PLATFORM_ADOBE; /* Adobe platform id */ + + if ( encoding->offset == 0 ) + { + cmaprec.encoding_id = TT_ADOBE_ID_STANDARD; + cmaprec.encoding = FT_ENCODING_ADOBE_STANDARD; + clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; + } + else if ( encoding->offset == 1 ) + { + cmaprec.encoding_id = TT_ADOBE_ID_EXPERT; + cmaprec.encoding = FT_ENCODING_ADOBE_EXPERT; + clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; + } + else + { + cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM; + cmaprec.encoding = FT_ENCODING_ADOBE_CUSTOM; + clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; + } + + error = FT_CMap_New( clazz, NULL, &cmaprec, NULL ); + } + } + } + + Exit: + return error; + + Bad_Format: + error = CFF_Err_Unknown_File_Format; + goto Exit; + } + + + FT_LOCAL_DEF( void ) + cff_face_done( FT_Face cffface ) /* CFF_Face */ + { + CFF_Face face = (CFF_Face)cffface; + FT_Memory memory; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = cffface->memory; + sfnt = (SFNT_Service)face->sfnt; + + if ( sfnt ) + sfnt->done_face( face ); + + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + if ( cff ) + { + cff_font_done( cff ); + FT_FREE( face->extra.data ); + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + cff_driver_init( FT_Module module ) + { + FT_UNUSED( module ); + + return CFF_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + cff_driver_done( FT_Module module ) + { + FT_UNUSED( module ); + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffobjs.h b/android/jni/ndk_modules/freetype/src/cff/cffobjs.h new file mode 100644 index 00000000..3c81cee0 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffobjs.h @@ -0,0 +1,181 @@ +/***************************************************************************/ +/* */ +/* cffobjs.h */ +/* */ +/* OpenType objects manager (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFOBJS_H__ +#define __CFFOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include "cfftypes.h" +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CFF_Driver */ + /* */ + /* <Description> */ + /* A handle to an OpenType driver object. */ + /* */ + typedef struct CFF_DriverRec_* CFF_Driver; + + typedef TT_Face CFF_Face; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CFF_Size */ + /* */ + /* <Description> */ + /* A handle to an OpenType size object. */ + /* */ + typedef struct CFF_SizeRec_ + { + FT_SizeRec root; + FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ + + } CFF_SizeRec, *CFF_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CFF_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to an OpenType glyph slot object. */ + /* */ + typedef struct CFF_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + + FT_Bool hint; + FT_Bool scaled; + + FT_Fixed x_scale; + FT_Fixed y_scale; + + } CFF_GlyphSlotRec, *CFF_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CFF_Internal */ + /* */ + /* <Description> */ + /* The interface to the `internal' field of `FT_Size'. */ + /* */ + typedef struct CFF_InternalRec_ + { + PSH_Globals topfont; + PSH_Globals subfonts[CFF_MAX_CID_FONTS]; + + } CFF_InternalRec, *CFF_Internal; + + + /*************************************************************************/ + /* */ + /* Subglyph transformation record. */ + /* */ + typedef struct CFF_Transform_ + { + FT_Fixed xx, xy; /* transformation matrix coefficients */ + FT_Fixed yx, yy; + FT_F26Dot6 ox, oy; /* offsets */ + + } CFF_Transform; + + + /***********************************************************************/ + /* */ + /* TrueType driver class. */ + /* */ + typedef struct CFF_DriverRec_ + { + FT_DriverRec root; + void* extension_component; + + } CFF_DriverRec; + + + FT_LOCAL( FT_Error ) + cff_size_init( FT_Size size ); /* CFF_Size */ + + FT_LOCAL( void ) + cff_size_done( FT_Size size ); /* CFF_Size */ + + FT_LOCAL( FT_Error ) + cff_size_request( FT_Size size, + FT_Size_Request req ); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL( FT_Error ) + cff_size_select( FT_Size size, + FT_ULong strike_index ); + +#endif + + FT_LOCAL( void ) + cff_slot_done( FT_GlyphSlot slot ); + + FT_LOCAL( FT_Error ) + cff_slot_init( FT_GlyphSlot slot ); + + + /*************************************************************************/ + /* */ + /* Face functions */ + /* */ + FT_LOCAL( FT_Error ) + cff_face_init( FT_Stream stream, + FT_Face face, /* CFF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + cff_face_done( FT_Face face ); /* CFF_Face */ + + + /*************************************************************************/ + /* */ + /* Driver functions */ + /* */ + FT_LOCAL( FT_Error ) + cff_driver_init( FT_Module module ); + + FT_LOCAL( void ) + cff_driver_done( FT_Module module ); + + +FT_END_HEADER + +#endif /* __CFFOBJS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffparse.c b/android/jni/ndk_modules/freetype/src/cff/cffparse.c new file mode 100644 index 00000000..0d11a727 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffparse.c @@ -0,0 +1,924 @@ +/***************************************************************************/ +/* */ +/* cffparse.c */ +/* */ +/* CFF token stream parser (body) */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "cffparse.h" +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H + +#include "cfferrs.h" +#include "cffpic.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffparse + + + + + FT_LOCAL_DEF( void ) + cff_parser_init( CFF_Parser parser, + FT_UInt code, + void* object, + FT_Library library) + { + FT_MEM_ZERO( parser, sizeof ( *parser ) ); + + parser->top = parser->stack; + parser->object_code = code; + parser->object = object; + parser->library = library; + } + + + /* read an integer */ + static FT_Long + cff_parse_integer( FT_Byte* start, + FT_Byte* limit ) + { + FT_Byte* p = start; + FT_Int v = *p++; + FT_Long val = 0; + + + if ( v == 28 ) + { + if ( p + 2 > limit ) + goto Bad; + + val = (FT_Short)( ( (FT_Int)p[0] << 8 ) | p[1] ); + p += 2; + } + else if ( v == 29 ) + { + if ( p + 4 > limit ) + goto Bad; + + val = ( (FT_Long)p[0] << 24 ) | + ( (FT_Long)p[1] << 16 ) | + ( (FT_Long)p[2] << 8 ) | + p[3]; + p += 4; + } + else if ( v < 247 ) + { + val = v - 139; + } + else if ( v < 251 ) + { + if ( p + 1 > limit ) + goto Bad; + + val = ( v - 247 ) * 256 + p[0] + 108; + p++; + } + else + { + if ( p + 1 > limit ) + goto Bad; + + val = -( v - 251 ) * 256 - p[0] - 108; + p++; + } + + Exit: + return val; + + Bad: + val = 0; + goto Exit; + } + + + static const FT_Long power_tens[] = + { + 1L, + 10L, + 100L, + 1000L, + 10000L, + 100000L, + 1000000L, + 10000000L, + 100000000L, + 1000000000L + }; + + + /* read a real */ + static FT_Fixed + cff_parse_real( FT_Byte* start, + FT_Byte* limit, + FT_Long power_ten, + FT_Long* scaling ) + { + FT_Byte* p = start; + FT_UInt nib; + FT_UInt phase; + + FT_Long result, number, exponent; + FT_Int sign = 0, exponent_sign = 0; + FT_Long exponent_add, integer_length, fraction_length; + + + if ( scaling ) + *scaling = 0; + + result = 0; + + number = 0; + exponent = 0; + + exponent_add = 0; + integer_length = 0; + fraction_length = 0; + + /* First of all, read the integer part. */ + phase = 4; + + for (;;) + { + /* If we entered this iteration with phase == 4, we need to */ + /* read a new byte. This also skips past the initial 0x1E. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p >= limit ) + goto Exit; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + + if ( nib == 0xE ) + sign = 1; + else if ( nib > 9 ) + break; + else + { + /* Increase exponent if we can't add the digit. */ + if ( number >= 0xCCCCCCCL ) + exponent_add++; + /* Skip leading zeros. */ + else if ( nib || number ) + { + integer_length++; + number = number * 10 + nib; + } + } + } + + /* Read fraction part, if any. */ + if ( nib == 0xa ) + for (;;) + { + /* If we entered this iteration with phase == 4, we need */ + /* to read a new byte. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p >= limit ) + goto Exit; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + if ( nib >= 10 ) + break; + + /* Skip leading zeros if possible. */ + if ( !nib && !number ) + exponent_add--; + /* Only add digit if we don't overflow. */ + else if ( number < 0xCCCCCCCL && fraction_length < 9 ) + { + fraction_length++; + number = number * 10 + nib; + } + } + + /* Read exponent, if any. */ + if ( nib == 12 ) + { + exponent_sign = 1; + nib = 11; + } + + if ( nib == 11 ) + { + for (;;) + { + /* If we entered this iteration with phase == 4, */ + /* we need to read a new byte. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p >= limit ) + goto Exit; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + if ( nib >= 10 ) + break; + + exponent = exponent * 10 + nib; + + /* Arbitrarily limit exponent. */ + if ( exponent > 1000 ) + goto Exit; + } + + if ( exponent_sign ) + exponent = -exponent; + } + + /* We don't check `power_ten' and `exponent_add'. */ + exponent += power_ten + exponent_add; + + if ( scaling ) + { + /* Only use `fraction_length'. */ + fraction_length += integer_length; + exponent += integer_length; + + if ( fraction_length <= 5 ) + { + if ( number > 0x7FFFL ) + { + result = FT_DivFix( number, 10 ); + *scaling = exponent - fraction_length + 1; + } + else + { + if ( exponent > 0 ) + { + FT_Long new_fraction_length, shift; + + + /* Make `scaling' as small as possible. */ + new_fraction_length = FT_MIN( exponent, 5 ); + exponent -= new_fraction_length; + shift = new_fraction_length - fraction_length; + + number *= power_tens[shift]; + if ( number > 0x7FFFL ) + { + number /= 10; + exponent += 1; + } + } + else + exponent -= fraction_length; + + result = number << 16; + *scaling = exponent; + } + } + else + { + if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL ) + { + result = FT_DivFix( number, power_tens[fraction_length - 4] ); + *scaling = exponent - 4; + } + else + { + result = FT_DivFix( number, power_tens[fraction_length - 5] ); + *scaling = exponent - 5; + } + } + } + else + { + integer_length += exponent; + fraction_length -= exponent; + + /* Check for overflow and underflow. */ + if ( FT_ABS( integer_length ) > 5 ) + goto Exit; + + /* Remove non-significant digits. */ + if ( integer_length < 0 ) + { + number /= power_tens[-integer_length]; + fraction_length += integer_length; + } + + /* this can only happen if exponent was non-zero */ + if ( fraction_length == 10 ) + { + number /= 10; + fraction_length -= 1; + } + + /* Convert into 16.16 format. */ + if ( fraction_length > 0 ) + { + if ( ( number / power_tens[fraction_length] ) > 0x7FFFL ) + goto Exit; + + result = FT_DivFix( number, power_tens[fraction_length] ); + } + else + { + number *= power_tens[-fraction_length]; + + if ( number > 0x7FFFL ) + goto Exit; + + result = number << 16; + } + } + + if ( sign ) + result = -result; + + Exit: + return result; + } + + + /* read a number, either integer or real */ + static FT_Long + cff_parse_num( FT_Byte** d ) + { + return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 ) + : cff_parse_integer( d[0], d[1] ); + } + + + /* read a floating point number, either integer or real */ + static FT_Fixed + cff_parse_fixed( FT_Byte** d ) + { + return **d == 30 ? cff_parse_real( d[0], d[1], 0, NULL ) + : cff_parse_integer( d[0], d[1] ) << 16; + } + + + /* read a floating point number, either integer or real, */ + /* but return `10^scaling' times the number read in */ + static FT_Fixed + cff_parse_fixed_scaled( FT_Byte** d, + FT_Long scaling ) + { + return **d == 30 ? cff_parse_real( d[0], d[1], scaling, NULL ) + : ( cff_parse_integer( d[0], d[1] ) * + power_tens[scaling] ) << 16; + } + + + /* read a floating point number, either integer or real, */ + /* and return it as precise as possible -- `scaling' returns */ + /* the scaling factor (as a power of 10) */ + static FT_Fixed + cff_parse_fixed_dynamic( FT_Byte** d, + FT_Long* scaling ) + { + FT_ASSERT( scaling ); + + if ( **d == 30 ) + return cff_parse_real( d[0], d[1], 0, scaling ); + else + { + FT_Long number; + FT_Int integer_length; + + + number = cff_parse_integer( d[0], d[1] ); + + if ( number > 0x7FFFL ) + { + for ( integer_length = 5; integer_length < 10; integer_length++ ) + if ( number < power_tens[integer_length] ) + break; + + if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL ) + { + *scaling = integer_length - 4; + return FT_DivFix( number, power_tens[integer_length - 4] ); + } + else + { + *scaling = integer_length - 5; + return FT_DivFix( number, power_tens[integer_length - 5] ); + } + } + else + { + *scaling = 0; + return number << 16; + } + } + } + + + static FT_Error + cff_parse_font_matrix( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Matrix* matrix = &dict->font_matrix; + FT_Vector* offset = &dict->font_offset; + FT_ULong* upm = &dict->units_per_em; + FT_Byte** data = parser->stack; + FT_Error error = CFF_Err_Stack_Underflow; + + + if ( parser->top >= parser->stack + 6 ) + { + FT_Long scaling; + + + error = CFF_Err_Ok; + + /* We expect a well-formed font matrix, this is, the matrix elements */ + /* `xx' and `yy' are of approximately the same magnitude. To avoid */ + /* loss of precision, we use the magnitude of element `xx' to scale */ + /* all other elements. The scaling factor is then contained in the */ + /* `units_per_em' value. */ + + matrix->xx = cff_parse_fixed_dynamic( data++, &scaling ); + + scaling = -scaling; + + if ( scaling < 0 || scaling > 9 ) + { + /* Return default matrix in case of unlikely values. */ + matrix->xx = 0x10000L; + matrix->yx = 0; + matrix->yx = 0; + matrix->yy = 0x10000L; + offset->x = 0; + offset->y = 0; + *upm = 1; + + goto Exit; + } + + matrix->yx = cff_parse_fixed_scaled( data++, scaling ); + matrix->xy = cff_parse_fixed_scaled( data++, scaling ); + matrix->yy = cff_parse_fixed_scaled( data++, scaling ); + offset->x = cff_parse_fixed_scaled( data++, scaling ); + offset->y = cff_parse_fixed_scaled( data, scaling ); + + *upm = power_tens[scaling]; + } + + Exit: + return error; + } + + + static FT_Error + cff_parse_font_bbox( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_BBox* bbox = &dict->font_bbox; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = CFF_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 4 ) + { + bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) ); + bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) ); + bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) ); + bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) ); + error = CFF_Err_Ok; + } + + return error; + } + + + static FT_Error + cff_parse_private_dict( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = CFF_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 2 ) + { + dict->private_size = cff_parse_num( data++ ); + dict->private_offset = cff_parse_num( data ); + error = CFF_Err_Ok; + } + + return error; + } + + + static FT_Error + cff_parse_cid_ros( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = CFF_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 3 ) + { + dict->cid_registry = (FT_UInt)cff_parse_num ( data++ ); + dict->cid_ordering = (FT_UInt)cff_parse_num ( data++ ); + if ( **data == 30 ) + FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); + dict->cid_supplement = cff_parse_num( data ); + if ( dict->cid_supplement < 0 ) + FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n", + dict->cid_supplement )); + error = CFF_Err_Ok; + } + + return error; + } + + +#define CFF_FIELD_NUM( code, name ) \ + CFF_FIELD( code, name, cff_kind_num ) +#define CFF_FIELD_FIXED( code, name ) \ + CFF_FIELD( code, name, cff_kind_fixed ) +#define CFF_FIELD_FIXED_1000( code, name ) \ + CFF_FIELD( code, name, cff_kind_fixed_thousand ) +#define CFF_FIELD_STRING( code, name ) \ + CFF_FIELD( code, name, cff_kind_string ) +#define CFF_FIELD_BOOL( code, name ) \ + CFF_FIELD( code, name, cff_kind_bool ) +#define CFF_FIELD_DELTA( code, name, max ) \ + CFF_FIELD( code, name, cff_kind_delta ) + +#define CFFCODE_TOPDICT 0x1000 +#define CFFCODE_PRIVATE 0x2000 + +#ifndef FT_CONFIG_OPTION_PIC + +#define CFF_FIELD_CALLBACK( code, name ) \ + { \ + cff_kind_callback, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_ ## name, \ + 0, 0 \ + }, + +#undef CFF_FIELD +#define CFF_FIELD( code, name, kind ) \ + { \ + kind, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE( name ), \ + 0, 0, 0 \ + }, + +#undef CFF_FIELD_DELTA +#define CFF_FIELD_DELTA( code, name, max ) \ + { \ + cff_kind_delta, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE_DELTA( name ), \ + 0, \ + max, \ + FT_FIELD_OFFSET( num_ ## name ) \ + }, + + static const CFF_Field_Handler cff_field_handlers[] = + { + +#include "cfftoken.h" + + { 0, 0, 0, 0, 0, 0, 0 } + }; + + +#else /* FT_CONFIG_OPTION_PIC */ + + void FT_Destroy_Class_cff_field_handlers(FT_Library library, CFF_Field_Handler* clazz) + { + FT_Memory memory = library->memory; + if ( clazz ) + FT_FREE( clazz ); + } + + FT_Error FT_Create_Class_cff_field_handlers(FT_Library library, CFF_Field_Handler** output_class) + { + CFF_Field_Handler* clazz; + FT_Error error; + FT_Memory memory = library->memory; + int i=0; + +#undef CFF_FIELD +#undef CFF_FIELD_DELTA +#undef CFF_FIELD_CALLBACK +#define CFF_FIELD_CALLBACK( code, name ) i++; +#define CFF_FIELD( code, name, kind ) i++; +#define CFF_FIELD_DELTA( code, name, max ) i++; + +#include "cfftoken.h" + i++;/*{ 0, 0, 0, 0, 0, 0, 0 }*/ + + if ( FT_ALLOC( clazz, sizeof(CFF_Field_Handler)*i ) ) + return error; + + i=0; +#undef CFF_FIELD +#undef CFF_FIELD_DELTA +#undef CFF_FIELD_CALLBACK + +#define CFF_FIELD_CALLBACK( code_, name_ ) \ + clazz[i].kind = cff_kind_callback; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = 0; \ + clazz[i].size = 0; \ + clazz[i].reader = cff_parse_ ## name_; \ + clazz[i].array_max = 0; \ + clazz[i].count_offset = 0; \ + i++; + +#undef CFF_FIELD +#define CFF_FIELD( code_, name_, kind_ ) \ + clazz[i].kind = kind_; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ + clazz[i].size = FT_FIELD_SIZE( name_ ); \ + clazz[i].reader = 0; \ + clazz[i].array_max = 0; \ + clazz[i].count_offset = 0; \ + i++; \ + +#undef CFF_FIELD_DELTA +#define CFF_FIELD_DELTA( code_, name_, max_ ) \ + clazz[i].kind = cff_kind_delta; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ + clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ + clazz[i].reader = 0; \ + clazz[i].array_max = max_; \ + clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ + i++; + +#include "cfftoken.h" + + clazz[i].kind = 0; + clazz[i].code = 0; + clazz[i].offset = 0; + clazz[i].size = 0; + clazz[i].reader = 0; + clazz[i].array_max = 0; + clazz[i].count_offset = 0; + + *output_class = clazz; + return CFF_Err_Ok; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + + FT_LOCAL_DEF( FT_Error ) + cff_parser_run( CFF_Parser parser, + FT_Byte* start, + FT_Byte* limit ) + { + FT_Byte* p = start; + FT_Error error = CFF_Err_Ok; + FT_Library library = parser->library; + FT_UNUSED(library); + + + parser->top = parser->stack; + parser->start = start; + parser->limit = limit; + parser->cursor = start; + + while ( p < limit ) + { + FT_UInt v = *p; + + + if ( v >= 27 && v != 31 ) + { + /* it's a number; we will push its position on the stack */ + if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH ) + goto Stack_Overflow; + + *parser->top ++ = p; + + /* now, skip it */ + if ( v == 30 ) + { + /* skip real number */ + p++; + for (;;) + { + /* An unterminated floating point number at the */ + /* end of a dictionary is invalid but harmless. */ + if ( p >= limit ) + goto Exit; + v = p[0] >> 4; + if ( v == 15 ) + break; + v = p[0] & 0xF; + if ( v == 15 ) + break; + p++; + } + } + else if ( v == 28 ) + p += 2; + else if ( v == 29 ) + p += 4; + else if ( v > 246 ) + p += 1; + } + else + { + /* This is not a number, hence it's an operator. Compute its code */ + /* and look for it in our current list. */ + + FT_UInt code; + FT_UInt num_args = (FT_UInt) + ( parser->top - parser->stack ); + const CFF_Field_Handler* field; + + + *parser->top = p; + code = v; + if ( v == 12 ) + { + /* two byte operator */ + p++; + if ( p >= limit ) + goto Syntax_Error; + + code = 0x100 | p[0]; + } + code = code | parser->object_code; + + for ( field = FT_CFF_FIELD_HANDLERS_GET; field->kind; field++ ) + { + if ( field->code == (FT_Int)code ) + { + /* we found our field's handler; read it */ + FT_Long val; + FT_Byte* q = (FT_Byte*)parser->object + field->offset; + + + /* check that we have enough arguments -- except for */ + /* delta encoded arrays, which can be empty */ + if ( field->kind != cff_kind_delta && num_args < 1 ) + goto Stack_Underflow; + + switch ( field->kind ) + { + case cff_kind_bool: + case cff_kind_string: + case cff_kind_num: + val = cff_parse_num( parser->stack ); + goto Store_Number; + + case cff_kind_fixed: + val = cff_parse_fixed( parser->stack ); + goto Store_Number; + + case cff_kind_fixed_thousand: + val = cff_parse_fixed_scaled( parser->stack, 3 ); + + Store_Number: + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_Short*)q = (FT_Short)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_Int32*)q = (FT_Int)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + break; + + case cff_kind_delta: + { + FT_Byte* qcount = (FT_Byte*)parser->object + + field->count_offset; + + FT_Byte** data = parser->stack; + + + if ( num_args > field->array_max ) + num_args = field->array_max; + + /* store count */ + *qcount = (FT_Byte)num_args; + + val = 0; + while ( num_args > 0 ) + { + val += cff_parse_num( data++ ); + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_Short*)q = (FT_Short)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_Int32*)q = (FT_Int)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + + q += field->size; + num_args--; + } + } + break; + + default: /* callback */ + error = field->reader( parser ); + if ( error ) + goto Exit; + } + goto Found; + } + } + + /* this is an unknown operator, or it is unsupported; */ + /* we will ignore it for now. */ + + Found: + /* clear stack */ + parser->top = parser->stack; + } + p++; + } + + Exit: + return error; + + Stack_Overflow: + error = CFF_Err_Invalid_Argument; + goto Exit; + + Stack_Underflow: + error = CFF_Err_Invalid_Argument; + goto Exit; + + Syntax_Error: + error = CFF_Err_Invalid_Argument; + goto Exit; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffparse.h b/android/jni/ndk_modules/freetype/src/cff/cffparse.h new file mode 100644 index 00000000..7e2c00a0 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffparse.h @@ -0,0 +1,102 @@ +/***************************************************************************/ +/* */ +/* cffparse.h */ +/* */ +/* CFF token stream parser (specification) */ +/* */ +/* Copyright 1996-2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFF_PARSE_H__ +#define __CFF_PARSE_H__ + + +#include <ft2build.h> +#include "cfftypes.h" +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + +#define CFF_MAX_STACK_DEPTH 96 + +#define CFF_CODE_TOPDICT 0x1000 +#define CFF_CODE_PRIVATE 0x2000 + + + typedef struct CFF_ParserRec_ + { + FT_Library library; + FT_Byte* start; + FT_Byte* limit; + FT_Byte* cursor; + + FT_Byte* stack[CFF_MAX_STACK_DEPTH + 1]; + FT_Byte** top; + + FT_UInt object_code; + void* object; + + } CFF_ParserRec, *CFF_Parser; + + + FT_LOCAL( void ) + cff_parser_init( CFF_Parser parser, + FT_UInt code, + void* object, + FT_Library library); + + FT_LOCAL( FT_Error ) + cff_parser_run( CFF_Parser parser, + FT_Byte* start, + FT_Byte* limit ); + + + enum + { + cff_kind_none = 0, + cff_kind_num, + cff_kind_fixed, + cff_kind_fixed_thousand, + cff_kind_string, + cff_kind_bool, + cff_kind_delta, + cff_kind_callback, + + cff_kind_max /* do not remove */ + }; + + + /* now generate handlers for the most simple fields */ + typedef FT_Error (*CFF_Field_Reader)( CFF_Parser parser ); + + typedef struct CFF_Field_Handler_ + { + int kind; + int code; + FT_UInt offset; + FT_Byte size; + CFF_Field_Reader reader; + FT_UInt array_max; + FT_UInt count_offset; + + } CFF_Field_Handler; + + +FT_END_HEADER + + +#endif /* __CFF_PARSE_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffpic.c b/android/jni/ndk_modules/freetype/src/cff/cffpic.c new file mode 100644 index 00000000..5d01bd45 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffpic.c @@ -0,0 +1,101 @@ +/***************************************************************************/ +/* */ +/* cffpic.c */ +/* */ +/* The FreeType position independent code services for cff module. */ +/* */ +/* Copyright 2009, 2010 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "cffpic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from cffdrivr.c */ + FT_Error FT_Create_Class_cff_services( FT_Library, FT_ServiceDescRec**); + void FT_Destroy_Class_cff_services( FT_Library, FT_ServiceDescRec*); + void FT_Init_Class_cff_service_ps_info( FT_Library, FT_Service_PsInfoRec*); + void FT_Init_Class_cff_service_glyph_dict( FT_Library, FT_Service_GlyphDictRec*); + void FT_Init_Class_cff_service_ps_name( FT_Library, FT_Service_PsFontNameRec*); + void FT_Init_Class_cff_service_get_cmap_info( FT_Library, FT_Service_TTCMapsRec*); + void FT_Init_Class_cff_service_cid_info( FT_Library, FT_Service_CIDRec*); + + /* forward declaration of PIC init functions from cffparse.c */ + FT_Error FT_Create_Class_cff_field_handlers( FT_Library, CFF_Field_Handler**); + void FT_Destroy_Class_cff_field_handlers( FT_Library, CFF_Field_Handler*); + + /* forward declaration of PIC init functions from cffcmap.c */ + void FT_Init_Class_cff_cmap_encoding_class_rec( FT_Library, FT_CMap_ClassRec*); + void FT_Init_Class_cff_cmap_unicode_class_rec( FT_Library, FT_CMap_ClassRec*); + + void + cff_driver_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->cff ) + { + CffModulePIC* container = (CffModulePIC*)pic_container->cff; + if(container->cff_services) + FT_Destroy_Class_cff_services(library, container->cff_services); + container->cff_services = NULL; + if(container->cff_field_handlers) + FT_Destroy_Class_cff_field_handlers(library, container->cff_field_handlers); + container->cff_field_handlers = NULL; + FT_FREE( container ); + pic_container->cff = NULL; + } + } + + + FT_Error + cff_driver_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = CFF_Err_Ok; + CffModulePIC* container; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->cff = container; + + /* initialize pointer table - this is how the module usually expects this data */ + error = FT_Create_Class_cff_services(library, &container->cff_services); + if(error) + goto Exit; + error = FT_Create_Class_cff_field_handlers(library, &container->cff_field_handlers); + if(error) + goto Exit; + FT_Init_Class_cff_service_ps_info(library, &container->cff_service_ps_info); + FT_Init_Class_cff_service_glyph_dict(library, &container->cff_service_glyph_dict); + FT_Init_Class_cff_service_ps_name(library, &container->cff_service_ps_name); + FT_Init_Class_cff_service_get_cmap_info(library, &container->cff_service_get_cmap_info); + FT_Init_Class_cff_service_cid_info(library, &container->cff_service_cid_info); + FT_Init_Class_cff_cmap_encoding_class_rec(library, &container->cff_cmap_encoding_class_rec); + FT_Init_Class_cff_cmap_unicode_class_rec(library, &container->cff_cmap_unicode_class_rec); +Exit: + if(error) + cff_driver_class_pic_free(library); + return error; + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffpic.h b/android/jni/ndk_modules/freetype/src/cff/cffpic.h new file mode 100644 index 00000000..e29d0681 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cffpic.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* cffpic.h */ +/* */ +/* The FreeType position independent code services for cff module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFPIC_H__ +#define __CFFPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC +#define FT_CFF_SERVICE_PS_INFO_GET cff_service_ps_info +#define FT_CFF_SERVICE_GLYPH_DICT_GET cff_service_glyph_dict +#define FT_CFF_SERVICE_PS_NAME_GET cff_service_ps_name +#define FT_CFF_SERVICE_GET_CMAP_INFO_GET cff_service_get_cmap_info +#define FT_CFF_SERVICE_CID_INFO_GET cff_service_cid_info +#define FT_CFF_SERVICES_GET cff_services +#define FT_CFF_CMAP_ENCODING_CLASS_REC_GET cff_cmap_encoding_class_rec +#define FT_CFF_CMAP_UNICODE_CLASS_REC_GET cff_cmap_unicode_class_rec +#define FT_CFF_FIELD_HANDLERS_GET cff_field_handlers + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_SERVICE_GLYPH_DICT_H +#include "cffparse.h" +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_TT_CMAP_H +#include FT_SERVICE_CID_H + + typedef struct CffModulePIC_ + { + FT_ServiceDescRec* cff_services; + CFF_Field_Handler* cff_field_handlers; + FT_Service_PsInfoRec cff_service_ps_info; + FT_Service_GlyphDictRec cff_service_glyph_dict; + FT_Service_PsFontNameRec cff_service_ps_name; + FT_Service_TTCMapsRec cff_service_get_cmap_info; + FT_Service_CIDRec cff_service_cid_info; + FT_CMap_ClassRec cff_cmap_encoding_class_rec; + FT_CMap_ClassRec cff_cmap_unicode_class_rec; + } CffModulePIC; + +#define GET_PIC(lib) ((CffModulePIC*)((lib)->pic_container.cff)) +#define FT_CFF_SERVICE_PS_INFO_GET (GET_PIC(library)->cff_service_ps_info) +#define FT_CFF_SERVICE_GLYPH_DICT_GET (GET_PIC(library)->cff_service_glyph_dict) +#define FT_CFF_SERVICE_PS_NAME_GET (GET_PIC(library)->cff_service_ps_name) +#define FT_CFF_SERVICE_GET_CMAP_INFO_GET (GET_PIC(library)->cff_service_get_cmap_info) +#define FT_CFF_SERVICE_CID_INFO_GET (GET_PIC(library)->cff_service_cid_info) +#define FT_CFF_SERVICES_GET (GET_PIC(library)->cff_services) +#define FT_CFF_CMAP_ENCODING_CLASS_REC_GET (GET_PIC(library)->cff_cmap_encoding_class_rec) +#define FT_CFF_CMAP_UNICODE_CLASS_REC_GET (GET_PIC(library)->cff_cmap_unicode_class_rec) +#define FT_CFF_FIELD_HANDLERS_GET (GET_PIC(library)->cff_field_handlers) + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __CFFPIC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cfftoken.h b/android/jni/ndk_modules/freetype/src/cff/cfftoken.h new file mode 100644 index 00000000..6bb27d5c --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cfftoken.h @@ -0,0 +1,97 @@ +/***************************************************************************/ +/* */ +/* cfftoken.h */ +/* */ +/* CFF token definitions (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRecDictRec + +#undef CFFCODE +#define CFFCODE CFFCODE_TOPDICT + + CFF_FIELD_STRING ( 0, version ) + CFF_FIELD_STRING ( 1, notice ) + CFF_FIELD_STRING ( 0x100, copyright ) + CFF_FIELD_STRING ( 2, full_name ) + CFF_FIELD_STRING ( 3, family_name ) + CFF_FIELD_STRING ( 4, weight ) + CFF_FIELD_BOOL ( 0x101, is_fixed_pitch ) + CFF_FIELD_FIXED ( 0x102, italic_angle ) + CFF_FIELD_FIXED ( 0x103, underline_position ) + CFF_FIELD_FIXED ( 0x104, underline_thickness ) + CFF_FIELD_NUM ( 0x105, paint_type ) + CFF_FIELD_NUM ( 0x106, charstring_type ) + CFF_FIELD_CALLBACK( 0x107, font_matrix ) + CFF_FIELD_NUM ( 13, unique_id ) + CFF_FIELD_CALLBACK( 5, font_bbox ) + CFF_FIELD_NUM ( 0x108, stroke_width ) + CFF_FIELD_NUM ( 15, charset_offset ) + CFF_FIELD_NUM ( 16, encoding_offset ) + CFF_FIELD_NUM ( 17, charstrings_offset ) + CFF_FIELD_CALLBACK( 18, private_dict ) + CFF_FIELD_NUM ( 0x114, synthetic_base ) + CFF_FIELD_STRING ( 0x115, embedded_postscript ) + +#if 0 + CFF_FIELD_STRING ( 0x116, base_font_name ) + CFF_FIELD_DELTA ( 0x117, base_font_blend, 16 ) + CFF_FIELD_CALLBACK( 0x118, multiple_master ) + CFF_FIELD_CALLBACK( 0x119, blend_axis_types ) +#endif + + CFF_FIELD_CALLBACK( 0x11E, cid_ros ) + CFF_FIELD_NUM ( 0x11F, cid_font_version ) + CFF_FIELD_NUM ( 0x120, cid_font_revision ) + CFF_FIELD_NUM ( 0x121, cid_font_type ) + CFF_FIELD_NUM ( 0x122, cid_count ) + CFF_FIELD_NUM ( 0x123, cid_uid_base ) + CFF_FIELD_NUM ( 0x124, cid_fd_array_offset ) + CFF_FIELD_NUM ( 0x125, cid_fd_select_offset ) + CFF_FIELD_STRING ( 0x126, cid_font_name ) + +#if 0 + CFF_FIELD_NUM ( 0x127, chameleon ) +#endif + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_PrivateRec +#undef CFFCODE +#define CFFCODE CFFCODE_PRIVATE + + CFF_FIELD_DELTA ( 6, blue_values, 14 ) + CFF_FIELD_DELTA ( 7, other_blues, 10 ) + CFF_FIELD_DELTA ( 8, family_blues, 14 ) + CFF_FIELD_DELTA ( 9, family_other_blues, 10 ) + CFF_FIELD_FIXED_1000( 0x109, blue_scale ) + CFF_FIELD_NUM ( 0x10A, blue_shift ) + CFF_FIELD_NUM ( 0x10B, blue_fuzz ) + CFF_FIELD_NUM ( 10, standard_width ) + CFF_FIELD_NUM ( 11, standard_height ) + CFF_FIELD_DELTA ( 0x10C, snap_widths, 13 ) + CFF_FIELD_DELTA ( 0x10D, snap_heights, 13 ) + CFF_FIELD_BOOL ( 0x10E, force_bold ) + CFF_FIELD_FIXED ( 0x10F, force_bold_threshold ) + CFF_FIELD_NUM ( 0x110, lenIV ) + CFF_FIELD_NUM ( 0x111, language_group ) + CFF_FIELD_FIXED ( 0x112, expansion_factor ) + CFF_FIELD_NUM ( 0x113, initial_random_seed ) + CFF_FIELD_NUM ( 19, local_subrs_offset ) + CFF_FIELD_NUM ( 20, default_width ) + CFF_FIELD_NUM ( 21, nominal_width ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cfftypes.h b/android/jni/ndk_modules/freetype/src/cff/cfftypes.h new file mode 100644 index 00000000..d4053576 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/cff/cfftypes.h @@ -0,0 +1,281 @@ +/***************************************************************************/ +/* */ +/* cfftypes.h */ +/* */ +/* Basic OpenType/CFF type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFTYPES_H__ +#define __CFFTYPES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CFF_IndexRec */ + /* */ + /* <Description> */ + /* A structure used to model a CFF Index table. */ + /* */ + /* <Fields> */ + /* stream :: The source input stream. */ + /* */ + /* start :: The position of the first index byte in the */ + /* input stream. */ + /* */ + /* count :: The number of elements in the index. */ + /* */ + /* off_size :: The size in bytes of object offsets in index. */ + /* */ + /* data_offset :: The position of first data byte in the index's */ + /* bytes. */ + /* */ + /* data_size :: The size of the data table in this index. */ + /* */ + /* offsets :: A table of element offsets in the index. Must be */ + /* loaded explicitly. */ + /* */ + /* bytes :: If the index is loaded in memory, its bytes. */ + /* */ + typedef struct CFF_IndexRec_ + { + FT_Stream stream; + FT_ULong start; + FT_UInt count; + FT_Byte off_size; + FT_ULong data_offset; + FT_ULong data_size; + + FT_ULong* offsets; + FT_Byte* bytes; + + } CFF_IndexRec, *CFF_Index; + + + typedef struct CFF_EncodingRec_ + { + FT_UInt format; + FT_ULong offset; + + FT_UInt count; + FT_UShort sids [256]; /* avoid dynamic allocations */ + FT_UShort codes[256]; + + } CFF_EncodingRec, *CFF_Encoding; + + + typedef struct CFF_CharsetRec_ + { + + FT_UInt format; + FT_ULong offset; + + FT_UShort* sids; + FT_UShort* cids; /* the inverse mapping of `sids'; only needed */ + /* for CID-keyed fonts */ + FT_UInt max_cid; + FT_UInt num_glyphs; + + } CFF_CharsetRec, *CFF_Charset; + + + typedef struct CFF_FontRecDictRec_ + { + FT_UInt version; + FT_UInt notice; + FT_UInt copyright; + FT_UInt full_name; + FT_UInt family_name; + FT_UInt weight; + FT_Bool is_fixed_pitch; + FT_Fixed italic_angle; + FT_Fixed underline_position; + FT_Fixed underline_thickness; + FT_Int paint_type; + FT_Int charstring_type; + FT_Matrix font_matrix; + FT_ULong units_per_em; /* temporarily used as scaling value also */ + FT_Vector font_offset; + FT_ULong unique_id; + FT_BBox font_bbox; + FT_Pos stroke_width; + FT_ULong charset_offset; + FT_ULong encoding_offset; + FT_ULong charstrings_offset; + FT_ULong private_offset; + FT_ULong private_size; + FT_Long synthetic_base; + FT_UInt embedded_postscript; + + /* these should only be used for the top-level font dictionary */ + FT_UInt cid_registry; + FT_UInt cid_ordering; + FT_Long cid_supplement; + + FT_Long cid_font_version; + FT_Long cid_font_revision; + FT_Long cid_font_type; + FT_ULong cid_count; + FT_ULong cid_uid_base; + FT_ULong cid_fd_array_offset; + FT_ULong cid_fd_select_offset; + FT_UInt cid_font_name; + + } CFF_FontRecDictRec, *CFF_FontRecDict; + + + typedef struct CFF_PrivateRec_ + { + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Pos blue_values[14]; + FT_Pos other_blues[10]; + FT_Pos family_blues[14]; + FT_Pos family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Pos blue_shift; + FT_Pos blue_fuzz; + FT_Pos standard_width; + FT_Pos standard_height; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Pos snap_widths[13]; + FT_Pos snap_heights[13]; + FT_Bool force_bold; + FT_Fixed force_bold_threshold; + FT_Int lenIV; + FT_Int language_group; + FT_Fixed expansion_factor; + FT_Long initial_random_seed; + FT_ULong local_subrs_offset; + FT_Pos default_width; + FT_Pos nominal_width; + + } CFF_PrivateRec, *CFF_Private; + + + typedef struct CFF_FDSelectRec_ + { + FT_Byte format; + FT_UInt range_count; + + /* that's the table, taken from the file `as is' */ + FT_Byte* data; + FT_UInt data_size; + + /* small cache for format 3 only */ + FT_UInt cache_first; + FT_UInt cache_count; + FT_Byte cache_fd; + + } CFF_FDSelectRec, *CFF_FDSelect; + + + /* A SubFont packs a font dict and a private dict together. They are */ + /* needed to support CID-keyed CFF fonts. */ + typedef struct CFF_SubFontRec_ + { + CFF_FontRecDictRec font_dict; + CFF_PrivateRec private_dict; + + CFF_IndexRec local_subrs_index; + FT_Byte** local_subrs; /* array of pointers into Local Subrs INDEX data */ + + } CFF_SubFontRec, *CFF_SubFont; + + + /* maximum number of sub-fonts in a CID-keyed file */ +#define CFF_MAX_CID_FONTS 32 + + + typedef struct CFF_FontRec_ + { + FT_Stream stream; + FT_Memory memory; + FT_UInt num_faces; + FT_UInt num_glyphs; + + FT_Byte version_major; + FT_Byte version_minor; + FT_Byte header_size; + FT_Byte absolute_offsize; + + + CFF_IndexRec name_index; + CFF_IndexRec top_dict_index; + CFF_IndexRec global_subrs_index; + + CFF_EncodingRec encoding; + CFF_CharsetRec charset; + + CFF_IndexRec charstrings_index; + CFF_IndexRec font_dict_index; + CFF_IndexRec private_index; + CFF_IndexRec local_subrs_index; + + FT_String* font_name; + + /* array of pointers into Global Subrs INDEX data */ + FT_Byte** global_subrs; + + /* array of pointers into String INDEX data stored at string_pool */ + FT_UInt num_strings; + FT_Byte** strings; + FT_Byte* string_pool; + + CFF_SubFontRec top_font; + FT_UInt num_subfonts; + CFF_SubFont subfonts[CFF_MAX_CID_FONTS]; + + CFF_FDSelectRec fd_select; + + /* interface to PostScript hinter */ + PSHinter_Service pshinter; + + /* interface to Postscript Names service */ + FT_Service_PsCMaps psnames; + + /* since version 2.3.0 */ + PS_FontInfoRec* font_info; /* font info dictionary */ + + /* since version 2.3.6 */ + FT_String* registry; + FT_String* ordering; + + } CFF_FontRec, *CFF_Font; + + +FT_END_HEADER + +#endif /* __CFFTYPES_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/afmparse.c b/android/jni/ndk_modules/freetype/src/psaux/afmparse.c new file mode 100644 index 00000000..d7de3736 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/afmparse.c @@ -0,0 +1,964 @@ +/***************************************************************************/ +/* */ +/* afmparse.c */ +/* */ +/* AFM parser (body). */ +/* */ +/* Copyright 2006, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +#include "afmparse.h" +#include "psconv.h" + +#include "psauxerr.h" + + +/***************************************************************************/ +/* */ +/* AFM_Stream */ +/* */ +/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib. */ +/* */ +/* */ + + enum + { + AFM_STREAM_STATUS_NORMAL, + AFM_STREAM_STATUS_EOC, + AFM_STREAM_STATUS_EOL, + AFM_STREAM_STATUS_EOF + }; + + + typedef struct AFM_StreamRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + + FT_Int status; + + } AFM_StreamRec; + + +#ifndef EOF +#define EOF -1 +#endif + + + /* this works because empty lines are ignored */ +#define AFM_IS_NEWLINE( ch ) ( (ch) == '\r' || (ch) == '\n' ) + +#define AFM_IS_EOF( ch ) ( (ch) == EOF || (ch) == '\x1a' ) +#define AFM_IS_SPACE( ch ) ( (ch) == ' ' || (ch) == '\t' ) + + /* column separator; there is no `column' in the spec actually */ +#define AFM_IS_SEP( ch ) ( (ch) == ';' ) + +#define AFM_GETC() \ + ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \ + : EOF ) + +#define AFM_STREAM_KEY_BEGIN( stream ) \ + (char*)( (stream)->cursor - 1 ) + +#define AFM_STREAM_KEY_LEN( stream, key ) \ + ( (char*)(stream)->cursor - key - 1 ) + +#define AFM_STATUS_EOC( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOC ) + +#define AFM_STATUS_EOL( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOL ) + +#define AFM_STATUS_EOF( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOF ) + + + static int + afm_stream_skip_spaces( AFM_Stream stream ) + { + int ch = 0; /* make stupid compiler happy */ + + + if ( AFM_STATUS_EOC( stream ) ) + return ';'; + + while ( 1 ) + { + ch = AFM_GETC(); + if ( !AFM_IS_SPACE( ch ) ) + break; + } + + if ( AFM_IS_NEWLINE( ch ) ) + stream->status = AFM_STREAM_STATUS_EOL; + else if ( AFM_IS_SEP( ch ) ) + stream->status = AFM_STREAM_STATUS_EOC; + else if ( AFM_IS_EOF( ch ) ) + stream->status = AFM_STREAM_STATUS_EOF; + + return ch; + } + + + /* read a key or value in current column */ + static char* + afm_stream_read_one( AFM_Stream stream ) + { + char* str; + int ch; + + + afm_stream_skip_spaces( stream ); + if ( AFM_STATUS_EOC( stream ) ) + return NULL; + + str = AFM_STREAM_KEY_BEGIN( stream ); + + while ( 1 ) + { + ch = AFM_GETC(); + if ( AFM_IS_SPACE( ch ) ) + break; + else if ( AFM_IS_NEWLINE( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOL; + break; + } + else if ( AFM_IS_SEP( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOC; + break; + } + else if ( AFM_IS_EOF( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOF; + break; + } + } + + return str; + } + + + /* read a string (i.e., read to EOL) */ + static char* + afm_stream_read_string( AFM_Stream stream ) + { + char* str; + int ch; + + + afm_stream_skip_spaces( stream ); + if ( AFM_STATUS_EOL( stream ) ) + return NULL; + + str = AFM_STREAM_KEY_BEGIN( stream ); + + /* scan to eol */ + while ( 1 ) + { + ch = AFM_GETC(); + if ( AFM_IS_NEWLINE( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOL; + break; + } + else if ( AFM_IS_EOF( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOF; + break; + } + } + + return str; + } + + + /*************************************************************************/ + /* */ + /* AFM_Parser */ + /* */ + /* */ + + /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */ + typedef enum AFM_Token_ + { + AFM_TOKEN_ASCENDER, + AFM_TOKEN_AXISLABEL, + AFM_TOKEN_AXISTYPE, + AFM_TOKEN_B, + AFM_TOKEN_BLENDAXISTYPES, + AFM_TOKEN_BLENDDESIGNMAP, + AFM_TOKEN_BLENDDESIGNPOSITIONS, + AFM_TOKEN_C, + AFM_TOKEN_CC, + AFM_TOKEN_CH, + AFM_TOKEN_CAPHEIGHT, + AFM_TOKEN_CHARWIDTH, + AFM_TOKEN_CHARACTERSET, + AFM_TOKEN_CHARACTERS, + AFM_TOKEN_DESCENDER, + AFM_TOKEN_ENCODINGSCHEME, + AFM_TOKEN_ENDAXIS, + AFM_TOKEN_ENDCHARMETRICS, + AFM_TOKEN_ENDCOMPOSITES, + AFM_TOKEN_ENDDIRECTION, + AFM_TOKEN_ENDFONTMETRICS, + AFM_TOKEN_ENDKERNDATA, + AFM_TOKEN_ENDKERNPAIRS, + AFM_TOKEN_ENDTRACKKERN, + AFM_TOKEN_ESCCHAR, + AFM_TOKEN_FAMILYNAME, + AFM_TOKEN_FONTBBOX, + AFM_TOKEN_FONTNAME, + AFM_TOKEN_FULLNAME, + AFM_TOKEN_ISBASEFONT, + AFM_TOKEN_ISCIDFONT, + AFM_TOKEN_ISFIXEDPITCH, + AFM_TOKEN_ISFIXEDV, + AFM_TOKEN_ITALICANGLE, + AFM_TOKEN_KP, + AFM_TOKEN_KPH, + AFM_TOKEN_KPX, + AFM_TOKEN_KPY, + AFM_TOKEN_L, + AFM_TOKEN_MAPPINGSCHEME, + AFM_TOKEN_METRICSSETS, + AFM_TOKEN_N, + AFM_TOKEN_NOTICE, + AFM_TOKEN_PCC, + AFM_TOKEN_STARTAXIS, + AFM_TOKEN_STARTCHARMETRICS, + AFM_TOKEN_STARTCOMPOSITES, + AFM_TOKEN_STARTDIRECTION, + AFM_TOKEN_STARTFONTMETRICS, + AFM_TOKEN_STARTKERNDATA, + AFM_TOKEN_STARTKERNPAIRS, + AFM_TOKEN_STARTKERNPAIRS0, + AFM_TOKEN_STARTKERNPAIRS1, + AFM_TOKEN_STARTTRACKKERN, + AFM_TOKEN_STDHW, + AFM_TOKEN_STDVW, + AFM_TOKEN_TRACKKERN, + AFM_TOKEN_UNDERLINEPOSITION, + AFM_TOKEN_UNDERLINETHICKNESS, + AFM_TOKEN_VV, + AFM_TOKEN_VVECTOR, + AFM_TOKEN_VERSION, + AFM_TOKEN_W, + AFM_TOKEN_W0, + AFM_TOKEN_W0X, + AFM_TOKEN_W0Y, + AFM_TOKEN_W1, + AFM_TOKEN_W1X, + AFM_TOKEN_W1Y, + AFM_TOKEN_WX, + AFM_TOKEN_WY, + AFM_TOKEN_WEIGHT, + AFM_TOKEN_WEIGHTVECTOR, + AFM_TOKEN_XHEIGHT, + N_AFM_TOKENS, + AFM_TOKEN_UNKNOWN + + } AFM_Token; + + + static const char* const afm_key_table[N_AFM_TOKENS] = + { + "Ascender", + "AxisLabel", + "AxisType", + "B", + "BlendAxisTypes", + "BlendDesignMap", + "BlendDesignPositions", + "C", + "CC", + "CH", + "CapHeight", + "CharWidth", + "CharacterSet", + "Characters", + "Descender", + "EncodingScheme", + "EndAxis", + "EndCharMetrics", + "EndComposites", + "EndDirection", + "EndFontMetrics", + "EndKernData", + "EndKernPairs", + "EndTrackKern", + "EscChar", + "FamilyName", + "FontBBox", + "FontName", + "FullName", + "IsBaseFont", + "IsCIDFont", + "IsFixedPitch", + "IsFixedV", + "ItalicAngle", + "KP", + "KPH", + "KPX", + "KPY", + "L", + "MappingScheme", + "MetricsSets", + "N", + "Notice", + "PCC", + "StartAxis", + "StartCharMetrics", + "StartComposites", + "StartDirection", + "StartFontMetrics", + "StartKernData", + "StartKernPairs", + "StartKernPairs0", + "StartKernPairs1", + "StartTrackKern", + "StdHW", + "StdVW", + "TrackKern", + "UnderlinePosition", + "UnderlineThickness", + "VV", + "VVector", + "Version", + "W", + "W0", + "W0X", + "W0Y", + "W1", + "W1X", + "W1Y", + "WX", + "WY", + "Weight", + "WeightVector", + "XHeight" + }; + + + /* + * `afm_parser_read_vals' and `afm_parser_next_key' provide + * high-level operations to an AFM_Stream. The rest of the + * parser functions should use them without accessing the + * AFM_Stream directly. + */ + + FT_LOCAL_DEF( FT_Int ) + afm_parser_read_vals( AFM_Parser parser, + AFM_Value vals, + FT_UInt n ) + { + AFM_Stream stream = parser->stream; + char* str; + FT_UInt i; + + + if ( n > AFM_MAX_ARGUMENTS ) + return 0; + + for ( i = 0; i < n; i++ ) + { + FT_Offset len; + AFM_Value val = vals + i; + + + if ( val->type == AFM_VALUE_TYPE_STRING ) + str = afm_stream_read_string( stream ); + else + str = afm_stream_read_one( stream ); + + if ( !str ) + break; + + len = AFM_STREAM_KEY_LEN( stream, str ); + + switch ( val->type ) + { + case AFM_VALUE_TYPE_STRING: + case AFM_VALUE_TYPE_NAME: + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( !FT_QALLOC( val->u.s, len + 1 ) ) + { + ft_memcpy( val->u.s, str, len ); + val->u.s[len] = '\0'; + } + } + break; + + case AFM_VALUE_TYPE_FIXED: + val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str, + (FT_Byte*)str + len, 0 ); + break; + + case AFM_VALUE_TYPE_INTEGER: + val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str, + (FT_Byte*)str + len ); + break; + + case AFM_VALUE_TYPE_BOOL: + val->u.b = FT_BOOL( len == 4 && + !ft_strncmp( str, "true", 4 ) ); + break; + + case AFM_VALUE_TYPE_INDEX: + if ( parser->get_index ) + val->u.i = parser->get_index( str, len, parser->user_data ); + else + val->u.i = 0; + break; + } + } + + return i; + } + + + FT_LOCAL_DEF( char* ) + afm_parser_next_key( AFM_Parser parser, + FT_Bool line, + FT_Offset* len ) + { + AFM_Stream stream = parser->stream; + char* key = 0; /* make stupid compiler happy */ + + + if ( line ) + { + while ( 1 ) + { + /* skip current line */ + if ( !AFM_STATUS_EOL( stream ) ) + afm_stream_read_string( stream ); + + stream->status = AFM_STREAM_STATUS_NORMAL; + key = afm_stream_read_one( stream ); + + /* skip empty line */ + if ( !key && + !AFM_STATUS_EOF( stream ) && + AFM_STATUS_EOL( stream ) ) + continue; + + break; + } + } + else + { + while ( 1 ) + { + /* skip current column */ + while ( !AFM_STATUS_EOC( stream ) ) + afm_stream_read_one( stream ); + + stream->status = AFM_STREAM_STATUS_NORMAL; + key = afm_stream_read_one( stream ); + + /* skip empty column */ + if ( !key && + !AFM_STATUS_EOF( stream ) && + AFM_STATUS_EOC( stream ) ) + continue; + + break; + } + } + + if ( len ) + *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key ) + : 0; + + return key; + } + + + static AFM_Token + afm_tokenize( const char* key, + FT_Offset len ) + { + int n; + + + for ( n = 0; n < N_AFM_TOKENS; n++ ) + { + if ( *( afm_key_table[n] ) == *key ) + { + for ( ; n < N_AFM_TOKENS; n++ ) + { + if ( *( afm_key_table[n] ) != *key ) + return AFM_TOKEN_UNKNOWN; + + if ( ft_strncmp( afm_key_table[n], key, len ) == 0 ) + return (AFM_Token) n; + } + } + } + + return AFM_TOKEN_UNKNOWN; + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_init( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ) + { + AFM_Stream stream = NULL; + FT_Error error; + + + if ( FT_NEW( stream ) ) + return error; + + stream->cursor = stream->base = base; + stream->limit = limit; + + /* don't skip the first line during the first call */ + stream->status = AFM_STREAM_STATUS_EOL; + + parser->memory = memory; + parser->stream = stream; + parser->FontInfo = NULL; + parser->get_index = NULL; + + return PSaux_Err_Ok; + } + + + FT_LOCAL( void ) + afm_parser_done( AFM_Parser parser ) + { + FT_Memory memory = parser->memory; + + + FT_FREE( parser->stream ); + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_read_int( AFM_Parser parser, + FT_Int* aint ) + { + AFM_ValueRec val; + + + val.type = AFM_VALUE_TYPE_INTEGER; + + if ( afm_parser_read_vals( parser, &val, 1 ) == 1 ) + { + *aint = val.u.i; + + return PSaux_Err_Ok; + } + else + return PSaux_Err_Syntax_Error; + } + + + static FT_Error + afm_parse_track_kern( AFM_Parser parser ) + { + AFM_FontInfo fi = parser->FontInfo; + AFM_TrackKern tk; + char* key; + FT_Offset len; + int n = -1; + + + if ( afm_parser_read_int( parser, &fi->NumTrackKern ) ) + goto Fail; + + if ( fi->NumTrackKern ) + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) ) + return error; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_ValueRec shared_vals[5]; + + + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_TRACKKERN: + n++; + + if ( n >= fi->NumTrackKern ) + goto Fail; + + tk = fi->TrackKerns + n; + + shared_vals[0].type = AFM_VALUE_TYPE_INTEGER; + shared_vals[1].type = AFM_VALUE_TYPE_FIXED; + shared_vals[2].type = AFM_VALUE_TYPE_FIXED; + shared_vals[3].type = AFM_VALUE_TYPE_FIXED; + shared_vals[4].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 ) + goto Fail; + + tk->degree = shared_vals[0].u.i; + tk->min_ptsize = shared_vals[1].u.f; + tk->min_kern = shared_vals[2].u.f; + tk->max_ptsize = shared_vals[3].u.f; + tk->max_kern = shared_vals[4].u.f; + + /* is this correct? */ + if ( tk->degree < 0 && tk->min_kern > 0 ) + tk->min_kern = -tk->min_kern; + break; + + case AFM_TOKEN_ENDTRACKKERN: + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + fi->NumTrackKern = n + 1; + return PSaux_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return PSaux_Err_Syntax_Error; + } + + +#undef KERN_INDEX +#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 ) + + + /* compare two kerning pairs */ + FT_CALLBACK_DEF( int ) + afm_compare_kern_pairs( const void* a, + const void* b ) + { + AFM_KernPair kp1 = (AFM_KernPair)a; + AFM_KernPair kp2 = (AFM_KernPair)b; + + FT_ULong index1 = KERN_INDEX( kp1->index1, kp1->index2 ); + FT_ULong index2 = KERN_INDEX( kp2->index1, kp2->index2 ); + + + if ( index1 > index2 ) + return 1; + else if ( index1 < index2 ) + return -1; + else + return 0; + } + + + static FT_Error + afm_parse_kern_pairs( AFM_Parser parser ) + { + AFM_FontInfo fi = parser->FontInfo; + AFM_KernPair kp; + char* key; + FT_Offset len; + int n = -1; + + + if ( afm_parser_read_int( parser, &fi->NumKernPair ) ) + goto Fail; + + if ( fi->NumKernPair ) + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) + return error; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_Token token = afm_tokenize( key, len ); + + + switch ( token ) + { + case AFM_TOKEN_KP: + case AFM_TOKEN_KPX: + case AFM_TOKEN_KPY: + { + FT_Int r; + AFM_ValueRec shared_vals[4]; + + + n++; + + if ( n >= fi->NumKernPair ) + goto Fail; + + kp = fi->KernPairs + n; + + shared_vals[0].type = AFM_VALUE_TYPE_INDEX; + shared_vals[1].type = AFM_VALUE_TYPE_INDEX; + shared_vals[2].type = AFM_VALUE_TYPE_INTEGER; + shared_vals[3].type = AFM_VALUE_TYPE_INTEGER; + r = afm_parser_read_vals( parser, shared_vals, 4 ); + if ( r < 3 ) + goto Fail; + + kp->index1 = shared_vals[0].u.i; + kp->index2 = shared_vals[1].u.i; + if ( token == AFM_TOKEN_KPY ) + { + kp->x = 0; + kp->y = shared_vals[2].u.i; + } + else + { + kp->x = shared_vals[2].u.i; + kp->y = ( token == AFM_TOKEN_KP && r == 4 ) + ? shared_vals[3].u.i : 0; + } + } + break; + + case AFM_TOKEN_ENDKERNPAIRS: + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + fi->NumKernPair = n + 1; + ft_qsort( fi->KernPairs, fi->NumKernPair, + sizeof( AFM_KernPairRec ), + afm_compare_kern_pairs ); + return PSaux_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return PSaux_Err_Syntax_Error; + } + + + static FT_Error + afm_parse_kern_data( AFM_Parser parser ) + { + FT_Error error; + char* key; + FT_Offset len; + + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_STARTTRACKKERN: + error = afm_parse_track_kern( parser ); + if ( error ) + return error; + break; + + case AFM_TOKEN_STARTKERNPAIRS: + case AFM_TOKEN_STARTKERNPAIRS0: + error = afm_parse_kern_pairs( parser ); + if ( error ) + return error; + break; + + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + return PSaux_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return PSaux_Err_Syntax_Error; + } + + + static FT_Error + afm_parser_skip_section( AFM_Parser parser, + FT_UInt n, + AFM_Token end_section ) + { + char* key; + FT_Offset len; + + + while ( n-- > 0 ) + { + key = afm_parser_next_key( parser, 1, NULL ); + if ( !key ) + goto Fail; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_Token token = afm_tokenize( key, len ); + + + if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS ) + return PSaux_Err_Ok; + } + + Fail: + return PSaux_Err_Syntax_Error; + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_parse( AFM_Parser parser ) + { + FT_Memory memory = parser->memory; + AFM_FontInfo fi = parser->FontInfo; + FT_Error error = PSaux_Err_Syntax_Error; + char* key; + FT_Offset len; + FT_Int metrics_sets = 0; + + + if ( !fi ) + return PSaux_Err_Invalid_Argument; + + key = afm_parser_next_key( parser, 1, &len ); + if ( !key || len != 16 || + ft_strncmp( key, "StartFontMetrics", 16 ) != 0 ) + return PSaux_Err_Unknown_File_Format; + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_ValueRec shared_vals[4]; + + + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_METRICSSETS: + if ( afm_parser_read_int( parser, &metrics_sets ) ) + goto Fail; + + if ( metrics_sets != 0 && metrics_sets != 2 ) + { + error = PSaux_Err_Unimplemented_Feature; + + goto Fail; + } + break; + + case AFM_TOKEN_ISCIDFONT: + shared_vals[0].type = AFM_VALUE_TYPE_BOOL; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->IsCIDFont = shared_vals[0].u.b; + break; + + case AFM_TOKEN_FONTBBOX: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + shared_vals[1].type = AFM_VALUE_TYPE_FIXED; + shared_vals[2].type = AFM_VALUE_TYPE_FIXED; + shared_vals[3].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 ) + goto Fail; + + fi->FontBBox.xMin = shared_vals[0].u.f; + fi->FontBBox.yMin = shared_vals[1].u.f; + fi->FontBBox.xMax = shared_vals[2].u.f; + fi->FontBBox.yMax = shared_vals[3].u.f; + break; + + case AFM_TOKEN_ASCENDER: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->Ascender = shared_vals[0].u.f; + break; + + case AFM_TOKEN_DESCENDER: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->Descender = shared_vals[0].u.f; + break; + + case AFM_TOKEN_STARTCHARMETRICS: + { + FT_Int n = 0; + + + if ( afm_parser_read_int( parser, &n ) ) + goto Fail; + + error = afm_parser_skip_section( parser, n, + AFM_TOKEN_ENDCHARMETRICS ); + if ( error ) + return error; + } + break; + + case AFM_TOKEN_STARTKERNDATA: + error = afm_parse_kern_data( parser ); + if ( error ) + goto Fail; + /* fall through since we only support kern data */ + + case AFM_TOKEN_ENDFONTMETRICS: + return PSaux_Err_Ok; + + default: + break; + } + } + + Fail: + FT_FREE( fi->TrackKerns ); + fi->NumTrackKern = 0; + + FT_FREE( fi->KernPairs ); + fi->NumKernPair = 0; + + fi->IsCIDFont = 0; + + return error; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/afmparse.h b/android/jni/ndk_modules/freetype/src/psaux/afmparse.h new file mode 100644 index 00000000..35d96046 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/afmparse.h @@ -0,0 +1,88 @@ +/***************************************************************************/ +/* */ +/* afmparse.h */ +/* */ +/* AFM parser (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFMPARSE_H__ +#define __AFMPARSE_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + afm_parser_init( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ); + + + FT_LOCAL( void ) + afm_parser_done( AFM_Parser parser ); + + + FT_LOCAL( FT_Error ) + afm_parser_parse( AFM_Parser parser ); + + + enum AFM_ValueType_ + { + AFM_VALUE_TYPE_STRING, + AFM_VALUE_TYPE_NAME, + AFM_VALUE_TYPE_FIXED, /* real number */ + AFM_VALUE_TYPE_INTEGER, + AFM_VALUE_TYPE_BOOL, + AFM_VALUE_TYPE_INDEX /* glyph index */ + }; + + + typedef struct AFM_ValueRec_ + { + enum AFM_ValueType_ type; + union + { + char* s; + FT_Fixed f; + FT_Int i; + FT_Bool b; + + } u; + + } AFM_ValueRec, *AFM_Value; + +#define AFM_MAX_ARGUMENTS 5 + + FT_LOCAL( FT_Int ) + afm_parser_read_vals( AFM_Parser parser, + AFM_Value vals, + FT_UInt n ); + + /* read the next key from the next line or column */ + FT_LOCAL( char* ) + afm_parser_next_key( AFM_Parser parser, + FT_Bool line, + FT_Offset* len ); + +FT_END_HEADER + +#endif /* __AFMPARSE_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psaux.c b/android/jni/ndk_modules/freetype/src/psaux/psaux.c new file mode 100644 index 00000000..a4b9c5c6 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/psaux.c @@ -0,0 +1,34 @@ +/***************************************************************************/ +/* */ +/* psaux.c */ +/* */ +/* FreeType auxiliary PostScript driver component (body only). */ +/* */ +/* Copyright 1996-2001, 2002, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "psobjs.c" +#include "psauxmod.c" +#include "t1decode.c" +#include "t1cmap.c" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "afmparse.c" +#endif + +#include "psconv.c" + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psauxerr.h b/android/jni/ndk_modules/freetype/src/psaux/psauxerr.h new file mode 100644 index 00000000..d0baa3cb --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/psauxerr.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* psauxerr.h */ +/* */ +/* PS auxiliary module error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PS auxiliary module error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PSAUXERR_H__ +#define __PSAUXERR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PSaux_Err_ +#define FT_ERR_BASE FT_Mod_Err_PSaux + +#include FT_ERRORS_H + +#endif /* __PSAUXERR_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psauxmod.c b/android/jni/ndk_modules/freetype/src/psaux/psauxmod.c new file mode 100644 index 00000000..4c3579f7 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/psauxmod.c @@ -0,0 +1,139 @@ +/***************************************************************************/ +/* */ +/* psauxmod.c */ +/* */ +/* FreeType auxiliary PostScript module implementation (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "psauxmod.h" +#include "psobjs.h" +#include "t1decode.h" +#include "t1cmap.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "afmparse.h" +#endif + + + FT_CALLBACK_TABLE_DEF + const PS_Table_FuncsRec ps_table_funcs = + { + ps_table_new, + ps_table_done, + ps_table_add, + ps_table_release + }; + + + FT_CALLBACK_TABLE_DEF + const PS_Parser_FuncsRec ps_parser_funcs = + { + ps_parser_init, + ps_parser_done, + ps_parser_skip_spaces, + ps_parser_skip_PS_token, + ps_parser_to_int, + ps_parser_to_fixed, + ps_parser_to_bytes, + ps_parser_to_coord_array, + ps_parser_to_fixed_array, + ps_parser_to_token, + ps_parser_to_token_array, + ps_parser_load_field, + ps_parser_load_field_table + }; + + + FT_CALLBACK_TABLE_DEF + const T1_Builder_FuncsRec t1_builder_funcs = + { + t1_builder_init, + t1_builder_done, + t1_builder_check_points, + t1_builder_add_point, + t1_builder_add_point1, + t1_builder_add_contour, + t1_builder_start_point, + t1_builder_close_contour + }; + + + FT_CALLBACK_TABLE_DEF + const T1_Decoder_FuncsRec t1_decoder_funcs = + { + t1_decoder_init, + t1_decoder_done, + t1_decoder_parse_charstrings + }; + + +#ifndef T1_CONFIG_OPTION_NO_AFM + FT_CALLBACK_TABLE_DEF + const AFM_Parser_FuncsRec afm_parser_funcs = + { + afm_parser_init, + afm_parser_done, + afm_parser_parse + }; +#endif + + + FT_CALLBACK_TABLE_DEF + const T1_CMap_ClassesRec t1_cmap_classes = + { + &t1_cmap_standard_class_rec, + &t1_cmap_expert_class_rec, + &t1_cmap_custom_class_rec, + &t1_cmap_unicode_class_rec + }; + + + static + const PSAux_Interface psaux_interface = + { + &ps_table_funcs, + &ps_parser_funcs, + &t1_builder_funcs, + &t1_decoder_funcs, + t1_decrypt, + + (const T1_CMap_ClassesRec*) &t1_cmap_classes, + +#ifndef T1_CONFIG_OPTION_NO_AFM + &afm_parser_funcs, +#else + 0, +#endif + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class psaux_module_class = + { + 0, + sizeof( FT_ModuleRec ), + "psaux", + 0x20000L, + 0x20000L, + + &psaux_interface, /* module-specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + }; + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psauxmod.h b/android/jni/ndk_modules/freetype/src/psaux/psauxmod.h new file mode 100644 index 00000000..35e042db --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/psauxmod.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* psauxmod.h */ +/* */ +/* FreeType auxiliary PostScript module implementation (specification). */ +/* */ +/* Copyright 2000-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSAUXMOD_H__ +#define __PSAUXMOD_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif + + + FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class; + + +FT_END_HEADER + +#endif /* __PSAUXMOD_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psconv.c b/android/jni/ndk_modules/freetype/src/psaux/psconv.c new file mode 100644 index 00000000..1531d8f0 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/psconv.c @@ -0,0 +1,472 @@ +/***************************************************************************/ +/* */ +/* psconv.c */ +/* */ +/* Some convenience conversions (body). */ +/* */ +/* Copyright 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +#include "psconv.h" +#include "psauxerr.h" + + + /* The following array is used by various functions to quickly convert */ + /* digits (both decimal and non-decimal) into numbers. */ + +#if 'A' == 65 + /* ASCII */ + + static const FT_Char ft_char_table[128] = + { + /* 0x00 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 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, -1, -1, -1, -1, -1, + -1, 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, -1, -1, -1, -1, -1, + }; + + /* no character >= 0x80 can represent a valid number */ +#define OP >= + +#endif /* 'A' == 65 */ + +#if 'A' == 193 + /* EBCDIC */ + + static const FT_Char ft_char_table[128] = + { + /* 0x80 */ + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + }; + + /* no character < 0x80 can represent a valid number */ +#define OP < + +#endif /* 'A' == 193 */ + + + FT_LOCAL_DEF( FT_Int ) + PS_Conv_Strtol( FT_Byte** cursor, + FT_Byte* limit, + FT_Int base ) + { + FT_Byte* p = *cursor; + FT_Int num = 0; + FT_Bool sign = 0; + + + if ( p == limit || base < 2 || base > 36 ) + return 0; + + if ( *p == '-' || *p == '+' ) + { + sign = FT_BOOL( *p == '-' ); + + p++; + if ( p == limit ) + return 0; + } + + for ( ; p < limit; p++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7f]; + + if ( c < 0 || c >= base ) + break; + + num = num * base + c; + } + + if ( sign ) + num = -num; + + *cursor = p; + + return num; + } + + + FT_LOCAL_DEF( FT_Int ) + PS_Conv_ToInt( FT_Byte** cursor, + FT_Byte* limit ) + + { + FT_Byte* p; + FT_Int num; + + + num = PS_Conv_Strtol( cursor, limit, 10 ); + p = *cursor; + + if ( p < limit && *p == '#' ) + { + *cursor = p + 1; + + return PS_Conv_Strtol( cursor, limit, num ); + } + else + return num; + } + + + FT_LOCAL_DEF( FT_Fixed ) + PS_Conv_ToFixed( FT_Byte** cursor, + FT_Byte* limit, + FT_Int power_ten ) + { + FT_Byte* p = *cursor; + FT_Fixed integral; + FT_Long decimal = 0, divider = 1; + FT_Bool sign = 0; + + + if ( p == limit ) + return 0; + + if ( *p == '-' || *p == '+' ) + { + sign = FT_BOOL( *p == '-' ); + + p++; + if ( p == limit ) + return 0; + } + + if ( *p != '.' ) + integral = PS_Conv_ToInt( &p, limit ) << 16; + else + integral = 0; + + /* read the decimal part */ + if ( p < limit && *p == '.' ) + { + p++; + + for ( ; p < limit; p++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7f]; + + if ( c < 0 || c >= 10 ) + break; + + if ( !integral && power_ten > 0 ) + { + power_ten--; + decimal = decimal * 10 + c; + } + else + { + if ( divider < 10000000L ) + { + decimal = decimal * 10 + c; + divider *= 10; + } + } + } + } + + /* read exponent, if any */ + if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) ) + { + p++; + power_ten += PS_Conv_ToInt( &p, limit ); + } + + while ( power_ten > 0 ) + { + integral *= 10; + decimal *= 10; + power_ten--; + } + + while ( power_ten < 0 ) + { + integral /= 10; + divider *= 10; + power_ten++; + } + + if ( decimal ) + integral += FT_DivFix( decimal, divider ); + + if ( sign ) + integral = -integral; + + *cursor = p; + + return integral; + } + + +#if 0 + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_StringDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ) + { + FT_Byte* p; + FT_UInt r = 0; + + + for ( p = *cursor; r < n && p < limit; p++ ) + { + FT_Byte b; + + + if ( *p != '\\' ) + { + buffer[r++] = *p; + + continue; + } + + p++; + + switch ( *p ) + { + case 'n': + b = '\n'; + break; + case 'r': + b = '\r'; + break; + case 't': + b = '\t'; + break; + case 'b': + b = '\b'; + break; + case 'f': + b = '\f'; + break; + case '\r': + p++; + if ( *p != '\n' ) + { + b = *p; + + break; + } + /* no break */ + case '\n': + continue; + break; + default: + if ( IS_PS_DIGIT( *p ) ) + { + b = *p - '0'; + + p++; + + if ( IS_PS_DIGIT( *p ) ) + { + b = b * 8 + *p - '0'; + + p++; + + if ( IS_PS_DIGIT( *p ) ) + b = b * 8 + *p - '0'; + else + { + buffer[r++] = b; + b = *p; + } + } + else + { + buffer[r++] = b; + b = *p; + } + } + else + b = *p; + break; + } + + buffer[r++] = b; + } + + *cursor = p; + + return r; + } +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_ASCIIHexDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ) + { + FT_Byte* p; + FT_UInt r = 0; + FT_UInt w = 0; + FT_UInt pad = 0x01; + + + n *= 2; + +#if 1 + + p = *cursor; + if ( n > (FT_UInt)( limit - p ) ) + n = (FT_UInt)( limit - p ); + + /* we try to process two nibbles at a time to be as fast as possible */ + for ( ; r < n; r++ ) + { + FT_UInt c = p[r]; + + + if ( IS_PS_SPACE( c ) ) + continue; + + if ( c OP 0x80 ) + break; + + c = ft_char_table[c & 0x7F]; + if ( (unsigned)c >= 16 ) + break; + + pad = ( pad << 4 ) | c; + if ( pad & 0x100 ) + { + buffer[w++] = (FT_Byte)pad; + pad = 0x01; + } + } + + if ( pad != 0x01 ) + buffer[w++] = (FT_Byte)( pad << 4 ); + + *cursor = p + r; + + return w; + +#else /* 0 */ + + for ( r = 0; r < n; r++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) ) + continue; + + if ( *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7f]; + + if ( (unsigned)c >= 16 ) + break; + + if ( r & 1 ) + { + *buffer = (FT_Byte)(*buffer + c); + buffer++; + } + else + *buffer = (FT_Byte)(c << 4); + + r++; + } + + *cursor = p; + + return ( r + 1 ) / 2; + +#endif /* 0 */ + + } + + + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_EexecDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n, + FT_UShort* seed ) + { + FT_Byte* p; + FT_UInt r; + FT_UInt s = *seed; + + +#if 1 + + p = *cursor; + if ( n > (FT_UInt)(limit - p) ) + n = (FT_UInt)(limit - p); + + for ( r = 0; r < n; r++ ) + { + FT_UInt val = p[r]; + FT_UInt b = ( val ^ ( s >> 8 ) ); + + + s = ( (val + s)*52845U + 22719 ) & 0xFFFFU; + buffer[r] = (FT_Byte) b; + } + + *cursor = p + n; + *seed = (FT_UShort)s; + +#else /* 0 */ + + for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ ) + { + FT_Byte b = (FT_Byte)( *p ^ ( s >> 8 ) ); + + + s = (FT_UShort)( ( *p + s ) * 52845U + 22719 ); + *buffer++ = b; + } + *cursor = p; + *seed = s; + +#endif /* 0 */ + + return r; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psconv.h b/android/jni/ndk_modules/freetype/src/psaux/psconv.h new file mode 100644 index 00000000..84854ba0 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/psconv.h @@ -0,0 +1,71 @@ +/***************************************************************************/ +/* */ +/* psconv.h */ +/* */ +/* Some convenience conversions (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSCONV_H__ +#define __PSCONV_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Int ) + PS_Conv_Strtol( FT_Byte** cursor, + FT_Byte* limit, + FT_Int base ); + + + FT_LOCAL( FT_Int ) + PS_Conv_ToInt( FT_Byte** cursor, + FT_Byte* limit ); + + FT_LOCAL( FT_Fixed ) + PS_Conv_ToFixed( FT_Byte** cursor, + FT_Byte* limit, + FT_Int power_ten ); + +#if 0 + FT_LOCAL( FT_UInt ) + PS_Conv_StringDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ); +#endif + + FT_LOCAL( FT_UInt ) + PS_Conv_ASCIIHexDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ); + + FT_LOCAL( FT_UInt ) + PS_Conv_EexecDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n, + FT_UShort* seed ); + + +FT_END_HEADER + +#endif /* __PSCONV_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psobjs.c b/android/jni/ndk_modules/freetype/src/psaux/psobjs.c new file mode 100644 index 00000000..45c74191 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/psobjs.c @@ -0,0 +1,1711 @@ +/***************************************************************************/ +/* */ +/* psobjs.c */ +/* */ +/* Auxiliary functions for PostScript fonts (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H + +#include "psobjs.h" +#include "psconv.h" + +#include "psauxerr.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_psobjs + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ps_table_new */ + /* */ + /* <Description> */ + /* Initializes a PS_Table. */ + /* */ + /* <InOut> */ + /* table :: The address of the target table. */ + /* */ + /* <Input> */ + /* count :: The table size = the maximum number of elements. */ + /* */ + /* memory :: The memory object to use for all subsequent */ + /* reallocations. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + ps_table_new( PS_Table table, + FT_Int count, + FT_Memory memory ) + { + FT_Error error; + + + table->memory = memory; + if ( FT_NEW_ARRAY( table->elements, count ) || + FT_NEW_ARRAY( table->lengths, count ) ) + goto Exit; + + table->max_elems = count; + table->init = 0xDEADBEEFUL; + table->num_elems = 0; + table->block = 0; + table->capacity = 0; + table->cursor = 0; + + *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs; + + Exit: + if ( error ) + FT_FREE( table->elements ); + + return error; + } + + + static void + shift_elements( PS_Table table, + FT_Byte* old_base ) + { + FT_PtrDist delta = table->block - old_base; + FT_Byte** offset = table->elements; + FT_Byte** limit = offset + table->max_elems; + + + for ( ; offset < limit; offset++ ) + { + if ( offset[0] ) + offset[0] += delta; + } + } + + + static FT_Error + reallocate_t1_table( PS_Table table, + FT_Long new_size ) + { + FT_Memory memory = table->memory; + FT_Byte* old_base = table->block; + FT_Error error; + + + /* allocate new base block */ + if ( FT_ALLOC( table->block, new_size ) ) + { + table->block = old_base; + return error; + } + + /* copy elements and shift offsets */ + if ( old_base ) + { + FT_MEM_COPY( table->block, old_base, table->capacity ); + shift_elements( table, old_base ); + FT_FREE( old_base ); + } + + table->capacity = new_size; + + return PSaux_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ps_table_add */ + /* */ + /* <Description> */ + /* Adds an object to a PS_Table, possibly growing its memory block. */ + /* */ + /* <InOut> */ + /* table :: The target table. */ + /* */ + /* <Input> */ + /* idx :: The index of the object in the table. */ + /* */ + /* object :: The address of the object to copy in memory. */ + /* */ + /* length :: The length in bytes of the source object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. An error is returned if a */ + /* reallocation fails. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + ps_table_add( PS_Table table, + FT_Int idx, + void* object, + FT_PtrDist length ) + { + if ( idx < 0 || idx >= table->max_elems ) + { + FT_ERROR(( "ps_table_add: invalid index\n" )); + return PSaux_Err_Invalid_Argument; + } + + if ( length < 0 ) + { + FT_ERROR(( "ps_table_add: invalid length\n" )); + return PSaux_Err_Invalid_Argument; + } + + /* grow the base block if needed */ + if ( table->cursor + length > table->capacity ) + { + FT_Error error; + FT_Offset new_size = table->capacity; + FT_Long in_offset; + + + in_offset = (FT_Long)((FT_Byte*)object - table->block); + if ( (FT_ULong)in_offset >= table->capacity ) + in_offset = -1; + + while ( new_size < table->cursor + length ) + { + /* increase size by 25% and round up to the nearest multiple + of 1024 */ + new_size += ( new_size >> 2 ) + 1; + new_size = FT_PAD_CEIL( new_size, 1024 ); + } + + error = reallocate_t1_table( table, new_size ); + if ( error ) + return error; + + if ( in_offset >= 0 ) + object = table->block + in_offset; + } + + /* add the object to the base block and adjust offset */ + table->elements[idx] = table->block + table->cursor; + table->lengths [idx] = length; + FT_MEM_COPY( table->block + table->cursor, object, length ); + + table->cursor += length; + return PSaux_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ps_table_done */ + /* */ + /* <Description> */ + /* Finalizes a PS_TableRec (i.e., reallocate it to its current */ + /* cursor). */ + /* */ + /* <InOut> */ + /* table :: The target table. */ + /* */ + /* <Note> */ + /* This function does NOT release the heap's memory block. It is up */ + /* to the caller to clean it, or reference it in its own structures. */ + /* */ + FT_LOCAL_DEF( void ) + ps_table_done( PS_Table table ) + { + FT_Memory memory = table->memory; + FT_Error error; + FT_Byte* old_base = table->block; + + + /* should never fail, because rec.cursor <= rec.size */ + if ( !old_base ) + return; + + if ( FT_ALLOC( table->block, table->cursor ) ) + return; + FT_MEM_COPY( table->block, old_base, table->cursor ); + shift_elements( table, old_base ); + + table->capacity = table->cursor; + FT_FREE( old_base ); + + FT_UNUSED( error ); + } + + + FT_LOCAL_DEF( void ) + ps_table_release( PS_Table table ) + { + FT_Memory memory = table->memory; + + + if ( (FT_ULong)table->init == 0xDEADBEEFUL ) + { + FT_FREE( table->block ); + FT_FREE( table->elements ); + FT_FREE( table->lengths ); + table->init = 0; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* first character must be already part of the comment */ + + static void + skip_comment( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + + + while ( cur < limit ) + { + if ( IS_PS_NEWLINE( *cur ) ) + break; + cur++; + } + + *acur = cur; + } + + + static void + skip_spaces( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + + + while ( cur < limit ) + { + if ( !IS_PS_SPACE( *cur ) ) + { + if ( *cur == '%' ) + /* According to the PLRM, a comment is equal to a space. */ + skip_comment( &cur, limit ); + else + break; + } + cur++; + } + + *acur = cur; + } + + +#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' ) + + + /* first character must be `('; */ + /* *acur is positioned at the character after the closing `)' */ + + static FT_Error + skip_literal_string( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Int embed = 0; + FT_Error error = PSaux_Err_Invalid_File_Format; + unsigned int i; + + + while ( cur < limit ) + { + FT_Byte c = *cur; + + + ++cur; + + if ( c == '\\' ) + { + /* Red Book 3rd ed., section `Literal Text Strings', p. 29: */ + /* A backslash can introduce three different types */ + /* of escape sequences: */ + /* - a special escaped char like \r, \n, etc. */ + /* - a one-, two-, or three-digit octal number */ + /* - none of the above in which case the backslash is ignored */ + + if ( cur == limit ) + /* error (or to be ignored?) */ + break; + + switch ( *cur ) + { + /* skip `special' escape */ + case 'n': + case 'r': + case 't': + case 'b': + case 'f': + case '\\': + case '(': + case ')': + ++cur; + break; + + default: + /* skip octal escape or ignore backslash */ + for ( i = 0; i < 3 && cur < limit; ++i ) + { + if ( !IS_OCTAL_DIGIT( *cur ) ) + break; + + ++cur; + } + } + } + else if ( c == '(' ) + embed++; + else if ( c == ')' ) + { + embed--; + if ( embed == 0 ) + { + error = PSaux_Err_Ok; + break; + } + } + } + + *acur = cur; + + return error; + } + + + /* first character must be `<' */ + + static FT_Error + skip_string( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Error err = PSaux_Err_Ok; + + + while ( ++cur < limit ) + { + /* All whitespace characters are ignored. */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + break; + + if ( !IS_PS_XDIGIT( *cur ) ) + break; + } + + if ( cur < limit && *cur != '>' ) + { + FT_ERROR(( "skip_string: missing closing delimiter `>'\n" )); + err = PSaux_Err_Invalid_File_Format; + } + else + cur++; + + *acur = cur; + return err; + } + + + /* first character must be the opening brace that */ + /* starts the procedure */ + + /* NB: [ and ] need not match: */ + /* `/foo {[} def' is a valid PostScript fragment, */ + /* even within a Type1 font */ + + static FT_Error + skip_procedure( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur; + FT_Int embed = 0; + FT_Error error = PSaux_Err_Ok; + + + FT_ASSERT( **acur == '{' ); + + for ( cur = *acur; cur < limit && error == PSaux_Err_Ok; ++cur ) + { + switch ( *cur ) + { + case '{': + ++embed; + break; + + case '}': + --embed; + if ( embed == 0 ) + { + ++cur; + goto end; + } + break; + + case '(': + error = skip_literal_string( &cur, limit ); + break; + + case '<': + error = skip_string( &cur, limit ); + break; + + case '%': + skip_comment( &cur, limit ); + break; + } + } + + end: + if ( embed != 0 ) + error = PSaux_Err_Invalid_File_Format; + + *acur = cur; + + return error; + } + + + /***********************************************************************/ + /* */ + /* All exported parsing routines handle leading whitespace and stop at */ + /* the first character which isn't part of the just handled token. */ + /* */ + /***********************************************************************/ + + + FT_LOCAL_DEF( void ) + ps_parser_skip_PS_token( PS_Parser parser ) + { + /* Note: PostScript allows any non-delimiting, non-whitespace */ + /* character in a name (PS Ref Manual, 3rd ed, p31). */ + /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */ + + FT_Byte* cur = parser->cursor; + FT_Byte* limit = parser->limit; + FT_Error error = PSaux_Err_Ok; + + + skip_spaces( &cur, limit ); /* this also skips comments */ + if ( cur >= limit ) + goto Exit; + + /* self-delimiting, single-character tokens */ + if ( *cur == '[' || *cur == ']' ) + { + cur++; + goto Exit; + } + + /* skip balanced expressions (procedures and strings) */ + + if ( *cur == '{' ) /* {...} */ + { + error = skip_procedure( &cur, limit ); + goto Exit; + } + + if ( *cur == '(' ) /* (...) */ + { + error = skip_literal_string( &cur, limit ); + goto Exit; + } + + if ( *cur == '<' ) /* <...> */ + { + if ( cur + 1 < limit && *(cur + 1) == '<' ) /* << */ + { + cur++; + cur++; + } + else + error = skip_string( &cur, limit ); + + goto Exit; + } + + if ( *cur == '>' ) + { + cur++; + if ( cur >= limit || *cur != '>' ) /* >> */ + { + FT_ERROR(( "ps_parser_skip_PS_token:" + " unexpected closing delimiter `>'\n" )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + cur++; + goto Exit; + } + + if ( *cur == '/' ) + cur++; + + /* anything else */ + while ( cur < limit ) + { + /* *cur might be invalid (e.g., ')' or '}'), but this */ + /* is handled by the test `cur == parser->cursor' below */ + if ( IS_PS_DELIM( *cur ) ) + break; + + cur++; + } + + Exit: + if ( cur == parser->cursor ) + { + FT_ERROR(( "ps_parser_skip_PS_token:" + " current token is `%c' which is self-delimiting\n" + " " + " but invalid at this point\n", + *cur )); + + error = PSaux_Err_Invalid_File_Format; + } + + parser->error = error; + parser->cursor = cur; + } + + + FT_LOCAL_DEF( void ) + ps_parser_skip_spaces( PS_Parser parser ) + { + skip_spaces( &parser->cursor, parser->limit ); + } + + + /* `token' here means either something between balanced delimiters */ + /* or the next token; the delimiters are not removed. */ + + FT_LOCAL_DEF( void ) + ps_parser_to_token( PS_Parser parser, + T1_Token token ) + { + FT_Byte* cur; + FT_Byte* limit; + FT_Int embed; + + + token->type = T1_TOKEN_TYPE_NONE; + token->start = 0; + token->limit = 0; + + /* first of all, skip leading whitespace */ + ps_parser_skip_spaces( parser ); + + cur = parser->cursor; + limit = parser->limit; + + if ( cur >= limit ) + return; + + switch ( *cur ) + { + /************* check for literal string *****************/ + case '(': + token->type = T1_TOKEN_TYPE_STRING; + token->start = cur; + + if ( skip_literal_string( &cur, limit ) == PSaux_Err_Ok ) + token->limit = cur; + break; + + /************* check for programs/array *****************/ + case '{': + token->type = T1_TOKEN_TYPE_ARRAY; + token->start = cur; + + if ( skip_procedure( &cur, limit ) == PSaux_Err_Ok ) + token->limit = cur; + break; + + /************* check for table/array ********************/ + /* XXX: in theory we should also look for "<<" */ + /* since this is semantically equivalent to "["; */ + /* in practice it doesn't matter (?) */ + case '[': + token->type = T1_TOKEN_TYPE_ARRAY; + embed = 1; + token->start = cur++; + + /* we need this to catch `[ ]' */ + parser->cursor = cur; + ps_parser_skip_spaces( parser ); + cur = parser->cursor; + + while ( cur < limit && !parser->error ) + { + /* XXX: this is wrong because it does not */ + /* skip comments, procedures, and strings */ + if ( *cur == '[' ) + embed++; + else if ( *cur == ']' ) + { + embed--; + if ( embed <= 0 ) + { + token->limit = ++cur; + break; + } + } + + parser->cursor = cur; + ps_parser_skip_PS_token( parser ); + /* we need this to catch `[XXX ]' */ + ps_parser_skip_spaces ( parser ); + cur = parser->cursor; + } + break; + + /* ************ otherwise, it is any token **************/ + default: + token->start = cur; + token->type = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY ); + ps_parser_skip_PS_token( parser ); + cur = parser->cursor; + if ( !parser->error ) + token->limit = cur; + } + + if ( !token->limit ) + { + token->start = 0; + token->type = T1_TOKEN_TYPE_NONE; + } + + parser->cursor = cur; + } + + + /* NB: `tokens' can be NULL if we only want to count */ + /* the number of array elements */ + + FT_LOCAL_DEF( void ) + ps_parser_to_token_array( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ) + { + T1_TokenRec master; + + + *pnum_tokens = -1; + + /* this also handles leading whitespace */ + ps_parser_to_token( parser, &master ); + + if ( master.type == T1_TOKEN_TYPE_ARRAY ) + { + FT_Byte* old_cursor = parser->cursor; + FT_Byte* old_limit = parser->limit; + T1_Token cur = tokens; + T1_Token limit = cur + max_tokens; + + + /* don't include outermost delimiters */ + parser->cursor = master.start + 1; + parser->limit = master.limit - 1; + + while ( parser->cursor < parser->limit ) + { + T1_TokenRec token; + + + ps_parser_to_token( parser, &token ); + if ( !token.type ) + break; + + if ( tokens != NULL && cur < limit ) + *cur = token; + + cur++; + } + + *pnum_tokens = (FT_Int)( cur - tokens ); + + parser->cursor = old_cursor; + parser->limit = old_limit; + } + } + + + /* first character must be a delimiter or a part of a number */ + /* NB: `coords' can be NULL if we just want to skip the */ + /* array; in this case we ignore `max_coords' */ + + static FT_Int + ps_tocoordarray( FT_Byte* *acur, + FT_Byte* limit, + FT_Int max_coords, + FT_Short* coords ) + { + FT_Byte* cur = *acur; + FT_Int count = 0; + FT_Byte c, ender; + + + if ( cur >= limit ) + goto Exit; + + /* check for the beginning of an array; otherwise, only one number */ + /* will be read */ + c = *cur; + ender = 0; + + if ( c == '[' ) + ender = ']'; + else if ( c == '{' ) + ender = '}'; + + if ( ender ) + cur++; + + /* now, read the coordinates */ + while ( cur < limit ) + { + FT_Short dummy; + FT_Byte* old_cur; + + + /* skip whitespace in front of data */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + goto Exit; + + if ( *cur == ender ) + { + cur++; + break; + } + + old_cur = cur; + + if ( coords != NULL && count >= max_coords ) + break; + + /* call PS_Conv_ToFixed() even if coords == NULL */ + /* to properly parse number at `cur' */ + *( coords != NULL ? &coords[count] : &dummy ) = + (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 ); + + if ( old_cur == cur ) + { + count = -1; + goto Exit; + } + else + count++; + + if ( !ender ) + break; + } + + Exit: + *acur = cur; + return count; + } + + + /* first character must be a delimiter or a part of a number */ + /* NB: `values' can be NULL if we just want to skip the */ + /* array; in this case we ignore `max_values' */ + + static FT_Int + ps_tofixedarray( FT_Byte* *acur, + FT_Byte* limit, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ) + { + FT_Byte* cur = *acur; + FT_Int count = 0; + FT_Byte c, ender; + + + if ( cur >= limit ) + goto Exit; + + /* Check for the beginning of an array. Otherwise, only one number */ + /* will be read. */ + c = *cur; + ender = 0; + + if ( c == '[' ) + ender = ']'; + else if ( c == '{' ) + ender = '}'; + + if ( ender ) + cur++; + + /* now, read the values */ + while ( cur < limit ) + { + FT_Fixed dummy; + FT_Byte* old_cur; + + + /* skip whitespace in front of data */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + goto Exit; + + if ( *cur == ender ) + { + cur++; + break; + } + + old_cur = cur; + + if ( values != NULL && count >= max_values ) + break; + + /* call PS_Conv_ToFixed() even if coords == NULL */ + /* to properly parse number at `cur' */ + *( values != NULL ? &values[count] : &dummy ) = + PS_Conv_ToFixed( &cur, limit, power_ten ); + + if ( old_cur == cur ) + { + count = -1; + goto Exit; + } + else + count++; + + if ( !ender ) + break; + } + + Exit: + *acur = cur; + return count; + } + + +#if 0 + + static FT_String* + ps_tostring( FT_Byte** cursor, + FT_Byte* limit, + FT_Memory memory ) + { + FT_Byte* cur = *cursor; + FT_PtrDist len = 0; + FT_Int count; + FT_String* result; + FT_Error error; + + + /* XXX: some stupid fonts have a `Notice' or `Copyright' string */ + /* that simply doesn't begin with an opening parenthesis, even */ + /* though they have a closing one! E.g. "amuncial.pfb" */ + /* */ + /* We must deal with these ill-fated cases there. Note that */ + /* these fonts didn't work with the old Type 1 driver as the */ + /* notice/copyright was not recognized as a valid string token */ + /* and made the old token parser commit errors. */ + + while ( cur < limit && ( *cur == ' ' || *cur == '\t' ) ) + cur++; + if ( cur + 1 >= limit ) + return 0; + + if ( *cur == '(' ) + cur++; /* skip the opening parenthesis, if there is one */ + + *cursor = cur; + count = 0; + + /* then, count its length */ + for ( ; cur < limit; cur++ ) + { + if ( *cur == '(' ) + count++; + + else if ( *cur == ')' ) + { + count--; + if ( count < 0 ) + break; + } + } + + len = cur - *cursor; + if ( cur >= limit || FT_ALLOC( result, len + 1 ) ) + return 0; + + /* now copy the string */ + FT_MEM_COPY( result, *cursor, len ); + result[len] = '\0'; + *cursor = cur; + return result; + } + +#endif /* 0 */ + + + static int + ps_tobool( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Bool result = 0; + + + /* return 1 if we find `true', 0 otherwise */ + if ( cur + 3 < limit && + cur[0] == 't' && + cur[1] == 'r' && + cur[2] == 'u' && + cur[3] == 'e' ) + { + result = 1; + cur += 5; + } + else if ( cur + 4 < limit && + cur[0] == 'f' && + cur[1] == 'a' && + cur[2] == 'l' && + cur[3] == 's' && + cur[4] == 'e' ) + { + result = 0; + cur += 6; + } + + *acur = cur; + return result; + } + + + /* load a simple field (i.e. non-table) into the current list of objects */ + + FT_LOCAL_DEF( FT_Error ) + ps_parser_load_field( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ) + { + T1_TokenRec token; + FT_Byte* cur; + FT_Byte* limit; + FT_UInt count; + FT_UInt idx; + FT_Error error; + + + /* this also skips leading whitespace */ + ps_parser_to_token( parser, &token ); + if ( !token.type ) + goto Fail; + + count = 1; + idx = 0; + cur = token.start; + limit = token.limit; + + /* we must detect arrays in /FontBBox */ + if ( field->type == T1_FIELD_TYPE_BBOX ) + { + T1_TokenRec token2; + FT_Byte* old_cur = parser->cursor; + FT_Byte* old_limit = parser->limit; + + + /* don't include delimiters */ + parser->cursor = token.start + 1; + parser->limit = token.limit - 1; + + ps_parser_to_token( parser, &token2 ); + parser->cursor = old_cur; + parser->limit = old_limit; + + if ( token2.type == T1_TOKEN_TYPE_ARRAY ) + goto FieldArray; + } + else if ( token.type == T1_TOKEN_TYPE_ARRAY ) + { + FieldArray: + /* if this is an array and we have no blend, an error occurs */ + if ( max_objects == 0 ) + goto Fail; + + count = max_objects; + idx = 1; + + /* don't include delimiters */ + cur++; + limit--; + } + + for ( ; count > 0; count--, idx++ ) + { + FT_Byte* q = (FT_Byte*)objects[idx] + field->offset; + FT_Long val; + FT_String* string; + + + skip_spaces( &cur, limit ); + + switch ( field->type ) + { + case T1_FIELD_TYPE_BOOL: + val = ps_tobool( &cur, limit ); + goto Store_Integer; + + case T1_FIELD_TYPE_FIXED: + val = PS_Conv_ToFixed( &cur, limit, 0 ); + goto Store_Integer; + + case T1_FIELD_TYPE_FIXED_1000: + val = PS_Conv_ToFixed( &cur, limit, 3 ); + goto Store_Integer; + + case T1_FIELD_TYPE_INTEGER: + val = PS_Conv_ToInt( &cur, limit ); + /* fall through */ + + Store_Integer: + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_UShort*)q = (FT_UShort)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_UInt32*)q = (FT_UInt32)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + break; + + case T1_FIELD_TYPE_STRING: + case T1_FIELD_TYPE_KEY: + { + FT_Memory memory = parser->memory; + FT_UInt len = (FT_UInt)( limit - cur ); + + + if ( cur >= limit ) + break; + + /* we allow both a string or a name */ + /* for cases like /FontName (foo) def */ + if ( token.type == T1_TOKEN_TYPE_KEY ) + { + /* don't include leading `/' */ + len--; + cur++; + } + else if ( token.type == T1_TOKEN_TYPE_STRING ) + { + /* don't include delimiting parentheses */ + /* XXX we don't handle <<...>> here */ + /* XXX should we convert octal escapes? */ + /* if so, what encoding should we use? */ + cur++; + len -= 2; + } + else + { + FT_ERROR(( "ps_parser_load_field:" + " expected a name or string\n" + " " + " but found token of type %d instead\n", + token.type )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + /* for this to work (FT_String**)q must have been */ + /* initialized to NULL */ + if ( *(FT_String**)q != NULL ) + { + FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n", + field->ident )); + FT_FREE( *(FT_String**)q ); + *(FT_String**)q = NULL; + } + + if ( FT_ALLOC( string, len + 1 ) ) + goto Exit; + + FT_MEM_COPY( string, cur, len ); + string[len] = 0; + + *(FT_String**)q = string; + } + break; + + case T1_FIELD_TYPE_BBOX: + { + FT_Fixed temp[4]; + FT_BBox* bbox = (FT_BBox*)q; + FT_Int result; + + + result = ps_tofixedarray( &cur, limit, 4, temp, 0 ); + + if ( result < 0 ) + { + FT_ERROR(( "ps_parser_load_field:" + " expected four integers in bounding box\n" )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + bbox->xMin = FT_RoundFix( temp[0] ); + bbox->yMin = FT_RoundFix( temp[1] ); + bbox->xMax = FT_RoundFix( temp[2] ); + bbox->yMax = FT_RoundFix( temp[3] ); + } + break; + + default: + /* an error occurred */ + goto Fail; + } + } + +#if 0 /* obsolete -- keep for reference */ + if ( pflags ) + *pflags |= 1L << field->flag_bit; +#else + FT_UNUSED( pflags ); +#endif + + error = PSaux_Err_Ok; + + Exit: + return error; + + Fail: + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + +#define T1_MAX_TABLE_ELEMENTS 32 + + + FT_LOCAL_DEF( FT_Error ) + ps_parser_load_field_table( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ) + { + T1_TokenRec elements[T1_MAX_TABLE_ELEMENTS]; + T1_Token token; + FT_Int num_elements; + FT_Error error = PSaux_Err_Ok; + FT_Byte* old_cursor; + FT_Byte* old_limit; + T1_FieldRec fieldrec = *(T1_Field)field; + + + fieldrec.type = T1_FIELD_TYPE_INTEGER; + if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY || + field->type == T1_FIELD_TYPE_BBOX ) + fieldrec.type = T1_FIELD_TYPE_FIXED; + + ps_parser_to_token_array( parser, elements, + T1_MAX_TABLE_ELEMENTS, &num_elements ); + if ( num_elements < 0 ) + { + error = PSaux_Err_Ignore; + goto Exit; + } + if ( (FT_UInt)num_elements > field->array_max ) + num_elements = field->array_max; + + old_cursor = parser->cursor; + old_limit = parser->limit; + + /* we store the elements count if necessary; */ + /* we further assume that `count_offset' can't be zero */ + if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 ) + *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) = + (FT_Byte)num_elements; + + /* we now load each element, adjusting the field.offset on each one */ + token = elements; + for ( ; num_elements > 0; num_elements--, token++ ) + { + parser->cursor = token->start; + parser->limit = token->limit; + ps_parser_load_field( parser, &fieldrec, objects, max_objects, 0 ); + fieldrec.offset += fieldrec.size; + } + +#if 0 /* obsolete -- keep for reference */ + if ( pflags ) + *pflags |= 1L << field->flag_bit; +#else + FT_UNUSED( pflags ); +#endif + + parser->cursor = old_cursor; + parser->limit = old_limit; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Long ) + ps_parser_to_int( PS_Parser parser ) + { + ps_parser_skip_spaces( parser ); + return PS_Conv_ToInt( &parser->cursor, parser->limit ); + } + + + /* first character must be `<' if `delimiters' is non-zero */ + + FT_LOCAL_DEF( FT_Error ) + ps_parser_to_bytes( PS_Parser parser, + FT_Byte* bytes, + FT_Offset max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ) + { + FT_Error error = PSaux_Err_Ok; + FT_Byte* cur; + + + ps_parser_skip_spaces( parser ); + cur = parser->cursor; + + if ( cur >= parser->limit ) + goto Exit; + + if ( delimiters ) + { + if ( *cur != '<' ) + { + FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + cur++; + } + + *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur, + parser->limit, + bytes, + max_bytes ); + + if ( delimiters ) + { + if ( cur < parser->limit && *cur != '>' ) + { + FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + cur++; + } + + parser->cursor = cur; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Fixed ) + ps_parser_to_fixed( PS_Parser parser, + FT_Int power_ten ) + { + ps_parser_skip_spaces( parser ); + return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten ); + } + + + FT_LOCAL_DEF( FT_Int ) + ps_parser_to_coord_array( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ) + { + ps_parser_skip_spaces( parser ); + return ps_tocoordarray( &parser->cursor, parser->limit, + max_coords, coords ); + } + + + FT_LOCAL_DEF( FT_Int ) + ps_parser_to_fixed_array( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ) + { + ps_parser_skip_spaces( parser ); + return ps_tofixedarray( &parser->cursor, parser->limit, + max_values, values, power_ten ); + } + + +#if 0 + + FT_LOCAL_DEF( FT_String* ) + T1_ToString( PS_Parser parser ) + { + return ps_tostring( &parser->cursor, parser->limit, parser->memory ); + } + + + FT_LOCAL_DEF( FT_Bool ) + T1_ToBool( PS_Parser parser ) + { + return ps_tobool( &parser->cursor, parser->limit ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( void ) + ps_parser_init( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ) + { + parser->error = PSaux_Err_Ok; + parser->base = base; + parser->limit = limit; + parser->cursor = base; + parser->memory = memory; + parser->funcs = ps_parser_funcs; + } + + + FT_LOCAL_DEF( void ) + ps_parser_done( PS_Parser parser ) + { + FT_UNUSED( parser ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_builder_init */ + /* */ + /* <Description> */ + /* Initializes a given glyph builder. */ + /* */ + /* <InOut> */ + /* builder :: A pointer to the glyph builder to initialize. */ + /* */ + /* <Input> */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting should be applied. */ + /* */ + FT_LOCAL_DEF( void ) + t1_builder_init( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph, + FT_Bool hinting ) + { + builder->parse_state = T1_Parse_Start; + builder->load_points = 1; + + builder->face = face; + builder->glyph = glyph; + builder->memory = face->memory; + + if ( glyph ) + { + FT_GlyphLoader loader = glyph->internal->loader; + + + builder->loader = loader; + builder->base = &loader->base.outline; + builder->current = &loader->current.outline; + FT_GlyphLoader_Rewind( loader ); + + builder->hints_globals = size->internal; + builder->hints_funcs = 0; + + if ( hinting ) + builder->hints_funcs = glyph->internal->glyph_hints; + } + + builder->pos_x = 0; + builder->pos_y = 0; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + builder->advance.x = 0; + builder->advance.y = 0; + + builder->funcs = t1_builder_funcs; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_builder_done */ + /* */ + /* <Description> */ + /* Finalizes a given glyph builder. Its contents can still be used */ + /* after the call, but the function saves important information */ + /* within the corresponding glyph slot. */ + /* */ + /* <Input> */ + /* builder :: A pointer to the glyph builder to finalize. */ + /* */ + FT_LOCAL_DEF( void ) + t1_builder_done( T1_Builder builder ) + { + FT_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->outline = *builder->base; + } + + + /* check that there is enough space for `count' more points */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_check_points( T1_Builder builder, + FT_Int count ) + { + return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + FT_LOCAL_DEF( void ) + t1_builder_add_point( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ) + { + FT_Outline* outline = builder->current; + + + if ( builder->load_points ) + { + FT_Vector* point = outline->points + outline->n_points; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + + + point->x = FIXED_TO_INT( x ); + point->y = FIXED_TO_INT( y ); + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + } + outline->n_points++; + } + + + /* check space for a new on-curve point, then add it */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_add_point1( T1_Builder builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = t1_builder_check_points( builder, 1 ); + if ( !error ) + t1_builder_add_point( builder, x, y, 1 ); + + return error; + } + + + /* check space for a new contour, then add it */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_add_contour( T1_Builder builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + /* this might happen in invalid fonts */ + if ( !outline ) + { + FT_ERROR(( "t1_builder_add_contour: no outline to add points to\n" )); + return PSaux_Err_Invalid_File_Format; + } + + if ( !builder->load_points ) + { + outline->n_contours++; + return PSaux_Err_Ok; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_start_point( T1_Builder builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = PSaux_Err_Invalid_File_Format; + + + /* test whether we are building a new contour */ + + if ( builder->parse_state == T1_Parse_Have_Path ) + error = PSaux_Err_Ok; + else + { + builder->parse_state = T1_Parse_Have_Path; + error = t1_builder_add_contour( builder ); + if ( !error ) + error = t1_builder_add_point1( builder, x, y ); + } + + return error; + } + + + /* close the current contour */ + FT_LOCAL_DEF( void ) + t1_builder_close_contour( T1_Builder builder ) + { + FT_Outline* outline = builder->current; + FT_Int first; + + + if ( !outline ) + return; + + first = outline->n_contours <= 1 + ? 0 : outline->contours[outline->n_contours - 2] + 1; + + /* We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + outline->n_points - 1; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; + + + /* `delete' last point only if it coincides with the first */ + /* point and it is not a control point (which can happen). */ + if ( p1->x == p2->x && p1->y == p2->y ) + if ( *control == FT_CURVE_TAG_ON ) + outline->n_points--; + } + + if ( outline->n_contours > 0 ) + { + /* Don't add contours only consisting of one point, i.e., */ + /* check whether the first and the last point is the same. */ + if ( first == outline->n_points - 1 ) + { + outline->n_contours--; + outline->n_points--; + } + else + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + t1_decrypt( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ) + { + PS_Conv_EexecDecode( &buffer, + buffer + length, + buffer, + length, + &seed ); + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psobjs.h b/android/jni/ndk_modules/freetype/src/psaux/psobjs.h new file mode 100644 index 00000000..e380c60d --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/psobjs.h @@ -0,0 +1,212 @@ +/***************************************************************************/ +/* */ +/* psobjs.h */ +/* */ +/* Auxiliary functions for PostScript fonts (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSOBJS_H__ +#define __PSOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_TABLE + const PS_Table_FuncsRec ps_table_funcs; + + FT_CALLBACK_TABLE + const PS_Parser_FuncsRec ps_parser_funcs; + + FT_CALLBACK_TABLE + const T1_Builder_FuncsRec t1_builder_funcs; + + + FT_LOCAL( FT_Error ) + ps_table_new( PS_Table table, + FT_Int count, + FT_Memory memory ); + + FT_LOCAL( FT_Error ) + ps_table_add( PS_Table table, + FT_Int idx, + void* object, + FT_PtrDist length ); + + FT_LOCAL( void ) + ps_table_done( PS_Table table ); + + + FT_LOCAL( void ) + ps_table_release( PS_Table table ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL( void ) + ps_parser_skip_spaces( PS_Parser parser ); + + FT_LOCAL( void ) + ps_parser_skip_PS_token( PS_Parser parser ); + + FT_LOCAL( void ) + ps_parser_to_token( PS_Parser parser, + T1_Token token ); + + FT_LOCAL( void ) + ps_parser_to_token_array( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_LOCAL( FT_Error ) + ps_parser_load_field( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_LOCAL( FT_Error ) + ps_parser_load_field_table( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_LOCAL( FT_Long ) + ps_parser_to_int( PS_Parser parser ); + + + FT_LOCAL( FT_Error ) + ps_parser_to_bytes( PS_Parser parser, + FT_Byte* bytes, + FT_Offset max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ); + + + FT_LOCAL( FT_Fixed ) + ps_parser_to_fixed( PS_Parser parser, + FT_Int power_ten ); + + + FT_LOCAL( FT_Int ) + ps_parser_to_coord_array( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ); + + FT_LOCAL( FT_Int ) + ps_parser_to_fixed_array( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + + FT_LOCAL( void ) + ps_parser_init( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + FT_LOCAL( void ) + ps_parser_done( PS_Parser parser ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + t1_builder_init( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph, + FT_Bool hinting ); + + FT_LOCAL( void ) + t1_builder_done( T1_Builder builder ); + + FT_LOCAL( FT_Error ) + t1_builder_check_points( T1_Builder builder, + FT_Int count ); + + FT_LOCAL( void ) + t1_builder_add_point( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + FT_LOCAL( FT_Error ) + t1_builder_add_point1( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + FT_LOCAL( FT_Error ) + t1_builder_add_contour( T1_Builder builder ); + + + FT_LOCAL( FT_Error ) + t1_builder_start_point( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + + FT_LOCAL( void ) + t1_builder_close_contour( T1_Builder builder ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + t1_decrypt( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ); + + +FT_END_HEADER + +#endif /* __PSOBJS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/t1cmap.c b/android/jni/ndk_modules/freetype/src/psaux/t1cmap.c new file mode 100644 index 00000000..f933e4da --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/t1cmap.c @@ -0,0 +1,341 @@ +/***************************************************************************/ +/* */ +/* t1cmap.c */ +/* */ +/* Type 1 character map support (body). */ +/* */ +/* Copyright 2002, 2003, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "t1cmap.h" + +#include FT_INTERNAL_DEBUG_H + +#include "psauxerr.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t1_cmap_std_init( T1_CMapStd cmap, + FT_Int is_expert ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + cmap->num_glyphs = face->type1.num_glyphs; + cmap->glyph_names = (const char* const*)face->type1.glyph_names; + cmap->sid_to_string = psnames->adobe_std_strings; + cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding + : psnames->adobe_std_encoding; + + FT_ASSERT( cmap->code_to_sid != NULL ); + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_std_done( T1_CMapStd cmap ) + { + cmap->num_glyphs = 0; + cmap->glyph_names = NULL; + cmap->sid_to_string = NULL; + cmap->code_to_sid = NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_std_char_index( T1_CMapStd cmap, + FT_UInt32 char_code ) + { + FT_UInt result = 0; + + + if ( char_code < 256 ) + { + FT_UInt code, n; + const char* glyph_name; + + + /* convert character code to Adobe SID string */ + code = cmap->code_to_sid[char_code]; + glyph_name = cmap->sid_to_string( code ); + + /* look for the corresponding glyph name */ + for ( n = 0; n < cmap->num_glyphs; n++ ) + { + const char* gname = cmap->glyph_names[n]; + + + if ( gname && gname[0] == glyph_name[0] && + ft_strcmp( gname, glyph_name ) == 0 ) + { + result = n; + break; + } + } + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + t1_cmap_std_char_next( T1_CMapStd cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code + 1; + + + while ( char_code < 256 ) + { + result = t1_cmap_std_char_index( cmap, char_code ); + if ( result != 0 ) + goto Exit; + + char_code++; + } + char_code = 0; + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_standard_init( T1_CMapStd cmap ) + { + t1_cmap_std_init( cmap, 0 ); + return 0; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_standard_class_rec = + { + sizeof ( T1_CMapStdRec ), + + (FT_CMap_InitFunc) t1_cmap_standard_init, + (FT_CMap_DoneFunc) t1_cmap_std_done, + (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, + (FT_CMap_CharNextFunc) t1_cmap_std_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_expert_init( T1_CMapStd cmap ) + { + t1_cmap_std_init( cmap, 1 ); + return 0; + } + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_expert_class_rec = + { + sizeof ( T1_CMapStdRec ), + + (FT_CMap_InitFunc) t1_cmap_expert_init, + (FT_CMap_DoneFunc) t1_cmap_std_done, + (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, + (FT_CMap_CharNextFunc) t1_cmap_std_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CUSTOM ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_custom_init( T1_CMapCustom cmap ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + T1_Encoding encoding = &face->type1.encoding; + + + cmap->first = encoding->code_first; + cmap->count = (FT_UInt)( encoding->code_last - cmap->first ); + cmap->indices = encoding->char_index; + + FT_ASSERT( cmap->indices != NULL ); + FT_ASSERT( encoding->code_first <= encoding->code_last ); + + return 0; + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_custom_done( T1_CMapCustom cmap ) + { + cmap->indices = NULL; + cmap->first = 0; + cmap->count = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_custom_char_index( T1_CMapCustom cmap, + FT_UInt32 char_code ) + { + FT_UInt result = 0; + + + if ( ( char_code >= cmap->first ) && + ( char_code < ( cmap->first + cmap->count ) ) ) + result = cmap->indices[char_code]; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + t1_cmap_custom_char_next( T1_CMapCustom cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code; + + + ++char_code; + + if ( char_code < cmap->first ) + char_code = cmap->first; + + for ( ; char_code < ( cmap->first + cmap->count ); char_code++ ) + { + result = cmap->indices[char_code]; + if ( result != 0 ) + goto Exit; + } + + char_code = 0; + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_custom_class_rec = + { + sizeof ( T1_CMapCustomRec ), + + (FT_CMap_InitFunc) t1_cmap_custom_init, + (FT_CMap_DoneFunc) t1_cmap_custom_done, + (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index, + (FT_CMap_CharNextFunc) t1_cmap_custom_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( const char * ) + t1_get_glyph_name( T1_Face face, + FT_UInt idx ) + { + return face->type1.glyph_names[idx]; + } + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_unicode_init( PS_Unicodes unicodes ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_init( memory, + unicodes, + face->type1.num_glyphs, + (PS_GetGlyphNameFunc)&t1_get_glyph_name, + (PS_FreeGlyphNameFunc)NULL, + (FT_Pointer)face ); + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_unicode_done( PS_Unicodes unicodes ) + { + FT_Face face = FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_unicode_char_index( PS_Unicodes unicodes, + FT_UInt32 char_code ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_index( unicodes, char_code ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + t1_cmap_unicode_char_next( PS_Unicodes unicodes, + FT_UInt32 *pchar_code ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_next( unicodes, pchar_code ); + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_unicode_class_rec = + { + sizeof ( PS_UnicodesRec ), + + (FT_CMap_InitFunc) t1_cmap_unicode_init, + (FT_CMap_DoneFunc) t1_cmap_unicode_done, + (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index, + (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/t1cmap.h b/android/jni/ndk_modules/freetype/src/psaux/t1cmap.h new file mode 100644 index 00000000..7ae65d2f --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/t1cmap.h @@ -0,0 +1,105 @@ +/***************************************************************************/ +/* */ +/* t1cmap.h */ +/* */ +/* Type 1 character map support (specification). */ +/* */ +/* Copyright 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1CMAP_H__ +#define __T1CMAP_H__ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TYPE1_TYPES_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* standard (and expert) encoding cmaps */ + typedef struct T1_CMapStdRec_* T1_CMapStd; + + typedef struct T1_CMapStdRec_ + { + FT_CMapRec cmap; + + const FT_UShort* code_to_sid; + PS_Adobe_Std_StringsFunc sid_to_string; + + FT_UInt num_glyphs; + const char* const* glyph_names; + + } T1_CMapStdRec; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_standard_class_rec; + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_expert_class_rec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CUSTOM ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct T1_CMapCustomRec_* T1_CMapCustom; + + typedef struct T1_CMapCustomRec_ + { + FT_CMapRec cmap; + FT_UInt first; + FT_UInt count; + FT_UShort* indices; + + } T1_CMapCustomRec; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_custom_class_rec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* unicode (synthetic) cmaps */ + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_unicode_class_rec; + + /* */ + + +FT_END_HEADER + +#endif /* __T1CMAP_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/t1decode.c b/android/jni/ndk_modules/freetype/src/psaux/t1decode.c new file mode 100644 index 00000000..babf3ba1 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/t1decode.c @@ -0,0 +1,1598 @@ +/***************************************************************************/ +/* */ +/* t1decode.c */ +/* */ +/* PostScript Type 1 decoding routines (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include FT_OUTLINE_H + +#include "t1decode.h" +#include "psobjs.h" + +#include "psauxerr.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1decode + + + typedef enum T1_Operator_ + { + op_none = 0, + op_endchar, + op_hsbw, + op_seac, + op_sbw, + op_closepath, + op_hlineto, + op_hmoveto, + op_hvcurveto, + op_rlineto, + op_rmoveto, + op_rrcurveto, + op_vhcurveto, + op_vlineto, + op_vmoveto, + op_dotsection, + op_hstem, + op_hstem3, + op_vstem, + op_vstem3, + op_div, + op_callothersubr, + op_callsubr, + op_pop, + op_return, + op_setcurrentpoint, + op_unknown15, + + op_max /* never remove this one */ + + } T1_Operator; + + + static + const FT_Int t1_args_count[op_max] = + { + 0, /* none */ + 0, /* endchar */ + 2, /* hsbw */ + 5, /* seac */ + 4, /* sbw */ + 0, /* closepath */ + 1, /* hlineto */ + 1, /* hmoveto */ + 4, /* hvcurveto */ + 2, /* rlineto */ + 2, /* rmoveto */ + 6, /* rrcurveto */ + 4, /* vhcurveto */ + 1, /* vlineto */ + 1, /* vmoveto */ + 0, /* dotsection */ + 2, /* hstem */ + 6, /* hstem3 */ + 2, /* vstem */ + 6, /* vstem3 */ + 2, /* div */ + -1, /* callothersubr */ + 1, /* callsubr */ + 0, /* pop */ + 0, /* return */ + 2, /* setcurrentpoint */ + 2 /* opcode 15 (undocumented and obsolete) */ + }; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_lookup_glyph_by_stdcharcode */ + /* */ + /* <Description> */ + /* Looks up a given glyph by its StandardEncoding charcode. Used to */ + /* implement the SEAC Type 1 operator. */ + /* */ + /* <Input> */ + /* face :: The current face object. */ + /* */ + /* charcode :: The character code to look for. */ + /* */ + /* <Return> */ + /* A glyph index in the font face. Returns -1 if the corresponding */ + /* glyph wasn't found. */ + /* */ + static FT_Int + t1_lookup_glyph_by_stdcharcode( T1_Decoder decoder, + FT_Int charcode ) + { + FT_UInt n; + const FT_String* glyph_name; + FT_Service_PsCMaps psnames = decoder->psnames; + + + /* check range of standard char code */ + if ( charcode < 0 || charcode > 255 ) + return -1; + + glyph_name = psnames->adobe_std_strings( + psnames->adobe_std_encoding[charcode]); + + for ( n = 0; n < decoder->num_glyphs; n++ ) + { + FT_String* name = (FT_String*)decoder->glyph_names[n]; + + + if ( name && + name[0] == glyph_name[0] && + ft_strcmp( name, glyph_name ) == 0 ) + return n; + } + + return -1; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1operator_seac */ + /* */ + /* <Description> */ + /* Implements the `seac' Type 1 operator for a Type 1 decoder. */ + /* */ + /* <Input> */ + /* decoder :: The current CID decoder. */ + /* */ + /* asb :: The accent's side bearing. */ + /* */ + /* adx :: The horizontal offset of the accent. */ + /* */ + /* ady :: The vertical offset of the accent. */ + /* */ + /* bchar :: The base character's StandardEncoding charcode. */ + /* */ + /* achar :: The accent character's StandardEncoding charcode. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + t1operator_seac( T1_Decoder decoder, + FT_Pos asb, + FT_Pos adx, + FT_Pos ady, + FT_Int bchar, + FT_Int achar ) + { + FT_Error error; + FT_Int bchar_index, achar_index; +#if 0 + FT_Int n_base_points; + FT_Outline* base = decoder->builder.base; +#endif + FT_Vector left_bearing, advance; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + T1_Face face = (T1_Face)decoder->builder.face; +#endif + + + if ( decoder->seac ) + { + FT_ERROR(( "t1operator_seac: invalid nested seac\n" )); + return PSaux_Err_Syntax_Error; + } + + /* seac weirdness */ + adx += decoder->builder.left_bearing.x; + + /* `glyph_names' is set to 0 for CID fonts which do not */ + /* include an encoding. How can we deal with these? */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( decoder->glyph_names == 0 && + !face->root.internal->incremental_interface ) +#else + if ( decoder->glyph_names == 0 ) +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_ERROR(( "t1operator_seac:" + " glyph names table not available in this font\n" )); + return PSaux_Err_Syntax_Error; + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( face->root.internal->incremental_interface ) + { + /* the caller must handle the font encoding also */ + bchar_index = bchar; + achar_index = achar; + } + else +#endif + { + bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar ); + achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar ); + } + + if ( bchar_index < 0 || achar_index < 0 ) + { + FT_ERROR(( "t1operator_seac:" + " invalid seac character code arguments\n" )); + return PSaux_Err_Syntax_Error; + } + + /* if we are trying to load a composite glyph, do not load the */ + /* accent character and return the array of subglyphs. */ + if ( decoder->builder.no_recurse ) + { + FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; + FT_GlyphLoader loader = glyph->internal->loader; + FT_SubGlyph subg; + + + /* reallocate subglyph array if necessary */ + error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); + if ( error ) + goto Exit; + + subg = loader->current.subglyphs; + + /* subglyph 0 = base character */ + subg->index = bchar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | + FT_SUBGLYPH_FLAG_USE_MY_METRICS; + subg->arg1 = 0; + subg->arg2 = 0; + subg++; + + /* subglyph 1 = accent character */ + subg->index = achar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; + subg->arg1 = (FT_Int)FIXED_TO_INT( adx - asb ); + subg->arg2 = (FT_Int)FIXED_TO_INT( ady ); + + /* set up remaining glyph fields */ + glyph->num_subglyphs = 2; + glyph->subglyphs = loader->base.subglyphs; + glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + loader->current.num_subglyphs = 2; + goto Exit; + } + + /* First load `bchar' in builder */ + /* now load the unscaled outline */ + + FT_GlyphLoader_Prepare( decoder->builder.loader ); /* prepare loader */ + + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = t1_decoder_parse_glyph( decoder, bchar_index ); + decoder->seac = FALSE; + if ( error ) + goto Exit; + + /* save the left bearing and width of the base character */ + /* as they will be erased by the next load. */ + + left_bearing = decoder->builder.left_bearing; + advance = decoder->builder.advance; + + decoder->builder.left_bearing.x = 0; + decoder->builder.left_bearing.y = 0; + + decoder->builder.pos_x = adx - asb; + decoder->builder.pos_y = ady; + + /* Now load `achar' on top of */ + /* the base outline */ + + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = t1_decoder_parse_glyph( decoder, achar_index ); + decoder->seac = FALSE; + if ( error ) + goto Exit; + + /* restore the left side bearing and */ + /* advance width of the base character */ + + decoder->builder.left_bearing = left_bearing; + decoder->builder.advance = advance; + + decoder->builder.pos_x = 0; + decoder->builder.pos_y = 0; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_decoder_parse_charstrings */ + /* */ + /* <Description> */ + /* Parses a given Type 1 charstrings program. */ + /* */ + /* <Input> */ + /* decoder :: The current Type 1 decoder. */ + /* */ + /* charstring_base :: The base address of the charstring stream. */ + /* */ + /* charstring_len :: The length in bytes of the charstring stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_parse_charstrings( T1_Decoder decoder, + FT_Byte* charstring_base, + FT_UInt charstring_len ) + { + FT_Error error; + T1_Decoder_Zone zone; + FT_Byte* ip; + FT_Byte* limit; + T1_Builder builder = &decoder->builder; + FT_Pos x, y, orig_x, orig_y; + FT_Int known_othersubr_result_cnt = 0; + FT_Int unknown_othersubr_result_cnt = 0; + FT_Bool large_int; + FT_Fixed seed; + + T1_Hints_Funcs hinter; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool bol = TRUE; +#endif + + + /* we don't want to touch the source code -- use macro trick */ +#define start_point t1_builder_start_point +#define check_points t1_builder_check_points +#define add_point t1_builder_add_point +#define add_point1 t1_builder_add_point1 +#define add_contour t1_builder_add_contour +#define close_contour t1_builder_close_contour + + + /* compute random seed from stack address of parameter */ + seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed ^ + (FT_PtrDist)(char*)&decoder ^ + (FT_PtrDist)(char*)&charstring_base ) & + FT_ULONG_MAX ) ; + seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; + if ( seed == 0 ) + seed = 0x7384; + + /* First of all, initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + + builder->parse_state = T1_Parse_Start; + + hinter = (T1_Hints_Funcs)builder->hints_funcs; + + /* a font that reads BuildCharArray without setting */ + /* its values first is buggy, but ... */ + FT_ASSERT( ( decoder->len_buildchar == 0 ) == + ( decoder->buildchar == NULL ) ); + + if ( decoder->len_buildchar > 0 ) + ft_memset( &decoder->buildchar[0], + 0, + sizeof( decoder->buildchar[0] ) * decoder->len_buildchar ); + + FT_TRACE4(( "\n" + "Start charstring\n" )); + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + error = PSaux_Err_Ok; + + x = orig_x = builder->pos_x; + y = orig_y = builder->pos_y; + + /* begin hints recording session, if any */ + if ( hinter ) + hinter->open( hinter->hints ); + + large_int = FALSE; + + /* now, execute loop */ + while ( ip < limit ) + { + FT_Long* top = decoder->top; + T1_Operator op = op_none; + FT_Int32 value = 0; + + + FT_ASSERT( known_othersubr_result_cnt == 0 || + unknown_othersubr_result_cnt == 0 ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( bol ) + { + FT_TRACE5(( " (%d)", decoder->top - decoder->stack )); + bol = FALSE; + } +#endif + + /*********************************************************************/ + /* */ + /* Decode operator or operand */ + /* */ + /* */ + + /* first of all, decompress operator or value */ + switch ( *ip++ ) + { + case 1: + op = op_hstem; + break; + + case 3: + op = op_vstem; + break; + case 4: + op = op_vmoveto; + break; + case 5: + op = op_rlineto; + break; + case 6: + op = op_hlineto; + break; + case 7: + op = op_vlineto; + break; + case 8: + op = op_rrcurveto; + break; + case 9: + op = op_closepath; + break; + case 10: + op = op_callsubr; + break; + case 11: + op = op_return; + break; + + case 13: + op = op_hsbw; + break; + case 14: + op = op_endchar; + break; + + case 15: /* undocumented, obsolete operator */ + op = op_unknown15; + break; + + case 21: + op = op_rmoveto; + break; + case 22: + op = op_hmoveto; + break; + + case 30: + op = op_vhcurveto; + break; + case 31: + op = op_hvcurveto; + break; + + case 12: + if ( ip > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid escape (12+EOF)\n" )); + goto Syntax_Error; + } + + switch ( *ip++ ) + { + case 0: + op = op_dotsection; + break; + case 1: + op = op_vstem3; + break; + case 2: + op = op_hstem3; + break; + case 6: + op = op_seac; + break; + case 7: + op = op_sbw; + break; + case 12: + op = op_div; + break; + case 16: + op = op_callothersubr; + break; + case 17: + op = op_pop; + break; + case 33: + op = op_setcurrentpoint; + break; + + default: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid escape (12+%d)\n", + ip[-1] )); + goto Syntax_Error; + } + break; + + case 255: /* four bytes integer */ + if ( ip + 4 > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + value = (FT_Int32)( ( (FT_Long)ip[0] << 24 ) | + ( (FT_Long)ip[1] << 16 ) | + ( (FT_Long)ip[2] << 8 ) | + ip[3] ); + ip += 4; + + /* According to the specification, values > 32000 or < -32000 must */ + /* be followed by a `div' operator to make the result be in the */ + /* range [-32000;32000]. We expect that the second argument of */ + /* `div' is not a large number. Additionally, we don't handle */ + /* stuff like `<large1> <large2> <num> div <num> div' or */ + /* <large1> <large2> <num> div div'. This is probably not allowed */ + /* anyway. */ + if ( value > 32000 || value < -32000 ) + { + if ( large_int ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " no `div' after large integer\n" )); + } + else + large_int = TRUE; + } + else + { + if ( !large_int ) + value <<= 16; + } + + break; + + default: + if ( ip[-1] >= 32 ) + { + if ( ip[-1] < 247 ) + value = (FT_Int32)ip[-1] - 139; + else + { + if ( ++ip > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + if ( ip[-2] < 251 ) + value = ( ( (FT_Int32)ip[-2] - 247 ) << 8 ) + ip[-1] + 108; + else + value = -( ( ( (FT_Int32)ip[-2] - 251 ) << 8 ) + ip[-1] + 108 ); + } + + if ( !large_int ) + value <<= 16; + } + else + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid byte (%d)\n", ip[-1] )); + goto Syntax_Error; + } + } + + if ( unknown_othersubr_result_cnt > 0 ) + { + switch ( op ) + { + case op_callsubr: + case op_return: + case op_none: + case op_pop: + break; + + default: + /* all operands have been transferred by previous pops */ + unknown_othersubr_result_cnt = 0; + break; + } + } + + if ( large_int && !( op == op_none || op == op_div ) ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " no `div' after large integer\n" )); + + large_int = FALSE; + } + + /*********************************************************************/ + /* */ + /* Push value on stack, or process operator */ + /* */ + /* */ + if ( op == op_none ) + { + if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: stack overflow\n" )); + goto Syntax_Error; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( large_int ) + FT_TRACE4(( " %ld", value )); + else + FT_TRACE4(( " %ld", (FT_Int32)( value >> 16 ) )); +#endif + + *top++ = value; + decoder->top = top; + } + else if ( op == op_callothersubr ) /* callothersubr */ + { + FT_Int subr_no; + FT_Int arg_cnt; + + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " callothersubr\n" )); + bol = TRUE; +#endif + + if ( top - decoder->stack < 2 ) + goto Stack_Underflow; + + top -= 2; + + subr_no = (FT_Int)( top[1] >> 16 ); + arg_cnt = (FT_Int)( top[0] >> 16 ); + + /***********************************************************/ + /* */ + /* remove all operands to callothersubr from the stack */ + /* */ + /* for handled othersubrs, where we know the number of */ + /* arguments, we increase the stack by the value of */ + /* known_othersubr_result_cnt */ + /* */ + /* for unhandled othersubrs the following pops adjust the */ + /* stack pointer as necessary */ + + if ( arg_cnt > top - decoder->stack ) + goto Stack_Underflow; + + top -= arg_cnt; + + known_othersubr_result_cnt = 0; + unknown_othersubr_result_cnt = 0; + + /* XXX TODO: The checks to `arg_count == <whatever>' */ + /* might not be correct; an othersubr expects a certain */ + /* number of operands on the PostScript stack (as opposed */ + /* to the T1 stack) but it doesn't have to put them there */ + /* by itself; previous othersubrs might have left the */ + /* operands there if they were not followed by an */ + /* appropriate number of pops */ + /* */ + /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */ + /* accept a font that contains charstrings like */ + /* */ + /* 100 200 2 20 callothersubr */ + /* 300 1 20 callothersubr pop */ + /* */ + /* Perhaps this is the reason why BuildCharArray exists. */ + + switch ( subr_no ) + { + case 1: /* start flex feature */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + decoder->flex_state = 1; + decoder->num_flex_vectors = 0; + if ( start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + break; + + case 2: /* add flex vectors */ + { + FT_Int idx; + + + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + /* note that we should not add a point for index 0; */ + /* this will move our current position to the flex */ + /* point without adding any point to the outline */ + idx = decoder->num_flex_vectors++; + if ( idx > 0 && idx < 7 ) + add_point( builder, + x, + y, + (FT_Byte)( idx == 3 || idx == 6 ) ); + } + break; + + case 0: /* end flex feature */ + if ( arg_cnt != 3 ) + goto Unexpected_OtherSubr; + + if ( decoder->flex_state == 0 || + decoder->num_flex_vectors != 7 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected flex end\n" )); + goto Syntax_Error; + } + + /* the two `results' are popped by the following setcurrentpoint */ + top[0] = x; + top[1] = y; + known_othersubr_result_cnt = 2; + break; + + case 3: /* change hints */ + if ( arg_cnt != 1 ) + goto Unexpected_OtherSubr; + + known_othersubr_result_cnt = 1; + + if ( hinter ) + hinter->reset( hinter->hints, builder->current->n_points ); + break; + + case 12: + case 13: + /* counter control hints, clear stack */ + top = decoder->stack; + break; + + case 14: + case 15: + case 16: + case 17: + case 18: /* multiple masters */ + { + PS_Blend blend = decoder->blend; + FT_UInt num_points, nn, mm; + FT_Long* delta; + FT_Long* values; + + + if ( !blend ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected multiple masters operator\n" )); + goto Syntax_Error; + } + + num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 ); + if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " incorrect number of multiple masters arguments\n" )); + goto Syntax_Error; + } + + /* we want to compute: */ + /* */ + /* a0*w0 + a1*w1 + ... + ak*wk */ + /* */ + /* but we only have the a0, a1-a0, a2-a0, .. ak-a0 */ + /* however, given that w0 + w1 + ... + wk == 1, we can */ + /* rewrite it easily as: */ + /* */ + /* a0 + (a1-a0)*w1 + (a2-a0)*w2 + .. + (ak-a0)*wk */ + /* */ + /* where k == num_designs-1 */ + /* */ + /* I guess that's why it's written in this `compact' */ + /* form. */ + /* */ + delta = top + num_points; + values = top; + for ( nn = 0; nn < num_points; nn++ ) + { + FT_Long tmp = values[0]; + + + for ( mm = 1; mm < blend->num_designs; mm++ ) + tmp += FT_MulFix( *delta++, blend->weight_vector[mm] ); + + *values++ = tmp; + } + + known_othersubr_result_cnt = num_points; + break; + } + + case 19: + /* <idx> 1 19 callothersubr */ + /* => replace elements starting from index cvi( <idx> ) */ + /* of BuildCharArray with WeightVector */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 1 || blend == NULL ) + goto Unexpected_OtherSubr; + + idx = (FT_Int)( top[0] >> 16 ); + + if ( idx < 0 || + idx + blend->num_designs > decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + ft_memcpy( &decoder->buildchar[idx], + blend->weight_vector, + blend->num_designs * + sizeof( blend->weight_vector[0] ) ); + } + break; + + case 20: + /* <arg1> <arg2> 2 20 callothersubr pop */ + /* ==> push <arg1> + <arg2> onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] += top[1]; /* XXX (over|under)flow */ + + known_othersubr_result_cnt = 1; + break; + + case 21: + /* <arg1> <arg2> 2 21 callothersubr pop */ + /* ==> push <arg1> - <arg2> onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] -= top[1]; /* XXX (over|under)flow */ + + known_othersubr_result_cnt = 1; + break; + + case 22: + /* <arg1> <arg2> 2 22 callothersubr pop */ + /* ==> push <arg1> * <arg2> onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] = FT_MulFix( top[0], top[1] ); + + known_othersubr_result_cnt = 1; + break; + + case 23: + /* <arg1> <arg2> 2 23 callothersubr pop */ + /* ==> push <arg1> / <arg2> onto T1 stack */ + if ( arg_cnt != 2 || top[1] == 0 ) + goto Unexpected_OtherSubr; + + top[0] = FT_DivFix( top[0], top[1] ); + + known_othersubr_result_cnt = 1; + break; + + case 24: + /* <val> <idx> 2 24 callothersubr */ + /* ==> set BuildCharArray[cvi( <idx> )] = <val> */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 2 || blend == NULL ) + goto Unexpected_OtherSubr; + + idx = (FT_Int)( top[1] >> 16 ); + + if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + decoder->buildchar[idx] = top[0]; + } + break; + + case 25: + /* <idx> 1 25 callothersubr pop */ + /* ==> push BuildCharArray[cvi( idx )] */ + /* onto T1 stack */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 1 || blend == NULL ) + goto Unexpected_OtherSubr; + + idx = (FT_Int)( top[0] >> 16 ); + + if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + top[0] = decoder->buildchar[idx]; + } + + known_othersubr_result_cnt = 1; + break; + +#if 0 + case 26: + /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */ + /* leave mark on T1 stack */ + /* <val> <idx> ==> set BuildCharArray[cvi( <idx> )] = <val> */ + XXX which routine has left its mark on the (PostScript) stack?; + break; +#endif + + case 27: + /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */ + /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */ + /* otherwise push <res2> */ + if ( arg_cnt != 4 ) + goto Unexpected_OtherSubr; + + if ( top[2] > top[3] ) + top[0] = top[1]; + + known_othersubr_result_cnt = 1; + break; + + case 28: + /* 0 28 callothersubr pop */ + /* => push random value from interval [0, 1) onto stack */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + { + FT_Fixed Rand; + + + Rand = seed; + if ( Rand >= 0x8000L ) + Rand++; + + top[0] = Rand; + + seed = FT_MulFix( seed, 0x10000L - seed ); + if ( seed == 0 ) + seed += 0x2873; + } + + known_othersubr_result_cnt = 1; + break; + + default: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unknown othersubr [%d %d], wish me luck\n", + arg_cnt, subr_no )); + unknown_othersubr_result_cnt = arg_cnt; + break; + + Unexpected_OtherSubr: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid othersubr [%d %d]\n", arg_cnt, subr_no )); + goto Syntax_Error; + } + + top += known_othersubr_result_cnt; + + decoder->top = top; + } + else /* general operator */ + { + FT_Int num_args = t1_args_count[op]; + + + FT_ASSERT( num_args >= 0 ); + + if ( top - decoder->stack < num_args ) + goto Stack_Underflow; + + /* XXX Operators usually take their operands from the */ + /* bottom of the stack, i.e., the operands are */ + /* decoder->stack[0], ..., decoder->stack[num_args - 1]; */ + /* only div, callsubr, and callothersubr are different. */ + /* In practice it doesn't matter (?). */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + switch ( op ) + { + case op_callsubr: + case op_div: + case op_callothersubr: + case op_pop: + case op_return: + break; + + default: + if ( top - decoder->stack != num_args ) + FT_TRACE0(( "t1_decoder_parse_charstrings:" + " too much operands on the stack" + " (seen %d, expected %d)\n", + top - decoder->stack, num_args )); + break; + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + top -= num_args; + + switch ( op ) + { + case op_endchar: + FT_TRACE4(( " endchar\n" )); + + close_contour( builder ); + + /* close hints recording session */ + if ( hinter ) + { + if ( hinter->close( hinter->hints, builder->current->n_points ) ) + goto Syntax_Error; + + /* apply hints to the loaded glyph outline now */ + hinter->apply( hinter->hints, + builder->current, + (PSH_Globals)builder->hints_globals, + decoder->hint_mode ); + } + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + + /* the compiler should optimize away this empty loop but ... */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + if ( decoder->len_buildchar > 0 ) + { + FT_UInt i; + + + FT_TRACE4(( "BuildCharArray = [ " )); + + for ( i = 0; i < decoder->len_buildchar; ++i ) + FT_TRACE4(( "%d ", decoder->buildchar[ i ] )); + + FT_TRACE4(( "]\n" )); + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + FT_TRACE4(( "\n" )); + + /* return now! */ + return PSaux_Err_Ok; + + case op_hsbw: + FT_TRACE4(( " hsbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x += top[0]; + builder->advance.x = top[1]; + builder->advance.y = 0; + + orig_x = x = builder->pos_x + top[0]; + orig_y = y = builder->pos_y; + + FT_UNUSED( orig_y ); + + /* the `metrics_only' indicates that we only want to compute */ + /* the glyph's metrics (lsb + advance width), not load the */ + /* rest of it; so exit immediately */ + if ( builder->metrics_only ) + return PSaux_Err_Ok; + + break; + + case op_seac: + return t1operator_seac( decoder, + top[0], + top[1], + top[2], + (FT_Int)( top[3] >> 16 ), + (FT_Int)( top[4] >> 16 ) ); + + case op_sbw: + FT_TRACE4(( " sbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x += top[0]; + builder->left_bearing.y += top[1]; + builder->advance.x = top[2]; + builder->advance.y = top[3]; + + x = builder->pos_x + top[0]; + y = builder->pos_y + top[1]; + + /* the `metrics_only' indicates that we only want to compute */ + /* the glyph's metrics (lsb + advance width), not load the */ + /* rest of it; so exit immediately */ + if ( builder->metrics_only ) + return PSaux_Err_Ok; + + break; + + case op_closepath: + FT_TRACE4(( " closepath" )); + + /* if there is no path, `closepath' is a no-op */ + if ( builder->parse_state == T1_Parse_Have_Path || + builder->parse_state == T1_Parse_Have_Moveto ) + close_contour( builder ); + + builder->parse_state = T1_Parse_Have_Width; + break; + + case op_hlineto: + FT_TRACE4(( " hlineto" )); + + if ( start_point( builder, x, y ) ) + goto Fail; + + x += top[0]; + goto Add_Line; + + case op_hmoveto: + FT_TRACE4(( " hmoveto" )); + + x += top[0]; + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_hvcurveto: + FT_TRACE4(( " hvcurveto" )); + + if ( start_point( builder, x, y ) || + check_points( builder, 3 ) ) + goto Fail; + + x += top[0]; + add_point( builder, x, y, 0 ); + x += top[1]; + y += top[2]; + add_point( builder, x, y, 0 ); + y += top[3]; + add_point( builder, x, y, 1 ); + break; + + case op_rlineto: + FT_TRACE4(( " rlineto" )); + + if ( start_point( builder, x, y ) ) + goto Fail; + + x += top[0]; + y += top[1]; + + Add_Line: + if ( add_point1( builder, x, y ) ) + goto Fail; + break; + + case op_rmoveto: + FT_TRACE4(( " rmoveto" )); + + x += top[0]; + y += top[1]; + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_rrcurveto: + FT_TRACE4(( " rrcurveto" )); + + if ( start_point( builder, x, y ) || + check_points( builder, 3 ) ) + goto Fail; + + x += top[0]; + y += top[1]; + add_point( builder, x, y, 0 ); + + x += top[2]; + y += top[3]; + add_point( builder, x, y, 0 ); + + x += top[4]; + y += top[5]; + add_point( builder, x, y, 1 ); + break; + + case op_vhcurveto: + FT_TRACE4(( " vhcurveto" )); + + if ( start_point( builder, x, y ) || + check_points( builder, 3 ) ) + goto Fail; + + y += top[0]; + add_point( builder, x, y, 0 ); + x += top[1]; + y += top[2]; + add_point( builder, x, y, 0 ); + x += top[3]; + add_point( builder, x, y, 1 ); + break; + + case op_vlineto: + FT_TRACE4(( " vlineto" )); + + if ( start_point( builder, x, y ) ) + goto Fail; + + y += top[0]; + goto Add_Line; + + case op_vmoveto: + FT_TRACE4(( " vmoveto" )); + + y += top[0]; + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_div: + FT_TRACE4(( " div" )); + + /* if `large_int' is set, we divide unscaled numbers; */ + /* otherwise, we divide numbers in 16.16 format -- */ + /* in both cases, it is the same operation */ + *top = FT_DivFix( top[0], top[1] ); + ++top; + + large_int = FALSE; + break; + + case op_callsubr: + { + FT_Int idx; + + + FT_TRACE4(( " callsubr" )); + + idx = (FT_Int)( top[0] >> 16 ); + if ( idx < 0 || idx >= (FT_Int)decoder->num_subrs ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid subrs index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + + /* The Type 1 driver stores subroutines without the seed bytes. */ + /* The CID driver stores subroutines with seed bytes. This */ + /* case is taken care of when decoder->subrs_len == 0. */ + zone->base = decoder->subrs[idx]; + + if ( decoder->subrs_len ) + zone->limit = zone->base + decoder->subrs_len[idx]; + else + { + /* We are using subroutines from a CID font. We must adjust */ + /* for the seed bytes. */ + zone->base += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); + zone->limit = decoder->subrs[idx + 1]; + } + + zone->cursor = zone->base; + + if ( !zone->base ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + break; + } + + case op_pop: + FT_TRACE4(( " pop" )); + + if ( known_othersubr_result_cnt > 0 ) + { + known_othersubr_result_cnt--; + /* ignore, we pushed the operands ourselves */ + break; + } + + if ( unknown_othersubr_result_cnt == 0 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " no more operands for othersubr\n" )); + goto Syntax_Error; + } + + unknown_othersubr_result_cnt--; + top++; /* `push' the operand to callothersubr onto the stack */ + break; + + case op_return: + FT_TRACE4(( " return" )); + + if ( zone <= decoder->zones ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected return\n" )); + goto Syntax_Error; + } + + zone--; + ip = zone->cursor; + limit = zone->limit; + decoder->zone = zone; + break; + + case op_dotsection: + FT_TRACE4(( " dotsection" )); + + break; + + case op_hstem: + FT_TRACE4(( " hstem" )); + + /* record horizontal hint */ + if ( hinter ) + { + /* top[0] += builder->left_bearing.y; */ + hinter->stem( hinter->hints, 1, top ); + } + break; + + case op_hstem3: + FT_TRACE4(( " hstem3" )); + + /* record horizontal counter-controlled hints */ + if ( hinter ) + hinter->stem3( hinter->hints, 1, top ); + break; + + case op_vstem: + FT_TRACE4(( " vstem" )); + + /* record vertical hint */ + if ( hinter ) + { + top[0] += orig_x; + hinter->stem( hinter->hints, 0, top ); + } + break; + + case op_vstem3: + FT_TRACE4(( " vstem3" )); + + /* record vertical counter-controlled hints */ + if ( hinter ) + { + FT_Pos dx = orig_x; + + + top[0] += dx; + top[2] += dx; + top[4] += dx; + hinter->stem3( hinter->hints, 0, top ); + } + break; + + case op_setcurrentpoint: + FT_TRACE4(( " setcurrentpoint" )); + + /* From the T1 specification, section 6.4: */ + /* */ + /* The setcurrentpoint command is used only in */ + /* conjunction with results from OtherSubrs procedures. */ + + /* known_othersubr_result_cnt != 0 is already handled */ + /* above. */ + + /* Note, however, that both Ghostscript and Adobe */ + /* Distiller handle this situation by silently ignoring */ + /* the inappropriate `setcurrentpoint' instruction. So */ + /* we do the same. */ +#if 0 + + if ( decoder->flex_state != 1 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected `setcurrentpoint'\n" )); + goto Syntax_Error; + } + else + ... +#endif + + x = top[0]; + y = top[1]; + decoder->flex_state = 0; + break; + + case op_unknown15: + FT_TRACE4(( " opcode_15" )); + /* nothing to do except to pop the two arguments */ + break; + + default: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unhandled opcode %d\n", op )); + goto Syntax_Error; + } + + /* XXX Operators usually clear the operand stack; */ + /* only div, callsubr, callothersubr, pop, and */ + /* return are different. */ + /* In practice it doesn't matter (?). */ + + decoder->top = top; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( "\n" )); + bol = TRUE; +#endif + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n\n" )); + + Fail: + return error; + + Syntax_Error: + return PSaux_Err_Syntax_Error; + + Stack_Underflow: + return PSaux_Err_Stack_Underflow; + } + + + /* parse a single Type 1 glyph */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_parse_glyph( T1_Decoder decoder, + FT_UInt glyph ) + { + return decoder->parse_callback( decoder, glyph ); + } + + + /* initialize T1 decoder */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_init( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback parse_callback ) + { + FT_MEM_ZERO( decoder, sizeof ( *decoder ) ); + + /* retrieve PSNames interface from list of current modules */ + { + FT_Service_PsCMaps psnames = 0; + + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + { + FT_ERROR(( "t1_decoder_init:" + " the `psnames' module is not available\n" )); + return PSaux_Err_Unimplemented_Feature; + } + + decoder->psnames = psnames; + } + + t1_builder_init( &decoder->builder, face, size, slot, hinting ); + + /* decoder->buildchar and decoder->len_buildchar have to be */ + /* initialized by the caller since we cannot know the length */ + /* of the BuildCharArray */ + + decoder->num_glyphs = (FT_UInt)face->num_glyphs; + decoder->glyph_names = glyph_names; + decoder->hint_mode = hint_mode; + decoder->blend = blend; + decoder->parse_callback = parse_callback; + + decoder->funcs = t1_decoder_funcs; + + return PSaux_Err_Ok; + } + + + /* finalize T1 decoder */ + FT_LOCAL_DEF( void ) + t1_decoder_done( T1_Decoder decoder ) + { + t1_builder_done( &decoder->builder ); + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/t1decode.h b/android/jni/ndk_modules/freetype/src/psaux/t1decode.h new file mode 100644 index 00000000..00728db5 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psaux/t1decode.h @@ -0,0 +1,64 @@ +/***************************************************************************/ +/* */ +/* t1decode.h */ +/* */ +/* PostScript Type 1 decoding routines (specification). */ +/* */ +/* Copyright 2000-2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1DECODE_H__ +#define __T1DECODE_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + + FT_CALLBACK_TABLE + const T1_Decoder_FuncsRec t1_decoder_funcs; + + + FT_LOCAL( FT_Error ) + t1_decoder_parse_glyph( T1_Decoder decoder, + FT_UInt glyph_index ); + + FT_LOCAL( FT_Error ) + t1_decoder_parse_charstrings( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); + + FT_LOCAL( FT_Error ) + t1_decoder_init( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback parse_glyph ); + + FT_LOCAL( void ) + t1_decoder_done( T1_Decoder decoder ); + + +FT_END_HEADER + +#endif /* __T1DECODE_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshalgo.c b/android/jni/ndk_modules/freetype/src/pshinter/pshalgo.c new file mode 100644 index 00000000..4b087859 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/pshinter/pshalgo.c @@ -0,0 +1,2308 @@ +/***************************************************************************/ +/* */ +/* pshalgo.c */ +/* */ +/* PostScript hinting algorithm (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 */ +/* by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include "pshalgo.h" + +#include "pshnterr.h" + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pshalgo2 + + +#ifdef DEBUG_HINTER + PSH_Hint_Table ps_debug_hint_table = 0; + PSH_HintFunc ps_debug_hint_func = 0; + PSH_Glyph ps_debug_glyph = 0; +#endif + + +#define COMPUTE_INFLEXS /* compute inflection points to optimize `S' */ + /* and similar glyphs */ +#define STRONGER /* slightly increase the contrast of smooth */ + /* hinting */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC HINTS RECORDINGS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* return true if two stem hints overlap */ + static FT_Int + psh_hint_overlap( PSH_Hint hint1, + PSH_Hint hint2 ) + { + return hint1->org_pos + hint1->org_len >= hint2->org_pos && + hint2->org_pos + hint2->org_len >= hint1->org_pos; + } + + + /* destroy hints table */ + static void + psh_hint_table_done( PSH_Hint_Table table, + FT_Memory memory ) + { + FT_FREE( table->zones ); + table->num_zones = 0; + table->zone = 0; + + FT_FREE( table->sort ); + FT_FREE( table->hints ); + table->num_hints = 0; + table->max_hints = 0; + table->sort_global = 0; + } + + + /* deactivate all hints in a table */ + static void + psh_hint_table_deactivate( PSH_Hint_Table table ) + { + FT_UInt count = table->max_hints; + PSH_Hint hint = table->hints; + + + for ( ; count > 0; count--, hint++ ) + { + psh_hint_deactivate( hint ); + hint->order = -1; + } + } + + + /* internal function to record a new hint */ + static void + psh_hint_table_record( PSH_Hint_Table table, + FT_UInt idx ) + { + PSH_Hint hint = table->hints + idx; + + + if ( idx >= table->max_hints ) + { + FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx )); + return; + } + + /* ignore active hints */ + if ( psh_hint_is_active( hint ) ) + return; + + psh_hint_activate( hint ); + + /* now scan the current active hint set to check */ + /* whether `hint' overlaps with another hint */ + { + PSH_Hint* sorted = table->sort_global; + FT_UInt count = table->num_hints; + PSH_Hint hint2; + + + hint->parent = 0; + for ( ; count > 0; count--, sorted++ ) + { + hint2 = sorted[0]; + + if ( psh_hint_overlap( hint, hint2 ) ) + { + hint->parent = hint2; + break; + } + } + } + + if ( table->num_hints < table->max_hints ) + table->sort_global[table->num_hints++] = hint; + else + FT_TRACE0(( "psh_hint_table_record: too many sorted hints! BUG!\n" )); + } + + + static void + psh_hint_table_record_mask( PSH_Hint_Table table, + PS_Mask hint_mask ) + { + FT_Int mask = 0, val = 0; + FT_Byte* cursor = hint_mask->bytes; + FT_UInt idx, limit; + + + limit = hint_mask->num_bits; + + for ( idx = 0; idx < limit; idx++ ) + { + if ( mask == 0 ) + { + val = *cursor++; + mask = 0x80; + } + + if ( val & mask ) + psh_hint_table_record( table, idx ); + + mask >>= 1; + } + } + + + /* create hints table */ + static FT_Error + psh_hint_table_init( PSH_Hint_Table table, + PS_Hint_Table hints, + PS_Mask_Table hint_masks, + PS_Mask_Table counter_masks, + FT_Memory memory ) + { + FT_UInt count; + FT_Error error; + + FT_UNUSED( counter_masks ); + + + count = hints->num_hints; + + /* allocate our tables */ + if ( FT_NEW_ARRAY( table->sort, 2 * count ) || + FT_NEW_ARRAY( table->hints, count ) || + FT_NEW_ARRAY( table->zones, 2 * count + 1 ) ) + goto Exit; + + table->max_hints = count; + table->sort_global = table->sort + count; + table->num_hints = 0; + table->num_zones = 0; + table->zone = 0; + + /* initialize the `table->hints' array */ + { + PSH_Hint write = table->hints; + PS_Hint read = hints->hints; + + + for ( ; count > 0; count--, write++, read++ ) + { + write->org_pos = read->pos; + write->org_len = read->len; + write->flags = read->flags; + } + } + + /* we now need to determine the initial `parent' stems; first */ + /* activate the hints that are given by the initial hint masks */ + if ( hint_masks ) + { + PS_Mask mask = hint_masks->masks; + + + count = hint_masks->num_masks; + table->hint_masks = hint_masks; + + for ( ; count > 0; count--, mask++ ) + psh_hint_table_record_mask( table, mask ); + } + + /* finally, do a linear parse in case some hints were left alone */ + if ( table->num_hints != table->max_hints ) + { + FT_UInt idx; + + + FT_TRACE0(( "psh_hint_table_init: missing/incorrect hint masks\n" )); + + count = table->max_hints; + for ( idx = 0; idx < count; idx++ ) + psh_hint_table_record( table, idx ); + } + + Exit: + return error; + } + + + static void + psh_hint_table_activate_mask( PSH_Hint_Table table, + PS_Mask hint_mask ) + { + FT_Int mask = 0, val = 0; + FT_Byte* cursor = hint_mask->bytes; + FT_UInt idx, limit, count; + + + limit = hint_mask->num_bits; + count = 0; + + psh_hint_table_deactivate( table ); + + for ( idx = 0; idx < limit; idx++ ) + { + if ( mask == 0 ) + { + val = *cursor++; + mask = 0x80; + } + + if ( val & mask ) + { + PSH_Hint hint = &table->hints[idx]; + + + if ( !psh_hint_is_active( hint ) ) + { + FT_UInt count2; + +#if 0 + PSH_Hint* sort = table->sort; + PSH_Hint hint2; + + + for ( count2 = count; count2 > 0; count2--, sort++ ) + { + hint2 = sort[0]; + if ( psh_hint_overlap( hint, hint2 ) ) + FT_TRACE0(( "psh_hint_table_activate_mask:" + " found overlapping hints\n" )) + } +#else + count2 = 0; +#endif + + if ( count2 == 0 ) + { + psh_hint_activate( hint ); + if ( count < table->max_hints ) + table->sort[count++] = hint; + else + FT_TRACE0(( "psh_hint_tableactivate_mask:" + " too many active hints\n" )); + } + } + } + + mask >>= 1; + } + table->num_hints = count; + + /* now, sort the hints; they are guaranteed to not overlap */ + /* so we can compare their "org_pos" field directly */ + { + FT_Int i1, i2; + PSH_Hint hint1, hint2; + PSH_Hint* sort = table->sort; + + + /* a simple bubble sort will do, since in 99% of cases, the hints */ + /* will be already sorted -- and the sort will be linear */ + for ( i1 = 1; i1 < (FT_Int)count; i1++ ) + { + hint1 = sort[i1]; + for ( i2 = i1 - 1; i2 >= 0; i2-- ) + { + hint2 = sort[i2]; + + if ( hint2->org_pos < hint1->org_pos ) + break; + + sort[i2 + 1] = hint2; + sort[i2] = hint1; + } + } + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HINTS GRID-FITTING AND OPTIMIZATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 1 + static FT_Pos + psh_dimension_quantize_len( PSH_Dimension dim, + FT_Pos len, + FT_Bool do_snapping ) + { + if ( len <= 64 ) + len = 64; + else + { + FT_Pos delta = len - dim->stdw.widths[0].cur; + + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + len = dim->stdw.widths[0].cur; + if ( len < 48 ) + len = 48; + } + + if ( len < 3 * 64 ) + { + delta = ( len & 63 ); + len &= -64; + + if ( delta < 10 ) + len += delta; + + else if ( delta < 32 ) + len += 10; + + else if ( delta < 54 ) + len += 54; + + else + len += delta; + } + else + len = FT_PIX_ROUND( len ); + } + + if ( do_snapping ) + len = FT_PIX_ROUND( len ); + + return len; + } +#endif /* 0 */ + + +#ifdef DEBUG_HINTER + + static void + ps_simple_scale( PSH_Hint_Table table, + FT_Fixed scale, + FT_Fixed delta, + FT_Int dimension ) + { + PSH_Hint hint; + FT_UInt count; + + + for ( count = 0; count < table->max_hints; count++ ) + { + hint = table->hints + count; + + hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta; + hint->cur_len = FT_MulFix( hint->org_len, scale ); + + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); + } + } + +#endif /* DEBUG_HINTER */ + + + static FT_Fixed + psh_hint_snap_stem_side_delta( FT_Fixed pos, + FT_Fixed len ) + { + FT_Fixed delta1 = FT_PIX_ROUND( pos ) - pos; + FT_Fixed delta2 = FT_PIX_ROUND( pos + len ) - pos - len; + + + if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) ) + return delta1; + else + return delta2; + } + + + static void + psh_hint_align( PSH_Hint hint, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( !psh_hint_is_fitted( hint ) ) + { + FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; + FT_Pos len = FT_MulFix( hint->org_len, scale ); + + FT_Int do_snapping; + FT_Pos fit_len; + PSH_AlignmentRec align; + + + /* ignore stem alignments when requested through the hint flags */ + if ( ( dimension == 0 && !glyph->do_horz_hints ) || + ( dimension == 1 && !glyph->do_vert_hints ) ) + { + hint->cur_pos = pos; + hint->cur_len = len; + + psh_hint_set_fitted( hint ); + return; + } + + /* perform stem snapping when requested - this is necessary + * for monochrome and LCD hinting modes only + */ + do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) || + ( dimension == 1 && glyph->do_vert_snapping ); + + hint->cur_len = fit_len = len; + + /* check blue zones for horizontal stems */ + align.align = PSH_BLUE_ALIGN_NONE; + align.align_bot = align.align_top = 0; + + if ( dimension == 1 ) + psh_blues_snap_stem( &globals->blues, + hint->org_pos + hint->org_len, + hint->org_pos, + &align ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + /* the top of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_top - fit_len; + break; + + case PSH_BLUE_ALIGN_BOT: + /* the bottom of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_bot; + break; + + case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: + /* both edges of the stem are aligned against blue zones */ + hint->cur_pos = align.align_bot; + hint->cur_len = align.align_top - align.align_bot; + break; + + default: + { + PSH_Hint parent = hint->parent; + + + if ( parent ) + { + FT_Pos par_org_center, par_cur_center; + FT_Pos cur_org_center, cur_delta; + + + /* ensure that parent is already fitted */ + if ( !psh_hint_is_fitted( parent ) ) + psh_hint_align( parent, globals, dimension, glyph ); + + /* keep original relation between hints, this is, use the */ + /* scaled distance between the centers of the hints to */ + /* compute the new position */ + par_org_center = parent->org_pos + ( parent->org_len >> 1 ); + par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 ); + cur_org_center = hint->org_pos + ( hint->org_len >> 1 ); + + cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); + pos = par_cur_center + cur_delta - ( len >> 1 ); + } + + hint->cur_pos = pos; + hint->cur_len = fit_len; + + /* Stem adjustment tries to snap stem widths to standard + * ones. This is important to prevent unpleasant rounding + * artefacts. + */ + if ( glyph->do_stem_adjust ) + { + if ( len <= 64 ) + { + /* the stem is less than one pixel; we will center it + * around the nearest pixel center + */ + if ( len >= 32 ) + { + /* This is a special case where we also widen the stem + * and align it to the pixel grid. + * + * stem_center = pos + (len/2) + * nearest_pixel_center = FT_ROUND(stem_center-32)+32 + * new_pos = nearest_pixel_center-32 + * = FT_ROUND(stem_center-32) + * = FT_FLOOR(stem_center-32+32) + * = FT_FLOOR(stem_center) + * new_len = 64 + */ + pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ); + len = 64; + } + else if ( len > 0 ) + { + /* This is a very small stem; we simply align it to the + * pixel grid, trying to find the minimal displacement. + * + * left = pos + * right = pos + len + * left_nearest_edge = ROUND(pos) + * right_nearest_edge = ROUND(right) + * + * if ( ABS(left_nearest_edge - left) <= + * ABS(right_nearest_edge - right) ) + * new_pos = left + * else + * new_pos = right + */ + FT_Pos left_nearest = FT_PIX_ROUND( pos ); + FT_Pos right_nearest = FT_PIX_ROUND( pos + len ); + FT_Pos left_disp = left_nearest - pos; + FT_Pos right_disp = right_nearest - ( pos + len ); + + + if ( left_disp < 0 ) + left_disp = -left_disp; + if ( right_disp < 0 ) + right_disp = -right_disp; + if ( left_disp <= right_disp ) + pos = left_nearest; + else + pos = right_nearest; + } + else + { + /* this is a ghost stem; we simply round it */ + pos = FT_PIX_ROUND( pos ); + } + } + else + { + len = psh_dimension_quantize_len( dim, len, 0 ); + } + } + + /* now that we have a good hinted stem width, try to position */ + /* the stem along a pixel grid integer coordinate */ + hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len ); + hint->cur_len = len; + } + } + + if ( do_snapping ) + { + pos = hint->cur_pos; + len = hint->cur_len; + + if ( len < 64 ) + len = 64; + else + len = FT_PIX_ROUND( len ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + hint->cur_pos = align.align_top - len; + hint->cur_len = len; + break; + + case PSH_BLUE_ALIGN_BOT: + hint->cur_len = len; + break; + + case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP: + /* don't touch */ + break; + + + default: + hint->cur_len = len; + if ( len & 64 ) + pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32; + else + pos = FT_PIX_ROUND( pos + ( len >> 1 ) ); + + hint->cur_pos = pos - ( len >> 1 ); + hint->cur_len = len; + } + } + + psh_hint_set_fitted( hint ); + +#ifdef DEBUG_HINTER + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); +#endif + } + } + + +#if 0 /* not used for now, experimental */ + + /* + * A variant to perform "light" hinting (i.e. FT_RENDER_MODE_LIGHT) + * of stems + */ + static void + psh_hint_align_light( PSH_Hint hint, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( !psh_hint_is_fitted( hint ) ) + { + FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; + FT_Pos len = FT_MulFix( hint->org_len, scale ); + + FT_Pos fit_len; + + PSH_AlignmentRec align; + + + /* ignore stem alignments when requested through the hint flags */ + if ( ( dimension == 0 && !glyph->do_horz_hints ) || + ( dimension == 1 && !glyph->do_vert_hints ) ) + { + hint->cur_pos = pos; + hint->cur_len = len; + + psh_hint_set_fitted( hint ); + return; + } + + fit_len = len; + + hint->cur_len = fit_len; + + /* check blue zones for horizontal stems */ + align.align = PSH_BLUE_ALIGN_NONE; + align.align_bot = align.align_top = 0; + + if ( dimension == 1 ) + psh_blues_snap_stem( &globals->blues, + hint->org_pos + hint->org_len, + hint->org_pos, + &align ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + /* the top of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_top - fit_len; + break; + + case PSH_BLUE_ALIGN_BOT: + /* the bottom of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_bot; + break; + + case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: + /* both edges of the stem are aligned against blue zones */ + hint->cur_pos = align.align_bot; + hint->cur_len = align.align_top - align.align_bot; + break; + + default: + { + PSH_Hint parent = hint->parent; + + + if ( parent ) + { + FT_Pos par_org_center, par_cur_center; + FT_Pos cur_org_center, cur_delta; + + + /* ensure that parent is already fitted */ + if ( !psh_hint_is_fitted( parent ) ) + psh_hint_align_light( parent, globals, dimension, glyph ); + + par_org_center = parent->org_pos + ( parent->org_len / 2 ); + par_cur_center = parent->cur_pos + ( parent->cur_len / 2 ); + cur_org_center = hint->org_pos + ( hint->org_len / 2 ); + + cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); + pos = par_cur_center + cur_delta - ( len >> 1 ); + } + + /* Stems less than one pixel wide are easy -- we want to + * make them as dark as possible, so they must fall within + * one pixel. If the stem is split between two pixels + * then snap the edge that is nearer to the pixel boundary + * to the pixel boundary. + */ + if ( len <= 64 ) + { + if ( ( pos + len + 63 ) / 64 != pos / 64 + 1 ) + pos += psh_hint_snap_stem_side_delta ( pos, len ); + } + + /* Position stems other to minimize the amount of mid-grays. + * There are, in general, two positions that do this, + * illustrated as A) and B) below. + * + * + + + + + * + * A) |--------------------------------| + * B) |--------------------------------| + * C) |--------------------------------| + * + * Position A) (split the excess stem equally) should be better + * for stems of width N + f where f < 0.5. + * + * Position B) (split the deficiency equally) should be better + * for stems of width N + f where f > 0.5. + * + * It turns out though that minimizing the total number of lit + * pixels is also important, so position C), with one edge + * aligned with a pixel boundary is actually preferable + * to A). There are also more possibile positions for C) than + * for A) or B), so it involves less distortion of the overall + * character shape. + */ + else /* len > 64 */ + { + FT_Fixed frac_len = len & 63; + FT_Fixed center = pos + ( len >> 1 ); + FT_Fixed delta_a, delta_b; + + + if ( ( len / 64 ) & 1 ) + { + delta_a = FT_PIX_FLOOR( center ) + 32 - center; + delta_b = FT_PIX_ROUND( center ) - center; + } + else + { + delta_a = FT_PIX_ROUND( center ) - center; + delta_b = FT_PIX_FLOOR( center ) + 32 - center; + } + + /* We choose between B) and C) above based on the amount + * of fractinal stem width; for small amounts, choose + * C) always, for large amounts, B) always, and inbetween, + * pick whichever one involves less stem movement. + */ + if ( frac_len < 32 ) + { + pos += psh_hint_snap_stem_side_delta ( pos, len ); + } + else if ( frac_len < 48 ) + { + FT_Fixed side_delta = psh_hint_snap_stem_side_delta ( pos, + len ); + + if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) ) + pos += side_delta; + else + pos += delta_b; + } + else + { + pos += delta_b; + } + } + + hint->cur_pos = pos; + } + } /* switch */ + + psh_hint_set_fitted( hint ); + +#ifdef DEBUG_HINTER + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); +#endif + } + } + +#endif /* 0 */ + + + static void + psh_hint_table_align_hints( PSH_Hint_Table table, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Hint hint; + FT_UInt count; + +#ifdef DEBUG_HINTER + + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( ps_debug_no_vert_hints && dimension == 0 ) + { + ps_simple_scale( table, scale, delta, dimension ); + return; + } + + if ( ps_debug_no_horz_hints && dimension == 1 ) + { + ps_simple_scale( table, scale, delta, dimension ); + return; + } + +#endif /* DEBUG_HINTER*/ + + hint = table->hints; + count = table->max_hints; + + for ( ; count > 0; count--, hint++ ) + psh_hint_align( hint, globals, dimension, glyph ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** POINTS INTERPOLATION ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define PSH_ZONE_MIN -3200000L +#define PSH_ZONE_MAX +3200000L + +#define xxDEBUG_ZONES + + +#ifdef DEBUG_ZONES + +#include FT_CONFIG_STANDARD_LIBRARY_H + + static void + psh_print_zone( PSH_Zone zone ) + { + printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n", + zone->scale / 65536.0, + zone->delta / 64.0, + zone->min, + zone->max ); + } + +#else + +#define psh_print_zone( x ) do { } while ( 0 ) + +#endif /* DEBUG_ZONES */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HINTER GLYPH MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 1 + +#define psh_corner_is_flat ft_corner_is_flat +#define psh_corner_orientation ft_corner_orientation + +#else + + FT_LOCAL_DEF( FT_Int ) + psh_corner_is_flat( FT_Pos x_in, + FT_Pos y_in, + FT_Pos x_out, + FT_Pos y_out ) + { + FT_Pos ax = x_in; + FT_Pos ay = y_in; + + FT_Pos d_in, d_out, d_corner; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + d_in = ax + ay; + + ax = x_out; + if ( ax < 0 ) + ax = -ax; + ay = y_out; + if ( ay < 0 ) + ay = -ay; + d_out = ax + ay; + + ax = x_out + x_in; + if ( ax < 0 ) + ax = -ax; + ay = y_out + y_in; + if ( ay < 0 ) + ay = -ay; + d_corner = ax + ay; + + return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); + } + + static FT_Int + psh_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + FT_Int result; + + + /* deal with the trivial cases quickly */ + if ( in_y == 0 ) + { + if ( in_x >= 0 ) + result = out_y; + else + result = -out_y; + } + else if ( in_x == 0 ) + { + if ( in_y >= 0 ) + result = -out_x; + else + result = out_x; + } + else if ( out_y == 0 ) + { + if ( out_x >= 0 ) + result = in_y; + else + result = -in_y; + } + else if ( out_x == 0 ) + { + if ( out_y >= 0 ) + result = -in_x; + else + result = in_x; + } + else /* general case */ + { + long long delta = (long long)in_x * out_y - (long long)in_y * out_x; + + if ( delta == 0 ) + result = 0; + else + result = 1 - 2 * ( delta < 0 ); + } + + return result; + } + +#endif /* !1 */ + + +#ifdef COMPUTE_INFLEXS + + /* compute all inflex points in a given glyph */ + static void + psh_glyph_compute_inflections( PSH_Glyph glyph ) + { + FT_UInt n; + + + for ( n = 0; n < glyph->num_contours; n++ ) + { + PSH_Point first, start, end, before, after; + FT_Pos in_x, in_y, out_x, out_y; + FT_Int orient_prev, orient_cur; + FT_Int finished = 0; + + + /* we need at least 4 points to create an inflection point */ + if ( glyph->contours[n].count < 4 ) + continue; + + /* compute first segment in contour */ + first = glyph->contours[n].start; + + start = end = first; + do + { + end = end->next; + if ( end == first ) + goto Skip; + + in_x = end->org_u - start->org_u; + in_y = end->org_v - start->org_v; + + } while ( in_x == 0 && in_y == 0 ); + + /* extend the segment start whenever possible */ + before = start; + do + { + do + { + start = before; + before = before->prev; + if ( before == first ) + goto Skip; + + out_x = start->org_u - before->org_u; + out_y = start->org_v - before->org_v; + + } while ( out_x == 0 && out_y == 0 ); + + orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_prev == 0 ); + + first = start; + in_x = out_x; + in_y = out_y; + + /* now, process all segments in the contour */ + do + { + /* first, extend current segment's end whenever possible */ + after = end; + do + { + do + { + end = after; + after = after->next; + if ( after == first ) + finished = 1; + + out_x = after->org_u - end->org_u; + out_y = after->org_v - end->org_v; + + } while ( out_x == 0 && out_y == 0 ); + + orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_cur == 0 ); + + if ( ( orient_cur ^ orient_prev ) < 0 ) + { + do + { + psh_point_set_inflex( start ); + start = start->next; + } + while ( start != end ); + + psh_point_set_inflex( start ); + } + + start = end; + end = after; + orient_prev = orient_cur; + in_x = out_x; + in_y = out_y; + + } while ( !finished ); + + Skip: + ; + } + } + +#endif /* COMPUTE_INFLEXS */ + + + static void + psh_glyph_done( PSH_Glyph glyph ) + { + FT_Memory memory = glyph->memory; + + + psh_hint_table_done( &glyph->hint_tables[1], memory ); + psh_hint_table_done( &glyph->hint_tables[0], memory ); + + FT_FREE( glyph->points ); + FT_FREE( glyph->contours ); + + glyph->num_points = 0; + glyph->num_contours = 0; + + glyph->memory = 0; + } + + + static int + psh_compute_dir( FT_Pos dx, + FT_Pos dy ) + { + FT_Pos ax, ay; + int result = PSH_DIR_NONE; + + + ax = ( dx >= 0 ) ? dx : -dx; + ay = ( dy >= 0 ) ? dy : -dy; + + if ( ay * 12 < ax ) + { + /* |dy| <<< |dx| means a near-horizontal segment */ + result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT; + } + else if ( ax * 12 < ay ) + { + /* |dx| <<< |dy| means a near-vertical segment */ + result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN; + } + + return result; + } + + + /* load outline point coordinates into hinter glyph */ + static void + psh_glyph_load_points( PSH_Glyph glyph, + FT_Int dimension ) + { + FT_Vector* vec = glyph->outline->points; + PSH_Point point = glyph->points; + FT_UInt count = glyph->num_points; + + + for ( ; count > 0; count--, point++, vec++ ) + { + point->flags2 = 0; + point->hint = NULL; + if ( dimension == 0 ) + { + point->org_u = vec->x; + point->org_v = vec->y; + } + else + { + point->org_u = vec->y; + point->org_v = vec->x; + } + +#ifdef DEBUG_HINTER + point->org_x = vec->x; + point->org_y = vec->y; +#endif + + } + } + + + /* save hinted point coordinates back to outline */ + static void + psh_glyph_save_points( PSH_Glyph glyph, + FT_Int dimension ) + { + FT_UInt n; + PSH_Point point = glyph->points; + FT_Vector* vec = glyph->outline->points; + char* tags = glyph->outline->tags; + + + for ( n = 0; n < glyph->num_points; n++ ) + { + if ( dimension == 0 ) + vec[n].x = point->cur_u; + else + vec[n].y = point->cur_u; + + if ( psh_point_is_strong( point ) ) + tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 ); + +#ifdef DEBUG_HINTER + + if ( dimension == 0 ) + { + point->cur_x = point->cur_u; + point->flags_x = point->flags2 | point->flags; + } + else + { + point->cur_y = point->cur_u; + point->flags_y = point->flags2 | point->flags; + } + +#endif + + point++; + } + } + + + static FT_Error + psh_glyph_init( PSH_Glyph glyph, + FT_Outline* outline, + PS_Hints ps_hints, + PSH_Globals globals ) + { + FT_Error error; + FT_Memory memory; + + + /* clear all fields */ + FT_MEM_ZERO( glyph, sizeof ( *glyph ) ); + + memory = glyph->memory = globals->memory; + + /* allocate and setup points + contours arrays */ + if ( FT_NEW_ARRAY( glyph->points, outline->n_points ) || + FT_NEW_ARRAY( glyph->contours, outline->n_contours ) ) + goto Exit; + + glyph->num_points = outline->n_points; + glyph->num_contours = outline->n_contours; + + { + FT_UInt first = 0, next, n; + PSH_Point points = glyph->points; + PSH_Contour contour = glyph->contours; + + + for ( n = 0; n < glyph->num_contours; n++ ) + { + FT_Int count; + PSH_Point point; + + + next = outline->contours[n] + 1; + count = next - first; + + contour->start = points + first; + contour->count = (FT_UInt)count; + + if ( count > 0 ) + { + point = points + first; + + point->prev = points + next - 1; + point->contour = contour; + + for ( ; count > 1; count-- ) + { + point[0].next = point + 1; + point[1].prev = point; + point++; + point->contour = contour; + } + point->next = points + first; + } + + contour++; + first = next; + } + } + + { + PSH_Point points = glyph->points; + PSH_Point point = points; + FT_Vector* vec = outline->points; + FT_UInt n; + + + for ( n = 0; n < glyph->num_points; n++, point++ ) + { + FT_Int n_prev = (FT_Int)( point->prev - points ); + FT_Int n_next = (FT_Int)( point->next - points ); + FT_Pos dxi, dyi, dxo, dyo; + + + if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) ) + point->flags = PSH_POINT_OFF; + + dxi = vec[n].x - vec[n_prev].x; + dyi = vec[n].y - vec[n_prev].y; + + point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi ); + + dxo = vec[n_next].x - vec[n].x; + dyo = vec[n_next].y - vec[n].y; + + point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo ); + + /* detect smooth points */ + if ( point->flags & PSH_POINT_OFF ) + point->flags |= PSH_POINT_SMOOTH; + + else if ( point->dir_in == point->dir_out ) + { + if ( point->dir_out != PSH_DIR_NONE || + psh_corner_is_flat( dxi, dyi, dxo, dyo ) ) + point->flags |= PSH_POINT_SMOOTH; + } + } + } + + glyph->outline = outline; + glyph->globals = globals; + +#ifdef COMPUTE_INFLEXS + psh_glyph_load_points( glyph, 0 ); + psh_glyph_compute_inflections( glyph ); +#endif /* COMPUTE_INFLEXS */ + + /* now deal with hints tables */ + error = psh_hint_table_init( &glyph->hint_tables [0], + &ps_hints->dimension[0].hints, + &ps_hints->dimension[0].masks, + &ps_hints->dimension[0].counters, + memory ); + if ( error ) + goto Exit; + + error = psh_hint_table_init( &glyph->hint_tables [1], + &ps_hints->dimension[1].hints, + &ps_hints->dimension[1].masks, + &ps_hints->dimension[1].counters, + memory ); + if ( error ) + goto Exit; + + Exit: + return error; + } + + + /* compute all extrema in a glyph for a given dimension */ + static void + psh_glyph_compute_extrema( PSH_Glyph glyph ) + { + FT_UInt n; + + + /* first of all, compute all local extrema */ + for ( n = 0; n < glyph->num_contours; n++ ) + { + PSH_Point first = glyph->contours[n].start; + PSH_Point point, before, after; + + + if ( glyph->contours[n].count == 0 ) + continue; + + point = first; + before = point; + after = point; + + do + { + before = before->prev; + if ( before == first ) + goto Skip; + + } while ( before->org_u == point->org_u ); + + first = point = before->next; + + for (;;) + { + after = point; + do + { + after = after->next; + if ( after == first ) + goto Next; + + } while ( after->org_u == point->org_u ); + + if ( before->org_u < point->org_u ) + { + if ( after->org_u < point->org_u ) + { + /* local maximum */ + goto Extremum; + } + } + else /* before->org_u > point->org_u */ + { + if ( after->org_u > point->org_u ) + { + /* local minimum */ + Extremum: + do + { + psh_point_set_extremum( point ); + point = point->next; + + } while ( point != after ); + } + } + + before = after->prev; + point = after; + + } /* for */ + + Next: + ; + } + + /* for each extremum, determine its direction along the */ + /* orthogonal axis */ + for ( n = 0; n < glyph->num_points; n++ ) + { + PSH_Point point, before, after; + + + point = &glyph->points[n]; + before = point; + after = point; + + if ( psh_point_is_extremum( point ) ) + { + do + { + before = before->prev; + if ( before == point ) + goto Skip; + + } while ( before->org_v == point->org_v ); + + do + { + after = after->next; + if ( after == point ) + goto Skip; + + } while ( after->org_v == point->org_v ); + } + + if ( before->org_v < point->org_v && + after->org_v > point->org_v ) + { + psh_point_set_positive( point ); + } + else if ( before->org_v > point->org_v && + after->org_v < point->org_v ) + { + psh_point_set_negative( point ); + } + + Skip: + ; + } + } + + + /* major_dir is the direction for points on the bottom/left of the stem; */ + /* Points on the top/right of the stem will have a direction of */ + /* -major_dir. */ + + static void + psh_hint_table_find_strong_points( PSH_Hint_Table table, + PSH_Point point, + FT_UInt count, + FT_Int threshold, + FT_Int major_dir ) + { + PSH_Hint* sort = table->sort; + FT_UInt num_hints = table->num_hints; + + + for ( ; count > 0; count--, point++ ) + { + FT_Int point_dir = 0; + FT_Pos org_u = point->org_u; + + + if ( psh_point_is_strong( point ) ) + continue; + + if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) ) + point_dir = point->dir_in; + + else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) ) + point_dir = point->dir_out; + + if ( point_dir ) + { + if ( point_dir == major_dir ) + { + FT_UInt nn; + + + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos; + + + if ( d < threshold && -d < threshold ) + { + psh_point_set_strong( point ); + point->flags2 |= PSH_POINT_EDGE_MIN; + point->hint = hint; + break; + } + } + } + else if ( point_dir == -major_dir ) + { + FT_UInt nn; + + + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos - hint->org_len; + + + if ( d < threshold && -d < threshold ) + { + psh_point_set_strong( point ); + point->flags2 |= PSH_POINT_EDGE_MAX; + point->hint = hint; + break; + } + } + } + } + +#if 1 + else if ( psh_point_is_extremum( point ) ) + { + /* treat extrema as special cases for stem edge alignment */ + FT_UInt nn, min_flag, max_flag; + + + if ( major_dir == PSH_DIR_HORIZONTAL ) + { + min_flag = PSH_POINT_POSITIVE; + max_flag = PSH_POINT_NEGATIVE; + } + else + { + min_flag = PSH_POINT_NEGATIVE; + max_flag = PSH_POINT_POSITIVE; + } + + if ( point->flags2 & min_flag ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos; + + + if ( d < threshold && -d < threshold ) + { + point->flags2 |= PSH_POINT_EDGE_MIN; + point->hint = hint; + psh_point_set_strong( point ); + break; + } + } + } + else if ( point->flags2 & max_flag ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos - hint->org_len; + + + if ( d < threshold && -d < threshold ) + { + point->flags2 |= PSH_POINT_EDGE_MAX; + point->hint = hint; + psh_point_set_strong( point ); + break; + } + } + } + + if ( point->hint == NULL ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + + + if ( org_u >= hint->org_pos && + org_u <= hint->org_pos + hint->org_len ) + { + point->hint = hint; + break; + } + } + } + } + +#endif /* 1 */ + } + } + + + /* the accepted shift for strong points in fractional pixels */ +#define PSH_STRONG_THRESHOLD 32 + + /* the maximum shift value in font units */ +#define PSH_STRONG_THRESHOLD_MAXIMUM 30 + + + /* find strong points in a glyph */ + static void + psh_glyph_find_strong_points( PSH_Glyph glyph, + FT_Int dimension ) + { + /* a point is `strong' if it is located on a stem edge and */ + /* has an `in' or `out' tangent parallel to the hint's direction */ + + PSH_Hint_Table table = &glyph->hint_tables[dimension]; + PS_Mask mask = table->hint_masks->masks; + FT_UInt num_masks = table->hint_masks->num_masks; + FT_UInt first = 0; + FT_Int major_dir = dimension == 0 ? PSH_DIR_VERTICAL + : PSH_DIR_HORIZONTAL; + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Int threshold; + + + threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale ); + if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM ) + threshold = PSH_STRONG_THRESHOLD_MAXIMUM; + + /* process secondary hints to `selected' points */ + if ( num_masks > 1 && glyph->num_points > 0 ) + { + /* the `endchar' op can reduce the number of points */ + first = mask->end_point > glyph->num_points + ? glyph->num_points + : mask->end_point; + mask++; + for ( ; num_masks > 1; num_masks--, mask++ ) + { + FT_UInt next; + FT_Int count; + + + next = mask->end_point > glyph->num_points + ? glyph->num_points + : mask->end_point; + count = next - first; + if ( count > 0 ) + { + PSH_Point point = glyph->points + first; + + + psh_hint_table_activate_mask( table, mask ); + + psh_hint_table_find_strong_points( table, point, count, + threshold, major_dir ); + } + first = next; + } + } + + /* process primary hints for all points */ + if ( num_masks == 1 ) + { + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + psh_hint_table_activate_mask( table, table->hint_masks->masks ); + + psh_hint_table_find_strong_points( table, point, count, + threshold, major_dir ); + } + + /* now, certain points may have been attached to a hint and */ + /* not marked as strong; update their flags then */ + { + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + for ( ; count > 0; count--, point++ ) + if ( point->hint && !psh_point_is_strong( point ) ) + psh_point_set_strong( point ); + } + } + + + /* find points in a glyph which are in a blue zone and have `in' or */ + /* `out' tangents parallel to the horizontal axis */ + static void + psh_glyph_find_blue_points( PSH_Blues blues, + PSH_Glyph glyph ) + { + PSH_Blue_Table table; + PSH_Blue_Zone zone; + FT_UInt glyph_count = glyph->num_points; + FT_UInt blue_count; + PSH_Point point = glyph->points; + + + for ( ; glyph_count > 0; glyph_count--, point++ ) + { + FT_Pos y; + + + /* check tangents */ + if ( !PSH_DIR_COMPARE( point->dir_in, PSH_DIR_HORIZONTAL ) && + !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) ) + continue; + + /* skip strong points */ + if ( psh_point_is_strong( point ) ) + continue; + + y = point->org_u; + + /* look up top zones */ + table = &blues->normal_top; + blue_count = table->count; + zone = table->zones; + + for ( ; blue_count > 0; blue_count--, zone++ ) + { + FT_Pos delta = y - zone->org_bottom; + + + if ( delta < -blues->blue_fuzz ) + break; + + if ( y <= zone->org_top + blues->blue_fuzz ) + if ( blues->no_overshoots || delta <= blues->blue_threshold ) + { + point->cur_u = zone->cur_bottom; + psh_point_set_strong( point ); + psh_point_set_fitted( point ); + } + } + + /* look up bottom zones */ + table = &blues->normal_bottom; + blue_count = table->count; + zone = table->zones + blue_count - 1; + + for ( ; blue_count > 0; blue_count--, zone-- ) + { + FT_Pos delta = zone->org_top - y; + + + if ( delta < -blues->blue_fuzz ) + break; + + if ( y >= zone->org_bottom - blues->blue_fuzz ) + if ( blues->no_overshoots || delta < blues->blue_threshold ) + { + point->cur_u = zone->cur_top; + psh_point_set_strong( point ); + psh_point_set_fitted( point ); + } + } + } + } + + + /* interpolate strong points with the help of hinted coordinates */ + static void + psh_glyph_interpolate_strong_points( PSH_Glyph glyph, + FT_Int dimension ) + { + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + for ( ; count > 0; count--, point++ ) + { + PSH_Hint hint = point->hint; + + + if ( hint ) + { + FT_Pos delta; + + + if ( psh_point_is_edge_min( point ) ) + point->cur_u = hint->cur_pos; + + else if ( psh_point_is_edge_max( point ) ) + point->cur_u = hint->cur_pos + hint->cur_len; + + else + { + delta = point->org_u - hint->org_pos; + + if ( delta <= 0 ) + point->cur_u = hint->cur_pos + FT_MulFix( delta, scale ); + + else if ( delta >= hint->org_len ) + point->cur_u = hint->cur_pos + hint->cur_len + + FT_MulFix( delta - hint->org_len, scale ); + + else if ( hint->org_len > 0 ) + point->cur_u = hint->cur_pos + + FT_MulDiv( delta, hint->cur_len, + hint->org_len ); + else + point->cur_u = hint->cur_pos; + } + psh_point_set_fitted( point ); + } + } + } + + +#define PSH_MAX_STRONG_INTERNAL 16 + + static void + psh_glyph_interpolate_normal_points( PSH_Glyph glyph, + FT_Int dimension ) + { + +#if 1 + /* first technique: a point is strong if it is a local extremum */ + + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Memory memory = glyph->memory; + + PSH_Point* strongs = NULL; + PSH_Point strongs_0[PSH_MAX_STRONG_INTERNAL]; + FT_UInt num_strongs = 0; + + PSH_Point points = glyph->points; + PSH_Point points_end = points + glyph->num_points; + PSH_Point point; + + + /* first count the number of strong points */ + for ( point = points; point < points_end; point++ ) + { + if ( psh_point_is_strong( point ) ) + num_strongs++; + } + + if ( num_strongs == 0 ) /* nothing to do here */ + return; + + /* allocate an array to store a list of points, */ + /* stored in increasing org_u order */ + if ( num_strongs <= PSH_MAX_STRONG_INTERNAL ) + strongs = strongs_0; + else + { + FT_Error error; + + + if ( FT_NEW_ARRAY( strongs, num_strongs ) ) + return; + } + + num_strongs = 0; + for ( point = points; point < points_end; point++ ) + { + PSH_Point* insert; + + + if ( !psh_point_is_strong( point ) ) + continue; + + for ( insert = strongs + num_strongs; insert > strongs; insert-- ) + { + if ( insert[-1]->org_u <= point->org_u ) + break; + + insert[0] = insert[-1]; + } + insert[0] = point; + num_strongs++; + } + + /* now try to interpolate all normal points */ + for ( point = points; point < points_end; point++ ) + { + if ( psh_point_is_strong( point ) ) + continue; + + /* sometimes, some local extrema are smooth points */ + if ( psh_point_is_smooth( point ) ) + { + if ( point->dir_in == PSH_DIR_NONE || + point->dir_in != point->dir_out ) + continue; + + if ( !psh_point_is_extremum( point ) && + !psh_point_is_inflex( point ) ) + continue; + + point->flags &= ~PSH_POINT_SMOOTH; + } + + /* find best enclosing point coordinates then interpolate */ + { + PSH_Point before, after; + FT_UInt nn; + + + for ( nn = 0; nn < num_strongs; nn++ ) + if ( strongs[nn]->org_u > point->org_u ) + break; + + if ( nn == 0 ) /* point before the first strong point */ + { + after = strongs[0]; + + point->cur_u = after->cur_u + + FT_MulFix( point->org_u - after->org_u, + scale ); + } + else + { + before = strongs[nn - 1]; + + for ( nn = num_strongs; nn > 0; nn-- ) + if ( strongs[nn - 1]->org_u < point->org_u ) + break; + + if ( nn == num_strongs ) /* point is after last strong point */ + { + before = strongs[nn - 1]; + + point->cur_u = before->cur_u + + FT_MulFix( point->org_u - before->org_u, + scale ); + } + else + { + FT_Pos u; + + + after = strongs[nn]; + + /* now interpolate point between before and after */ + u = point->org_u; + + if ( u == before->org_u ) + point->cur_u = before->cur_u; + + else if ( u == after->org_u ) + point->cur_u = after->cur_u; + + else + point->cur_u = before->cur_u + + FT_MulDiv( u - before->org_u, + after->cur_u - before->cur_u, + after->org_u - before->org_u ); + } + } + psh_point_set_fitted( point ); + } + } + + if ( strongs != strongs_0 ) + FT_FREE( strongs ); + +#endif /* 1 */ + + } + + + /* interpolate other points */ + static void + psh_glyph_interpolate_other_points( PSH_Glyph glyph, + FT_Int dimension ) + { + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + PSH_Contour contour = glyph->contours; + FT_UInt num_contours = glyph->num_contours; + + + for ( ; num_contours > 0; num_contours--, contour++ ) + { + PSH_Point start = contour->start; + PSH_Point first, next, point; + FT_UInt fit_count; + + + /* count the number of strong points in this contour */ + next = start + contour->count; + fit_count = 0; + first = 0; + + for ( point = start; point < next; point++ ) + if ( psh_point_is_fitted( point ) ) + { + if ( !first ) + first = point; + + fit_count++; + } + + /* if there are less than 2 fitted points in the contour, we */ + /* simply scale and eventually translate the contour points */ + if ( fit_count < 2 ) + { + if ( fit_count == 1 ) + delta = first->cur_u - FT_MulFix( first->org_u, scale ); + + for ( point = start; point < next; point++ ) + if ( point != first ) + point->cur_u = FT_MulFix( point->org_u, scale ) + delta; + + goto Next_Contour; + } + + /* there are more than 2 strong points in this contour; we */ + /* need to interpolate weak points between them */ + start = first; + do + { + point = first; + + /* skip consecutive fitted points */ + for (;;) + { + next = first->next; + if ( next == start ) + goto Next_Contour; + + if ( !psh_point_is_fitted( next ) ) + break; + + first = next; + } + + /* find next fitted point after unfitted one */ + for (;;) + { + next = next->next; + if ( psh_point_is_fitted( next ) ) + break; + } + + /* now interpolate between them */ + { + FT_Pos org_a, org_ab, cur_a, cur_ab; + FT_Pos org_c, org_ac, cur_c; + FT_Fixed scale_ab; + + + if ( first->org_u <= next->org_u ) + { + org_a = first->org_u; + cur_a = first->cur_u; + org_ab = next->org_u - org_a; + cur_ab = next->cur_u - cur_a; + } + else + { + org_a = next->org_u; + cur_a = next->cur_u; + org_ab = first->org_u - org_a; + cur_ab = first->cur_u - cur_a; + } + + scale_ab = 0x10000L; + if ( org_ab > 0 ) + scale_ab = FT_DivFix( cur_ab, org_ab ); + + point = first->next; + do + { + org_c = point->org_u; + org_ac = org_c - org_a; + + if ( org_ac <= 0 ) + { + /* on the left of the interpolation zone */ + cur_c = cur_a + FT_MulFix( org_ac, scale ); + } + else if ( org_ac >= org_ab ) + { + /* on the right on the interpolation zone */ + cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale ); + } + else + { + /* within the interpolation zone */ + cur_c = cur_a + FT_MulFix( org_ac, scale_ab ); + } + + point->cur_u = cur_c; + + point = point->next; + + } while ( point != next ); + } + + /* keep going until all points in the contours have been processed */ + first = next; + + } while ( first != start ); + + Next_Contour: + ; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HIGH-LEVEL INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_Error + ps_hints_apply( PS_Hints ps_hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ) + { + PSH_GlyphRec glyphrec; + PSH_Glyph glyph = &glyphrec; + FT_Error error; +#ifdef DEBUG_HINTER + FT_Memory memory; +#endif + FT_Int dimension; + + + /* something to do? */ + if ( outline->n_points == 0 || outline->n_contours == 0 ) + return PSH_Err_Ok; + +#ifdef DEBUG_HINTER + + memory = globals->memory; + + if ( ps_debug_glyph ) + { + psh_glyph_done( ps_debug_glyph ); + FT_FREE( ps_debug_glyph ); + } + + if ( FT_NEW( glyph ) ) + return error; + + ps_debug_glyph = glyph; + +#endif /* DEBUG_HINTER */ + + error = psh_glyph_init( glyph, outline, ps_hints, globals ); + if ( error ) + goto Exit; + + /* try to optimize the y_scale so that the top of non-capital letters + * is aligned on a pixel boundary whenever possible + */ + { + PSH_Dimension dim_x = &glyph->globals->dimension[0]; + PSH_Dimension dim_y = &glyph->globals->dimension[1]; + + FT_Fixed x_scale = dim_x->scale_mult; + FT_Fixed y_scale = dim_y->scale_mult; + + FT_Fixed old_x_scale = x_scale; + FT_Fixed old_y_scale = y_scale; + + FT_Fixed scaled; + FT_Fixed fitted; + + FT_Bool rescale = FALSE; + + + scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale ); + fitted = FT_PIX_ROUND( scaled ); + + if ( fitted != 0 && scaled != fitted ) + { + rescale = TRUE; + + y_scale = FT_MulDiv( y_scale, fitted, scaled ); + + if ( fitted < scaled ) + x_scale -= x_scale / 50; + + psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 ); + } + + glyph->do_horz_hints = 1; + glyph->do_vert_hints = 1; + + glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || + hint_mode == FT_RENDER_MODE_LCD ); + + glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || + hint_mode == FT_RENDER_MODE_LCD_V ); + + glyph->do_stem_adjust = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT ); + + for ( dimension = 0; dimension < 2; dimension++ ) + { + /* load outline coordinates into glyph */ + psh_glyph_load_points( glyph, dimension ); + + /* compute local extrema */ + psh_glyph_compute_extrema( glyph ); + + /* compute aligned stem/hints positions */ + psh_hint_table_align_hints( &glyph->hint_tables[dimension], + glyph->globals, + dimension, + glyph ); + + /* find strong points, align them, then interpolate others */ + psh_glyph_find_strong_points( glyph, dimension ); + if ( dimension == 1 ) + psh_glyph_find_blue_points( &globals->blues, glyph ); + psh_glyph_interpolate_strong_points( glyph, dimension ); + psh_glyph_interpolate_normal_points( glyph, dimension ); + psh_glyph_interpolate_other_points( glyph, dimension ); + + /* save hinted coordinates back to outline */ + psh_glyph_save_points( glyph, dimension ); + + if ( rescale ) + psh_globals_set_scale( glyph->globals, + old_x_scale, old_y_scale, 0, 0 ); + } + } + + Exit: + +#ifndef DEBUG_HINTER + psh_glyph_done( glyph ); +#endif + + return error; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshalgo.h b/android/jni/ndk_modules/freetype/src/pshinter/pshalgo.h new file mode 100644 index 00000000..1a248a70 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/pshinter/pshalgo.h @@ -0,0 +1,255 @@ +/***************************************************************************/ +/* */ +/* pshalgo.h */ +/* */ +/* PostScript hinting algorithm (specification). */ +/* */ +/* Copyright 2001, 2002, 2003, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHALGO_H__ +#define __PSHALGO_H__ + + +#include "pshrec.h" +#include "pshglob.h" +#include FT_TRIGONOMETRY_H + + +FT_BEGIN_HEADER + + + /* handle to Hint structure */ + typedef struct PSH_HintRec_* PSH_Hint; + + /* hint bit-flags */ + typedef enum PSH_Hint_Flags_ + { + PSH_HINT_GHOST = PS_HINT_FLAG_GHOST, + PSH_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM, + PSH_HINT_ACTIVE = 4, + PSH_HINT_FITTED = 8 + + } PSH_Hint_Flags; + + +#define psh_hint_is_active( x ) ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 ) +#define psh_hint_is_ghost( x ) ( ( (x)->flags & PSH_HINT_GHOST ) != 0 ) +#define psh_hint_is_fitted( x ) ( ( (x)->flags & PSH_HINT_FITTED ) != 0 ) + +#define psh_hint_activate( x ) (x)->flags |= PSH_HINT_ACTIVE +#define psh_hint_deactivate( x ) (x)->flags &= ~PSH_HINT_ACTIVE +#define psh_hint_set_fitted( x ) (x)->flags |= PSH_HINT_FITTED + + /* hint structure */ + typedef struct PSH_HintRec_ + { + FT_Int org_pos; + FT_Int org_len; + FT_Pos cur_pos; + FT_Pos cur_len; + FT_UInt flags; + PSH_Hint parent; + FT_Int order; + + } PSH_HintRec; + + + /* this is an interpolation zone used for strong points; */ + /* weak points are interpolated according to their strong */ + /* neighbours */ + typedef struct PSH_ZoneRec_ + { + FT_Fixed scale; + FT_Fixed delta; + FT_Pos min; + FT_Pos max; + + } PSH_ZoneRec, *PSH_Zone; + + + typedef struct PSH_Hint_TableRec_ + { + FT_UInt max_hints; + FT_UInt num_hints; + PSH_Hint hints; + PSH_Hint* sort; + PSH_Hint* sort_global; + FT_UInt num_zones; + PSH_ZoneRec* zones; + PSH_Zone zone; + PS_Mask_Table hint_masks; + PS_Mask_Table counter_masks; + + } PSH_Hint_TableRec, *PSH_Hint_Table; + + + typedef struct PSH_PointRec_* PSH_Point; + typedef struct PSH_ContourRec_* PSH_Contour; + + enum + { + PSH_DIR_NONE = 4, + PSH_DIR_UP = -1, + PSH_DIR_DOWN = 1, + PSH_DIR_LEFT = -2, + PSH_DIR_RIGHT = 2 + }; + +#define PSH_DIR_HORIZONTAL 2 +#define PSH_DIR_VERTICAL 1 + +#define PSH_DIR_COMPARE( d1, d2 ) ( (d1) == (d2) || (d1) == -(d2) ) +#define PSH_DIR_IS_HORIZONTAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL ) +#define PSH_DIR_IS_VERTICAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL ) + + + /* the following bit-flags are computed once by the glyph */ + /* analyzer, for both dimensions */ + enum + { + PSH_POINT_OFF = 1, /* point is off the curve */ + PSH_POINT_SMOOTH = 2, /* point is smooth */ + PSH_POINT_INFLEX = 4 /* point is inflection */ + }; + +#define psh_point_is_smooth( p ) ( (p)->flags & PSH_POINT_SMOOTH ) +#define psh_point_is_off( p ) ( (p)->flags & PSH_POINT_OFF ) +#define psh_point_is_inflex( p ) ( (p)->flags & PSH_POINT_INFLEX ) + +#define psh_point_set_smooth( p ) (p)->flags |= PSH_POINT_SMOOTH +#define psh_point_set_off( p ) (p)->flags |= PSH_POINT_OFF +#define psh_point_set_inflex( p ) (p)->flags |= PSH_POINT_INFLEX + + /* the following bit-flags are re-computed for each dimension */ + enum + { + PSH_POINT_STRONG = 16, /* point is strong */ + PSH_POINT_FITTED = 32, /* point is already fitted */ + PSH_POINT_EXTREMUM = 64, /* point is local extremum */ + PSH_POINT_POSITIVE = 128, /* extremum has positive contour flow */ + PSH_POINT_NEGATIVE = 256, /* extremum has negative contour flow */ + PSH_POINT_EDGE_MIN = 512, /* point is aligned to left/bottom stem edge */ + PSH_POINT_EDGE_MAX = 1024 /* point is aligned to top/right stem edge */ + }; + +#define psh_point_is_strong( p ) ( (p)->flags2 & PSH_POINT_STRONG ) +#define psh_point_is_fitted( p ) ( (p)->flags2 & PSH_POINT_FITTED ) +#define psh_point_is_extremum( p ) ( (p)->flags2 & PSH_POINT_EXTREMUM ) +#define psh_point_is_positive( p ) ( (p)->flags2 & PSH_POINT_POSITIVE ) +#define psh_point_is_negative( p ) ( (p)->flags2 & PSH_POINT_NEGATIVE ) +#define psh_point_is_edge_min( p ) ( (p)->flags2 & PSH_POINT_EDGE_MIN ) +#define psh_point_is_edge_max( p ) ( (p)->flags2 & PSH_POINT_EDGE_MAX ) + +#define psh_point_set_strong( p ) (p)->flags2 |= PSH_POINT_STRONG +#define psh_point_set_fitted( p ) (p)->flags2 |= PSH_POINT_FITTED +#define psh_point_set_extremum( p ) (p)->flags2 |= PSH_POINT_EXTREMUM +#define psh_point_set_positive( p ) (p)->flags2 |= PSH_POINT_POSITIVE +#define psh_point_set_negative( p ) (p)->flags2 |= PSH_POINT_NEGATIVE +#define psh_point_set_edge_min( p ) (p)->flags2 |= PSH_POINT_EDGE_MIN +#define psh_point_set_edge_max( p ) (p)->flags2 |= PSH_POINT_EDGE_MAX + + + typedef struct PSH_PointRec_ + { + PSH_Point prev; + PSH_Point next; + PSH_Contour contour; + FT_UInt flags; + FT_UInt flags2; + FT_Char dir_in; + FT_Char dir_out; + FT_Angle angle_in; + FT_Angle angle_out; + PSH_Hint hint; + FT_Pos org_u; + FT_Pos org_v; + FT_Pos cur_u; +#ifdef DEBUG_HINTER + FT_Pos org_x; + FT_Pos cur_x; + FT_Pos org_y; + FT_Pos cur_y; + FT_UInt flags_x; + FT_UInt flags_y; +#endif + + } PSH_PointRec; + + +#define PSH_POINT_EQUAL_ORG( a, b ) ( (a)->org_u == (b)->org_u && \ + (a)->org_v == (b)->org_v ) + +#define PSH_POINT_ANGLE( a, b ) FT_Atan2( (b)->org_u - (a)->org_u, \ + (b)->org_v - (a)->org_v ) + + typedef struct PSH_ContourRec_ + { + PSH_Point start; + FT_UInt count; + + } PSH_ContourRec; + + + typedef struct PSH_GlyphRec_ + { + FT_UInt num_points; + FT_UInt num_contours; + + PSH_Point points; + PSH_Contour contours; + + FT_Memory memory; + FT_Outline* outline; + PSH_Globals globals; + PSH_Hint_TableRec hint_tables[2]; + + FT_Bool vertical; + FT_Int major_dir; + FT_Int minor_dir; + + FT_Bool do_horz_hints; + FT_Bool do_vert_hints; + FT_Bool do_horz_snapping; + FT_Bool do_vert_snapping; + FT_Bool do_stem_adjust; + + } PSH_GlyphRec, *PSH_Glyph; + + +#ifdef DEBUG_HINTER + extern PSH_Hint_Table ps_debug_hint_table; + + typedef void + (*PSH_HintFunc)( PSH_Hint hint, + FT_Bool vertical ); + + extern PSH_HintFunc ps_debug_hint_func; + + extern PSH_Glyph ps_debug_glyph; +#endif + + + extern FT_Error + ps_hints_apply( PS_Hints ps_hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + +FT_END_HEADER + + +#endif /* __PSHALGO_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshglob.c b/android/jni/ndk_modules/freetype/src/pshinter/pshglob.c new file mode 100644 index 00000000..31231ad0 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/pshinter/pshglob.c @@ -0,0 +1,750 @@ +/***************************************************************************/ +/* */ +/* pshglob.c */ +/* */ +/* PostScript hinter global hinting management (body). */ +/* Inspired by the new auto-hinter module. */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2006, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "pshglob.h" + +#ifdef DEBUG_HINTER + PSH_Globals ps_debug_globals = 0; +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STANDARD WIDTHS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* scale the widths/heights table */ + static void + psh_globals_scale_widths( PSH_Globals globals, + FT_UInt direction ) + { + PSH_Dimension dim = &globals->dimension[direction]; + PSH_Widths stdw = &dim->stdw; + FT_UInt count = stdw->count; + PSH_Width width = stdw->widths; + PSH_Width stand = width; /* standard width/height */ + FT_Fixed scale = dim->scale_mult; + + + if ( count > 0 ) + { + width->cur = FT_MulFix( width->org, scale ); + width->fit = FT_PIX_ROUND( width->cur ); + + width++; + count--; + + for ( ; count > 0; count--, width++ ) + { + FT_Pos w, dist; + + + w = FT_MulFix( width->org, scale ); + dist = w - stand->cur; + + if ( dist < 0 ) + dist = -dist; + + if ( dist < 128 ) + w = stand->cur; + + width->cur = w; + width->fit = FT_PIX_ROUND( w ); + } + } + } + + +#if 0 + + /* org_width is is font units, result in device pixels, 26.6 format */ + FT_LOCAL_DEF( FT_Pos ) + psh_dimension_snap_width( PSH_Dimension dimension, + FT_Int org_width ) + { + FT_UInt n; + FT_Pos width = FT_MulFix( org_width, dimension->scale_mult ); + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + + + for ( n = 0; n < dimension->stdw.count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = dimension->stdw.widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + if ( width >= reference ) + { + width -= 0x21; + if ( width < reference ) + width = reference; + } + else + { + width += 0x21; + if ( width > reference ) + width = reference; + } + + return width; + } + +#endif /* 0 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BLUE ZONES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + psh_blues_set_zones_0( PSH_Blues target, + FT_Bool is_others, + FT_UInt read_count, + FT_Short* read, + PSH_Blue_Table top_table, + PSH_Blue_Table bot_table ) + { + FT_UInt count_top = top_table->count; + FT_UInt count_bot = bot_table->count; + FT_Bool first = 1; + + FT_UNUSED( target ); + + + for ( ; read_count > 1; read_count -= 2 ) + { + FT_Int reference, delta; + FT_UInt count; + PSH_Blue_Zone zones, zone; + FT_Bool top; + + + /* read blue zone entry, and select target top/bottom zone */ + top = 0; + if ( first || is_others ) + { + reference = read[1]; + delta = read[0] - reference; + + zones = bot_table->zones; + count = count_bot; + first = 0; + } + else + { + reference = read[0]; + delta = read[1] - reference; + + zones = top_table->zones; + count = count_top; + top = 1; + } + + /* insert into sorted table */ + zone = zones; + for ( ; count > 0; count--, zone++ ) + { + if ( reference < zone->org_ref ) + break; + + if ( reference == zone->org_ref ) + { + FT_Int delta0 = zone->org_delta; + + + /* we have two zones on the same reference position -- */ + /* only keep the largest one */ + if ( delta < 0 ) + { + if ( delta < delta0 ) + zone->org_delta = delta; + } + else + { + if ( delta > delta0 ) + zone->org_delta = delta; + } + goto Skip; + } + } + + for ( ; count > 0; count-- ) + zone[count] = zone[count-1]; + + zone->org_ref = reference; + zone->org_delta = delta; + + if ( top ) + count_top++; + else + count_bot++; + + Skip: + read += 2; + } + + top_table->count = count_top; + bot_table->count = count_bot; + } + + + /* Re-read blue zones from the original fonts and store them into out */ + /* private structure. This function re-orders, sanitizes and */ + /* fuzz-expands the zones as well. */ + static void + psh_blues_set_zones( PSH_Blues target, + FT_UInt count, + FT_Short* blues, + FT_UInt count_others, + FT_Short* other_blues, + FT_Int fuzz, + FT_Int family ) + { + PSH_Blue_Table top_table, bot_table; + FT_Int count_top, count_bot; + + + if ( family ) + { + top_table = &target->family_top; + bot_table = &target->family_bottom; + } + else + { + top_table = &target->normal_top; + bot_table = &target->normal_bottom; + } + + /* read the input blue zones, and build two sorted tables */ + /* (one for the top zones, the other for the bottom zones) */ + top_table->count = 0; + bot_table->count = 0; + + /* first, the blues */ + psh_blues_set_zones_0( target, 0, + count, blues, top_table, bot_table ); + psh_blues_set_zones_0( target, 1, + count_others, other_blues, top_table, bot_table ); + + count_top = top_table->count; + count_bot = bot_table->count; + + /* sanitize top table */ + if ( count_top > 0 ) + { + PSH_Blue_Zone zone = top_table->zones; + + + for ( count = count_top; count > 0; count--, zone++ ) + { + FT_Int delta; + + + if ( count > 1 ) + { + delta = zone[1].org_ref - zone[0].org_ref; + if ( zone->org_delta > delta ) + zone->org_delta = delta; + } + + zone->org_bottom = zone->org_ref; + zone->org_top = zone->org_delta + zone->org_ref; + } + } + + /* sanitize bottom table */ + if ( count_bot > 0 ) + { + PSH_Blue_Zone zone = bot_table->zones; + + + for ( count = count_bot; count > 0; count--, zone++ ) + { + FT_Int delta; + + + if ( count > 1 ) + { + delta = zone[0].org_ref - zone[1].org_ref; + if ( zone->org_delta < delta ) + zone->org_delta = delta; + } + + zone->org_top = zone->org_ref; + zone->org_bottom = zone->org_delta + zone->org_ref; + } + } + + /* expand top and bottom tables with blue fuzz */ + { + FT_Int dim, top, bot, delta; + PSH_Blue_Zone zone; + + + zone = top_table->zones; + count = count_top; + + for ( dim = 1; dim >= 0; dim-- ) + { + if ( count > 0 ) + { + /* expand the bottom of the lowest zone normally */ + zone->org_bottom -= fuzz; + + /* expand the top and bottom of intermediate zones; */ + /* checking that the interval is smaller than the fuzz */ + top = zone->org_top; + + for ( count--; count > 0; count-- ) + { + bot = zone[1].org_bottom; + delta = bot - top; + + if ( delta < 2 * fuzz ) + zone[0].org_top = zone[1].org_bottom = top + delta / 2; + else + { + zone[0].org_top = top + fuzz; + zone[1].org_bottom = bot - fuzz; + } + + zone++; + top = zone->org_top; + } + + /* expand the top of the highest zone normally */ + zone->org_top = top + fuzz; + } + zone = bot_table->zones; + count = count_bot; + } + } + } + + + /* reset the blues table when the device transform changes */ + static void + psh_blues_scale_zones( PSH_Blues blues, + FT_Fixed scale, + FT_Pos delta ) + { + FT_UInt count; + FT_UInt num; + PSH_Blue_Table table = 0; + + /* */ + /* Determine whether we need to suppress overshoots or */ + /* not. We simply need to compare the vertical scale */ + /* parameter to the raw bluescale value. Here is why: */ + /* */ + /* We need to suppress overshoots for all pointsizes. */ + /* At 300dpi that satisfies: */ + /* */ + /* pointsize < 240*bluescale + 0.49 */ + /* */ + /* This corresponds to: */ + /* */ + /* pixelsize < 1000*bluescale + 49/24 */ + /* */ + /* scale*EM_Size < 1000*bluescale + 49/24 */ + /* */ + /* However, for normal Type 1 fonts, EM_Size is 1000! */ + /* We thus only check: */ + /* */ + /* scale < bluescale + 49/24000 */ + /* */ + /* which we shorten to */ + /* */ + /* "scale < bluescale" */ + /* */ + /* Note that `blue_scale' is stored 1000 times its real */ + /* value, and that `scale' converts from font units to */ + /* fractional pixels. */ + /* */ + + /* 1000 / 64 = 125 / 8 */ + if ( scale >= 0x20C49BAL ) + blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 ); + else + blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 ); + + /* */ + /* The blue threshold is the font units distance under */ + /* which overshoots are suppressed due to the BlueShift */ + /* even if the scale is greater than BlueScale. */ + /* */ + /* It is the smallest distance such that */ + /* */ + /* dist <= BlueShift && dist*scale <= 0.5 pixels */ + /* */ + { + FT_Int threshold = blues->blue_shift; + + + while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 ) + threshold--; + + blues->blue_threshold = threshold; + } + + for ( num = 0; num < 4; num++ ) + { + PSH_Blue_Zone zone; + + + switch ( num ) + { + case 0: + table = &blues->normal_top; + break; + case 1: + table = &blues->normal_bottom; + break; + case 2: + table = &blues->family_top; + break; + default: + table = &blues->family_bottom; + break; + } + + zone = table->zones; + count = table->count; + for ( ; count > 0; count--, zone++ ) + { + zone->cur_top = FT_MulFix( zone->org_top, scale ) + delta; + zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta; + zone->cur_ref = FT_MulFix( zone->org_ref, scale ) + delta; + zone->cur_delta = FT_MulFix( zone->org_delta, scale ); + + /* round scaled reference position */ + zone->cur_ref = FT_PIX_ROUND( zone->cur_ref ); + +#if 0 + if ( zone->cur_ref > zone->cur_top ) + zone->cur_ref -= 64; + else if ( zone->cur_ref < zone->cur_bottom ) + zone->cur_ref += 64; +#endif + } + } + + /* process the families now */ + + for ( num = 0; num < 2; num++ ) + { + PSH_Blue_Zone zone1, zone2; + FT_UInt count1, count2; + PSH_Blue_Table normal, family; + + + switch ( num ) + { + case 0: + normal = &blues->normal_top; + family = &blues->family_top; + break; + + default: + normal = &blues->normal_bottom; + family = &blues->family_bottom; + } + + zone1 = normal->zones; + count1 = normal->count; + + for ( ; count1 > 0; count1--, zone1++ ) + { + /* try to find a family zone whose reference position is less */ + /* than 1 pixel far from the current zone */ + zone2 = family->zones; + count2 = family->count; + + for ( ; count2 > 0; count2--, zone2++ ) + { + FT_Pos Delta; + + + Delta = zone1->org_ref - zone2->org_ref; + if ( Delta < 0 ) + Delta = -Delta; + + if ( FT_MulFix( Delta, scale ) < 64 ) + { + zone1->cur_top = zone2->cur_top; + zone1->cur_bottom = zone2->cur_bottom; + zone1->cur_ref = zone2->cur_ref; + zone1->cur_delta = zone2->cur_delta; + break; + } + } + } + } + } + + + FT_LOCAL_DEF( void ) + psh_blues_snap_stem( PSH_Blues blues, + FT_Int stem_top, + FT_Int stem_bot, + PSH_Alignment alignment ) + { + PSH_Blue_Table table; + FT_UInt count; + FT_Pos delta; + PSH_Blue_Zone zone; + FT_Int no_shoots; + + + alignment->align = PSH_BLUE_ALIGN_NONE; + + no_shoots = blues->no_overshoots; + + /* look up stem top in top zones table */ + table = &blues->normal_top; + count = table->count; + zone = table->zones; + + for ( ; count > 0; count--, zone++ ) + { + delta = stem_top - zone->org_bottom; + if ( delta < -blues->blue_fuzz ) + break; + + if ( stem_top <= zone->org_top + blues->blue_fuzz ) + { + if ( no_shoots || delta <= blues->blue_threshold ) + { + alignment->align |= PSH_BLUE_ALIGN_TOP; + alignment->align_top = zone->cur_ref; + } + break; + } + } + + /* look up stem bottom in bottom zones table */ + table = &blues->normal_bottom; + count = table->count; + zone = table->zones + count-1; + + for ( ; count > 0; count--, zone-- ) + { + delta = zone->org_top - stem_bot; + if ( delta < -blues->blue_fuzz ) + break; + + if ( stem_bot >= zone->org_bottom - blues->blue_fuzz ) + { + if ( no_shoots || delta < blues->blue_threshold ) + { + alignment->align |= PSH_BLUE_ALIGN_BOT; + alignment->align_bot = zone->cur_ref; + } + break; + } + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLOBAL HINTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + psh_globals_destroy( PSH_Globals globals ) + { + if ( globals ) + { + FT_Memory memory; + + + memory = globals->memory; + globals->dimension[0].stdw.count = 0; + globals->dimension[1].stdw.count = 0; + + globals->blues.normal_top.count = 0; + globals->blues.normal_bottom.count = 0; + globals->blues.family_top.count = 0; + globals->blues.family_bottom.count = 0; + + FT_FREE( globals ); + +#ifdef DEBUG_HINTER + ps_debug_globals = 0; +#endif + } + } + + + static FT_Error + psh_globals_new( FT_Memory memory, + T1_Private* priv, + PSH_Globals *aglobals ) + { + PSH_Globals globals = NULL; + FT_Error error; + + + if ( !FT_NEW( globals ) ) + { + FT_UInt count; + FT_Short* read; + + + globals->memory = memory; + + /* copy standard widths */ + { + PSH_Dimension dim = &globals->dimension[1]; + PSH_Width write = dim->stdw.widths; + + + write->org = priv->standard_width[0]; + write++; + + read = priv->snap_widths; + for ( count = priv->num_snap_widths; count > 0; count-- ) + { + write->org = *read; + write++; + read++; + } + + dim->stdw.count = priv->num_snap_widths + 1; + } + + /* copy standard heights */ + { + PSH_Dimension dim = &globals->dimension[0]; + PSH_Width write = dim->stdw.widths; + + + write->org = priv->standard_height[0]; + write++; + read = priv->snap_heights; + for ( count = priv->num_snap_heights; count > 0; count-- ) + { + write->org = *read; + write++; + read++; + } + + dim->stdw.count = priv->num_snap_heights + 1; + } + + /* copy blue zones */ + psh_blues_set_zones( &globals->blues, priv->num_blue_values, + priv->blue_values, priv->num_other_blues, + priv->other_blues, priv->blue_fuzz, 0 ); + + psh_blues_set_zones( &globals->blues, priv->num_family_blues, + priv->family_blues, priv->num_family_other_blues, + priv->family_other_blues, priv->blue_fuzz, 1 ); + + globals->blues.blue_scale = priv->blue_scale; + globals->blues.blue_shift = priv->blue_shift; + globals->blues.blue_fuzz = priv->blue_fuzz; + + globals->dimension[0].scale_mult = 0; + globals->dimension[0].scale_delta = 0; + globals->dimension[1].scale_mult = 0; + globals->dimension[1].scale_delta = 0; + +#ifdef DEBUG_HINTER + ps_debug_globals = globals; +#endif + } + + *aglobals = globals; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + psh_globals_set_scale( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ) + { + PSH_Dimension dim = &globals->dimension[0]; + + + dim = &globals->dimension[0]; + if ( x_scale != dim->scale_mult || + x_delta != dim->scale_delta ) + { + dim->scale_mult = x_scale; + dim->scale_delta = x_delta; + + psh_globals_scale_widths( globals, 0 ); + } + + dim = &globals->dimension[1]; + if ( y_scale != dim->scale_mult || + y_delta != dim->scale_delta ) + { + dim->scale_mult = y_scale; + dim->scale_delta = y_delta; + + psh_globals_scale_widths( globals, 1 ); + psh_blues_scale_zones( &globals->blues, y_scale, y_delta ); + } + + return 0; + } + + + FT_LOCAL_DEF( void ) + psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ) + { + funcs->create = psh_globals_new; + funcs->set_scale = psh_globals_set_scale; + funcs->destroy = psh_globals_destroy; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshglob.h b/android/jni/ndk_modules/freetype/src/pshinter/pshglob.h new file mode 100644 index 00000000..c5116261 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/pshinter/pshglob.h @@ -0,0 +1,196 @@ +/***************************************************************************/ +/* */ +/* pshglob.h */ +/* */ +/* PostScript hinter global hinting management. */ +/* */ +/* Copyright 2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHGLOB_H__ +#define __PSHGLOB_H__ + + +#include FT_FREETYPE_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLOBAL HINTS INTERNALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* @constant: */ + /* PS_GLOBALS_MAX_BLUE_ZONES */ + /* */ + /* @description: */ + /* The maximum number of blue zones in a font global hints structure. */ + /* See @PS_Globals_BluesRec. */ + /* */ +#define PS_GLOBALS_MAX_BLUE_ZONES 16 + + + /*************************************************************************/ + /* */ + /* @constant: */ + /* PS_GLOBALS_MAX_STD_WIDTHS */ + /* */ + /* @description: */ + /* The maximum number of standard and snap widths in either the */ + /* horizontal or vertical direction. See @PS_Globals_WidthsRec. */ + /* */ +#define PS_GLOBALS_MAX_STD_WIDTHS 16 + + + /* standard and snap width */ + typedef struct PSH_WidthRec_ + { + FT_Int org; + FT_Pos cur; + FT_Pos fit; + + } PSH_WidthRec, *PSH_Width; + + + /* standard and snap widths table */ + typedef struct PSH_WidthsRec_ + { + FT_UInt count; + PSH_WidthRec widths[PS_GLOBALS_MAX_STD_WIDTHS]; + + } PSH_WidthsRec, *PSH_Widths; + + + typedef struct PSH_DimensionRec_ + { + PSH_WidthsRec stdw; + FT_Fixed scale_mult; + FT_Fixed scale_delta; + + } PSH_DimensionRec, *PSH_Dimension; + + + /* blue zone descriptor */ + typedef struct PSH_Blue_ZoneRec_ + { + FT_Int org_ref; + FT_Int org_delta; + FT_Int org_top; + FT_Int org_bottom; + + FT_Pos cur_ref; + FT_Pos cur_delta; + FT_Pos cur_bottom; + FT_Pos cur_top; + + } PSH_Blue_ZoneRec, *PSH_Blue_Zone; + + + typedef struct PSH_Blue_TableRec_ + { + FT_UInt count; + PSH_Blue_ZoneRec zones[PS_GLOBALS_MAX_BLUE_ZONES]; + + } PSH_Blue_TableRec, *PSH_Blue_Table; + + + /* blue zones table */ + typedef struct PSH_BluesRec_ + { + PSH_Blue_TableRec normal_top; + PSH_Blue_TableRec normal_bottom; + PSH_Blue_TableRec family_top; + PSH_Blue_TableRec family_bottom; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_threshold; + FT_Int blue_fuzz; + FT_Bool no_overshoots; + + } PSH_BluesRec, *PSH_Blues; + + + /* font globals. */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ + typedef struct PSH_GlobalsRec_ + { + FT_Memory memory; + PSH_DimensionRec dimension[2]; + PSH_BluesRec blues; + + } PSH_GlobalsRec; + + +#define PSH_BLUE_ALIGN_NONE 0 +#define PSH_BLUE_ALIGN_TOP 1 +#define PSH_BLUE_ALIGN_BOT 2 + + + typedef struct PSH_AlignmentRec_ + { + int align; + FT_Pos align_top; + FT_Pos align_bot; + + } PSH_AlignmentRec, *PSH_Alignment; + + + FT_LOCAL( void ) + psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ); + + +#if 0 + /* snap a stem width to fitter coordinates. `org_width' is in font */ + /* units. The result is in device pixels (26.6 format). */ + FT_LOCAL( FT_Pos ) + psh_dimension_snap_width( PSH_Dimension dimension, + FT_Int org_width ); +#endif + + FT_LOCAL( FT_Error ) + psh_globals_set_scale( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ); + + /* snap a stem to one or two blue zones */ + FT_LOCAL( void ) + psh_blues_snap_stem( PSH_Blues blues, + FT_Int stem_top, + FT_Int stem_bot, + PSH_Alignment alignment ); + /* */ + +#ifdef DEBUG_HINTER + extern PSH_Globals ps_debug_globals; +#endif + + +FT_END_HEADER + + +#endif /* __PSHGLOB_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshinter.c b/android/jni/ndk_modules/freetype/src/pshinter/pshinter.c new file mode 100644 index 00000000..b35a2a91 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/pshinter/pshinter.c @@ -0,0 +1,29 @@ +/***************************************************************************/ +/* */ +/* pshinter.c */ +/* */ +/* FreeType PostScript Hinting module */ +/* */ +/* Copyright 2001, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "pshpic.c" +#include "pshrec.c" +#include "pshglob.c" +#include "pshalgo.c" +#include "pshmod.c" + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshmod.c b/android/jni/ndk_modules/freetype/src/pshinter/pshmod.c new file mode 100644 index 00000000..91da5d7e --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/pshinter/pshmod.c @@ -0,0 +1,118 @@ +/***************************************************************************/ +/* */ +/* pshmod.c */ +/* */ +/* FreeType PostScript hinter module implementation (body). */ +/* */ +/* Copyright 2001, 2002, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include "pshrec.h" +#include "pshalgo.h" +#include "pshpic.h" + + + /* the Postscript Hinter module structure */ + typedef struct PS_Hinter_Module_Rec_ + { + FT_ModuleRec root; + PS_HintsRec ps_hints; + + PSH_Globals_FuncsRec globals_funcs; + T1_Hints_FuncsRec t1_funcs; + T2_Hints_FuncsRec t2_funcs; + + } PS_Hinter_ModuleRec, *PS_Hinter_Module; + + + /* finalize module */ + FT_CALLBACK_DEF( void ) + ps_hinter_done( PS_Hinter_Module module ) + { + module->t1_funcs.hints = NULL; + module->t2_funcs.hints = NULL; + + ps_hints_done( &module->ps_hints ); + } + + + /* initialize module, create hints recorder and the interface */ + FT_CALLBACK_DEF( FT_Error ) + ps_hinter_init( PS_Hinter_Module module ) + { + FT_Memory memory = module->root.memory; + void* ph = &module->ps_hints; + + + ps_hints_init( &module->ps_hints, memory ); + + psh_globals_funcs_init( &module->globals_funcs ); + + t1_hints_funcs_init( &module->t1_funcs ); + module->t1_funcs.hints = (T1_Hints)ph; + + t2_hints_funcs_init( &module->t2_funcs ); + module->t2_funcs.hints = (T2_Hints)ph; + + return 0; + } + + + /* returns global hints interface */ + FT_CALLBACK_DEF( PSH_Globals_Funcs ) + pshinter_get_globals_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->globals_funcs; + } + + + /* return Type 1 hints interface */ + FT_CALLBACK_DEF( T1_Hints_Funcs ) + pshinter_get_t1_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->t1_funcs; + } + + + /* return Type 2 hints interface */ + FT_CALLBACK_DEF( T2_Hints_Funcs ) + pshinter_get_t2_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->t2_funcs; + } + + + FT_DEFINE_PSHINTER_INTERFACE(pshinter_interface, + pshinter_get_globals_funcs, + pshinter_get_t1_funcs, + pshinter_get_t2_funcs + ) + + + FT_DEFINE_MODULE(pshinter_module_class, + + 0, + sizeof ( PS_Hinter_ModuleRec ), + "pshinter", + 0x10000L, + 0x20000L, + + &FTPSHINTER_INTERFACE_GET, /* module-specific interface */ + + (FT_Module_Constructor)ps_hinter_init, + (FT_Module_Destructor) ps_hinter_done, + (FT_Module_Requester) 0 /* no additional interface for now */ + ) + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshmod.h b/android/jni/ndk_modules/freetype/src/pshinter/pshmod.h new file mode 100644 index 00000000..0ae7e96f --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/pshinter/pshmod.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* pshmod.h */ +/* */ +/* PostScript hinter module interface (specification). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHMOD_H__ +#define __PSHMOD_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_MODULE( pshinter_module_class ) + + +FT_END_HEADER + + +#endif /* __PSHMOD_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshnterr.h b/android/jni/ndk_modules/freetype/src/pshinter/pshnterr.h new file mode 100644 index 00000000..3c0029fb --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/pshinter/pshnterr.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* pshnterr.h */ +/* */ +/* PS Hinter error codes (specification only). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PSHinter error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PSHNTERR_H__ +#define __PSHNTERR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PSH_Err_ +#define FT_ERR_BASE FT_Mod_Err_PShinter + +#include FT_ERRORS_H + +#endif /* __PSHNTERR_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshpic.c b/android/jni/ndk_modules/freetype/src/pshinter/pshpic.c new file mode 100644 index 00000000..5efb4229 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/pshinter/pshpic.c @@ -0,0 +1,69 @@ +/***************************************************************************/ +/* */ +/* pshpic.c */ +/* */ +/* The FreeType position independent code services for pshinter module. */ +/* */ +/* Copyright 2009, 2010 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "pshpic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from pshmod.c */ + void FT_Init_Class_pshinter_interface( FT_Library, PSHinter_Interface*); + + void + pshinter_module_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->pshinter ) + { + FT_FREE( pic_container->pshinter ); + pic_container->pshinter = NULL; + } + } + + + FT_Error + pshinter_module_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = PSH_Err_Ok; + PSHinterPIC* container; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->pshinter = container; + + /* add call to initialization function when you add new scripts */ + FT_Init_Class_pshinter_interface(library, &container->pshinter_interface); + +/*Exit:*/ + if(error) + pshinter_module_class_pic_free(library); + return error; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshpic.h b/android/jni/ndk_modules/freetype/src/pshinter/pshpic.h new file mode 100644 index 00000000..3555d8e8 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/pshinter/pshpic.h @@ -0,0 +1,53 @@ +/***************************************************************************/ +/* */ +/* pshpic.h */ +/* */ +/* The FreeType position independent code services for pshinter module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHPIC_H__ +#define __PSHPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC + +#define FTPSHINTER_INTERFACE_GET pshinter_interface + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + typedef struct PSHinterPIC_ + { + PSHinter_Interface pshinter_interface; + } PSHinterPIC; + +#define GET_PIC(lib) ((PSHinterPIC*)((lib)->pic_container.autofit)) +#define FTPSHINTER_INTERFACE_GET (GET_PIC(library)->pshinter_interface) + + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __PSHPIC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshrec.c b/android/jni/ndk_modules/freetype/src/pshinter/pshrec.c new file mode 100644 index 00000000..0910cc5e --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/pshinter/pshrec.c @@ -0,0 +1,1224 @@ +/***************************************************************************/ +/* */ +/* pshrec.c */ +/* */ +/* FreeType PostScript hints recorder (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H + +#include "pshrec.h" +#include "pshalgo.h" + +#include "pshnterr.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pshrec + +#ifdef DEBUG_HINTER + PS_Hints ps_debug_hints = 0; + int ps_debug_no_horz_hints = 0; + int ps_debug_no_vert_hints = 0; +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_HINT MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* destroy hints table */ + static void + ps_hint_table_done( PS_Hint_Table table, + FT_Memory memory ) + { + FT_FREE( table->hints ); + table->num_hints = 0; + table->max_hints = 0; + } + + + /* ensure that a table can contain "count" elements */ + static FT_Error + ps_hint_table_ensure( PS_Hint_Table table, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = table->max_hints; + FT_UInt new_max = count; + FT_Error error = PSH_Err_Ok; + + + if ( new_max > old_max ) + { + /* try to grow the table */ + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) ) + table->max_hints = new_max; + } + return error; + } + + + static FT_Error + ps_hint_table_alloc( PS_Hint_Table table, + FT_Memory memory, + PS_Hint *ahint ) + { + FT_Error error = PSH_Err_Ok; + FT_UInt count; + PS_Hint hint = 0; + + + count = table->num_hints; + count++; + + if ( count >= table->max_hints ) + { + error = ps_hint_table_ensure( table, count, memory ); + if ( error ) + goto Exit; + } + + hint = table->hints + count - 1; + hint->pos = 0; + hint->len = 0; + hint->flags = 0; + + table->num_hints = count; + + Exit: + *ahint = hint; + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_MASK MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* destroy mask */ + static void + ps_mask_done( PS_Mask mask, + FT_Memory memory ) + { + FT_FREE( mask->bytes ); + mask->num_bits = 0; + mask->max_bits = 0; + mask->end_point = 0; + } + + + /* ensure that a mask can contain "count" bits */ + static FT_Error + ps_mask_ensure( PS_Mask mask, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = ( mask->max_bits + 7 ) >> 3; + FT_UInt new_max = ( count + 7 ) >> 3; + FT_Error error = PSH_Err_Ok; + + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) ) + mask->max_bits = new_max * 8; + } + return error; + } + + + /* test a bit value in a given mask */ + static FT_Int + ps_mask_test_bit( PS_Mask mask, + FT_Int idx ) + { + if ( (FT_UInt)idx >= mask->num_bits ) + return 0; + + return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) ); + } + + + /* clear a given bit */ + static void + ps_mask_clear_bit( PS_Mask mask, + FT_Int idx ) + { + FT_Byte* p; + + + if ( (FT_UInt)idx >= mask->num_bits ) + return; + + p = mask->bytes + ( idx >> 3 ); + p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) ); + } + + + /* set a given bit, possibly grow the mask */ + static FT_Error + ps_mask_set_bit( PS_Mask mask, + FT_Int idx, + FT_Memory memory ) + { + FT_Error error = PSH_Err_Ok; + FT_Byte* p; + + + if ( idx < 0 ) + goto Exit; + + if ( (FT_UInt)idx >= mask->num_bits ) + { + error = ps_mask_ensure( mask, idx + 1, memory ); + if ( error ) + goto Exit; + + mask->num_bits = idx + 1; + } + + p = mask->bytes + ( idx >> 3 ); + p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) ); + + Exit: + return error; + } + + + /* destroy mask table */ + static void + ps_mask_table_done( PS_Mask_Table table, + FT_Memory memory ) + { + FT_UInt count = table->max_masks; + PS_Mask mask = table->masks; + + + for ( ; count > 0; count--, mask++ ) + ps_mask_done( mask, memory ); + + FT_FREE( table->masks ); + table->num_masks = 0; + table->max_masks = 0; + } + + + /* ensure that a mask table can contain "count" masks */ + static FT_Error + ps_mask_table_ensure( PS_Mask_Table table, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = table->max_masks; + FT_UInt new_max = count; + FT_Error error = PSH_Err_Ok; + + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) ) + table->max_masks = new_max; + } + return error; + } + + + /* allocate a new mask in a table */ + static FT_Error + ps_mask_table_alloc( PS_Mask_Table table, + FT_Memory memory, + PS_Mask *amask ) + { + FT_UInt count; + FT_Error error = PSH_Err_Ok; + PS_Mask mask = 0; + + + count = table->num_masks; + count++; + + if ( count > table->max_masks ) + { + error = ps_mask_table_ensure( table, count, memory ); + if ( error ) + goto Exit; + } + + mask = table->masks + count - 1; + mask->num_bits = 0; + mask->end_point = 0; + table->num_masks = count; + + Exit: + *amask = mask; + return error; + } + + + /* return last hint mask in a table, create one if the table is empty */ + static FT_Error + ps_mask_table_last( PS_Mask_Table table, + FT_Memory memory, + PS_Mask *amask ) + { + FT_Error error = PSH_Err_Ok; + FT_UInt count; + PS_Mask mask; + + + count = table->num_masks; + if ( count == 0 ) + { + error = ps_mask_table_alloc( table, memory, &mask ); + if ( error ) + goto Exit; + } + else + mask = table->masks + count - 1; + + Exit: + *amask = mask; + return error; + } + + + /* set a new mask to a given bit range */ + static FT_Error + ps_mask_table_set_bits( PS_Mask_Table table, + const FT_Byte* source, + FT_UInt bit_pos, + FT_UInt bit_count, + FT_Memory memory ) + { + FT_Error error = PSH_Err_Ok; + PS_Mask mask; + + + error = ps_mask_table_last( table, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_ensure( mask, bit_count, memory ); + if ( error ) + goto Exit; + + mask->num_bits = bit_count; + + /* now, copy bits */ + { + FT_Byte* read = (FT_Byte*)source + ( bit_pos >> 3 ); + FT_Int rmask = 0x80 >> ( bit_pos & 7 ); + FT_Byte* write = mask->bytes; + FT_Int wmask = 0x80; + FT_Int val; + + + for ( ; bit_count > 0; bit_count-- ) + { + val = write[0] & ~wmask; + + if ( read[0] & rmask ) + val |= wmask; + + write[0] = (FT_Byte)val; + + rmask >>= 1; + if ( rmask == 0 ) + { + read++; + rmask = 0x80; + } + + wmask >>= 1; + if ( wmask == 0 ) + { + write++; + wmask = 0x80; + } + } + } + + Exit: + return error; + } + + + /* test whether two masks in a table intersect */ + static FT_Int + ps_mask_table_test_intersect( PS_Mask_Table table, + FT_Int index1, + FT_Int index2 ) + { + PS_Mask mask1 = table->masks + index1; + PS_Mask mask2 = table->masks + index2; + FT_Byte* p1 = mask1->bytes; + FT_Byte* p2 = mask2->bytes; + FT_UInt count1 = mask1->num_bits; + FT_UInt count2 = mask2->num_bits; + FT_UInt count; + + + count = ( count1 <= count2 ) ? count1 : count2; + for ( ; count >= 8; count -= 8 ) + { + if ( p1[0] & p2[0] ) + return 1; + + p1++; + p2++; + } + + if ( count == 0 ) + return 0; + + return ( p1[0] & p2[0] ) & ~( 0xFF >> count ); + } + + + /* merge two masks, used by ps_mask_table_merge_all */ + static FT_Error + ps_mask_table_merge( PS_Mask_Table table, + FT_Int index1, + FT_Int index2, + FT_Memory memory ) + { + FT_UInt temp; + FT_Error error = PSH_Err_Ok; + + + /* swap index1 and index2 so that index1 < index2 */ + if ( index1 > index2 ) + { + temp = index1; + index1 = index2; + index2 = temp; + } + + if ( index1 < index2 && index1 >= 0 && index2 < (FT_Int)table->num_masks ) + { + /* we need to merge the bitsets of index1 and index2 with a */ + /* simple union */ + PS_Mask mask1 = table->masks + index1; + PS_Mask mask2 = table->masks + index2; + FT_UInt count1 = mask1->num_bits; + FT_UInt count2 = mask2->num_bits; + FT_Int delta; + + + if ( count2 > 0 ) + { + FT_UInt pos; + FT_Byte* read; + FT_Byte* write; + + + /* if "count2" is greater than "count1", we need to grow the */ + /* first bitset, and clear the highest bits */ + if ( count2 > count1 ) + { + error = ps_mask_ensure( mask1, count2, memory ); + if ( error ) + goto Exit; + + for ( pos = count1; pos < count2; pos++ ) + ps_mask_clear_bit( mask1, pos ); + } + + /* merge (unite) the bitsets */ + read = mask2->bytes; + write = mask1->bytes; + pos = (FT_UInt)( ( count2 + 7 ) >> 3 ); + + for ( ; pos > 0; pos-- ) + { + write[0] = (FT_Byte)( write[0] | read[0] ); + write++; + read++; + } + } + + /* Now, remove "mask2" from the list. We need to keep the masks */ + /* sorted in order of importance, so move table elements. */ + mask2->num_bits = 0; + mask2->end_point = 0; + + delta = table->num_masks - 1 - index2; /* number of masks to move */ + if ( delta > 0 ) + { + /* move to end of table for reuse */ + PS_MaskRec dummy = *mask2; + + + ft_memmove( mask2, mask2 + 1, delta * sizeof ( PS_MaskRec ) ); + + mask2[delta] = dummy; + } + + table->num_masks--; + } + else + FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n", + index1, index2 )); + + Exit: + return error; + } + + + /* Try to merge all masks in a given table. This is used to merge */ + /* all counter masks into independent counter "paths". */ + /* */ + static FT_Error + ps_mask_table_merge_all( PS_Mask_Table table, + FT_Memory memory ) + { + FT_Int index1, index2; + FT_Error error = PSH_Err_Ok; + + + for ( index1 = table->num_masks - 1; index1 > 0; index1-- ) + { + for ( index2 = index1 - 1; index2 >= 0; index2-- ) + { + if ( ps_mask_table_test_intersect( table, index1, index2 ) ) + { + error = ps_mask_table_merge( table, index2, index1, memory ); + if ( error ) + goto Exit; + + break; + } + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_DIMENSION MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* finalize a given dimension */ + static void + ps_dimension_done( PS_Dimension dimension, + FT_Memory memory ) + { + ps_mask_table_done( &dimension->counters, memory ); + ps_mask_table_done( &dimension->masks, memory ); + ps_hint_table_done( &dimension->hints, memory ); + } + + + /* initialize a given dimension */ + static void + ps_dimension_init( PS_Dimension dimension ) + { + dimension->hints.num_hints = 0; + dimension->masks.num_masks = 0; + dimension->counters.num_masks = 0; + } + + +#if 0 + + /* set a bit at a given index in the current hint mask */ + static FT_Error + ps_dimension_set_mask_bit( PS_Dimension dim, + FT_UInt idx, + FT_Memory memory ) + { + PS_Mask mask; + FT_Error error = PSH_Err_Ok; + + + /* get last hint mask */ + error = ps_mask_table_last( &dim->masks, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( mask, idx, memory ); + + Exit: + return error; + } + +#endif + + /* set the end point in a mask, called from "End" & "Reset" methods */ + static void + ps_dimension_end_mask( PS_Dimension dim, + FT_UInt end_point ) + { + FT_UInt count = dim->masks.num_masks; + PS_Mask mask; + + + if ( count > 0 ) + { + mask = dim->masks.masks + count - 1; + mask->end_point = end_point; + } + } + + + /* set the end point in the current mask, then create a new empty one */ + /* (called by "Reset" method) */ + static FT_Error + ps_dimension_reset_mask( PS_Dimension dim, + FT_UInt end_point, + FT_Memory memory ) + { + PS_Mask mask; + + + /* end current mask */ + ps_dimension_end_mask( dim, end_point ); + + /* allocate new one */ + return ps_mask_table_alloc( &dim->masks, memory, &mask ); + } + + + /* set a new mask, called from the "T2Stem" method */ + static FT_Error + ps_dimension_set_mask_bits( PS_Dimension dim, + const FT_Byte* source, + FT_UInt source_pos, + FT_UInt source_bits, + FT_UInt end_point, + FT_Memory memory ) + { + FT_Error error = PSH_Err_Ok; + + + /* reset current mask, if any */ + error = ps_dimension_reset_mask( dim, end_point, memory ); + if ( error ) + goto Exit; + + /* set bits in new mask */ + error = ps_mask_table_set_bits( &dim->masks, source, + source_pos, source_bits, memory ); + + Exit: + return error; + } + + + /* add a new single stem (called from "T1Stem" method) */ + static FT_Error + ps_dimension_add_t1stem( PS_Dimension dim, + FT_Int pos, + FT_Int len, + FT_Memory memory, + FT_Int *aindex ) + { + FT_Error error = PSH_Err_Ok; + FT_UInt flags = 0; + + + /* detect ghost stem */ + if ( len < 0 ) + { + flags |= PS_HINT_FLAG_GHOST; + if ( len == -21 ) + { + flags |= PS_HINT_FLAG_BOTTOM; + pos += len; + } + len = 0; + } + + if ( aindex ) + *aindex = -1; + + /* now, lookup stem in the current hints table */ + { + PS_Mask mask; + FT_UInt idx; + FT_UInt max = dim->hints.num_hints; + PS_Hint hint = dim->hints.hints; + + + for ( idx = 0; idx < max; idx++, hint++ ) + { + if ( hint->pos == pos && hint->len == len ) + break; + } + + /* we need to create a new hint in the table */ + if ( idx >= max ) + { + error = ps_hint_table_alloc( &dim->hints, memory, &hint ); + if ( error ) + goto Exit; + + hint->pos = pos; + hint->len = len; + hint->flags = flags; + } + + /* now, store the hint in the current mask */ + error = ps_mask_table_last( &dim->masks, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( mask, idx, memory ); + if ( error ) + goto Exit; + + if ( aindex ) + *aindex = (FT_Int)idx; + } + + Exit: + return error; + } + + + /* add a "hstem3/vstem3" counter to our dimension table */ + static FT_Error + ps_dimension_add_counter( PS_Dimension dim, + FT_Int hint1, + FT_Int hint2, + FT_Int hint3, + FT_Memory memory ) + { + FT_Error error = PSH_Err_Ok; + FT_UInt count = dim->counters.num_masks; + PS_Mask counter = dim->counters.masks; + + + /* try to find an existing counter mask that already uses */ + /* one of these stems here */ + for ( ; count > 0; count--, counter++ ) + { + if ( ps_mask_test_bit( counter, hint1 ) || + ps_mask_test_bit( counter, hint2 ) || + ps_mask_test_bit( counter, hint3 ) ) + break; + } + + /* create a new counter when needed */ + if ( count == 0 ) + { + error = ps_mask_table_alloc( &dim->counters, memory, &counter ); + if ( error ) + goto Exit; + } + + /* now, set the bits for our hints in the counter mask */ + error = ps_mask_set_bit( counter, hint1, memory ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( counter, hint2, memory ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( counter, hint3, memory ); + if ( error ) + goto Exit; + + Exit: + return error; + } + + + /* end of recording session for a given dimension */ + static FT_Error + ps_dimension_end( PS_Dimension dim, + FT_UInt end_point, + FT_Memory memory ) + { + /* end hint mask table */ + ps_dimension_end_mask( dim, end_point ); + + /* merge all counter masks into independent "paths" */ + return ps_mask_table_merge_all( &dim->counters, memory ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_RECORDER MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* destroy hints */ + FT_LOCAL( void ) + ps_hints_done( PS_Hints hints ) + { + FT_Memory memory = hints->memory; + + + ps_dimension_done( &hints->dimension[0], memory ); + ps_dimension_done( &hints->dimension[1], memory ); + + hints->error = PSH_Err_Ok; + hints->memory = 0; + } + + + FT_LOCAL( FT_Error ) + ps_hints_init( PS_Hints hints, + FT_Memory memory ) + { + FT_MEM_ZERO( hints, sizeof ( *hints ) ); + hints->memory = memory; + return PSH_Err_Ok; + } + + + /* initialize a hints for a new session */ + static void + ps_hints_open( PS_Hints hints, + PS_Hint_Type hint_type ) + { + switch ( hint_type ) + { + case PS_HINT_TYPE_1: + case PS_HINT_TYPE_2: + hints->error = PSH_Err_Ok; + hints->hint_type = hint_type; + + ps_dimension_init( &hints->dimension[0] ); + ps_dimension_init( &hints->dimension[1] ); + break; + + default: + hints->error = PSH_Err_Invalid_Argument; + hints->hint_type = hint_type; + + FT_TRACE0(( "ps_hints_open: invalid charstring type\n" )); + break; + } + } + + + /* add one or more stems to the current hints table */ + static void + ps_hints_stem( PS_Hints hints, + FT_Int dimension, + FT_UInt count, + FT_Long* stems ) + { + if ( !hints->error ) + { + /* limit "dimension" to 0..1 */ + if ( dimension < 0 || dimension > 1 ) + { + FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n", + dimension )); + dimension = ( dimension != 0 ); + } + + /* record the stems in the current hints/masks table */ + switch ( hints->hint_type ) + { + case PS_HINT_TYPE_1: /* Type 1 "hstem" or "vstem" operator */ + case PS_HINT_TYPE_2: /* Type 2 "hstem" or "vstem" operator */ + { + PS_Dimension dim = &hints->dimension[dimension]; + + + for ( ; count > 0; count--, stems += 2 ) + { + FT_Error error; + FT_Memory memory = hints->memory; + + + error = ps_dimension_add_t1stem( + dim, (FT_Int)stems[0], (FT_Int)stems[1], + memory, NULL ); + if ( error ) + { + FT_ERROR(( "ps_hints_stem: could not add stem" + " (%d,%d) to hints table\n", stems[0], stems[1] )); + + hints->error = error; + return; + } + } + break; + } + + default: + FT_TRACE0(( "ps_hints_stem: called with invalid hint type (%d)\n", + hints->hint_type )); + break; + } + } + } + + + /* add one Type1 counter stem to the current hints table */ + static void + ps_hints_t1stem3( PS_Hints hints, + FT_Int dimension, + FT_Fixed* stems ) + { + FT_Error error = PSH_Err_Ok; + + + if ( !hints->error ) + { + PS_Dimension dim; + FT_Memory memory = hints->memory; + FT_Int count; + FT_Int idx[3]; + + + /* limit "dimension" to 0..1 */ + if ( dimension < 0 || dimension > 1 ) + { + FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n", + dimension )); + dimension = ( dimension != 0 ); + } + + dim = &hints->dimension[dimension]; + + /* there must be 6 elements in the 'stem' array */ + if ( hints->hint_type == PS_HINT_TYPE_1 ) + { + /* add the three stems to our hints/masks table */ + for ( count = 0; count < 3; count++, stems += 2 ) + { + error = ps_dimension_add_t1stem( dim, + (FT_Int)FIXED_TO_INT( stems[0] ), + (FT_Int)FIXED_TO_INT( stems[1] ), + memory, &idx[count] ); + if ( error ) + goto Fail; + } + + /* now, add the hints to the counters table */ + error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2], + memory ); + if ( error ) + goto Fail; + } + else + { + FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type\n" )); + error = PSH_Err_Invalid_Argument; + goto Fail; + } + } + + return; + + Fail: + FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" )); + hints->error = error; + } + + + /* reset hints (only with Type 1 hints) */ + static void + ps_hints_t1reset( PS_Hints hints, + FT_UInt end_point ) + { + FT_Error error = PSH_Err_Ok; + + + if ( !hints->error ) + { + FT_Memory memory = hints->memory; + + + if ( hints->hint_type == PS_HINT_TYPE_1 ) + { + error = ps_dimension_reset_mask( &hints->dimension[0], + end_point, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_reset_mask( &hints->dimension[1], + end_point, memory ); + if ( error ) + goto Fail; + } + else + { + /* invalid hint type */ + error = PSH_Err_Invalid_Argument; + goto Fail; + } + } + return; + + Fail: + hints->error = error; + } + + + /* Type2 "hintmask" operator, add a new hintmask to each direction */ + static void + ps_hints_t2mask( PS_Hints hints, + FT_UInt end_point, + FT_UInt bit_count, + const FT_Byte* bytes ) + { + FT_Error error; + + + if ( !hints->error ) + { + PS_Dimension dim = hints->dimension; + FT_Memory memory = hints->memory; + FT_UInt count1 = dim[0].hints.num_hints; + FT_UInt count2 = dim[1].hints.num_hints; + + + /* check bit count; must be equal to current total hint count */ + if ( bit_count != count1 + count2 ) + { + FT_TRACE0(( "ps_hints_t2mask:" + " called with invalid bitcount %d (instead of %d)\n", + bit_count, count1 + count2 )); + + /* simply ignore the operator */ + return; + } + + /* set-up new horizontal and vertical hint mask now */ + error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1, + end_point, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2, + end_point, memory ); + if ( error ) + goto Fail; + } + return; + + Fail: + hints->error = error; + } + + + static void + ps_hints_t2counter( PS_Hints hints, + FT_UInt bit_count, + const FT_Byte* bytes ) + { + FT_Error error; + + + if ( !hints->error ) + { + PS_Dimension dim = hints->dimension; + FT_Memory memory = hints->memory; + FT_UInt count1 = dim[0].hints.num_hints; + FT_UInt count2 = dim[1].hints.num_hints; + + + /* check bit count, must be equal to current total hint count */ + if ( bit_count != count1 + count2 ) + { + FT_TRACE0(( "ps_hints_t2counter:" + " called with invalid bitcount %d (instead of %d)\n", + bit_count, count1 + count2 )); + + /* simply ignore the operator */ + return; + } + + /* set-up new horizontal and vertical hint mask now */ + error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1, + 0, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2, + 0, memory ); + if ( error ) + goto Fail; + } + return; + + Fail: + hints->error = error; + } + + + /* end recording session */ + static FT_Error + ps_hints_close( PS_Hints hints, + FT_UInt end_point ) + { + FT_Error error; + + + error = hints->error; + if ( !error ) + { + FT_Memory memory = hints->memory; + PS_Dimension dim = hints->dimension; + + + error = ps_dimension_end( &dim[0], end_point, memory ); + if ( !error ) + { + error = ps_dimension_end( &dim[1], end_point, memory ); + } + } + +#ifdef DEBUG_HINTER + if ( !error ) + ps_debug_hints = hints; +#endif + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 1 HINTS RECORDING INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t1_hints_open( T1_Hints hints ) + { + ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 ); + } + + static void + t1_hints_stem( T1_Hints hints, + FT_Int dimension, + FT_Fixed* coords ) + { + FT_Pos stems[2]; + + + stems[0] = FIXED_TO_INT( coords[0] ); + stems[1] = FIXED_TO_INT( coords[1] ); + + ps_hints_stem( (PS_Hints)hints, dimension, 1, stems ); + } + + + FT_LOCAL_DEF( void ) + t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ) + { + FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) ); + + funcs->open = (T1_Hints_OpenFunc) t1_hints_open; + funcs->close = (T1_Hints_CloseFunc) ps_hints_close; + funcs->stem = (T1_Hints_SetStemFunc) t1_hints_stem; + funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3; + funcs->reset = (T1_Hints_ResetFunc) ps_hints_t1reset; + funcs->apply = (T1_Hints_ApplyFunc) ps_hints_apply; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 2 HINTS RECORDING INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t2_hints_open( T2_Hints hints ) + { + ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 ); + } + + + static void + t2_hints_stems( T2_Hints hints, + FT_Int dimension, + FT_Int count, + FT_Fixed* coords ) + { + FT_Pos stems[32], y, n; + FT_Int total = count; + + + y = 0; + while ( total > 0 ) + { + /* determine number of stems to write */ + count = total; + if ( count > 16 ) + count = 16; + + /* compute integer stem positions in font units */ + for ( n = 0; n < count * 2; n++ ) + { + y += coords[n]; + stems[n] = FIXED_TO_INT( y ); + } + + /* compute lengths */ + for ( n = 0; n < count * 2; n += 2 ) + stems[n + 1] = stems[n + 1] - stems[n]; + + /* add them to the current dimension */ + ps_hints_stem( (PS_Hints)hints, dimension, count, stems ); + + total -= count; + } + } + + + FT_LOCAL_DEF( void ) + t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ) + { + FT_MEM_ZERO( funcs, sizeof ( *funcs ) ); + + funcs->open = (T2_Hints_OpenFunc) t2_hints_open; + funcs->close = (T2_Hints_CloseFunc) ps_hints_close; + funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems; + funcs->hintmask= (T2_Hints_MaskFunc) ps_hints_t2mask; + funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter; + funcs->apply = (T2_Hints_ApplyFunc) ps_hints_apply; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshrec.h b/android/jni/ndk_modules/freetype/src/pshinter/pshrec.h new file mode 100644 index 00000000..dcb3197f --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/pshinter/pshrec.h @@ -0,0 +1,176 @@ +/***************************************************************************/ +/* */ +/* pshrec.h */ +/* */ +/* Postscript (Type1/Type2) hints recorder (specification). */ +/* */ +/* Copyright 2001, 2002, 2003, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /**************************************************************************/ + /* */ + /* The functions defined here are called from the Type 1, CID and CFF */ + /* font drivers to record the hints of a given character/glyph. */ + /* */ + /* The hints are recorded in a unified format, and are later processed */ + /* by the `optimizer' and `fitter' to adjust the outlines to the pixel */ + /* grid. */ + /* */ + /**************************************************************************/ + + +#ifndef __PSHREC_H__ +#define __PSHREC_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include "pshglob.h" + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH HINTS RECORDER INTERNALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to hint record */ + typedef struct PS_HintRec_* PS_Hint; + + /* hint types */ + typedef enum PS_Hint_Type_ + { + PS_HINT_TYPE_1 = 1, + PS_HINT_TYPE_2 = 2 + + } PS_Hint_Type; + + + /* hint flags */ + typedef enum PS_Hint_Flags_ + { + PS_HINT_FLAG_GHOST = 1, + PS_HINT_FLAG_BOTTOM = 2 + + } PS_Hint_Flags; + + + /* hint descriptor */ + typedef struct PS_HintRec_ + { + FT_Int pos; + FT_Int len; + FT_UInt flags; + + } PS_HintRec; + + +#define ps_hint_is_active( x ) ( (x)->flags & PS_HINT_FLAG_ACTIVE ) +#define ps_hint_is_ghost( x ) ( (x)->flags & PS_HINT_FLAG_GHOST ) +#define ps_hint_is_bottom( x ) ( (x)->flags & PS_HINT_FLAG_BOTTOM ) + + + /* hints table descriptor */ + typedef struct PS_Hint_TableRec_ + { + FT_UInt num_hints; + FT_UInt max_hints; + PS_Hint hints; + + } PS_Hint_TableRec, *PS_Hint_Table; + + + /* hint and counter mask descriptor */ + typedef struct PS_MaskRec_ + { + FT_UInt num_bits; + FT_UInt max_bits; + FT_Byte* bytes; + FT_UInt end_point; + + } PS_MaskRec, *PS_Mask; + + + /* masks and counters table descriptor */ + typedef struct PS_Mask_TableRec_ + { + FT_UInt num_masks; + FT_UInt max_masks; + PS_Mask masks; + + } PS_Mask_TableRec, *PS_Mask_Table; + + + /* dimension-specific hints descriptor */ + typedef struct PS_DimensionRec_ + { + PS_Hint_TableRec hints; + PS_Mask_TableRec masks; + PS_Mask_TableRec counters; + + } PS_DimensionRec, *PS_Dimension; + + + /* glyph hints descriptor */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ + typedef struct PS_HintsRec_ + { + FT_Memory memory; + FT_Error error; + FT_UInt32 magic; + PS_Hint_Type hint_type; + PS_DimensionRec dimension[2]; + + } PS_HintsRec, *PS_Hints; + + /* */ + + /* initialize hints recorder */ + FT_LOCAL( FT_Error ) + ps_hints_init( PS_Hints hints, + FT_Memory memory ); + + /* finalize hints recorder */ + FT_LOCAL( void ) + ps_hints_done( PS_Hints hints ); + + /* initialize Type1 hints recorder interface */ + FT_LOCAL( void ) + t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ); + + /* initialize Type2 hints recorder interface */ + FT_LOCAL( void ) + t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ); + + +#ifdef DEBUG_HINTER + extern PS_Hints ps_debug_hints; + extern int ps_debug_no_horz_hints; + extern int ps_debug_no_vert_hints; +#endif + + /* */ + + +FT_END_HEADER + + +#endif /* __PS_HINTER_RECORD_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/psmodule.c b/android/jni/ndk_modules/freetype/src/psnames/psmodule.c new file mode 100644 index 00000000..75286969 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psnames/psmodule.c @@ -0,0 +1,597 @@ +/***************************************************************************/ +/* */ +/* psmodule.c */ +/* */ +/* PSNames module implementation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + +#include "psmodule.h" +#include "pstables.h" + +#include "psnamerr.h" +#include "pspic.h" + + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + +#define VARIANT_BIT 0x80000000UL +#define BASE_GLYPH( code ) ( (FT_UInt32)( (code) & ~VARIANT_BIT ) ) + + + /* Return the Unicode value corresponding to a given glyph. Note that */ + /* we do deal with glyph variants by detecting a non-initial dot in */ + /* the name, as in `A.swash' or `e.final'; in this case, the */ + /* VARIANT_BIT is set in the return value. */ + /* */ + static FT_UInt32 + ps_unicode_value( const char* glyph_name ) + { + /* If the name begins with `uni', then the glyph name may be a */ + /* hard-coded unicode character code. */ + if ( glyph_name[0] == 'u' && + glyph_name[1] == 'n' && + glyph_name[2] == 'i' ) + { + /* determine whether the next four characters following are */ + /* hexadecimal. */ + + /* XXX: Add code to deal with ligatures, i.e. glyph names like */ + /* `uniXXXXYYYYZZZZ'... */ + + FT_Int count; + FT_UInt32 value = 0; + const char* p = glyph_name + 3; + + + for ( count = 4; count > 0; count--, p++ ) + { + char c = *p; + unsigned int d; + + + d = (unsigned char)c - '0'; + if ( d >= 10 ) + { + d = (unsigned char)c - 'A'; + if ( d >= 6 ) + d = 16; + else + d += 10; + } + + /* Exit if a non-uppercase hexadecimal character was found */ + /* -- this also catches character codes below `0' since such */ + /* negative numbers cast to `unsigned int' are far too big. */ + if ( d >= 16 ) + break; + + value = ( value << 4 ) + d; + } + + /* there must be exactly four hex digits */ + if ( count == 0 ) + { + if ( *p == '\0' ) + return value; + if ( *p == '.' ) + return (FT_UInt32)( value | VARIANT_BIT ); + } + } + + /* If the name begins with `u', followed by four to six uppercase */ + /* hexadecimal digits, it is a hard-coded unicode character code. */ + if ( glyph_name[0] == 'u' ) + { + FT_Int count; + FT_UInt32 value = 0; + const char* p = glyph_name + 1; + + + for ( count = 6; count > 0; count--, p++ ) + { + char c = *p; + unsigned int d; + + + d = (unsigned char)c - '0'; + if ( d >= 10 ) + { + d = (unsigned char)c - 'A'; + if ( d >= 6 ) + d = 16; + else + d += 10; + } + + if ( d >= 16 ) + break; + + value = ( value << 4 ) + d; + } + + if ( count <= 2 ) + { + if ( *p == '\0' ) + return value; + if ( *p == '.' ) + return (FT_UInt32)( value | VARIANT_BIT ); + } + } + + /* Look for a non-initial dot in the glyph name in order to */ + /* find variants like `A.swash', `e.final', etc. */ + { + const char* p = glyph_name; + const char* dot = NULL; + + + for ( ; *p; p++ ) + { + if ( *p == '.' && p > glyph_name ) + { + dot = p; + break; + } + } + + /* now look up the glyph in the Adobe Glyph List */ + if ( !dot ) + return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p ); + else + return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) | + VARIANT_BIT ); + } + } + + + /* ft_qsort callback to sort the unicode map */ + FT_CALLBACK_DEF( int ) + compare_uni_maps( const void* a, + const void* b ) + { + PS_UniMap* map1 = (PS_UniMap*)a; + PS_UniMap* map2 = (PS_UniMap*)b; + FT_UInt32 unicode1 = BASE_GLYPH( map1->unicode ); + FT_UInt32 unicode2 = BASE_GLYPH( map2->unicode ); + + + /* sort base glyphs before glyph variants */ + if ( unicode1 == unicode2 ) + { + if ( map1->unicode > map2->unicode ) + return 1; + else if ( map1->unicode < map2->unicode ) + return -1; + else + return 0; + } + else + { + if ( unicode1 > unicode2 ) + return 1; + else if ( unicode1 < unicode2 ) + return -1; + else + return 0; + } + } + + + /* support for extra glyphs not handled (well) in AGL; */ + /* we add extra mappings for them if necessary */ + +#define EXTRA_GLYPH_LIST_SIZE 10 + + static const FT_UInt32 ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] = + { + /* WGL 4 */ + 0x0394, + 0x03A9, + 0x2215, + 0x00AD, + 0x02C9, + 0x03BC, + 0x2219, + 0x00A0, + /* Romanian */ + 0x021A, + 0x021B + }; + + static const char ft_extra_glyph_names[] = + { + 'D','e','l','t','a',0, + 'O','m','e','g','a',0, + 'f','r','a','c','t','i','o','n',0, + 'h','y','p','h','e','n',0, + 'm','a','c','r','o','n',0, + 'm','u',0, + 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0, + 's','p','a','c','e',0, + 'T','c','o','m','m','a','a','c','c','e','n','t',0, + 't','c','o','m','m','a','a','c','c','e','n','t',0 + }; + + static const FT_Int + ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] = + { + 0, + 6, + 12, + 21, + 28, + 35, + 38, + 53, + 59, + 72 + }; + + + static void + ps_check_extra_glyph_name( const char* gname, + FT_UInt glyph, + FT_UInt* extra_glyphs, + FT_UInt *states ) + { + FT_UInt n; + + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( ft_strcmp( ft_extra_glyph_names + + ft_extra_glyph_name_offsets[n], gname ) == 0 ) + { + if ( states[n] == 0 ) + { + /* mark this extra glyph as a candidate for the cmap */ + states[n] = 1; + extra_glyphs[n] = glyph; + } + + return; + } + } + } + + + static void + ps_check_extra_glyph_unicode( FT_UInt32 uni_char, + FT_UInt *states ) + { + FT_UInt n; + + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( uni_char == ft_extra_glyph_unicodes[n] ) + { + /* disable this extra glyph from being added to the cmap */ + states[n] = 2; + + return; + } + } + } + + + /* Build a table that maps Unicode values to glyph indices. */ + static FT_Error + ps_unicodes_init( FT_Memory memory, + PS_Unicodes table, + FT_UInt num_glyphs, + PS_GetGlyphNameFunc get_glyph_name, + PS_FreeGlyphNameFunc free_glyph_name, + FT_Pointer glyph_data ) + { + FT_Error error; + + FT_UInt extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + FT_UInt extra_glyphs[EXTRA_GLYPH_LIST_SIZE]; + + + /* we first allocate the table */ + table->num_maps = 0; + table->maps = 0; + + if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) ) + { + FT_UInt n; + FT_UInt count; + PS_UniMap* map; + FT_UInt32 uni_char; + + + map = table->maps; + + for ( n = 0; n < num_glyphs; n++ ) + { + const char* gname = get_glyph_name( glyph_data, n ); + + + if ( gname ) + { + ps_check_extra_glyph_name( gname, n, + extra_glyphs, extra_glyph_list_states ); + uni_char = ps_unicode_value( gname ); + + if ( BASE_GLYPH( uni_char ) != 0 ) + { + ps_check_extra_glyph_unicode( uni_char, + extra_glyph_list_states ); + map->unicode = uni_char; + map->glyph_index = n; + map++; + } + + if ( free_glyph_name ) + free_glyph_name( glyph_data, gname ); + } + } + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( extra_glyph_list_states[n] == 1 ) + { + /* This glyph name has an additional representation. */ + /* Add it to the cmap. */ + + map->unicode = ft_extra_glyph_unicodes[n]; + map->glyph_index = extra_glyphs[n]; + map++; + } + } + + /* now compress the table a bit */ + count = (FT_UInt)( map - table->maps ); + + if ( count == 0 ) + { + /* No unicode chars here! */ + FT_FREE( table->maps ); + if ( !error ) + error = PSnames_Err_No_Unicode_Glyph_Name; + } + else + { + /* Reallocate if the number of used entries is much smaller. */ + if ( count < num_glyphs / 2 ) + { + (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count ); + error = PSnames_Err_Ok; + } + + /* Sort the table in increasing order of unicode values, */ + /* taking care of glyph variants. */ + ft_qsort( table->maps, count, sizeof ( PS_UniMap ), + compare_uni_maps ); + } + + table->num_maps = count; + } + + return error; + } + + + static FT_UInt + ps_unicodes_char_index( PS_Unicodes table, + FT_UInt32 unicode ) + { + PS_UniMap *min, *max, *mid, *result = NULL; + + + /* Perform a binary search on the table. */ + + min = table->maps; + max = min + table->num_maps - 1; + + while ( min <= max ) + { + FT_UInt32 base_glyph; + + + mid = min + ( ( max - min ) >> 1 ); + + if ( mid->unicode == unicode ) + { + result = mid; + break; + } + + base_glyph = BASE_GLYPH( mid->unicode ); + + if ( base_glyph == unicode ) + result = mid; /* remember match but continue search for base glyph */ + + if ( min == max ) + break; + + if ( base_glyph < unicode ) + min = mid + 1; + else + max = mid - 1; + } + + if ( result ) + return result->glyph_index; + else + return 0; + } + + + static FT_UInt32 + ps_unicodes_char_next( PS_Unicodes table, + FT_UInt32 *unicode ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *unicode + 1; + + + { + FT_UInt min = 0; + FT_UInt max = table->num_maps; + FT_UInt mid; + PS_UniMap* map; + FT_UInt32 base_glyph; + + + while ( min < max ) + { + mid = min + ( ( max - min ) >> 1 ); + map = table->maps + mid; + + if ( map->unicode == char_code ) + { + result = map->glyph_index; + goto Exit; + } + + base_glyph = BASE_GLYPH( map->unicode ); + + if ( base_glyph == char_code ) + result = map->glyph_index; + + if ( base_glyph < char_code ) + min = mid + 1; + else + max = mid; + } + + if ( result ) + goto Exit; /* we have a variant glyph */ + + /* we didn't find it; check whether we have a map just above it */ + char_code = 0; + + if ( min < table->num_maps ) + { + map = table->maps + min; + result = map->glyph_index; + char_code = BASE_GLYPH( map->unicode ); + } + } + + Exit: + *unicode = char_code; + return result; + } + + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + + static const char* + ps_get_macintosh_name( FT_UInt name_index ) + { + if ( name_index >= FT_NUM_MAC_NAMES ) + name_index = 0; + + return ft_standard_glyph_names + ft_mac_names[name_index]; + } + + + static const char* + ps_get_standard_strings( FT_UInt sid ) + { + if ( sid >= FT_NUM_SID_NAMES ) + return 0; + + return ft_standard_glyph_names + ft_sid_names[sid]; + } + + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + FT_DEFINE_SERVICE_PSCMAPSREC(pscmaps_interface, + (PS_Unicode_ValueFunc) ps_unicode_value, + (PS_Unicodes_InitFunc) ps_unicodes_init, + (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, + (PS_Unicodes_CharNextFunc) ps_unicodes_char_next, + + (PS_Macintosh_NameFunc) ps_get_macintosh_name, + (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, + + t1_standard_encoding, + t1_expert_encoding + ) + +#else + + FT_DEFINE_SERVICE_PSCMAPSREC(pscmaps_interface, + 0, + 0, + 0, + 0, + + (PS_Macintosh_NameFunc) ps_get_macintosh_name, + (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, + + t1_standard_encoding, + t1_expert_encoding + ) + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + + FT_DEFINE_SERVICEDESCREC1(pscmaps_services, + FT_SERVICE_ID_POSTSCRIPT_CMAPS, &FT_PSCMAPS_INTERFACE_GET + ) + + + + + static FT_Pointer + psnames_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( FT_PSCMAPS_SERVICES_GET, service_id ); + } + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + +#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES +#define PUT_PS_NAMES_SERVICE(a) 0 +#else +#define PUT_PS_NAMES_SERVICE(a) a +#endif + + FT_DEFINE_MODULE(psnames_module_class, + + 0, /* this is not a font driver, nor a renderer */ + sizeof ( FT_ModuleRec ), + + "psnames", /* driver name */ + 0x10000L, /* driver version */ + 0x20000L, /* driver requires FreeType 2 or above */ + + PUT_PS_NAMES_SERVICE((void*)&FT_PSCMAPS_INTERFACE_GET), /* module specific interface */ + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) PUT_PS_NAMES_SERVICE(psnames_get_service) + ) + + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/psmodule.h b/android/jni/ndk_modules/freetype/src/psnames/psmodule.h new file mode 100644 index 00000000..28fa1480 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psnames/psmodule.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* psmodule.h */ +/* */ +/* High-level PSNames module interface (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSMODULE_H__ +#define __PSMODULE_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_MODULE( psnames_module_class ) + + +FT_END_HEADER + +#endif /* __PSMODULE_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/psnamerr.h b/android/jni/ndk_modules/freetype/src/psnames/psnamerr.h new file mode 100644 index 00000000..ae1541d9 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psnames/psnamerr.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* psnamerr.h */ +/* */ +/* PS names module error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PS names module error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PSNAMERR_H__ +#define __PSNAMERR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PSnames_Err_ +#define FT_ERR_BASE FT_Mod_Err_PSnames + +#include FT_ERRORS_H + +#endif /* __PSNAMERR_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/psnames.c b/android/jni/ndk_modules/freetype/src/psnames/psnames.c new file mode 100644 index 00000000..1ede225d --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psnames/psnames.c @@ -0,0 +1,26 @@ +/***************************************************************************/ +/* */ +/* psnames.c */ +/* */ +/* FreeType PSNames module component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "pspic.c" +#include "psmodule.c" + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/pspic.c b/android/jni/ndk_modules/freetype/src/psnames/pspic.c new file mode 100644 index 00000000..b9075d5a --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psnames/pspic.c @@ -0,0 +1,79 @@ +/***************************************************************************/ +/* */ +/* pspic.c */ +/* */ +/* The FreeType position independent code services for psnames module. */ +/* */ +/* Copyright 2009, 2010 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "pspic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from psmodule.c */ + FT_Error FT_Create_Class_pscmaps_services( FT_Library, FT_ServiceDescRec**); + void FT_Destroy_Class_pscmaps_services( FT_Library, FT_ServiceDescRec*); + void FT_Init_Class_pscmaps_interface( FT_Library, FT_Service_PsCMapsRec*); + + void + psnames_module_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->psnames ) + { + PSModulePIC* container = (PSModulePIC*)pic_container->psnames; + if(container->pscmaps_services) + FT_Destroy_Class_pscmaps_services(library, container->pscmaps_services); + container->pscmaps_services = NULL; + FT_FREE( container ); + pic_container->psnames = NULL; + } + } + + + FT_Error + psnames_module_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = PSnames_Err_Ok; + PSModulePIC* container; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->psnames = container; + + /* initialize pointer table - this is how the module usually expects this data */ + error = FT_Create_Class_pscmaps_services(library, &container->pscmaps_services); + if(error) + goto Exit; + FT_Init_Class_pscmaps_interface(library, &container->pscmaps_interface); + +Exit: + if(error) + psnames_module_class_pic_free(library); + return error; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/pspic.h b/android/jni/ndk_modules/freetype/src/psnames/pspic.h new file mode 100644 index 00000000..75a14fdc --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psnames/pspic.h @@ -0,0 +1,54 @@ +/***************************************************************************/ +/* */ +/* pspic.h */ +/* */ +/* The FreeType position independent code services for psnames module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSPIC_H__ +#define __PSPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC +#define FT_PSCMAPS_SERVICES_GET pscmaps_services +#define FT_PSCMAPS_INTERFACE_GET pscmaps_interface + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + typedef struct PSModulePIC_ + { + FT_ServiceDescRec* pscmaps_services; + FT_Service_PsCMapsRec pscmaps_interface; + } PSModulePIC; + +#define GET_PIC(lib) ((PSModulePIC*)((lib)->pic_container.psnames)) +#define FT_PSCMAPS_SERVICES_GET (GET_PIC(library)->pscmaps_services) +#define FT_PSCMAPS_INTERFACE_GET (GET_PIC(library)->pscmaps_interface) + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __PSPIC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/pstables.h b/android/jni/ndk_modules/freetype/src/psnames/pstables.h new file mode 100644 index 00000000..1521e9c2 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/psnames/pstables.h @@ -0,0 +1,4095 @@ +/***************************************************************************/ +/* */ +/* pstables.h */ +/* */ +/* PostScript glyph names. */ +/* */ +/* Copyright 2005, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* This file has been generated automatically -- do not edit! */ + + + static const char ft_standard_glyph_names[3696] = + { + '.','n','u','l','l', 0, + 'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0, + 'n','o','t','e','q','u','a','l', 0, + 'i','n','f','i','n','i','t','y', 0, + 'l','e','s','s','e','q','u','a','l', 0, + 'g','r','e','a','t','e','r','e','q','u','a','l', 0, + 'p','a','r','t','i','a','l','d','i','f','f', 0, + 's','u','m','m','a','t','i','o','n', 0, + 'p','r','o','d','u','c','t', 0, + 'p','i', 0, + 'i','n','t','e','g','r','a','l', 0, + 'O','m','e','g','a', 0, + 'r','a','d','i','c','a','l', 0, + 'a','p','p','r','o','x','e','q','u','a','l', 0, + 'D','e','l','t','a', 0, + 'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0, + 'l','o','z','e','n','g','e', 0, + 'a','p','p','l','e', 0, + 'f','r','a','n','c', 0, + 'G','b','r','e','v','e', 0, + 'g','b','r','e','v','e', 0, + 'I','d','o','t','a','c','c','e','n','t', 0, + 'S','c','e','d','i','l','l','a', 0, + 's','c','e','d','i','l','l','a', 0, + 'C','a','c','u','t','e', 0, + 'c','a','c','u','t','e', 0, + 'C','c','a','r','o','n', 0, + 'c','c','a','r','o','n', 0, + 'd','c','r','o','a','t', 0, + '.','n','o','t','d','e','f', 0, + 's','p','a','c','e', 0, + 'e','x','c','l','a','m', 0, + 'q','u','o','t','e','d','b','l', 0, + 'n','u','m','b','e','r','s','i','g','n', 0, + 'd','o','l','l','a','r', 0, + 'p','e','r','c','e','n','t', 0, + 'a','m','p','e','r','s','a','n','d', 0, + 'q','u','o','t','e','r','i','g','h','t', 0, + 'p','a','r','e','n','l','e','f','t', 0, + 'p','a','r','e','n','r','i','g','h','t', 0, + 'a','s','t','e','r','i','s','k', 0, + 'p','l','u','s', 0, + 'c','o','m','m','a', 0, + 'h','y','p','h','e','n', 0, + 'p','e','r','i','o','d', 0, + 's','l','a','s','h', 0, + 'z','e','r','o', 0, + 'o','n','e', 0, + 't','w','o', 0, + 't','h','r','e','e', 0, + 'f','o','u','r', 0, + 'f','i','v','e', 0, + 's','i','x', 0, + 's','e','v','e','n', 0, + 'e','i','g','h','t', 0, + 'n','i','n','e', 0, + 'c','o','l','o','n', 0, + 's','e','m','i','c','o','l','o','n', 0, + 'l','e','s','s', 0, + 'e','q','u','a','l', 0, + 'g','r','e','a','t','e','r', 0, + 'q','u','e','s','t','i','o','n', 0, + 'a','t', 0, + 'A', 0, + 'B', 0, + 'C', 0, + 'D', 0, + 'E', 0, + 'F', 0, + 'G', 0, + 'H', 0, + 'I', 0, + 'J', 0, + 'K', 0, + 'L', 0, + 'M', 0, + 'N', 0, + 'O', 0, + 'P', 0, + 'Q', 0, + 'R', 0, + 'S', 0, + 'T', 0, + 'U', 0, + 'V', 0, + 'W', 0, + 'X', 0, + 'Y', 0, + 'Z', 0, + 'b','r','a','c','k','e','t','l','e','f','t', 0, + 'b','a','c','k','s','l','a','s','h', 0, + 'b','r','a','c','k','e','t','r','i','g','h','t', 0, + 'a','s','c','i','i','c','i','r','c','u','m', 0, + 'u','n','d','e','r','s','c','o','r','e', 0, + 'q','u','o','t','e','l','e','f','t', 0, + 'a', 0, + 'b', 0, + 'c', 0, + 'd', 0, + 'e', 0, + 'f', 0, + 'g', 0, + 'h', 0, + 'i', 0, + 'j', 0, + 'k', 0, + 'l', 0, + 'm', 0, + 'n', 0, + 'o', 0, + 'p', 0, + 'q', 0, + 'r', 0, + 's', 0, + 't', 0, + 'u', 0, + 'v', 0, + 'w', 0, + 'x', 0, + 'y', 0, + 'z', 0, + 'b','r','a','c','e','l','e','f','t', 0, + 'b','a','r', 0, + 'b','r','a','c','e','r','i','g','h','t', 0, + 'a','s','c','i','i','t','i','l','d','e', 0, + 'e','x','c','l','a','m','d','o','w','n', 0, + 'c','e','n','t', 0, + 's','t','e','r','l','i','n','g', 0, + 'f','r','a','c','t','i','o','n', 0, + 'y','e','n', 0, + 'f','l','o','r','i','n', 0, + 's','e','c','t','i','o','n', 0, + 'c','u','r','r','e','n','c','y', 0, + 'q','u','o','t','e','s','i','n','g','l','e', 0, + 'q','u','o','t','e','d','b','l','l','e','f','t', 0, + 'g','u','i','l','l','e','m','o','t','l','e','f','t', 0, + 'g','u','i','l','s','i','n','g','l','l','e','f','t', 0, + 'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0, + 'f','i', 0, + 'f','l', 0, + 'e','n','d','a','s','h', 0, + 'd','a','g','g','e','r', 0, + 'd','a','g','g','e','r','d','b','l', 0, + 'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0, + 'p','a','r','a','g','r','a','p','h', 0, + 'b','u','l','l','e','t', 0, + 'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0, + 'q','u','o','t','e','d','b','l','b','a','s','e', 0, + 'q','u','o','t','e','d','b','l','r','i','g','h','t', 0, + 'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0, + 'e','l','l','i','p','s','i','s', 0, + 'p','e','r','t','h','o','u','s','a','n','d', 0, + 'q','u','e','s','t','i','o','n','d','o','w','n', 0, + 'g','r','a','v','e', 0, + 'a','c','u','t','e', 0, + 'c','i','r','c','u','m','f','l','e','x', 0, + 't','i','l','d','e', 0, + 'm','a','c','r','o','n', 0, + 'b','r','e','v','e', 0, + 'd','o','t','a','c','c','e','n','t', 0, + 'd','i','e','r','e','s','i','s', 0, + 'r','i','n','g', 0, + 'c','e','d','i','l','l','a', 0, + 'h','u','n','g','a','r','u','m','l','a','u','t', 0, + 'o','g','o','n','e','k', 0, + 'c','a','r','o','n', 0, + 'e','m','d','a','s','h', 0, + 'A','E', 0, + 'o','r','d','f','e','m','i','n','i','n','e', 0, + 'L','s','l','a','s','h', 0, + 'O','s','l','a','s','h', 0, + 'O','E', 0, + 'o','r','d','m','a','s','c','u','l','i','n','e', 0, + 'a','e', 0, + 'd','o','t','l','e','s','s','i', 0, + 'l','s','l','a','s','h', 0, + 'o','s','l','a','s','h', 0, + 'o','e', 0, + 'g','e','r','m','a','n','d','b','l','s', 0, + 'o','n','e','s','u','p','e','r','i','o','r', 0, + 'l','o','g','i','c','a','l','n','o','t', 0, + 'm','u', 0, + 't','r','a','d','e','m','a','r','k', 0, + 'E','t','h', 0, + 'o','n','e','h','a','l','f', 0, + 'p','l','u','s','m','i','n','u','s', 0, + 'T','h','o','r','n', 0, + 'o','n','e','q','u','a','r','t','e','r', 0, + 'd','i','v','i','d','e', 0, + 'b','r','o','k','e','n','b','a','r', 0, + 'd','e','g','r','e','e', 0, + 't','h','o','r','n', 0, + 't','h','r','e','e','q','u','a','r','t','e','r','s', 0, + 't','w','o','s','u','p','e','r','i','o','r', 0, + 'r','e','g','i','s','t','e','r','e','d', 0, + 'm','i','n','u','s', 0, + 'e','t','h', 0, + 'm','u','l','t','i','p','l','y', 0, + 't','h','r','e','e','s','u','p','e','r','i','o','r', 0, + 'c','o','p','y','r','i','g','h','t', 0, + 'A','a','c','u','t','e', 0, + 'A','c','i','r','c','u','m','f','l','e','x', 0, + 'A','d','i','e','r','e','s','i','s', 0, + 'A','g','r','a','v','e', 0, + 'A','r','i','n','g', 0, + 'A','t','i','l','d','e', 0, + 'C','c','e','d','i','l','l','a', 0, + 'E','a','c','u','t','e', 0, + 'E','c','i','r','c','u','m','f','l','e','x', 0, + 'E','d','i','e','r','e','s','i','s', 0, + 'E','g','r','a','v','e', 0, + 'I','a','c','u','t','e', 0, + 'I','c','i','r','c','u','m','f','l','e','x', 0, + 'I','d','i','e','r','e','s','i','s', 0, + 'I','g','r','a','v','e', 0, + 'N','t','i','l','d','e', 0, + 'O','a','c','u','t','e', 0, + 'O','c','i','r','c','u','m','f','l','e','x', 0, + 'O','d','i','e','r','e','s','i','s', 0, + 'O','g','r','a','v','e', 0, + 'O','t','i','l','d','e', 0, + 'S','c','a','r','o','n', 0, + 'U','a','c','u','t','e', 0, + 'U','c','i','r','c','u','m','f','l','e','x', 0, + 'U','d','i','e','r','e','s','i','s', 0, + 'U','g','r','a','v','e', 0, + 'Y','a','c','u','t','e', 0, + 'Y','d','i','e','r','e','s','i','s', 0, + 'Z','c','a','r','o','n', 0, + 'a','a','c','u','t','e', 0, + 'a','c','i','r','c','u','m','f','l','e','x', 0, + 'a','d','i','e','r','e','s','i','s', 0, + 'a','g','r','a','v','e', 0, + 'a','r','i','n','g', 0, + 'a','t','i','l','d','e', 0, + 'c','c','e','d','i','l','l','a', 0, + 'e','a','c','u','t','e', 0, + 'e','c','i','r','c','u','m','f','l','e','x', 0, + 'e','d','i','e','r','e','s','i','s', 0, + 'e','g','r','a','v','e', 0, + 'i','a','c','u','t','e', 0, + 'i','c','i','r','c','u','m','f','l','e','x', 0, + 'i','d','i','e','r','e','s','i','s', 0, + 'i','g','r','a','v','e', 0, + 'n','t','i','l','d','e', 0, + 'o','a','c','u','t','e', 0, + 'o','c','i','r','c','u','m','f','l','e','x', 0, + 'o','d','i','e','r','e','s','i','s', 0, + 'o','g','r','a','v','e', 0, + 'o','t','i','l','d','e', 0, + 's','c','a','r','o','n', 0, + 'u','a','c','u','t','e', 0, + 'u','c','i','r','c','u','m','f','l','e','x', 0, + 'u','d','i','e','r','e','s','i','s', 0, + 'u','g','r','a','v','e', 0, + 'y','a','c','u','t','e', 0, + 'y','d','i','e','r','e','s','i','s', 0, + 'z','c','a','r','o','n', 0, + 'e','x','c','l','a','m','s','m','a','l','l', 0, + 'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0, + 'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0, + 'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0, + 'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0, + 'A','c','u','t','e','s','m','a','l','l', 0, + 'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0, + 'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0, + 't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0, + 'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0, + 'z','e','r','o','o','l','d','s','t','y','l','e', 0, + 'o','n','e','o','l','d','s','t','y','l','e', 0, + 't','w','o','o','l','d','s','t','y','l','e', 0, + 't','h','r','e','e','o','l','d','s','t','y','l','e', 0, + 'f','o','u','r','o','l','d','s','t','y','l','e', 0, + 'f','i','v','e','o','l','d','s','t','y','l','e', 0, + 's','i','x','o','l','d','s','t','y','l','e', 0, + 's','e','v','e','n','o','l','d','s','t','y','l','e', 0, + 'e','i','g','h','t','o','l','d','s','t','y','l','e', 0, + 'n','i','n','e','o','l','d','s','t','y','l','e', 0, + 'c','o','m','m','a','s','u','p','e','r','i','o','r', 0, + 't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0, + 'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0, + 'q','u','e','s','t','i','o','n','s','m','a','l','l', 0, + 'a','s','u','p','e','r','i','o','r', 0, + 'b','s','u','p','e','r','i','o','r', 0, + 'c','e','n','t','s','u','p','e','r','i','o','r', 0, + 'd','s','u','p','e','r','i','o','r', 0, + 'e','s','u','p','e','r','i','o','r', 0, + 'i','s','u','p','e','r','i','o','r', 0, + 'l','s','u','p','e','r','i','o','r', 0, + 'm','s','u','p','e','r','i','o','r', 0, + 'n','s','u','p','e','r','i','o','r', 0, + 'o','s','u','p','e','r','i','o','r', 0, + 'r','s','u','p','e','r','i','o','r', 0, + 's','s','u','p','e','r','i','o','r', 0, + 't','s','u','p','e','r','i','o','r', 0, + 'f','f', 0, + 'f','f','i', 0, + 'f','f','l', 0, + 'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0, + 'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0, + 'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0, + 'G','r','a','v','e','s','m','a','l','l', 0, + 'A','s','m','a','l','l', 0, + 'B','s','m','a','l','l', 0, + 'C','s','m','a','l','l', 0, + 'D','s','m','a','l','l', 0, + 'E','s','m','a','l','l', 0, + 'F','s','m','a','l','l', 0, + 'G','s','m','a','l','l', 0, + 'H','s','m','a','l','l', 0, + 'I','s','m','a','l','l', 0, + 'J','s','m','a','l','l', 0, + 'K','s','m','a','l','l', 0, + 'L','s','m','a','l','l', 0, + 'M','s','m','a','l','l', 0, + 'N','s','m','a','l','l', 0, + 'O','s','m','a','l','l', 0, + 'P','s','m','a','l','l', 0, + 'Q','s','m','a','l','l', 0, + 'R','s','m','a','l','l', 0, + 'S','s','m','a','l','l', 0, + 'T','s','m','a','l','l', 0, + 'U','s','m','a','l','l', 0, + 'V','s','m','a','l','l', 0, + 'W','s','m','a','l','l', 0, + 'X','s','m','a','l','l', 0, + 'Y','s','m','a','l','l', 0, + 'Z','s','m','a','l','l', 0, + 'c','o','l','o','n','m','o','n','e','t','a','r','y', 0, + 'o','n','e','f','i','t','t','e','d', 0, + 'r','u','p','i','a','h', 0, + 'T','i','l','d','e','s','m','a','l','l', 0, + 'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0, + 'c','e','n','t','o','l','d','s','t','y','l','e', 0, + 'L','s','l','a','s','h','s','m','a','l','l', 0, + 'S','c','a','r','o','n','s','m','a','l','l', 0, + 'Z','c','a','r','o','n','s','m','a','l','l', 0, + 'D','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'B','r','e','v','e','s','m','a','l','l', 0, + 'C','a','r','o','n','s','m','a','l','l', 0, + 'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0, + 'M','a','c','r','o','n','s','m','a','l','l', 0, + 'f','i','g','u','r','e','d','a','s','h', 0, + 'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0, + 'O','g','o','n','e','k','s','m','a','l','l', 0, + 'R','i','n','g','s','m','a','l','l', 0, + 'C','e','d','i','l','l','a','s','m','a','l','l', 0, + 'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0, + 'o','n','e','e','i','g','h','t','h', 0, + 't','h','r','e','e','e','i','g','h','t','h','s', 0, + 'f','i','v','e','e','i','g','h','t','h','s', 0, + 's','e','v','e','n','e','i','g','h','t','h','s', 0, + 'o','n','e','t','h','i','r','d', 0, + 't','w','o','t','h','i','r','d','s', 0, + 'z','e','r','o','s','u','p','e','r','i','o','r', 0, + 'f','o','u','r','s','u','p','e','r','i','o','r', 0, + 'f','i','v','e','s','u','p','e','r','i','o','r', 0, + 's','i','x','s','u','p','e','r','i','o','r', 0, + 's','e','v','e','n','s','u','p','e','r','i','o','r', 0, + 'e','i','g','h','t','s','u','p','e','r','i','o','r', 0, + 'n','i','n','e','s','u','p','e','r','i','o','r', 0, + 'z','e','r','o','i','n','f','e','r','i','o','r', 0, + 'o','n','e','i','n','f','e','r','i','o','r', 0, + 't','w','o','i','n','f','e','r','i','o','r', 0, + 't','h','r','e','e','i','n','f','e','r','i','o','r', 0, + 'f','o','u','r','i','n','f','e','r','i','o','r', 0, + 'f','i','v','e','i','n','f','e','r','i','o','r', 0, + 's','i','x','i','n','f','e','r','i','o','r', 0, + 's','e','v','e','n','i','n','f','e','r','i','o','r', 0, + 'e','i','g','h','t','i','n','f','e','r','i','o','r', 0, + 'n','i','n','e','i','n','f','e','r','i','o','r', 0, + 'c','e','n','t','i','n','f','e','r','i','o','r', 0, + 'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0, + 'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0, + 'c','o','m','m','a','i','n','f','e','r','i','o','r', 0, + 'A','g','r','a','v','e','s','m','a','l','l', 0, + 'A','a','c','u','t','e','s','m','a','l','l', 0, + 'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'A','t','i','l','d','e','s','m','a','l','l', 0, + 'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'A','r','i','n','g','s','m','a','l','l', 0, + 'A','E','s','m','a','l','l', 0, + 'C','c','e','d','i','l','l','a','s','m','a','l','l', 0, + 'E','g','r','a','v','e','s','m','a','l','l', 0, + 'E','a','c','u','t','e','s','m','a','l','l', 0, + 'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'I','g','r','a','v','e','s','m','a','l','l', 0, + 'I','a','c','u','t','e','s','m','a','l','l', 0, + 'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'E','t','h','s','m','a','l','l', 0, + 'N','t','i','l','d','e','s','m','a','l','l', 0, + 'O','g','r','a','v','e','s','m','a','l','l', 0, + 'O','a','c','u','t','e','s','m','a','l','l', 0, + 'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'O','t','i','l','d','e','s','m','a','l','l', 0, + 'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'O','E','s','m','a','l','l', 0, + 'O','s','l','a','s','h','s','m','a','l','l', 0, + 'U','g','r','a','v','e','s','m','a','l','l', 0, + 'U','a','c','u','t','e','s','m','a','l','l', 0, + 'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'Y','a','c','u','t','e','s','m','a','l','l', 0, + 'T','h','o','r','n','s','m','a','l','l', 0, + 'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + '0','0','1','.','0','0','0', 0, + '0','0','1','.','0','0','1', 0, + '0','0','1','.','0','0','2', 0, + '0','0','1','.','0','0','3', 0, + 'B','l','a','c','k', 0, + 'B','o','l','d', 0, + 'B','o','o','k', 0, + 'L','i','g','h','t', 0, + 'M','e','d','i','u','m', 0, + 'R','e','g','u','l','a','r', 0, + 'R','o','m','a','n', 0, + 'S','e','m','i','b','o','l','d', 0, + }; + + +#define FT_NUM_MAC_NAMES 258 + + /* Values are offsets into the `ft_standard_glyph_names' table */ + + static const short ft_mac_names[FT_NUM_MAC_NAMES] = + { + 253, 0, 6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351, + 360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, + 436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, + 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, + 528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610, + 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, + 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, + 1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652, + 1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776, + 1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346, + 1197, 985,1031, 23,1086,1108, 32,1219, 41, 51, 730,1194, 64, 76, + 86, 94, 97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120, + 132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916, + 598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856, + 888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500, + 163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053, + 1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229, + 1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200, + 209, 218, 225, 232, 239, 246 + }; + + +#define FT_NUM_SID_NAMES 391 + + /* Values are offsets into the `ft_standard_glyph_names' table */ + + static const short ft_sid_names[FT_NUM_SID_NAMES] = + { + 253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365, + 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441, + 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502, + 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530, + 532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614, + 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, + 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707, + 712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832, + 839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985, + 991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089, + 1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197, + 1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319, + 1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443, + 1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562, + 1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680, + 1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797, + 1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973, + 1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167, + 2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319, + 2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454, + 2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552, + 2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684, + 2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860, + 2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034, + 3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220, + 3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409, + 3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586, + 3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687 + }; + + + /* the following are indices into the SID name table */ + static const unsigned short t1_standard_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110, + 0,111,112,113,114, 0,115,116,117,118,119,120,121,122, 0,123, + 0,124,125,126,127,128,129,130,131, 0,132,133, 0,134,135,136, + 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,138, 0,139, 0, 0, 0, 0,140,141,142,143, 0, 0, 0, 0, + 0,144, 0, 0, 0,145, 0, 0,146,147,148,149, 0, 0, 0, 0 + }; + + + /* the following are indices into the SID name table */ + static const unsigned short t1_expert_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1,229,230, 0,231,232,233,234,235,236,237,238, 13, 14, 15, 99, + 239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252, + 0,253,254,255,256,257, 0, 0, 0,258, 0, 0,259,260,261,262, + 0, 0,263,264,265, 0,266,109,110,267,268,269, 0,270,271,272, + 273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288, + 289,290,291,292,293,294,295,296,297,298,299,300,301,302,303, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,304,305,306, 0, 0,307,308,309,310,311, 0,312, 0, 0,313, + 0, 0,314,315, 0, 0,316,317,318, 0, 0, 0,158,155,163,319, + 320,321,322,323,324,325, 0, 0,326,150,164,169,327,328,329,330, + 331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346, + 347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362, + 363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378 + }; + + + /* + * This table is a compressed version of the Adobe Glyph List (AGL), + * optimized for efficient searching. It has been generated by the + * `glnames.py' python script located in the `src/tools' directory. + * + * The lookup function to get the Unicode value for a given string + * is defined below the table. + */ + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + static const unsigned char ft_adobe_glyph_list[54791L] = + { + 0, 52, 0,106, 2,167, 3, 63, 4,220, 6,125, 9,143, 10, 23, + 11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88, + 22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107, + 32,222, 33, 55, 34,154, 35,218, 53, 84, 59,196, 68, 6, 75,183, + 83,178, 88,135, 93,242,101,165,109,185,111, 55,117,254,123, 73, + 130,238,138,206,145, 31,153,182,156,189,163,249,178,221,193, 17, + 197, 99,199,240,204, 27,204,155,210,100, 65,143, 0, 65, 0,140, + 0,175, 0,193, 1, 15, 1,147, 1,233, 1,251, 2, 7, 2, 40, + 2, 57, 2, 82, 2, 91, 2,128, 2,136, 2,154, 69,131, 0,198, + 0,150, 0,158, 0,167,225,227,245,244,101,128, 1,252,237,225, + 227,242,239,110,128, 1,226,243,237,225,236,108,128,247,230,225, + 227,245,244,101,129, 0,193, 0,185,243,237,225,236,108,128,247, + 225,226,242,229,246,101,134, 1, 2, 0,213, 0,221, 0,232, 0, + 243, 0,251, 1, 7,225,227,245,244,101,128, 30,174,227,249,242, + 233,236,236,233, 99,128, 4,208,228,239,244,226,229,236,239,119, + 128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225, + 226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99, + 4, 1, 25, 1, 32, 1,121, 1,137,225,242,239,110,128, 1,205, + 233,242, 99, 2, 1, 40, 1, 45,236,101,128, 36,182,245,237,230, + 236,229,120,134, 0,194, 1, 66, 1, 74, 1, 85, 1, 93, 1,105, + 1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236, + 239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239, + 235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247, + 226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201, 1, + 129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99, + 128, 4, 16,100, 3, 1,155, 1,165, 1,209,226,236,231,242,225, + 246,101,128, 2, 0,233,229,242,229,243,233,115,131, 0,196, 1, + 181, 1,192, 1,201,227,249,242,233,236,236,233, 99,128, 4,210, + 237,225,227,242,239,110,128, 1,222,243,237,225,236,108,128,247, + 228,239,116, 2, 1,216, 1,224,226,229,236,239,119,128, 30,160, + 237,225,227,242,239,110,128, 1,224,231,242,225,246,101,129, 0, + 192, 1,243,243,237,225,236,108,128,247,224,232,239,239,235,225, + 226,239,246,101,128, 30,162,105, 2, 2, 13, 2, 25,229,227,249, + 242,233,236,236,233, 99,128, 4,212,238,246,229,242,244,229,228, + 226,242,229,246,101,128, 2, 2,236,240,232, 97,129, 3,145, 2, + 49,244,239,238,239,115,128, 3,134,109, 2, 2, 63, 2, 71,225, + 227,242,239,110,128, 1, 0,239,238,239,243,240,225,227,101,128, + 255, 33,239,231,239,238,229,107,128, 1, 4,242,233,238,103,131, + 0,197, 2,104, 2,112, 2,120,225,227,245,244,101,128, 1,250, + 226,229,236,239,119,128, 30, 0,243,237,225,236,108,128,247,229, + 243,237,225,236,108,128,247, 97,244,233,236,228,101,129, 0,195, + 2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229, + 238,233,225,110,128, 5, 49, 66,137, 0, 66, 2,189, 2,198, 2, + 223, 3, 3, 3, 10, 3, 22, 3, 34, 3, 46, 3, 54,227,233,242, + 227,236,101,128, 36,183,228,239,116, 2, 2,206, 2,215,225,227, + 227,229,238,116,128, 30, 2,226,229,236,239,119,128, 30, 4,101, + 3, 2,231, 2,242, 2,254,227,249,242,233,236,236,233, 99,128, + 4, 17,238,225,242,237,229,238,233,225,110,128, 5, 50,244, 97, + 128, 3,146,232,239,239,107,128, 1,129,236,233,238,229,226,229, + 236,239,119,128, 30, 6,237,239,238,239,243,240,225,227,101,128, + 255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237, + 225,236,108,128,247, 98,244,239,240,226,225,114,128, 1,130, 67, + 137, 0, 67, 3, 85, 3,127, 3,193, 3,210, 3,224, 4,171, 4, + 188, 4,200, 4,212, 97, 3, 3, 93, 3,104, 3,111,225,242,237, + 229,238,233,225,110,128, 5, 62,227,245,244,101,128, 1, 6,242, + 239,110,129,246,202, 3,119,243,237,225,236,108,128,246,245, 99, + 3, 3,135, 3,142, 3,171,225,242,239,110,128, 1, 12,229,228, + 233,236,236, 97,130, 0,199, 3,155, 3,163,225,227,245,244,101, + 128, 30, 8,243,237,225,236,108,128,247,231,233,242, 99, 2, 3, + 179, 3,184,236,101,128, 36,184,245,237,230,236,229,120,128, 1, + 8,228,239,116,129, 1, 10, 3,201,225,227,227,229,238,116,128, + 1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184, + 104, 4, 3,234, 3,246, 4,161, 4,165,225,225,242,237,229,238, + 233,225,110,128, 5, 73,101, 6, 4, 4, 4, 24, 4, 35, 4,103, + 4,115, 4,136,225,226,235,232,225,243,233,225,238,227,249,242, + 233,236,236,233, 99,128, 4,188,227,249,242,233,236,236,233, 99, + 128, 4, 39,100, 2, 4, 41, 4, 85,229,243,227,229,238,228,229, + 114, 2, 4, 54, 4, 74,225,226,235,232,225,243,233,225,238,227, + 249,242,233,236,236,233, 99,128, 4,190,227,249,242,233,236,236, + 233, 99,128, 4,182,233,229,242,229,243,233,243,227,249,242,233, + 236,236,233, 99,128, 4,244,232,225,242,237,229,238,233,225,110, + 128, 5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242, + 233,236,236,233, 99,128, 4,203,246,229,242,244,233,227,225,236, + 243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4, + 184,105,128, 3,167,239,239,107,128, 1,135,233,242,227,245,237, + 230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239, + 243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225, + 110,128, 5, 81,243,237,225,236,108,128,247, 99, 68,142, 0, 68, + 4,252, 5, 10, 5, 36, 5, 96, 5,121, 5,166, 5,173, 5,231, + 5,244, 6, 0, 6, 12, 6, 28, 6, 48, 6, 57, 90,129, 1,241, + 5, 2,227,225,242,239,110,128, 1,196, 97, 2, 5, 16, 5, 27, + 225,242,237,229,238,233,225,110,128, 5, 52,230,242,233,227,225, + 110,128, 1,137, 99, 4, 5, 46, 5, 53, 5, 62, 5, 89,225,242, + 239,110,128, 1, 14,229,228,233,236,236, 97,128, 30, 16,233,242, + 99, 2, 5, 70, 5, 75,236,101,128, 36,185,245,237,230,236,229, + 248,226,229,236,239,119,128, 30, 18,242,239,225,116,128, 1, 16, + 228,239,116, 2, 5,104, 5,113,225,227,227,229,238,116,128, 30, + 10,226,229,236,239,119,128, 30, 12,101, 3, 5,129, 5,140, 5, + 150,227,249,242,233,236,236,233, 99,128, 4, 20,233,227,239,240, + 244,233, 99,128, 3,238,236,244, 97,129, 34, 6, 5,158,231,242, + 229,229,107,128, 3,148,232,239,239,107,128, 1,138,105, 2, 5, + 179, 5,218,229,242,229,243,233,115,131,246,203, 5,194, 5,202, + 5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128, + 246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231, + 242,229,229,107,128, 3,220,234,229,227,249,242,233,236,236,233, + 99,128, 4, 2,236,233,238,229,226,229,236,239,119,128, 30, 14, + 237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227, + 227,229,238,244,243,237,225,236,108,128,246,247,115, 2, 6, 34, + 6, 41,236,225,243,104,128, 1, 16,237,225,236,108,128,247,100, + 244,239,240,226,225,114,128, 1,139,122,131, 1,242, 6, 67, 6, + 75, 6,112,227,225,242,239,110,128, 1,197,101, 2, 6, 81, 6, + 101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236, + 233, 99,128, 4,224,227,249,242,233,236,236,233, 99,128, 4, 5, + 232,229,227,249,242,233,236,236,233, 99,128, 4, 15, 69,146, 0, + 69, 6,165, 6,183, 6,191, 7, 89, 7,153, 7,165, 7,183, 7, + 211, 8, 7, 8, 36, 8, 94, 8,169, 8,189, 8,208, 8,248, 9, + 44, 9,109, 9,115,225,227,245,244,101,129, 0,201, 6,175,243, + 237,225,236,108,128,247,233,226,242,229,246,101,128, 1, 20, 99, + 5, 6,203, 6,210, 6,224, 6,236, 7, 79,225,242,239,110,128, + 1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28, + 232,225,242,237,229,238,233,225,110,128, 5, 53,233,242, 99, 2, + 6,244, 6,249,236,101,128, 36,186,245,237,230,236,229,120,135, + 0,202, 7, 16, 7, 24, 7, 32, 7, 43, 7, 51, 7, 63, 7, 71, + 225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24, + 228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101, + 128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243, + 237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249, + 242,233,236,236,233, 99,128, 4, 4,100, 3, 7, 97, 7,107, 7, + 127,226,236,231,242,225,246,101,128, 2, 4,233,229,242,229,243, + 233,115,129, 0,203, 7,119,243,237,225,236,108,128,247,235,239, + 116,130, 1, 22, 7,136, 7,145,225,227,227,229,238,116,128, 1, + 22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236, + 233, 99,128, 4, 36,231,242,225,246,101,129, 0,200, 7,175,243, + 237,225,236,108,128,247,232,104, 2, 7,189, 7,200,225,242,237, + 229,238,233,225,110,128, 5, 55,239,239,235,225,226,239,246,101, + 128, 30,186,105, 3, 7,219, 7,230, 7,245,231,232,244,242,239, + 237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 6,239,244,233,230,233,229,228,227,249,242,233, + 236,236,233, 99,128, 4,100,108, 2, 8, 13, 8, 24,227,249,242, + 233,236,236,233, 99,128, 4, 27,229,246,229,238,242,239,237,225, + 110,128, 33,106,109, 3, 8, 44, 8, 72, 8, 83,225,227,242,239, + 110,130, 1, 18, 8, 56, 8, 64,225,227,245,244,101,128, 30, 22, + 231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99, + 128, 4, 28,239,238,239,243,240,225,227,101,128,255, 37,110, 4, + 8,104, 8,115, 8,135, 8,154,227,249,242,233,236,236,233, 99, + 128, 4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233, + 236,236,233, 99,128, 4,162,103,129, 1, 74, 8,141,232,229,227, + 249,242,233,236,236,233, 99,128, 4,164,232,239,239,235,227,249, + 242,233,236,236,233, 99,128, 4,199,111, 2, 8,175, 8,183,231, + 239,238,229,107,128, 1, 24,240,229,110,128, 1,144,240,243,233, + 236,239,110,129, 3,149, 8,200,244,239,238,239,115,128, 3,136, + 114, 2, 8,214, 8,225,227,249,242,233,236,236,233, 99,128, 4, + 32,229,246,229,242,243,229,100,129, 1,142, 8,237,227,249,242, + 233,236,236,233, 99,128, 4, 45,115, 4, 9, 2, 9, 13, 9, 33, + 9, 37,227,249,242,233,236,236,233, 99,128, 4, 33,228,229,243, + 227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4, + 170,104,128, 1,169,237,225,236,108,128,247,101,116, 3, 9, 52, + 9, 78, 9, 92, 97,130, 3,151, 9, 60, 9, 70,242,237,229,238, + 233,225,110,128, 5, 56,244,239,238,239,115,128, 3,137,104,129, + 0,208, 9, 84,243,237,225,236,108,128,247,240,233,236,228,101, + 129, 30,188, 9,101,226,229,236,239,119,128, 30, 26,245,242,111, + 128, 32,172,250,104,130, 1,183, 9,124, 9,132,227,225,242,239, + 110,128, 1,238,242,229,246,229,242,243,229,100,128, 1,184, 70, + 136, 0, 70, 9,163, 9,172, 9,184, 9,212, 9,219, 9,248, 10, + 4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225, + 227,227,229,238,116,128, 30, 30,101, 2, 9,190, 9,202,232,225, + 242,237,229,238,233,225,110,128, 5, 86,233,227,239,240,244,233, + 99,128, 3,228,232,239,239,107,128, 1,145,105, 2, 9,225, 9, + 238,244,225,227,249,242,233,236,236,233, 99,128, 4,114,246,229, + 242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227, + 101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243, + 237,225,236,108,128,247,102, 71,140, 0, 71, 10, 51, 10, 61, 10, + 107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11, + 90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97, 3, 10, + 69, 10, 76, 10, 94,227,245,244,101,128, 1,244,237,237, 97,129, + 3,147, 10, 84,225,230,242,233,227,225,110,128, 1,148,238,231, + 233,225,227,239,240,244,233, 99,128, 3,234,226,242,229,246,101, + 128, 1, 30, 99, 4, 10,125, 10,132, 10,141, 10,163,225,242,239, + 110,128, 1,230,229,228,233,236,236, 97,128, 1, 34,233,242, 99, + 2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120, + 128, 1, 28,239,237,237,225,225,227,227,229,238,116,128, 1, 34, + 228,239,116,129, 1, 32, 10,184,225,227,227,229,238,116,128, 1, + 32,229,227,249,242,233,236,236,233, 99,128, 4, 19,104, 3, 10, + 213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128, + 5, 66,101, 3, 10,234, 10,255, 11, 16,237,233,228,228,236,229, + 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,148,243, + 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,146, + 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4, + 144,239,239,107,128, 1,147,233,237,225,242,237,229,238,233,225, + 110,128, 5, 51,234,229,227,249,242,233,236,236,233, 99,128, 4, + 3,109, 2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239, + 238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246, + 206, 11, 99,243,237,225,236,108,128,247, 96,115, 2, 11,113, 11, + 129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128, 2, + 155,244,242,239,235,101,128, 1,228, 72,140, 0, 72, 11,165, 11, + 190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12, + 157, 12,165, 12,189,177,184, 53, 3, 11,175, 11,180, 11,185,179, + 51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178, + 176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203, + 97, 3, 11,216, 11,236, 12, 0,225,226,235,232,225,243,233,225, + 238,227,249,242,233,236,236,233, 99,128, 4,168,228,229,243,227, + 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,178, + 242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128, 4, + 42, 98, 2, 12, 23, 12, 28,225,114,128, 1, 38,242,229,246,229, + 226,229,236,239,119,128, 30, 42, 99, 2, 12, 46, 12, 55,229,228, + 233,236,236, 97,128, 30, 40,233,242, 99, 2, 12, 63, 12, 68,236, + 101,128, 36,189,245,237,230,236,229,120,128, 1, 36,100, 2, 12, + 83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116, 2, + 12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236, + 239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255, + 40,111, 2, 12,135, 12,146,225,242,237,229,238,233,225,110,128, + 5, 64,242,233,227,239,240,244,233, 99,128, 3,232,243,237,225, + 236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116, + 129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241, + 245,225,242,101,128, 51,144, 73,146, 0, 73, 12,239, 12,251, 12, + 255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13, + 242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193, + 227,249,242,233,236,236,233, 99,128, 4, 47, 74,128, 1, 50,213, + 227,249,242,233,236,236,233, 99,128, 4, 46,225,227,245,244,101, + 129, 0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229, + 246,101,128, 1, 44, 99, 3, 13, 45, 13, 52, 13, 84,225,242,239, + 110,128, 1,207,233,242, 99, 2, 13, 60, 13, 65,236,101,128, 36, + 190,245,237,230,236,229,120,129, 0,206, 13, 76,243,237,225,236, + 108,128,247,238,249,242,233,236,236,233, 99,128, 4, 6,100, 3, + 13,102, 13,112, 13,155,226,236,231,242,225,246,101,128, 2, 8, + 233,229,242,229,243,233,115,131, 0,207, 13,128, 13,136, 13,147, + 225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99, + 128, 4,228,243,237,225,236,108,128,247,239,239,116,130, 1, 48, + 13,164, 13,173,225,227,227,229,238,116,128, 1, 48,226,229,236, + 239,119,128, 30,202,101, 2, 13,187, 13,203,226,242,229,246,229, + 227,249,242,233,236,236,233, 99,128, 4,214,227,249,242,233,236, + 236,233, 99,128, 4, 21,230,242,225,235,244,245,114,128, 33, 17, + 231,242,225,246,101,129, 0,204, 13,234,243,237,225,236,108,128, + 247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105, 3, + 14, 6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128, 4, + 24,238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 10, + 243,232,239,242,244,227,249,242,233,236,236,233, 99,128, 4, 25, + 109, 2, 14, 54, 14, 75,225,227,242,239,110,129, 1, 42, 14, 64, + 227,249,242,233,236,236,233, 99,128, 4,226,239,238,239,243,240, + 225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110, + 128, 5, 59,111, 3, 14,107, 14,118, 14,126,227,249,242,233,236, + 236,233, 99,128, 4, 1,231,239,238,229,107,128, 1, 46,244, 97, + 131, 3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110, + 128, 1,150,228,233,229,242,229,243,233,115,128, 3,170,244,239, + 238,239,115,128, 3,138,115, 2, 14,172, 14,179,237,225,236,108, + 128,247,105,244,242,239,235,101,128, 1,151,244,233,236,228,101, + 129, 1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233, + 244,243, 97, 2, 14,216, 14,227,227,249,242,233,236,236,233, 99, + 128, 4,116,228,226,236,231,242,225,246,229,227,249,242,233,236, + 236,233, 99,128, 4,118, 74,134, 0, 74, 15, 6, 15, 18, 15, 41, + 15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128, + 5, 65,227,233,242, 99, 2, 15, 27, 15, 32,236,101,128, 36,191, + 245,237,230,236,229,120,128, 1, 52,229,227,249,242,233,236,236, + 233, 99,128, 4, 8,232,229,232,225,242,237,229,238,233,225,110, + 128, 5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243, + 237,225,236,108,128,247,106, 75,140, 0, 75, 15,115, 15,125, 15, + 135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16, + 180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241, + 245,225,242,101,128, 51,205, 97, 7, 15,151, 15,169, 15,191, 15, + 211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249, + 242,233,236,236,233, 99,128, 4,160, 99, 2, 15,175, 15,181,245, + 244,101,128, 30, 48,249,242,233,236,236,233, 99,128, 4, 26,228, + 229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99, + 128, 4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128, + 4,195,240,240, 97,128, 3,154,243,244,242,239,235,229,227,249, + 242,233,236,236,233, 99,128, 4,158,246,229,242,244,233,227,225, + 236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, + 4,156, 99, 4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110, + 128, 1,232,229,228,233,236,236, 97,128, 1, 54,233,242,227,236, + 101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128, 1, + 54,228,239,244,226,229,236,239,119,128, 30, 50,101, 2, 16, 82, + 16, 94,232,225,242,237,229,238,233,225,110,128, 5, 84,238,225, + 242,237,229,238,233,225,110,128, 5, 63,104, 3, 16,114, 16,126, + 16,137,225,227,249,242,233,236,236,233, 99,128, 4, 37,229,233, + 227,239,240,244,233, 99,128, 3,230,239,239,107,128, 1,152,234, + 229,227,249,242,233,236,236,233, 99,128, 4, 12,236,233,238,229, + 226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227, + 101,128,255, 43,239,240,240, 97, 2, 16,189, 16,200,227,249,242, + 233,236,236,233, 99,128, 4,128,231,242,229,229,107,128, 3,222, + 115, 2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128, + 4,110,237,225,236,108,128,247,107, 76,138, 0, 76, 17, 1, 17, + 5, 17, 9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17, + 189, 74,128, 1,199, 76,128,246,191, 97, 2, 17, 15, 17, 22,227, + 245,244,101,128, 1, 57,237,226,228, 97,128, 3,155, 99, 4, 17, + 39, 17, 46, 17, 55, 17, 82,225,242,239,110,128, 1, 61,229,228, + 233,236,236, 97,128, 1, 59,233,242, 99, 2, 17, 63, 17, 68,236, + 101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128, + 30, 60,239,237,237,225,225,227,227,229,238,116,128, 1, 59,228, + 239,116,130, 1, 63, 17,105, 17,114,225,227,227,229,238,116,128, + 1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242, + 239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110, + 128, 5, 60,106,129, 1,200, 17,153,229,227,249,242,233,236,236, + 233, 99,128, 4, 9,236,233,238,229,226,229,236,239,119,128, 30, + 58,237,239,238,239,243,240,225,227,101,128,255, 44,115, 2, 17, + 195, 17,212,236,225,243,104,129, 1, 65, 17,204,243,237,225,236, + 108,128,246,249,237,225,236,108,128,247,108, 77,137, 0, 77, 17, + 241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18, + 100,194,243,241,245,225,242,101,128, 51,134,225, 99, 2, 18, 2, + 18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128, + 247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36, + 194,228,239,116, 2, 18, 41, 18, 50,225,227,227,229,238,116,128, + 30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229, + 238,233,225,110,128, 5, 68,237,239,238,239,243,240,225,227,101, + 128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229, + 100,128, 1,156,117,128, 3,156, 78,141, 0, 78, 18,134, 18,138, + 18,146, 18,212, 18,237, 18,248, 19, 3, 19, 21, 19, 33, 19, 45, + 19, 58, 19, 66, 19, 84, 74,128, 1,202,225,227,245,244,101,128, + 1, 67, 99, 4, 18,156, 18,163, 18,172, 18,199,225,242,239,110, + 128, 1, 71,229,228,233,236,236, 97,128, 1, 69,233,242, 99, 2, + 18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226, + 229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238, + 116,128, 1, 69,228,239,116, 2, 18,220, 18,229,225,227,227,229, + 238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239, + 235,236,229,230,116,128, 1,157,233,238,229,242,239,237,225,110, + 128, 33,104,106,129, 1,203, 19, 9,229,227,249,242,233,236,236, + 233, 99,128, 4, 10,236,233,238,229,226,229,236,239,119,128, 30, + 72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225, + 242,237,229,238,233,225,110,128, 5, 70,243,237,225,236,108,128, + 247,110,244,233,236,228,101,129, 0,209, 19, 76,243,237,225,236, + 108,128,247,241,117,128, 3,157, 79,141, 0, 79, 19,118, 19,132, + 19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213, + 21,223, 21,254, 22, 53, 69,129, 1, 82, 19,124,243,237,225,236, + 108,128,246,250,225,227,245,244,101,129, 0,211, 19,142,243,237, + 225,236,108,128,247,243, 98, 2, 19,156, 19,196,225,242,242,229, + 100, 2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128, 4, + 232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,234,242,229,246,101,128, 1, 78, 99, 4, 19,213, 19, + 220, 19,235, 20, 68,225,242,239,110,128, 1,209,229,238,244,229, + 242,229,228,244,233,236,228,101,128, 1,159,233,242, 99, 2, 19, + 243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134, 0, + 212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245, + 244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216, + 231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246, + 101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228, + 101,128, 30,214,249,242,233,236,236,233, 99,128, 4, 30,100, 3, + 20, 86, 20,109, 20,142,226,108, 2, 20, 93, 20,101,225,227,245, + 244,101,128, 1, 80,231,242,225,246,101,128, 2, 12,233,229,242, + 229,243,233,115,130, 0,214, 20,123, 20,134,227,249,242,233,236, + 236,233, 99,128, 4,230,243,237,225,236,108,128,247,246,239,244, + 226,229,236,239,119,128, 30,204,103, 2, 20,158, 20,170,239,238, + 229,235,243,237,225,236,108,128,246,251,242,225,246,101,129, 0, + 210, 20,179,243,237,225,236,108,128,247,242,104, 4, 20,197, 20, + 208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128, 5, 85, + 109,128, 33, 38,111, 2, 20,218, 20,228,239,235,225,226,239,246, + 101,128, 30,206,242,110,133, 1,160, 20,243, 20,251, 21, 6, 21, + 14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229, + 236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239, + 239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128, + 30,224,245,238,231,225,242,245,237,236,225,245,116,128, 1, 80, + 105,129, 1,162, 21, 54,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 14,109, 4, 21, 79, 21,107, 21,184, 21,202,225, + 227,242,239,110,130, 1, 76, 21, 91, 21, 99,225,227,245,244,101, + 128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33, + 38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233, + 99,128, 4, 96,231,242,229,229,107,128, 3,169,242,239,245,238, + 228,227,249,242,233,236,236,233, 99,128, 4,122,116, 2, 21,162, + 21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128, 4, + 124,239,238,239,115,128, 3,143,233,227,242,239,110,129, 3,159, + 21,194,244,239,238,239,115,128, 3,140,239,238,239,243,240,225, + 227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111, + 2, 21,229, 21,248,231,239,238,229,107,129, 1,234, 21,239,237, + 225,227,242,239,110,128, 1,236,240,229,110,128, 1,134,115, 3, + 22, 6, 22, 33, 22, 40,236,225,243,104,130, 0,216, 22, 17, 22, + 25,225,227,245,244,101,128, 1,254,243,237,225,236,108,128,247, + 248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245, + 244,101,128, 1,254,116, 2, 22, 59, 22, 70,227,249,242,233,236, + 236,233, 99,128, 4,126,233,236,228,101,131, 0,213, 22, 83, 22, + 91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229, + 243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136, + 0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246, + 23, 2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101, + 128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101, + 3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128, + 4, 31,232,225,242,237,229,238,233,225,110,128, 5, 74,237,233, + 228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99, + 128, 4,166,104, 2, 22,217, 22,221,105,128, 3,166,239,239,107, + 128, 1,164,105,129, 3,160, 22,233,247,242,225,242,237,229,238, + 233,225,110,128, 5, 83,237,239,238,239,243,240,225,227,101,128, + 255, 48,115, 2, 23, 8, 23, 25,105,129, 3,168, 23, 14,227,249, + 242,233,236,236,233, 99,128, 4,112,237,225,236,108,128,247,112, + 81,131, 0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101, + 128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243, + 237,225,236,108,128,247,113, 82,138, 0, 82, 23, 95, 23,119, 23, + 166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97, + 2, 23,101, 23,112,225,242,237,229,238,233,225,110,128, 5, 76, + 227,245,244,101,128, 1, 84, 99, 4, 23,129, 23,136, 23,145, 23, + 153,225,242,239,110,128, 1, 88,229,228,233,236,236, 97,128, 1, + 86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227, + 229,238,116,128, 1, 86,100, 2, 23,172, 23,182,226,236,231,242, + 225,246,101,128, 2, 16,239,116, 2, 23,189, 23,198,225,227,227, + 229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208, + 237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238, + 233,225,110,128, 5, 80,230,242,225,235,244,245,114,128, 33, 28, + 232,111,128, 3,161,233,110, 2, 23,252, 24, 5,231,243,237,225, + 236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101, + 128, 2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237, + 239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108, + 129,247,114, 24, 53,233,238,246,229,242,244,229,100,129, 2,129, + 24, 66,243,245,240,229,242,233,239,114,128, 2,182, 83,139, 0, + 83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27, + 105, 27,117, 27,135, 27,143, 70, 6, 24,117, 24,209, 24,241, 25, + 77, 25,119, 25,221, 48, 9, 24,137, 24,145, 24,153, 24,161, 24, + 169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37, + 12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37, + 16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37, + 60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37, + 52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37, + 36, 49, 3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37, + 0,177,176,176,176, 48,128, 37, 2,185,176,176,176, 48,128, 37, + 97, 50, 9, 25, 5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25, + 53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176, + 176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176, + 176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176, + 176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176, + 176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51, 4, 25, + 87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183, + 176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185, + 176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25, + 165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176, + 176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176, + 176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176, + 176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176, + 176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176, + 176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53, 5, 25, + 233, 25,241, 25,249, 26, 1, 26, 9,176,176,176,176, 48,128, 37, + 88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37, + 83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37, + 106, 97, 2, 26, 23, 26, 44,227,245,244,101,129, 1, 90, 26, 32, + 228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231, + 242,229,229,107,128, 3,224, 99, 5, 26, 67, 26, 98, 26,107, 26, + 147, 26,169,225,242,239,110,130, 1, 96, 26, 78, 26, 90,228,239, + 244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128, + 246,253,229,228,233,236,236, 97,128, 1, 94,232,247, 97,130, 1, + 143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128, 4,216, + 228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99, + 128, 4,218,233,242, 99, 2, 26,155, 26,160,236,101,128, 36,200, + 245,237,230,236,229,120,128, 1, 92,239,237,237,225,225,227,227, + 229,238,116,128, 2, 24,228,239,116, 2, 26,190, 26,199,225,227, + 227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26, + 209,228,239,244,225,227,227,229,238,116,128, 30,104,101, 2, 26, + 227, 26,239,232,225,242,237,229,238,233,225,110,128, 5, 77,246, + 229,238,242,239,237,225,110,128, 33,102,104, 5, 27, 6, 27, 34, + 27, 48, 27, 59, 27, 72, 97, 2, 27, 12, 27, 23,225,242,237,229, + 238,233,225,110,128, 5, 71,227,249,242,233,236,236,233, 99,128, + 4, 40,227,232,225,227,249,242,233,236,236,233, 99,128, 4, 41, + 229,233,227,239,240,244,233, 99,128, 3,226,232,225,227,249,242, + 233,236,236,233, 99,128, 4,186,233,237,225,227,239,240,244,233, + 99,128, 3,236,105, 2, 27, 90, 27, 96,231,237, 97,128, 3,163, + 248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225, + 227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233, + 236,236,233, 99,128, 4, 44,243,237,225,236,108,128,247,115,244, + 233,231,237,225,231,242,229,229,107,128, 3,218, 84,141, 0, 84, + 27,186, 27,191, 27,197, 28, 7, 28, 32, 28, 96, 28,147, 28,177, + 28,189, 28,201, 28,246, 29, 6, 29, 46,225,117,128, 3,164,226, + 225,114,128, 1,102, 99, 4, 27,207, 27,214, 27,223, 27,250,225, + 242,239,110,128, 1,100,229,228,233,236,236, 97,128, 1, 98,233, + 242, 99, 2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236, + 229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227, + 227,229,238,116,128, 1, 98,228,239,116, 2, 28, 15, 28, 24,225, + 227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108, + 101, 4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236, + 233, 99,128, 4, 34,228,229,243,227,229,238,228,229,242,227,249, + 242,233,236,236,233, 99,128, 4,172,238,242,239,237,225,110,128, + 33,105,244,243,229,227,249,242,233,236,236,233, 99,128, 4,180, + 104, 3, 28,104, 28,110, 28,136,229,244, 97,128, 3,152,111, 2, + 28,116, 28,121,239,107,128, 1,172,242,110,129, 0,222, 28,128, + 243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110, + 128, 33, 98,105, 2, 28,153, 28,164,236,228,229,243,237,225,236, + 108,128,246,254,247,238,225,242,237,229,238,233,225,110,128, 5, + 79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238, + 239,243,240,225,227,101,128,255, 52,111, 2, 28,207, 28,218,225, + 242,237,229,238,233,225,110,128, 5, 57,238,101, 3, 28,227, 28, + 234, 28,240,230,233,246,101,128, 1,188,243,233,120,128, 1,132, + 244,247,111,128, 1,167,242,229,244,242,239,230,236,229,248,232, + 239,239,107,128, 1,174,115, 3, 29, 14, 29, 26, 29, 39,229,227, + 249,242,233,236,236,233, 99,128, 4, 38,232,229,227,249,242,233, + 236,236,233, 99,128, 4, 11,237,225,236,108,128,247,116,119, 2, + 29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107, + 239,242,239,237,225,110,128, 33, 97, 85,142, 0, 85, 29,105, 29, + 123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31, + 21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129, 0, + 218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101, + 128, 1,108, 99, 3, 29,139, 29,146, 29,188,225,242,239,110,128, + 1,211,233,242, 99, 2, 29,154, 29,159,236,101,128, 36,202,245, + 237,230,236,229,120,130, 0,219, 29,172, 29,180,226,229,236,239, + 119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236, + 236,233, 99,128, 4, 35,100, 3, 29,206, 29,229, 30, 59,226,108, + 2, 29,213, 29,221,225,227,245,244,101,128, 1,112,231,242,225, + 246,101,128, 2, 20,233,229,242,229,243,233,115,134, 0,220, 29, + 251, 30, 3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101, + 128, 1,215,226,229,236,239,119,128, 30,114, 99, 2, 30, 17, 30, + 24,225,242,239,110,128, 1,217,249,242,233,236,236,233, 99,128, + 4,240,231,242,225,246,101,128, 1,219,237,225,227,242,239,110, + 128, 1,213,243,237,225,236,108,128,247,252,239,244,226,229,236, + 239,119,128, 30,228,231,242,225,246,101,129, 0,217, 30, 79,243, + 237,225,236,108,128,247,249,104, 2, 30, 93, 30,171,111, 2, 30, + 99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133, + 1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244, + 101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231, + 242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101, + 128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242, + 245,237,236,225,245,116,129, 1,112, 30,187,227,249,242,233,236, + 236,233, 99,128, 4,242,233,238,246,229,242,244,229,228,226,242, + 229,246,101,128, 2, 22,235,227,249,242,233,236,236,233, 99,128, + 4,120,109, 2, 30,232, 31, 10,225,227,242,239,110,130, 1,106, + 30,244, 30,255,227,249,242,233,236,236,233, 99,128, 4,238,228, + 233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225, + 227,101,128,255, 53,239,231,239,238,229,107,128, 1,114,240,243, + 233,236,239,110,133, 3,165, 31, 49, 31, 53, 31, 90, 31,121, 31, + 134, 49,128, 3,210, 97, 2, 31, 59, 31, 81,227,245,244,229,232, + 239,239,235,243,249,237,226,239,236,231,242,229,229,107,128, 3, + 211,230,242,233,227,225,110,128, 1,177,228,233,229,242,229,243, + 233,115,129, 3,171, 31,103,232,239,239,235,243,249,237,226,239, + 236,231,242,229,229,107,128, 3,212,232,239,239,235,243,249,237, + 226,239,108,128, 3,210,244,239,238,239,115,128, 3,142,242,233, + 238,103,128, 1,110,115, 3, 31,157, 31,172, 31,179,232,239,242, + 244,227,249,242,233,236,236,233, 99,128, 4, 14,237,225,236,108, + 128,247,117,244,242,225,233,231,232,116, 2, 31,191, 31,202,227, + 249,242,233,236,236,233, 99,128, 4,174,243,244,242,239,235,229, + 227,249,242,233,236,236,233, 99,128, 4,176,244,233,236,228,101, + 130, 1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226, + 229,236,239,119,128, 30,116, 86,136, 0, 86, 32, 11, 32, 20, 32, + 31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236, + 101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101, + 2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128, 4, 18, + 247,225,242,237,229,238,233,225,110,128, 5, 78,232,239,239,107, + 128, 1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239, + 225,242,237,229,238,233,225,110,128, 5, 72,243,237,225,236,108, + 128,247,118,244,233,236,228,101,128, 30,124, 87,134, 0, 87, 32, + 123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101, + 128, 30,130,227,233,242, 99, 2, 32,140, 32,145,236,101,128, 36, + 204,245,237,230,236,229,120,128, 1,116,100, 2, 32,160, 32,170, + 233,229,242,229,243,233,115,128, 30,132,239,116, 2, 32,177, 32, + 186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128, + 30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240, + 225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134, + 0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233, + 242,227,236,101,128, 36,205,100, 2, 32,253, 33, 7,233,229,242, + 229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128, + 30,138,229,232,225,242,237,229,238,233,225,110,128, 5, 61,105, + 128, 3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243, + 237,225,236,108,128,247,120, 89,139, 0, 89, 33, 81, 33,116, 33, + 139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34, + 68, 97, 2, 33, 87, 33,104,227,245,244,101,129, 0,221, 33, 96, + 243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233, + 99,128, 4, 98,227,233,242, 99, 2, 33,125, 33,130,236,101,128, + 36,206,245,237,230,236,229,120,128, 1,118,100, 2, 33,145, 33, + 165,233,229,242,229,243,233,115,129, 1,120, 33,157,243,237,225, + 236,108,128,247,255,239,116, 2, 33,172, 33,181,225,227,227,229, + 238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114, 2, + 33,196, 33,208,233,227,249,242,233,236,236,233, 99,128, 4, 43, + 245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,248,231,242,225,246,101,128, 30,242,232,239,239,107, + 129, 1,179, 33,245,225,226,239,246,101,128, 30,246,105, 3, 34, + 5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128, 5, 69, + 227,249,242,233,236,236,233, 99,128, 4, 7,247,238,225,242,237, + 229,238,233,225,110,128, 5, 82,237,239,238,239,243,240,225,227, + 101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228, + 101,128, 30,248,245,115, 2, 34, 75, 34,113,226,233,103, 2, 34, + 83, 34, 94,227,249,242,233,236,236,233, 99,128, 4,106,233,239, + 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4, + 108,236,233,244,244,236,101, 2, 34,124, 34,135,227,249,242,233, + 236,236,233, 99,128, 4,102,233,239,244,233,230,233,229,228,227, + 249,242,233,236,236,233, 99,128, 4,104, 90,136, 0, 90, 34,174, + 34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97, 2, + 34,180, 34,191,225,242,237,229,238,233,225,110,128, 5, 54,227, + 245,244,101,128, 1,121, 99, 2, 34,204, 34,221,225,242,239,110, + 129, 1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99, + 2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120, + 128, 30,144,228,239,116,130, 1,123, 34,253, 35, 6,225,227,227, + 229,238,116,128, 1,123,226,229,236,239,119,128, 30,146,101, 3, + 35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128, 4, + 23,100, 2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227, + 249,242,233,236,236,233, 99,128, 4,152,233,229,242,229,243,233, + 243,227,249,242,233,236,236,233, 99,128, 4,222,244, 97,128, 3, + 150,232,101, 4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229, + 238,233,225,110,128, 5, 58,226,242,229,246,229,227,249,242,233, + 236,236,233, 99,128, 4,193,227,249,242,233,236,236,233, 99,128, + 4, 22,100, 2, 35,136, 35,155,229,243,227,229,238,228,229,242, + 227,249,242,233,236,236,233, 99,128, 4,150,233,229,242,229,243, + 233,243,227,249,242,233,236,236,233, 99,128, 4,220,236,233,238, + 229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225, + 227,101,128,255, 58,115, 2, 35,203, 35,210,237,225,236,108,128, + 247,122,244,242,239,235,101,128, 1,181, 97,149, 0, 97, 36, 8, + 36,144, 37, 35, 37,211, 38, 55, 38, 91, 45, 10, 45, 47, 45, 74, + 46, 43, 46, 81, 47,170, 47,242, 48,197, 48,206, 49, 79, 51, 87, + 52, 77, 52,124, 53, 19, 53, 33, 97, 7, 36, 24, 36, 34, 36, 41, + 36, 48, 36, 73, 36, 89, 36,100,226,229,238,231,225,236,105,128, + 9,134,227,245,244,101,128, 0,225,228,229,246, 97,128, 9, 6, + 231,117, 2, 36, 55, 36, 64,234,225,242,225,244,105,128, 10,134, + 242,237,245,235,232,105,128, 10, 6,237,225,244,242,225,231,245, + 242,237,245,235,232,105,128, 10, 62,242,245,243,241,245,225,242, + 101,128, 51, 3,246,239,247,229,236,243,233,231,110, 3, 36,116, + 36,126, 36,133,226,229,238,231,225,236,105,128, 9,190,228,229, + 246, 97,128, 9, 62,231,245,234,225,242,225,244,105,128, 10,190, + 98, 4, 36,154, 36,195, 36,204, 36,214,226,242,229,246,233,225, + 244,233,239,110, 2, 36,169, 36,184,237,225,242,235,225,242,237, + 229,238,233,225,110,128, 5, 95,243,233,231,238,228,229,246, 97, + 128, 9,112,229,238,231,225,236,105,128, 9,133,239,240,239,237, + 239,230,111,128, 49, 26,242,229,246,101,134, 1, 3, 36,233, 36, + 241, 36,252, 37, 7, 37, 15, 37, 27,225,227,245,244,101,128, 30, + 175,227,249,242,233,236,236,233, 99,128, 4,209,228,239,244,226, + 229,236,239,119,128, 30,183,231,242,225,246,101,128, 30,177,232, + 239,239,235,225,226,239,246,101,128, 30,179,244,233,236,228,101, + 128, 30,181, 99, 4, 37, 45, 37, 52, 37,131, 37,201,225,242,239, + 110,128, 1,206,233,242, 99, 2, 37, 60, 37, 65,236,101,128, 36, + 208,245,237,230,236,229,120,133, 0,226, 37, 84, 37, 92, 37,103, + 37,111, 37,123,225,227,245,244,101,128, 30,165,228,239,244,226, + 229,236,239,119,128, 30,173,231,242,225,246,101,128, 30,167,232, + 239,239,235,225,226,239,246,101,128, 30,169,244,233,236,228,101, + 128, 30,171,245,244,101,133, 0,180, 37,147, 37,158, 37,175, 37, + 182, 37,191,226,229,236,239,247,227,237, 98,128, 3, 23, 99, 2, + 37,164, 37,169,237, 98,128, 3, 1,239,237, 98,128, 3, 1,228, + 229,246, 97,128, 9, 84,236,239,247,237,239,100,128, 2,207,244, + 239,238,229,227,237, 98,128, 3, 65,249,242,233,236,236,233, 99, + 128, 4, 48,100, 5, 37,223, 37,233, 37,247, 37,253, 38, 31,226, + 236,231,242,225,246,101,128, 2, 1,228,225,235,231,245,242,237, + 245,235,232,105,128, 10,113,229,246, 97,128, 9, 5,233,229,242, + 229,243,233,115,130, 0,228, 38, 11, 38, 22,227,249,242,233,236, + 236,233, 99,128, 4,211,237,225,227,242,239,110,128, 1,223,239, + 116, 2, 38, 38, 38, 46,226,229,236,239,119,128, 30,161,237,225, + 227,242,239,110,128, 1,225,101,131, 0,230, 38, 65, 38, 73, 38, + 82,225,227,245,244,101,128, 1,253,235,239,242,229,225,110,128, + 49, 80,237,225,227,242,239,110,128, 1,227,230,233,105, 6, 38, + 107, 38,127, 41, 64, 41, 70, 41, 85, 44,185, 48, 2, 38,113, 38, + 120,176,178,176, 56,128, 32, 21,184,185,180, 49,128, 32,164,177, + 48, 3, 38,136, 40,160, 41, 39, 48, 9, 38,156, 38,176, 38,238, + 39, 44, 39,106, 39,168, 39,230, 40, 36, 40, 98, 49, 3, 38,164, + 38,168, 38,172, 55,128, 4, 16, 56,128, 4, 17, 57,128, 4, 18, + 50, 10, 38,198, 38,202, 38,206, 38,210, 38,214, 38,218, 38,222, + 38,226, 38,230, 38,234, 48,128, 4, 19, 49,128, 4, 20, 50,128, + 4, 21, 51,128, 4, 1, 52,128, 4, 22, 53,128, 4, 23, 54,128, + 4, 24, 55,128, 4, 25, 56,128, 4, 26, 57,128, 4, 27, 51, 10, + 39, 4, 39, 8, 39, 12, 39, 16, 39, 20, 39, 24, 39, 28, 39, 32, + 39, 36, 39, 40, 48,128, 4, 28, 49,128, 4, 29, 50,128, 4, 30, + 51,128, 4, 31, 52,128, 4, 32, 53,128, 4, 33, 54,128, 4, 34, + 55,128, 4, 35, 56,128, 4, 36, 57,128, 4, 37, 52, 10, 39, 66, + 39, 70, 39, 74, 39, 78, 39, 82, 39, 86, 39, 90, 39, 94, 39, 98, + 39,102, 48,128, 4, 38, 49,128, 4, 39, 50,128, 4, 40, 51,128, + 4, 41, 52,128, 4, 42, 53,128, 4, 43, 54,128, 4, 44, 55,128, + 4, 45, 56,128, 4, 46, 57,128, 4, 47, 53, 10, 39,128, 39,132, + 39,136, 39,140, 39,144, 39,148, 39,152, 39,156, 39,160, 39,164, + 48,128, 4,144, 49,128, 4, 2, 50,128, 4, 3, 51,128, 4, 4, + 52,128, 4, 5, 53,128, 4, 6, 54,128, 4, 7, 55,128, 4, 8, + 56,128, 4, 9, 57,128, 4, 10, 54, 10, 39,190, 39,194, 39,198, + 39,202, 39,206, 39,210, 39,214, 39,218, 39,222, 39,226, 48,128, + 4, 11, 49,128, 4, 12, 50,128, 4, 14, 51,128,246,196, 52,128, + 246,197, 53,128, 4, 48, 54,128, 4, 49, 55,128, 4, 50, 56,128, + 4, 51, 57,128, 4, 52, 55, 10, 39,252, 40, 0, 40, 4, 40, 8, + 40, 12, 40, 16, 40, 20, 40, 24, 40, 28, 40, 32, 48,128, 4, 53, + 49,128, 4, 81, 50,128, 4, 54, 51,128, 4, 55, 52,128, 4, 56, + 53,128, 4, 57, 54,128, 4, 58, 55,128, 4, 59, 56,128, 4, 60, + 57,128, 4, 61, 56, 10, 40, 58, 40, 62, 40, 66, 40, 70, 40, 74, + 40, 78, 40, 82, 40, 86, 40, 90, 40, 94, 48,128, 4, 62, 49,128, + 4, 63, 50,128, 4, 64, 51,128, 4, 65, 52,128, 4, 66, 53,128, + 4, 67, 54,128, 4, 68, 55,128, 4, 69, 56,128, 4, 70, 57,128, + 4, 71, 57, 10, 40,120, 40,124, 40,128, 40,132, 40,136, 40,140, + 40,144, 40,148, 40,152, 40,156, 48,128, 4, 72, 49,128, 4, 73, + 50,128, 4, 74, 51,128, 4, 75, 52,128, 4, 76, 53,128, 4, 77, + 54,128, 4, 78, 55,128, 4, 79, 56,128, 4,145, 57,128, 4, 82, + 49, 4, 40,170, 40,232, 40,237, 41, 7, 48, 10, 40,192, 40,196, + 40,200, 40,204, 40,208, 40,212, 40,216, 40,220, 40,224, 40,228, + 48,128, 4, 83, 49,128, 4, 84, 50,128, 4, 85, 51,128, 4, 86, + 52,128, 4, 87, 53,128, 4, 88, 54,128, 4, 89, 55,128, 4, 90, + 56,128, 4, 91, 57,128, 4, 92,177, 48,128, 4, 94, 52, 4, 40, + 247, 40,251, 40,255, 41, 3, 53,128, 4, 15, 54,128, 4, 98, 55, + 128, 4,114, 56,128, 4,116, 57, 5, 41, 19, 41, 23, 41, 27, 41, + 31, 41, 35, 50,128,246,198, 51,128, 4, 95, 52,128, 4, 99, 53, + 128, 4,115, 54,128, 4,117, 56, 2, 41, 45, 41, 59, 51, 2, 41, + 51, 41, 55, 49,128,246,199, 50,128,246,200,180, 54,128, 4,217, + 178,185, 57,128, 32, 14,179, 48, 2, 41, 77, 41, 81, 48,128, 32, + 15, 49,128, 32, 13,181, 55, 7, 41,102, 41,172, 42,237, 43, 58, + 44, 15, 44,108, 44,179, 51, 2, 41,108, 41,122, 56, 2, 41,114, + 41,118, 49,128, 6,106, 56,128, 6, 12, 57, 8, 41,140, 41,144, + 41,148, 41,152, 41,156, 41,160, 41,164, 41,168, 50,128, 6, 96, + 51,128, 6, 97, 52,128, 6, 98, 53,128, 6, 99, 54,128, 6,100, + 55,128, 6,101, 56,128, 6,102, 57,128, 6,103, 52, 7, 41,188, + 41,220, 42, 26, 42, 88, 42,120, 42,176, 42,232, 48, 5, 41,200, + 41,204, 41,208, 41,212, 41,216, 48,128, 6,104, 49,128, 6,105, + 51,128, 6, 27, 55,128, 6, 31, 57,128, 6, 33, 49, 10, 41,242, + 41,246, 41,250, 41,254, 42, 2, 42, 6, 42, 10, 42, 14, 42, 18, + 42, 22, 48,128, 6, 34, 49,128, 6, 35, 50,128, 6, 36, 51,128, + 6, 37, 52,128, 6, 38, 53,128, 6, 39, 54,128, 6, 40, 55,128, + 6, 41, 56,128, 6, 42, 57,128, 6, 43, 50, 10, 42, 48, 42, 52, + 42, 56, 42, 60, 42, 64, 42, 68, 42, 72, 42, 76, 42, 80, 42, 84, + 48,128, 6, 44, 49,128, 6, 45, 50,128, 6, 46, 51,128, 6, 47, + 52,128, 6, 48, 53,128, 6, 49, 54,128, 6, 50, 55,128, 6, 51, + 56,128, 6, 52, 57,128, 6, 53, 51, 5, 42,100, 42,104, 42,108, + 42,112, 42,116, 48,128, 6, 54, 49,128, 6, 55, 50,128, 6, 56, + 51,128, 6, 57, 52,128, 6, 58, 52, 9, 42,140, 42,144, 42,148, + 42,152, 42,156, 42,160, 42,164, 42,168, 42,172, 48,128, 6, 64, + 49,128, 6, 65, 50,128, 6, 66, 51,128, 6, 67, 52,128, 6, 68, + 53,128, 6, 69, 54,128, 6, 70, 56,128, 6, 72, 57,128, 6, 73, + 53, 9, 42,196, 42,200, 42,204, 42,208, 42,212, 42,216, 42,220, + 42,224, 42,228, 48,128, 6, 74, 49,128, 6, 75, 50,128, 6, 76, + 51,128, 6, 77, 52,128, 6, 78, 53,128, 6, 79, 54,128, 6, 80, + 55,128, 6, 81, 56,128, 6, 82,183, 48,128, 6, 71, 53, 3, 42, + 245, 43, 21, 43, 53, 48, 5, 43, 1, 43, 5, 43, 9, 43, 13, 43, + 17, 53,128, 6,164, 54,128, 6,126, 55,128, 6,134, 56,128, 6, + 152, 57,128, 6,175, 49, 5, 43, 33, 43, 37, 43, 41, 43, 45, 43, + 49, 49,128, 6,121, 50,128, 6,136, 51,128, 6,145, 52,128, 6, + 186, 57,128, 6,210,179, 52,128, 6,213, 54, 7, 43, 74, 43, 79, + 43, 84, 43, 89, 43,127, 43,189, 43,251,179, 54,128, 32,170,180, + 53,128, 5,190,181, 56,128, 5,195, 54, 6, 43,103, 43,107, 43, + 111, 43,115, 43,119, 43,123, 52,128, 5,208, 53,128, 5,209, 54, + 128, 5,210, 55,128, 5,211, 56,128, 5,212, 57,128, 5,213, 55, + 10, 43,149, 43,153, 43,157, 43,161, 43,165, 43,169, 43,173, 43, + 177, 43,181, 43,185, 48,128, 5,214, 49,128, 5,215, 50,128, 5, + 216, 51,128, 5,217, 52,128, 5,218, 53,128, 5,219, 54,128, 5, + 220, 55,128, 5,221, 56,128, 5,222, 57,128, 5,223, 56, 10, 43, + 211, 43,215, 43,219, 43,223, 43,227, 43,231, 43,235, 43,239, 43, + 243, 43,247, 48,128, 5,224, 49,128, 5,225, 50,128, 5,226, 51, + 128, 5,227, 52,128, 5,228, 53,128, 5,229, 54,128, 5,230, 55, + 128, 5,231, 56,128, 5,232, 57,128, 5,233, 57, 3, 44, 3, 44, + 7, 44, 11, 48,128, 5,234, 52,128,251, 42, 53,128,251, 43, 55, + 4, 44, 25, 44, 39, 44, 59, 44, 64, 48, 2, 44, 31, 44, 35, 48, + 128,251, 75, 53,128,251, 31, 49, 3, 44, 47, 44, 51, 44, 55, 54, + 128, 5,240, 55,128, 5,241, 56,128, 5,242,178, 51,128,251, 53, + 57, 7, 44, 80, 44, 84, 44, 88, 44, 92, 44, 96, 44,100, 44,104, + 51,128, 5,180, 52,128, 5,181, 53,128, 5,182, 54,128, 5,187, + 55,128, 5,184, 56,128, 5,183, 57,128, 5,176, 56, 3, 44,116, + 44,160, 44,165, 48, 7, 44,132, 44,136, 44,140, 44,144, 44,148, + 44,152, 44,156, 48,128, 5,178, 49,128, 5,177, 50,128, 5,179, + 51,128, 5,194, 52,128, 5,193, 54,128, 5,185, 55,128, 5,188, + 179, 57,128, 5,189, 52, 2, 44,171, 44,175, 49,128, 5,191, 50, + 128, 5,192,185,178, 57,128, 2,188, 54, 3, 44,193, 44,252, 45, + 3, 49, 4, 44,203, 44,219, 44,225, 44,246, 50, 2, 44,209, 44, + 214,180, 56,128, 33, 5,184, 57,128, 33, 19,179,181, 50,128, 33, + 22,181, 55, 3, 44,234, 44,238, 44,242, 51,128, 32, 44, 52,128, + 32, 45, 53,128, 32, 46,182,182, 52,128, 32, 12,179,177,182, 55, + 128, 6,109,180,185,179, 55,128, 2,189,103, 2, 45, 16, 45, 23, + 242,225,246,101,128, 0,224,117, 2, 45, 29, 45, 38,234,225,242, + 225,244,105,128, 10,133,242,237,245,235,232,105,128, 10, 5,104, + 2, 45, 53, 45, 63,233,242,225,231,225,238, 97,128, 48, 66,239, + 239,235,225,226,239,246,101,128, 30,163,105, 7, 45, 90, 45,115, + 45,122, 45,134, 45,159, 45,175, 45,255, 98, 2, 45, 96, 45,105, + 229,238,231,225,236,105,128, 9,144,239,240,239,237,239,230,111, + 128, 49, 30,228,229,246, 97,128, 9, 16,229,227,249,242,233,236, + 236,233, 99,128, 4,213,231,117, 2, 45,141, 45,150,234,225,242, + 225,244,105,128, 10,144,242,237,245,235,232,105,128, 10, 16,237, + 225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 72,110, + 5, 45,187, 45,196, 45,210, 45,226, 45,241,225,242,225,226,233, + 99,128, 6, 57,230,233,238,225,236,225,242,225,226,233, 99,128, + 254,202,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 254,203,237,229,228,233,225,236,225,242,225,226,233, 99,128,254, + 204,246,229,242,244,229,228,226,242,229,246,101,128, 2, 3,246, + 239,247,229,236,243,233,231,110, 3, 46, 15, 46, 25, 46, 32,226, + 229,238,231,225,236,105,128, 9,200,228,229,246, 97,128, 9, 72, + 231,245,234,225,242,225,244,105,128, 10,200,107, 2, 46, 49, 46, + 73,225,244,225,235,225,238, 97,129, 48,162, 46, 61,232,225,236, + 230,247,233,228,244,104,128,255,113,239,242,229,225,110,128, 49, + 79,108, 3, 46, 89, 47,145, 47,154,101, 2, 46, 95, 47,140,102, + 136, 5,208, 46,115, 46,124, 46,139, 46,153, 46,242, 47, 0, 47, + 111, 47,125,225,242,225,226,233, 99,128, 6, 39,228,225,231,229, + 243,232,232,229,226,242,229,119,128,251, 48,230,233,238,225,236, + 225,242,225,226,233, 99,128,254,142,104, 2, 46,159, 46,234,225, + 237,250, 97, 2, 46,168, 46,201,225,226,239,246,101, 2, 46,178, + 46,187,225,242,225,226,233, 99,128, 6, 35,230,233,238,225,236, + 225,242,225,226,233, 99,128,254,132,226,229,236,239,119, 2, 46, + 211, 46,220,225,242,225,226,233, 99,128, 6, 37,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,136,229,226,242,229,119,128, + 5,208,236,225,237,229,228,232,229,226,242,229,119,128,251, 79, + 237, 97, 2, 47, 7, 47, 43,228,228,225,225,226,239,246,101, 2, + 47, 20, 47, 29,225,242,225,226,233, 99,128, 6, 34,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,130,235,243,245,242, 97, + 4, 47, 57, 47, 66, 47, 80, 47, 96,225,242,225,226,233, 99,128, + 6, 73,230,233,238,225,236,225,242,225,226,233, 99,128,254,240, + 233,238,233,244,233,225,236,225,242,225,226,233, 99,128,254,243, + 237,229,228,233,225,236,225,242,225,226,233, 99,128,254,244,240, + 225,244,225,232,232,229,226,242,229,119,128,251, 46,241,225,237, + 225,244,243,232,229,226,242,229,119,128,251, 47,240,104,128, 33, + 53,236,229,241,245,225,108,128, 34, 76,240,232, 97,129, 3,177, + 47,162,244,239,238,239,115,128, 3,172,109, 4, 47,180, 47,188, + 47,199, 47,233,225,227,242,239,110,128, 1, 1,239,238,239,243, + 240,225,227,101,128,255, 65,240,229,242,243,225,238,100,130, 0, + 38, 47,213, 47,225,237,239,238,239,243,240,225,227,101,128,255, + 6,243,237,225,236,108,128,247, 38,243,241,245,225,242,101,128, + 51,194,110, 4, 47,252, 48, 7, 48,129, 48,139,226,239,240,239, + 237,239,230,111,128, 49, 34,103, 4, 48, 17, 48, 28, 48, 42, 48, + 121,226,239,240,239,237,239,230,111,128, 49, 36,235,232,225,238, + 235,232,245,244,232,225,105,128, 14, 90,236,101,131, 34, 32, 48, + 53, 48,106, 48,113,226,242,225,227,235,229,116, 2, 48, 65, 48, + 85,236,229,230,116,129, 48, 8, 48, 74,246,229,242,244,233,227, + 225,108,128,254, 63,242,233,231,232,116,129, 48, 9, 48, 95,246, + 229,242,244,233,227,225,108,128,254, 64,236,229,230,116,128, 35, + 41,242,233,231,232,116,128, 35, 42,243,244,242,239,109,128, 33, + 43,239,244,229,236,229,233, 97,128, 3,135,117, 2, 48,145, 48, + 157,228,225,244,244,225,228,229,246, 97,128, 9, 82,243,246,225, + 242, 97, 3, 48,169, 48,179, 48,186,226,229,238,231,225,236,105, + 128, 9,130,228,229,246, 97,128, 9, 2,231,245,234,225,242,225, + 244,105,128, 10,130,239,231,239,238,229,107,128, 1, 5,112, 3, + 48,214, 48,238, 49, 12, 97, 2, 48,220, 48,232,225,244,239,243, + 241,245,225,242,101,128, 51, 0,242,229,110,128, 36,156,239,243, + 244,242,239,240,232,101, 2, 48,251, 49, 6,225,242,237,229,238, + 233,225,110,128, 5, 90,237,239,100,128, 2,188,112, 2, 49, 18, + 49, 23,236,101,128,248,255,242,111, 2, 49, 30, 49, 38,225,227, + 232,229,115,128, 34, 80,120, 2, 49, 44, 49, 64,229,241,245,225, + 108,129, 34, 72, 49, 54,239,242,233,237,225,231,101,128, 34, 82, + 233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 69,114, + 4, 49, 89, 49,116, 49,120, 49,165,225,229, 97, 2, 49, 97, 49, + 107,229,235,239,242,229,225,110,128, 49,142,235,239,242,229,225, + 110,128, 49,141, 99,128, 35, 18,105, 2, 49,126, 49,140,231,232, + 244,232,225,236,230,242,233,238,103,128, 30,154,238,103,130, 0, + 229, 49,149, 49,157,225,227,245,244,101,128, 1,251,226,229,236, + 239,119,128, 30, 1,242,239,119, 8, 49,185, 49,192, 50, 65, 50, + 131, 50,181, 50,236, 51, 3, 51, 78,226,239,244,104,128, 33,148, + 100, 3, 49,200, 49,239, 50, 30,225,243,104, 4, 49,212, 49,219, + 49,226, 49,234,228,239,247,110,128, 33,227,236,229,230,116,128, + 33,224,242,233,231,232,116,128, 33,226,245,112,128, 33,225,226, + 108, 5, 49,252, 50, 3, 50, 10, 50, 17, 50, 25,226,239,244,104, + 128, 33,212,228,239,247,110,128, 33,211,236,229,230,116,128, 33, + 208,242,233,231,232,116,128, 33,210,245,112,128, 33,209,239,247, + 110,131, 33,147, 50, 42, 50, 49, 50, 57,236,229,230,116,128, 33, + 153,242,233,231,232,116,128, 33,152,247,232,233,244,101,128, 33, + 233,104, 2, 50, 71, 50,122,229,225,100, 4, 50, 83, 50, 93, 50, + 103, 50,114,228,239,247,238,237,239,100,128, 2,197,236,229,230, + 244,237,239,100,128, 2,194,242,233,231,232,244,237,239,100,128, + 2,195,245,240,237,239,100,128, 2,196,239,242,233,250,229,120, + 128,248,231,236,229,230,116,131, 33,144, 50,144, 50,161, 50,173, + 228,226,108,129, 33,208, 50,152,243,244,242,239,235,101,128, 33, + 205,239,246,229,242,242,233,231,232,116,128, 33,198,247,232,233, + 244,101,128, 33,230,242,233,231,232,116,132, 33,146, 50,197, 50, + 209, 50,217, 50,228,228,226,236,243,244,242,239,235,101,128, 33, + 207,232,229,225,246,121,128, 39,158,239,246,229,242,236,229,230, + 116,128, 33,196,247,232,233,244,101,128, 33,232,244,225, 98, 2, + 50,244, 50,251,236,229,230,116,128, 33,228,242,233,231,232,116, + 128, 33,229,245,112,132, 33,145, 51, 16, 51, 44, 51, 62, 51, 70, + 100, 2, 51, 22, 51, 34,110,129, 33,149, 51, 28,226,243,101,128, + 33,168,239,247,238,226,225,243,101,128, 33,168,236,229,230,116, + 129, 33,150, 51, 53,239,230,228,239,247,110,128, 33,197,242,233, + 231,232,116,128, 33,151,247,232,233,244,101,128, 33,231,246,229, + 242,244,229,120,128,248,230,115, 5, 51, 99, 51,175, 51,220, 52, + 47, 52, 57, 99, 2, 51,105, 51,157,233,105, 2, 51,112, 51,135, + 227,233,242,227,245,109,129, 0, 94, 51,123,237,239,238,239,243, + 240,225,227,101,128,255, 62,244,233,236,228,101,129, 0,126, 51, + 145,237,239,238,239,243,240,225,227,101,128,255, 94,242,233,240, + 116,129, 2, 81, 51,166,244,245,242,238,229,100,128, 2, 82,237, + 225,236,108, 2, 51,184, 51,195,232,233,242,225,231,225,238, 97, + 128, 48, 65,235,225,244,225,235,225,238, 97,129, 48,161, 51,208, + 232,225,236,230,247,233,228,244,104,128,255,103,244,229,242,233, + 115, 2, 51,230, 52, 43,107,131, 0, 42, 51,240, 52, 12, 52, 35, + 97, 2, 51,246, 52, 4,236,244,239,238,229,225,242,225,226,233, + 99,128, 6,109,242,225,226,233, 99,128, 6,109,109, 2, 52, 18, + 52, 24,225,244,104,128, 34, 23,239,238,239,243,240,225,227,101, + 128,255, 10,243,237,225,236,108,128,254, 97,109,128, 32, 66,245, + 240,229,242,233,239,114,128,246,233,249,237,240,244,239,244,233, + 227,225,236,236,249,229,241,245,225,108,128, 34, 67,116,132, 0, + 64, 52, 89, 52, 96, 52,108, 52,116,233,236,228,101,128, 0,227, + 237,239,238,239,243,240,225,227,101,128,255, 32,243,237,225,236, + 108,128,254,107,245,242,238,229,100,128, 2, 80,117, 6, 52,138, + 52,163, 52,170, 52,195, 52,215, 52,231, 98, 2, 52,144, 52,153, + 229,238,231,225,236,105,128, 9,148,239,240,239,237,239,230,111, + 128, 49, 32,228,229,246, 97,128, 9, 20,231,117, 2, 52,177, 52, + 186,234,225,242,225,244,105,128, 10,148,242,237,245,235,232,105, + 128, 10, 20,236,229,238,231,244,232,237,225,242,235,226,229,238, + 231,225,236,105,128, 9,215,237,225,244,242,225,231,245,242,237, + 245,235,232,105,128, 10, 76,246,239,247,229,236,243,233,231,110, + 3, 52,247, 53, 1, 53, 8,226,229,238,231,225,236,105,128, 9, + 204,228,229,246, 97,128, 9, 76,231,245,234,225,242,225,244,105, + 128, 10,204,246,225,231,242,225,232,225,228,229,246, 97,128, 9, + 61,121, 2, 53, 39, 53, 51,226,225,242,237,229,238,233,225,110, + 128, 5, 97,233,110,130, 5,226, 53, 60, 53, 75,225,236,244,239, + 238,229,232,229,226,242,229,119,128,251, 32,232,229,226,242,229, + 119,128, 5,226, 98,144, 0, 98, 53,120, 53,255, 54, 10, 54, 19, + 54, 44, 55, 85, 55,147, 55,220, 57,146, 57,158, 57,201, 57,209, + 57,219, 59, 89, 59,113, 59,122, 97, 7, 53,136, 53,146, 53,170, + 53,177, 53,202, 53,226, 53,237,226,229,238,231,225,236,105,128, + 9,172,227,235,243,236,225,243,104,129, 0, 92, 53,158,237,239, + 238,239,243,240,225,227,101,128,255, 60,228,229,246, 97,128, 9, + 44,231,117, 2, 53,184, 53,193,234,225,242,225,244,105,128, 10, + 172,242,237,245,235,232,105,128, 10, 44,104, 2, 53,208, 53,218, + 233,242,225,231,225,238, 97,128, 48,112,244,244,232,225,105,128, + 14, 63,235,225,244,225,235,225,238, 97,128, 48,208,114,129, 0, + 124, 53,243,237,239,238,239,243,240,225,227,101,128,255, 92,226, + 239,240,239,237,239,230,111,128, 49, 5,227,233,242,227,236,101, + 128, 36,209,228,239,116, 2, 54, 27, 54, 36,225,227,227,229,238, + 116,128, 30, 3,226,229,236,239,119,128, 30, 5,101, 6, 54, 58, + 54, 79, 54,102, 54,244, 54,255, 55, 11,225,237,229,228,243,233, + 248,244,229,229,238,244,232,238,239,244,229,115,128, 38,108, 99, + 2, 54, 85, 54, 92,225,245,243,101,128, 34, 53,249,242,233,236, + 236,233, 99,128, 4, 49,104, 5, 54,114, 54,123, 54,137, 54,167, + 54,226,225,242,225,226,233, 99,128, 6, 40,230,233,238,225,236, + 225,242,225,226,233, 99,128,254,144,105, 2, 54,143, 54,158,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,145,242,225, + 231,225,238, 97,128, 48,121,237,101, 2, 54,174, 54,187,228,233, + 225,236,225,242,225,226,233, 99,128,254,146,229,237,105, 2, 54, + 195, 54,210,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 252,159,243,239,236,225,244,229,228,225,242,225,226,233, 99,128, + 252, 8,238,239,239,238,230,233,238,225,236,225,242,225,226,233, + 99,128,252,109,235,225,244,225,235,225,238, 97,128, 48,217,238, + 225,242,237,229,238,233,225,110,128, 5, 98,116,132, 5,209, 55, + 23, 55, 43, 55, 63, 55, 72, 97,129, 3,178, 55, 29,243,249,237, + 226,239,236,231,242,229,229,107,128, 3,208,228,225,231,229,243, + 104,129,251, 49, 55, 54,232,229,226,242,229,119,128,251, 49,232, + 229,226,242,229,119,128, 5,209,242,225,230,229,232,229,226,242, + 229,119,128,251, 76,104, 2, 55, 91, 55,141, 97, 3, 55, 99, 55, + 109, 55,116,226,229,238,231,225,236,105,128, 9,173,228,229,246, + 97,128, 9, 45,231,117, 2, 55,123, 55,132,234,225,242,225,244, + 105,128, 10,173,242,237,245,235,232,105,128, 10, 45,239,239,107, + 128, 2, 83,105, 5, 55,159, 55,170, 55,181, 55,195, 55,209,232, + 233,242,225,231,225,238, 97,128, 48,115,235,225,244,225,235,225, + 238, 97,128, 48,211,236,225,226,233,225,236,227,236,233,227,107, + 128, 2,152,238,228,233,231,245,242,237,245,235,232,105,128, 10, + 2,242,245,243,241,245,225,242,101,128, 51, 49,108, 3, 55,228, + 57,129, 57,140, 97, 2, 55,234, 57,124,227,107, 6, 55,249, 56, + 2, 56, 39, 56,188, 56,243, 57, 39,227,233,242,227,236,101,128, + 37,207,100, 2, 56, 8, 56, 17,233,225,237,239,238,100,128, 37, + 198,239,247,238,240,239,233,238,244,233,238,231,244,242,233,225, + 238,231,236,101,128, 37,188,108, 2, 56, 45, 56,148,101, 2, 56, + 51, 56, 87,230,244,240,239,233,238,244,233,238,103, 2, 56, 66, + 56, 76,240,239,233,238,244,229,114,128, 37,196,244,242,233,225, + 238,231,236,101,128, 37,192,238,244,233,227,245,236,225,242,226, + 242,225,227,235,229,116, 2, 56,107, 56,127,236,229,230,116,129, + 48, 16, 56,116,246,229,242,244,233,227,225,108,128,254, 59,242, + 233,231,232,116,129, 48, 17, 56,137,246,229,242,244,233,227,225, + 108,128,254, 60,239,247,229,114, 2, 56,157, 56,172,236,229,230, + 244,244,242,233,225,238,231,236,101,128, 37,227,242,233,231,232, + 244,244,242,233,225,238,231,236,101,128, 37,226,114, 2, 56,194, + 56,205,229,227,244,225,238,231,236,101,128, 37,172,233,231,232, + 244,240,239,233,238,244,233,238,103, 2, 56,222, 56,232,240,239, + 233,238,244,229,114,128, 37,186,244,242,233,225,238,231,236,101, + 128, 37,182,115, 3, 56,251, 57, 25, 57, 33,109, 2, 57, 1, 57, + 13,225,236,236,243,241,245,225,242,101,128, 37,170,233,236,233, + 238,231,230,225,227,101,128, 38, 59,241,245,225,242,101,128, 37, + 160,244,225,114,128, 38, 5,245,240,112, 2, 57, 47, 57, 85,229, + 114, 2, 57, 54, 57, 69,236,229,230,244,244,242,233,225,238,231, + 236,101,128, 37,228,242,233,231,232,244,244,242,233,225,238,231, + 236,101,128, 37,229,239,233,238,244,233,238,103, 2, 57, 97, 57, + 113,243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37, + 180,244,242,233,225,238,231,236,101,128, 37,178,238,107,128, 36, + 35,233,238,229,226,229,236,239,119,128, 30, 7,239,227,107,128, + 37,136,237,239,238,239,243,240,225,227,101,128,255, 66,111, 3, + 57,166, 57,179, 57,190,226,225,233,237,225,233,244,232,225,105, + 128, 14, 26,232,233,242,225,231,225,238, 97,128, 48,124,235,225, + 244,225,235,225,238, 97,128, 48,220,240,225,242,229,110,128, 36, + 157,241,243,241,245,225,242,101,128, 51,195,114, 4, 57,229, 58, + 223, 59, 40, 59, 79,225, 99, 2, 57,236, 58,130,101, 3, 57,244, + 57,249, 58, 61,229,120,128,248,244,236,229,230,116,133, 0,123, + 58, 10, 58, 15, 58, 37, 58, 45, 58, 50,226,116,128,248,243,109, + 2, 58, 21, 58, 26,233,100,128,248,242,239,238,239,243,240,225, + 227,101,128,255, 91,243,237,225,236,108,128,254, 91,244,112,128, + 248,241,246,229,242,244,233,227,225,108,128,254, 55,242,233,231, + 232,116,133, 0,125, 58, 79, 58, 84, 58,106, 58,114, 58,119,226, + 116,128,248,254,109, 2, 58, 90, 58, 95,233,100,128,248,253,239, + 238,239,243,240,225,227,101,128,255, 93,243,237,225,236,108,128, + 254, 92,244,112,128,248,252,246,229,242,244,233,227,225,108,128, + 254, 56,235,229,116, 2, 58,138, 58,180,236,229,230,116,132, 0, + 91, 58,153, 58,158, 58,163, 58,175,226,116,128,248,240,229,120, + 128,248,239,237,239,238,239,243,240,225,227,101,128,255, 59,244, + 112,128,248,238,242,233,231,232,116,132, 0, 93, 58,196, 58,201, + 58,206, 58,218,226,116,128,248,251,229,120,128,248,250,237,239, + 238,239,243,240,225,227,101,128,255, 61,244,112,128,248,249,229, + 246,101,131, 2,216, 58,235, 58,246, 58,252,226,229,236,239,247, + 227,237, 98,128, 3, 46,227,237, 98,128, 3, 6,233,238,246,229, + 242,244,229,100, 3, 59, 11, 59, 22, 59, 28,226,229,236,239,247, + 227,237, 98,128, 3, 47,227,237, 98,128, 3, 17,228,239,245,226, + 236,229,227,237, 98,128, 3, 97,233,228,231,101, 2, 59, 49, 59, + 60,226,229,236,239,247,227,237, 98,128, 3, 42,233,238,246,229, + 242,244,229,228,226,229,236,239,247,227,237, 98,128, 3, 58,239, + 235,229,238,226,225,114,128, 0,166,115, 2, 59, 95, 59,103,244, + 242,239,235,101,128, 1,128,245,240,229,242,233,239,114,128,246, + 234,244,239,240,226,225,114,128, 1,131,117, 3, 59,130, 59,141, + 59,152,232,233,242,225,231,225,238, 97,128, 48,118,235,225,244, + 225,235,225,238, 97,128, 48,214,236,108, 2, 59,159, 59,189,229, + 116,130, 32, 34, 59,168, 59,178,233,238,246,229,242,243,101,128, + 37,216,239,240,229,242,225,244,239,114,128, 34, 25,243,229,249, + 101,128, 37,206, 99,143, 0, 99, 59,230, 60,179, 60,190, 60,254, + 61, 29, 61,122, 63, 33, 64, 17, 64,117, 64,166, 67,158, 67,166, + 67,176, 67,188, 67,221, 97, 9, 59,250, 60, 5, 60, 15, 60, 22, + 60, 29, 60, 54, 60, 64, 60,116, 60,125,225,242,237,229,238,233, + 225,110,128, 5,110,226,229,238,231,225,236,105,128, 9,154,227, + 245,244,101,128, 1, 7,228,229,246, 97,128, 9, 26,231,117, 2, + 60, 36, 60, 45,234,225,242,225,244,105,128, 10,154,242,237,245, + 235,232,105,128, 10, 26,236,243,241,245,225,242,101,128, 51,136, + 238,228,242,225,226,233,238,228,117, 4, 60, 82, 60, 92, 60, 98, + 60,105,226,229,238,231,225,236,105,128, 9,129,227,237, 98,128, + 3, 16,228,229,246, 97,128, 9, 1,231,245,234,225,242,225,244, + 105,128, 10,129,240,243,236,239,227,107,128, 33,234,114, 3, 60, + 133, 60,139, 60,165,229,239,102,128, 33, 5,239,110,130, 2,199, + 60,148, 60,159,226,229,236,239,247,227,237, 98,128, 3, 44,227, + 237, 98,128, 3, 12,242,233,225,231,229,242,229,244,245,242,110, + 128, 33,181,226,239,240,239,237,239,230,111,128, 49, 24, 99, 4, + 60,200, 60,207, 60,226, 60,248,225,242,239,110,128, 1, 13,229, + 228,233,236,236, 97,129, 0,231, 60,218,225,227,245,244,101,128, + 30, 9,233,242, 99, 2, 60,234, 60,239,236,101,128, 36,210,245, + 237,230,236,229,120,128, 1, 9,245,242,108,128, 2, 85,100, 2, + 61, 4, 61, 20,239,116,129, 1, 11, 61, 11,225,227,227,229,238, + 116,128, 1, 11,243,241,245,225,242,101,128, 51,197,101, 2, 61, + 35, 61, 51,228,233,236,236, 97,129, 0,184, 61, 45,227,237, 98, + 128, 3, 39,238,116,132, 0,162, 61, 64, 61, 88, 61,100, 61,111, + 105, 2, 61, 70, 61, 78,231,242,225,228,101,128, 33, 3,238,230, + 229,242,233,239,114,128,246,223,237,239,238,239,243,240,225,227, + 101,128,255,224,239,236,228,243,244,249,236,101,128,247,162,243, + 245,240,229,242,233,239,114,128,246,224,104, 5, 61,134, 61,197, + 61,208, 62,136, 62,228, 97, 4, 61,144, 61,155, 61,165, 61,172, + 225,242,237,229,238,233,225,110,128, 5,121,226,229,238,231,225, + 236,105,128, 9,155,228,229,246, 97,128, 9, 27,231,117, 2, 61, + 179, 61,188,234,225,242,225,244,105,128, 10,155,242,237,245,235, + 232,105,128, 10, 27,226,239,240,239,237,239,230,111,128, 49, 20, + 101, 6, 61,222, 61,242, 62, 10, 62, 78, 62, 90, 62,111,225,226, + 235,232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, + 4,189, 99, 2, 61,248, 62, 0,235,237,225,242,107,128, 39, 19, + 249,242,233,236,236,233, 99,128, 4, 71,100, 2, 62, 16, 62, 60, + 229,243,227,229,238,228,229,114, 2, 62, 29, 62, 49,225,226,235, + 232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, 4, + 191,227,249,242,233,236,236,233, 99,128, 4,183,233,229,242,229, + 243,233,243,227,249,242,233,236,236,233, 99,128, 4,245,232,225, + 242,237,229,238,233,225,110,128, 5,115,235,232,225,235,225,243, + 243,233,225,238,227,249,242,233,236,236,233, 99,128, 4,204,246, + 229,242,244,233,227,225,236,243,244,242,239,235,229,227,249,242, + 233,236,236,233, 99,128, 4,185,105,129, 3,199, 62,142,229,245, + 227,104, 4, 62,155, 62,190, 62,205, 62,214, 97, 2, 62,161, 62, + 176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,119, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 23,227,233, + 242,227,236,229,235,239,242,229,225,110,128, 50,105,235,239,242, + 229,225,110,128, 49, 74,240,225,242,229,238,235,239,242,229,225, + 110,128, 50, 9,111, 2, 62,234, 63, 28,227,104, 3, 62,243, 63, + 9, 63, 19,225,110, 2, 62,250, 63, 2,231,244,232,225,105,128, + 14, 10,244,232,225,105,128, 14, 8,233,238,231,244,232,225,105, + 128, 14, 9,239,229,244,232,225,105,128, 14, 12,239,107,128, 1, + 136,105, 2, 63, 39, 63,141,229,245, 99, 5, 63, 53, 63, 88, 63, + 103, 63,112, 63,126, 97, 2, 63, 59, 63, 74,227,233,242,227,236, + 229,235,239,242,229,225,110,128, 50,118,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 22,227,233,242,227,236,229,235,239, + 242,229,225,110,128, 50,104,235,239,242,229,225,110,128, 49, 72, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 8,245,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 28,242, 99, 2, + 63,148, 63,243,236,101,132, 37,203, 63,161, 63,172, 63,177, 63, + 201,237,245,236,244,233,240,236,121,128, 34,151,239,116,128, 34, + 153,112, 2, 63,183, 63,189,236,245,115,128, 34,149,239,243,244, + 225,236,237,225,242,107,128, 48, 54,247,233,244,104, 2, 63,210, + 63,226,236,229,230,244,232,225,236,230,226,236,225,227,107,128, + 37,208,242,233,231,232,244,232,225,236,230,226,236,225,227,107, + 128, 37,209,245,237,230,236,229,120,130, 2,198, 64, 0, 64, 11, + 226,229,236,239,247,227,237, 98,128, 3, 45,227,237, 98,128, 3, + 2,108, 3, 64, 25, 64, 31, 64, 85,229,225,114,128, 35, 39,233, + 227,107, 4, 64, 43, 64, 54, 64, 63, 64, 73,225,236,246,229,239, + 236,225,114,128, 1,194,228,229,238,244,225,108,128, 1,192,236, + 225,244,229,242,225,108,128, 1,193,242,229,244,242,239,230,236, + 229,120,128, 1,195,245, 98,129, 38, 99, 64, 92,243,245,233,116, + 2, 64,101, 64,109,226,236,225,227,107,128, 38, 99,247,232,233, + 244,101,128, 38,103,109, 3, 64,125, 64,139, 64,150,227,245,226, + 229,228,243,241,245,225,242,101,128, 51,164,239,238,239,243,240, + 225,227,101,128,255, 67,243,241,245,225,242,229,228,243,241,245, + 225,242,101,128, 51,160,111, 8, 64,184, 64,195, 65, 26, 65,224, + 66,253, 67, 28, 67,135, 67,144,225,242,237,229,238,233,225,110, + 128, 5,129,236,239,110,131, 0, 58, 64,207, 64,232, 64,251,237, + 239,110, 2, 64,215, 64,223,229,244,225,242,121,128, 32,161,239, + 243,240,225,227,101,128,255, 26,115, 2, 64,238, 64,244,233,231, + 110,128, 32,161,237,225,236,108,128,254, 85,244,242,233,225,238, + 231,245,236,225,114, 2, 65, 10, 65, 20,232,225,236,230,237,239, + 100,128, 2,209,237,239,100,128, 2,208,109, 2, 65, 32, 65,217, + 237, 97,134, 0, 44, 65, 49, 65,113, 65,124, 65,136, 65,166, 65, + 189, 97, 3, 65, 57, 65, 83, 65, 91,226,239,246,101, 2, 65, 66, + 65, 72,227,237, 98,128, 3, 19,242,233,231,232,244,227,237, 98, + 128, 3, 21,227,227,229,238,116,128,246,195,114, 2, 65, 97, 65, + 104,225,226,233, 99,128, 6, 12,237,229,238,233,225,110,128, 5, + 93,233,238,230,229,242,233,239,114,128,246,225,237,239,238,239, + 243,240,225,227,101,128,255, 12,242,229,246,229,242,243,229,100, + 2, 65,149, 65,160,225,226,239,246,229,227,237, 98,128, 3, 20, + 237,239,100,128, 2,189,115, 2, 65,172, 65,179,237,225,236,108, + 128,254, 80,245,240,229,242,233,239,114,128,246,226,244,245,242, + 238,229,100, 2, 65,200, 65,211,225,226,239,246,229,227,237, 98, + 128, 3, 18,237,239,100,128, 2,187,240,225,243,115,128, 38, 60, + 110, 2, 65,230, 65,239,231,242,245,229,238,116,128, 34, 69,116, + 2, 65,245, 66, 3,239,245,242,233,238,244,229,231,242,225,108, + 128, 34, 46,242,239,108,142, 35, 3, 66, 37, 66, 43, 66, 58, 66, + 73, 66,117, 66,162, 66,176, 66,181, 66,186, 66,191, 66,197, 66, + 202, 66,243, 66,248,193,195, 75,128, 0, 6, 66, 2, 66, 49, 66, + 54,197, 76,128, 0, 7, 83,128, 0, 8, 67, 2, 66, 64, 66, 69, + 193, 78,128, 0, 24, 82,128, 0, 13, 68, 3, 66, 81, 66,107, 66, + 112, 67, 4, 66, 91, 66, 95, 66, 99, 66,103, 49,128, 0, 17, 50, + 128, 0, 18, 51,128, 0, 19, 52,128, 0, 20,197, 76,128, 0,127, + 204, 69,128, 0, 16, 69, 5, 66,129, 66,133, 66,138, 66,143, 66, + 148, 77,128, 0, 25,206, 81,128, 0, 5,207, 84,128, 0, 4,211, + 67,128, 0, 27, 84, 2, 66,154, 66,158, 66,128, 0, 23, 88,128, + 0, 3, 70, 2, 66,168, 66,172, 70,128, 0, 12, 83,128, 0, 28, + 199, 83,128, 0, 29,200, 84,128, 0, 9,204, 70,128, 0, 10,206, + 193, 75,128, 0, 21,210, 83,128, 0, 30, 83, 5, 66,214, 66,218, + 66,228, 66,233, 66,238, 73,128, 0, 15, 79,129, 0, 14, 66,224, + 84,128, 0, 2,212, 88,128, 0, 1,213, 66,128, 0, 26,217, 78, + 128, 0, 22,213, 83,128, 0, 31,214, 84,128, 0, 11,240,249,242, + 233,231,232,116,129, 0,169, 67, 9,115, 2, 67, 15, 67, 21,225, + 238,115,128,248,233,229,242,233,102,128,246,217,114, 2, 67, 34, + 67,118,238,229,242,226,242,225,227,235,229,116, 2, 67, 49, 67, + 83,236,229,230,116,130, 48, 12, 67, 60, 67, 72,232,225,236,230, + 247,233,228,244,104,128,255, 98,246,229,242,244,233,227,225,108, + 128,254, 65,242,233,231,232,116,130, 48, 13, 67, 95, 67,107,232, + 225,236,230,247,233,228,244,104,128,255, 99,246,229,242,244,233, + 227,225,108,128,254, 66,240,239,242,225,244,233,239,238,243,241, + 245,225,242,101,128, 51,127,243,241,245,225,242,101,128, 51,199, + 246,229,242,235,231,243,241,245,225,242,101,128, 51,198,240,225, + 242,229,110,128, 36,158,242,245,250,229,233,242,111,128, 32,162, + 243,244,242,229,244,227,232,229,100,128, 2,151,245,114, 2, 67, + 195, 67,213,236,121, 2, 67,202, 67,208,225,238,100,128, 34,207, + 239,114,128, 34,206,242,229,238,227,121,128, 0,164,249,114, 4, + 67,232, 67,240, 67,247, 67,255,194,242,229,246,101,128,246,209, + 198,236,229,120,128,246,210,226,242,229,246,101,128,246,212,230, + 236,229,120,128,246,213,100,146, 0,100, 68, 46, 69,184, 70,208, + 71, 12, 71,188, 72,142, 72,204, 73,133, 73,146, 73,155, 73,181, + 73,206, 73,215, 75, 26, 75, 34, 75, 45, 75, 65, 75, 93, 97, 11, + 68, 70, 68, 81, 68, 91, 68,163, 68,226, 68,237, 68,248, 69, 61, + 69,123, 69,129, 69,159,225,242,237,229,238,233,225,110,128, 5, + 100,226,229,238,231,225,236,105,128, 9,166,100, 5, 68,103, 68, + 112, 68,118, 68,132, 68,148,225,242,225,226,233, 99,128, 6, 54, + 229,246, 97,128, 9, 38,230,233,238,225,236,225,242,225,226,233, + 99,128,254,190,233,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,191,237,229,228,233,225,236,225,242,225,226,233, 99, + 128,254,192,103, 3, 68,171, 68,188, 68,202,229,243,104,129, 5, + 188, 68,179,232,229,226,242,229,119,128, 5,188,231,229,114,129, + 32, 32, 68,196,228,226,108,128, 32, 33,117, 2, 68,208, 68,217, + 234,225,242,225,244,105,128, 10,166,242,237,245,235,232,105,128, + 10, 38,232,233,242,225,231,225,238, 97,128, 48, 96,235,225,244, + 225,235,225,238, 97,128, 48,192,108, 3, 69, 0, 69, 9, 69, 47, + 225,242,225,226,233, 99,128, 6, 47,229,116,130, 5,211, 69, 18, + 69, 38,228,225,231,229,243,104,129,251, 51, 69, 29,232,229,226, + 242,229,119,128,251, 51,232,229,226,242,229,119,128, 5,211,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,170,237,237, 97, + 3, 69, 71, 69, 80, 69, 92,225,242,225,226,233, 99,128, 6, 79, + 236,239,247,225,242,225,226,233, 99,128, 6, 79,244,225,238, 97, + 2, 69,101, 69,115,236,244,239,238,229,225,242,225,226,233, 99, + 128, 6, 76,242,225,226,233, 99,128, 6, 76,238,228, 97,128, 9, + 100,242,231, 97, 2, 69,137, 69,146,232,229,226,242,229,119,128, + 5,167,236,229,230,244,232,229,226,242,229,119,128, 5,167,243, + 233,225,240,238,229,245,237,225,244,225,227,249,242,233,236,236, + 233,227,227,237, 98,128, 4,133, 98, 3, 69,192, 70,189, 70,199, + 108, 9, 69,212, 69,220, 70, 77, 70, 85, 70,101, 70,112, 70,130, + 70,144, 70,155,199,242,225,246,101,128,246,211, 97, 2, 69,226, + 70, 27,238,231,236,229,226,242,225,227,235,229,116, 2, 69,242, + 70, 6,236,229,230,116,129, 48, 10, 69,251,246,229,242,244,233, + 227,225,108,128,254, 61,242,233,231,232,116,129, 48, 11, 70, 16, + 246,229,242,244,233,227,225,108,128,254, 62,114, 2, 70, 33, 70, + 54,227,232,233,238,246,229,242,244,229,228,226,229,236,239,247, + 227,237, 98,128, 3, 43,242,239,119, 2, 70, 62, 70, 69,236,229, + 230,116,128, 33,212,242,233,231,232,116,128, 33,210,228,225,238, + 228, 97,128, 9,101,231,242,225,246,101,129,246,214, 70, 95,227, + 237, 98,128, 3, 15,233,238,244,229,231,242,225,108,128, 34, 44, + 236,239,247,236,233,238,101,129, 32, 23, 70,124,227,237, 98,128, + 3, 51,239,246,229,242,236,233,238,229,227,237, 98,128, 3, 63, + 240,242,233,237,229,237,239,100,128, 2,186,246,229,242,244,233, + 227,225,108, 2, 70,168, 70,174,226,225,114,128, 32, 22,236,233, + 238,229,225,226,239,246,229,227,237, 98,128, 3, 14,239,240,239, + 237,239,230,111,128, 49, 9,243,241,245,225,242,101,128, 51,200, + 99, 4, 70,218, 70,225, 70,234, 71, 5,225,242,239,110,128, 1, + 15,229,228,233,236,236, 97,128, 30, 17,233,242, 99, 2, 70,242, + 70,247,236,101,128, 36,211,245,237,230,236,229,248,226,229,236, + 239,119,128, 30, 19,242,239,225,116,128, 1, 17,100, 4, 71, 22, + 71,103, 71,113, 71,164, 97, 4, 71, 32, 71, 42, 71, 49, 71, 74, + 226,229,238,231,225,236,105,128, 9,161,228,229,246, 97,128, 9, + 33,231,117, 2, 71, 56, 71, 65,234,225,242,225,244,105,128, 10, + 161,242,237,245,235,232,105,128, 10, 33,108, 2, 71, 80, 71, 89, + 225,242,225,226,233, 99,128, 6,136,230,233,238,225,236,225,242, + 225,226,233, 99,128,251,137,228,232,225,228,229,246, 97,128, 9, + 92,232, 97, 3, 71,122, 71,132, 71,139,226,229,238,231,225,236, + 105,128, 9,162,228,229,246, 97,128, 9, 34,231,117, 2, 71,146, + 71,155,234,225,242,225,244,105,128, 10,162,242,237,245,235,232, + 105,128, 10, 34,239,116, 2, 71,171, 71,180,225,227,227,229,238, + 116,128, 30, 11,226,229,236,239,119,128, 30, 13,101, 8, 71,206, + 72, 3, 72, 10, 72, 35, 72, 45, 72, 56, 72,101, 72,137, 99, 2, + 71,212, 71,249,233,237,225,236,243,229,240,225,242,225,244,239, + 114, 2, 71,230, 71,239,225,242,225,226,233, 99,128, 6,107,240, + 229,242,243,233,225,110,128, 6,107,249,242,233,236,236,233, 99, + 128, 4, 52,231,242,229,101,128, 0,176,232,105, 2, 72, 17, 72, + 26,232,229,226,242,229,119,128, 5,173,242,225,231,225,238, 97, + 128, 48,103,233,227,239,240,244,233, 99,128, 3,239,235,225,244, + 225,235,225,238, 97,128, 48,199,108, 2, 72, 62, 72, 85,229,244, + 101, 2, 72, 70, 72, 77,236,229,230,116,128, 35, 43,242,233,231, + 232,116,128, 35, 38,244, 97,129, 3,180, 72, 92,244,245,242,238, + 229,100,128, 1,141,238,239,237,233,238,225,244,239,242,237,233, + 238,245,243,239,238,229,238,245,237,229,242,225,244,239,242,226, + 229,238,231,225,236,105,128, 9,248,250,104,128, 2,164,104, 2, + 72,148, 72,198, 97, 3, 72,156, 72,166, 72,173,226,229,238,231, + 225,236,105,128, 9,167,228,229,246, 97,128, 9, 39,231,117, 2, + 72,180, 72,189,234,225,242,225,244,105,128, 10,167,242,237,245, + 235,232,105,128, 10, 39,239,239,107,128, 2, 87,105, 6, 72,218, + 73, 11, 73, 71, 73, 82, 73, 93, 73,103, 97, 2, 72,224, 72,246, + 236,249,244,233,235,225,244,239,238,239,115,129, 3,133, 72,240, + 227,237, 98,128, 3, 68,237,239,238,100,129, 38,102, 72,255,243, + 245,233,244,247,232,233,244,101,128, 38, 98,229,242,229,243,233, + 115,133, 0,168, 73, 30, 73, 38, 73, 49, 73, 55, 73, 63,225,227, + 245,244,101,128,246,215,226,229,236,239,247,227,237, 98,128, 3, + 36,227,237, 98,128, 3, 8,231,242,225,246,101,128,246,216,244, + 239,238,239,115,128, 3,133,232,233,242,225,231,225,238, 97,128, + 48, 98,235,225,244,225,235,225,238, 97,128, 48,194,244,244,239, + 237,225,242,107,128, 48, 3,246,105, 2, 73,110, 73,121,228,101, + 129, 0,247, 73,117,115,128, 34, 35,243,233,239,238,243,236,225, + 243,104,128, 34, 21,234,229,227,249,242,233,236,236,233, 99,128, + 4, 82,235,243,232,225,228,101,128, 37,147,108, 2, 73,161, 73, + 172,233,238,229,226,229,236,239,119,128, 30, 15,243,241,245,225, + 242,101,128, 51,151,109, 2, 73,187, 73,195,225,227,242,239,110, + 128, 1, 17,239,238,239,243,240,225,227,101,128,255, 68,238,226, + 236,239,227,107,128, 37,132,111, 10, 73,237, 73,249, 74, 3, 74, + 14, 74, 25, 74, 97, 74,102, 74,113, 74,228, 74,254,227,232,225, + 228,225,244,232,225,105,128, 14, 14,228,229,235,244,232,225,105, + 128, 14, 20,232,233,242,225,231,225,238, 97,128, 48,105,235,225, + 244,225,235,225,238, 97,128, 48,201,236,236,225,114,132, 0, 36, + 74, 40, 74, 51, 74, 63, 74, 74,233,238,230,229,242,233,239,114, + 128,246,227,237,239,238,239,243,240,225,227,101,128,255, 4,239, + 236,228,243,244,249,236,101,128,247, 36,115, 2, 74, 80, 74, 87, + 237,225,236,108,128,254,105,245,240,229,242,233,239,114,128,246, + 228,238,103,128, 32,171,242,245,243,241,245,225,242,101,128, 51, + 38,116, 6, 74,127, 74,144, 74,166, 74,177, 74,209, 74,216,225, + 227,227,229,238,116,129, 2,217, 74,138,227,237, 98,128, 3, 7, + 226,229,236,239,247, 99, 2, 74,155, 74,160,237, 98,128, 3, 35, + 239,237, 98,128, 3, 35,235,225,244,225,235,225,238, 97,128, 48, + 251,236,229,243,115, 2, 74,186, 74,190,105,128, 1, 49,106,129, + 246,190, 74,196,243,244,242,239,235,229,232,239,239,107,128, 2, + 132,237,225,244,104,128, 34,197,244,229,228,227,233,242,227,236, + 101,128, 37,204,245,226,236,229,249,239,228,240,225,244,225,104, + 129,251, 31, 74,245,232,229,226,242,229,119,128,251, 31,247,238, + 244,225,227,107, 2, 75, 9, 75, 20,226,229,236,239,247,227,237, + 98,128, 3, 30,237,239,100,128, 2,213,240,225,242,229,110,128, + 36,159,243,245,240,229,242,233,239,114,128,246,235,116, 2, 75, + 51, 75, 57,225,233,108,128, 2, 86,239,240,226,225,114,128, 1, + 140,117, 2, 75, 71, 75, 82,232,233,242,225,231,225,238, 97,128, + 48,101,235,225,244,225,235,225,238, 97,128, 48,197,122,132, 1, + 243, 75,105, 75,114, 75,133, 75,170,225,236,244,239,238,101,128, + 2,163, 99, 2, 75,120, 75,127,225,242,239,110,128, 1,198,245, + 242,108,128, 2,165,101, 2, 75,139, 75,159,225,226,235,232,225, + 243,233,225,238,227,249,242,233,236,236,233, 99,128, 4,225,227, + 249,242,233,236,236,233, 99,128, 4, 85,232,229,227,249,242,233, + 236,236,233, 99,128, 4, 95,101,151, 0,101, 75,233, 75,252, 76, + 30, 77, 4, 77, 66, 77, 99, 77,111, 77,134, 77,187, 79, 43, 79, + 101, 79,203, 80, 63, 80,198, 81, 17, 81, 48, 81,110, 81,163, 82, + 98, 82,231, 82,251, 83, 39, 83,130, 97, 2, 75,239, 75,246,227, + 245,244,101,128, 0,233,242,244,104,128, 38, 65, 98, 3, 76, 4, + 76, 13, 76, 23,229,238,231,225,236,105,128, 9,143,239,240,239, + 237,239,230,111,128, 49, 28,242,229,246,101,128, 1, 21, 99, 5, + 76, 42, 76,115, 76,129, 76,161, 76,250, 97, 2, 76, 48, 76,109, + 238,228,242, 97, 3, 76, 59, 76, 66, 76, 77,228,229,246, 97,128, + 9, 13,231,245,234,225,242,225,244,105,128, 10,141,246,239,247, + 229,236,243,233,231,110, 2, 76, 91, 76, 98,228,229,246, 97,128, + 9, 69,231,245,234,225,242,225,244,105,128, 10,197,242,239,110, + 128, 1, 27,229,228,233,236,236,225,226,242,229,246,101,128, 30, + 29,104, 2, 76,135, 76,146,225,242,237,229,238,233,225,110,128, + 5,101,249,233,247,238,225,242,237,229,238,233,225,110,128, 5, + 135,233,242, 99, 2, 76,169, 76,174,236,101,128, 36,212,245,237, + 230,236,229,120,134, 0,234, 76,195, 76,203, 76,211, 76,222, 76, + 230, 76,242,225,227,245,244,101,128, 30,191,226,229,236,239,119, + 128, 30, 25,228,239,244,226,229,236,239,119,128, 30,199,231,242, + 225,246,101,128, 30,193,232,239,239,235,225,226,239,246,101,128, + 30,195,244,233,236,228,101,128, 30,197,249,242,233,236,236,233, + 99,128, 4, 84,100, 4, 77, 14, 77, 24, 77, 30, 77, 40,226,236, + 231,242,225,246,101,128, 2, 5,229,246, 97,128, 9, 15,233,229, + 242,229,243,233,115,128, 0,235,239,116,130, 1, 23, 77, 49, 77, + 58,225,227,227,229,238,116,128, 1, 23,226,229,236,239,119,128, + 30,185,101, 2, 77, 72, 77, 83,231,245,242,237,245,235,232,105, + 128, 10, 15,237,225,244,242,225,231,245,242,237,245,235,232,105, + 128, 10, 71,230,227,249,242,233,236,236,233, 99,128, 4, 68,103, + 2, 77,117, 77,124,242,225,246,101,128, 0,232,245,234,225,242, + 225,244,105,128, 10,143,104, 4, 77,144, 77,155, 77,166, 77,176, + 225,242,237,229,238,233,225,110,128, 5,103,226,239,240,239,237, + 239,230,111,128, 49, 29,233,242,225,231,225,238, 97,128, 48, 72, + 239,239,235,225,226,239,246,101,128, 30,187,105, 4, 77,197, 77, + 208, 79, 10, 79, 25,226,239,240,239,237,239,230,111,128, 49, 31, + 231,232,116,142, 0, 56, 77,242, 77,251, 78, 5, 78, 35, 78, 42, + 78, 80, 78,105, 78,150, 78,184, 78,196, 78,207, 78,240, 78,248, + 79, 3,225,242,225,226,233, 99,128, 6,104,226,229,238,231,225, + 236,105,128, 9,238,227,233,242,227,236,101,129, 36,103, 78, 16, + 233,238,246,229,242,243,229,243,225,238,243,243,229,242,233,102, + 128, 39,145,228,229,246, 97,128, 9,110,229,229,110, 2, 78, 50, + 78, 59,227,233,242,227,236,101,128, 36,113,112, 2, 78, 65, 78, + 72,225,242,229,110,128, 36,133,229,242,233,239,100,128, 36,153, + 231,117, 2, 78, 87, 78, 96,234,225,242,225,244,105,128, 10,238, + 242,237,245,235,232,105,128, 10,110,104, 2, 78,111, 78,137, 97, + 2, 78,117, 78,128,227,235,225,242,225,226,233, 99,128, 6,104, + 238,231,250,232,239,117,128, 48, 40,238,239,244,229,226,229,225, + 237,229,100,128, 38,107,105, 2, 78,156, 78,174,228,229,239,231, + 242,225,240,232,233,227,240,225,242,229,110,128, 50, 39,238,230, + 229,242,233,239,114,128, 32,136,237,239,238,239,243,240,225,227, + 101,128,255, 24,239,236,228,243,244,249,236,101,128,247, 56,112, + 2, 78,213, 78,220,225,242,229,110,128, 36,123,229,114, 2, 78, + 227, 78,233,233,239,100,128, 36,143,243,233,225,110,128, 6,248, + 242,239,237,225,110,128, 33,119,243,245,240,229,242,233,239,114, + 128, 32,120,244,232,225,105,128, 14, 88,238,246,229,242,244,229, + 228,226,242,229,246,101,128, 2, 7,239,244,233,230,233,229,228, + 227,249,242,233,236,236,233, 99,128, 4,101,107, 2, 79, 49, 79, + 73,225,244,225,235,225,238, 97,129, 48,168, 79, 61,232,225,236, + 230,247,233,228,244,104,128,255,116,111, 2, 79, 79, 79, 94,238, + 235,225,242,231,245,242,237,245,235,232,105,128, 10,116,242,229, + 225,110,128, 49, 84,108, 3, 79,109, 79,120, 79,181,227,249,242, + 233,236,236,233, 99,128, 4, 59,101, 2, 79,126, 79,133,237,229, + 238,116,128, 34, 8,246,229,110, 3, 79,143, 79,152, 79,173,227, + 233,242,227,236,101,128, 36,106,112, 2, 79,158, 79,165,225,242, + 229,110,128, 36,126,229,242,233,239,100,128, 36,146,242,239,237, + 225,110,128, 33,122,236,233,240,243,233,115,129, 32, 38, 79,192, + 246,229,242,244,233,227,225,108,128, 34,238,109, 5, 79,215, 79, + 243, 79,254, 80, 18, 80, 29,225,227,242,239,110,130, 1, 19, 79, + 227, 79,235,225,227,245,244,101,128, 30, 23,231,242,225,246,101, + 128, 30, 21,227,249,242,233,236,236,233, 99,128, 4, 60,228,225, + 243,104,129, 32, 20, 80, 7,246,229,242,244,233,227,225,108,128, + 254, 49,239,238,239,243,240,225,227,101,128,255, 69,112, 2, 80, + 35, 80, 55,232,225,243,233,243,237,225,242,235,225,242,237,229, + 238,233,225,110,128, 5, 91,244,249,243,229,116,128, 34, 5,110, + 6, 80, 77, 80, 88, 80, 99, 80,143, 80,175, 80,190,226,239,240, + 239,237,239,230,111,128, 49, 35,227,249,242,233,236,236,233, 99, + 128, 4, 61,100, 2, 80,105, 80,124,225,243,104,129, 32, 19, 80, + 113,246,229,242,244,233,227,225,108,128,254, 50,229,243,227,229, + 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,163,103, + 130, 1, 75, 80,151, 80,162,226,239,240,239,237,239,230,111,128, + 49, 37,232,229,227,249,242,233,236,236,233, 99,128, 4,165,232, + 239,239,235,227,249,242,233,236,236,233, 99,128, 4,200,243,240, + 225,227,101,128, 32, 2,111, 3, 80,206, 80,214, 80,223,231,239, + 238,229,107,128, 1, 25,235,239,242,229,225,110,128, 49, 83,240, + 229,110,130, 2, 91, 80,233, 80,242,227,236,239,243,229,100,128, + 2,154,242,229,246,229,242,243,229,100,130, 2, 92, 81, 1, 81, + 10,227,236,239,243,229,100,128, 2, 94,232,239,239,107,128, 2, + 93,112, 2, 81, 23, 81, 30,225,242,229,110,128, 36,160,243,233, + 236,239,110,129, 3,181, 81, 40,244,239,238,239,115,128, 3,173, + 241,117, 2, 81, 55, 81, 99,225,108,130, 0, 61, 81, 64, 81, 76, + 237,239,238,239,243,240,225,227,101,128,255, 29,115, 2, 81, 82, + 81, 89,237,225,236,108,128,254,102,245,240,229,242,233,239,114, + 128, 32,124,233,246,225,236,229,238,227,101,128, 34, 97,114, 3, + 81,118, 81,129, 81,140,226,239,240,239,237,239,230,111,128, 49, + 38,227,249,242,233,236,236,233, 99,128, 4, 64,229,246,229,242, + 243,229,100,129, 2, 88, 81,152,227,249,242,233,236,236,233, 99, + 128, 4, 77,115, 6, 81,177, 81,188, 81,208, 82, 33, 82, 78, 82, + 88,227,249,242,233,236,236,233, 99,128, 4, 65,228,229,243,227, + 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,171, + 104,132, 2,131, 81,220, 81,227, 82, 2, 82, 17,227,245,242,108, + 128, 2,134,239,242,116, 2, 81,235, 81,242,228,229,246, 97,128, + 9, 14,246,239,247,229,236,243,233,231,238,228,229,246, 97,128, + 9, 70,242,229,246,229,242,243,229,228,236,239,239,112,128, 1, + 170,243,241,245,225,244,242,229,246,229,242,243,229,100,128, 2, + 133,237,225,236,108, 2, 82, 42, 82, 53,232,233,242,225,231,225, + 238, 97,128, 48, 71,235,225,244,225,235,225,238, 97,129, 48,167, + 82, 66,232,225,236,230,247,233,228,244,104,128,255,106,244,233, + 237,225,244,229,100,128, 33, 46,245,240,229,242,233,239,114,128, + 246,236,116, 5, 82,110, 82,136, 82,140, 82,157, 82,223, 97,130, + 3,183, 82,118, 82,128,242,237,229,238,233,225,110,128, 5,104, + 244,239,238,239,115,128, 3,174,104,128, 0,240,233,236,228,101, + 129, 30,189, 82,149,226,229,236,239,119,128, 30, 27,238,225,232, + 244, 97, 3, 82,169, 82,201, 82,210,230,239,245,235,104, 2, 82, + 179, 82,188,232,229,226,242,229,119,128, 5,145,236,229,230,244, + 232,229,226,242,229,119,128, 5,145,232,229,226,242,229,119,128, + 5,145,236,229,230,244,232,229,226,242,229,119,128, 5,145,245, + 242,238,229,100,128, 1,221,117, 2, 82,237, 82,246,235,239,242, + 229,225,110,128, 49, 97,242,111,128, 32,172,246,239,247,229,236, + 243,233,231,110, 3, 83, 11, 83, 21, 83, 28,226,229,238,231,225, + 236,105,128, 9,199,228,229,246, 97,128, 9, 71,231,245,234,225, + 242,225,244,105,128, 10,199,120, 2, 83, 45, 83,118,227,236,225, + 109,132, 0, 33, 83, 60, 83, 71, 83, 98, 83,110,225,242,237,229, + 238,233,225,110,128, 5, 92,100, 2, 83, 77, 83, 82,226,108,128, + 32, 60,239,247,110,129, 0,161, 83, 90,243,237,225,236,108,128, + 247,161,237,239,238,239,243,240,225,227,101,128,255, 1,243,237, + 225,236,108,128,247, 33,233,243,244,229,238,244,233,225,108,128, + 34, 3,250,104,131, 2,146, 83,141, 83,160, 83,171, 99, 2, 83, + 147, 83,154,225,242,239,110,128, 1,239,245,242,108,128, 2,147, + 242,229,246,229,242,243,229,100,128, 1,185,244,225,233,108,128, + 1,186,102,140, 0,102, 83,206, 84, 32, 84, 43, 84, 52, 84, 64, + 84,167, 84,183, 86,191, 86,204, 86,230, 88,107, 88,115, 97, 4, + 83,216, 83,223, 83,234, 83,245,228,229,246, 97,128, 9, 94,231, + 245,242,237,245,235,232,105,128, 10, 94,232,242,229,238,232,229, + 233,116,128, 33, 9,244,232, 97, 3, 83,255, 84, 8, 84, 20,225, + 242,225,226,233, 99,128, 6, 78,236,239,247,225,242,225,226,233, + 99,128, 6, 78,244,225,238,225,242,225,226,233, 99,128, 6, 75, + 226,239,240,239,237,239,230,111,128, 49, 8,227,233,242,227,236, + 101,128, 36,213,228,239,244,225,227,227,229,238,116,128, 30, 31, + 101, 3, 84, 72, 84,150, 84,160,104, 4, 84, 82, 84,105, 84,119, + 84,135,225,114, 2, 84, 89, 84, 96,225,226,233, 99,128, 6, 65, + 237,229,238,233,225,110,128, 5,134,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,210,233,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,254,211,237,229,228,233,225,236,225,242,225, + 226,233, 99,128,254,212,233,227,239,240,244,233, 99,128, 3,229, + 237,225,236,101,128, 38, 64,102,130,251, 0, 84,175, 84,179,105, + 128,251, 3,108,128,251, 4,105,136,251, 1, 84,203, 84,243, 84, + 254, 85, 20, 85,142, 85,159, 85,167, 85,180,230,244,229,229,110, + 2, 84,213, 84,222,227,233,242,227,236,101,128, 36,110,112, 2, + 84,228, 84,235,225,242,229,110,128, 36,130,229,242,233,239,100, + 128, 36,150,231,245,242,229,228,225,243,104,128, 32, 18,236,236, + 229,100, 2, 85, 7, 85, 13,226,239,120,128, 37,160,242,229,227, + 116,128, 37,172,238,225,108, 5, 85, 34, 85, 73, 85, 90, 85,107, + 85,123,235,225,102,130, 5,218, 85, 44, 85, 64,228,225,231,229, + 243,104,129,251, 58, 85, 55,232,229,226,242,229,119,128,251, 58, + 232,229,226,242,229,119,128, 5,218,237,229,109,129, 5,221, 85, + 81,232,229,226,242,229,119,128, 5,221,238,245,110,129, 5,223, + 85, 98,232,229,226,242,229,119,128, 5,223,240,101,129, 5,227, + 85,114,232,229,226,242,229,119,128, 5,227,244,243,225,228,105, + 129, 5,229, 85,133,232,229,226,242,229,119,128, 5,229,242,243, + 244,244,239,238,229,227,232,233,238,229,243,101,128, 2,201,243, + 232,229,249,101,128, 37,201,244,225,227,249,242,233,236,236,233, + 99,128, 4,115,246,101,142, 0, 53, 85,213, 85,222, 85,232, 86, + 6, 86, 13, 86, 23, 86, 48, 86, 75, 86,109, 86,121, 86,132, 86, + 165, 86,173, 86,184,225,242,225,226,233, 99,128, 6,101,226,229, + 238,231,225,236,105,128, 9,235,227,233,242,227,236,101,129, 36, + 100, 85,243,233,238,246,229,242,243,229,243,225,238,243,243,229, + 242,233,102,128, 39,142,228,229,246, 97,128, 9,107,229,233,231, + 232,244,232,115,128, 33, 93,231,117, 2, 86, 30, 86, 39,234,225, + 242,225,244,105,128, 10,235,242,237,245,235,232,105,128, 10,107, + 232, 97, 2, 86, 55, 86, 66,227,235,225,242,225,226,233, 99,128, + 6,101,238,231,250,232,239,117,128, 48, 37,105, 2, 86, 81, 86, + 99,228,229,239,231,242,225,240,232,233,227,240,225,242,229,110, + 128, 50, 36,238,230,229,242,233,239,114,128, 32,133,237,239,238, + 239,243,240,225,227,101,128,255, 21,239,236,228,243,244,249,236, + 101,128,247, 53,112, 2, 86,138, 86,145,225,242,229,110,128, 36, + 120,229,114, 2, 86,152, 86,158,233,239,100,128, 36,140,243,233, + 225,110,128, 6,245,242,239,237,225,110,128, 33,116,243,245,240, + 229,242,233,239,114,128, 32,117,244,232,225,105,128, 14, 85,108, + 129,251, 2, 86,197,239,242,233,110,128, 1,146,109, 2, 86,210, + 86,221,239,238,239,243,240,225,227,101,128,255, 70,243,241,245, + 225,242,101,128, 51,153,111, 4, 86,240, 87, 6, 87, 18, 87, 25, + 230, 97, 2, 86,247, 86,255,238,244,232,225,105,128, 14, 31,244, + 232,225,105,128, 14, 29,238,231,237,225,238,244,232,225,105,128, + 14, 79,242,225,236,108,128, 34, 0,245,114,142, 0, 52, 87, 58, + 87, 67, 87, 77, 87,107, 87,114, 87,139, 87,166, 87,200, 87,212, + 87,231, 87,242, 88, 19, 88, 27, 88, 38,225,242,225,226,233, 99, + 128, 6,100,226,229,238,231,225,236,105,128, 9,234,227,233,242, + 227,236,101,129, 36, 99, 87, 88,233,238,246,229,242,243,229,243, + 225,238,243,243,229,242,233,102,128, 39,141,228,229,246, 97,128, + 9,106,231,117, 2, 87,121, 87,130,234,225,242,225,244,105,128, + 10,234,242,237,245,235,232,105,128, 10,106,232, 97, 2, 87,146, + 87,157,227,235,225,242,225,226,233, 99,128, 6,100,238,231,250, + 232,239,117,128, 48, 36,105, 2, 87,172, 87,190,228,229,239,231, + 242,225,240,232,233,227,240,225,242,229,110,128, 50, 35,238,230, + 229,242,233,239,114,128, 32,132,237,239,238,239,243,240,225,227, + 101,128,255, 20,238,245,237,229,242,225,244,239,242,226,229,238, + 231,225,236,105,128, 9,247,239,236,228,243,244,249,236,101,128, + 247, 52,112, 2, 87,248, 87,255,225,242,229,110,128, 36,119,229, + 114, 2, 88, 6, 88, 12,233,239,100,128, 36,139,243,233,225,110, + 128, 6,244,242,239,237,225,110,128, 33,115,243,245,240,229,242, + 233,239,114,128, 32,116,116, 2, 88, 44, 88, 82,229,229,110, 2, + 88, 52, 88, 61,227,233,242,227,236,101,128, 36,109,112, 2, 88, + 67, 88, 74,225,242,229,110,128, 36,129,229,242,233,239,100,128, + 36,149,104, 2, 88, 88, 88, 93,225,105,128, 14, 84,244,239,238, + 229,227,232,233,238,229,243,101,128, 2,203,240,225,242,229,110, + 128, 36,161,242, 97, 2, 88,122, 88,130,227,244,233,239,110,128, + 32, 68,238, 99,128, 32,163,103,144, 0,103, 88,171, 89,117, 89, + 140, 89,201, 89,218, 90,139, 91,132, 91,217, 91,230, 92, 88, 92, + 113, 92,141, 92,163, 93,108, 93,130, 93,232, 97, 9, 88,191, 88, + 201, 88,208, 88,215, 89, 23, 89, 48, 89, 59, 89, 70, 89,104,226, + 229,238,231,225,236,105,128, 9,151,227,245,244,101,128, 1,245, + 228,229,246, 97,128, 9, 23,102, 4, 88,225, 88,234, 88,248, 89, + 8,225,242,225,226,233, 99,128, 6,175,230,233,238,225,236,225, + 242,225,226,233, 99,128,251,147,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,251,148,237,229,228,233,225,236,225,242, + 225,226,233, 99,128,251,149,231,117, 2, 89, 30, 89, 39,234,225, + 242,225,244,105,128, 10,151,242,237,245,235,232,105,128, 10, 23, + 232,233,242,225,231,225,238, 97,128, 48, 76,235,225,244,225,235, + 225,238, 97,128, 48,172,237,237, 97,130, 3,179, 89, 80, 89, 93, + 236,225,244,233,238,243,237,225,236,108,128, 2, 99,243,245,240, + 229,242,233,239,114,128, 2,224,238,231,233,225,227,239,240,244, + 233, 99,128, 3,235, 98, 2, 89,123, 89,133,239,240,239,237,239, + 230,111,128, 49, 13,242,229,246,101,128, 1, 31, 99, 4, 89,150, + 89,157, 89,166, 89,188,225,242,239,110,128, 1,231,229,228,233, + 236,236, 97,128, 1, 35,233,242, 99, 2, 89,174, 89,179,236,101, + 128, 36,214,245,237,230,236,229,120,128, 1, 29,239,237,237,225, + 225,227,227,229,238,116,128, 1, 35,228,239,116,129, 1, 33, 89, + 209,225,227,227,229,238,116,128, 1, 33,101, 6, 89,232, 89,243, + 89,254, 90, 9, 90, 28, 90,130,227,249,242,233,236,236,233, 99, + 128, 4, 51,232,233,242,225,231,225,238, 97,128, 48, 82,235,225, + 244,225,235,225,238, 97,128, 48,178,239,237,229,244,242,233,227, + 225,236,236,249,229,241,245,225,108,128, 34, 81,114, 3, 90, 36, + 90, 85, 90, 95,229,243,104, 3, 90, 46, 90, 61, 90, 70,225,227, + 227,229,238,244,232,229,226,242,229,119,128, 5,156,232,229,226, + 242,229,119,128, 5,243,237,245,241,228,225,237,232,229,226,242, + 229,119,128, 5,157,237,225,238,228,226,236,115,128, 0,223,243, + 232,225,249,233,109, 2, 90,106, 90,121,225,227,227,229,238,244, + 232,229,226,242,229,119,128, 5,158,232,229,226,242,229,119,128, + 5,244,244,225,237,225,242,107,128, 48, 19,104, 5, 90,151, 91, + 28, 91, 91, 91,116, 91,122, 97, 4, 90,161, 90,171, 90,194, 90, + 219,226,229,238,231,225,236,105,128, 9,152,100, 2, 90,177, 90, + 188,225,242,237,229,238,233,225,110,128, 5,114,229,246, 97,128, + 9, 24,231,117, 2, 90,201, 90,210,234,225,242,225,244,105,128, + 10,152,242,237,245,235,232,105,128, 10, 24,233,110, 4, 90,230, + 90,239, 90,253, 91, 13,225,242,225,226,233, 99,128, 6, 58,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,206,233,238,233, + 244,233,225,236,225,242,225,226,233, 99,128,254,207,237,229,228, + 233,225,236,225,242,225,226,233, 99,128,254,208,101, 3, 91, 36, + 91, 57, 91, 74,237,233,228,228,236,229,232,239,239,235,227,249, + 242,233,236,236,233, 99,128, 4,149,243,244,242,239,235,229,227, + 249,242,233,236,236,233, 99,128, 4,147,245,240,244,245,242,238, + 227,249,242,233,236,236,233, 99,128, 4,145,232, 97, 2, 91, 98, + 91,105,228,229,246, 97,128, 9, 90,231,245,242,237,245,235,232, + 105,128, 10, 90,239,239,107,128, 2, 96,250,243,241,245,225,242, + 101,128, 51,147,105, 3, 91,140, 91,151, 91,162,232,233,242,225, + 231,225,238, 97,128, 48, 78,235,225,244,225,235,225,238, 97,128, + 48,174,109, 2, 91,168, 91,179,225,242,237,229,238,233,225,110, + 128, 5, 99,229,108,130, 5,210, 91,188, 91,208,228,225,231,229, + 243,104,129,251, 50, 91,199,232,229,226,242,229,119,128,251, 50, + 232,229,226,242,229,119,128, 5,210,234,229,227,249,242,233,236, + 236,233, 99,128, 4, 83,236,239,244,244,225,108, 2, 91,241, 92, + 2,233,238,246,229,242,244,229,228,243,244,242,239,235,101,128, + 1,190,243,244,239,112,132, 2,148, 92, 17, 92, 28, 92, 34, 92, + 66,233,238,246,229,242,244,229,100,128, 2,150,237,239,100,128, + 2,192,242,229,246,229,242,243,229,100,130, 2,149, 92, 49, 92, + 55,237,239,100,128, 2,193,243,245,240,229,242,233,239,114,128, + 2,228,243,244,242,239,235,101,129, 2,161, 92, 77,242,229,246, + 229,242,243,229,100,128, 2,162,109, 2, 92, 94, 92,102,225,227, + 242,239,110,128, 30, 33,239,238,239,243,240,225,227,101,128,255, + 71,111, 2, 92,119, 92,130,232,233,242,225,231,225,238, 97,128, + 48, 84,235,225,244,225,235,225,238, 97,128, 48,180,240, 97, 2, + 92,148, 92,154,242,229,110,128, 36,162,243,241,245,225,242,101, + 128, 51,172,114, 2, 92,169, 93, 10, 97, 2, 92,175, 92,183,228, + 233,229,238,116,128, 34, 7,246,101,134, 0, 96, 92,200, 92,211, + 92,228, 92,235, 92,244, 93, 0,226,229,236,239,247,227,237, 98, + 128, 3, 22, 99, 2, 92,217, 92,222,237, 98,128, 3, 0,239,237, + 98,128, 3, 0,228,229,246, 97,128, 9, 83,236,239,247,237,239, + 100,128, 2,206,237,239,238,239,243,240,225,227,101,128,255, 64, + 244,239,238,229,227,237, 98,128, 3, 64,229,225,244,229,114,132, + 0, 62, 93, 26, 93, 45, 93, 57, 93,100,229,241,245,225,108,129, + 34,101, 93, 36,239,242,236,229,243,115,128, 34,219,237,239,238, + 239,243,240,225,227,101,128,255, 30,111, 2, 93, 63, 93, 89,114, + 2, 93, 69, 93, 82,229,241,245,233,246,225,236,229,238,116,128, + 34,115,236,229,243,115,128, 34,119,246,229,242,229,241,245,225, + 108,128, 34,103,243,237,225,236,108,128,254,101,115, 2, 93,114, + 93,122,227,242,233,240,116,128, 2, 97,244,242,239,235,101,128, + 1,229,117, 4, 93,140, 93,151, 93,208, 93,219,232,233,242,225, + 231,225,238, 97,128, 48, 80,233,108, 2, 93,158, 93,183,236,229, + 237,239,116, 2, 93,168, 93,175,236,229,230,116,128, 0,171,242, + 233,231,232,116,128, 0,187,243,233,238,231,108, 2, 93,193, 93, + 200,236,229,230,116,128, 32, 57,242,233,231,232,116,128, 32, 58, + 235,225,244,225,235,225,238, 97,128, 48,176,242,225,237,245,243, + 241,245,225,242,101,128, 51, 24,249,243,241,245,225,242,101,128, + 51,201,104,144, 0,104, 94, 22, 96,164, 96,199, 96,236, 97, 20, + 98,164, 98,184, 99,149, 99,161, 99,173,100,241,100,249,101, 4, + 101, 13,101, 93,101, 97, 97, 13, 94, 50, 94, 89, 94, 99, 94,129, + 94,154, 94,232, 94,244, 95, 13, 95, 28, 95, 57, 95, 70, 95,128, + 95,137, 97, 2, 94, 56, 94, 75,226,235,232,225,243,233,225,238, + 227,249,242,233,236,236,233, 99,128, 4,169,236,244,239,238,229, + 225,242,225,226,233, 99,128, 6,193,226,229,238,231,225,236,105, + 128, 9,185,228,101, 2, 94,106, 94,124,243,227,229,238,228,229, + 242,227,249,242,233,236,236,233, 99,128, 4,179,246, 97,128, 9, + 57,231,117, 2, 94,136, 94,145,234,225,242,225,244,105,128, 10, + 185,242,237,245,235,232,105,128, 10, 57,104, 4, 94,164, 94,173, + 94,187, 94,217,225,242,225,226,233, 99,128, 6, 45,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,162,105, 2, 94,193, 94, + 208,238,233,244,233,225,236,225,242,225,226,233, 99,128,254,163, + 242,225,231,225,238, 97,128, 48,111,237,229,228,233,225,236,225, + 242,225,226,233, 99,128,254,164,233,244,245,243,241,245,225,242, + 101,128, 51, 42,235,225,244,225,235,225,238, 97,129, 48,207, 95, + 1,232,225,236,230,247,233,228,244,104,128,255,138,236,225,238, + 244,231,245,242,237,245,235,232,105,128, 10, 77,237,250, 97, 2, + 95, 36, 95, 45,225,242,225,226,233, 99,128, 6, 33,236,239,247, + 225,242,225,226,233, 99,128, 6, 33,238,231,245,236,230,233,236, + 236,229,114,128, 49,100,114, 2, 95, 76, 95, 92,228,243,233,231, + 238,227,249,242,233,236,236,233, 99,128, 4, 74,240,239,239,110, + 2, 95,101, 95,114,236,229,230,244,226,225,242,226,245,112,128, + 33,188,242,233,231,232,244,226,225,242,226,245,112,128, 33,192, + 243,241,245,225,242,101,128, 51,202,244,225,102, 3, 95,147, 95, + 239, 96, 74,240,225,244,225,104,134, 5,178, 95,167, 95,172, 95, + 186, 95,195, 95,210, 95,226,177, 54,128, 5,178, 50, 2, 95,178, + 95,182, 51,128, 5,178,102,128, 5,178,232,229,226,242,229,119, + 128, 5,178,238,225,242,242,239,247,232,229,226,242,229,119,128, + 5,178,241,245,225,242,244,229,242,232,229,226,242,229,119,128, + 5,178,247,233,228,229,232,229,226,242,229,119,128, 5,178,241, + 225,237,225,244,115,135, 5,179, 96, 6, 96, 11, 96, 16, 96, 21, + 96, 30, 96, 45, 96, 61,177, 98,128, 5,179,178, 56,128, 5,179, + 179, 52,128, 5,179,232,229,226,242,229,119,128, 5,179,238,225, + 242,242,239,247,232,229,226,242,229,119,128, 5,179,241,245,225, + 242,244,229,242,232,229,226,242,229,119,128, 5,179,247,233,228, + 229,232,229,226,242,229,119,128, 5,179,243,229,231,239,108,135, + 5,177, 96, 96, 96,101, 96,106, 96,111, 96,120, 96,135, 96,151, + 177, 55,128, 5,177,178, 52,128, 5,177,179, 48,128, 5,177,232, + 229,226,242,229,119,128, 5,177,238,225,242,242,239,247,232,229, + 226,242,229,119,128, 5,177,241,245,225,242,244,229,242,232,229, + 226,242,229,119,128, 5,177,247,233,228,229,232,229,226,242,229, + 119,128, 5,177, 98, 3, 96,172, 96,177, 96,187,225,114,128, 1, + 39,239,240,239,237,239,230,111,128, 49, 15,242,229,246,229,226, + 229,236,239,119,128, 30, 43, 99, 2, 96,205, 96,214,229,228,233, + 236,236, 97,128, 30, 41,233,242, 99, 2, 96,222, 96,227,236,101, + 128, 36,215,245,237,230,236,229,120,128, 1, 37,100, 2, 96,242, + 96,252,233,229,242,229,243,233,115,128, 30, 39,239,116, 2, 97, + 3, 97, 12,225,227,227,229,238,116,128, 30, 35,226,229,236,239, + 119,128, 30, 37,101,136, 5,212, 97, 40, 97, 73, 97, 93, 98, 66, + 98, 82, 98,127, 98,136, 98,149,225,242,116,129, 38,101, 97, 48, + 243,245,233,116, 2, 97, 57, 97, 65,226,236,225,227,107,128, 38, + 101,247,232,233,244,101,128, 38, 97,228,225,231,229,243,104,129, + 251, 52, 97, 84,232,229,226,242,229,119,128,251, 52,104, 6, 97, + 107, 97,135, 97,143, 97,193, 97,239, 98, 32, 97, 2, 97,113, 97, + 127,236,244,239,238,229,225,242,225,226,233, 99,128, 6,193,242, + 225,226,233, 99,128, 6, 71,229,226,242,229,119,128, 5,212,230, + 233,238,225,236, 97, 2, 97,154, 97,185,236,116, 2, 97,161, 97, + 173,239,238,229,225,242,225,226,233, 99,128,251,167,244,247,239, + 225,242,225,226,233, 99,128,254,234,242,225,226,233, 99,128,254, + 234,232,225,237,250,225,225,226,239,246,101, 2, 97,208, 97,222, + 230,233,238,225,236,225,242,225,226,233, 99,128,251,165,233,243, + 239,236,225,244,229,228,225,242,225,226,233, 99,128,251,164,105, + 2, 97,245, 98, 23,238,233,244,233,225,236, 97, 2, 98, 1, 98, + 15,236,244,239,238,229,225,242,225,226,233, 99,128,251,168,242, + 225,226,233, 99,128,254,235,242,225,231,225,238, 97,128, 48,120, + 237,229,228,233,225,236, 97, 2, 98, 44, 98, 58,236,244,239,238, + 229,225,242,225,226,233, 99,128,251,169,242,225,226,233, 99,128, + 254,236,233,243,229,233,229,242,225,243,241,245,225,242,101,128, + 51,123,107, 2, 98, 88, 98,112,225,244,225,235,225,238, 97,129, + 48,216, 98,100,232,225,236,230,247,233,228,244,104,128,255,141, + 245,244,225,225,242,245,243,241,245,225,242,101,128, 51, 54,238, + 231,232,239,239,107,128, 2,103,242,245,244,245,243,241,245,225, + 242,101,128, 51, 57,116,129, 5,215, 98,155,232,229,226,242,229, + 119,128, 5,215,232,239,239,107,129, 2,102, 98,173,243,245,240, + 229,242,233,239,114,128, 2,177,105, 4, 98,194, 99, 23, 99, 34, + 99, 59,229,245,104, 4, 98,206, 98,241, 99, 0, 99, 9, 97, 2, + 98,212, 98,227,227,233,242,227,236,229,235,239,242,229,225,110, + 128, 50,123,240,225,242,229,238,235,239,242,229,225,110,128, 50, + 27,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,109, + 235,239,242,229,225,110,128, 49, 78,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 13,232,233,242,225,231,225,238, 97,128, + 48,114,235,225,244,225,235,225,238, 97,129, 48,210, 99, 47,232, + 225,236,230,247,233,228,244,104,128,255,139,242,233,113,134, 5, + 180, 99, 77, 99, 82, 99, 96, 99,105, 99,120, 99,136,177, 52,128, + 5,180, 50, 2, 99, 88, 99, 92, 49,128, 5,180,100,128, 5,180, + 232,229,226,242,229,119,128, 5,180,238,225,242,242,239,247,232, + 229,226,242,229,119,128, 5,180,241,245,225,242,244,229,242,232, + 229,226,242,229,119,128, 5,180,247,233,228,229,232,229,226,242, + 229,119,128, 5,180,236,233,238,229,226,229,236,239,119,128, 30, + 150,237,239,238,239,243,240,225,227,101,128,255, 72,111, 9, 99, + 193, 99,204, 99,228, 99,253,100, 85,100, 98,100,184,100,224,100, + 235,225,242,237,229,238,233,225,110,128, 5,112,232,105, 2, 99, + 211, 99,219,240,244,232,225,105,128, 14, 43,242,225,231,225,238, + 97,128, 48,123,235,225,244,225,235,225,238, 97,129, 48,219, 99, + 241,232,225,236,230,247,233,228,244,104,128,255,142,236,225,109, + 135, 5,185,100, 17,100, 22,100, 27,100, 32,100, 41,100, 56,100, + 72,177, 57,128, 5,185,178, 54,128, 5,185,179, 50,128, 5,185, + 232,229,226,242,229,119,128, 5,185,238,225,242,242,239,247,232, + 229,226,242,229,119,128, 5,185,241,245,225,242,244,229,242,232, + 229,226,242,229,119,128, 5,185,247,233,228,229,232,229,226,242, + 229,119,128, 5,185,238,239,235,232,245,235,244,232,225,105,128, + 14, 46,111, 2,100,104,100,174,107, 4,100,114,100,126,100,132, + 100,154,225,226,239,246,229,227,239,237, 98,128, 3, 9,227,237, + 98,128, 3, 9,240,225,236,225,244,225,236,233,250,229,228,226, + 229,236,239,247,227,237, 98,128, 3, 33,242,229,244,242,239,230, + 236,229,248,226,229,236,239,247,227,237, 98,128, 3, 34,238,243, + 241,245,225,242,101,128, 51, 66,114, 2,100,190,100,217,105, 2, + 100,196,100,205,227,239,240,244,233, 99,128, 3,233,250,239,238, + 244,225,236,226,225,114,128, 32, 21,238,227,237, 98,128, 3, 27, + 244,243,240,242,233,238,231,115,128, 38,104,245,243,101,128, 35, + 2,240,225,242,229,110,128, 36,163,243,245,240,229,242,233,239, + 114,128, 2,176,244,245,242,238,229,100,128, 2,101,117, 4,101, + 23,101, 34,101, 47,101, 72,232,233,242,225,231,225,238, 97,128, + 48,117,233,233,244,239,243,241,245,225,242,101,128, 51, 51,235, + 225,244,225,235,225,238, 97,129, 48,213,101, 60,232,225,236,230, + 247,233,228,244,104,128,255,140,238,231,225,242,245,237,236,225, + 245,116,129, 2,221,101, 87,227,237, 98,128, 3, 11,118,128, 1, + 149,249,240,232,229,110,132, 0, 45,101,113,101,124,101,136,101, + 159,233,238,230,229,242,233,239,114,128,246,229,237,239,238,239, + 243,240,225,227,101,128,255, 13,115, 2,101,142,101,149,237,225, + 236,108,128,254, 99,245,240,229,242,233,239,114,128,246,230,244, + 247,111,128, 32, 16,105,149, 0,105,101,211,101,234,102, 12,102, + 59,105,197,106, 61,106, 98,106,125,107, 31,107, 35,107, 73,107, + 95,107,179,108, 88,108,163,108,171,108,184,109, 15,109, 72,109, + 100,109,144,225, 99, 2,101,218,101,224,245,244,101,128, 0,237, + 249,242,233,236,236,233, 99,128, 4, 79, 98, 3,101,242,101,251, + 102, 5,229,238,231,225,236,105,128, 9,135,239,240,239,237,239, + 230,111,128, 49, 39,242,229,246,101,128, 1, 45, 99, 3,102, 20, + 102, 27,102, 49,225,242,239,110,128, 1,208,233,242, 99, 2,102, + 35,102, 40,236,101,128, 36,216,245,237,230,236,229,120,128, 0, + 238,249,242,233,236,236,233, 99,128, 4, 86,100, 4,102, 69,102, + 79,105,154,105,187,226,236,231,242,225,246,101,128, 2, 9,101, + 2,102, 85,105,149,239,231,242,225,240,104, 7,102,106,102,120, + 102,133,105, 62,105, 93,105,106,105,118,229,225,242,244,232,227, + 233,242,227,236,101,128, 50,143,230,233,242,229,227,233,242,227, + 236,101,128, 50,139,233, 99, 14,102,164,102,180,103, 23,103, 77, + 103,143,103,172,103,188,103,245,104, 38,104, 50,104, 77,104,144, + 105, 26,105, 55,225,236,236,233,225,238,227,229,240,225,242,229, + 110,128, 50, 63, 99, 4,102,190,102,201,102,215,102,222,225,236, + 236,240,225,242,229,110,128, 50, 58,229,238,244,242,229,227,233, + 242,227,236,101,128, 50,165,236,239,243,101,128, 48, 6,111, 3, + 102,230,102,245,103, 9,237,237, 97,129, 48, 1,102,238,236,229, + 230,116,128,255,100,238,231,242,225,244,245,236,225,244,233,239, + 238,240,225,242,229,110,128, 50, 55,242,242,229,227,244,227,233, + 242,227,236,101,128, 50,163,101, 3,103, 31,103, 43,103, 60,225, + 242,244,232,240,225,242,229,110,128, 50, 47,238,244,229,242,240, + 242,233,243,229,240,225,242,229,110,128, 50, 61,248,227,229,236, + 236,229,238,244,227,233,242,227,236,101,128, 50,157,102, 2,103, + 83,103, 98,229,243,244,233,246,225,236,240,225,242,229,110,128, + 50, 64,105, 2,103,104,103,133,238,225,238,227,233,225,108, 2, + 103,116,103,125,227,233,242,227,236,101,128, 50,150,240,225,242, + 229,110,128, 50, 54,242,229,240,225,242,229,110,128, 50, 43,104, + 2,103,149,103,160,225,246,229,240,225,242,229,110,128, 50, 50, + 233,231,232,227,233,242,227,236,101,128, 50,164,233,244,229,242, + 225,244,233,239,238,237,225,242,107,128, 48, 5,108, 3,103,196, + 103,222,103,234,225,226,239,114, 2,103,205,103,214,227,233,242, + 227,236,101,128, 50,152,240,225,242,229,110,128, 50, 56,229,230, + 244,227,233,242,227,236,101,128, 50,167,239,247,227,233,242,227, + 236,101,128, 50,166,109, 2,103,251,104, 27,101, 2,104, 1,104, + 16,228,233,227,233,238,229,227,233,242,227,236,101,128, 50,169, + 244,225,236,240,225,242,229,110,128, 50, 46,239,239,238,240,225, + 242,229,110,128, 50, 42,238,225,237,229,240,225,242,229,110,128, + 50, 52,112, 2,104, 56,104, 64,229,242,233,239,100,128, 48, 2, + 242,233,238,244,227,233,242,227,236,101,128, 50,158,114, 2,104, + 83,104,131,101, 3,104, 91,104,102,104,117,225,227,232,240,225, + 242,229,110,128, 50, 67,240,242,229,243,229,238,244,240,225,242, + 229,110,128, 50, 57,243,239,245,242,227,229,240,225,242,229,110, + 128, 50, 62,233,231,232,244,227,233,242,227,236,101,128, 50,168, + 115, 5,104,156,104,185,104,199,104,224,104,252,101, 2,104,162, + 104,175,227,242,229,244,227,233,242,227,236,101,128, 50,153,236, + 230,240,225,242,229,110,128, 50, 66,239,227,233,229,244,249,240, + 225,242,229,110,128, 50, 51,112, 2,104,205,104,211,225,227,101, + 128, 48, 0,229,227,233,225,236,240,225,242,229,110,128, 50, 53, + 116, 2,104,230,104,241,239,227,235,240,225,242,229,110,128, 50, + 49,245,228,249,240,225,242,229,110,128, 50, 59,117, 2,105, 2, + 105, 11,238,240,225,242,229,110,128, 50, 48,240,229,242,246,233, + 243,229,240,225,242,229,110,128, 50, 60,119, 2,105, 32,105, 44, + 225,244,229,242,240,225,242,229,110,128, 50, 44,239,239,228,240, + 225,242,229,110,128, 50, 45,250,229,242,111,128, 48, 7,109, 2, + 105, 68,105, 81,229,244,225,236,227,233,242,227,236,101,128, 50, + 142,239,239,238,227,233,242,227,236,101,128, 50,138,238,225,237, + 229,227,233,242,227,236,101,128, 50,148,243,245,238,227,233,242, + 227,236,101,128, 50,144,119, 2,105,124,105,137,225,244,229,242, + 227,233,242,227,236,101,128, 50,140,239,239,228,227,233,242,227, + 236,101,128, 50,141,246, 97,128, 9, 7,233,229,242,229,243,233, + 115,130, 0,239,105,168,105,176,225,227,245,244,101,128, 30, 47, + 227,249,242,233,236,236,233, 99,128, 4,229,239,244,226,229,236, + 239,119,128, 30,203,101, 3,105,205,105,221,105,232,226,242,229, + 246,229,227,249,242,233,236,236,233, 99,128, 4,215,227,249,242, + 233,236,236,233, 99,128, 4, 53,245,238,103, 4,105,244,106, 23, + 106, 38,106, 47, 97, 2,105,250,106, 9,227,233,242,227,236,229, + 235,239,242,229,225,110,128, 50,117,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 21,227,233,242,227,236,229,235,239,242, + 229,225,110,128, 50,103,235,239,242,229,225,110,128, 49, 71,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 7,103, 2,106, + 67,106, 74,242,225,246,101,128, 0,236,117, 2,106, 80,106, 89, + 234,225,242,225,244,105,128, 10,135,242,237,245,235,232,105,128, + 10, 7,104, 2,106,104,106,114,233,242,225,231,225,238, 97,128, + 48, 68,239,239,235,225,226,239,246,101,128, 30,201,105, 8,106, + 143,106,153,106,164,106,171,106,196,106,212,106,227,106,243,226, + 229,238,231,225,236,105,128, 9,136,227,249,242,233,236,236,233, + 99,128, 4, 56,228,229,246, 97,128, 9, 8,231,117, 2,106,178, + 106,187,234,225,242,225,244,105,128, 10,136,242,237,245,235,232, + 105,128, 10, 8,237,225,244,242,225,231,245,242,237,245,235,232, + 105,128, 10, 64,238,246,229,242,244,229,228,226,242,229,246,101, + 128, 2, 11,243,232,239,242,244,227,249,242,233,236,236,233, 99, + 128, 4, 57,246,239,247,229,236,243,233,231,110, 3,107, 3,107, + 13,107, 20,226,229,238,231,225,236,105,128, 9,192,228,229,246, + 97,128, 9, 64,231,245,234,225,242,225,244,105,128, 10,192,106, + 128, 1, 51,107, 2,107, 41,107, 65,225,244,225,235,225,238, 97, + 129, 48,164,107, 53,232,225,236,230,247,233,228,244,104,128,255, + 114,239,242,229,225,110,128, 49, 99,108, 2,107, 79,107, 84,228, + 101,128, 2,220,245,249,232,229,226,242,229,119,128, 5,172,109, + 2,107,101,107,168, 97, 3,107,109,107,129,107,154,227,242,239, + 110,129, 1, 43,107,118,227,249,242,233,236,236,233, 99,128, 4, + 227,231,229,239,242,225,240,240,242,239,248,233,237,225,244,229, + 236,249,229,241,245,225,108,128, 34, 83,244,242,225,231,245,242, + 237,245,235,232,105,128, 10, 63,239,238,239,243,240,225,227,101, + 128,255, 73,110, 5,107,191,107,201,107,210,107,222,108, 50,227, + 242,229,237,229,238,116,128, 34, 6,230,233,238,233,244,121,128, + 34, 30,233,225,242,237,229,238,233,225,110,128, 5,107,116, 2, + 107,228,108, 40,101, 2,107,234,108, 29,231,242,225,108,131, 34, + 43,107,247,108, 9,108, 14, 98, 2,107,253,108, 5,239,244,244, + 239,109,128, 35, 33,116,128, 35, 33,229,120,128,248,245,116, 2, + 108, 20,108, 25,239,112,128, 35, 32,112,128, 35, 32,242,243,229, + 227,244,233,239,110,128, 34, 41,233,243,241,245,225,242,101,128, + 51, 5,118, 3,108, 58,108, 67,108, 76,226,245,236,236,229,116, + 128, 37,216,227,233,242,227,236,101,128, 37,217,243,237,233,236, + 229,230,225,227,101,128, 38, 59,111, 3,108, 96,108,107,108,115, + 227,249,242,233,236,236,233, 99,128, 4, 81,231,239,238,229,107, + 128, 1, 47,244, 97,131, 3,185,108,126,108,147,108,155,228,233, + 229,242,229,243,233,115,129, 3,202,108,139,244,239,238,239,115, + 128, 3,144,236,225,244,233,110,128, 2,105,244,239,238,239,115, + 128, 3,175,240,225,242,229,110,128, 36,164,242,233,231,245,242, + 237,245,235,232,105,128, 10,114,115, 4,108,194,108,239,108,253, + 109, 5,237,225,236,108, 2,108,203,108,214,232,233,242,225,231, + 225,238, 97,128, 48, 67,235,225,244,225,235,225,238, 97,129, 48, + 163,108,227,232,225,236,230,247,233,228,244,104,128,255,104,243, + 232,225,242,226,229,238,231,225,236,105,128, 9,250,244,242,239, + 235,101,128, 2,104,245,240,229,242,233,239,114,128,246,237,116, + 2,109, 21,109, 55,229,242,225,244,233,239,110, 2,109, 33,109, + 44,232,233,242,225,231,225,238, 97,128, 48,157,235,225,244,225, + 235,225,238, 97,128, 48,253,233,236,228,101,129, 1, 41,109, 64, + 226,229,236,239,119,128, 30, 45,117, 2,109, 78,109, 89,226,239, + 240,239,237,239,230,111,128, 49, 41,227,249,242,233,236,236,233, + 99,128, 4, 78,246,239,247,229,236,243,233,231,110, 3,109,116, + 109,126,109,133,226,229,238,231,225,236,105,128, 9,191,228,229, + 246, 97,128, 9, 63,231,245,234,225,242,225,244,105,128, 10,191, + 250,232,233,244,243, 97, 2,109,155,109,166,227,249,242,233,236, + 236,233, 99,128, 4,117,228,226,236,231,242,225,246,229,227,249, + 242,233,236,236,233, 99,128, 4,119,106,138, 0,106,109,209,110, + 16,110, 27,110, 77,110, 93,110,206,111, 19,111, 24,111, 36,111, + 44, 97, 4,109,219,109,230,109,240,109,247,225,242,237,229,238, + 233,225,110,128, 5,113,226,229,238,231,225,236,105,128, 9,156, + 228,229,246, 97,128, 9, 28,231,117, 2,109,254,110, 7,234,225, + 242,225,244,105,128, 10,156,242,237,245,235,232,105,128, 10, 28, + 226,239,240,239,237,239,230,111,128, 49, 16, 99, 3,110, 35,110, + 42,110, 64,225,242,239,110,128, 1,240,233,242, 99, 2,110, 50, + 110, 55,236,101,128, 36,217,245,237,230,236,229,120,128, 1, 53, + 242,239,243,243,229,228,244,225,233,108,128, 2,157,228,239,244, + 236,229,243,243,243,244,242,239,235,101,128, 2, 95,101, 3,110, + 101,110,112,110,177,227,249,242,233,236,236,233, 99,128, 4, 88, + 229,109, 4,110,123,110,132,110,146,110,162,225,242,225,226,233, + 99,128, 6, 44,230,233,238,225,236,225,242,225,226,233, 99,128, + 254,158,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 254,159,237,229,228,233,225,236,225,242,225,226,233, 99,128,254, + 160,104, 2,110,183,110,192,225,242,225,226,233, 99,128, 6,152, + 230,233,238,225,236,225,242,225,226,233, 99,128,251,139,104, 2, + 110,212,111, 6, 97, 3,110,220,110,230,110,237,226,229,238,231, + 225,236,105,128, 9,157,228,229,246, 97,128, 9, 29,231,117, 2, + 110,244,110,253,234,225,242,225,244,105,128, 10,157,242,237,245, + 235,232,105,128, 10, 29,229,232,225,242,237,229,238,233,225,110, + 128, 5,123,233,115,128, 48, 4,237,239,238,239,243,240,225,227, + 101,128,255, 74,240,225,242,229,110,128, 36,165,243,245,240,229, + 242,233,239,114,128, 2,178,107,146, 0,107,111, 95,113,184,113, + 195,114, 1,114, 12,114,102,114,116,115,224,116,164,116,177,116, + 203,116,252,117,134,117,156,117,169,117,192,117,234,117,244, 97, + 12,111,121,111,153,111,175,111,205,112, 63,112, 88,112,118,112, + 143,112,249,113, 7,113,130,113,159, 98, 2,111,127,111,144,225, + 243,232,235,233,242,227,249,242,233,236,236,233, 99,128, 4,161, + 229,238,231,225,236,105,128, 9,149, 99, 2,111,159,111,165,245, + 244,101,128, 30, 49,249,242,233,236,236,233, 99,128, 4, 58,228, + 101, 2,111,182,111,200,243,227,229,238,228,229,242,227,249,242, + 233,236,236,233, 99,128, 4,155,246, 97,128, 9, 21,102,135, 5, + 219,111,223,111,232,111,252,112, 10,112, 19,112, 35,112, 50,225, + 242,225,226,233, 99,128, 6, 67,228,225,231,229,243,104,129,251, + 59,111,243,232,229,226,242,229,119,128,251, 59,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,218,232,229,226,242,229,119, + 128, 5,219,233,238,233,244,233,225,236,225,242,225,226,233, 99, + 128,254,219,237,229,228,233,225,236,225,242,225,226,233, 99,128, + 254,220,242,225,230,229,232,229,226,242,229,119,128,251, 77,231, + 117, 2,112, 70,112, 79,234,225,242,225,244,105,128, 10,149,242, + 237,245,235,232,105,128, 10, 21,104, 2,112, 94,112,104,233,242, + 225,231,225,238, 97,128, 48, 75,239,239,235,227,249,242,233,236, + 236,233, 99,128, 4,196,235,225,244,225,235,225,238, 97,129, 48, + 171,112,131,232,225,236,230,247,233,228,244,104,128,255,118,112, + 2,112,149,112,170,240, 97,129, 3,186,112,156,243,249,237,226, + 239,236,231,242,229,229,107,128, 3,240,249,229,239,245,110, 3, + 112,182,112,196,112,230,237,233,229,245,237,235,239,242,229,225, + 110,128, 49,113,112, 2,112,202,112,217,232,233,229,245,240,232, + 235,239,242,229,225,110,128, 49,132,233,229,245,240,235,239,242, + 229,225,110,128, 49,120,243,243,225,238,231,240,233,229,245,240, + 235,239,242,229,225,110,128, 49,121,242,239,242,233,233,243,241, + 245,225,242,101,128, 51, 13,115, 5,113, 19,113, 63,113, 78,113, + 86,113,114,232,233,228,225,225,245,244,111, 2,113, 32,113, 41, + 225,242,225,226,233, 99,128, 6, 64,238,239,243,233,228,229,226, + 229,225,242,233,238,231,225,242,225,226,233, 99,128, 6, 64,237, + 225,236,236,235,225,244,225,235,225,238, 97,128, 48,245,241,245, + 225,242,101,128, 51,132,242, 97, 2,113, 93,113,102,225,242,225, + 226,233, 99,128, 6, 80,244,225,238,225,242,225,226,233, 99,128, + 6, 77,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, + 4,159,244,225,232,233,242,225,240,242,239,236,239,238,231,237, + 225,242,235,232,225,236,230,247,233,228,244,104,128,255,112,246, + 229,242,244,233,227,225,236,243,244,242,239,235,229,227,249,242, + 233,236,236,233, 99,128, 4,157,226,239,240,239,237,239,230,111, + 128, 49, 14, 99, 4,113,205,113,227,113,236,113,244, 97, 2,113, + 211,113,221,236,243,241,245,225,242,101,128, 51,137,242,239,110, + 128, 1,233,229,228,233,236,236, 97,128, 1, 55,233,242,227,236, + 101,128, 36,218,239,237,237,225,225,227,227,229,238,116,128, 1, + 55,228,239,244,226,229,236,239,119,128, 30, 51,101, 4,114, 22, + 114, 49,114, 74,114, 86,104, 2,114, 28,114, 39,225,242,237,229, + 238,233,225,110,128, 5,132,233,242,225,231,225,238, 97,128, 48, + 81,235,225,244,225,235,225,238, 97,129, 48,177,114, 62,232,225, + 236,230,247,233,228,244,104,128,255,121,238,225,242,237,229,238, + 233,225,110,128, 5,111,243,237,225,236,236,235,225,244,225,235, + 225,238, 97,128, 48,246,231,242,229,229,238,236,225,238,228,233, + 99,128, 1, 56,104, 6,114,130,115, 3,115, 14,115, 39,115,126, + 115,214, 97, 5,114,142,114,152,114,163,114,170,114,195,226,229, + 238,231,225,236,105,128, 9,150,227,249,242,233,236,236,233, 99, + 128, 4, 69,228,229,246, 97,128, 9, 22,231,117, 2,114,177,114, + 186,234,225,242,225,244,105,128, 10,150,242,237,245,235,232,105, + 128, 10, 22,104, 4,114,205,114,214,114,228,114,244,225,242,225, + 226,233, 99,128, 6, 46,230,233,238,225,236,225,242,225,226,233, + 99,128,254,166,233,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,167,237,229,228,233,225,236,225,242,225,226,233, 99, + 128,254,168,229,233,227,239,240,244,233, 99,128, 3,231,232, 97, + 2,115, 21,115, 28,228,229,246, 97,128, 9, 89,231,245,242,237, + 245,235,232,105,128, 10, 89,233,229,245,235,104, 4,115, 53,115, + 88,115,103,115,112, 97, 2,115, 59,115, 74,227,233,242,227,236, + 229,235,239,242,229,225,110,128, 50,120,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 24,227,233,242,227,236,229,235,239, + 242,229,225,110,128, 50,106,235,239,242,229,225,110,128, 49, 75, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 10,111, 4, + 115,136,115,185,115,195,115,200,235,104, 4,115,147,115,156,115, + 165,115,175,225,233,244,232,225,105,128, 14, 2,239,238,244,232, + 225,105,128, 14, 5,245,225,244,244,232,225,105,128, 14, 3,247, + 225,233,244,232,225,105,128, 14, 4,237,245,244,244,232,225,105, + 128, 14, 91,239,107,128, 1,153,242,225,235,232,225,238,231,244, + 232,225,105,128, 14, 6,250,243,241,245,225,242,101,128, 51,145, + 105, 4,115,234,115,245,116, 14,116, 63,232,233,242,225,231,225, + 238, 97,128, 48, 77,235,225,244,225,235,225,238, 97,129, 48,173, + 116, 2,232,225,236,230,247,233,228,244,104,128,255,119,242,111, + 3,116, 23,116, 38,116, 54,231,245,242,225,237,245,243,241,245, + 225,242,101,128, 51, 21,237,229,229,244,239,242,245,243,241,245, + 225,242,101,128, 51, 22,243,241,245,225,242,101,128, 51, 20,249, + 229,239,107, 5,116, 78,116,113,116,128,116,137,116,151, 97, 2, + 116, 84,116, 99,227,233,242,227,236,229,235,239,242,229,225,110, + 128, 50,110,240,225,242,229,238,235,239,242,229,225,110,128, 50, + 14,227,233,242,227,236,229,235,239,242,229,225,110,128, 50, 96, + 235,239,242,229,225,110,128, 49, 49,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 0,243,233,239,243,235,239,242,229,225, + 110,128, 49, 51,234,229,227,249,242,233,236,236,233, 99,128, 4, + 92,108, 2,116,183,116,194,233,238,229,226,229,236,239,119,128, + 30, 53,243,241,245,225,242,101,128, 51,152,109, 3,116,211,116, + 225,116,236,227,245,226,229,228,243,241,245,225,242,101,128, 51, + 166,239,238,239,243,240,225,227,101,128,255, 75,243,241,245,225, + 242,229,228,243,241,245,225,242,101,128, 51,162,111, 5,117, 8, + 117, 34,117, 72,117, 84,117, 98,104, 2,117, 14,117, 24,233,242, + 225,231,225,238, 97,128, 48, 83,237,243,241,245,225,242,101,128, + 51,192,235, 97, 2,117, 41,117, 49,233,244,232,225,105,128, 14, + 1,244,225,235,225,238, 97,129, 48,179,117, 60,232,225,236,230, + 247,233,228,244,104,128,255,122,239,240,239,243,241,245,225,242, + 101,128, 51, 30,240,240,225,227,249,242,233,236,236,233, 99,128, + 4,129,114, 2,117,104,117,124,229,225,238,243,244,225,238,228, + 225,242,228,243,249,237,226,239,108,128, 50,127,239,238,233,243, + 227,237, 98,128, 3, 67,240, 97, 2,117,141,117,147,242,229,110, + 128, 36,166,243,241,245,225,242,101,128, 51,170,243,233,227,249, + 242,233,236,236,233, 99,128, 4,111,116, 2,117,175,117,184,243, + 241,245,225,242,101,128, 51,207,245,242,238,229,100,128, 2,158, + 117, 2,117,198,117,209,232,233,242,225,231,225,238, 97,128, 48, + 79,235,225,244,225,235,225,238, 97,129, 48,175,117,222,232,225, + 236,230,247,233,228,244,104,128,255,120,246,243,241,245,225,242, + 101,128, 51,184,247,243,241,245,225,242,101,128, 51,190,108,146, + 0,108,118, 38,120, 65,120, 94,120,160,120,198,121, 94,121,103, + 121,119,121,143,121,161,122, 23,122, 64,122,199,122,207,122,240, + 122,249,123, 1,123, 63, 97, 7,118, 54,118, 64,118, 71,118, 78, + 118,103,118,119,120, 53,226,229,238,231,225,236,105,128, 9,178, + 227,245,244,101,128, 1, 58,228,229,246, 97,128, 9, 50,231,117, + 2,118, 85,118, 94,234,225,242,225,244,105,128, 10,178,242,237, + 245,235,232,105,128, 10, 50,235,235,232,225,238,231,249,225,239, + 244,232,225,105,128, 14, 69,109, 10,118,141,119, 80,119, 97,119, + 135,119,149,119,168,119,184,119,204,119,224,119,247, 97, 2,118, + 147,119, 72,236,229,102, 4,118,159,118,173,119, 9,119, 26,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,252,232,225,237, + 250, 97, 2,118,183,118,224,225,226,239,246,101, 2,118,193,118, + 207,230,233,238,225,236,225,242,225,226,233, 99,128,254,248,233, + 243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,247, + 226,229,236,239,119, 2,118,234,118,248,230,233,238,225,236,225, + 242,225,226,233, 99,128,254,250,233,243,239,236,225,244,229,228, + 225,242,225,226,233, 99,128,254,249,233,243,239,236,225,244,229, + 228,225,242,225,226,233, 99,128,254,251,237,225,228,228,225,225, + 226,239,246,101, 2,119, 41,119, 55,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,246,233,243,239,236,225,244,229,228,225, + 242,225,226,233, 99,128,254,245,242,225,226,233, 99,128, 6, 68, + 226,228, 97,129, 3,187,119, 88,243,244,242,239,235,101,128, 1, + 155,229,100,130, 5,220,119,106,119,126,228,225,231,229,243,104, + 129,251, 60,119,117,232,229,226,242,229,119,128,251, 60,232,229, + 226,242,229,119,128, 5,220,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,222,232,225,232,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,252,202,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,254,223,234,229,229,237,233,238,233,244, + 233,225,236,225,242,225,226,233, 99,128,252,201,235,232,225,232, + 233,238,233,244,233,225,236,225,242,225,226,233, 99,128,252,203, + 236,225,237,232,229,232,233,243,239,236,225,244,229,228,225,242, + 225,226,233, 99,128,253,242,237,101, 2,119,254,120, 11,228,233, + 225,236,225,242,225,226,233, 99,128,254,224,229,109, 2,120, 18, + 120, 37,232,225,232,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,253,136,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,252,204,242,231,229,227,233,242,227,236,101,128, 37, + 239, 98, 3,120, 73,120, 78,120, 84,225,114,128, 1,154,229,236, + 116,128, 2,108,239,240,239,237,239,230,111,128, 49, 12, 99, 4, + 120,104,120,111,120,120,120,147,225,242,239,110,128, 1, 62,229, + 228,233,236,236, 97,128, 1, 60,233,242, 99, 2,120,128,120,133, + 236,101,128, 36,219,245,237,230,236,229,248,226,229,236,239,119, + 128, 30, 61,239,237,237,225,225,227,227,229,238,116,128, 1, 60, + 228,239,116,130, 1, 64,120,170,120,179,225,227,227,229,238,116, + 128, 1, 64,226,229,236,239,119,129, 30, 55,120,189,237,225,227, + 242,239,110,128, 30, 57,101, 3,120,206,120,244,121, 89,230,116, + 2,120,213,120,229,225,238,231,236,229,225,226,239,246,229,227, + 237, 98,128, 3, 26,244,225,227,235,226,229,236,239,247,227,237, + 98,128, 3, 24,243,115,132, 0, 60,121, 1,121, 23,121, 35,121, + 81,229,241,245,225,108,129, 34,100,121, 11,239,242,231,242,229, + 225,244,229,114,128, 34,218,237,239,238,239,243,240,225,227,101, + 128,255, 28,111, 2,121, 41,121, 70,114, 2,121, 47,121, 60,229, + 241,245,233,246,225,236,229,238,116,128, 34,114,231,242,229,225, + 244,229,114,128, 34,118,246,229,242,229,241,245,225,108,128, 34, + 102,243,237,225,236,108,128,254,100,250,104,128, 2,110,230,226, + 236,239,227,107,128, 37,140,232,239,239,235,242,229,244,242,239, + 230,236,229,120,128, 2,109,105, 2,121,125,121,130,242, 97,128, + 32,164,247,238,225,242,237,229,238,233,225,110,128, 5,108,106, + 129, 1,201,121,149,229,227,249,242,233,236,236,233, 99,128, 4, + 89,108,132,246,192,121,173,121,197,121,208,121,217, 97, 2,121, + 179,121,186,228,229,246, 97,128, 9, 51,231,245,234,225,242,225, + 244,105,128, 10,179,233,238,229,226,229,236,239,119,128, 30, 59, + 236,225,228,229,246, 97,128, 9, 52,246,239,227,225,236,233, 99, + 3,121,231,121,241,121,248,226,229,238,231,225,236,105,128, 9, + 225,228,229,246, 97,128, 9, 97,246,239,247,229,236,243,233,231, + 110, 2,122, 6,122, 16,226,229,238,231,225,236,105,128, 9,227, + 228,229,246, 97,128, 9, 99,109, 3,122, 31,122, 44,122, 55,233, + 228,228,236,229,244,233,236,228,101,128, 2,107,239,238,239,243, + 240,225,227,101,128,255, 76,243,241,245,225,242,101,128, 51,208, + 111, 6,122, 78,122, 90,122,132,122,143,122,149,122,191,227,232, + 245,236,225,244,232,225,105,128, 14, 44,231,233,227,225,108, 3, + 122,102,122,108,122,127,225,238,100,128, 34, 39,238,239,116,129, + 0,172,122,116,242,229,246,229,242,243,229,100,128, 35, 16,239, + 114,128, 34, 40,236,233,238,231,244,232,225,105,128, 14, 37,238, + 231,115,128, 1,127,247,236,233,238,101, 2,122,159,122,182, 99, + 2,122,165,122,177,229,238,244,229,242,236,233,238,101,128,254, + 78,237, 98,128, 3, 50,228,225,243,232,229,100,128,254, 77,250, + 229,238,231,101,128, 37,202,240,225,242,229,110,128, 36,167,115, + 3,122,215,122,222,122,230,236,225,243,104,128, 1, 66,241,245, + 225,242,101,128, 33, 19,245,240,229,242,233,239,114,128,246,238, + 244,243,232,225,228,101,128, 37,145,245,244,232,225,105,128, 14, + 38,246,239,227,225,236,233, 99, 3,123, 15,123, 25,123, 32,226, + 229,238,231,225,236,105,128, 9,140,228,229,246, 97,128, 9, 12, + 246,239,247,229,236,243,233,231,110, 2,123, 46,123, 56,226,229, + 238,231,225,236,105,128, 9,226,228,229,246, 97,128, 9, 98,248, + 243,241,245,225,242,101,128, 51,211,109,144, 0,109,123,109,125, + 218,125,243,126, 14,126, 39,127, 92,127,114,128,169,128,199,128, + 248,129, 99,129,121,129,146,129,155,130,182,130,210, 97, 12,123, + 135,123,145,123,209,123,216,123,241,124, 33,125,125,125,150,125, + 155,125,169,125,181,125,186,226,229,238,231,225,236,105,128, 9, + 174, 99, 2,123,151,123,203,242,239,110,132, 0,175,123,165,123, + 176,123,182,123,191,226,229,236,239,247,227,237, 98,128, 3, 49, + 227,237, 98,128, 3, 4,236,239,247,237,239,100,128, 2,205,237, + 239,238,239,243,240,225,227,101,128,255,227,245,244,101,128, 30, + 63,228,229,246, 97,128, 9, 46,231,117, 2,123,223,123,232,234, + 225,242,225,244,105,128, 10,174,242,237,245,235,232,105,128, 10, + 46,104, 2,123,247,124, 23,225,240,225,235,104, 2,124, 1,124, + 10,232,229,226,242,229,119,128, 5,164,236,229,230,244,232,229, + 226,242,229,119,128, 5,164,233,242,225,231,225,238, 97,128, 48, + 126,105, 5,124, 45,124,114,124,177,124,207,125,113,227,232,225, + 244,244,225,247, 97, 3,124, 60,124, 91,124, 98,236,239,119, 2, + 124, 68,124, 79,236,229,230,244,244,232,225,105,128,248,149,242, + 233,231,232,244,244,232,225,105,128,248,148,244,232,225,105,128, + 14, 75,245,240,240,229,242,236,229,230,244,244,232,225,105,128, + 248,147,229,107, 3,124,123,124,154,124,161,236,239,119, 2,124, + 131,124,142,236,229,230,244,244,232,225,105,128,248,140,242,233, + 231,232,244,244,232,225,105,128,248,139,244,232,225,105,128, 14, + 72,245,240,240,229,242,236,229,230,244,244,232,225,105,128,248, + 138,232,225,238,225,235,225,116, 2,124,189,124,200,236,229,230, + 244,244,232,225,105,128,248,132,244,232,225,105,128, 14, 49,116, + 3,124,215,124,243,125, 50,225,233,235,232,117, 2,124,225,124, + 236,236,229,230,244,244,232,225,105,128,248,137,244,232,225,105, + 128, 14, 71,232,111, 3,124,252,125, 27,125, 34,236,239,119, 2, + 125, 4,125, 15,236,229,230,244,244,232,225,105,128,248,143,242, + 233,231,232,244,244,232,225,105,128,248,142,244,232,225,105,128, + 14, 73,245,240,240,229,242,236,229,230,244,244,232,225,105,128, + 248,141,242,105, 3,125, 59,125, 90,125, 97,236,239,119, 2,125, + 67,125, 78,236,229,230,244,244,232,225,105,128,248,146,242,233, + 231,232,244,244,232,225,105,128,248,145,244,232,225,105,128, 14, + 74,245,240,240,229,242,236,229,230,244,244,232,225,105,128,248, + 144,249,225,237,239,235,244,232,225,105,128, 14, 70,235,225,244, + 225,235,225,238, 97,129, 48,222,125,138,232,225,236,230,247,233, + 228,244,104,128,255,143,236,101,128, 38, 66,238,243,249,239,238, + 243,241,245,225,242,101,128, 51, 71,241,225,230,232,229,226,242, + 229,119,128, 5,190,242,115,128, 38, 66,115, 2,125,192,125,210, + 239,242,225,227,233,242,227,236,229,232,229,226,242,229,119,128, + 5,175,241,245,225,242,101,128, 51,131, 98, 2,125,224,125,234, + 239,240,239,237,239,230,111,128, 49, 7,243,241,245,225,242,101, + 128, 51,212, 99, 2,125,249,126, 1,233,242,227,236,101,128, 36, + 220,245,226,229,228,243,241,245,225,242,101,128, 51,165,228,239, + 116, 2,126, 22,126, 31,225,227,227,229,238,116,128, 30, 65,226, + 229,236,239,119,128, 30, 67,101, 7,126, 55,126,182,126,193,126, + 208,126,233,127, 14,127, 26,101, 2,126, 61,126,169,109, 4,126, + 71,126, 80,126, 94,126,110,225,242,225,226,233, 99,128, 6, 69, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,226,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,227,237,101, + 2,126,117,126,130,228,233,225,236,225,242,225,226,233, 99,128, + 254,228,229,237,105, 2,126,138,126,153,238,233,244,233,225,236, + 225,242,225,226,233, 99,128,252,209,243,239,236,225,244,229,228, + 225,242,225,226,233, 99,128,252, 72,244,239,242,245,243,241,245, + 225,242,101,128, 51, 77,232,233,242,225,231,225,238, 97,128, 48, + 129,233,250,233,229,242,225,243,241,245,225,242,101,128, 51,126, + 235,225,244,225,235,225,238, 97,129, 48,225,126,221,232,225,236, + 230,247,233,228,244,104,128,255,146,109,130, 5,222,126,241,127, + 5,228,225,231,229,243,104,129,251, 62,126,252,232,229,226,242, + 229,119,128,251, 62,232,229,226,242,229,119,128, 5,222,238,225, + 242,237,229,238,233,225,110,128, 5,116,242,235,232, 97, 3,127, + 37,127, 46,127, 79,232,229,226,242,229,119,128, 5,165,235,229, + 230,245,236, 97, 2,127, 57,127, 66,232,229,226,242,229,119,128, + 5,166,236,229,230,244,232,229,226,242,229,119,128, 5,166,236, + 229,230,244,232,229,226,242,229,119,128, 5,165,104, 2,127, 98, + 127,104,239,239,107,128, 2,113,250,243,241,245,225,242,101,128, + 51,146,105, 6,127,128,127,165,128, 46,128, 57,128, 82,128,139, + 228,100, 2,127,135,127,160,236,229,228,239,244,235,225,244,225, + 235,225,238,225,232,225,236,230,247,233,228,244,104,128,255,101, + 239,116,128, 0,183,229,245,109, 5,127,179,127,214,127,229,127, + 238,128, 33, 97, 2,127,185,127,200,227,233,242,227,236,229,235, + 239,242,229,225,110,128, 50,114,240,225,242,229,238,235,239,242, + 229,225,110,128, 50, 18,227,233,242,227,236,229,235,239,242,229, + 225,110,128, 50,100,235,239,242,229,225,110,128, 49, 65,112, 2, + 127,244,128, 20, 97, 2,127,250,128, 8,238,243,233,239,243,235, + 239,242,229,225,110,128, 49,112,242,229,238,235,239,242,229,225, + 110,128, 50, 4,233,229,245,240,235,239,242,229,225,110,128, 49, + 110,243,233,239,243,235,239,242,229,225,110,128, 49,111,232,233, + 242,225,231,225,238, 97,128, 48,127,235,225,244,225,235,225,238, + 97,129, 48,223,128, 70,232,225,236,230,247,233,228,244,104,128, + 255,144,238,117, 2,128, 89,128,134,115,132, 34, 18,128,101,128, + 112,128,121,128,127,226,229,236,239,247,227,237, 98,128, 3, 32, + 227,233,242,227,236,101,128, 34,150,237,239,100,128, 2,215,240, + 236,245,115,128, 34, 19,244,101,128, 32, 50,242,105, 2,128,146, + 128,160,226,225,225,242,245,243,241,245,225,242,101,128, 51, 74, + 243,241,245,225,242,101,128, 51, 73,108, 2,128,175,128,190,239, + 238,231,236,229,231,244,245,242,238,229,100,128, 2,112,243,241, + 245,225,242,101,128, 51,150,109, 3,128,207,128,221,128,232,227, + 245,226,229,228,243,241,245,225,242,101,128, 51,163,239,238,239, + 243,240,225,227,101,128,255, 77,243,241,245,225,242,229,228,243, + 241,245,225,242,101,128, 51,159,111, 5,129, 4,129, 30,129, 55, + 129, 65,129, 74,104, 2,129, 10,129, 20,233,242,225,231,225,238, + 97,128, 48,130,237,243,241,245,225,242,101,128, 51,193,235,225, + 244,225,235,225,238, 97,129, 48,226,129, 43,232,225,236,230,247, + 233,228,244,104,128,255,147,236,243,241,245,225,242,101,128, 51, + 214,237,225,244,232,225,105,128, 14, 33,246,229,242,243,243,241, + 245,225,242,101,129, 51,167,129, 89,228,243,241,245,225,242,101, + 128, 51,168,240, 97, 2,129,106,129,112,242,229,110,128, 36,168, + 243,241,245,225,242,101,128, 51,171,115, 2,129,127,129,136,243, + 241,245,225,242,101,128, 51,179,245,240,229,242,233,239,114,128, + 246,239,244,245,242,238,229,100,128, 2,111,117,141, 0,181,129, + 185,129,189,129,199,129,223,129,233,129,255,130, 10,130, 35,130, + 58,130, 68,130, 98,130,162,130,172, 49,128, 0,181,225,243,241, + 245,225,242,101,128, 51,130,227,104, 2,129,206,129,216,231,242, + 229,225,244,229,114,128, 34,107,236,229,243,115,128, 34,106,230, + 243,241,245,225,242,101,128, 51,140,103, 2,129,239,129,246,242, + 229,229,107,128, 3,188,243,241,245,225,242,101,128, 51,141,232, + 233,242,225,231,225,238, 97,128, 48,128,235,225,244,225,235,225, + 238, 97,129, 48,224,130, 23,232,225,236,230,247,233,228,244,104, + 128,255,145,108, 2,130, 41,130, 50,243,241,245,225,242,101,128, + 51,149,244,233,240,236,121,128, 0,215,237,243,241,245,225,242, + 101,128, 51,155,238,225,104, 2,130, 76,130, 85,232,229,226,242, + 229,119,128, 5,163,236,229,230,244,232,229,226,242,229,119,128, + 5,163,115, 2,130,104,130,153,233, 99, 3,130,113,130,130,130, + 141,225,236,238,239,244,101,129, 38,106,130,124,228,226,108,128, + 38,107,230,236,225,244,243,233,231,110,128, 38,109,243,232,225, + 242,240,243,233,231,110,128, 38,111,243,241,245,225,242,101,128, + 51,178,246,243,241,245,225,242,101,128, 51,182,247,243,241,245, + 225,242,101,128, 51,188,118, 2,130,188,130,201,237,229,231,225, + 243,241,245,225,242,101,128, 51,185,243,241,245,225,242,101,128, + 51,183,119, 2,130,216,130,229,237,229,231,225,243,241,245,225, + 242,101,128, 51,191,243,241,245,225,242,101,128, 51,189,110,150, + 0,110,131, 30,131,164,131,188,131,254,132, 23,132, 81,132, 91, + 132,158,132,201,134,235,134,253,135, 22,135, 53,135, 79,135,144, + 137,126,137,134,137,159,137,167,138,135,138,145,138,155, 97, 8, + 131, 48,131, 68,131, 75,131, 82,131,107,131,118,131,143,131,155, + 98, 2,131, 54,131, 63,229,238,231,225,236,105,128, 9,168,236, + 97,128, 34, 7,227,245,244,101,128, 1, 68,228,229,246, 97,128, + 9, 40,231,117, 2,131, 89,131, 98,234,225,242,225,244,105,128, + 10,168,242,237,245,235,232,105,128, 10, 40,232,233,242,225,231, + 225,238, 97,128, 48,106,235,225,244,225,235,225,238, 97,129, 48, + 202,131,131,232,225,236,230,247,233,228,244,104,128,255,133,240, + 239,243,244,242,239,240,232,101,128, 1, 73,243,241,245,225,242, + 101,128, 51,129, 98, 2,131,170,131,180,239,240,239,237,239,230, + 111,128, 49, 11,243,240,225,227,101,128, 0,160, 99, 4,131,198, + 131,205,131,214,131,241,225,242,239,110,128, 1, 72,229,228,233, + 236,236, 97,128, 1, 70,233,242, 99, 2,131,222,131,227,236,101, + 128, 36,221,245,237,230,236,229,248,226,229,236,239,119,128, 30, + 75,239,237,237,225,225,227,227,229,238,116,128, 1, 70,228,239, + 116, 2,132, 6,132, 15,225,227,227,229,238,116,128, 30, 69,226, + 229,236,239,119,128, 30, 71,101, 3,132, 31,132, 42,132, 67,232, + 233,242,225,231,225,238, 97,128, 48,109,235,225,244,225,235,225, + 238, 97,129, 48,205,132, 55,232,225,236,230,247,233,228,244,104, + 128,255,136,247,243,232,229,241,229,236,243,233,231,110,128, 32, + 170,230,243,241,245,225,242,101,128, 51,139,103, 2,132, 97,132, + 147, 97, 3,132,105,132,115,132,122,226,229,238,231,225,236,105, + 128, 9,153,228,229,246, 97,128, 9, 25,231,117, 2,132,129,132, + 138,234,225,242,225,244,105,128, 10,153,242,237,245,235,232,105, + 128, 10, 25,239,238,231,245,244,232,225,105,128, 14, 7,104, 2, + 132,164,132,174,233,242,225,231,225,238, 97,128, 48,147,239,239, + 107, 2,132,182,132,189,236,229,230,116,128, 2,114,242,229,244, + 242,239,230,236,229,120,128, 2,115,105, 4,132,211,133,124,133, + 135,133,193,229,245,110, 7,132,229,133, 8,133, 40,133, 54,133, + 63,133, 96,133,109, 97, 2,132,235,132,250,227,233,242,227,236, + 229,235,239,242,229,225,110,128, 50,111,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 15,227,105, 2,133, 15,133, 27,229, + 245,227,235,239,242,229,225,110,128, 49, 53,242,227,236,229,235, + 239,242,229,225,110,128, 50, 97,232,233,229,245,232,235,239,242, + 229,225,110,128, 49, 54,235,239,242,229,225,110,128, 49, 52,240, + 97, 2,133, 70,133, 84,238,243,233,239,243,235,239,242,229,225, + 110,128, 49,104,242,229,238,235,239,242,229,225,110,128, 50, 1, + 243,233,239,243,235,239,242,229,225,110,128, 49,103,244,233,235, + 229,245,244,235,239,242,229,225,110,128, 49,102,232,233,242,225, + 231,225,238, 97,128, 48,107,107, 2,133,141,133,165,225,244,225, + 235,225,238, 97,129, 48,203,133,153,232,225,236,230,247,233,228, + 244,104,128,255,134,232,225,232,233,116, 2,133,175,133,186,236, + 229,230,244,244,232,225,105,128,248,153,244,232,225,105,128, 14, + 77,238,101,141, 0, 57,133,224,133,233,133,243,134, 17,134, 24, + 134, 49,134, 76,134,110,134,122,134,133,134,166,134,174,134,185, + 225,242,225,226,233, 99,128, 6,105,226,229,238,231,225,236,105, + 128, 9,239,227,233,242,227,236,101,129, 36,104,133,254,233,238, + 246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39, + 146,228,229,246, 97,128, 9,111,231,117, 2,134, 31,134, 40,234, + 225,242,225,244,105,128, 10,239,242,237,245,235,232,105,128, 10, + 111,232, 97, 2,134, 56,134, 67,227,235,225,242,225,226,233, 99, + 128, 6,105,238,231,250,232,239,117,128, 48, 41,105, 2,134, 82, + 134,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229, + 110,128, 50, 40,238,230,229,242,233,239,114,128, 32,137,237,239, + 238,239,243,240,225,227,101,128,255, 25,239,236,228,243,244,249, + 236,101,128,247, 57,112, 2,134,139,134,146,225,242,229,110,128, + 36,124,229,114, 2,134,153,134,159,233,239,100,128, 36,144,243, + 233,225,110,128, 6,249,242,239,237,225,110,128, 33,120,243,245, + 240,229,242,233,239,114,128, 32,121,116, 2,134,191,134,229,229, + 229,110, 2,134,199,134,208,227,233,242,227,236,101,128, 36,114, + 112, 2,134,214,134,221,225,242,229,110,128, 36,134,229,242,233, + 239,100,128, 36,154,232,225,105,128, 14, 89,106,129, 1,204,134, + 241,229,227,249,242,233,236,236,233, 99,128, 4, 90,235,225,244, + 225,235,225,238, 97,129, 48,243,135, 10,232,225,236,230,247,233, + 228,244,104,128,255,157,108, 2,135, 28,135, 42,229,231,242,233, + 231,232,244,236,239,238,103,128, 1,158,233,238,229,226,229,236, + 239,119,128, 30, 73,109, 2,135, 59,135, 70,239,238,239,243,240, + 225,227,101,128,255, 78,243,241,245,225,242,101,128, 51,154,110, + 2,135, 85,135,135, 97, 3,135, 93,135,103,135,110,226,229,238, + 231,225,236,105,128, 9,163,228,229,246, 97,128, 9, 35,231,117, + 2,135,117,135,126,234,225,242,225,244,105,128, 10,163,242,237, + 245,235,232,105,128, 10, 35,238,225,228,229,246, 97,128, 9, 41, + 111, 6,135,158,135,169,135,194,135,235,136,187,137,114,232,233, + 242,225,231,225,238, 97,128, 48,110,235,225,244,225,235,225,238, + 97,129, 48,206,135,182,232,225,236,230,247,233,228,244,104,128, + 255,137,110, 3,135,202,135,218,135,227,226,242,229,225,235,233, + 238,231,243,240,225,227,101,128, 0,160,229,238,244,232,225,105, + 128, 14, 19,245,244,232,225,105,128, 14, 25,239,110, 7,135,252, + 136, 5,136, 19,136, 53,136, 69,136,110,136,169,225,242,225,226, + 233, 99,128, 6, 70,230,233,238,225,236,225,242,225,226,233, 99, + 128,254,230,231,232,245,238,238, 97, 2,136, 30,136, 39,225,242, + 225,226,233, 99,128, 6,186,230,233,238,225,236,225,242,225,226, + 233, 99,128,251,159,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,254,231,234,229,229,237,105, 2,136, 79,136, 94,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,252,210,243,239, + 236,225,244,229,228,225,242,225,226,233, 99,128,252, 75,237,101, + 2,136,117,136,130,228,233,225,236,225,242,225,226,233, 99,128, + 254,232,229,237,105, 2,136,138,136,153,238,233,244,233,225,236, + 225,242,225,226,233, 99,128,252,213,243,239,236,225,244,229,228, + 225,242,225,226,233, 99,128,252, 78,238,239,239,238,230,233,238, + 225,236,225,242,225,226,233, 99,128,252,141,116, 7,136,203,136, + 214,136,243,137, 22,137, 34,137, 54,137, 80,227,239,238,244,225, + 233,238,115,128, 34, 12,101, 2,136,220,136,236,236,229,237,229, + 238,116,129, 34, 9,136,231,239,102,128, 34, 9,241,245,225,108, + 128, 34, 96,231,242,229,225,244,229,114,129, 34,111,136,255,238, + 239,114, 2,137, 7,137, 15,229,241,245,225,108,128, 34,113,236, + 229,243,115,128, 34,121,233,228,229,238,244,233,227,225,108,128, + 34, 98,236,229,243,115,129, 34,110,137, 43,238,239,242,229,241, + 245,225,108,128, 34,112,112, 2,137, 60,137, 70,225,242,225,236, + 236,229,108,128, 34, 38,242,229,227,229,228,229,115,128, 34,128, + 243,117, 3,137, 89,137, 96,137,105,226,243,229,116,128, 34,132, + 227,227,229,229,228,115,128, 34,129,240,229,242,243,229,116,128, + 34,133,247,225,242,237,229,238,233,225,110,128, 5,118,240,225, + 242,229,110,128, 36,169,115, 2,137,140,137,149,243,241,245,225, + 242,101,128, 51,177,245,240,229,242,233,239,114,128, 32,127,244, + 233,236,228,101,128, 0,241,117,132, 3,189,137,179,137,190,138, + 15,138, 98,232,233,242,225,231,225,238, 97,128, 48,108,107, 2, + 137,196,137,220,225,244,225,235,225,238, 97,129, 48,204,137,208, + 232,225,236,230,247,233,228,244,104,128,255,135,244, 97, 3,137, + 229,137,239,137,246,226,229,238,231,225,236,105,128, 9,188,228, + 229,246, 97,128, 9, 60,231,117, 2,137,253,138, 6,234,225,242, + 225,244,105,128, 10,188,242,237,245,235,232,105,128, 10, 60,109, + 2,138, 21,138, 55,226,229,242,243,233,231,110,130, 0, 35,138, + 35,138, 47,237,239,238,239,243,240,225,227,101,128,255, 3,243, + 237,225,236,108,128,254, 95,229,114, 2,138, 62,138, 94,225,236, + 243,233,231,110, 2,138, 73,138, 81,231,242,229,229,107,128, 3, + 116,236,239,247,229,242,231,242,229,229,107,128, 3,117,111,128, + 33, 22,110,130, 5,224,138,106,138,126,228,225,231,229,243,104, + 129,251, 64,138,117,232,229,226,242,229,119,128,251, 64,232,229, + 226,242,229,119,128, 5,224,246,243,241,245,225,242,101,128, 51, + 181,247,243,241,245,225,242,101,128, 51,187,249, 97, 3,138,164, + 138,174,138,181,226,229,238,231,225,236,105,128, 9,158,228,229, + 246, 97,128, 9, 30,231,117, 2,138,188,138,197,234,225,242,225, + 244,105,128, 10,158,242,237,245,235,232,105,128, 10, 30,111,147, + 0,111,138,248,139, 14,139, 92,140, 6,140, 78,140, 93,140,133, + 141, 0,141, 21,141, 59,141, 70,141,248,143, 82,143,146,143,179, + 143,225,144, 98,144,145,144,157, 97, 2,138,254,139, 5,227,245, + 244,101,128, 0,243,238,231,244,232,225,105,128, 14, 45, 98, 4, + 139, 24,139, 66,139, 75,139, 85,225,242,242,229,100,130, 2,117, + 139, 36,139, 47,227,249,242,233,236,236,233, 99,128, 4,233,228, + 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, + 4,235,229,238,231,225,236,105,128, 9,147,239,240,239,237,239, + 230,111,128, 49, 27,242,229,246,101,128, 1, 79, 99, 3,139,100, + 139,173,139,252, 97, 2,139,106,139,167,238,228,242, 97, 3,139, + 117,139,124,139,135,228,229,246, 97,128, 9, 17,231,245,234,225, + 242,225,244,105,128, 10,145,246,239,247,229,236,243,233,231,110, + 2,139,149,139,156,228,229,246, 97,128, 9, 73,231,245,234,225, + 242,225,244,105,128, 10,201,242,239,110,128, 1,210,233,242, 99, + 2,139,181,139,186,236,101,128, 36,222,245,237,230,236,229,120, + 133, 0,244,139,205,139,213,139,224,139,232,139,244,225,227,245, + 244,101,128, 30,209,228,239,244,226,229,236,239,119,128, 30,217, + 231,242,225,246,101,128, 30,211,232,239,239,235,225,226,239,246, + 101,128, 30,213,244,233,236,228,101,128, 30,215,249,242,233,236, + 236,233, 99,128, 4, 62,100, 4,140, 16,140, 39,140, 45,140, 68, + 226,108, 2,140, 23,140, 31,225,227,245,244,101,128, 1, 81,231, + 242,225,246,101,128, 2, 13,229,246, 97,128, 9, 19,233,229,242, + 229,243,233,115,129, 0,246,140, 57,227,249,242,233,236,236,233, + 99,128, 4,231,239,244,226,229,236,239,119,128, 30,205,101,129, + 1, 83,140, 84,235,239,242,229,225,110,128, 49, 90,103, 3,140, + 101,140,116,140,123,239,238,229,107,129, 2,219,140,110,227,237, + 98,128, 3, 40,242,225,246,101,128, 0,242,245,234,225,242,225, + 244,105,128, 10,147,104, 4,140,143,140,154,140,164,140,242,225, + 242,237,229,238,233,225,110,128, 5,133,233,242,225,231,225,238, + 97,128, 48, 74,111, 2,140,170,140,180,239,235,225,226,239,246, + 101,128, 30,207,242,110,133, 1,161,140,195,140,203,140,214,140, + 222,140,234,225,227,245,244,101,128, 30,219,228,239,244,226,229, + 236,239,119,128, 30,227,231,242,225,246,101,128, 30,221,232,239, + 239,235,225,226,239,246,101,128, 30,223,244,233,236,228,101,128, + 30,225,245,238,231,225,242,245,237,236,225,245,116,128, 1, 81, + 105,129, 1,163,141, 6,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 15,107, 2,141, 27,141, 51,225,244,225,235,225, + 238, 97,129, 48,170,141, 39,232,225,236,230,247,233,228,244,104, + 128,255,117,239,242,229,225,110,128, 49, 87,236,229,232,229,226, + 242,229,119,128, 5,171,109, 6,141, 84,141,112,141,119,141,208, + 141,219,141,237,225,227,242,239,110,130, 1, 77,141, 96,141,104, + 225,227,245,244,101,128, 30, 83,231,242,225,246,101,128, 30, 81, + 228,229,246, 97,128, 9, 80,229,231, 97,133, 3,201,141,135,141, + 139,141,150,141,164,141,180, 49,128, 3,214,227,249,242,233,236, + 236,233, 99,128, 4, 97,236,225,244,233,238,227,236,239,243,229, + 100,128, 2,119,242,239,245,238,228,227,249,242,233,236,236,233, + 99,128, 4,123,116, 2,141,186,141,201,233,244,236,239,227,249, + 242,233,236,236,233, 99,128, 4,125,239,238,239,115,128, 3,206, + 231,245,234,225,242,225,244,105,128, 10,208,233,227,242,239,110, + 129, 3,191,141,229,244,239,238,239,115,128, 3,204,239,238,239, + 243,240,225,227,101,128,255, 79,238,101,145, 0, 49,142, 31,142, + 40,142, 50,142, 80,142,105,142,114,142,123,142,148,142,182,142, + 216,142,228,142,247,143, 2,143, 35,143, 45,143, 53,143, 64,225, + 242,225,226,233, 99,128, 6, 97,226,229,238,231,225,236,105,128, + 9,231,227,233,242,227,236,101,129, 36, 96,142, 61,233,238,246, + 229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39,138, + 100, 2,142, 86,142, 92,229,246, 97,128, 9,103,239,244,229,238, + 236,229,225,228,229,114,128, 32, 36,229,233,231,232,244,104,128, + 33, 91,230,233,244,244,229,100,128,246,220,231,117, 2,142,130, + 142,139,234,225,242,225,244,105,128, 10,231,242,237,245,235,232, + 105,128, 10,103,232, 97, 3,142,157,142,168,142,173,227,235,225, + 242,225,226,233, 99,128, 6, 97,236,102,128, 0,189,238,231,250, + 232,239,117,128, 48, 33,105, 2,142,188,142,206,228,229,239,231, + 242,225,240,232,233,227,240,225,242,229,110,128, 50, 32,238,230, + 229,242,233,239,114,128, 32,129,237,239,238,239,243,240,225,227, + 101,128,255, 17,238,245,237,229,242,225,244,239,242,226,229,238, + 231,225,236,105,128, 9,244,239,236,228,243,244,249,236,101,128, + 247, 49,112, 2,143, 8,143, 15,225,242,229,110,128, 36,116,229, + 114, 2,143, 22,143, 28,233,239,100,128, 36,136,243,233,225,110, + 128, 6,241,241,245,225,242,244,229,114,128, 0,188,242,239,237, + 225,110,128, 33,112,243,245,240,229,242,233,239,114,128, 0,185, + 244,104, 2,143, 71,143, 76,225,105,128, 14, 81,233,242,100,128, + 33, 83,111, 3,143, 90,143,124,143,140,103, 2,143, 96,143,114, + 239,238,229,107,129, 1,235,143,105,237,225,227,242,239,110,128, + 1,237,245,242,237,245,235,232,105,128, 10, 19,237,225,244,242, + 225,231,245,242,237,245,235,232,105,128, 10, 75,240,229,110,128, + 2, 84,112, 3,143,154,143,161,143,172,225,242,229,110,128, 36, + 170,229,238,226,245,236,236,229,116,128, 37,230,244,233,239,110, + 128, 35, 37,114, 2,143,185,143,214,100, 2,143,191,143,202,230, + 229,237,233,238,233,238,101,128, 0,170,237,225,243,227,245,236, + 233,238,101,128, 0,186,244,232,239,231,239,238,225,108,128, 34, + 31,115, 5,143,237,144, 13,144, 30,144, 75,144, 88,232,239,242, + 116, 2,143,246,143,253,228,229,246, 97,128, 9, 18,246,239,247, + 229,236,243,233,231,238,228,229,246, 97,128, 9, 74,236,225,243, + 104,129, 0,248,144, 22,225,227,245,244,101,128, 1,255,237,225, + 236,108, 2,144, 39,144, 50,232,233,242,225,231,225,238, 97,128, + 48, 73,235,225,244,225,235,225,238, 97,129, 48,169,144, 63,232, + 225,236,230,247,233,228,244,104,128,255,107,244,242,239,235,229, + 225,227,245,244,101,128, 1,255,245,240,229,242,233,239,114,128, + 246,240,116, 2,144,104,144,115,227,249,242,233,236,236,233, 99, + 128, 4,127,233,236,228,101,130, 0,245,144,126,144,134,225,227, + 245,244,101,128, 30, 77,228,233,229,242,229,243,233,115,128, 30, + 79,245,226,239,240,239,237,239,230,111,128, 49, 33,118, 2,144, + 163,144,244,229,114, 2,144,170,144,236,236,233,238,101,131, 32, + 62,144,183,144,206,144,229, 99, 2,144,189,144,201,229,238,244, + 229,242,236,233,238,101,128,254, 74,237, 98,128, 3, 5,100, 2, + 144,212,144,220,225,243,232,229,100,128,254, 73,226,236,247,225, + 246,121,128,254, 76,247,225,246,121,128,254, 75,243,227,239,242, + 101,128, 0,175,239,247,229,236,243,233,231,110, 3,145, 3,145, + 13,145, 20,226,229,238,231,225,236,105,128, 9,203,228,229,246, + 97,128, 9, 75,231,245,234,225,242,225,244,105,128, 10,203,112, + 145, 0,112,145, 69,147,197,147,208,147,217,147,229,149,154,149, + 164,150,156,151,175,152, 9,152, 35,152,166,152,174,153, 76,153, + 134,153,162,153,172, 97, 14,145, 99,145,131,145,141,145,148,145, + 155,145,203,145,214,145,228,145,239,146, 30,146, 44,147, 56,147, + 95,147,185, 97, 2,145,105,145,117,237,240,243,243,241,245,225, + 242,101,128, 51,128,243,229,238,244,239,243,241,245,225,242,101, + 128, 51, 43,226,229,238,231,225,236,105,128, 9,170,227,245,244, + 101,128, 30, 85,228,229,246, 97,128, 9, 42,103, 2,145,161,145, + 179,101, 2,145,167,145,174,228,239,247,110,128, 33,223,245,112, + 128, 33,222,117, 2,145,185,145,194,234,225,242,225,244,105,128, + 10,170,242,237,245,235,232,105,128, 10, 42,232,233,242,225,231, + 225,238, 97,128, 48,113,233,249,225,238,238,239,233,244,232,225, + 105,128, 14, 47,235,225,244,225,235,225,238, 97,128, 48,209,108, + 2,145,245,146, 14,225,244,225,236,233,250,225,244,233,239,238, + 227,249,242,233,236,236,233,227,227,237, 98,128, 4,132,239,227, + 232,235,225,227,249,242,233,236,236,233, 99,128, 4,192,238,243, + 233,239,243,235,239,242,229,225,110,128, 49,127,114, 3,146, 52, + 146, 73,147, 45, 97, 2,146, 58,146, 66,231,242,225,240,104,128, + 0,182,236,236,229,108,128, 34, 37,229,110, 2,146, 80,146,190, + 236,229,230,116,136, 0, 40,146,103,146,118,146,123,146,128,146, + 139,146,151,146,174,146,179,225,236,244,239,238,229,225,242,225, + 226,233, 99,128,253, 62,226,116,128,248,237,229,120,128,248,236, + 233,238,230,229,242,233,239,114,128, 32,141,237,239,238,239,243, + 240,225,227,101,128,255, 8,115, 2,146,157,146,164,237,225,236, + 108,128,254, 89,245,240,229,242,233,239,114,128, 32,125,244,112, + 128,248,235,246,229,242,244,233,227,225,108,128,254, 53,242,233, + 231,232,116,136, 0, 41,146,214,146,229,146,234,146,239,146,250, + 147, 6,147, 29,147, 34,225,236,244,239,238,229,225,242,225,226, + 233, 99,128,253, 63,226,116,128,248,248,229,120,128,248,247,233, + 238,230,229,242,233,239,114,128, 32,142,237,239,238,239,243,240, + 225,227,101,128,255, 9,115, 2,147, 12,147, 19,237,225,236,108, + 128,254, 90,245,240,229,242,233,239,114,128, 32,126,244,112,128, + 248,246,246,229,242,244,233,227,225,108,128,254, 54,244,233,225, + 236,228,233,230,102,128, 34, 2,115, 3,147, 64,147, 75,147, 87, + 229,241,232,229,226,242,229,119,128, 5,192,232,244,225,232,229, + 226,242,229,119,128, 5,153,241,245,225,242,101,128, 51,169,244, + 225,104,134, 5,183,147,113,147,127,147,132,147,141,147,156,147, + 172, 49, 2,147,119,147,123, 49,128, 5,183,100,128, 5,183,178, + 97,128, 5,183,232,229,226,242,229,119,128, 5,183,238,225,242, + 242,239,247,232,229,226,242,229,119,128, 5,183,241,245,225,242, + 244,229,242,232,229,226,242,229,119,128, 5,183,247,233,228,229, + 232,229,226,242,229,119,128, 5,183,250,229,242,232,229,226,242, + 229,119,128, 5,161,226,239,240,239,237,239,230,111,128, 49, 6, + 227,233,242,227,236,101,128, 36,223,228,239,244,225,227,227,229, + 238,116,128, 30, 87,101,137, 5,228,147,251,148, 6,148, 26,148, + 38,148, 58,148,160,148,171,148,192,149,147,227,249,242,233,236, + 236,233, 99,128, 4, 63,228,225,231,229,243,104,129,251, 68,148, + 17,232,229,226,242,229,119,128,251, 68,229,250,233,243,241,245, + 225,242,101,128, 51, 59,230,233,238,225,236,228,225,231,229,243, + 232,232,229,226,242,229,119,128,251, 67,104, 5,148, 70,148, 93, + 148,101,148,115,148,145,225,114, 2,148, 77,148, 84,225,226,233, + 99,128, 6,126,237,229,238,233,225,110,128, 5,122,229,226,242, + 229,119,128, 5,228,230,233,238,225,236,225,242,225,226,233, 99, + 128,251, 87,105, 2,148,121,148,136,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,251, 88,242,225,231,225,238, 97,128, 48, + 122,237,229,228,233,225,236,225,242,225,226,233, 99,128,251, 89, + 235,225,244,225,235,225,238, 97,128, 48,218,237,233,228,228,236, + 229,232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,167, + 114, 5,148,204,148,216,149, 2,149,123,149,136,225,230,229,232, + 229,226,242,229,119,128,251, 78,227,229,238,116,131, 0, 37,148, + 229,148,238,148,250,225,242,225,226,233, 99,128, 6,106,237,239, + 238,239,243,240,225,227,101,128,255, 5,243,237,225,236,108,128, + 254,106,105, 2,149, 8,149,105,239,100,134, 0, 46,149, 25,149, + 36,149, 47,149, 59,149, 70,149, 82,225,242,237,229,238,233,225, + 110,128, 5,137,227,229,238,244,229,242,229,100,128, 0,183,232, + 225,236,230,247,233,228,244,104,128,255, 97,233,238,230,229,242, + 233,239,114,128,246,231,237,239,238,239,243,240,225,227,101,128, + 255, 14,115, 2,149, 88,149, 95,237,225,236,108,128,254, 82,245, + 240,229,242,233,239,114,128,246,232,243,240,239,237,229,238,233, + 231,242,229,229,235,227,237, 98,128, 3, 66,240,229,238,228,233, + 227,245,236,225,114,128, 34,165,244,232,239,245,243,225,238,100, + 128, 32, 48,243,229,244, 97,128, 32,167,230,243,241,245,225,242, + 101,128, 51,138,104, 3,149,172,149,222,150,103, 97, 3,149,180, + 149,190,149,197,226,229,238,231,225,236,105,128, 9,171,228,229, + 246, 97,128, 9, 43,231,117, 2,149,204,149,213,234,225,242,225, + 244,105,128, 10,171,242,237,245,235,232,105,128, 10, 43,105,133, + 3,198,149,236,149,240,150, 70,150, 78,150, 89, 49,128, 3,213, + 229,245,240,104, 4,149,253,150, 32,150, 47,150, 56, 97, 2,150, + 3,150, 18,227,233,242,227,236,229,235,239,242,229,225,110,128, + 50,122,240,225,242,229,238,235,239,242,229,225,110,128, 50, 26, + 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,108,235, + 239,242,229,225,110,128, 49, 77,240,225,242,229,238,235,239,242, + 229,225,110,128, 50, 12,236,225,244,233,110,128, 2,120,238,244, + 232,245,244,232,225,105,128, 14, 58,243,249,237,226,239,236,231, + 242,229,229,107,128, 3,213,111, 3,150,111,150,116,150,142,239, + 107,128, 1,165,240,104, 2,150,123,150,132,225,238,244,232,225, + 105,128, 14, 30,245,238,231,244,232,225,105,128, 14, 28,243,225, + 237,240,232,225,239,244,232,225,105,128, 14, 32,105,133, 3,192, + 150,170,151,126,151,137,151,148,151,162,229,245,112, 6,150,186, + 150,221,150,253,151, 25,151, 39,151, 91, 97, 2,150,192,150,207, + 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,115,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 19,227,105, 2, + 150,228,150,240,229,245,227,235,239,242,229,225,110,128, 49,118, + 242,227,236,229,235,239,242,229,225,110,128, 50,101,107, 2,151, + 3,151, 17,233,249,229,239,235,235,239,242,229,225,110,128, 49, + 114,239,242,229,225,110,128, 49, 66,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 5,243,233,239,115, 2,151, 48,151, 76, + 107, 2,151, 54,151, 68,233,249,229,239,235,235,239,242,229,225, + 110,128, 49,116,239,242,229,225,110,128, 49, 68,244,233,235,229, + 245,244,235,239,242,229,225,110,128, 49,117,116, 2,151, 97,151, + 112,232,233,229,245,244,232,235,239,242,229,225,110,128, 49,119, + 233,235,229,245,244,235,239,242,229,225,110,128, 49,115,232,233, + 242,225,231,225,238, 97,128, 48,116,235,225,244,225,235,225,238, + 97,128, 48,212,243,249,237,226,239,236,231,242,229,229,107,128, + 3,214,247,242,225,242,237,229,238,233,225,110,128, 5,131,236, + 245,115,132, 0, 43,151,189,151,200,151,209,151,242,226,229,236, + 239,247,227,237, 98,128, 3, 31,227,233,242,227,236,101,128, 34, + 149,109, 2,151,215,151,222,233,238,245,115,128, 0,177,111, 2, + 151,228,151,232,100,128, 2,214,238,239,243,240,225,227,101,128, + 255, 11,115, 2,151,248,151,255,237,225,236,108,128,254, 98,245, + 240,229,242,233,239,114,128, 32,122,109, 2,152, 15,152, 26,239, + 238,239,243,240,225,227,101,128,255, 80,243,241,245,225,242,101, + 128, 51,216,111, 5,152, 47,152, 58,152,125,152,136,152,146,232, + 233,242,225,231,225,238, 97,128, 48,125,233,238,244,233,238,231, + 233,238,228,229,120, 4,152, 78,152, 90,152,102,152,115,228,239, + 247,238,247,232,233,244,101,128, 38, 31,236,229,230,244,247,232, + 233,244,101,128, 38, 28,242,233,231,232,244,247,232,233,244,101, + 128, 38, 30,245,240,247,232,233,244,101,128, 38, 29,235,225,244, + 225,235,225,238, 97,128, 48,221,240,236,225,244,232,225,105,128, + 14, 27,243,244,225,236,237,225,242,107,129, 48, 18,152,159,230, + 225,227,101,128, 48, 32,240,225,242,229,110,128, 36,171,114, 3, + 152,182,152,208,152,233,101, 2,152,188,152,196,227,229,228,229, + 115,128, 34,122,243,227,242,233,240,244,233,239,110,128, 33, 30, + 233,237,101, 2,152,216,152,222,237,239,100,128, 2,185,242,229, + 246,229,242,243,229,100,128, 32, 53,111, 4,152,243,152,250,153, + 4,153, 17,228,245,227,116,128, 34, 15,234,229,227,244,233,246, + 101,128, 35, 5,236,239,238,231,229,228,235,225,238, 97,128, 48, + 252,112, 2,153, 23,153, 60,101, 2,153, 29,153, 36,236,236,239, + 114,128, 35, 24,242,243,117, 2,153, 44,153, 51,226,243,229,116, + 128, 34,130,240,229,242,243,229,116,128, 34,131,239,242,244,233, + 239,110,129, 34, 55,153, 71,225,108,128, 34, 29,115, 2,153, 82, + 153,125,105,130, 3,200,153, 90,153,101,227,249,242,233,236,236, + 233, 99,128, 4,113,236,233,240,238,229,245,237,225,244,225,227, + 249,242,233,236,236,233,227,227,237, 98,128, 4,134,243,241,245, + 225,242,101,128, 51,176,117, 2,153,140,153,151,232,233,242,225, + 231,225,238, 97,128, 48,119,235,225,244,225,235,225,238, 97,128, + 48,215,246,243,241,245,225,242,101,128, 51,180,247,243,241,245, + 225,242,101,128, 51,186,113,136, 0,113,153,202,154,251,155, 6, + 155, 15,155, 22,155, 34,155, 72,155, 80, 97, 4,153,212,153,235, + 154, 43,154,234,100, 2,153,218,153,224,229,246, 97,128, 9, 88, + 237,225,232,229,226,242,229,119,128, 5,168,102, 4,153,245,153, + 254,154, 12,154, 28,225,242,225,226,233, 99,128, 6, 66,230,233, + 238,225,236,225,242,225,226,233, 99,128,254,214,233,238,233,244, + 233,225,236,225,242,225,226,233, 99,128,254,215,237,229,228,233, + 225,236,225,242,225,226,233, 99,128,254,216,237,225,244,115,136, + 5,184,154, 66,154, 86,154,100,154,105,154,110,154,119,154,134, + 154,221, 49, 3,154, 74,154, 78,154, 82, 48,128, 5,184, 97,128, + 5,184, 99,128, 5,184, 50, 2,154, 92,154, 96, 55,128, 5,184, + 57,128, 5,184,179, 51,128, 5,184,228,101,128, 5,184,232,229, + 226,242,229,119,128, 5,184,238,225,242,242,239,247,232,229,226, + 242,229,119,128, 5,184,113, 2,154,140,154,206,225,244,225,110, + 4,154,153,154,162,154,177,154,193,232,229,226,242,229,119,128, + 5,184,238,225,242,242,239,247,232,229,226,242,229,119,128, 5, + 184,241,245,225,242,244,229,242,232,229,226,242,229,119,128, 5, + 184,247,233,228,229,232,229,226,242,229,119,128, 5,184,245,225, + 242,244,229,242,232,229,226,242,229,119,128, 5,184,247,233,228, + 229,232,229,226,242,229,119,128, 5,184,242,238,229,249,240,225, + 242,225,232,229,226,242,229,119,128, 5,159,226,239,240,239,237, + 239,230,111,128, 49, 17,227,233,242,227,236,101,128, 36,224,232, + 239,239,107,128, 2,160,237,239,238,239,243,240,225,227,101,128, + 255, 81,239,102,130, 5,231,155, 43,155, 63,228,225,231,229,243, + 104,129,251, 71,155, 54,232,229,226,242,229,119,128,251, 71,232, + 229,226,242,229,119,128, 5,231,240,225,242,229,110,128, 36,172, + 117, 4,155, 90,155,102,155,191,156, 22,225,242,244,229,242,238, + 239,244,101,128, 38,105,226,245,244,115,135, 5,187,155,123,155, + 128,155,133,155,138,155,147,155,162,155,178,177, 56,128, 5,187, + 178, 53,128, 5,187,179, 49,128, 5,187,232,229,226,242,229,119, + 128, 5,187,238,225,242,242,239,247,232,229,226,242,229,119,128, + 5,187,241,245,225,242,244,229,242,232,229,226,242,229,119,128, + 5,187,247,233,228,229,232,229,226,242,229,119,128, 5,187,229, + 243,244,233,239,110,133, 0, 63,155,210,155,233,155,250,156, 2, + 156, 14,225,114, 2,155,217,155,224,225,226,233, 99,128, 6, 31, + 237,229,238,233,225,110,128, 5, 94,228,239,247,110,129, 0,191, + 155,242,243,237,225,236,108,128,247,191,231,242,229,229,107,128, + 3,126,237,239,238,239,243,240,225,227,101,128,255, 31,243,237, + 225,236,108,128,247, 63,239,244,101, 4,156, 34,156,105,156,125, + 156,154,228,226,108,133, 0, 34,156, 50,156, 57,156, 64,156, 76, + 156, 97,226,225,243,101,128, 32, 30,236,229,230,116,128, 32, 28, + 237,239,238,239,243,240,225,227,101,128,255, 2,240,242,233,237, + 101,129, 48, 30,156, 86,242,229,246,229,242,243,229,100,128, 48, + 29,242,233,231,232,116,128, 32, 29,236,229,230,116,129, 32, 24, + 156,114,242,229,246,229,242,243,229,100,128, 32, 27,114, 2,156, + 131,156,141,229,246,229,242,243,229,100,128, 32, 27,233,231,232, + 116,129, 32, 25,156,150,110,128, 1, 73,243,233,238,231,108, 2, + 156,164,156,171,226,225,243,101,128, 32, 26,101,129, 0, 39,156, + 177,237,239,238,239,243,240,225,227,101,128,255, 7,114,145, 0, + 114,156,227,157,231,157,242,158, 33,158, 84,159,101,159,125,159, + 220,161,254,162, 35,162, 47,162,101,162,109,163, 15,163, 26,163, + 61,163,161, 97, 11,156,251,157, 6,157, 16,157, 23,157, 88,157, + 104,157,129,157,140,157,165,157,188,157,225,225,242,237,229,238, + 233,225,110,128, 5,124,226,229,238,231,225,236,105,128, 9,176, + 227,245,244,101,128, 1, 85,100, 4,157, 33,157, 39,157, 53,157, + 79,229,246, 97,128, 9, 48,233,227,225,108,129, 34, 26,157, 48, + 229,120,128,248,229,239,246,229,242,243,243,241,245,225,242,101, + 129, 51,174,157, 69,228,243,241,245,225,242,101,128, 51,175,243, + 241,245,225,242,101,128, 51,173,230,101,129, 5,191,157, 95,232, + 229,226,242,229,119,128, 5,191,231,117, 2,157,111,157,120,234, + 225,242,225,244,105,128, 10,176,242,237,245,235,232,105,128, 10, + 48,232,233,242,225,231,225,238, 97,128, 48,137,235,225,244,225, + 235,225,238, 97,129, 48,233,157,153,232,225,236,230,247,233,228, + 244,104,128,255,151,236,239,247,229,242,228,233,225,231,239,238, + 225,236,226,229,238,231,225,236,105,128, 9,241,109, 2,157,194, + 157,217,233,228,228,236,229,228,233,225,231,239,238,225,236,226, + 229,238,231,225,236,105,128, 9,240,243,232,239,242,110,128, 2, + 100,244,233,111,128, 34, 54,226,239,240,239,237,239,230,111,128, + 49, 22, 99, 4,157,252,158, 3,158, 12,158, 20,225,242,239,110, + 128, 1, 89,229,228,233,236,236, 97,128, 1, 87,233,242,227,236, + 101,128, 36,225,239,237,237,225,225,227,227,229,238,116,128, 1, + 87,100, 2,158, 39,158, 49,226,236,231,242,225,246,101,128, 2, + 17,239,116, 2,158, 56,158, 65,225,227,227,229,238,116,128, 30, + 89,226,229,236,239,119,129, 30, 91,158, 75,237,225,227,242,239, + 110,128, 30, 93,101, 6,158, 98,158,143,158,178,158,233,159, 2, + 159, 35,102, 2,158,104,158,117,229,242,229,238,227,229,237,225, + 242,107,128, 32, 59,236,229,248,243,117, 2,158,127,158,134,226, + 243,229,116,128, 34,134,240,229,242,243,229,116,128, 34,135,231, + 233,243,244,229,114, 2,158,154,158,159,229,100,128, 0,174,115, + 2,158,165,158,171,225,238,115,128,248,232,229,242,233,102,128, + 246,218,104, 3,158,186,158,209,158,223,225,114, 2,158,193,158, + 200,225,226,233, 99,128, 6, 49,237,229,238,233,225,110,128, 5, + 128,230,233,238,225,236,225,242,225,226,233, 99,128,254,174,233, + 242,225,231,225,238, 97,128, 48,140,235,225,244,225,235,225,238, + 97,129, 48,236,158,246,232,225,236,230,247,233,228,244,104,128, + 255,154,243,104,130, 5,232,159, 11,159, 26,228,225,231,229,243, + 232,232,229,226,242,229,119,128,251, 72,232,229,226,242,229,119, + 128, 5,232,118, 3,159, 43,159, 56,159, 88,229,242,243,229,228, + 244,233,236,228,101,128, 34, 61,233, 97, 2,159, 63,159, 72,232, + 229,226,242,229,119,128, 5,151,237,245,231,242,225,243,232,232, + 229,226,242,229,119,128, 5,151,236,239,231,233,227,225,236,238, + 239,116,128, 35, 16,230,233,243,232,232,239,239,107,129, 2,126, + 159,114,242,229,246,229,242,243,229,100,128, 2,127,104, 2,159, + 131,159,154, 97, 2,159,137,159,147,226,229,238,231,225,236,105, + 128, 9,221,228,229,246, 97,128, 9, 93,111,131, 3,193,159,164, + 159,193,159,207,239,107,129, 2,125,159,171,244,245,242,238,229, + 100,129, 2,123,159,182,243,245,240,229,242,233,239,114,128, 2, + 181,243,249,237,226,239,236,231,242,229,229,107,128, 3,241,244, + 233,227,232,239,239,235,237,239,100,128, 2,222,105, 6,159,234, + 161, 22,161, 68,161, 79,161,104,161,240,229,245,108, 9,160, 0, + 160, 35,160, 50,160, 64,160,110,160,124,160,210,160,223,161, 2, + 97, 2,160, 6,160, 21,227,233,242,227,236,229,235,239,242,229, + 225,110,128, 50,113,240,225,242,229,238,235,239,242,229,225,110, + 128, 50, 17,227,233,242,227,236,229,235,239,242,229,225,110,128, + 50, 99,232,233,229,245,232,235,239,242,229,225,110,128, 49, 64, + 107, 2,160, 70,160,102,233,249,229,239,107, 2,160, 80,160, 89, + 235,239,242,229,225,110,128, 49, 58,243,233,239,243,235,239,242, + 229,225,110,128, 49,105,239,242,229,225,110,128, 49, 57,237,233, + 229,245,237,235,239,242,229,225,110,128, 49, 59,112, 3,160,132, + 160,164,160,179, 97, 2,160,138,160,152,238,243,233,239,243,235, + 239,242,229,225,110,128, 49,108,242,229,238,235,239,242,229,225, + 110,128, 50, 3,232,233,229,245,240,232,235,239,242,229,225,110, + 128, 49, 63,233,229,245,112, 2,160,188,160,197,235,239,242,229, + 225,110,128, 49, 60,243,233,239,243,235,239,242,229,225,110,128, + 49,107,243,233,239,243,235,239,242,229,225,110,128, 49, 61,116, + 2,160,229,160,244,232,233,229,245,244,232,235,239,242,229,225, + 110,128, 49, 62,233,235,229,245,244,235,239,242,229,225,110,128, + 49,106,249,229,239,242,233,238,232,233,229,245,232,235,239,242, + 229,225,110,128, 49,109,231,232,116, 2,161, 30,161, 38,225,238, + 231,236,101,128, 34, 31,116, 2,161, 44,161, 58,225,227,235,226, + 229,236,239,247,227,237, 98,128, 3, 25,242,233,225,238,231,236, + 101,128, 34,191,232,233,242,225,231,225,238, 97,128, 48,138,235, + 225,244,225,235,225,238, 97,129, 48,234,161, 92,232,225,236,230, + 247,233,228,244,104,128,255,152,110, 2,161,110,161,226,103,131, + 2,218,161,120,161,131,161,137,226,229,236,239,247,227,237, 98, + 128, 3, 37,227,237, 98,128, 3, 10,232,225,236,102, 2,161,146, + 161,192,236,229,230,116,131, 2,191,161,159,161,170,161,181,225, + 242,237,229,238,233,225,110,128, 5, 89,226,229,236,239,247,227, + 237, 98,128, 3, 28,227,229,238,244,229,242,229,100,128, 2,211, + 242,233,231,232,116,130, 2,190,161,204,161,215,226,229,236,239, + 247,227,237, 98,128, 3, 57,227,229,238,244,229,242,229,100,128, + 2,210,246,229,242,244,229,228,226,242,229,246,101,128, 2, 19, + 244,244,239,242,245,243,241,245,225,242,101,128, 51, 81,108, 2, + 162, 4,162, 15,233,238,229,226,229,236,239,119,128, 30, 95,239, + 238,231,236,229,103,129, 2,124,162, 26,244,245,242,238,229,100, + 128, 2,122,237,239,238,239,243,240,225,227,101,128,255, 82,111, + 3,162, 55,162, 66,162, 91,232,233,242,225,231,225,238, 97,128, + 48,141,235,225,244,225,235,225,238, 97,129, 48,237,162, 79,232, + 225,236,230,247,233,228,244,104,128,255,155,242,245,225,244,232, + 225,105,128, 14, 35,240,225,242,229,110,128, 36,173,114, 3,162, + 117,162,153,162,183, 97, 3,162,125,162,135,162,142,226,229,238, + 231,225,236,105,128, 9,220,228,229,246, 97,128, 9, 49,231,245, + 242,237,245,235,232,105,128, 10, 92,229,104, 2,162,160,162,169, + 225,242,225,226,233, 99,128, 6,145,230,233,238,225,236,225,242, + 225,226,233, 99,128,251,141,246,239,227,225,236,233, 99, 4,162, + 199,162,209,162,216,162,227,226,229,238,231,225,236,105,128, 9, + 224,228,229,246, 97,128, 9, 96,231,245,234,225,242,225,244,105, + 128, 10,224,246,239,247,229,236,243,233,231,110, 3,162,243,162, + 253,163, 4,226,229,238,231,225,236,105,128, 9,196,228,229,246, + 97,128, 9, 68,231,245,234,225,242,225,244,105,128, 10,196,243, + 245,240,229,242,233,239,114,128,246,241,116, 2,163, 32,163, 40, + 226,236,239,227,107,128, 37,144,245,242,238,229,100,129, 2,121, + 163, 50,243,245,240,229,242,233,239,114,128, 2,180,117, 4,163, + 71,163, 82,163,107,163,154,232,233,242,225,231,225,238, 97,128, + 48,139,235,225,244,225,235,225,238, 97,129, 48,235,163, 95,232, + 225,236,230,247,233,228,244,104,128,255,153,112, 2,163,113,163, + 148,229,101, 2,163,120,163,134,237,225,242,235,226,229,238,231, + 225,236,105,128, 9,242,243,233,231,238,226,229,238,231,225,236, + 105,128, 9,243,233,225,104,128,246,221,244,232,225,105,128, 14, + 36,246,239,227,225,236,233, 99, 4,163,177,163,187,163,194,163, + 205,226,229,238,231,225,236,105,128, 9,139,228,229,246, 97,128, + 9, 11,231,245,234,225,242,225,244,105,128, 10,139,246,239,247, + 229,236,243,233,231,110, 3,163,221,163,231,163,238,226,229,238, + 231,225,236,105,128, 9,195,228,229,246, 97,128, 9, 67,231,245, + 234,225,242,225,244,105,128, 10,195,115,147, 0,115,164, 35,166, + 5,166, 16,166,142,166,181,169,123,169,134,172, 21,174,159,174, + 205,174,232,175,167,175,234,177, 11,177, 21,177,207,178, 24,178, + 194,178,204, 97, 9,164, 55,164, 65,164, 86,164,158,164,183,164, + 194,164,219,164,251,165, 35,226,229,238,231,225,236,105,128, 9, + 184,227,245,244,101,129, 1, 91,164, 74,228,239,244,225,227,227, + 229,238,116,128, 30,101,100, 5,164, 98,164,107,164,113,164,127, + 164,143,225,242,225,226,233, 99,128, 6, 53,229,246, 97,128, 9, + 56,230,233,238,225,236,225,242,225,226,233, 99,128,254,186,233, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,254,187,237, + 229,228,233,225,236,225,242,225,226,233, 99,128,254,188,231,117, + 2,164,165,164,174,234,225,242,225,244,105,128, 10,184,242,237, + 245,235,232,105,128, 10, 56,232,233,242,225,231,225,238, 97,128, + 48, 85,235,225,244,225,235,225,238, 97,129, 48,181,164,207,232, + 225,236,230,247,233,228,244,104,128,255,123,236,236,225,236,236, + 225,232,239,245,225,236,225,249,232,229,247,225,243,225,236,236, + 225,237,225,242,225,226,233, 99,128,253,250,237,229,235,104,130, + 5,225,165, 6,165, 26,228,225,231,229,243,104,129,251, 65,165, + 17,232,229,226,242,229,119,128,251, 65,232,229,226,242,229,119, + 128, 5,225,242, 97, 5,165, 48,165,122,165,130,165,180,165,188, + 97, 5,165, 60,165, 68,165, 76,165,107,165,115,225,244,232,225, + 105,128, 14, 50,229,244,232,225,105,128, 14, 65,233,237,225,233, + 109, 2,165, 86,165, 97,225,236,225,233,244,232,225,105,128, 14, + 68,245,225,238,244,232,225,105,128, 14, 67,237,244,232,225,105, + 128, 14, 51,244,232,225,105,128, 14, 48,229,244,232,225,105,128, + 14, 64,105, 3,165,138,165,162,165,173,105, 2,165,144,165,155, + 236,229,230,244,244,232,225,105,128,248,134,244,232,225,105,128, + 14, 53,236,229,230,244,244,232,225,105,128,248,133,244,232,225, + 105,128, 14, 52,239,244,232,225,105,128, 14, 66,117, 3,165,196, + 165,246,165,253,101, 3,165,204,165,228,165,239,101, 2,165,210, + 165,221,236,229,230,244,244,232,225,105,128,248,136,244,232,225, + 105,128, 14, 55,236,229,230,244,244,232,225,105,128,248,135,244, + 232,225,105,128, 14, 54,244,232,225,105,128, 14, 56,245,244,232, + 225,105,128, 14, 57,226,239,240,239,237,239,230,111,128, 49, 25, + 99, 5,166, 28,166, 49,166, 58,166,107,166,129,225,242,239,110, + 129, 1, 97,166, 37,228,239,244,225,227,227,229,238,116,128, 30, + 103,229,228,233,236,236, 97,128, 1, 95,232,247, 97,131, 2, 89, + 166, 70,166, 81,166,100,227,249,242,233,236,236,233, 99,128, 4, + 217,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,219,232,239,239,107,128, 2, 90,233,242, 99, 2,166, + 115,166,120,236,101,128, 36,226,245,237,230,236,229,120,128, 1, + 93,239,237,237,225,225,227,227,229,238,116,128, 2, 25,228,239, + 116, 2,166,150,166,159,225,227,227,229,238,116,128, 30, 97,226, + 229,236,239,119,129, 30, 99,166,169,228,239,244,225,227,227,229, + 238,116,128, 30,105,101, 9,166,201,166,217,166,252,167, 61,167, + 164,167,191,167,216,168, 41,168, 68,225,231,245,236,236,226,229, + 236,239,247,227,237, 98,128, 3, 60, 99, 2,166,223,166,245,239, + 238,100,129, 32, 51,166,231,244,239,238,229,227,232,233,238,229, + 243,101,128, 2,202,244,233,239,110,128, 0,167,229,110, 4,167, + 7,167, 16,167, 30,167, 46,225,242,225,226,233, 99,128, 6, 51, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,178,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,179,237,229, + 228,233,225,236,225,242,225,226,233, 99,128,254,180,231,239,108, + 135, 5,182,167, 81,167, 95,167,100,167,109,167,124,167,140,167, + 151, 49, 2,167, 87,167, 91, 51,128, 5,182,102,128, 5,182,178, + 99,128, 5,182,232,229,226,242,229,119,128, 5,182,238,225,242, + 242,239,247,232,229,226,242,229,119,128, 5,182,241,245,225,242, + 244,229,242,232,229,226,242,229,119,128, 5,182,244,225,232,229, + 226,242,229,119,128, 5,146,247,233,228,229,232,229,226,242,229, + 119,128, 5,182,104, 2,167,170,167,181,225,242,237,229,238,233, + 225,110,128, 5,125,233,242,225,231,225,238, 97,128, 48, 91,235, + 225,244,225,235,225,238, 97,129, 48,187,167,204,232,225,236,230, + 247,233,228,244,104,128,255,126,237,105, 2,167,223,168, 10,227, + 239,236,239,110,131, 0, 59,167,237,167,246,168, 2,225,242,225, + 226,233, 99,128, 6, 27,237,239,238,239,243,240,225,227,101,128, + 255, 27,243,237,225,236,108,128,254, 84,246,239,233,227,229,228, + 237,225,242,235,235,225,238, 97,129, 48,156,168, 29,232,225,236, + 230,247,233,228,244,104,128,255,159,238,116, 2,168, 48,168, 58, + 233,243,241,245,225,242,101,128, 51, 34,239,243,241,245,225,242, + 101,128, 51, 35,246,229,110,142, 0, 55,168,102,168,111,168,121, + 168,151,168,158,168,168,168,193,168,220,168,254,169, 10,169, 21, + 169, 54,169, 62,169, 73,225,242,225,226,233, 99,128, 6,103,226, + 229,238,231,225,236,105,128, 9,237,227,233,242,227,236,101,129, + 36,102,168,132,233,238,246,229,242,243,229,243,225,238,243,243, + 229,242,233,102,128, 39,144,228,229,246, 97,128, 9,109,229,233, + 231,232,244,232,115,128, 33, 94,231,117, 2,168,175,168,184,234, + 225,242,225,244,105,128, 10,237,242,237,245,235,232,105,128, 10, + 109,232, 97, 2,168,200,168,211,227,235,225,242,225,226,233, 99, + 128, 6,103,238,231,250,232,239,117,128, 48, 39,105, 2,168,226, + 168,244,228,229,239,231,242,225,240,232,233,227,240,225,242,229, + 110,128, 50, 38,238,230,229,242,233,239,114,128, 32,135,237,239, + 238,239,243,240,225,227,101,128,255, 23,239,236,228,243,244,249, + 236,101,128,247, 55,112, 2,169, 27,169, 34,225,242,229,110,128, + 36,122,229,114, 2,169, 41,169, 47,233,239,100,128, 36,142,243, + 233,225,110,128, 6,247,242,239,237,225,110,128, 33,118,243,245, + 240,229,242,233,239,114,128, 32,119,116, 2,169, 79,169,117,229, + 229,110, 2,169, 87,169, 96,227,233,242,227,236,101,128, 36,112, + 112, 2,169,102,169,109,225,242,229,110,128, 36,132,229,242,233, + 239,100,128, 36,152,232,225,105,128, 14, 87,230,244,232,249,240, + 232,229,110,128, 0,173,104, 7,169,150,170,124,170,135,170,149, + 171, 94,171,107,172, 15, 97, 6,169,164,169,175,169,185,169,196, + 170, 83,170,108,225,242,237,229,238,233,225,110,128, 5,119,226, + 229,238,231,225,236,105,128, 9,182,227,249,242,233,236,236,233, + 99,128, 4, 72,100, 2,169,202,170, 42,228, 97, 4,169,213,169, + 222,169,253,170, 11,225,242,225,226,233, 99,128, 6, 81,228,225, + 237,237, 97, 2,169,232,169,241,225,242,225,226,233, 99,128,252, + 97,244,225,238,225,242,225,226,233, 99,128,252, 94,230,225,244, + 232,225,225,242,225,226,233, 99,128,252, 96,235,225,243,242, 97, + 2,170, 21,170, 30,225,242,225,226,233, 99,128,252, 98,244,225, + 238,225,242,225,226,233, 99,128,252, 95,101,132, 37,146,170, 54, + 170, 61,170, 69,170, 78,228,225,242,107,128, 37,147,236,233,231, + 232,116,128, 37,145,237,229,228,233,245,109,128, 37,146,246, 97, + 128, 9, 54,231,117, 2,170, 90,170, 99,234,225,242,225,244,105, + 128, 10,182,242,237,245,235,232,105,128, 10, 54,236,243,232,229, + 236,229,244,232,229,226,242,229,119,128, 5,147,226,239,240,239, + 237,239,230,111,128, 49, 21,227,232,225,227,249,242,233,236,236, + 233, 99,128, 4, 73,101, 4,170,159,170,224,170,234,170,251,229, + 110, 4,170,170,170,179,170,193,170,209,225,242,225,226,233, 99, + 128, 6, 52,230,233,238,225,236,225,242,225,226,233, 99,128,254, + 182,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,254, + 183,237,229,228,233,225,236,225,242,225,226,233, 99,128,254,184, + 233,227,239,240,244,233, 99,128, 3,227,241,229,108,129, 32,170, + 170,242,232,229,226,242,229,119,128, 32,170,246, 97,134, 5,176, + 171, 12,171, 27,171, 41,171, 50,171, 65,171, 81, 49, 2,171, 18, + 171, 23,177, 53,128, 5,176, 53,128, 5,176, 50, 2,171, 33,171, + 37, 50,128, 5,176,101,128, 5,176,232,229,226,242,229,119,128, + 5,176,238,225,242,242,239,247,232,229,226,242,229,119,128, 5, + 176,241,245,225,242,244,229,242,232,229,226,242,229,119,128, 5, + 176,247,233,228,229,232,229,226,242,229,119,128, 5,176,232,225, + 227,249,242,233,236,236,233, 99,128, 4,187,105, 2,171,113,171, + 124,237,225,227,239,240,244,233, 99,128, 3,237,110,131, 5,233, + 171,134,171,217,171,226,100, 2,171,140,171,206,225,231,229,243, + 104,130,251, 73,171,152,171,161,232,229,226,242,229,119,128,251, + 73,115, 2,171,167,171,187,232,233,238,228,239,116,129,251, 44, + 171,178,232,229,226,242,229,119,128,251, 44,233,238,228,239,116, + 129,251, 45,171,197,232,229,226,242,229,119,128,251, 45,239,244, + 232,229,226,242,229,119,128, 5,193,232,229,226,242,229,119,128, + 5,233,115, 2,171,232,171,252,232,233,238,228,239,116,129,251, + 42,171,243,232,229,226,242,229,119,128,251, 42,233,238,228,239, + 116,129,251, 43,172, 6,232,229,226,242,229,119,128,251, 43,239, + 239,107,128, 2,130,105, 8,172, 39,172, 83,172, 94,172,119,172, + 149,172,157,172,170,173, 85,231,237, 97,131, 3,195,172, 51,172, + 55,172, 63, 49,128, 3,194,230,233,238,225,108,128, 3,194,236, + 245,238,225,244,229,243,249,237,226,239,236,231,242,229,229,107, + 128, 3,242,232,233,242,225,231,225,238, 97,128, 48, 87,235,225, + 244,225,235,225,238, 97,129, 48,183,172,107,232,225,236,230,247, + 233,228,244,104,128,255,124,236,245,113, 2,172,127,172,136,232, + 229,226,242,229,119,128, 5,189,236,229,230,244,232,229,226,242, + 229,119,128, 5,189,237,233,236,225,114,128, 34, 60,238,228,239, + 244,232,229,226,242,229,119,128, 5,194,239,115, 6,172,185,172, + 220,172,252,173, 24,173, 38,173, 70, 97, 2,172,191,172,206,227, + 233,242,227,236,229,235,239,242,229,225,110,128, 50,116,240,225, + 242,229,238,235,239,242,229,225,110,128, 50, 20,227,105, 2,172, + 227,172,239,229,245,227,235,239,242,229,225,110,128, 49,126,242, + 227,236,229,235,239,242,229,225,110,128, 50,102,107, 2,173, 2, + 173, 16,233,249,229,239,235,235,239,242,229,225,110,128, 49,122, + 239,242,229,225,110,128, 49, 69,238,233,229,245,238,235,239,242, + 229,225,110,128, 49,123,112, 2,173, 44,173, 57,225,242,229,238, + 235,239,242,229,225,110,128, 50, 6,233,229,245,240,235,239,242, + 229,225,110,128, 49,125,244,233,235,229,245,244,235,239,242,229, + 225,110,128, 49,124,120,141, 0, 54,173,115,173,124,173,134,173, + 164,173,171,173,196,173,223,174, 1,174, 13,174, 24,174, 57,174, + 65,174, 76,225,242,225,226,233, 99,128, 6,102,226,229,238,231, + 225,236,105,128, 9,236,227,233,242,227,236,101,129, 36,101,173, + 145,233,238,246,229,242,243,229,243,225,238,243,243,229,242,233, + 102,128, 39,143,228,229,246, 97,128, 9,108,231,117, 2,173,178, + 173,187,234,225,242,225,244,105,128, 10,236,242,237,245,235,232, + 105,128, 10,108,232, 97, 2,173,203,173,214,227,235,225,242,225, + 226,233, 99,128, 6,102,238,231,250,232,239,117,128, 48, 38,105, + 2,173,229,173,247,228,229,239,231,242,225,240,232,233,227,240, + 225,242,229,110,128, 50, 37,238,230,229,242,233,239,114,128, 32, + 134,237,239,238,239,243,240,225,227,101,128,255, 22,239,236,228, + 243,244,249,236,101,128,247, 54,112, 2,174, 30,174, 37,225,242, + 229,110,128, 36,121,229,114, 2,174, 44,174, 50,233,239,100,128, + 36,141,243,233,225,110,128, 6,246,242,239,237,225,110,128, 33, + 117,243,245,240,229,242,233,239,114,128, 32,118,116, 2,174, 82, + 174,153,229,229,110, 2,174, 90,174,132, 99, 2,174, 96,174,104, + 233,242,227,236,101,128, 36,111,245,242,242,229,238,227,249,228, + 229,238,239,237,233,238,225,244,239,242,226,229,238,231,225,236, + 105,128, 9,249,112, 2,174,138,174,145,225,242,229,110,128, 36, + 131,229,242,233,239,100,128, 36,151,232,225,105,128, 14, 86,108, + 2,174,165,174,185,225,243,104,129, 0, 47,174,173,237,239,238, + 239,243,240,225,227,101,128,255, 15,239,238,103,129, 1,127,174, + 193,228,239,244,225,227,227,229,238,116,128, 30,155,109, 2,174, + 211,174,221,233,236,229,230,225,227,101,128, 38, 58,239,238,239, + 243,240,225,227,101,128,255, 83,111, 6,174,246,175, 40,175, 51, + 175, 76,175,121,175,132,102, 2,174,252,175, 10,240,225,243,245, + 241,232,229,226,242,229,119,128, 5,195,116, 2,175, 16,175, 25, + 232,249,240,232,229,110,128, 0,173,243,233,231,238,227,249,242, + 233,236,236,233, 99,128, 4, 76,232,233,242,225,231,225,238, 97, + 128, 48, 93,235,225,244,225,235,225,238, 97,129, 48,189,175, 64, + 232,225,236,230,247,233,228,244,104,128,255,127,236,233,228,245, + 115, 2,175, 86,175,103,236,239,238,231,239,246,229,242,236,225, + 249,227,237, 98,128, 3, 56,243,232,239,242,244,239,246,229,242, + 236,225,249,227,237, 98,128, 3, 55,242,245,243,233,244,232,225, + 105,128, 14, 41,115, 3,175,140,175,150,175,158,225,236,225,244, + 232,225,105,128, 14, 40,239,244,232,225,105,128, 14, 11,245,225, + 244,232,225,105,128, 14, 42,240, 97, 3,175,176,175,196,175,228, + 227,101,129, 0, 32,175,183,232,225,227,235,225,242,225,226,233, + 99,128, 0, 32,228,101,129, 38, 96,175,203,243,245,233,116, 2, + 175,212,175,220,226,236,225,227,107,128, 38, 96,247,232,233,244, + 101,128, 38,100,242,229,110,128, 36,174,241,245,225,242,101, 11, + 176, 6,176, 17,176, 31,176, 56,176, 73,176, 99,176,114,176,147, + 176,174,176,230,176,245,226,229,236,239,247,227,237, 98,128, 3, + 59, 99, 2,176, 23,176, 27, 99,128, 51,196,109,128, 51,157,228, + 233,225,231,239,238,225,236,227,242,239,243,243,232,225,244,227, + 232,230,233,236,108,128, 37,169,232,239,242,233,250,239,238,244, + 225,236,230,233,236,108,128, 37,164,107, 2,176, 79,176, 83,103, + 128, 51,143,109,129, 51,158,176, 89,227,225,240,233,244,225,108, + 128, 51,206,108, 2,176,105,176,109,110,128, 51,209,239,103,128, + 51,210,109, 4,176,124,176,128,176,133,176,137,103,128, 51,142, + 233,108,128, 51,213,109,128, 51,156,243,241,245,225,242,229,100, + 128, 51,161,239,242,244,232,239,231,239,238,225,236,227,242,239, + 243,243,232,225,244,227,232,230,233,236,108,128, 37,166,245,240, + 240,229,114, 2,176,184,176,207,236,229,230,244,244,239,236,239, + 247,229,242,242,233,231,232,244,230,233,236,108,128, 37,167,242, + 233,231,232,244,244,239,236,239,247,229,242,236,229,230,244,230, + 233,236,108,128, 37,168,246,229,242,244,233,227,225,236,230,233, + 236,108,128, 37,165,247,232,233,244,229,247,233,244,232,243,237, + 225,236,236,226,236,225,227,107,128, 37,163,242,243,241,245,225, + 242,101,128, 51,219,115, 2,177, 27,177,197, 97, 4,177, 37,177, + 47,177, 54,177, 65,226,229,238,231,225,236,105,128, 9,183,228, + 229,246, 97,128, 9, 55,231,245,234,225,242,225,244,105,128, 10, + 183,238,103, 8,177, 84,177, 98,177,112,177,126,177,141,177,155, + 177,169,177,182,227,233,229,245,227,235,239,242,229,225,110,128, + 49, 73,232,233,229,245,232,235,239,242,229,225,110,128, 49,133, + 233,229,245,238,231,235,239,242,229,225,110,128, 49,128,235,233, + 249,229,239,235,235,239,242,229,225,110,128, 49, 50,238,233,229, + 245,238,235,239,242,229,225,110,128, 49,101,240,233,229,245,240, + 235,239,242,229,225,110,128, 49, 67,243,233,239,243,235,239,242, + 229,225,110,128, 49, 70,244,233,235,229,245,244,235,239,242,229, + 225,110,128, 49, 56,245,240,229,242,233,239,114,128,246,242,116, + 2,177,213,177,236,229,242,236,233,238,103,129, 0,163,177,224, + 237,239,238,239,243,240,225,227,101,128,255,225,242,239,235,101, + 2,177,245,178, 6,236,239,238,231,239,246,229,242,236,225,249, + 227,237, 98,128, 3, 54,243,232,239,242,244,239,246,229,242,236, + 225,249,227,237, 98,128, 3, 53,117, 7,178, 40,178, 72,178, 94, + 178,105,178,146,178,156,178,160,226,243,229,116,130, 34,130,178, + 51,178, 62,238,239,244,229,241,245,225,108,128, 34,138,239,242, + 229,241,245,225,108,128, 34,134, 99, 2,178, 78,178, 86,227,229, + 229,228,115,128, 34,123,232,244,232,225,116,128, 34, 11,232,233, + 242,225,231,225,238, 97,128, 48, 89,107, 2,178,111,178,135,225, + 244,225,235,225,238, 97,129, 48,185,178,123,232,225,236,230,247, + 233,228,244,104,128,255,125,245,238,225,242,225,226,233, 99,128, + 6, 82,237,237,225,244,233,239,110,128, 34, 17,110,128, 38, 60, + 240,229,242,243,229,116,130, 34,131,178,173,178,184,238,239,244, + 229,241,245,225,108,128, 34,139,239,242,229,241,245,225,108,128, + 34,135,246,243,241,245,225,242,101,128, 51,220,249,239,245,247, + 225,229,242,225,243,241,245,225,242,101,128, 51,124,116,144, 0, + 116,179, 1,180, 10,180, 31,180,174,180,214,183, 6,186,144,187, + 219,187,231,187,243,189, 20,189, 45,189,131,190, 55,190,239,191, + 73, 97, 10,179, 23,179, 33,179, 54,179, 61,179, 86,179,164,179, + 181,179,206,179,220,179,224,226,229,238,231,225,236,105,128, 9, + 164,227,107, 2,179, 40,179, 47,228,239,247,110,128, 34,164,236, + 229,230,116,128, 34,163,228,229,246, 97,128, 9, 36,231,117, 2, + 179, 68,179, 77,234,225,242,225,244,105,128, 10,164,242,237,245, + 235,232,105,128, 10, 36,104, 4,179, 96,179,105,179,119,179,149, + 225,242,225,226,233, 99,128, 6, 55,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,194,105, 2,179,125,179,140,238,233,244, + 233,225,236,225,242,225,226,233, 99,128,254,195,242,225,231,225, + 238, 97,128, 48, 95,237,229,228,233,225,236,225,242,225,226,233, + 99,128,254,196,233,243,249,239,245,229,242,225,243,241,245,225, + 242,101,128, 51,125,235,225,244,225,235,225,238, 97,129, 48,191, + 179,194,232,225,236,230,247,233,228,244,104,128,255,128,244,247, + 229,229,236,225,242,225,226,233, 99,128, 6, 64,117,128, 3,196, + 118,130, 5,234,179,232,180, 1,228,225,231,229,115,129,251, 74, + 179,242,104,129,251, 74,179,248,232,229,226,242,229,119,128,251, + 74,232,229,226,242,229,119,128, 5,234, 98, 2,180, 16,180, 21, + 225,114,128, 1,103,239,240,239,237,239,230,111,128, 49, 10, 99, + 6,180, 45,180, 52,180, 59,180, 68,180,134,180,161,225,242,239, + 110,128, 1,101,227,245,242,108,128, 2,168,229,228,233,236,236, + 97,128, 1, 99,232,229,104, 4,180, 80,180, 89,180,103,180,119, + 225,242,225,226,233, 99,128, 6,134,230,233,238,225,236,225,242, + 225,226,233, 99,128,251,123,233,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,251,124,237,229,228,233,225,236,225,242,225, + 226,233, 99,128,251,125,233,242, 99, 2,180,142,180,147,236,101, + 128, 36,227,245,237,230,236,229,248,226,229,236,239,119,128, 30, + 113,239,237,237,225,225,227,227,229,238,116,128, 1, 99,100, 2, + 180,180,180,190,233,229,242,229,243,233,115,128, 30,151,239,116, + 2,180,197,180,206,225,227,227,229,238,116,128, 30,107,226,229, + 236,239,119,128, 30,109,101, 9,180,234,180,245,181, 9,182, 19, + 182, 44,182,108,182,175,182,180,182,232,227,249,242,233,236,236, + 233, 99,128, 4, 66,228,229,243,227,229,238,228,229,242,227,249, + 242,233,236,236,233, 99,128, 4,173,104, 7,181, 25,181, 34,181, + 48,181, 88,181,118,181,159,182, 1,225,242,225,226,233, 99,128, + 6, 42,230,233,238,225,236,225,242,225,226,233, 99,128,254,150, + 232,225,232,105, 2,181, 57,181, 72,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,252,162,243,239,236,225,244,229,228,225, + 242,225,226,233, 99,128,252, 12,105, 2,181, 94,181,109,238,233, + 244,233,225,236,225,242,225,226,233, 99,128,254,151,242,225,231, + 225,238, 97,128, 48,102,234,229,229,237,105, 2,181,128,181,143, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,161,243, + 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 11,109, + 2,181,165,181,199,225,242,226,245,244, 97, 2,181,176,181,185, + 225,242,225,226,233, 99,128, 6, 41,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,148,101, 2,181,205,181,218,228,233,225, + 236,225,242,225,226,233, 99,128,254,152,229,237,105, 2,181,226, + 181,241,238,233,244,233,225,236,225,242,225,226,233, 99,128,252, + 164,243,239,236,225,244,229,228,225,242,225,226,233, 99,128,252, + 14,238,239,239,238,230,233,238,225,236,225,242,225,226,233, 99, + 128,252,115,235,225,244,225,235,225,238, 97,129, 48,198,182, 32, + 232,225,236,230,247,233,228,244,104,128,255,131,108, 2,182, 50, + 182, 69,229,240,232,239,238,101,129, 33, 33,182, 61,226,236,225, + 227,107,128, 38, 14,233,243,232, 97, 2,182, 78,182, 93,231,229, + 228,239,236,225,232,229,226,242,229,119,128, 5,160,241,229,244, + 225,238,225,232,229,226,242,229,119,128, 5,169,110, 4,182,118, + 182,127,182,146,182,167,227,233,242,227,236,101,128, 36,105,233, + 228,229,239,231,242,225,240,232,233,227,240,225,242,229,110,128, + 50, 41,112, 2,182,152,182,159,225,242,229,110,128, 36,125,229, + 242,233,239,100,128, 36,145,242,239,237,225,110,128, 33,121,243, + 104,128, 2,167,116,131, 5,216,182,190,182,210,182,219,228,225, + 231,229,243,104,129,251, 56,182,201,232,229,226,242,229,119,128, + 251, 56,232,229,226,242,229,119,128, 5,216,243,229,227,249,242, + 233,236,236,233, 99,128, 4,181,246,233,114, 2,182,240,182,249, + 232,229,226,242,229,119,128, 5,155,236,229,230,244,232,229,226, + 242,229,119,128, 5,155,104, 6,183, 20,183,172,184, 38,184,170, + 185, 77,186,134, 97, 5,183, 32,183, 42,183, 49,183, 74,183,103, + 226,229,238,231,225,236,105,128, 9,165,228,229,246, 97,128, 9, + 37,231,117, 2,183, 56,183, 65,234,225,242,225,244,105,128, 10, + 165,242,237,245,235,232,105,128, 10, 37,108, 2,183, 80,183, 89, + 225,242,225,226,233, 99,128, 6, 48,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,172,238,244,232,225,235,232,225,116, 3, + 183,118,183,149,183,156,236,239,119, 2,183,126,183,137,236,229, + 230,244,244,232,225,105,128,248,152,242,233,231,232,244,244,232, + 225,105,128,248,151,244,232,225,105,128, 14, 76,245,240,240,229, + 242,236,229,230,244,244,232,225,105,128,248,150,101, 3,183,180, + 183,244,184, 11,104, 4,183,190,183,199,183,213,183,229,225,242, + 225,226,233, 99,128, 6, 43,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,154,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,254,155,237,229,228,233,225,236,225,242,225,226,233, + 99,128,254,156,242,101, 2,183,251,184, 4,229,248,233,243,244, + 115,128, 34, 3,230,239,242,101,128, 34, 52,244, 97,130, 3,184, + 184, 20,184, 24, 49,128, 3,209,243,249,237,226,239,236,231,242, + 229,229,107,128, 3,209,105, 2,184, 44,184,130,229,245,244,104, + 4,184, 57,184, 92,184,107,184,116, 97, 2,184, 63,184, 78,227, + 233,242,227,236,229,235,239,242,229,225,110,128, 50,121,240,225, + 242,229,238,235,239,242,229,225,110,128, 50, 25,227,233,242,227, + 236,229,235,239,242,229,225,110,128, 50,107,235,239,242,229,225, + 110,128, 49, 76,240,225,242,229,238,235,239,242,229,225,110,128, + 50, 11,242,244,229,229,110, 2,184,140,184,149,227,233,242,227, + 236,101,128, 36,108,112, 2,184,155,184,162,225,242,229,110,128, + 36,128,229,242,233,239,100,128, 36,148,111, 6,184,184,184,201, + 184,206,184,220,184,225,185, 22,238,225,238,231,237,239,238,244, + 232,239,244,232,225,105,128, 14, 17,239,107,128, 1,173,240,232, + 245,244,232,225,239,244,232,225,105,128, 14, 18,242,110,128, 0, + 254,244,104, 3,184,234,185, 2,185, 12, 97, 2,184,240,184,250, + 232,225,238,244,232,225,105,128, 14, 23,238,244,232,225,105,128, + 14, 16,239,238,231,244,232,225,105,128, 14, 24,245,238,231,244, + 232,225,105,128, 14, 22,245,243,225,238,100, 2,185, 32,185, 43, + 227,249,242,233,236,236,233, 99,128, 4,130,243,243,229,240,225, + 242,225,244,239,114, 2,185, 58,185, 67,225,242,225,226,233, 99, + 128, 6,108,240,229,242,243,233,225,110,128, 6,108,242,229,101, + 144, 0, 51,185,115,185,124,185,134,185,164,185,171,185,181,185, + 206,185,233,186, 11,186, 23,186, 42,186, 53,186, 86,186,108,186, + 116,186,127,225,242,225,226,233, 99,128, 6, 99,226,229,238,231, + 225,236,105,128, 9,233,227,233,242,227,236,101,129, 36, 98,185, + 145,233,238,246,229,242,243,229,243,225,238,243,243,229,242,233, + 102,128, 39,140,228,229,246, 97,128, 9,105,229,233,231,232,244, + 232,115,128, 33, 92,231,117, 2,185,188,185,197,234,225,242,225, + 244,105,128, 10,233,242,237,245,235,232,105,128, 10,105,232, 97, + 2,185,213,185,224,227,235,225,242,225,226,233, 99,128, 6, 99, + 238,231,250,232,239,117,128, 48, 35,105, 2,185,239,186, 1,228, + 229,239,231,242,225,240,232,233,227,240,225,242,229,110,128, 50, + 34,238,230,229,242,233,239,114,128, 32,131,237,239,238,239,243, + 240,225,227,101,128,255, 19,238,245,237,229,242,225,244,239,242, + 226,229,238,231,225,236,105,128, 9,246,239,236,228,243,244,249, + 236,101,128,247, 51,112, 2,186, 59,186, 66,225,242,229,110,128, + 36,118,229,114, 2,186, 73,186, 79,233,239,100,128, 36,138,243, + 233,225,110,128, 6,243,241,245,225,242,244,229,242,115,129, 0, + 190,186, 99,229,237,228,225,243,104,128,246,222,242,239,237,225, + 110,128, 33,114,243,245,240,229,242,233,239,114,128, 0,179,244, + 232,225,105,128, 14, 83,250,243,241,245,225,242,101,128, 51,148, + 105, 7,186,160,186,171,187, 30,187,128,187,140,187,189,187,206, + 232,233,242,225,231,225,238, 97,128, 48, 97,107, 2,186,177,186, + 201,225,244,225,235,225,238, 97,129, 48,193,186,189,232,225,236, + 230,247,233,228,244,104,128,255,129,229,245,116, 4,186,213,186, + 248,187, 7,187, 16, 97, 2,186,219,186,234,227,233,242,227,236, + 229,235,239,242,229,225,110,128, 50,112,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 16,227,233,242,227,236,229,235,239, + 242,229,225,110,128, 50, 98,235,239,242,229,225,110,128, 49, 55, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 2,236,228, + 101,133, 2,220,187, 46,187, 57,187, 74,187, 86,187,114,226,229, + 236,239,247,227,237, 98,128, 3, 48, 99, 2,187, 63,187, 68,237, + 98,128, 3, 3,239,237, 98,128, 3, 3,228,239,245,226,236,229, + 227,237, 98,128, 3, 96,111, 2,187, 92,187,102,240,229,242,225, + 244,239,114,128, 34, 60,246,229,242,236,225,249,227,237, 98,128, + 3, 52,246,229,242,244,233,227,225,236,227,237, 98,128, 3, 62, + 237,229,243,227,233,242,227,236,101,128, 34,151,112, 2,187,146, + 187,176,229,232, 97, 2,187,154,187,163,232,229,226,242,229,119, + 128, 5,150,236,229,230,244,232,229,226,242,229,119,128, 5,150, + 240,233,231,245,242,237,245,235,232,105,128, 10,112,244,236,239, + 227,249,242,233,236,236,233,227,227,237, 98,128, 4,131,247,238, + 225,242,237,229,238,233,225,110,128, 5,127,236,233,238,229,226, + 229,236,239,119,128, 30,111,237,239,238,239,243,240,225,227,101, + 128,255, 84,111, 7,188, 3,188, 14,188, 25,188, 50,188,170,188, + 182,189, 10,225,242,237,229,238,233,225,110,128, 5,105,232,233, + 242,225,231,225,238, 97,128, 48,104,235,225,244,225,235,225,238, + 97,129, 48,200,188, 38,232,225,236,230,247,233,228,244,104,128, + 255,132,110, 3,188, 58,188,156,188,161,101, 4,188, 68,188,137, + 188,144,188,150,226,225,114, 4,188, 80,188,109,188,119,188,128, + 229,248,244,242, 97, 2,188, 90,188,100,232,233,231,232,237,239, + 100,128, 2,229,236,239,247,237,239,100,128, 2,233,232,233,231, + 232,237,239,100,128, 2,230,236,239,247,237,239,100,128, 2,232, + 237,233,228,237,239,100,128, 2,231,230,233,246,101,128, 1,189, + 243,233,120,128, 1,133,244,247,111,128, 1,168,239,115,128, 3, + 132,243,241,245,225,242,101,128, 51, 39,240,225,244,225,235,244, + 232,225,105,128, 14, 15,242,244,239,233,243,229,243,232,229,236, + 236,226,242,225,227,235,229,116, 2,188,205,188,235,236,229,230, + 116,130, 48, 20,188,216,188,224,243,237,225,236,108,128,254, 93, + 246,229,242,244,233,227,225,108,128,254, 57,242,233,231,232,116, + 130, 48, 21,188,247,188,255,243,237,225,236,108,128,254, 94,246, + 229,242,244,233,227,225,108,128,254, 58,244,225,239,244,232,225, + 105,128, 14, 21,240, 97, 2,189, 27,189, 39,236,225,244,225,236, + 232,239,239,107,128, 1,171,242,229,110,128, 36,175,114, 3,189, + 53,189, 84,189, 99,225,228,229,237,225,242,107,129, 33, 34,189, + 65,115, 2,189, 71,189, 77,225,238,115,128,248,234,229,242,233, + 102,128,246,219,229,244,242,239,230,236,229,248,232,239,239,107, + 128, 2,136,233,225,103, 4,189,111,189,116,189,121,189,126,228, + 110,128, 37,188,236,102,128, 37,196,242,116,128, 37,186,245,112, + 128, 37,178,115,132, 2,166,189,143,189,182,190, 32,190, 45,225, + 228,105,130, 5,230,189,153,189,173,228,225,231,229,243,104,129, + 251, 70,189,164,232,229,226,242,229,119,128,251, 70,232,229,226, + 242,229,119,128, 5,230,101, 2,189,188,189,199,227,249,242,233, + 236,236,233, 99,128, 4, 70,242,101,134, 5,181,189,216,189,230, + 189,235,189,244,190, 3,190, 19, 49, 2,189,222,189,226, 50,128, + 5,181,101,128, 5,181,178, 98,128, 5,181,232,229,226,242,229, + 119,128, 5,181,238,225,242,242,239,247,232,229,226,242,229,119, + 128, 5,181,241,245,225,242,244,229,242,232,229,226,242,229,119, + 128, 5,181,247,233,228,229,232,229,226,242,229,119,128, 5,181, + 232,229,227,249,242,233,236,236,233, 99,128, 4, 91,245,240,229, + 242,233,239,114,128,246,243,116, 4,190, 65,190,115,190,180,190, + 231, 97, 3,190, 73,190, 83,190, 90,226,229,238,231,225,236,105, + 128, 9,159,228,229,246, 97,128, 9, 31,231,117, 2,190, 97,190, + 106,234,225,242,225,244,105,128, 10,159,242,237,245,235,232,105, + 128, 10, 31,229,104, 4,190,126,190,135,190,149,190,165,225,242, + 225,226,233, 99,128, 6,121,230,233,238,225,236,225,242,225,226, + 233, 99,128,251,103,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,251,104,237,229,228,233,225,236,225,242,225,226,233, + 99,128,251,105,232, 97, 3,190,189,190,199,190,206,226,229,238, + 231,225,236,105,128, 9,160,228,229,246, 97,128, 9, 32,231,117, + 2,190,213,190,222,234,225,242,225,244,105,128, 10,160,242,237, + 245,235,232,105,128, 10, 32,245,242,238,229,100,128, 2,135,117, + 3,190,247,191, 2,191, 27,232,233,242,225,231,225,238, 97,128, + 48,100,235,225,244,225,235,225,238, 97,129, 48,196,191, 15,232, + 225,236,230,247,233,228,244,104,128,255,130,243,237,225,236,108, + 2,191, 37,191, 48,232,233,242,225,231,225,238, 97,128, 48, 99, + 235,225,244,225,235,225,238, 97,129, 48,195,191, 61,232,225,236, + 230,247,233,228,244,104,128,255,111,119, 2,191, 79,191,184,101, + 2,191, 85,191,133,236,246,101, 3,191, 95,191,104,191,125,227, + 233,242,227,236,101,128, 36,107,112, 2,191,110,191,117,225,242, + 229,110,128, 36,127,229,242,233,239,100,128, 36,147,242,239,237, + 225,110,128, 33,123,238,244,121, 3,191,143,191,152,191,163,227, + 233,242,227,236,101,128, 36,115,232,225,238,231,250,232,239,117, + 128, 83, 68,112, 2,191,169,191,176,225,242,229,110,128, 36,135, + 229,242,233,239,100,128, 36,155,111,142, 0, 50,191,216,191,225, + 191,235,192, 9,192, 61,192, 86,192,113,192,147,192,159,192,178, + 192,189,192,222,192,230,192,254,225,242,225,226,233, 99,128, 6, + 98,226,229,238,231,225,236,105,128, 9,232,227,233,242,227,236, + 101,129, 36, 97,191,246,233,238,246,229,242,243,229,243,225,238, + 243,243,229,242,233,102,128, 39,139,100, 2,192, 15,192, 21,229, + 246, 97,128, 9,104,239,116, 2,192, 28,192, 39,229,238,236,229, + 225,228,229,114,128, 32, 37,236,229,225,228,229,114,129, 32, 37, + 192, 50,246,229,242,244,233,227,225,108,128,254, 48,231,117, 2, + 192, 68,192, 77,234,225,242,225,244,105,128, 10,232,242,237,245, + 235,232,105,128, 10,104,232, 97, 2,192, 93,192,104,227,235,225, + 242,225,226,233, 99,128, 6, 98,238,231,250,232,239,117,128, 48, + 34,105, 2,192,119,192,137,228,229,239,231,242,225,240,232,233, + 227,240,225,242,229,110,128, 50, 33,238,230,229,242,233,239,114, + 128, 32,130,237,239,238,239,243,240,225,227,101,128,255, 18,238, + 245,237,229,242,225,244,239,242,226,229,238,231,225,236,105,128, + 9,245,239,236,228,243,244,249,236,101,128,247, 50,112, 2,192, + 195,192,202,225,242,229,110,128, 36,117,229,114, 2,192,209,192, + 215,233,239,100,128, 36,137,243,233,225,110,128, 6,242,242,239, + 237,225,110,128, 33,113,115, 2,192,236,192,244,244,242,239,235, + 101,128, 1,187,245,240,229,242,233,239,114,128, 0,178,244,104, + 2,193, 5,193, 10,225,105,128, 14, 82,233,242,228,115,128, 33, + 84,117,145, 0,117,193, 55,193, 63,193,104,193,161,194, 43,194, + 80,194,203,194,219,195, 14,195, 84,195,165,195,174,196, 37,196, + 61,196,169,196,197,197, 55,225,227,245,244,101,128, 0,250, 98, + 4,193, 73,193, 78,193, 87,193, 97,225,114,128, 2,137,229,238, + 231,225,236,105,128, 9,137,239,240,239,237,239,230,111,128, 49, + 40,242,229,246,101,128, 1,109, 99, 3,193,112,193,119,193,151, + 225,242,239,110,128, 1,212,233,242, 99, 2,193,127,193,132,236, + 101,128, 36,228,245,237,230,236,229,120,129, 0,251,193,143,226, + 229,236,239,119,128, 30,119,249,242,233,236,236,233, 99,128, 4, + 67,100, 5,193,173,193,184,193,207,193,213,194, 33,225,244,244, + 225,228,229,246, 97,128, 9, 81,226,108, 2,193,191,193,199,225, + 227,245,244,101,128, 1,113,231,242,225,246,101,128, 2, 21,229, + 246, 97,128, 9, 9,233,229,242,229,243,233,115,133, 0,252,193, + 233,193,241,193,249,194, 16,194, 24,225,227,245,244,101,128, 1, + 216,226,229,236,239,119,128, 30,115, 99, 2,193,255,194, 6,225, + 242,239,110,128, 1,218,249,242,233,236,236,233, 99,128, 4,241, + 231,242,225,246,101,128, 1,220,237,225,227,242,239,110,128, 1, + 214,239,244,226,229,236,239,119,128, 30,229,103, 2,194, 49,194, + 56,242,225,246,101,128, 0,249,117, 2,194, 62,194, 71,234,225, + 242,225,244,105,128, 10,137,242,237,245,235,232,105,128, 10, 9, + 104, 3,194, 88,194, 98,194,176,233,242,225,231,225,238, 97,128, + 48, 70,111, 2,194,104,194,114,239,235,225,226,239,246,101,128, + 30,231,242,110,133, 1,176,194,129,194,137,194,148,194,156,194, + 168,225,227,245,244,101,128, 30,233,228,239,244,226,229,236,239, + 119,128, 30,241,231,242,225,246,101,128, 30,235,232,239,239,235, + 225,226,239,246,101,128, 30,237,244,233,236,228,101,128, 30,239, + 245,238,231,225,242,245,237,236,225,245,116,129, 1,113,194,192, + 227,249,242,233,236,236,233, 99,128, 4,243,233,238,246,229,242, + 244,229,228,226,242,229,246,101,128, 2, 23,107, 3,194,227,194, + 251,195, 6,225,244,225,235,225,238, 97,129, 48,166,194,239,232, + 225,236,230,247,233,228,244,104,128,255,115,227,249,242,233,236, + 236,233, 99,128, 4,121,239,242,229,225,110,128, 49, 92,109, 2, + 195, 20,195, 73, 97, 2,195, 26,195, 59,227,242,239,110,130, 1, + 107,195, 37,195, 48,227,249,242,233,236,236,233, 99,128, 4,239, + 228,233,229,242,229,243,233,115,128, 30,123,244,242,225,231,245, + 242,237,245,235,232,105,128, 10, 65,239,238,239,243,240,225,227, + 101,128,255, 85,110, 2,195, 90,195,145,228,229,242,243,227,239, + 242,101,132, 0, 95,195,109,195,115,195,127,195,138,228,226,108, + 128, 32, 23,237,239,238,239,243,240,225,227,101,128,255, 63,246, + 229,242,244,233,227,225,108,128,254, 51,247,225,246,121,128,254, + 79,105, 2,195,151,195,156,239,110,128, 34, 42,246,229,242,243, + 225,108,128, 34, 0,239,231,239,238,229,107,128, 1,115,112, 5, + 195,186,195,193,195,201,195,216,196, 11,225,242,229,110,128, 36, + 176,226,236,239,227,107,128, 37,128,240,229,242,228,239,244,232, + 229,226,242,229,119,128, 5,196,243,233,236,239,110,131, 3,197, + 195,230,195,251,196, 3,228,233,229,242,229,243,233,115,129, 3, + 203,195,243,244,239,238,239,115,128, 3,176,236,225,244,233,110, + 128, 2,138,244,239,238,239,115,128, 3,205,244,225,227,107, 2, + 196, 20,196, 31,226,229,236,239,247,227,237, 98,128, 3, 29,237, + 239,100,128, 2,212,114, 2,196, 43,196, 55,225,231,245,242,237, + 245,235,232,105,128, 10,115,233,238,103,128, 1,111,115, 3,196, + 69,196, 84,196,129,232,239,242,244,227,249,242,233,236,236,233, + 99,128, 4, 94,237,225,236,108, 2,196, 93,196,104,232,233,242, + 225,231,225,238, 97,128, 48, 69,235,225,244,225,235,225,238, 97, + 129, 48,165,196,117,232,225,236,230,247,233,228,244,104,128,255, + 105,244,242,225,233,231,232,116, 2,196,141,196,152,227,249,242, + 233,236,236,233, 99,128, 4,175,243,244,242,239,235,229,227,249, + 242,233,236,236,233, 99,128, 4,177,244,233,236,228,101,130, 1, + 105,196,181,196,189,225,227,245,244,101,128, 30,121,226,229,236, + 239,119,128, 30,117,117, 5,196,209,196,219,196,226,196,251,197, + 11,226,229,238,231,225,236,105,128, 9,138,228,229,246, 97,128, + 9, 10,231,117, 2,196,233,196,242,234,225,242,225,244,105,128, + 10,138,242,237,245,235,232,105,128, 10, 10,237,225,244,242,225, + 231,245,242,237,245,235,232,105,128, 10, 66,246,239,247,229,236, + 243,233,231,110, 3,197, 27,197, 37,197, 44,226,229,238,231,225, + 236,105,128, 9,194,228,229,246, 97,128, 9, 66,231,245,234,225, + 242,225,244,105,128, 10,194,246,239,247,229,236,243,233,231,110, + 3,197, 71,197, 81,197, 88,226,229,238,231,225,236,105,128, 9, + 193,228,229,246, 97,128, 9, 65,231,245,234,225,242,225,244,105, + 128, 10,193,118,139, 0,118,197,125,198, 17,198, 26,198, 37,198, + 222,198,229,199, 71,199, 83,199,183,199,191,199,212, 97, 4,197, + 135,197,142,197,167,197,178,228,229,246, 97,128, 9, 53,231,117, + 2,197,149,197,158,234,225,242,225,244,105,128, 10,181,242,237, + 245,235,232,105,128, 10, 53,235,225,244,225,235,225,238, 97,128, + 48,247,118,132, 5,213,197,190,197,217,197,249,198, 5,228,225, + 231,229,243,104,130,251, 53,197,203,197,208,182, 53,128,251, 53, + 232,229,226,242,229,119,128,251, 53,104, 2,197,223,197,231,229, + 226,242,229,119,128, 5,213,239,236,225,109,129,251, 75,197,240, + 232,229,226,242,229,119,128,251, 75,246,225,246,232,229,226,242, + 229,119,128, 5,240,249,239,228,232,229,226,242,229,119,128, 5, + 241,227,233,242,227,236,101,128, 36,229,228,239,244,226,229,236, + 239,119,128, 30,127,101, 6,198, 51,198, 62,198,126,198,137,198, + 143,198,210,227,249,242,233,236,236,233, 99,128, 4, 50,104, 4, + 198, 72,198, 81,198, 95,198,111,225,242,225,226,233, 99,128, 6, + 164,230,233,238,225,236,225,242,225,226,233, 99,128,251,107,233, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,251,108,237, + 229,228,233,225,236,225,242,225,226,233, 99,128,251,109,235,225, + 244,225,235,225,238, 97,128, 48,249,238,245,115,128, 38, 64,242, + 244,233,227,225,108, 2,198,154,198,160,226,225,114,128, 0,124, + 236,233,238,101, 4,198,173,198,184,198,195,198,204,225,226,239, + 246,229,227,237, 98,128, 3, 13,226,229,236,239,247,227,237, 98, + 128, 3, 41,236,239,247,237,239,100,128, 2,204,237,239,100,128, + 2,200,247,225,242,237,229,238,233,225,110,128, 5,126,232,239, + 239,107,128, 2,139,105, 3,198,237,198,248,199, 31,235,225,244, + 225,235,225,238, 97,128, 48,248,242,225,237, 97, 3,199, 3,199, + 13,199, 20,226,229,238,231,225,236,105,128, 9,205,228,229,246, + 97,128, 9, 77,231,245,234,225,242,225,244,105,128, 10,205,243, + 225,242,231, 97, 3,199, 43,199, 53,199, 60,226,229,238,231,225, + 236,105,128, 9,131,228,229,246, 97,128, 9, 3,231,245,234,225, + 242,225,244,105,128, 10,131,237,239,238,239,243,240,225,227,101, + 128,255, 86,111, 3,199, 91,199,102,199,172,225,242,237,229,238, + 233,225,110,128, 5,120,233,227,229,100, 2,199,111,199,147,233, + 244,229,242,225,244,233,239,110, 2,199,125,199,136,232,233,242, + 225,231,225,238, 97,128, 48,158,235,225,244,225,235,225,238, 97, + 128, 48,254,237,225,242,235,235,225,238, 97,129, 48,155,199,160, + 232,225,236,230,247,233,228,244,104,128,255,158,235,225,244,225, + 235,225,238, 97,128, 48,250,240,225,242,229,110,128, 36,177,116, + 2,199,197,199,204,233,236,228,101,128, 30,125,245,242,238,229, + 100,128, 2,140,117, 2,199,218,199,229,232,233,242,225,231,225, + 238, 97,128, 48,148,235,225,244,225,235,225,238, 97,128, 48,244, + 119,143, 0,119,200, 18,200,251,201, 5,201, 28,201, 68,201,135, + 201,143,203,114,203,155,203,167,203,242,203,250,204, 1,204, 12, + 204, 21, 97, 8,200, 36,200, 43,200, 53,200, 64,200,102,200,134, + 200,146,200,182,227,245,244,101,128, 30,131,229,235,239,242,229, + 225,110,128, 49, 89,232,233,242,225,231,225,238, 97,128, 48,143, + 107, 2,200, 70,200, 94,225,244,225,235,225,238, 97,129, 48,239, + 200, 82,232,225,236,230,247,233,228,244,104,128,255,156,239,242, + 229,225,110,128, 49, 88,243,237,225,236,108, 2,200,112,200,123, + 232,233,242,225,231,225,238, 97,128, 48,142,235,225,244,225,235, + 225,238, 97,128, 48,238,244,244,239,243,241,245,225,242,101,128, + 51, 87,118, 2,200,152,200,160,229,228,225,243,104,128, 48, 28, + 249,245,238,228,229,242,243,227,239,242,229,246,229,242,244,233, + 227,225,108,128,254, 52,119, 3,200,190,200,199,200,213,225,242, + 225,226,233, 99,128, 6, 72,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,238,232,225,237,250,225,225,226,239,246,101, 2, + 200,228,200,237,225,242,225,226,233, 99,128, 6, 36,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,134,226,243,241,245,225, + 242,101,128, 51,221,227,233,242, 99, 2,201, 14,201, 19,236,101, + 128, 36,230,245,237,230,236,229,120,128, 1,117,100, 2,201, 34, + 201, 44,233,229,242,229,243,233,115,128, 30,133,239,116, 2,201, + 51,201, 60,225,227,227,229,238,116,128, 30,135,226,229,236,239, + 119,128, 30,137,101, 4,201, 78,201, 89,201,101,201,125,232,233, + 242,225,231,225,238, 97,128, 48,145,233,229,242,243,244,242,225, + 243,115,128, 33, 24,107, 2,201,107,201,117,225,244,225,235,225, + 238, 97,128, 48,241,239,242,229,225,110,128, 49, 94,239,235,239, + 242,229,225,110,128, 49, 93,231,242,225,246,101,128, 30,129,232, + 233,244,101, 8,201,164,201,173,202, 1,202, 91,202,175,202,220, + 203, 16,203, 72,226,245,236,236,229,116,128, 37,230, 99, 2,201, + 179,201,199,233,242,227,236,101,129, 37,203,201,189,233,238,246, + 229,242,243,101,128, 37,217,239,242,238,229,242,226,242,225,227, + 235,229,116, 2,201,216,201,236,236,229,230,116,129, 48, 14,201, + 225,246,229,242,244,233,227,225,108,128,254, 67,242,233,231,232, + 116,129, 48, 15,201,246,246,229,242,244,233,227,225,108,128,254, + 68,100, 2,202, 7,202, 48,233,225,237,239,238,100,129, 37,199, + 202, 18,227,239,238,244,225,233,238,233,238,231,226,236,225,227, + 235,243,237,225,236,236,228,233,225,237,239,238,100,128, 37,200, + 239,247,238,240,239,233,238,244,233,238,103, 2,202, 64,202, 80, + 243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37,191, + 244,242,233,225,238,231,236,101,128, 37,189,236,101, 2,202, 98, + 202,140,230,244,240,239,233,238,244,233,238,103, 2,202,113,202, + 129,243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37, + 195,244,242,233,225,238,231,236,101,128, 37,193,238,244,233,227, + 245,236,225,242,226,242,225,227,235,229,116, 2,202,160,202,167, + 236,229,230,116,128, 48, 22,242,233,231,232,116,128, 48, 23,242, + 233,231,232,244,240,239,233,238,244,233,238,103, 2,202,193,202, + 209,243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37, + 185,244,242,233,225,238,231,236,101,128, 37,183,115, 3,202,228, + 203, 2,203, 10,109, 2,202,234,202,246,225,236,236,243,241,245, + 225,242,101,128, 37,171,233,236,233,238,231,230,225,227,101,128, + 38, 58,241,245,225,242,101,128, 37,161,244,225,114,128, 38, 6, + 116, 2,203, 22,203, 33,229,236,229,240,232,239,238,101,128, 38, + 15,239,242,244,239,233,243,229,243,232,229,236,236,226,242,225, + 227,235,229,116, 2,203, 57,203, 64,236,229,230,116,128, 48, 24, + 242,233,231,232,116,128, 48, 25,245,240,240,239,233,238,244,233, + 238,103, 2,203, 87,203,103,243,237,225,236,236,244,242,233,225, + 238,231,236,101,128, 37,181,244,242,233,225,238,231,236,101,128, + 37,179,105, 2,203,120,203,131,232,233,242,225,231,225,238, 97, + 128, 48,144,107, 2,203,137,203,147,225,244,225,235,225,238, 97, + 128, 48,240,239,242,229,225,110,128, 49, 95,237,239,238,239,243, + 240,225,227,101,128,255, 87,111, 4,203,177,203,188,203,213,203, + 231,232,233,242,225,231,225,238, 97,128, 48,146,235,225,244,225, + 235,225,238, 97,129, 48,242,203,201,232,225,236,230,247,233,228, + 244,104,128,255,102,110,129, 32,169,203,219,237,239,238,239,243, + 240,225,227,101,128,255,230,247,225,229,238,244,232,225,105,128, + 14, 39,240,225,242,229,110,128, 36,178,242,233,238,103,128, 30, + 152,243,245,240,229,242,233,239,114,128, 2,183,244,245,242,238, + 229,100,128, 2,141,249,238,110,128, 1,191,120,137, 0,120,204, + 49,204, 60,204, 71,204, 80,204,107,204,120,204,124,204,136,204, + 144,225,226,239,246,229,227,237, 98,128, 3, 61,226,239,240,239, + 237,239,230,111,128, 49, 18,227,233,242,227,236,101,128, 36,231, + 100, 2,204, 86,204, 96,233,229,242,229,243,233,115,128, 30,141, + 239,244,225,227,227,229,238,116,128, 30,139,229,232,225,242,237, + 229,238,233,225,110,128, 5,109,105,128, 3,190,237,239,238,239, + 243,240,225,227,101,128,255, 88,240,225,242,229,110,128, 36,179, + 243,245,240,229,242,233,239,114,128, 2,227,121,143, 0,121,204, + 189,205,148,205,171,205,211,207,177,207,185,207,202,208, 10,208, + 22,209, 19,209, 59,209, 71,209, 82,209,103,210, 76, 97, 11,204, + 213,204,225,204,235,204,242,204,249,205, 3,205, 28,205, 39,205, + 77,205, 90,205,136,225,228,239,243,241,245,225,242,101,128, 51, + 78,226,229,238,231,225,236,105,128, 9,175,227,245,244,101,128, + 0,253,228,229,246, 97,128, 9, 47,229,235,239,242,229,225,110, + 128, 49, 82,231,117, 2,205, 10,205, 19,234,225,242,225,244,105, + 128, 10,175,242,237,245,235,232,105,128, 10, 47,232,233,242,225, + 231,225,238, 97,128, 48,132,107, 2,205, 45,205, 69,225,244,225, + 235,225,238, 97,129, 48,228,205, 57,232,225,236,230,247,233,228, + 244,104,128,255,148,239,242,229,225,110,128, 49, 81,237,225,235, + 235,225,238,244,232,225,105,128, 14, 78,243,237,225,236,108, 2, + 205,100,205,111,232,233,242,225,231,225,238, 97,128, 48,131,235, + 225,244,225,235,225,238, 97,129, 48,227,205,124,232,225,236,230, + 247,233,228,244,104,128,255,108,244,227,249,242,233,236,236,233, + 99,128, 4, 99,227,233,242, 99, 2,205,157,205,162,236,101,128, + 36,232,245,237,230,236,229,120,128, 1,119,100, 2,205,177,205, + 187,233,229,242,229,243,233,115,128, 0,255,239,116, 2,205,194, + 205,203,225,227,227,229,238,116,128, 30,143,226,229,236,239,119, + 128, 30,245,101, 7,205,227,206,235,206,244,207, 6,207, 38,207, + 114,207,165,104, 8,205,245,205,254,206, 32,206, 46,206,119,206, + 135,206,194,206,212,225,242,225,226,233, 99,128, 6, 74,226,225, + 242,242,229,101, 2,206, 9,206, 18,225,242,225,226,233, 99,128, + 6,210,230,233,238,225,236,225,242,225,226,233, 99,128,251,175, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,242,232,225, + 237,250,225,225,226,239,246,101, 4,206, 65,206, 74,206, 88,206, + 104,225,242,225,226,233, 99,128, 6, 38,230,233,238,225,236,225, + 242,225,226,233, 99,128,254,138,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,254,139,237,229,228,233,225,236,225,242, + 225,226,233, 99,128,254,140,233,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,254,243,237,101, 2,206,142,206,155,228,233, + 225,236,225,242,225,226,233, 99,128,254,244,229,237,105, 2,206, + 163,206,178,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 252,221,243,239,236,225,244,229,228,225,242,225,226,233, 99,128, + 252, 88,238,239,239,238,230,233,238,225,236,225,242,225,226,233, + 99,128,252,148,244,232,242,229,229,228,239,244,243,226,229,236, + 239,247,225,242,225,226,233, 99,128, 6,209,235,239,242,229,225, + 110,128, 49, 86,110,129, 0,165,206,250,237,239,238,239,243,240, + 225,227,101,128,255,229,111, 2,207, 12,207, 21,235,239,242,229, + 225,110,128, 49, 85,242,233,238,232,233,229,245,232,235,239,242, + 229,225,110,128, 49,134,114, 3,207, 46,207, 82,207, 94,225,232, + 226,229,238,249,239,237,111, 2,207, 60,207, 69,232,229,226,242, + 229,119,128, 5,170,236,229,230,244,232,229,226,242,229,119,128, + 5,170,233,227,249,242,233,236,236,233, 99,128, 4, 75,245,228, + 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, + 4,249,243,233,229,245,238,103, 3,207,127,207,136,207,152,235, + 239,242,229,225,110,128, 49,129,240,225,238,243,233,239,243,235, + 239,242,229,225,110,128, 49,131,243,233,239,243,235,239,242,229, + 225,110,128, 49,130,244,233,246,232,229,226,242,229,119,128, 5, + 154,231,242,225,246,101,128, 30,243,232,239,239,107,129, 1,180, + 207,194,225,226,239,246,101,128, 30,247,105, 5,207,214,207,225, + 207,236,207,245,207,253,225,242,237,229,238,233,225,110,128, 5, + 117,227,249,242,233,236,236,233, 99,128, 4, 87,235,239,242,229, + 225,110,128, 49, 98,238,249,225,238,103,128, 38, 47,247,238,225, + 242,237,229,238,233,225,110,128, 5,130,237,239,238,239,243,240, + 225,227,101,128,255, 89,111, 7,208, 38,208,108,208,119,208,129, + 208,167,208,213,208,222,100,131, 5,217,208, 48,208, 68,208, 77, + 228,225,231,229,243,104,129,251, 57,208, 59,232,229,226,242,229, + 119,128,251, 57,232,229,226,242,229,119,128, 5,217,249,239,100, + 2,208, 85,208, 94,232,229,226,242,229,119,128, 5,242,240,225, + 244,225,232,232,229,226,242,229,119,128,251, 31,232,233,242,225, + 231,225,238, 97,128, 48,136,233,235,239,242,229,225,110,128, 49, + 137,107, 2,208,135,208,159,225,244,225,235,225,238, 97,129, 48, + 232,208,147,232,225,236,230,247,233,228,244,104,128,255,150,239, + 242,229,225,110,128, 49, 91,243,237,225,236,108, 2,208,177,208, + 188,232,233,242,225,231,225,238, 97,128, 48,135,235,225,244,225, + 235,225,238, 97,129, 48,231,208,201,232,225,236,230,247,233,228, + 244,104,128,255,110,244,231,242,229,229,107,128, 3,243,121, 2, + 208,228,209, 9, 97, 2,208,234,208,244,229,235,239,242,229,225, + 110,128, 49,136,107, 2,208,250,209, 2,239,242,229,225,110,128, + 49,135,244,232,225,105,128, 14, 34,233,238,231,244,232,225,105, + 128, 14, 13,112, 2,209, 25,209, 32,225,242,229,110,128, 36,180, + 239,231,229,231,242,225,237,237,229,238,105,129, 3,122,209, 48, + 231,242,229,229,235,227,237, 98,128, 3, 69,114,129, 1,166,209, + 65,233,238,103,128, 30,153,243,245,240,229,242,233,239,114,128, + 2,184,116, 2,209, 88,209, 95,233,236,228,101,128, 30,249,245, + 242,238,229,100,128, 2,142,117, 5,209,115,209,126,209,136,209, + 174,210, 50,232,233,242,225,231,225,238, 97,128, 48,134,233,235, + 239,242,229,225,110,128, 49,140,107, 2,209,142,209,166,225,244, + 225,235,225,238, 97,129, 48,230,209,154,232,225,236,230,247,233, + 228,244,104,128,255,149,239,242,229,225,110,128, 49, 96,115, 3, + 209,182,209,220,210, 5,226,233,103, 2,209,190,209,201,227,249, + 242,233,236,236,233, 99,128, 4,107,233,239,244,233,230,233,229, + 228,227,249,242,233,236,236,233, 99,128, 4,109,236,233,244,244, + 236,101, 2,209,231,209,242,227,249,242,233,236,236,233, 99,128, + 4,103,233,239,244,233,230,233,229,228,227,249,242,233,236,236, + 233, 99,128, 4,105,237,225,236,108, 2,210, 14,210, 25,232,233, + 242,225,231,225,238, 97,128, 48,133,235,225,244,225,235,225,238, + 97,129, 48,229,210, 38,232,225,236,230,247,233,228,244,104,128, + 255,109,249,101, 2,210, 57,210, 66,235,239,242,229,225,110,128, + 49,139,239,235,239,242,229,225,110,128, 49,138,249, 97, 2,210, + 83,210, 93,226,229,238,231,225,236,105,128, 9,223,228,229,246, + 97,128, 9, 95,122,142, 0,122,210,132,211,140,211,151,211,194, + 211,221,213, 0,213,108,213,150,213,162,213,174,213,202,213,210, + 213,226,213,235, 97, 10,210,154,210,165,210,172,210,179,210,190, + 211, 12,211, 42,211, 53,211, 89,211,101,225,242,237,229,238,233, + 225,110,128, 5,102,227,245,244,101,128, 1,122,228,229,246, 97, + 128, 9, 91,231,245,242,237,245,235,232,105,128, 10, 91,104, 4, + 210,200,210,209,210,223,210,253,225,242,225,226,233, 99,128, 6, + 56,230,233,238,225,236,225,242,225,226,233, 99,128,254,198,105, + 2,210,229,210,244,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,199,242,225,231,225,238, 97,128, 48, 86,237,229,228, + 233,225,236,225,242,225,226,233, 99,128,254,200,233,110, 2,211, + 19,211, 28,225,242,225,226,233, 99,128, 6, 50,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,176,235,225,244,225,235,225, + 238, 97,128, 48,182,241,229,102, 2,211, 61,211, 75,231,225,228, + 239,236,232,229,226,242,229,119,128, 5,149,241,225,244,225,238, + 232,229,226,242,229,119,128, 5,148,242,241,225,232,229,226,242, + 229,119,128, 5,152,249,233,110,130, 5,214,211,111,211,131,228, + 225,231,229,243,104,129,251, 54,211,122,232,229,226,242,229,119, + 128,251, 54,232,229,226,242,229,119,128, 5,214,226,239,240,239, + 237,239,230,111,128, 49, 23, 99, 3,211,159,211,166,211,188,225, + 242,239,110,128, 1,126,233,242, 99, 2,211,174,211,179,236,101, + 128, 36,233,245,237,230,236,229,120,128, 30,145,245,242,108,128, + 2,145,228,239,116,130, 1,124,211,204,211,213,225,227,227,229, + 238,116,128, 1,124,226,229,236,239,119,128, 30,147,101, 6,211, + 235,211,246,212, 33,212, 44,212, 55,212,251,227,249,242,233,236, + 236,233, 99,128, 4, 55,100, 2,211,252,212, 15,229,243,227,229, + 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,153,233, + 229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, 4, + 223,232,233,242,225,231,225,238, 97,128, 48, 92,235,225,244,225, + 235,225,238, 97,128, 48,188,242,111,140, 0, 48,212, 84,212, 93, + 212,103,212,110,212,135,212,148,212,159,212,171,212,182,212,192, + 212,203,212,210,225,242,225,226,233, 99,128, 6, 96,226,229,238, + 231,225,236,105,128, 9,230,228,229,246, 97,128, 9,102,231,117, + 2,212,117,212,126,234,225,242,225,244,105,128, 10,230,242,237, + 245,235,232,105,128, 10,102,232,225,227,235,225,242,225,226,233, + 99,128, 6, 96,233,238,230,229,242,233,239,114,128, 32,128,237, + 239,238,239,243,240,225,227,101,128,255, 16,239,236,228,243,244, + 249,236,101,128,247, 48,240,229,242,243,233,225,110,128, 6,240, + 243,245,240,229,242,233,239,114,128, 32,112,244,232,225,105,128, + 14, 80,247,233,228,244,104, 3,212,222,212,231,212,243,234,239, + 233,238,229,114,128,254,255,238,239,238,234,239,233,238,229,114, + 128, 32, 12,243,240,225,227,101,128, 32, 11,244, 97,128, 3,182, + 104, 2,213, 6,213, 17,226,239,240,239,237,239,230,111,128, 49, + 19,101, 4,213, 27,213, 38,213, 54,213, 65,225,242,237,229,238, + 233,225,110,128, 5,106,226,242,229,246,229,227,249,242,233,236, + 236,233, 99,128, 4,194,227,249,242,233,236,236,233, 99,128, 4, + 54,100, 2,213, 71,213, 90,229,243,227,229,238,228,229,242,227, + 249,242,233,236,236,233, 99,128, 4,151,233,229,242,229,243,233, + 243,227,249,242,233,236,236,233, 99,128, 4,221,105, 3,213,116, + 213,127,213,138,232,233,242,225,231,225,238, 97,128, 48, 88,235, + 225,244,225,235,225,238, 97,128, 48,184,238,239,242,232,229,226, + 242,229,119,128, 5,174,236,233,238,229,226,229,236,239,119,128, + 30,149,237,239,238,239,243,240,225,227,101,128,255, 90,111, 2, + 213,180,213,191,232,233,242,225,231,225,238, 97,128, 48, 94,235, + 225,244,225,235,225,238, 97,128, 48,190,240,225,242,229,110,128, + 36,181,242,229,244,242,239,230,236,229,248,232,239,239,107,128, + 2,144,243,244,242,239,235,101,128, 1,182,117, 2,213,241,213, + 252,232,233,242,225,231,225,238, 97,128, 48, 90,235,225,244,225, + 235,225,238, 97,128, 48,186 + }; + + + /* + * This function searches the compressed table efficiently. + */ + static unsigned long + ft_get_adobe_glyph_index( const char* name, + const char* limit ) + { + int c = 0; + int count, min, max; + const unsigned char* p = ft_adobe_glyph_list; + + + if ( name == 0 || name >= limit ) + goto NotFound; + + c = *name++; + count = p[1]; + p += 2; + + min = 0; + max = count; + + while ( min < max ) + { + int mid = ( min + max ) >> 1; + const unsigned char* q = p + mid * 2; + int c2; + + + q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] ); + + c2 = q[0] & 127; + if ( c2 == c ) + { + p = q; + goto Found; + } + if ( c2 < c ) + min = mid + 1; + else + max = mid; + } + goto NotFound; + + Found: + for (;;) + { + /* assert (*p & 127) == c */ + + if ( name >= limit ) + { + if ( (p[0] & 128) == 0 && + (p[1] & 128) != 0 ) + return (unsigned long)( ( (int)p[2] << 8 ) | p[3] ); + + goto NotFound; + } + c = *name++; + if ( p[0] & 128 ) + { + p++; + if ( c != (p[0] & 127) ) + goto NotFound; + + continue; + } + + p++; + count = p[0] & 127; + if ( p[0] & 128 ) + p += 2; + + p++; + + for ( ; count > 0; count--, p += 2 ) + { + int offset = ( (int)p[0] << 8 ) | p[1]; + const unsigned char* q = ft_adobe_glyph_list + offset; + + if ( c == ( q[0] & 127 ) ) + { + p = q; + goto NextIter; + } + } + goto NotFound; + + NextIter: + ; + } + + NotFound: + return 0; + } + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/ftmisc.h b/android/jni/ndk_modules/freetype/src/raster/ftmisc.h new file mode 100644 index 00000000..7773924f --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/raster/ftmisc.h @@ -0,0 +1,121 @@ +/***************************************************************************/ +/* */ +/* ftmisc.h */ +/* */ +/* Miscellaneous macros for stand-alone rasterizer (specification */ +/* only). */ +/* */ +/* Copyright 2005, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /***************************************************/ + /* */ + /* This file is *not* portable! You have to adapt */ + /* its definitions to your platform. */ + /* */ + /***************************************************/ + +#ifndef __FTMISC_H__ +#define __FTMISC_H__ + + + /* memset */ +#include FT_CONFIG_STANDARD_LIBRARY_H + +#define FT_BEGIN_HEADER +#define FT_END_HEADER + +#define FT_LOCAL_DEF( x ) static x + + + /* from include/freetype2/fttypes.h */ + + typedef unsigned char FT_Byte; + typedef signed int FT_Int; + typedef unsigned int FT_UInt; + typedef signed long FT_Long; + typedef unsigned long FT_ULong; + typedef signed long FT_F26Dot6; + typedef int FT_Error; + +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + ( ( (FT_ULong)_x1 << 24 ) | \ + ( (FT_ULong)_x2 << 16 ) | \ + ( (FT_ULong)_x3 << 8 ) | \ + (FT_ULong)_x4 ) + + + /* from include/freetype2/ftsystem.h */ + + typedef struct FT_MemoryRec_* FT_Memory; + + typedef void* (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + typedef void (*FT_Free_Func)( FT_Memory memory, + void* block ); + + typedef void* (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + typedef struct FT_MemoryRec_ + { + void* user; + + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + + } FT_MemoryRec; + + + /* from src/ftcalc.c */ + +#if ( defined _WIN32 || defined _WIN64 ) + + typedef __int64 FT_Int64; + +#else + +#include "inttypes.h" + + typedef int64_t FT_Int64; + +#endif + + + static FT_Long + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + +#endif /* __FTMISC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/ftraster.c b/android/jni/ndk_modules/freetype/src/raster/ftraster.c new file mode 100644 index 00000000..ce6fdfe5 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/raster/ftraster.c @@ -0,0 +1,3565 @@ +/***************************************************************************/ +/* */ +/* ftraster.c */ +/* */ +/* The FreeType glyph rasterizer (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file can be compiled without the rest of the FreeType engine, by */ + /* defining the _STANDALONE_ macro when compiling it. You also need to */ + /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir) */ + /* directory. Typically, you should do something like */ + /* */ + /* - copy `src/raster/ftraster.c' (this file) to your current directory */ + /* */ + /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h' */ + /* to your current directory */ + /* */ + /* - compile `ftraster' with the _STANDALONE_ macro defined, as in */ + /* */ + /* cc -c -D_STANDALONE_ ftraster.c */ + /* */ + /* The renderer can be initialized with a call to */ + /* `ft_standard_raster.raster_new'; a bitmap can be generated */ + /* with a call to `ft_standard_raster.raster_render'. */ + /* */ + /* See the comments and documentation in the file `ftimage.h' for more */ + /* details on how the raster works. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This is a rewrite of the FreeType 1.x scan-line converter */ + /* */ + /*************************************************************************/ + +#ifdef _STANDALONE_ + +#define FT_CONFIG_STANDARD_LIBRARY_H <stdlib.h> + +#include <string.h> /* for memset */ + +#include "ftmisc.h" +#include "ftimage.h" + +#else /* !_STANDALONE_ */ + +#include <ft2build.h> +#include "ftraster.h" +#include FT_INTERNAL_CALC_H /* for FT_MulDiv only */ + +#include "rastpic.h" + +#endif /* !_STANDALONE_ */ + + + /*************************************************************************/ + /* */ + /* A simple technical note on how the raster works */ + /* ----------------------------------------------- */ + /* */ + /* Converting an outline into a bitmap is achieved in several steps: */ + /* */ + /* 1 - Decomposing the outline into successive `profiles'. Each */ + /* profile is simply an array of scanline intersections on a given */ + /* dimension. A profile's main attributes are */ + /* */ + /* o its scanline position boundaries, i.e. `Ymin' and `Ymax' */ + /* */ + /* o an array of intersection coordinates for each scanline */ + /* between `Ymin' and `Ymax' */ + /* */ + /* o a direction, indicating whether it was built going `up' or */ + /* `down', as this is very important for filling rules */ + /* */ + /* o its drop-out mode */ + /* */ + /* 2 - Sweeping the target map's scanlines in order to compute segment */ + /* `spans' which are then filled. Additionally, this pass */ + /* performs drop-out control. */ + /* */ + /* The outline data is parsed during step 1 only. The profiles are */ + /* built from the bottom of the render pool, used as a stack. The */ + /* following graphics shows the profile list under construction: */ + /* */ + /* __________________________________________________________ _ _ */ + /* | | | | | */ + /* | profile | coordinates for | profile | coordinates for |--> */ + /* | 1 | profile 1 | 2 | profile 2 |--> */ + /* |_________|_________________|_________|_________________|__ _ _ */ + /* */ + /* ^ ^ */ + /* | | */ + /* start of render pool top */ + /* */ + /* The top of the profile stack is kept in the `top' variable. */ + /* */ + /* As you can see, a profile record is pushed on top of the render */ + /* pool, which is then followed by its coordinates/intersections. If */ + /* a change of direction is detected in the outline, a new profile is */ + /* generated until the end of the outline. */ + /* */ + /* Note that when all profiles have been generated, the function */ + /* Finalize_Profile_Table() is used to record, for each profile, its */ + /* bottom-most scanline as well as the scanline above its upmost */ + /* boundary. These positions are called `y-turns' because they (sort */ + /* of) correspond to local extrema. They are stored in a sorted list */ + /* built from the top of the render pool as a downwards stack: */ + /* */ + /* _ _ _______________________________________ */ + /* | | */ + /* <--| sorted list of | */ + /* <--| extrema scanlines | */ + /* _ _ __________________|____________________| */ + /* */ + /* ^ ^ */ + /* | | */ + /* maxBuff sizeBuff = end of pool */ + /* */ + /* This list is later used during the sweep phase in order to */ + /* optimize performance (see technical note on the sweep below). */ + /* */ + /* Of course, the raster detects whether the two stacks collide and */ + /* handles the situation properly. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** CONFIGURATION MACROS **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /* define DEBUG_RASTER if you want to compile a debugging version */ +/* #define DEBUG_RASTER */ + + /* define FT_RASTER_OPTION_ANTI_ALIASING if you want to support */ + /* 5-levels anti-aliasing */ +/* #define FT_RASTER_OPTION_ANTI_ALIASING */ + + /* The size of the two-lines intermediate bitmap used */ + /* for anti-aliasing, in bytes. */ +#define RASTER_GRAY_LINES 2048 + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** OTHER MACROS (do not change) **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_raster + + +#ifdef _STANDALONE_ + + + /* This macro is used to indicate that a function parameter is unused. */ + /* Its purpose is simply to reduce compiler warnings. Note also that */ + /* simply defining it as `(void)x' doesn't avoid warnings with certain */ + /* ANSI compilers (e.g. LCC). */ +#define FT_UNUSED( x ) (x) = (x) + + /* Disable the tracing mechanism for simplicity -- developers can */ + /* activate it easily by redefining these two macros. */ +#ifndef FT_ERROR +#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ +#endif + +#ifndef FT_TRACE +#define FT_TRACE( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE1( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE6( x ) do { } while ( 0 ) /* nothing */ +#endif + +#define Raster_Err_None 0 +#define Raster_Err_Not_Ini -1 +#define Raster_Err_Overflow -2 +#define Raster_Err_Neg_Height -3 +#define Raster_Err_Invalid -4 +#define Raster_Err_Unsupported -5 + +#define ft_memset memset + +#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \ + raster_reset_, raster_set_mode_, \ + raster_render_, raster_done_ ) \ + const FT_Raster_Funcs class_ = \ + { \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ \ + }; + +#else /* !_STANDALONE_ */ + + +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H /* for FT_TRACE() and FT_ERROR() */ + +#include "rasterrs.h" + +#define Raster_Err_None Raster_Err_Ok +#define Raster_Err_Not_Ini Raster_Err_Raster_Uninitialized +#define Raster_Err_Overflow Raster_Err_Raster_Overflow +#define Raster_Err_Neg_Height Raster_Err_Raster_Negative_Height +#define Raster_Err_Invalid Raster_Err_Invalid_Outline +#define Raster_Err_Unsupported Raster_Err_Cannot_Render_Glyph + + +#endif /* !_STANDALONE_ */ + + +#ifndef FT_MEM_SET +#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) +#endif + +#ifndef FT_MEM_ZERO +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) +#endif + + /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is */ + /* typically a small value and the result of a*b is known to fit into */ + /* 32 bits. */ +#define FMulDiv( a, b, c ) ( (a) * (b) / (c) ) + + /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */ + /* for clipping computations. It simply uses the FT_MulDiv() function */ + /* defined in `ftcalc.h'. */ +#define SMulDiv FT_MulDiv + + /* The rasterizer is a very general purpose component; please leave */ + /* the following redefinitions there (you never know your target */ + /* environment). */ + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void*)0 +#endif + +#ifndef SUCCESS +#define SUCCESS 0 +#endif + +#ifndef FAILURE +#define FAILURE 1 +#endif + + +#define MaxBezier 32 /* The maximum number of stacked Bezier curves. */ + /* Setting this constant to more than 32 is a */ + /* pure waste of space. */ + +#define Pixel_Bits 6 /* fractional bits of *input* coordinates */ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** SIMPLE TYPE DECLARATIONS **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + typedef int Int; + typedef unsigned int UInt; + typedef short Short; + typedef unsigned short UShort, *PUShort; + typedef long Long, *PLong; + typedef unsigned long ULong; + + typedef unsigned char Byte, *PByte; + typedef char Bool; + + + typedef union Alignment_ + { + long l; + void* p; + void (*f)(void); + + } Alignment, *PAlignment; + + + typedef struct TPoint_ + { + Long x; + Long y; + + } TPoint; + + + /* values for the `flags' bit field */ +#define Flow_Up 0x8 +#define Overshoot_Top 0x10 +#define Overshoot_Bottom 0x20 + + + /* States of each line, arc, and profile */ + typedef enum TStates_ + { + Unknown_State, + Ascending_State, + Descending_State, + Flat_State + + } TStates; + + + typedef struct TProfile_ TProfile; + typedef TProfile* PProfile; + + struct TProfile_ + { + FT_F26Dot6 X; /* current coordinate during sweep */ + PProfile link; /* link to next profile (various purposes) */ + PLong offset; /* start of profile's data in render pool */ + unsigned flags; /* Bit 0-2: drop-out mode */ + /* Bit 3: profile orientation (up/down) */ + /* Bit 4: is top profile? */ + /* Bit 5: is bottom profile? */ + long height; /* profile's height in scanlines */ + long start; /* profile's starting scanline */ + + unsigned countL; /* number of lines to step before this */ + /* profile becomes drawable */ + + PProfile next; /* next profile in same contour, used */ + /* during drop-out control */ + }; + + typedef PProfile TProfileList; + typedef PProfile* PProfileList; + + + /* Simple record used to implement a stack of bands, required */ + /* by the sub-banding mechanism */ + typedef struct TBand_ + { + Short y_min; /* band's minimum */ + Short y_max; /* band's maximum */ + + } TBand; + + +#define AlignProfileSize \ + ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( long ) ) + + +#ifdef FT_STATIC_RASTER + + +#define RAS_ARGS /* void */ +#define RAS_ARG /* void */ + +#define RAS_VARS /* void */ +#define RAS_VAR /* void */ + +#define FT_UNUSED_RASTER do { } while ( 0 ) + + +#else /* !FT_STATIC_RASTER */ + + +#define RAS_ARGS PWorker worker, +#define RAS_ARG PWorker worker + +#define RAS_VARS worker, +#define RAS_VAR worker + +#define FT_UNUSED_RASTER FT_UNUSED( worker ) + + +#endif /* !FT_STATIC_RASTER */ + + + typedef struct TWorker_ TWorker, *PWorker; + + + /* prototypes used for sweep function dispatch */ + typedef void + Function_Sweep_Init( RAS_ARGS Short* min, + Short* max ); + + typedef void + Function_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ); + + typedef void + Function_Sweep_Step( RAS_ARG ); + + + /* NOTE: These operations are only valid on 2's complement processors */ + +#define FLOOR( x ) ( (x) & -ras.precision ) +#define CEILING( x ) ( ( (x) + ras.precision - 1 ) & -ras.precision ) +#define TRUNC( x ) ( (signed long)(x) >> ras.precision_bits ) +#define FRAC( x ) ( (x) & ( ras.precision - 1 ) ) +#define SCALED( x ) ( ( (x) << ras.scale_shift ) - ras.precision_half ) + +#define IS_BOTTOM_OVERSHOOT( x ) ( CEILING( x ) - x >= ras.precision_half ) +#define IS_TOP_OVERSHOOT( x ) ( x - FLOOR( x ) >= ras.precision_half ) + + /* The most used variables are positioned at the top of the structure. */ + /* Thus, their offset can be coded with less opcodes, resulting in a */ + /* smaller executable. */ + + struct TWorker_ + { + Int precision_bits; /* precision related variables */ + Int precision; + Int precision_half; + Long precision_mask; + Int precision_shift; + Int precision_step; + Int precision_jitter; + + Int scale_shift; /* == precision_shift for bitmaps */ + /* == precision_shift+1 for pixmaps */ + + PLong buff; /* The profiles buffer */ + PLong sizeBuff; /* Render pool size */ + PLong maxBuff; /* Profiles buffer size */ + PLong top; /* Current cursor in buffer */ + + FT_Error error; + + Int numTurns; /* number of Y-turns in outline */ + + TPoint* arc; /* current Bezier arc pointer */ + + UShort bWidth; /* target bitmap width */ + PByte bTarget; /* target bitmap buffer */ + PByte gTarget; /* target pixmap buffer */ + + Long lastX, lastY; + Long minY, maxY; + + UShort num_Profs; /* current number of profiles */ + + Bool fresh; /* signals a fresh new profile which */ + /* `start' field must be completed */ + Bool joint; /* signals that the last arc ended */ + /* exactly on a scanline. Allows */ + /* removal of doublets */ + PProfile cProfile; /* current profile */ + PProfile fProfile; /* head of linked list of profiles */ + PProfile gProfile; /* contour's first profile in case */ + /* of impact */ + + TStates state; /* rendering state */ + + FT_Bitmap target; /* description of target bit/pixmap */ + FT_Outline outline; + + Long traceOfs; /* current offset in target bitmap */ + Long traceG; /* current offset in target pixmap */ + + Short traceIncr; /* sweep's increment in target bitmap */ + + Short gray_min_x; /* current min x during gray rendering */ + Short gray_max_x; /* current max x during gray rendering */ + + /* dispatch variables */ + + Function_Sweep_Init* Proc_Sweep_Init; + Function_Sweep_Span* Proc_Sweep_Span; + Function_Sweep_Span* Proc_Sweep_Drop; + Function_Sweep_Step* Proc_Sweep_Step; + + Byte dropOutControl; /* current drop_out control method */ + + Bool second_pass; /* indicates whether a horizontal pass */ + /* should be performed to control */ + /* drop-out accurately when calling */ + /* Render_Glyph. Note that there is */ + /* no horizontal pass during gray */ + /* rendering. */ + + TPoint arcs[3 * MaxBezier + 1]; /* The Bezier stack */ + + TBand band_stack[16]; /* band stack used for sub-banding */ + Int band_top; /* band stack top */ + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + Byte* grays; + + Byte gray_lines[RASTER_GRAY_LINES]; + /* Intermediate table used to render the */ + /* graylevels pixmaps. */ + /* gray_lines is a buffer holding two */ + /* monochrome scanlines */ + + Short gray_width; /* width in bytes of one monochrome */ + /* intermediate scanline of gray_lines. */ + /* Each gray pixel takes 2 bits long there */ + + /* The gray_lines must hold 2 lines, thus with size */ + /* in bytes of at least `gray_width*2'. */ + +#endif /* FT_RASTER_ANTI_ALIASING */ + + }; + + + typedef struct TRaster_ + { + char* buffer; + long buffer_size; + void* memory; + PWorker worker; + Byte grays[5]; + Short gray_width; + + } TRaster, *PRaster; + +#ifdef FT_STATIC_RASTER + + static TWorker cur_ras; +#define ras cur_ras + +#else /* !FT_STATIC_RASTER */ + +#define ras (*worker) + +#endif /* !FT_STATIC_RASTER */ + + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + /* A lookup table used to quickly count set bits in four gray 2x2 */ + /* cells. The values of the table have been produced with the */ + /* following code: */ + /* */ + /* for ( i = 0; i < 256; i++ ) */ + /* { */ + /* l = 0; */ + /* j = i; */ + /* */ + /* for ( c = 0; c < 4; c++ ) */ + /* { */ + /* l <<= 4; */ + /* */ + /* if ( j & 0x80 ) l++; */ + /* if ( j & 0x40 ) l++; */ + /* */ + /* j = ( j << 2 ) & 0xFF; */ + /* } */ + /* printf( "0x%04X", l ); */ + /* } */ + /* */ + + static const short count_table[256] = + { + 0x0000, 0x0001, 0x0001, 0x0002, 0x0010, 0x0011, 0x0011, 0x0012, + 0x0010, 0x0011, 0x0011, 0x0012, 0x0020, 0x0021, 0x0021, 0x0022, + 0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112, + 0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122, + 0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112, + 0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122, + 0x0200, 0x0201, 0x0201, 0x0202, 0x0210, 0x0211, 0x0211, 0x0212, + 0x0210, 0x0211, 0x0211, 0x0212, 0x0220, 0x0221, 0x0221, 0x0222, + 0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012, + 0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022, + 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112, + 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122, + 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112, + 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122, + 0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212, + 0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222, + 0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012, + 0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022, + 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112, + 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122, + 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112, + 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122, + 0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212, + 0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222, + 0x2000, 0x2001, 0x2001, 0x2002, 0x2010, 0x2011, 0x2011, 0x2012, + 0x2010, 0x2011, 0x2011, 0x2012, 0x2020, 0x2021, 0x2021, 0x2022, + 0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112, + 0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122, + 0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112, + 0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122, + 0x2200, 0x2201, 0x2201, 0x2202, 0x2210, 0x2211, 0x2211, 0x2212, + 0x2210, 0x2211, 0x2211, 0x2212, 0x2220, 0x2221, 0x2221, 0x2222 + }; + +#endif /* FT_RASTER_OPTION_ANTI_ALIASING */ + + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** PROFILES COMPUTATION **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Set_High_Precision */ + /* */ + /* <Description> */ + /* Set precision variables according to param flag. */ + /* */ + /* <Input> */ + /* High :: Set to True for high precision (typically for ppem < 18), */ + /* false otherwise. */ + /* */ + static void + Set_High_Precision( RAS_ARGS Int High ) + { + if ( High ) + { + ras.precision_bits = 12; + ras.precision_step = 256; + ras.precision_jitter = 50; + } + else + { + ras.precision_bits = 6; + ras.precision_step = 32; + ras.precision_jitter = 2; + } + + FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" )); + + ras.precision = 1 << ras.precision_bits; + ras.precision_half = ras.precision / 2; + ras.precision_shift = ras.precision_bits - Pixel_Bits; + ras.precision_mask = -ras.precision; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* New_Profile */ + /* */ + /* <Description> */ + /* Create a new profile in the render pool. */ + /* */ + /* <Input> */ + /* aState :: The state/orientation of the new profile. */ + /* */ + /* overshoot :: Whether the profile's unrounded start position */ + /* differs by at least a half pixel. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow or of incoherent */ + /* profile. */ + /* */ + static Bool + New_Profile( RAS_ARGS TStates aState, + Bool overshoot ) + { + if ( !ras.fProfile ) + { + ras.cProfile = (PProfile)ras.top; + ras.fProfile = ras.cProfile; + ras.top += AlignProfileSize; + } + + if ( ras.top >= ras.maxBuff ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + ras.cProfile->flags = 0; + ras.cProfile->start = 0; + ras.cProfile->height = 0; + ras.cProfile->offset = ras.top; + ras.cProfile->link = (PProfile)0; + ras.cProfile->next = (PProfile)0; + ras.cProfile->flags = ras.dropOutControl; + + switch ( aState ) + { + case Ascending_State: + ras.cProfile->flags |= Flow_Up; + if ( overshoot ) + ras.cProfile->flags |= Overshoot_Bottom; + + FT_TRACE6(( "New ascending profile = %lx\n", (long)ras.cProfile )); + break; + + case Descending_State: + if ( overshoot ) + ras.cProfile->flags |= Overshoot_Top; + FT_TRACE6(( "New descending profile = %lx\n", (long)ras.cProfile )); + break; + + default: + FT_ERROR(( "New_Profile: invalid profile direction\n" )); + ras.error = Raster_Err_Invalid; + return FAILURE; + } + + if ( !ras.gProfile ) + ras.gProfile = ras.cProfile; + + ras.state = aState; + ras.fresh = TRUE; + ras.joint = FALSE; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* End_Profile */ + /* */ + /* <Description> */ + /* Finalize the current profile. */ + /* */ + /* <Input> */ + /* overshoot :: Whether the profile's unrounded end position differs */ + /* by at least a half pixel. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow or incoherency. */ + /* */ + static Bool + End_Profile( RAS_ARGS Bool overshoot ) + { + Long h; + PProfile oldProfile; + + + h = (Long)( ras.top - ras.cProfile->offset ); + + if ( h < 0 ) + { + FT_ERROR(( "End_Profile: negative height encountered\n" )); + ras.error = Raster_Err_Neg_Height; + return FAILURE; + } + + if ( h > 0 ) + { + FT_TRACE6(( "Ending profile %lx, start = %ld, height = %ld\n", + (long)ras.cProfile, ras.cProfile->start, h )); + + ras.cProfile->height = h; + if ( overshoot ) + { + if ( ras.cProfile->flags & Flow_Up ) + ras.cProfile->flags |= Overshoot_Top; + else + ras.cProfile->flags |= Overshoot_Bottom; + } + + oldProfile = ras.cProfile; + ras.cProfile = (PProfile)ras.top; + + ras.top += AlignProfileSize; + + ras.cProfile->height = 0; + ras.cProfile->offset = ras.top; + + oldProfile->next = ras.cProfile; + ras.num_Profs++; + } + + if ( ras.top >= ras.maxBuff ) + { + FT_TRACE1(( "overflow in End_Profile\n" )); + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + ras.joint = FALSE; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Insert_Y_Turn */ + /* */ + /* <Description> */ + /* Insert a salient into the sorted list placed on top of the render */ + /* pool. */ + /* */ + /* <Input> */ + /* New y scanline position. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow. */ + /* */ + static Bool + Insert_Y_Turn( RAS_ARGS Int y ) + { + PLong y_turns; + Int y2, n; + + + n = ras.numTurns - 1; + y_turns = ras.sizeBuff - ras.numTurns; + + /* look for first y value that is <= */ + while ( n >= 0 && y < y_turns[n] ) + n--; + + /* if it is <, simply insert it, ignore if == */ + if ( n >= 0 && y > y_turns[n] ) + while ( n >= 0 ) + { + y2 = (Int)y_turns[n]; + y_turns[n] = y; + y = y2; + n--; + } + + if ( n < 0 ) + { + ras.maxBuff--; + if ( ras.maxBuff <= ras.top ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + ras.numTurns++; + ras.sizeBuff[-ras.numTurns] = y; + } + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Finalize_Profile_Table */ + /* */ + /* <Description> */ + /* Adjust all links in the profiles list. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow. */ + /* */ + static Bool + Finalize_Profile_Table( RAS_ARG ) + { + Int bottom, top; + UShort n; + PProfile p; + + + n = ras.num_Profs; + p = ras.fProfile; + + if ( n > 1 && p ) + { + while ( n > 0 ) + { + if ( n > 1 ) + p->link = (PProfile)( p->offset + p->height ); + else + p->link = NULL; + + if ( p->flags & Flow_Up ) + { + bottom = (Int)p->start; + top = (Int)( p->start + p->height - 1 ); + } + else + { + bottom = (Int)( p->start - p->height + 1 ); + top = (Int)p->start; + p->start = bottom; + p->offset += p->height - 1; + } + + if ( Insert_Y_Turn( RAS_VARS bottom ) || + Insert_Y_Turn( RAS_VARS top + 1 ) ) + return FAILURE; + + p = p->link; + n--; + } + } + else + ras.fProfile = NULL; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Split_Conic */ + /* */ + /* <Description> */ + /* Subdivide one conic Bezier into two joint sub-arcs in the Bezier */ + /* stack. */ + /* */ + /* <Input> */ + /* None (subdivided Bezier is taken from the top of the stack). */ + /* */ + /* <Note> */ + /* This routine is the `beef' of this component. It is _the_ inner */ + /* loop that should be optimized to hell to get the best performance. */ + /* */ + static void + Split_Conic( TPoint* base ) + { + Long a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + + /* hand optimized. gcc doesn't seem to be too good at common */ + /* expression substitution and instruction scheduling ;-) */ + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Split_Cubic */ + /* */ + /* <Description> */ + /* Subdivide a third-order Bezier arc into two joint sub-arcs in the */ + /* Bezier stack. */ + /* */ + /* <Note> */ + /* This routine is the `beef' of the component. It is one of _the_ */ + /* inner loops that should be optimized like hell to get the best */ + /* performance. */ + /* */ + static void + Split_Cubic( TPoint* base ) + { + Long a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c + 1 ) >> 1; + base[5].x = b = ( base[3].x + d + 1 ) >> 1; + c = ( c + d + 1 ) >> 1; + base[2].x = a = ( a + c + 1 ) >> 1; + base[4].x = b = ( b + c + 1 ) >> 1; + base[3].x = ( a + b + 1 ) >> 1; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c + 1 ) >> 1; + base[5].y = b = ( base[3].y + d + 1 ) >> 1; + c = ( c + d + 1 ) >> 1; + base[2].y = a = ( a + c + 1 ) >> 1; + base[4].y = b = ( b + c + 1 ) >> 1; + base[3].y = ( a + b + 1 ) >> 1; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Line_Up */ + /* */ + /* <Description> */ + /* Compute the x-coordinates of an ascending line segment and store */ + /* them in the render pool. */ + /* */ + /* <Input> */ + /* x1 :: The x-coordinate of the segment's start point. */ + /* */ + /* y1 :: The y-coordinate of the segment's start point. */ + /* */ + /* x2 :: The x-coordinate of the segment's end point. */ + /* */ + /* y2 :: The y-coordinate of the segment's end point. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Line_Up( RAS_ARGS Long x1, + Long y1, + Long x2, + Long y2, + Long miny, + Long maxy ) + { + Long Dx, Dy; + Int e1, e2, f1, f2, size; /* XXX: is `Short' sufficient? */ + Long Ix, Rx, Ax; + + PLong top; + + + Dx = x2 - x1; + Dy = y2 - y1; + + if ( Dy <= 0 || y2 < miny || y1 > maxy ) + return SUCCESS; + + if ( y1 < miny ) + { + /* Take care: miny-y1 can be a very large value; we use */ + /* a slow MulDiv function to avoid clipping bugs */ + x1 += SMulDiv( Dx, miny - y1, Dy ); + e1 = (Int)TRUNC( miny ); + f1 = 0; + } + else + { + e1 = (Int)TRUNC( y1 ); + f1 = (Int)FRAC( y1 ); + } + + if ( y2 > maxy ) + { + /* x2 += FMulDiv( Dx, maxy - y2, Dy ); UNNECESSARY */ + e2 = (Int)TRUNC( maxy ); + f2 = 0; + } + else + { + e2 = (Int)TRUNC( y2 ); + f2 = (Int)FRAC( y2 ); + } + + if ( f1 > 0 ) + { + if ( e1 == e2 ) + return SUCCESS; + else + { + x1 += FMulDiv( Dx, ras.precision - f1, Dy ); + e1 += 1; + } + } + else + if ( ras.joint ) + { + ras.top--; + ras.joint = FALSE; + } + + ras.joint = (char)( f2 == 0 ); + + if ( ras.fresh ) + { + ras.cProfile->start = e1; + ras.fresh = FALSE; + } + + size = e2 - e1 + 1; + if ( ras.top + size >= ras.maxBuff ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + if ( Dx > 0 ) + { + Ix = SMulDiv( ras.precision, Dx, Dy); + Rx = ( ras.precision * Dx ) % Dy; + Dx = 1; + } + else + { + Ix = SMulDiv( ras.precision, -Dx, Dy) * -1; + Rx = ( ras.precision * -Dx ) % Dy; + Dx = -1; + } + + Ax = -Dy; + top = ras.top; + + while ( size > 0 ) + { + *top++ = x1; + + x1 += Ix; + Ax += Rx; + if ( Ax >= 0 ) + { + Ax -= Dy; + x1 += Dx; + } + size--; + } + + ras.top = top; + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Line_Down */ + /* */ + /* <Description> */ + /* Compute the x-coordinates of an descending line segment and store */ + /* them in the render pool. */ + /* */ + /* <Input> */ + /* x1 :: The x-coordinate of the segment's start point. */ + /* */ + /* y1 :: The y-coordinate of the segment's start point. */ + /* */ + /* x2 :: The x-coordinate of the segment's end point. */ + /* */ + /* y2 :: The y-coordinate of the segment's end point. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Line_Down( RAS_ARGS Long x1, + Long y1, + Long x2, + Long y2, + Long miny, + Long maxy ) + { + Bool result, fresh; + + + fresh = ras.fresh; + + result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny ); + + if ( fresh && !ras.fresh ) + ras.cProfile->start = -ras.cProfile->start; + + return result; + } + + + /* A function type describing the functions used to split Bezier arcs */ + typedef void (*TSplitter)( TPoint* base ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Bezier_Up */ + /* */ + /* <Description> */ + /* Compute the x-coordinates of an ascending Bezier arc and store */ + /* them in the render pool. */ + /* */ + /* <Input> */ + /* degree :: The degree of the Bezier arc (either 2 or 3). */ + /* */ + /* splitter :: The function to split Bezier arcs. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Bezier_Up( RAS_ARGS Int degree, + TSplitter splitter, + Long miny, + Long maxy ) + { + Long y1, y2, e, e2, e0; + Short f1; + + TPoint* arc; + TPoint* start_arc; + + PLong top; + + + arc = ras.arc; + y1 = arc[degree].y; + y2 = arc[0].y; + top = ras.top; + + if ( y2 < miny || y1 > maxy ) + goto Fin; + + e2 = FLOOR( y2 ); + + if ( e2 > maxy ) + e2 = maxy; + + e0 = miny; + + if ( y1 < miny ) + e = miny; + else + { + e = CEILING( y1 ); + f1 = (Short)( FRAC( y1 ) ); + e0 = e; + + if ( f1 == 0 ) + { + if ( ras.joint ) + { + top--; + ras.joint = FALSE; + } + + *top++ = arc[degree].x; + + e += ras.precision; + } + } + + if ( ras.fresh ) + { + ras.cProfile->start = TRUNC( e0 ); + ras.fresh = FALSE; + } + + if ( e2 < e ) + goto Fin; + + if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff ) + { + ras.top = top; + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + start_arc = arc; + + while ( arc >= start_arc && e <= e2 ) + { + ras.joint = FALSE; + + y2 = arc[0].y; + + if ( y2 > e ) + { + y1 = arc[degree].y; + if ( y2 - y1 >= ras.precision_step ) + { + splitter( arc ); + arc += degree; + } + else + { + *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x, + e - y1, y2 - y1 ); + arc -= degree; + e += ras.precision; + } + } + else + { + if ( y2 == e ) + { + ras.joint = TRUE; + *top++ = arc[0].x; + + e += ras.precision; + } + arc -= degree; + } + } + + Fin: + ras.top = top; + ras.arc -= degree; + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Bezier_Down */ + /* */ + /* <Description> */ + /* Compute the x-coordinates of an descending Bezier arc and store */ + /* them in the render pool. */ + /* */ + /* <Input> */ + /* degree :: The degree of the Bezier arc (either 2 or 3). */ + /* */ + /* splitter :: The function to split Bezier arcs. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Bezier_Down( RAS_ARGS Int degree, + TSplitter splitter, + Long miny, + Long maxy ) + { + TPoint* arc = ras.arc; + Bool result, fresh; + + + arc[0].y = -arc[0].y; + arc[1].y = -arc[1].y; + arc[2].y = -arc[2].y; + if ( degree > 2 ) + arc[3].y = -arc[3].y; + + fresh = ras.fresh; + + result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny ); + + if ( fresh && !ras.fresh ) + ras.cProfile->start = -ras.cProfile->start; + + arc[0].y = -arc[0].y; + return result; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Line_To */ + /* */ + /* <Description> */ + /* Inject a new line segment and adjust the Profiles list. */ + /* */ + /* <Input> */ + /* x :: The x-coordinate of the segment's end point (its start point */ + /* is stored in `lastX'). */ + /* */ + /* y :: The y-coordinate of the segment's end point (its start point */ + /* is stored in `lastY'). */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static Bool + Line_To( RAS_ARGS Long x, + Long y ) + { + /* First, detect a change of direction */ + + switch ( ras.state ) + { + case Unknown_State: + if ( y > ras.lastY ) + { + if ( New_Profile( RAS_VARS Ascending_State, + IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + else + { + if ( y < ras.lastY ) + if ( New_Profile( RAS_VARS Descending_State, + IS_TOP_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + break; + + case Ascending_State: + if ( y < ras.lastY ) + { + if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) || + New_Profile( RAS_VARS Descending_State, + IS_TOP_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + break; + + case Descending_State: + if ( y > ras.lastY ) + { + if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) || + New_Profile( RAS_VARS Ascending_State, + IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + break; + + default: + ; + } + + /* Then compute the lines */ + + switch ( ras.state ) + { + case Ascending_State: + if ( Line_Up( RAS_VARS ras.lastX, ras.lastY, + x, y, ras.minY, ras.maxY ) ) + return FAILURE; + break; + + case Descending_State: + if ( Line_Down( RAS_VARS ras.lastX, ras.lastY, + x, y, ras.minY, ras.maxY ) ) + return FAILURE; + break; + + default: + ; + } + + ras.lastX = x; + ras.lastY = y; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Conic_To */ + /* */ + /* <Description> */ + /* Inject a new conic arc and adjust the profile list. */ + /* */ + /* <Input> */ + /* cx :: The x-coordinate of the arc's new control point. */ + /* */ + /* cy :: The y-coordinate of the arc's new control point. */ + /* */ + /* x :: The x-coordinate of the arc's end point (its start point is */ + /* stored in `lastX'). */ + /* */ + /* y :: The y-coordinate of the arc's end point (its start point is */ + /* stored in `lastY'). */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static Bool + Conic_To( RAS_ARGS Long cx, + Long cy, + Long x, + Long y ) + { + Long y1, y2, y3, x3, ymin, ymax; + TStates state_bez; + + + ras.arc = ras.arcs; + ras.arc[2].x = ras.lastX; + ras.arc[2].y = ras.lastY; + ras.arc[1].x = cx; + ras.arc[1].y = cy; + ras.arc[0].x = x; + ras.arc[0].y = y; + + do + { + y1 = ras.arc[2].y; + y2 = ras.arc[1].y; + y3 = ras.arc[0].y; + x3 = ras.arc[0].x; + + /* first, categorize the Bezier arc */ + + if ( y1 <= y3 ) + { + ymin = y1; + ymax = y3; + } + else + { + ymin = y3; + ymax = y1; + } + + if ( y2 < ymin || y2 > ymax ) + { + /* this arc has no given direction, split it! */ + Split_Conic( ras.arc ); + ras.arc += 2; + } + else if ( y1 == y3 ) + { + /* this arc is flat, ignore it and pop it from the Bezier stack */ + ras.arc -= 2; + } + else + { + /* the arc is y-monotonous, either ascending or descending */ + /* detect a change of direction */ + state_bez = y1 < y3 ? Ascending_State : Descending_State; + if ( ras.state != state_bez ) + { + Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 ) + : IS_TOP_OVERSHOOT( y1 ); + + + /* finalize current profile if any */ + if ( ras.state != Unknown_State && + End_Profile( RAS_VARS o ) ) + goto Fail; + + /* create a new profile */ + if ( New_Profile( RAS_VARS state_bez, o ) ) + goto Fail; + } + + /* now call the appropriate routine */ + if ( state_bez == Ascending_State ) + { + if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) ) + goto Fail; + } + else + if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) ) + goto Fail; + } + + } while ( ras.arc >= ras.arcs ); + + ras.lastX = x3; + ras.lastY = y3; + + return SUCCESS; + + Fail: + return FAILURE; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Cubic_To */ + /* */ + /* <Description> */ + /* Inject a new cubic arc and adjust the profile list. */ + /* */ + /* <Input> */ + /* cx1 :: The x-coordinate of the arc's first new control point. */ + /* */ + /* cy1 :: The y-coordinate of the arc's first new control point. */ + /* */ + /* cx2 :: The x-coordinate of the arc's second new control point. */ + /* */ + /* cy2 :: The y-coordinate of the arc's second new control point. */ + /* */ + /* x :: The x-coordinate of the arc's end point (its start point is */ + /* stored in `lastX'). */ + /* */ + /* y :: The y-coordinate of the arc's end point (its start point is */ + /* stored in `lastY'). */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static Bool + Cubic_To( RAS_ARGS Long cx1, + Long cy1, + Long cx2, + Long cy2, + Long x, + Long y ) + { + Long y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2; + TStates state_bez; + + + ras.arc = ras.arcs; + ras.arc[3].x = ras.lastX; + ras.arc[3].y = ras.lastY; + ras.arc[2].x = cx1; + ras.arc[2].y = cy1; + ras.arc[1].x = cx2; + ras.arc[1].y = cy2; + ras.arc[0].x = x; + ras.arc[0].y = y; + + do + { + y1 = ras.arc[3].y; + y2 = ras.arc[2].y; + y3 = ras.arc[1].y; + y4 = ras.arc[0].y; + x4 = ras.arc[0].x; + + /* first, categorize the Bezier arc */ + + if ( y1 <= y4 ) + { + ymin1 = y1; + ymax1 = y4; + } + else + { + ymin1 = y4; + ymax1 = y1; + } + + if ( y2 <= y3 ) + { + ymin2 = y2; + ymax2 = y3; + } + else + { + ymin2 = y3; + ymax2 = y2; + } + + if ( ymin2 < ymin1 || ymax2 > ymax1 ) + { + /* this arc has no given direction, split it! */ + Split_Cubic( ras.arc ); + ras.arc += 3; + } + else if ( y1 == y4 ) + { + /* this arc is flat, ignore it and pop it from the Bezier stack */ + ras.arc -= 3; + } + else + { + state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State; + + /* detect a change of direction */ + if ( ras.state != state_bez ) + { + Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 ) + : IS_TOP_OVERSHOOT( y1 ); + + + /* finalize current profile if any */ + if ( ras.state != Unknown_State && + End_Profile( RAS_VARS o ) ) + goto Fail; + + if ( New_Profile( RAS_VARS state_bez, o ) ) + goto Fail; + } + + /* compute intersections */ + if ( state_bez == Ascending_State ) + { + if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) + goto Fail; + } + else + if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) + goto Fail; + } + + } while ( ras.arc >= ras.arcs ); + + ras.lastX = x4; + ras.lastY = y4; + + return SUCCESS; + + Fail: + return FAILURE; + } + + +#undef SWAP_ +#define SWAP_( x, y ) do \ + { \ + Long swap = x; \ + \ + \ + x = y; \ + y = swap; \ + } while ( 0 ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Decompose_Curve */ + /* */ + /* <Description> */ + /* Scan the outline arrays in order to emit individual segments and */ + /* Beziers by calling Line_To() and Bezier_To(). It handles all */ + /* weird cases, like when the first point is off the curve, or when */ + /* there are simply no `on' points in the contour! */ + /* */ + /* <Input> */ + /* first :: The index of the first point in the contour. */ + /* */ + /* last :: The index of the last point in the contour. */ + /* */ + /* flipped :: If set, flip the direction of the curve. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on error. */ + /* */ + static Bool + Decompose_Curve( RAS_ARGS UShort first, + UShort last, + int flipped ) + { + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* points; + FT_Vector* point; + FT_Vector* limit; + char* tags; + + unsigned tag; /* current point's state */ + + + points = ras.outline.points; + limit = points + last; + + v_start.x = SCALED( points[first].x ); + v_start.y = SCALED( points[first].y ); + v_last.x = SCALED( points[last].x ); + v_last.y = SCALED( points[last].y ); + + if ( flipped ) + { + SWAP_( v_start.x, v_start.y ); + SWAP_( v_last.x, v_last.y ); + } + + v_control = v_start; + + point = points + first; + tags = ras.outline.tags + first; + + /* set scan mode if necessary */ + if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE ) + ras.dropOutControl = (Byte)tags[0] >> 5; + + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + v_last = v_start; + } + point--; + tags--; + } + + ras.lastX = v_start.x; + ras.lastY = v_start.y; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + Long x, y; + + + x = SCALED( point->x ); + y = SCALED( point->y ); + if ( flipped ) + SWAP_( x, y ); + + if ( Line_To( RAS_VARS x, y ) ) + goto Fail; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point[0].x ); + v_control.y = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( v_control.x, v_control.y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector v_middle; + Long x, y; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + x = SCALED( point[0].x ); + y = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( x, y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) ) + goto Fail; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + x ) / 2; + v_middle.y = ( v_control.y + y ) / 2; + + if ( Conic_To( RAS_VARS v_control.x, v_control.y, + v_middle.x, v_middle.y ) ) + goto Fail; + + v_control.x = x; + v_control.y = y; + + goto Do_Conic; + } + + if ( Conic_To( RAS_VARS v_control.x, v_control.y, + v_start.x, v_start.y ) ) + goto Fail; + + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + Long x1, y1, x2, y2, x3, y3; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + x1 = SCALED( point[-2].x ); + y1 = SCALED( point[-2].y ); + x2 = SCALED( point[-1].x ); + y2 = SCALED( point[-1].y ); + + if ( flipped ) + { + SWAP_( x1, y1 ); + SWAP_( x2, y2 ); + } + + if ( point <= limit ) + { + x3 = SCALED( point[0].x ); + y3 = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( x3, y3 ); + + if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) ) + goto Fail; + continue; + } + + if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) ) + goto Fail; + goto Close; + } + } + } + + /* close the contour with a line segment */ + if ( Line_To( RAS_VARS v_start.x, v_start.y ) ) + goto Fail; + + Close: + return SUCCESS; + + Invalid_Outline: + ras.error = Raster_Err_Invalid; + + Fail: + return FAILURE; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Convert_Glyph */ + /* */ + /* <Description> */ + /* Convert a glyph into a series of segments and arcs and make a */ + /* profiles list with them. */ + /* */ + /* <Input> */ + /* flipped :: If set, flip the direction of curve. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE if any error was encountered during */ + /* rendering. */ + /* */ + static Bool + Convert_Glyph( RAS_ARGS int flipped ) + { + int i; + unsigned start; + + PProfile lastProfile; + + + ras.fProfile = NULL; + ras.joint = FALSE; + ras.fresh = FALSE; + + ras.maxBuff = ras.sizeBuff - AlignProfileSize; + + ras.numTurns = 0; + + ras.cProfile = (PProfile)ras.top; + ras.cProfile->offset = ras.top; + ras.num_Profs = 0; + + start = 0; + + for ( i = 0; i < ras.outline.n_contours; i++ ) + { + Bool o; + + + ras.state = Unknown_State; + ras.gProfile = NULL; + + if ( Decompose_Curve( RAS_VARS (unsigned short)start, + ras.outline.contours[i], + flipped ) ) + return FAILURE; + + start = ras.outline.contours[i] + 1; + + /* we must now check whether the extreme arcs join or not */ + if ( FRAC( ras.lastY ) == 0 && + ras.lastY >= ras.minY && + ras.lastY <= ras.maxY ) + if ( ras.gProfile && + ( ras.gProfile->flags & Flow_Up ) == + ( ras.cProfile->flags & Flow_Up ) ) + ras.top--; + /* Note that ras.gProfile can be nil if the contour was too small */ + /* to be drawn. */ + + lastProfile = ras.cProfile; + if ( ras.cProfile->flags & Flow_Up ) + o = IS_TOP_OVERSHOOT( ras.lastY ); + else + o = IS_BOTTOM_OVERSHOOT( ras.lastY ); + if ( End_Profile( RAS_VARS o ) ) + return FAILURE; + + /* close the `next profile in contour' linked list */ + if ( ras.gProfile ) + lastProfile->next = ras.gProfile; + } + + if ( Finalize_Profile_Table( RAS_VAR ) ) + return FAILURE; + + return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** SCAN-LINE SWEEPS AND DRAWING **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Init_Linked */ + /* */ + /* Initializes an empty linked list. */ + /* */ + static void + Init_Linked( TProfileList* l ) + { + *l = NULL; + } + + + /*************************************************************************/ + /* */ + /* InsNew */ + /* */ + /* Inserts a new profile in a linked list. */ + /* */ + static void + InsNew( PProfileList list, + PProfile profile ) + { + PProfile *old, current; + Long x; + + + old = list; + current = *old; + x = profile->X; + + while ( current ) + { + if ( x < current->X ) + break; + old = ¤t->link; + current = *old; + } + + profile->link = current; + *old = profile; + } + + + /*************************************************************************/ + /* */ + /* DelOld */ + /* */ + /* Removes an old profile from a linked list. */ + /* */ + static void + DelOld( PProfileList list, + PProfile profile ) + { + PProfile *old, current; + + + old = list; + current = *old; + + while ( current ) + { + if ( current == profile ) + { + *old = current->link; + return; + } + + old = ¤t->link; + current = *old; + } + + /* we should never get there, unless the profile was not part of */ + /* the list. */ + } + + + /*************************************************************************/ + /* */ + /* Sort */ + /* */ + /* Sorts a trace list. In 95%, the list is already sorted. We need */ + /* an algorithm which is fast in this case. Bubble sort is enough */ + /* and simple. */ + /* */ + static void + Sort( PProfileList list ) + { + PProfile *old, current, next; + + + /* First, set the new X coordinate of each profile */ + current = *list; + while ( current ) + { + current->X = *current->offset; + current->offset += current->flags & Flow_Up ? 1 : -1; + current->height--; + current = current->link; + } + + /* Then sort them */ + old = list; + current = *old; + + if ( !current ) + return; + + next = current->link; + + while ( next ) + { + if ( current->X <= next->X ) + { + old = ¤t->link; + current = *old; + + if ( !current ) + return; + } + else + { + *old = next; + current->link = next->link; + next->link = current; + + old = list; + current = *old; + } + + next = current->link; + } + } + + + /*************************************************************************/ + /* */ + /* Vertical Sweep Procedure Set */ + /* */ + /* These four routines are used during the vertical black/white sweep */ + /* phase by the generic Draw_Sweep() function. */ + /* */ + /*************************************************************************/ + + static void + Vertical_Sweep_Init( RAS_ARGS Short* min, + Short* max ) + { + Long pitch = ras.target.pitch; + + FT_UNUSED( max ); + + + ras.traceIncr = (Short)-pitch; + ras.traceOfs = -*min * pitch; + if ( pitch > 0 ) + ras.traceOfs += ( ras.target.rows - 1 ) * pitch; + + ras.gray_min_x = 0; + ras.gray_max_x = 0; + } + + + static void + Vertical_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2; + int c1, c2; + Byte f1, f2; + Byte* target; + + FT_UNUSED( y ); + FT_UNUSED( left ); + FT_UNUSED( right ); + + + /* Drop-out control */ + + e1 = TRUNC( CEILING( x1 ) ); + + if ( x2 - x1 - ras.precision <= ras.precision_jitter ) + e2 = e1; + else + e2 = TRUNC( FLOOR( x2 ) ); + + if ( e2 >= 0 && e1 < ras.bWidth ) + { + if ( e1 < 0 ) + e1 = 0; + if ( e2 >= ras.bWidth ) + e2 = ras.bWidth - 1; + + c1 = (Short)( e1 >> 3 ); + c2 = (Short)( e2 >> 3 ); + + f1 = (Byte) ( 0xFF >> ( e1 & 7 ) ); + f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) ); + + if ( ras.gray_min_x > c1 ) + ras.gray_min_x = (short)c1; + if ( ras.gray_max_x < c2 ) + ras.gray_max_x = (short)c2; + + target = ras.bTarget + ras.traceOfs + c1; + c2 -= c1; + + if ( c2 > 0 ) + { + target[0] |= f1; + + /* memset() is slower than the following code on many platforms. */ + /* This is due to the fact that, in the vast majority of cases, */ + /* the span length in bytes is relatively small. */ + c2--; + while ( c2 > 0 ) + { + *(++target) = 0xFF; + c2--; + } + target[1] |= f2; + } + else + *target |= ( f1 & f2 ); + } + } + + + static void + Vertical_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2, pxl; + Short c1, f1; + + + /* Drop-out control */ + + /* e2 x2 x1 e1 */ + /* */ + /* ^ | */ + /* | | */ + /* +-------------+---------------------+------------+ */ + /* | | */ + /* | v */ + /* */ + /* pixel contour contour pixel */ + /* center center */ + + /* drop-out mode scan conversion rules (as defined in OpenType) */ + /* --------------------------------------------------------------- */ + /* 0 1, 2, 3 */ + /* 1 1, 2, 4 */ + /* 2 1, 2 */ + /* 3 same as mode 2 */ + /* 4 1, 2, 5 */ + /* 5 1, 2, 6 */ + /* 6, 7 same as mode 2 */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + pxl = e1; + + if ( e1 > e2 ) + { + Int dropOutControl = left->flags & 7; + + + if ( e1 == e2 + ras.precision ) + { + switch ( dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + pxl = e2; + break; + + case 4: /* smart drop-outs including stubs */ + pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + + /* Drop-out Control Rules #4 and #6 */ + + /* The specification neither provides an exact definition */ + /* of a `stub' nor gives exact rules to exclude them. */ + /* */ + /* Here the constraints we use to recognize a stub. */ + /* */ + /* upper stub: */ + /* */ + /* - P_Left and P_Right are in the same contour */ + /* - P_Right is the successor of P_Left in that contour */ + /* - y is the top of P_Left and P_Right */ + /* */ + /* lower stub: */ + /* */ + /* - P_Left and P_Right are in the same contour */ + /* - P_Left is the successor of P_Right in that contour */ + /* - y is the bottom of P_Left */ + /* */ + /* We draw a stub if the following constraints are met. */ + /* */ + /* - for an upper or lower stub, there is top or bottom */ + /* overshoot, respectively */ + /* - the covered interval is greater or equal to a half */ + /* pixel */ + + /* upper stub test */ + if ( left->next == right && + left->height <= 0 && + !( left->flags & Overshoot_Top && + x2 - x1 >= ras.precision_half ) ) + return; + + /* lower stub test */ + if ( right->next == left && + left->start == y && + !( left->flags & Overshoot_Bottom && + x2 - x1 >= ras.precision_half ) ) + return; + + if ( dropOutControl == 1 ) + pxl = e2; + else + pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + default: /* modes 2, 3, 6, 7 */ + return; /* no drop-out control */ + } + + /* check that the other pixel isn't set */ + e1 = pxl == e1 ? e2 : e1; + + e1 = TRUNC( e1 ); + + c1 = (Short)( e1 >> 3 ); + f1 = (Short)( e1 & 7 ); + + if ( e1 >= 0 && e1 < ras.bWidth && + ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) ) + return; + } + else + return; + } + + e1 = TRUNC( pxl ); + + if ( e1 >= 0 && e1 < ras.bWidth ) + { + c1 = (Short)( e1 >> 3 ); + f1 = (Short)( e1 & 7 ); + + if ( ras.gray_min_x > c1 ) + ras.gray_min_x = c1; + if ( ras.gray_max_x < c1 ) + ras.gray_max_x = c1; + + ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 ); + } + } + + + static void + Vertical_Sweep_Step( RAS_ARG ) + { + ras.traceOfs += ras.traceIncr; + } + + + /***********************************************************************/ + /* */ + /* Horizontal Sweep Procedure Set */ + /* */ + /* These four routines are used during the horizontal black/white */ + /* sweep phase by the generic Draw_Sweep() function. */ + /* */ + /***********************************************************************/ + + static void + Horizontal_Sweep_Init( RAS_ARGS Short* min, + Short* max ) + { + /* nothing, really */ + FT_UNUSED_RASTER; + FT_UNUSED( min ); + FT_UNUSED( max ); + } + + + static void + Horizontal_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2; + PByte bits; + Byte f1; + + FT_UNUSED( left ); + FT_UNUSED( right ); + + + if ( x2 - x1 < ras.precision ) + { + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + + if ( e1 == e2 ) + { + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + e1 = TRUNC( e1 ); + + if ( e1 >= 0 && e1 < ras.target.rows ) + { + PByte p; + + + p = bits - e1 * ras.target.pitch; + if ( ras.target.pitch > 0 ) + p += ( ras.target.rows - 1 ) * ras.target.pitch; + + p[0] |= f1; + } + } + } + } + + + static void + Horizontal_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2, pxl; + PByte bits; + Byte f1; + + + /* During the horizontal sweep, we only take care of drop-outs */ + + /* e1 + <-- pixel center */ + /* | */ + /* x1 ---+--> <-- contour */ + /* | */ + /* | */ + /* x2 <--+--- <-- contour */ + /* | */ + /* | */ + /* e2 + <-- pixel center */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + pxl = e1; + + if ( e1 > e2 ) + { + Int dropOutControl = left->flags & 7; + + + if ( e1 == e2 + ras.precision ) + { + switch ( dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + pxl = e2; + break; + + case 4: /* smart drop-outs including stubs */ + pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + /* see Vertical_Sweep_Drop for details */ + + /* rightmost stub test */ + if ( left->next == right && + left->height <= 0 && + !( left->flags & Overshoot_Top && + x2 - x1 >= ras.precision_half ) ) + return; + + /* leftmost stub test */ + if ( right->next == left && + left->start == y && + !( left->flags & Overshoot_Bottom && + x2 - x1 >= ras.precision_half ) ) + return; + + if ( dropOutControl == 1 ) + pxl = e2; + else + pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + default: /* modes 2, 3, 6, 7 */ + return; /* no drop-out control */ + } + + /* check that the other pixel isn't set */ + e1 = pxl == e1 ? e2 : e1; + + e1 = TRUNC( e1 ); + + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + bits -= e1 * ras.target.pitch; + if ( ras.target.pitch > 0 ) + bits += ( ras.target.rows - 1 ) * ras.target.pitch; + + if ( e1 >= 0 && + e1 < ras.target.rows && + *bits & f1 ) + return; + } + else + return; + } + + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + e1 = TRUNC( pxl ); + + if ( e1 >= 0 && e1 < ras.target.rows ) + { + bits -= e1 * ras.target.pitch; + if ( ras.target.pitch > 0 ) + bits += ( ras.target.rows - 1 ) * ras.target.pitch; + + bits[0] |= f1; + } + } + + + static void + Horizontal_Sweep_Step( RAS_ARG ) + { + /* Nothing, really */ + FT_UNUSED_RASTER; + } + + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + + /*************************************************************************/ + /* */ + /* Vertical Gray Sweep Procedure Set */ + /* */ + /* These two routines are used during the vertical gray-levels sweep */ + /* phase by the generic Draw_Sweep() function. */ + /* */ + /* NOTES */ + /* */ + /* - The target pixmap's width *must* be a multiple of 4. */ + /* */ + /* - You have to use the function Vertical_Sweep_Span() for the gray */ + /* span call. */ + /* */ + /*************************************************************************/ + + static void + Vertical_Gray_Sweep_Init( RAS_ARGS Short* min, + Short* max ) + { + Long pitch, byte_len; + + + *min = *min & -2; + *max = ( *max + 3 ) & -2; + + ras.traceOfs = 0; + pitch = ras.target.pitch; + byte_len = -pitch; + ras.traceIncr = (Short)byte_len; + ras.traceG = ( *min / 2 ) * byte_len; + + if ( pitch > 0 ) + { + ras.traceG += ( ras.target.rows - 1 ) * pitch; + byte_len = -byte_len; + } + + ras.gray_min_x = (Short)byte_len; + ras.gray_max_x = -(Short)byte_len; + } + + + static void + Vertical_Gray_Sweep_Step( RAS_ARG ) + { + Int c1, c2; + PByte pix, bit, bit2; + short* count = (short*)count_table; + Byte* grays; + + + ras.traceOfs += ras.gray_width; + + if ( ras.traceOfs > ras.gray_width ) + { + pix = ras.gTarget + ras.traceG + ras.gray_min_x * 4; + grays = ras.grays; + + if ( ras.gray_max_x >= 0 ) + { + Long last_pixel = ras.target.width - 1; + Int last_cell = last_pixel >> 2; + Int last_bit = last_pixel & 3; + Bool over = 0; + + + if ( ras.gray_max_x >= last_cell && last_bit != 3 ) + { + ras.gray_max_x = last_cell - 1; + over = 1; + } + + if ( ras.gray_min_x < 0 ) + ras.gray_min_x = 0; + + bit = ras.bTarget + ras.gray_min_x; + bit2 = bit + ras.gray_width; + + c1 = ras.gray_max_x - ras.gray_min_x; + + while ( c1 >= 0 ) + { + c2 = count[*bit] + count[*bit2]; + + if ( c2 ) + { + pix[0] = grays[(c2 >> 12) & 0x000F]; + pix[1] = grays[(c2 >> 8 ) & 0x000F]; + pix[2] = grays[(c2 >> 4 ) & 0x000F]; + pix[3] = grays[ c2 & 0x000F]; + + *bit = 0; + *bit2 = 0; + } + + bit++; + bit2++; + pix += 4; + c1--; + } + + if ( over ) + { + c2 = count[*bit] + count[*bit2]; + if ( c2 ) + { + switch ( last_bit ) + { + case 2: + pix[2] = grays[(c2 >> 4 ) & 0x000F]; + case 1: + pix[1] = grays[(c2 >> 8 ) & 0x000F]; + default: + pix[0] = grays[(c2 >> 12) & 0x000F]; + } + + *bit = 0; + *bit2 = 0; + } + } + } + + ras.traceOfs = 0; + ras.traceG += ras.traceIncr; + + ras.gray_min_x = 32000; + ras.gray_max_x = -32000; + } + } + + + static void + Horizontal_Gray_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + /* nothing, really */ + FT_UNUSED_RASTER; + FT_UNUSED( y ); + FT_UNUSED( x1 ); + FT_UNUSED( x2 ); + FT_UNUSED( left ); + FT_UNUSED( right ); + } + + + static void + Horizontal_Gray_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2; + PByte pixel; + Byte color; + + + /* During the horizontal sweep, we only take care of drop-outs */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + + if ( e1 > e2 ) + { + Int dropOutControl = left->flags & 7; + + + if ( e1 == e2 + ras.precision ) + { + switch ( dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + e1 = e2; + break; + + case 4: /* smart drop-outs including stubs */ + e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + /* see Vertical_Sweep_Drop for details */ + + /* rightmost stub test */ + if ( left->next == right && left->height <= 0 ) + return; + + /* leftmost stub test */ + if ( right->next == left && left->start == y ) + return; + + if ( dropOutControl == 1 ) + e1 = e2; + else + e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + + break; + + default: /* modes 2, 3, 6, 7 */ + return; /* no drop-out control */ + } + } + else + return; + } + + if ( e1 >= 0 ) + { + if ( x2 - x1 >= ras.precision_half ) + color = ras.grays[2]; + else + color = ras.grays[1]; + + e1 = TRUNC( e1 ) / 2; + if ( e1 < ras.target.rows ) + { + pixel = ras.gTarget - e1 * ras.target.pitch + y / 2; + if ( ras.target.pitch > 0 ) + pixel += ( ras.target.rows - 1 ) * ras.target.pitch; + + if ( pixel[0] == ras.grays[0] ) + pixel[0] = color; + } + } + } + + +#endif /* FT_RASTER_OPTION_ANTI_ALIASING */ + + + /*************************************************************************/ + /* */ + /* Generic Sweep Drawing routine */ + /* */ + /*************************************************************************/ + + static Bool + Draw_Sweep( RAS_ARG ) + { + Short y, y_change, y_height; + + PProfile P, Q, P_Left, P_Right; + + Short min_Y, max_Y, top, bottom, dropouts; + + Long x1, x2, xs, e1, e2; + + TProfileList waiting; + TProfileList draw_left, draw_right; + + + /* initialize empty linked lists */ + + Init_Linked( &waiting ); + + Init_Linked( &draw_left ); + Init_Linked( &draw_right ); + + /* first, compute min and max Y */ + + P = ras.fProfile; + max_Y = (Short)TRUNC( ras.minY ); + min_Y = (Short)TRUNC( ras.maxY ); + + while ( P ) + { + Q = P->link; + + bottom = (Short)P->start; + top = (Short)( P->start + P->height - 1 ); + + if ( min_Y > bottom ) + min_Y = bottom; + if ( max_Y < top ) + max_Y = top; + + P->X = 0; + InsNew( &waiting, P ); + + P = Q; + } + + /* check the Y-turns */ + if ( ras.numTurns == 0 ) + { + ras.error = Raster_Err_Invalid; + return FAILURE; + } + + /* now initialize the sweep */ + + ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y ); + + /* then compute the distance of each profile from min_Y */ + + P = waiting; + + while ( P ) + { + P->countL = (UShort)( P->start - min_Y ); + P = P->link; + } + + /* let's go */ + + y = min_Y; + y_height = 0; + + if ( ras.numTurns > 0 && + ras.sizeBuff[-ras.numTurns] == min_Y ) + ras.numTurns--; + + while ( ras.numTurns > 0 ) + { + /* check waiting list for new activations */ + + P = waiting; + + while ( P ) + { + Q = P->link; + P->countL -= y_height; + if ( P->countL == 0 ) + { + DelOld( &waiting, P ); + + if ( P->flags & Flow_Up ) + InsNew( &draw_left, P ); + else + InsNew( &draw_right, P ); + } + + P = Q; + } + + /* sort the drawing lists */ + + Sort( &draw_left ); + Sort( &draw_right ); + + y_change = (Short)ras.sizeBuff[-ras.numTurns--]; + y_height = (Short)( y_change - y ); + + while ( y < y_change ) + { + /* let's trace */ + + dropouts = 0; + + P_Left = draw_left; + P_Right = draw_right; + + while ( P_Left ) + { + x1 = P_Left ->X; + x2 = P_Right->X; + + if ( x1 > x2 ) + { + xs = x1; + x1 = x2; + x2 = xs; + } + + e1 = FLOOR( x1 ); + e2 = CEILING( x2 ); + + if ( x2 - x1 <= ras.precision && + e1 != x1 && e2 != x2 ) + { + if ( e1 > e2 || e2 == e1 + ras.precision ) + { + Int dropOutControl = P_Left->flags & 7; + + + if ( dropOutControl != 2 ) + { + /* a drop-out was detected */ + + P_Left ->X = x1; + P_Right->X = x2; + + /* mark profile for drop-out processing */ + P_Left->countL = 1; + dropouts++; + } + + goto Skip_To_Next; + } + } + + ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right ); + + Skip_To_Next: + + P_Left = P_Left->link; + P_Right = P_Right->link; + } + + /* handle drop-outs _after_ the span drawing -- */ + /* drop-out processing has been moved out of the loop */ + /* for performance tuning */ + if ( dropouts > 0 ) + goto Scan_DropOuts; + + Next_Line: + + ras.Proc_Sweep_Step( RAS_VAR ); + + y++; + + if ( y < y_change ) + { + Sort( &draw_left ); + Sort( &draw_right ); + } + } + + /* now finalize the profiles that need it */ + + P = draw_left; + while ( P ) + { + Q = P->link; + if ( P->height == 0 ) + DelOld( &draw_left, P ); + P = Q; + } + + P = draw_right; + while ( P ) + { + Q = P->link; + if ( P->height == 0 ) + DelOld( &draw_right, P ); + P = Q; + } + } + + /* for gray-scaling, flush the bitmap scanline cache */ + while ( y <= max_Y ) + { + ras.Proc_Sweep_Step( RAS_VAR ); + y++; + } + + return SUCCESS; + + Scan_DropOuts: + + P_Left = draw_left; + P_Right = draw_right; + + while ( P_Left ) + { + if ( P_Left->countL ) + { + P_Left->countL = 0; +#if 0 + dropouts--; /* -- this is useful when debugging only */ +#endif + ras.Proc_Sweep_Drop( RAS_VARS y, + P_Left->X, + P_Right->X, + P_Left, + P_Right ); + } + + P_Left = P_Left->link; + P_Right = P_Right->link; + } + + goto Next_Line; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Render_Single_Pass */ + /* */ + /* <Description> */ + /* Perform one sweep with sub-banding. */ + /* */ + /* <Input> */ + /* flipped :: If set, flip the direction of the outline. */ + /* */ + /* <Return> */ + /* Renderer error code. */ + /* */ + static int + Render_Single_Pass( RAS_ARGS Bool flipped ) + { + Short i, j, k; + + + while ( ras.band_top >= 0 ) + { + ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision; + ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision; + + ras.top = ras.buff; + + ras.error = Raster_Err_None; + + if ( Convert_Glyph( RAS_VARS flipped ) ) + { + if ( ras.error != Raster_Err_Overflow ) + return FAILURE; + + ras.error = Raster_Err_None; + + /* sub-banding */ + +#ifdef DEBUG_RASTER + ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) ); +#endif + + i = ras.band_stack[ras.band_top].y_min; + j = ras.band_stack[ras.band_top].y_max; + + k = (Short)( ( i + j ) / 2 ); + + if ( ras.band_top >= 7 || k < i ) + { + ras.band_top = 0; + ras.error = Raster_Err_Invalid; + + return ras.error; + } + + ras.band_stack[ras.band_top + 1].y_min = k; + ras.band_stack[ras.band_top + 1].y_max = j; + + ras.band_stack[ras.band_top].y_max = (Short)( k - 1 ); + + ras.band_top++; + } + else + { + if ( ras.fProfile ) + if ( Draw_Sweep( RAS_VAR ) ) + return ras.error; + ras.band_top--; + } + } + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Render_Glyph */ + /* */ + /* <Description> */ + /* Render a glyph in a bitmap. Sub-banding if needed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + Render_Glyph( RAS_ARG ) + { + FT_Error error; + + + Set_High_Precision( RAS_VARS ras.outline.flags & + FT_OUTLINE_HIGH_PRECISION ); + ras.scale_shift = ras.precision_shift; + + if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS ) + ras.dropOutControl = 2; + else + { + if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS ) + ras.dropOutControl = 4; + else + ras.dropOutControl = 0; + + if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) ) + ras.dropOutControl += 1; + } + + ras.second_pass = (FT_Byte)( !( ras.outline.flags & + FT_OUTLINE_SINGLE_PASS ) ); + + /* Vertical Sweep */ + ras.Proc_Sweep_Init = Vertical_Sweep_Init; + ras.Proc_Sweep_Span = Vertical_Sweep_Span; + ras.Proc_Sweep_Drop = Vertical_Sweep_Drop; + ras.Proc_Sweep_Step = Vertical_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = (short)( ras.target.rows - 1 ); + + ras.bWidth = (unsigned short)ras.target.width; + ras.bTarget = (Byte*)ras.target.buffer; + + if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 ) + return error; + + /* Horizontal Sweep */ + if ( ras.second_pass && ras.dropOutControl != 2 ) + { + ras.Proc_Sweep_Init = Horizontal_Sweep_Init; + ras.Proc_Sweep_Span = Horizontal_Sweep_Span; + ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop; + ras.Proc_Sweep_Step = Horizontal_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = (short)( ras.target.width - 1 ); + + if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 ) + return error; + } + + return Raster_Err_None; + } + + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Render_Gray_Glyph */ + /* */ + /* <Description> */ + /* Render a glyph with grayscaling. Sub-banding if needed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + Render_Gray_Glyph( RAS_ARG ) + { + Long pixel_width; + FT_Error error; + + + Set_High_Precision( RAS_VARS ras.outline.flags & + FT_OUTLINE_HIGH_PRECISION ); + ras.scale_shift = ras.precision_shift + 1; + + if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS ) + ras.dropOutControl = 2; + else + { + if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS ) + ras.dropOutControl = 4; + else + ras.dropOutControl = 0; + + if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) ) + ras.dropOutControl += 1; + } + + ras.second_pass = !( ras.outline.flags & FT_OUTLINE_SINGLE_PASS ); + + /* Vertical Sweep */ + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = 2 * ras.target.rows - 1; + + ras.bWidth = ras.gray_width; + pixel_width = 2 * ( ( ras.target.width + 3 ) >> 2 ); + + if ( ras.bWidth > pixel_width ) + ras.bWidth = pixel_width; + + ras.bWidth = ras.bWidth * 8; + ras.bTarget = (Byte*)ras.gray_lines; + ras.gTarget = (Byte*)ras.target.buffer; + + ras.Proc_Sweep_Init = Vertical_Gray_Sweep_Init; + ras.Proc_Sweep_Span = Vertical_Sweep_Span; + ras.Proc_Sweep_Drop = Vertical_Sweep_Drop; + ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step; + + error = Render_Single_Pass( RAS_VARS 0 ); + if ( error ) + return error; + + /* Horizontal Sweep */ + if ( ras.second_pass && ras.dropOutControl != 2 ) + { + ras.Proc_Sweep_Init = Horizontal_Sweep_Init; + ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span; + ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop; + ras.Proc_Sweep_Step = Horizontal_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = ras.target.width * 2 - 1; + + error = Render_Single_Pass( RAS_VARS 1 ); + if ( error ) + return error; + } + + return Raster_Err_None; + } + +#else /* !FT_RASTER_OPTION_ANTI_ALIASING */ + + FT_LOCAL_DEF( FT_Error ) + Render_Gray_Glyph( RAS_ARG ) + { + FT_UNUSED_RASTER; + + return Raster_Err_Unsupported; + } + +#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */ + + + static void + ft_black_init( PRaster raster ) + { +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + FT_UInt n; + + + /* set default 5-levels gray palette */ + for ( n = 0; n < 5; n++ ) + raster->grays[n] = n * 255 / 4; + + raster->gray_width = RASTER_GRAY_LINES / 2; +#else + FT_UNUSED( raster ); +#endif + } + + + /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/ + /**** a static object. *****/ + + +#ifdef _STANDALONE_ + + + static int + ft_black_new( void* memory, + FT_Raster *araster ) + { + static TRaster the_raster; + + + *araster = (FT_Raster)&the_raster; + FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); + ft_black_init( &the_raster ); + + return 0; + } + + + static void + ft_black_done( FT_Raster raster ) + { + /* nothing */ + FT_UNUSED( raster ); + } + + +#else /* !_STANDALONE_ */ + + + static int + ft_black_new( FT_Memory memory, + PRaster *araster ) + { + FT_Error error; + PRaster raster = NULL; + + + *araster = 0; + if ( !FT_NEW( raster ) ) + { + raster->memory = memory; + ft_black_init( raster ); + + *araster = raster; + } + + return error; + } + + + static void + ft_black_done( PRaster raster ) + { + FT_Memory memory = (FT_Memory)raster->memory; + FT_FREE( raster ); + } + + +#endif /* !_STANDALONE_ */ + + + static void + ft_black_reset( PRaster raster, + char* pool_base, + long pool_size ) + { + if ( raster ) + { + if ( pool_base && pool_size >= (long)sizeof(TWorker) + 2048 ) + { + PWorker worker = (PWorker)pool_base; + + + raster->buffer = pool_base + ( ( sizeof ( *worker ) + 7 ) & ~7 ); + raster->buffer_size = pool_base + pool_size - (char*)raster->buffer; + raster->worker = worker; + } + else + { + raster->buffer = NULL; + raster->buffer_size = 0; + raster->worker = NULL; + } + } + } + + + static void + ft_black_set_mode( PRaster raster, + unsigned long mode, + const char* palette ) + { +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) ) + { + /* set 5-levels gray palette */ + raster->grays[0] = palette[0]; + raster->grays[1] = palette[1]; + raster->grays[2] = palette[2]; + raster->grays[3] = palette[3]; + raster->grays[4] = palette[4]; + } + +#else + + FT_UNUSED( raster ); + FT_UNUSED( mode ); + FT_UNUSED( palette ); + +#endif + } + + + static int + ft_black_render( PRaster raster, + const FT_Raster_Params* params ) + { + const FT_Outline* outline = (const FT_Outline*)params->source; + const FT_Bitmap* target_map = params->target; + PWorker worker; + + + if ( !raster || !raster->buffer || !raster->buffer_size ) + return Raster_Err_Not_Ini; + + if ( !outline ) + return Raster_Err_Invalid; + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return Raster_Err_None; + + if ( !outline->contours || !outline->points ) + return Raster_Err_Invalid; + + if ( outline->n_points != + outline->contours[outline->n_contours - 1] + 1 ) + return Raster_Err_Invalid; + + worker = raster->worker; + + /* this version of the raster does not support direct rendering, sorry */ + if ( params->flags & FT_RASTER_FLAG_DIRECT ) + return Raster_Err_Unsupported; + + if ( !target_map ) + return Raster_Err_Invalid; + + /* nothing to do */ + if ( !target_map->width || !target_map->rows ) + return Raster_Err_None; + + if ( !target_map->buffer ) + return Raster_Err_Invalid; + + ras.outline = *outline; + ras.target = *target_map; + + worker->buff = (PLong) raster->buffer; + worker->sizeBuff = worker->buff + + raster->buffer_size / sizeof ( Long ); +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + worker->grays = raster->grays; + worker->gray_width = raster->gray_width; + + FT_MEM_ZERO( worker->gray_lines, worker->gray_width * 2 ); +#endif + + return ( params->flags & FT_RASTER_FLAG_AA ) + ? Render_Gray_Glyph( RAS_VAR ) + : Render_Glyph( RAS_VAR ); + } + + + FT_DEFINE_RASTER_FUNCS( ft_standard_raster, + FT_GLYPH_FORMAT_OUTLINE, + (FT_Raster_New_Func) ft_black_new, + (FT_Raster_Reset_Func) ft_black_reset, + (FT_Raster_Set_Mode_Func)ft_black_set_mode, + (FT_Raster_Render_Func) ft_black_render, + (FT_Raster_Done_Func) ft_black_done + ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/ftraster.h b/android/jni/ndk_modules/freetype/src/raster/ftraster.h new file mode 100644 index 00000000..80fe46de --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/raster/ftraster.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* ftraster.h */ +/* */ +/* The FreeType glyph rasterizer (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTRASTER_H__ +#define __FTRASTER_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_IMAGE_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* Uncomment the following line if you are using ftraster.c as a */ + /* standalone module, fully independent of FreeType. */ + /* */ +/* #define _STANDALONE_ */ + + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_standard_raster; + + +FT_END_HEADER + +#endif /* __FTRASTER_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/ftrend1.c b/android/jni/ndk_modules/freetype/src/raster/ftrend1.c new file mode 100644 index 00000000..1ed8af61 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/raster/ftrend1.c @@ -0,0 +1,291 @@ +/***************************************************************************/ +/* */ +/* ftrend1.c */ +/* */ +/* The FreeType glyph rasterizer interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include "ftrend1.h" +#include "ftraster.h" +#include "rastpic.h" + +#include "rasterrs.h" + + + /* initialize renderer -- init its raster */ + static FT_Error + ft_raster1_init( FT_Renderer render ) + { + FT_Library library = FT_MODULE_LIBRARY( render ); + + + render->clazz->raster_class->raster_reset( render->raster, + library->raster_pool, + library->raster_pool_size ); + + return Raster_Err_Ok; + } + + + /* set render-specific mode */ + static FT_Error + ft_raster1_set_mode( FT_Renderer render, + FT_ULong mode_tag, + FT_Pointer data ) + { + /* we simply pass it to the raster */ + return render->clazz->raster_class->raster_set_mode( render->raster, + mode_tag, + data ); + } + + + /* transform a given glyph image */ + static FT_Error + ft_raster1_transform( FT_Renderer render, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_Error error = Raster_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = Raster_Err_Invalid_Argument; + goto Exit; + } + + if ( matrix ) + FT_Outline_Transform( &slot->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &slot->outline, delta->x, delta->y ); + + Exit: + return error; + } + + + /* return the glyph's control box */ + static void + ft_raster1_get_cbox( FT_Renderer render, + FT_GlyphSlot slot, + FT_BBox* cbox ) + { + FT_MEM_ZERO( cbox, sizeof ( *cbox ) ); + + if ( slot->format == render->glyph_format ) + FT_Outline_Get_CBox( &slot->outline, cbox ); + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_raster1_render( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error; + FT_Outline* outline; + FT_BBox cbox; + FT_UInt width, height, pitch; + FT_Bitmap* bitmap; + FT_Memory memory; + + FT_Raster_Params params; + + + /* check glyph image format */ + if ( slot->format != render->glyph_format ) + { + error = Raster_Err_Invalid_Argument; + goto Exit; + } + + /* check rendering mode */ +#ifndef FT_CONFIG_OPTION_PIC + if ( mode != FT_RENDER_MODE_MONO ) + { + /* raster1 is only capable of producing monochrome bitmaps */ + if ( render->clazz == &ft_raster1_renderer_class ) + return Raster_Err_Cannot_Render_Glyph; + } + else + { + /* raster5 is only capable of producing 5-gray-levels bitmaps */ + if ( render->clazz == &ft_raster5_renderer_class ) + return Raster_Err_Cannot_Render_Glyph; + } +#else /* FT_CONFIG_OPTION_PIC */ + /* When PIC is enabled, we cannot get to the class object */ + /* so instead we check the final character in the class name */ + /* ("raster5" or "raster1"). Yes this is a hack. */ + /* The "correct" thing to do is have different render function */ + /* for each of the classes. */ + if ( mode != FT_RENDER_MODE_MONO ) + { + /* raster1 is only capable of producing monochrome bitmaps */ + if ( render->clazz->root.module_name[6] == '1' ) + return Raster_Err_Cannot_Render_Glyph; + } + else + { + /* raster5 is only capable of producing 5-gray-levels bitmaps */ + if ( render->clazz->root.module_name[6] == '5' ) + return Raster_Err_Cannot_Render_Glyph; + } +#endif /* FT_CONFIG_OPTION_PIC */ + + outline = &slot->outline; + + /* translate the outline to the new origin if needed */ + if ( origin ) + FT_Outline_Translate( outline, origin->x, origin->y ); + + /* compute the control box, and grid fit it */ + FT_Outline_Get_CBox( outline, &cbox ); + + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.xMax = FT_PIX_CEIL( cbox.xMax ); + cbox.yMax = FT_PIX_CEIL( cbox.yMax ); + + width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); + height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); + bitmap = &slot->bitmap; + memory = render->root.memory; + + /* release old bitmap buffer */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + /* allocate new one, depends on pixel format */ + if ( !( mode & FT_RENDER_MODE_MONO ) ) + { + /* we pad to 32 bits, only for backwards compatibility with FT 1.x */ + pitch = FT_PAD_CEIL( width, 4 ); + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; + bitmap->num_grays = 256; + } + else + { + pitch = ( ( width + 15 ) >> 4 ) << 1; + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + } + + bitmap->width = width; + bitmap->rows = height; + bitmap->pitch = pitch; + + if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) ) + goto Exit; + + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + /* translate outline to render it into the bitmap */ + FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin ); + + /* set up parameters */ + params.target = bitmap; + params.source = outline; + params.flags = 0; + + if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY ) + params.flags |= FT_RASTER_FLAG_AA; + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + FT_Outline_Translate( outline, cbox.xMin, cbox.yMin ); + + if ( error ) + goto Exit; + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 ); + slot->bitmap_top = (FT_Int)( cbox.yMax >> 6 ); + + Exit: + return error; + } + + + FT_DEFINE_RENDERER(ft_raster1_renderer_class, + + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "raster1", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_raster1_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + , + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_raster1_render, + (FT_Renderer_TransformFunc)ft_raster1_transform, + (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, + (FT_Renderer_SetModeFunc) ft_raster1_set_mode, + + (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET + ) + + + /* This renderer is _NOT_ part of the default modules; you will need */ + /* to register it by hand in your application. It should only be */ + /* used for backwards-compatibility with FT 1.x anyway. */ + /* */ + FT_DEFINE_RENDERER(ft_raster5_renderer_class, + + + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "raster5", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_raster1_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + , + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_raster1_render, + (FT_Renderer_TransformFunc)ft_raster1_transform, + (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, + (FT_Renderer_SetModeFunc) ft_raster1_set_mode, + + (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET + ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/ftrend1.h b/android/jni/ndk_modules/freetype/src/raster/ftrend1.h new file mode 100644 index 00000000..4cf12862 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/raster/ftrend1.h @@ -0,0 +1,44 @@ +/***************************************************************************/ +/* */ +/* ftrend1.h */ +/* */ +/* The FreeType glyph rasterizer interface (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTREND1_H__ +#define __FTREND1_H__ + + +#include <ft2build.h> +#include FT_RENDER_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_RENDERER( ft_raster1_renderer_class ) + + /* this renderer is _NOT_ part of the default modules, you'll need */ + /* to register it by hand in your application. It should only be */ + /* used for backwards-compatibility with FT 1.x anyway. */ + /* */ + FT_DECLARE_RENDERER( ft_raster5_renderer_class ) + + +FT_END_HEADER + +#endif /* __FTREND1_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/raster.c b/android/jni/ndk_modules/freetype/src/raster/raster.c new file mode 100644 index 00000000..1202a116 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/raster/raster.c @@ -0,0 +1,27 @@ +/***************************************************************************/ +/* */ +/* raster.c */ +/* */ +/* FreeType monochrome rasterer module component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "rastpic.c" +#include "ftraster.c" +#include "ftrend1.c" + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/rasterrs.h b/android/jni/ndk_modules/freetype/src/raster/rasterrs.h new file mode 100644 index 00000000..5df9a7ab --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/raster/rasterrs.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* rasterrs.h */ +/* */ +/* monochrome renderer error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the monochrome renderer error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __RASTERRS_H__ +#define __RASTERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX Raster_Err_ +#define FT_ERR_BASE FT_Mod_Err_Raster + +#include FT_ERRORS_H + +#endif /* __RASTERRS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/rastpic.c b/android/jni/ndk_modules/freetype/src/raster/rastpic.c new file mode 100644 index 00000000..e31c5497 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/raster/rastpic.c @@ -0,0 +1,90 @@ +/***************************************************************************/ +/* */ +/* rastpic.c */ +/* */ +/* The FreeType position independent code services for raster module. */ +/* */ +/* Copyright 2009, 2010 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "rastpic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from ftraster.c */ + void FT_Init_Class_ft_standard_raster(FT_Raster_Funcs*); + + void + ft_raster1_renderer_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->raster ) + { + RasterPIC* container = (RasterPIC*)pic_container->raster; + if(--container->ref_count) + return; + FT_FREE( container ); + pic_container->raster = NULL; + } + } + + + FT_Error + ft_raster1_renderer_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = Raster_Err_Ok; + RasterPIC* container; + FT_Memory memory = library->memory; + + + /* since this function also serve raster5 renderer, + it implements reference counting */ + if ( pic_container->raster ) + { + ((RasterPIC*)pic_container->raster)->ref_count++; + return error; + } + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->raster = container; + container->ref_count = 1; + + /* initialize pointer table - this is how the module usually expects this data */ + FT_Init_Class_ft_standard_raster(&container->ft_standard_raster); +/*Exit:*/ + if(error) + ft_raster1_renderer_class_pic_free(library); + return error; + } + + /* re-route these init and free functions to the above functions */ + FT_Error ft_raster5_renderer_class_pic_init(FT_Library library) + { + return ft_raster1_renderer_class_pic_init(library); + } + void ft_raster5_renderer_class_pic_free(FT_Library library) + { + ft_raster1_renderer_class_pic_free(library); + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/rastpic.h b/android/jni/ndk_modules/freetype/src/raster/rastpic.h new file mode 100644 index 00000000..dcd82b8c --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/raster/rastpic.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* rastpic.h */ +/* */ +/* The FreeType position independent code services for raster module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __RASTPIC_H__ +#define __RASTPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC +#define FT_STANDARD_RASTER_GET ft_standard_raster + +#else /* FT_CONFIG_OPTION_PIC */ + + typedef struct RasterPIC_ + { + int ref_count; + FT_Raster_Funcs ft_standard_raster; + } RasterPIC; + +#define GET_PIC(lib) ((RasterPIC*)((lib)->pic_container.raster)) +#define FT_STANDARD_RASTER_GET (GET_PIC(library)->ft_standard_raster) + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __RASTPIC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfdriver.c b/android/jni/ndk_modules/freetype/src/sfnt/sfdriver.c new file mode 100644 index 00000000..b74679b3 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/sfdriver.c @@ -0,0 +1,651 @@ +/***************************************************************************/ +/* */ +/* sfdriver.c */ +/* */ +/* High-level SFNT driver interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_OBJECTS_H + +#include "sfdriver.h" +#include "ttload.h" +#include "sfobjs.h" +#include "sfntpic.h" + +#include "sferrors.h" + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#include "ttsbit.h" +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include "ttpost.h" +#endif + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#include FT_SERVICE_BDF_H +#endif + +#include "ttcmap.h" +#include "ttkern.h" +#include "ttmtx.h" + +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_TT_CMAP_H + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_sfdriver + + + /* + * SFNT TABLE SERVICE + * + */ + + static void* + get_sfnt_table( TT_Face face, + FT_Sfnt_Tag tag ) + { + void* table; + + + switch ( tag ) + { + case ft_sfnt_head: + table = &face->header; + break; + + case ft_sfnt_hhea: + table = &face->horizontal; + break; + + case ft_sfnt_vhea: + table = face->vertical_info ? &face->vertical : 0; + break; + + case ft_sfnt_os2: + table = face->os2.version == 0xFFFFU ? 0 : &face->os2; + break; + + case ft_sfnt_post: + table = &face->postscript; + break; + + case ft_sfnt_maxp: + table = &face->max_profile; + break; + + case ft_sfnt_pclt: + table = face->pclt.Version ? &face->pclt : 0; + break; + + default: + table = 0; + } + + return table; + } + + + static FT_Error + sfnt_table_info( TT_Face face, + FT_UInt idx, + FT_ULong *tag, + FT_ULong *offset, + FT_ULong *length ) + { + if ( !tag || !offset || !length ) + return SFNT_Err_Invalid_Argument; + + if ( idx >= face->num_tables ) + return SFNT_Err_Table_Missing; + + *tag = face->dir_tables[idx].Tag; + *offset = face->dir_tables[idx].Offset; + *length = face->dir_tables[idx].Length; + + return SFNT_Err_Ok; + } + + + FT_DEFINE_SERVICE_SFNT_TABLEREC(sfnt_service_sfnt_table, + (FT_SFNT_TableLoadFunc)tt_face_load_any, + (FT_SFNT_TableGetFunc) get_sfnt_table, + (FT_SFNT_TableInfoFunc)sfnt_table_info + ) + + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + /* + * GLYPH DICT SERVICE + * + */ + + static FT_Error + sfnt_get_glyph_name( TT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_String* gname; + FT_Error error; + + + error = tt_face_get_ps_name( face, glyph_index, &gname ); + if ( !error ) + FT_STRCPYN( buffer, gname, buffer_max ); + + return error; + } + + + static FT_UInt + sfnt_get_name_index( TT_Face face, + FT_String* glyph_name ) + { + FT_Face root = &face->root; + FT_UInt i, max_gid = FT_UINT_MAX; + + + if ( root->num_glyphs < 0 ) + return 0; + else if ( ( FT_ULong ) root->num_glyphs < FT_UINT_MAX ) + max_gid = ( FT_UInt ) root->num_glyphs; + else + FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n", + FT_UINT_MAX, root->num_glyphs )); + + for ( i = 0; i < max_gid; i++ ) + { + FT_String* gname; + FT_Error error = tt_face_get_ps_name( face, i, &gname ); + + + if ( error ) + continue; + + if ( !ft_strcmp( glyph_name, gname ) ) + return i; + } + + return 0; + } + + + FT_DEFINE_SERVICE_GLYPHDICTREC(sfnt_service_glyph_dict, + (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index + ) + +#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + sfnt_get_ps_name( TT_Face face ) + { + FT_Int n, found_win, found_apple; + const char* result = NULL; + + + /* shouldn't happen, but just in case to avoid memory leaks */ + if ( face->postscript_name ) + return face->postscript_name; + + /* scan the name table to see whether we have a Postscript name here, */ + /* either in Macintosh or Windows platform encodings */ + found_win = -1; + found_apple = -1; + + for ( n = 0; n < face->num_names; n++ ) + { + TT_NameEntryRec* name = face->name_table.names + n; + + + if ( name->nameID == 6 && name->stringLength > 0 ) + { + if ( name->platformID == 3 && + name->encodingID == 1 && + name->languageID == 0x409 ) + found_win = n; + + if ( name->platformID == 1 && + name->encodingID == 0 && + name->languageID == 0 ) + found_apple = n; + } + } + + if ( found_win != -1 ) + { + FT_Memory memory = face->root.memory; + TT_NameEntryRec* name = face->name_table.names + found_win; + FT_UInt len = name->stringLength / 2; + FT_Error error = SFNT_Err_Ok; + + FT_UNUSED( error ); + + + if ( !FT_ALLOC( result, name->stringLength + 1 ) ) + { + FT_Stream stream = face->name_table.stream; + FT_String* r = (FT_String*)result; + FT_Byte* p = (FT_Byte*)name->string; + + + if ( FT_STREAM_SEEK( name->stringOffset ) || + FT_FRAME_ENTER( name->stringLength ) ) + { + FT_FREE( result ); + name->stringLength = 0; + name->stringOffset = 0; + FT_FREE( name->string ); + + goto Exit; + } + + p = (FT_Byte*)stream->cursor; + + for ( ; len > 0; len--, p += 2 ) + { + if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 ) + *r++ = p[1]; + } + *r = '\0'; + + FT_FRAME_EXIT(); + } + goto Exit; + } + + if ( found_apple != -1 ) + { + FT_Memory memory = face->root.memory; + TT_NameEntryRec* name = face->name_table.names + found_apple; + FT_UInt len = name->stringLength; + FT_Error error = SFNT_Err_Ok; + + FT_UNUSED( error ); + + + if ( !FT_ALLOC( result, len + 1 ) ) + { + FT_Stream stream = face->name_table.stream; + + + if ( FT_STREAM_SEEK( name->stringOffset ) || + FT_STREAM_READ( result, len ) ) + { + name->stringOffset = 0; + name->stringLength = 0; + FT_FREE( name->string ); + FT_FREE( result ); + goto Exit; + } + ((char*)result)[len] = '\0'; + } + } + + Exit: + face->postscript_name = result; + return result; + } + + FT_DEFINE_SERVICE_PSFONTNAMEREC(sfnt_service_ps_name, + (FT_PsName_GetFunc)sfnt_get_ps_name + ) + + + /* + * TT CMAP INFO + */ + FT_DEFINE_SERVICE_TTCMAPSREC(tt_service_get_cmap_info, + (TT_CMap_Info_GetFunc)tt_get_cmap_info + ) + + +#ifdef TT_CONFIG_OPTION_BDF + + static FT_Error + sfnt_get_charset_id( TT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + BDF_PropertyRec encoding, registry; + FT_Error error; + + + /* XXX: I don't know whether this is correct, since + * tt_face_find_bdf_prop only returns something correct if we have + * previously selected a size that is listed in the BDF table. + * Should we change the BDF table format to include single offsets + * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'? + */ + error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", ®istry ); + if ( !error ) + { + error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding ); + if ( !error ) + { + if ( registry.type == BDF_PROPERTY_TYPE_ATOM && + encoding.type == BDF_PROPERTY_TYPE_ATOM ) + { + *acharset_encoding = encoding.u.atom; + *acharset_registry = registry.u.atom; + } + else + error = SFNT_Err_Invalid_Argument; + } + } + + return error; + } + + + FT_DEFINE_SERVICE_BDFRec(sfnt_service_bdf, + (FT_BDF_GetCharsetIdFunc) sfnt_get_charset_id, + (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop + ) + +#endif /* TT_CONFIG_OPTION_BDF */ + + + /* + * SERVICE LIST + */ + +#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF + FT_DEFINE_SERVICEDESCREC5(sfnt_services, + FT_SERVICE_ID_SFNT_TABLE, &FT_SFNT_SERVICE_SFNT_TABLE_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_GLYPH_DICT, &FT_SFNT_SERVICE_GLYPH_DICT_GET, + FT_SERVICE_ID_BDF, &FT_SFNT_SERVICE_BDF_GET, + FT_SERVICE_ID_TT_CMAP, &FT_TT_SERVICE_GET_CMAP_INFO_GET + ) +#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_DEFINE_SERVICEDESCREC4(sfnt_services, + FT_SERVICE_ID_SFNT_TABLE, &FT_SFNT_SERVICE_SFNT_TABLE_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_GLYPH_DICT, &FT_SFNT_SERVICE_GLYPH_DICT_GET, + FT_SERVICE_ID_TT_CMAP, &FT_TT_SERVICE_GET_CMAP_INFO_GET + ) +#elif defined TT_CONFIG_OPTION_BDF + FT_DEFINE_SERVICEDESCREC4(sfnt_services, + FT_SERVICE_ID_SFNT_TABLE, &FT_SFNT_SERVICE_SFNT_TABLE_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_BDF, &FT_SFNT_SERVICE_BDF_GET, + FT_SERVICE_ID_TT_CMAP, &FT_TT_SERVICE_GET_CMAP_INFO_GET + ) +#else + FT_DEFINE_SERVICEDESCREC3(sfnt_services, + FT_SERVICE_ID_SFNT_TABLE, &FT_SFNT_SERVICE_SFNT_TABLE_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_TT_CMAP, &FT_TT_SERVICE_GET_CMAP_INFO_GET + ) +#endif + + + FT_CALLBACK_DEF( FT_Module_Interface ) + sfnt_get_interface( FT_Module module, + const char* module_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( FT_SFNT_SERVICES_GET, module_interface ); + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_sfnt_header_stub( TT_Face face, + FT_Stream stream, + FT_Long face_index, + SFNT_Header header ) + { + FT_UNUSED( face ); + FT_UNUSED( stream ); + FT_UNUSED( face_index ); + FT_UNUSED( header ); + + return SFNT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_directory_stub( TT_Face face, + FT_Stream stream, + SFNT_Header header ) + { + FT_UNUSED( face ); + FT_UNUSED( stream ); + FT_UNUSED( header ); + + return SFNT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_hdmx_stub( TT_Face face, + FT_Stream stream ) + { + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return SFNT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( void ) + tt_face_free_hdmx_stub( TT_Face face ) + { + FT_UNUSED( face ); + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_set_sbit_strike_stub( TT_Face face, + FT_UInt x_ppem, + FT_UInt y_ppem, + FT_ULong* astrike_index ) + { + /* + * We simply forge a FT_Size_Request and call the real function + * that does all the work. + * + * This stub might be called by libXfont in the X.Org Xserver, + * compiled against version 2.1.8 or newer. + */ + + FT_Size_RequestRec req; + + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = (FT_F26Dot6)x_ppem; + req.height = (FT_F26Dot6)y_ppem; + req.horiResolution = 0; + req.vertResolution = 0; + + *astrike_index = 0x7FFFFFFFUL; + + return tt_face_set_sbit_strike( face, &req, astrike_index ); + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_sbit_stub( TT_Face face, + FT_Stream stream ) + { + FT_UNUSED( face ); + FT_UNUSED( stream ); + + /* + * This function was originally implemented to load the sbit table. + * However, it has been replaced by `tt_face_load_eblc', and this stub + * is only there for some rogue clients which would want to call it + * directly (which doesn't make much sense). + */ + return SFNT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( void ) + tt_face_free_sbit_stub( TT_Face face ) + { + /* nothing to do in this stub */ + FT_UNUSED( face ); + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_charmap_stub( TT_Face face, + void* cmap, + FT_Stream input ) + { + FT_UNUSED( face ); + FT_UNUSED( cmap ); + FT_UNUSED( input ); + + return SFNT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_free_charmap_stub( TT_Face face, + void* cmap ) + { + FT_UNUSED( face ); + FT_UNUSED( cmap ); + + return SFNT_Err_Ok; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#define PUT_EMBEDDED_BITMAPS(a) a +#else +#define PUT_EMBEDDED_BITMAPS(a) 0 +#endif +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#define PUT_PS_NAMES(a) a +#else +#define PUT_PS_NAMES(a) 0 +#endif + + FT_DEFINE_SFNT_INTERFACE(sfnt_interface, + tt_face_goto_table, + + sfnt_init_face, + sfnt_load_face, + sfnt_done_face, + sfnt_get_interface, + + tt_face_load_any, + + tt_face_load_sfnt_header_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + tt_face_load_directory_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + tt_face_load_head, + tt_face_load_hhea, + tt_face_load_cmap, + tt_face_load_maxp, + tt_face_load_os2, + tt_face_load_post, + + tt_face_load_name, + tt_face_free_name, + + tt_face_load_hdmx_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + tt_face_free_hdmx_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + tt_face_load_kern, + tt_face_load_gasp, + tt_face_load_pclt, + + /* see `ttload.h' */ + PUT_EMBEDDED_BITMAPS(tt_face_load_bhed), + + tt_face_set_sbit_strike_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + tt_face_load_sbit_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + tt_find_sbit_image, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + tt_load_sbit_metrics, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + PUT_EMBEDDED_BITMAPS(tt_face_load_sbit_image), + + tt_face_free_sbit_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + /* see `ttpost.h' */ + PUT_PS_NAMES(tt_face_get_ps_name), + PUT_PS_NAMES(tt_face_free_ps_names), + + tt_face_load_charmap_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + tt_face_free_charmap_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + /* since version 2.1.8 */ + + tt_face_get_kerning, + + /* since version 2.2 */ + + tt_face_load_font_dir, + tt_face_load_hmtx, + + /* see `ttsbit.h' and `sfnt.h' */ + PUT_EMBEDDED_BITMAPS(tt_face_load_eblc), + PUT_EMBEDDED_BITMAPS(tt_face_free_eblc), + + PUT_EMBEDDED_BITMAPS(tt_face_set_sbit_strike), + PUT_EMBEDDED_BITMAPS(tt_face_load_strike_metrics), + + tt_face_get_metrics + ) + + + FT_DEFINE_MODULE(sfnt_module_class, + + 0, /* not a font driver or renderer */ + sizeof( FT_ModuleRec ), + + "sfnt", /* driver name */ + 0x10000L, /* driver version 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or higher */ + + (const void*)&FT_SFNT_INTERFACE_GET, /* module specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) sfnt_get_interface + ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfdriver.h b/android/jni/ndk_modules/freetype/src/sfnt/sfdriver.h new file mode 100644 index 00000000..5de25d51 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/sfdriver.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* sfdriver.h */ +/* */ +/* High-level SFNT driver interface (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFDRIVER_H__ +#define __SFDRIVER_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_MODULE( sfnt_module_class ) + + +FT_END_HEADER + +#endif /* __SFDRIVER_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sferrors.h b/android/jni/ndk_modules/freetype/src/sfnt/sferrors.h new file mode 100644 index 00000000..27f90de2 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/sferrors.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* sferrors.h */ +/* */ +/* SFNT error codes (specification only). */ +/* */ +/* Copyright 2001, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the SFNT error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __SFERRORS_H__ +#define __SFERRORS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX SFNT_Err_ +#define FT_ERR_BASE FT_Mod_Err_SFNT + +#define FT_KEEP_ERR_PREFIX + +#include FT_ERRORS_H + +#endif /* __SFERRORS_H__ */ + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfnt.c b/android/jni/ndk_modules/freetype/src/sfnt/sfnt.c new file mode 100644 index 00000000..fc507b49 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/sfnt.c @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* sfnt.c */ +/* */ +/* Single object library component. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "sfntpic.c" +#include "ttload.c" +#include "ttmtx.c" +#include "ttcmap.c" +#include "ttkern.c" +#include "sfobjs.c" +#include "sfdriver.c" + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#include "ttsbit.c" +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include "ttpost.c" +#endif + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.c" +#endif + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfntpic.c b/android/jni/ndk_modules/freetype/src/sfnt/sfntpic.c new file mode 100644 index 00000000..53aca17b --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/sfntpic.c @@ -0,0 +1,102 @@ +/***************************************************************************/ +/* */ +/* sfntpic.c */ +/* */ +/* The FreeType position independent code services for sfnt module. */ +/* */ +/* Copyright 2009, 2010 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "sfntpic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from sfdriver.c */ + FT_Error FT_Create_Class_sfnt_services( FT_Library, FT_ServiceDescRec**); + void FT_Destroy_Class_sfnt_services( FT_Library, FT_ServiceDescRec*); + void FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec*); + void FT_Init_Class_sfnt_interface( FT_Library, SFNT_Interface*); + void FT_Init_Class_sfnt_service_glyph_dict( FT_Library, FT_Service_GlyphDictRec*); + void FT_Init_Class_sfnt_service_ps_name( FT_Library, FT_Service_PsFontNameRec*); + void FT_Init_Class_tt_service_get_cmap_info( FT_Library, FT_Service_TTCMapsRec*); + void FT_Init_Class_sfnt_service_sfnt_table( FT_Service_SFNT_TableRec*); + + /* forward declaration of PIC init functions from ttcmap.c */ + FT_Error FT_Create_Class_tt_cmap_classes( FT_Library, TT_CMap_Class**); + void FT_Destroy_Class_tt_cmap_classes( FT_Library, TT_CMap_Class*); + + void + sfnt_module_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->sfnt ) + { + sfntModulePIC* container = (sfntModulePIC*)pic_container->sfnt; + if(container->sfnt_services) + FT_Destroy_Class_sfnt_services(library, container->sfnt_services); + container->sfnt_services = NULL; + if(container->tt_cmap_classes) + FT_Destroy_Class_tt_cmap_classes(library, container->tt_cmap_classes); + container->tt_cmap_classes = NULL; + FT_FREE( container ); + pic_container->sfnt = NULL; + } + } + + + FT_Error + sfnt_module_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = SFNT_Err_Ok; + sfntModulePIC* container; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->sfnt = container; + + /* initialize pointer table - this is how the module usually expects this data */ + error = FT_Create_Class_sfnt_services(library, &container->sfnt_services); + if(error) + goto Exit; + error = FT_Create_Class_tt_cmap_classes(library, &container->tt_cmap_classes); + if(error) + goto Exit; + FT_Init_Class_sfnt_service_glyph_dict(library, &container->sfnt_service_glyph_dict); + FT_Init_Class_sfnt_service_ps_name(library, &container->sfnt_service_ps_name); + FT_Init_Class_tt_service_get_cmap_info(library, &container->tt_service_get_cmap_info); + FT_Init_Class_sfnt_service_sfnt_table(&container->sfnt_service_sfnt_table); +#ifdef TT_CONFIG_OPTION_BDF + FT_Init_Class_sfnt_service_bdf(&container->sfnt_service_bdf); +#endif + FT_Init_Class_sfnt_interface(library, &container->sfnt_interface); + +Exit: + if(error) + sfnt_module_class_pic_free(library); + return error; + } + + + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfntpic.h b/android/jni/ndk_modules/freetype/src/sfnt/sfntpic.h new file mode 100644 index 00000000..6943b425 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/sfntpic.h @@ -0,0 +1,88 @@ +/***************************************************************************/ +/* */ +/* sfntpic.h */ +/* */ +/* The FreeType position independent code services for sfnt module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFNTPIC_H__ +#define __SFNTPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + + #ifndef FT_CONFIG_OPTION_PIC +#define FT_SFNT_SERVICES_GET sfnt_services +#define FT_SFNT_SERVICE_GLYPH_DICT_GET sfnt_service_glyph_dict +#define FT_SFNT_SERVICE_PS_NAME_GET sfnt_service_ps_name +#define FT_TT_SERVICE_GET_CMAP_INFO_GET tt_service_get_cmap_info +#define FT_SFNT_SERVICES_GET sfnt_services +#define FT_TT_CMAP_CLASSES_GET tt_cmap_classes +#define FT_SFNT_SERVICE_SFNT_TABLE_GET sfnt_service_sfnt_table +#define FT_SFNT_SERVICE_BDF_GET sfnt_service_bdf +#define FT_SFNT_INTERFACE_GET sfnt_interface + +#else /* FT_CONFIG_OPTION_PIC */ + +/* some include files required for members of sfntModulePIC */ +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_TT_CMAP_H +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#include FT_SERVICE_BDF_H +#endif +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include "ttcmap.h" + +typedef struct sfntModulePIC_ + { + FT_ServiceDescRec* sfnt_services; + FT_Service_GlyphDictRec sfnt_service_glyph_dict; + FT_Service_PsFontNameRec sfnt_service_ps_name; + FT_Service_TTCMapsRec tt_service_get_cmap_info; + TT_CMap_Class* tt_cmap_classes; + FT_Service_SFNT_TableRec sfnt_service_sfnt_table; +#ifdef TT_CONFIG_OPTION_BDF + FT_Service_BDFRec sfnt_service_bdf; +#endif + SFNT_Interface sfnt_interface; + } sfntModulePIC; + +#define GET_PIC(lib) ((sfntModulePIC*)((lib)->pic_container.sfnt)) +#define FT_SFNT_SERVICES_GET (GET_PIC(library)->sfnt_services) +#define FT_SFNT_SERVICE_GLYPH_DICT_GET (GET_PIC(library)->sfnt_service_glyph_dict) +#define FT_SFNT_SERVICE_PS_NAME_GET (GET_PIC(library)->sfnt_service_ps_name) +#define FT_TT_SERVICE_GET_CMAP_INFO_GET (GET_PIC(library)->tt_service_get_cmap_info) +#define FT_SFNT_SERVICES_GET (GET_PIC(library)->sfnt_services) +#define FT_TT_CMAP_CLASSES_GET (GET_PIC(library)->tt_cmap_classes) +#define FT_SFNT_SERVICE_SFNT_TABLE_GET (GET_PIC(library)->sfnt_service_sfnt_table) +#define FT_SFNT_SERVICE_BDF_GET (GET_PIC(library)->sfnt_service_bdf) +#define FT_SFNT_INTERFACE_GET (GET_PIC(library)->sfnt_interface) + +#endif /* FT_CONFIG_OPTION_PIC */ + +/* */ + +FT_END_HEADER + +#endif /* __SFNTPIC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfobjs.c b/android/jni/ndk_modules/freetype/src/sfnt/sfobjs.c new file mode 100644 index 00000000..6e35e2db --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/sfobjs.c @@ -0,0 +1,1149 @@ +/***************************************************************************/ +/* */ +/* sfobjs.c */ +/* */ +/* SFNT object management (base). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "sfobjs.h" +#include "ttload.h" +#include "ttcmap.h" +#include "ttkern.h" +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_DEBUG_H +#include FT_TRUETYPE_IDS_H +#include FT_TRUETYPE_TAGS_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_SFNT_NAMES_H +#include "sferrors.h" + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#endif + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_sfobjs + + + + /* convert a UTF-16 name entry to ASCII */ + static FT_String* + tt_name_entry_ascii_from_utf16( TT_NameEntry entry, + FT_Memory memory ) + { + FT_String* string = NULL; + FT_UInt len, code, n; + FT_Byte* read = (FT_Byte*)entry->string; + FT_Error error; + + + len = (FT_UInt)entry->stringLength / 2; + + if ( FT_NEW_ARRAY( string, len + 1 ) ) + return NULL; + + for ( n = 0; n < len; n++ ) + { + code = FT_NEXT_USHORT( read ); + if ( code < 32 || code > 127 ) + code = '?'; + + string[n] = (char)code; + } + + string[len] = 0; + + return string; + } + + + /* convert an Apple Roman or symbol name entry to ASCII */ + static FT_String* + tt_name_entry_ascii_from_other( TT_NameEntry entry, + FT_Memory memory ) + { + FT_String* string = NULL; + FT_UInt len, code, n; + FT_Byte* read = (FT_Byte*)entry->string; + FT_Error error; + + + len = (FT_UInt)entry->stringLength; + + if ( FT_NEW_ARRAY( string, len + 1 ) ) + return NULL; + + for ( n = 0; n < len; n++ ) + { + code = *read++; + if ( code < 32 || code > 127 ) + code = '?'; + + string[n] = (char)code; + } + + string[len] = 0; + + return string; + } + + + typedef FT_String* (*TT_NameEntry_ConvertFunc)( TT_NameEntry entry, + FT_Memory memory ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_get_name */ + /* */ + /* <Description> */ + /* Returns a given ENGLISH name record in ASCII. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* nameid :: The name id of the name record to return. */ + /* */ + /* <InOut> */ + /* name :: The address of a string pointer. NULL if no name is */ + /* present. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + tt_face_get_name( TT_Face face, + FT_UShort nameid, + FT_String** name ) + { + FT_Memory memory = face->root.memory; + FT_Error error = SFNT_Err_Ok; + FT_String* result = NULL; + FT_UShort n; + TT_NameEntryRec* rec; + FT_Int found_apple = -1; + FT_Int found_apple_roman = -1; + FT_Int found_apple_english = -1; + FT_Int found_win = -1; + FT_Int found_unicode = -1; + + FT_Bool is_english = 0; + + TT_NameEntry_ConvertFunc convert; + + + FT_ASSERT( name ); + + rec = face->name_table.names; + for ( n = 0; n < face->num_names; n++, rec++ ) + { + /* According to the OpenType 1.3 specification, only Microsoft or */ + /* Apple platform IDs might be used in the `name' table. The */ + /* `Unicode' platform is reserved for the `cmap' table, and the */ + /* `ISO' one is deprecated. */ + /* */ + /* However, the Apple TrueType specification doesn't say the same */ + /* thing and goes to suggest that all Unicode `name' table entries */ + /* should be coded in UTF-16 (in big-endian format I suppose). */ + /* */ + if ( rec->nameID == nameid && rec->stringLength > 0 ) + { + switch ( rec->platformID ) + { + case TT_PLATFORM_APPLE_UNICODE: + case TT_PLATFORM_ISO: + /* there is `languageID' to check there. We should use this */ + /* field only as a last solution when nothing else is */ + /* available. */ + /* */ + found_unicode = n; + break; + + case TT_PLATFORM_MACINTOSH: + /* This is a bit special because some fonts will use either */ + /* an English language id, or a Roman encoding id, to indicate */ + /* the English version of its font name. */ + /* */ + if ( rec->languageID == TT_MAC_LANGID_ENGLISH ) + found_apple_english = n; + else if ( rec->encodingID == TT_MAC_ID_ROMAN ) + found_apple_roman = n; + break; + + case TT_PLATFORM_MICROSOFT: + /* we only take a non-English name when there is nothing */ + /* else available in the font */ + /* */ + if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 ) + { + switch ( rec->encodingID ) + { + case TT_MS_ID_SYMBOL_CS: + case TT_MS_ID_UNICODE_CS: + case TT_MS_ID_UCS_4: + is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 ); + found_win = n; + break; + + default: + ; + } + } + break; + + default: + ; + } + } + } + + found_apple = found_apple_roman; + if ( found_apple_english >= 0 ) + found_apple = found_apple_english; + + /* some fonts contain invalid Unicode or Macintosh formatted entries; */ + /* we will thus favor names encoded in Windows formats if available */ + /* (provided it is an English name) */ + /* */ + convert = NULL; + if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) ) + { + rec = face->name_table.names + found_win; + switch ( rec->encodingID ) + { + /* all Unicode strings are encoded using UTF-16BE */ + case TT_MS_ID_UNICODE_CS: + case TT_MS_ID_SYMBOL_CS: + convert = tt_name_entry_ascii_from_utf16; + break; + + case TT_MS_ID_UCS_4: + /* Apparently, if this value is found in a name table entry, it is */ + /* documented as `full Unicode repertoire'. Experience with the */ + /* MsGothic font shipped with Windows Vista shows that this really */ + /* means UTF-16 encoded names (UCS-4 values are only used within */ + /* charmaps). */ + convert = tt_name_entry_ascii_from_utf16; + break; + + default: + ; + } + } + else if ( found_apple >= 0 ) + { + rec = face->name_table.names + found_apple; + convert = tt_name_entry_ascii_from_other; + } + else if ( found_unicode >= 0 ) + { + rec = face->name_table.names + found_unicode; + convert = tt_name_entry_ascii_from_utf16; + } + + if ( rec && convert ) + { + if ( rec->string == NULL ) + { + FT_Stream stream = face->name_table.stream; + + + if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) || + FT_STREAM_SEEK( rec->stringOffset ) || + FT_STREAM_READ( rec->string, rec->stringLength ) ) + { + FT_FREE( rec->string ); + rec->stringLength = 0; + result = NULL; + goto Exit; + } + } + + result = convert( rec, memory ); + } + + Exit: + *name = result; + return error; + } + + + static FT_Encoding + sfnt_find_encoding( int platform_id, + int encoding_id ) + { + typedef struct TEncoding_ + { + int platform_id; + int encoding_id; + FT_Encoding encoding; + + } TEncoding; + + static + const TEncoding tt_encodings[] = + { + { TT_PLATFORM_ISO, -1, FT_ENCODING_UNICODE }, + + { TT_PLATFORM_APPLE_UNICODE, -1, FT_ENCODING_UNICODE }, + + { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, FT_ENCODING_APPLE_ROMAN }, + + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, FT_ENCODING_MS_SYMBOL }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, FT_ENCODING_UNICODE }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, FT_ENCODING_SJIS }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, FT_ENCODING_GB2312 }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, FT_ENCODING_BIG5 }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, FT_ENCODING_WANSUNG }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, FT_ENCODING_JOHAB } + }; + + const TEncoding *cur, *limit; + + + cur = tt_encodings; + limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] ); + + for ( ; cur < limit; cur++ ) + { + if ( cur->platform_id == platform_id ) + { + if ( cur->encoding_id == encoding_id || + cur->encoding_id == -1 ) + return cur->encoding; + } + } + + return FT_ENCODING_NONE; + } + + + /* Fill in face->ttc_header. If the font is not a TTC, it is */ + /* synthesized into a TTC with one offset table. */ + static FT_Error + sfnt_open_font( FT_Stream stream, + TT_Face face ) + { + FT_Memory memory = stream->memory; + FT_Error error; + FT_ULong tag, offset; + + static const FT_Frame_Field ttc_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TTC_HeaderRec + + FT_FRAME_START( 8 ), + FT_FRAME_LONG( version ), + FT_FRAME_LONG( count ), + FT_FRAME_END + }; + + + face->ttc_header.tag = 0; + face->ttc_header.version = 0; + face->ttc_header.count = 0; + + offset = FT_STREAM_POS(); + + if ( FT_READ_ULONG( tag ) ) + return error; + + if ( tag != 0x00010000UL && + tag != TTAG_ttcf && + tag != TTAG_OTTO && + tag != TTAG_true && + tag != TTAG_typ1 && + tag != 0x00020000UL ) + return SFNT_Err_Unknown_File_Format; + + face->ttc_header.tag = TTAG_ttcf; + + if ( tag == TTAG_ttcf ) + { + FT_Int n; + + + FT_TRACE3(( "sfnt_open_font: file is a collection\n" )); + + if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) ) + return error; + + /* now read the offsets of each font in the file */ + if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) ) + return error; + + if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) ) + return error; + + for ( n = 0; n < face->ttc_header.count; n++ ) + face->ttc_header.offsets[n] = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + } + else + { + FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" )); + + face->ttc_header.version = 1 << 16; + face->ttc_header.count = 1; + + if ( FT_NEW( face->ttc_header.offsets ) ) + return error; + + face->ttc_header.offsets[0] = offset; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + sfnt_init_face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Library library = face->root.driver->root.library; + SFNT_Service sfnt; + + + /* for now, parameters are unused */ + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + sfnt = (SFNT_Service)face->sfnt; + if ( !sfnt ) + { + sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); + if ( !sfnt ) + return SFNT_Err_Invalid_File_Format; + + face->sfnt = sfnt; + face->goto_table = sfnt->goto_table; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS ); + + error = sfnt_open_font( stream, face ); + if ( error ) + return error; + + FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index )); + + if ( face_index < 0 ) + face_index = 0; + + if ( face_index >= face->ttc_header.count ) + return SFNT_Err_Invalid_Argument; + + if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) ) + return error; + + /* check that we have a valid TrueType file */ + error = sfnt->load_font_dir( face, stream ); + if ( error ) + return error; + + face->root.num_faces = face->ttc_header.count; + face->root.face_index = face_index; + + return error; + } + + +#define LOAD_( x ) \ + do { \ + FT_TRACE2(( "`" #x "' " )); \ + FT_TRACE3(( "-->\n" )); \ + \ + error = sfnt->load_##x( face, stream ); \ + \ + FT_TRACE2(( "%s\n", ( !error ) \ + ? "loaded" \ + : ( error == SFNT_Err_Table_Missing ) \ + ? "missing" \ + : "failed to load" )); \ + FT_TRACE3(( "\n" )); \ + } while ( 0 ) + +#define LOADM_( x, vertical ) \ + do { \ + FT_TRACE2(( "`%s" #x "' ", \ + vertical ? "vertical " : "" )); \ + FT_TRACE3(( "-->\n" )); \ + \ + error = sfnt->load_##x( face, stream, vertical ); \ + \ + FT_TRACE2(( "%s\n", ( !error ) \ + ? "loaded" \ + : ( error == SFNT_Err_Table_Missing ) \ + ? "missing" \ + : "failed to load" )); \ + FT_TRACE3(( "\n" )); \ + } while ( 0 ) + +#define GET_NAME( id, field ) \ + do { \ + error = tt_face_get_name( face, TT_NAME_ID_##id, field ); \ + if ( error ) \ + goto Exit; \ + } while ( 0 ) + + + FT_LOCAL_DEF( FT_Error ) + sfnt_load_face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Error psnames_error; +#endif + FT_Bool has_outline; + FT_Bool is_apple_sbit; + FT_Bool ignore_preferred_family = FALSE; + FT_Bool ignore_preferred_subfamily = FALSE; + + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_UNUSED( face_index ); + + /* Check parameters */ + + { + FT_Int i; + + + for ( i = 0; i < num_params; i++ ) + { + if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY ) + ignore_preferred_family = TRUE; + else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY ) + ignore_preferred_subfamily = TRUE; + } + } + + /* Load tables */ + + /* We now support two SFNT-based bitmapped font formats. They */ + /* are recognized easily as they do not include a `glyf' */ + /* table. */ + /* */ + /* The first format comes from Apple, and uses a table named */ + /* `bhed' instead of `head' to store the font header (using */ + /* the same format). It also doesn't include horizontal and */ + /* vertical metrics tables (i.e. `hhea' and `vhea' tables are */ + /* missing). */ + /* */ + /* The other format comes from Microsoft, and is used with */ + /* WinCE/PocketPC. It looks like a standard TTF, except that */ + /* it doesn't contain outlines. */ + /* */ + + FT_TRACE2(( "sfnt_load_face: %08p\n\n", face )); + + /* do we have outlines in there? */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 || + tt_face_lookup_table( face, TTAG_glyf ) != 0 || + tt_face_lookup_table( face, TTAG_CFF ) != 0 ); +#else + has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 || + tt_face_lookup_table( face, TTAG_CFF ) != 0 ); +#endif + + is_apple_sbit = 0; + + /* if this font doesn't contain outlines, we try to load */ + /* a `bhed' table */ + if ( !has_outline && sfnt->load_bhed ) + { + LOAD_( bhed ); + is_apple_sbit = FT_BOOL( !error ); + } + + /* load the font header (`head' table) if this isn't an Apple */ + /* sbit font file */ + if ( !is_apple_sbit ) + { + LOAD_( head ); + if ( error ) + goto Exit; + } + + if ( face->header.Units_Per_EM == 0 ) + { + error = SFNT_Err_Invalid_Table; + + goto Exit; + } + + /* the following tables are often not present in embedded TrueType */ + /* fonts within PDF documents, so don't check for them. */ + LOAD_( maxp ); + LOAD_( cmap ); + + /* the following tables are optional in PCL fonts -- */ + /* don't check for errors */ + LOAD_( name ); + LOAD_( post ); + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + psnames_error = error; +#endif + + /* do not load the metrics headers and tables if this is an Apple */ + /* sbit font file */ + if ( !is_apple_sbit ) + { + /* load the `hhea' and `hmtx' tables */ + LOADM_( hhea, 0 ); + if ( !error ) + { + LOADM_( hmtx, 0 ); + if ( error == SFNT_Err_Table_Missing ) + { + error = SFNT_Err_Hmtx_Table_Missing; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* If this is an incrementally loaded font and there are */ + /* overriding metrics, tolerate a missing `hmtx' table. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs-> + get_glyph_metrics ) + { + face->horizontal.number_Of_HMetrics = 0; + error = SFNT_Err_Ok; + } +#endif + } + } + else if ( error == SFNT_Err_Table_Missing ) + { + /* No `hhea' table necessary for SFNT Mac fonts. */ + if ( face->format_tag == TTAG_true ) + { + FT_TRACE2(( "This is an SFNT Mac font.\n" )); + has_outline = 0; + error = SFNT_Err_Ok; + } + else + { + error = SFNT_Err_Horiz_Header_Missing; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* If this is an incrementally loaded font and there are */ + /* overriding metrics, tolerate a missing `hhea' table. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs-> + get_glyph_metrics ) + { + face->horizontal.number_Of_HMetrics = 0; + error = SFNT_Err_Ok; + } +#endif + + } + } + + if ( error ) + goto Exit; + + /* try to load the `vhea' and `vmtx' tables */ + LOADM_( hhea, 1 ); + if ( !error ) + { + LOADM_( hmtx, 1 ); + if ( !error ) + face->vertical_info = 1; + } + + if ( error && error != SFNT_Err_Table_Missing ) + goto Exit; + + LOAD_( os2 ); + if ( error ) + { + if ( error != SFNT_Err_Table_Missing ) + goto Exit; + + face->os2.version = 0xFFFFU; + } + } + + /* the optional tables */ + + /* embedded bitmap support */ + if ( sfnt->load_eblc ) + { + LOAD_( eblc ); + if ( error ) + { + /* a font which contains neither bitmaps nor outlines is */ + /* still valid (although rather useless in most cases); */ + /* however, you can find such stripped fonts in PDFs */ + if ( error == SFNT_Err_Table_Missing ) + error = SFNT_Err_Ok; + else + goto Exit; + } + } + + LOAD_( pclt ); + if ( error ) + { + if ( error != SFNT_Err_Table_Missing ) + goto Exit; + + face->pclt.Version = 0; + } + + /* consider the kerning and gasp tables as optional */ + LOAD_( gasp ); + LOAD_( kern ); + + face->root.num_glyphs = face->max_profile.numGlyphs; + + /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes */ + /* a WWS-only font face. `WWS' stands for `weight', width', and */ + /* `slope', a term used by Microsoft's Windows Presentation */ + /* Foundation (WPF). This flag has been introduced in version */ + /* 1.5 of the OpenType specification (May 2008). */ + + face->root.family_name = NULL; + face->root.style_name = NULL; + if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 ) + { + if ( !ignore_preferred_family ) + GET_NAME( PREFERRED_FAMILY, &face->root.family_name ); + if ( !face->root.family_name ) + GET_NAME( FONT_FAMILY, &face->root.family_name ); + + if ( !ignore_preferred_subfamily ) + GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name ) + GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); + } + else + { + GET_NAME( WWS_FAMILY, &face->root.family_name ); + if ( !face->root.family_name && !ignore_preferred_family ) + GET_NAME( PREFERRED_FAMILY, &face->root.family_name ); + if ( !face->root.family_name ) + GET_NAME( FONT_FAMILY, &face->root.family_name ); + + GET_NAME( WWS_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name && !ignore_preferred_subfamily ) + GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name ) + GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); + } + + /* now set up root fields */ + { + FT_Face root = &face->root; + FT_Long flags = root->face_flags; + + + /*********************************************************************/ + /* */ + /* Compute face flags. */ + /* */ + if ( has_outline == TRUE ) + flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */ + + /* The sfnt driver only supports bitmap fonts natively, thus we */ + /* don't set FT_FACE_FLAG_HINTER. */ + flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */ + FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + if ( psnames_error == SFNT_Err_Ok && + face->postscript.FormatType != 0x00030000L ) + flags |= FT_FACE_FLAG_GLYPH_NAMES; +#endif + + /* fixed width font? */ + if ( face->postscript.isFixedPitch ) + flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* vertical information? */ + if ( face->vertical_info ) + flags |= FT_FACE_FLAG_VERTICAL; + + /* kerning available ? */ + if ( TT_FACE_HAS_KERNING( face ) ) + flags |= FT_FACE_FLAG_KERNING; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* Don't bother to load the tables unless somebody asks for them. */ + /* No need to do work which will (probably) not be used. */ + if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 && + tt_face_lookup_table( face, TTAG_fvar ) != 0 && + tt_face_lookup_table( face, TTAG_gvar ) != 0 ) + flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; +#endif + + root->face_flags = flags; + + /*********************************************************************/ + /* */ + /* Compute style flags. */ + /* */ + + flags = 0; + if ( has_outline == TRUE && face->os2.version != 0xFFFFU ) + { + /* We have an OS/2 table; use the `fsSelection' field. Bit 9 */ + /* indicates an oblique font face. This flag has been */ + /* introduced in version 1.5 of the OpenType specification. */ + + if ( face->os2.fsSelection & 512 ) /* bit 9 */ + flags |= FT_STYLE_FLAG_ITALIC; + else if ( face->os2.fsSelection & 1 ) /* bit 0 */ + flags |= FT_STYLE_FLAG_ITALIC; + + if ( face->os2.fsSelection & 32 ) /* bit 5 */ + flags |= FT_STYLE_FLAG_BOLD; + } + else + { + /* this is an old Mac font, use the header field */ + + if ( face->header.Mac_Style & 1 ) + flags |= FT_STYLE_FLAG_BOLD; + + if ( face->header.Mac_Style & 2 ) + flags |= FT_STYLE_FLAG_ITALIC; + } + + root->style_flags = flags; + + /*********************************************************************/ + /* */ + /* Polish the charmaps. */ + /* */ + /* Try to set the charmap encoding according to the platform & */ + /* encoding ID of each charmap. */ + /* */ + + tt_face_build_cmaps( face ); /* ignore errors */ + + + /* set the encoding fields */ + { + FT_Int m; + + + for ( m = 0; m < root->num_charmaps; m++ ) + { + FT_CharMap charmap = root->charmaps[m]; + + + charmap->encoding = sfnt_find_encoding( charmap->platform_id, + charmap->encoding_id ); + +#if 0 + if ( root->charmap == NULL && + charmap->encoding == FT_ENCODING_UNICODE ) + { + /* set 'root->charmap' to the first Unicode encoding we find */ + root->charmap = charmap; + } +#endif + } + } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* + * Now allocate the root array of FT_Bitmap_Size records and + * populate them. Unfortunately, it isn't possible to indicate bit + * depths in the FT_Bitmap_Size record. This is a design error. + */ + { + FT_UInt i, count; + + +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + count = face->sbit_num_strikes; +#else + count = (FT_UInt)face->num_sbit_strikes; +#endif + + if ( count > 0 ) + { + FT_Memory memory = face->root.stream->memory; + FT_UShort em_size = face->header.Units_Per_EM; + FT_Short avgwidth = face->os2.xAvgCharWidth; + FT_Size_Metrics metrics; + + + if ( em_size == 0 || face->os2.version == 0xFFFFU ) + { + avgwidth = 0; + em_size = 1; + } + + if ( FT_NEW_ARRAY( root->available_sizes, count ) ) + goto Exit; + + for ( i = 0; i < count; i++ ) + { + FT_Bitmap_Size* bsize = root->available_sizes + i; + + + error = sfnt->load_strike_metrics( face, i, &metrics ); + if ( error ) + goto Exit; + + bsize->height = (FT_Short)( metrics.height >> 6 ); + bsize->width = (FT_Short)( + ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size ); + + bsize->x_ppem = metrics.x_ppem << 6; + bsize->y_ppem = metrics.y_ppem << 6; + + /* assume 72dpi */ + bsize->size = metrics.y_ppem << 6; + } + + root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; + root->num_fixed_sizes = (FT_Int)count; + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* a font with no bitmaps and no outlines is scalable; */ + /* it has only empty glyphs then */ + if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) ) + root->face_flags |= FT_FACE_FLAG_SCALABLE; + + + /*********************************************************************/ + /* */ + /* Set up metrics. */ + /* */ + if ( FT_IS_SCALABLE( root ) ) + { + /* XXX What about if outline header is missing */ + /* (e.g. sfnt wrapped bitmap)? */ + root->bbox.xMin = face->header.xMin; + root->bbox.yMin = face->header.yMin; + root->bbox.xMax = face->header.xMax; + root->bbox.yMax = face->header.yMax; + root->units_per_EM = face->header.Units_Per_EM; + + + /* XXX: Computing the ascender/descender/height is very different */ + /* from what the specification tells you. Apparently, we */ + /* must be careful because */ + /* */ + /* - not all fonts have an OS/2 table; in this case, we take */ + /* the values in the horizontal header. However, these */ + /* values very often are not reliable. */ + /* */ + /* - otherwise, the correct typographic values are in the */ + /* sTypoAscender, sTypoDescender & sTypoLineGap fields. */ + /* */ + /* However, certain fonts have these fields set to 0. */ + /* Rather, they have usWinAscent & usWinDescent correctly */ + /* set (but with different values). */ + /* */ + /* As an example, Arial Narrow is implemented through four */ + /* files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */ + /* */ + /* Strangely, all fonts have the same values in their */ + /* sTypoXXX fields, except ARIALNB which sets them to 0. */ + /* */ + /* On the other hand, they all have different */ + /* usWinAscent/Descent values -- as a conclusion, the OS/2 */ + /* table cannot be used to compute the text height reliably! */ + /* */ + + /* The ascender/descender/height are computed from the OS/2 table */ + /* when found. Otherwise, they're taken from the horizontal */ + /* header. */ + /* */ + + root->ascender = face->horizontal.Ascender; + root->descender = face->horizontal.Descender; + + root->height = (FT_Short)( root->ascender - root->descender + + face->horizontal.Line_Gap ); + +#if 0 + /* if the line_gap is 0, we add an extra 15% to the text height -- */ + /* this computation is based on various versions of Times New Roman */ + if ( face->horizontal.Line_Gap == 0 ) + root->height = (FT_Short)( ( root->height * 115 + 50 ) / 100 ); +#endif /* 0 */ + +#if 0 + /* some fonts have the OS/2 "sTypoAscender", "sTypoDescender" & */ + /* "sTypoLineGap" fields set to 0, like ARIALNB.TTF */ + if ( face->os2.version != 0xFFFFU && root->ascender ) + { + FT_Int height; + + + root->ascender = face->os2.sTypoAscender; + root->descender = -face->os2.sTypoDescender; + + height = root->ascender + root->descender + face->os2.sTypoLineGap; + if ( height > root->height ) + root->height = height; + } +#endif /* 0 */ + + root->max_advance_width = face->horizontal.advance_Width_Max; + root->max_advance_height = (FT_Short)( face->vertical_info + ? face->vertical.advance_Height_Max + : root->height ); + + /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */ + /* Adjust underline position from top edge to centre of */ + /* stroke to convert TrueType meaning to FreeType meaning. */ + root->underline_position = face->postscript.underlinePosition - + face->postscript.underlineThickness / 2; + root->underline_thickness = face->postscript.underlineThickness; + } + + } + + Exit: + FT_TRACE2(( "sfnt_load_face: done\n" )); + + return error; + } + + +#undef LOAD_ +#undef LOADM_ +#undef GET_NAME + + + FT_LOCAL_DEF( void ) + sfnt_done_face( TT_Face face ) + { + FT_Memory memory; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = face->root.memory; + sfnt = (SFNT_Service)face->sfnt; + + if ( sfnt ) + { + /* destroy the postscript names table if it is loaded */ + if ( sfnt->free_psnames ) + sfnt->free_psnames( face ); + + /* destroy the embedded bitmaps table if it is loaded */ + if ( sfnt->free_eblc ) + sfnt->free_eblc( face ); + } + +#ifdef TT_CONFIG_OPTION_BDF + /* freeing the embedded BDF properties */ + tt_face_free_bdf_props( face ); +#endif + + /* freeing the kerning table */ + tt_face_done_kern( face ); + + /* freeing the collection table */ + FT_FREE( face->ttc_header.offsets ); + face->ttc_header.count = 0; + + /* freeing table directory */ + FT_FREE( face->dir_tables ); + face->num_tables = 0; + + { + FT_Stream stream = FT_FACE_STREAM( face ); + + + /* simply release the 'cmap' table frame */ + FT_FRAME_RELEASE( face->cmap_table ); + face->cmap_size = 0; + } + + /* freeing the horizontal metrics */ +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + { + FT_Stream stream = FT_FACE_STREAM( face ); + + + FT_FRAME_RELEASE( face->horz_metrics ); + FT_FRAME_RELEASE( face->vert_metrics ); + face->horz_metrics_size = 0; + face->vert_metrics_size = 0; + } +#else + FT_FREE( face->horizontal.long_metrics ); + FT_FREE( face->horizontal.short_metrics ); +#endif + + /* freeing the vertical ones, if any */ + if ( face->vertical_info ) + { + FT_FREE( face->vertical.long_metrics ); + FT_FREE( face->vertical.short_metrics ); + face->vertical_info = 0; + } + + /* freeing the gasp table */ + FT_FREE( face->gasp.gaspRanges ); + face->gasp.numRanges = 0; + + /* freeing the name table */ + if ( sfnt ) + sfnt->free_name( face ); + + /* freeing family and style name */ + FT_FREE( face->root.family_name ); + FT_FREE( face->root.style_name ); + + /* freeing sbit size table */ + FT_FREE( face->root.available_sizes ); + face->root.num_fixed_sizes = 0; + + FT_FREE( face->postscript_name ); + + face->sfnt = 0; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfobjs.h b/android/jni/ndk_modules/freetype/src/sfnt/sfobjs.h new file mode 100644 index 00000000..6241c93b --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/sfobjs.h @@ -0,0 +1,54 @@ +/***************************************************************************/ +/* */ +/* sfobjs.h */ +/* */ +/* SFNT object management (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFOBJS_H__ +#define __SFOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + sfnt_init_face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( FT_Error ) + sfnt_load_face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + sfnt_done_face( TT_Face face ); + + +FT_END_HEADER + +#endif /* __SFDRIVER_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttbdf.c b/android/jni/ndk_modules/freetype/src/sfnt/ttbdf.c new file mode 100644 index 00000000..18845c39 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttbdf.c @@ -0,0 +1,250 @@ +/***************************************************************************/ +/* */ +/* ttbdf.c */ +/* */ +/* TrueType and OpenType embedded BDF properties (body). */ +/* */ +/* Copyright 2005, 2006, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttbdf.h" + +#include "sferrors.h" + + +#ifdef TT_CONFIG_OPTION_BDF + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttbdf + + + FT_LOCAL_DEF( void ) + tt_face_free_bdf_props( TT_Face face ) + { + TT_BDF bdf = &face->bdf; + + + if ( bdf->loaded ) + { + FT_Stream stream = FT_FACE(face)->stream; + + + if ( bdf->table != NULL ) + FT_FRAME_RELEASE( bdf->table ); + + bdf->table_end = NULL; + bdf->strings = NULL; + bdf->strings_size = 0; + } + } + + + static FT_Error + tt_face_load_bdf_props( TT_Face face, + FT_Stream stream ) + { + TT_BDF bdf = &face->bdf; + FT_ULong length; + FT_Error error; + + + FT_ZERO( bdf ); + + error = tt_face_goto_table( face, TTAG_BDF, stream, &length ); + if ( error || + length < 8 || + FT_FRAME_EXTRACT( length, bdf->table ) ) + { + error = SFNT_Err_Invalid_Table; + goto Exit; + } + + bdf->table_end = bdf->table + length; + + { + FT_Byte* p = bdf->table; + FT_UInt version = FT_NEXT_USHORT( p ); + FT_UInt num_strikes = FT_NEXT_USHORT( p ); + FT_ULong strings = FT_NEXT_ULONG ( p ); + FT_UInt count; + FT_Byte* strike; + + + if ( version != 0x0001 || + strings < 8 || + ( strings - 8 ) / 4 < num_strikes || + strings + 1 > length ) + { + goto BadTable; + } + + bdf->num_strikes = num_strikes; + bdf->strings = bdf->table + strings; + bdf->strings_size = length - strings; + + count = bdf->num_strikes; + p = bdf->table + 8; + strike = p + count * 4; + + + for ( ; count > 0; count-- ) + { + FT_UInt num_items = FT_PEEK_USHORT( p + 2 ); + + /* + * We don't need to check the value sets themselves, since this + * is done later. + */ + strike += 10 * num_items; + + p += 4; + } + + if ( strike > bdf->strings ) + goto BadTable; + } + + bdf->loaded = 1; + + Exit: + return error; + + BadTable: + FT_FRAME_RELEASE( bdf->table ); + FT_ZERO( bdf ); + error = SFNT_Err_Invalid_Table; + goto Exit; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_find_bdf_prop( TT_Face face, + const char* property_name, + BDF_PropertyRec *aprop ) + { + TT_BDF bdf = &face->bdf; + FT_Size size = FT_FACE(face)->size; + FT_Error error = SFNT_Err_Ok; + FT_Byte* p; + FT_UInt count; + FT_Byte* strike; + FT_Offset property_len; + + + aprop->type = BDF_PROPERTY_TYPE_NONE; + + if ( bdf->loaded == 0 ) + { + error = tt_face_load_bdf_props( face, FT_FACE( face )->stream ); + if ( error ) + goto Exit; + } + + count = bdf->num_strikes; + p = bdf->table + 8; + strike = p + 4 * count; + + error = SFNT_Err_Invalid_Argument; + + if ( size == NULL || property_name == NULL ) + goto Exit; + + property_len = ft_strlen( property_name ); + if ( property_len == 0 ) + goto Exit; + + for ( ; count > 0; count-- ) + { + FT_UInt _ppem = FT_NEXT_USHORT( p ); + FT_UInt _count = FT_NEXT_USHORT( p ); + + if ( _ppem == size->metrics.y_ppem ) + { + count = _count; + goto FoundStrike; + } + + strike += 10 * _count; + } + goto Exit; + + FoundStrike: + p = strike; + for ( ; count > 0; count-- ) + { + FT_UInt type = FT_PEEK_USHORT( p + 4 ); + + if ( ( type & 0x10 ) != 0 ) + { + FT_UInt32 name_offset = FT_PEEK_ULONG( p ); + FT_UInt32 value = FT_PEEK_ULONG( p + 6 ); + + /* be a bit paranoid for invalid entries here */ + if ( name_offset < bdf->strings_size && + property_len < bdf->strings_size - name_offset && + ft_strncmp( property_name, + (const char*)bdf->strings + name_offset, + bdf->strings_size - name_offset ) == 0 ) + { + switch ( type & 0x0F ) + { + case 0x00: /* string */ + case 0x01: /* atoms */ + /* check that the content is really 0-terminated */ + if ( value < bdf->strings_size && + ft_memchr( bdf->strings + value, 0, bdf->strings_size ) ) + { + aprop->type = BDF_PROPERTY_TYPE_ATOM; + aprop->u.atom = (const char*)bdf->strings + value; + error = SFNT_Err_Ok; + goto Exit; + } + break; + + case 0x02: + aprop->type = BDF_PROPERTY_TYPE_INTEGER; + aprop->u.integer = (FT_Int32)value; + error = SFNT_Err_Ok; + goto Exit; + + case 0x03: + aprop->type = BDF_PROPERTY_TYPE_CARDINAL; + aprop->u.cardinal = value; + error = SFNT_Err_Ok; + goto Exit; + + default: + ; + } + } + } + p += 10; + } + + Exit: + return error; + } + +#endif /* TT_CONFIG_OPTION_BDF */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttbdf.h b/android/jni/ndk_modules/freetype/src/sfnt/ttbdf.h new file mode 100644 index 00000000..48a10d6e --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttbdf.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* ttbdf.h */ +/* */ +/* TrueType and OpenType embedded BDF properties (specification). */ +/* */ +/* Copyright 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTBDF_H__ +#define __TTBDF_H__ + + +#include <ft2build.h> +#include "ttload.h" +#include FT_BDF_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + tt_face_free_bdf_props( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_find_bdf_prop( TT_Face face, + const char* property_name, + BDF_PropertyRec *aprop ); + + +FT_END_HEADER + +#endif /* __TTBDF_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttcmap.c b/android/jni/ndk_modules/freetype/src/sfnt/ttcmap.c new file mode 100644 index 00000000..544750ab --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttcmap.c @@ -0,0 +1,3512 @@ +/***************************************************************************/ +/* */ +/* ttcmap.c */ +/* */ +/* TrueType character mapping table (cmap) support (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H + +#include "sferrors.h" /* must come before FT_INTERNAL_VALIDATE_H */ + +#include FT_INTERNAL_VALIDATE_H +#include FT_INTERNAL_STREAM_H +#include "ttload.h" +#include "ttcmap.h" +#include "sfntpic.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttcmap + + +#define TT_PEEK_SHORT FT_PEEK_SHORT +#define TT_PEEK_USHORT FT_PEEK_USHORT +#define TT_PEEK_UINT24 FT_PEEK_UOFF3 +#define TT_PEEK_LONG FT_PEEK_LONG +#define TT_PEEK_ULONG FT_PEEK_ULONG + +#define TT_NEXT_SHORT FT_NEXT_SHORT +#define TT_NEXT_USHORT FT_NEXT_USHORT +#define TT_NEXT_UINT24 FT_NEXT_UOFF3 +#define TT_NEXT_LONG FT_NEXT_LONG +#define TT_NEXT_ULONG FT_NEXT_ULONG + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap_init( TT_CMap cmap, + FT_Byte* table ) + { + cmap->data = table; + return SFNT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 0 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 0 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* glyph_ids 6 BYTE[256] array of glyph indices */ + /* 262 */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_0 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap0_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 2; + FT_UInt length = TT_NEXT_USHORT( p ); + + + if ( table + length > valid->limit || length < 262 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices whenever necessary */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt n, idx; + + + p = table + 6; + for ( n = 0; n < 256; n++ ) + { + idx = *p++; + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap0_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + + + return char_code < 256 ? table[6 + char_code] : 0; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap0_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Byte* table = cmap->data; + FT_UInt32 charcode = *pchar_code; + FT_UInt32 result = 0; + FT_UInt gindex = 0; + + + table += 6; /* go to glyph IDs */ + while ( ++charcode < 256 ) + { + gindex = table[charcode]; + if ( gindex != 0 ) + { + result = charcode; + break; + } + } + + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap0_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 0; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap0_class_rec, + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap0_char_index, + (FT_CMap_CharNextFunc) tt_cmap0_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 0, + (TT_CMap_ValidateFunc) tt_cmap0_validate, + (TT_CMap_Info_GetFunc) tt_cmap0_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_0 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 2 *****/ + /***** *****/ + /***** This is used for certain CJK encodings that encode text in a *****/ + /***** mixed 8/16 bits encoding along the following lines: *****/ + /***** *****/ + /***** * Certain byte values correspond to an 8-bit character code *****/ + /***** (typically in the range 0..127 for ASCII compatibility). *****/ + /***** *****/ + /***** * Certain byte values signal the first byte of a 2-byte *****/ + /***** character code (but these values are also valid as the *****/ + /***** second byte of a 2-byte character). *****/ + /***** *****/ + /***** The following charmap lookup and iteration functions all *****/ + /***** assume that the value "charcode" correspond to following: *****/ + /***** *****/ + /***** - For one byte characters, "charcode" is simply the *****/ + /***** character code. *****/ + /***** *****/ + /***** - For two byte characters, "charcode" is the 2-byte *****/ + /***** character code in big endian format. More exactly: *****/ + /***** *****/ + /***** (charcode >> 8) is the first byte value *****/ + /***** (charcode & 0xFF) is the second byte value *****/ + /***** *****/ + /***** Note that not all values of "charcode" are valid according *****/ + /***** to these rules, and the function moderately check the *****/ + /***** arguments. *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 2 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* keys 6 USHORT[256] sub-header keys */ + /* subs 518 SUBHEAD[NSUBS] sub-headers array */ + /* glyph_ids 518+NSUB*8 USHORT[] glyph ID array */ + /* */ + /* The `keys' table is used to map charcode high-bytes to sub-headers. */ + /* The value of `NSUBS' is the number of sub-headers defined in the */ + /* table and is computed by finding the maximum of the `keys' table. */ + /* */ + /* Note that for any n, `keys[n]' is a byte offset within the `subs' */ + /* table, i.e., it is the corresponding sub-header index multiplied */ + /* by 8. */ + /* */ + /* Each sub-header has the following format: */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* first 0 USHORT first valid low-byte */ + /* count 2 USHORT number of valid low-bytes */ + /* delta 4 SHORT see below */ + /* offset 6 USHORT see below */ + /* */ + /* A sub-header defines, for each high-byte, the range of valid */ + /* low-bytes within the charmap. Note that the range defined by `first' */ + /* and `count' must be completely included in the interval [0..255] */ + /* according to the specification. */ + /* */ + /* If a character code is contained within a given sub-header, then */ + /* mapping it to a glyph index is done as follows: */ + /* */ + /* * The value of `offset' is read. This is a _byte_ distance from the */ + /* location of the `offset' field itself into a slice of the */ + /* `glyph_ids' table. Let's call it `slice' (it is a USHORT[] too). */ + /* */ + /* * The value `slice[char.lo - first]' is read. If it is 0, there is */ + /* no glyph for the charcode. Otherwise, the value of `delta' is */ + /* added to it (modulo 65536) to form a new glyph index. */ + /* */ + /* It is up to the validation routine to check that all offsets fall */ + /* within the glyph IDs table (and not within the `subs' table itself or */ + /* outside of the CMap). */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_2 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap2_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 2; /* skip format */ + FT_UInt length = TT_PEEK_USHORT( p ); + FT_UInt n, max_subs; + FT_Byte* keys; /* keys table */ + FT_Byte* subs; /* sub-headers */ + FT_Byte* glyph_ids; /* glyph ID array */ + + + if ( table + length > valid->limit || length < 6 + 512 ) + FT_INVALID_TOO_SHORT; + + keys = table + 6; + + /* parse keys to compute sub-headers count */ + p = keys; + max_subs = 0; + for ( n = 0; n < 256; n++ ) + { + FT_UInt idx = TT_NEXT_USHORT( p ); + + + /* value must be multiple of 8 */ + if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 ) + FT_INVALID_DATA; + + idx >>= 3; + + if ( idx > max_subs ) + max_subs = idx; + } + + FT_ASSERT( p == table + 518 ); + + subs = p; + glyph_ids = subs + (max_subs + 1) * 8; + if ( glyph_ids > valid->limit ) + FT_INVALID_TOO_SHORT; + + /* parse sub-headers */ + for ( n = 0; n <= max_subs; n++ ) + { + FT_UInt first_code, code_count, offset; + FT_Int delta; + FT_Byte* ids; + + + first_code = TT_NEXT_USHORT( p ); + code_count = TT_NEXT_USHORT( p ); + delta = TT_NEXT_SHORT( p ); + offset = TT_NEXT_USHORT( p ); + + /* many Dynalab fonts have empty sub-headers */ + if ( code_count == 0 ) + continue; + + /* check range within 0..255 */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + if ( first_code >= 256 || first_code + code_count > 256 ) + FT_INVALID_DATA; + } + + /* check offset */ + if ( offset != 0 ) + { + ids = p - 2 + offset; + if ( ids < glyph_ids || ids + code_count*2 > table + length ) + FT_INVALID_OFFSET; + + /* check glyph IDs */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_Byte* limit = p + code_count * 2; + FT_UInt idx; + + + for ( ; p < limit; ) + { + idx = TT_NEXT_USHORT( p ); + if ( idx != 0 ) + { + idx = ( idx + delta ) & 0xFFFFU; + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + } + + return SFNT_Err_Ok; + } + + + /* return sub header corresponding to a given character code */ + /* NULL on invalid charcode */ + static FT_Byte* + tt_cmap2_get_subheader( FT_Byte* table, + FT_UInt32 char_code ) + { + FT_Byte* result = NULL; + + + if ( char_code < 0x10000UL ) + { + FT_UInt char_lo = (FT_UInt)( char_code & 0xFF ); + FT_UInt char_hi = (FT_UInt)( char_code >> 8 ); + FT_Byte* p = table + 6; /* keys table */ + FT_Byte* subs = table + 518; /* subheaders table */ + FT_Byte* sub; + + + if ( char_hi == 0 ) + { + /* an 8-bit character code -- we use subHeader 0 in this case */ + /* to test whether the character code is in the charmap */ + /* */ + sub = subs; /* jump to first sub-header */ + + /* check that the sub-header for this byte is 0, which */ + /* indicates that it is really a valid one-byte value */ + /* Otherwise, return 0 */ + /* */ + p += char_lo * 2; + if ( TT_PEEK_USHORT( p ) != 0 ) + goto Exit; + } + else + { + /* a 16-bit character code */ + + /* jump to key entry */ + p += char_hi * 2; + /* jump to sub-header */ + sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) ); + + /* check that the high byte isn't a valid one-byte value */ + if ( sub == subs ) + goto Exit; + } + result = sub; + } + Exit: + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap2_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* subheader; + + + subheader = tt_cmap2_get_subheader( table, char_code ); + if ( subheader ) + { + FT_Byte* p = subheader; + FT_UInt idx = (FT_UInt)(char_code & 0xFF); + FT_UInt start, count; + FT_Int delta; + FT_UInt offset; + + + start = TT_NEXT_USHORT( p ); + count = TT_NEXT_USHORT( p ); + delta = TT_NEXT_SHORT ( p ); + offset = TT_PEEK_USHORT( p ); + + idx -= start; + if ( idx < count && offset != 0 ) + { + p += offset + 2 * idx; + idx = TT_PEEK_USHORT( p ); + + if ( idx != 0 ) + result = (FT_UInt)( idx + delta ) & 0xFFFFU; + } + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap2_char_next( TT_CMap cmap, + FT_UInt32 *pcharcode ) + { + FT_Byte* table = cmap->data; + FT_UInt gindex = 0; + FT_UInt32 result = 0; + FT_UInt32 charcode = *pcharcode + 1; + FT_Byte* subheader; + + + while ( charcode < 0x10000UL ) + { + subheader = tt_cmap2_get_subheader( table, charcode ); + if ( subheader ) + { + FT_Byte* p = subheader; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_Int delta = TT_NEXT_SHORT ( p ); + FT_UInt offset = TT_PEEK_USHORT( p ); + FT_UInt char_lo = (FT_UInt)( charcode & 0xFF ); + FT_UInt pos, idx; + + + if ( offset == 0 ) + goto Next_SubHeader; + + if ( char_lo < start ) + { + char_lo = start; + pos = 0; + } + else + pos = (FT_UInt)( char_lo - start ); + + p += offset + pos * 2; + charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo; + + for ( ; pos < count; pos++, charcode++ ) + { + idx = TT_NEXT_USHORT( p ); + + if ( idx != 0 ) + { + gindex = ( idx + delta ) & 0xFFFFU; + if ( gindex != 0 ) + { + result = charcode; + goto Exit; + } + } + } + } + + /* jump to next sub-header, i.e. higher byte value */ + Next_SubHeader: + charcode = FT_PAD_FLOOR( charcode, 256 ) + 256; + } + + Exit: + *pcharcode = result; + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap2_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 2; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap2_class_rec, + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap2_char_index, + (FT_CMap_CharNextFunc) tt_cmap2_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 2, + (TT_CMap_ValidateFunc) tt_cmap2_validate, + (TT_CMap_Info_GetFunc) tt_cmap2_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_2 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 4 */ + /* length 2 USHORT table length */ + /* in bytes */ + /* language 4 USHORT Mac language code */ + /* */ + /* segCountX2 6 USHORT 2*NUM_SEGS */ + /* searchRange 8 USHORT 2*(1 << LOG_SEGS) */ + /* entrySelector 10 USHORT LOG_SEGS */ + /* rangeShift 12 USHORT segCountX2 - */ + /* searchRange */ + /* */ + /* endCount 14 USHORT[NUM_SEGS] end charcode for */ + /* each segment; last */ + /* is 0xFFFF */ + /* */ + /* pad 14+NUM_SEGS*2 USHORT padding */ + /* */ + /* startCount 16+NUM_SEGS*2 USHORT[NUM_SEGS] first charcode for */ + /* each segment */ + /* */ + /* idDelta 16+NUM_SEGS*4 SHORT[NUM_SEGS] delta for each */ + /* segment */ + /* idOffset 16+NUM_SEGS*6 SHORT[NUM_SEGS] range offset for */ + /* each segment; can be */ + /* zero */ + /* */ + /* glyphIds 16+NUM_SEGS*8 USHORT[] array of glyph ID */ + /* ranges */ + /* */ + /* Character codes are modelled by a series of ordered (increasing) */ + /* intervals called segments. Each segment has start and end codes, */ + /* provided by the `startCount' and `endCount' arrays. Segments must */ + /* not overlap, and the last segment should always contain the value */ + /* 0xFFFF for `endCount'. */ + /* */ + /* The fields `searchRange', `entrySelector' and `rangeShift' are better */ + /* ignored (they are traces of over-engineering in the TrueType */ + /* specification). */ + /* */ + /* Each segment also has a signed `delta', as well as an optional offset */ + /* within the `glyphIds' table. */ + /* */ + /* If a segment's idOffset is 0, the glyph index corresponding to any */ + /* charcode within the segment is obtained by adding the value of */ + /* `idDelta' directly to the charcode, modulo 65536. */ + /* */ + /* Otherwise, a glyph index is taken from the glyph IDs sub-array for */ + /* the segment, and the value of `idDelta' is added to it. */ + /* */ + /* */ + /* Finally, note that a lot of fonts contain an invalid last segment, */ + /* where `start' and `end' are correctly set to 0xFFFF but both `delta' */ + /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with */ + /* OpenOffice.org). We need special code to deal with them correctly. */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_4 + + typedef struct TT_CMap4Rec_ + { + TT_CMapRec cmap; + FT_UInt32 cur_charcode; /* current charcode */ + FT_UInt cur_gindex; /* current glyph index */ + + FT_UInt num_ranges; + FT_UInt cur_range; + FT_UInt cur_start; + FT_UInt cur_end; + FT_Int cur_delta; + FT_Byte* cur_values; + + } TT_CMap4Rec, *TT_CMap4; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_init( TT_CMap4 cmap, + FT_Byte* table ) + { + FT_Byte* p; + + + cmap->cmap.data = table; + + p = table + 6; + cmap->num_ranges = FT_PEEK_USHORT( p ) >> 1; + cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; + cmap->cur_gindex = 0; + + return SFNT_Err_Ok; + } + + + static FT_Int + tt_cmap4_set_range( TT_CMap4 cmap, + FT_UInt range_index ) + { + FT_Byte* table = cmap->cmap.data; + FT_Byte* p; + FT_UInt num_ranges = cmap->num_ranges; + + + while ( range_index < num_ranges ) + { + FT_UInt offset; + + + p = table + 14 + range_index * 2; + cmap->cur_end = FT_PEEK_USHORT( p ); + + p += 2 + num_ranges * 2; + cmap->cur_start = FT_PEEK_USHORT( p ); + + p += num_ranges * 2; + cmap->cur_delta = FT_PEEK_SHORT( p ); + + p += num_ranges * 2; + offset = FT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( range_index >= num_ranges - 1 && + cmap->cur_start == 0xFFFFU && + cmap->cur_end == 0xFFFFU ) + { + TT_Face face = (TT_Face)cmap->cmap.cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + if ( offset && p + offset + 2 > limit ) + { + cmap->cur_delta = 1; + offset = 0; + } + } + + if ( offset != 0xFFFFU ) + { + cmap->cur_values = offset ? p + offset : NULL; + cmap->cur_range = range_index; + return 0; + } + + /* we skip empty segments */ + range_index++; + } + + return -1; + } + + + /* search the index of the charcode next to cmap->cur_charcode; */ + /* caller should call tt_cmap4_set_range with proper range */ + /* before calling this function */ + /* */ + static void + tt_cmap4_next( TT_CMap4 cmap ) + { + FT_UInt charcode; + + + if ( cmap->cur_charcode >= 0xFFFFUL ) + goto Fail; + + charcode = (FT_UInt)cmap->cur_charcode + 1; + + if ( charcode < cmap->cur_start ) + charcode = cmap->cur_start; + + for ( ;; ) + { + FT_Byte* values = cmap->cur_values; + FT_UInt end = cmap->cur_end; + FT_Int delta = cmap->cur_delta; + + + if ( charcode <= end ) + { + if ( values ) + { + FT_Byte* p = values + 2 * ( charcode - cmap->cur_start ); + + + do + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex != 0 ) + { + gindex = (FT_UInt)( ( gindex + delta ) & 0xFFFFU ); + if ( gindex != 0 ) + { + cmap->cur_charcode = charcode; + cmap->cur_gindex = gindex; + return; + } + } + } while ( ++charcode <= end ); + } + else + { + do + { + FT_UInt gindex = (FT_UInt)( ( charcode + delta ) & 0xFFFFU ); + + + if ( gindex != 0 ) + { + cmap->cur_charcode = charcode; + cmap->cur_gindex = gindex; + return; + } + } while ( ++charcode <= end ); + } + } + + /* we need to find another range */ + if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 ) + break; + + if ( charcode < cmap->cur_start ) + charcode = cmap->cur_start; + } + + Fail: + cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; + cmap->cur_gindex = 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 2; /* skip format */ + FT_UInt length = TT_NEXT_USHORT( p ); + FT_Byte *ends, *starts, *offsets, *deltas, *glyph_ids; + FT_UInt num_segs; + FT_Error error = SFNT_Err_Ok; + + + if ( length < 16 ) + FT_INVALID_TOO_SHORT; + + /* in certain fonts, the `length' field is invalid and goes */ + /* out of bound. We try to correct this here... */ + if ( table + length > valid->limit ) + { + if ( valid->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_TOO_SHORT; + + length = (FT_UInt)( valid->limit - table ); + } + + p = table + 6; + num_segs = TT_NEXT_USHORT( p ); /* read segCountX2 */ + + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + /* check that we have an even value here */ + if ( num_segs & 1 ) + FT_INVALID_DATA; + } + + num_segs /= 2; + + if ( length < 16 + num_segs * 2 * 4 ) + FT_INVALID_TOO_SHORT; + + /* check the search parameters - even though we never use them */ + /* */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + /* check the values of `searchRange', `entrySelector', `rangeShift' */ + FT_UInt search_range = TT_NEXT_USHORT( p ); + FT_UInt entry_selector = TT_NEXT_USHORT( p ); + FT_UInt range_shift = TT_NEXT_USHORT( p ); + + + if ( ( search_range | range_shift ) & 1 ) /* must be even values */ + FT_INVALID_DATA; + + search_range /= 2; + range_shift /= 2; + + /* `search range' is the greatest power of 2 that is <= num_segs */ + + if ( search_range > num_segs || + search_range * 2 < num_segs || + search_range + range_shift != num_segs || + search_range != ( 1U << entry_selector ) ) + FT_INVALID_DATA; + } + + ends = table + 14; + starts = table + 16 + num_segs * 2; + deltas = starts + num_segs * 2; + offsets = deltas + num_segs * 2; + glyph_ids = offsets + num_segs * 2; + + /* check last segment; its end count value must be 0xFFFF */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + p = ends + ( num_segs - 1 ) * 2; + if ( TT_PEEK_USHORT( p ) != 0xFFFFU ) + FT_INVALID_DATA; + } + + { + FT_UInt start, end, offset, n; + FT_UInt last_start = 0, last_end = 0; + FT_Int delta; + FT_Byte* p_start = starts; + FT_Byte* p_end = ends; + FT_Byte* p_delta = deltas; + FT_Byte* p_offset = offsets; + + + for ( n = 0; n < num_segs; n++ ) + { + p = p_offset; + start = TT_NEXT_USHORT( p_start ); + end = TT_NEXT_USHORT( p_end ); + delta = TT_NEXT_SHORT( p_delta ); + offset = TT_NEXT_USHORT( p_offset ); + + if ( start > end ) + FT_INVALID_DATA; + + /* this test should be performed at default validation level; */ + /* unfortunately, some popular Asian fonts have overlapping */ + /* ranges in their charmaps */ + /* */ + if ( start <= last_end && n > 0 ) + { + if ( valid->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + else + { + /* allow overlapping segments, provided their start points */ + /* and end points, respectively, are in ascending order */ + /* */ + if ( last_start > start || last_end > end ) + error |= TT_CMAP_FLAG_UNSORTED; + else + error |= TT_CMAP_FLAG_OVERLAPPING; + } + } + + if ( offset && offset != 0xFFFFU ) + { + p += offset; /* start of glyph ID array */ + + /* check that we point within the glyph IDs table only */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( p < glyph_ids || + p + ( end - start + 1 ) * 2 > table + length ) + FT_INVALID_DATA; + } + /* Some fonts handle the last segment incorrectly. In */ + /* theory, 0xFFFF might point to an ordinary glyph -- */ + /* a cmap 4 is versatile and could be used for any */ + /* encoding, not only Unicode. However, reality shows */ + /* that far too many fonts are sloppy and incorrectly */ + /* set all fields but `start' and `end' for the last */ + /* segment if it contains only a single character. */ + /* */ + /* We thus omit the test here, delaying it to the */ + /* routines which actually access the cmap. */ + else if ( n != num_segs - 1 || + !( start == 0xFFFFU && end == 0xFFFFU ) ) + { + if ( p < glyph_ids || + p + ( end - start + 1 ) * 2 > valid->limit ) + FT_INVALID_DATA; + } + + /* check glyph indices within the segment range */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt i, idx; + + + for ( i = start; i < end; i++ ) + { + idx = FT_NEXT_USHORT( p ); + if ( idx != 0 ) + { + idx = (FT_UInt)( idx + delta ) & 0xFFFFU; + + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + else if ( offset == 0xFFFFU ) + { + /* some fonts (erroneously?) use a range offset of 0xFFFF */ + /* to mean missing glyph in cmap table */ + /* */ + if ( valid->level >= FT_VALIDATE_PARANOID || + n != num_segs - 1 || + !( start == 0xFFFFU && end == 0xFFFFU ) ) + FT_INVALID_DATA; + } + + last_start = start; + last_end = end; + } + } + + return error; + } + + + static FT_UInt + tt_cmap4_char_map_linear( TT_CMap cmap, + FT_UInt32* pcharcode, + FT_Bool next ) + { + FT_UInt num_segs2, start, end, offset; + FT_Int delta; + FT_UInt i, num_segs; + FT_UInt32 charcode = *pcharcode; + FT_UInt gindex = 0; + FT_Byte* p; + + + p = cmap->data + 6; + num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); + + num_segs = num_segs2 >> 1; + + if ( !num_segs ) + return 0; + + if ( next ) + charcode++; + + /* linear search */ + for ( ; charcode <= 0xFFFFU; charcode++ ) + { + FT_Byte* q; + + + p = cmap->data + 14; /* ends table */ + q = cmap->data + 16 + num_segs2; /* starts table */ + + for ( i = 0; i < num_segs; i++ ) + { + end = TT_NEXT_USHORT( p ); + start = TT_NEXT_USHORT( q ); + + if ( charcode >= start && charcode <= end ) + { + p = q - 2 + num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( i >= num_segs - 1 && + start == 0xFFFFU && end == 0xFFFFU ) + { + TT_Face face = (TT_Face)cmap->cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + if ( offset && p + offset + 2 > limit ) + { + delta = 1; + offset = 0; + } + } + + if ( offset == 0xFFFFU ) + continue; + + if ( offset ) + { + p += offset + ( charcode - start ) * 2; + gindex = TT_PEEK_USHORT( p ); + if ( gindex != 0 ) + gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU; + } + else + gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU; + + break; + } + } + + if ( !next || gindex ) + break; + } + + if ( next && gindex ) + *pcharcode = charcode; + + return gindex; + } + + + static FT_UInt + tt_cmap4_char_map_binary( TT_CMap cmap, + FT_UInt32* pcharcode, + FT_Bool next ) + { + FT_UInt num_segs2, start, end, offset; + FT_Int delta; + FT_UInt max, min, mid, num_segs; + FT_UInt charcode = (FT_UInt)*pcharcode; + FT_UInt gindex = 0; + FT_Byte* p; + + + p = cmap->data + 6; + num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); + + if ( !num_segs2 ) + return 0; + + num_segs = num_segs2 >> 1; + + /* make compiler happy */ + mid = num_segs; + end = 0xFFFFU; + + if ( next ) + charcode++; + + min = 0; + max = num_segs; + + /* binary search */ + while ( min < max ) + { + mid = ( min + max ) >> 1; + p = cmap->data + 14 + mid * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + + if ( charcode < start ) + max = mid; + else if ( charcode > end ) + min = mid + 1; + else + { + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( mid >= num_segs - 1 && + start == 0xFFFFU && end == 0xFFFFU ) + { + TT_Face face = (TT_Face)cmap->cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + if ( offset && p + offset + 2 > limit ) + { + delta = 1; + offset = 0; + } + } + + /* search the first segment containing `charcode' */ + if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING ) + { + FT_UInt i; + + + /* call the current segment `max' */ + max = mid; + + if ( offset == 0xFFFFU ) + mid = max + 1; + + /* search in segments before the current segment */ + for ( i = max ; i > 0; i-- ) + { + FT_UInt prev_end; + FT_Byte* old_p; + + + old_p = p; + p = cmap->data + 14 + ( i - 1 ) * 2; + prev_end = TT_PEEK_USHORT( p ); + + if ( charcode > prev_end ) + { + p = old_p; + break; + } + + end = prev_end; + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + if ( offset != 0xFFFFU ) + mid = i - 1; + } + + /* no luck */ + if ( mid == max + 1 ) + { + if ( i != max ) + { + p = cmap->data + 14 + max * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + } + + mid = max; + + /* search in segments after the current segment */ + for ( i = max + 1; i < num_segs; i++ ) + { + FT_UInt next_end, next_start; + + + p = cmap->data + 14 + i * 2; + next_end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + next_start = TT_PEEK_USHORT( p ); + + if ( charcode < next_start ) + break; + + end = next_end; + start = next_start; + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + if ( offset != 0xFFFFU ) + mid = i; + } + i--; + + /* still no luck */ + if ( mid == max ) + { + mid = i; + + break; + } + } + + /* end, start, delta, and offset are for the i'th segment */ + if ( mid != i ) + { + p = cmap->data + 14 + mid * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + } + } + else + { + if ( offset == 0xFFFFU ) + break; + } + + if ( offset ) + { + p += offset + ( charcode - start ) * 2; + gindex = TT_PEEK_USHORT( p ); + if ( gindex != 0 ) + gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU; + } + else + gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU; + + break; + } + } + + if ( next ) + { + TT_CMap4 cmap4 = (TT_CMap4)cmap; + + + /* if `charcode' is not in any segment, then `mid' is */ + /* the segment nearest to `charcode' */ + /* */ + + if ( charcode > end ) + { + mid++; + if ( mid == num_segs ) + return 0; + } + + if ( tt_cmap4_set_range( cmap4, mid ) ) + { + if ( gindex ) + *pcharcode = charcode; + } + else + { + cmap4->cur_charcode = charcode; + + if ( gindex ) + cmap4->cur_gindex = gindex; + else + { + cmap4->cur_charcode = charcode; + tt_cmap4_next( cmap4 ); + gindex = cmap4->cur_gindex; + } + + if ( gindex ) + *pcharcode = cmap4->cur_charcode; + } + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap4_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + if ( char_code >= 0x10000UL ) + return 0; + + if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) + return tt_cmap4_char_map_linear( cmap, &char_code, 0 ); + else + return tt_cmap4_char_map_binary( cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap4_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt gindex; + + + if ( *pchar_code >= 0xFFFFU ) + return 0; + + if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) + gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 ); + else + { + TT_CMap4 cmap4 = (TT_CMap4)cmap; + + + /* no need to search */ + if ( *pchar_code == cmap4->cur_charcode ) + { + tt_cmap4_next( cmap4 ); + gindex = cmap4->cur_gindex; + if ( gindex ) + *pchar_code = cmap4->cur_charcode; + } + else + gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 ); + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 4; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap4_class_rec, + sizeof ( TT_CMap4Rec ), + (FT_CMap_InitFunc) tt_cmap4_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap4_char_index, + (FT_CMap_CharNextFunc) tt_cmap4_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 4, + (TT_CMap_ValidateFunc) tt_cmap4_validate, + (TT_CMap_Info_GetFunc) tt_cmap4_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_4 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 6 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 4 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* */ + /* first 6 USHORT first segment code */ + /* count 8 USHORT segment size in chars */ + /* glyphIds 10 USHORT[count] glyph IDs */ + /* */ + /* A very simplified segment mapping. */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_6 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap6_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_UInt length, count; + + + if ( table + 10 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; + length = TT_NEXT_USHORT( p ); + + p = table + 8; /* skip language and start index */ + count = TT_NEXT_USHORT( p ); + + if ( table + length > valid->limit || length < 10 + count * 2 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt gindex; + + + for ( ; count > 0; count-- ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap6_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 6; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_UInt idx = (FT_UInt)( char_code - start ); + + + if ( idx < count ) + { + p += 2 * idx; + result = TT_PEEK_USHORT( p ); + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap6_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Byte* table = cmap->data; + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; + + FT_Byte* p = table + 6; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_UInt idx; + + + if ( char_code >= 0x10000UL ) + goto Exit; + + if ( char_code < start ) + char_code = start; + + idx = (FT_UInt)( char_code - start ); + p += 2 * idx; + + for ( ; idx < count; idx++ ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex != 0 ) + { + result = char_code; + break; + } + char_code++; + } + + Exit: + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap6_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 6; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap6_class_rec, + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap6_char_index, + (FT_CMap_CharNextFunc) tt_cmap6_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 6, + (TT_CMap_ValidateFunc) tt_cmap6_validate, + (TT_CMap_Info_GetFunc) tt_cmap6_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_6 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 8 *****/ + /***** *****/ + /***** It is hard to completely understand what the OpenType spec *****/ + /***** says about this format, but here is my conclusion. *****/ + /***** *****/ + /***** The purpose of this format is to easily map UTF-16 text to *****/ + /***** glyph indices. Basically, the `char_code' must be in one of *****/ + /***** the following formats: *****/ + /***** *****/ + /***** - A 16-bit value that isn't part of the Unicode Surrogates *****/ + /***** Area (i.e. U+D800-U+DFFF). *****/ + /***** *****/ + /***** - A 32-bit value, made of two surrogate values, i.e.. if *****/ + /***** `char_code = (char_hi << 16) | char_lo', then both *****/ + /***** `char_hi' and `char_lo' must be in the Surrogates Area. *****/ + /***** Area. *****/ + /***** *****/ + /***** The `is32' table embedded in the charmap indicates whether a *****/ + /***** given 16-bit value is in the surrogates area or not. *****/ + /***** *****/ + /***** So, for any given `char_code', we can assert the following: *****/ + /***** *****/ + /***** If `char_hi == 0' then we must have `is32[char_lo] == 0'. *****/ + /***** *****/ + /***** If `char_hi != 0' then we must have both *****/ + /***** `is32[char_hi] != 0' and `is32[char_lo] != 0'. *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 8 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* is32 12 BYTE[8192] 32-bitness bitmap */ + /* count 8204 ULONG number of groups */ + /* */ + /* This header is followed by `count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* startId 8 ULONG start glyph ID for the group */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_8 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap8_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 4; + FT_Byte* is32; + FT_UInt32 length; + FT_UInt32 num_groups; + + + if ( table + 16 + 8192 > valid->limit ) + FT_INVALID_TOO_SHORT; + + length = TT_NEXT_ULONG( p ); + if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 ) + FT_INVALID_TOO_SHORT; + + is32 = table + 12; + p = is32 + 8192; /* skip `is32' array */ + num_groups = TT_NEXT_ULONG( p ); + + if ( p + num_groups * 12 > valid->limit ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_UInt32 n, start, end, start_id, count, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + FT_UInt hi, lo; + + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + + count = (FT_UInt32)( end - start + 1 ); + + if ( start & ~0xFFFFU ) + { + /* start_hi != 0; check that is32[i] is 1 for each i in */ + /* the `hi' and `lo' of the range [start..end] */ + for ( ; count > 0; count--, start++ ) + { + hi = (FT_UInt)( start >> 16 ); + lo = (FT_UInt)( start & 0xFFFFU ); + + if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 ) + FT_INVALID_DATA; + + if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 ) + FT_INVALID_DATA; + } + } + else + { + /* start_hi == 0; check that is32[i] is 0 for each i in */ + /* the range [start..end] */ + + /* end_hi cannot be != 0! */ + if ( end & ~0xFFFFU ) + FT_INVALID_DATA; + + for ( ; count > 0; count--, start++ ) + { + lo = (FT_UInt)( start & 0xFFFFU ); + + if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 ) + FT_INVALID_DATA; + } + } + } + + last = end; + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap8_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 8204; + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); + FT_UInt32 start, end, start_id; + + + for ( ; num_groups > 0; num_groups-- ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + break; + + if ( char_code <= end ) + { + result = (FT_UInt)( start_id + char_code - start ); + break; + } + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap8_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; + FT_Byte* table = cmap->data; + FT_Byte* p = table + 8204; + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); + FT_UInt32 start, end, start_id; + + + p = table + 8208; + + for ( ; num_groups > 0; num_groups-- ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + if ( char_code <= end ) + { + gindex = (FT_UInt)( char_code - start + start_id ); + if ( gindex != 0 ) + { + result = char_code; + goto Exit; + } + } + } + + Exit: + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap8_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 8; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap8_class_rec, + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap8_char_index, + (FT_CMap_CharNextFunc) tt_cmap8_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 8, + (TT_CMap_ValidateFunc) tt_cmap8_validate, + (TT_CMap_Info_GetFunc) tt_cmap8_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_8 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 10 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 10 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* */ + /* start 12 ULONG first char in range */ + /* count 16 ULONG number of chars in range */ + /* glyphIds 20 USHORT[count] glyph indices covered */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_10 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap10_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 4; + FT_ULong length, count; + + + if ( table + 20 > valid->limit ) + FT_INVALID_TOO_SHORT; + + length = TT_NEXT_ULONG( p ); + p = table + 16; + count = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + length < 20 + count * 2 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt gindex; + + + for ( ; count > 0; count-- ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap10_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 12; + FT_UInt32 start = TT_NEXT_ULONG( p ); + FT_UInt32 count = TT_NEXT_ULONG( p ); + FT_UInt32 idx = (FT_ULong)( char_code - start ); + + + if ( idx < count ) + { + p += 2 * idx; + result = TT_PEEK_USHORT( p ); + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap10_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Byte* table = cmap->data; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; + FT_Byte* p = table + 12; + FT_UInt32 start = TT_NEXT_ULONG( p ); + FT_UInt32 count = TT_NEXT_ULONG( p ); + FT_UInt32 idx; + + + if ( char_code < start ) + char_code = start; + + idx = (FT_UInt32)( char_code - start ); + p += 2 * idx; + + for ( ; idx < count; idx++ ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex != 0 ) + break; + char_code++; + } + + *pchar_code = char_code; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap10_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 10; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap10_class_rec, + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap10_char_index, + (FT_CMap_CharNextFunc) tt_cmap10_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 10, + (TT_CMap_ValidateFunc) tt_cmap10_validate, + (TT_CMap_Info_GetFunc) tt_cmap10_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_10 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 12 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 12 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* count 12 ULONG number of groups */ + /* 16 */ + /* */ + /* This header is followed by `count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* startId 8 ULONG start glyph ID for the group */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_12 + + typedef struct TT_CMap12Rec_ + { + TT_CMapRec cmap; + FT_Bool valid; + FT_ULong cur_charcode; + FT_UInt cur_gindex; + FT_ULong cur_group; + FT_ULong num_groups; + + } TT_CMap12Rec, *TT_CMap12; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_init( TT_CMap12 cmap, + FT_Byte* table ) + { + cmap->cmap.data = table; + + table += 12; + cmap->num_groups = FT_PEEK_ULONG( table ); + + cmap->valid = 0; + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_ULong length; + FT_ULong num_groups; + + + if ( table + 16 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 4; + length = TT_NEXT_ULONG( p ); + + p = table + 12; + num_groups = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + length < 16 + 12 * num_groups ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_ULong n, start, end, start_id, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + + last = end; + } + } + + return SFNT_Err_Ok; + } + + + /* search the index of the charcode next to cmap->cur_charcode */ + /* cmap->cur_group should be set up properly by caller */ + /* */ + static void + tt_cmap12_next( TT_CMap12 cmap ) + { + FT_Byte* p; + FT_ULong start, end, start_id, char_code; + FT_ULong n; + FT_UInt gindex; + + + if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) + goto Fail; + + char_code = cmap->cur_charcode + 1; + + n = cmap->cur_group; + + for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) + { + p = cmap->cmap.data + 16 + 12 * n; + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_PEEK_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + for ( ; char_code <= end; char_code++ ) + { + gindex = (FT_UInt)( start_id + char_code - start ); + + if ( gindex ) + { + cmap->cur_charcode = char_code;; + cmap->cur_gindex = gindex; + cmap->cur_group = n; + + return; + } + } + } + + Fail: + cmap->valid = 0; + } + + + static FT_UInt + tt_cmap12_char_map_binary( TT_CMap cmap, + FT_UInt32* pchar_code, + FT_Bool next ) + { + FT_UInt gindex = 0; + FT_Byte* p = cmap->data + 12; + FT_UInt32 num_groups = TT_PEEK_ULONG( p ); + FT_UInt32 char_code = *pchar_code; + FT_UInt32 start, end, start_id; + FT_UInt32 max, min, mid; + + + if ( !num_groups ) + return 0; + + /* make compiler happy */ + mid = num_groups; + end = 0xFFFFFFFFUL; + + if ( next ) + char_code++; + + min = 0; + max = num_groups; + + /* binary search */ + while ( min < max ) + { + mid = ( min + max ) >> 1; + p = cmap->data + 16 + 12 * mid; + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + max = mid; + else if ( char_code > end ) + min = mid + 1; + else + { + start_id = TT_PEEK_ULONG( p ); + gindex = (FT_UInt)( start_id + char_code - start ); + + break; + } + } + + if ( next ) + { + TT_CMap12 cmap12 = (TT_CMap12)cmap; + + + /* if `char_code' is not in any group, then `mid' is */ + /* the group nearest to `char_code' */ + /* */ + + if ( char_code > end ) + { + mid++; + if ( mid == num_groups ) + return 0; + } + + cmap12->valid = 1; + cmap12->cur_charcode = char_code; + cmap12->cur_group = mid; + + if ( !gindex ) + { + tt_cmap12_next( cmap12 ); + + if ( cmap12->valid ) + gindex = cmap12->cur_gindex; + } + else + cmap12->cur_gindex = gindex; + + if ( gindex ) + *pchar_code = cmap12->cur_charcode; + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap12_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + return tt_cmap12_char_map_binary( cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap12_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + TT_CMap12 cmap12 = (TT_CMap12)cmap; + FT_ULong gindex; + + + if ( cmap12->cur_charcode >= 0xFFFFFFFFUL ) + return 0; + + /* no need to search */ + if ( cmap12->valid && cmap12->cur_charcode == *pchar_code ) + { + tt_cmap12_next( cmap12 ); + if ( cmap12->valid ) + { + gindex = cmap12->cur_gindex; + + /* XXX: check cur_charcode overflow is expected */ + if ( gindex ) + *pchar_code = (FT_UInt32)cmap12->cur_charcode; + } + else + gindex = 0; + } + else + gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 ); + + /* XXX: check gindex overflow is expected */ + return (FT_UInt32)gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 12; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap12_class_rec, + sizeof ( TT_CMap12Rec ), + + (FT_CMap_InitFunc) tt_cmap12_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap12_char_index, + (FT_CMap_CharNextFunc) tt_cmap12_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 12, + (TT_CMap_ValidateFunc) tt_cmap12_validate, + (TT_CMap_Info_GetFunc) tt_cmap12_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_12 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 13 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 13 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* count 12 ULONG number of groups */ + /* 16 */ + /* */ + /* This header is followed by `count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* glyphId 8 ULONG glyph ID for the whole group */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_13 + + typedef struct TT_CMap13Rec_ + { + TT_CMapRec cmap; + FT_Bool valid; + FT_ULong cur_charcode; + FT_UInt cur_gindex; + FT_ULong cur_group; + FT_ULong num_groups; + + } TT_CMap13Rec, *TT_CMap13; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap13_init( TT_CMap13 cmap, + FT_Byte* table ) + { + cmap->cmap.data = table; + + table += 12; + cmap->num_groups = FT_PEEK_ULONG( table ); + + cmap->valid = 0; + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap13_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_ULong length; + FT_ULong num_groups; + + + if ( table + 16 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 4; + length = TT_NEXT_ULONG( p ); + + p = table + 12; + num_groups = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + length < 16 + 12 * num_groups ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_ULong n, start, end, glyph_id, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + glyph_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + + last = end; + } + } + + return SFNT_Err_Ok; + } + + + /* search the index of the charcode next to cmap->cur_charcode */ + /* cmap->cur_group should be set up properly by caller */ + /* */ + static void + tt_cmap13_next( TT_CMap13 cmap ) + { + FT_Byte* p; + FT_ULong start, end, glyph_id, char_code; + FT_ULong n; + FT_UInt gindex; + + + if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) + goto Fail; + + char_code = cmap->cur_charcode + 1; + + n = cmap->cur_group; + + for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) + { + p = cmap->cmap.data + 16 + 12 * n; + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + glyph_id = TT_PEEK_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + if ( char_code <= end ) + { + gindex = (FT_UInt)glyph_id; + + if ( gindex ) + { + cmap->cur_charcode = char_code;; + cmap->cur_gindex = gindex; + cmap->cur_group = n; + + return; + } + } + } + + Fail: + cmap->valid = 0; + } + + + static FT_UInt + tt_cmap13_char_map_binary( TT_CMap cmap, + FT_UInt32* pchar_code, + FT_Bool next ) + { + FT_UInt gindex = 0; + FT_Byte* p = cmap->data + 12; + FT_UInt32 num_groups = TT_PEEK_ULONG( p ); + FT_UInt32 char_code = *pchar_code; + FT_UInt32 start, end; + FT_UInt32 max, min, mid; + + + if ( !num_groups ) + return 0; + + /* make compiler happy */ + mid = num_groups; + end = 0xFFFFFFFFUL; + + if ( next ) + char_code++; + + min = 0; + max = num_groups; + + /* binary search */ + while ( min < max ) + { + mid = ( min + max ) >> 1; + p = cmap->data + 16 + 12 * mid; + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + max = mid; + else if ( char_code > end ) + min = mid + 1; + else + { + gindex = (FT_UInt)TT_PEEK_ULONG( p ); + + break; + } + } + + if ( next ) + { + TT_CMap13 cmap13 = (TT_CMap13)cmap; + + + /* if `char_code' is not in any group, then `mid' is */ + /* the group nearest to `char_code' */ + /* */ + + if ( char_code > end ) + { + mid++; + if ( mid == num_groups ) + return 0; + } + + cmap13->valid = 1; + cmap13->cur_charcode = char_code; + cmap13->cur_group = mid; + + if ( !gindex ) + { + tt_cmap13_next( cmap13 ); + + if ( cmap13->valid ) + gindex = cmap13->cur_gindex; + } + else + cmap13->cur_gindex = gindex; + + if ( gindex ) + *pchar_code = cmap13->cur_charcode; + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap13_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + return tt_cmap13_char_map_binary( cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap13_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + TT_CMap13 cmap13 = (TT_CMap13)cmap; + FT_UInt gindex; + + + if ( cmap13->cur_charcode >= 0xFFFFFFFFUL ) + return 0; + + /* no need to search */ + if ( cmap13->valid && cmap13->cur_charcode == *pchar_code ) + { + tt_cmap13_next( cmap13 ); + if ( cmap13->valid ) + { + gindex = cmap13->cur_gindex; + if ( gindex ) + *pchar_code = cmap13->cur_charcode; + } + else + gindex = 0; + } + else + gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 ); + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap13_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 13; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap13_class_rec, + sizeof ( TT_CMap13Rec ), + + (FT_CMap_InitFunc) tt_cmap13_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap13_char_index, + (FT_CMap_CharNextFunc) tt_cmap13_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 13, + (TT_CMap_ValidateFunc) tt_cmap13_validate, + (TT_CMap_Info_GetFunc) tt_cmap13_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_13 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 14 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 14 */ + /* length 2 ULONG table length in bytes */ + /* numSelector 6 ULONG number of variation sel. records */ + /* */ + /* Followed by numSelector records, each of which looks like */ + /* */ + /* varSelector 0 UINT24 Unicode codepoint of sel. */ + /* defaultOff 3 ULONG offset to a default UVS table */ + /* describing any variants to be found in */ + /* the normal Unicode subtable. */ + /* nonDefOff 7 ULONG offset to a non-default UVS table */ + /* describing any variants not in the */ + /* standard cmap, with GIDs here */ + /* (either offset may be 0 NULL) */ + /* */ + /* Selectors are sorted by code point. */ + /* */ + /* A default Unicode Variation Selector (UVS) subtable is just a list of */ + /* ranges of code points which are to be found in the standard cmap. No */ + /* glyph IDs (GIDs) here. */ + /* */ + /* numRanges 0 ULONG number of ranges following */ + /* */ + /* A range looks like */ + /* */ + /* uniStart 0 UINT24 code point of the first character in */ + /* this range */ + /* additionalCnt 3 UBYTE count of additional characters in this */ + /* range (zero means a range of a single */ + /* character) */ + /* */ + /* Ranges are sorted by `uniStart'. */ + /* */ + /* A non-default Unicode Variation Selector (UVS) subtable is a list of */ + /* mappings from codepoint to GID. */ + /* */ + /* numMappings 0 ULONG number of mappings */ + /* */ + /* A range looks like */ + /* */ + /* uniStart 0 UINT24 code point of the first character in */ + /* this range */ + /* GID 3 USHORT and its GID */ + /* */ + /* Ranges are sorted by `uniStart'. */ + +#ifdef TT_CONFIG_CMAP_FORMAT_14 + + typedef struct TT_CMap14Rec_ + { + TT_CMapRec cmap; + FT_ULong num_selectors; + + /* This array is used to store the results of various + * cmap 14 query functions. The data is overwritten + * on each call to these functions. + */ + FT_UInt32 max_results; + FT_UInt32* results; + FT_Memory memory; + + } TT_CMap14Rec, *TT_CMap14; + + + FT_CALLBACK_DEF( void ) + tt_cmap14_done( TT_CMap14 cmap ) + { + FT_Memory memory = cmap->memory; + + + cmap->max_results = 0; + if ( memory != NULL && cmap->results != NULL ) + FT_FREE( cmap->results ); + } + + + static FT_Error + tt_cmap14_ensure( TT_CMap14 cmap, + FT_UInt32 num_results, + FT_Memory memory ) + { + FT_UInt32 old_max = cmap->max_results; + FT_Error error = SFNT_Err_Ok; + + + if ( num_results > cmap->max_results ) + { + cmap->memory = memory; + + if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) ) + return error; + + cmap->max_results = num_results; + } + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_init( TT_CMap14 cmap, + FT_Byte* table ) + { + cmap->cmap.data = table; + + table += 6; + cmap->num_selectors = FT_PEEK_ULONG( table ); + cmap->max_results = 0; + cmap->results = NULL; + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 2; + FT_ULong length = TT_NEXT_ULONG( p ); + FT_ULong num_selectors = TT_NEXT_ULONG( p ); + + + if ( length > (FT_ULong)( valid->limit - table ) || + length < 10 + 11 * num_selectors ) + FT_INVALID_TOO_SHORT; + + /* check selectors, they must be in increasing order */ + { + /* we start lastVarSel at 1 because a variant selector value of 0 + * isn't valid. + */ + FT_ULong n, lastVarSel = 1; + + + for ( n = 0; n < num_selectors; n++ ) + { + FT_ULong varSel = TT_NEXT_UINT24( p ); + FT_ULong defOff = TT_NEXT_ULONG( p ); + FT_ULong nondefOff = TT_NEXT_ULONG( p ); + + + if ( defOff >= length || nondefOff >= length ) + FT_INVALID_TOO_SHORT; + + if ( varSel < lastVarSel ) + FT_INVALID_DATA; + + lastVarSel = varSel + 1; + + /* check the default table (these glyphs should be reached */ + /* through the normal Unicode cmap, no GIDs, just check order) */ + if ( defOff != 0 ) + { + FT_Byte* defp = table + defOff; + FT_ULong numRanges = TT_NEXT_ULONG( defp ); + FT_ULong i; + FT_ULong lastBase = 0; + + + if ( defp + numRanges * 4 > valid->limit ) + FT_INVALID_TOO_SHORT; + + for ( i = 0; i < numRanges; ++i ) + { + FT_ULong base = TT_NEXT_UINT24( defp ); + FT_ULong cnt = FT_NEXT_BYTE( defp ); + + + if ( base + cnt >= 0x110000UL ) /* end of Unicode */ + FT_INVALID_DATA; + + if ( base < lastBase ) + FT_INVALID_DATA; + + lastBase = base + cnt + 1U; + } + } + + /* and the non-default table (these glyphs are specified here) */ + if ( nondefOff != 0 ) + { + FT_Byte* ndp = table + nondefOff; + FT_ULong numMappings = TT_NEXT_ULONG( ndp ); + FT_ULong i, lastUni = 0; + + + if ( numMappings * 4 > (FT_ULong)( valid->limit - ndp ) ) + FT_INVALID_TOO_SHORT; + + for ( i = 0; i < numMappings; ++i ) + { + FT_ULong uni = TT_NEXT_UINT24( ndp ); + FT_ULong gid = TT_NEXT_USHORT( ndp ); + + + if ( uni >= 0x110000UL ) /* end of Unicode */ + FT_INVALID_DATA; + + if ( uni < lastUni ) + FT_INVALID_DATA; + + lastUni = uni + 1U; + + if ( valid->level >= FT_VALIDATE_TIGHT && + gid >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_UNUSED( cmap ); + FT_UNUSED( char_code ); + + /* This can't happen */ + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap14_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UNUSED( cmap ); + + /* This can't happen */ + *pchar_code = 0; + return 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_UNUSED( cmap ); + + cmap_info->format = 14; + /* subtable 14 does not define a language field */ + cmap_info->language = 0xFFFFFFFFUL; + + return SFNT_Err_Ok; + } + + + static FT_UInt + tt_cmap14_char_map_def_binary( FT_Byte *base, + FT_UInt32 char_code ) + { + FT_UInt32 numRanges = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numRanges; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 4 * mid; + FT_ULong start = TT_NEXT_UINT24( p ); + FT_UInt cnt = FT_NEXT_BYTE( p ); + + + if ( char_code < start ) + max = mid; + else if ( char_code > start+cnt ) + min = mid + 1; + else + return TRUE; + } + + return FALSE; + } + + + static FT_UInt + tt_cmap14_char_map_nondef_binary( FT_Byte *base, + FT_UInt32 char_code ) + { + FT_UInt32 numMappings = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numMappings; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 5 * mid; + FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); + + + if ( char_code < uni ) + max = mid; + else if ( char_code > uni ) + min = mid + 1; + else + return TT_PEEK_USHORT( p ); + } + + return 0; + } + + + static FT_Byte* + tt_cmap14_find_variant( FT_Byte *base, + FT_UInt32 variantCode ) + { + FT_UInt32 numVar = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numVar; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 11 * mid; + FT_ULong varSel = TT_NEXT_UINT24( p ); + + + if ( variantCode < varSel ) + max = mid; + else if ( variantCode > varSel ) + min = mid + 1; + else + return p; + } + + return NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_var_index( TT_CMap cmap, + TT_CMap ucmap, + FT_UInt32 charcode, + FT_UInt32 variantSelector) + { + FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return 0; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_PEEK_ULONG( p ); + + if ( defOff != 0 && + tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) + { + /* This is the default variant of this charcode. GID not stored */ + /* here; stored in the normal Unicode charmap instead. */ + return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode ); + } + + if ( nondefOff != 0 ) + return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + charcode ); + + return 0; + } + + + FT_CALLBACK_DEF( FT_Int ) + tt_cmap14_char_var_isdefault( TT_CMap cmap, + FT_UInt32 charcode, + FT_UInt32 variantSelector ) + { + FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return -1; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_NEXT_ULONG( p ); + + if ( defOff != 0 && + tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) + return 1; + + if ( nondefOff != 0 && + tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + charcode ) != 0 ) + return 0; + + return -1; + } + + + FT_CALLBACK_DEF( FT_UInt32* ) + tt_cmap14_variants( TT_CMap cmap, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14)cmap; + FT_UInt32 count = cmap14->num_selectors; + FT_Byte* p = cmap->data + 10; + FT_UInt32* result; + FT_UInt32 i; + + + if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) + return NULL; + + result = cmap14->results; + for ( i = 0; i < count; ++i ) + { + result[i] = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 8; + } + result[i] = 0; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 * ) + tt_cmap14_char_variants( TT_CMap cmap, + FT_Memory memory, + FT_UInt32 charCode ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 count = cmap14->num_selectors; + FT_Byte* p = cmap->data + 10; + FT_UInt32* q; + + + if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) + return NULL; + + for ( q = cmap14->results; count > 0; --count ) + { + FT_UInt32 varSel = TT_NEXT_UINT24( p ); + FT_ULong defOff = TT_NEXT_ULONG( p ); + FT_ULong nondefOff = TT_NEXT_ULONG( p ); + + + if ( ( defOff != 0 && + tt_cmap14_char_map_def_binary( cmap->data + defOff, + charCode ) ) || + ( nondefOff != 0 && + tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + charCode ) != 0 ) ) + { + q[0] = varSel; + q++; + } + } + q[0] = 0; + + return cmap14->results; + } + + + static FT_UInt + tt_cmap14_def_char_count( FT_Byte *p ) + { + FT_UInt32 numRanges = (FT_UInt32)TT_NEXT_ULONG( p ); + FT_UInt tot = 0; + + + p += 3; /* point to the first `cnt' field */ + for ( ; numRanges > 0; numRanges-- ) + { + tot += 1 + p[0]; + p += 4; + } + + return tot; + } + + + static FT_UInt32* + tt_cmap14_get_def_chars( TT_CMap cmap, + FT_Byte* p, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numRanges; + FT_UInt cnt; + FT_UInt32* q; + + + cnt = tt_cmap14_def_char_count( p ); + numRanges = (FT_UInt32)TT_NEXT_ULONG( p ); + + if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) ) + return NULL; + + for ( q = cmap14->results; numRanges > 0; --numRanges ) + { + FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); + + + cnt = FT_NEXT_BYTE( p ) + 1; + do + { + q[0] = uni; + uni += 1; + q += 1; + } while ( --cnt != 0 ); + } + q[0] = 0; + + return cmap14->results; + } + + + static FT_UInt32* + tt_cmap14_get_nondef_chars( TT_CMap cmap, + FT_Byte *p, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numMappings; + FT_UInt i; + FT_UInt32 *ret; + + + numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); + + if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) ) + return NULL; + + ret = cmap14->results; + for ( i = 0; i < numMappings; ++i ) + { + ret[i] = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + } + ret[i] = 0; + + return ret; + } + + + FT_CALLBACK_DEF( FT_UInt32 * ) + tt_cmap14_variant_chars( TT_CMap cmap, + FT_Memory memory, + FT_UInt32 variantSelector ) + { + FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6, + variantSelector ); + FT_UInt32 *ret; + FT_Int i; + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return NULL; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_NEXT_ULONG( p ); + + if ( defOff == 0 && nondefOff == 0 ) + return NULL; + + if ( defOff == 0 ) + return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, + memory ); + else if ( nondefOff == 0 ) + return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, + memory ); + else + { + /* Both a default and a non-default glyph set? That's probably not */ + /* good font design, but the spec allows for it... */ + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numRanges; + FT_UInt32 numMappings; + FT_UInt32 duni; + FT_UInt32 dcnt; + FT_UInt32 nuni; + FT_Byte* dp; + FT_UInt di, ni, k; + + + p = cmap->data + nondefOff; + dp = cmap->data + defOff; + + numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); + dcnt = tt_cmap14_def_char_count( dp ); + numRanges = (FT_UInt32)TT_NEXT_ULONG( dp ); + + if ( numMappings == 0 ) + return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, + memory ); + if ( dcnt == 0 ) + return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, + memory ); + + if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) ) + return NULL; + + ret = cmap14->results; + duni = (FT_UInt32)TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + di = 1; + nuni = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + ni = 1; + i = 0; + + for ( ;; ) + { + if ( nuni > duni + dcnt ) + { + for ( k = 0; k <= dcnt; ++k ) + ret[i++] = duni + k; + + ++di; + + if ( di > numRanges ) + break; + + duni = (FT_UInt32)TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + } + else + { + if ( nuni < duni ) + ret[i++] = nuni; + /* If it is within the default range then ignore it -- */ + /* that should not have happened */ + ++ni; + if ( ni > numMappings ) + break; + + nuni = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + } + } + + if ( ni <= numMappings ) + { + /* If we get here then we have run out of all default ranges. */ + /* We have read one non-default mapping which we haven't stored */ + /* and there may be others that need to be read. */ + ret[i++] = nuni; + while ( ni < numMappings ) + { + ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + ++ni; + } + } + else if ( di <= numRanges ) + { + /* If we get here then we have run out of all non-default */ + /* mappings. We have read one default range which we haven't */ + /* stored and there may be others that need to be read. */ + for ( k = 0; k <= dcnt; ++k ) + ret[i++] = duni + k; + + while ( di < numRanges ) + { + duni = (FT_UInt32)TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + + for ( k = 0; k <= dcnt; ++k ) + ret[i++] = duni + k; + ++di; + } + } + + ret[i] = 0; + + return ret; + } + } + + + FT_DEFINE_TT_CMAP(tt_cmap14_class_rec, + sizeof ( TT_CMap14Rec ), + + (FT_CMap_InitFunc) tt_cmap14_init, + (FT_CMap_DoneFunc) tt_cmap14_done, + (FT_CMap_CharIndexFunc)tt_cmap14_char_index, + (FT_CMap_CharNextFunc) tt_cmap14_char_next, + + /* Format 14 extension functions */ + (FT_CMap_CharVarIndexFunc) tt_cmap14_char_var_index, + (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault, + (FT_CMap_VariantListFunc) tt_cmap14_variants, + (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants, + (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars + , + 14, + (TT_CMap_ValidateFunc)tt_cmap14_validate, + (TT_CMap_Info_GetFunc)tt_cmap14_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_14 */ + + +#ifndef FT_CONFIG_OPTION_PIC + + static const TT_CMap_Class tt_cmap_classes[] = + { +#define TTCMAPCITEM(a) &a, +#include "ttcmapc.h" + NULL, + }; + +#else /*FT_CONFIG_OPTION_PIC*/ + + void FT_Destroy_Class_tt_cmap_classes(FT_Library library, TT_CMap_Class* clazz) + { + FT_Memory memory = library->memory; + if ( clazz ) + FT_FREE( clazz ); + } + + FT_Error FT_Create_Class_tt_cmap_classes(FT_Library library, TT_CMap_Class** output_class) + { + TT_CMap_Class* clazz; + TT_CMap_ClassRec* recs; + FT_Error error; + FT_Memory memory = library->memory; + int i = 0; + +#define TTCMAPCITEM(a) i++; +#include "ttcmapc.h" + + /* allocate enough space for both the pointers +terminator and the class instances */ + if ( FT_ALLOC( clazz, sizeof(*clazz)*(i+1)+sizeof(TT_CMap_ClassRec)*i ) ) + return error; + + /* the location of the class instances follows the array of pointers */ + recs = (TT_CMap_ClassRec*) (((char*)clazz)+(sizeof(*clazz)*(i+1))); + i=0; + +#undef TTCMAPCITEM +#define TTCMAPCITEM(a) \ + FT_Init_Class_##a(&recs[i]); \ + clazz[i] = &recs[i]; \ + i++; +#include "ttcmapc.h" + + clazz[i] = NULL; + + *output_class = clazz; + return SFNT_Err_Ok; + } + +#endif /*FT_CONFIG_OPTION_PIC*/ + + + /* parse the `cmap' table and build the corresponding TT_CMap objects */ + /* in the current face */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_build_cmaps( TT_Face face ) + { + FT_Byte* table = face->cmap_table; + FT_Byte* limit = table + face->cmap_size; + FT_UInt volatile num_cmaps; + FT_Byte* volatile p = table; + FT_Library library = FT_FACE_LIBRARY( face ); + + FT_UNUSED( library ); + + + if ( !p || p + 4 > limit ) + return SFNT_Err_Invalid_Table; + + /* only recognize format 0 */ + if ( TT_NEXT_USHORT( p ) != 0 ) + { + p -= 2; + FT_ERROR(( "tt_face_build_cmaps:" + " unsupported `cmap' table format = %d\n", + TT_PEEK_USHORT( p ) )); + return SFNT_Err_Invalid_Table; + } + + num_cmaps = TT_NEXT_USHORT( p ); +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( num_cmaps > FT_MAX_CHARMAP_CACHEABLE ) + FT_ERROR(( "tt_face_build_cmaps: too many cmap subtables(%d) " + "subtable#%d and later are loaded but cannot be searched\n", + num_cmaps, FT_MAX_CHARMAP_CACHEABLE + 1 )); +#endif + + for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- ) + { + FT_CharMapRec charmap; + FT_UInt32 offset; + + + charmap.platform_id = TT_NEXT_USHORT( p ); + charmap.encoding_id = TT_NEXT_USHORT( p ); + charmap.face = FT_FACE( face ); + charmap.encoding = FT_ENCODING_NONE; /* will be filled later */ + offset = TT_NEXT_ULONG( p ); + + if ( offset && offset <= face->cmap_size - 2 ) + { + FT_Byte* volatile cmap = table + offset; + volatile FT_UInt format = TT_PEEK_USHORT( cmap ); + const TT_CMap_Class* volatile pclazz = FT_TT_CMAP_CLASSES_GET; + TT_CMap_Class volatile clazz; + + + for ( ; *pclazz; pclazz++ ) + { + clazz = *pclazz; + if ( clazz->format == format ) + { + volatile TT_ValidatorRec valid; + volatile FT_Error error = SFNT_Err_Ok; + + + ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit, + FT_VALIDATE_DEFAULT ); + + valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs; + + if ( ft_setjmp( + *((ft_jmp_buf*)&FT_VALIDATOR( &valid )->jump_buffer) ) == 0 ) + { + /* validate this cmap sub-table */ + error = clazz->validate( cmap, FT_VALIDATOR( &valid ) ); + } + + if ( valid.validator.error == 0 ) + { + FT_CMap ttcmap; + + + /* It might make sense to store the single variation selector */ + /* cmap somewhere special. But it would have to be in the */ + /* public FT_FaceRec, and we can't change that. */ + + if ( !FT_CMap_New( (FT_CMap_Class)clazz, + cmap, &charmap, &ttcmap ) ) + { + /* it is simpler to directly set `flags' than adding */ + /* a parameter to FT_CMap_New */ + ((TT_CMap)ttcmap)->flags = (FT_Int)error; + } + } + else + { + FT_TRACE0(( "tt_face_build_cmaps:" + " broken cmap sub-table ignored\n" )); + } + break; + } + } + + if ( *pclazz == NULL ) + { + FT_TRACE0(( "tt_face_build_cmaps:" + " unsupported cmap sub-table ignored\n" )); + } + } + } + + return SFNT_Err_Ok; + } + + + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = (FT_CMap)charmap; + TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz; + + + return clazz->get_cmap_info( charmap, cmap_info ); + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttcmap.h b/android/jni/ndk_modules/freetype/src/sfnt/ttcmap.h new file mode 100644 index 00000000..15a4a21e --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttcmap.h @@ -0,0 +1,125 @@ +/***************************************************************************/ +/* */ +/* ttcmap.h */ +/* */ +/* TrueType character mapping table (cmap) support (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTCMAP_H__ +#define __TTCMAP_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_INTERNAL_VALIDATE_H +#include FT_SERVICE_TT_CMAP_H + +FT_BEGIN_HEADER + + +#define TT_CMAP_FLAG_UNSORTED 1 +#define TT_CMAP_FLAG_OVERLAPPING 2 + + typedef struct TT_CMapRec_ + { + FT_CMapRec cmap; + FT_Byte* data; /* pointer to in-memory cmap table */ + FT_Int flags; /* for format 4 only */ + + } TT_CMapRec, *TT_CMap; + + typedef const struct TT_CMap_ClassRec_* TT_CMap_Class; + + + typedef FT_Error + (*TT_CMap_ValidateFunc)( FT_Byte* data, + FT_Validator valid ); + + typedef struct TT_CMap_ClassRec_ + { + FT_CMap_ClassRec clazz; + FT_UInt format; + TT_CMap_ValidateFunc validate; + TT_CMap_Info_GetFunc get_cmap_info; + + } TT_CMap_ClassRec; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_TT_CMAP(class_, size_, init_, done_, char_index_, \ + char_next_, char_var_index_, char_var_default_, variant_list_, \ + charvariant_list_,variantchar_list_, \ + format_, validate_, get_cmap_info_) \ + FT_CALLBACK_TABLE_DEF \ + const TT_CMap_ClassRec class_ = \ + { \ + {size_, init_, done_, char_index_, \ + char_next_, char_var_index_, char_var_default_, variant_list_, \ + charvariant_list_, variantchar_list_}, \ + format_, validate_, get_cmap_info_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_TT_CMAP(class_, size_, init_, done_, char_index_, \ + char_next_, char_var_index_, char_var_default_, variant_list_, \ + charvariant_list_,variantchar_list_, \ + format_, validate_, get_cmap_info_) \ + void \ + FT_Init_Class_##class_( TT_CMap_ClassRec* clazz ) \ + { \ + clazz->clazz.size = size_; \ + clazz->clazz.init = init_; \ + clazz->clazz.done = done_; \ + clazz->clazz.char_index = char_index_; \ + clazz->clazz.char_next = char_next_; \ + clazz->clazz.char_var_index = char_var_index_; \ + clazz->clazz.char_var_default = char_var_default_; \ + clazz->clazz.variant_list = variant_list_; \ + clazz->clazz.charvariant_list = charvariant_list_; \ + clazz->clazz.variantchar_list = variantchar_list_; \ + clazz->format = format_; \ + clazz->validate = validate_; \ + clazz->get_cmap_info = get_cmap_info_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + typedef struct TT_ValidatorRec_ + { + FT_ValidatorRec validator; + FT_UInt num_glyphs; + + } TT_ValidatorRec, *TT_Validator; + + +#define TT_VALIDATOR( x ) ((TT_Validator)( x )) +#define TT_VALID_GLYPH_COUNT( x ) TT_VALIDATOR( x )->num_glyphs + + + FT_LOCAL( FT_Error ) + tt_face_build_cmaps( TT_Face face ); + + /* used in tt-cmaps service */ + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + +FT_END_HEADER + +#endif /* __TTCMAP_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttcmapc.h b/android/jni/ndk_modules/freetype/src/sfnt/ttcmapc.h new file mode 100644 index 00000000..4c9c6a56 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttcmapc.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* ttcmapc.h */ +/* */ +/* TT CMAP classes definitions (specification only). */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifdef TT_CONFIG_CMAP_FORMAT_0 + TTCMAPCITEM(tt_cmap0_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_2 + TTCMAPCITEM(tt_cmap2_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_4 + TTCMAPCITEM(tt_cmap4_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_6 + TTCMAPCITEM(tt_cmap6_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_8 + TTCMAPCITEM(tt_cmap8_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_10 + TTCMAPCITEM(tt_cmap10_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_12 + TTCMAPCITEM(tt_cmap12_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_13 + TTCMAPCITEM(tt_cmap13_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_14 + TTCMAPCITEM(tt_cmap14_class_rec) +#endif + + /* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttkern.c b/android/jni/ndk_modules/freetype/src/sfnt/ttkern.c new file mode 100644 index 00000000..46888988 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttkern.c @@ -0,0 +1,306 @@ +/***************************************************************************/ +/* */ +/* ttkern.c */ +/* */ +/* Load the basic TrueType kerning table. This doesn't handle */ +/* kerning data within the GPOS table at the moment. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttkern.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttkern + + +#undef TT_KERN_INDEX +#define TT_KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) ) + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_kern( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_ULong table_size; + FT_Byte* p; + FT_Byte* p_limit; + FT_UInt nn, num_tables; + FT_UInt32 avail = 0, ordered = 0; + + + /* the kern table is optional; exit silently if it is missing */ + error = face->goto_table( face, TTAG_kern, stream, &table_size ); + if ( error ) + goto Exit; + + if ( table_size < 4 ) /* the case of a malformed table */ + { + FT_ERROR(( "tt_face_load_kern:" + " kerning table is too small - ignored\n" )); + error = SFNT_Err_Table_Missing; + goto Exit; + } + + if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) ) + { + FT_ERROR(( "tt_face_load_kern:" + " could not extract kerning table\n" )); + goto Exit; + } + + face->kern_table_size = table_size; + + p = face->kern_table; + p_limit = p + table_size; + + p += 2; /* skip version */ + num_tables = FT_NEXT_USHORT( p ); + + if ( num_tables > 32 ) /* we only support up to 32 sub-tables */ + num_tables = 32; + + for ( nn = 0; nn < num_tables; nn++ ) + { + FT_UInt num_pairs, length, coverage; + FT_Byte* p_next; + FT_UInt32 mask = (FT_UInt32)1UL << nn; + + + if ( p + 6 > p_limit ) + break; + + p_next = p; + + p += 2; /* skip version */ + length = FT_NEXT_USHORT( p ); + coverage = FT_NEXT_USHORT( p ); + + if ( length <= 6 ) + break; + + p_next += length; + + if ( p_next > p_limit ) /* handle broken table */ + p_next = p_limit; + + /* only use horizontal kerning tables */ + if ( ( coverage & ~8 ) != 0x0001 || + p + 8 > p_limit ) + goto NextTable; + + num_pairs = FT_NEXT_USHORT( p ); + p += 6; + + if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */ + num_pairs = (FT_UInt)( ( p_next - p ) / 6 ); + + avail |= mask; + + /* + * Now check whether the pairs in this table are ordered. + * We then can use binary search. + */ + if ( num_pairs > 0 ) + { + FT_ULong count; + FT_ULong old_pair; + + + old_pair = FT_NEXT_ULONG( p ); + p += 2; + + for ( count = num_pairs - 1; count > 0; count-- ) + { + FT_UInt32 cur_pair; + + + cur_pair = FT_NEXT_ULONG( p ); + if ( cur_pair <= old_pair ) + break; + + p += 2; + old_pair = cur_pair; + } + + if ( count == 0 ) + ordered |= mask; + } + + NextTable: + p = p_next; + } + + face->num_kern_tables = nn; + face->kern_avail_bits = avail; + face->kern_order_bits = ordered; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_done_kern( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->kern_table ); + face->kern_table_size = 0; + face->num_kern_tables = 0; + face->kern_avail_bits = 0; + face->kern_order_bits = 0; + } + + + FT_LOCAL_DEF( FT_Int ) + tt_face_get_kerning( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ) + { + FT_Int result = 0; + FT_UInt count, mask = 1; + FT_Byte* p = face->kern_table; + FT_Byte* p_limit = p + face->kern_table_size; + + + p += 4; + mask = 0x0001; + + for ( count = face->num_kern_tables; + count > 0 && p + 6 <= p_limit; + count--, mask <<= 1 ) + { + FT_Byte* base = p; + FT_Byte* next = base; + FT_UInt version = FT_NEXT_USHORT( p ); + FT_UInt length = FT_NEXT_USHORT( p ); + FT_UInt coverage = FT_NEXT_USHORT( p ); + FT_UInt num_pairs; + FT_Int value = 0; + + FT_UNUSED( version ); + + + next = base + length; + + if ( next > p_limit ) /* handle broken table */ + next = p_limit; + + if ( ( face->kern_avail_bits & mask ) == 0 ) + goto NextTable; + + if ( p + 8 > next ) + goto NextTable; + + num_pairs = FT_NEXT_USHORT( p ); + p += 6; + + if ( ( next - p ) < 6 * (int)num_pairs ) /* handle broken count */ + num_pairs = (FT_UInt)( ( next - p ) / 6 ); + + switch ( coverage >> 8 ) + { + case 0: + { + FT_ULong key0 = TT_KERN_INDEX( left_glyph, right_glyph ); + + + if ( face->kern_order_bits & mask ) /* binary search */ + { + FT_UInt min = 0; + FT_UInt max = num_pairs; + + + while ( min < max ) + { + FT_UInt mid = ( min + max ) >> 1; + FT_Byte* q = p + 6 * mid; + FT_ULong key; + + + key = FT_NEXT_ULONG( q ); + + if ( key == key0 ) + { + value = FT_PEEK_SHORT( q ); + goto Found; + } + if ( key < key0 ) + min = mid + 1; + else + max = mid; + } + } + else /* linear search */ + { + FT_UInt count2; + + + for ( count2 = num_pairs; count2 > 0; count2-- ) + { + FT_ULong key = FT_NEXT_ULONG( p ); + + + if ( key == key0 ) + { + value = FT_PEEK_SHORT( p ); + goto Found; + } + p += 2; + } + } + } + break; + + /* + * We don't support format 2 because we haven't seen a single font + * using it in real life... + */ + + default: + ; + } + + goto NextTable; + + Found: + if ( coverage & 8 ) /* override or add */ + result = value; + else + result += value; + + NextTable: + p = next; + } + + return result; + } + +#undef TT_KERN_INDEX + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttkern.h b/android/jni/ndk_modules/freetype/src/sfnt/ttkern.h new file mode 100644 index 00000000..df1da9b2 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttkern.h @@ -0,0 +1,52 @@ +/***************************************************************************/ +/* */ +/* ttkern.h */ +/* */ +/* Load the basic TrueType kerning table. This doesn't handle */ +/* kerning data within the GPOS table at the moment. */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTKERN_H__ +#define __TTKERN_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_kern( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_done_kern( TT_Face face ); + + FT_LOCAL( FT_Int ) + tt_face_get_kerning( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ); + +#define TT_FACE_HAS_KERNING( face ) ( (face)->kern_avail_bits != 0 ) + + +FT_END_HEADER + +#endif /* __TTKERN_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttload.c b/android/jni/ndk_modules/freetype/src/sfnt/ttload.c new file mode 100644 index 00000000..1c174aff --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttload.c @@ -0,0 +1,1262 @@ +/***************************************************************************/ +/* */ +/* ttload.c */ +/* */ +/* Load the basic TrueType tables, i.e., tables that can be either in */ +/* TTF or OTF fonts (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttload.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttload + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_lookup_table */ + /* */ + /* <Description> */ + /* Looks for a TrueType table by name. */ + /* */ + /* <Input> */ + /* face :: A face object handle. */ + /* */ + /* tag :: The searched tag. */ + /* */ + /* <Return> */ + /* A pointer to the table directory entry. 0 if not found. */ + /* */ + FT_LOCAL_DEF( TT_Table ) + tt_face_lookup_table( TT_Face face, + FT_ULong tag ) + { + TT_Table entry; + TT_Table limit; +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool zero_length = FALSE; +#endif + + + FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ", + face, + (FT_Char)( tag >> 24 ), + (FT_Char)( tag >> 16 ), + (FT_Char)( tag >> 8 ), + (FT_Char)( tag ) )); + + entry = face->dir_tables; + limit = entry + face->num_tables; + + for ( ; entry < limit; entry++ ) + { + /* For compatibility with Windows, we consider */ + /* zero-length tables the same as missing tables. */ + if ( entry->Tag == tag ) + { + if ( entry->Length != 0 ) + { + FT_TRACE4(( "found table.\n" )); + return entry; + } +#ifdef FT_DEBUG_LEVEL_TRACE + zero_length = TRUE; +#endif + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( zero_length ) + FT_TRACE4(( "ignoring empty table\n" )); + else + FT_TRACE4(( "could not find table\n" )); +#endif + + return NULL; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_goto_table */ + /* */ + /* <Description> */ + /* Looks for a TrueType table by name, then seek a stream to it. */ + /* */ + /* <Input> */ + /* face :: A face object handle. */ + /* */ + /* tag :: The searched tag. */ + /* */ + /* stream :: The stream to seek when the table is found. */ + /* */ + /* <Output> */ + /* length :: The length of the table if found, undefined otherwise. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_goto_table( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ) + { + TT_Table table; + FT_Error error; + + + table = tt_face_lookup_table( face, tag ); + if ( table ) + { + if ( length ) + *length = table->Length; + + if ( FT_STREAM_SEEK( table->Offset ) ) + goto Exit; + } + else + error = SFNT_Err_Table_Missing; + + Exit: + return error; + } + + + /* Here, we */ + /* */ + /* - check that `num_tables' is valid (and adjust it if necessary) */ + /* */ + /* - look for a `head' table, check its size, and parse it to check */ + /* whether its `magic' field is correctly set */ + /* */ + /* - errors (except errors returned by stream handling) */ + /* */ + /* SFNT_Err_Unknown_File_Format: */ + /* no table is defined in directory, it is not sfnt-wrapped */ + /* data */ + /* SFNT_Err_Table_Missing: */ + /* table directory is valid, but essential tables */ + /* (head/bhed/SING) are missing */ + /* */ + static FT_Error + check_table_dir( SFNT_Header sfnt, + FT_Stream stream ) + { + FT_Error error; + FT_UShort nn, valid_entries = 0; + FT_UInt has_head = 0, has_sing = 0, has_meta = 0; + FT_ULong offset = sfnt->offset + 12; + + static const FT_Frame_Field table_dir_entry_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_TableRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG( Tag ), + FT_FRAME_ULONG( CheckSum ), + FT_FRAME_ULONG( Offset ), + FT_FRAME_ULONG( Length ), + FT_FRAME_END + }; + + + if ( FT_STREAM_SEEK( offset ) ) + goto Exit; + + for ( nn = 0; nn < sfnt->num_tables; nn++ ) + { + TT_TableRec table; + + + if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) ) + { + nn--; + FT_TRACE2(( "check_table_dir:" + " can read only %d table%s in font (instead of %d)\n", + nn, nn == 1 ? "" : "s", sfnt->num_tables )); + sfnt->num_tables = nn; + break; + } + + /* we ignore invalid tables */ + if ( table.Offset + table.Length > stream->size ) + { + FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn )); + continue; + } + else + valid_entries++; + + if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed ) + { + FT_UInt32 magic; + + +#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + if ( table.Tag == TTAG_head ) +#endif + has_head = 1; + + /* + * The table length should be 0x36, but certain font tools make it + * 0x38, so we will just check that it is greater. + * + * Note that according to the specification, the table must be + * padded to 32-bit lengths, but this doesn't apply to the value of + * its `Length' field! + * + */ + if ( table.Length < 0x36 ) + { + FT_TRACE2(( "check_table_dir: `head' table too small\n" )); + error = SFNT_Err_Table_Missing; + goto Exit; + } + + if ( FT_STREAM_SEEK( table.Offset + 12 ) || + FT_READ_ULONG( magic ) ) + goto Exit; + + if ( magic != 0x5F0F3CF5UL ) + { + FT_TRACE2(( "check_table_dir:" + " no magic number found in `head' table\n")); + error = SFNT_Err_Table_Missing; + goto Exit; + } + + if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) ) + goto Exit; + } + else if ( table.Tag == TTAG_SING ) + has_sing = 1; + else if ( table.Tag == TTAG_META ) + has_meta = 1; + } + + sfnt->num_tables = valid_entries; + + if ( sfnt->num_tables == 0 ) + { + FT_TRACE2(( "check_table_dir: no tables found\n" )); + error = SFNT_Err_Unknown_File_Format; + goto Exit; + } + + /* if `sing' and `meta' tables are present, there is no `head' table */ + if ( has_head || ( has_sing && has_meta ) ) + { + error = SFNT_Err_Ok; + goto Exit; + } + else + { + FT_TRACE2(( "check_table_dir:" )); +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" )); +#else + FT_TRACE2(( " neither `head' nor `sing' table found\n" )); +#endif + error = SFNT_Err_Table_Missing; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_font_dir */ + /* */ + /* <Description> */ + /* Loads the header of a SFNT font file. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Output> */ + /* sfnt :: The SFNT header. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the beginning of the font directory. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_font_dir( TT_Face face, + FT_Stream stream ) + { + SFNT_HeaderRec sfnt; + FT_Error error; + FT_Memory memory = stream->memory; + TT_TableRec* entry; + FT_Int nn; + + static const FT_Frame_Field offset_table_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE SFNT_HeaderRec + + FT_FRAME_START( 8 ), + FT_FRAME_USHORT( num_tables ), + FT_FRAME_USHORT( search_range ), + FT_FRAME_USHORT( entry_selector ), + FT_FRAME_USHORT( range_shift ), + FT_FRAME_END + }; + + + FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face )); + + /* read the offset table */ + + sfnt.offset = FT_STREAM_POS(); + + if ( FT_READ_ULONG( sfnt.format_tag ) || + FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) ) + goto Exit; + + /* many fonts don't have these fields set correctly */ +#if 0 + if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 ) || + sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 ) + return SFNT_Err_Unknown_File_Format; +#endif + + /* load the table directory */ + + FT_TRACE2(( "-- Number of tables: %10u\n", sfnt.num_tables )); + FT_TRACE2(( "-- Format version: 0x%08lx\n", sfnt.format_tag )); + + /* check first */ + error = check_table_dir( &sfnt, stream ); + if ( error ) + { + FT_TRACE2(( "tt_face_load_font_dir:" + " invalid table directory for TrueType\n" )); + + goto Exit; + } + + face->num_tables = sfnt.num_tables; + face->format_tag = sfnt.format_tag; + + if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) ) + goto Exit; + + if ( FT_STREAM_SEEK( sfnt.offset + 12 ) || + FT_FRAME_ENTER( face->num_tables * 16L ) ) + goto Exit; + + entry = face->dir_tables; + + for ( nn = 0; nn < sfnt.num_tables; nn++ ) + { + entry->Tag = FT_GET_TAG4(); + entry->CheckSum = FT_GET_ULONG(); + entry->Offset = FT_GET_LONG(); + entry->Length = FT_GET_LONG(); + + /* ignore invalid tables */ + if ( entry->Offset + entry->Length > stream->size ) + continue; + else + { + FT_TRACE2(( " %c%c%c%c - %08lx - %08lx\n", + (FT_Char)( entry->Tag >> 24 ), + (FT_Char)( entry->Tag >> 16 ), + (FT_Char)( entry->Tag >> 8 ), + (FT_Char)( entry->Tag ), + entry->Offset, + entry->Length )); + entry++; + } + } + + FT_FRAME_EXIT(); + + FT_TRACE2(( "table directory loaded\n\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_any */ + /* */ + /* <Description> */ + /* Loads any font table into client memory. */ + /* */ + /* <Input> */ + /* face :: The face object to look for. */ + /* */ + /* tag :: The tag of table to load. Use the value 0 if you want */ + /* to access the whole font file, else set this parameter */ + /* to a valid TrueType table tag that you can forge with */ + /* the MAKE_TT_TAG macro. */ + /* */ + /* offset :: The starting offset in the table (or the file if */ + /* tag == 0). */ + /* */ + /* length :: The address of the decision variable: */ + /* */ + /* If length == NULL: */ + /* Loads the whole table. Returns an error if */ + /* `offset' == 0! */ + /* */ + /* If *length == 0: */ + /* Exits immediately; returning the length of the given */ + /* table or of the font file, depending on the value of */ + /* `tag'. */ + /* */ + /* If *length != 0: */ + /* Loads the next `length' bytes of table or font, */ + /* starting at offset `offset' (in table or font too). */ + /* */ + /* <Output> */ + /* buffer :: The address of target buffer. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_any( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ) + { + FT_Error error; + FT_Stream stream; + TT_Table table; + FT_ULong size; + + + if ( tag != 0 ) + { + /* look for tag in font directory */ + table = tt_face_lookup_table( face, tag ); + if ( !table ) + { + error = SFNT_Err_Table_Missing; + goto Exit; + } + + offset += table->Offset; + size = table->Length; + } + else + /* tag == 0 -- the user wants to access the font file directly */ + size = face->root.stream->size; + + if ( length && *length == 0 ) + { + *length = size; + + return SFNT_Err_Ok; + } + + if ( length ) + size = *length; + + stream = face->root.stream; + /* the `if' is syntactic sugar for picky compilers */ + if ( FT_STREAM_READ_AT( offset, buffer, size ) ) + goto Exit; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_generic_header */ + /* */ + /* <Description> */ + /* Loads the TrueType table `head' or `bhed'. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + tt_face_load_generic_header( TT_Face face, + FT_Stream stream, + FT_ULong tag ) + { + FT_Error error; + TT_Header* header; + + static const FT_Frame_Field header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_Header + + FT_FRAME_START( 54 ), + FT_FRAME_ULONG ( Table_Version ), + FT_FRAME_ULONG ( Font_Revision ), + FT_FRAME_LONG ( CheckSum_Adjust ), + FT_FRAME_LONG ( Magic_Number ), + FT_FRAME_USHORT( Flags ), + FT_FRAME_USHORT( Units_Per_EM ), + FT_FRAME_LONG ( Created[0] ), + FT_FRAME_LONG ( Created[1] ), + FT_FRAME_LONG ( Modified[0] ), + FT_FRAME_LONG ( Modified[1] ), + FT_FRAME_SHORT ( xMin ), + FT_FRAME_SHORT ( yMin ), + FT_FRAME_SHORT ( xMax ), + FT_FRAME_SHORT ( yMax ), + FT_FRAME_USHORT( Mac_Style ), + FT_FRAME_USHORT( Lowest_Rec_PPEM ), + FT_FRAME_SHORT ( Font_Direction ), + FT_FRAME_SHORT ( Index_To_Loc_Format ), + FT_FRAME_SHORT ( Glyph_Data_Format ), + FT_FRAME_END + }; + + + error = face->goto_table( face, tag, stream, 0 ); + if ( error ) + goto Exit; + + header = &face->header; + + if ( FT_STREAM_READ_FIELDS( header_fields, header ) ) + goto Exit; + + FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM )); + FT_TRACE3(( "IndexToLoc: %4d\n", header->Index_To_Loc_Format )); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_head( TT_Face face, + FT_Stream stream ) + { + return tt_face_load_generic_header( face, stream, TTAG_head ); + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_bhed( TT_Face face, + FT_Stream stream ) + { + return tt_face_load_generic_header( face, stream, TTAG_bhed ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_max_profile */ + /* */ + /* <Description> */ + /* Loads the maximum profile into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_maxp( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_MaxProfile* maxProfile = &face->max_profile; + + const FT_Frame_Field maxp_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_MaxProfile + + FT_FRAME_START( 6 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( numGlyphs ), + FT_FRAME_END + }; + + const FT_Frame_Field maxp_fields_extra[] = + { + FT_FRAME_START( 26 ), + FT_FRAME_USHORT( maxPoints ), + FT_FRAME_USHORT( maxContours ), + FT_FRAME_USHORT( maxCompositePoints ), + FT_FRAME_USHORT( maxCompositeContours ), + FT_FRAME_USHORT( maxZones ), + FT_FRAME_USHORT( maxTwilightPoints ), + FT_FRAME_USHORT( maxStorage ), + FT_FRAME_USHORT( maxFunctionDefs ), + FT_FRAME_USHORT( maxInstructionDefs ), + FT_FRAME_USHORT( maxStackElements ), + FT_FRAME_USHORT( maxSizeOfInstructions ), + FT_FRAME_USHORT( maxComponentElements ), + FT_FRAME_USHORT( maxComponentDepth ), + FT_FRAME_END + }; + + + error = face->goto_table( face, TTAG_maxp, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) ) + goto Exit; + + maxProfile->maxPoints = 0; + maxProfile->maxContours = 0; + maxProfile->maxCompositePoints = 0; + maxProfile->maxCompositeContours = 0; + maxProfile->maxZones = 0; + maxProfile->maxTwilightPoints = 0; + maxProfile->maxStorage = 0; + maxProfile->maxFunctionDefs = 0; + maxProfile->maxInstructionDefs = 0; + maxProfile->maxStackElements = 0; + maxProfile->maxSizeOfInstructions = 0; + maxProfile->maxComponentElements = 0; + maxProfile->maxComponentDepth = 0; + + if ( maxProfile->version >= 0x10000L ) + { + if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) ) + goto Exit; + + /* XXX: an adjustment that is necessary to load certain */ + /* broken fonts like `Keystrokes MT' :-( */ + /* */ + /* We allocate 64 function entries by default when */ + /* the maxFunctionDefs field is null. */ + + if ( maxProfile->maxFunctionDefs == 0 ) + maxProfile->maxFunctionDefs = 64; + + /* we add 4 phantom points later */ + if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) ) + { + FT_TRACE0(( "tt_face_load_maxp:" + " too much twilight points in `maxp' table;\n" + " " + " some glyphs might be rendered incorrectly\n" )); + + maxProfile->maxTwilightPoints = 0xFFFFU - 4; + } + + /* we arbitrarily limit recursion to avoid stack exhaustion */ + if ( maxProfile->maxComponentDepth > 100 ) + { + FT_TRACE0(( "tt_face_load_maxp:" + " abnormally large component depth (%d) set to 100\n", + maxProfile->maxComponentDepth )); + maxProfile->maxComponentDepth = 100; + } + } + + FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_names */ + /* */ + /* <Description> */ + /* Loads the name records. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_name( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_pos, table_len; + FT_ULong storage_start, storage_limit; + FT_UInt count; + TT_NameTable table; + + static const FT_Frame_Field name_table_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_NameTableRec + + FT_FRAME_START( 6 ), + FT_FRAME_USHORT( format ), + FT_FRAME_USHORT( numNameRecords ), + FT_FRAME_USHORT( storageOffset ), + FT_FRAME_END + }; + + static const FT_Frame_Field name_record_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_NameEntryRec + + /* no FT_FRAME_START */ + FT_FRAME_USHORT( platformID ), + FT_FRAME_USHORT( encodingID ), + FT_FRAME_USHORT( languageID ), + FT_FRAME_USHORT( nameID ), + FT_FRAME_USHORT( stringLength ), + FT_FRAME_USHORT( stringOffset ), + FT_FRAME_END + }; + + + table = &face->name_table; + table->stream = stream; + + error = face->goto_table( face, TTAG_name, stream, &table_len ); + if ( error ) + goto Exit; + + table_pos = FT_STREAM_POS(); + + + if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) ) + goto Exit; + + /* Some popular Asian fonts have an invalid `storageOffset' value */ + /* (it should be at least "6 + 12*num_names"). However, the string */ + /* offsets, computed as "storageOffset + entry->stringOffset", are */ + /* valid pointers within the name table... */ + /* */ + /* We thus can't check `storageOffset' right now. */ + /* */ + storage_start = table_pos + 6 + 12*table->numNameRecords; + storage_limit = table_pos + table_len; + + if ( storage_start > storage_limit ) + { + FT_ERROR(( "tt_face_load_name: invalid `name' table\n" )); + error = SFNT_Err_Name_Table_Missing; + goto Exit; + } + + /* Allocate the array of name records. */ + count = table->numNameRecords; + table->numNameRecords = 0; + + if ( FT_NEW_ARRAY( table->names, count ) || + FT_FRAME_ENTER( count * 12 ) ) + goto Exit; + + /* Load the name records and determine how much storage is needed */ + /* to hold the strings themselves. */ + { + TT_NameEntryRec* entry = table->names; + + + for ( ; count > 0; count-- ) + { + if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) ) + continue; + + /* check that the name is not empty */ + if ( entry->stringLength == 0 ) + continue; + + /* check that the name string is within the table */ + entry->stringOffset += table_pos + table->storageOffset; + if ( entry->stringOffset < storage_start || + entry->stringOffset + entry->stringLength > storage_limit ) + { + /* invalid entry - ignore it */ + entry->stringOffset = 0; + entry->stringLength = 0; + continue; + } + + entry++; + } + + table->numNameRecords = (FT_UInt)( entry - table->names ); + } + + FT_FRAME_EXIT(); + + /* everything went well, update face->num_names */ + face->num_names = (FT_UShort) table->numNameRecords; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_free_names */ + /* */ + /* <Description> */ + /* Frees the name records. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + FT_LOCAL_DEF( void ) + tt_face_free_name( TT_Face face ) + { + FT_Memory memory = face->root.driver->root.memory; + TT_NameTable table = &face->name_table; + TT_NameEntry entry = table->names; + FT_UInt count = table->numNameRecords; + + + if ( table->names ) + { + for ( ; count > 0; count--, entry++ ) + { + FT_FREE( entry->string ); + entry->stringLength = 0; + } + + /* free strings table */ + FT_FREE( table->names ); + } + + table->numNameRecords = 0; + table->format = 0; + table->storageOffset = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_cmap */ + /* */ + /* <Description> */ + /* Loads the cmap directory in a face object. The cmaps themselves */ + /* are loaded on demand in the `ttcmap.c' module. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_cmap( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + + + error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size ); + if ( error ) + goto Exit; + + if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) ) + face->cmap_size = 0; + + Exit: + return error; + } + + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_os2 */ + /* */ + /* <Description> */ + /* Loads the OS2 table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_os2( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_OS2* os2; + + const FT_Frame_Field os2_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_OS2 + + FT_FRAME_START( 78 ), + FT_FRAME_USHORT( version ), + FT_FRAME_SHORT ( xAvgCharWidth ), + FT_FRAME_USHORT( usWeightClass ), + FT_FRAME_USHORT( usWidthClass ), + FT_FRAME_SHORT ( fsType ), + FT_FRAME_SHORT ( ySubscriptXSize ), + FT_FRAME_SHORT ( ySubscriptYSize ), + FT_FRAME_SHORT ( ySubscriptXOffset ), + FT_FRAME_SHORT ( ySubscriptYOffset ), + FT_FRAME_SHORT ( ySuperscriptXSize ), + FT_FRAME_SHORT ( ySuperscriptYSize ), + FT_FRAME_SHORT ( ySuperscriptXOffset ), + FT_FRAME_SHORT ( ySuperscriptYOffset ), + FT_FRAME_SHORT ( yStrikeoutSize ), + FT_FRAME_SHORT ( yStrikeoutPosition ), + FT_FRAME_SHORT ( sFamilyClass ), + FT_FRAME_BYTE ( panose[0] ), + FT_FRAME_BYTE ( panose[1] ), + FT_FRAME_BYTE ( panose[2] ), + FT_FRAME_BYTE ( panose[3] ), + FT_FRAME_BYTE ( panose[4] ), + FT_FRAME_BYTE ( panose[5] ), + FT_FRAME_BYTE ( panose[6] ), + FT_FRAME_BYTE ( panose[7] ), + FT_FRAME_BYTE ( panose[8] ), + FT_FRAME_BYTE ( panose[9] ), + FT_FRAME_ULONG ( ulUnicodeRange1 ), + FT_FRAME_ULONG ( ulUnicodeRange2 ), + FT_FRAME_ULONG ( ulUnicodeRange3 ), + FT_FRAME_ULONG ( ulUnicodeRange4 ), + FT_FRAME_BYTE ( achVendID[0] ), + FT_FRAME_BYTE ( achVendID[1] ), + FT_FRAME_BYTE ( achVendID[2] ), + FT_FRAME_BYTE ( achVendID[3] ), + + FT_FRAME_USHORT( fsSelection ), + FT_FRAME_USHORT( usFirstCharIndex ), + FT_FRAME_USHORT( usLastCharIndex ), + FT_FRAME_SHORT ( sTypoAscender ), + FT_FRAME_SHORT ( sTypoDescender ), + FT_FRAME_SHORT ( sTypoLineGap ), + FT_FRAME_USHORT( usWinAscent ), + FT_FRAME_USHORT( usWinDescent ), + FT_FRAME_END + }; + + const FT_Frame_Field os2_fields_extra[] = + { + FT_FRAME_START( 8 ), + FT_FRAME_ULONG( ulCodePageRange1 ), + FT_FRAME_ULONG( ulCodePageRange2 ), + FT_FRAME_END + }; + + const FT_Frame_Field os2_fields_extra2[] = + { + FT_FRAME_START( 10 ), + FT_FRAME_SHORT ( sxHeight ), + FT_FRAME_SHORT ( sCapHeight ), + FT_FRAME_USHORT( usDefaultChar ), + FT_FRAME_USHORT( usBreakChar ), + FT_FRAME_USHORT( usMaxContext ), + FT_FRAME_END + }; + + + /* We now support old Mac fonts where the OS/2 table doesn't */ + /* exist. Simply put, we set the `version' field to 0xFFFF */ + /* and test this value each time we need to access the table. */ + error = face->goto_table( face, TTAG_OS2, stream, 0 ); + if ( error ) + goto Exit; + + os2 = &face->os2; + + if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) ) + goto Exit; + + os2->ulCodePageRange1 = 0; + os2->ulCodePageRange2 = 0; + os2->sxHeight = 0; + os2->sCapHeight = 0; + os2->usDefaultChar = 0; + os2->usBreakChar = 0; + os2->usMaxContext = 0; + + if ( os2->version >= 0x0001 ) + { + /* only version 1 tables */ + if ( FT_STREAM_READ_FIELDS( os2_fields_extra, os2 ) ) + goto Exit; + + if ( os2->version >= 0x0002 ) + { + /* only version 2 tables */ + if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) ) + goto Exit; + } + } + + FT_TRACE3(( "sTypoAscender: %4d\n", os2->sTypoAscender )); + FT_TRACE3(( "sTypoDescender: %4d\n", os2->sTypoDescender )); + FT_TRACE3(( "usWinAscent: %4u\n", os2->usWinAscent )); + FT_TRACE3(( "usWinDescent: %4u\n", os2->usWinDescent )); + FT_TRACE3(( "fsSelection: 0x%2x\n", os2->fsSelection )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_postscript */ + /* */ + /* <Description> */ + /* Loads the Postscript table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_post( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_Postscript* post = &face->postscript; + + static const FT_Frame_Field post_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_Postscript + + FT_FRAME_START( 32 ), + FT_FRAME_ULONG( FormatType ), + FT_FRAME_ULONG( italicAngle ), + FT_FRAME_SHORT( underlinePosition ), + FT_FRAME_SHORT( underlineThickness ), + FT_FRAME_ULONG( isFixedPitch ), + FT_FRAME_ULONG( minMemType42 ), + FT_FRAME_ULONG( maxMemType42 ), + FT_FRAME_ULONG( minMemType1 ), + FT_FRAME_ULONG( maxMemType1 ), + FT_FRAME_END + }; + + + error = face->goto_table( face, TTAG_post, stream, 0 ); + if ( error ) + return error; + + if ( FT_STREAM_READ_FIELDS( post_fields, post ) ) + return error; + + /* we don't load the glyph names, we do that in another */ + /* module (ttpost). */ + + FT_TRACE3(( "FormatType: 0x%x\n", post->FormatType )); + FT_TRACE3(( "isFixedPitch: %s\n", post->isFixedPitch + ? " yes" : " no" )); + + return SFNT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_pclt */ + /* */ + /* <Description> */ + /* Loads the PCL 5 Table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_pclt( TT_Face face, + FT_Stream stream ) + { + static const FT_Frame_Field pclt_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_PCLT + + FT_FRAME_START( 54 ), + FT_FRAME_ULONG ( Version ), + FT_FRAME_ULONG ( FontNumber ), + FT_FRAME_USHORT( Pitch ), + FT_FRAME_USHORT( xHeight ), + FT_FRAME_USHORT( Style ), + FT_FRAME_USHORT( TypeFamily ), + FT_FRAME_USHORT( CapHeight ), + FT_FRAME_BYTES ( TypeFace, 16 ), + FT_FRAME_BYTES ( CharacterComplement, 8 ), + FT_FRAME_BYTES ( FileName, 6 ), + FT_FRAME_CHAR ( StrokeWeight ), + FT_FRAME_CHAR ( WidthType ), + FT_FRAME_BYTE ( SerifStyle ), + FT_FRAME_BYTE ( Reserved ), + FT_FRAME_END + }; + + FT_Error error; + TT_PCLT* pclt = &face->pclt; + + + /* optional table */ + error = face->goto_table( face, TTAG_PCLT, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) ) + goto Exit; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_gasp */ + /* */ + /* <Description> */ + /* Loads the `gasp' table into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_gasp( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + FT_UInt j,num_ranges; + TT_GaspRange gaspranges; + + + /* the gasp table is optional */ + error = face->goto_table( face, TTAG_gasp, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_FRAME_ENTER( 4L ) ) + goto Exit; + + face->gasp.version = FT_GET_USHORT(); + face->gasp.numRanges = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + + /* only support versions 0 and 1 of the table */ + if ( face->gasp.version >= 2 ) + { + face->gasp.numRanges = 0; + error = SFNT_Err_Invalid_Table; + goto Exit; + } + + num_ranges = face->gasp.numRanges; + FT_TRACE3(( "numRanges: %u\n", num_ranges )); + + if ( FT_QNEW_ARRAY( gaspranges, num_ranges ) || + FT_FRAME_ENTER( num_ranges * 4L ) ) + goto Exit; + + face->gasp.gaspRanges = gaspranges; + + for ( j = 0; j < num_ranges; j++ ) + { + gaspranges[j].maxPPEM = FT_GET_USHORT(); + gaspranges[j].gaspFlag = FT_GET_USHORT(); + + FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n", + j, + gaspranges[j].maxPPEM, + gaspranges[j].gaspFlag )); + } + + FT_FRAME_EXIT(); + + Exit: + return error; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttload.h b/android/jni/ndk_modules/freetype/src/sfnt/ttload.h new file mode 100644 index 00000000..49a1aee1 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttload.h @@ -0,0 +1,112 @@ +/***************************************************************************/ +/* */ +/* ttload.h */ +/* */ +/* Load the basic TrueType tables, i.e., tables that can be either in */ +/* TTF or OTF fonts (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTLOAD_H__ +#define __TTLOAD_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( TT_Table ) + tt_face_lookup_table( TT_Face face, + FT_ULong tag ); + + FT_LOCAL( FT_Error ) + tt_face_goto_table( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + FT_LOCAL( FT_Error ) + tt_face_load_font_dir( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_any( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + FT_LOCAL( FT_Error ) + tt_face_load_head( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_cmap( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_maxp( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_name( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_os2( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_post( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_pclt( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_name( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_load_gasp( TT_Face face, + FT_Stream stream ); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL( FT_Error ) + tt_face_load_bhed( TT_Face face, + FT_Stream stream ); + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + +FT_END_HEADER + +#endif /* __TTLOAD_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttmtx.c b/android/jni/ndk_modules/freetype/src/sfnt/ttmtx.c new file mode 100644 index 00000000..53e6ac78 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttmtx.c @@ -0,0 +1,468 @@ +/***************************************************************************/ +/* */ +/* ttmtx.c */ +/* */ +/* Load the metrics tables common to TTF and OTF fonts (body). */ +/* */ +/* Copyright 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttmtx.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttmtx + + + /* + * Unfortunately, we can't enable our memory optimizations if + * FT_CONFIG_OPTION_OLD_INTERNALS is defined. This is because at least + * one rogue client (libXfont in the X.Org XServer) is directly accessing + * the metrics. + */ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_hmtx */ + /* */ + /* <Description> */ + /* Load the `hmtx' or `vmtx' table into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load `vmtx'. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + FT_ULong tag, table_size; + FT_ULong* ptable_offset; + FT_ULong* ptable_size; + + + if ( vertical ) + { + tag = TTAG_vmtx; + ptable_offset = &face->vert_metrics_offset; + ptable_size = &face->vert_metrics_size; + } + else + { + tag = TTAG_hmtx; + ptable_offset = &face->horz_metrics_offset; + ptable_size = &face->horz_metrics_size; + } + + error = face->goto_table( face, tag, stream, &table_size ); + if ( error ) + goto Fail; + + *ptable_size = table_size; + *ptable_offset = FT_STREAM_POS(); + + Fail: + return error; + } + +#else /* !FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + FT_ULong table_len; + FT_Long num_shorts, num_longs, num_shorts_checked; + + TT_LongMetrics* longs; + TT_ShortMetrics** shorts; + FT_Byte* p; + + + if ( vertical ) + { + void* lm = &face->vertical.long_metrics; + void** sm = &face->vertical.short_metrics; + + + error = face->goto_table( face, TTAG_vmtx, stream, &table_len ); + if ( error ) + goto Fail; + + num_longs = face->vertical.number_Of_VMetrics; + if ( (FT_ULong)num_longs > table_len / 4 ) + num_longs = (FT_Long)( table_len / 4 ); + + face->vertical.number_Of_VMetrics = 0; + + longs = (TT_LongMetrics*)lm; + shorts = (TT_ShortMetrics**)sm; + } + else + { + void* lm = &face->horizontal.long_metrics; + void** sm = &face->horizontal.short_metrics; + + + error = face->goto_table( face, TTAG_hmtx, stream, &table_len ); + if ( error ) + goto Fail; + + num_longs = face->horizontal.number_Of_HMetrics; + if ( (FT_ULong)num_longs > table_len / 4 ) + num_longs = (FT_Long)( table_len / 4 ); + + face->horizontal.number_Of_HMetrics = 0; + + longs = (TT_LongMetrics*)lm; + shorts = (TT_ShortMetrics**)sm; + } + + /* never trust derived values */ + + num_shorts = face->max_profile.numGlyphs - num_longs; + num_shorts_checked = ( table_len - num_longs * 4L ) / 2; + + if ( num_shorts < 0 ) + { + FT_TRACE0(( "tt_face_load_hmtx:" + " %cmtx has more metrics than glyphs.\n", + vertical ? "v" : "h" )); + + /* Adobe simply ignores this problem. So we shall do the same. */ +#if 0 + error = vertical ? SFNT_Err_Invalid_Vert_Metrics + : SFNT_Err_Invalid_Horiz_Metrics; + goto Exit; +#else + num_shorts = 0; +#endif + } + + if ( FT_QNEW_ARRAY( *longs, num_longs ) || + FT_QNEW_ARRAY( *shorts, num_shorts ) ) + goto Fail; + + if ( FT_FRAME_ENTER( table_len ) ) + goto Fail; + + p = stream->cursor; + + { + TT_LongMetrics cur = *longs; + TT_LongMetrics limit = cur + num_longs; + + + for ( ; cur < limit; cur++ ) + { + cur->advance = FT_NEXT_USHORT( p ); + cur->bearing = FT_NEXT_SHORT( p ); + } + } + + /* do we have an inconsistent number of metric values? */ + { + TT_ShortMetrics* cur = *shorts; + TT_ShortMetrics* limit = cur + + FT_MIN( num_shorts, num_shorts_checked ); + + + for ( ; cur < limit; cur++ ) + *cur = FT_NEXT_SHORT( p ); + + /* We fill up the missing left side bearings with the */ + /* last valid value. Since this will occur for buggy CJK */ + /* fonts usually only, nothing serious will happen. */ + if ( num_shorts > num_shorts_checked && num_shorts_checked > 0 ) + { + FT_Short val = (*shorts)[num_shorts_checked - 1]; + + + limit = *shorts + num_shorts; + for ( ; cur < limit; cur++ ) + *cur = val; + } + } + + FT_FRAME_EXIT(); + + if ( vertical ) + face->vertical.number_Of_VMetrics = (FT_UShort)num_longs; + else + face->horizontal.number_Of_HMetrics = (FT_UShort)num_longs; + + Fail: + return error; + } + +#endif /* !FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_hhea */ + /* */ + /* <Description> */ + /* Load the `hhea' or 'vhea' table into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load `vhea'. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hhea( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + TT_HoriHeader* header; + + const FT_Frame_Field metrics_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_HoriHeader + + FT_FRAME_START( 36 ), + FT_FRAME_ULONG ( Version ), + FT_FRAME_SHORT ( Ascender ), + FT_FRAME_SHORT ( Descender ), + FT_FRAME_SHORT ( Line_Gap ), + FT_FRAME_USHORT( advance_Width_Max ), + FT_FRAME_SHORT ( min_Left_Side_Bearing ), + FT_FRAME_SHORT ( min_Right_Side_Bearing ), + FT_FRAME_SHORT ( xMax_Extent ), + FT_FRAME_SHORT ( caret_Slope_Rise ), + FT_FRAME_SHORT ( caret_Slope_Run ), + FT_FRAME_SHORT ( caret_Offset ), + FT_FRAME_SHORT ( Reserved[0] ), + FT_FRAME_SHORT ( Reserved[1] ), + FT_FRAME_SHORT ( Reserved[2] ), + FT_FRAME_SHORT ( Reserved[3] ), + FT_FRAME_SHORT ( metric_Data_Format ), + FT_FRAME_USHORT( number_Of_HMetrics ), + FT_FRAME_END + }; + + + if ( vertical ) + { + void *v = &face->vertical; + + + error = face->goto_table( face, TTAG_vhea, stream, 0 ); + if ( error ) + goto Fail; + + header = (TT_HoriHeader*)v; + } + else + { + error = face->goto_table( face, TTAG_hhea, stream, 0 ); + if ( error ) + goto Fail; + + header = &face->horizontal; + } + + if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) ) + goto Fail; + + FT_TRACE3(( "Ascender: %5d\n", header->Ascender )); + FT_TRACE3(( "Descender: %5d\n", header->Descender )); + FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics )); + + header->long_metrics = NULL; + header->short_metrics = NULL; + + Fail: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_get_metrics */ + /* */ + /* <Description> */ + /* Returns the horizontal or vertical metrics in font units for a */ + /* given glyph. The metrics are the left side bearing (resp. top */ + /* side bearing) and advance width (resp. advance height). */ + /* */ + /* <Input> */ + /* header :: A pointer to either the horizontal or vertical metrics */ + /* structure. */ + /* */ + /* idx :: The glyph index. */ + /* */ + /* <Output> */ + /* bearing :: The bearing, either left side or top side. */ + /* */ + /* advance :: The advance width resp. advance height. */ + /* */ +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_LOCAL_DEF( FT_Error ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short *abearing, + FT_UShort *aadvance ) + { + FT_Error error; + FT_Stream stream = face->root.stream; + TT_HoriHeader* header; + FT_ULong table_pos, table_size, table_end; + FT_UShort k; + + + if ( vertical ) + { + void* v = &face->vertical; + + + header = (TT_HoriHeader*)v; + table_pos = face->vert_metrics_offset; + table_size = face->vert_metrics_size; + } + else + { + header = &face->horizontal; + table_pos = face->horz_metrics_offset; + table_size = face->horz_metrics_size; + } + + table_end = table_pos + table_size; + + k = header->number_Of_HMetrics; + + if ( k > 0 ) + { + if ( gindex < (FT_UInt)k ) + { + table_pos += 4 * gindex; + if ( table_pos + 4 > table_end ) + goto NoData; + + if ( FT_STREAM_SEEK( table_pos ) || + FT_READ_USHORT( *aadvance ) || + FT_READ_SHORT( *abearing ) ) + goto NoData; + } + else + { + table_pos += 4 * ( k - 1 ); + if ( table_pos + 4 > table_end ) + goto NoData; + + if ( FT_STREAM_SEEK( table_pos ) || + FT_READ_USHORT( *aadvance ) ) + goto NoData; + + table_pos += 4 + 2 * ( gindex - k ); + if ( table_pos + 2 > table_end ) + *abearing = 0; + else + { + if ( !FT_STREAM_SEEK( table_pos ) ) + (void)FT_READ_SHORT( *abearing ); + } + } + } + else + { + NoData: + *abearing = 0; + *aadvance = 0; + } + + return SFNT_Err_Ok; + } + +#else /* !FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ) + { + void* v = &face->vertical; + void* h = &face->horizontal; + TT_HoriHeader* header = vertical ? (TT_HoriHeader*)v + : (TT_HoriHeader*)h; + TT_LongMetrics longs_m; + FT_UShort k = header->number_Of_HMetrics; + + + if ( k == 0 || + !header->long_metrics || + gindex >= (FT_UInt)face->max_profile.numGlyphs ) + { + *abearing = *aadvance = 0; + return SFNT_Err_Ok; + } + + if ( gindex < (FT_UInt)k ) + { + longs_m = (TT_LongMetrics)header->long_metrics + gindex; + *abearing = longs_m->bearing; + *aadvance = longs_m->advance; + } + else + { + *abearing = ((TT_ShortMetrics*)header->short_metrics)[gindex - k]; + *aadvance = ((TT_LongMetrics)header->long_metrics)[k - 1].advance; + } + + return SFNT_Err_Ok; + } + +#endif /* !FT_CONFIG_OPTION_OLD_INTERNALS */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttmtx.h b/android/jni/ndk_modules/freetype/src/sfnt/ttmtx.h new file mode 100644 index 00000000..8b91a113 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttmtx.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* ttmtx.h */ +/* */ +/* Load the metrics tables common to TTF and OTF fonts (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTMTX_H__ +#define __TTMTX_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_hhea( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + FT_LOCAL( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + FT_LOCAL( FT_Error ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ); + +FT_END_HEADER + +#endif /* __TTMTX_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttpost.c b/android/jni/ndk_modules/freetype/src/sfnt/ttpost.c new file mode 100644 index 00000000..aa0bf1ec --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttpost.c @@ -0,0 +1,521 @@ +/***************************************************************************/ +/* */ +/* ttpost.c */ +/* */ +/* Postcript name table processing for TrueType and OpenType fonts */ +/* (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* The post table is not completely loaded by the core engine. This */ + /* file loads the missing PS glyph names and implements an API to access */ + /* them. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttpost.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttpost + + + /* If this configuration macro is defined, we rely on the `PSNames' */ + /* module to grab the glyph names. */ + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + +#define MAC_NAME( x ) ( (FT_String*)psnames->macintosh_name( x ) ) + + +#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + /* Otherwise, we ignore the `PSNames' module, and provide our own */ + /* table of Mac names. Thus, it is possible to build a version of */ + /* FreeType without the Type 1 driver & PSNames module. */ + +#define MAC_NAME( x ) ( (FT_String*)tt_post_default_names[x] ) + + /* the 258 default Mac PS glyph names */ + + static const FT_String* const tt_post_default_names[258] = + { + /* 0 */ + ".notdef", ".null", "CR", "space", "exclam", + "quotedbl", "numbersign", "dollar", "percent", "ampersand", + /* 10 */ + "quotesingle", "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", "zero", + /* 20 */ + "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "colon", + /* 30 */ + "semicolon", "less", "equal", "greater", "question", + "at", "A", "B", "C", "D", + /* 40 */ + "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", + /* 50 */ + "O", "P", "Q", "R", "S", + "T", "U", "V", "W", "X", + /* 60 */ + "Y", "Z", "bracketleft", "backslash", "bracketright", + "asciicircum", "underscore", "grave", "a", "b", + /* 70 */ + "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", + /* 80 */ + "m", "n", "o", "p", "q", + "r", "s", "t", "u", "v", + /* 90 */ + "w", "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", "Adieresis", "Aring", + /* 100 */ + "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", + "aacute", "agrave", "acircumflex", "adieresis", "atilde", + /* 110 */ + "aring", "ccedilla", "eacute", "egrave", "ecircumflex", + "edieresis", "iacute", "igrave", "icircumflex", "idieresis", + /* 120 */ + "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", + "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", + /* 130 */ + "dagger", "degree", "cent", "sterling", "section", + "bullet", "paragraph", "germandbls", "registered", "copyright", + /* 140 */ + "trademark", "acute", "dieresis", "notequal", "AE", + "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", + /* 150 */ + "yen", "mu", "partialdiff", "summation", "product", + "pi", "integral", "ordfeminine", "ordmasculine", "Omega", + /* 160 */ + "ae", "oslash", "questiondown", "exclamdown", "logicalnot", + "radical", "florin", "approxequal", "Delta", "guillemotleft", + /* 170 */ + "guillemotright", "ellipsis", "nbspace", "Agrave", "Atilde", + "Otilde", "OE", "oe", "endash", "emdash", + /* 180 */ + "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", + "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", + /* 190 */ + "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", + "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", + /* 200 */ + "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", + "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", + /* 210 */ + "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", + "dotlessi", "circumflex", "tilde", "macron", "breve", + /* 220 */ + "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", + "caron", "Lslash", "lslash", "Scaron", "scaron", + /* 230 */ + "Zcaron", "zcaron", "brokenbar", "Eth", "eth", + "Yacute", "yacute", "Thorn", "thorn", "minus", + /* 240 */ + "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", + "onequarter", "threequarters", "franc", "Gbreve", "gbreve", + /* 250 */ + "Idot", "Scedilla", "scedilla", "Cacute", "cacute", + "Ccaron", "ccaron", "dmacron", + }; + + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + static FT_Error + load_format_20( TT_Face face, + FT_Stream stream ) + { + FT_Memory memory = stream->memory; + FT_Error error; + + FT_Int num_glyphs; + FT_UShort num_names; + + FT_UShort* glyph_indices = 0; + FT_Char** name_strings = 0; + + + if ( FT_READ_USHORT( num_glyphs ) ) + goto Exit; + + /* UNDOCUMENTED! The number of glyphs in this table can be smaller */ + /* than the value in the maxp table (cf. cyberbit.ttf). */ + + /* There already exist fonts which have more than 32768 glyph names */ + /* in this table, so the test for this threshold has been dropped. */ + + if ( num_glyphs > face->max_profile.numGlyphs ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + /* load the indices */ + { + FT_Int n; + + + if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) || + FT_FRAME_ENTER( num_glyphs * 2L ) ) + goto Fail; + + for ( n = 0; n < num_glyphs; n++ ) + glyph_indices[n] = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + } + + /* compute number of names stored in table */ + { + FT_Int n; + + + num_names = 0; + + for ( n = 0; n < num_glyphs; n++ ) + { + FT_Int idx; + + + idx = glyph_indices[n]; + if ( idx >= 258 ) + { + idx -= 257; + if ( idx > num_names ) + num_names = (FT_UShort)idx; + } + } + } + + /* now load the name strings */ + { + FT_UShort n; + + + if ( FT_NEW_ARRAY( name_strings, num_names ) ) + goto Fail; + + for ( n = 0; n < num_names; n++ ) + { + FT_UInt len; + + + if ( FT_READ_BYTE ( len ) || + FT_NEW_ARRAY( name_strings[n], len + 1 ) || + FT_STREAM_READ ( name_strings[n], len ) ) + goto Fail1; + + name_strings[n][len] = '\0'; + } + } + + /* all right, set table fields and exit successfully */ + { + TT_Post_20 table = &face->postscript_names.names.format_20; + + + table->num_glyphs = (FT_UShort)num_glyphs; + table->num_names = (FT_UShort)num_names; + table->glyph_indices = glyph_indices; + table->glyph_names = name_strings; + } + return SFNT_Err_Ok; + + Fail1: + { + FT_UShort n; + + + for ( n = 0; n < num_names; n++ ) + FT_FREE( name_strings[n] ); + } + + Fail: + FT_FREE( name_strings ); + FT_FREE( glyph_indices ); + + Exit: + return error; + } + + + static FT_Error + load_format_25( TT_Face face, + FT_Stream stream ) + { + FT_Memory memory = stream->memory; + FT_Error error; + + FT_Int num_glyphs; + FT_Char* offset_table = 0; + + + /* UNDOCUMENTED! This value appears only in the Apple TT specs. */ + if ( FT_READ_USHORT( num_glyphs ) ) + goto Exit; + + /* check the number of glyphs */ + if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( FT_NEW_ARRAY( offset_table, num_glyphs ) || + FT_STREAM_READ( offset_table, num_glyphs ) ) + goto Fail; + + /* now check the offset table */ + { + FT_Int n; + + + for ( n = 0; n < num_glyphs; n++ ) + { + FT_Long idx = (FT_Long)n + offset_table[n]; + + + if ( idx < 0 || idx > num_glyphs ) + { + error = SFNT_Err_Invalid_File_Format; + goto Fail; + } + } + } + + /* OK, set table fields and exit successfully */ + { + TT_Post_25 table = &face->postscript_names.names.format_25; + + + table->num_glyphs = (FT_UShort)num_glyphs; + table->offsets = offset_table; + } + + return SFNT_Err_Ok; + + Fail: + FT_FREE( offset_table ); + + Exit: + return error; + } + + + static FT_Error + load_post_names( TT_Face face ) + { + FT_Stream stream; + FT_Error error; + FT_Fixed format; + + + /* get a stream for the face's resource */ + stream = face->root.stream; + + /* seek to the beginning of the PS names table */ + error = face->goto_table( face, TTAG_post, stream, 0 ); + if ( error ) + goto Exit; + + format = face->postscript.FormatType; + + /* go to beginning of subtable */ + if ( FT_STREAM_SKIP( 32 ) ) + goto Exit; + + /* now read postscript table */ + if ( format == 0x00020000L ) + error = load_format_20( face, stream ); + else if ( format == 0x00028000L ) + error = load_format_25( face, stream ); + else + error = SFNT_Err_Invalid_File_Format; + + face->postscript_names.loaded = 1; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_ps_names( TT_Face face ) + { + FT_Memory memory = face->root.memory; + TT_Post_Names names = &face->postscript_names; + FT_Fixed format; + + + if ( names->loaded ) + { + format = face->postscript.FormatType; + + if ( format == 0x00020000L ) + { + TT_Post_20 table = &names->names.format_20; + FT_UShort n; + + + FT_FREE( table->glyph_indices ); + table->num_glyphs = 0; + + for ( n = 0; n < table->num_names; n++ ) + FT_FREE( table->glyph_names[n] ); + + FT_FREE( table->glyph_names ); + table->num_names = 0; + } + else if ( format == 0x00028000L ) + { + TT_Post_25 table = &names->names.format_25; + + + FT_FREE( table->offsets ); + table->num_glyphs = 0; + } + } + names->loaded = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_get_ps_name */ + /* */ + /* <Description> */ + /* Get the PostScript glyph name of a glyph. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face. */ + /* */ + /* idx :: The glyph index. */ + /* */ + /* <InOut> */ + /* PSname :: The address of a string pointer. Will be NULL in case */ + /* of error, otherwise it is a pointer to the glyph name. */ + /* */ + /* You must not modify the returned string! */ + /* */ + /* <Output> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_get_ps_name( TT_Face face, + FT_UInt idx, + FT_String** PSname ) + { + FT_Error error; + TT_Post_Names names; + FT_Fixed format; + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Service_PsCMaps psnames; +#endif + + + if ( !face ) + return SFNT_Err_Invalid_Face_Handle; + + if ( idx >= (FT_UInt)face->max_profile.numGlyphs ) + return SFNT_Err_Invalid_Glyph_Index; + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + psnames = (FT_Service_PsCMaps)face->psnames; + if ( !psnames ) + return SFNT_Err_Unimplemented_Feature; +#endif + + names = &face->postscript_names; + + /* `.notdef' by default */ + *PSname = MAC_NAME( 0 ); + + format = face->postscript.FormatType; + + if ( format == 0x00010000L ) + { + if ( idx < 258 ) /* paranoid checking */ + *PSname = MAC_NAME( idx ); + } + else if ( format == 0x00020000L ) + { + TT_Post_20 table = &names->names.format_20; + + + if ( !names->loaded ) + { + error = load_post_names( face ); + if ( error ) + goto End; + } + + if ( idx < (FT_UInt)table->num_glyphs ) + { + FT_UShort name_index = table->glyph_indices[idx]; + + + if ( name_index < 258 ) + *PSname = MAC_NAME( name_index ); + else + *PSname = (FT_String*)table->glyph_names[name_index - 258]; + } + } + else if ( format == 0x00028000L ) + { + TT_Post_25 table = &names->names.format_25; + + + if ( !names->loaded ) + { + error = load_post_names( face ); + if ( error ) + goto End; + } + + if ( idx < (FT_UInt)table->num_glyphs ) /* paranoid checking */ + { + idx += table->offsets[idx]; + *PSname = MAC_NAME( idx ); + } + } + + /* nothing to do for format == 0x00030000L */ + + End: + return SFNT_Err_Ok; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttpost.h b/android/jni/ndk_modules/freetype/src/sfnt/ttpost.h new file mode 100644 index 00000000..6f06d75a --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttpost.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* ttpost.h */ +/* */ +/* Postcript name table processing for TrueType and OpenType fonts */ +/* (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTPOST_H__ +#define __TTPOST_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_get_ps_name( TT_Face face, + FT_UInt idx, + FT_String** PSname ); + + FT_LOCAL( void ) + tt_face_free_ps_names( TT_Face face ); + + +FT_END_HEADER + +#endif /* __TTPOST_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttsbit.c b/android/jni/ndk_modules/freetype/src/sfnt/ttsbit.c new file mode 100644 index 00000000..faa8f88f --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttsbit.c @@ -0,0 +1,1508 @@ +/***************************************************************************/ +/* */ +/* ttsbit.c */ +/* */ +/* TrueType and OpenType embedded bitmap support (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H + + /* + * Alas, the memory-optimized sbit loader can't be used when implementing + * the `old internals' hack + */ +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + +#include "ttsbit0.c" + +#else /* FT_CONFIG_OPTION_OLD_INTERNALS */ + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttsbit.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttsbit + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* blit_sbit */ + /* */ + /* <Description> */ + /* Blits a bitmap from an input stream into a given target. Supports */ + /* x and y offsets as well as byte padded lines. */ + /* */ + /* <Input> */ + /* target :: The target bitmap/pixmap. */ + /* */ + /* source :: The input packed bitmap data. */ + /* */ + /* line_bits :: The number of bits per line. */ + /* */ + /* byte_padded :: A flag which is true if lines are byte-padded. */ + /* */ + /* x_offset :: The horizontal offset. */ + /* */ + /* y_offset :: The vertical offset. */ + /* */ + /* <Note> */ + /* IMPORTANT: The x and y offsets are relative to the top corner of */ + /* the target bitmap (unlike the normal TrueType */ + /* convention). A positive y offset indicates a downwards */ + /* direction! */ + /* */ + static void + blit_sbit( FT_Bitmap* target, + FT_Byte* source, + FT_Int line_bits, + FT_Bool byte_padded, + FT_Int x_offset, + FT_Int y_offset, + FT_Int source_height ) + { + FT_Byte* line_buff; + FT_Int line_incr; + FT_Int height; + + FT_UShort acc; + FT_UInt loaded; + + + /* first of all, compute starting write position */ + line_incr = target->pitch; + line_buff = target->buffer; + + if ( line_incr < 0 ) + line_buff -= line_incr * ( target->rows - 1 ); + + line_buff += ( x_offset >> 3 ) + y_offset * line_incr; + + /***********************************************************************/ + /* */ + /* We use the extra-classic `accumulator' trick to extract the bits */ + /* from the source byte stream. */ + /* */ + /* Namely, the variable `acc' is a 16-bit accumulator containing the */ + /* last `loaded' bits from the input stream. The bits are shifted to */ + /* the upmost position in `acc'. */ + /* */ + /***********************************************************************/ + + acc = 0; /* clear accumulator */ + loaded = 0; /* no bits were loaded */ + + for ( height = source_height; height > 0; height-- ) + { + FT_Byte* cur = line_buff; /* current write cursor */ + FT_Int count = line_bits; /* # of bits to extract per line */ + FT_Byte shift = (FT_Byte)( x_offset & 7 ); /* current write shift */ + FT_Byte space = (FT_Byte)( 8 - shift ); + + + /* first of all, read individual source bytes */ + if ( count >= 8 ) + { + count -= 8; + { + do + { + FT_Byte val; + + + /* ensure that there are at least 8 bits in the accumulator */ + if ( loaded < 8 ) + { + acc |= (FT_UShort)((FT_UShort)*source++ << ( 8 - loaded )); + loaded += 8; + } + + /* now write one byte */ + val = (FT_Byte)( acc >> 8 ); + if ( shift ) + { + cur[0] |= (FT_Byte)( val >> shift ); + cur[1] |= (FT_Byte)( val << space ); + } + else + cur[0] |= val; + + cur++; + acc <<= 8; /* remove bits from accumulator */ + loaded -= 8; + count -= 8; + + } while ( count >= 0 ); + } + + /* restore `count' to correct value */ + count += 8; + } + + /* now write remaining bits (count < 8) */ + if ( count > 0 ) + { + FT_Byte val; + + + /* ensure that there are at least `count' bits in the accumulator */ + if ( (FT_Int)loaded < count ) + { + acc |= (FT_UShort)((FT_UShort)*source++ << ( 8 - loaded )); + loaded += 8; + } + + /* now write remaining bits */ + val = (FT_Byte)( ( (FT_Byte)( acc >> 8 ) ) & ~( 0xFF >> count ) ); + cur[0] |= (FT_Byte)( val >> shift ); + + if ( count > space ) + cur[1] |= (FT_Byte)( val << space ); + + acc <<= count; + loaded -= count; + } + + /* now, skip to next line */ + if ( byte_padded ) + { + acc = 0; + loaded = 0; /* clear accumulator on byte-padded lines */ + } + + line_buff += line_incr; + } + } + + + static const FT_Frame_Field sbit_metrics_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_MetricsRec + + FT_FRAME_START( 8 ), + FT_FRAME_BYTE( height ), + FT_FRAME_BYTE( width ), + + FT_FRAME_CHAR( horiBearingX ), + FT_FRAME_CHAR( horiBearingY ), + FT_FRAME_BYTE( horiAdvance ), + + FT_FRAME_CHAR( vertBearingX ), + FT_FRAME_CHAR( vertBearingY ), + FT_FRAME_BYTE( vertAdvance ), + FT_FRAME_END + }; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_SBit_Const_Metrics */ + /* */ + /* <Description> */ + /* Loads the metrics for `EBLC' index tables format 2 and 5. */ + /* */ + /* <Input> */ + /* range :: The target range. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Load_SBit_Const_Metrics( TT_SBit_Range range, + FT_Stream stream ) + { + FT_Error error; + + + if ( FT_READ_ULONG( range->image_size ) ) + return error; + + return FT_STREAM_READ_FIELDS( sbit_metrics_fields, &range->metrics ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_SBit_Range_Codes */ + /* */ + /* <Description> */ + /* Loads the range codes for `EBLC' index tables format 4 and 5. */ + /* */ + /* <Input> */ + /* range :: The target range. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* load_offsets :: A flag whether to load the glyph offset table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Load_SBit_Range_Codes( TT_SBit_Range range, + FT_Stream stream, + FT_Bool load_offsets ) + { + FT_Error error; + FT_ULong count, n, size; + FT_Memory memory = stream->memory; + + + if ( FT_READ_ULONG( count ) ) + goto Exit; + + range->num_glyphs = count; + + /* Allocate glyph offsets table if needed */ + if ( load_offsets ) + { + if ( FT_NEW_ARRAY( range->glyph_offsets, count ) ) + goto Exit; + + size = count * 4L; + } + else + size = count * 2L; + + /* Allocate glyph codes table and access frame */ + if ( FT_NEW_ARRAY ( range->glyph_codes, count ) || + FT_FRAME_ENTER( size ) ) + goto Exit; + + for ( n = 0; n < count; n++ ) + { + range->glyph_codes[n] = FT_GET_USHORT(); + + if ( load_offsets ) + range->glyph_offsets[n] = (FT_ULong)range->image_offset + + FT_GET_USHORT(); + } + + FT_FRAME_EXIT(); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_SBit_Range */ + /* */ + /* <Description> */ + /* Loads a given `EBLC' index/range table. */ + /* */ + /* <Input> */ + /* range :: The target range. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Load_SBit_Range( TT_SBit_Range range, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + + switch( range->index_format ) + { + case 1: /* variable metrics with 4-byte offsets */ + case 3: /* variable metrics with 2-byte offsets */ + { + FT_ULong num_glyphs, n; + FT_Int size_elem; + FT_Bool large = FT_BOOL( range->index_format == 1 ); + + + + if ( range->last_glyph < range->first_glyph ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + num_glyphs = range->last_glyph - range->first_glyph + 1L; + range->num_glyphs = num_glyphs; + num_glyphs++; /* XXX: BEWARE - see spec */ + + size_elem = large ? 4 : 2; + + if ( FT_NEW_ARRAY( range->glyph_offsets, num_glyphs ) || + FT_FRAME_ENTER( num_glyphs * size_elem ) ) + goto Exit; + + for ( n = 0; n < num_glyphs; n++ ) + range->glyph_offsets[n] = (FT_ULong)( range->image_offset + + ( large ? FT_GET_ULONG() + : FT_GET_USHORT() ) ); + FT_FRAME_EXIT(); + } + break; + + case 2: /* all glyphs have identical metrics */ + error = Load_SBit_Const_Metrics( range, stream ); + break; + + case 4: + error = Load_SBit_Range_Codes( range, stream, 1 ); + break; + + case 5: + error = Load_SBit_Const_Metrics( range, stream ); + if ( !error ) + error = Load_SBit_Range_Codes( range, stream, 0 ); + break; + + default: + error = SFNT_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_eblc */ + /* */ + /* <Description> */ + /* Loads the table of embedded bitmap sizes for this face. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_eblc( TT_Face face, + FT_Stream stream ) + { + FT_Error error = SFNT_Err_Ok; + FT_Memory memory = stream->memory; + FT_Fixed version; + FT_ULong num_strikes; + FT_ULong table_base; + + static const FT_Frame_Field sbit_line_metrics_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_LineMetricsRec + + /* no FT_FRAME_START */ + FT_FRAME_CHAR( ascender ), + FT_FRAME_CHAR( descender ), + FT_FRAME_BYTE( max_width ), + + FT_FRAME_CHAR( caret_slope_numerator ), + FT_FRAME_CHAR( caret_slope_denominator ), + FT_FRAME_CHAR( caret_offset ), + + FT_FRAME_CHAR( min_origin_SB ), + FT_FRAME_CHAR( min_advance_SB ), + FT_FRAME_CHAR( max_before_BL ), + FT_FRAME_CHAR( min_after_BL ), + FT_FRAME_CHAR( pads[0] ), + FT_FRAME_CHAR( pads[1] ), + FT_FRAME_END + }; + + static const FT_Frame_Field strike_start_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_StrikeRec + + /* no FT_FRAME_START */ + FT_FRAME_ULONG( ranges_offset ), + FT_FRAME_SKIP_LONG, + FT_FRAME_ULONG( num_ranges ), + FT_FRAME_ULONG( color_ref ), + FT_FRAME_END + }; + + static const FT_Frame_Field strike_end_fields[] = + { + /* no FT_FRAME_START */ + FT_FRAME_USHORT( start_glyph ), + FT_FRAME_USHORT( end_glyph ), + FT_FRAME_BYTE ( x_ppem ), + FT_FRAME_BYTE ( y_ppem ), + FT_FRAME_BYTE ( bit_depth ), + FT_FRAME_CHAR ( flags ), + FT_FRAME_END + }; + + + face->num_sbit_strikes = 0; + + /* this table is optional */ + error = face->goto_table( face, TTAG_EBLC, stream, 0 ); + if ( error ) + error = face->goto_table( face, TTAG_bloc, stream, 0 ); + if ( error ) + goto Exit; + + table_base = FT_STREAM_POS(); + if ( FT_FRAME_ENTER( 8L ) ) + goto Exit; + + version = FT_GET_LONG(); + num_strikes = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + + /* check version number and strike count */ + if ( version != 0x00020000L || + num_strikes >= 0x10000L ) + { + FT_ERROR(( "tt_face_load_sbit_strikes: invalid table version\n" )); + error = SFNT_Err_Invalid_File_Format; + + goto Exit; + } + + /* allocate the strikes table */ + if ( FT_NEW_ARRAY( face->sbit_strikes, num_strikes ) ) + goto Exit; + + face->num_sbit_strikes = num_strikes; + + /* now read each strike table separately */ + { + TT_SBit_Strike strike = face->sbit_strikes; + FT_ULong count = num_strikes; + + + if ( FT_FRAME_ENTER( 48L * num_strikes ) ) + goto Exit; + + while ( count > 0 ) + { + if ( FT_STREAM_READ_FIELDS( strike_start_fields, strike ) || + FT_STREAM_READ_FIELDS( sbit_line_metrics_fields, &strike->hori ) || + FT_STREAM_READ_FIELDS( sbit_line_metrics_fields, &strike->vert ) || + FT_STREAM_READ_FIELDS( strike_end_fields, strike ) ) + break; + + count--; + strike++; + } + + FT_FRAME_EXIT(); + } + + /* allocate the index ranges for each strike table */ + { + TT_SBit_Strike strike = face->sbit_strikes; + FT_ULong count = num_strikes; + + + while ( count > 0 ) + { + TT_SBit_Range range; + FT_ULong count2 = strike->num_ranges; + + + /* read each range */ + if ( FT_STREAM_SEEK( table_base + strike->ranges_offset ) || + FT_FRAME_ENTER( strike->num_ranges * 8L ) ) + goto Exit; + + if ( FT_NEW_ARRAY( strike->sbit_ranges, strike->num_ranges ) ) + goto Exit; + + range = strike->sbit_ranges; + while ( count2 > 0 ) + { + range->first_glyph = FT_GET_USHORT(); + range->last_glyph = FT_GET_USHORT(); + range->table_offset = table_base + strike->ranges_offset + + FT_GET_ULONG(); + count2--; + range++; + } + + FT_FRAME_EXIT(); + + /* Now, read each index table */ + count2 = strike->num_ranges; + range = strike->sbit_ranges; + while ( count2 > 0 ) + { + /* Read the header */ + if ( FT_STREAM_SEEK( range->table_offset ) || + FT_FRAME_ENTER( 8L ) ) + goto Exit; + + range->index_format = FT_GET_USHORT(); + range->image_format = FT_GET_USHORT(); + range->image_offset = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + + error = Load_SBit_Range( range, stream ); + if ( error ) + goto Exit; + + count2--; + range++; + } + + count--; + strike++; + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_free_eblc */ + /* */ + /* <Description> */ + /* Releases the embedded bitmap tables. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + FT_LOCAL_DEF( void ) + tt_face_free_eblc( TT_Face face ) + { + FT_Memory memory = face->root.memory; + TT_SBit_Strike strike = face->sbit_strikes; + TT_SBit_Strike strike_limit = strike + face->num_sbit_strikes; + + + if ( strike ) + { + for ( ; strike < strike_limit; strike++ ) + { + TT_SBit_Range range = strike->sbit_ranges; + TT_SBit_Range range_limit = range + strike->num_ranges; + + + if ( range ) + { + for ( ; range < range_limit; range++ ) + { + /* release the glyph offsets and codes tables */ + /* where appropriate */ + FT_FREE( range->glyph_offsets ); + FT_FREE( range->glyph_codes ); + } + } + FT_FREE( strike->sbit_ranges ); + strike->num_ranges = 0; + } + FT_FREE( face->sbit_strikes ); + } + face->num_sbit_strikes = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ) + { + return FT_Match_Size( (FT_Face)face, req, 0, astrike_index ); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ) + { + TT_SBit_Strike strike; + + + if ( strike_index >= face->num_sbit_strikes ) + return SFNT_Err_Invalid_Argument; + + strike = face->sbit_strikes + strike_index; + + metrics->x_ppem = strike->x_ppem; + metrics->y_ppem = strike->y_ppem; + + metrics->ascender = strike->hori.ascender << 6; + metrics->descender = strike->hori.descender << 6; + + /* XXX: Is this correct? */ + metrics->max_advance = ( strike->hori.min_origin_SB + + strike->hori.max_width + + strike->hori.min_advance_SB ) << 6; + + metrics->height = metrics->ascender - metrics->descender; + + return SFNT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* find_sbit_range */ + /* */ + /* <Description> */ + /* Scans a given strike's ranges and return, for a given glyph */ + /* index, the corresponding sbit range, and `EBDT' offset. */ + /* */ + /* <Input> */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike :: The source/current sbit strike. */ + /* */ + /* <Output> */ + /* arange :: The sbit range containing the glyph index. */ + /* */ + /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means the glyph index was found. */ + /* */ + static FT_Error + find_sbit_range( FT_UInt glyph_index, + TT_SBit_Strike strike, + TT_SBit_Range *arange, + FT_ULong *aglyph_offset ) + { + TT_SBit_RangeRec *range, *range_limit; + + + /* check whether the glyph index is within this strike's */ + /* glyph range */ + if ( glyph_index < (FT_UInt)strike->start_glyph || + glyph_index > (FT_UInt)strike->end_glyph ) + goto Fail; + + /* scan all ranges in strike */ + range = strike->sbit_ranges; + range_limit = range + strike->num_ranges; + if ( !range ) + goto Fail; + + for ( ; range < range_limit; range++ ) + { + if ( glyph_index >= (FT_UInt)range->first_glyph && + glyph_index <= (FT_UInt)range->last_glyph ) + { + FT_UShort delta = (FT_UShort)( glyph_index - range->first_glyph ); + + + switch ( range->index_format ) + { + case 1: + case 3: + *aglyph_offset = range->glyph_offsets[delta]; + break; + + case 2: + *aglyph_offset = range->image_offset + + range->image_size * delta; + break; + + case 4: + case 5: + { + FT_ULong n; + + + for ( n = 0; n < range->num_glyphs; n++ ) + { + if ( (FT_UInt)range->glyph_codes[n] == glyph_index ) + { + if ( range->index_format == 4 ) + *aglyph_offset = range->glyph_offsets[n]; + else + *aglyph_offset = range->image_offset + + n * range->image_size; + goto Found; + } + } + } + + /* fall-through */ + default: + goto Fail; + } + + Found: + /* return successfully! */ + *arange = range; + return SFNT_Err_Ok; + } + } + + Fail: + *arange = 0; + *aglyph_offset = 0; + + return SFNT_Err_Invalid_Argument; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_find_sbit_image */ + /* */ + /* <Description> */ + /* Checks whether an embedded bitmap (an `sbit') exists for a given */ + /* glyph, at a given strike. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike_index :: The current strike index. */ + /* */ + /* <Output> */ + /* arange :: The SBit range containing the glyph index. */ + /* */ + /* astrike :: The SBit strike containing the glyph index. */ + /* */ + /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns */ + /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */ + /* glyph. */ + /* */ + FT_LOCAL( FT_Error ) + tt_find_sbit_image( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ) + { + FT_Error error; + TT_SBit_Strike strike; + + + if ( !face->sbit_strikes || + ( face->num_sbit_strikes <= strike_index ) ) + goto Fail; + + strike = &face->sbit_strikes[strike_index]; + + error = find_sbit_range( glyph_index, strike, + arange, aglyph_offset ); + if ( error ) + goto Fail; + + *astrike = strike; + + return SFNT_Err_Ok; + + Fail: + /* no embedded bitmap for this glyph in face */ + *arange = 0; + *astrike = 0; + *aglyph_offset = 0; + + return SFNT_Err_Invalid_Argument; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_load_sbit_metrics */ + /* */ + /* <Description> */ + /* Gets the big metrics for a given SBit. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* range :: The SBit range containing the glyph. */ + /* */ + /* <Output> */ + /* big_metrics :: A big SBit metrics structure for the glyph. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be positioned at the glyph's offset within */ + /* the `EBDT' table before the call. */ + /* */ + /* If the image format uses variable metrics, the stream cursor is */ + /* positioned just after the metrics header in the `EBDT' table on */ + /* function exit. */ + /* */ + FT_LOCAL( FT_Error ) + tt_load_sbit_metrics( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ) + { + FT_Error error = SFNT_Err_Ok; + + + switch ( range->image_format ) + { + case 1: + case 2: + case 8: + /* variable small metrics */ + { + TT_SBit_SmallMetricsRec smetrics; + + static const FT_Frame_Field sbit_small_metrics_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_SmallMetricsRec + + FT_FRAME_START( 5 ), + FT_FRAME_BYTE( height ), + FT_FRAME_BYTE( width ), + FT_FRAME_CHAR( bearingX ), + FT_FRAME_CHAR( bearingY ), + FT_FRAME_BYTE( advance ), + FT_FRAME_END + }; + + + /* read small metrics */ + if ( FT_STREAM_READ_FIELDS( sbit_small_metrics_fields, &smetrics ) ) + goto Exit; + + /* convert it to a big metrics */ + metrics->height = smetrics.height; + metrics->width = smetrics.width; + metrics->horiBearingX = smetrics.bearingX; + metrics->horiBearingY = smetrics.bearingY; + metrics->horiAdvance = smetrics.advance; + + /* these metrics are made up at a higher level when */ + /* needed. */ + metrics->vertBearingX = 0; + metrics->vertBearingY = 0; + metrics->vertAdvance = 0; + } + break; + + case 6: + case 7: + case 9: + /* variable big metrics */ + if ( FT_STREAM_READ_FIELDS( sbit_metrics_fields, metrics ) ) + goto Exit; + break; + + case 5: + default: /* constant metrics */ + if ( range->index_format == 2 || range->index_format == 5 ) + *metrics = range->metrics; + else + return SFNT_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* crop_bitmap */ + /* */ + /* <Description> */ + /* Crops a bitmap to its tightest bounding box, and adjusts its */ + /* metrics. */ + /* */ + /* <InOut> */ + /* map :: The bitmap. */ + /* */ + /* metrics :: The corresponding metrics structure. */ + /* */ + static void + crop_bitmap( FT_Bitmap* map, + TT_SBit_Metrics metrics ) + { + /***********************************************************************/ + /* */ + /* In this situation, some bounding boxes of embedded bitmaps are too */ + /* large. We need to crop it to a reasonable size. */ + /* */ + /* --------- */ + /* | | ----- */ + /* | *** | |***| */ + /* | * | | * | */ + /* | * | ------> | * | */ + /* | * | | * | */ + /* | * | | * | */ + /* | *** | |***| */ + /* --------- ----- */ + /* */ + /***********************************************************************/ + + FT_Int rows, count; + FT_Long line_len; + FT_Byte* line; + + + /***********************************************************************/ + /* */ + /* first of all, check the top-most lines of the bitmap, and remove */ + /* them if they're empty. */ + /* */ + { + line = (FT_Byte*)map->buffer; + rows = map->rows; + line_len = map->pitch; + + + for ( count = 0; count < rows; count++ ) + { + FT_Byte* cur = line; + FT_Byte* limit = line + line_len; + + + for ( ; cur < limit; cur++ ) + if ( cur[0] ) + goto Found_Top; + + /* the current line was empty - skip to next one */ + line = limit; + } + + Found_Top: + /* check that we have at least one filled line */ + if ( count >= rows ) + goto Empty_Bitmap; + + /* now, crop the empty upper lines */ + if ( count > 0 ) + { + line = (FT_Byte*)map->buffer; + + FT_MEM_MOVE( line, line + count * line_len, + ( rows - count ) * line_len ); + + metrics->height = (FT_Byte)( metrics->height - count ); + metrics->horiBearingY = (FT_Char)( metrics->horiBearingY - count ); + metrics->vertBearingY = (FT_Char)( metrics->vertBearingY - count ); + + map->rows -= count; + rows -= count; + } + } + + /***********************************************************************/ + /* */ + /* second, crop the lower lines */ + /* */ + { + line = (FT_Byte*)map->buffer + ( rows - 1 ) * line_len; + + for ( count = 0; count < rows; count++ ) + { + FT_Byte* cur = line; + FT_Byte* limit = line + line_len; + + + for ( ; cur < limit; cur++ ) + if ( cur[0] ) + goto Found_Bottom; + + /* the current line was empty - skip to previous one */ + line -= line_len; + } + + Found_Bottom: + if ( count > 0 ) + { + metrics->height = (FT_Byte)( metrics->height - count ); + rows -= count; + map->rows -= count; + } + } + + /***********************************************************************/ + /* */ + /* third, get rid of the space on the left side of the glyph */ + /* */ + do + { + FT_Byte* limit; + + + line = (FT_Byte*)map->buffer; + limit = line + rows * line_len; + + for ( ; line < limit; line += line_len ) + if ( line[0] & 0x80 ) + goto Found_Left; + + /* shift the whole glyph one pixel to the left */ + line = (FT_Byte*)map->buffer; + limit = line + rows * line_len; + + for ( ; line < limit; line += line_len ) + { + FT_Int n, width = map->width; + FT_Byte old; + FT_Byte* cur = line; + + + old = (FT_Byte)(cur[0] << 1); + for ( n = 8; n < width; n += 8 ) + { + FT_Byte val; + + + val = cur[1]; + cur[0] = (FT_Byte)( old | ( val >> 7 ) ); + old = (FT_Byte)( val << 1 ); + cur++; + } + cur[0] = old; + } + + map->width--; + metrics->horiBearingX++; + metrics->vertBearingX++; + metrics->width--; + + } while ( map->width > 0 ); + + Found_Left: + + /***********************************************************************/ + /* */ + /* finally, crop the bitmap width to get rid of the space on the right */ + /* side of the glyph. */ + /* */ + do + { + FT_Int right = map->width - 1; + FT_Byte* limit; + FT_Byte mask; + + + line = (FT_Byte*)map->buffer + ( right >> 3 ); + limit = line + rows * line_len; + mask = (FT_Byte)( 0x80 >> ( right & 7 ) ); + + for ( ; line < limit; line += line_len ) + if ( line[0] & mask ) + goto Found_Right; + + /* crop the whole glyph to the right */ + map->width--; + metrics->width--; + + } while ( map->width > 0 ); + + Found_Right: + /* all right, the bitmap was cropped */ + return; + + Empty_Bitmap: + map->width = 0; + map->rows = 0; + map->pitch = 0; + map->pixel_mode = FT_PIXEL_MODE_MONO; + } + + + static FT_Error + Load_SBit_Single( FT_Bitmap* map, + FT_Int x_offset, + FT_Int y_offset, + FT_Int pix_bits, + FT_UShort image_format, + TT_SBit_Metrics metrics, + FT_Stream stream ) + { + FT_Error error; + + + /* check that the source bitmap fits into the target pixmap */ + if ( x_offset < 0 || x_offset + metrics->width > map->width || + y_offset < 0 || y_offset + metrics->height > map->rows ) + { + error = SFNT_Err_Invalid_Argument; + + goto Exit; + } + + { + FT_Int glyph_width = metrics->width; + FT_Int glyph_height = metrics->height; + FT_Int glyph_size; + FT_Int line_bits = pix_bits * glyph_width; + FT_Bool pad_bytes = 0; + + + /* compute size of glyph image */ + switch ( image_format ) + { + case 1: /* byte-padded formats */ + case 6: + { + FT_Int line_length; + + + switch ( pix_bits ) + { + case 1: + line_length = ( glyph_width + 7 ) >> 3; + break; + case 2: + line_length = ( glyph_width + 3 ) >> 2; + break; + case 4: + line_length = ( glyph_width + 1 ) >> 1; + break; + default: + line_length = glyph_width; + } + + glyph_size = glyph_height * line_length; + pad_bytes = 1; + } + break; + + case 2: + case 5: + case 7: + line_bits = glyph_width * pix_bits; + glyph_size = ( glyph_height * line_bits + 7 ) >> 3; + break; + + default: /* invalid format */ + return SFNT_Err_Invalid_File_Format; + } + + /* Now read data and draw glyph into target pixmap */ + if ( FT_FRAME_ENTER( glyph_size ) ) + goto Exit; + + /* don't forget to multiply `x_offset' by `map->pix_bits' as */ + /* the sbit blitter doesn't make a difference between pixmap */ + /* depths. */ + blit_sbit( map, (FT_Byte*)stream->cursor, line_bits, pad_bytes, + x_offset * pix_bits, y_offset, metrics->height ); + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + static FT_Error + Load_SBit_Image( TT_SBit_Strike strike, + TT_SBit_Range range, + FT_ULong ebdt_pos, + FT_ULong glyph_offset, + FT_GlyphSlot slot, + FT_Int x_offset, + FT_Int y_offset, + FT_Stream stream, + TT_SBit_Metrics metrics, + FT_Int depth ) + { + FT_Memory memory = stream->memory; + FT_Bitmap* map = &slot->bitmap; + FT_Error error; + + + /* place stream at beginning of glyph data and read metrics */ + if ( FT_STREAM_SEEK( ebdt_pos + glyph_offset ) ) + goto Exit; + + error = tt_load_sbit_metrics( stream, range, metrics ); + if ( error ) + goto Exit; + + /* This function is recursive. At the top-level call, we */ + /* compute the dimensions of the higher-level glyph to */ + /* allocate the final pixmap buffer. */ + if ( depth == 0 ) + { + FT_Long size; + + + map->width = metrics->width; + map->rows = metrics->height; + + switch ( strike->bit_depth ) + { + case 1: + map->pixel_mode = FT_PIXEL_MODE_MONO; + map->pitch = ( map->width + 7 ) >> 3; + break; + + case 2: + map->pixel_mode = FT_PIXEL_MODE_GRAY2; + map->pitch = ( map->width + 3 ) >> 2; + break; + + case 4: + map->pixel_mode = FT_PIXEL_MODE_GRAY4; + map->pitch = ( map->width + 1 ) >> 1; + break; + + case 8: + map->pixel_mode = FT_PIXEL_MODE_GRAY; + map->pitch = map->width; + break; + + default: + return SFNT_Err_Invalid_File_Format; + } + + size = map->rows * map->pitch; + + /* check that there is no empty image */ + if ( size == 0 ) + goto Exit; /* exit successfully! */ + + error = ft_glyphslot_alloc_bitmap( slot, size ); + if (error) + goto Exit; + } + + switch ( range->image_format ) + { + case 1: /* single sbit image - load it */ + case 2: + case 5: + case 6: + case 7: + return Load_SBit_Single( map, x_offset, y_offset, strike->bit_depth, + range->image_format, metrics, stream ); + + case 8: /* compound format */ + if ( FT_STREAM_SKIP( 1L ) ) + { + error = SFNT_Err_Invalid_Stream_Skip; + goto Exit; + } + /* fallthrough */ + + case 9: + break; + + default: /* invalid image format */ + return SFNT_Err_Invalid_File_Format; + } + + /* All right, we have a compound format. First of all, read */ + /* the array of elements. */ + { + TT_SBit_Component components; + TT_SBit_Component comp; + FT_UShort num_components, count; + + + if ( FT_READ_USHORT( num_components ) || + FT_NEW_ARRAY( components, num_components ) ) + goto Exit; + + count = num_components; + + if ( FT_FRAME_ENTER( 4L * num_components ) ) + goto Fail_Memory; + + for ( comp = components; count > 0; count--, comp++ ) + { + comp->glyph_code = FT_GET_USHORT(); + comp->x_offset = FT_GET_CHAR(); + comp->y_offset = FT_GET_CHAR(); + } + + FT_FRAME_EXIT(); + + /* Now recursively load each element glyph */ + count = num_components; + comp = components; + for ( ; count > 0; count--, comp++ ) + { + TT_SBit_Range elem_range; + TT_SBit_MetricsRec elem_metrics; + FT_ULong elem_offset; + + + /* find the range for this element */ + error = find_sbit_range( comp->glyph_code, + strike, + &elem_range, + &elem_offset ); + if ( error ) + goto Fail_Memory; + + /* now load the element, recursively */ + error = Load_SBit_Image( strike, + elem_range, + ebdt_pos, + elem_offset, + slot, + x_offset + comp->x_offset, + y_offset + comp->y_offset, + stream, + &elem_metrics, + depth + 1 ); + if ( error ) + goto Fail_Memory; + } + + Fail_Memory: + FT_FREE( components ); + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_sbit_image */ + /* */ + /* <Description> */ + /* Loads a given glyph sbit image from the font resource. This also */ + /* returns its metrics. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* strike_index :: The current strike index. */ + /* */ + /* glyph_index :: The current glyph index. */ + /* */ + /* load_flags :: The glyph load flags (the code checks for the flag */ + /* FT_LOAD_CROP_BITMAP). */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Output> */ + /* map :: The target pixmap. */ + /* */ + /* metrics :: A big sbit metrics structure for the glyph image. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* glyph sbit exists for the index. */ + /* */ + /* <Note> */ + /* The `map.buffer' field is always freed before the glyph is loaded. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ) + { + FT_Error error; + FT_ULong ebdt_pos, glyph_offset; + + TT_SBit_Strike strike; + TT_SBit_Range range; + + + /* Check whether there is a glyph sbit for the current index */ + error = tt_find_sbit_image( face, glyph_index, strike_index, + &range, &strike, &glyph_offset ); + if ( error ) + goto Exit; + + /* now, find the location of the `EBDT' table in */ + /* the font file */ + error = face->goto_table( face, TTAG_EBDT, stream, 0 ); + if ( error ) + error = face->goto_table( face, TTAG_bdat, stream, 0 ); + if ( error ) + goto Exit; + + ebdt_pos = FT_STREAM_POS(); + + error = Load_SBit_Image( strike, range, ebdt_pos, glyph_offset, + face->root.glyph, 0, 0, stream, metrics, 0 ); + if ( error ) + goto Exit; + + /* setup vertical metrics if needed */ + if ( strike->flags & 1 ) + { + /* in case of a horizontal strike only */ + FT_Int advance; + + + advance = strike->hori.ascender - strike->hori.descender; + + /* some heuristic values */ + + metrics->vertBearingX = (FT_Char)(-metrics->width / 2 ); + metrics->vertBearingY = (FT_Char)( ( advance - metrics->height ) / 2 ); + metrics->vertAdvance = (FT_Char)( advance * 12 / 10 ); + } + + /* Crop the bitmap now, unless specified otherwise */ + if ( load_flags & FT_LOAD_CROP_BITMAP ) + crop_bitmap( map, metrics ); + + Exit: + return error; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttsbit.h b/android/jni/ndk_modules/freetype/src/sfnt/ttsbit.h new file mode 100644 index 00000000..7ea2af18 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttsbit.h @@ -0,0 +1,79 @@ +/***************************************************************************/ +/* */ +/* ttsbit.h */ +/* */ +/* TrueType and OpenType embedded bitmap support (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTSBIT_H__ +#define __TTSBIT_H__ + + +#include <ft2build.h> +#include "ttload.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_eblc( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_eblc( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ); + + FT_LOCAL( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ); + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_LOCAL( FT_Error ) + tt_find_sbit_image( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ); + + FT_LOCAL( FT_Error ) + tt_load_sbit_metrics( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_LOCAL( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ); + + +FT_END_HEADER + +#endif /* __TTSBIT_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttsbit0.c b/android/jni/ndk_modules/freetype/src/sfnt/ttsbit0.c new file mode 100644 index 00000000..38bcf210 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/sfnt/ttsbit0.c @@ -0,0 +1,1011 @@ +/***************************************************************************/ +/* */ +/* ttsbit0.c */ +/* */ +/* TrueType and OpenType embedded bitmap support (body). */ +/* This is a heap-optimized version. */ +/* */ +/* Copyright 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +/* This file is included by ttsbit.c */ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttsbit.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttsbit + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_eblc( TT_Face face, + FT_Stream stream ) + { + FT_Error error = SFNT_Err_Ok; + FT_Fixed version; + FT_ULong num_strikes, table_size; + FT_Byte* p; + FT_Byte* p_limit; + FT_UInt count; + + + face->sbit_num_strikes = 0; + + /* this table is optional */ + error = face->goto_table( face, TTAG_EBLC, stream, &table_size ); + if ( error ) + error = face->goto_table( face, TTAG_bloc, stream, &table_size ); + if ( error ) + goto Exit; + + if ( table_size < 8 ) + { + FT_ERROR(( "tt_face_load_sbit_strikes: table too short\n" )); + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) ) + goto Exit; + + face->sbit_table_size = table_size; + + p = face->sbit_table; + p_limit = p + table_size; + + version = FT_NEXT_ULONG( p ); + num_strikes = FT_NEXT_ULONG( p ); + + if ( version != 0x00020000UL || num_strikes >= 0x10000UL ) + { + FT_ERROR(( "tt_face_load_sbit_strikes: invalid table version\n" )); + error = SFNT_Err_Invalid_File_Format; + goto Fail; + } + + /* + * Count the number of strikes available in the table. We are a bit + * paranoid there and don't trust the data. + */ + count = (FT_UInt)num_strikes; + if ( 8 + 48UL * count > table_size ) + count = (FT_UInt)( ( p_limit - p ) / 48 ); + + face->sbit_num_strikes = count; + + FT_TRACE3(( "sbit_num_strikes: %u\n", count )); + Exit: + return error; + + Fail: + FT_FRAME_RELEASE( face->sbit_table ); + face->sbit_table_size = 0; + goto Exit; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_eblc( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->sbit_table ); + face->sbit_table_size = 0; + face->sbit_num_strikes = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ) + { + return FT_Match_Size( (FT_Face)face, req, 0, astrike_index ); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ) + { + FT_Byte* strike; + + + if ( strike_index >= (FT_ULong)face->sbit_num_strikes ) + return SFNT_Err_Invalid_Argument; + + strike = face->sbit_table + 8 + strike_index * 48; + + metrics->x_ppem = (FT_UShort)strike[44]; + metrics->y_ppem = (FT_UShort)strike[45]; + + metrics->ascender = (FT_Char)strike[16] << 6; /* hori.ascender */ + metrics->descender = (FT_Char)strike[17] << 6; /* hori.descender */ + metrics->height = metrics->ascender - metrics->descender; + + /* XXX: Is this correct? */ + metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB */ + strike[18] + /* max_width */ + (FT_Char)strike[23] /* min_advance_SB */ + ) << 6; + + return SFNT_Err_Ok; + } + + + typedef struct TT_SBitDecoderRec_ + { + TT_Face face; + FT_Stream stream; + FT_Bitmap* bitmap; + TT_SBit_Metrics metrics; + FT_Bool metrics_loaded; + FT_Bool bitmap_allocated; + FT_Byte bit_depth; + + FT_ULong ebdt_start; + FT_ULong ebdt_size; + + FT_ULong strike_index_array; + FT_ULong strike_index_count; + FT_Byte* eblc_base; + FT_Byte* eblc_limit; + + } TT_SBitDecoderRec, *TT_SBitDecoder; + + + static FT_Error + tt_sbit_decoder_init( TT_SBitDecoder decoder, + TT_Face face, + FT_ULong strike_index, + TT_SBit_MetricsRec* metrics ) + { + FT_Error error; + FT_Stream stream = face->root.stream; + FT_ULong ebdt_size; + + + error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size ); + if ( error ) + error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size ); + if ( error ) + goto Exit; + + decoder->face = face; + decoder->stream = stream; + decoder->bitmap = &face->root.glyph->bitmap; + decoder->metrics = metrics; + + decoder->metrics_loaded = 0; + decoder->bitmap_allocated = 0; + + decoder->ebdt_start = FT_STREAM_POS(); + decoder->ebdt_size = ebdt_size; + + decoder->eblc_base = face->sbit_table; + decoder->eblc_limit = face->sbit_table + face->sbit_table_size; + + /* now find the strike corresponding to the index */ + { + FT_Byte* p; + + + if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + p = decoder->eblc_base + 8 + 48 * strike_index; + + decoder->strike_index_array = FT_NEXT_ULONG( p ); + p += 4; + decoder->strike_index_count = FT_NEXT_ULONG( p ); + p += 34; + decoder->bit_depth = *p; + + if ( decoder->strike_index_array > face->sbit_table_size || + decoder->strike_index_array + 8 * decoder->strike_index_count > + face->sbit_table_size ) + error = SFNT_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + static void + tt_sbit_decoder_done( TT_SBitDecoder decoder ) + { + FT_UNUSED( decoder ); + } + + + static FT_Error + tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder decoder ) + { + FT_Error error = SFNT_Err_Ok; + FT_UInt width, height; + FT_Bitmap* map = decoder->bitmap; + FT_Long size; + + + if ( !decoder->metrics_loaded ) + { + error = SFNT_Err_Invalid_Argument; + goto Exit; + } + + width = decoder->metrics->width; + height = decoder->metrics->height; + + map->width = (int)width; + map->rows = (int)height; + + switch ( decoder->bit_depth ) + { + case 1: + map->pixel_mode = FT_PIXEL_MODE_MONO; + map->pitch = ( map->width + 7 ) >> 3; + break; + + case 2: + map->pixel_mode = FT_PIXEL_MODE_GRAY2; + map->pitch = ( map->width + 3 ) >> 2; + break; + + case 4: + map->pixel_mode = FT_PIXEL_MODE_GRAY4; + map->pitch = ( map->width + 1 ) >> 1; + break; + + case 8: + map->pixel_mode = FT_PIXEL_MODE_GRAY; + map->pitch = map->width; + break; + + default: + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + size = map->rows * map->pitch; + + /* check that there is no empty image */ + if ( size == 0 ) + goto Exit; /* exit successfully! */ + + error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size ); + if ( error ) + goto Exit; + + decoder->bitmap_allocated = 1; + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_metrics( TT_SBitDecoder decoder, + FT_Byte* *pp, + FT_Byte* limit, + FT_Bool big ) + { + FT_Byte* p = *pp; + TT_SBit_Metrics metrics = decoder->metrics; + + + if ( p + 5 > limit ) + goto Fail; + + metrics->height = p[0]; + metrics->width = p[1]; + metrics->horiBearingX = (FT_Char)p[2]; + metrics->horiBearingY = (FT_Char)p[3]; + metrics->horiAdvance = p[4]; + + p += 5; + if ( big ) + { + if ( p + 3 > limit ) + goto Fail; + + metrics->vertBearingX = (FT_Char)p[0]; + metrics->vertBearingY = (FT_Char)p[1]; + metrics->vertAdvance = p[2]; + + p += 3; + } + + decoder->metrics_loaded = 1; + *pp = p; + return SFNT_Err_Ok; + + Fail: + return SFNT_Err_Invalid_Argument; + } + + + /* forward declaration */ + static FT_Error + tt_sbit_decoder_load_image( TT_SBitDecoder decoder, + FT_UInt glyph_index, + FT_Int x_pos, + FT_Int y_pos ); + + typedef FT_Error (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* plimit, + FT_Int x_pos, + FT_Int y_pos ); + + + static FT_Error + tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos ) + { + FT_Error error = SFNT_Err_Ok; + FT_Byte* line; + FT_Int bit_height, bit_width, pitch, width, height, h; + FT_Bitmap* bitmap; + + + if ( !decoder->bitmap_allocated ) + { + error = tt_sbit_decoder_alloc_bitmap( decoder ); + if ( error ) + goto Exit; + } + + /* check that we can write the glyph into the bitmap */ + bitmap = decoder->bitmap; + bit_width = bitmap->width; + bit_height = bitmap->rows; + pitch = bitmap->pitch; + line = bitmap->buffer; + + width = decoder->metrics->width; + height = decoder->metrics->height; + + if ( x_pos < 0 || x_pos + width > bit_width || + y_pos < 0 || y_pos + height > bit_height ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( p + ( ( width + 7 ) >> 3 ) * height > limit ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + /* now do the blit */ + line += y_pos * pitch + ( x_pos >> 3 ); + x_pos &= 7; + + if ( x_pos == 0 ) /* the easy one */ + { + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* write = line; + FT_Int w; + + + for ( w = width; w >= 8; w -= 8 ) + { + write[0] = (FT_Byte)( write[0] | *p++ ); + write += 1; + } + + if ( w > 0 ) + write[0] = (FT_Byte)( write[0] | ( *p++ & ( 0xFF00U >> w ) ) ); + } + } + else /* x_pos > 0 */ + { + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* write = line; + FT_Int w; + FT_UInt wval = 0; + + + for ( w = width; w >= 8; w -= 8 ) + { + wval = (FT_UInt)( wval | *p++ ); + write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) ); + write += 1; + wval <<= 8; + } + + if ( w > 0 ) + wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) ); + + /* all bits read and there are `x_pos + w' bits to be written */ + + write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) ); + + if ( x_pos + w > 8 ) + { + write++; + wval <<= 8; + write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) ); + } + } + } + + Exit: + return error; + } + + + /* + * Load a bit-aligned bitmap (with pointer `p') into a line-aligned bitmap + * (with pointer `write'). In the example below, the width is 3 pixel, + * and `x_pos' is 1 pixel. + * + * p p+1 + * | | | + * | 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |... + * | | | + * +-------+ +-------+ +-------+ ... + * . . . + * . . . + * v . . + * +-------+ . . + * | | . + * | 7 6 5 4 3 2 1 0 | . + * | | . + * write . . + * . . + * v . + * +-------+ . + * | | + * | 7 6 5 4 3 2 1 0 | + * | | + * write+1 . + * . + * v + * +-------+ + * | | + * | 7 6 5 4 3 2 1 0 | + * | | + * write+2 + * + */ + + static FT_Error + tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos ) + { + FT_Error error = SFNT_Err_Ok; + FT_Byte* line; + FT_Int bit_height, bit_width, pitch, width, height, h, nbits; + FT_Bitmap* bitmap; + FT_UShort rval; + + + if ( !decoder->bitmap_allocated ) + { + error = tt_sbit_decoder_alloc_bitmap( decoder ); + if ( error ) + goto Exit; + } + + /* check that we can write the glyph into the bitmap */ + bitmap = decoder->bitmap; + bit_width = bitmap->width; + bit_height = bitmap->rows; + pitch = bitmap->pitch; + line = bitmap->buffer; + + width = decoder->metrics->width; + height = decoder->metrics->height; + + if ( x_pos < 0 || x_pos + width > bit_width || + y_pos < 0 || y_pos + height > bit_height ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( p + ( ( width * height + 7 ) >> 3 ) > limit ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + /* now do the blit */ + + /* adjust `line' to point to the first byte of the bitmap */ + line += y_pos * pitch + ( x_pos >> 3 ); + x_pos &= 7; + + /* the higher byte of `rval' is used as a buffer */ + rval = 0; + nbits = 0; + + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* write = line; + FT_Int w = width; + + + /* handle initial byte (in target bitmap) specially if necessary */ + if ( x_pos ) + { + w = ( width < 8 - x_pos ) ? width : 8 - x_pos; + + if ( h == height ) + { + rval = *p++; + nbits = x_pos; + } + else if ( nbits < w ) + { + if ( p < limit ) + rval |= *p++; + nbits += 8 - w; + } + else + { + rval >>= 8; + nbits -= w; + } + + *write++ |= ( ( rval >> nbits ) & 0xFF ) & + ( ~( 0xFF << w ) << ( 8 - w - x_pos ) ); + rval <<= 8; + + w = width - w; + } + + /* handle medial bytes */ + for ( ; w >= 8; w -= 8 ) + { + rval |= *p++; + *write++ |= ( rval >> nbits ) & 0xFF; + + rval <<= 8; + } + + /* handle final byte if necessary */ + if ( w > 0 ) + { + if ( nbits < w ) + { + if ( p < limit ) + rval |= *p++; + *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); + nbits += 8 - w; + + rval <<= 8; + } + else + { + *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); + nbits -= w; + } + } + } + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_compound( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos ) + { + FT_Error error = SFNT_Err_Ok; + FT_UInt num_components, nn; + + FT_Char horiBearingX = decoder->metrics->horiBearingX; + FT_Char horiBearingY = decoder->metrics->horiBearingY; + FT_Byte horiAdvance = decoder->metrics->horiAdvance; + FT_Char vertBearingX = decoder->metrics->vertBearingX; + FT_Char vertBearingY = decoder->metrics->vertBearingY; + FT_Byte vertAdvance = decoder->metrics->vertAdvance; + + + if ( p + 2 > limit ) + goto Fail; + + num_components = FT_NEXT_USHORT( p ); + if ( p + 4 * num_components > limit ) + goto Fail; + + if ( !decoder->bitmap_allocated ) + { + error = tt_sbit_decoder_alloc_bitmap( decoder ); + if ( error ) + goto Exit; + } + + for ( nn = 0; nn < num_components; nn++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + FT_Byte dx = FT_NEXT_BYTE( p ); + FT_Byte dy = FT_NEXT_BYTE( p ); + + + /* NB: a recursive call */ + error = tt_sbit_decoder_load_image( decoder, gindex, + x_pos + dx, y_pos + dy ); + if ( error ) + break; + } + + decoder->metrics->horiBearingX = horiBearingX; + decoder->metrics->horiBearingY = horiBearingY; + decoder->metrics->horiAdvance = horiAdvance; + decoder->metrics->vertBearingX = vertBearingX; + decoder->metrics->vertBearingY = vertBearingY; + decoder->metrics->vertAdvance = vertAdvance; + decoder->metrics->width = (FT_UInt)decoder->bitmap->width; + decoder->metrics->height = (FT_UInt)decoder->bitmap->rows; + + Exit: + return error; + + Fail: + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + + static FT_Error + tt_sbit_decoder_load_bitmap( TT_SBitDecoder decoder, + FT_UInt glyph_format, + FT_ULong glyph_start, + FT_ULong glyph_size, + FT_Int x_pos, + FT_Int y_pos ) + { + FT_Error error; + FT_Stream stream = decoder->stream; + FT_Byte* p; + FT_Byte* p_limit; + FT_Byte* data; + + + /* seek into the EBDT table now */ + if ( glyph_start + glyph_size > decoder->ebdt_size ) + { + error = SFNT_Err_Invalid_Argument; + goto Exit; + } + + if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) || + FT_FRAME_EXTRACT( glyph_size, data ) ) + goto Exit; + + p = data; + p_limit = p + glyph_size; + + /* read the data, depending on the glyph format */ + switch ( glyph_format ) + { + case 1: + case 2: + case 8: + error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 ); + break; + + case 6: + case 7: + case 9: + error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ); + break; + + default: + error = SFNT_Err_Ok; + } + + if ( error ) + goto Fail; + + { + TT_SBitDecoder_LoadFunc loader; + + + switch ( glyph_format ) + { + case 1: + case 6: + loader = tt_sbit_decoder_load_byte_aligned; + break; + + case 2: + case 5: + case 7: + loader = tt_sbit_decoder_load_bit_aligned; + break; + + case 8: + if ( p + 1 > p_limit ) + goto Fail; + + p += 1; /* skip padding */ + /* fall-through */ + + case 9: + loader = tt_sbit_decoder_load_compound; + break; + + default: + goto Fail; + } + + error = loader( decoder, p, p_limit, x_pos, y_pos ); + } + + Fail: + FT_FRAME_RELEASE( data ); + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_image( TT_SBitDecoder decoder, + FT_UInt glyph_index, + FT_Int x_pos, + FT_Int y_pos ) + { + /* + * First, we find the correct strike range that applies to this + * glyph index. + */ + + FT_Byte* p = decoder->eblc_base + decoder->strike_index_array; + FT_Byte* p_limit = decoder->eblc_limit; + FT_ULong num_ranges = decoder->strike_index_count; + FT_UInt start, end, index_format, image_format; + FT_ULong image_start = 0, image_end = 0, image_offset; + + + for ( ; num_ranges > 0; num_ranges-- ) + { + start = FT_NEXT_USHORT( p ); + end = FT_NEXT_USHORT( p ); + + if ( glyph_index >= start && glyph_index <= end ) + goto FoundRange; + + p += 4; /* ignore index offset */ + } + goto NoBitmap; + + FoundRange: + image_offset = FT_NEXT_ULONG( p ); + + /* overflow check */ + if ( decoder->eblc_base + decoder->strike_index_array + image_offset < + decoder->eblc_base ) + goto Failure; + + p = decoder->eblc_base + decoder->strike_index_array + image_offset; + if ( p + 8 > p_limit ) + goto NoBitmap; + + /* now find the glyph's location and extend within the ebdt table */ + index_format = FT_NEXT_USHORT( p ); + image_format = FT_NEXT_USHORT( p ); + image_offset = FT_NEXT_ULONG ( p ); + + switch ( index_format ) + { + case 1: /* 4-byte offsets relative to `image_offset' */ + { + p += 4 * ( glyph_index - start ); + if ( p + 8 > p_limit ) + goto NoBitmap; + + image_start = FT_NEXT_ULONG( p ); + image_end = FT_NEXT_ULONG( p ); + + if ( image_start == image_end ) /* missing glyph */ + goto NoBitmap; + } + break; + + case 2: /* big metrics, constant image size */ + { + FT_ULong image_size; + + + if ( p + 12 > p_limit ) + goto NoBitmap; + + image_size = FT_NEXT_ULONG( p ); + + if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) + goto NoBitmap; + + image_start = image_size * ( glyph_index - start ); + image_end = image_start + image_size; + } + break; + + case 3: /* 2-byte offsets relative to 'image_offset' */ + { + p += 2 * ( glyph_index - start ); + if ( p + 4 > p_limit ) + goto NoBitmap; + + image_start = FT_NEXT_USHORT( p ); + image_end = FT_NEXT_USHORT( p ); + + if ( image_start == image_end ) /* missing glyph */ + goto NoBitmap; + } + break; + + case 4: /* sparse glyph array with (glyph,offset) pairs */ + { + FT_ULong mm, num_glyphs; + + + if ( p + 4 > p_limit ) + goto NoBitmap; + + num_glyphs = FT_NEXT_ULONG( p ); + + /* overflow check */ + if ( p + ( num_glyphs + 1 ) * 4 < p ) + goto Failure; + + if ( p + ( num_glyphs + 1 ) * 4 > p_limit ) + goto NoBitmap; + + for ( mm = 0; mm < num_glyphs; mm++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex == glyph_index ) + { + image_start = FT_NEXT_USHORT( p ); + p += 2; + image_end = FT_PEEK_USHORT( p ); + break; + } + p += 2; + } + + if ( mm >= num_glyphs ) + goto NoBitmap; + } + break; + + case 5: /* constant metrics with sparse glyph codes */ + { + FT_ULong image_size, mm, num_glyphs; + + + if ( p + 16 > p_limit ) + goto NoBitmap; + + image_size = FT_NEXT_ULONG( p ); + + if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) + goto NoBitmap; + + num_glyphs = FT_NEXT_ULONG( p ); + + /* overflow check */ + if ( p + 2 * num_glyphs < p ) + goto Failure; + + if ( p + 2 * num_glyphs > p_limit ) + goto NoBitmap; + + for ( mm = 0; mm < num_glyphs; mm++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex == glyph_index ) + break; + } + + if ( mm >= num_glyphs ) + goto NoBitmap; + + image_start = image_size * mm; + image_end = image_start + image_size; + } + break; + + default: + goto NoBitmap; + } + + if ( image_start > image_end ) + goto NoBitmap; + + image_end -= image_start; + image_start = image_offset + image_start; + + return tt_sbit_decoder_load_bitmap( decoder, + image_format, + image_start, + image_end, + x_pos, + y_pos ); + + Failure: + return SFNT_Err_Invalid_Table; + + NoBitmap: + return SFNT_Err_Invalid_Argument; + } + + + FT_LOCAL( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ) + { + TT_SBitDecoderRec decoder[1]; + FT_Error error; + + FT_UNUSED( load_flags ); + FT_UNUSED( stream ); + FT_UNUSED( map ); + + + error = tt_sbit_decoder_init( decoder, face, strike_index, metrics ); + if ( !error ) + { + error = tt_sbit_decoder_load_image( decoder, glyph_index, 0, 0 ); + tt_sbit_decoder_done( decoder ); + } + + return error; + } + +/* EOF */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftgrays.c b/android/jni/ndk_modules/freetype/src/smooth/ftgrays.c new file mode 100644 index 00000000..0b941433 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/smooth/ftgrays.c @@ -0,0 +1,2091 @@ +/***************************************************************************/ +/* */ +/* ftgrays.c */ +/* */ +/* A new `perfect' anti-aliasing renderer (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file can be compiled without the rest of the FreeType engine, by */ + /* defining the _STANDALONE_ macro when compiling it. You also need to */ + /* put the files `ftgrays.h' and `ftimage.h' into the current */ + /* compilation directory. Typically, you could do something like */ + /* */ + /* - copy `src/smooth/ftgrays.c' (this file) to your current directory */ + /* */ + /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */ + /* same directory */ + /* */ + /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in */ + /* */ + /* cc -c -D_STANDALONE_ ftgrays.c */ + /* */ + /* The renderer can be initialized with a call to */ + /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated */ + /* with a call to `ft_gray_raster.raster_render'. */ + /* */ + /* See the comments and documentation in the file `ftimage.h' for more */ + /* details on how the raster works. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* This is a new anti-aliasing scan-converter for FreeType 2. The */ + /* algorithm used here is _very_ different from the one in the standard */ + /* `ftraster' module. Actually, `ftgrays' computes the _exact_ */ + /* coverage of the outline on each pixel cell. */ + /* */ + /* It is based on ideas that I initially found in Raph Levien's */ + /* excellent LibArt graphics library (see http://www.levien.com/libart */ + /* for more information, though the web pages do not tell anything */ + /* about the renderer; you'll have to dive into the source code to */ + /* understand how it works). */ + /* */ + /* Note, however, that this is a _very_ different implementation */ + /* compared to Raph's. Coverage information is stored in a very */ + /* different way, and I don't use sorted vector paths. Also, it doesn't */ + /* use floating point values. */ + /* */ + /* This renderer has the following advantages: */ + /* */ + /* - It doesn't need an intermediate bitmap. Instead, one can supply a */ + /* callback function that will be called by the renderer to draw gray */ + /* spans on any target surface. You can thus do direct composition on */ + /* any kind of bitmap, provided that you give the renderer the right */ + /* callback. */ + /* */ + /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on */ + /* each pixel cell. */ + /* */ + /* - It performs a single pass on the outline (the `standard' FT2 */ + /* renderer makes two passes). */ + /* */ + /* - It can easily be modified to render to _any_ number of gray levels */ + /* cheaply. */ + /* */ + /* - For small (< 20) pixel sizes, it is faster than the standard */ + /* renderer. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_smooth + + +#ifdef _STANDALONE_ + + + /* define this to dump debugging information */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + +#ifdef FT_DEBUG_LEVEL_TRACE +#include <stdio.h> +#include <stdarg.h> +#endif + +#include <stddef.h> +#include <string.h> +#include <setjmp.h> +#include <limits.h> +#define FT_UINT_MAX UINT_MAX +#define FT_INT_MAX INT_MAX + +#define ft_memset memset + +#define ft_setjmp setjmp +#define ft_longjmp longjmp +#define ft_jmp_buf jmp_buf + +typedef ptrdiff_t FT_PtrDist; + + +#define ErrRaster_Invalid_Mode -2 +#define ErrRaster_Invalid_Outline -1 +#define ErrRaster_Invalid_Argument -3 +#define ErrRaster_Memory_Overflow -4 + +#define FT_BEGIN_HEADER +#define FT_END_HEADER + +#include "ftimage.h" +#include "ftgrays.h" + + + /* This macro is used to indicate that a function parameter is unused. */ + /* Its purpose is simply to reduce compiler warnings. Note also that */ + /* simply defining it as `(void)x' doesn't avoid warnings with certain */ + /* ANSI compilers (e.g. LCC). */ +#define FT_UNUSED( x ) (x) = (x) + + + /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + void + FT_Message( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + } + + /* we don't handle tracing levels in stand-alone mode; */ +#ifndef FT_TRACE5 +#define FT_TRACE5( varformat ) FT_Message varformat +#endif +#ifndef FT_TRACE7 +#define FT_TRACE7( varformat ) FT_Message varformat +#endif +#ifndef FT_ERROR +#define FT_ERROR( varformat ) FT_Message varformat +#endif + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define FT_TRACE5( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */ +#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +#define FT_DEFINE_OUTLINE_FUNCS( class_, \ + move_to_, line_to_, \ + conic_to_, cubic_to_, \ + shift_, delta_ ) \ + static const FT_Outline_Funcs class_ = \ + { \ + move_to_, \ + line_to_, \ + conic_to_, \ + cubic_to_, \ + shift_, \ + delta_ \ + }; + +#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, \ + raster_new_, raster_reset_, \ + raster_set_mode_, raster_render_, \ + raster_done_ ) \ + const FT_Raster_Funcs class_ = \ + { \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ \ + }; + +#else /* !_STANDALONE_ */ + + +#include <ft2build.h> +#include "ftgrays.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_OUTLINE_H + +#include "ftsmerrs.h" + +#include "ftspic.h" + +#define ErrRaster_Invalid_Mode Smooth_Err_Cannot_Render_Glyph +#define ErrRaster_Invalid_Outline Smooth_Err_Invalid_Outline +#define ErrRaster_Memory_Overflow Smooth_Err_Out_Of_Memory +#define ErrRaster_Invalid_Argument Smooth_Err_Invalid_Argument + +#endif /* !_STANDALONE_ */ + +#ifndef FT_MEM_SET +#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) +#endif + +#ifndef FT_MEM_ZERO +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) +#endif + + /* as usual, for the speed hungry :-) */ + +#ifndef FT_STATIC_RASTER + +#define RAS_ARG PWorker worker +#define RAS_ARG_ PWorker worker, + +#define RAS_VAR worker +#define RAS_VAR_ worker, + +#else /* FT_STATIC_RASTER */ + +#define RAS_ARG /* empty */ +#define RAS_ARG_ /* empty */ +#define RAS_VAR /* empty */ +#define RAS_VAR_ /* empty */ + +#endif /* FT_STATIC_RASTER */ + + + /* must be at least 6 bits! */ +#define PIXEL_BITS 8 + +#define ONE_PIXEL ( 1L << PIXEL_BITS ) +#define PIXEL_MASK ( -1L << PIXEL_BITS ) +#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) ) +#define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS ) +#define FLOOR( x ) ( (x) & -ONE_PIXEL ) +#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL ) +#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL ) + +#if PIXEL_BITS >= 6 +#define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) ) +#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) ) +#else +#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) ) +#define DOWNSCALE( x ) ( (x) << ( 6 - PIXEL_BITS ) ) +#endif + + + /*************************************************************************/ + /* */ + /* TYPE DEFINITIONS */ + /* */ + + /* don't change the following types to FT_Int or FT_Pos, since we might */ + /* need to define them to "float" or "double" when experimenting with */ + /* new algorithms */ + + typedef long TCoord; /* integer scanline/pixel coordinate */ + typedef long TPos; /* sub-pixel coordinate */ + + /* determine the type used to store cell areas. This normally takes at */ + /* least PIXEL_BITS*2 + 1 bits. On 16-bit systems, we need to use */ + /* `long' instead of `int', otherwise bad things happen */ + +#if PIXEL_BITS <= 7 + + typedef int TArea; + +#else /* PIXEL_BITS >= 8 */ + + /* approximately determine the size of integers using an ANSI-C header */ +#if FT_UINT_MAX == 0xFFFFU + typedef long TArea; +#else + typedef int TArea; +#endif + +#endif /* PIXEL_BITS >= 8 */ + + + /* maximal number of gray spans in a call to the span callback */ +#define FT_MAX_GRAY_SPANS 32 + + + typedef struct TCell_* PCell; + + typedef struct TCell_ + { + TPos x; /* same with TWorker.ex */ + TCoord cover; /* same with TWorker.cover */ + TArea area; + PCell next; + + } TCell; + + + typedef struct TWorker_ + { + TCoord ex, ey; + TPos min_ex, max_ex; + TPos min_ey, max_ey; + TPos count_ex, count_ey; + + TArea area; + TCoord cover; + int invalid; + + PCell cells; + FT_PtrDist max_cells; + FT_PtrDist num_cells; + + TCoord cx, cy; + TPos x, y; + + TPos last_ey; + + FT_Vector bez_stack[32 * 3 + 1]; + int lev_stack[32]; + + FT_Outline outline; + FT_Bitmap target; + FT_BBox clip_box; + + FT_Span gray_spans[FT_MAX_GRAY_SPANS]; + int num_gray_spans; + + FT_Raster_Span_Func render_span; + void* render_span_data; + int span_y; + + int band_size; + int band_shoot; + int conic_level; + int cubic_level; + + ft_jmp_buf jump_buffer; + + void* buffer; + long buffer_size; + + PCell* ycells; + TPos ycount; + + } TWorker, *PWorker; + + +#ifndef FT_STATIC_RASTER +#define ras (*worker) +#else + static TWorker ras; +#endif + + + typedef struct TRaster_ + { + void* buffer; + long buffer_size; + int band_size; + void* memory; + PWorker worker; + + } TRaster, *PRaster; + + + + /*************************************************************************/ + /* */ + /* Initialize the cells table. */ + /* */ + static void + gray_init_cells( RAS_ARG_ void* buffer, + long byte_size ) + { + ras.buffer = buffer; + ras.buffer_size = byte_size; + + ras.ycells = (PCell*) buffer; + ras.cells = NULL; + ras.max_cells = 0; + ras.num_cells = 0; + ras.area = 0; + ras.cover = 0; + ras.invalid = 1; + } + + + /*************************************************************************/ + /* */ + /* Compute the outline bounding box. */ + /* */ + static void + gray_compute_cbox( RAS_ARG ) + { + FT_Outline* outline = &ras.outline; + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + outline->n_points; + + + if ( outline->n_points <= 0 ) + { + ras.min_ex = ras.max_ex = 0; + ras.min_ey = ras.max_ey = 0; + return; + } + + ras.min_ex = ras.max_ex = vec->x; + ras.min_ey = ras.max_ey = vec->y; + + vec++; + + for ( ; vec < limit; vec++ ) + { + TPos x = vec->x; + TPos y = vec->y; + + + if ( x < ras.min_ex ) ras.min_ex = x; + if ( x > ras.max_ex ) ras.max_ex = x; + if ( y < ras.min_ey ) ras.min_ey = y; + if ( y > ras.max_ey ) ras.max_ey = y; + } + + /* truncate the bounding box to integer pixels */ + ras.min_ex = ras.min_ex >> 6; + ras.min_ey = ras.min_ey >> 6; + ras.max_ex = ( ras.max_ex + 63 ) >> 6; + ras.max_ey = ( ras.max_ey + 63 ) >> 6; + } + + + /*************************************************************************/ + /* */ + /* Record the current cell in the table. */ + /* */ + static PCell + gray_find_cell( RAS_ARG ) + { + PCell *pcell, cell; + TPos x = ras.ex; + + + if ( x > ras.count_ex ) + x = ras.count_ex; + + pcell = &ras.ycells[ras.ey]; + for (;;) + { + cell = *pcell; + if ( cell == NULL || cell->x > x ) + break; + + if ( cell->x == x ) + goto Exit; + + pcell = &cell->next; + } + + if ( ras.num_cells >= ras.max_cells ) + ft_longjmp( ras.jump_buffer, 1 ); + + cell = ras.cells + ras.num_cells++; + cell->x = x; + cell->area = 0; + cell->cover = 0; + + cell->next = *pcell; + *pcell = cell; + + Exit: + return cell; + } + + + static void + gray_record_cell( RAS_ARG ) + { + if ( !ras.invalid && ( ras.area | ras.cover ) ) + { + PCell cell = gray_find_cell( RAS_VAR ); + + + cell->area += ras.area; + cell->cover += ras.cover; + } + } + + + /*************************************************************************/ + /* */ + /* Set the current cell to a new position. */ + /* */ + static void + gray_set_cell( RAS_ARG_ TCoord ex, + TCoord ey ) + { + /* Move the cell pointer to a new position. We set the `invalid' */ + /* flag to indicate that the cell isn't part of those we're interested */ + /* in during the render phase. This means that: */ + /* */ + /* . the new vertical position must be within min_ey..max_ey-1. */ + /* . the new horizontal position must be strictly less than max_ex */ + /* */ + /* Note that if a cell is to the left of the clipping region, it is */ + /* actually set to the (min_ex-1) horizontal position. */ + + /* All cells that are on the left of the clipping region go to the */ + /* min_ex - 1 horizontal position. */ + ey -= ras.min_ey; + + if ( ex > ras.max_ex ) + ex = ras.max_ex; + + ex -= ras.min_ex; + if ( ex < 0 ) + ex = -1; + + /* are we moving to a different cell ? */ + if ( ex != ras.ex || ey != ras.ey ) + { + /* record the current one if it is valid */ + if ( !ras.invalid ) + gray_record_cell( RAS_VAR ); + + ras.area = 0; + ras.cover = 0; + } + + ras.ex = ex; + ras.ey = ey; + ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey || + ex >= ras.count_ex ); + } + + + /*************************************************************************/ + /* */ + /* Start a new contour at a given cell. */ + /* */ + static void + gray_start_cell( RAS_ARG_ TCoord ex, + TCoord ey ) + { + if ( ex > ras.max_ex ) + ex = (TCoord)( ras.max_ex ); + + if ( ex < ras.min_ex ) + ex = (TCoord)( ras.min_ex - 1 ); + + ras.area = 0; + ras.cover = 0; + ras.ex = ex - ras.min_ex; + ras.ey = ey - ras.min_ey; + ras.last_ey = SUBPIXELS( ey ); + ras.invalid = 0; + + gray_set_cell( RAS_VAR_ ex, ey ); + } + + + /*************************************************************************/ + /* */ + /* Render a scanline as one or more cells. */ + /* */ + static void + gray_render_scanline( RAS_ARG_ TCoord ey, + TPos x1, + TCoord y1, + TPos x2, + TCoord y2 ) + { + TCoord ex1, ex2, fx1, fx2, delta, mod, lift, rem; + long p, first, dx; + int incr; + + + dx = x2 - x1; + + ex1 = TRUNC( x1 ); + ex2 = TRUNC( x2 ); + fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) ); + fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) ); + + /* trivial case. Happens often */ + if ( y1 == y2 ) + { + gray_set_cell( RAS_VAR_ ex2, ey ); + return; + } + + /* everything is located in a single cell. That is easy! */ + /* */ + if ( ex1 == ex2 ) + { + delta = y2 - y1; + ras.area += (TArea)(( fx1 + fx2 ) * delta); + ras.cover += delta; + return; + } + + /* ok, we'll have to render a run of adjacent cells on the same */ + /* scanline... */ + /* */ + p = ( ONE_PIXEL - fx1 ) * ( y2 - y1 ); + first = ONE_PIXEL; + incr = 1; + + if ( dx < 0 ) + { + p = fx1 * ( y2 - y1 ); + first = 0; + incr = -1; + dx = -dx; + } + + delta = (TCoord)( p / dx ); + mod = (TCoord)( p % dx ); + if ( mod < 0 ) + { + delta--; + mod += (TCoord)dx; + } + + ras.area += (TArea)(( fx1 + first ) * delta); + ras.cover += delta; + + ex1 += incr; + gray_set_cell( RAS_VAR_ ex1, ey ); + y1 += delta; + + if ( ex1 != ex2 ) + { + p = ONE_PIXEL * ( y2 - y1 + delta ); + lift = (TCoord)( p / dx ); + rem = (TCoord)( p % dx ); + if ( rem < 0 ) + { + lift--; + rem += (TCoord)dx; + } + + mod -= (int)dx; + + while ( ex1 != ex2 ) + { + delta = lift; + mod += rem; + if ( mod >= 0 ) + { + mod -= (TCoord)dx; + delta++; + } + + ras.area += (TArea)(ONE_PIXEL * delta); + ras.cover += delta; + y1 += delta; + ex1 += incr; + gray_set_cell( RAS_VAR_ ex1, ey ); + } + } + + delta = y2 - y1; + ras.area += (TArea)(( fx2 + ONE_PIXEL - first ) * delta); + ras.cover += delta; + } + + + /*************************************************************************/ + /* */ + /* Render a given line as a series of scanlines. */ + /* */ + static void + gray_render_line( RAS_ARG_ TPos to_x, + TPos to_y ) + { + TCoord ey1, ey2, fy1, fy2, mod; + TPos dx, dy, x, x2; + long p, first; + int delta, rem, lift, incr; + + + ey1 = TRUNC( ras.last_ey ); + ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */ + fy1 = (TCoord)( ras.y - ras.last_ey ); + fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) ); + + dx = to_x - ras.x; + dy = to_y - ras.y; + + /* XXX: we should do something about the trivial case where dx == 0, */ + /* as it happens very often! */ + + /* perform vertical clipping */ + { + TCoord min, max; + + + min = ey1; + max = ey2; + if ( ey1 > ey2 ) + { + min = ey2; + max = ey1; + } + if ( min >= ras.max_ey || max < ras.min_ey ) + goto End; + } + + /* everything is on a single scanline */ + if ( ey1 == ey2 ) + { + gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 ); + goto End; + } + + /* vertical line - avoid calling gray_render_scanline */ + incr = 1; + + if ( dx == 0 ) + { + TCoord ex = TRUNC( ras.x ); + TCoord two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 ); + TArea area; + + + first = ONE_PIXEL; + if ( dy < 0 ) + { + first = 0; + incr = -1; + } + + delta = (int)( first - fy1 ); + ras.area += (TArea)two_fx * delta; + ras.cover += delta; + ey1 += incr; + + gray_set_cell( RAS_VAR_ ex, ey1 ); + + delta = (int)( first + first - ONE_PIXEL ); + area = (TArea)two_fx * delta; + while ( ey1 != ey2 ) + { + ras.area += area; + ras.cover += delta; + ey1 += incr; + + gray_set_cell( RAS_VAR_ ex, ey1 ); + } + + delta = (int)( fy2 - ONE_PIXEL + first ); + ras.area += (TArea)two_fx * delta; + ras.cover += delta; + + goto End; + } + + /* ok, we have to render several scanlines */ + p = ( ONE_PIXEL - fy1 ) * dx; + first = ONE_PIXEL; + incr = 1; + + if ( dy < 0 ) + { + p = fy1 * dx; + first = 0; + incr = -1; + dy = -dy; + } + + delta = (int)( p / dy ); + mod = (int)( p % dy ); + if ( mod < 0 ) + { + delta--; + mod += (TCoord)dy; + } + + x = ras.x + delta; + gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first ); + + ey1 += incr; + gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); + + if ( ey1 != ey2 ) + { + p = ONE_PIXEL * dx; + lift = (int)( p / dy ); + rem = (int)( p % dy ); + if ( rem < 0 ) + { + lift--; + rem += (int)dy; + } + mod -= (int)dy; + + while ( ey1 != ey2 ) + { + delta = lift; + mod += rem; + if ( mod >= 0 ) + { + mod -= (int)dy; + delta++; + } + + x2 = x + delta; + gray_render_scanline( RAS_VAR_ ey1, x, + (TCoord)( ONE_PIXEL - first ), x2, + (TCoord)first ); + x = x2; + + ey1 += incr; + gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); + } + } + + gray_render_scanline( RAS_VAR_ ey1, x, + (TCoord)( ONE_PIXEL - first ), to_x, + fy2 ); + + End: + ras.x = to_x; + ras.y = to_y; + ras.last_ey = SUBPIXELS( ey2 ); + } + + + static void + gray_split_conic( FT_Vector* base ) + { + TPos a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + } + + + static void + gray_render_conic( RAS_ARG_ const FT_Vector* control, + const FT_Vector* to ) + { + TPos dx, dy; + int top, level; + int* levels; + FT_Vector* arc; + + + dx = DOWNSCALE( ras.x ) + to->x - ( control->x << 1 ); + if ( dx < 0 ) + dx = -dx; + dy = DOWNSCALE( ras.y ) + to->y - ( control->y << 1 ); + if ( dy < 0 ) + dy = -dy; + if ( dx < dy ) + dx = dy; + + level = 1; + dx = dx / ras.conic_level; + while ( dx > 0 ) + { + dx >>= 2; + level++; + } + + /* a shortcut to speed things up */ + if ( level <= 1 ) + { + /* we compute the mid-point directly in order to avoid */ + /* calling gray_split_conic() */ + TPos to_x, to_y, mid_x, mid_y; + + + to_x = UPSCALE( to->x ); + to_y = UPSCALE( to->y ); + mid_x = ( ras.x + to_x + 2 * UPSCALE( control->x ) ) / 4; + mid_y = ( ras.y + to_y + 2 * UPSCALE( control->y ) ) / 4; + + gray_render_line( RAS_VAR_ mid_x, mid_y ); + gray_render_line( RAS_VAR_ to_x, to_y ); + + return; + } + + arc = ras.bez_stack; + levels = ras.lev_stack; + top = 0; + levels[0] = level; + + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control->x ); + arc[1].y = UPSCALE( control->y ); + arc[2].x = ras.x; + arc[2].y = ras.y; + + while ( top >= 0 ) + { + level = levels[top]; + if ( level > 1 ) + { + /* check that the arc crosses the current band */ + TPos min, max, y; + + + min = max = arc[0].y; + + y = arc[1].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + + y = arc[2].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + + if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey ) + goto Draw; + + gray_split_conic( arc ); + arc += 2; + top++; + levels[top] = levels[top - 1] = level - 1; + continue; + } + + Draw: + { + TPos to_x, to_y, mid_x, mid_y; + + + to_x = arc[0].x; + to_y = arc[0].y; + mid_x = ( ras.x + to_x + 2 * arc[1].x ) / 4; + mid_y = ( ras.y + to_y + 2 * arc[1].y ) / 4; + + gray_render_line( RAS_VAR_ mid_x, mid_y ); + gray_render_line( RAS_VAR_ to_x, to_y ); + + top--; + arc -= 2; + } + } + + return; + } + + + static void + gray_split_cubic( FT_Vector* base ) + { + TPos a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c ) / 2; + base[5].x = b = ( base[3].x + d ) / 2; + c = ( c + d ) / 2; + base[2].x = a = ( a + c ) / 2; + base[4].x = b = ( b + c ) / 2; + base[3].x = ( a + b ) / 2; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c ) / 2; + base[5].y = b = ( base[3].y + d ) / 2; + c = ( c + d ) / 2; + base[2].y = a = ( a + c ) / 2; + base[4].y = b = ( b + c ) / 2; + base[3].y = ( a + b ) / 2; + } + + + static void + gray_render_cubic( RAS_ARG_ const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to ) + { + int top, level; + int* levels; + FT_Vector* arc; + int mid_x = ( DOWNSCALE( ras.x ) + to->x + + 3 * (control1->x + control2->x ) ) / 8; + int mid_y = ( DOWNSCALE( ras.y ) + to->y + + 3 * (control1->y + control2->y ) ) / 8; + TPos dx = DOWNSCALE( ras.x ) + to->x - ( mid_x << 1 ); + TPos dy = DOWNSCALE( ras.y ) + to->y - ( mid_y << 1 ); + + + if ( dx < 0 ) + dx = -dx; + if ( dy < 0 ) + dy = -dy; + if ( dx < dy ) + dx = dy; + + level = 1; + dx /= ras.cubic_level; + while ( dx > 0 ) + { + dx >>= 2; + level++; + } + + if ( level <= 1 ) + { + TPos to_x, to_y; + + + to_x = UPSCALE( to->x ); + to_y = UPSCALE( to->y ); + + /* Recalculation of midpoint is needed only if */ + /* UPSCALE and DOWNSCALE have any effect. */ + +#if ( PIXEL_BITS != 6 ) + mid_x = ( ras.x + to_x + + 3 * UPSCALE( control1->x + control2->x ) ) / 8; + mid_y = ( ras.y + to_y + + 3 * UPSCALE( control1->y + control2->y ) ) / 8; +#endif + + gray_render_line( RAS_VAR_ mid_x, mid_y ); + gray_render_line( RAS_VAR_ to_x, to_y ); + + return; + } + + arc = ras.bez_stack; + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control2->x ); + arc[1].y = UPSCALE( control2->y ); + arc[2].x = UPSCALE( control1->x ); + arc[2].y = UPSCALE( control1->y ); + arc[3].x = ras.x; + arc[3].y = ras.y; + + levels = ras.lev_stack; + top = 0; + levels[0] = level; + + while ( top >= 0 ) + { + level = levels[top]; + if ( level > 1 ) + { + /* check that the arc crosses the current band */ + TPos min, max, y; + + + min = max = arc[0].y; + y = arc[1].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + y = arc[2].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + y = arc[3].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < 0 ) + goto Draw; + gray_split_cubic( arc ); + arc += 3; + top ++; + levels[top] = levels[top - 1] = level - 1; + continue; + } + + Draw: + { + TPos to_x, to_y; + + + to_x = arc[0].x; + to_y = arc[0].y; + mid_x = ( ras.x + to_x + 3 * ( arc[1].x + arc[2].x ) ) / 8; + mid_y = ( ras.y + to_y + 3 * ( arc[1].y + arc[2].y ) ) / 8; + + gray_render_line( RAS_VAR_ mid_x, mid_y ); + gray_render_line( RAS_VAR_ to_x, to_y ); + top --; + arc -= 3; + } + } + + return; + } + + + + static int + gray_move_to( const FT_Vector* to, + PWorker worker ) + { + TPos x, y; + + + /* record current cell, if any */ + gray_record_cell( RAS_VAR ); + + /* start to a new position */ + x = UPSCALE( to->x ); + y = UPSCALE( to->y ); + + gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) ); + + worker->x = x; + worker->y = y; + return 0; + } + + + static int + gray_line_to( const FT_Vector* to, + PWorker worker ) + { + gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) ); + return 0; + } + + + static int + gray_conic_to( const FT_Vector* control, + const FT_Vector* to, + PWorker worker ) + { + gray_render_conic( RAS_VAR_ control, to ); + return 0; + } + + + static int + gray_cubic_to( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + PWorker worker ) + { + gray_render_cubic( RAS_VAR_ control1, control2, to ); + return 0; + } + + + static void + gray_render_span( int y, + int count, + const FT_Span* spans, + PWorker worker ) + { + unsigned char* p; + FT_Bitmap* map = &worker->target; + + + /* first of all, compute the scanline offset */ + p = (unsigned char*)map->buffer - y * map->pitch; + if ( map->pitch >= 0 ) + p += (unsigned)( ( map->rows - 1 ) * map->pitch ); + + for ( ; count > 0; count--, spans++ ) + { + unsigned char coverage = spans->coverage; + + + if ( coverage ) + { + /* For small-spans it is faster to do it by ourselves than + * calling `memset'. This is mainly due to the cost of the + * function call. + */ + if ( spans->len >= 8 ) + FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len ); + else + { + unsigned char* q = p + spans->x; + + + switch ( spans->len ) + { + case 7: *q++ = (unsigned char)coverage; + case 6: *q++ = (unsigned char)coverage; + case 5: *q++ = (unsigned char)coverage; + case 4: *q++ = (unsigned char)coverage; + case 3: *q++ = (unsigned char)coverage; + case 2: *q++ = (unsigned char)coverage; + case 1: *q = (unsigned char)coverage; + default: + ; + } + } + } + } + } + + + static void + gray_hline( RAS_ARG_ TCoord x, + TCoord y, + TPos area, + TCoord acount ) + { + FT_Span* span; + int count; + int coverage; + + + /* compute the coverage line's coverage, depending on the */ + /* outline fill rule */ + /* */ + /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */ + /* */ + coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) ); + /* use range 0..256 */ + if ( coverage < 0 ) + coverage = -coverage; + + if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL ) + { + coverage &= 511; + + if ( coverage > 256 ) + coverage = 512 - coverage; + else if ( coverage == 256 ) + coverage = 255; + } + else + { + /* normal non-zero winding rule */ + if ( coverage >= 256 ) + coverage = 255; + } + + y += (TCoord)ras.min_ey; + x += (TCoord)ras.min_ex; + + /* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */ + if ( x >= 32767 ) + x = 32767; + + /* FT_Span.y is an integer, so limit our coordinates appropriately */ + if ( y >= FT_INT_MAX ) + y = FT_INT_MAX; + + if ( coverage ) + { + /* see whether we can add this span to the current list */ + count = ras.num_gray_spans; + span = ras.gray_spans + count - 1; + if ( count > 0 && + ras.span_y == y && + (int)span->x + span->len == (int)x && + span->coverage == coverage ) + { + span->len = (unsigned short)( span->len + acount ); + return; + } + + if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS ) + { + if ( ras.render_span && count > 0 ) + ras.render_span( ras.span_y, count, ras.gray_spans, + ras.render_span_data ); + +#ifdef FT_DEBUG_LEVEL_TRACE + + if ( count > 0 ) + { + int n; + + + FT_TRACE7(( "y = %3d ", ras.span_y )); + span = ras.gray_spans; + for ( n = 0; n < count; n++, span++ ) + FT_TRACE7(( "[%d..%d]:%02x ", + span->x, span->x + span->len - 1, span->coverage )); + FT_TRACE7(( "\n" )); + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + ras.num_gray_spans = 0; + ras.span_y = (int)y; + + count = 0; + span = ras.gray_spans; + } + else + span++; + + /* add a gray span to the current list */ + span->x = (short)x; + span->len = (unsigned short)acount; + span->coverage = (unsigned char)coverage; + + ras.num_gray_spans++; + } + } + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* to be called while in the debugger -- */ + /* this function causes a compiler warning since it is unused otherwise */ + static void + gray_dump_cells( RAS_ARG ) + { + int yindex; + + + for ( yindex = 0; yindex < ras.ycount; yindex++ ) + { + PCell cell; + + + printf( "%3d:", yindex ); + + for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next ) + printf( " (%3ld, c:%4ld, a:%6d)", cell->x, cell->cover, cell->area ); + printf( "\n" ); + } + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + static void + gray_sweep( RAS_ARG_ const FT_Bitmap* target ) + { + int yindex; + + FT_UNUSED( target ); + + + if ( ras.num_cells == 0 ) + return; + + ras.num_gray_spans = 0; + + FT_TRACE7(( "gray_sweep: start\n" )); + + for ( yindex = 0; yindex < ras.ycount; yindex++ ) + { + PCell cell = ras.ycells[yindex]; + TCoord cover = 0; + TCoord x = 0; + + + for ( ; cell != NULL; cell = cell->next ) + { + TPos area; + + + if ( cell->x > x && cover != 0 ) + gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), + cell->x - x ); + + cover += cell->cover; + area = cover * ( ONE_PIXEL * 2 ) - cell->area; + + if ( area != 0 && cell->x >= 0 ) + gray_hline( RAS_VAR_ cell->x, yindex, area, 1 ); + + x = cell->x + 1; + } + + if ( cover != 0 ) + gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), + ras.count_ex - x ); + } + + if ( ras.render_span && ras.num_gray_spans > 0 ) + ras.render_span( ras.span_y, ras.num_gray_spans, + ras.gray_spans, ras.render_span_data ); + + FT_TRACE7(( "gray_sweep: end\n" )); + } + + +#ifdef _STANDALONE_ + + /*************************************************************************/ + /* */ + /* The following function should only compile in stand-alone mode, */ + /* i.e., when building this component without the rest of FreeType. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Decompose */ + /* */ + /* <Description> */ + /* Walk over an outline's structure to decompose it into individual */ + /* segments and Bézier arcs. This function is also able to emit */ + /* `move to' and `close to' operations to indicate the start and end */ + /* of new contours in the outline. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source target. */ + /* */ + /* func_interface :: A table of `emitters', i.e., function pointers */ + /* called during decomposition to indicate path */ + /* operations. */ + /* */ + /* <InOut> */ + /* user :: A typeless pointer which is passed to each */ + /* emitter during the decomposition. It can be */ + /* used to store the state during the */ + /* decomposition. */ + /* */ + /* <Return> */ + /* Error code. 0 means success. */ + /* */ + static int + FT_Outline_Decompose( const FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ) + { +#undef SCALED +#define SCALED( x ) ( ( (x) << shift ) - delta ) + + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + int error; + + int n; /* index of contour in outline */ + int first; /* index of first point in contour */ + char tag; /* current point's state */ + + int shift; + TPos delta; + + + if ( !outline || !func_interface ) + return ErrRaster_Invalid_Argument; + + shift = func_interface->shift; + delta = func_interface->delta; + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + int last; /* index of last point in contour */ + + + FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); + + last = outline->contours[n]; + if ( last < 0 ) + goto Invalid_Outline; + limit = outline->points + last; + + v_start = outline->points[first]; + v_start.x = SCALED( v_start.x ); + v_start.y = SCALED( v_start.y ); + + v_last = outline->points[last]; + v_last.x = SCALED( v_last.x ); + v_last.y = SCALED( v_last.y ); + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + v_last = v_start; + } + point--; + tags--; + } + + FT_TRACE5(( " move to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->move_to( &v_start, user ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " line to (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0 )); + error = func_interface->line_to( &vec, user ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point->x ); + v_control.y = SCALED( point->y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_middle.x / 64.0, v_middle.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_start, user ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1.x = SCALED( point[-2].x ); + vec1.y = SCALED( point[-2].y ); + + vec2.x = SCALED( point[-1].x ); + vec2.y = SCALED( point[-1].y ); + + if ( point <= limit ) + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + FT_TRACE5(( " line to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + + first = last + 1; + } + + FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); + return 0; + + Exit: + FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); + return error; + + Invalid_Outline: + return ErrRaster_Invalid_Outline; + } + +#endif /* _STANDALONE_ */ + + + typedef struct TBand_ + { + TPos min, max; + + } TBand; + + FT_DEFINE_OUTLINE_FUNCS(func_interface, + (FT_Outline_MoveTo_Func) gray_move_to, + (FT_Outline_LineTo_Func) gray_line_to, + (FT_Outline_ConicTo_Func)gray_conic_to, + (FT_Outline_CubicTo_Func)gray_cubic_to, + 0, + 0 + ) + + static int + gray_convert_glyph_inner( RAS_ARG ) + { + + volatile int error = 0; + +#ifdef FT_CONFIG_OPTION_PIC + FT_Outline_Funcs func_interface; + Init_Class_func_interface(&func_interface); +#endif + + if ( ft_setjmp( ras.jump_buffer ) == 0 ) + { + error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras ); + gray_record_cell( RAS_VAR ); + } + else + error = ErrRaster_Memory_Overflow; + + return error; + } + + + static int + gray_convert_glyph( RAS_ARG ) + { + TBand bands[40]; + TBand* volatile band; + int volatile n, num_bands; + TPos volatile min, max, max_y; + FT_BBox* clip; + + + /* Set up state in the raster object */ + gray_compute_cbox( RAS_VAR ); + + /* clip to target bitmap, exit if nothing to do */ + clip = &ras.clip_box; + + if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax || + ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax ) + return 0; + + if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin; + if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin; + + if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax; + if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax; + + ras.count_ex = ras.max_ex - ras.min_ex; + ras.count_ey = ras.max_ey - ras.min_ey; + + /* simple heuristic used to speed up the bezier decomposition -- see */ + /* the code in gray_render_conic() and gray_render_cubic() for more */ + /* details */ + ras.conic_level = 32; + ras.cubic_level = 16; + + { + int level = 0; + + + if ( ras.count_ex > 24 || ras.count_ey > 24 ) + level++; + if ( ras.count_ex > 120 || ras.count_ey > 120 ) + level++; + + ras.conic_level <<= level; + ras.cubic_level <<= level; + } + + /* set up vertical bands */ + num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size ); + if ( num_bands == 0 ) + num_bands = 1; + if ( num_bands >= 39 ) + num_bands = 39; + + ras.band_shoot = 0; + + min = ras.min_ey; + max_y = ras.max_ey; + + for ( n = 0; n < num_bands; n++, min = max ) + { + max = min + ras.band_size; + if ( n == num_bands - 1 || max > max_y ) + max = max_y; + + bands[0].min = min; + bands[0].max = max; + band = bands; + + while ( band >= bands ) + { + TPos bottom, top, middle; + int error; + + { + PCell cells_max; + int yindex; + long cell_start, cell_end, cell_mod; + + + ras.ycells = (PCell*)ras.buffer; + ras.ycount = band->max - band->min; + + cell_start = sizeof ( PCell ) * ras.ycount; + cell_mod = cell_start % sizeof ( TCell ); + if ( cell_mod > 0 ) + cell_start += sizeof ( TCell ) - cell_mod; + + cell_end = ras.buffer_size; + cell_end -= cell_end % sizeof( TCell ); + + cells_max = (PCell)( (char*)ras.buffer + cell_end ); + ras.cells = (PCell)( (char*)ras.buffer + cell_start ); + if ( ras.cells >= cells_max ) + goto ReduceBands; + + ras.max_cells = cells_max - ras.cells; + if ( ras.max_cells < 2 ) + goto ReduceBands; + + for ( yindex = 0; yindex < ras.ycount; yindex++ ) + ras.ycells[yindex] = NULL; + } + + ras.num_cells = 0; + ras.invalid = 1; + ras.min_ey = band->min; + ras.max_ey = band->max; + ras.count_ey = band->max - band->min; + + error = gray_convert_glyph_inner( RAS_VAR ); + + if ( !error ) + { + gray_sweep( RAS_VAR_ &ras.target ); + band--; + continue; + } + else if ( error != ErrRaster_Memory_Overflow ) + return 1; + + ReduceBands: + /* render pool overflow; we will reduce the render band by half */ + bottom = band->min; + top = band->max; + middle = bottom + ( ( top - bottom ) >> 1 ); + + /* This is too complex for a single scanline; there must */ + /* be some problems. */ + if ( middle == bottom ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" )); +#endif + return 1; + } + + if ( bottom-top >= ras.band_size ) + ras.band_shoot++; + + band[1].min = bottom; + band[1].max = middle; + band[0].min = middle; + band[0].max = top; + band++; + } + } + + if ( ras.band_shoot > 8 && ras.band_size > 16 ) + ras.band_size = ras.band_size / 2; + + return 0; + } + + + static int + gray_raster_render( PRaster raster, + const FT_Raster_Params* params ) + { + const FT_Outline* outline = (const FT_Outline*)params->source; + const FT_Bitmap* target_map = params->target; + PWorker worker; + + + if ( !raster || !raster->buffer || !raster->buffer_size ) + return ErrRaster_Invalid_Argument; + + if ( !outline ) + return ErrRaster_Invalid_Outline; + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return 0; + + if ( !outline->contours || !outline->points ) + return ErrRaster_Invalid_Outline; + + if ( outline->n_points != + outline->contours[outline->n_contours - 1] + 1 ) + return ErrRaster_Invalid_Outline; + + worker = raster->worker; + + /* if direct mode is not set, we must have a target bitmap */ + if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) ) + { + if ( !target_map ) + return ErrRaster_Invalid_Argument; + + /* nothing to do */ + if ( !target_map->width || !target_map->rows ) + return 0; + + if ( !target_map->buffer ) + return ErrRaster_Invalid_Argument; + } + + /* this version does not support monochrome rendering */ + if ( !( params->flags & FT_RASTER_FLAG_AA ) ) + return ErrRaster_Invalid_Mode; + + /* compute clipping box */ + if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) ) + { + /* compute clip box from target pixmap */ + ras.clip_box.xMin = 0; + ras.clip_box.yMin = 0; + ras.clip_box.xMax = target_map->width; + ras.clip_box.yMax = target_map->rows; + } + else if ( params->flags & FT_RASTER_FLAG_CLIP ) + ras.clip_box = params->clip_box; + else + { + ras.clip_box.xMin = -32768L; + ras.clip_box.yMin = -32768L; + ras.clip_box.xMax = 32767L; + ras.clip_box.yMax = 32767L; + } + + gray_init_cells( RAS_VAR_ raster->buffer, raster->buffer_size ); + + ras.outline = *outline; + ras.num_cells = 0; + ras.invalid = 1; + ras.band_size = raster->band_size; + ras.num_gray_spans = 0; + + if ( params->flags & FT_RASTER_FLAG_DIRECT ) + { + ras.render_span = (FT_Raster_Span_Func)params->gray_spans; + ras.render_span_data = params->user; + } + else + { + ras.target = *target_map; + ras.render_span = (FT_Raster_Span_Func)gray_render_span; + ras.render_span_data = &ras; + } + + return gray_convert_glyph( RAS_VAR ); + } + + + /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/ + /**** a static object. *****/ + +#ifdef _STANDALONE_ + + static int + gray_raster_new( void* memory, + FT_Raster* araster ) + { + static TRaster the_raster; + + FT_UNUSED( memory ); + + + *araster = (FT_Raster)&the_raster; + FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); + + return 0; + } + + + static void + gray_raster_done( FT_Raster raster ) + { + /* nothing */ + FT_UNUSED( raster ); + } + +#else /* !_STANDALONE_ */ + + static int + gray_raster_new( FT_Memory memory, + FT_Raster* araster ) + { + FT_Error error; + PRaster raster = NULL; + + + *araster = 0; + if ( !FT_ALLOC( raster, sizeof ( TRaster ) ) ) + { + raster->memory = memory; + *araster = (FT_Raster)raster; + } + + return error; + } + + + static void + gray_raster_done( FT_Raster raster ) + { + FT_Memory memory = (FT_Memory)((PRaster)raster)->memory; + + + FT_FREE( raster ); + } + +#endif /* !_STANDALONE_ */ + + + static void + gray_raster_reset( FT_Raster raster, + char* pool_base, + long pool_size ) + { + PRaster rast = (PRaster)raster; + + + if ( raster ) + { + if ( pool_base && pool_size >= (long)sizeof ( TWorker ) + 2048 ) + { + PWorker worker = (PWorker)pool_base; + + + rast->worker = worker; + rast->buffer = pool_base + + ( ( sizeof ( TWorker ) + sizeof ( TCell ) - 1 ) & + ~( sizeof ( TCell ) - 1 ) ); + rast->buffer_size = (long)( ( pool_base + pool_size ) - + (char*)rast->buffer ) & + ~( sizeof ( TCell ) - 1 ); + rast->band_size = (int)( rast->buffer_size / + ( sizeof ( TCell ) * 8 ) ); + } + else + { + rast->buffer = NULL; + rast->buffer_size = 0; + rast->worker = NULL; + } + } + } + + + FT_DEFINE_RASTER_FUNCS(ft_grays_raster, + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Raster_New_Func) gray_raster_new, + (FT_Raster_Reset_Func) gray_raster_reset, + (FT_Raster_Set_Mode_Func)0, + (FT_Raster_Render_Func) gray_raster_render, + (FT_Raster_Done_Func) gray_raster_done + ) + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftgrays.h b/android/jni/ndk_modules/freetype/src/smooth/ftgrays.h new file mode 100644 index 00000000..f20f55f1 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/smooth/ftgrays.h @@ -0,0 +1,58 @@ +/***************************************************************************/ +/* */ +/* ftgrays.h */ +/* */ +/* FreeType smooth renderer declaration */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGRAYS_H__ +#define __FTGRAYS_H__ + +#ifdef __cplusplus + extern "C" { +#endif + + +#ifdef _STANDALONE_ +#include "ftimage.h" +#else +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H /* for FT_CONFIG_OPTION_PIC */ +#include FT_IMAGE_H +#endif + + + /*************************************************************************/ + /* */ + /* To make ftgrays.h independent from configuration files we check */ + /* whether FT_EXPORT_VAR has been defined already. */ + /* */ + /* On some systems and compilers (Win32 mostly), an extra keyword is */ + /* necessary to compile the library as a DLL. */ + /* */ +#ifndef FT_EXPORT_VAR +#define FT_EXPORT_VAR( x ) extern x +#endif + + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_grays_raster; + + +#ifdef __cplusplus + } +#endif + +#endif /* __FTGRAYS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftsmerrs.h b/android/jni/ndk_modules/freetype/src/smooth/ftsmerrs.h new file mode 100644 index 00000000..0c2a2ecd --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/smooth/ftsmerrs.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* ftsmerrs.h */ +/* */ +/* smooth renderer error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the smooth renderer error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __FTSMERRS_H__ +#define __FTSMERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX Smooth_Err_ +#define FT_ERR_BASE FT_Mod_Err_Smooth + +#include FT_ERRORS_H + +#endif /* __FTSMERRS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftsmooth.c b/android/jni/ndk_modules/freetype/src/smooth/ftsmooth.c new file mode 100644 index 00000000..7d16b94a --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/smooth/ftsmooth.c @@ -0,0 +1,481 @@ +/***************************************************************************/ +/* */ +/* ftsmooth.c */ +/* */ +/* Anti-aliasing renderer interface (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include "ftsmooth.h" +#include "ftgrays.h" +#include "ftspic.h" + +#include "ftsmerrs.h" + + + /* initialize renderer -- init its raster */ + static FT_Error + ft_smooth_init( FT_Renderer render ) + { + FT_Library library = FT_MODULE_LIBRARY( render ); + + + render->clazz->raster_class->raster_reset( render->raster, + library->raster_pool, + library->raster_pool_size ); + + return 0; + } + + + /* sets render-specific mode */ + static FT_Error + ft_smooth_set_mode( FT_Renderer render, + FT_ULong mode_tag, + FT_Pointer data ) + { + /* we simply pass it to the raster */ + return render->clazz->raster_class->raster_set_mode( render->raster, + mode_tag, + data ); + } + + /* transform a given glyph image */ + static FT_Error + ft_smooth_transform( FT_Renderer render, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_Error error = Smooth_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = Smooth_Err_Invalid_Argument; + goto Exit; + } + + if ( matrix ) + FT_Outline_Transform( &slot->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &slot->outline, delta->x, delta->y ); + + Exit: + return error; + } + + + /* return the glyph's control box */ + static void + ft_smooth_get_cbox( FT_Renderer render, + FT_GlyphSlot slot, + FT_BBox* cbox ) + { + FT_MEM_ZERO( cbox, sizeof ( *cbox ) ); + + if ( slot->format == render->glyph_format ) + FT_Outline_Get_CBox( &slot->outline, cbox ); + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_smooth_render_generic( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin, + FT_Render_Mode required_mode ) + { + FT_Error error; + FT_Outline* outline = NULL; + FT_BBox cbox; + FT_UInt width, height, height_org, width_org, pitch; + FT_Bitmap* bitmap; + FT_Memory memory; + FT_Int hmul = mode == FT_RENDER_MODE_LCD; + FT_Int vmul = mode == FT_RENDER_MODE_LCD_V; + FT_Pos x_shift, y_shift, x_left, y_top; + + FT_Raster_Params params; + + + /* check glyph image format */ + if ( slot->format != render->glyph_format ) + { + error = Smooth_Err_Invalid_Argument; + goto Exit; + } + + /* check mode */ + if ( mode != required_mode ) + return Smooth_Err_Cannot_Render_Glyph; + + outline = &slot->outline; + + /* translate the outline to the new origin if needed */ + if ( origin ) + FT_Outline_Translate( outline, origin->x, origin->y ); + + /* compute the control box, and grid fit it */ + FT_Outline_Get_CBox( outline, &cbox ); + + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.xMax = FT_PIX_CEIL( cbox.xMax ); + cbox.yMax = FT_PIX_CEIL( cbox.yMax ); + + width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); + height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); + bitmap = &slot->bitmap; + memory = render->root.memory; + + width_org = width; + height_org = height; + + /* release old bitmap buffer */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + /* allocate new one */ + pitch = width; + if ( hmul ) + { + width = width * 3; + pitch = FT_PAD_CEIL( width, 4 ); + } + + if ( vmul ) + height *= 3; + + x_shift = (FT_Int) cbox.xMin; + y_shift = (FT_Int) cbox.yMin; + x_left = (FT_Int)( cbox.xMin >> 6 ); + y_top = (FT_Int)( cbox.yMax >> 6 ); + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + if ( slot->library->lcd_filter_func ) + { + FT_Int extra = slot->library->lcd_extra; + + + if ( hmul ) + { + x_shift -= 64 * ( extra >> 1 ); + width += 3 * extra; + pitch = FT_PAD_CEIL( width, 4 ); + x_left -= extra >> 1; + } + + if ( vmul ) + { + y_shift -= 64 * ( extra >> 1 ); + height += 3 * extra; + y_top += extra >> 1; + } + } + +#endif + +#if FT_UINT_MAX > 0xFFFFU + + /* Required check is ( pitch * height < FT_ULONG_MAX ), */ + /* but we care realistic cases only. Always pitch <= width. */ + if ( width > 0x7FFFU || height > 0x7FFFU ) + { + FT_ERROR(( "ft_smooth_render_generic: glyph too large: %d x %d\n", + width, height )); + return Smooth_Err_Raster_Overflow; + } + +#endif + + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; + bitmap->num_grays = 256; + bitmap->width = width; + bitmap->rows = height; + bitmap->pitch = pitch; + + /* translate outline to render it into the bitmap */ + FT_Outline_Translate( outline, -x_shift, -y_shift ); + + if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) ) + goto Exit; + + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + /* set up parameters */ + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + /* implode outline if needed */ + { + FT_Vector* points = outline->points; + FT_Vector* points_end = points + outline->n_points; + FT_Vector* vec; + + + if ( hmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->x *= 3; + + if ( vmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->y *= 3; + } + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + /* deflate outline if needed */ + { + FT_Vector* points = outline->points; + FT_Vector* points_end = points + outline->n_points; + FT_Vector* vec; + + + if ( hmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->x /= 3; + + if ( vmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->y /= 3; + } + + if ( slot->library->lcd_filter_func ) + slot->library->lcd_filter_func( bitmap, mode, slot->library ); + +#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + /* render outline into bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + /* expand it horizontally */ + if ( hmul ) + { + FT_Byte* line = bitmap->buffer; + FT_UInt hh; + + + for ( hh = height_org; hh > 0; hh--, line += pitch ) + { + FT_UInt xx; + FT_Byte* end = line + width; + + + for ( xx = width_org; xx > 0; xx-- ) + { + FT_UInt pixel = line[xx-1]; + + + end[-3] = (FT_Byte)pixel; + end[-2] = (FT_Byte)pixel; + end[-1] = (FT_Byte)pixel; + end -= 3; + } + } + } + + /* expand it vertically */ + if ( vmul ) + { + FT_Byte* read = bitmap->buffer + ( height - height_org ) * pitch; + FT_Byte* write = bitmap->buffer; + FT_UInt hh; + + + for ( hh = height_org; hh > 0; hh-- ) + { + ft_memcpy( write, read, pitch ); + write += pitch; + + ft_memcpy( write, read, pitch ); + write += pitch; + + ft_memcpy( write, read, pitch ); + write += pitch; + read += pitch; + } + } + +#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + FT_Outline_Translate( outline, x_shift, y_shift ); + + /* + * XXX: on 16bit system, we return an error for huge bitmap + * to prevent an overflow. + */ + if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX ) + return Smooth_Err_Invalid_Pixel_Size; + + if ( error ) + goto Exit; + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = (FT_Int)x_left; + slot->bitmap_top = (FT_Int)y_top; + + Exit: + if ( outline && origin ) + FT_Outline_Translate( outline, -origin->x, -origin->y ); + + return error; + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_smooth_render( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + if ( mode == FT_RENDER_MODE_LIGHT ) + mode = FT_RENDER_MODE_NORMAL; + + return ft_smooth_render_generic( render, slot, mode, origin, + FT_RENDER_MODE_NORMAL ); + } + + + /* convert a slot's glyph image into a horizontal LCD bitmap */ + static FT_Error + ft_smooth_render_lcd( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error; + + error = ft_smooth_render_generic( render, slot, mode, origin, + FT_RENDER_MODE_LCD ); + if ( !error ) + slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD; + + return error; + } + + + /* convert a slot's glyph image into a vertical LCD bitmap */ + static FT_Error + ft_smooth_render_lcd_v( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error; + + error = ft_smooth_render_generic( render, slot, mode, origin, + FT_RENDER_MODE_LCD_V ); + if ( !error ) + slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V; + + return error; + } + + + FT_DEFINE_RENDERER(ft_smooth_renderer_class, + + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "smooth", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + , + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render, + (FT_Renderer_TransformFunc)ft_smooth_transform, + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, + + (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET + ) + + + FT_DEFINE_RENDERER(ft_smooth_lcd_renderer_class, + + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "smooth-lcd", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + , + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render_lcd, + (FT_Renderer_TransformFunc)ft_smooth_transform, + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, + + (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET + ) + + FT_DEFINE_RENDERER(ft_smooth_lcdv_renderer_class, + + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "smooth-lcdv", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + , + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render_lcd_v, + (FT_Renderer_TransformFunc)ft_smooth_transform, + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, + + (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET + ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftsmooth.h b/android/jni/ndk_modules/freetype/src/smooth/ftsmooth.h new file mode 100644 index 00000000..3708790d --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/smooth/ftsmooth.h @@ -0,0 +1,49 @@ +/***************************************************************************/ +/* */ +/* ftsmooth.h */ +/* */ +/* Anti-aliasing renderer interface (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSMOOTH_H__ +#define __FTSMOOTH_H__ + + +#include <ft2build.h> +#include FT_RENDER_H + + +FT_BEGIN_HEADER + + +#ifndef FT_CONFIG_OPTION_NO_STD_RASTER + FT_DECLARE_RENDERER( ft_std_renderer_class ) +#endif + +#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER + FT_DECLARE_RENDERER( ft_smooth_renderer_class ) + + FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class ) + + FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class ) +#endif + + + +FT_END_HEADER + +#endif /* __FTSMOOTH_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftspic.c b/android/jni/ndk_modules/freetype/src/smooth/ftspic.c new file mode 100644 index 00000000..7adaab17 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/smooth/ftspic.c @@ -0,0 +1,98 @@ +/***************************************************************************/ +/* */ +/* ftspic.c */ +/* */ +/* The FreeType position independent code services for smooth module. */ +/* */ +/* Copyright 2009, 2010 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "ftspic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from ftgrays.c */ + void FT_Init_Class_ft_grays_raster(FT_Raster_Funcs*); + + void + ft_smooth_renderer_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->smooth ) + { + SmoothPIC* container = (SmoothPIC*)pic_container->smooth; + if(--container->ref_count) + return; + FT_FREE( container ); + pic_container->smooth = NULL; + } + } + + + FT_Error + ft_smooth_renderer_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = Smooth_Err_Ok; + SmoothPIC* container; + FT_Memory memory = library->memory; + + + /* since this function also serve smooth_lcd and smooth_lcdv renderers, + it implements reference counting */ + if(pic_container->smooth) + { + ((SmoothPIC*)pic_container->smooth)->ref_count++; + return error; + } + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->smooth = container; + container->ref_count = 1; + + /* initialize pointer table - this is how the module usually expects this data */ + FT_Init_Class_ft_grays_raster(&container->ft_grays_raster); +/*Exit:*/ + if(error) + ft_smooth_renderer_class_pic_free(library); + return error; + } + + /* re-route these init and free functions to the above functions */ + FT_Error ft_smooth_lcd_renderer_class_pic_init(FT_Library library) + { + return ft_smooth_renderer_class_pic_init(library); + } + void ft_smooth_lcd_renderer_class_pic_free(FT_Library library) + { + ft_smooth_renderer_class_pic_free(library); + } + FT_Error ft_smooth_lcdv_renderer_class_pic_init(FT_Library library) + { + return ft_smooth_renderer_class_pic_init(library); + } + void ft_smooth_lcdv_renderer_class_pic_free(FT_Library library) + { + ft_smooth_renderer_class_pic_free(library); + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftspic.h b/android/jni/ndk_modules/freetype/src/smooth/ftspic.h new file mode 100644 index 00000000..c7e0ce9d --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/smooth/ftspic.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* ftspic.h */ +/* */ +/* The FreeType position independent code services for smooth module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSPIC_H__ +#define __FTSPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC +#define FT_GRAYS_RASTER_GET ft_grays_raster + +#else /* FT_CONFIG_OPTION_PIC */ + + typedef struct SmoothPIC_ + { + int ref_count; + FT_Raster_Funcs ft_grays_raster; + } SmoothPIC; + +#define GET_PIC(lib) ((SmoothPIC*)((lib)->pic_container.smooth)) +#define FT_GRAYS_RASTER_GET (GET_PIC(library)->ft_grays_raster) + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __FTSPIC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/smooth.c b/android/jni/ndk_modules/freetype/src/smooth/smooth.c new file mode 100644 index 00000000..a8ac51f9 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/smooth/smooth.c @@ -0,0 +1,27 @@ +/***************************************************************************/ +/* */ +/* smooth.c */ +/* */ +/* FreeType anti-aliasing rasterer module component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "ftspic.c" +#include "ftgrays.c" +#include "ftsmooth.c" + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/truetype.c b/android/jni/ndk_modules/freetype/src/truetype/truetype.c new file mode 100644 index 00000000..4bd12097 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/truetype.c @@ -0,0 +1,37 @@ +/***************************************************************************/ +/* */ +/* truetype.c */ +/* */ +/* FreeType TrueType driver component (body only). */ +/* */ +/* Copyright 1996-2001, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "ttpic.c" +#include "ttdriver.c" /* driver interface */ +#include "ttpload.c" /* tables loader */ +#include "ttgload.c" /* glyph loader */ +#include "ttobjs.c" /* object manager */ + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.c" +#endif + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.c" /* gx distortable font */ +#endif + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttdriver.c b/android/jni/ndk_modules/freetype/src/truetype/ttdriver.c new file mode 100644 index 00000000..d723b57a --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttdriver.c @@ -0,0 +1,487 @@ +/***************************************************************************/ +/* */ +/* ttdriver.c */ +/* */ +/* TrueType font driver implementation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_SERVICE_XFREE86_NAME_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#endif + +#include FT_SERVICE_TRUETYPE_ENGINE_H +#include FT_SERVICE_TRUETYPE_GLYF_H + +#include "ttdriver.h" +#include "ttgload.h" +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + +#include "ttpic.h" + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttdriver + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#undef PAIR_TAG +#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \ + (FT_ULong)right ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_get_kerning */ + /* */ + /* <Description> */ + /* A driver method used to return the kerning vector between two */ + /* glyphs of the same face. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* <Output> */ + /* kerning :: The kerning vector. This is in font units for */ + /* scalable formats, and in pixels for fixed-sizes */ + /* formats. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this function. Other layouts, or more sophisticated */ + /* kernings, are out of scope of this method (the basic driver */ + /* interface is meant to be simple). */ + /* */ + /* They can be implemented by format-specific interfaces. */ + /* */ + static FT_Error + tt_get_kerning( FT_Face ttface, /* TT_Face */ + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + TT_Face face = (TT_Face)ttface; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + + kerning->x = 0; + kerning->y = 0; + + if ( sfnt ) + kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); + + return 0; + } + + +#undef PAIR_TAG + + + static FT_Error + tt_get_advances( FT_Face ttface, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed *advances ) + { + FT_UInt nn; + TT_Face face = (TT_Face) ttface; + FT_Bool check = FT_BOOL( + !( flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) ); + + + /* XXX: TODO: check for sbits */ + + if ( flags & FT_LOAD_VERTICAL_LAYOUT ) + { + for ( nn = 0; nn < count; nn++ ) + { + FT_Short tsb; + FT_UShort ah; + + + TT_Get_VMetrics( face, start + nn, check, &tsb, &ah ); + advances[nn] = ah; + } + } + else + { + for ( nn = 0; nn < count; nn++ ) + { + FT_Short lsb; + FT_UShort aw; + + + TT_Get_HMetrics( face, start + nn, check, &lsb, &aw ); + advances[nn] = aw; + } + } + + return TT_Err_Ok; + } + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** S I Z E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + static FT_Error + tt_size_select( FT_Size size, + FT_ULong strike_index ) + { + TT_Face ttface = (TT_Face)size->face; + TT_Size ttsize = (TT_Size)size; + FT_Error error = TT_Err_Ok; + + + ttsize->strike_index = strike_index; + + if ( FT_IS_SCALABLE( size->face ) ) + { + /* use the scaled metrics, even when tt_size_reset fails */ + FT_Select_Metrics( size->face, strike_index ); + + tt_size_reset( ttsize ); + } + else + { + SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; + FT_Size_Metrics* metrics = &size->metrics; + + + error = sfnt->load_strike_metrics( ttface, strike_index, metrics ); + if ( error ) + ttsize->strike_index = 0xFFFFFFFFUL; + } + + return error; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + static FT_Error + tt_size_request( FT_Size size, + FT_Size_Request req ) + { + TT_Size ttsize = (TT_Size)size; + FT_Error error = TT_Err_Ok; + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( FT_HAS_FIXED_SIZES( size->face ) ) + { + TT_Face ttface = (TT_Face)size->face; + SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; + FT_ULong strike_index; + + + error = sfnt->set_sbit_strike( ttface, req, &strike_index ); + + if ( error ) + ttsize->strike_index = 0xFFFFFFFFUL; + else + return tt_size_select( size, strike_index ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + FT_Request_Metrics( size->face, req ); + + if ( FT_IS_SCALABLE( size->face ) ) + error = tt_size_reset( ttsize ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_Glyph */ + /* */ + /* <Description> */ + /* A driver method used to load a glyph within a given glyph slot. */ + /* */ + /* <Input> */ + /* slot :: A handle to the target slot object where the glyph */ + /* will be loaded. */ + /* */ + /* size :: A handle to the source face size at which the glyph */ + /* must be scaled, loaded, etc. */ + /* */ + /* glyph_index :: The index of the glyph in the font file. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Load_Glyph( FT_GlyphSlot ttslot, /* TT_GlyphSlot */ + FT_Size ttsize, /* TT_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_GlyphSlot slot = (TT_GlyphSlot)ttslot; + TT_Size size = (TT_Size)ttsize; + FT_Face face = ttslot->face; + FT_Error error; + + + if ( !slot ) + return TT_Err_Invalid_Slot_Handle; + + if ( !size ) + return TT_Err_Invalid_Size_Handle; + + if ( !face ) + return TT_Err_Invalid_Argument; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( glyph_index >= (FT_UInt)face->num_glyphs && + !face->internal->incremental_interface ) +#else + if ( glyph_index >= (FT_UInt)face->num_glyphs ) +#endif + return TT_Err_Invalid_Argument; + + if ( load_flags & FT_LOAD_NO_HINTING ) + { + /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT */ + /* are necessary to disable hinting for tricky fonts */ + + if ( FT_IS_TRICKY( face ) ) + load_flags &= ~FT_LOAD_NO_HINTING; + + if ( load_flags & FT_LOAD_NO_AUTOHINT ) + load_flags |= FT_LOAD_NO_HINTING; + } + + if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) ) + { + load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE; + + if ( !FT_IS_TRICKY( face ) ) + load_flags |= FT_LOAD_NO_HINTING; + } + + /* now load the glyph outline if necessary */ + error = TT_Load_Glyph( size, slot, glyph_index, load_flags ); + + /* force drop-out mode to 2 - irrelevant now */ + /* slot->outline.dropout_mode = 2; */ + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_DEFINE_SERVICE_MULTIMASTERSREC(tt_service_gx_multi_masters, + (FT_Get_MM_Func) NULL, + (FT_Set_MM_Design_Func) NULL, + (FT_Set_MM_Blend_Func) TT_Set_MM_Blend, + (FT_Get_MM_Var_Func) TT_Get_MM_Var, + (FT_Set_Var_Design_Func)TT_Set_Var_Design + ) +#endif + + static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine = + { +#ifdef TT_USE_BYTECODE_INTERPRETER + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED +#else + FT_TRUETYPE_ENGINE_TYPE_PATENTED +#endif + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_TRUETYPE_ENGINE_TYPE_NONE + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + }; + + FT_DEFINE_SERVICE_TTGLYFREC(tt_service_truetype_glyf, + (TT_Glyf_GetLocationFunc)tt_face_get_location + ) + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_DEFINE_SERVICEDESCREC4(tt_services, + FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE, + FT_SERVICE_ID_MULTI_MASTERS, &FT_TT_SERVICE_GX_MULTI_MASTERS_GET, + FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, + FT_SERVICE_ID_TT_GLYF, &FT_TT_SERVICE_TRUETYPE_GLYF_GET + ) +#else + FT_DEFINE_SERVICEDESCREC3(tt_services, + FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE, + FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, + FT_SERVICE_ID_TT_GLYF, &FT_TT_SERVICE_TRUETYPE_GLYF_GET + ) +#endif + + FT_CALLBACK_DEF( FT_Module_Interface ) + tt_get_interface( FT_Module driver, /* TT_Driver */ + const char* tt_interface ) + { + FT_Module_Interface result; + FT_Module sfntd; + SFNT_Service sfnt; + + result = ft_service_list_lookup( FT_TT_SERVICES_GET, tt_interface ); + if ( result != NULL ) + return result; + + if ( !driver ) + return NULL; + + /* only return the default interface from the SFNT module */ + sfntd = FT_Get_Module( driver->library, "sfnt" ); + if ( sfntd ) + { + sfnt = (SFNT_Service)( sfntd->clazz->module_interface ); + if ( sfnt ) + return sfnt->get_interface( driver, tt_interface ); + } + + return 0; + } + + + /* The FT_DriverInterface structure is defined in ftdriver.h. */ + +#ifdef TT_USE_BYTECODE_INTERPRETER +#define TT_HINTER_FLAG FT_MODULE_DRIVER_HAS_HINTER +#else +#define TT_HINTER_FLAG 0 +#endif + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#define TT_SIZE_SELECT tt_size_select +#else +#define TT_SIZE_SELECT 0 +#endif + + FT_DEFINE_DRIVER(tt_driver_class, + + + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + TT_HINTER_FLAG, + + sizeof ( TT_DriverRec ), + + "truetype", /* driver name */ + 0x10000L, /* driver version == 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or above */ + + (void*)0, /* driver specific interface */ + + tt_driver_init, + tt_driver_done, + tt_get_interface, + + sizeof ( TT_FaceRec ), + sizeof ( TT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + tt_face_init, + tt_face_done, + tt_size_init, + tt_size_done, + tt_slot_init, + 0, /* FT_Slot_DoneFunc */ + + ft_stub_set_char_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + Load_Glyph, + + tt_get_kerning, + 0, /* FT_Face_AttachFunc */ + tt_get_advances, + + tt_size_request, + TT_SIZE_SELECT + ) + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttdriver.h b/android/jni/ndk_modules/freetype/src/truetype/ttdriver.h new file mode 100644 index 00000000..aae00f26 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttdriver.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* ttdriver.h */ +/* */ +/* High-level TrueType driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTDRIVER_H__ +#define __TTDRIVER_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_DRIVER( tt_driver_class ) + + +FT_END_HEADER + +#endif /* __TTDRIVER_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/tterrors.h b/android/jni/ndk_modules/freetype/src/truetype/tterrors.h new file mode 100644 index 00000000..d317c70e --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/tterrors.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* tterrors.h */ +/* */ +/* TrueType error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the TrueType error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __TTERRORS_H__ +#define __TTERRORS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX TT_Err_ +#define FT_ERR_BASE FT_Mod_Err_TrueType + +#include FT_ERRORS_H + +#endif /* __TTERRORS_H__ */ + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttgload.c b/android/jni/ndk_modules/freetype/src/truetype/ttgload.c new file mode 100644 index 00000000..1b496c04 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttgload.c @@ -0,0 +1,2144 @@ +/***************************************************************************/ +/* */ +/* ttgload.c */ +/* */ +/* TrueType Glyph Loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_TAGS_H +#include FT_OUTLINE_H + +#include "ttgload.h" +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttgload + + + /*************************************************************************/ + /* */ + /* Composite font flags. */ + /* */ +#define ARGS_ARE_WORDS 0x0001 +#define ARGS_ARE_XY_VALUES 0x0002 +#define ROUND_XY_TO_GRID 0x0004 +#define WE_HAVE_A_SCALE 0x0008 +/* reserved 0x0010 */ +#define MORE_COMPONENTS 0x0020 +#define WE_HAVE_AN_XY_SCALE 0x0040 +#define WE_HAVE_A_2X2 0x0080 +#define WE_HAVE_INSTR 0x0100 +#define USE_MY_METRICS 0x0200 +#define OVERLAP_COMPOUND 0x0400 +#define SCALED_COMPONENT_OFFSET 0x0800 +#define UNSCALED_COMPONENT_OFFSET 0x1000 + + + /*************************************************************************/ + /* */ + /* Returns the horizontal metrics in font units for a given glyph. If */ + /* `check' is true, take care of monospaced fonts by returning the */ + /* advance width maximum. */ + /* */ + FT_LOCAL_DEF( void ) + TT_Get_HMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* lsb, + FT_UShort* aw ) + { + ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw ); + + if ( check && face->postscript.isFixedPitch ) + *aw = face->horizontal.advance_Width_Max; + + FT_TRACE5(( " advance width (font units): %d\n", *aw )); + FT_TRACE5(( " left side bearing (font units): %d\n", *lsb )); + } + + + /*************************************************************************/ + /* */ + /* Returns the vertical metrics in font units for a given glyph. */ + /* Greg Hitchcock from Microsoft told us that if there were no `vmtx' */ + /* table, typoAscender/Descender from the `OS/2' table would be used */ + /* instead, and if there were no `OS/2' table, use ascender/descender */ + /* from the `hhea' table. But that is not what Microsoft's rasterizer */ + /* apparently does: It uses the ppem value as the advance height, and */ + /* sets the top side bearing to be zero. */ + /* */ + /* The monospace `check' is probably not meaningful here, but we leave */ + /* it in for a consistent interface. */ + /* */ + FT_LOCAL_DEF( void ) + TT_Get_VMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* tsb, + FT_UShort* ah ) + { + FT_UNUSED( check ); + + if ( face->vertical_info ) + ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah ); + +#if 1 /* Empirically determined, at variance with what MS said */ + + else + { + *tsb = 0; + *ah = face->root.units_per_EM; + } + +#else /* This is what MS said to do. It isn't what they do, however. */ + + else if ( face->os2.version != 0xFFFFU ) + { + *tsb = face->os2.sTypoAscender; + *ah = face->os2.sTypoAscender - face->os2.sTypoDescender; + } + else + { + *tsb = face->horizontal.Ascender; + *ah = face->horizontal.Ascender - face->horizontal.Descender; + } + +#endif + + FT_TRACE5(( " advance height (font units): %d\n", *ah )); + FT_TRACE5(( " top side bearing (font units): %d\n", *tsb )); + } + + + static void + tt_get_metrics( TT_Loader loader, + FT_UInt glyph_index ) + { + TT_Face face = (TT_Face)loader->face; + + FT_Short left_bearing = 0, top_bearing = 0; + FT_UShort advance_width = 0, advance_height = 0; + + + TT_Get_HMetrics( face, glyph_index, + (FT_Bool)!( loader->load_flags & + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), + &left_bearing, + &advance_width ); + TT_Get_VMetrics( face, glyph_index, + (FT_Bool)!( loader->load_flags & + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), + &top_bearing, + &advance_height ); + + loader->left_bearing = left_bearing; + loader->advance = advance_width; + loader->top_bearing = top_bearing; + loader->vadvance = advance_height; + + if ( !loader->linear_def ) + { + loader->linear_def = 1; + loader->linear = advance_width; + } + } + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + static void + tt_get_metrics_incr_overrides( TT_Loader loader, + FT_UInt glyph_index ) + { + TT_Face face = (TT_Face)loader->face; + + FT_Short left_bearing = 0, top_bearing = 0; + FT_UShort advance_width = 0, advance_height = 0; + + + /* If this is an incrementally loaded font check whether there are */ + /* overriding metrics for this glyph. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + FT_Error error; + + + metrics.bearing_x = loader->left_bearing; + metrics.bearing_y = 0; + metrics.advance = loader->advance; + metrics.advance_v = 0; + + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &metrics ); + if ( error ) + goto Exit; + + left_bearing = (FT_Short)metrics.bearing_x; + advance_width = (FT_UShort)metrics.advance; + +#if 0 + + /* GWW: Do I do the same for vertical metrics? */ + metrics.bearing_x = 0; + metrics.bearing_y = loader->top_bearing; + metrics.advance = loader->vadvance; + + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, TRUE, &metrics ); + if ( error ) + goto Exit; + + top_bearing = (FT_Short)metrics.bearing_y; + advance_height = (FT_UShort)metrics.advance; + +#endif /* 0 */ + + loader->left_bearing = left_bearing; + loader->advance = advance_width; + loader->top_bearing = top_bearing; + loader->vadvance = advance_height; + + if ( !loader->linear_def ) + { + loader->linear_def = 1; + loader->linear = advance_width; + } + } + + Exit: + return; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + + /*************************************************************************/ + /* */ + /* Translates an array of coordinates. */ + /* */ + static void + translate_array( FT_UInt n, + FT_Vector* coords, + FT_Pos delta_x, + FT_Pos delta_y ) + { + FT_UInt k; + + + if ( delta_x ) + for ( k = 0; k < n; k++ ) + coords[k].x += delta_x; + + if ( delta_y ) + for ( k = 0; k < n; k++ ) + coords[k].y += delta_y; + } + + +#undef IS_HINTED +#define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 ) + + + /*************************************************************************/ + /* */ + /* The following functions are used by default with TrueType fonts. */ + /* However, they can be replaced by alternatives if we need to support */ + /* TrueType-compressed formats (like MicroType) in the future. */ + /* */ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + TT_Access_Glyph_Frame( TT_Loader loader, + FT_UInt glyph_index, + FT_ULong offset, + FT_UInt byte_count ) + { + FT_Error error; + FT_Stream stream = loader->stream; + + /* for non-debug mode */ + FT_UNUSED( glyph_index ); + + + FT_TRACE4(( "Glyph %ld\n", glyph_index )); + + /* the following line sets the `error' variable through macros! */ + if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) ) + return error; + + loader->cursor = stream->cursor; + loader->limit = stream->limit; + + return TT_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + TT_Forget_Glyph_Frame( TT_Loader loader ) + { + FT_Stream stream = loader->stream; + + + FT_FRAME_EXIT(); + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Glyph_Header( TT_Loader loader ) + { + FT_Byte* p = loader->cursor; + FT_Byte* limit = loader->limit; + + + if ( p + 10 > limit ) + return TT_Err_Invalid_Outline; + + loader->n_contours = FT_NEXT_SHORT( p ); + + loader->bbox.xMin = FT_NEXT_SHORT( p ); + loader->bbox.yMin = FT_NEXT_SHORT( p ); + loader->bbox.xMax = FT_NEXT_SHORT( p ); + loader->bbox.yMax = FT_NEXT_SHORT( p ); + + FT_TRACE5(( " # of contours: %d\n", loader->n_contours )); + FT_TRACE5(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin, + loader->bbox.xMax )); + FT_TRACE5(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin, + loader->bbox.yMax )); + loader->cursor = p; + + return TT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Simple_Glyph( TT_Loader load ) + { + FT_Error error; + FT_Byte* p = load->cursor; + FT_Byte* limit = load->limit; + FT_GlyphLoader gloader = load->gloader; + FT_Int n_contours = load->n_contours; + FT_Outline* outline; + TT_Face face = (TT_Face)load->face; + FT_UShort n_ins; + FT_Int n_points; + + FT_Byte *flag, *flag_limit; + FT_Byte c, count; + FT_Vector *vec, *vec_limit; + FT_Pos x; + FT_Short *cont, *cont_limit, prev_cont; + FT_Int xy_size = 0; + + + /* check that we can add the contours to the glyph */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours ); + if ( error ) + goto Fail; + + /* reading the contours' endpoints & number of points */ + cont = gloader->current.outline.contours; + cont_limit = cont + n_contours; + + /* check space for contours array + instructions count */ + if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit ) + goto Invalid_Outline; + + prev_cont = FT_NEXT_USHORT( p ); + + if ( n_contours > 0 ) + cont[0] = prev_cont; + + for ( cont++; cont < cont_limit; cont++ ) + { + cont[0] = FT_NEXT_USHORT( p ); + if ( cont[0] <= prev_cont ) + { + /* unordered contours: this is invalid */ + error = TT_Err_Invalid_Table; + goto Fail; + } + prev_cont = cont[0]; + } + + n_points = 0; + if ( n_contours > 0 ) + { + n_points = cont[-1] + 1; + if ( n_points < 0 ) + goto Invalid_Outline; + } + + /* note that we will add four phantom points later */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 ); + if ( error ) + goto Fail; + + /* we'd better check the contours table right now */ + outline = &gloader->current.outline; + + for ( cont = outline->contours + 1; cont < cont_limit; cont++ ) + if ( cont[-1] >= cont[0] ) + goto Invalid_Outline; + + /* reading the bytecode instructions */ + load->glyph->control_len = 0; + load->glyph->control_data = 0; + + if ( p + 2 > limit ) + goto Invalid_Outline; + + n_ins = FT_NEXT_USHORT( p ); + + FT_TRACE5(( " Instructions size: %u\n", n_ins )); + + if ( n_ins > face->max_profile.maxSizeOfInstructions ) + { + FT_TRACE0(( "TT_Load_Simple_Glyph: too many instructions (%d)\n", + n_ins )); + error = TT_Err_Too_Many_Hints; + goto Fail; + } + + if ( ( limit - p ) < n_ins ) + { + FT_TRACE0(( "TT_Load_Simple_Glyph: instruction count mismatch\n" )); + error = TT_Err_Too_Many_Hints; + goto Fail; + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( IS_HINTED( load->load_flags ) ) + { + load->glyph->control_len = n_ins; + load->glyph->control_data = load->exec->glyphIns; + + FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins ); + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + p += n_ins; + + /* reading the point tags */ + flag = (FT_Byte*)outline->tags; + flag_limit = flag + n_points; + + FT_ASSERT( flag != NULL ); + + while ( flag < flag_limit ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + *flag++ = c = FT_NEXT_BYTE( p ); + if ( c & 8 ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + count = FT_NEXT_BYTE( p ); + if ( flag + (FT_Int)count > flag_limit ) + goto Invalid_Outline; + + for ( ; count > 0; count-- ) + *flag++ = c; + } + } + + /* reading the X coordinates */ + + vec = outline->points; + vec_limit = vec + n_points; + flag = (FT_Byte*)outline->tags; + x = 0; + + if ( p + xy_size > limit ) + goto Invalid_Outline; + + for ( ; vec < vec_limit; vec++, flag++ ) + { + FT_Pos y = 0; + FT_Byte f = *flag; + + + if ( f & 2 ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_BYTE( p ); + if ( ( f & 16 ) == 0 ) + y = -y; + } + else if ( ( f & 16 ) == 0 ) + { + if ( p + 2 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_SHORT( p ); + } + + x += y; + vec->x = x; + /* the cast is for stupid compilers */ + *flag = (FT_Byte)( f & ~( 2 | 16 ) ); + } + + /* reading the Y coordinates */ + + vec = gloader->current.outline.points; + vec_limit = vec + n_points; + flag = (FT_Byte*)outline->tags; + x = 0; + + for ( ; vec < vec_limit; vec++, flag++ ) + { + FT_Pos y = 0; + FT_Byte f = *flag; + + + if ( f & 4 ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_BYTE( p ); + if ( ( f & 32 ) == 0 ) + y = -y; + } + else if ( ( f & 32 ) == 0 ) + { + if ( p + 2 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_SHORT( p ); + } + + x += y; + vec->y = x; + /* the cast is for stupid compilers */ + *flag = (FT_Byte)( f & FT_CURVE_TAG_ON ); + } + + outline->n_points = (FT_UShort)n_points; + outline->n_contours = (FT_Short) n_contours; + + load->cursor = p; + + Fail: + return error; + + Invalid_Outline: + error = TT_Err_Invalid_Outline; + goto Fail; + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Composite_Glyph( TT_Loader loader ) + { + FT_Error error; + FT_Byte* p = loader->cursor; + FT_Byte* limit = loader->limit; + FT_GlyphLoader gloader = loader->gloader; + FT_SubGlyph subglyph; + FT_UInt num_subglyphs; + + + num_subglyphs = 0; + + do + { + FT_Fixed xx, xy, yy, yx; + FT_UInt count; + + + /* check that we can load a new subglyph */ + error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 ); + if ( error ) + goto Fail; + + /* check space */ + if ( p + 4 > limit ) + goto Invalid_Composite; + + subglyph = gloader->current.subglyphs + num_subglyphs; + + subglyph->arg1 = subglyph->arg2 = 0; + + subglyph->flags = FT_NEXT_USHORT( p ); + subglyph->index = FT_NEXT_USHORT( p ); + + /* check space */ + count = 2; + if ( subglyph->flags & ARGS_ARE_WORDS ) + count += 2; + if ( subglyph->flags & WE_HAVE_A_SCALE ) + count += 2; + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + count += 4; + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + count += 8; + + if ( p + count > limit ) + goto Invalid_Composite; + + /* read arguments */ + if ( subglyph->flags & ARGS_ARE_WORDS ) + { + subglyph->arg1 = FT_NEXT_SHORT( p ); + subglyph->arg2 = FT_NEXT_SHORT( p ); + } + else + { + subglyph->arg1 = FT_NEXT_CHAR( p ); + subglyph->arg2 = FT_NEXT_CHAR( p ); + } + + /* read transform */ + xx = yy = 0x10000L; + xy = yx = 0; + + if ( subglyph->flags & WE_HAVE_A_SCALE ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + yy = xx; + } + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + } + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + yx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + xy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + } + + subglyph->transform.xx = xx; + subglyph->transform.xy = xy; + subglyph->transform.yx = yx; + subglyph->transform.yy = yy; + + num_subglyphs++; + + } while ( subglyph->flags & MORE_COMPONENTS ); + + gloader->current.num_subglyphs = num_subglyphs; + +#ifdef TT_USE_BYTECODE_INTERPRETER + + { + FT_Stream stream = loader->stream; + + + /* we must undo the FT_FRAME_ENTER in order to point */ + /* to the composite instructions, if we find some. */ + /* We will process them later. */ + /* */ + loader->ins_pos = (FT_ULong)( FT_STREAM_POS() + + p - limit ); + } + +#endif + + loader->cursor = p; + + Fail: + return error; + + Invalid_Composite: + error = TT_Err_Invalid_Composite; + goto Fail; + } + + + FT_LOCAL_DEF( void ) + TT_Init_Glyph_Loading( TT_Face face ) + { + face->access_glyph_frame = TT_Access_Glyph_Frame; + face->read_glyph_header = TT_Load_Glyph_Header; + face->read_simple_glyph = TT_Load_Simple_Glyph; + face->read_composite_glyph = TT_Load_Composite_Glyph; + face->forget_glyph_frame = TT_Forget_Glyph_Frame; + } + + + static void + tt_prepare_zone( TT_GlyphZone zone, + FT_GlyphLoad load, + FT_UInt start_point, + FT_UInt start_contour ) + { + zone->n_points = (FT_UShort)( load->outline.n_points - start_point ); + zone->n_contours = (FT_Short) ( load->outline.n_contours - + start_contour ); + zone->org = load->extra_points + start_point; + zone->cur = load->outline.points + start_point; + zone->orus = load->extra_points2 + start_point; + zone->tags = (FT_Byte*)load->outline.tags + start_point; + zone->contours = (FT_UShort*)load->outline.contours + start_contour; + zone->first_point = (FT_UShort)start_point; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Hint_Glyph */ + /* */ + /* <Description> */ + /* Hint the glyph using the zone prepared by the caller. Note that */ + /* the zone is supposed to include four phantom points. */ + /* */ + static FT_Error + TT_Hint_Glyph( TT_Loader loader, + FT_Bool is_composite ) + { + TT_GlyphZone zone = &loader->zone; + FT_Pos origin; + +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_UInt n_ins; +#else + FT_UNUSED( is_composite ); +#endif + + +#ifdef TT_USE_BYTECODE_INTERPRETER + if ( loader->glyph->control_len > 0xFFFFL ) + { + FT_TRACE1(( "TT_Hint_Glyph: too long instructions " )); + FT_TRACE1(( "(0x%lx byte) is truncated\n", + loader->glyph->control_len )); + } + n_ins = (FT_UInt)( loader->glyph->control_len ); +#endif + + origin = zone->cur[zone->n_points - 4].x; + origin = FT_PIX_ROUND( origin ) - origin; + if ( origin ) + translate_array( zone->n_points, zone->cur, origin, 0 ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + /* save original point position in org */ + if ( n_ins > 0 ) + FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points ); + + /* Reset graphics state. */ + loader->exec->GS = ((TT_Size)loader->size)->GS; + + /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */ + /* completely refer to the (already) hinted subglyphs. */ + if ( is_composite ) + { + loader->exec->metrics.x_scale = 1 << 16; + loader->exec->metrics.y_scale = 1 << 16; + + FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points ); + } + else + { + loader->exec->metrics.x_scale = + ((TT_Size)loader->size)->metrics.x_scale; + loader->exec->metrics.y_scale = + ((TT_Size)loader->size)->metrics.y_scale; + } +#endif + + /* round pp2 and pp4 */ + zone->cur[zone->n_points - 3].x = + FT_PIX_ROUND( zone->cur[zone->n_points - 3].x ); + zone->cur[zone->n_points - 1].y = + FT_PIX_ROUND( zone->cur[zone->n_points - 1].y ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( n_ins > 0 ) + { + FT_Bool debug; + FT_Error error; + + FT_GlyphLoader gloader = loader->gloader; + FT_Outline current_outline = gloader->current.outline; + + + error = TT_Set_CodeRange( loader->exec, tt_coderange_glyph, + loader->exec->glyphIns, n_ins ); + if ( error ) + return error; + + loader->exec->is_composite = is_composite; + loader->exec->pts = *zone; + + debug = FT_BOOL( !( loader->load_flags & FT_LOAD_NO_SCALE ) && + ((TT_Size)loader->size)->debug ); + + error = TT_Run_Context( loader->exec, debug ); + if ( error && loader->exec->pedantic_hinting ) + return error; + + /* store drop-out mode in bits 5-7; set bit 2 also as a marker */ + current_outline.tags[0] |= + ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE; + } + +#endif + + /* save glyph phantom points */ + if ( !loader->preserve_pps ) + { + loader->pp1 = zone->cur[zone->n_points - 4]; + loader->pp2 = zone->cur[zone->n_points - 3]; + loader->pp3 = zone->cur[zone->n_points - 2]; + loader->pp4 = zone->cur[zone->n_points - 1]; + } + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Process_Simple_Glyph */ + /* */ + /* <Description> */ + /* Once a simple glyph has been loaded, it needs to be processed. */ + /* Usually, this means scaling and hinting through bytecode */ + /* interpretation. */ + /* */ + static FT_Error + TT_Process_Simple_Glyph( TT_Loader loader ) + { + FT_GlyphLoader gloader = loader->gloader; + FT_Error error = TT_Err_Ok; + FT_Outline* outline; + FT_Int n_points; + + + outline = &gloader->current.outline; + n_points = outline->n_points; + + /* set phantom points */ + + outline->points[n_points ] = loader->pp1; + outline->points[n_points + 1] = loader->pp2; + outline->points[n_points + 2] = loader->pp3; + outline->points[n_points + 3] = loader->pp4; + + outline->tags[n_points ] = 0; + outline->tags[n_points + 1] = 0; + outline->tags[n_points + 2] = 0; + outline->tags[n_points + 3] = 0; + + n_points += 4; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( ((TT_Face)loader->face)->doblend ) + { + /* Deltas apply to the unscaled data. */ + FT_Vector* deltas; + FT_Memory memory = loader->face->memory; + FT_Int i; + + + error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face), + loader->glyph_index, + &deltas, + n_points ); + if ( error ) + return error; + + for ( i = 0; i < n_points; ++i ) + { + outline->points[i].x += deltas[i].x; + outline->points[i].y += deltas[i].y; + } + + FT_FREE( deltas ); + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + if ( IS_HINTED( loader->load_flags ) ) + { + tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 ); + + FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur, + loader->zone.n_points + 4 ); + } + + /* scale the glyph */ + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + FT_Vector* vec = outline->points; + FT_Vector* limit = outline->points + n_points; + FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale; + FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale; + + + for ( ; vec < limit; vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + loader->pp1 = outline->points[n_points - 4]; + loader->pp2 = outline->points[n_points - 3]; + loader->pp3 = outline->points[n_points - 2]; + loader->pp4 = outline->points[n_points - 1]; + } + + if ( IS_HINTED( loader->load_flags ) ) + { + loader->zone.n_points += 4; + + error = TT_Hint_Glyph( loader, 0 ); + } + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Process_Composite_Component */ + /* */ + /* <Description> */ + /* Once a composite component has been loaded, it needs to be */ + /* processed. Usually, this means transforming and translating. */ + /* */ + static FT_Error + TT_Process_Composite_Component( TT_Loader loader, + FT_SubGlyph subglyph, + FT_UInt start_point, + FT_UInt num_base_points ) + { + FT_GlyphLoader gloader = loader->gloader; + FT_Vector* base_vec = gloader->base.outline.points; + FT_UInt num_points = gloader->base.outline.n_points; + FT_Bool have_scale; + FT_Pos x, y; + + + have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE | + WE_HAVE_AN_XY_SCALE | + WE_HAVE_A_2X2 ) ); + + /* perform the transform required for this subglyph */ + if ( have_scale ) + { + FT_UInt i; + + + for ( i = num_base_points; i < num_points; i++ ) + FT_Vector_Transform( base_vec + i, &subglyph->transform ); + } + + /* get offset */ + if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) ) + { + FT_UInt k = subglyph->arg1; + FT_UInt l = subglyph->arg2; + FT_Vector* p1; + FT_Vector* p2; + + + /* match l-th point of the newly loaded component to the k-th point */ + /* of the previously loaded components. */ + + /* change to the point numbers used by our outline */ + k += start_point; + l += num_base_points; + if ( k >= num_base_points || + l >= num_points ) + return TT_Err_Invalid_Composite; + + p1 = gloader->base.outline.points + k; + p2 = gloader->base.outline.points + l; + + x = p1->x - p2->x; + y = p1->y - p2->y; + } + else + { + x = subglyph->arg1; + y = subglyph->arg2; + + if ( !x && !y ) + return TT_Err_Ok; + + /* Use a default value dependent on */ + /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED. This is useful for old TT */ + /* fonts which don't set the xxx_COMPONENT_OFFSET bit. */ + + if ( have_scale && +#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) ) +#else + ( subglyph->flags & SCALED_COMPONENT_OFFSET ) ) +#endif + { + +#if 0 + + /*************************************************************************/ + /* */ + /* This algorithm is what Apple documents. But it doesn't work. */ + /* */ + int a = subglyph->transform.xx > 0 ? subglyph->transform.xx + : -subglyph->transform.xx; + int b = subglyph->transform.yx > 0 ? subglyph->transform.yx + : -subglyph->transform.yx; + int c = subglyph->transform.xy > 0 ? subglyph->transform.xy + : -subglyph->transform.xy; + int d = subglyph->transform.yy > 0 ? subglyph->transform.yy + : -subglyph->transform.yy; + int m = a > b ? a : b; + int n = c > d ? c : d; + + + if ( a - b <= 33 && a - b >= -33 ) + m *= 2; + if ( c - d <= 33 && c - d >= -33 ) + n *= 2; + x = FT_MulFix( x, m ); + y = FT_MulFix( y, n ); + +#else /* 0 */ + + /*************************************************************************/ + /* */ + /* This algorithm is a guess and works much better than the above. */ + /* */ + FT_Fixed mac_xscale = FT_SqrtFixed( + (FT_Int32)FT_MulFix( subglyph->transform.xx, + subglyph->transform.xx ) + + (FT_Int32)FT_MulFix( subglyph->transform.xy, + subglyph->transform.xy ) ); + FT_Fixed mac_yscale = FT_SqrtFixed( + (FT_Int32)FT_MulFix( subglyph->transform.yy, + subglyph->transform.yy ) + + (FT_Int32)FT_MulFix( subglyph->transform.yx, + subglyph->transform.yx ) ); + + + x = FT_MulFix( x, mac_xscale ); + y = FT_MulFix( y, mac_yscale ); + +#endif /* 0 */ + + } + + if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) + { + FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale; + FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale; + + + x = FT_MulFix( x, x_scale ); + y = FT_MulFix( y, y_scale ); + + if ( subglyph->flags & ROUND_XY_TO_GRID ) + { + x = FT_PIX_ROUND( x ); + y = FT_PIX_ROUND( y ); + } + } + } + + if ( x || y ) + translate_array( num_points - num_base_points, + base_vec + num_base_points, + x, y ); + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Process_Composite_Glyph */ + /* */ + /* <Description> */ + /* This is slightly different from TT_Process_Simple_Glyph, in that */ + /* its sole purpose is to hint the glyph. Thus this function is */ + /* only available when bytecode interpreter is enabled. */ + /* */ + static FT_Error + TT_Process_Composite_Glyph( TT_Loader loader, + FT_UInt start_point, + FT_UInt start_contour ) + { + FT_Error error; + FT_Outline* outline; + FT_UInt i; + + + outline = &loader->gloader->base.outline; + + /* make room for phantom points */ + error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader, + outline->n_points + 4, + 0 ); + if ( error ) + return error; + + outline->points[outline->n_points ] = loader->pp1; + outline->points[outline->n_points + 1] = loader->pp2; + outline->points[outline->n_points + 2] = loader->pp3; + outline->points[outline->n_points + 3] = loader->pp4; + + outline->tags[outline->n_points ] = 0; + outline->tags[outline->n_points + 1] = 0; + outline->tags[outline->n_points + 2] = 0; + outline->tags[outline->n_points + 3] = 0; + +#ifdef TT_USE_BYTECODE_INTERPRETER + + { + FT_Stream stream = loader->stream; + FT_UShort n_ins, max_ins; + FT_ULong tmp; + + + /* TT_Load_Composite_Glyph only gives us the offset of instructions */ + /* so we read them here */ + if ( FT_STREAM_SEEK( loader->ins_pos ) || + FT_READ_USHORT( n_ins ) ) + return error; + + FT_TRACE5(( " Instructions size = %d\n", n_ins )); + + /* check it */ + max_ins = ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions; + if ( n_ins > max_ins ) + { + /* acroread ignores this field, so we only do a rough safety check */ + if ( (FT_Int)n_ins > loader->byte_len ) + { + FT_TRACE1(( "TT_Process_Composite_Glyph: " + "too many instructions (%d) for glyph with length %d\n", + n_ins, loader->byte_len )); + return TT_Err_Too_Many_Hints; + } + + tmp = loader->exec->glyphSize; + error = Update_Max( loader->exec->memory, + &tmp, + sizeof ( FT_Byte ), + (void*)&loader->exec->glyphIns, + n_ins ); + loader->exec->glyphSize = (FT_UShort)tmp; + if ( error ) + return error; + } + else if ( n_ins == 0 ) + return TT_Err_Ok; + + if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) ) + return error; + + loader->glyph->control_data = loader->exec->glyphIns; + loader->glyph->control_len = n_ins; + } + +#endif + + tt_prepare_zone( &loader->zone, &loader->gloader->base, + start_point, start_contour ); + + /* Some points are likely touched during execution of */ + /* instructions on components. So let's untouch them. */ + for ( i = start_point; i < loader->zone.n_points; i++ ) + loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH; + + loader->zone.n_points += 4; + + return TT_Hint_Glyph( loader, 1 ); + } + + + /* Calculate the four phantom points. */ + /* The first two stand for horizontal origin and advance. */ + /* The last two stand for vertical origin and advance. */ +#define TT_LOADER_SET_PP( loader ) \ + do { \ + (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \ + (loader)->pp1.y = 0; \ + (loader)->pp2.x = (loader)->pp1.x + (loader)->advance; \ + (loader)->pp2.y = 0; \ + (loader)->pp3.x = 0; \ + (loader)->pp3.y = (loader)->top_bearing + (loader)->bbox.yMax; \ + (loader)->pp4.x = 0; \ + (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance; \ + } while ( 0 ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* load_truetype_glyph */ + /* */ + /* <Description> */ + /* Loads a given truetype glyph. Handles composites and uses a */ + /* TT_Loader object. */ + /* */ + static FT_Error + load_truetype_glyph( TT_Loader loader, + FT_UInt glyph_index, + FT_UInt recurse_count, + FT_Bool header_only ) + { + FT_Error error = TT_Err_Ok; + FT_Fixed x_scale, y_scale; + FT_ULong offset; + TT_Face face = (TT_Face)loader->face; + FT_GlyphLoader gloader = loader->gloader; + FT_Bool opened_frame = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Vector* deltas = NULL; +#endif + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_StreamRec inc_stream; + FT_Data glyph_data; + FT_Bool glyph_data_loaded = 0; +#endif + + + /* some fonts have an incorrect value of `maxComponentDepth', */ + /* thus we allow depth 1 to catch the majority of them */ + if ( recurse_count > 1 && + recurse_count > face->max_profile.maxComponentDepth ) + { + error = TT_Err_Invalid_Composite; + goto Exit; + } + + /* check glyph index */ + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + error = TT_Err_Invalid_Glyph_Index; + goto Exit; + } + + loader->glyph_index = glyph_index; + + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + x_scale = ((TT_Size)loader->size)->metrics.x_scale; + y_scale = ((TT_Size)loader->size)->metrics.y_scale; + } + else + { + x_scale = 0x10000L; + y_scale = 0x10000L; + } + + tt_get_metrics( loader, glyph_index ); + + /* Set `offset' to the start of the glyph relative to the start of */ + /* the `glyf' table, and `byte_len' to the length of the glyph in */ + /* bytes. */ + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* If we are loading glyph data via the incremental interface, set */ + /* the loader stream to a memory stream reading the data returned */ + /* by the interface. */ + if ( face->root.internal->incremental_interface ) + { + error = face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->object, + glyph_index, &glyph_data ); + if ( error ) + goto Exit; + + glyph_data_loaded = 1; + offset = 0; + loader->byte_len = glyph_data.length; + + FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) ); + FT_Stream_OpenMemory( &inc_stream, + glyph_data.pointer, glyph_data.length ); + + loader->stream = &inc_stream; + } + else + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + offset = tt_face_get_location( face, glyph_index, + (FT_UInt*)&loader->byte_len ); + + if ( loader->byte_len > 0 ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* for the incremental interface, `glyf_offset' is always zero */ + if ( !loader->glyf_offset && + !face->root.internal->incremental_interface ) +#else + if ( !loader->glyf_offset ) +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" )); + error = TT_Err_Invalid_Table; + goto Exit; + } + + error = face->access_glyph_frame( loader, glyph_index, + loader->glyf_offset + offset, + loader->byte_len ); + if ( error ) + goto Exit; + + opened_frame = 1; + + /* read glyph header first */ + error = face->read_glyph_header( loader ); + if ( error || header_only ) + goto Exit; + } + + if ( loader->byte_len == 0 || loader->n_contours == 0 ) + { + loader->bbox.xMin = 0; + loader->bbox.xMax = 0; + loader->bbox.yMin = 0; + loader->bbox.yMax = 0; + + if ( header_only ) + goto Exit; + + /* must initialize points before (possibly) overriding */ + /* glyph metrics from the incremental interface */ + TT_LOADER_SET_PP( loader ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + tt_get_metrics_incr_overrides( loader, glyph_index ); +#endif + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( ((TT_Face)(loader->face))->doblend ) + { + /* this must be done before scaling */ + FT_Memory memory = loader->face->memory; + + + error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face), + glyph_index, &deltas, 4 ); + if ( error ) + goto Exit; + + loader->pp1.x += deltas[0].x; loader->pp1.y += deltas[0].y; + loader->pp2.x += deltas[1].x; loader->pp2.y += deltas[1].y; + loader->pp3.x += deltas[2].x; loader->pp3.y += deltas[2].y; + loader->pp4.x += deltas[3].x; loader->pp4.y += deltas[3].y; + + FT_FREE( deltas ); + } + +#endif + + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } + + error = TT_Err_Ok; + goto Exit; + } + + /* must initialize points before (possibly) overriding */ + /* glyph metrics from the incremental interface */ + TT_LOADER_SET_PP( loader ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + tt_get_metrics_incr_overrides( loader, glyph_index ); +#endif + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + /* if it is a simple glyph, load it */ + + if ( loader->n_contours > 0 ) + { + error = face->read_simple_glyph( loader ); + if ( error ) + goto Exit; + + /* all data have been read */ + face->forget_glyph_frame( loader ); + opened_frame = 0; + + error = TT_Process_Simple_Glyph( loader ); + if ( error ) + goto Exit; + + FT_GlyphLoader_Add( gloader ); + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + /* otherwise, load a composite! */ + else if ( loader->n_contours == -1 ) + { + FT_UInt start_point; + FT_UInt start_contour; + FT_ULong ins_pos; /* position of composite instructions, if any */ + + + start_point = gloader->base.outline.n_points; + start_contour = gloader->base.outline.n_contours; + + /* for each subglyph, read composite header */ + error = face->read_composite_glyph( loader ); + if ( error ) + goto Exit; + + /* store the offset of instructions */ + ins_pos = loader->ins_pos; + + /* all data we need are read */ + face->forget_glyph_frame( loader ); + opened_frame = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( face->doblend ) + { + FT_Int i, limit; + FT_SubGlyph subglyph; + FT_Memory memory = face->root.memory; + + + /* this provides additional offsets */ + /* for each component's translation */ + + if ( ( error = TT_Vary_Get_Glyph_Deltas( + face, + glyph_index, + &deltas, + gloader->current.num_subglyphs + 4 )) != 0 ) + goto Exit; + + subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs; + limit = gloader->current.num_subglyphs; + + for ( i = 0; i < limit; ++i, ++subglyph ) + { + if ( subglyph->flags & ARGS_ARE_XY_VALUES ) + { + /* XXX: overflow check for subglyph->{arg1,arg2}. */ + /* deltas[i].{x,y} must be within signed 16-bit, */ + /* but the restriction of summed delta is not clear */ + subglyph->arg1 += (FT_Int16)deltas[i].x; + subglyph->arg2 += (FT_Int16)deltas[i].y; + } + } + + loader->pp1.x += deltas[i + 0].x; loader->pp1.y += deltas[i + 0].y; + loader->pp2.x += deltas[i + 1].x; loader->pp2.y += deltas[i + 1].y; + loader->pp3.x += deltas[i + 2].x; loader->pp3.y += deltas[i + 2].y; + loader->pp4.x += deltas[i + 3].x; loader->pp4.y += deltas[i + 3].y; + + FT_FREE( deltas ); + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } + + /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */ + /* `as is' in the glyph slot (the client application will be */ + /* responsible for interpreting these data)... */ + if ( loader->load_flags & FT_LOAD_NO_RECURSE ) + { + FT_GlyphLoader_Add( gloader ); + loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + goto Exit; + } + + /*********************************************************************/ + /*********************************************************************/ + /*********************************************************************/ + + { + FT_UInt n, num_base_points; + FT_SubGlyph subglyph = 0; + + FT_UInt num_points = start_point; + FT_UInt num_subglyphs = gloader->current.num_subglyphs; + FT_UInt num_base_subgs = gloader->base.num_subglyphs; + + FT_Stream old_stream = loader->stream; + FT_Int old_byte_len = loader->byte_len; + + + FT_GlyphLoader_Add( gloader ); + + /* read each subglyph independently */ + for ( n = 0; n < num_subglyphs; n++ ) + { + FT_Vector pp[4]; + + + /* Each time we call load_truetype_glyph in this loop, the */ + /* value of `gloader.base.subglyphs' can change due to table */ + /* reallocations. We thus need to recompute the subglyph */ + /* pointer on each iteration. */ + subglyph = gloader->base.subglyphs + num_base_subgs + n; + + pp[0] = loader->pp1; + pp[1] = loader->pp2; + pp[2] = loader->pp3; + pp[3] = loader->pp4; + + num_base_points = gloader->base.outline.n_points; + + error = load_truetype_glyph( loader, subglyph->index, + recurse_count + 1, FALSE ); + if ( error ) + goto Exit; + + /* restore subglyph pointer */ + subglyph = gloader->base.subglyphs + num_base_subgs + n; + + if ( !( subglyph->flags & USE_MY_METRICS ) ) + { + loader->pp1 = pp[0]; + loader->pp2 = pp[1]; + loader->pp3 = pp[2]; + loader->pp4 = pp[3]; + } + + num_points = gloader->base.outline.n_points; + + if ( num_points == num_base_points ) + continue; + + /* gloader->base.outline consists of three parts: */ + /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */ + /* */ + /* (1): exists from the beginning */ + /* (2): components that have been loaded so far */ + /* (3): the newly loaded component */ + TT_Process_Composite_Component( loader, subglyph, start_point, + num_base_points ); + } + + loader->stream = old_stream; + loader->byte_len = old_byte_len; + + /* process the glyph */ + loader->ins_pos = ins_pos; + if ( IS_HINTED( loader->load_flags ) && + +#ifdef TT_USE_BYTECODE_INTERPRETER + + subglyph->flags & WE_HAVE_INSTR && + +#endif + + num_points > start_point ) + TT_Process_Composite_Glyph( loader, start_point, start_contour ); + + } + } + else + { + /* invalid composite count (negative but not -1) */ + error = TT_Err_Invalid_Outline; + goto Exit; + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + Exit: + + if ( opened_frame ) + face->forget_glyph_frame( loader ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( glyph_data_loaded ) + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &glyph_data ); + +#endif + + return error; + } + + + static FT_Error + compute_glyph_metrics( TT_Loader loader, + FT_UInt glyph_index ) + { + FT_BBox bbox; + TT_Face face = (TT_Face)loader->face; + FT_Fixed y_scale; + TT_GlyphSlot glyph = loader->glyph; + TT_Size size = (TT_Size)loader->size; + + + y_scale = 0x10000L; + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + y_scale = size->root.metrics.y_scale; + + if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE ) + FT_Outline_Get_CBox( &glyph->outline, &bbox ); + else + bbox = loader->bbox; + + /* get the device-independent horizontal advance; it is scaled later */ + /* by the base layer. */ + { + FT_Pos advance = loader->linear; + + + /* the flag FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH was introduced to */ + /* correctly support DynaLab fonts, which have an incorrect */ + /* `advance_Width_Max' field! It is used, to my knowledge, */ + /* exclusively in the X-TrueType font server. */ + /* */ + if ( face->postscript.isFixedPitch && + ( loader->load_flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) == 0 ) + advance = face->horizontal.advance_Width_Max; + + /* we need to return the advance in font units in linearHoriAdvance, */ + /* it will be scaled later by the base layer. */ + glyph->linearHoriAdvance = advance; + } + + glyph->metrics.horiBearingX = bbox.xMin; + glyph->metrics.horiBearingY = bbox.yMax; + glyph->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + + /* adjust advance width to the value contained in the hdmx table */ + if ( !face->postscript.isFixedPitch && + IS_HINTED( loader->load_flags ) ) + { + FT_Byte* widthp; + + + widthp = tt_face_get_device_metrics( face, + size->root.metrics.x_ppem, + glyph_index ); + + if ( widthp ) + glyph->metrics.horiAdvance = *widthp << 6; + } + + /* set glyph dimensions */ + glyph->metrics.width = bbox.xMax - bbox.xMin; + glyph->metrics.height = bbox.yMax - bbox.yMin; + + /* Now take care of vertical metrics. In the case where there is */ + /* no vertical information within the font (relatively common), */ + /* create some metrics manually */ + { + FT_Pos top; /* scaled vertical top side bearing */ + FT_Pos advance; /* scaled vertical advance height */ + + + /* Get the unscaled top bearing and advance height. */ + if ( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 ) + { + top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax, + y_scale ); + + if ( loader->pp3.y <= loader->pp4.y ) + advance = 0; + else + advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y, + y_scale ); + } + else + { + FT_Pos height; + + + /* XXX Compute top side bearing and advance height in */ + /* Get_VMetrics instead of here. */ + + /* NOTE: The OS/2 values are the only `portable' ones, */ + /* which is why we use them, if there is an OS/2 */ + /* table in the font. Otherwise, we use the */ + /* values defined in the horizontal header. */ + + height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin, + y_scale ); + if ( face->os2.version != 0xFFFFU ) + advance = (FT_Pos)( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + else + advance = (FT_Pos)( face->horizontal.Ascender - + face->horizontal.Descender ); + + top = ( advance - height ) / 2; + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + { + FT_Incremental_InterfaceRec* incr; + FT_Incremental_MetricsRec metrics; + FT_Error error; + + + incr = face->root.internal->incremental_interface; + + /* If this is an incrementally loaded font see if there are */ + /* overriding metrics for this glyph. */ + if ( incr && incr->funcs->get_glyph_metrics ) + { + metrics.bearing_x = 0; + metrics.bearing_y = top; + metrics.advance = advance; + + error = incr->funcs->get_glyph_metrics( incr->object, + glyph_index, + TRUE, + &metrics ); + if ( error ) + return error; + + top = metrics.bearing_y; + advance = metrics.advance; + } + } + + /* GWW: Do vertical metrics get loaded incrementally too? */ + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + glyph->linearVertAdvance = advance; + + /* scale the metrics */ + if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) + { + top = FT_MulFix( top, y_scale ); + advance = FT_MulFix( advance, y_scale ); + } + + /* XXX: for now, we have no better algorithm for the lsb, but it */ + /* should work fine. */ + /* */ + glyph->metrics.vertBearingX = glyph->metrics.horiBearingX - + glyph->metrics.horiAdvance / 2; + glyph->metrics.vertBearingY = top; + glyph->metrics.vertAdvance = advance; + } + + return 0; + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + static FT_Error + load_sbit_image( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_Face face; + SFNT_Service sfnt; + FT_Stream stream; + FT_Error error; + TT_SBit_MetricsRec metrics; + + + face = (TT_Face)glyph->face; + sfnt = (SFNT_Service)face->sfnt; + stream = face->root.stream; + + error = sfnt->load_sbit_image( face, + size->strike_index, + glyph_index, + (FT_Int)load_flags, + stream, + &glyph->bitmap, + &metrics ); + if ( !error ) + { + glyph->outline.n_points = 0; + glyph->outline.n_contours = 0; + + glyph->metrics.width = (FT_Pos)metrics.width << 6; + glyph->metrics.height = (FT_Pos)metrics.height << 6; + + glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6; + glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6; + glyph->metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6; + + glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6; + glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6; + glyph->metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6; + + glyph->format = FT_GLYPH_FORMAT_BITMAP; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + glyph->bitmap_left = metrics.vertBearingX; + glyph->bitmap_top = metrics.vertBearingY; + } + else + { + glyph->bitmap_left = metrics.horiBearingX; + glyph->bitmap_top = metrics.horiBearingY; + } + } + + return error; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + static FT_Error + tt_loader_init( TT_Loader loader, + TT_Size size, + TT_GlyphSlot glyph, + FT_Int32 load_flags, + FT_Bool glyf_table_only ) + { + TT_Face face; + FT_Stream stream; + + + face = (TT_Face)glyph->face; + stream = face->root.stream; + + FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /* load execution context */ + if ( IS_HINTED( load_flags ) && !glyf_table_only ) + { + TT_ExecContext exec; + FT_Bool grayscale; + + + if ( !size->cvt_ready ) + { + FT_Error error = tt_size_ready_bytecode( size ); + if ( error ) + return error; + } + + /* query new execution context */ + exec = size->debug ? size->context + : ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; + if ( !exec ) + return TT_Err_Could_Not_Find_Context; + + grayscale = + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != FT_RENDER_MODE_MONO ); + + TT_Load_Context( exec, face, size ); + + /* a change from mono to grayscale rendering (and vice versa) */ + /* requires a re-execution of the CVT program */ + if ( grayscale != exec->grayscale ) + { + FT_UInt i; + + + exec->grayscale = grayscale; + + for ( i = 0; i < size->cvt_size; i++ ) + size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); + tt_size_run_prep( size ); + } + + /* see whether the cvt program has disabled hinting */ + if ( exec->GS.instruct_control & 1 ) + load_flags |= FT_LOAD_NO_HINTING; + + /* load default graphics state -- if needed */ + if ( exec->GS.instruct_control & 2 ) + exec->GS = tt_default_graphics_state; + + exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); + loader->exec = exec; + loader->instructions = exec->glyphIns; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + /* seek to the beginning of the glyph table -- for Type 42 fonts */ + /* the table might be accessed from a Postscript stream or something */ + /* else... */ + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( face->root.internal->incremental_interface ) + loader->glyf_offset = 0; + else + +#endif + + { + FT_Error error = face->goto_table( face, TTAG_glyf, stream, 0 ); + + + if ( error == TT_Err_Table_Missing ) + loader->glyf_offset = 0; + else if ( error ) + { + FT_ERROR(( "tt_loader_init: could not access glyph table\n" )); + return error; + } + else + loader->glyf_offset = FT_STREAM_POS(); + } + + /* get face's glyph loader */ + if ( !glyf_table_only ) + { + FT_GlyphLoader gloader = glyph->internal->loader; + + + FT_GlyphLoader_Rewind( gloader ); + loader->gloader = gloader; + } + + loader->load_flags = load_flags; + + loader->face = (FT_Face)face; + loader->size = (FT_Size)size; + loader->glyph = (FT_GlyphSlot)glyph; + loader->stream = stream; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Load_Glyph */ + /* */ + /* <Description> */ + /* A function used to load a single glyph within a given glyph slot, */ + /* for a given size. */ + /* */ + /* <Input> */ + /* glyph :: A handle to a target slot object where the glyph */ + /* will be loaded. */ + /* */ + /* size :: A handle to the source face size at which the glyph */ + /* must be scaled/loaded. */ + /* */ + /* glyph_index :: The index of the glyph in the font file. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Load_Glyph( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_Face face; + FT_Error error; + TT_LoaderRec loader; + + + face = (TT_Face)glyph->face; + error = TT_Err_Ok; + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* try to load embedded bitmap if any */ + /* */ + /* XXX: The convention should be emphasized in */ + /* the documents because it can be confusing. */ + if ( size->strike_index != 0xFFFFFFFFUL && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + error = load_sbit_image( size, glyph, glyph_index, load_flags ); + if ( !error ) + { + FT_Face root = &face->root; + + + if ( FT_IS_SCALABLE( root ) ) + { + /* for the bbox we need the header only */ + (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE ); + (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE ); + glyph->linearHoriAdvance = loader.linear; + glyph->linearVertAdvance = loader.top_bearing + loader.bbox.yMax - + loader.vadvance; + if ( face->postscript.isFixedPitch && + ( load_flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) == 0 ) + glyph->linearHoriAdvance = face->horizontal.advance_Width_Max; + } + + return TT_Err_Ok; + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */ + if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid ) + return TT_Err_Invalid_Size_Handle; + + if ( load_flags & FT_LOAD_SBITS_ONLY ) + return TT_Err_Invalid_Argument; + + error = tt_loader_init( &loader, size, glyph, load_flags, FALSE ); + if ( error ) + return error; + + glyph->format = FT_GLYPH_FORMAT_OUTLINE; + glyph->num_subglyphs = 0; + glyph->outline.flags = 0; + + /* main loading loop */ + error = load_truetype_glyph( &loader, glyph_index, 0, FALSE ); + if ( !error ) + { + if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE ) + { + glyph->num_subglyphs = loader.gloader->base.num_subglyphs; + glyph->subglyphs = loader.gloader->base.subglyphs; + } + else + { + glyph->outline = loader.gloader->base.outline; + glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS; + + /* Translate array so that (0,0) is the glyph's origin. Note */ + /* that this behaviour is independent on the value of bit 1 of */ + /* the `flags' field in the `head' table -- at least major */ + /* applications like Acroread indicate that. */ + if ( loader.pp1.x ) + FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 ); + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( IS_HINTED( load_flags ) ) + { + if ( loader.exec->GS.scan_control ) + { + /* convert scan conversion mode to FT_OUTLINE_XXX flags */ + switch ( loader.exec->GS.scan_type ) + { + case 0: /* simple drop-outs including stubs */ + glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS; + break; + case 1: /* simple drop-outs excluding stubs */ + /* nothing; it's the default rendering mode */ + break; + case 4: /* smart drop-outs including stubs */ + glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS | + FT_OUTLINE_INCLUDE_STUBS; + break; + case 5: /* smart drop-outs excluding stubs */ + glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS; + break; + + default: /* no drop-out control */ + glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; + break; + } + } + else + glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + compute_glyph_metrics( &loader, glyph_index ); + } + + /* Set the `high precision' bit flag. */ + /* This is _critical_ to get correct output for monochrome */ + /* TrueType glyphs at all sizes using the bytecode interpreter. */ + /* */ + if ( !( load_flags & FT_LOAD_NO_SCALE ) && + size->root.metrics.y_ppem < 24 ) + glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + return error; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttgload.h b/android/jni/ndk_modules/freetype/src/truetype/ttgload.h new file mode 100644 index 00000000..958d67d2 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttgload.h @@ -0,0 +1,63 @@ +/***************************************************************************/ +/* */ +/* ttgload.h */ +/* */ +/* TrueType Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTGLOAD_H__ +#define __TTGLOAD_H__ + + +#include <ft2build.h> +#include "ttobjs.h" + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.h" +#endif + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + TT_Init_Glyph_Loading( TT_Face face ); + + FT_LOCAL( void ) + TT_Get_HMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* lsb, + FT_UShort* aw ); + + FT_LOCAL( void ) + TT_Get_VMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* tsb, + FT_UShort* ah ); + + FT_LOCAL( FT_Error ) + TT_Load_Glyph( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __TTGLOAD_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttgxvar.c b/android/jni/ndk_modules/freetype/src/truetype/ttgxvar.c new file mode 100644 index 00000000..653d9d5c --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttgxvar.c @@ -0,0 +1,1548 @@ +/***************************************************************************/ +/* */ +/* ttgxvar.c */ +/* */ +/* TrueType GX Font Variation loader */ +/* */ +/* Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at */ + /* */ + /* http://developer.apple.com/fonts/TTRefMan/RM06/Chap6[fgca]var.html */ + /* */ + /* The documentation for `fvar' is inconsistent. At one point it says */ + /* that `countSizePairs' should be 3, at another point 2. It should */ + /* be 2. */ + /* */ + /* The documentation for `gvar' is not intelligible; `cvar' refers you */ + /* to `gvar' and is thus also incomprehensible. */ + /* */ + /* The documentation for `avar' appears correct, but Apple has no fonts */ + /* with an `avar' table, so it is hard to test. */ + /* */ + /* Many thanks to John Jenkins (at Apple) in figuring this out. */ + /* */ + /* */ + /* Apple's `kern' table has some references to tuple indices, but as */ + /* there is no indication where these indices are defined, nor how to */ + /* interpolate the kerning values (different tuples have different */ + /* classes) this issue is ignored. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_TAGS_H +#include FT_MULTIPLE_MASTERS_H + +#include "ttpload.h" +#include "ttgxvar.h" + +#include "tterrors.h" + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + +#define FT_Stream_FTell( stream ) \ + ( (stream)->cursor - (stream)->base ) +#define FT_Stream_SeekSet( stream, off ) \ + ( (stream)->cursor = (stream)->base+(off) ) + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttgxvar + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Internal Routines *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'. It */ + /* indicates that there is a delta for every point without needing to */ + /* enumerate all of them. */ + /* */ +#define ALL_POINTS (FT_UShort*)( -1 ) + + +#define GX_PT_POINTS_ARE_WORDS 0x80 +#define GX_PT_POINT_RUN_COUNT_MASK 0x7F + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_var_readpackedpoints */ + /* */ + /* <Description> */ + /* Read a set of points to which the following deltas will apply. */ + /* Points are packed with a run length encoding. */ + /* */ + /* <Input> */ + /* stream :: The data stream. */ + /* */ + /* <Output> */ + /* point_cnt :: The number of points read. A zero value means that */ + /* all points in the glyph will be affected, without */ + /* enumerating them individually. */ + /* */ + /* <Return> */ + /* An array of FT_UShort containing the affected points or the */ + /* special value ALL_POINTS. */ + /* */ + static FT_UShort* + ft_var_readpackedpoints( FT_Stream stream, + FT_UInt *point_cnt ) + { + FT_UShort *points; + FT_Int n; + FT_Int runcnt; + FT_Int i; + FT_Int j; + FT_Int first; + FT_Memory memory = stream->memory; + FT_Error error = TT_Err_Ok; + + FT_UNUSED( error ); + + + *point_cnt = n = FT_GET_BYTE(); + if ( n == 0 ) + return ALL_POINTS; + + if ( n & GX_PT_POINTS_ARE_WORDS ) + n = FT_GET_BYTE() | ( ( n & GX_PT_POINT_RUN_COUNT_MASK ) << 8 ); + + if ( FT_NEW_ARRAY( points, n ) ) + return NULL; + + i = 0; + while ( i < n ) + { + runcnt = FT_GET_BYTE(); + if ( runcnt & GX_PT_POINTS_ARE_WORDS ) + { + runcnt = runcnt & GX_PT_POINT_RUN_COUNT_MASK; + first = points[i++] = FT_GET_USHORT(); + + if ( runcnt < 1 ) + goto Exit; + + /* first point not included in runcount */ + for ( j = 0; j < runcnt; ++j ) + points[i++] = (FT_UShort)( first += FT_GET_USHORT() ); + } + else + { + first = points[i++] = FT_GET_BYTE(); + + if ( runcnt < 1 ) + goto Exit; + + for ( j = 0; j < runcnt; ++j ) + points[i++] = (FT_UShort)( first += FT_GET_BYTE() ); + } + } + + Exit: + return points; + } + + + enum + { + GX_DT_DELTAS_ARE_ZERO = 0x80, + GX_DT_DELTAS_ARE_WORDS = 0x40, + GX_DT_DELTA_RUN_COUNT_MASK = 0x3F + }; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_var_readpackeddeltas */ + /* */ + /* <Description> */ + /* Read a set of deltas. These are packed slightly differently than */ + /* points. In particular there is no overall count. */ + /* */ + /* <Input> */ + /* stream :: The data stream. */ + /* */ + /* delta_cnt :: The number of to be read. */ + /* */ + /* <Return> */ + /* An array of FT_Short containing the deltas for the affected */ + /* points. (This only gets the deltas for one dimension. It will */ + /* generally be called twice, once for x, once for y. When used in */ + /* cvt table, it will only be called once.) */ + /* */ + static FT_Short* + ft_var_readpackeddeltas( FT_Stream stream, + FT_Offset delta_cnt ) + { + FT_Short *deltas = NULL; + FT_UInt runcnt; + FT_Offset i; + FT_UInt j; + FT_Memory memory = stream->memory; + FT_Error error = TT_Err_Ok; + + FT_UNUSED( error ); + + + if ( FT_NEW_ARRAY( deltas, delta_cnt ) ) + return NULL; + + i = 0; + while ( i < delta_cnt ) + { + runcnt = FT_GET_BYTE(); + if ( runcnt & GX_DT_DELTAS_ARE_ZERO ) + { + /* runcnt zeroes get added */ + for ( j = 0; + j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt; + ++j ) + deltas[i++] = 0; + } + else if ( runcnt & GX_DT_DELTAS_ARE_WORDS ) + { + /* runcnt shorts from the stack */ + for ( j = 0; + j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt; + ++j ) + deltas[i++] = FT_GET_SHORT(); + } + else + { + /* runcnt signed bytes from the stack */ + for ( j = 0; + j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt; + ++j ) + deltas[i++] = FT_GET_CHAR(); + } + + if ( j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) ) + { + /* Bad format */ + FT_FREE( deltas ); + return NULL; + } + } + + return deltas; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_var_load_avar */ + /* */ + /* <Description> */ + /* Parse the `avar' table if present. It need not be, so we return */ + /* nothing. */ + /* */ + /* <InOut> */ + /* face :: The font face. */ + /* */ + static void + ft_var_load_avar( TT_Face face ) + { + FT_Stream stream = FT_FACE_STREAM(face); + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + GX_AVarSegment segment; + FT_Error error = TT_Err_Ok; + FT_ULong version; + FT_Long axisCount; + FT_Int i, j; + FT_ULong table_len; + + FT_UNUSED( error ); + + + blend->avar_checked = TRUE; + if ( (error = face->goto_table( face, TTAG_avar, stream, &table_len )) != 0 ) + return; + + if ( FT_FRAME_ENTER( table_len ) ) + return; + + version = FT_GET_LONG(); + axisCount = FT_GET_LONG(); + + if ( version != 0x00010000L || + axisCount != (FT_Long)blend->mmvar->num_axis ) + goto Exit; + + if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) ) + goto Exit; + + segment = &blend->avar_segment[0]; + for ( i = 0; i < axisCount; ++i, ++segment ) + { + segment->pairCount = FT_GET_USHORT(); + if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) ) + { + /* Failure. Free everything we have done so far. We must do */ + /* it right now since loading the `avar' table is optional. */ + + for ( j = i - 1; j >= 0; --j ) + FT_FREE( blend->avar_segment[j].correspondence ); + + FT_FREE( blend->avar_segment ); + blend->avar_segment = NULL; + goto Exit; + } + + for ( j = 0; j < segment->pairCount; ++j ) + { + segment->correspondence[j].fromCoord = + FT_GET_SHORT() << 2; /* convert to Fixed */ + segment->correspondence[j].toCoord = + FT_GET_SHORT()<<2; /* convert to Fixed */ + } + } + + Exit: + FT_FRAME_EXIT(); + } + + + typedef struct GX_GVar_Head_ + { + FT_Long version; + FT_UShort axisCount; + FT_UShort globalCoordCount; + FT_ULong offsetToCoord; + FT_UShort glyphCount; + FT_UShort flags; + FT_ULong offsetToData; + + } GX_GVar_Head; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_var_load_gvar */ + /* */ + /* <Description> */ + /* Parses the `gvar' table if present. If `fvar' is there, `gvar' */ + /* had better be there too. */ + /* */ + /* <InOut> */ + /* face :: The font face. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + ft_var_load_gvar( TT_Face face ) + { + FT_Stream stream = FT_FACE_STREAM(face); + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + FT_Error error; + FT_UInt i, j; + FT_ULong table_len; + FT_ULong gvar_start; + FT_ULong offsetToData; + GX_GVar_Head gvar_head; + + static const FT_Frame_Field gvar_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_GVar_Head + + FT_FRAME_START( 20 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( axisCount ), + FT_FRAME_USHORT( globalCoordCount ), + FT_FRAME_ULONG ( offsetToCoord ), + FT_FRAME_USHORT( glyphCount ), + FT_FRAME_USHORT( flags ), + FT_FRAME_ULONG ( offsetToData ), + FT_FRAME_END + }; + + if ( (error = face->goto_table( face, TTAG_gvar, stream, &table_len )) != 0 ) + goto Exit; + + gvar_start = FT_STREAM_POS( ); + if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) ) + goto Exit; + + blend->tuplecount = gvar_head.globalCoordCount; + blend->gv_glyphcnt = gvar_head.glyphCount; + offsetToData = gvar_start + gvar_head.offsetToData; + + if ( gvar_head.version != (FT_Long)0x00010000L || + gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis ) + { + error = TT_Err_Invalid_Table; + goto Exit; + } + + if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) ) + goto Exit; + + if ( gvar_head.flags & 1 ) + { + /* long offsets (one more offset than glyphs, to mark size of last) */ + if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) ) + goto Exit; + + for ( i = 0; i <= blend->gv_glyphcnt; ++i ) + blend->glyphoffsets[i] = offsetToData + FT_GET_LONG(); + + FT_FRAME_EXIT(); + } + else + { + /* short offsets (one more offset than glyphs, to mark size of last) */ + if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) ) + goto Exit; + + for ( i = 0; i <= blend->gv_glyphcnt; ++i ) + blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2; + /* XXX: Undocumented: `*2'! */ + + FT_FRAME_EXIT(); + } + + if ( blend->tuplecount != 0 ) + { + if ( FT_NEW_ARRAY( blend->tuplecoords, + gvar_head.axisCount * blend->tuplecount ) ) + goto Exit; + + if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord ) || + FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L ) ) + goto Exit; + + for ( i = 0; i < blend->tuplecount; ++i ) + for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; ++j ) + blend->tuplecoords[i * gvar_head.axisCount + j] = + FT_GET_SHORT() << 2; /* convert to FT_Fixed */ + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_var_apply_tuple */ + /* */ + /* <Description> */ + /* Figure out whether a given tuple (design) applies to the current */ + /* blend, and if so, what is the scaling factor. */ + /* */ + /* <Input> */ + /* blend :: The current blend of the font. */ + /* */ + /* tupleIndex :: A flag saying whether this is an intermediate */ + /* tuple or not. */ + /* */ + /* tuple_coords :: The coordinates of the tuple in normalized axis */ + /* units. */ + /* */ + /* im_start_coords :: The initial coordinates where this tuple starts */ + /* to apply (for intermediate coordinates). */ + /* */ + /* im_end_coords :: The final coordinates after which this tuple no */ + /* longer applies (for intermediate coordinates). */ + /* */ + /* <Return> */ + /* An FT_Fixed value containing the scaling factor. */ + /* */ + static FT_Fixed + ft_var_apply_tuple( GX_Blend blend, + FT_UShort tupleIndex, + FT_Fixed* tuple_coords, + FT_Fixed* im_start_coords, + FT_Fixed* im_end_coords ) + { + FT_UInt i; + FT_Fixed apply; + FT_Fixed temp; + + + apply = 0x10000L; + for ( i = 0; i < blend->num_axis; ++i ) + { + if ( tuple_coords[i] == 0 ) + /* It's not clear why (for intermediate tuples) we don't need */ + /* to check against start/end -- the documentation says we don't. */ + /* Similarly, it's unclear why we don't need to scale along the */ + /* axis. */ + continue; + + else if ( blend->normalizedcoords[i] == 0 || + ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) || + ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) ) + { + apply = 0; + break; + } + + else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) ) + /* not an intermediate tuple */ + apply = FT_MulDiv( apply, + blend->normalizedcoords[i] > 0 + ? blend->normalizedcoords[i] + : -blend->normalizedcoords[i], + 0x10000L ); + + else if ( blend->normalizedcoords[i] <= im_start_coords[i] || + blend->normalizedcoords[i] >= im_end_coords[i] ) + { + apply = 0; + break; + } + + else if ( blend->normalizedcoords[i] < tuple_coords[i] ) + { + temp = FT_MulDiv( blend->normalizedcoords[i] - im_start_coords[i], + 0x10000L, + tuple_coords[i] - im_start_coords[i]); + apply = FT_MulDiv( apply, temp, 0x10000L ); + } + + else + { + temp = FT_MulDiv( im_end_coords[i] - blend->normalizedcoords[i], + 0x10000L, + im_end_coords[i] - tuple_coords[i] ); + apply = FT_MulDiv( apply, temp, 0x10000L ); + } + } + + return apply; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MULTIPLE MASTERS SERVICE FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct GX_FVar_Head_ + { + FT_Long version; + FT_UShort offsetToData; + FT_UShort countSizePairs; + FT_UShort axisCount; + FT_UShort axisSize; + FT_UShort instanceCount; + FT_UShort instanceSize; + + } GX_FVar_Head; + + + typedef struct fvar_axis_ + { + FT_ULong axisTag; + FT_ULong minValue; + FT_ULong defaultValue; + FT_ULong maxValue; + FT_UShort flags; + FT_UShort nameID; + + } GX_FVar_Axis; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Get_MM_Var */ + /* */ + /* <Description> */ + /* Check that the font's `fvar' table is valid, parse it, and return */ + /* those data. */ + /* */ + /* <InOut> */ + /* face :: The font face. */ + /* TT_Get_MM_Var initializes the blend structure. */ + /* */ + /* <Output> */ + /* master :: The `fvar' data (must be freed by caller). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_MM_Var( TT_Face face, + FT_MM_Var* *master ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = face->root.memory; + FT_ULong table_len; + FT_Error error = TT_Err_Ok; + FT_ULong fvar_start; + FT_Int i, j; + FT_MM_Var* mmvar; + FT_Fixed* next_coords; + FT_String* next_name; + FT_Var_Axis* a; + FT_Var_Named_Style* ns; + GX_FVar_Head fvar_head; + + static const FT_Frame_Field fvar_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_FVar_Head + + FT_FRAME_START( 16 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( offsetToData ), + FT_FRAME_USHORT( countSizePairs ), + FT_FRAME_USHORT( axisCount ), + FT_FRAME_USHORT( axisSize ), + FT_FRAME_USHORT( instanceCount ), + FT_FRAME_USHORT( instanceSize ), + FT_FRAME_END + }; + + static const FT_Frame_Field fvaraxis_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_FVar_Axis + + FT_FRAME_START( 20 ), + FT_FRAME_ULONG ( axisTag ), + FT_FRAME_ULONG ( minValue ), + FT_FRAME_ULONG ( defaultValue ), + FT_FRAME_ULONG ( maxValue ), + FT_FRAME_USHORT( flags ), + FT_FRAME_USHORT( nameID ), + FT_FRAME_END + }; + + + if ( face->blend == NULL ) + { + /* both `fvar' and `gvar' must be present */ + if ( (error = face->goto_table( face, TTAG_gvar, + stream, &table_len )) != 0 ) + goto Exit; + + if ( (error = face->goto_table( face, TTAG_fvar, + stream, &table_len )) != 0 ) + goto Exit; + + fvar_start = FT_STREAM_POS( ); + + if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) ) + goto Exit; + + if ( fvar_head.version != (FT_Long)0x00010000L || + fvar_head.countSizePairs != 2 || + fvar_head.axisSize != 20 || + /* axisCount limit implied by 16-bit instanceSize */ + fvar_head.axisCount > 0x3FFE || + fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount || + /* instanceCount limit implied by limited range of name IDs */ + fvar_head.instanceCount > 0x7EFF || + fvar_head.offsetToData + fvar_head.axisCount * 20U + + fvar_head.instanceCount * fvar_head.instanceSize > table_len ) + { + error = TT_Err_Invalid_Table; + goto Exit; + } + + if ( FT_NEW( face->blend ) ) + goto Exit; + + /* cannot overflow 32-bit arithmetic because of limits above */ + face->blend->mmvar_len = + sizeof ( FT_MM_Var ) + + fvar_head.axisCount * sizeof ( FT_Var_Axis ) + + fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) + + fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) + + 5 * fvar_head.axisCount; + + if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) + goto Exit; + face->blend->mmvar = mmvar; + + mmvar->num_axis = + fvar_head.axisCount; + mmvar->num_designs = + (FT_UInt)-1; /* meaningless in this context; each glyph */ + /* may have a different number of designs */ + /* (or tuples, as called by Apple) */ + mmvar->num_namedstyles = + fvar_head.instanceCount; + mmvar->axis = + (FT_Var_Axis*)&(mmvar[1]); + mmvar->namedstyle = + (FT_Var_Named_Style*)&(mmvar->axis[fvar_head.axisCount]); + + next_coords = + (FT_Fixed*)&(mmvar->namedstyle[fvar_head.instanceCount]); + for ( i = 0; i < fvar_head.instanceCount; ++i ) + { + mmvar->namedstyle[i].coords = next_coords; + next_coords += fvar_head.axisCount; + } + + next_name = (FT_String*)next_coords; + for ( i = 0; i < fvar_head.axisCount; ++i ) + { + mmvar->axis[i].name = next_name; + next_name += 5; + } + + if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) ) + goto Exit; + + a = mmvar->axis; + for ( i = 0; i < fvar_head.axisCount; ++i ) + { + GX_FVar_Axis axis_rec; + + + if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) ) + goto Exit; + a->tag = axis_rec.axisTag; + a->minimum = axis_rec.minValue; /* A Fixed */ + a->def = axis_rec.defaultValue; /* A Fixed */ + a->maximum = axis_rec.maxValue; /* A Fixed */ + a->strid = axis_rec.nameID; + + a->name[0] = (FT_String)( a->tag >> 24 ); + a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF ); + a->name[2] = (FT_String)( ( a->tag >> 8 ) & 0xFF ); + a->name[3] = (FT_String)( ( a->tag ) & 0xFF ); + a->name[4] = 0; + + ++a; + } + + ns = mmvar->namedstyle; + for ( i = 0; i < fvar_head.instanceCount; ++i, ++ns ) + { + if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) ) + goto Exit; + + ns->strid = FT_GET_USHORT(); + (void) /* flags = */ FT_GET_USHORT(); + + for ( j = 0; j < fvar_head.axisCount; ++j ) + ns->coords[j] = FT_GET_ULONG(); /* A Fixed */ + + FT_FRAME_EXIT(); + } + } + + if ( master != NULL ) + { + FT_UInt n; + + + if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) + goto Exit; + FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len ); + + mmvar->axis = + (FT_Var_Axis*)&(mmvar[1]); + mmvar->namedstyle = + (FT_Var_Named_Style*)&(mmvar->axis[mmvar->num_axis]); + next_coords = + (FT_Fixed*)&(mmvar->namedstyle[mmvar->num_namedstyles]); + + for ( n = 0; n < mmvar->num_namedstyles; ++n ) + { + mmvar->namedstyle[n].coords = next_coords; + next_coords += mmvar->num_axis; + } + + a = mmvar->axis; + next_name = (FT_String*)next_coords; + for ( n = 0; n < mmvar->num_axis; ++n ) + { + a->name = next_name; + + /* standard PostScript names for some standard apple tags */ + if ( a->tag == TTAG_wght ) + a->name = (char *)"Weight"; + else if ( a->tag == TTAG_wdth ) + a->name = (char *)"Width"; + else if ( a->tag == TTAG_opsz ) + a->name = (char *)"OpticalSize"; + else if ( a->tag == TTAG_slnt ) + a->name = (char *)"Slant"; + + next_name += 5; + ++a; + } + + *master = mmvar; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Set_MM_Blend */ + /* */ + /* <Description> */ + /* Set the blend (normalized) coordinates for this instance of the */ + /* font. Check that the `gvar' table is reasonable and does some */ + /* initial preparation. */ + /* */ + /* <InOut> */ + /* face :: The font. */ + /* Initialize the blend structure with `gvar' data. */ + /* */ + /* <Input> */ + /* num_coords :: Must be the axis count of the font. */ + /* */ + /* coords :: An array of num_coords, each between [-1,1]. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error = TT_Err_Ok; + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i; + FT_Memory memory = face->root.memory; + + enum + { + mcvt_retain, + mcvt_modify, + mcvt_load + + } manageCvt; + + + face->doblend = FALSE; + + if ( face->blend == NULL ) + { + if ( (error = TT_Get_MM_Var( face, NULL)) != 0 ) + goto Exit; + } + + blend = face->blend; + mmvar = blend->mmvar; + + if ( num_coords != mmvar->num_axis ) + { + error = TT_Err_Invalid_Argument; + goto Exit; + } + + for ( i = 0; i < num_coords; ++i ) + if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L ) + { + error = TT_Err_Invalid_Argument; + goto Exit; + } + + if ( blend->glyphoffsets == NULL ) + if ( (error = ft_var_load_gvar( face )) != 0 ) + goto Exit; + + if ( blend->normalizedcoords == NULL ) + { + if ( FT_NEW_ARRAY( blend->normalizedcoords, num_coords ) ) + goto Exit; + + manageCvt = mcvt_modify; + + /* If we have not set the blend coordinates before this, then the */ + /* cvt table will still be what we read from the `cvt ' table and */ + /* we don't need to reload it. We may need to change it though... */ + } + else + { + manageCvt = mcvt_retain; + for ( i = 0; i < num_coords; ++i ) + { + if ( blend->normalizedcoords[i] != coords[i] ) + { + manageCvt = mcvt_load; + break; + } + } + + /* If we don't change the blend coords then we don't need to do */ + /* anything to the cvt table. It will be correct. Otherwise we */ + /* no longer have the original cvt (it was modified when we set */ + /* the blend last time), so we must reload and then modify it. */ + } + + blend->num_axis = num_coords; + FT_MEM_COPY( blend->normalizedcoords, + coords, + num_coords * sizeof ( FT_Fixed ) ); + + face->doblend = TRUE; + + if ( face->cvt != NULL ) + { + switch ( manageCvt ) + { + case mcvt_load: + /* The cvt table has been loaded already; every time we change the */ + /* blend we may need to reload and remodify the cvt table. */ + FT_FREE( face->cvt ); + face->cvt = NULL; + + tt_face_load_cvt( face, face->root.stream ); + break; + + case mcvt_modify: + /* The original cvt table is in memory. All we need to do is */ + /* apply the `cvar' table (if any). */ + tt_face_vary_cvt( face, face->root.stream ); + break; + + case mcvt_retain: + /* The cvt table is correct for this set of coordinates. */ + break; + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Set_Var_Design */ + /* */ + /* <Description> */ + /* Set the coordinates for the instance, measured in the user */ + /* coordinate system. Parse the `avar' table (if present) to convert */ + /* from user to normalized coordinates. */ + /* */ + /* <InOut> */ + /* face :: The font face. */ + /* Initialize the blend struct with `gvar' data. */ + /* */ + /* <Input> */ + /* num_coords :: This must be the axis count of the font. */ + /* */ + /* coords :: A coordinate array with `num_coords' elements. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error = TT_Err_Ok; + FT_Fixed* normalized = NULL; + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i, j; + FT_Var_Axis* a; + GX_AVarSegment av; + FT_Memory memory = face->root.memory; + + + if ( face->blend == NULL ) + { + if ( (error = TT_Get_MM_Var( face, NULL )) != 0 ) + goto Exit; + } + + blend = face->blend; + mmvar = blend->mmvar; + + if ( num_coords != mmvar->num_axis ) + { + error = TT_Err_Invalid_Argument; + goto Exit; + } + + /* Axis normalization is a two stage process. First we normalize */ + /* based on the [min,def,max] values for the axis to be [-1,0,1]. */ + /* Then, if there's an `avar' table, we renormalize this range. */ + + if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) ) + goto Exit; + + a = mmvar->axis; + for ( i = 0; i < mmvar->num_axis; ++i, ++a ) + { + if ( coords[i] > a->maximum || coords[i] < a->minimum ) + { + error = TT_Err_Invalid_Argument; + goto Exit; + } + + if ( coords[i] < a->def ) + { + normalized[i] = -FT_MulDiv( coords[i] - a->def, + 0x10000L, + a->minimum - a->def ); + } + else if ( a->maximum == a->def ) + normalized[i] = 0; + else + { + normalized[i] = FT_MulDiv( coords[i] - a->def, + 0x10000L, + a->maximum - a->def ); + } + } + + if ( !blend->avar_checked ) + ft_var_load_avar( face ); + + if ( blend->avar_segment != NULL ) + { + av = blend->avar_segment; + for ( i = 0; i < mmvar->num_axis; ++i, ++av ) + { + for ( j = 1; j < (FT_UInt)av->pairCount; ++j ) + if ( normalized[i] < av->correspondence[j].fromCoord ) + { + normalized[i] = + FT_MulDiv( + FT_MulDiv( + normalized[i] - av->correspondence[j - 1].fromCoord, + 0x10000L, + av->correspondence[j].fromCoord - + av->correspondence[j - 1].fromCoord ), + av->correspondence[j].toCoord - + av->correspondence[j - 1].toCoord, + 0x10000L ) + + av->correspondence[j - 1].toCoord; + break; + } + } + } + + error = TT_Set_MM_Blend( face, num_coords, normalized ); + + Exit: + FT_FREE( normalized ); + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GX VAR PARSING ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_vary_cvt */ + /* */ + /* <Description> */ + /* Modify the loaded cvt table according to the `cvar' table and the */ + /* font's blend. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* Most errors are ignored. It is perfectly valid not to have a */ + /* `cvar' table even if there is a `gvar' and `fvar' table. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_vary_cvt( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_start; + FT_ULong table_len; + FT_UInt tupleCount; + FT_ULong offsetToData; + FT_ULong here; + FT_UInt i, j; + FT_Fixed* tuple_coords = NULL; + FT_Fixed* im_start_coords = NULL; + FT_Fixed* im_end_coords = NULL; + GX_Blend blend = face->blend; + FT_UInt point_count; + FT_UShort* localpoints; + FT_Short* deltas; + + + FT_TRACE2(( "CVAR " )); + + if ( blend == NULL ) + { + FT_TRACE2(( "tt_face_vary_cvt: no blend specified\n" )); + + error = TT_Err_Ok; + goto Exit; + } + + if ( face->cvt == NULL ) + { + FT_TRACE2(( "tt_face_vary_cvt: no `cvt ' table\n" )); + + error = TT_Err_Ok; + goto Exit; + } + + error = face->goto_table( face, TTAG_cvar, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + + error = TT_Err_Ok; + goto Exit; + } + + if ( FT_FRAME_ENTER( table_len ) ) + { + error = TT_Err_Ok; + goto Exit; + } + + table_start = FT_Stream_FTell( stream ); + if ( FT_GET_LONG() != 0x00010000L ) + { + FT_TRACE2(( "bad table version\n" )); + + error = TT_Err_Ok; + goto FExit; + } + + if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) + goto FExit; + + tupleCount = FT_GET_USHORT(); + offsetToData = table_start + FT_GET_USHORT(); + + /* The documentation implies there are flags packed into the */ + /* tuplecount, but John Jenkins says that shared points don't apply */ + /* to `cvar', and no other flags are defined. */ + + for ( i = 0; i < ( tupleCount & 0xFFF ); ++i ) + { + FT_UInt tupleDataSize; + FT_UInt tupleIndex; + FT_Fixed apply; + + + tupleDataSize = FT_GET_USHORT(); + tupleIndex = FT_GET_USHORT(); + + /* There is no provision here for a global tuple coordinate section, */ + /* so John says. There are no tuple indices, just embedded tuples. */ + + if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) + { + for ( j = 0; j < blend->num_axis; ++j ) + tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from */ + /* short frac to fixed */ + } + else + { + /* skip this tuple; it makes no sense */ + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + for ( j = 0; j < 2 * blend->num_axis; ++j ) + (void)FT_GET_SHORT(); + + offsetToData += tupleDataSize; + continue; + } + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + { + for ( j = 0; j < blend->num_axis; ++j ) + im_start_coords[j] = FT_GET_SHORT() << 2; + for ( j = 0; j < blend->num_axis; ++j ) + im_end_coords[j] = FT_GET_SHORT() << 2; + } + + apply = ft_var_apply_tuple( blend, + (FT_UShort)tupleIndex, + tuple_coords, + im_start_coords, + im_end_coords ); + if ( /* tuple isn't active for our blend */ + apply == 0 || + /* global points not allowed, */ + /* if they aren't local, makes no sense */ + !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) ) + { + offsetToData += tupleDataSize; + continue; + } + + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + localpoints = ft_var_readpackedpoints( stream, &point_count ); + deltas = ft_var_readpackeddeltas( stream, + point_count == 0 ? face->cvt_size + : point_count ); + if ( localpoints == NULL || deltas == NULL ) + /* failure, ignore it */; + + else if ( localpoints == ALL_POINTS ) + { + /* this means that there are deltas for every entry in cvt */ + for ( j = 0; j < face->cvt_size; ++j ) + face->cvt[j] = (FT_Short)( face->cvt[j] + + FT_MulFix( deltas[j], apply ) ); + } + + else + { + for ( j = 0; j < point_count; ++j ) + { + int pindex = localpoints[j]; + + face->cvt[pindex] = (FT_Short)( face->cvt[pindex] + + FT_MulFix( deltas[j], apply ) ); + } + } + + if ( localpoints != ALL_POINTS ) + FT_FREE( localpoints ); + FT_FREE( deltas ); + + offsetToData += tupleDataSize; + + FT_Stream_SeekSet( stream, here ); + } + + FExit: + FT_FRAME_EXIT(); + + Exit: + FT_FREE( tuple_coords ); + FT_FREE( im_start_coords ); + FT_FREE( im_end_coords ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Vary_Get_Glyph_Deltas */ + /* */ + /* <Description> */ + /* Load the appropriate deltas for the current glyph. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* glyph_index :: The index of the glyph being modified. */ + /* */ + /* n_points :: The number of the points in the glyph, including */ + /* phantom points. */ + /* */ + /* <Output> */ + /* deltas :: The array of points to change. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Vary_Get_Glyph_Deltas( TT_Face face, + FT_UInt glyph_index, + FT_Vector* *deltas, + FT_UInt n_points ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + FT_Vector* delta_xy; + + FT_Error error; + FT_ULong glyph_start; + FT_UInt tupleCount; + FT_ULong offsetToData; + FT_ULong here; + FT_UInt i, j; + FT_Fixed* tuple_coords = NULL; + FT_Fixed* im_start_coords = NULL; + FT_Fixed* im_end_coords = NULL; + FT_UInt point_count, spoint_count = 0; + FT_UShort* sharedpoints = NULL; + FT_UShort* localpoints = NULL; + FT_UShort* points; + FT_Short *deltas_x, *deltas_y; + + + if ( !face->doblend || blend == NULL ) + return TT_Err_Invalid_Argument; + + /* to be freed by the caller */ + if ( FT_NEW_ARRAY( delta_xy, n_points ) ) + goto Exit; + *deltas = delta_xy; + + if ( glyph_index >= blend->gv_glyphcnt || + blend->glyphoffsets[glyph_index] == + blend->glyphoffsets[glyph_index + 1] ) + return TT_Err_Ok; /* no variation data for this glyph */ + + if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] ) || + FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] - + blend->glyphoffsets[glyph_index] ) ) + goto Fail1; + + glyph_start = FT_Stream_FTell( stream ); + + /* each set of glyph variation data is formatted similarly to `cvar' */ + /* (except we get shared points and global tuples) */ + + if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) + goto Fail2; + + tupleCount = FT_GET_USHORT(); + offsetToData = glyph_start + FT_GET_USHORT(); + + if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS ) + { + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + sharedpoints = ft_var_readpackedpoints( stream, &spoint_count ); + offsetToData = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, here ); + } + + for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); ++i ) + { + FT_UInt tupleDataSize; + FT_UInt tupleIndex; + FT_Fixed apply; + + + tupleDataSize = FT_GET_USHORT(); + tupleIndex = FT_GET_USHORT(); + + if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) + { + for ( j = 0; j < blend->num_axis; ++j ) + tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from */ + /* short frac to fixed */ + } + else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) + { + error = TT_Err_Invalid_Table; + goto Fail3; + } + else + { + FT_MEM_COPY( + tuple_coords, + &blend->tuplecoords[(tupleIndex & 0xFFF) * blend->num_axis], + blend->num_axis * sizeof ( FT_Fixed ) ); + } + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + { + for ( j = 0; j < blend->num_axis; ++j ) + im_start_coords[j] = FT_GET_SHORT() << 2; + for ( j = 0; j < blend->num_axis; ++j ) + im_end_coords[j] = FT_GET_SHORT() << 2; + } + + apply = ft_var_apply_tuple( blend, + (FT_UShort)tupleIndex, + tuple_coords, + im_start_coords, + im_end_coords ); + + if ( apply == 0 ) /* tuple isn't active for our blend */ + { + offsetToData += tupleDataSize; + continue; + } + + here = FT_Stream_FTell( stream ); + + if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) + { + FT_Stream_SeekSet( stream, offsetToData ); + + localpoints = ft_var_readpackedpoints( stream, &point_count ); + points = localpoints; + } + else + { + points = sharedpoints; + point_count = spoint_count; + } + + deltas_x = ft_var_readpackeddeltas( stream, + point_count == 0 ? n_points + : point_count ); + deltas_y = ft_var_readpackeddeltas( stream, + point_count == 0 ? n_points + : point_count ); + + if ( points == NULL || deltas_y == NULL || deltas_x == NULL ) + ; /* failure, ignore it */ + + else if ( points == ALL_POINTS ) + { + /* this means that there are deltas for every point in the glyph */ + for ( j = 0; j < n_points; ++j ) + { + delta_xy[j].x += FT_MulFix( deltas_x[j], apply ); + delta_xy[j].y += FT_MulFix( deltas_y[j], apply ); + } + } + + else + { + for ( j = 0; j < point_count; ++j ) + { + delta_xy[localpoints[j]].x += FT_MulFix( deltas_x[j], apply ); + delta_xy[localpoints[j]].y += FT_MulFix( deltas_y[j], apply ); + } + } + + if ( localpoints != ALL_POINTS ) + FT_FREE( localpoints ); + FT_FREE( deltas_x ); + FT_FREE( deltas_y ); + + offsetToData += tupleDataSize; + + FT_Stream_SeekSet( stream, here ); + } + + Fail3: + FT_FREE( tuple_coords ); + FT_FREE( im_start_coords ); + FT_FREE( im_end_coords ); + + Fail2: + FT_FRAME_EXIT(); + + Fail1: + if ( error ) + { + FT_FREE( delta_xy ); + *deltas = NULL; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_done_blend */ + /* */ + /* <Description> */ + /* Frees the blend internal data structure. */ + /* */ + FT_LOCAL_DEF( void ) + tt_done_blend( FT_Memory memory, + GX_Blend blend ) + { + if ( blend != NULL ) + { + FT_UInt i; + + + FT_FREE( blend->normalizedcoords ); + FT_FREE( blend->mmvar ); + + if ( blend->avar_segment != NULL ) + { + for ( i = 0; i < blend->num_axis; ++i ) + FT_FREE( blend->avar_segment[i].correspondence ); + FT_FREE( blend->avar_segment ); + } + + FT_FREE( blend->tuplecoords ); + FT_FREE( blend->glyphoffsets ); + FT_FREE( blend ); + } + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttgxvar.h b/android/jni/ndk_modules/freetype/src/truetype/ttgxvar.h new file mode 100644 index 00000000..82dfc443 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttgxvar.h @@ -0,0 +1,182 @@ +/***************************************************************************/ +/* */ +/* ttgxvar.h */ +/* */ +/* TrueType GX Font Variation loader (specification) */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg and George Williams. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTGXVAR_H__ +#define __TTGXVAR_H__ + + +#include <ft2build.h> +#include "ttobjs.h" + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* GX_AVarCorrespondenceRec */ + /* */ + /* <Description> */ + /* A data structure representing `shortFracCorrespondence' in `avar' */ + /* table according to the specifications from Apple. */ + /* */ + typedef struct GX_AVarCorrespondenceRec_ + { + FT_Fixed fromCoord; + FT_Fixed toCoord; + + } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* GX_AVarRec */ + /* */ + /* <Description> */ + /* Data from the segment field of `avar' table. */ + /* There is one of these for each axis. */ + /* */ + typedef struct GX_AVarSegmentRec_ + { + FT_UShort pairCount; + GX_AVarCorrespondence correspondence; /* array with pairCount entries */ + + } GX_AVarSegmentRec, *GX_AVarSegment; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* GX_BlendRec */ + /* */ + /* <Description> */ + /* Data for interpolating a font from a distortable font specified */ + /* by the GX *var tables ([fgca]var). */ + /* */ + /* <Fields> */ + /* num_axis :: The number of axes along which interpolation */ + /* may happen */ + /* */ + /* normalizedcoords :: A normalized value (between [-1,1]) indicating */ + /* the contribution along each axis to the final */ + /* interpolated font. */ + /* */ + typedef struct GX_BlendRec_ + { + FT_UInt num_axis; + FT_Fixed* normalizedcoords; + + FT_MM_Var* mmvar; + FT_Offset mmvar_len; + + FT_Bool avar_checked; + GX_AVarSegment avar_segment; + + FT_UInt tuplecount; /* shared tuples in `gvar' */ + FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */ + + FT_UInt gv_glyphcnt; + FT_ULong* glyphoffsets; + + } GX_BlendRec; + + + /*************************************************************************/ + /* */ + /* <enum> */ + /* GX_TupleCountFlags */ + /* */ + /* <Description> */ + /* Flags used within the `TupleCount' field of the `gvar' table. */ + /* */ + typedef enum GX_TupleCountFlags_ + { + GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000, + GX_TC_RESERVED_TUPLE_FLAGS = 0x7000, + GX_TC_TUPLE_COUNT_MASK = 0x0FFF + + } GX_TupleCountFlags; + + + /*************************************************************************/ + /* */ + /* <enum> */ + /* GX_TupleIndexFlags */ + /* */ + /* <Description> */ + /* Flags used within the `TupleIndex' field of the `gvar' and `cvar' */ + /* tables. */ + /* */ + typedef enum GX_TupleIndexFlags_ + { + GX_TI_EMBEDDED_TUPLE_COORD = 0x8000, + GX_TI_INTERMEDIATE_TUPLE = 0x4000, + GX_TI_PRIVATE_POINT_NUMBERS = 0x2000, + GX_TI_RESERVED_TUPLE_FLAG = 0x1000, + GX_TI_TUPLE_INDEX_MASK = 0x0FFF + + } GX_TupleIndexFlags; + + +#define TTAG_wght FT_MAKE_TAG( 'w', 'g', 'h', 't' ) +#define TTAG_wdth FT_MAKE_TAG( 'w', 'd', 't', 'h' ) +#define TTAG_opsz FT_MAKE_TAG( 'o', 'p', 's', 'z' ) +#define TTAG_slnt FT_MAKE_TAG( 's', 'l', 'n', 't' ) + + + FT_LOCAL( FT_Error ) + TT_Set_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Set_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Get_MM_Var( TT_Face face, + FT_MM_Var* *master ); + + + FT_LOCAL( FT_Error ) + tt_face_vary_cvt( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + TT_Vary_Get_Glyph_Deltas( TT_Face face, + FT_UInt glyph_index, + FT_Vector* *deltas, + FT_UInt n_points ); + + + FT_LOCAL( void ) + tt_done_blend( FT_Memory memory, + GX_Blend blend ); + + +FT_END_HEADER + + +#endif /* __TTGXVAR_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttinterp.c b/android/jni/ndk_modules/freetype/src/truetype/ttinterp.c new file mode 100644 index 00000000..d22e94f5 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttinterp.c @@ -0,0 +1,8138 @@ +/***************************************************************************/ +/* */ +/* ttinterp.c */ +/* */ +/* TrueType bytecode interpreter (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 */ +/* by David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_TRIGONOMETRY_H +#include FT_SYSTEM_H + +#include "ttinterp.h" + +#include "tterrors.h" + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + +#define TT_MULFIX FT_MulFix +#define TT_MULDIV FT_MulDiv +#define TT_MULDIV_NO_ROUND FT_MulDiv_No_Round + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttinterp + + /*************************************************************************/ + /* */ + /* In order to detect infinite loops in the code, we set up a counter */ + /* within the run loop. A single stroke of interpretation is now */ + /* limited to a maximal number of opcodes defined below. */ + /* */ +#define MAX_RUNNABLE_OPCODES 1000000L + + + /*************************************************************************/ + /* */ + /* There are two kinds of implementations: */ + /* */ + /* a. static implementation */ + /* */ + /* The current execution context is a static variable, which fields */ + /* are accessed directly by the interpreter during execution. The */ + /* context is named `cur'. */ + /* */ + /* This version is non-reentrant, of course. */ + /* */ + /* b. indirect implementation */ + /* */ + /* The current execution context is passed to _each_ function as its */ + /* first argument, and each field is thus accessed indirectly. */ + /* */ + /* This version is fully re-entrant. */ + /* */ + /* The idea is that an indirect implementation may be slower to execute */ + /* on low-end processors that are used in some systems (like 386s or */ + /* even 486s). */ + /* */ + /* As a consequence, the indirect implementation is now the default, as */ + /* its performance costs can be considered negligible in our context. */ + /* Note, however, that we kept the same source with macros because: */ + /* */ + /* - The code is kept very close in design to the Pascal code used for */ + /* development. */ + /* */ + /* - It's much more readable that way! */ + /* */ + /* - It's still open to experimentation and tuning. */ + /* */ + /*************************************************************************/ + + +#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */ + +#define CUR (*exc) /* see ttobjs.h */ + + /*************************************************************************/ + /* */ + /* This macro is used whenever `exec' is unused in a function, to avoid */ + /* stupid warnings from pedantic compilers. */ + /* */ +#define FT_UNUSED_EXEC FT_UNUSED( exc ) + +#else /* static implementation */ + +#define CUR cur + +#define FT_UNUSED_EXEC int __dummy = __dummy + + static + TT_ExecContextRec cur; /* static exec. context variable */ + + /* apparently, we have a _lot_ of direct indexing when accessing */ + /* the static `cur', which makes the code bigger (due to all the */ + /* four bytes addresses). */ + +#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* The instruction argument stack. */ + /* */ +#define INS_ARG EXEC_OP_ FT_Long* args /* see ttobjs.h for EXEC_OP_ */ + + + /*************************************************************************/ + /* */ + /* This macro is used whenever `args' is unused in a function, to avoid */ + /* stupid warnings from pedantic compilers. */ + /* */ +#define FT_UNUSED_ARG FT_UNUSED_EXEC; FT_UNUSED( args ) + + + /*************************************************************************/ + /* */ + /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to */ + /* increase readability of the code. */ + /* */ + /*************************************************************************/ + + +#define SKIP_Code() \ + SkipCode( EXEC_ARG ) + +#define GET_ShortIns() \ + GetShortIns( EXEC_ARG ) + +#define NORMalize( x, y, v ) \ + Normalize( EXEC_ARG_ x, y, v ) + +#define SET_SuperRound( scale, flags ) \ + SetSuperRound( EXEC_ARG_ scale, flags ) + +#define ROUND_None( d, c ) \ + Round_None( EXEC_ARG_ d, c ) + +#define INS_Goto_CodeRange( range, ip ) \ + Ins_Goto_CodeRange( EXEC_ARG_ range, ip ) + +#define CUR_Func_move( z, p, d ) \ + CUR.func_move( EXEC_ARG_ z, p, d ) + +#define CUR_Func_move_orig( z, p, d ) \ + CUR.func_move_orig( EXEC_ARG_ z, p, d ) + +#define CUR_Func_round( d, c ) \ + CUR.func_round( EXEC_ARG_ d, c ) + +#define CUR_Func_read_cvt( index ) \ + CUR.func_read_cvt( EXEC_ARG_ index ) + +#define CUR_Func_write_cvt( index, val ) \ + CUR.func_write_cvt( EXEC_ARG_ index, val ) + +#define CUR_Func_move_cvt( index, val ) \ + CUR.func_move_cvt( EXEC_ARG_ index, val ) + +#define CURRENT_Ratio() \ + Current_Ratio( EXEC_ARG ) + +#define CURRENT_Ppem() \ + Current_Ppem( EXEC_ARG ) + +#define CUR_Ppem() \ + Cur_PPEM( EXEC_ARG ) + +#define INS_SxVTL( a, b, c, d ) \ + Ins_SxVTL( EXEC_ARG_ a, b, c, d ) + +#define COMPUTE_Funcs() \ + Compute_Funcs( EXEC_ARG ) + +#define COMPUTE_Round( a ) \ + Compute_Round( EXEC_ARG_ a ) + +#define COMPUTE_Point_Displacement( a, b, c, d ) \ + Compute_Point_Displacement( EXEC_ARG_ a, b, c, d ) + +#define MOVE_Zp2_Point( a, b, c, t ) \ + Move_Zp2_Point( EXEC_ARG_ a, b, c, t ) + + +#define CUR_Func_project( v1, v2 ) \ + CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y ) + +#define CUR_Func_dualproj( v1, v2 ) \ + CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y ) + +#define CUR_fast_project( v ) \ + CUR.func_project( EXEC_ARG_ (v)->x, (v)->y ) + +#define CUR_fast_dualproj( v ) \ + CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y ) + + + /*************************************************************************/ + /* */ + /* Instruction dispatch function, as used by the interpreter. */ + /* */ + typedef void (*TInstruction_Function)( INS_ARG ); + + + /*************************************************************************/ + /* */ + /* Two simple bounds-checking macros. */ + /* */ +#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) ) +#define BOUNDSL( x, n ) ( (FT_ULong)(x) >= (FT_ULong)(n) ) + +#undef SUCCESS +#define SUCCESS 0 + +#undef FAILURE +#define FAILURE 1 + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING +#define GUESS_VECTOR( V ) \ + if ( CUR.face->unpatented_hinting ) \ + { \ + CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \ + CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \ + } +#else +#define GUESS_VECTOR( V ) +#endif + + /*************************************************************************/ + /* */ + /* CODERANGE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Goto_CodeRange */ + /* */ + /* <Description> */ + /* Switches to a new code range (updates the code related elements in */ + /* `exec', and `IP'). */ + /* */ + /* <Input> */ + /* range :: The new execution code range. */ + /* */ + /* IP :: The new IP in the new code range. */ + /* */ + /* <InOut> */ + /* exec :: The target execution context. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Goto_CodeRange( TT_ExecContext exec, + FT_Int range, + FT_Long IP ) + { + TT_CodeRange* coderange; + + + FT_ASSERT( range >= 1 && range <= 3 ); + + coderange = &exec->codeRangeTable[range - 1]; + + FT_ASSERT( coderange->base != NULL ); + + /* NOTE: Because the last instruction of a program may be a CALL */ + /* which will return to the first byte *after* the code */ + /* range, we test for IP <= Size instead of IP < Size. */ + /* */ + FT_ASSERT( (FT_ULong)IP <= coderange->size ); + + exec->code = coderange->base; + exec->codeSize = coderange->size; + exec->IP = IP; + exec->curRange = range; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Set_CodeRange */ + /* */ + /* <Description> */ + /* Sets a code range. */ + /* */ + /* <Input> */ + /* range :: The code range index. */ + /* */ + /* base :: The new code base. */ + /* */ + /* length :: The range size in bytes. */ + /* */ + /* <InOut> */ + /* exec :: The target execution context. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_CodeRange( TT_ExecContext exec, + FT_Int range, + void* base, + FT_Long length ) + { + FT_ASSERT( range >= 1 && range <= 3 ); + + exec->codeRangeTable[range - 1].base = (FT_Byte*)base; + exec->codeRangeTable[range - 1].size = length; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Clear_CodeRange */ + /* */ + /* <Description> */ + /* Clears a code range. */ + /* */ + /* <Input> */ + /* range :: The code range index. */ + /* */ + /* <InOut> */ + /* exec :: The target execution context. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Does not set the Error variable. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Clear_CodeRange( TT_ExecContext exec, + FT_Int range ) + { + FT_ASSERT( range >= 1 && range <= 3 ); + + exec->codeRangeTable[range - 1].base = NULL; + exec->codeRangeTable[range - 1].size = 0; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* EXECUTION CONTEXT ROUTINES */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Done_Context */ + /* */ + /* <Description> */ + /* Destroys a given context. */ + /* */ + /* <Input> */ + /* exec :: A handle to the target execution context. */ + /* */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Done_Context( TT_ExecContext exec ) + { + FT_Memory memory = exec->memory; + + + /* points zone */ + exec->maxPoints = 0; + exec->maxContours = 0; + + /* free stack */ + FT_FREE( exec->stack ); + exec->stackSize = 0; + + /* free call stack */ + FT_FREE( exec->callStack ); + exec->callSize = 0; + exec->callTop = 0; + + /* free glyph code range */ + FT_FREE( exec->glyphIns ); + exec->glyphSize = 0; + + exec->size = NULL; + exec->face = NULL; + + FT_FREE( exec ); + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Init_Context */ + /* */ + /* <Description> */ + /* Initializes a context object. */ + /* */ + /* <Input> */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* <InOut> */ + /* exec :: A handle to the target execution context. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Init_Context( TT_ExecContext exec, + FT_Memory memory ) + { + FT_Error error; + + + FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec )); + + exec->memory = memory; + exec->callSize = 32; + + if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) ) + goto Fail_Memory; + + /* all values in the context are set to 0 already, but this is */ + /* here as a remainder */ + exec->maxPoints = 0; + exec->maxContours = 0; + + exec->stackSize = 0; + exec->glyphSize = 0; + + exec->stack = NULL; + exec->glyphIns = NULL; + + exec->face = NULL; + exec->size = NULL; + + return TT_Err_Ok; + + Fail_Memory: + FT_ERROR(( "Init_Context: not enough memory for 0x%08lx\n", + (FT_Long)exec )); + TT_Done_Context( exec ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Update_Max */ + /* */ + /* <Description> */ + /* Checks the size of a buffer and reallocates it if necessary. */ + /* */ + /* <Input> */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* multiplier :: The size in bytes of each element in the buffer. */ + /* */ + /* new_max :: The new capacity (size) of the buffer. */ + /* */ + /* <InOut> */ + /* size :: The address of the buffer's current size expressed */ + /* in elements. */ + /* */ + /* buff :: The address of the buffer base pointer. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + Update_Max( FT_Memory memory, + FT_ULong* size, + FT_Long multiplier, + void* _pbuff, + FT_ULong new_max ) + { + FT_Error error; + void** pbuff = (void**)_pbuff; + + + if ( *size < new_max ) + { + if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) ) + return error; + *size = new_max; + } + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Load_Context */ + /* */ + /* <Description> */ + /* Prepare an execution context for glyph hinting. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* size :: A handle to the source size object. */ + /* */ + /* <InOut> */ + /* exec :: A handle to the target execution context. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Load_Context( TT_ExecContext exec, + TT_Face face, + TT_Size size ) + { + FT_Int i; + FT_ULong tmp; + TT_MaxProfile* maxp; + FT_Error error; + + + exec->face = face; + maxp = &face->max_profile; + exec->size = size; + + if ( size ) + { + exec->numFDefs = size->num_function_defs; + exec->maxFDefs = size->max_function_defs; + exec->numIDefs = size->num_instruction_defs; + exec->maxIDefs = size->max_instruction_defs; + exec->FDefs = size->function_defs; + exec->IDefs = size->instruction_defs; + exec->tt_metrics = size->ttmetrics; + exec->metrics = size->metrics; + + exec->maxFunc = size->max_func; + exec->maxIns = size->max_ins; + + for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) + exec->codeRangeTable[i] = size->codeRangeTable[i]; + + /* set graphics state */ + exec->GS = size->GS; + + exec->cvtSize = size->cvt_size; + exec->cvt = size->cvt; + + exec->storeSize = size->storage_size; + exec->storage = size->storage; + + exec->twilight = size->twilight; + } + + /* XXX: We reserve a little more elements on the stack to deal safely */ + /* with broken fonts like arialbs, courbs, timesbs, etc. */ + tmp = exec->stackSize; + error = Update_Max( exec->memory, + &tmp, + sizeof ( FT_F26Dot6 ), + (void*)&exec->stack, + maxp->maxStackElements + 32 ); + exec->stackSize = (FT_UInt)tmp; + if ( error ) + return error; + + tmp = exec->glyphSize; + error = Update_Max( exec->memory, + &tmp, + sizeof ( FT_Byte ), + (void*)&exec->glyphIns, + maxp->maxSizeOfInstructions ); + exec->glyphSize = (FT_UShort)tmp; + if ( error ) + return error; + + exec->pts.n_points = 0; + exec->pts.n_contours = 0; + + exec->zp1 = exec->pts; + exec->zp2 = exec->pts; + exec->zp0 = exec->pts; + + exec->instruction_trap = FALSE; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Save_Context */ + /* */ + /* <Description> */ + /* Saves the code ranges in a `size' object. */ + /* */ + /* <Input> */ + /* exec :: A handle to the source execution context. */ + /* */ + /* <InOut> */ + /* size :: A handle to the target size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Save_Context( TT_ExecContext exec, + TT_Size size ) + { + FT_Int i; + + + /* XXXX: Will probably disappear soon with all the code range */ + /* management, which is now rather obsolete. */ + /* */ + size->num_function_defs = exec->numFDefs; + size->num_instruction_defs = exec->numIDefs; + + size->max_func = exec->maxFunc; + size->max_ins = exec->maxIns; + + for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) + size->codeRangeTable[i] = exec->codeRangeTable[i]; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Run_Context */ + /* */ + /* <Description> */ + /* Executes one or more instructions in the execution context. */ + /* */ + /* <Input> */ + /* debug :: A Boolean flag. If set, the function sets some internal */ + /* variables and returns immediately, otherwise TT_RunIns() */ + /* is called. */ + /* */ + /* This is commented out currently. */ + /* */ + /* <Input> */ + /* exec :: A handle to the target execution context. */ + /* */ + /* <Return> */ + /* TrueType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Run_Context( TT_ExecContext exec, + FT_Bool debug ) + { + FT_Error error; + + + if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) ) + != TT_Err_Ok ) + return error; + + exec->zp0 = exec->pts; + exec->zp1 = exec->pts; + exec->zp2 = exec->pts; + + exec->GS.gep0 = 1; + exec->GS.gep1 = 1; + exec->GS.gep2 = 1; + + exec->GS.projVector.x = 0x4000; + exec->GS.projVector.y = 0x0000; + + exec->GS.freeVector = exec->GS.projVector; + exec->GS.dualVector = exec->GS.projVector; + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + exec->GS.both_x_axis = TRUE; +#endif + + exec->GS.round_state = 1; + exec->GS.loop = 1; + + /* some glyphs leave something on the stack. so we clean it */ + /* before a new execution. */ + exec->top = 0; + exec->callTop = 0; + +#if 1 + FT_UNUSED( debug ); + + return exec->face->interpreter( exec ); +#else + if ( !debug ) + return TT_RunIns( exec ); + else + return TT_Err_Ok; +#endif + } + + + /* The default value for `scan_control' is documented as FALSE in the */ + /* TrueType specification. This is confusing since it implies a */ + /* Boolean value. However, this is not the case, thus both the */ + /* default values of our `scan_type' and `scan_control' fields (which */ + /* the documentation's `scan_control' variable is split into) are */ + /* zero. */ + + const TT_GraphicsState tt_default_graphics_state = + { + 0, 0, 0, + { 0x4000, 0 }, + { 0x4000, 0 }, + { 0x4000, 0 }, + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + TRUE, +#endif + + 1, 64, 1, + TRUE, 68, 0, 0, 9, 3, + 0, FALSE, 0, 1, 1, 1 + }; + + + /* documentation is in ttinterp.h */ + + FT_EXPORT_DEF( TT_ExecContext ) + TT_New_Context( TT_Driver driver ) + { + TT_ExecContext exec; + FT_Memory memory; + + + memory = driver->root.root.memory; + exec = driver->context; + + if ( !driver->context ) + { + FT_Error error; + + + /* allocate object */ + if ( FT_NEW( exec ) ) + goto Fail; + + /* initialize it; in case of error this deallocates `exec' too */ + error = Init_Context( exec, memory ); + if ( error ) + goto Fail; + + /* store it into the driver */ + driver->context = exec; + } + + return driver->context; + + Fail: + return NULL; + } + + + /*************************************************************************/ + /* */ + /* Before an opcode is executed, the interpreter verifies that there are */ + /* enough arguments on the stack, with the help of the `Pop_Push_Count' */ + /* table. */ + /* */ + /* For each opcode, the first column gives the number of arguments that */ + /* are popped from the stack; the second one gives the number of those */ + /* that are pushed in result. */ + /* */ + /* Opcodes which have a varying number of parameters in the data stream */ + /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */ + /* the `opcode_length' table, and the value in `Pop_Push_Count' is set */ + /* to zero. */ + /* */ + /*************************************************************************/ + + +#undef PACK +#define PACK( x, y ) ( ( x << 4 ) | y ) + + + static + const FT_Byte Pop_Push_Count[256] = + { + /* opcodes are gathered in groups of 16 */ + /* please keep the spaces as they are */ + + /* SVTCA y */ PACK( 0, 0 ), + /* SVTCA x */ PACK( 0, 0 ), + /* SPvTCA y */ PACK( 0, 0 ), + /* SPvTCA x */ PACK( 0, 0 ), + /* SFvTCA y */ PACK( 0, 0 ), + /* SFvTCA x */ PACK( 0, 0 ), + /* SPvTL // */ PACK( 2, 0 ), + /* SPvTL + */ PACK( 2, 0 ), + /* SFvTL // */ PACK( 2, 0 ), + /* SFvTL + */ PACK( 2, 0 ), + /* SPvFS */ PACK( 2, 0 ), + /* SFvFS */ PACK( 2, 0 ), + /* GPV */ PACK( 0, 2 ), + /* GFV */ PACK( 0, 2 ), + /* SFvTPv */ PACK( 0, 0 ), + /* ISECT */ PACK( 5, 0 ), + + /* SRP0 */ PACK( 1, 0 ), + /* SRP1 */ PACK( 1, 0 ), + /* SRP2 */ PACK( 1, 0 ), + /* SZP0 */ PACK( 1, 0 ), + /* SZP1 */ PACK( 1, 0 ), + /* SZP2 */ PACK( 1, 0 ), + /* SZPS */ PACK( 1, 0 ), + /* SLOOP */ PACK( 1, 0 ), + /* RTG */ PACK( 0, 0 ), + /* RTHG */ PACK( 0, 0 ), + /* SMD */ PACK( 1, 0 ), + /* ELSE */ PACK( 0, 0 ), + /* JMPR */ PACK( 1, 0 ), + /* SCvTCi */ PACK( 1, 0 ), + /* SSwCi */ PACK( 1, 0 ), + /* SSW */ PACK( 1, 0 ), + + /* DUP */ PACK( 1, 2 ), + /* POP */ PACK( 1, 0 ), + /* CLEAR */ PACK( 0, 0 ), + /* SWAP */ PACK( 2, 2 ), + /* DEPTH */ PACK( 0, 1 ), + /* CINDEX */ PACK( 1, 1 ), + /* MINDEX */ PACK( 1, 0 ), + /* AlignPTS */ PACK( 2, 0 ), + /* INS_$28 */ PACK( 0, 0 ), + /* UTP */ PACK( 1, 0 ), + /* LOOPCALL */ PACK( 2, 0 ), + /* CALL */ PACK( 1, 0 ), + /* FDEF */ PACK( 1, 0 ), + /* ENDF */ PACK( 0, 0 ), + /* MDAP[0] */ PACK( 1, 0 ), + /* MDAP[1] */ PACK( 1, 0 ), + + /* IUP[0] */ PACK( 0, 0 ), + /* IUP[1] */ PACK( 0, 0 ), + /* SHP[0] */ PACK( 0, 0 ), + /* SHP[1] */ PACK( 0, 0 ), + /* SHC[0] */ PACK( 1, 0 ), + /* SHC[1] */ PACK( 1, 0 ), + /* SHZ[0] */ PACK( 1, 0 ), + /* SHZ[1] */ PACK( 1, 0 ), + /* SHPIX */ PACK( 1, 0 ), + /* IP */ PACK( 0, 0 ), + /* MSIRP[0] */ PACK( 2, 0 ), + /* MSIRP[1] */ PACK( 2, 0 ), + /* AlignRP */ PACK( 0, 0 ), + /* RTDG */ PACK( 0, 0 ), + /* MIAP[0] */ PACK( 2, 0 ), + /* MIAP[1] */ PACK( 2, 0 ), + + /* NPushB */ PACK( 0, 0 ), + /* NPushW */ PACK( 0, 0 ), + /* WS */ PACK( 2, 0 ), + /* RS */ PACK( 1, 1 ), + /* WCvtP */ PACK( 2, 0 ), + /* RCvt */ PACK( 1, 1 ), + /* GC[0] */ PACK( 1, 1 ), + /* GC[1] */ PACK( 1, 1 ), + /* SCFS */ PACK( 2, 0 ), + /* MD[0] */ PACK( 2, 1 ), + /* MD[1] */ PACK( 2, 1 ), + /* MPPEM */ PACK( 0, 1 ), + /* MPS */ PACK( 0, 1 ), + /* FlipON */ PACK( 0, 0 ), + /* FlipOFF */ PACK( 0, 0 ), + /* DEBUG */ PACK( 1, 0 ), + + /* LT */ PACK( 2, 1 ), + /* LTEQ */ PACK( 2, 1 ), + /* GT */ PACK( 2, 1 ), + /* GTEQ */ PACK( 2, 1 ), + /* EQ */ PACK( 2, 1 ), + /* NEQ */ PACK( 2, 1 ), + /* ODD */ PACK( 1, 1 ), + /* EVEN */ PACK( 1, 1 ), + /* IF */ PACK( 1, 0 ), + /* EIF */ PACK( 0, 0 ), + /* AND */ PACK( 2, 1 ), + /* OR */ PACK( 2, 1 ), + /* NOT */ PACK( 1, 1 ), + /* DeltaP1 */ PACK( 1, 0 ), + /* SDB */ PACK( 1, 0 ), + /* SDS */ PACK( 1, 0 ), + + /* ADD */ PACK( 2, 1 ), + /* SUB */ PACK( 2, 1 ), + /* DIV */ PACK( 2, 1 ), + /* MUL */ PACK( 2, 1 ), + /* ABS */ PACK( 1, 1 ), + /* NEG */ PACK( 1, 1 ), + /* FLOOR */ PACK( 1, 1 ), + /* CEILING */ PACK( 1, 1 ), + /* ROUND[0] */ PACK( 1, 1 ), + /* ROUND[1] */ PACK( 1, 1 ), + /* ROUND[2] */ PACK( 1, 1 ), + /* ROUND[3] */ PACK( 1, 1 ), + /* NROUND[0] */ PACK( 1, 1 ), + /* NROUND[1] */ PACK( 1, 1 ), + /* NROUND[2] */ PACK( 1, 1 ), + /* NROUND[3] */ PACK( 1, 1 ), + + /* WCvtF */ PACK( 2, 0 ), + /* DeltaP2 */ PACK( 1, 0 ), + /* DeltaP3 */ PACK( 1, 0 ), + /* DeltaCn[0] */ PACK( 1, 0 ), + /* DeltaCn[1] */ PACK( 1, 0 ), + /* DeltaCn[2] */ PACK( 1, 0 ), + /* SROUND */ PACK( 1, 0 ), + /* S45Round */ PACK( 1, 0 ), + /* JROT */ PACK( 2, 0 ), + /* JROF */ PACK( 2, 0 ), + /* ROFF */ PACK( 0, 0 ), + /* INS_$7B */ PACK( 0, 0 ), + /* RUTG */ PACK( 0, 0 ), + /* RDTG */ PACK( 0, 0 ), + /* SANGW */ PACK( 1, 0 ), + /* AA */ PACK( 1, 0 ), + + /* FlipPT */ PACK( 0, 0 ), + /* FlipRgON */ PACK( 2, 0 ), + /* FlipRgOFF */ PACK( 2, 0 ), + /* INS_$83 */ PACK( 0, 0 ), + /* INS_$84 */ PACK( 0, 0 ), + /* ScanCTRL */ PACK( 1, 0 ), + /* SDVPTL[0] */ PACK( 2, 0 ), + /* SDVPTL[1] */ PACK( 2, 0 ), + /* GetINFO */ PACK( 1, 1 ), + /* IDEF */ PACK( 1, 0 ), + /* ROLL */ PACK( 3, 3 ), + /* MAX */ PACK( 2, 1 ), + /* MIN */ PACK( 2, 1 ), + /* ScanTYPE */ PACK( 1, 0 ), + /* InstCTRL */ PACK( 2, 0 ), + /* INS_$8F */ PACK( 0, 0 ), + + /* INS_$90 */ PACK( 0, 0 ), + /* INS_$91 */ PACK( 0, 0 ), + /* INS_$92 */ PACK( 0, 0 ), + /* INS_$93 */ PACK( 0, 0 ), + /* INS_$94 */ PACK( 0, 0 ), + /* INS_$95 */ PACK( 0, 0 ), + /* INS_$96 */ PACK( 0, 0 ), + /* INS_$97 */ PACK( 0, 0 ), + /* INS_$98 */ PACK( 0, 0 ), + /* INS_$99 */ PACK( 0, 0 ), + /* INS_$9A */ PACK( 0, 0 ), + /* INS_$9B */ PACK( 0, 0 ), + /* INS_$9C */ PACK( 0, 0 ), + /* INS_$9D */ PACK( 0, 0 ), + /* INS_$9E */ PACK( 0, 0 ), + /* INS_$9F */ PACK( 0, 0 ), + + /* INS_$A0 */ PACK( 0, 0 ), + /* INS_$A1 */ PACK( 0, 0 ), + /* INS_$A2 */ PACK( 0, 0 ), + /* INS_$A3 */ PACK( 0, 0 ), + /* INS_$A4 */ PACK( 0, 0 ), + /* INS_$A5 */ PACK( 0, 0 ), + /* INS_$A6 */ PACK( 0, 0 ), + /* INS_$A7 */ PACK( 0, 0 ), + /* INS_$A8 */ PACK( 0, 0 ), + /* INS_$A9 */ PACK( 0, 0 ), + /* INS_$AA */ PACK( 0, 0 ), + /* INS_$AB */ PACK( 0, 0 ), + /* INS_$AC */ PACK( 0, 0 ), + /* INS_$AD */ PACK( 0, 0 ), + /* INS_$AE */ PACK( 0, 0 ), + /* INS_$AF */ PACK( 0, 0 ), + + /* PushB[0] */ PACK( 0, 1 ), + /* PushB[1] */ PACK( 0, 2 ), + /* PushB[2] */ PACK( 0, 3 ), + /* PushB[3] */ PACK( 0, 4 ), + /* PushB[4] */ PACK( 0, 5 ), + /* PushB[5] */ PACK( 0, 6 ), + /* PushB[6] */ PACK( 0, 7 ), + /* PushB[7] */ PACK( 0, 8 ), + /* PushW[0] */ PACK( 0, 1 ), + /* PushW[1] */ PACK( 0, 2 ), + /* PushW[2] */ PACK( 0, 3 ), + /* PushW[3] */ PACK( 0, 4 ), + /* PushW[4] */ PACK( 0, 5 ), + /* PushW[5] */ PACK( 0, 6 ), + /* PushW[6] */ PACK( 0, 7 ), + /* PushW[7] */ PACK( 0, 8 ), + + /* MDRP[00] */ PACK( 1, 0 ), + /* MDRP[01] */ PACK( 1, 0 ), + /* MDRP[02] */ PACK( 1, 0 ), + /* MDRP[03] */ PACK( 1, 0 ), + /* MDRP[04] */ PACK( 1, 0 ), + /* MDRP[05] */ PACK( 1, 0 ), + /* MDRP[06] */ PACK( 1, 0 ), + /* MDRP[07] */ PACK( 1, 0 ), + /* MDRP[08] */ PACK( 1, 0 ), + /* MDRP[09] */ PACK( 1, 0 ), + /* MDRP[10] */ PACK( 1, 0 ), + /* MDRP[11] */ PACK( 1, 0 ), + /* MDRP[12] */ PACK( 1, 0 ), + /* MDRP[13] */ PACK( 1, 0 ), + /* MDRP[14] */ PACK( 1, 0 ), + /* MDRP[15] */ PACK( 1, 0 ), + + /* MDRP[16] */ PACK( 1, 0 ), + /* MDRP[17] */ PACK( 1, 0 ), + /* MDRP[18] */ PACK( 1, 0 ), + /* MDRP[19] */ PACK( 1, 0 ), + /* MDRP[20] */ PACK( 1, 0 ), + /* MDRP[21] */ PACK( 1, 0 ), + /* MDRP[22] */ PACK( 1, 0 ), + /* MDRP[23] */ PACK( 1, 0 ), + /* MDRP[24] */ PACK( 1, 0 ), + /* MDRP[25] */ PACK( 1, 0 ), + /* MDRP[26] */ PACK( 1, 0 ), + /* MDRP[27] */ PACK( 1, 0 ), + /* MDRP[28] */ PACK( 1, 0 ), + /* MDRP[29] */ PACK( 1, 0 ), + /* MDRP[30] */ PACK( 1, 0 ), + /* MDRP[31] */ PACK( 1, 0 ), + + /* MIRP[00] */ PACK( 2, 0 ), + /* MIRP[01] */ PACK( 2, 0 ), + /* MIRP[02] */ PACK( 2, 0 ), + /* MIRP[03] */ PACK( 2, 0 ), + /* MIRP[04] */ PACK( 2, 0 ), + /* MIRP[05] */ PACK( 2, 0 ), + /* MIRP[06] */ PACK( 2, 0 ), + /* MIRP[07] */ PACK( 2, 0 ), + /* MIRP[08] */ PACK( 2, 0 ), + /* MIRP[09] */ PACK( 2, 0 ), + /* MIRP[10] */ PACK( 2, 0 ), + /* MIRP[11] */ PACK( 2, 0 ), + /* MIRP[12] */ PACK( 2, 0 ), + /* MIRP[13] */ PACK( 2, 0 ), + /* MIRP[14] */ PACK( 2, 0 ), + /* MIRP[15] */ PACK( 2, 0 ), + + /* MIRP[16] */ PACK( 2, 0 ), + /* MIRP[17] */ PACK( 2, 0 ), + /* MIRP[18] */ PACK( 2, 0 ), + /* MIRP[19] */ PACK( 2, 0 ), + /* MIRP[20] */ PACK( 2, 0 ), + /* MIRP[21] */ PACK( 2, 0 ), + /* MIRP[22] */ PACK( 2, 0 ), + /* MIRP[23] */ PACK( 2, 0 ), + /* MIRP[24] */ PACK( 2, 0 ), + /* MIRP[25] */ PACK( 2, 0 ), + /* MIRP[26] */ PACK( 2, 0 ), + /* MIRP[27] */ PACK( 2, 0 ), + /* MIRP[28] */ PACK( 2, 0 ), + /* MIRP[29] */ PACK( 2, 0 ), + /* MIRP[30] */ PACK( 2, 0 ), + /* MIRP[31] */ PACK( 2, 0 ) + }; + + +#ifdef FT_DEBUG_LEVEL_TRACE + + static + const char* const opcode_name[256] = + { + "SVTCA y", + "SVTCA x", + "SPvTCA y", + "SPvTCA x", + "SFvTCA y", + "SFvTCA x", + "SPvTL ||", + "SPvTL +", + "SFvTL ||", + "SFvTL +", + "SPvFS", + "SFvFS", + "GPV", + "GFV", + "SFvTPv", + "ISECT", + + "SRP0", + "SRP1", + "SRP2", + "SZP0", + "SZP1", + "SZP2", + "SZPS", + "SLOOP", + "RTG", + "RTHG", + "SMD", + "ELSE", + "JMPR", + "SCvTCi", + "SSwCi", + "SSW", + + "DUP", + "POP", + "CLEAR", + "SWAP", + "DEPTH", + "CINDEX", + "MINDEX", + "AlignPTS", + "INS_$28", + "UTP", + "LOOPCALL", + "CALL", + "FDEF", + "ENDF", + "MDAP[0]", + "MDAP[1]", + + "IUP[0]", + "IUP[1]", + "SHP[0]", + "SHP[1]", + "SHC[0]", + "SHC[1]", + "SHZ[0]", + "SHZ[1]", + "SHPIX", + "IP", + "MSIRP[0]", + "MSIRP[1]", + "AlignRP", + "RTDG", + "MIAP[0]", + "MIAP[1]", + + "NPushB", + "NPushW", + "WS", + "RS", + "WCvtP", + "RCvt", + "GC[0]", + "GC[1]", + "SCFS", + "MD[0]", + "MD[1]", + "MPPEM", + "MPS", + "FlipON", + "FlipOFF", + "DEBUG", + + "LT", + "LTEQ", + "GT", + "GTEQ", + "EQ", + "NEQ", + "ODD", + "EVEN", + "IF", + "EIF", + "AND", + "OR", + "NOT", + "DeltaP1", + "SDB", + "SDS", + + "ADD", + "SUB", + "DIV", + "MUL", + "ABS", + "NEG", + "FLOOR", + "CEILING", + "ROUND[0]", + "ROUND[1]", + "ROUND[2]", + "ROUND[3]", + "NROUND[0]", + "NROUND[1]", + "NROUND[2]", + "NROUND[3]", + + "WCvtF", + "DeltaP2", + "DeltaP3", + "DeltaCn[0]", + "DeltaCn[1]", + "DeltaCn[2]", + "SROUND", + "S45Round", + "JROT", + "JROF", + "ROFF", + "INS_$7B", + "RUTG", + "RDTG", + "SANGW", + "AA", + + "FlipPT", + "FlipRgON", + "FlipRgOFF", + "INS_$83", + "INS_$84", + "ScanCTRL", + "SDVPTL[0]", + "SDVPTL[1]", + "GetINFO", + "IDEF", + "ROLL", + "MAX", + "MIN", + "ScanTYPE", + "InstCTRL", + "INS_$8F", + + "INS_$90", + "INS_$91", + "INS_$92", + "INS_$93", + "INS_$94", + "INS_$95", + "INS_$96", + "INS_$97", + "INS_$98", + "INS_$99", + "INS_$9A", + "INS_$9B", + "INS_$9C", + "INS_$9D", + "INS_$9E", + "INS_$9F", + + "INS_$A0", + "INS_$A1", + "INS_$A2", + "INS_$A3", + "INS_$A4", + "INS_$A5", + "INS_$A6", + "INS_$A7", + "INS_$A8", + "INS_$A9", + "INS_$AA", + "INS_$AB", + "INS_$AC", + "INS_$AD", + "INS_$AE", + "INS_$AF", + + "PushB[0]", + "PushB[1]", + "PushB[2]", + "PushB[3]", + "PushB[4]", + "PushB[5]", + "PushB[6]", + "PushB[7]", + "PushW[0]", + "PushW[1]", + "PushW[2]", + "PushW[3]", + "PushW[4]", + "PushW[5]", + "PushW[6]", + "PushW[7]", + + "MDRP[00]", + "MDRP[01]", + "MDRP[02]", + "MDRP[03]", + "MDRP[04]", + "MDRP[05]", + "MDRP[06]", + "MDRP[07]", + "MDRP[08]", + "MDRP[09]", + "MDRP[10]", + "MDRP[11]", + "MDRP[12]", + "MDRP[13]", + "MDRP[14]", + "MDRP[15]", + + "MDRP[16]", + "MDRP[17]", + "MDRP[18]", + "MDRP[19]", + "MDRP[20]", + "MDRP[21]", + "MDRP[22]", + "MDRP[23]", + "MDRP[24]", + "MDRP[25]", + "MDRP[26]", + "MDRP[27]", + "MDRP[28]", + "MDRP[29]", + "MDRP[30]", + "MDRP[31]", + + "MIRP[00]", + "MIRP[01]", + "MIRP[02]", + "MIRP[03]", + "MIRP[04]", + "MIRP[05]", + "MIRP[06]", + "MIRP[07]", + "MIRP[08]", + "MIRP[09]", + "MIRP[10]", + "MIRP[11]", + "MIRP[12]", + "MIRP[13]", + "MIRP[14]", + "MIRP[15]", + + "MIRP[16]", + "MIRP[17]", + "MIRP[18]", + "MIRP[19]", + "MIRP[20]", + "MIRP[21]", + "MIRP[22]", + "MIRP[23]", + "MIRP[24]", + "MIRP[25]", + "MIRP[26]", + "MIRP[27]", + "MIRP[28]", + "MIRP[29]", + "MIRP[30]", + "MIRP[31]" + }; + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + static + const FT_Char opcode_length[256] = + { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + -1,-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 3, 5, 7, 9, 11,13,15,17, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + }; + +#undef PACK + +#if 1 + + static FT_Int32 + TT_MulFix14( FT_Int32 a, + FT_Int b ) + { + FT_Int32 sign; + FT_UInt32 ah, al, mid, lo, hi; + + + sign = a ^ b; + + if ( a < 0 ) + a = -a; + if ( b < 0 ) + b = -b; + + ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU ); + al = (FT_UInt32)( a & 0xFFFFU ); + + lo = al * b; + mid = ah * b; + hi = mid >> 16; + mid = ( mid << 16 ) + ( 1 << 13 ); /* rounding */ + lo += mid; + if ( lo < mid ) + hi += 1; + + mid = ( lo >> 14 ) | ( hi << 18 ); + + return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid; + } + +#else + + /* compute (a*b)/2^14 with maximal accuracy and rounding */ + static FT_Int32 + TT_MulFix14( FT_Int32 a, + FT_Int b ) + { + FT_Int32 m, s, hi; + FT_UInt32 l, lo; + + + /* compute ax*bx as 64-bit value */ + l = (FT_UInt32)( ( a & 0xFFFFU ) * b ); + m = ( a >> 16 ) * b; + + lo = l + (FT_UInt32)( m << 16 ); + hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l ); + + /* divide the result by 2^14 with rounding */ + s = hi >> 31; + l = lo + (FT_UInt32)s; + hi += s + ( l < lo ); + lo = l; + + l = lo + 0x2000U; + hi += l < lo; + + return ( hi << 18 ) | ( l >> 14 ); + } +#endif + + + /* compute (ax*bx+ay*by)/2^14 with maximal accuracy and rounding */ + static FT_Int32 + TT_DotFix14( FT_Int32 ax, + FT_Int32 ay, + FT_Int bx, + FT_Int by ) + { + FT_Int32 m, s, hi1, hi2, hi; + FT_UInt32 l, lo1, lo2, lo; + + + /* compute ax*bx as 64-bit value */ + l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx ); + m = ( ax >> 16 ) * bx; + + lo1 = l + (FT_UInt32)( m << 16 ); + hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l ); + + /* compute ay*by as 64-bit value */ + l = (FT_UInt32)( ( ay & 0xFFFFU ) * by ); + m = ( ay >> 16 ) * by; + + lo2 = l + (FT_UInt32)( m << 16 ); + hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l ); + + /* add them */ + lo = lo1 + lo2; + hi = hi1 + hi2 + ( lo < lo1 ); + + /* divide the result by 2^14 with rounding */ + s = hi >> 31; + l = lo + (FT_UInt32)s; + hi += s + ( l < lo ); + lo = l; + + l = lo + 0x2000U; + hi += ( l < lo ); + + return ( hi << 18 ) | ( l >> 14 ); + } + + + /* return length of given vector */ + +#if 0 + + static FT_Int32 + TT_VecLen( FT_Int32 x, + FT_Int32 y ) + { + FT_Int32 m, hi1, hi2, hi; + FT_UInt32 l, lo1, lo2, lo; + + + /* compute x*x as 64-bit value */ + lo = (FT_UInt32)( x & 0xFFFFU ); + hi = x >> 16; + + l = lo * lo; + m = hi * lo; + hi = hi * hi; + + lo1 = l + (FT_UInt32)( m << 17 ); + hi1 = hi + ( m >> 15 ) + ( lo1 < l ); + + /* compute y*y as 64-bit value */ + lo = (FT_UInt32)( y & 0xFFFFU ); + hi = y >> 16; + + l = lo * lo; + m = hi * lo; + hi = hi * hi; + + lo2 = l + (FT_UInt32)( m << 17 ); + hi2 = hi + ( m >> 15 ) + ( lo2 < l ); + + /* add them to get 'x*x+y*y' as 64-bit value */ + lo = lo1 + lo2; + hi = hi1 + hi2 + ( lo < lo1 ); + + /* compute the square root of this value */ + { + FT_UInt32 root, rem, test_div; + FT_Int count; + + + root = 0; + + { + rem = 0; + count = 32; + do + { + rem = ( rem << 2 ) | ( (FT_UInt32)hi >> 30 ); + hi = ( hi << 2 ) | ( lo >> 30 ); + lo <<= 2; + root <<= 1; + test_div = ( root << 1 ) + 1; + + if ( rem >= test_div ) + { + rem -= test_div; + root += 1; + } + } while ( --count ); + } + + return (FT_Int32)root; + } + } + +#else + + /* this version uses FT_Vector_Length which computes the same value */ + /* much, much faster.. */ + /* */ + static FT_F26Dot6 + TT_VecLen( FT_F26Dot6 X, + FT_F26Dot6 Y ) + { + FT_Vector v; + + + v.x = X; + v.y = Y; + + return FT_Vector_Length( &v ); + } + +#endif + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Current_Ratio */ + /* */ + /* <Description> */ + /* Returns the current aspect ratio scaling factor depending on the */ + /* projection vector's state and device resolutions. */ + /* */ + /* <Return> */ + /* The aspect ratio in 16.16 format, always <= 1.0 . */ + /* */ + static FT_Long + Current_Ratio( EXEC_OP ) + { + if ( !CUR.tt_metrics.ratio ) + { +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + if ( CUR.GS.both_x_axis ) + CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio; + else + CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio; + } + else +#endif + { + if ( CUR.GS.projVector.y == 0 ) + CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio; + + else if ( CUR.GS.projVector.x == 0 ) + CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio; + + else + { + FT_Long x, y; + + + x = TT_MULDIV( CUR.GS.projVector.x, + CUR.tt_metrics.x_ratio, 0x4000 ); + y = TT_MULDIV( CUR.GS.projVector.y, + CUR.tt_metrics.y_ratio, 0x4000 ); + CUR.tt_metrics.ratio = TT_VecLen( x, y ); + } + } + } + return CUR.tt_metrics.ratio; + } + + + static FT_Long + Current_Ppem( EXEC_OP ) + { + return TT_MULFIX( CUR.tt_metrics.ppem, CURRENT_Ratio() ); + } + + + /*************************************************************************/ + /* */ + /* Functions related to the control value table (CVT). */ + /* */ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_F26Dot6 ) + Read_CVT( EXEC_OP_ FT_ULong idx ) + { + return CUR.cvt[idx]; + } + + + FT_CALLBACK_DEF( FT_F26Dot6 ) + Read_CVT_Stretched( EXEC_OP_ FT_ULong idx ) + { + return TT_MULFIX( CUR.cvt[idx], CURRENT_Ratio() ); + } + + + FT_CALLBACK_DEF( void ) + Write_CVT( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ) + { + CUR.cvt[idx] = value; + } + + + FT_CALLBACK_DEF( void ) + Write_CVT_Stretched( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ) + { + CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() ); + } + + + FT_CALLBACK_DEF( void ) + Move_CVT( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ) + { + CUR.cvt[idx] += value; + } + + + FT_CALLBACK_DEF( void ) + Move_CVT_Stretched( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ) + { + CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* GetShortIns */ + /* */ + /* <Description> */ + /* Returns a short integer taken from the instruction stream at */ + /* address IP. */ + /* */ + /* <Return> */ + /* Short read at code[IP]. */ + /* */ + /* <Note> */ + /* This one could become a macro. */ + /* */ + static FT_Short + GetShortIns( EXEC_OP ) + { + /* Reading a byte stream so there is no endianess (DaveP) */ + CUR.IP += 2; + return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) + + CUR.code[CUR.IP - 1] ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Ins_Goto_CodeRange */ + /* */ + /* <Description> */ + /* Goes to a certain code range in the instruction stream. */ + /* */ + /* <Input> */ + /* aRange :: The index of the code range. */ + /* */ + /* aIP :: The new IP address in the code range. */ + /* */ + /* <Return> */ + /* SUCCESS or FAILURE. */ + /* */ + static FT_Bool + Ins_Goto_CodeRange( EXEC_OP_ FT_Int aRange, + FT_ULong aIP ) + { + TT_CodeRange* range; + + + if ( aRange < 1 || aRange > 3 ) + { + CUR.error = TT_Err_Bad_Argument; + return FAILURE; + } + + range = &CUR.codeRangeTable[aRange - 1]; + + if ( range->base == NULL ) /* invalid coderange */ + { + CUR.error = TT_Err_Invalid_CodeRange; + return FAILURE; + } + + /* NOTE: Because the last instruction of a program may be a CALL */ + /* which will return to the first byte *after* the code */ + /* range, we test for AIP <= Size, instead of AIP < Size. */ + + if ( aIP > range->size ) + { + CUR.error = TT_Err_Code_Overflow; + return FAILURE; + } + + CUR.code = range->base; + CUR.codeSize = range->size; + CUR.IP = aIP; + CUR.curRange = aRange; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Direct_Move */ + /* */ + /* <Description> */ + /* Moves a point by a given distance along the freedom vector. The */ + /* point will be `touched'. */ + /* */ + /* <Input> */ + /* point :: The index of the point to move. */ + /* */ + /* distance :: The distance to apply. */ + /* */ + /* <InOut> */ + /* zone :: The affected glyph zone. */ + /* */ + static void + Direct_Move( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_F26Dot6 v; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_ASSERT( !CUR.face->unpatented_hinting ); +#endif + + v = CUR.GS.freeVector.x; + + if ( v != 0 ) + { + zone->cur[point].x += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + v = CUR.GS.freeVector.y; + + if ( v != 0 ) + { + zone->cur[point].y += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Direct_Move_Orig */ + /* */ + /* <Description> */ + /* Moves the *original* position of a point by a given distance along */ + /* the freedom vector. Obviously, the point will not be `touched'. */ + /* */ + /* <Input> */ + /* point :: The index of the point to move. */ + /* */ + /* distance :: The distance to apply. */ + /* */ + /* <InOut> */ + /* zone :: The affected glyph zone. */ + /* */ + static void + Direct_Move_Orig( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_F26Dot6 v; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_ASSERT( !CUR.face->unpatented_hinting ); +#endif + + v = CUR.GS.freeVector.x; + + if ( v != 0 ) + zone->org[point].x += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + + v = CUR.GS.freeVector.y; + + if ( v != 0 ) + zone->org[point].y += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + } + + + /*************************************************************************/ + /* */ + /* Special versions of Direct_Move() */ + /* */ + /* The following versions are used whenever both vectors are both */ + /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ + /* */ + /*************************************************************************/ + + + static void + Direct_Move_X( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->cur[point].x += distance; + zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + + static void + Direct_Move_Y( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->cur[point].y += distance; + zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + + + /*************************************************************************/ + /* */ + /* Special versions of Direct_Move_Orig() */ + /* */ + /* The following versions are used whenever both vectors are both */ + /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ + /* */ + /*************************************************************************/ + + + static void + Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->org[point].x += distance; + } + + + static void + Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->org[point].y += distance; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_None */ + /* */ + /* <Description> */ + /* Does not round, but adds engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance (not) to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* The compensated distance. */ + /* */ + /* <Note> */ + /* The TrueType specification says very few about the relationship */ + /* between rounding and engine compensation. However, it seems from */ + /* the description of super round that we should add the compensation */ + /* before rounding. */ + /* */ + static FT_F26Dot6 + Round_None( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation; + if ( distance && val < 0 ) + val = 0; + } + else + { + val = distance - compensation; + if ( val > 0 ) + val = 0; + } + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_To_Grid */ + /* */ + /* <Description> */ + /* Rounds value to grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_To_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation + 32; + if ( distance && val > 0 ) + val &= ~63; + else + val = 0; + } + else + { + val = -FT_PIX_ROUND( compensation - distance ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_To_Half_Grid */ + /* */ + /* <Description> */ + /* Rounds value to half grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = FT_PIX_FLOOR( distance + compensation ) + 32; + if ( distance && val < 0 ) + val = 0; + } + else + { + val = -( FT_PIX_FLOOR( compensation - distance ) + 32 ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_Down_To_Grid */ + /* */ + /* <Description> */ + /* Rounds value down to grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation; + if ( distance && val > 0 ) + val &= ~63; + else + val = 0; + } + else + { + val = -( ( compensation - distance ) & -64 ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_Up_To_Grid */ + /* */ + /* <Description> */ + /* Rounds value up to grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation + 63; + if ( distance && val > 0 ) + val &= ~63; + else + val = 0; + } + else + { + val = - FT_PIX_CEIL( compensation - distance ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_To_Double_Grid */ + /* */ + /* <Description> */ + /* Rounds value to double grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation + 16; + if ( distance && val > 0 ) + val &= ~31; + else + val = 0; + } + else + { + val = -FT_PAD_ROUND( compensation - distance, 32 ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_Super */ + /* */ + /* <Description> */ + /* Super-rounds value to grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + /* <Note> */ + /* The TrueType specification says very few about the relationship */ + /* between rounding and engine compensation. However, it seems from */ + /* the description of super round that we should add the compensation */ + /* before rounding. */ + /* */ + static FT_F26Dot6 + Round_Super( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = ( distance - CUR.phase + CUR.threshold + compensation ) & + -CUR.period; + if ( distance && val < 0 ) + val = 0; + val += CUR.phase; + } + else + { + val = -( ( CUR.threshold - CUR.phase - distance + compensation ) & + -CUR.period ); + if ( val > 0 ) + val = 0; + val -= CUR.phase; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_Super_45 */ + /* */ + /* <Description> */ + /* Super-rounds value to grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + /* <Note> */ + /* There is a separate function for Round_Super_45() as we may need */ + /* greater precision. */ + /* */ + static FT_F26Dot6 + Round_Super_45( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = ( ( distance - CUR.phase + CUR.threshold + compensation ) / + CUR.period ) * CUR.period; + if ( distance && val < 0 ) + val = 0; + val += CUR.phase; + } + else + { + val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) / + CUR.period ) * CUR.period ); + if ( val > 0 ) + val = 0; + val -= CUR.phase; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Compute_Round */ + /* */ + /* <Description> */ + /* Sets the rounding mode. */ + /* */ + /* <Input> */ + /* round_mode :: The rounding mode to be used. */ + /* */ + static void + Compute_Round( EXEC_OP_ FT_Byte round_mode ) + { + switch ( round_mode ) + { + case TT_Round_Off: + CUR.func_round = (TT_Round_Func)Round_None; + break; + + case TT_Round_To_Grid: + CUR.func_round = (TT_Round_Func)Round_To_Grid; + break; + + case TT_Round_Up_To_Grid: + CUR.func_round = (TT_Round_Func)Round_Up_To_Grid; + break; + + case TT_Round_Down_To_Grid: + CUR.func_round = (TT_Round_Func)Round_Down_To_Grid; + break; + + case TT_Round_To_Half_Grid: + CUR.func_round = (TT_Round_Func)Round_To_Half_Grid; + break; + + case TT_Round_To_Double_Grid: + CUR.func_round = (TT_Round_Func)Round_To_Double_Grid; + break; + + case TT_Round_Super: + CUR.func_round = (TT_Round_Func)Round_Super; + break; + + case TT_Round_Super_45: + CUR.func_round = (TT_Round_Func)Round_Super_45; + break; + } + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* SetSuperRound */ + /* */ + /* <Description> */ + /* Sets Super Round parameters. */ + /* */ + /* <Input> */ + /* GridPeriod :: Grid period */ + /* selector :: SROUND opcode */ + /* */ + static void + SetSuperRound( EXEC_OP_ FT_F26Dot6 GridPeriod, + FT_Long selector ) + { + switch ( (FT_Int)( selector & 0xC0 ) ) + { + case 0: + CUR.period = GridPeriod / 2; + break; + + case 0x40: + CUR.period = GridPeriod; + break; + + case 0x80: + CUR.period = GridPeriod * 2; + break; + + /* This opcode is reserved, but... */ + + case 0xC0: + CUR.period = GridPeriod; + break; + } + + switch ( (FT_Int)( selector & 0x30 ) ) + { + case 0: + CUR.phase = 0; + break; + + case 0x10: + CUR.phase = CUR.period / 4; + break; + + case 0x20: + CUR.phase = CUR.period / 2; + break; + + case 0x30: + CUR.phase = CUR.period * 3 / 4; + break; + } + + if ( ( selector & 0x0F ) == 0 ) + CUR.threshold = CUR.period - 1; + else + CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8; + + CUR.period /= 256; + CUR.phase /= 256; + CUR.threshold /= 256; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Project */ + /* */ + /* <Description> */ + /* Computes the projection of vector given by (v2-v1) along the */ + /* current projection vector. */ + /* */ + /* <Input> */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* <Return> */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Project( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_ASSERT( !CUR.face->unpatented_hinting ); +#endif + + return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy, + CUR.GS.projVector.x, + CUR.GS.projVector.y ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Dual_Project */ + /* */ + /* <Description> */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* current dual vector. */ + /* */ + /* <Input> */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* <Return> */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Dual_Project( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { + return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy, + CUR.GS.dualVector.x, + CUR.GS.dualVector.y ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Project_x */ + /* */ + /* <Description> */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* horizontal axis. */ + /* */ + /* <Input> */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* <Return> */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Project_x( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { + FT_UNUSED_EXEC; + FT_UNUSED( dy ); + + return dx; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Project_y */ + /* */ + /* <Description> */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* vertical axis. */ + /* */ + /* <Input> */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* <Return> */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Project_y( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { + FT_UNUSED_EXEC; + FT_UNUSED( dx ); + + return dy; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Compute_Funcs */ + /* */ + /* <Description> */ + /* Computes the projection and movement function pointers according */ + /* to the current graphics state. */ + /* */ + static void + Compute_Funcs( EXEC_OP ) + { +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + /* If both vectors point rightwards along the x axis, set */ + /* `both-x-axis' true, otherwise set it false. The x values only */ + /* need be tested because the vector has been normalised to a unit */ + /* vector of length 0x4000 = unity. */ + CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 && + CUR.GS.freeVector.x == 0x4000 ); + + /* Throw away projection and freedom vector information */ + /* because the patents don't allow them to be stored. */ + /* The relevant US Patents are 5155805 and 5325479. */ + CUR.GS.projVector.x = 0; + CUR.GS.projVector.y = 0; + CUR.GS.freeVector.x = 0; + CUR.GS.freeVector.y = 0; + + if ( CUR.GS.both_x_axis ) + { + CUR.func_project = Project_x; + CUR.func_move = Direct_Move_X; + CUR.func_move_orig = Direct_Move_Orig_X; + } + else + { + CUR.func_project = Project_y; + CUR.func_move = Direct_Move_Y; + CUR.func_move_orig = Direct_Move_Orig_Y; + } + + if ( CUR.GS.dualVector.x == 0x4000 ) + CUR.func_dualproj = Project_x; + else + { + if ( CUR.GS.dualVector.y == 0x4000 ) + CUR.func_dualproj = Project_y; + else + CUR.func_dualproj = Dual_Project; + } + + /* Force recalculation of cached aspect ratio */ + CUR.tt_metrics.ratio = 0; + + return; + } +#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */ + + if ( CUR.GS.freeVector.x == 0x4000 ) + CUR.F_dot_P = CUR.GS.projVector.x * 0x10000L; + else + { + if ( CUR.GS.freeVector.y == 0x4000 ) + CUR.F_dot_P = CUR.GS.projVector.y * 0x10000L; + else + CUR.F_dot_P = (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x * 4 + + (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y * 4; + } + + if ( CUR.GS.projVector.x == 0x4000 ) + CUR.func_project = (TT_Project_Func)Project_x; + else + { + if ( CUR.GS.projVector.y == 0x4000 ) + CUR.func_project = (TT_Project_Func)Project_y; + else + CUR.func_project = (TT_Project_Func)Project; + } + + if ( CUR.GS.dualVector.x == 0x4000 ) + CUR.func_dualproj = (TT_Project_Func)Project_x; + else + { + if ( CUR.GS.dualVector.y == 0x4000 ) + CUR.func_dualproj = (TT_Project_Func)Project_y; + else + CUR.func_dualproj = (TT_Project_Func)Dual_Project; + } + + CUR.func_move = (TT_Move_Func)Direct_Move; + CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig; + + if ( CUR.F_dot_P == 0x40000000L ) + { + if ( CUR.GS.freeVector.x == 0x4000 ) + { + CUR.func_move = (TT_Move_Func)Direct_Move_X; + CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X; + } + else + { + if ( CUR.GS.freeVector.y == 0x4000 ) + { + CUR.func_move = (TT_Move_Func)Direct_Move_Y; + CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y; + } + } + } + + /* at small sizes, F_dot_P can become too small, resulting */ + /* in overflows and `spikes' in a number of glyphs like `w'. */ + + if ( FT_ABS( CUR.F_dot_P ) < 0x4000000L ) + CUR.F_dot_P = 0x40000000L; + + /* Disable cached aspect ratio */ + CUR.tt_metrics.ratio = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Normalize */ + /* */ + /* <Description> */ + /* Norms a vector. */ + /* */ + /* <Input> */ + /* Vx :: The horizontal input vector coordinate. */ + /* Vy :: The vertical input vector coordinate. */ + /* */ + /* <Output> */ + /* R :: The normed unit vector. */ + /* */ + /* <Return> */ + /* Returns FAILURE if a vector parameter is zero. */ + /* */ + /* <Note> */ + /* In case Vx and Vy are both zero, Normalize() returns SUCCESS, and */ + /* R is undefined. */ + /* */ + + + static FT_Bool + Normalize( EXEC_OP_ FT_F26Dot6 Vx, + FT_F26Dot6 Vy, + FT_UnitVector* R ) + { + FT_F26Dot6 W; + FT_Bool S1, S2; + + FT_UNUSED_EXEC; + + + if ( FT_ABS( Vx ) < 0x10000L && FT_ABS( Vy ) < 0x10000L ) + { + Vx *= 0x100; + Vy *= 0x100; + + W = TT_VecLen( Vx, Vy ); + + if ( W == 0 ) + { + /* XXX: UNDOCUMENTED! It seems that it is possible to try */ + /* to normalize the vector (0,0). Return immediately. */ + return SUCCESS; + } + + R->x = (FT_F2Dot14)FT_MulDiv( Vx, 0x4000L, W ); + R->y = (FT_F2Dot14)FT_MulDiv( Vy, 0x4000L, W ); + + return SUCCESS; + } + + W = TT_VecLen( Vx, Vy ); + + Vx = FT_MulDiv( Vx, 0x4000L, W ); + Vy = FT_MulDiv( Vy, 0x4000L, W ); + + W = Vx * Vx + Vy * Vy; + + /* Now, we want that Sqrt( W ) = 0x4000 */ + /* Or 0x10000000 <= W < 0x10004000 */ + + if ( Vx < 0 ) + { + Vx = -Vx; + S1 = TRUE; + } + else + S1 = FALSE; + + if ( Vy < 0 ) + { + Vy = -Vy; + S2 = TRUE; + } + else + S2 = FALSE; + + while ( W < 0x10000000L ) + { + /* We need to increase W by a minimal amount */ + if ( Vx < Vy ) + Vx++; + else + Vy++; + + W = Vx * Vx + Vy * Vy; + } + + while ( W >= 0x10004000L ) + { + /* We need to decrease W by a minimal amount */ + if ( Vx < Vy ) + Vx--; + else + Vy--; + + W = Vx * Vx + Vy * Vy; + } + + /* Note that in various cases, we can only */ + /* compute a Sqrt(W) of 0x3FFF, eg. Vx = Vy */ + + if ( S1 ) + Vx = -Vx; + + if ( S2 ) + Vy = -Vy; + + R->x = (FT_F2Dot14)Vx; /* Type conversion */ + R->y = (FT_F2Dot14)Vy; /* Type conversion */ + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* Here we start with the implementation of the various opcodes. */ + /* */ + /*************************************************************************/ + + + static FT_Bool + Ins_SxVTL( EXEC_OP_ FT_UShort aIdx1, + FT_UShort aIdx2, + FT_Int aOpc, + FT_UnitVector* Vec ) + { + FT_Long A, B, C; + FT_Vector* p1; + FT_Vector* p2; + + + if ( BOUNDS( aIdx1, CUR.zp2.n_points ) || + BOUNDS( aIdx2, CUR.zp1.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return FAILURE; + } + + p1 = CUR.zp1.cur + aIdx2; + p2 = CUR.zp2.cur + aIdx1; + + A = p1->x - p2->x; + B = p1->y - p2->y; + + if ( ( aOpc & 1 ) != 0 ) + { + C = B; /* counter clockwise rotation */ + B = A; + A = -C; + } + + NORMalize( A, B, Vec ); + + return SUCCESS; + } + + + /* When not using the big switch statements, the interpreter uses a */ + /* call table defined later below in this source. Each opcode must */ + /* thus have a corresponding function, even trivial ones. */ + /* */ + /* They are all defined there. */ + +#define DO_SVTCA \ + { \ + FT_Short A, B; \ + \ + \ + A = (FT_Short)( CUR.opcode & 1 ) << 14; \ + B = A ^ (FT_Short)0x4000; \ + \ + CUR.GS.freeVector.x = A; \ + CUR.GS.projVector.x = A; \ + CUR.GS.dualVector.x = A; \ + \ + CUR.GS.freeVector.y = B; \ + CUR.GS.projVector.y = B; \ + CUR.GS.dualVector.y = B; \ + \ + COMPUTE_Funcs(); \ + } + + +#define DO_SPVTCA \ + { \ + FT_Short A, B; \ + \ + \ + A = (FT_Short)( CUR.opcode & 1 ) << 14; \ + B = A ^ (FT_Short)0x4000; \ + \ + CUR.GS.projVector.x = A; \ + CUR.GS.dualVector.x = A; \ + \ + CUR.GS.projVector.y = B; \ + CUR.GS.dualVector.y = B; \ + \ + GUESS_VECTOR( freeVector ); \ + \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVTCA \ + { \ + FT_Short A, B; \ + \ + \ + A = (FT_Short)( CUR.opcode & 1 ) << 14; \ + B = A ^ (FT_Short)0x4000; \ + \ + CUR.GS.freeVector.x = A; \ + CUR.GS.freeVector.y = B; \ + \ + GUESS_VECTOR( projVector ); \ + \ + COMPUTE_Funcs(); \ + } + + +#define DO_SPVTL \ + if ( INS_SxVTL( (FT_UShort)args[1], \ + (FT_UShort)args[0], \ + CUR.opcode, \ + &CUR.GS.projVector ) == SUCCESS ) \ + { \ + CUR.GS.dualVector = CUR.GS.projVector; \ + GUESS_VECTOR( freeVector ); \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVTL \ + if ( INS_SxVTL( (FT_UShort)args[1], \ + (FT_UShort)args[0], \ + CUR.opcode, \ + &CUR.GS.freeVector ) == SUCCESS ) \ + { \ + GUESS_VECTOR( projVector ); \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVTPV \ + GUESS_VECTOR( projVector ); \ + CUR.GS.freeVector = CUR.GS.projVector; \ + COMPUTE_Funcs(); + + +#define DO_SPVFS \ + { \ + FT_Short S; \ + FT_Long X, Y; \ + \ + \ + /* Only use low 16bits, then sign extend */ \ + S = (FT_Short)args[1]; \ + Y = (FT_Long)S; \ + S = (FT_Short)args[0]; \ + X = (FT_Long)S; \ + \ + NORMalize( X, Y, &CUR.GS.projVector ); \ + \ + CUR.GS.dualVector = CUR.GS.projVector; \ + GUESS_VECTOR( freeVector ); \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVFS \ + { \ + FT_Short S; \ + FT_Long X, Y; \ + \ + \ + /* Only use low 16bits, then sign extend */ \ + S = (FT_Short)args[1]; \ + Y = (FT_Long)S; \ + S = (FT_Short)args[0]; \ + X = S; \ + \ + NORMalize( X, Y, &CUR.GS.freeVector ); \ + GUESS_VECTOR( projVector ); \ + COMPUTE_Funcs(); \ + } + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING +#define DO_GPV \ + if ( CUR.face->unpatented_hinting ) \ + { \ + args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \ + args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \ + } \ + else \ + { \ + args[0] = CUR.GS.projVector.x; \ + args[1] = CUR.GS.projVector.y; \ + } +#else +#define DO_GPV \ + args[0] = CUR.GS.projVector.x; \ + args[1] = CUR.GS.projVector.y; +#endif + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING +#define DO_GFV \ + if ( CUR.face->unpatented_hinting ) \ + { \ + args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \ + args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \ + } \ + else \ + { \ + args[0] = CUR.GS.freeVector.x; \ + args[1] = CUR.GS.freeVector.y; \ + } +#else +#define DO_GFV \ + args[0] = CUR.GS.freeVector.x; \ + args[1] = CUR.GS.freeVector.y; +#endif + + +#define DO_SRP0 \ + CUR.GS.rp0 = (FT_UShort)args[0]; + + +#define DO_SRP1 \ + CUR.GS.rp1 = (FT_UShort)args[0]; + + +#define DO_SRP2 \ + CUR.GS.rp2 = (FT_UShort)args[0]; + + +#define DO_RTHG \ + CUR.GS.round_state = TT_Round_To_Half_Grid; \ + CUR.func_round = (TT_Round_Func)Round_To_Half_Grid; + + +#define DO_RTG \ + CUR.GS.round_state = TT_Round_To_Grid; \ + CUR.func_round = (TT_Round_Func)Round_To_Grid; + + +#define DO_RTDG \ + CUR.GS.round_state = TT_Round_To_Double_Grid; \ + CUR.func_round = (TT_Round_Func)Round_To_Double_Grid; + + +#define DO_RUTG \ + CUR.GS.round_state = TT_Round_Up_To_Grid; \ + CUR.func_round = (TT_Round_Func)Round_Up_To_Grid; + + +#define DO_RDTG \ + CUR.GS.round_state = TT_Round_Down_To_Grid; \ + CUR.func_round = (TT_Round_Func)Round_Down_To_Grid; + + +#define DO_ROFF \ + CUR.GS.round_state = TT_Round_Off; \ + CUR.func_round = (TT_Round_Func)Round_None; + + +#define DO_SROUND \ + SET_SuperRound( 0x4000, args[0] ); \ + CUR.GS.round_state = TT_Round_Super; \ + CUR.func_round = (TT_Round_Func)Round_Super; + + +#define DO_S45ROUND \ + SET_SuperRound( 0x2D41, args[0] ); \ + CUR.GS.round_state = TT_Round_Super_45; \ + CUR.func_round = (TT_Round_Func)Round_Super_45; + + +#define DO_SLOOP \ + if ( args[0] < 0 ) \ + CUR.error = TT_Err_Bad_Argument; \ + else \ + CUR.GS.loop = args[0]; + + +#define DO_SMD \ + CUR.GS.minimum_distance = args[0]; + + +#define DO_SCVTCI \ + CUR.GS.control_value_cutin = (FT_F26Dot6)args[0]; + + +#define DO_SSWCI \ + CUR.GS.single_width_cutin = (FT_F26Dot6)args[0]; + + + /* XXX: UNDOCUMENTED! or bug in the Windows engine? */ + /* */ + /* It seems that the value that is read here is */ + /* expressed in 16.16 format rather than in font */ + /* units. */ + /* */ +#define DO_SSW \ + CUR.GS.single_width_value = (FT_F26Dot6)( args[0] >> 10 ); + + +#define DO_FLIPON \ + CUR.GS.auto_flip = TRUE; + + +#define DO_FLIPOFF \ + CUR.GS.auto_flip = FALSE; + + +#define DO_SDB \ + CUR.GS.delta_base = (FT_Short)args[0]; + + +#define DO_SDS \ + CUR.GS.delta_shift = (FT_Short)args[0]; + + +#define DO_MD /* nothing */ + + +#define DO_MPPEM \ + args[0] = CURRENT_Ppem(); + + + /* Note: The pointSize should be irrelevant in a given font program; */ + /* we thus decide to return only the ppem. */ +#if 0 + +#define DO_MPS \ + args[0] = CUR.metrics.pointSize; + +#else + +#define DO_MPS \ + args[0] = CURRENT_Ppem(); + +#endif /* 0 */ + + +#define DO_DUP \ + args[1] = args[0]; + + +#define DO_CLEAR \ + CUR.new_top = 0; + + +#define DO_SWAP \ + { \ + FT_Long L; \ + \ + \ + L = args[0]; \ + args[0] = args[1]; \ + args[1] = L; \ + } + + +#define DO_DEPTH \ + args[0] = CUR.top; + + +#define DO_CINDEX \ + { \ + FT_Long L; \ + \ + \ + L = args[0]; \ + \ + if ( L <= 0 || L > CUR.args ) \ + CUR.error = TT_Err_Invalid_Reference; \ + else \ + args[0] = CUR.stack[CUR.args - L]; \ + } + + +#define DO_JROT \ + if ( args[1] != 0 ) \ + { \ + CUR.IP += args[0]; \ + if ( CUR.IP < 0 ) \ + CUR.error = TT_Err_Bad_Argument; \ + CUR.step_ins = FALSE; \ + } + + +#define DO_JMPR \ + CUR.IP += args[0]; \ + if ( CUR.IP < 0 ) \ + CUR.error = TT_Err_Bad_Argument; \ + CUR.step_ins = FALSE; + + +#define DO_JROF \ + if ( args[1] == 0 ) \ + { \ + CUR.IP += args[0]; \ + if ( CUR.IP < 0 ) \ + CUR.error = TT_Err_Bad_Argument; \ + CUR.step_ins = FALSE; \ + } + + +#define DO_LT \ + args[0] = ( args[0] < args[1] ); + + +#define DO_LTEQ \ + args[0] = ( args[0] <= args[1] ); + + +#define DO_GT \ + args[0] = ( args[0] > args[1] ); + + +#define DO_GTEQ \ + args[0] = ( args[0] >= args[1] ); + + +#define DO_EQ \ + args[0] = ( args[0] == args[1] ); + + +#define DO_NEQ \ + args[0] = ( args[0] != args[1] ); + + +#define DO_ODD \ + args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 ); + + +#define DO_EVEN \ + args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 ); + + +#define DO_AND \ + args[0] = ( args[0] && args[1] ); + + +#define DO_OR \ + args[0] = ( args[0] || args[1] ); + + +#define DO_NOT \ + args[0] = !args[0]; + + +#define DO_ADD \ + args[0] += args[1]; + + +#define DO_SUB \ + args[0] -= args[1]; + + +#define DO_DIV \ + if ( args[1] == 0 ) \ + CUR.error = TT_Err_Divide_By_Zero; \ + else \ + args[0] = TT_MULDIV_NO_ROUND( args[0], 64L, args[1] ); + + +#define DO_MUL \ + args[0] = TT_MULDIV( args[0], args[1], 64L ); + + +#define DO_ABS \ + args[0] = FT_ABS( args[0] ); + + +#define DO_NEG \ + args[0] = -args[0]; + + +#define DO_FLOOR \ + args[0] = FT_PIX_FLOOR( args[0] ); + + +#define DO_CEILING \ + args[0] = FT_PIX_CEIL( args[0] ); + + +#define DO_RS \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDSL( I, CUR.storeSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + else \ + args[0] = 0; \ + } \ + else \ + args[0] = CUR.storage[I]; \ + } + + +#define DO_WS \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDSL( I, CUR.storeSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + } \ + else \ + CUR.storage[I] = args[1]; \ + } + + +#define DO_RCVT \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDSL( I, CUR.cvtSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + else \ + args[0] = 0; \ + } \ + else \ + args[0] = CUR_Func_read_cvt( I ); \ + } + + +#define DO_WCVTP \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDSL( I, CUR.cvtSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + } \ + else \ + CUR_Func_write_cvt( I, args[1] ); \ + } + + +#define DO_WCVTF \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDSL( I, CUR.cvtSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + } \ + else \ + CUR.cvt[I] = TT_MULFIX( args[1], CUR.tt_metrics.scale ); \ + } + + +#define DO_DEBUG \ + CUR.error = TT_Err_Debug_OpCode; + + +#define DO_ROUND \ + args[0] = CUR_Func_round( \ + args[0], \ + CUR.tt_metrics.compensations[CUR.opcode - 0x68] ); + + +#define DO_NROUND \ + args[0] = ROUND_None( args[0], \ + CUR.tt_metrics.compensations[CUR.opcode - 0x6C] ); + + +#define DO_MAX \ + if ( args[1] > args[0] ) \ + args[0] = args[1]; + + +#define DO_MIN \ + if ( args[1] < args[0] ) \ + args[0] = args[1]; + + +#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH + + +#undef ARRAY_BOUND_ERROR +#define ARRAY_BOUND_ERROR \ + { \ + CUR.error = TT_Err_Invalid_Reference; \ + return; \ + } + + + /*************************************************************************/ + /* */ + /* SVTCA[a]: Set (F and P) Vectors to Coordinate Axis */ + /* Opcode range: 0x00-0x01 */ + /* Stack: --> */ + /* */ + static void + Ins_SVTCA( INS_ARG ) + { + DO_SVTCA + } + + + /*************************************************************************/ + /* */ + /* SPVTCA[a]: Set PVector to Coordinate Axis */ + /* Opcode range: 0x02-0x03 */ + /* Stack: --> */ + /* */ + static void + Ins_SPVTCA( INS_ARG ) + { + DO_SPVTCA + } + + + /*************************************************************************/ + /* */ + /* SFVTCA[a]: Set FVector to Coordinate Axis */ + /* Opcode range: 0x04-0x05 */ + /* Stack: --> */ + /* */ + static void + Ins_SFVTCA( INS_ARG ) + { + DO_SFVTCA + } + + + /*************************************************************************/ + /* */ + /* SPVTL[a]: Set PVector To Line */ + /* Opcode range: 0x06-0x07 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_SPVTL( INS_ARG ) + { + DO_SPVTL + } + + + /*************************************************************************/ + /* */ + /* SFVTL[a]: Set FVector To Line */ + /* Opcode range: 0x08-0x09 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_SFVTL( INS_ARG ) + { + DO_SFVTL + } + + + /*************************************************************************/ + /* */ + /* SFVTPV[]: Set FVector To PVector */ + /* Opcode range: 0x0E */ + /* Stack: --> */ + /* */ + static void + Ins_SFVTPV( INS_ARG ) + { + DO_SFVTPV + } + + + /*************************************************************************/ + /* */ + /* SPVFS[]: Set PVector From Stack */ + /* Opcode range: 0x0A */ + /* Stack: f2.14 f2.14 --> */ + /* */ + static void + Ins_SPVFS( INS_ARG ) + { + DO_SPVFS + } + + + /*************************************************************************/ + /* */ + /* SFVFS[]: Set FVector From Stack */ + /* Opcode range: 0x0B */ + /* Stack: f2.14 f2.14 --> */ + /* */ + static void + Ins_SFVFS( INS_ARG ) + { + DO_SFVFS + } + + + /*************************************************************************/ + /* */ + /* GPV[]: Get Projection Vector */ + /* Opcode range: 0x0C */ + /* Stack: ef2.14 --> ef2.14 */ + /* */ + static void + Ins_GPV( INS_ARG ) + { + DO_GPV + } + + + /*************************************************************************/ + /* GFV[]: Get Freedom Vector */ + /* Opcode range: 0x0D */ + /* Stack: ef2.14 --> ef2.14 */ + /* */ + static void + Ins_GFV( INS_ARG ) + { + DO_GFV + } + + + /*************************************************************************/ + /* */ + /* SRP0[]: Set Reference Point 0 */ + /* Opcode range: 0x10 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SRP0( INS_ARG ) + { + DO_SRP0 + } + + + /*************************************************************************/ + /* */ + /* SRP1[]: Set Reference Point 1 */ + /* Opcode range: 0x11 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SRP1( INS_ARG ) + { + DO_SRP1 + } + + + /*************************************************************************/ + /* */ + /* SRP2[]: Set Reference Point 2 */ + /* Opcode range: 0x12 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SRP2( INS_ARG ) + { + DO_SRP2 + } + + + /*************************************************************************/ + /* */ + /* RTHG[]: Round To Half Grid */ + /* Opcode range: 0x19 */ + /* Stack: --> */ + /* */ + static void + Ins_RTHG( INS_ARG ) + { + DO_RTHG + } + + + /*************************************************************************/ + /* */ + /* RTG[]: Round To Grid */ + /* Opcode range: 0x18 */ + /* Stack: --> */ + /* */ + static void + Ins_RTG( INS_ARG ) + { + DO_RTG + } + + + /*************************************************************************/ + /* RTDG[]: Round To Double Grid */ + /* Opcode range: 0x3D */ + /* Stack: --> */ + /* */ + static void + Ins_RTDG( INS_ARG ) + { + DO_RTDG + } + + + /*************************************************************************/ + /* RUTG[]: Round Up To Grid */ + /* Opcode range: 0x7C */ + /* Stack: --> */ + /* */ + static void + Ins_RUTG( INS_ARG ) + { + DO_RUTG + } + + + /*************************************************************************/ + /* */ + /* RDTG[]: Round Down To Grid */ + /* Opcode range: 0x7D */ + /* Stack: --> */ + /* */ + static void + Ins_RDTG( INS_ARG ) + { + DO_RDTG + } + + + /*************************************************************************/ + /* */ + /* ROFF[]: Round OFF */ + /* Opcode range: 0x7A */ + /* Stack: --> */ + /* */ + static void + Ins_ROFF( INS_ARG ) + { + DO_ROFF + } + + + /*************************************************************************/ + /* */ + /* SROUND[]: Super ROUND */ + /* Opcode range: 0x76 */ + /* Stack: Eint8 --> */ + /* */ + static void + Ins_SROUND( INS_ARG ) + { + DO_SROUND + } + + + /*************************************************************************/ + /* */ + /* S45ROUND[]: Super ROUND 45 degrees */ + /* Opcode range: 0x77 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_S45ROUND( INS_ARG ) + { + DO_S45ROUND + } + + + /*************************************************************************/ + /* */ + /* SLOOP[]: Set LOOP variable */ + /* Opcode range: 0x17 */ + /* Stack: int32? --> */ + /* */ + static void + Ins_SLOOP( INS_ARG ) + { + DO_SLOOP + } + + + /*************************************************************************/ + /* */ + /* SMD[]: Set Minimum Distance */ + /* Opcode range: 0x1A */ + /* Stack: f26.6 --> */ + /* */ + static void + Ins_SMD( INS_ARG ) + { + DO_SMD + } + + + /*************************************************************************/ + /* */ + /* SCVTCI[]: Set Control Value Table Cut In */ + /* Opcode range: 0x1D */ + /* Stack: f26.6 --> */ + /* */ + static void + Ins_SCVTCI( INS_ARG ) + { + DO_SCVTCI + } + + + /*************************************************************************/ + /* */ + /* SSWCI[]: Set Single Width Cut In */ + /* Opcode range: 0x1E */ + /* Stack: f26.6 --> */ + /* */ + static void + Ins_SSWCI( INS_ARG ) + { + DO_SSWCI + } + + + /*************************************************************************/ + /* */ + /* SSW[]: Set Single Width */ + /* Opcode range: 0x1F */ + /* Stack: int32? --> */ + /* */ + static void + Ins_SSW( INS_ARG ) + { + DO_SSW + } + + + /*************************************************************************/ + /* */ + /* FLIPON[]: Set auto-FLIP to ON */ + /* Opcode range: 0x4D */ + /* Stack: --> */ + /* */ + static void + Ins_FLIPON( INS_ARG ) + { + DO_FLIPON + } + + + /*************************************************************************/ + /* */ + /* FLIPOFF[]: Set auto-FLIP to OFF */ + /* Opcode range: 0x4E */ + /* Stack: --> */ + /* */ + static void + Ins_FLIPOFF( INS_ARG ) + { + DO_FLIPOFF + } + + + /*************************************************************************/ + /* */ + /* SANGW[]: Set ANGle Weight */ + /* Opcode range: 0x7E */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SANGW( INS_ARG ) + { + /* instruction not supported anymore */ + } + + + /*************************************************************************/ + /* */ + /* SDB[]: Set Delta Base */ + /* Opcode range: 0x5E */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SDB( INS_ARG ) + { + DO_SDB + } + + + /*************************************************************************/ + /* */ + /* SDS[]: Set Delta Shift */ + /* Opcode range: 0x5F */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SDS( INS_ARG ) + { + DO_SDS + } + + + /*************************************************************************/ + /* */ + /* MPPEM[]: Measure Pixel Per EM */ + /* Opcode range: 0x4B */ + /* Stack: --> Euint16 */ + /* */ + static void + Ins_MPPEM( INS_ARG ) + { + DO_MPPEM + } + + + /*************************************************************************/ + /* */ + /* MPS[]: Measure Point Size */ + /* Opcode range: 0x4C */ + /* Stack: --> Euint16 */ + /* */ + static void + Ins_MPS( INS_ARG ) + { + DO_MPS + } + + + /*************************************************************************/ + /* */ + /* DUP[]: DUPlicate the top stack's element */ + /* Opcode range: 0x20 */ + /* Stack: StkElt --> StkElt StkElt */ + /* */ + static void + Ins_DUP( INS_ARG ) + { + DO_DUP + } + + + /*************************************************************************/ + /* */ + /* POP[]: POP the stack's top element */ + /* Opcode range: 0x21 */ + /* Stack: StkElt --> */ + /* */ + static void + Ins_POP( INS_ARG ) + { + /* nothing to do */ + } + + + /*************************************************************************/ + /* */ + /* CLEAR[]: CLEAR the entire stack */ + /* Opcode range: 0x22 */ + /* Stack: StkElt... --> */ + /* */ + static void + Ins_CLEAR( INS_ARG ) + { + DO_CLEAR + } + + + /*************************************************************************/ + /* */ + /* SWAP[]: SWAP the stack's top two elements */ + /* Opcode range: 0x23 */ + /* Stack: 2 * StkElt --> 2 * StkElt */ + /* */ + static void + Ins_SWAP( INS_ARG ) + { + DO_SWAP + } + + + /*************************************************************************/ + /* */ + /* DEPTH[]: return the stack DEPTH */ + /* Opcode range: 0x24 */ + /* Stack: --> uint32 */ + /* */ + static void + Ins_DEPTH( INS_ARG ) + { + DO_DEPTH + } + + + /*************************************************************************/ + /* */ + /* CINDEX[]: Copy INDEXed element */ + /* Opcode range: 0x25 */ + /* Stack: int32 --> StkElt */ + /* */ + static void + Ins_CINDEX( INS_ARG ) + { + DO_CINDEX + } + + + /*************************************************************************/ + /* */ + /* EIF[]: End IF */ + /* Opcode range: 0x59 */ + /* Stack: --> */ + /* */ + static void + Ins_EIF( INS_ARG ) + { + /* nothing to do */ + } + + + /*************************************************************************/ + /* */ + /* JROT[]: Jump Relative On True */ + /* Opcode range: 0x78 */ + /* Stack: StkElt int32 --> */ + /* */ + static void + Ins_JROT( INS_ARG ) + { + DO_JROT + } + + + /*************************************************************************/ + /* */ + /* JMPR[]: JuMP Relative */ + /* Opcode range: 0x1C */ + /* Stack: int32 --> */ + /* */ + static void + Ins_JMPR( INS_ARG ) + { + DO_JMPR + } + + + /*************************************************************************/ + /* */ + /* JROF[]: Jump Relative On False */ + /* Opcode range: 0x79 */ + /* Stack: StkElt int32 --> */ + /* */ + static void + Ins_JROF( INS_ARG ) + { + DO_JROF + } + + + /*************************************************************************/ + /* */ + /* LT[]: Less Than */ + /* Opcode range: 0x50 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_LT( INS_ARG ) + { + DO_LT + } + + + /*************************************************************************/ + /* */ + /* LTEQ[]: Less Than or EQual */ + /* Opcode range: 0x51 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_LTEQ( INS_ARG ) + { + DO_LTEQ + } + + + /*************************************************************************/ + /* */ + /* GT[]: Greater Than */ + /* Opcode range: 0x52 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_GT( INS_ARG ) + { + DO_GT + } + + + /*************************************************************************/ + /* */ + /* GTEQ[]: Greater Than or EQual */ + /* Opcode range: 0x53 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_GTEQ( INS_ARG ) + { + DO_GTEQ + } + + + /*************************************************************************/ + /* */ + /* EQ[]: EQual */ + /* Opcode range: 0x54 */ + /* Stack: StkElt StkElt --> bool */ + /* */ + static void + Ins_EQ( INS_ARG ) + { + DO_EQ + } + + + /*************************************************************************/ + /* */ + /* NEQ[]: Not EQual */ + /* Opcode range: 0x55 */ + /* Stack: StkElt StkElt --> bool */ + /* */ + static void + Ins_NEQ( INS_ARG ) + { + DO_NEQ + } + + + /*************************************************************************/ + /* */ + /* ODD[]: Is ODD */ + /* Opcode range: 0x56 */ + /* Stack: f26.6 --> bool */ + /* */ + static void + Ins_ODD( INS_ARG ) + { + DO_ODD + } + + + /*************************************************************************/ + /* */ + /* EVEN[]: Is EVEN */ + /* Opcode range: 0x57 */ + /* Stack: f26.6 --> bool */ + /* */ + static void + Ins_EVEN( INS_ARG ) + { + DO_EVEN + } + + + /*************************************************************************/ + /* */ + /* AND[]: logical AND */ + /* Opcode range: 0x5A */ + /* Stack: uint32 uint32 --> uint32 */ + /* */ + static void + Ins_AND( INS_ARG ) + { + DO_AND + } + + + /*************************************************************************/ + /* */ + /* OR[]: logical OR */ + /* Opcode range: 0x5B */ + /* Stack: uint32 uint32 --> uint32 */ + /* */ + static void + Ins_OR( INS_ARG ) + { + DO_OR + } + + + /*************************************************************************/ + /* */ + /* NOT[]: logical NOT */ + /* Opcode range: 0x5C */ + /* Stack: StkElt --> uint32 */ + /* */ + static void + Ins_NOT( INS_ARG ) + { + DO_NOT + } + + + /*************************************************************************/ + /* */ + /* ADD[]: ADD */ + /* Opcode range: 0x60 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_ADD( INS_ARG ) + { + DO_ADD + } + + + /*************************************************************************/ + /* */ + /* SUB[]: SUBtract */ + /* Opcode range: 0x61 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_SUB( INS_ARG ) + { + DO_SUB + } + + + /*************************************************************************/ + /* */ + /* DIV[]: DIVide */ + /* Opcode range: 0x62 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_DIV( INS_ARG ) + { + DO_DIV + } + + + /*************************************************************************/ + /* */ + /* MUL[]: MULtiply */ + /* Opcode range: 0x63 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_MUL( INS_ARG ) + { + DO_MUL + } + + + /*************************************************************************/ + /* */ + /* ABS[]: ABSolute value */ + /* Opcode range: 0x64 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_ABS( INS_ARG ) + { + DO_ABS + } + + + /*************************************************************************/ + /* */ + /* NEG[]: NEGate */ + /* Opcode range: 0x65 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_NEG( INS_ARG ) + { + DO_NEG + } + + + /*************************************************************************/ + /* */ + /* FLOOR[]: FLOOR */ + /* Opcode range: 0x66 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_FLOOR( INS_ARG ) + { + DO_FLOOR + } + + + /*************************************************************************/ + /* */ + /* CEILING[]: CEILING */ + /* Opcode range: 0x67 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_CEILING( INS_ARG ) + { + DO_CEILING + } + + + /*************************************************************************/ + /* */ + /* RS[]: Read Store */ + /* Opcode range: 0x43 */ + /* Stack: uint32 --> uint32 */ + /* */ + static void + Ins_RS( INS_ARG ) + { + DO_RS + } + + + /*************************************************************************/ + /* */ + /* WS[]: Write Store */ + /* Opcode range: 0x42 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_WS( INS_ARG ) + { + DO_WS + } + + + /*************************************************************************/ + /* */ + /* WCVTP[]: Write CVT in Pixel units */ + /* Opcode range: 0x44 */ + /* Stack: f26.6 uint32 --> */ + /* */ + static void + Ins_WCVTP( INS_ARG ) + { + DO_WCVTP + } + + + /*************************************************************************/ + /* */ + /* WCVTF[]: Write CVT in Funits */ + /* Opcode range: 0x70 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_WCVTF( INS_ARG ) + { + DO_WCVTF + } + + + /*************************************************************************/ + /* */ + /* RCVT[]: Read CVT */ + /* Opcode range: 0x45 */ + /* Stack: uint32 --> f26.6 */ + /* */ + static void + Ins_RCVT( INS_ARG ) + { + DO_RCVT + } + + + /*************************************************************************/ + /* */ + /* AA[]: Adjust Angle */ + /* Opcode range: 0x7F */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_AA( INS_ARG ) + { + /* intentionally no longer supported */ + } + + + /*************************************************************************/ + /* */ + /* DEBUG[]: DEBUG. Unsupported. */ + /* Opcode range: 0x4F */ + /* Stack: uint32 --> */ + /* */ + /* Note: The original instruction pops a value from the stack. */ + /* */ + static void + Ins_DEBUG( INS_ARG ) + { + DO_DEBUG + } + + + /*************************************************************************/ + /* */ + /* ROUND[ab]: ROUND value */ + /* Opcode range: 0x68-0x6B */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_ROUND( INS_ARG ) + { + DO_ROUND + } + + + /*************************************************************************/ + /* */ + /* NROUND[ab]: No ROUNDing of value */ + /* Opcode range: 0x6C-0x6F */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_NROUND( INS_ARG ) + { + DO_NROUND + } + + + /*************************************************************************/ + /* */ + /* MAX[]: MAXimum */ + /* Opcode range: 0x68 */ + /* Stack: int32? int32? --> int32 */ + /* */ + static void + Ins_MAX( INS_ARG ) + { + DO_MAX + } + + + /*************************************************************************/ + /* */ + /* MIN[]: MINimum */ + /* Opcode range: 0x69 */ + /* Stack: int32? int32? --> int32 */ + /* */ + static void + Ins_MIN( INS_ARG ) + { + DO_MIN + } + + +#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */ + + + /*************************************************************************/ + /* */ + /* The following functions are called as is within the switch statement. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* MINDEX[]: Move INDEXed element */ + /* Opcode range: 0x26 */ + /* Stack: int32? --> StkElt */ + /* */ + static void + Ins_MINDEX( INS_ARG ) + { + FT_Long L, K; + + + L = args[0]; + + if ( L <= 0 || L > CUR.args ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + + K = CUR.stack[CUR.args - L]; + + FT_ARRAY_MOVE( &CUR.stack[CUR.args - L ], + &CUR.stack[CUR.args - L + 1], + ( L - 1 ) ); + + CUR.stack[CUR.args - 1] = K; + } + + + /*************************************************************************/ + /* */ + /* ROLL[]: ROLL top three elements */ + /* Opcode range: 0x8A */ + /* Stack: 3 * StkElt --> 3 * StkElt */ + /* */ + static void + Ins_ROLL( INS_ARG ) + { + FT_Long A, B, C; + + FT_UNUSED_EXEC; + + + A = args[2]; + B = args[1]; + C = args[0]; + + args[2] = C; + args[1] = A; + args[0] = B; + } + + + /*************************************************************************/ + /* */ + /* MANAGING THE FLOW OF CONTROL */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + static FT_Bool + SkipCode( EXEC_OP ) + { + CUR.IP += CUR.length; + + if ( CUR.IP < CUR.codeSize ) + { + CUR.opcode = CUR.code[CUR.IP]; + + CUR.length = opcode_length[CUR.opcode]; + if ( CUR.length < 0 ) + { + if ( CUR.IP + 1 > CUR.codeSize ) + goto Fail_Overflow; + CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1]; + } + + if ( CUR.IP + CUR.length <= CUR.codeSize ) + return SUCCESS; + } + + Fail_Overflow: + CUR.error = TT_Err_Code_Overflow; + return FAILURE; + } + + + /*************************************************************************/ + /* */ + /* IF[]: IF test */ + /* Opcode range: 0x58 */ + /* Stack: StkElt --> */ + /* */ + static void + Ins_IF( INS_ARG ) + { + FT_Int nIfs; + FT_Bool Out; + + + if ( args[0] != 0 ) + return; + + nIfs = 1; + Out = 0; + + do + { + if ( SKIP_Code() == FAILURE ) + return; + + switch ( CUR.opcode ) + { + case 0x58: /* IF */ + nIfs++; + break; + + case 0x1B: /* ELSE */ + Out = FT_BOOL( nIfs == 1 ); + break; + + case 0x59: /* EIF */ + nIfs--; + Out = FT_BOOL( nIfs == 0 ); + break; + } + } while ( Out == 0 ); + } + + + /*************************************************************************/ + /* */ + /* ELSE[]: ELSE */ + /* Opcode range: 0x1B */ + /* Stack: --> */ + /* */ + static void + Ins_ELSE( INS_ARG ) + { + FT_Int nIfs; + + FT_UNUSED_ARG; + + + nIfs = 1; + + do + { + if ( SKIP_Code() == FAILURE ) + return; + + switch ( CUR.opcode ) + { + case 0x58: /* IF */ + nIfs++; + break; + + case 0x59: /* EIF */ + nIfs--; + break; + } + } while ( nIfs != 0 ); + } + + + /*************************************************************************/ + /* */ + /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* FDEF[]: Function DEFinition */ + /* Opcode range: 0x2C */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_FDEF( INS_ARG ) + { + FT_ULong n; + TT_DefRecord* rec; + TT_DefRecord* limit; + + + /* some font programs are broken enough to redefine functions! */ + /* We will then parse the current table. */ + + rec = CUR.FDefs; + limit = rec + CUR.numFDefs; + n = args[0]; + + for ( ; rec < limit; rec++ ) + { + if ( rec->opc == n ) + break; + } + + if ( rec == limit ) + { + /* check that there is enough room for new functions */ + if ( CUR.numFDefs >= CUR.maxFDefs ) + { + CUR.error = TT_Err_Too_Many_Function_Defs; + return; + } + CUR.numFDefs++; + } + + /* Although FDEF takes unsigned 32-bit integer, */ + /* func # must be within unsigned 16-bit integer */ + if ( n > 0xFFFFU ) + { + CUR.error = TT_Err_Too_Many_Function_Defs; + return; + } + + rec->range = CUR.curRange; + rec->opc = (FT_UInt16)n; + rec->start = CUR.IP + 1; + rec->active = TRUE; + + if ( n > CUR.maxFunc ) + CUR.maxFunc = (FT_UInt16)n; + + /* Now skip the whole function definition. */ + /* We don't allow nested IDEFS & FDEFs. */ + + while ( SKIP_Code() == SUCCESS ) + { + switch ( CUR.opcode ) + { + case 0x89: /* IDEF */ + case 0x2C: /* FDEF */ + CUR.error = TT_Err_Nested_DEFS; + return; + + case 0x2D: /* ENDF */ + return; + } + } + } + + + /*************************************************************************/ + /* */ + /* ENDF[]: END Function definition */ + /* Opcode range: 0x2D */ + /* Stack: --> */ + /* */ + static void + Ins_ENDF( INS_ARG ) + { + TT_CallRec* pRec; + + FT_UNUSED_ARG; + + + if ( CUR.callTop <= 0 ) /* We encountered an ENDF without a call */ + { + CUR.error = TT_Err_ENDF_In_Exec_Stream; + return; + } + + CUR.callTop--; + + pRec = &CUR.callStack[CUR.callTop]; + + pRec->Cur_Count--; + + CUR.step_ins = FALSE; + + if ( pRec->Cur_Count > 0 ) + { + CUR.callTop++; + CUR.IP = pRec->Cur_Restart; + } + else + /* Loop through the current function */ + INS_Goto_CodeRange( pRec->Caller_Range, + pRec->Caller_IP ); + + /* Exit the current call frame. */ + + /* NOTE: If the last instruction of a program is a */ + /* CALL or LOOPCALL, the return address is */ + /* always out of the code range. This is a */ + /* valid address, and it is why we do not test */ + /* the result of Ins_Goto_CodeRange() here! */ + } + + + /*************************************************************************/ + /* */ + /* CALL[]: CALL function */ + /* Opcode range: 0x2B */ + /* Stack: uint32? --> */ + /* */ + static void + Ins_CALL( INS_ARG ) + { + FT_ULong F; + TT_CallRec* pCrec; + TT_DefRecord* def; + + + /* first of all, check the index */ + + F = args[0]; + if ( BOUNDSL( F, CUR.maxFunc + 1 ) ) + goto Fail; + + /* Except for some old Apple fonts, all functions in a TrueType */ + /* font are defined in increasing order, starting from 0. This */ + /* means that we normally have */ + /* */ + /* CUR.maxFunc+1 == CUR.numFDefs */ + /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */ + /* */ + /* If this isn't true, we need to look up the function table. */ + + def = CUR.FDefs + F; + if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F ) + { + /* look up the FDefs table */ + TT_DefRecord* limit; + + + def = CUR.FDefs; + limit = def + CUR.numFDefs; + + while ( def < limit && def->opc != F ) + def++; + + if ( def == limit ) + goto Fail; + } + + /* check that the function is active */ + if ( !def->active ) + goto Fail; + + /* check the call stack */ + if ( CUR.callTop >= CUR.callSize ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + pCrec = CUR.callStack + CUR.callTop; + + pCrec->Caller_Range = CUR.curRange; + pCrec->Caller_IP = CUR.IP + 1; + pCrec->Cur_Count = 1; + pCrec->Cur_Restart = def->start; + + CUR.callTop++; + + INS_Goto_CodeRange( def->range, + def->start ); + + CUR.step_ins = FALSE; + return; + + Fail: + CUR.error = TT_Err_Invalid_Reference; + } + + + /*************************************************************************/ + /* */ + /* LOOPCALL[]: LOOP and CALL function */ + /* Opcode range: 0x2A */ + /* Stack: uint32? Eint16? --> */ + /* */ + static void + Ins_LOOPCALL( INS_ARG ) + { + FT_ULong F; + TT_CallRec* pCrec; + TT_DefRecord* def; + + + /* first of all, check the index */ + F = args[1]; + if ( BOUNDSL( F, CUR.maxFunc + 1 ) ) + goto Fail; + + /* Except for some old Apple fonts, all functions in a TrueType */ + /* font are defined in increasing order, starting from 0. This */ + /* means that we normally have */ + /* */ + /* CUR.maxFunc+1 == CUR.numFDefs */ + /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */ + /* */ + /* If this isn't true, we need to look up the function table. */ + + def = CUR.FDefs + F; + if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F ) + { + /* look up the FDefs table */ + TT_DefRecord* limit; + + + def = CUR.FDefs; + limit = def + CUR.numFDefs; + + while ( def < limit && def->opc != F ) + def++; + + if ( def == limit ) + goto Fail; + } + + /* check that the function is active */ + if ( !def->active ) + goto Fail; + + /* check stack */ + if ( CUR.callTop >= CUR.callSize ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + if ( args[0] > 0 ) + { + pCrec = CUR.callStack + CUR.callTop; + + pCrec->Caller_Range = CUR.curRange; + pCrec->Caller_IP = CUR.IP + 1; + pCrec->Cur_Count = (FT_Int)args[0]; + pCrec->Cur_Restart = def->start; + + CUR.callTop++; + + INS_Goto_CodeRange( def->range, def->start ); + + CUR.step_ins = FALSE; + } + return; + + Fail: + CUR.error = TT_Err_Invalid_Reference; + } + + + /*************************************************************************/ + /* */ + /* IDEF[]: Instruction DEFinition */ + /* Opcode range: 0x89 */ + /* Stack: Eint8 --> */ + /* */ + static void + Ins_IDEF( INS_ARG ) + { + TT_DefRecord* def; + TT_DefRecord* limit; + + + /* First of all, look for the same function in our table */ + + def = CUR.IDefs; + limit = def + CUR.numIDefs; + + for ( ; def < limit; def++ ) + if ( def->opc == (FT_ULong)args[0] ) + break; + + if ( def == limit ) + { + /* check that there is enough room for a new instruction */ + if ( CUR.numIDefs >= CUR.maxIDefs ) + { + CUR.error = TT_Err_Too_Many_Instruction_Defs; + return; + } + CUR.numIDefs++; + } + + /* opcode must be unsigned 8-bit integer */ + if ( 0 > args[0] || args[0] > 0x00FF ) + { + CUR.error = TT_Err_Too_Many_Instruction_Defs; + return; + } + + def->opc = (FT_Byte)args[0]; + def->start = CUR.IP + 1; + def->range = CUR.curRange; + def->active = TRUE; + + if ( (FT_ULong)args[0] > CUR.maxIns ) + CUR.maxIns = (FT_Byte)args[0]; + + /* Now skip the whole function definition. */ + /* We don't allow nested IDEFs & FDEFs. */ + + while ( SKIP_Code() == SUCCESS ) + { + switch ( CUR.opcode ) + { + case 0x89: /* IDEF */ + case 0x2C: /* FDEF */ + CUR.error = TT_Err_Nested_DEFS; + return; + case 0x2D: /* ENDF */ + return; + } + } + } + + + /*************************************************************************/ + /* */ + /* PUSHING DATA ONTO THE INTERPRETER STACK */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* NPUSHB[]: PUSH N Bytes */ + /* Opcode range: 0x40 */ + /* Stack: --> uint32... */ + /* */ + static void + Ins_NPUSHB( INS_ARG ) + { + FT_UShort L, K; + + + L = (FT_UShort)CUR.code[CUR.IP + 1]; + + if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + for ( K = 1; K <= L; K++ ) + args[K - 1] = CUR.code[CUR.IP + K + 1]; + + CUR.new_top += L; + } + + + /*************************************************************************/ + /* */ + /* NPUSHW[]: PUSH N Words */ + /* Opcode range: 0x41 */ + /* Stack: --> int32... */ + /* */ + static void + Ins_NPUSHW( INS_ARG ) + { + FT_UShort L, K; + + + L = (FT_UShort)CUR.code[CUR.IP + 1]; + + if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + CUR.IP += 2; + + for ( K = 0; K < L; K++ ) + args[K] = GET_ShortIns(); + + CUR.step_ins = FALSE; + CUR.new_top += L; + } + + + /*************************************************************************/ + /* */ + /* PUSHB[abc]: PUSH Bytes */ + /* Opcode range: 0xB0-0xB7 */ + /* Stack: --> uint32... */ + /* */ + static void + Ins_PUSHB( INS_ARG ) + { + FT_UShort L, K; + + + L = (FT_UShort)( CUR.opcode - 0xB0 + 1 ); + + if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + for ( K = 1; K <= L; K++ ) + args[K - 1] = CUR.code[CUR.IP + K]; + } + + + /*************************************************************************/ + /* */ + /* PUSHW[abc]: PUSH Words */ + /* Opcode range: 0xB8-0xBF */ + /* Stack: --> int32... */ + /* */ + static void + Ins_PUSHW( INS_ARG ) + { + FT_UShort L, K; + + + L = (FT_UShort)( CUR.opcode - 0xB8 + 1 ); + + if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + CUR.IP++; + + for ( K = 0; K < L; K++ ) + args[K] = GET_ShortIns(); + + CUR.step_ins = FALSE; + } + + + /*************************************************************************/ + /* */ + /* MANAGING THE GRAPHICS STATE */ + /* */ + /* Instructions appear in the specs' order. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* GC[a]: Get Coordinate projected onto */ + /* Opcode range: 0x46-0x47 */ + /* Stack: uint32 --> f26.6 */ + /* */ + /* BULLSHIT: Measures from the original glyph must be taken along the */ + /* dual projection vector! */ + /* */ + static void + Ins_GC( INS_ARG ) + { + FT_ULong L; + FT_F26Dot6 R; + + + L = (FT_ULong)args[0]; + + if ( BOUNDSL( L, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + else + R = 0; + } + else + { + if ( CUR.opcode & 1 ) + R = CUR_fast_dualproj( &CUR.zp2.org[L] ); + else + R = CUR_fast_project( &CUR.zp2.cur[L] ); + } + + args[0] = R; + } + + + /*************************************************************************/ + /* */ + /* SCFS[]: Set Coordinate From Stack */ + /* Opcode range: 0x48 */ + /* Stack: f26.6 uint32 --> */ + /* */ + /* Formula: */ + /* */ + /* OA := OA + ( value - OA.p )/( f.p ) * f */ + /* */ + static void + Ins_SCFS( INS_ARG ) + { + FT_Long K; + FT_UShort L; + + + L = (FT_UShort)args[0]; + + if ( BOUNDS( L, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + K = CUR_fast_project( &CUR.zp2.cur[L] ); + + CUR_Func_move( &CUR.zp2, L, args[1] - K ); + + /* not part of the specs, but here for safety */ + + if ( CUR.GS.gep2 == 0 ) + CUR.zp2.org[L] = CUR.zp2.cur[L]; + } + + + /*************************************************************************/ + /* */ + /* MD[a]: Measure Distance */ + /* Opcode range: 0x49-0x4A */ + /* Stack: uint32 uint32 --> f26.6 */ + /* */ + /* BULLSHIT: Measure taken in the original glyph must be along the dual */ + /* projection vector. */ + /* */ + /* Second BULLSHIT: Flag attributes are inverted! */ + /* 0 => measure distance in original outline */ + /* 1 => measure distance in grid-fitted outline */ + /* */ + /* Third one: `zp0 - zp1', and not `zp2 - zp1! */ + /* */ + static void + Ins_MD( INS_ARG ) + { + FT_UShort K, L; + FT_F26Dot6 D; + + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( L, CUR.zp0.n_points ) || + BOUNDS( K, CUR.zp1.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + D = 0; + } + else + { + if ( CUR.opcode & 1 ) + D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K ); + else + { + FT_Vector* vec1 = CUR.zp0.orus + L; + FT_Vector* vec2 = CUR.zp1.orus + K; + + + if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) + { + /* this should be faster */ + D = CUR_Func_dualproj( vec1, vec2 ); + D = TT_MULFIX( D, CUR.metrics.x_scale ); + } + else + { + FT_Vector vec; + + + vec.x = TT_MULFIX( vec1->x - vec2->x, CUR.metrics.x_scale ); + vec.y = TT_MULFIX( vec1->y - vec2->y, CUR.metrics.y_scale ); + + D = CUR_fast_dualproj( &vec ); + } + } + } + + args[0] = D; + } + + + /*************************************************************************/ + /* */ + /* SDPVTL[a]: Set Dual PVector to Line */ + /* Opcode range: 0x86-0x87 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_SDPVTL( INS_ARG ) + { + FT_Long A, B, C; + FT_UShort p1, p2; /* was FT_Int in pas type ERROR */ + + + p1 = (FT_UShort)args[1]; + p2 = (FT_UShort)args[0]; + + if ( BOUNDS( p2, CUR.zp1.n_points ) || + BOUNDS( p1, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + { + FT_Vector* v1 = CUR.zp1.org + p2; + FT_Vector* v2 = CUR.zp2.org + p1; + + + A = v1->x - v2->x; + B = v1->y - v2->y; + } + + if ( ( CUR.opcode & 1 ) != 0 ) + { + C = B; /* counter clockwise rotation */ + B = A; + A = -C; + } + + NORMalize( A, B, &CUR.GS.dualVector ); + + { + FT_Vector* v1 = CUR.zp1.cur + p2; + FT_Vector* v2 = CUR.zp2.cur + p1; + + + A = v1->x - v2->x; + B = v1->y - v2->y; + } + + if ( ( CUR.opcode & 1 ) != 0 ) + { + C = B; /* counter clockwise rotation */ + B = A; + A = -C; + } + + NORMalize( A, B, &CUR.GS.projVector ); + + GUESS_VECTOR( freeVector ); + + COMPUTE_Funcs(); + } + + + /*************************************************************************/ + /* */ + /* SZP0[]: Set Zone Pointer 0 */ + /* Opcode range: 0x13 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZP0( INS_ARG ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + CUR.zp0 = CUR.twilight; + break; + + case 1: + CUR.zp0 = CUR.pts; + break; + + default: + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + CUR.GS.gep0 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SZP1[]: Set Zone Pointer 1 */ + /* Opcode range: 0x14 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZP1( INS_ARG ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + CUR.zp1 = CUR.twilight; + break; + + case 1: + CUR.zp1 = CUR.pts; + break; + + default: + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + CUR.GS.gep1 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SZP2[]: Set Zone Pointer 2 */ + /* Opcode range: 0x15 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZP2( INS_ARG ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + CUR.zp2 = CUR.twilight; + break; + + case 1: + CUR.zp2 = CUR.pts; + break; + + default: + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + CUR.GS.gep2 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SZPS[]: Set Zone PointerS */ + /* Opcode range: 0x16 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZPS( INS_ARG ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + CUR.zp0 = CUR.twilight; + break; + + case 1: + CUR.zp0 = CUR.pts; + break; + + default: + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + CUR.zp1 = CUR.zp0; + CUR.zp2 = CUR.zp0; + + CUR.GS.gep0 = (FT_UShort)args[0]; + CUR.GS.gep1 = (FT_UShort)args[0]; + CUR.GS.gep2 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* INSTCTRL[]: INSTruction ConTRoL */ + /* Opcode range: 0x8e */ + /* Stack: int32 int32 --> */ + /* */ + static void + Ins_INSTCTRL( INS_ARG ) + { + FT_Long K, L; + + + K = args[1]; + L = args[0]; + + if ( K < 1 || K > 2 ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( L != 0 ) + L = K; + + CUR.GS.instruct_control = FT_BOOL( + ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L ); + } + + + /*************************************************************************/ + /* */ + /* SCANCTRL[]: SCAN ConTRoL */ + /* Opcode range: 0x85 */ + /* Stack: uint32? --> */ + /* */ + static void + Ins_SCANCTRL( INS_ARG ) + { + FT_Int A; + + + /* Get Threshold */ + A = (FT_Int)( args[0] & 0xFF ); + + if ( A == 0xFF ) + { + CUR.GS.scan_control = TRUE; + return; + } + else if ( A == 0 ) + { + CUR.GS.scan_control = FALSE; + return; + } + + if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A ) + CUR.GS.scan_control = TRUE; + + if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated ) + CUR.GS.scan_control = TRUE; + + if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched ) + CUR.GS.scan_control = TRUE; + + if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A ) + CUR.GS.scan_control = FALSE; + + if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated ) + CUR.GS.scan_control = FALSE; + + if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched ) + CUR.GS.scan_control = FALSE; + } + + + /*************************************************************************/ + /* */ + /* SCANTYPE[]: SCAN TYPE */ + /* Opcode range: 0x8D */ + /* Stack: uint32? --> */ + /* */ + static void + Ins_SCANTYPE( INS_ARG ) + { + if ( args[0] >= 0 ) + CUR.GS.scan_type = (FT_Int)args[0]; + } + + + /*************************************************************************/ + /* */ + /* MANAGING OUTLINES */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* FLIPPT[]: FLIP PoinT */ + /* Opcode range: 0x80 */ + /* Stack: uint32... --> */ + /* */ + static void + Ins_FLIPPT( INS_ARG ) + { + FT_UShort point; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + + point = (FT_UShort)CUR.stack[CUR.args]; + + if ( BOUNDS( point, CUR.pts.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + CUR.pts.tags[point] ^= FT_CURVE_TAG_ON; + + CUR.GS.loop--; + } + + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* FLIPRGON[]: FLIP RanGe ON */ + /* Opcode range: 0x81 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_FLIPRGON( INS_ARG ) + { + FT_UShort I, K, L; + + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( K, CUR.pts.n_points ) || + BOUNDS( L, CUR.pts.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + for ( I = L; I <= K; I++ ) + CUR.pts.tags[I] |= FT_CURVE_TAG_ON; + } + + + /*************************************************************************/ + /* */ + /* FLIPRGOFF: FLIP RanGe OFF */ + /* Opcode range: 0x82 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_FLIPRGOFF( INS_ARG ) + { + FT_UShort I, K, L; + + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( K, CUR.pts.n_points ) || + BOUNDS( L, CUR.pts.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + for ( I = L; I <= K; I++ ) + CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON; + } + + + static FT_Bool + Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6* x, + FT_F26Dot6* y, + TT_GlyphZone zone, + FT_UShort* refp ) + { + TT_GlyphZoneRec zp; + FT_UShort p; + FT_F26Dot6 d; + + + if ( CUR.opcode & 1 ) + { + zp = CUR.zp0; + p = CUR.GS.rp1; + } + else + { + zp = CUR.zp1; + p = CUR.GS.rp2; + } + + if ( BOUNDS( p, zp.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + *refp = 0; + return FAILURE; + } + + *zone = zp; + *refp = p; + + d = CUR_Func_project( zp.cur + p, zp.org + p ); + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + if ( CUR.GS.both_x_axis ) + { + *x = d; + *y = 0; + } + else + { + *x = 0; + *y = d; + } + } + else +#endif + { + *x = TT_MULDIV( d, + (FT_Long)CUR.GS.freeVector.x * 0x10000L, + CUR.F_dot_P ); + *y = TT_MULDIV( d, + (FT_Long)CUR.GS.freeVector.y * 0x10000L, + CUR.F_dot_P ); + } + + return SUCCESS; + } + + + static void + Move_Zp2_Point( EXEC_OP_ FT_UShort point, + FT_F26Dot6 dx, + FT_F26Dot6 dy, + FT_Bool touch ) + { +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + if ( CUR.GS.both_x_axis ) + { + CUR.zp2.cur[point].x += dx; + if ( touch ) + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + else + { + CUR.zp2.cur[point].y += dy; + if ( touch ) + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + return; + } +#endif + + if ( CUR.GS.freeVector.x != 0 ) + { + CUR.zp2.cur[point].x += dx; + if ( touch ) + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + if ( CUR.GS.freeVector.y != 0 ) + { + CUR.zp2.cur[point].y += dy; + if ( touch ) + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + } + + + /*************************************************************************/ + /* */ + /* SHP[a]: SHift Point by the last point */ + /* Opcode range: 0x32-0x33 */ + /* Stack: uint32... --> */ + /* */ + static void + Ins_SHP( INS_ARG ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + + FT_F26Dot6 dx, + dy; + FT_UShort point; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) + return; + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + point = (FT_UShort)CUR.stack[CUR.args]; + + if ( BOUNDS( point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + /* XXX: UNDOCUMENTED! SHP touches the points */ + MOVE_Zp2_Point( point, dx, dy, TRUE ); + + CUR.GS.loop--; + } + + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* SHC[a]: SHift Contour */ + /* Opcode range: 0x34-35 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SHC( INS_ARG ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + FT_F26Dot6 dx, + dy; + + FT_Short contour; + FT_UShort first_point, last_point, i; + + + contour = (FT_UShort)args[0]; + + if ( BOUNDS( contour, CUR.pts.n_contours ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) + return; + + if ( contour == 0 ) + first_point = 0; + else + first_point = (FT_UShort)( CUR.pts.contours[contour - 1] + 1 - + CUR.pts.first_point ); + + last_point = (FT_UShort)( CUR.pts.contours[contour] - + CUR.pts.first_point ); + + /* XXX: this is probably wrong... at least it prevents memory */ + /* corruption when zp2 is the twilight zone */ + if ( BOUNDS( last_point, CUR.zp2.n_points ) ) + { + if ( CUR.zp2.n_points > 0 ) + last_point = (FT_UShort)(CUR.zp2.n_points - 1); + else + last_point = 0; + } + + /* XXX: UNDOCUMENTED! SHC touches the points */ + for ( i = first_point; i <= last_point; i++ ) + { + if ( zp.cur != CUR.zp2.cur || refp != i ) + MOVE_Zp2_Point( i, dx, dy, TRUE ); + } + } + + + /*************************************************************************/ + /* */ + /* SHZ[a]: SHift Zone */ + /* Opcode range: 0x36-37 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SHZ( INS_ARG ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + FT_F26Dot6 dx, + dy; + + FT_UShort last_point, i; + + + if ( BOUNDS( args[0], 2 ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) + return; + + /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points. */ + /* Twilight zone has no contours, so use `n_points'. */ + /* Normal zone's `n_points' includes phantoms, so must */ + /* use end of last contour. */ + if ( CUR.GS.gep2 == 0 && CUR.zp2.n_points > 0 ) + last_point = (FT_UShort)( CUR.zp2.n_points - 1 ); + else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 ) + last_point = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] ); + else + last_point = 0; + + /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */ + for ( i = 0; i <= last_point; i++ ) + { + if ( zp.cur != CUR.zp2.cur || refp != i ) + MOVE_Zp2_Point( i, dx, dy, FALSE ); + } + } + + + /*************************************************************************/ + /* */ + /* SHPIX[]: SHift points by a PIXel amount */ + /* Opcode range: 0x38 */ + /* Stack: f26.6 uint32... --> */ + /* */ + static void + Ins_SHPIX( INS_ARG ) + { + FT_F26Dot6 dx, dy; + FT_UShort point; + + + if ( CUR.top < CUR.GS.loop + 1 ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + if ( CUR.GS.both_x_axis ) + { + dx = TT_MulFix14( (FT_UInt32)args[0], 0x4000 ); + dy = 0; + } + else + { + dx = 0; + dy = TT_MulFix14( (FT_UInt32)args[0], 0x4000 ); + } + } + else +#endif + { + dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x ); + dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y ); + } + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + + point = (FT_UShort)CUR.stack[CUR.args]; + + if ( BOUNDS( point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + MOVE_Zp2_Point( point, dx, dy, TRUE ); + + CUR.GS.loop--; + } + + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* MSIRP[a]: Move Stack Indirect Relative Position */ + /* Opcode range: 0x3A-0x3B */ + /* Stack: f26.6 uint32 --> */ + /* */ + static void + Ins_MSIRP( INS_ARG ) + { + FT_UShort point; + FT_F26Dot6 distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp1.n_points ) || + BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: UNDOCUMENTED! behaviour */ + if ( CUR.GS.gep1 == 0 ) /* if the point that is to be moved */ + /* is in twilight zone */ + { + CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0]; + CUR_Func_move_orig( &CUR.zp1, point, args[1] ); + CUR.zp1.cur[point] = CUR.zp1.org[point]; + } + + distance = CUR_Func_project( CUR.zp1.cur + point, + CUR.zp0.cur + CUR.GS.rp0 ); + + CUR_Func_move( &CUR.zp1, point, args[1] - distance ); + + CUR.GS.rp1 = CUR.GS.rp0; + CUR.GS.rp2 = point; + + if ( ( CUR.opcode & 1 ) != 0 ) + CUR.GS.rp0 = point; + } + + + /*************************************************************************/ + /* */ + /* MDAP[a]: Move Direct Absolute Point */ + /* Opcode range: 0x2E-0x2F */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_MDAP( INS_ARG ) + { + FT_UShort point; + FT_F26Dot6 cur_dist, + distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: Is there some undocumented feature while in the */ + /* twilight zone? ? */ + if ( ( CUR.opcode & 1 ) != 0 ) + { + cur_dist = CUR_fast_project( &CUR.zp0.cur[point] ); + distance = CUR_Func_round( cur_dist, + CUR.tt_metrics.compensations[0] ) - cur_dist; + } + else + distance = 0; + + CUR_Func_move( &CUR.zp0, point, distance ); + + CUR.GS.rp0 = point; + CUR.GS.rp1 = point; + } + + + /*************************************************************************/ + /* */ + /* MIAP[a]: Move Indirect Absolute Point */ + /* Opcode range: 0x3E-0x3F */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_MIAP( INS_ARG ) + { + FT_ULong cvtEntry; + FT_UShort point; + FT_F26Dot6 distance, + org_dist; + + + cvtEntry = (FT_ULong)args[1]; + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp0.n_points ) || + BOUNDSL( cvtEntry, CUR.cvtSize ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: UNDOCUMENTED! */ + /* */ + /* The behaviour of an MIAP instruction is quite */ + /* different when used in the twilight zone. */ + /* */ + /* First, no control value cut-in test is performed */ + /* as it would fail anyway. Second, the original */ + /* point, i.e. (org_x,org_y) of zp0.point, is set */ + /* to the absolute, unrounded distance found in */ + /* the CVT. */ + /* */ + /* This is used in the CVT programs of the Microsoft */ + /* fonts Arial, Times, etc., in order to re-adjust */ + /* some key font heights. It allows the use of the */ + /* IP instruction in the twilight zone, which */ + /* otherwise would be `illegal' according to the */ + /* specification. */ + /* */ + /* We implement it with a special sequence for the */ + /* twilight zone. This is a bad hack, but it seems */ + /* to work. */ + + distance = CUR_Func_read_cvt( cvtEntry ); + + if ( CUR.GS.gep0 == 0 ) /* If in twilight zone */ + { + CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance, CUR.GS.freeVector.x ); + CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance, CUR.GS.freeVector.y ), + CUR.zp0.cur[point] = CUR.zp0.org[point]; + } + + org_dist = CUR_fast_project( &CUR.zp0.cur[point] ); + + if ( ( CUR.opcode & 1 ) != 0 ) /* rounding and control cutin flag */ + { + if ( FT_ABS( distance - org_dist ) > CUR.GS.control_value_cutin ) + distance = org_dist; + + distance = CUR_Func_round( distance, CUR.tt_metrics.compensations[0] ); + } + + CUR_Func_move( &CUR.zp0, point, distance - org_dist ); + + CUR.GS.rp0 = point; + CUR.GS.rp1 = point; + } + + + /*************************************************************************/ + /* */ + /* MDRP[abcde]: Move Direct Relative Point */ + /* Opcode range: 0xC0-0xDF */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_MDRP( INS_ARG ) + { + FT_UShort point; + FT_F26Dot6 org_dist, distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp1.n_points ) || + BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: Is there some undocumented feature while in the */ + /* twilight zone? */ + + /* XXX: UNDOCUMENTED: twilight zone special case */ + + if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 ) + { + FT_Vector* vec1 = &CUR.zp1.org[point]; + FT_Vector* vec2 = &CUR.zp0.org[CUR.GS.rp0]; + + + org_dist = CUR_Func_dualproj( vec1, vec2 ); + } + else + { + FT_Vector* vec1 = &CUR.zp1.orus[point]; + FT_Vector* vec2 = &CUR.zp0.orus[CUR.GS.rp0]; + + + if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) + { + /* this should be faster */ + org_dist = CUR_Func_dualproj( vec1, vec2 ); + org_dist = TT_MULFIX( org_dist, CUR.metrics.x_scale ); + } + else + { + FT_Vector vec; + + + vec.x = TT_MULFIX( vec1->x - vec2->x, CUR.metrics.x_scale ); + vec.y = TT_MULFIX( vec1->y - vec2->y, CUR.metrics.y_scale ); + + org_dist = CUR_fast_dualproj( &vec ); + } + } + + /* single width cut-in test */ + + if ( FT_ABS( org_dist - CUR.GS.single_width_value ) < + CUR.GS.single_width_cutin ) + { + if ( org_dist >= 0 ) + org_dist = CUR.GS.single_width_value; + else + org_dist = -CUR.GS.single_width_value; + } + + /* round flag */ + + if ( ( CUR.opcode & 4 ) != 0 ) + distance = CUR_Func_round( + org_dist, + CUR.tt_metrics.compensations[CUR.opcode & 3] ); + else + distance = ROUND_None( + org_dist, + CUR.tt_metrics.compensations[CUR.opcode & 3] ); + + /* minimum distance flag */ + + if ( ( CUR.opcode & 8 ) != 0 ) + { + if ( org_dist >= 0 ) + { + if ( distance < CUR.GS.minimum_distance ) + distance = CUR.GS.minimum_distance; + } + else + { + if ( distance > -CUR.GS.minimum_distance ) + distance = -CUR.GS.minimum_distance; + } + } + + /* now move the point */ + + org_dist = CUR_Func_project( CUR.zp1.cur + point, + CUR.zp0.cur + CUR.GS.rp0 ); + + CUR_Func_move( &CUR.zp1, point, distance - org_dist ); + + CUR.GS.rp1 = CUR.GS.rp0; + CUR.GS.rp2 = point; + + if ( ( CUR.opcode & 16 ) != 0 ) + CUR.GS.rp0 = point; + } + + + /*************************************************************************/ + /* */ + /* MIRP[abcde]: Move Indirect Relative Point */ + /* Opcode range: 0xE0-0xFF */ + /* Stack: int32? uint32 --> */ + /* */ + static void + Ins_MIRP( INS_ARG ) + { + FT_UShort point; + FT_ULong cvtEntry; + + FT_F26Dot6 cvt_dist, + distance, + cur_dist, + org_dist; + + + point = (FT_UShort)args[0]; + cvtEntry = (FT_ULong)( args[1] + 1 ); + + /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */ + + if ( BOUNDS( point, CUR.zp1.n_points ) || + BOUNDSL( cvtEntry, CUR.cvtSize + 1 ) || + BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( !cvtEntry ) + cvt_dist = 0; + else + cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 ); + + /* single width test */ + + if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) < + CUR.GS.single_width_cutin ) + { + if ( cvt_dist >= 0 ) + cvt_dist = CUR.GS.single_width_value; + else + cvt_dist = -CUR.GS.single_width_value; + } + + /* XXX: UNDOCUMENTED! -- twilight zone */ + + if ( CUR.GS.gep1 == 0 ) + { + CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x + + TT_MulFix14( (FT_UInt32)cvt_dist, + CUR.GS.freeVector.x ); + + CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y + + TT_MulFix14( (FT_UInt32)cvt_dist, + CUR.GS.freeVector.y ); + + CUR.zp1.cur[point] = CUR.zp0.cur[point]; + } + + org_dist = CUR_Func_dualproj( &CUR.zp1.org[point], + &CUR.zp0.org[CUR.GS.rp0] ); + cur_dist = CUR_Func_project ( &CUR.zp1.cur[point], + &CUR.zp0.cur[CUR.GS.rp0] ); + + /* auto-flip test */ + + if ( CUR.GS.auto_flip ) + { + if ( ( org_dist ^ cvt_dist ) < 0 ) + cvt_dist = -cvt_dist; + } + + /* control value cutin and round */ + + if ( ( CUR.opcode & 4 ) != 0 ) + { + /* XXX: UNDOCUMENTED! Only perform cut-in test when both points */ + /* refer to the same zone. */ + + if ( CUR.GS.gep0 == CUR.GS.gep1 ) + if ( FT_ABS( cvt_dist - org_dist ) >= CUR.GS.control_value_cutin ) + cvt_dist = org_dist; + + distance = CUR_Func_round( + cvt_dist, + CUR.tt_metrics.compensations[CUR.opcode & 3] ); + } + else + distance = ROUND_None( + cvt_dist, + CUR.tt_metrics.compensations[CUR.opcode & 3] ); + + /* minimum distance test */ + + if ( ( CUR.opcode & 8 ) != 0 ) + { + if ( org_dist >= 0 ) + { + if ( distance < CUR.GS.minimum_distance ) + distance = CUR.GS.minimum_distance; + } + else + { + if ( distance > -CUR.GS.minimum_distance ) + distance = -CUR.GS.minimum_distance; + } + } + + CUR_Func_move( &CUR.zp1, point, distance - cur_dist ); + + CUR.GS.rp1 = CUR.GS.rp0; + + if ( ( CUR.opcode & 16 ) != 0 ) + CUR.GS.rp0 = point; + + /* XXX: UNDOCUMENTED! */ + CUR.GS.rp2 = point; + } + + + /*************************************************************************/ + /* */ + /* ALIGNRP[]: ALIGN Relative Point */ + /* Opcode range: 0x3C */ + /* Stack: uint32 uint32... --> */ + /* */ + static void + Ins_ALIGNRP( INS_ARG ) + { + FT_UShort point; + FT_F26Dot6 distance; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop || + BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + + point = (FT_UShort)CUR.stack[CUR.args]; + + if ( BOUNDS( point, CUR.zp1.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + { + distance = CUR_Func_project( CUR.zp1.cur + point, + CUR.zp0.cur + CUR.GS.rp0 ); + + CUR_Func_move( &CUR.zp1, point, -distance ); + } + + CUR.GS.loop--; + } + + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* ISECT[]: moves point to InterSECTion */ + /* Opcode range: 0x0F */ + /* Stack: 5 * uint32 --> */ + /* */ + static void + Ins_ISECT( INS_ARG ) + { + FT_UShort point, + a0, a1, + b0, b1; + + FT_F26Dot6 discriminant; + + FT_F26Dot6 dx, dy, + dax, day, + dbx, dby; + + FT_F26Dot6 val; + + FT_Vector R; + + + point = (FT_UShort)args[0]; + + a0 = (FT_UShort)args[1]; + a1 = (FT_UShort)args[2]; + b0 = (FT_UShort)args[3]; + b1 = (FT_UShort)args[4]; + + if ( BOUNDS( b0, CUR.zp0.n_points ) || + BOUNDS( b1, CUR.zp0.n_points ) || + BOUNDS( a0, CUR.zp1.n_points ) || + BOUNDS( a1, CUR.zp1.n_points ) || + BOUNDS( point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x; + dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y; + + dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x; + day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y; + + dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x; + dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y; + + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH; + + discriminant = TT_MULDIV( dax, -dby, 0x40 ) + + TT_MULDIV( day, dbx, 0x40 ); + + if ( FT_ABS( discriminant ) >= 0x40 ) + { + val = TT_MULDIV( dx, -dby, 0x40 ) + TT_MULDIV( dy, dbx, 0x40 ); + + R.x = TT_MULDIV( val, dax, discriminant ); + R.y = TT_MULDIV( val, day, discriminant ); + + CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x; + CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y; + } + else + { + /* else, take the middle of the middles of A and B */ + + CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x + + CUR.zp1.cur[a1].x + + CUR.zp0.cur[b0].x + + CUR.zp0.cur[b1].x ) / 4; + CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y + + CUR.zp1.cur[a1].y + + CUR.zp0.cur[b0].y + + CUR.zp0.cur[b1].y ) / 4; + } + } + + + /*************************************************************************/ + /* */ + /* ALIGNPTS[]: ALIGN PoinTS */ + /* Opcode range: 0x27 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_ALIGNPTS( INS_ARG ) + { + FT_UShort p1, p2; + FT_F26Dot6 distance; + + + p1 = (FT_UShort)args[0]; + p2 = (FT_UShort)args[1]; + + if ( BOUNDS( p1, CUR.zp1.n_points ) || + BOUNDS( p2, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + distance = CUR_Func_project( CUR.zp0.cur + p2, + CUR.zp1.cur + p1 ) / 2; + + CUR_Func_move( &CUR.zp1, p1, distance ); + CUR_Func_move( &CUR.zp0, p2, -distance ); + } + + + /*************************************************************************/ + /* */ + /* IP[]: Interpolate Point */ + /* Opcode range: 0x39 */ + /* Stack: uint32... --> */ + /* */ + + /* SOMETIMES, DUMBER CODE IS BETTER CODE */ + + static void + Ins_IP( INS_ARG ) + { + FT_F26Dot6 old_range, cur_range; + FT_Vector* orus_base; + FT_Vector* cur_base; + FT_Int twilight; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* + * We need to deal in a special way with the twilight zone. + * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0), + * for every n. + */ + twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0; + + if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( twilight ) + orus_base = &CUR.zp0.org[CUR.GS.rp1]; + else + orus_base = &CUR.zp0.orus[CUR.GS.rp1]; + + cur_base = &CUR.zp0.cur[CUR.GS.rp1]; + + /* XXX: There are some glyphs in some braindead but popular */ + /* fonts out there (e.g. [aeu]grave in monotype.ttf) */ + /* calling IP[] with bad values of rp[12]. */ + /* Do something sane when this odd thing happens. */ + if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) || + BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) ) + { + old_range = 0; + cur_range = 0; + } + else + { + if ( twilight ) + old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2], + orus_base ); + else + old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2], + orus_base ); + + cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base ); + } + + for ( ; CUR.GS.loop > 0; --CUR.GS.loop ) + { + FT_UInt point = (FT_UInt)CUR.stack[--CUR.args]; + FT_F26Dot6 org_dist, cur_dist, new_dist; + + + /* check point bounds */ + if ( BOUNDS( point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + continue; + } + + if ( twilight ) + org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base ); + else + org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base ); + + cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base ); + + if ( org_dist ) + new_dist = ( old_range != 0 ) + ? TT_MULDIV( org_dist, cur_range, old_range ) + : cur_dist; + else + new_dist = 0; + + CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist ); + } + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* UTP[a]: UnTouch Point */ + /* Opcode range: 0x29 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_UTP( INS_ARG ) + { + FT_UShort point; + FT_Byte mask; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + mask = 0xFF; + + if ( CUR.GS.freeVector.x != 0 ) + mask &= ~FT_CURVE_TAG_TOUCH_X; + + if ( CUR.GS.freeVector.y != 0 ) + mask &= ~FT_CURVE_TAG_TOUCH_Y; + + CUR.zp0.tags[point] &= mask; + } + + + /* Local variables for Ins_IUP: */ + typedef struct IUP_WorkerRec_ + { + FT_Vector* orgs; /* original and current coordinate */ + FT_Vector* curs; /* arrays */ + FT_Vector* orus; + FT_UInt max_points; + + } IUP_WorkerRec, *IUP_Worker; + + + static void + _iup_worker_shift( IUP_Worker worker, + FT_UInt p1, + FT_UInt p2, + FT_UInt p ) + { + FT_UInt i; + FT_F26Dot6 dx; + + + dx = worker->curs[p].x - worker->orgs[p].x; + if ( dx != 0 ) + { + for ( i = p1; i < p; i++ ) + worker->curs[i].x += dx; + + for ( i = p + 1; i <= p2; i++ ) + worker->curs[i].x += dx; + } + } + + + static void + _iup_worker_interpolate( IUP_Worker worker, + FT_UInt p1, + FT_UInt p2, + FT_UInt ref1, + FT_UInt ref2 ) + { + FT_UInt i; + FT_F26Dot6 orus1, orus2, org1, org2, delta1, delta2; + + + if ( p1 > p2 ) + return; + + if ( BOUNDS( ref1, worker->max_points ) || + BOUNDS( ref2, worker->max_points ) ) + return; + + orus1 = worker->orus[ref1].x; + orus2 = worker->orus[ref2].x; + + if ( orus1 > orus2 ) + { + FT_F26Dot6 tmp_o; + FT_UInt tmp_r; + + + tmp_o = orus1; + orus1 = orus2; + orus2 = tmp_o; + + tmp_r = ref1; + ref1 = ref2; + ref2 = tmp_r; + } + + org1 = worker->orgs[ref1].x; + org2 = worker->orgs[ref2].x; + delta1 = worker->curs[ref1].x - org1; + delta2 = worker->curs[ref2].x - org2; + + if ( orus1 == orus2 ) + { + /* simple shift of untouched points */ + for ( i = p1; i <= p2; i++ ) + { + FT_F26Dot6 x = worker->orgs[i].x; + + + if ( x <= org1 ) + x += delta1; + else + x += delta2; + + worker->curs[i].x = x; + } + } + else + { + FT_Fixed scale = 0; + FT_Bool scale_valid = 0; + + + /* interpolation */ + for ( i = p1; i <= p2; i++ ) + { + FT_F26Dot6 x = worker->orgs[i].x; + + + if ( x <= org1 ) + x += delta1; + + else if ( x >= org2 ) + x += delta2; + + else + { + if ( !scale_valid ) + { + scale_valid = 1; + scale = TT_MULDIV( org2 + delta2 - ( org1 + delta1 ), + 0x10000L, orus2 - orus1 ); + } + + x = ( org1 + delta1 ) + + TT_MULFIX( worker->orus[i].x - orus1, scale ); + } + worker->curs[i].x = x; + } + } + } + + + /*************************************************************************/ + /* */ + /* IUP[a]: Interpolate Untouched Points */ + /* Opcode range: 0x30-0x31 */ + /* Stack: --> */ + /* */ + static void + Ins_IUP( INS_ARG ) + { + IUP_WorkerRec V; + FT_Byte mask; + + FT_UInt first_point; /* first point of contour */ + FT_UInt end_point; /* end point (last+1) of contour */ + + FT_UInt first_touched; /* first touched point in contour */ + FT_UInt cur_touched; /* current touched point in contour */ + + FT_UInt point; /* current point */ + FT_Short contour; /* current contour */ + + FT_UNUSED_ARG; + + + /* ignore empty outlines */ + if ( CUR.pts.n_contours == 0 ) + return; + + if ( CUR.opcode & 1 ) + { + mask = FT_CURVE_TAG_TOUCH_X; + V.orgs = CUR.pts.org; + V.curs = CUR.pts.cur; + V.orus = CUR.pts.orus; + } + else + { + mask = FT_CURVE_TAG_TOUCH_Y; + V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 ); + V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 ); + V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 ); + } + V.max_points = CUR.pts.n_points; + + contour = 0; + point = 0; + + do + { + end_point = CUR.pts.contours[contour] - CUR.pts.first_point; + first_point = point; + + if ( BOUNDS ( end_point, CUR.pts.n_points ) ) + end_point = CUR.pts.n_points - 1; + + while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 ) + point++; + + if ( point <= end_point ) + { + first_touched = point; + cur_touched = point; + + point++; + + while ( point <= end_point ) + { + if ( ( CUR.pts.tags[point] & mask ) != 0 ) + { + if ( point > 0 ) + _iup_worker_interpolate( &V, + cur_touched + 1, + point - 1, + cur_touched, + point ); + cur_touched = point; + } + + point++; + } + + if ( cur_touched == first_touched ) + _iup_worker_shift( &V, first_point, end_point, cur_touched ); + else + { + _iup_worker_interpolate( &V, + (FT_UShort)( cur_touched + 1 ), + end_point, + cur_touched, + first_touched ); + + if ( first_touched > 0 ) + _iup_worker_interpolate( &V, + first_point, + first_touched - 1, + cur_touched, + first_touched ); + } + } + contour++; + } while ( contour < CUR.pts.n_contours ); + } + + + /*************************************************************************/ + /* */ + /* DELTAPn[]: DELTA exceptions P1, P2, P3 */ + /* Opcode range: 0x5D,0x71,0x72 */ + /* Stack: uint32 (2 * uint32)... --> */ + /* */ + static void + Ins_DELTAP( INS_ARG ) + { + FT_ULong k, nump; + FT_UShort A; + FT_ULong C; + FT_Long B; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + /* Delta hinting is covered by US Patent 5159668. */ + if ( CUR.face->unpatented_hinting ) + { + FT_Long n = args[0] * 2; + + + if ( CUR.args < n ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + CUR.args -= n; + CUR.new_top = CUR.args; + return; + } +#endif + + nump = (FT_ULong)args[0]; /* some points theoretically may occur more + than once, thus UShort isn't enough */ + + for ( k = 1; k <= nump; k++ ) + { + if ( CUR.args < 2 ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + CUR.args -= 2; + + A = (FT_UShort)CUR.stack[CUR.args + 1]; + B = CUR.stack[CUR.args]; + + /* XXX: Because some popular fonts contain some invalid DeltaP */ + /* instructions, we simply ignore them when the stacked */ + /* point reference is off limit, rather than returning an */ + /* error. As a delta instruction doesn't change a glyph */ + /* in great ways, this shouldn't be a problem. */ + + if ( !BOUNDS( A, CUR.zp0.n_points ) ) + { + C = ( (FT_ULong)B & 0xF0 ) >> 4; + + switch ( CUR.opcode ) + { + case 0x5D: + break; + + case 0x71: + C += 16; + break; + + case 0x72: + C += 32; + break; + } + + C += CUR.GS.delta_base; + + if ( CURRENT_Ppem() == (FT_Long)C ) + { + B = ( (FT_ULong)B & 0xF ) - 8; + if ( B >= 0 ) + B++; + B = B * 64 / ( 1L << CUR.GS.delta_shift ); + + CUR_Func_move( &CUR.zp0, A, B ); + } + } + else + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + } + + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* DELTACn[]: DELTA exceptions C1, C2, C3 */ + /* Opcode range: 0x73,0x74,0x75 */ + /* Stack: uint32 (2 * uint32)... --> */ + /* */ + static void + Ins_DELTAC( INS_ARG ) + { + FT_ULong nump, k; + FT_ULong A, C; + FT_Long B; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + /* Delta hinting is covered by US Patent 5159668. */ + if ( CUR.face->unpatented_hinting ) + { + FT_Long n = args[0] * 2; + + + if ( CUR.args < n ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + CUR.args -= n; + CUR.new_top = CUR.args; + return; + } +#endif + + nump = (FT_ULong)args[0]; + + for ( k = 1; k <= nump; k++ ) + { + if ( CUR.args < 2 ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + CUR.args -= 2; + + A = (FT_ULong)CUR.stack[CUR.args + 1]; + B = CUR.stack[CUR.args]; + + if ( BOUNDSL( A, CUR.cvtSize ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + { + C = ( (FT_ULong)B & 0xF0 ) >> 4; + + switch ( CUR.opcode ) + { + case 0x73: + break; + + case 0x74: + C += 16; + break; + + case 0x75: + C += 32; + break; + } + + C += CUR.GS.delta_base; + + if ( CURRENT_Ppem() == (FT_Long)C ) + { + B = ( (FT_ULong)B & 0xF ) - 8; + if ( B >= 0 ) + B++; + B = B * 64 / ( 1L << CUR.GS.delta_shift ); + + CUR_Func_move_cvt( A, B ); + } + } + } + + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* MISC. INSTRUCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* GETINFO[]: GET INFOrmation */ + /* Opcode range: 0x88 */ + /* Stack: uint32 --> uint32 */ + /* */ + static void + Ins_GETINFO( INS_ARG ) + { + FT_Long K; + + + K = 0; + + /* We return MS rasterizer version 1.7 for the font scaler. */ + if ( ( args[0] & 1 ) != 0 ) + K = 35; + + /* Has the glyph been rotated? */ + if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated ) + K |= 0x80; + + /* Has the glyph been stretched? */ + if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched ) + K |= 1 << 8; + + /* Are we hinting for grayscale? */ + if ( ( args[0] & 32 ) != 0 && CUR.grayscale ) + K |= 1 << 12; + + args[0] = K; + } + + + static void + Ins_UNKNOWN( INS_ARG ) + { + TT_DefRecord* def = CUR.IDefs; + TT_DefRecord* limit = def + CUR.numIDefs; + + FT_UNUSED_ARG; + + + for ( ; def < limit; def++ ) + { + if ( (FT_Byte)def->opc == CUR.opcode && def->active ) + { + TT_CallRec* call; + + + if ( CUR.callTop >= CUR.callSize ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + call = CUR.callStack + CUR.callTop++; + + call->Caller_Range = CUR.curRange; + call->Caller_IP = CUR.IP + 1; + call->Cur_Count = 1; + call->Cur_Restart = def->start; + + INS_Goto_CodeRange( def->range, def->start ); + + CUR.step_ins = FALSE; + return; + } + } + + CUR.error = TT_Err_Invalid_Opcode; + } + + +#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH + + + static + TInstruction_Function Instruct_Dispatch[256] = + { + /* Opcodes are gathered in groups of 16. */ + /* Please keep the spaces as they are. */ + + /* SVTCA y */ Ins_SVTCA, + /* SVTCA x */ Ins_SVTCA, + /* SPvTCA y */ Ins_SPVTCA, + /* SPvTCA x */ Ins_SPVTCA, + /* SFvTCA y */ Ins_SFVTCA, + /* SFvTCA x */ Ins_SFVTCA, + /* SPvTL // */ Ins_SPVTL, + /* SPvTL + */ Ins_SPVTL, + /* SFvTL // */ Ins_SFVTL, + /* SFvTL + */ Ins_SFVTL, + /* SPvFS */ Ins_SPVFS, + /* SFvFS */ Ins_SFVFS, + /* GPV */ Ins_GPV, + /* GFV */ Ins_GFV, + /* SFvTPv */ Ins_SFVTPV, + /* ISECT */ Ins_ISECT, + + /* SRP0 */ Ins_SRP0, + /* SRP1 */ Ins_SRP1, + /* SRP2 */ Ins_SRP2, + /* SZP0 */ Ins_SZP0, + /* SZP1 */ Ins_SZP1, + /* SZP2 */ Ins_SZP2, + /* SZPS */ Ins_SZPS, + /* SLOOP */ Ins_SLOOP, + /* RTG */ Ins_RTG, + /* RTHG */ Ins_RTHG, + /* SMD */ Ins_SMD, + /* ELSE */ Ins_ELSE, + /* JMPR */ Ins_JMPR, + /* SCvTCi */ Ins_SCVTCI, + /* SSwCi */ Ins_SSWCI, + /* SSW */ Ins_SSW, + + /* DUP */ Ins_DUP, + /* POP */ Ins_POP, + /* CLEAR */ Ins_CLEAR, + /* SWAP */ Ins_SWAP, + /* DEPTH */ Ins_DEPTH, + /* CINDEX */ Ins_CINDEX, + /* MINDEX */ Ins_MINDEX, + /* AlignPTS */ Ins_ALIGNPTS, + /* INS_0x28 */ Ins_UNKNOWN, + /* UTP */ Ins_UTP, + /* LOOPCALL */ Ins_LOOPCALL, + /* CALL */ Ins_CALL, + /* FDEF */ Ins_FDEF, + /* ENDF */ Ins_ENDF, + /* MDAP[0] */ Ins_MDAP, + /* MDAP[1] */ Ins_MDAP, + + /* IUP[0] */ Ins_IUP, + /* IUP[1] */ Ins_IUP, + /* SHP[0] */ Ins_SHP, + /* SHP[1] */ Ins_SHP, + /* SHC[0] */ Ins_SHC, + /* SHC[1] */ Ins_SHC, + /* SHZ[0] */ Ins_SHZ, + /* SHZ[1] */ Ins_SHZ, + /* SHPIX */ Ins_SHPIX, + /* IP */ Ins_IP, + /* MSIRP[0] */ Ins_MSIRP, + /* MSIRP[1] */ Ins_MSIRP, + /* AlignRP */ Ins_ALIGNRP, + /* RTDG */ Ins_RTDG, + /* MIAP[0] */ Ins_MIAP, + /* MIAP[1] */ Ins_MIAP, + + /* NPushB */ Ins_NPUSHB, + /* NPushW */ Ins_NPUSHW, + /* WS */ Ins_WS, + /* RS */ Ins_RS, + /* WCvtP */ Ins_WCVTP, + /* RCvt */ Ins_RCVT, + /* GC[0] */ Ins_GC, + /* GC[1] */ Ins_GC, + /* SCFS */ Ins_SCFS, + /* MD[0] */ Ins_MD, + /* MD[1] */ Ins_MD, + /* MPPEM */ Ins_MPPEM, + /* MPS */ Ins_MPS, + /* FlipON */ Ins_FLIPON, + /* FlipOFF */ Ins_FLIPOFF, + /* DEBUG */ Ins_DEBUG, + + /* LT */ Ins_LT, + /* LTEQ */ Ins_LTEQ, + /* GT */ Ins_GT, + /* GTEQ */ Ins_GTEQ, + /* EQ */ Ins_EQ, + /* NEQ */ Ins_NEQ, + /* ODD */ Ins_ODD, + /* EVEN */ Ins_EVEN, + /* IF */ Ins_IF, + /* EIF */ Ins_EIF, + /* AND */ Ins_AND, + /* OR */ Ins_OR, + /* NOT */ Ins_NOT, + /* DeltaP1 */ Ins_DELTAP, + /* SDB */ Ins_SDB, + /* SDS */ Ins_SDS, + + /* ADD */ Ins_ADD, + /* SUB */ Ins_SUB, + /* DIV */ Ins_DIV, + /* MUL */ Ins_MUL, + /* ABS */ Ins_ABS, + /* NEG */ Ins_NEG, + /* FLOOR */ Ins_FLOOR, + /* CEILING */ Ins_CEILING, + /* ROUND[0] */ Ins_ROUND, + /* ROUND[1] */ Ins_ROUND, + /* ROUND[2] */ Ins_ROUND, + /* ROUND[3] */ Ins_ROUND, + /* NROUND[0] */ Ins_NROUND, + /* NROUND[1] */ Ins_NROUND, + /* NROUND[2] */ Ins_NROUND, + /* NROUND[3] */ Ins_NROUND, + + /* WCvtF */ Ins_WCVTF, + /* DeltaP2 */ Ins_DELTAP, + /* DeltaP3 */ Ins_DELTAP, + /* DeltaCn[0] */ Ins_DELTAC, + /* DeltaCn[1] */ Ins_DELTAC, + /* DeltaCn[2] */ Ins_DELTAC, + /* SROUND */ Ins_SROUND, + /* S45Round */ Ins_S45ROUND, + /* JROT */ Ins_JROT, + /* JROF */ Ins_JROF, + /* ROFF */ Ins_ROFF, + /* INS_0x7B */ Ins_UNKNOWN, + /* RUTG */ Ins_RUTG, + /* RDTG */ Ins_RDTG, + /* SANGW */ Ins_SANGW, + /* AA */ Ins_AA, + + /* FlipPT */ Ins_FLIPPT, + /* FlipRgON */ Ins_FLIPRGON, + /* FlipRgOFF */ Ins_FLIPRGOFF, + /* INS_0x83 */ Ins_UNKNOWN, + /* INS_0x84 */ Ins_UNKNOWN, + /* ScanCTRL */ Ins_SCANCTRL, + /* SDPVTL[0] */ Ins_SDPVTL, + /* SDPVTL[1] */ Ins_SDPVTL, + /* GetINFO */ Ins_GETINFO, + /* IDEF */ Ins_IDEF, + /* ROLL */ Ins_ROLL, + /* MAX */ Ins_MAX, + /* MIN */ Ins_MIN, + /* ScanTYPE */ Ins_SCANTYPE, + /* InstCTRL */ Ins_INSTCTRL, + /* INS_0x8F */ Ins_UNKNOWN, + + /* INS_0x90 */ Ins_UNKNOWN, + /* INS_0x91 */ Ins_UNKNOWN, + /* INS_0x92 */ Ins_UNKNOWN, + /* INS_0x93 */ Ins_UNKNOWN, + /* INS_0x94 */ Ins_UNKNOWN, + /* INS_0x95 */ Ins_UNKNOWN, + /* INS_0x96 */ Ins_UNKNOWN, + /* INS_0x97 */ Ins_UNKNOWN, + /* INS_0x98 */ Ins_UNKNOWN, + /* INS_0x99 */ Ins_UNKNOWN, + /* INS_0x9A */ Ins_UNKNOWN, + /* INS_0x9B */ Ins_UNKNOWN, + /* INS_0x9C */ Ins_UNKNOWN, + /* INS_0x9D */ Ins_UNKNOWN, + /* INS_0x9E */ Ins_UNKNOWN, + /* INS_0x9F */ Ins_UNKNOWN, + + /* INS_0xA0 */ Ins_UNKNOWN, + /* INS_0xA1 */ Ins_UNKNOWN, + /* INS_0xA2 */ Ins_UNKNOWN, + /* INS_0xA3 */ Ins_UNKNOWN, + /* INS_0xA4 */ Ins_UNKNOWN, + /* INS_0xA5 */ Ins_UNKNOWN, + /* INS_0xA6 */ Ins_UNKNOWN, + /* INS_0xA7 */ Ins_UNKNOWN, + /* INS_0xA8 */ Ins_UNKNOWN, + /* INS_0xA9 */ Ins_UNKNOWN, + /* INS_0xAA */ Ins_UNKNOWN, + /* INS_0xAB */ Ins_UNKNOWN, + /* INS_0xAC */ Ins_UNKNOWN, + /* INS_0xAD */ Ins_UNKNOWN, + /* INS_0xAE */ Ins_UNKNOWN, + /* INS_0xAF */ Ins_UNKNOWN, + + /* PushB[0] */ Ins_PUSHB, + /* PushB[1] */ Ins_PUSHB, + /* PushB[2] */ Ins_PUSHB, + /* PushB[3] */ Ins_PUSHB, + /* PushB[4] */ Ins_PUSHB, + /* PushB[5] */ Ins_PUSHB, + /* PushB[6] */ Ins_PUSHB, + /* PushB[7] */ Ins_PUSHB, + /* PushW[0] */ Ins_PUSHW, + /* PushW[1] */ Ins_PUSHW, + /* PushW[2] */ Ins_PUSHW, + /* PushW[3] */ Ins_PUSHW, + /* PushW[4] */ Ins_PUSHW, + /* PushW[5] */ Ins_PUSHW, + /* PushW[6] */ Ins_PUSHW, + /* PushW[7] */ Ins_PUSHW, + + /* MDRP[00] */ Ins_MDRP, + /* MDRP[01] */ Ins_MDRP, + /* MDRP[02] */ Ins_MDRP, + /* MDRP[03] */ Ins_MDRP, + /* MDRP[04] */ Ins_MDRP, + /* MDRP[05] */ Ins_MDRP, + /* MDRP[06] */ Ins_MDRP, + /* MDRP[07] */ Ins_MDRP, + /* MDRP[08] */ Ins_MDRP, + /* MDRP[09] */ Ins_MDRP, + /* MDRP[10] */ Ins_MDRP, + /* MDRP[11] */ Ins_MDRP, + /* MDRP[12] */ Ins_MDRP, + /* MDRP[13] */ Ins_MDRP, + /* MDRP[14] */ Ins_MDRP, + /* MDRP[15] */ Ins_MDRP, + + /* MDRP[16] */ Ins_MDRP, + /* MDRP[17] */ Ins_MDRP, + /* MDRP[18] */ Ins_MDRP, + /* MDRP[19] */ Ins_MDRP, + /* MDRP[20] */ Ins_MDRP, + /* MDRP[21] */ Ins_MDRP, + /* MDRP[22] */ Ins_MDRP, + /* MDRP[23] */ Ins_MDRP, + /* MDRP[24] */ Ins_MDRP, + /* MDRP[25] */ Ins_MDRP, + /* MDRP[26] */ Ins_MDRP, + /* MDRP[27] */ Ins_MDRP, + /* MDRP[28] */ Ins_MDRP, + /* MDRP[29] */ Ins_MDRP, + /* MDRP[30] */ Ins_MDRP, + /* MDRP[31] */ Ins_MDRP, + + /* MIRP[00] */ Ins_MIRP, + /* MIRP[01] */ Ins_MIRP, + /* MIRP[02] */ Ins_MIRP, + /* MIRP[03] */ Ins_MIRP, + /* MIRP[04] */ Ins_MIRP, + /* MIRP[05] */ Ins_MIRP, + /* MIRP[06] */ Ins_MIRP, + /* MIRP[07] */ Ins_MIRP, + /* MIRP[08] */ Ins_MIRP, + /* MIRP[09] */ Ins_MIRP, + /* MIRP[10] */ Ins_MIRP, + /* MIRP[11] */ Ins_MIRP, + /* MIRP[12] */ Ins_MIRP, + /* MIRP[13] */ Ins_MIRP, + /* MIRP[14] */ Ins_MIRP, + /* MIRP[15] */ Ins_MIRP, + + /* MIRP[16] */ Ins_MIRP, + /* MIRP[17] */ Ins_MIRP, + /* MIRP[18] */ Ins_MIRP, + /* MIRP[19] */ Ins_MIRP, + /* MIRP[20] */ Ins_MIRP, + /* MIRP[21] */ Ins_MIRP, + /* MIRP[22] */ Ins_MIRP, + /* MIRP[23] */ Ins_MIRP, + /* MIRP[24] */ Ins_MIRP, + /* MIRP[25] */ Ins_MIRP, + /* MIRP[26] */ Ins_MIRP, + /* MIRP[27] */ Ins_MIRP, + /* MIRP[28] */ Ins_MIRP, + /* MIRP[29] */ Ins_MIRP, + /* MIRP[30] */ Ins_MIRP, + /* MIRP[31] */ Ins_MIRP + }; + + +#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */ + + + /*************************************************************************/ + /* */ + /* RUN */ + /* */ + /* This function executes a run of opcodes. It will exit in the */ + /* following cases: */ + /* */ + /* - Errors (in which case it returns FALSE). */ + /* */ + /* - Reaching the end of the main code range (returns TRUE). */ + /* Reaching the end of a code range within a function call is an */ + /* error. */ + /* */ + /* - After executing one single opcode, if the flag `Instruction_Trap' */ + /* is set to TRUE (returns TRUE). */ + /* */ + /* On exit with TRUE, test IP < CodeSize to know whether it comes from */ + /* an instruction trap or a normal termination. */ + /* */ + /* */ + /* Note: The documented DEBUG opcode pops a value from the stack. This */ + /* behaviour is unsupported; here a DEBUG opcode is always an */ + /* error. */ + /* */ + /* */ + /* THIS IS THE INTERPRETER'S MAIN LOOP. */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + /* documentation is in ttinterp.h */ + + FT_EXPORT_DEF( FT_Error ) + TT_RunIns( TT_ExecContext exc ) + { + FT_Long ins_counter = 0; /* executed instructions counter */ + + +#ifdef TT_CONFIG_OPTION_STATIC_RASTER + cur = *exc; +#endif + + /* set CVT functions */ + CUR.tt_metrics.ratio = 0; + if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem ) + { + /* non-square pixels, use the stretched routines */ + CUR.func_read_cvt = Read_CVT_Stretched; + CUR.func_write_cvt = Write_CVT_Stretched; + CUR.func_move_cvt = Move_CVT_Stretched; + } + else + { + /* square pixels, use normal routines */ + CUR.func_read_cvt = Read_CVT; + CUR.func_write_cvt = Write_CVT; + CUR.func_move_cvt = Move_CVT; + } + + COMPUTE_Funcs(); + COMPUTE_Round( (FT_Byte)exc->GS.round_state ); + + do + { + CUR.opcode = CUR.code[CUR.IP]; + + FT_TRACE7(( " " )); + FT_TRACE7(( opcode_name[CUR.opcode] )); + FT_TRACE7(( "\n" )); + + if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 ) + { + if ( CUR.IP + 1 > CUR.codeSize ) + goto LErrorCodeOverflow_; + + CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1]; + } + + if ( CUR.IP + CUR.length > CUR.codeSize ) + goto LErrorCodeOverflow_; + + /* First, let's check for empty stack and overflow */ + CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 ); + + /* `args' is the top of the stack once arguments have been popped. */ + /* One can also interpret it as the index of the last argument. */ + if ( CUR.args < 0 ) + { + CUR.error = TT_Err_Too_Few_Arguments; + goto LErrorLabel_; + } + + CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 ); + + /* `new_top' is the new top of the stack, after the instruction's */ + /* execution. `top' will be set to `new_top' after the `switch' */ + /* statement. */ + if ( CUR.new_top > CUR.stackSize ) + { + CUR.error = TT_Err_Stack_Overflow; + goto LErrorLabel_; + } + + CUR.step_ins = TRUE; + CUR.error = TT_Err_Ok; + +#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH + + { + FT_Long* args = CUR.stack + CUR.args; + FT_Byte opcode = CUR.opcode; + + +#undef ARRAY_BOUND_ERROR +#define ARRAY_BOUND_ERROR goto Set_Invalid_Ref + + + switch ( opcode ) + { + case 0x00: /* SVTCA y */ + case 0x01: /* SVTCA x */ + case 0x02: /* SPvTCA y */ + case 0x03: /* SPvTCA x */ + case 0x04: /* SFvTCA y */ + case 0x05: /* SFvTCA x */ + { + FT_Short AA, BB; + + + AA = (FT_Short)( ( opcode & 1 ) << 14 ); + BB = (FT_Short)( AA ^ 0x4000 ); + + if ( opcode < 4 ) + { + CUR.GS.projVector.x = AA; + CUR.GS.projVector.y = BB; + + CUR.GS.dualVector.x = AA; + CUR.GS.dualVector.y = BB; + } + else + { + GUESS_VECTOR( projVector ); + } + + if ( ( opcode & 2 ) == 0 ) + { + CUR.GS.freeVector.x = AA; + CUR.GS.freeVector.y = BB; + } + else + { + GUESS_VECTOR( freeVector ); + } + + COMPUTE_Funcs(); + } + break; + + case 0x06: /* SPvTL // */ + case 0x07: /* SPvTL + */ + DO_SPVTL + break; + + case 0x08: /* SFvTL // */ + case 0x09: /* SFvTL + */ + DO_SFVTL + break; + + case 0x0A: /* SPvFS */ + DO_SPVFS + break; + + case 0x0B: /* SFvFS */ + DO_SFVFS + break; + + case 0x0C: /* GPV */ + DO_GPV + break; + + case 0x0D: /* GFV */ + DO_GFV + break; + + case 0x0E: /* SFvTPv */ + DO_SFVTPV + break; + + case 0x0F: /* ISECT */ + Ins_ISECT( EXEC_ARG_ args ); + break; + + case 0x10: /* SRP0 */ + DO_SRP0 + break; + + case 0x11: /* SRP1 */ + DO_SRP1 + break; + + case 0x12: /* SRP2 */ + DO_SRP2 + break; + + case 0x13: /* SZP0 */ + Ins_SZP0( EXEC_ARG_ args ); + break; + + case 0x14: /* SZP1 */ + Ins_SZP1( EXEC_ARG_ args ); + break; + + case 0x15: /* SZP2 */ + Ins_SZP2( EXEC_ARG_ args ); + break; + + case 0x16: /* SZPS */ + Ins_SZPS( EXEC_ARG_ args ); + break; + + case 0x17: /* SLOOP */ + DO_SLOOP + break; + + case 0x18: /* RTG */ + DO_RTG + break; + + case 0x19: /* RTHG */ + DO_RTHG + break; + + case 0x1A: /* SMD */ + DO_SMD + break; + + case 0x1B: /* ELSE */ + Ins_ELSE( EXEC_ARG_ args ); + break; + + case 0x1C: /* JMPR */ + DO_JMPR + break; + + case 0x1D: /* SCVTCI */ + DO_SCVTCI + break; + + case 0x1E: /* SSWCI */ + DO_SSWCI + break; + + case 0x1F: /* SSW */ + DO_SSW + break; + + case 0x20: /* DUP */ + DO_DUP + break; + + case 0x21: /* POP */ + /* nothing :-) */ + break; + + case 0x22: /* CLEAR */ + DO_CLEAR + break; + + case 0x23: /* SWAP */ + DO_SWAP + break; + + case 0x24: /* DEPTH */ + DO_DEPTH + break; + + case 0x25: /* CINDEX */ + DO_CINDEX + break; + + case 0x26: /* MINDEX */ + Ins_MINDEX( EXEC_ARG_ args ); + break; + + case 0x27: /* ALIGNPTS */ + Ins_ALIGNPTS( EXEC_ARG_ args ); + break; + + case 0x28: /* ???? */ + Ins_UNKNOWN( EXEC_ARG_ args ); + break; + + case 0x29: /* UTP */ + Ins_UTP( EXEC_ARG_ args ); + break; + + case 0x2A: /* LOOPCALL */ + Ins_LOOPCALL( EXEC_ARG_ args ); + break; + + case 0x2B: /* CALL */ + Ins_CALL( EXEC_ARG_ args ); + break; + + case 0x2C: /* FDEF */ + Ins_FDEF( EXEC_ARG_ args ); + break; + + case 0x2D: /* ENDF */ + Ins_ENDF( EXEC_ARG_ args ); + break; + + case 0x2E: /* MDAP */ + case 0x2F: /* MDAP */ + Ins_MDAP( EXEC_ARG_ args ); + break; + + + case 0x30: /* IUP */ + case 0x31: /* IUP */ + Ins_IUP( EXEC_ARG_ args ); + break; + + case 0x32: /* SHP */ + case 0x33: /* SHP */ + Ins_SHP( EXEC_ARG_ args ); + break; + + case 0x34: /* SHC */ + case 0x35: /* SHC */ + Ins_SHC( EXEC_ARG_ args ); + break; + + case 0x36: /* SHZ */ + case 0x37: /* SHZ */ + Ins_SHZ( EXEC_ARG_ args ); + break; + + case 0x38: /* SHPIX */ + Ins_SHPIX( EXEC_ARG_ args ); + break; + + case 0x39: /* IP */ + Ins_IP( EXEC_ARG_ args ); + break; + + case 0x3A: /* MSIRP */ + case 0x3B: /* MSIRP */ + Ins_MSIRP( EXEC_ARG_ args ); + break; + + case 0x3C: /* AlignRP */ + Ins_ALIGNRP( EXEC_ARG_ args ); + break; + + case 0x3D: /* RTDG */ + DO_RTDG + break; + + case 0x3E: /* MIAP */ + case 0x3F: /* MIAP */ + Ins_MIAP( EXEC_ARG_ args ); + break; + + case 0x40: /* NPUSHB */ + Ins_NPUSHB( EXEC_ARG_ args ); + break; + + case 0x41: /* NPUSHW */ + Ins_NPUSHW( EXEC_ARG_ args ); + break; + + case 0x42: /* WS */ + DO_WS + break; + + Set_Invalid_Ref: + CUR.error = TT_Err_Invalid_Reference; + break; + + case 0x43: /* RS */ + DO_RS + break; + + case 0x44: /* WCVTP */ + DO_WCVTP + break; + + case 0x45: /* RCVT */ + DO_RCVT + break; + + case 0x46: /* GC */ + case 0x47: /* GC */ + Ins_GC( EXEC_ARG_ args ); + break; + + case 0x48: /* SCFS */ + Ins_SCFS( EXEC_ARG_ args ); + break; + + case 0x49: /* MD */ + case 0x4A: /* MD */ + Ins_MD( EXEC_ARG_ args ); + break; + + case 0x4B: /* MPPEM */ + DO_MPPEM + break; + + case 0x4C: /* MPS */ + DO_MPS + break; + + case 0x4D: /* FLIPON */ + DO_FLIPON + break; + + case 0x4E: /* FLIPOFF */ + DO_FLIPOFF + break; + + case 0x4F: /* DEBUG */ + DO_DEBUG + break; + + case 0x50: /* LT */ + DO_LT + break; + + case 0x51: /* LTEQ */ + DO_LTEQ + break; + + case 0x52: /* GT */ + DO_GT + break; + + case 0x53: /* GTEQ */ + DO_GTEQ + break; + + case 0x54: /* EQ */ + DO_EQ + break; + + case 0x55: /* NEQ */ + DO_NEQ + break; + + case 0x56: /* ODD */ + DO_ODD + break; + + case 0x57: /* EVEN */ + DO_EVEN + break; + + case 0x58: /* IF */ + Ins_IF( EXEC_ARG_ args ); + break; + + case 0x59: /* EIF */ + /* do nothing */ + break; + + case 0x5A: /* AND */ + DO_AND + break; + + case 0x5B: /* OR */ + DO_OR + break; + + case 0x5C: /* NOT */ + DO_NOT + break; + + case 0x5D: /* DELTAP1 */ + Ins_DELTAP( EXEC_ARG_ args ); + break; + + case 0x5E: /* SDB */ + DO_SDB + break; + + case 0x5F: /* SDS */ + DO_SDS + break; + + case 0x60: /* ADD */ + DO_ADD + break; + + case 0x61: /* SUB */ + DO_SUB + break; + + case 0x62: /* DIV */ + DO_DIV + break; + + case 0x63: /* MUL */ + DO_MUL + break; + + case 0x64: /* ABS */ + DO_ABS + break; + + case 0x65: /* NEG */ + DO_NEG + break; + + case 0x66: /* FLOOR */ + DO_FLOOR + break; + + case 0x67: /* CEILING */ + DO_CEILING + break; + + case 0x68: /* ROUND */ + case 0x69: /* ROUND */ + case 0x6A: /* ROUND */ + case 0x6B: /* ROUND */ + DO_ROUND + break; + + case 0x6C: /* NROUND */ + case 0x6D: /* NROUND */ + case 0x6E: /* NRRUND */ + case 0x6F: /* NROUND */ + DO_NROUND + break; + + case 0x70: /* WCVTF */ + DO_WCVTF + break; + + case 0x71: /* DELTAP2 */ + case 0x72: /* DELTAP3 */ + Ins_DELTAP( EXEC_ARG_ args ); + break; + + case 0x73: /* DELTAC0 */ + case 0x74: /* DELTAC1 */ + case 0x75: /* DELTAC2 */ + Ins_DELTAC( EXEC_ARG_ args ); + break; + + case 0x76: /* SROUND */ + DO_SROUND + break; + + case 0x77: /* S45Round */ + DO_S45ROUND + break; + + case 0x78: /* JROT */ + DO_JROT + break; + + case 0x79: /* JROF */ + DO_JROF + break; + + case 0x7A: /* ROFF */ + DO_ROFF + break; + + case 0x7B: /* ???? */ + Ins_UNKNOWN( EXEC_ARG_ args ); + break; + + case 0x7C: /* RUTG */ + DO_RUTG + break; + + case 0x7D: /* RDTG */ + DO_RDTG + break; + + case 0x7E: /* SANGW */ + case 0x7F: /* AA */ + /* nothing - obsolete */ + break; + + case 0x80: /* FLIPPT */ + Ins_FLIPPT( EXEC_ARG_ args ); + break; + + case 0x81: /* FLIPRGON */ + Ins_FLIPRGON( EXEC_ARG_ args ); + break; + + case 0x82: /* FLIPRGOFF */ + Ins_FLIPRGOFF( EXEC_ARG_ args ); + break; + + case 0x83: /* UNKNOWN */ + case 0x84: /* UNKNOWN */ + Ins_UNKNOWN( EXEC_ARG_ args ); + break; + + case 0x85: /* SCANCTRL */ + Ins_SCANCTRL( EXEC_ARG_ args ); + break; + + case 0x86: /* SDPVTL */ + case 0x87: /* SDPVTL */ + Ins_SDPVTL( EXEC_ARG_ args ); + break; + + case 0x88: /* GETINFO */ + Ins_GETINFO( EXEC_ARG_ args ); + break; + + case 0x89: /* IDEF */ + Ins_IDEF( EXEC_ARG_ args ); + break; + + case 0x8A: /* ROLL */ + Ins_ROLL( EXEC_ARG_ args ); + break; + + case 0x8B: /* MAX */ + DO_MAX + break; + + case 0x8C: /* MIN */ + DO_MIN + break; + + case 0x8D: /* SCANTYPE */ + Ins_SCANTYPE( EXEC_ARG_ args ); + break; + + case 0x8E: /* INSTCTRL */ + Ins_INSTCTRL( EXEC_ARG_ args ); + break; + + case 0x8F: + Ins_UNKNOWN( EXEC_ARG_ args ); + break; + + default: + if ( opcode >= 0xE0 ) + Ins_MIRP( EXEC_ARG_ args ); + else if ( opcode >= 0xC0 ) + Ins_MDRP( EXEC_ARG_ args ); + else if ( opcode >= 0xB8 ) + Ins_PUSHW( EXEC_ARG_ args ); + else if ( opcode >= 0xB0 ) + Ins_PUSHB( EXEC_ARG_ args ); + else + Ins_UNKNOWN( EXEC_ARG_ args ); + } + + } + +#else + + Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] ); + +#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */ + + if ( CUR.error != TT_Err_Ok ) + { + switch ( CUR.error ) + { + case TT_Err_Invalid_Opcode: /* looking for redefined instructions */ + { + TT_DefRecord* def = CUR.IDefs; + TT_DefRecord* limit = def + CUR.numIDefs; + + + for ( ; def < limit; def++ ) + { + if ( def->active && CUR.opcode == (FT_Byte)def->opc ) + { + TT_CallRec* callrec; + + + if ( CUR.callTop >= CUR.callSize ) + { + CUR.error = TT_Err_Invalid_Reference; + goto LErrorLabel_; + } + + callrec = &CUR.callStack[CUR.callTop]; + + callrec->Caller_Range = CUR.curRange; + callrec->Caller_IP = CUR.IP + 1; + callrec->Cur_Count = 1; + callrec->Cur_Restart = def->start; + + if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE ) + goto LErrorLabel_; + + goto LSuiteLabel_; + } + } + } + + CUR.error = TT_Err_Invalid_Opcode; + goto LErrorLabel_; + +#if 0 + break; /* Unreachable code warning suppression. */ + /* Leave to remind in case a later change the editor */ + /* to consider break; */ +#endif + + default: + goto LErrorLabel_; + +#if 0 + break; +#endif + } + } + + CUR.top = CUR.new_top; + + if ( CUR.step_ins ) + CUR.IP += CUR.length; + + /* increment instruction counter and check if we didn't */ + /* run this program for too long (e.g. infinite loops). */ + if ( ++ins_counter > MAX_RUNNABLE_OPCODES ) + return TT_Err_Execution_Too_Long; + + LSuiteLabel_: + if ( CUR.IP >= CUR.codeSize ) + { + if ( CUR.callTop > 0 ) + { + CUR.error = TT_Err_Code_Overflow; + goto LErrorLabel_; + } + else + goto LNo_Error_; + } + } while ( !CUR.instruction_trap ); + + LNo_Error_: + +#ifdef TT_CONFIG_OPTION_STATIC_RASTER + *exc = cur; +#endif + + return TT_Err_Ok; + + LErrorCodeOverflow_: + CUR.error = TT_Err_Code_Overflow; + + LErrorLabel_: + +#ifdef TT_CONFIG_OPTION_STATIC_RASTER + *exc = cur; +#endif + + return CUR.error; + } + + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttinterp.h b/android/jni/ndk_modules/freetype/src/truetype/ttinterp.h new file mode 100644 index 00000000..c480dfa5 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttinterp.h @@ -0,0 +1,319 @@ +/***************************************************************************/ +/* */ +/* ttinterp.h */ +/* */ +/* TrueType bytecode interpreter (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTINTERP_H__ +#define __TTINTERP_H__ + +#include <ft2build.h> +#include "ttobjs.h" + + +FT_BEGIN_HEADER + + +#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */ + +#define EXEC_OP_ TT_ExecContext exc, +#define EXEC_OP TT_ExecContext exc +#define EXEC_ARG_ exc, +#define EXEC_ARG exc + +#else /* static implementation */ + +#define EXEC_OP_ /* void */ +#define EXEC_OP /* void */ +#define EXEC_ARG_ /* void */ +#define EXEC_ARG /* void */ + +#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* Rounding mode constants. */ + /* */ +#define TT_Round_Off 5 +#define TT_Round_To_Half_Grid 0 +#define TT_Round_To_Grid 1 +#define TT_Round_To_Double_Grid 2 +#define TT_Round_Up_To_Grid 4 +#define TT_Round_Down_To_Grid 3 +#define TT_Round_Super 6 +#define TT_Round_Super_45 7 + + + /*************************************************************************/ + /* */ + /* Function types used by the interpreter, depending on various modes */ + /* (e.g. the rounding mode, whether to render a vertical or horizontal */ + /* line etc). */ + /* */ + /*************************************************************************/ + + /* Rounding function */ + typedef FT_F26Dot6 + (*TT_Round_Func)( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ); + + /* Point displacement along the freedom vector routine */ + typedef void + (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ); + + /* Distance projection along one of the projection vectors */ + typedef FT_F26Dot6 + (*TT_Project_Func)( EXEC_OP_ FT_Pos dx, + FT_Pos dy ); + + /* reading a cvt value. Take care of non-square pixels if necessary */ + typedef FT_F26Dot6 + (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong idx ); + + /* setting or moving a cvt value. Take care of non-square pixels */ + /* if necessary */ + typedef void + (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ); + + + /*************************************************************************/ + /* */ + /* This structure defines a call record, used to manage function calls. */ + /* */ + typedef struct TT_CallRec_ + { + FT_Int Caller_Range; + FT_Long Caller_IP; + FT_Long Cur_Count; + FT_Long Cur_Restart; + + } TT_CallRec, *TT_CallStack; + + + /*************************************************************************/ + /* */ + /* The main structure for the interpreter which collects all necessary */ + /* variables and states. */ + /* */ + typedef struct TT_ExecContextRec_ + { + TT_Face face; + TT_Size size; + FT_Memory memory; + + /* instructions state */ + + FT_Error error; /* last execution error */ + + FT_Long top; /* top of exec. stack */ + + FT_UInt stackSize; /* size of exec. stack */ + FT_Long* stack; /* current exec. stack */ + + FT_Long args; + FT_UInt new_top; /* new top after exec. */ + + TT_GlyphZoneRec zp0, /* zone records */ + zp1, + zp2, + pts, + twilight; + + FT_Size_Metrics metrics; + TT_Size_Metrics tt_metrics; /* size metrics */ + + TT_GraphicsState GS; /* current graphics state */ + + FT_Int curRange; /* current code range number */ + FT_Byte* code; /* current code range */ + FT_Long IP; /* current instruction pointer */ + FT_Long codeSize; /* size of current range */ + + FT_Byte opcode; /* current opcode */ + FT_Int length; /* length of current opcode */ + + FT_Bool step_ins; /* true if the interpreter must */ + /* increment IP after ins. exec */ + FT_ULong cvtSize; + FT_Long* cvt; + + FT_UInt glyphSize; /* glyph instructions buffer size */ + FT_Byte* glyphIns; /* glyph instructions buffer */ + + FT_UInt numFDefs; /* number of function defs */ + FT_UInt maxFDefs; /* maximum number of function defs */ + TT_DefArray FDefs; /* table of FDefs entries */ + + FT_UInt numIDefs; /* number of instruction defs */ + FT_UInt maxIDefs; /* maximum number of ins defs */ + TT_DefArray IDefs; /* table of IDefs entries */ + + FT_UInt maxFunc; /* maximum function index */ + FT_UInt maxIns; /* maximum instruction index */ + + FT_Int callTop, /* top of call stack during execution */ + callSize; /* size of call stack */ + TT_CallStack callStack; /* call stack */ + + FT_UShort maxPoints; /* capacity of this context's `pts' */ + FT_Short maxContours; /* record, expressed in points and */ + /* contours. */ + + TT_CodeRangeTable codeRangeTable; /* table of valid code ranges */ + /* useful for the debugger */ + + FT_UShort storeSize; /* size of current storage */ + FT_Long* storage; /* storage area */ + + FT_F26Dot6 period; /* values used for the */ + FT_F26Dot6 phase; /* `SuperRounding' */ + FT_F26Dot6 threshold; + +#if 0 + /* this seems to be unused */ + FT_Int cur_ppem; /* ppem along the current proj vector */ +#endif + + FT_Bool instruction_trap; /* If `True', the interpreter will */ + /* exit after each instruction */ + + TT_GraphicsState default_GS; /* graphics state resulting from */ + /* the prep program */ + FT_Bool is_composite; /* true if the glyph is composite */ + FT_Bool pedantic_hinting; /* true if pedantic interpretation */ + + /* latest interpreter additions */ + + FT_Long F_dot_P; /* dot product of freedom and projection */ + /* vectors */ + TT_Round_Func func_round; /* current rounding function */ + + TT_Project_Func func_project, /* current projection function */ + func_dualproj, /* current dual proj. function */ + func_freeProj; /* current freedom proj. func */ + + TT_Move_Func func_move; /* current point move function */ + TT_Move_Func func_move_orig; /* move original position function */ + + TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */ + TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */ + TT_Set_CVT_Func func_move_cvt; /* incr a cvt entry (in pixels) */ + + FT_Bool grayscale; /* are we hinting for grayscale? */ + + } TT_ExecContextRec; + + + extern const TT_GraphicsState tt_default_graphics_state; + + + FT_LOCAL( FT_Error ) + TT_Goto_CodeRange( TT_ExecContext exec, + FT_Int range, + FT_Long IP ); + + FT_LOCAL( FT_Error ) + TT_Set_CodeRange( TT_ExecContext exec, + FT_Int range, + void* base, + FT_Long length ); + + FT_LOCAL( FT_Error ) + TT_Clear_CodeRange( TT_ExecContext exec, + FT_Int range ); + + + FT_LOCAL( FT_Error ) + Update_Max( FT_Memory memory, + FT_ULong* size, + FT_Long multiplier, + void* _pbuff, + FT_ULong new_max ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_New_Context */ + /* */ + /* <Description> */ + /* Queries the face context for a given font. Note that there is */ + /* now a _single_ execution context in the TrueType driver which is */ + /* shared among faces. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Return> */ + /* A handle to the execution context. Initialized for `face'. */ + /* */ + /* <Note> */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_EXPORT( TT_ExecContext ) + TT_New_Context( TT_Driver driver ); + + FT_LOCAL( FT_Error ) + TT_Done_Context( TT_ExecContext exec ); + + FT_LOCAL( FT_Error ) + TT_Load_Context( TT_ExecContext exec, + TT_Face face, + TT_Size size ); + + FT_LOCAL( FT_Error ) + TT_Save_Context( TT_ExecContext exec, + TT_Size ins ); + + FT_LOCAL( FT_Error ) + TT_Run_Context( TT_ExecContext exec, + FT_Bool debug ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_RunIns */ + /* */ + /* <Description> */ + /* Executes one or more instruction in the execution context. This */ + /* is the main function of the TrueType opcode interpreter. */ + /* */ + /* <Input> */ + /* exec :: A handle to the target execution context. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only the object manager and debugger should call this function. */ + /* */ + /* This function is publicly exported because it is directly */ + /* invoked by the TrueType debugger. */ + /* */ + FT_EXPORT( FT_Error ) + TT_RunIns( TT_ExecContext exec ); + + +FT_END_HEADER + +#endif /* __TTINTERP_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttobjs.c b/android/jni/ndk_modules/freetype/src/truetype/ttobjs.c new file mode 100644 index 00000000..11d662d2 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttobjs.c @@ -0,0 +1,951 @@ +/***************************************************************************/ +/* */ +/* ttobjs.c */ +/* */ +/* Objects manager (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_SFNT_H + +#include "ttgload.h" +#include "ttpload.h" + +#include "tterrors.h" + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.h" +#endif + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING +#include FT_TRUETYPE_UNPATENTED_H +#endif + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttobjs + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* GLYPH ZONE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_glyphzone_done */ + /* */ + /* <Description> */ + /* Deallocate a glyph zone. */ + /* */ + /* <Input> */ + /* zone :: A pointer to the target glyph zone. */ + /* */ + FT_LOCAL_DEF( void ) + tt_glyphzone_done( TT_GlyphZone zone ) + { + FT_Memory memory = zone->memory; + + + if ( memory ) + { + FT_FREE( zone->contours ); + FT_FREE( zone->tags ); + FT_FREE( zone->cur ); + FT_FREE( zone->org ); + FT_FREE( zone->orus ); + + zone->max_points = zone->n_points = 0; + zone->max_contours = zone->n_contours = 0; + zone->memory = NULL; + } + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_glyphzone_new */ + /* */ + /* <Description> */ + /* Allocate a new glyph zone. */ + /* */ + /* <Input> */ + /* memory :: A handle to the current memory object. */ + /* */ + /* maxPoints :: The capacity of glyph zone in points. */ + /* */ + /* maxContours :: The capacity of glyph zone in contours. */ + /* */ + /* <Output> */ + /* zone :: A pointer to the target glyph zone record. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_glyphzone_new( FT_Memory memory, + FT_UShort maxPoints, + FT_Short maxContours, + TT_GlyphZone zone ) + { + FT_Error error; + + + FT_MEM_ZERO( zone, sizeof ( *zone ) ); + zone->memory = memory; + + if ( FT_NEW_ARRAY( zone->org, maxPoints ) || + FT_NEW_ARRAY( zone->cur, maxPoints ) || + FT_NEW_ARRAY( zone->orus, maxPoints ) || + FT_NEW_ARRAY( zone->tags, maxPoints ) || + FT_NEW_ARRAY( zone->contours, maxContours ) ) + { + tt_glyphzone_done( zone ); + } + else + { + zone->max_points = maxPoints; + zone->max_contours = maxContours; + } + + return error; + } +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* Compare the face with a list of well-known `tricky' fonts. */ + /* This list shall be expanded as we find more of them. */ + + static FT_Bool + tt_check_trickyness( FT_String* name ) + { +#define TRICK_NAMES_MAX_CHARACTERS 16 +#define TRICK_NAMES_COUNT 7 + static const char trick_names[TRICK_NAMES_COUNT][TRICK_NAMES_MAX_CHARACTERS+1] = + { + "DFKaiSho-SB", /* dfkaisb.ttf */ + "DFKaiShu", + "DFKai-SB", /* kaiu.ttf */ + "HuaTianSongTi?", /* htst3.ttf */ + "MingLiU", /* mingliu.ttf & mingliu.ttc */ + "PMingLiU", /* mingliu.ttc */ + "MingLi43", /* mingli.ttf */ + }; + int nn; + + + if ( !name ) + return FALSE; + + /* Note that we only check the face name at the moment; it might */ + /* be worth to do more checks for a few special cases. */ + for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ ) + if ( ft_strstr( name, trick_names[nn] ) ) + return TRUE; + + return FALSE; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_init */ + /* */ + /* <Description> */ + /* Initialize a given TrueType face object. */ + /* */ + /* <Input> */ + /* stream :: The source font stream. */ + /* */ + /* face_index :: The index of the font face in the resource. */ + /* */ + /* num_params :: Number of additional generic parameters. Ignored. */ + /* */ + /* params :: Additional generic parameters. Ignored. */ + /* */ + /* <InOut> */ + /* face :: The newly built face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_init( FT_Stream stream, + FT_Face ttface, /* TT_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Library library; + SFNT_Service sfnt; + TT_Face face = (TT_Face)ttface; + + + library = ttface->driver->root.library; + sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); + if ( !sfnt ) + goto Bad_Format; + + /* create input stream from resource */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + /* check that we have a valid TrueType file */ + error = sfnt->init_face( stream, face, face_index, num_params, params ); + if ( error ) + goto Exit; + + /* We must also be able to accept Mac/GX fonts, as well as OT ones. */ + /* The 0x00020000 tag is completely undocumented; some fonts from */ + /* Arphic made for Chinese Windows 3.1 have this. */ + if ( face->format_tag != 0x00010000L && /* MS fonts */ + face->format_tag != 0x00020000L && /* CJK fonts for Win 3.1 */ + face->format_tag != TTAG_true ) /* Mac fonts */ + { + FT_TRACE2(( "[not a valid TTF font]\n" )); + goto Bad_Format; + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + ttface->face_flags |= FT_FACE_FLAG_HINTER; +#endif + + /* If we are performing a simple font format check, exit immediately. */ + if ( face_index < 0 ) + return TT_Err_Ok; + + /* Load font directory */ + error = sfnt->load_face( stream, face, face_index, num_params, params ); + if ( error ) + goto Exit; + + if ( tt_check_trickyness( ttface->family_name ) ) + ttface->face_flags |= FT_FACE_FLAG_TRICKY; + + error = tt_face_load_hdmx( face, stream ); + if ( error ) + goto Exit; + + if ( FT_IS_SCALABLE( ttface ) ) + { + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( !ttface->internal->incremental_interface ) + error = tt_face_load_loca( face, stream ); + if ( !error ) + error = tt_face_load_cvt( face, stream ); + if ( !error ) + error = tt_face_load_fpgm( face, stream ); + if ( !error ) + error = tt_face_load_prep( face, stream ); + +#else + + if ( !error ) + error = tt_face_load_loca( face, stream ); + if ( !error ) + error = tt_face_load_cvt( face, stream ); + if ( !error ) + error = tt_face_load_fpgm( face, stream ); + if ( !error ) + error = tt_face_load_prep( face, stream ); + +#endif + + } + +#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \ + !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER ) + + { + FT_Bool unpatented_hinting; + int i; + + + /* Determine whether unpatented hinting is to be used for this face. */ + unpatented_hinting = FT_BOOL + ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL ); + + for ( i = 0; i < num_params && !face->unpatented_hinting; i++ ) + if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING ) + unpatented_hinting = TRUE; + + if ( !unpatented_hinting ) + ttface->internal->ignore_unpatented_hinter = TRUE; + } + +#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING && + !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + /* initialize standard glyph loading routines */ + TT_Init_Glyph_Loading( face ); + + Exit: + return error; + + Bad_Format: + error = TT_Err_Unknown_File_Format; + goto Exit; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_done */ + /* */ + /* <Description> */ + /* Finalize a given face object. */ + /* */ + /* <Input> */ + /* face :: A pointer to the face object to destroy. */ + /* */ + FT_LOCAL_DEF( void ) + tt_face_done( FT_Face ttface ) /* TT_Face */ + { + TT_Face face = (TT_Face)ttface; + FT_Memory memory; + FT_Stream stream; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = ttface->memory; + stream = ttface->stream; + sfnt = (SFNT_Service)face->sfnt; + + /* for `extended TrueType formats' (i.e. compressed versions) */ + if ( face->extra.finalizer ) + face->extra.finalizer( face->extra.data ); + + if ( sfnt ) + sfnt->done_face( face ); + + /* freeing the locations table */ + tt_face_done_loca( face ); + + tt_face_free_hdmx( face ); + + /* freeing the CVT */ + FT_FREE( face->cvt ); + face->cvt_size = 0; + + /* freeing the programs */ + FT_FRAME_RELEASE( face->font_program ); + FT_FRAME_RELEASE( face->cvt_program ); + face->font_program_size = 0; + face->cvt_program_size = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + tt_done_blend( memory, face->blend ); + face->blend = NULL; +#endif + } + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /*************************************************************************/ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_size_run_fpgm */ + /* */ + /* <Description> */ + /* Run the font program. */ + /* */ + /* <Input> */ + /* size :: A handle to the size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_run_fpgm( TT_Size size ) + { + TT_Face face = (TT_Face)size->root.face; + TT_ExecContext exec; + FT_Error error; + + + /* debugging instances have their own context */ + if ( size->debug ) + exec = size->context; + else + exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; + + if ( !exec ) + return TT_Err_Could_Not_Find_Context; + + TT_Load_Context( exec, face, size ); + + exec->callTop = 0; + exec->top = 0; + + exec->period = 64; + exec->phase = 0; + exec->threshold = 0; + + exec->instruction_trap = FALSE; + exec->F_dot_P = 0x10000L; + + { + FT_Size_Metrics* metrics = &exec->metrics; + TT_Size_Metrics* tt_metrics = &exec->tt_metrics; + + + metrics->x_ppem = 0; + metrics->y_ppem = 0; + metrics->x_scale = 0; + metrics->y_scale = 0; + + tt_metrics->ppem = 0; + tt_metrics->scale = 0; + tt_metrics->ratio = 0x10000L; + } + + /* allow font program execution */ + TT_Set_CodeRange( exec, + tt_coderange_font, + face->font_program, + face->font_program_size ); + + /* disable CVT and glyph programs coderange */ + TT_Clear_CodeRange( exec, tt_coderange_cvt ); + TT_Clear_CodeRange( exec, tt_coderange_glyph ); + + if ( face->font_program_size > 0 ) + { + error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 ); + + if ( !error ) + error = face->interpreter( exec ); + } + else + error = TT_Err_Ok; + + if ( !error ) + TT_Save_Context( exec, size ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_size_run_prep */ + /* */ + /* <Description> */ + /* Run the control value program. */ + /* */ + /* <Input> */ + /* size :: A handle to the size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_run_prep( TT_Size size ) + { + TT_Face face = (TT_Face)size->root.face; + TT_ExecContext exec; + FT_Error error; + + + /* debugging instances have their own context */ + if ( size->debug ) + exec = size->context; + else + exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; + + if ( !exec ) + return TT_Err_Could_Not_Find_Context; + + TT_Load_Context( exec, face, size ); + + exec->callTop = 0; + exec->top = 0; + + exec->instruction_trap = FALSE; + + TT_Set_CodeRange( exec, + tt_coderange_cvt, + face->cvt_program, + face->cvt_program_size ); + + TT_Clear_CodeRange( exec, tt_coderange_glyph ); + + if ( face->cvt_program_size > 0 ) + { + error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 ); + + if ( !error && !size->debug ) + error = face->interpreter( exec ); + } + else + error = TT_Err_Ok; + + /* save as default graphics state */ + size->GS = exec->GS; + + TT_Save_Context( exec, size ); + + return error; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + static void + tt_size_done_bytecode( FT_Size ftsize ) + { + TT_Size size = (TT_Size)ftsize; + TT_Face face = (TT_Face)ftsize->face; + FT_Memory memory = face->root.memory; + + + if ( size->debug ) + { + /* the debug context must be deleted by the debugger itself */ + size->context = NULL; + size->debug = FALSE; + } + + FT_FREE( size->cvt ); + size->cvt_size = 0; + + /* free storage area */ + FT_FREE( size->storage ); + size->storage_size = 0; + + /* twilight zone */ + tt_glyphzone_done( &size->twilight ); + + FT_FREE( size->function_defs ); + FT_FREE( size->instruction_defs ); + + size->num_function_defs = 0; + size->max_function_defs = 0; + size->num_instruction_defs = 0; + size->max_instruction_defs = 0; + + size->max_func = 0; + size->max_ins = 0; + + size->bytecode_ready = 0; + size->cvt_ready = 0; + } + + + /* Initialize bytecode-related fields in the size object. */ + /* We do this only if bytecode interpretation is really needed. */ + static FT_Error + tt_size_init_bytecode( FT_Size ftsize ) + { + FT_Error error; + TT_Size size = (TT_Size)ftsize; + TT_Face face = (TT_Face)ftsize->face; + FT_Memory memory = face->root.memory; + FT_Int i; + + FT_UShort n_twilight; + TT_MaxProfile* maxp = &face->max_profile; + + + size->bytecode_ready = 1; + size->cvt_ready = 0; + + size->max_function_defs = maxp->maxFunctionDefs; + size->max_instruction_defs = maxp->maxInstructionDefs; + + size->num_function_defs = 0; + size->num_instruction_defs = 0; + + size->max_func = 0; + size->max_ins = 0; + + size->cvt_size = face->cvt_size; + size->storage_size = maxp->maxStorage; + + /* Set default metrics */ + { + TT_Size_Metrics* metrics = &size->ttmetrics; + + + metrics->rotated = FALSE; + metrics->stretched = FALSE; + + /* set default compensation (all 0) */ + for ( i = 0; i < 4; i++ ) + metrics->compensations[i] = 0; + } + + /* allocate function defs, instruction defs, cvt, and storage area */ + if ( FT_NEW_ARRAY( size->function_defs, size->max_function_defs ) || + FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) || + FT_NEW_ARRAY( size->cvt, size->cvt_size ) || + FT_NEW_ARRAY( size->storage, size->storage_size ) ) + goto Exit; + + /* reserve twilight zone */ + n_twilight = maxp->maxTwilightPoints; + + /* there are 4 phantom points (do we need this?) */ + n_twilight += 4; + + error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight ); + if ( error ) + goto Exit; + + size->twilight.n_points = n_twilight; + + size->GS = tt_default_graphics_state; + + /* set `face->interpreter' according to the debug hook present */ + { + FT_Library library = face->root.driver->root.library; + + + face->interpreter = (TT_Interpreter) + library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE]; + if ( !face->interpreter ) + face->interpreter = (TT_Interpreter)TT_RunIns; + } + + /* Fine, now run the font program! */ + error = tt_size_run_fpgm( size ); + + Exit: + if ( error ) + tt_size_done_bytecode( ftsize ); + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_size_ready_bytecode( TT_Size size ) + { + FT_Error error = TT_Err_Ok; + + + if ( !size->bytecode_ready ) + { + error = tt_size_init_bytecode( (FT_Size)size ); + if ( error ) + goto Exit; + } + + /* rescale CVT when needed */ + if ( !size->cvt_ready ) + { + FT_UInt i; + TT_Face face = (TT_Face)size->root.face; + + + /* Scale the cvt values to the new ppem. */ + /* We use by default the y ppem to scale the CVT. */ + for ( i = 0; i < size->cvt_size; i++ ) + size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); + + /* all twilight points are originally zero */ + for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ ) + { + size->twilight.org[i].x = 0; + size->twilight.org[i].y = 0; + size->twilight.cur[i].x = 0; + size->twilight.cur[i].y = 0; + } + + /* clear storage area */ + for ( i = 0; i < (FT_UInt)size->storage_size; i++ ) + size->storage[i] = 0; + + size->GS = tt_default_graphics_state; + + error = tt_size_run_prep( size ); + if ( !error ) + size->cvt_ready = 1; + } + + Exit: + return error; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_size_init */ + /* */ + /* <Description> */ + /* Initialize a new TrueType size object. */ + /* */ + /* <InOut> */ + /* size :: A handle to the size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_init( FT_Size ttsize ) /* TT_Size */ + { + TT_Size size = (TT_Size)ttsize; + FT_Error error = TT_Err_Ok; + +#ifdef TT_USE_BYTECODE_INTERPRETER + size->bytecode_ready = 0; + size->cvt_ready = 0; +#endif + + size->ttmetrics.valid = FALSE; + size->strike_index = 0xFFFFFFFFUL; + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_size_done */ + /* */ + /* <Description> */ + /* The TrueType size object finalizer. */ + /* */ + /* <Input> */ + /* size :: A handle to the target size object. */ + /* */ + FT_LOCAL_DEF( void ) + tt_size_done( FT_Size ttsize ) /* TT_Size */ + { + TT_Size size = (TT_Size)ttsize; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + if ( size->bytecode_ready ) + tt_size_done_bytecode( ttsize ); +#endif + + size->ttmetrics.valid = FALSE; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_size_reset */ + /* */ + /* <Description> */ + /* Reset a TrueType size when resolutions and character dimensions */ + /* have been changed. */ + /* */ + /* <Input> */ + /* size :: A handle to the target size object. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_reset( TT_Size size ) + { + TT_Face face; + FT_Error error = TT_Err_Ok; + FT_Size_Metrics* metrics; + + + size->ttmetrics.valid = FALSE; + + face = (TT_Face)size->root.face; + + metrics = &size->metrics; + + /* copy the result from base layer */ + *metrics = size->root.metrics; + + if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 ) + return TT_Err_Invalid_PPem; + + /* This bit flag, if set, indicates that the ppems must be */ + /* rounded to integers. Nearly all TrueType fonts have this bit */ + /* set, as hinting won't work really well otherwise. */ + /* */ + if ( face->header.Flags & 8 ) + { + metrics->x_scale = FT_DivFix( metrics->x_ppem << 6, + face->root.units_per_EM ); + metrics->y_scale = FT_DivFix( metrics->y_ppem << 6, + face->root.units_per_EM ); + + metrics->ascender = + FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) ); + metrics->descender = + FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) ); + metrics->height = + FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) ); + metrics->max_advance = + FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width, + metrics->x_scale ) ); + } + + /* compute new transformation */ + if ( metrics->x_ppem >= metrics->y_ppem ) + { + size->ttmetrics.scale = metrics->x_scale; + size->ttmetrics.ppem = metrics->x_ppem; + size->ttmetrics.x_ratio = 0x10000L; + size->ttmetrics.y_ratio = FT_MulDiv( metrics->y_ppem, + 0x10000L, + metrics->x_ppem ); + } + else + { + size->ttmetrics.scale = metrics->y_scale; + size->ttmetrics.ppem = metrics->y_ppem; + size->ttmetrics.x_ratio = FT_MulDiv( metrics->x_ppem, + 0x10000L, + metrics->y_ppem ); + size->ttmetrics.y_ratio = 0x10000L; + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + size->cvt_ready = 0; +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + if ( !error ) + size->ttmetrics.valid = TRUE; + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_driver_init */ + /* */ + /* <Description> */ + /* Initialize a given TrueType driver object. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target driver object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_driver_init( FT_Module ttdriver ) /* TT_Driver */ + { + +#ifdef TT_USE_BYTECODE_INTERPRETER + + TT_Driver driver = (TT_Driver)ttdriver; + + + if ( !TT_New_Context( driver ) ) + return TT_Err_Could_Not_Find_Context; + +#else + + FT_UNUSED( ttdriver ); + +#endif + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_driver_done */ + /* */ + /* <Description> */ + /* Finalize a given TrueType driver. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target TrueType driver. */ + /* */ + FT_LOCAL_DEF( void ) + tt_driver_done( FT_Module ttdriver ) /* TT_Driver */ + { +#ifdef TT_USE_BYTECODE_INTERPRETER + TT_Driver driver = (TT_Driver)ttdriver; + + + /* destroy the execution context */ + if ( driver->context ) + { + TT_Done_Context( driver->context ); + driver->context = NULL; + } +#else + FT_UNUSED( ttdriver ); +#endif + + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_slot_init */ + /* */ + /* <Description> */ + /* Initialize a new slot object. */ + /* */ + /* <InOut> */ + /* slot :: A handle to the slot object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_slot_init( FT_GlyphSlot slot ) + { + return FT_GlyphLoader_CreateExtra( slot->internal->loader ); + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttobjs.h b/android/jni/ndk_modules/freetype/src/truetype/ttobjs.h new file mode 100644 index 00000000..30c8669c --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttobjs.h @@ -0,0 +1,431 @@ +/***************************************************************************/ +/* */ +/* ttobjs.h */ +/* */ +/* Objects manager (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTOBJS_H__ +#define __TTOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_Driver */ + /* */ + /* <Description> */ + /* A handle to a TrueType driver object. */ + /* */ + typedef struct TT_DriverRec_* TT_Driver; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_Instance */ + /* */ + /* <Description> */ + /* A handle to a TrueType size object. */ + /* */ + typedef struct TT_SizeRec_* TT_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to a TrueType glyph slot object. */ + /* */ + /* <Note> */ + /* This is a direct typedef of FT_GlyphSlot, as there is nothing */ + /* specific about the TrueType glyph slot. */ + /* */ + typedef FT_GlyphSlot TT_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GraphicsState */ + /* */ + /* <Description> */ + /* The TrueType graphics state used during bytecode interpretation. */ + /* */ + typedef struct TT_GraphicsState_ + { + FT_UShort rp0; + FT_UShort rp1; + FT_UShort rp2; + + FT_UnitVector dualVector; + FT_UnitVector projVector; + FT_UnitVector freeVector; + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_Bool both_x_axis; +#endif + + FT_Long loop; + FT_F26Dot6 minimum_distance; + FT_Int round_state; + + FT_Bool auto_flip; + FT_F26Dot6 control_value_cutin; + FT_F26Dot6 single_width_cutin; + FT_F26Dot6 single_width_value; + FT_Short delta_base; + FT_Short delta_shift; + + FT_Byte instruct_control; + /* According to Greg Hitchcock from Microsoft, the `scan_control' */ + /* variable as documented in the TrueType specification is a 32-bit */ + /* integer; the high-word part holds the SCANTYPE value, the low-word */ + /* part the SCANCTRL value. We separate it into two fields. */ + FT_Bool scan_control; + FT_Int scan_type; + + FT_UShort gep0; + FT_UShort gep1; + FT_UShort gep2; + + } TT_GraphicsState; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_LOCAL( void ) + tt_glyphzone_done( TT_GlyphZone zone ); + + FT_LOCAL( FT_Error ) + tt_glyphzone_new( FT_Memory memory, + FT_UShort maxPoints, + FT_Short maxContours, + TT_GlyphZone zone ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + + /*************************************************************************/ + /* */ + /* EXECUTION SUBTABLES */ + /* */ + /* These sub-tables relate to instruction execution. */ + /* */ + /*************************************************************************/ + + +#define TT_MAX_CODE_RANGES 3 + + + /*************************************************************************/ + /* */ + /* There can only be 3 active code ranges at once: */ + /* - the Font Program */ + /* - the CVT Program */ + /* - a glyph's instructions set */ + /* */ + typedef enum TT_CodeRange_Tag_ + { + tt_coderange_none = 0, + tt_coderange_font, + tt_coderange_cvt, + tt_coderange_glyph + + } TT_CodeRange_Tag; + + + typedef struct TT_CodeRange_ + { + FT_Byte* base; + FT_ULong size; + + } TT_CodeRange; + + typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES]; + + + /*************************************************************************/ + /* */ + /* Defines a function/instruction definition record. */ + /* */ + typedef struct TT_DefRecord_ + { + FT_Int range; /* in which code range is it located? */ + FT_Long start; /* where does it start? */ + FT_UInt opc; /* function #, or instruction code */ + FT_Bool active; /* is it active? */ + + } TT_DefRecord, *TT_DefArray; + + + /*************************************************************************/ + /* */ + /* Subglyph transformation record. */ + /* */ + typedef struct TT_Transform_ + { + FT_Fixed xx, xy; /* transformation matrix coefficients */ + FT_Fixed yx, yy; + FT_F26Dot6 ox, oy; /* offsets */ + + } TT_Transform; + + + /*************************************************************************/ + /* */ + /* A note regarding non-squared pixels: */ + /* */ + /* (This text will probably go into some docs at some time; for now, it */ + /* is kept here to explain some definitions in the TT_Size_Metrics */ + /* record). */ + /* */ + /* The CVT is a one-dimensional array containing values that control */ + /* certain important characteristics in a font, like the height of all */ + /* capitals, all lowercase letter, default spacing or stem width/height. */ + /* */ + /* These values are found in FUnits in the font file, and must be scaled */ + /* to pixel coordinates before being used by the CVT and glyph programs. */ + /* Unfortunately, when using distinct x and y resolutions (or distinct x */ + /* and y pointsizes), there are two possible scalings. */ + /* */ + /* A first try was to implement a `lazy' scheme where all values were */ + /* scaled when first used. However, while some values are always used */ + /* in the same direction, some others are used under many different */ + /* circumstances and orientations. */ + /* */ + /* I have found a simpler way to do the same, and it even seems to work */ + /* in most of the cases: */ + /* */ + /* - All CVT values are scaled to the maximum ppem size. */ + /* */ + /* - When performing a read or write in the CVT, a ratio factor is used */ + /* to perform adequate scaling. Example: */ + /* */ + /* x_ppem = 14 */ + /* y_ppem = 10 */ + /* */ + /* We choose ppem = x_ppem = 14 as the CVT scaling size. All cvt */ + /* entries are scaled to it. */ + /* */ + /* x_ratio = 1.0 */ + /* y_ratio = y_ppem/ppem (< 1.0) */ + /* */ + /* We compute the current ratio like: */ + /* */ + /* - If projVector is horizontal, */ + /* ratio = x_ratio = 1.0 */ + /* */ + /* - if projVector is vertical, */ + /* ratio = y_ratio */ + /* */ + /* - else, */ + /* ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */ + /* */ + /* Reading a cvt value returns */ + /* ratio * cvt[index] */ + /* */ + /* Writing a cvt value in pixels: */ + /* cvt[index] / ratio */ + /* */ + /* The current ppem is simply */ + /* ratio * ppem */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Metrics used by the TrueType size and context objects. */ + /* */ + typedef struct TT_Size_Metrics_ + { + /* for non-square pixels */ + FT_Long x_ratio; + FT_Long y_ratio; + + FT_UShort ppem; /* maximum ppem size */ + FT_Long ratio; /* current ratio */ + FT_Fixed scale; + + FT_F26Dot6 compensations[4]; /* device-specific compensations */ + + FT_Bool valid; + + FT_Bool rotated; /* `is the glyph rotated?'-flag */ + FT_Bool stretched; /* `is the glyph stretched?'-flag */ + + } TT_Size_Metrics; + + + /*************************************************************************/ + /* */ + /* TrueType size class. */ + /* */ + typedef struct TT_SizeRec_ + { + FT_SizeRec root; + + /* we have our own copy of metrics so that we can modify */ + /* it without affecting auto-hinting (when used) */ + FT_Size_Metrics metrics; + + TT_Size_Metrics ttmetrics; + + FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_UInt num_function_defs; /* number of function definitions */ + FT_UInt max_function_defs; + TT_DefArray function_defs; /* table of function definitions */ + + FT_UInt num_instruction_defs; /* number of ins. definitions */ + FT_UInt max_instruction_defs; + TT_DefArray instruction_defs; /* table of ins. definitions */ + + FT_UInt max_func; + FT_UInt max_ins; + + TT_CodeRangeTable codeRangeTable; + + TT_GraphicsState GS; + + FT_ULong cvt_size; /* the scaled control value table */ + FT_Long* cvt; + + FT_UShort storage_size; /* The storage area is now part of */ + FT_Long* storage; /* the instance */ + + TT_GlyphZoneRec twilight; /* The instance's twilight zone */ + + /* debugging variables */ + + /* When using the debugger, we must keep the */ + /* execution context tied to the instance */ + /* object rather than asking it on demand. */ + + FT_Bool debug; + TT_ExecContext context; + + FT_Bool bytecode_ready; + FT_Bool cvt_ready; + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + } TT_SizeRec; + + + /*************************************************************************/ + /* */ + /* TrueType driver class. */ + /* */ + typedef struct TT_DriverRec_ + { + FT_DriverRec root; + TT_ExecContext context; /* execution context */ + TT_GlyphZoneRec zone; /* glyph loader points zone */ + + void* extension_component; + + } TT_DriverRec; + + + /* Note: All of the functions below (except tt_size_reset()) are used */ + /* as function pointers in a FT_Driver_ClassRec. Therefore their */ + /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face, */ + /* TT_Size, etc., so that the compiler can confirm that the types and */ + /* number of parameters are correct. In all cases the FT_xxx types are */ + /* cast to their TT_xxx counterparts inside the functions since FreeType */ + /* will always use the TT driver to create them. */ + + + /*************************************************************************/ + /* */ + /* Face functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_face_init( FT_Stream stream, + FT_Face ttface, /* TT_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + tt_face_done( FT_Face ttface ); /* TT_Face */ + + + /*************************************************************************/ + /* */ + /* Size functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_size_init( FT_Size ttsize ); /* TT_Size */ + + FT_LOCAL( void ) + tt_size_done( FT_Size ttsize ); /* TT_Size */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_LOCAL( FT_Error ) + tt_size_run_fpgm( TT_Size size ); + + FT_LOCAL( FT_Error ) + tt_size_run_prep( TT_Size size ); + + FT_LOCAL( FT_Error ) + tt_size_ready_bytecode( TT_Size size ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + FT_LOCAL( FT_Error ) + tt_size_reset( TT_Size size ); + + + /*************************************************************************/ + /* */ + /* Driver functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_driver_init( FT_Module ttdriver ); /* TT_Driver */ + + FT_LOCAL( void ) + tt_driver_done( FT_Module ttdriver ); /* TT_Driver */ + + + /*************************************************************************/ + /* */ + /* Slot functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_slot_init( FT_GlyphSlot slot ); + + +FT_END_HEADER + +#endif /* __TTOBJS_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttpic.c b/android/jni/ndk_modules/freetype/src/truetype/ttpic.c new file mode 100644 index 00000000..5d725742 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttpic.c @@ -0,0 +1,81 @@ +/***************************************************************************/ +/* */ +/* ttpic.c */ +/* */ +/* The FreeType position independent code services for truetype module. */ +/* */ +/* Copyright 2009, 2010 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "ttpic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from ttdriver.c */ + FT_Error FT_Create_Class_tt_services( FT_Library, FT_ServiceDescRec**); + void FT_Destroy_Class_tt_services( FT_Library, FT_ServiceDescRec*); + void FT_Init_Class_tt_service_gx_multi_masters(FT_Service_MultiMastersRec*); + void FT_Init_Class_tt_service_truetype_glyf(FT_Service_TTGlyfRec*); + + void + tt_driver_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->truetype ) + { + TTModulePIC* container = (TTModulePIC*)pic_container->truetype; + if(container->tt_services) + FT_Destroy_Class_tt_services(library, container->tt_services); + container->tt_services = NULL; + FT_FREE( container ); + pic_container->truetype = NULL; + } + } + + + FT_Error + tt_driver_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = TT_Err_Ok; + TTModulePIC* container; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->truetype = container; + + /* initialize pointer table - this is how the module usually expects this data */ + error = FT_Create_Class_tt_services(library, &container->tt_services); + if(error) + goto Exit; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Init_Class_tt_service_gx_multi_masters(&container->tt_service_gx_multi_masters); +#endif + FT_Init_Class_tt_service_truetype_glyf(&container->tt_service_truetype_glyf); +Exit: + if(error) + tt_driver_class_pic_free(library); + return error; + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttpic.h b/android/jni/ndk_modules/freetype/src/truetype/ttpic.h new file mode 100644 index 00000000..84de0fee --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttpic.h @@ -0,0 +1,59 @@ +/***************************************************************************/ +/* */ +/* ttpic.h */ +/* */ +/* The FreeType position independent code services for truetype module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTPIC_H__ +#define __TTPIC_H__ + + +FT_BEGIN_HEADER + +#ifndef FT_CONFIG_OPTION_PIC +#define FT_TT_SERVICES_GET tt_services +#define FT_TT_SERVICE_GX_MULTI_MASTERS_GET tt_service_gx_multi_masters +#define FT_TT_SERVICE_TRUETYPE_GLYF_GET tt_service_truetype_glyf + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_TRUETYPE_GLYF_H + + typedef struct TTModulePIC_ + { + FT_ServiceDescRec* tt_services; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Service_MultiMastersRec tt_service_gx_multi_masters; +#endif + FT_Service_TTGlyfRec tt_service_truetype_glyf; + } TTModulePIC; + +#define GET_PIC(lib) ((TTModulePIC*)((lib)->pic_container.truetype)) +#define FT_TT_SERVICES_GET (GET_PIC(library)->tt_services) +#define FT_TT_SERVICE_GX_MULTI_MASTERS_GET (GET_PIC(library)->tt_service_gx_multi_masters) +#define FT_TT_SERVICE_TRUETYPE_GLYF_GET (GET_PIC(library)->tt_service_truetype_glyf) + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __TTPIC_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttpload.c b/android/jni/ndk_modules/freetype/src/truetype/ttpload.c new file mode 100644 index 00000000..a311b03c --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttpload.c @@ -0,0 +1,572 @@ +/***************************************************************************/ +/* */ +/* ttpload.c */ +/* */ +/* TrueType-specific tables loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H + +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttpload + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_loca */ + /* */ + /* <Description> */ + /* Load the locations table. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_loca( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_ULong table_len; + FT_Int shift; + + + /* we need the size of the `glyf' table for malformed `loca' tables */ + error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len ); + + /* it is possible that a font doesn't have a glyf table at all */ + /* or its size is zero */ + if ( error == TT_Err_Table_Missing ) + face->glyf_len = 0; + else if ( error ) + goto Exit; + + FT_TRACE2(( "Locations " )); + error = face->goto_table( face, TTAG_loca, stream, &table_len ); + if ( error ) + { + error = TT_Err_Locations_Missing; + goto Exit; + } + + if ( face->header.Index_To_Loc_Format != 0 ) + { + shift = 2; + + if ( table_len >= 0x40000L ) + { + FT_TRACE2(( "table too large\n" )); + error = TT_Err_Invalid_Table; + goto Exit; + } + face->num_locations = table_len >> shift; + } + else + { + shift = 1; + + if ( table_len >= 0x20000L ) + { + FT_TRACE2(( "table too large\n" )); + error = TT_Err_Invalid_Table; + goto Exit; + } + face->num_locations = table_len >> shift; + } + + if ( face->num_locations != (FT_ULong)face->root.num_glyphs ) + { + FT_TRACE2(( "glyph count mismatch! loca: %d, maxp: %d\n", + face->num_locations, face->root.num_glyphs )); + + /* we only handle the case where `maxp' gives a larger value */ + if ( face->num_locations < (FT_ULong)face->root.num_glyphs ) + { + FT_Long new_loca_len = (FT_Long)face->root.num_glyphs << shift; + + TT_Table entry = face->dir_tables; + TT_Table limit = entry + face->num_tables; + + FT_Long pos = FT_Stream_Pos( stream ); + FT_Long dist = 0x7FFFFFFFL; + + + /* compute the distance to next table in font file */ + for ( ; entry < limit; entry++ ) + { + FT_Long diff = entry->Offset - pos; + + + if ( diff > 0 && diff < dist ) + dist = diff; + } + + if ( new_loca_len <= dist ) + { + face->num_locations = face->root.num_glyphs; + table_len = new_loca_len; + + FT_TRACE2(( "adjusting num_locations to %d\n", + face->num_locations )); + } + } + } + + /* + * Extract the frame. We don't need to decompress it since + * we are able to parse it directly. + */ + if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) ) + goto Exit; + + FT_TRACE2(( "loaded\n" )); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_ULong ) + tt_face_get_location( TT_Face face, + FT_UInt gindex, + FT_UInt *asize ) + { + FT_ULong pos1, pos2; + FT_Byte* p; + FT_Byte* p_limit; + + + pos1 = pos2 = 0; + + if ( gindex < face->num_locations ) + { + if ( face->header.Index_To_Loc_Format != 0 ) + { + p = face->glyph_locations + gindex * 4; + p_limit = face->glyph_locations + face->num_locations * 4; + + pos1 = FT_NEXT_ULONG( p ); + pos2 = pos1; + + if ( p + 4 <= p_limit ) + pos2 = FT_NEXT_ULONG( p ); + } + else + { + p = face->glyph_locations + gindex * 2; + p_limit = face->glyph_locations + face->num_locations * 2; + + pos1 = FT_NEXT_USHORT( p ); + pos2 = pos1; + + if ( p + 2 <= p_limit ) + pos2 = FT_NEXT_USHORT( p ); + + pos1 <<= 1; + pos2 <<= 1; + } + } + + /* The `loca' table must be ordered; it refers to the length of */ + /* an entry as the difference between the current and the next */ + /* position. However, there do exist (malformed) fonts which */ + /* don't obey this rule, so we are only able to provide an */ + /* upper bound for the size. */ + /* */ + /* We get (intentionally) a wrong, non-zero result in case the */ + /* `glyf' table is missing. */ + if ( pos2 >= pos1 ) + *asize = (FT_UInt)( pos2 - pos1 ); + else + *asize = (FT_UInt)( face->glyf_len - pos1 ); + + return pos1; + } + + + FT_LOCAL_DEF( void ) + tt_face_done_loca( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->glyph_locations ); + face->num_locations = 0; + } + + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_cvt */ + /* */ + /* <Description> */ + /* Load the control value table into a face object. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_cvt( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_len; + + + FT_TRACE2(( "CVT " )); + + error = face->goto_table( face, TTAG_cvt, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + + face->cvt_size = 0; + face->cvt = NULL; + error = TT_Err_Ok; + + goto Exit; + } + + face->cvt_size = table_len / 2; + + if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) ) + goto Exit; + + if ( FT_FRAME_ENTER( face->cvt_size * 2L ) ) + goto Exit; + + { + FT_Short* cur = face->cvt; + FT_Short* limit = cur + face->cvt_size; + + + for ( ; cur < limit; cur++ ) + *cur = FT_GET_SHORT(); + } + + FT_FRAME_EXIT(); + FT_TRACE2(( "loaded\n" )); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( face->doblend ) + error = tt_face_vary_cvt( face, stream ); +#endif + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return TT_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_fpgm */ + /* */ + /* <Description> */ + /* Load the font program. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_fpgm( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_ULong table_len; + + + FT_TRACE2(( "Font program " )); + + /* The font program is optional */ + error = face->goto_table( face, TTAG_fpgm, stream, &table_len ); + if ( error ) + { + face->font_program = NULL; + face->font_program_size = 0; + error = TT_Err_Ok; + + FT_TRACE2(( "is missing\n" )); + } + else + { + face->font_program_size = table_len; + if ( FT_FRAME_EXTRACT( table_len, face->font_program ) ) + goto Exit; + + FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size )); + } + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return TT_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_prep */ + /* */ + /* <Description> */ + /* Load the cvt program. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_prep( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_ULong table_len; + + + FT_TRACE2(( "Prep program " )); + + error = face->goto_table( face, TTAG_prep, stream, &table_len ); + if ( error ) + { + face->cvt_program = NULL; + face->cvt_program_size = 0; + error = TT_Err_Ok; + + FT_TRACE2(( "is missing\n" )); + } + else + { + face->cvt_program_size = table_len; + if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) ) + goto Exit; + + FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size )); + } + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return TT_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_hdmx */ + /* */ + /* <Description> */ + /* Load the `hdmx' table into the face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hdmx( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UInt version, nn, num_records; + FT_ULong table_size, record_size; + FT_Byte* p; + FT_Byte* limit; + + + /* this table is optional */ + error = face->goto_table( face, TTAG_hdmx, stream, &table_size ); + if ( error || table_size < 8 ) + return TT_Err_Ok; + + if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) ) + goto Exit; + + p = face->hdmx_table; + limit = p + table_size; + + version = FT_NEXT_USHORT( p ); + num_records = FT_NEXT_USHORT( p ); + record_size = FT_NEXT_ULONG( p ); + + /* The maximum number of bytes in an hdmx device record is the */ + /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is */ + /* the reason why `record_size' is a long (which we read as */ + /* unsigned long for convenience). In practice, two bytes */ + /* sufficient to hold the size value. */ + /* */ + /* There are at least two fonts, HANNOM-A and HANNOM-B version */ + /* 2.0 (2005), which get this wrong: The upper two bytes of */ + /* the size value are set to 0xFF instead of 0x00. We catch */ + /* and fix this. */ + + if ( record_size >= 0xFFFF0000UL ) + record_size &= 0xFFFFU; + + /* The limit for `num_records' is a heuristic value. */ + + if ( version != 0 || num_records > 255 || record_size > 0x10001L ) + { + error = TT_Err_Invalid_File_Format; + goto Fail; + } + + if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) ) + goto Fail; + + for ( nn = 0; nn < num_records; nn++ ) + { + if ( p + record_size > limit ) + break; + + face->hdmx_record_sizes[nn] = p[0]; + p += record_size; + } + + face->hdmx_record_count = nn; + face->hdmx_table_size = table_size; + face->hdmx_record_size = record_size; + + Exit: + return error; + + Fail: + FT_FRAME_RELEASE( face->hdmx_table ); + face->hdmx_table_size = 0; + goto Exit; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_hdmx( TT_Face face ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = stream->memory; + + + FT_FREE( face->hdmx_record_sizes ); + FT_FRAME_RELEASE( face->hdmx_table ); + } + + + /*************************************************************************/ + /* */ + /* Return the advance width table for a given pixel size if it is found */ + /* in the font's `hdmx' table (if any). */ + /* */ + FT_LOCAL_DEF( FT_Byte* ) + tt_face_get_device_metrics( TT_Face face, + FT_UInt ppem, + FT_UInt gindex ) + { + FT_UInt nn; + FT_Byte* result = NULL; + FT_ULong record_size = face->hdmx_record_size; + FT_Byte* record = face->hdmx_table + 8; + + + for ( nn = 0; nn < face->hdmx_record_count; nn++ ) + if ( face->hdmx_record_sizes[nn] == ppem ) + { + gindex += 2; + if ( gindex < record_size ) + result = record + nn * record_size + gindex; + break; + } + + return result; + } + + +/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttpload.h b/android/jni/ndk_modules/freetype/src/truetype/ttpload.h new file mode 100644 index 00000000..f61ac079 --- /dev/null +++ b/android/jni/ndk_modules/freetype/src/truetype/ttpload.h @@ -0,0 +1,75 @@ +/***************************************************************************/ +/* */ +/* ttpload.h */ +/* */ +/* TrueType-specific tables loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTPLOAD_H__ +#define __TTPLOAD_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_loca( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( FT_ULong ) + tt_face_get_location( TT_Face face, + FT_UInt gindex, + FT_UInt *asize ); + + FT_LOCAL( void ) + tt_face_done_loca( TT_Face face ); + + FT_LOCAL( FT_Error ) + tt_face_load_cvt( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( FT_Error ) + tt_face_load_fpgm( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_prep( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_hdmx( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( void ) + tt_face_free_hdmx( TT_Face face ); + + + FT_LOCAL( FT_Byte* ) + tt_face_get_device_metrics( TT_Face face, + FT_UInt ppem, + FT_UInt gindex ); + +FT_END_HEADER + +#endif /* __TTPLOAD_H__ */ + + +/* END */ diff --git a/android/jni/ndk_modules/miniunz/Android.mk b/android/jni/ndk_modules/miniunz/Android.mk new file mode 100644 index 00000000..71225680 --- /dev/null +++ b/android/jni/ndk_modules/miniunz/Android.mk @@ -0,0 +1,16 @@ +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES:= \ + ioapi.c \ + unzip.c \ + miniunz.c \ + +LOCAL_C_INCLUDES := $(LOCAL_PATH) + +LOCAL_MODULE:= miniunz +LOCAL_MODULE_FILENAME:= libminiunz + +LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) + +include $(BUILD_STATIC_LIBRARY) diff --git a/android/jni/ndk_modules/miniunz/MiniZip64_info.txt b/android/jni/ndk_modules/miniunz/MiniZip64_info.txt new file mode 100644 index 00000000..57d71524 --- /dev/null +++ b/android/jni/ndk_modules/miniunz/MiniZip64_info.txt @@ -0,0 +1,74 @@ +MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson + +Introduction +--------------------- +MiniZip 1.1 is built from MiniZip 1.0 by Gilles Vollant ( http://www.winimage.com/zLibDll/minizip.html ) + +When adding ZIP64 support into minizip it would result into risk of breaking compatibility with minizip 1.0. +All possible work was done for compatibility. + + +Background +--------------------- +When adding ZIP64 support Mathias Svensson found that Even Rouault have added ZIP64 +support for unzip.c into minizip for a open source project called gdal ( http://www.gdal.org/ ) + +That was used as a starting point. And after that ZIP64 support was added to zip.c +some refactoring and code cleanup was also done. + + +Changed from MiniZip 1.0 to MiniZip 1.1 +--------------------------------------- +* Added ZIP64 support for unzip ( by Even Rouault ) +* Added ZIP64 support for zip ( by Mathias Svensson ) +* Reverted some changed that Even Rouault did. +* Bunch of patches received from Gulles Vollant that he received for MiniZip from various users. +* Added unzip patch for BZIP Compression method (patch create by Daniel Borca) +* Added BZIP Compress method for zip +* Did some refactoring and code cleanup + + +Credits + + Gilles Vollant - Original MiniZip author + Even Rouault - ZIP64 unzip Support + Daniel Borca - BZip Compression method support in unzip + Mathias Svensson - ZIP64 zip support + Mathias Svensson - BZip Compression method support in zip + + Resources + + ZipLayout http://result42.com/projects/ZipFileLayout + Command line tool for Windows that shows the layout and information of the headers in a zip archive. + Used when debugging and validating the creation of zip files using MiniZip64 + + + ZIP App Note http://www.pkware.com/documents/casestudies/APPNOTE.TXT + Zip File specification + + +Notes. + * To be able to use BZip compression method in zip64.c or unzip64.c the BZIP2 lib is needed and HAVE_BZIP2 need to be defined. + +License +---------------------------------------------------------- + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +---------------------------------------------------------- + diff --git a/android/jni/ndk_modules/miniunz/ioapi.c b/android/jni/ndk_modules/miniunz/ioapi.c new file mode 100644 index 00000000..b5dd22ce --- /dev/null +++ b/android/jni/ndk_modules/miniunz/ioapi.c @@ -0,0 +1,246 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ +#if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS))) + #define _CRT_SECURE_NO_WARNINGS +#endif + +#if defined(__APPLE__) || defined(IOAPI_NO_64) +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + +#include "ioapi.h" + +voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) +{ + if (pfilefunc->zfile_func64.zopen64_file != NULL) + return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); + else + { + return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode); + } +} + +long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); + else + { + uLong offsetTruncated = (uLong)offset; + if (offsetTruncated != offset) + return -1; + else + return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin); + } +} + +ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); + else + { + uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); + if ((tell_uLong) == MAXU32) + return (ZPOS64_T)-1; + else + return tell_uLong; + } +} + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) +{ + p_filefunc64_32->zfile_func64.zopen64_file = NULL; + p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; + p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; + p_filefunc64_32->zfile_func64.ztell64_file = NULL; + p_filefunc64_32->zfile_func64.zseek64_file = NULL; + p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque; + p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file; + p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file; +} + + + +static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); +static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); +static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); +static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); +static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); + +static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = fopen(filename, mode_fopen); + return file; +} + +static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = FOPEN_FUNC((const char*)filename, mode_fopen); + return file; +} + + +static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) +{ + long ret; + ret = ftell((FILE *)stream); + return ret; +} + + +static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) +{ + ZPOS64_T ret; + ret = FTELLO_FUNC((FILE *)stream); + return ret; +} + +static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + if (fseek((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + return ret; +} + +static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + + if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + + return ret; +} + + +static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = fclose((FILE *)stream); + return ret; +} + +static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = ferror((FILE *)stream); + return ret; +} + +void fill_fopen_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = fopen_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell_file = ftell_file_func; + pzlib_filefunc_def->zseek_file = fseek_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} + +void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = fopen64_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell64_file = ftell64_file_func; + pzlib_filefunc_def->zseek64_file = fseek64_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/android/jni/ndk_modules/miniunz/ioapi.h b/android/jni/ndk_modules/miniunz/ioapi.h new file mode 100644 index 00000000..fea4c59e --- /dev/null +++ b/android/jni/ndk_modules/miniunz/ioapi.h @@ -0,0 +1,214 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + + Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this) + Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux. + More if/def section may be needed to support other platforms + Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows. + (but you should use iowin32.c for windows instead) + +*/ + +#ifndef _ZLIBIOAPI64_H +#define _ZLIBIOAPI64_H + +#ifdef ANDROID +#define fopen64(filename, mode) fopen(filename, mode) +#define ftello64(stream) ftello(stream) +#define fseeko64(stream, offset, origin) fseeko(stream, offset, origin) +#endif + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + + // Linux needs this to support file operation on files larger then 4+GB + // But might need better if/def to select just the platforms that needs them. + + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif + +#endif + +#include <stdio.h> +#include <stdlib.h> +#include "zlib.h" + +#if defined(USE_FILE32API) +#define fopen64 fopen +#define ftello64 ftell +#define fseeko64 fseek +#else +#ifdef __FreeBSD__ +#define fopen64 fopen +#define ftello64 ftello +#define fseeko64 fseeko +#endif +#ifdef _MSC_VER + #define fopen64 fopen + #if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) + #define ftello64 _ftelli64 + #define fseeko64 _fseeki64 + #else // old MSC + #define ftello64 ftell + #define fseeko64 fseek + #endif +#endif +#endif + +/* +#ifndef ZPOS64_T + #ifdef _WIN32 + #define ZPOS64_T fpos_t + #else + #include <stdint.h> + #define ZPOS64_T uint64_t + #endif +#endif +*/ + +#ifdef HAVE_MINIZIP64_CONF_H +#include "mz64conf.h" +#endif + +/* a type choosen by DEFINE */ +#ifdef HAVE_64BIT_INT_CUSTOM +typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; +#else +#ifdef HAS_STDINT_H +#include "stdint.h" +typedef uint64_t ZPOS64_T; +#else + +/* Maximum unsigned 32-bit value used as placeholder for zip64 */ +#define MAXU32 0xffffffff + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef unsigned __int64 ZPOS64_T; +#else +typedef unsigned long long int ZPOS64_T; +#endif +#endif +#endif + + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + #if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) + #define ZCALLBACK CALLBACK + #else + #define ZCALLBACK + #endif +#endif + + + + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); + + +/* here is the "old" 32 bits structure structure */ +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + +typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode)); + +typedef struct zlib_filefunc64_def_s +{ + open64_file_func zopen64_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell64_file_func ztell64_file; + seek64_file_func zseek64_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc64_def; + +void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +/* now internal definition, only for zip.c and unzip.h */ +typedef struct zlib_filefunc64_32_def_s +{ + zlib_filefunc64_def zfile_func64; + open_file_func zopen32_file; + tell_file_func ztell32_file; + seek_file_func zseek32_file; +} zlib_filefunc64_32_def; + + +#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +//#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream)) +//#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) +#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) + +voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); +long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); +ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); + +#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) +#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) +#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/android/jni/ndk_modules/miniunz/miniunz.c b/android/jni/ndk_modules/miniunz/miniunz.c new file mode 100644 index 00000000..b3db509e --- /dev/null +++ b/android/jni/ndk_modules/miniunz/miniunz.c @@ -0,0 +1,705 @@ +/* + miniunz.c + Version 1.1, February 14h, 2010 + sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) +*/ + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif +#endif + +#ifdef __APPLE__ +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <errno.h> +#include <fcntl.h> + +#ifdef _WIN32 +# include <direct.h> +# include <io.h> +#else +# include <unistd.h> +# include <utime.h> +#endif + + +#include "unzip.h" + +#define CASESENSITIVITY (0) +#define WRITEBUFFERSIZE (8192) +#define MAXFILENAME (1024) + +#ifdef _WIN32 +#define USEWIN32IOAPI +#include "iowin32.h" +#endif +/* + mini unzip, demo of unzip package + + usage : + Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] + + list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT + if it exists +*/ + + +/* change_file_date : change the date/time of a file + filename : the filename of the file where date/time must be modified + dosdate : the new date at the MSDos format (4 bytes) + tmu_date : the SAME new date at the tm_unz format */ +void change_file_date(filename,dosdate,tmu_date) + const char *filename; + uLong dosdate; + tm_unz tmu_date; +{ +#ifdef _WIN32 + HANDLE hFile; + FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; + + hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE, + 0,NULL,OPEN_EXISTING,0,NULL); + GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); + DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); + LocalFileTimeToFileTime(&ftLocal,&ftm); + SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); + CloseHandle(hFile); +#else +//#ifdef unix || __APPLE__ + struct utimbuf ut; + struct tm newdate; + newdate.tm_sec = tmu_date.tm_sec; + newdate.tm_min=tmu_date.tm_min; + newdate.tm_hour=tmu_date.tm_hour; + newdate.tm_mday=tmu_date.tm_mday; + newdate.tm_mon=tmu_date.tm_mon; + if (tmu_date.tm_year > 1900) + newdate.tm_year=tmu_date.tm_year - 1900; + else + newdate.tm_year=tmu_date.tm_year ; + newdate.tm_isdst=-1; + + ut.actime=ut.modtime=mktime(&newdate); + utime(filename,&ut); +//#endif +#endif +} + + +/* mymkdir and change_file_date are not 100 % portable + As I don't know well Unix, I wait feedback for the unix portion */ + +int mymkdir(dirname) + const char* dirname; +{ + int ret=0; +#ifdef _WIN32 + ret = _mkdir(dirname); +#elif unix + ret = mkdir (dirname,0775); +#elif __APPLE__ + ret = mkdir (dirname,0775); +#endif + return ret; +} + +int makedir (newdir) + char *newdir; +{ + char *buffer ; + char *p; + int len = (int)strlen(newdir); + + if (len <= 0) + return 0; + + buffer = (char*)malloc(len+1); + if (buffer==NULL) + { + printf("Error allocating memory\n"); + return UNZ_INTERNALERROR; + } + strcpy(buffer,newdir); + + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mymkdir(buffer) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mymkdir(buffer) == -1) && (errno == ENOENT)) + { + printf("couldn't create directory %s\n",buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + +void do_banner() +{ + printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); + printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); +} + +void do_help() +{ + printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ + " -e Extract without pathname (junk paths)\n" \ + " -x Extract with pathname\n" \ + " -v list files\n" \ + " -l list files\n" \ + " -d directory to extract into\n" \ + " -o overwrite files without prompting\n" \ + " -p extract crypted file using password\n\n"); +} + +void Display64BitsSize(ZPOS64_T n, int size_char) +{ + /* to avoid compatibility problem , we do here the conversion */ + char number[21]; + int offset=19; + int pos_string = 19; + number[20]=0; + for (;;) { + number[offset]=(char)((n%10)+'0'); + if (number[offset] != '0') + pos_string=offset; + n/=10; + if (offset==0) + break; + offset--; + } + { + int size_display_string = 19-pos_string; + while (size_char > size_display_string) + { + size_char--; + printf(" "); + } + } + + printf("%s",&number[pos_string]); +} + +int do_list(uf) + unzFile uf; +{ + uLong i; + unz_global_info64 gi; + int err; + + err = unzGetGlobalInfo64(uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + printf(" Length Method Size Ratio Date Time CRC-32 Name\n"); + printf(" ------ ------ ---- ----- ---- ---- ------ ----\n"); + for (i=0;i<gi.number_entry;i++) + { + char filename_inzip[256]; + unz_file_info64 file_info; + uLong ratio=0; + const char *string_method; + char charCrypt=' '; + err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); + break; + } + if (file_info.uncompressed_size>0) + ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); + + /* display a '*' if the file is crypted */ + if ((file_info.flag & 1) != 0) + charCrypt='*'; + + if (file_info.compression_method==0) + string_method="Stored"; + else + if (file_info.compression_method==Z_DEFLATED) + { + uInt iLevel=(uInt)((file_info.flag & 0x6)/2); + if (iLevel==0) + string_method="Defl:N"; + else if (iLevel==1) + string_method="Defl:X"; + else if ((iLevel==2) || (iLevel==3)) + string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ + } + else + if (file_info.compression_method==Z_BZIP2ED) + { + string_method="BZip2 "; + } + else + string_method="Unkn. "; + + Display64BitsSize(file_info.uncompressed_size,7); + printf(" %6s%c",string_method,charCrypt); + Display64BitsSize(file_info.compressed_size,7); + printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n", + ratio, + (uLong)file_info.tmu_date.tm_mon + 1, + (uLong)file_info.tmu_date.tm_mday, + (uLong)file_info.tmu_date.tm_year % 100, + (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, + (uLong)file_info.crc,filename_inzip); + if ((i+1)<gi.number_entry) + { + err = unzGoToNextFile(uf); + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzGoToNextFile\n",err); + break; + } + } + } + + return 0; +} + + +int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) + unzFile uf; + const int* popt_extract_without_path; + int* popt_overwrite; + const char* password; +{ + char filename_inzip[256]; + char* filename_withoutpath; + char* p; + int err=UNZ_OK; + FILE *fout=NULL; + void* buf; + uInt size_buf; + + unz_file_info64 file_info; + uLong ratio=0; + err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); + + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); + return err; + } + + size_buf = WRITEBUFFERSIZE; + buf = (void*)malloc(size_buf); + if (buf==NULL) + { + printf("Error allocating memory\n"); + return UNZ_INTERNALERROR; + } + + p = filename_withoutpath = filename_inzip; + while ((*p) != '\0') + { + if (((*p)=='/') || ((*p)=='\\')) + filename_withoutpath = p+1; + p++; + } + + if ((*filename_withoutpath)=='\0') + { + if ((*popt_extract_without_path)==0) + { + printf("creating directory: %s\n",filename_inzip); + mymkdir(filename_inzip); + } + } + else + { + const char* write_filename; + int skip=0; + + if ((*popt_extract_without_path)==0) + write_filename = filename_inzip; + else + write_filename = filename_withoutpath; + + err = unzOpenCurrentFilePassword(uf,password); + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err); + } + + if (((*popt_overwrite)==0) && (err==UNZ_OK)) + { + char rep=0; + FILE* ftestexist; + ftestexist = FOPEN_FUNC(write_filename,"rb"); + if (ftestexist!=NULL) + { + fclose(ftestexist); + do + { + char answer[128]; + int ret; + + printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename); + ret = scanf("%1s",answer); + if (ret != 1) + { + exit(EXIT_FAILURE); + } + rep = answer[0] ; + if ((rep>='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + } + + if (rep == 'N') + skip = 1; + + if (rep == 'A') + *popt_overwrite=1; + } + + if ((skip==0) && (err==UNZ_OK)) + { + fout=FOPEN_FUNC(write_filename,"wb"); + /* some zipfile don't contain directory alone before file */ + if ((fout==NULL) && ((*popt_extract_without_path)==0) && + (filename_withoutpath!=(char*)filename_inzip)) + { + char c=*(filename_withoutpath-1); + *(filename_withoutpath-1)='\0'; + makedir(write_filename); + *(filename_withoutpath-1)=c; + fout=FOPEN_FUNC(write_filename,"wb"); + } + + if (fout==NULL) + { + printf("error opening %s\n",write_filename); + } + } + + if (fout!=NULL) + { + printf(" extracting: %s\n",write_filename); + + do + { + err = unzReadCurrentFile(uf,buf,size_buf); + if (err<0) + { + printf("error %d with zipfile in unzReadCurrentFile\n",err); + break; + } + if (err>0) + if (fwrite(buf,err,1,fout)!=1) + { + printf("error in writing extracted file\n"); + err=UNZ_ERRNO; + break; + } + } + while (err>0); + if (fout) + fclose(fout); + + if (err==0) + change_file_date(write_filename,file_info.dosDate, + file_info.tmu_date); + } + + if (err==UNZ_OK) + { + err = unzCloseCurrentFile (uf); + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzCloseCurrentFile\n",err); + } + } + else + unzCloseCurrentFile(uf); /* don't lose the error */ + } + + free(buf); + return err; +} + + +int do_extract(uf,opt_extract_without_path,opt_overwrite,password) + unzFile uf; + int opt_extract_without_path; + int opt_overwrite; + const char* password; +{ + uLong i; + unz_global_info64 gi; + int err; + FILE* fout=NULL; + + err = unzGetGlobalInfo64(uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + + for (i=0;i<gi.number_entry;i++) + { + if (do_extract_currentfile(uf,&opt_extract_without_path, + &opt_overwrite, + password) != UNZ_OK) + break; + + if ((i+1)<gi.number_entry) + { + err = unzGoToNextFile(uf); + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzGoToNextFile\n",err); + break; + } + } + } + + return 0; +} + +int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password) + unzFile uf; + const char* filename; + int opt_extract_without_path; + int opt_overwrite; + const char* password; +{ + int err = UNZ_OK; + if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK) + { + printf("file %s not found in the zipfile\n",filename); + return 2; + } + + if (do_extract_currentfile(uf,&opt_extract_without_path, + &opt_overwrite, + password) == UNZ_OK) + return 0; + else + return 1; +} + +/* +int main(argc,argv) + int argc; + char *argv[]; +{ + const char *zipfilename=NULL; + const char *filename_to_extract=NULL; + const char *password=NULL; + char filename_try[MAXFILENAME+16] = ""; + int i; + int ret_value=0; + int opt_do_list=0; + int opt_do_extract=1; + int opt_do_extract_withoutpath=0; + int opt_overwrite=0; + int opt_extractdir=0; + const char *dirname=NULL; + unzFile uf=NULL; + + do_banner(); + if (argc==1) + { + do_help(); + return 0; + } + else + { + for (i=1;i<argc;i++) + { + if ((*argv[i])=='-') + { + const char *p=argv[i]+1; + + while ((*p)!='\0') + { + char c=*(p++);; + if ((c=='l') || (c=='L')) + opt_do_list = 1; + if ((c=='v') || (c=='V')) + opt_do_list = 1; + if ((c=='x') || (c=='X')) + opt_do_extract = 1; + if ((c=='e') || (c=='E')) + opt_do_extract = opt_do_extract_withoutpath = 1; + if ((c=='o') || (c=='O')) + opt_overwrite=1; + if ((c=='d') || (c=='D')) + { + opt_extractdir=1; + dirname=argv[i+1]; + } + + if (((c=='p') || (c=='P')) && (i+1<argc)) + { + password=argv[i+1]; + i++; + } + } + } + else + { + if (zipfilename == NULL) + zipfilename = argv[i]; + else if ((filename_to_extract==NULL) && (!opt_extractdir)) + filename_to_extract = argv[i] ; + } + } + } + + if (zipfilename!=NULL) + { + +# ifdef USEWIN32IOAPI + zlib_filefunc64_def ffunc; +# endif + + strncpy(filename_try, zipfilename,MAXFILENAME-1); + // strncpy doesnt append the trailing NULL, of the string is too long. + filename_try[ MAXFILENAME ] = '\0'; + +# ifdef USEWIN32IOAPI + fill_win32_filefunc64A(&ffunc); + uf = unzOpen2_64(zipfilename,&ffunc); +# else + uf = unzOpen64(zipfilename); +# endif + if (uf==NULL) + { + strcat(filename_try,".zip"); +# ifdef USEWIN32IOAPI + uf = unzOpen2_64(filename_try,&ffunc); +# else + uf = unzOpen64(filename_try); +# endif + } + } + + if (uf==NULL) + { + printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename); + return 1; + } + printf("%s opened\n",filename_try); + + if (opt_do_list==1) + ret_value = do_list(uf); + else if (opt_do_extract==1) + { +#ifdef _WIN32 + if (opt_extractdir && _chdir(dirname)) +#else + if (opt_extractdir && chdir(dirname)) +#endif + { + printf("Error changing into %s, aborting\n", dirname); + exit(-1); + } + + if (filename_to_extract == NULL) + ret_value = do_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password); + else + ret_value = do_extract_onefile(uf, filename_to_extract, opt_do_extract_withoutpath, opt_overwrite, password); + } + + unzClose(uf); + + return ret_value; +} +*/ + +int unzip(zipfilename,dirname) + const char *zipfilename; + const char *dirname; +{ + const char *password=NULL; + char filename_try[MAXFILENAME+16] = ""; + int ret_value=0; + int opt_do_extract_withoutpath=0; + int opt_overwrite=1; + int opt_extractdir=0; + unzFile uf=NULL; + + if (zipfilename!=NULL) + { + strncpy(filename_try, zipfilename,MAXFILENAME-1); + /* strncpy doesnt append the trailing NULL, of the string is too long. */ + filename_try[ MAXFILENAME ] = '\0'; + + uf = unzOpen64(zipfilename); + if (uf==NULL) + { + strcat(filename_try,".zip"); + uf = unzOpen64(filename_try); + } + } + + if (uf==NULL) + { + printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename); + return 1; + } + printf("%s opened\n",filename_try); + if (chdir(dirname)) + { + printf("Error changing into %s, aborting\n", dirname); + return 2; + } + + ret_value = do_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password); + unzClose(uf); + + return ret_value; +} + diff --git a/android/jni/ndk_modules/miniunz/miniunz.h b/android/jni/ndk_modules/miniunz/miniunz.h new file mode 100644 index 00000000..18453c41 --- /dev/null +++ b/android/jni/ndk_modules/miniunz/miniunz.h @@ -0,0 +1,14 @@ +#ifndef _miniunz_H +#define _miniunz_H + +#ifdef __cplusplus +extern "C" { +#endif + +int unzip(const char *zipfilename, const char *dirname); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/android/jni/ndk_modules/miniunz/unzip.c b/android/jni/ndk_modules/miniunz/unzip.c new file mode 100644 index 00000000..90935043 --- /dev/null +++ b/android/jni/ndk_modules/miniunz/unzip.c @@ -0,0 +1,2125 @@ +/* unzip.c -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + + ------------------------------------------------------------------------------------ + Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of + compatibility with older software. The following is from the original crypt.c. + Code woven in by Terry Thorsen 1/2003. + + Copyright (c) 1990-2000 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2000-Apr-09 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, all these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html + + crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + ------------------------------------------------------------------------------------ + + Changes in unzip.c + + 2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos + 2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz* + 2007-2008 - Even Rouault - Remove old C style function prototypes + 2007-2008 - Even Rouault - Add unzip support for ZIP64 + + Copyright (C) 2007-2008 Even Rouault + + + Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again). + Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G + should only read the compressed/uncompressed size from the Zip64 format if + the size from normal header was 0xFFFFFFFF + Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant + Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required) + Patch created by Daniel Borca + + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + + Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson + +*/ + + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifndef NOUNCRYPT + #define NOUNCRYPT +#endif + +#include "zlib.h" +#include "unzip.h" + +#ifdef STDC +# include <stddef.h> +# include <string.h> +# include <stdlib.h> +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include <errno.h> +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + +#ifndef CASESENSITIVITYDEFAULT_NO +# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) +# define CASESENSITIVITYDEFAULT_NO +# endif +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + +const char unz_copyright[] = + " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info64_internal_s +{ + ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ +} unz_file_info64_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + ZPOS64_T offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + ZPOS64_T pos_local_extrafield; /* position in the local extra field in read*/ + ZPOS64_T total_out_64; + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ + ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + int raw; +} file_in_zip64_read_info_s; + + +/* unz64_s contain internal information about the zipfile +*/ +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + int is64bitOpenFunction; + voidpf filestream; /* io structore of the zipfile */ + unz_global_info64 gi; /* public global information */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + ZPOS64_T num_file; /* number of the current file in the zipfile*/ + ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/ + ZPOS64_T current_file_ok; /* flag about the usability of the current file*/ + ZPOS64_T central_pos; /* position of the beginning of the central dir*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info64 cur_file_info; /* public info about the current file in zip*/ + unz_file_info64_internal cur_file_info_internal; /* private info about it*/ + file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ + int encrypted; + + int isZip64; + +# ifndef NOUNCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const z_crc_t* pcrc_32_tab; +# endif +} unz64_s; + + +#ifndef NOUNCRYPT +#include "crypt.h" +#endif + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ + + +local int unz64local_getByte OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unz64local_getShort OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX)); + + +local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX) +{ + ZPOS64_T x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<24; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<32; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<40; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<48; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<56; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2) +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1<c2) + return -1; + if (c1>c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, + const char* fileName2, + int iCaseSensitivity) + +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); +local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackRead<uMaxBack) + { + uLong uReadSize; + ZPOS64_T uReadPos ; + int i; + if (uBackRead+BUFREADCOMMENT>uMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + + +/* + Locate the Central directory 64 of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream)); + +local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackRead<uMaxBack) + { + uLong uReadSize; + ZPOS64_T uReadPos; + int i; + if (uBackRead+BUFREADCOMMENT>uMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK) + return 0; + + /* total number of disks */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + if (uL != 0x06064b50) + return 0; + + return relativeOffset; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer + "zlib/zlib114.zip". + If the zipfile cannot be opened (file doesn't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +local unzFile unzOpenInternal (const void *path, + zlib_filefunc64_32_def* pzlib_filefunc64_32_def, + int is64bitOpenFunction) +{ + unz64_s us; + unz64_s *s; + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (unz_copyright[0]!=' ') + return NULL; + + us.z_filefunc.zseek32_file = NULL; + us.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&us.z_filefunc.zfile_func64); + else + us.z_filefunc = *pzlib_filefunc64_32_def; + us.is64bitOpenFunction = is64bitOpenFunction; + + + + us.filestream = ZOPEN64(us.z_filefunc, + path, + ZLIB_FILEFUNC_MODE_READ | + ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) + return NULL; + + central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream); + if (central_pos) + { + uLong uS; + ZPOS64_T uL64; + + us.isZip64 = 1; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* size of zip64 end of central directory record */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version made by */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version needed to extract */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + us.gi.size_comment = 0; + } + else + { + central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream); + if (central_pos==0) + err=UNZ_ERRNO; + + us.isZip64 = 0; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.gi.number_entry = uL; + + /* total number of entries in the central dir */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + number_entry_CD = uL; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.size_central_dir = uL; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.offset_central_dir = uL; + + /* zipfile comment length */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + } + + if ((central_pos<us.offset_central_dir+us.size_central_dir) && + (err==UNZ_OK)) + err=UNZ_BADZIPFILE; + + if (err!=UNZ_OK) + { + ZCLOSE64(us.z_filefunc, us.filestream); + return NULL; + } + + us.byte_before_the_zipfile = central_pos - + (us.offset_central_dir+us.size_central_dir); + us.central_pos = central_pos; + us.pfile_in_zip_read = NULL; + us.encrypted = 0; + + + s=(unz64_s*)ALLOC(sizeof(unz64_s)); + if( s != NULL) + { + *s=us; + unzGoToFirstFile((unzFile)s); + } + return (unzFile)s; +} + + +extern unzFile ZEXPORT unzOpen2 (const char *path, + zlib_filefunc_def* pzlib_filefunc32_def) +{ + if (pzlib_filefunc32_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def); + return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 0); + } + else + return unzOpenInternal(path, NULL, 0); +} + +extern unzFile ZEXPORT unzOpen2_64 (const void *path, + zlib_filefunc64_def* pzlib_filefunc_def) +{ + if (pzlib_filefunc_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; + zlib_filefunc64_32_def_fill.ztell32_file = NULL; + zlib_filefunc64_32_def_fill.zseek32_file = NULL; + return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 1); + } + else + return unzOpenInternal(path, NULL, 1); +} + +extern unzFile ZEXPORT unzOpen (const char *path) +{ + return unzOpenInternal(path, NULL, 0); +} + +extern unzFile ZEXPORT unzOpen64 (const void *path) +{ + return unzOpenInternal(path, NULL, 1); +} + +/* + Close a ZipFile opened with unzOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzCloseCurrentFile before call unzClose. + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzClose (unzFile file) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + if (s->pfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + ZCLOSE64(s->z_filefunc, s->filestream); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + +extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + /* to do : check if number_entry is not truncated */ + pglobal_info32->number_entry = (uLong)s->gi.number_entry; + pglobal_info32->size_comment = s->gi.size_comment; + return UNZ_OK; +} +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) +{ + ZPOS64_T uDate; + uDate = (ZPOS64_T)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unz64local_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unz64local_GetCurrentFileInfoInternal (unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) +{ + unz64_s* s; + unz_file_info64 file_info; + unz_file_info64_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + uLong uL; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pos_in_central_dir+s->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + + /* we check the magic */ + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.compressed_size = uL; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.uncompressed_size = uL; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + // relative offset of local header + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info_internal.offset_curfile = uL; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename<fileNameBufferSize) + { + *(szFileName+file_info.size_filename)='\0'; + uSizeRead = file_info.size_filename; + } + else + uSizeRead = fileNameBufferSize; + + if ((file_info.size_filename>0) && (fileNameBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + // Read extrafield + if ((err==UNZ_OK) && (extraField!=NULL)) + { + ZPOS64_T uSizeRead ; + if (file_info.size_file_extra<extraFieldBufferSize) + uSizeRead = file_info.size_file_extra; + else + uSizeRead = extraFieldBufferSize; + + if (lSeek!=0) + { + if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + + lSeek += file_info.size_file_extra - (uLong)uSizeRead; + } + else + lSeek += file_info.size_file_extra; + + + if ((err==UNZ_OK) && (file_info.size_file_extra != 0)) + { + uLong acc = 0; + + // since lSeek now points to after the extra field we need to move back + lSeek -= file_info.size_file_extra; + + if (lSeek!=0) + { + if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + while(acc < file_info.size_file_extra) + { + uLong headerId; + uLong dataSize; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK) + err=UNZ_ERRNO; + + /* ZIP64 extra fields */ + if (headerId == 0x0001) + { + uLong uL; + + if(file_info.uncompressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.compressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info_internal.offset_curfile == MAXU32) + { + /* Relative Header offset */ + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.disk_num_start == MAXU32) + { + /* Disk Start Number */ + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + } + + } + else + { + if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0) + err=UNZ_ERRNO; + } + + acc += 2 + 2 + dataSize; + } + } + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_comment<commentBufferSize) + { + *(szComment+file_info.size_file_comment)='\0'; + uSizeRead = file_info.size_file_comment; + } + else + uSizeRead = commentBufferSize; + + if (lSeek!=0) + { + if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file, + unz_file_info64 * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, + unz_file_info * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + int err; + unz_file_info64 file_info64; + err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); + if ((err==UNZ_OK) && (pfile_info != NULL)) + { + pfile_info->version = file_info64.version; + pfile_info->version_needed = file_info64.version_needed; + pfile_info->flag = file_info64.flag; + pfile_info->compression_method = file_info64.compression_method; + pfile_info->dosDate = file_info64.dosDate; + pfile_info->crc = file_info64.crc; + + pfile_info->size_filename = file_info64.size_filename; + pfile_info->size_file_extra = file_info64.size_file_extra; + pfile_info->size_file_comment = file_info64.size_file_comment; + + pfile_info->disk_num_start = file_info64.disk_num_start; + pfile_info->internal_fa = file_info64.internal_fa; + pfile_info->external_fa = file_info64.external_fa; + + pfile_info->tmu_date = file_info64.tmu_date, + + + pfile_info->compressed_size = (uLong)file_info64.compressed_size; + pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size; + + } + return err; +} +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (unzFile file) +{ + int err=UNZ_OK; + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (unzFile file) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity) +{ + unz64_s* s; + int err; + + /* We remember the 'current' position in the file so that we can jump + * back there if we fail. + */ + unz_file_info64 cur_file_infoSaved; + unz_file_info64_internal cur_file_info_internalSaved; + ZPOS64_T num_fileSaved; + ZPOS64_T pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + /* Save the current state */ + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + cur_file_infoSaved = s->cur_file_info; + cur_file_info_internalSaved = s->cur_file_info_internal; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + err = unzGetCurrentFileInfo64(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (err == UNZ_OK) + { + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + } + + /* We failed, so restore the state of the 'current file' to where we + * were. + */ + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + s->cur_file_info = cur_file_infoSaved; + s->cur_file_info_internal = cur_file_info_internalSaved; + return err; +} + + +/* +/////////////////////////////////////////// +// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) +// I need random access +// +// Further optimization could be realized by adding an ability +// to cache the directory in memory. The goal being a single +// comprehensive file read to put the file I need in a memory. +*/ + +/* +typedef struct unz_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; // offset in file + ZPOS64_T num_of_file; // # of file +} unz_file_pos; +*/ + +extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) +{ + unz64_s* s; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + file_pos->pos_in_zip_directory = s->pos_in_central_dir; + file_pos->num_of_file = s->num_file; + + return UNZ_OK; +} + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + int err = unzGetFilePos64(file,&file_pos64); + if (err==UNZ_OK) + { + file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory; + file_pos->num_of_file = (uLong)file_pos64.num_of_file; + } + return err; +} + +extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) +{ + unz64_s* s; + int err; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + /* jump to the right spot */ + s->pos_in_central_dir = file_pos->pos_in_zip_directory; + s->num_file = file_pos->num_of_file; + + /* set the current file */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + /* return results */ + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + if (file_pos == NULL) + return UNZ_PARAMERROR; + + file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory; + file_pos64.num_of_file = file_pos->num_of_file; + return unzGoToFilePos64(file,&file_pos64); +} + +/* +// Unzip Helper Functions - should be here? +/////////////////////////////////////////// +*/ + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, + ZPOS64_T * poffset_local_extrafield, + uInt * psize_local_extrafield) +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, + int* level, int raw, const char* password) +{ + int err=UNZ_OK; + uInt iSizeVar; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + ZPOS64_T offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ +# ifndef NOUNCRYPT + char source[12]; +# else + if (password != NULL) + return UNZ_PARAMERROR; +# endif + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + pfile_in_zip_read_info->raw=raw; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if (method!=NULL) + *method = (int)s->cur_file_info.compression_method; + + if (level!=NULL) + { + *level = 6; + switch (s->cur_file_info.flag & 0x06) + { + case 6 : *level = 1; break; + case 4 : *level = 2; break; + case 2 : *level = 9; break; + } + } + + if ((s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + + err=UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->total_out_64=0; + pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; + pfile_in_zip_read_info->filestream=s->filestream; + pfile_in_zip_read_info->z_filefunc=s->z_filefunc; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw)) + { +#ifdef HAVE_BZIP2 + pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0; + pfile_in_zip_read_info->bstream.bzfree = (free_func)0; + pfile_in_zip_read_info->bstream.opaque = (voidpf)0; + pfile_in_zip_read_info->bstream.state = (voidpf)0; + + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } +#else + pfile_in_zip_read_info->raw=1; +#endif + } + else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = 0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_DEFLATED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + s->pfile_in_zip_read = pfile_in_zip_read_info; + s->encrypted = 0; + +# ifndef NOUNCRYPT + if (password != NULL) + { + int i; + s->pcrc_32_tab = get_crc_table(); + init_keys(password,s->keys,s->pcrc_32_tab); + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pfile_in_zip_read->pos_in_zipfile + + s->pfile_in_zip_read->byte_before_the_zipfile, + SEEK_SET)!=0) + return UNZ_INTERNALERROR; + if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12) + return UNZ_INTERNALERROR; + + for (i = 0; i<12; i++) + zdecode(s->keys,s->pcrc_32_tab,source[i]); + + s->pfile_in_zip_read->pos_in_zipfile+=12; + s->encrypted=1; + } +# endif + + + return UNZ_OK; +} + +extern int ZEXPORT unzOpenCurrentFile (unzFile file) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); +} + +extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, password); +} + +extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw) +{ + return unzOpenCurrentFile3(file, method, level, raw, NULL); +} + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + s=(unz64_s*)file; + if (file==NULL) + return 0; //UNZ_PARAMERROR; + pfile_in_zip_read_info=s->pfile_in_zip_read; + if (pfile_in_zip_read_info==NULL) + return 0; //UNZ_PARAMERROR; + return pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile; +} + +/** Addition for GDAL : END */ + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) +{ + int err=UNZ_OK; + uInt iRead = 0; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if (pfile_in_zip_read_info->read_buffer == NULL) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && + (!(pfile_in_zip_read_info->raw))) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressed<uReadThis) + uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->read_buffer, + uReadThis)!=uReadThis) + return UNZ_ERRNO; + + +# ifndef NOUNCRYPT + if(s->encrypted) + { + uInt i; + for(i=0;i<uReadThis;i++) + pfile_in_zip_read_info->read_buffer[i] = + zdecode(s->keys,s->pcrc_32_tab, + pfile_in_zip_read_info->read_buffer[i]); + } +# endif + + + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) + { + uInt uDoCopy,i ; + + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + return (iRead==0) ? UNZ_EOF : iRead; + + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;i<uDoCopy;i++) + *(pfile_in_zip_read_info->stream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + + pfile_in_zip_read_info->bstream.next_in = (char*)pfile_in_zip_read_info->stream.next_in; + pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in; + pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in; + pfile_in_zip_read_info->bstream.total_in_hi32 = 0; + pfile_in_zip_read_info->bstream.next_out = (char*)pfile_in_zip_read_info->stream.next_out; + pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out; + pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out; + pfile_in_zip_read_info->bstream.total_out_hi32 = 0; + + uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32; + bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out; + + err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream); + + uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); + pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in; + pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in; + pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32; + pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out; + pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out; + pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32; + + if (err==BZ_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=BZ_OK) + break; +#endif + } // end Z_BZIP2ED + else + { + ZPOS64_T uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + ZPOS64_T uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) + err = Z_DATA_ERROR; + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + +extern ZPOS64_T ZEXPORT unztell64 (unzFile file) +{ + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return (ZPOS64_T)-1; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return (ZPOS64_T)-1; + + return pfile_in_zip_read_info->total_out_64; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* +Read extra field from the current file (opened by unzOpenCurrentFile) +This is the local-header version of the extra field (sometimes, there is +more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + uInt read_now; + ZPOS64_T size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + buf,read_now)!=read_now) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (unzFile file) +{ + int err=UNZ_OK; + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && + (!pfile_in_zip_read_info->raw)) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) + inflateEnd(&pfile_in_zip_read_info->stream); +#ifdef HAVE_BZIP2 + else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED) + BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream); +#endif + + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf) +{ + unz64_s* s; + uLong uReadThis ; + if (file==NULL) + return (int)UNZ_PARAMERROR; + s=(unz64_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} + +/* Additions by RX '2004 */ +extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) +{ + unz64_s* s; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return 0; + if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) + if (s->num_file==s->gi.number_entry) + return 0; + return s->pos_in_central_dir; +} + +extern uLong ZEXPORT unzGetOffset (unzFile file) +{ + ZPOS64_T offset64; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + offset64 = unzGetOffset64(file); + return (uLong)offset64; +} + +extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + s->pos_in_central_dir = pos; + s->num_file = s->gi.number_entry; /* hack */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) +{ + return unzSetOffset64(file,pos); +} diff --git a/android/jni/ndk_modules/miniunz/unzip.h b/android/jni/ndk_modules/miniunz/unzip.h new file mode 100644 index 00000000..2104e391 --- /dev/null +++ b/android/jni/ndk_modules/miniunz/unzip.h @@ -0,0 +1,437 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + --------------------------------------------------------------------------------- + + Changes + + See header of unzip64.c + +*/ + +#ifndef _unz64_H +#define _unz64_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info64_s +{ + ZPOS64_T number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info64; + +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info64_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + ZPOS64_T compressed_size; /* compressed size 8 bytes */ + ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info64; + +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +extern unzFile ZEXPORT unzOpen64 OF((const void *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. + the "64" function take a const void* pointer, because the path is just the + value passed to the open64_file_func callback. + Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path + is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* + does not describe the reality +*/ + + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, + zlib_filefunc64_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unz64Open, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzCloseCurrentFile before call unzClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); + +extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, + unz_global_info64 *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +typedef struct unz64_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */ + ZPOS64_T num_of_file; /* # of file */ +} unz64_file_pos; + +extern int ZEXPORT unzGetFilePos64( + unzFile file, + unz64_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos64( + unzFile file, + const unz64_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, + unz_file_info64 *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); + +/** Addition for GDAL : END */ + + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); + +extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file); +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos); +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + + +#ifdef __cplusplus +} +#endif + +#endif /* _unz64_H */ diff --git a/android/jni/winfont.c b/android/jni/winfont.c new file mode 100644 index 00000000..11bd0624 --- /dev/null +++ b/android/jni/winfont.c @@ -0,0 +1,140 @@ +#include "platform_print.h" +#include "label.h" +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_GLYPH_H + +FT_Library library; + +#define MAXFILENAME (1024) +char TTFONT[MAXFILENAME+16] = "/system/fonts/DroidSans.ttf"; + +#define _fault(errcode, msg) __fault(errcode, msg, __FILE__, __LINE__) + +static void __fault(int errcode, const char * msg, const char *file, int line) { + if (errcode) + pf_log("err(%d): %s, error occured in file %s, line %d\n\n\t have a look at fterrdef.h\n",errcode, msg, file, line); + else + pf_log("err: %s, occured in file %s, line %d\n", msg, file, line); + exit(1); +} + +struct bitmap { + void * buf; + int w; + int h; + int pitch; +}; + +/* x,y is offset of target */ +static void +cpy_bitmap(struct bitmap * target, struct bitmap * src, int x, int y) { + unsigned char * sbuf = src->buf; + unsigned char * tbuf = target->buf; + + int x0,y0,x1,y1; + x0 = x > 0 ? x : 0; + y0 = y > 0 ? y : 0; + x1 = (x + src->w > target->w) ? target->w : (x+src->w); + y1 = (y + src->h > target->h) ? target->h : (y+src->h); + + if (x1 <= x0 || y1 <= y0) + return; + if (x0 >= target->w || y0 >= target->h) + return; + + int w = x1 - x0; + int h = y1 - y0; + + tbuf += y0 * target->pitch + x0; + sbuf += (y0 - y)*src->pitch + x0 - x; + int i,j; + for (i=0;i<h;i++) { + for (j=0;j<w;j++) + tbuf[j] = sbuf[j]; + sbuf += src->pitch; + tbuf += target->pitch; + } +} + +void +font_create(int font_size, struct font_context *ctx) { + FT_Face face; + int err = FT_New_Face(library, TTFONT, 0, &face); + if (err) { + if (err == 1) + _fault(err, "set your own vector font resource path"); + else + _fault(err, "new face failed"); + } + + err = FT_Set_Pixel_Sizes(face,0,font_size); + + if (err) + _fault(err, "set char size failed"); + + ctx->font = face; + ctx->ascent = face->size->metrics.ascender >>6; + ctx->h = face->size->metrics.height >> 6; +} + +void +font_release(struct font_context *ctx) { + FT_Done_Face(ctx->font); +} + +void +font_size(const char *str, int unicode, struct font_context *ctx) { + FT_Face face = ctx->font; + FT_UInt glyph_index = FT_Get_Char_Index(face, unicode); + if (!glyph_index) { + pf_log("cannot find glyph %d\n", unicode); + //exit(1); + } + FT_Load_Glyph(face, glyph_index, FT_LOAD_NO_BITMAP); + + int err = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL); + if (err) + _fault(err, "render failed"); + + FT_GlyphSlot slot = face->glyph; + + ctx->w = slot->advance.x >> 6; +} + + +void +font_glyph(const char * str, int unicode, void * buffer, struct font_context *ctx) { + FT_Face face = ctx->font; + FT_GlyphSlot slot = face->glyph; + FT_Bitmap *bitmap = &(slot->bitmap); + + int offx = slot->bitmap_left; + int offy = ctx->ascent - slot->bitmap_top; + + struct bitmap src; + struct bitmap target; + src.buf = bitmap->buffer; + src.pitch = bitmap->pitch; + src.w = bitmap->width; + src.h = bitmap->rows; + target.buf = buffer; + target.w = target.pitch = ctx->w; + target.h = ctx->h; + + cpy_bitmap(&target, &src, offx, offy); +} + +void +font_init(const char* fontname) { + if (FT_Init_FreeType(&library)) { + pf_log("font init failed"); + } + strncpy(TTFONT,fontname,MAXFILENAME); + TTFONT[strlen(fontname)+1] = '0'; + pf_log("TTFONT=%s",TTFONT); +} diff --git a/android/jni/winfw.c b/android/jni/winfw.c new file mode 100644 index 00000000..f0158827 --- /dev/null +++ b/android/jni/winfw.c @@ -0,0 +1,131 @@ +#include "opengl.h" +#include "ejoy2dgame.h" +#include "fault.h" +#include "screen.h" +#include "winfw.h" + +#include <lauxlib.h> + +#include <stdlib.h> +#include <stdio.h> + +struct WINDOWGAME { + struct game *game; + int intouch; +}; + +static struct WINDOWGAME *G = NULL; + +static const char * startscript = +"_G.print = function (...)\n" +" local t ={}\n" +" for i = 1, select('#',...) do\n" +" local arg = select(i,...)\n" +" t[i] = tostring(arg)\n" +" end\n" +" local s = table.concat(t,\"\t\")\n" +" printstring(s)\n" +"end\n" +"local path, script = ...\n" +"require(\"ejoy2d.framework\").WorkDir = path..'/'\n" +"assert(script, 'I need a script name')\n" +"script = path..[[/]]..script\n" +"package.path = path .. [[/?.lua;]] .. path .. [[/?/init.lua;./?.lua;./?/init.lua]]\n" +"local f = loadfile(script)\n" +"f(script)\n"; + +static int +printstring(lua_State *L) { + const char *s = lua_tostring(L, 1); + fault("!%s", s); + return 0; +} + +static void +set_android_functions(lua_State *L) { + lua_register(L,"printstring",printstring); +} + +static struct WINDOWGAME * +create_game() { + struct WINDOWGAME * g = malloc(sizeof(*g)); + g->game = ejoy2d_game(); + g->intouch = 0; + return g; +} + +static int +traceback(lua_State *L) { + const char *msg = lua_tostring(L, 1); + if (msg) + luaL_traceback(L, L, msg, 1); + else if (!lua_isnoneornil(L, 1)) { + if (!luaL_callmeta(L, 1, "__tostring")) + lua_pushliteral(L, "(no error message)"); + } + return 1; +} + +void +ejoy2d_win_init(int width, int height, const char* folder) { + G = create_game(); + lua_State *L = ejoy2d_game_lua(G->game); + set_android_functions(L); + lua_pushcfunction(L, traceback); + int tb = lua_gettop(L); + int err = luaL_loadstring(L, startscript); + if (err) { + const char *msg = lua_tostring(L,-1); + fault("%s", msg); + } + + lua_pushstring(L, folder); + lua_pushstring(L, "examples/ex01.lua"); + + err = lua_pcall(L, 2, 0, tb); + if (err) { + const char *msg = lua_tostring(L,-1); + fault("%s", msg); + } + + lua_pop(L,1); + + screen_init(width,height,1); + ejoy2d_game_start(G->game); +} + +void +ejoy2d_win_update() { + ejoy2d_game_update(G->game, 0.01f); +} + +void +ejoy2d_win_frame() { + ejoy2d_game_drawframe(G->game); +} + +void +ejoy2d_win_resume(){ + ejoy2d_game_resume(G->game); +} + +void +ejoy2d_win_touch(int x, int y,int touch) { + switch (touch) { + case TOUCH_BEGIN: + G->intouch = 1; + break; + case TOUCH_END: + G->intouch = 0; + break; + case TOUCH_MOVE: + if (!G->intouch) { + return; + } + break; + } + // windows only support one touch id (0) + int id = 0; + ejoy2d_game_touch(G->game, id, x,y,touch); +} + diff --git a/android/jni/winfw.h b/android/jni/winfw.h new file mode 100644 index 00000000..0d2bdf74 --- /dev/null +++ b/android/jni/winfw.h @@ -0,0 +1,19 @@ +#ifndef ejoy2d_windows_fw_h +#define ejoy2d_windows_fw_h + +#define WIDTH 1024 +#define HEIGHT 768 + +#define TOUCH_BEGIN 0 +#define TOUCH_END 1 +#define TOUCH_MOVE 2 + +void ejoy2d_win_init(int width, int height, const char* folder); +void ejoy2d_win_frame(); +void ejoy2d_win_update(); +void ejoy2d_win_touch(int x, int y,int touch); +void ejoy2d_win_resume(); + +void set_font(const char *folder, const char* fontname); + +#endif diff --git a/android/local.properties b/android/local.properties new file mode 100644 index 00000000..74cc6632 --- /dev/null +++ b/android/local.properties @@ -0,0 +1,10 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. + +# location of the SDK. This is only used by Ant +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=/home/hanxi/Documents/android/android-sdk diff --git a/android/proguard-project.txt b/android/proguard-project.txt new file mode 100644 index 00000000..f2fe1559 --- /dev/null +++ b/android/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/android/project.properties b/android/project.properties new file mode 100644 index 00000000..4ab12569 --- /dev/null +++ b/android/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-19 diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml new file mode 100644 index 00000000..5d05e42d --- /dev/null +++ b/android/res/values/strings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">ejoy2d</string> +</resources> From 5f28f3f61c1c15583041b165a5df2239f4c70bdb Mon Sep 17 00:00:00 2001 From: hanxi <hanxi.info@gmail.com> Date: Fri, 16 May 2014 18:14:25 +0800 Subject: [PATCH 2/4] add font --- .gitignore | 4 ++++ examples/asset/kaiti_GB2312.ttf | Bin 0 -> 4135804 bytes lua/luaconf.h | 4 +++- 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 examples/asset/kaiti_GB2312.ttf diff --git a/.gitignore b/.gitignore index 6fdccb87..7a863aed 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,7 @@ ej2d.dSYM/* *.ilk mac/example/example.xcodeproj/xcuserdata mac/example/example.xcodeproj/project.xcworkspace/xcuserdata +android/assets/ +android/bin/ +android/libs/ +android/obj/ diff --git a/examples/asset/kaiti_GB2312.ttf b/examples/asset/kaiti_GB2312.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ece2ac2c05223693c8c50360ef8cba1dbac1036f GIT binary patch literal 4135804 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�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%0AR_HGh-z-p~-=-S@!@;AcZtczJo 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⋘{sp5a?vecq$P>gM~d0&2QCsSxi?jO4c`(Qb$B~ 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 Sy)*#`!iQTxVA!h@Z%fE&<lwv; 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⁣OAjEaFE`edNPSA@Bqn$vmd8rT32> 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�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 pYx~q88M9 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�r< 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≫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ΝZX=+E+ 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%0At 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.~9G!g}b++2_O(8dZ1ks8(uv4s_s0<9m_ zBFhR*273t5t#ra-7FmY31-cHm@L|<DG93_HHHg6%84LG+DU_5#trYu36fB`wRYaAN zg4Pk@1#a1K4D8G7f@2;=Q@$WZBHSO&l{J%h=0gq*jRY}(GqA;XOhXA0r7Pqg>XiL4 zv4m(o6kFcfZtK|jf#uNW{cWXcCDt?=og{gwr!|oyp9-we?ol<1Qkm~;Zf+W#j$t&P zcbXlvIc(0QW;)wgZwEQ5(W@a<a6ov_3|GSS!YC+q=(Xc;kPU&6PBouzHfAxvToXfe znzL;`H;RDXc+_ia!?&ZZ-Trgu&fRs_xl0c@hwgFqvVx1({TeX#n4j1F4*T_`&LQX7 z!?d(wZ;t<IHBKEgM>c#!9MA?z7t%T`_oIZDqko4|7%{3w^c1`3P8Z%{xo%?V*P5oC zIJ|qhz!#+uY#>Ml&~i=+ORjH<qUqbA2xT>vxJ=g%;{@tsLw7|~-@nc0QMPfuE7&&o z7S4utFDM9){Hs-;psoUR_sLHi2ZLaU%wp_kBm5kqIhS8zmcO831g}UuP4(}<qn7s> zviulCm9plb$DDBlXxOo6hXl$9!b_r$#%U{!ee4ZcJZBYcU-B)^uLYcUbu^PCtyt`v zl3OUalG(q2xTTN_k_lffK!gE4Ff^)NvsFVmgwPt`25RY<mVh|)Z;d#wRQ3IEX2zJE zoe9eU=NH_o<9dvmlWIXp4SbPKp$^5XdVD^L$zoKhQK>eKsM?_e_G5#B>MYvGXKA+k ziejfe=coQ`h&p8lVPsBb5N7wY(6-;-prNg(e??tqF>Q{+eo8dFIE;ohnMT83-5w2( zd4TT7!kGZoke!Amqk0o>ARhsVWmpDEN%m<(HADX@uD+HiveVc(Gd&xIy3D~C6jqNS z`f+VlPE5lzA3Ze7`?Q#ZtQ}p@L|qM}YRHvhUDRA%P#sj@5l@nH98`f;YEvjEC7M0z zH&GZs9V+6~9fB_vM%{J@ixk8ks1*Vu2nc5eDvq}q0XA?fJ4u|hRJs8TRK!AoC-Z*5 zAC!vAYKSeUcI<K+8zpNmd0c7abxOPg27LgTgI>Z`2AmV@CBRiiIsnUWfNCIH_p>O@ z!Lb&kVwIvl<>3+2DRa{$E{Nk0TaqZ-OoHhEEjf^1RtjOYm?#gFQ1?d))f}~GMJ;&G zMIs5BusLAZrY>!?Rk_nfc`c&^=@TG49=t^~q_8?O?Fojc+Gtp&xTGbQDoC~^B`K-J z#<Z$i%Iu+46pLDd?lEM${0A8gZ2oyNv%gN>pMzovoj3u7X=f4ubpx62$Ng>_?4Qv; zODJ`bgpDB>KnCNF4t~g#(PtxAe$VA}q-m5=BBFtogYaJBg=xZ1H93@tcs`NHwWg}r zGN%}VBdDInOF~eQ?RHT_4XF&LL7S=(S*bfHR+fr0*e#bN1T63rhyKdA26_cuLlNn1 z)p6#ko}-~93!o#Yh72NvVcBO}pS%+X7Y^B`VcSJJm1WtM<;w~<h;KNltSHDIzQv7g z+cZt~9eMRPPDH40MP0OqI%(gZcC=!fRZ5TEKiMi4+Oa5}CtCD-q&&vaVjCS#fnQN! zu>hng1BYq>`Wn0i@Tj8@P>G^CXwZrPItT%LUm8TNFR2o$zqq9&0F|o&YW*as;E|OQ zpLm-}-B#76^@=CL^Olh(v?aA#cBXvEoJN~C4f$V}SIRZF?b#QaL8zhnE=Ep#?B$nX zY39(A6<&<(*O2F$8&Ijw+)Q)?%M1`wQ{5iriI_4$KjRGiW`yQPMF)VGqI`j9MY?J# znjX#{X`DVC7J@JcV^22>v~u|jq*FG~ABT6}{foEwaEVm)=x&GH*U}56=>itkEGvRv z55s!i8mQ<w3rpLU5yK5)P(GINZqRIhAw77YxaU-%aO(a&%faeuw7lCnesX#F<kE=~ zN@M3#v)>%#^e7fiFV6;gq;P7zbl^a;_tdM$me@5px@Ec)<j7D#CBF}vU9-qF7v~$x z*OjN+C2o4pv@^dxr|YeK%iXH3H`ZpkiD-=K?IA~!k9Fp%Q?ocAH?^yxYV|>$26VP0 z+i!=4r3?XqXI7$1jRs(VTr%wgo<28Q<L1|A`TC*$G*_N!q!(2SX*uF52mDgOFSH6@ z(5Lpa+q<VZZmQEz^h)=<bO8ZNakknnDoU|dzy{8kL$mk^$sOz+$dBB3<4rf6J$un_ z+;roOc)BQuJJ<=JJbvWnn{QO`qt}f9wiqDoGV{U<pZVZdpVvP4!O3fBhI01#=fC=V zer|pT&1uC5-P(_w`iOteu4mt)zcF_mpv1TM>e=_uUk){a#3HRS!xzI1Kxg?Z=<POh zIr_|XK_ef^pm*`MDS0Q3pU_X>-*Nr;@iOnbqWwu58@SF94h{)gJxZc){K|2BJN(&Z zpy?hdsERL>qX9N$^Y+-GGOZa@XJ$u9kSnBaEOhwic(+t?C7GN%r}K~cwrG3E30n}$ z+`8EHL}b@P2~f3~)nfGfS0LB&$RpU<b4n%WQPm=rEvg=d$!AAstje4rSi)ux90MMC zkh4Pk+{VvC<12AMhT{bA^Tyscs|SQD$->807yF~VbAT<hL<3h#Ujfj>FBIUJk#l)U zWn2OS+y<~LY|?k`d~R2c3lwyOhQ~TgpUP{!UbYE~{f*|=RTF!6swUlq6EME(_kdRv zLkX&Eyh&12_i0U@7^zC}i|jx0ADJ{D?+f`u-2zICnM4ljZhBu=4TUF~E?#EyTA<3B zA8CcCArV>Kz$7Sq7v;rD&2uz2kfB``>%3ZmQ5o|;JynC*2=f7{aT{r58eFxp+rvEV z?94!>4+wfp>3S(qImwVM&2VAYY;0<RBkV4!ND<<3>L;6y6ilbGK}^5wb25hz615vx z^d}XZybz!w^ZvJjDm%Kn2tj8OpH&|B;DiqId+i=N=WxIy(N^tMZ+=BH47;|d8Q3^C zRUzQ9HL4`uwbwhP`2z=X>!Y>x)~4tXU~|jW1rpivs1;>P-oo=KlQVVKaLZv^PBnyl z7eGhjtb!&vGML1liurv`MU2<#IP=67lJnhY4G)c5hBlWbSBZ=b?JN@l4=N*GtM!Xs z-NQ{)jacKf7(NU3M}6f8>OUkb=+cFBYHhiMV(Pj~D%Ao}`;M|l6>(Nd<)FgHv{SP< z4jW@M-lyRtf}%F0KI4)TyQhtMnV{<KZVPzRq%VB}#pW9SR^%Z-0vuMz*}?1#0<CVz zSO5}D$(?Z<wZ;r#BYTHAvPtf6iC=aUR8_<2wJaq;8phEyQ4v95<w`6En;g<DzEg<` zMc)h@6u(Pu(Mr&2%QGUcX3CMR`}XxJTq6}g<+*~^UN$IqrZp-HBda?)u>enj!qcLj zDFhl{pY_lg&h^Wl8z>z5#p)`rx$;FCjvT4vOuSr_#K!6xsu-oDj7<ww&@?0<?b`*k zg5V%ZIecU`X@>GnP++`MNvXmbVFz<(9v1tAVnZI)7%;(q!VSYl5V$x37OLtS7-gk* z@NUmV&ewOpBDRms&mU_)BUX<zn@6f1K%gj46jheBd#P5)V}fdzDJG{hX5Yd@YcSL@ z6H{k}3I7Mfy!LrE9p=4m^aAJZ6j8ux4ds41&wKUJjL<{S4daN2&I*ngask~A%ukmg zAg7Yns5te$i@hzRN0es-x=u`dvyJ?gtoy!Eh*F(urYQw#2}>2^2PgpVQ)IbUt578c zSCc9!o$9DD98^d3b~u~jRFzT!l0H8RM{Ou)$kx1GRZ&eg)RnFF1a_V)7XgjvOe!wJ z(Weof5!HO>7L6`wC(vcQkyl`<AUX|KI*sl#0*+H~K48z#IKev+AfBT>rJ)r|6jX>3 z^<o;6u+VUhR_N!|+;2jkV^-OG*A^gG*()|bRCxvHbjq$kshpwjqa5g0q^hqt3)Ppy z8<pu<inmPr0T|}s0vPzS6lXd82SY>g)utQrbeo@1`aXj<RoC!KOdFzL<^oQ^iA7cW zh~J~8%u#I3uck~Tri*n{C^5VCIHjn1A84D`Fqw8-rd&MTq#A3e9+}0#+*Ccn#zEC& zK6gJFO4QJlzL2R)o9WI_w|MlL<8Ps2D{1P7Igdf)zL@FFq}7;OTc|uEE4vL;GKac? zKuo}%<%rkwc%pi=M&WwBCe3utq&dGQ)2pf=JqZ0K>bmrup<N#;*!vYu(V(zZC1VY0 z-^c#jNYn12Gp?;rOpKHYRPK;z5zA~>xs-qC_wB91BdTaV;7OSRhU;V7N`kC{tB&;V zX<g!|3f|H?w?rmY#DVGS^n9NOMeHaOiufc<Gs09|dEx^Io*0MaI6KqGD-`n96onkR z0V#tK)Ub9mj00;?-!uDk$nirW-a$1plCrMrIeyi#996{$vrBQvn%ap^j;I)kr7{kE z7Upn(pt0JCxu^FlR9Tm#_l*n%2U7k7$)k}3i#cPDYRVC2vuFbBHP#A0S${q0`cXOb zDFLx1ryQ5yTxrJ3b*98nz_g{rUX-VgEi4>s-C04&!_ld!pVOfms7lcLW#({&q7*S* zmXk=DFQ270g;$wPsg@}cS+E<n7{UfIg$pNenN5@1Lvb81qcYHKM+=}QJ^dNOvJBtR zU0+)-9Zon;F9g47EL^gn%U(IzzZgruqc2=C;}AQk?OzJX3befXW*p>(3q01W6rMFo z%^6C~KJ?KL3drW#7z((7Oo35nJ=5|d<dtnbgGaZ&XX~M@dB|is@AksTuT|%4h3FS9 z2S(W@-FagK7%JK4EaW50`xjy&Ym3(xL?L0ABHdcmcPD%R3gK=FA;Z`tsvr=MfDyXj zY*8JS#fjK0#OH8_GS3y62H<W4>#I(HEhEbS<Y$EGDjZX}=y*jl(qo)cRdm~TxWN8R zZ7IWMeK)ZA#9Wa`e(RE!N8B`BX~8tWsihf9r2F988U+ZvH)TsXX`!$$uwAAJ#7<JU zmGg3$J;3pt99Cbj3`YY_P_4ap{SXd)a!xns<gux&yvLfo1gF5=QghF2LZ;Q!yZTzE zq{1%rjvn1cZKi+g)z?vb8!mIUVT9BiP=5ff(;NoZ73Hb4D=(O}wB9t~z$RXI%z`Mi zJq6yAmE}v2h6Tk}%G`!i7Ap&Nw6T<6K3|8eK8*tMY{*1-i_T<ZEr!l@KWc&Q(3Md? z2j91C10<#pt_JZ!0oib`Y74T_2tt&=;BfsU{uYbX{qqF|=DbNRDa_WJYl{^alBOyW z-vFFyse}l2Qf{Vma$KXn;Wp-+5TEvzd!FON7vT9iI)n5bXV#4QSrs*Tl<nrsk*sV0 zAUCP(2loMs4`vShjvZrbLV0Wn_Y&INj<;<D&4eRoU?P@doABy$7^D<7EKt}sP6}}= z)crsS{UFf2LK{1EMH{W*i4|IUcMR)@+Q$4P6zZsPAPM3^U<O8t6R&>JK`#VP30*z( zE4D)2e)zcKOdMUwB3ANKWSzSBThdO3Z(w|ec80XT1Ta1QZVtgO>r5SCriIFMR45y~ z7~n=VQ9(~^&&5GfitMpsTBxs6jRd_(;a})>eN?@bDzab*>0BbBR5)6NedSezs*@C$ z0_1x@flP%%c_MomZs*(~>u#AM)FLyjp4s!JtwXI-CG~lf@lq}7Xf=lg5j2SmW27D( zx$sI{qZ%Fvr_g^F>`UQ>ltBv=#TjasX6~+uVhwib*33x0AI5w;wr7FupJ|JRMrf#G zhwj)A>UeFC86^gO4(Vg?Z`<-<R~><~6d%Wwdy^=43pEBicm^8c^9VpPa6gv$w$yW) z<d9i#Iyj`i_BstVX|Lo7@W2<;p8hQB#k3j2`!72vB*<cy<63}nM;5jy`!XM3QoUtr zZHWHjmb>@%fQ$l}9!tM$Tg7hN*$aO8V1dOmmBz+i8YE2Uy~*W3%TYZ%^xG$m8)BUi zX+Rr-LfV`l!zx3^uys|qQUT=$lA{`k*kxLX4%Y^IrTP_=P#jzI>y~GgG74#nWyC}3 zWIjjZ1-E5N`)CMxla)oSlaetD>%C4Rp;~2b0gH^s4hCeTpOfhb!ACw)izh>)sDm8P zVB~Dr`m0PsF(2r|BR>0uj+ezryj87fPPwsXC?yN}0V*Np+$Hcl;1TtnLHb6!2LL~< zpg@DhPU;$hr%7I0f=q)-b2R&~Nm^5b-s`9Y*FC40$o9Mv%HyH4wvHd<=<>pdDz?6# z##mu7n32n>9~Vp70B1efk|xd6#)uRU^d;>RobFFYEc7a_)RjjiqPlcdh`A;yFpu30 zCNq0?LuP&!{t4ZOVR2w)T_d<qRFzGvVMGGQ(WxKB+yF<vFm%T`Eype(v31^P6`GS& zN9t-xWrScWAZ}c@hJhN3+Rn;Hd0j1)--=EqY%RzUPEuqV-YVs#bcyoPq`*uXys^QZ zfIdfoKNv%Q>sF?$I|6!A4o(gA>yk$7VtpYq!v+QOeb_XU(Kl+8ogdrd(^OBLIQGBM zQ|(cNk~7T|=M#n*l^tU)$}Qo0P+CLbUfqfV9h~*r76)E1Tvc~b8#xxR9dt1W4zi_n zLflH|XGVsX+|S5@uxmSqE#Pj32kC0}?0Vg5C#fPs5l_a8SSmiFKKz#OW39P0=E(F$ z8a$d2TFm$~cr4;{4K^0_3z)2g{x*^=MkB}5PAj+5fKubqxuPJ}XbSKn_Fi<`<dFZf zXtqLr0E^qcE^5^eu|7&ry^vyN)|nyM@<d2xSaN%?Ef#lRlW@}H48_K<n0+6z-r>MS zny?m4tD1&VlH)LuX!Ky%jupe^U{`oUqcXpU&2w}9l4a#v#rpo?vOv7UEy8SlQ>?<y zAFXznr70PL7{5M;M)R2!N~5GeX_T#^)r}A%vGnwWl$>7Mxwz}%_21~7?9HvL&0bXq zJwDhI@VGTl=gb~{*F{3NcYH}R=g;EMhw%Utft+_t=bE8&RZDCxI$J~<2qKv}iQ3z6 zlZ9$w%&&I4tK7x~m(OvXQ@#1+nrJ$nQz%q%@=iT8<*1R~f5V!guf1VCS~}k0Iwu#6 zhtXO{2+GqXr9kGBqJt#vHb_{uqMhcm0b8qv#$&uUEF~N5sk1!+D8h%kYa17=_nzvU z?ky}WFWheuoXGT5S8-LIaM(h(TmyZJ_3vq&3-|20s59vGjxXx^qKtlfMU(-Uu}&1j zMti9$T1ZwBRn6%$ilqillmbu4H&B`|qU2a<Fv`V^@`JE|g-&OszvrU$TRJm?<Gs1V z=7O`fOF`;q=3O0K>t48L=Zd*-oWjwBGlkZwXU=z=!C)Isrl{Z7_=$P#j6_Js(TIOC zOZf0wchA}N{*#!v-RaESgY2O0S*2n;k0Vx55gjhO7wy`4ad&5*>m8rBjK!*Kp*Ry2 zL479_!?|?Z>g&jb&~AI#x@qz++bNkaLfAjatWZ?wuXNXTU-S-8V`i;0(+?V<*9gr- z=glJLVkgR6ySS_AAjK0{|GZ@`RGLX;emX&G1Dqk+x1@<yA%t-p$8nSfB}#$F0|g=~ z=2RcIGC;a5H0B%bs$8_uUtQ~NobJO5Xbm<tXN-DPR?!Nne@RC-)-KxhYVY`r=PVrU z72hG=O=PyWJKV9Qvrt{aVp}>qMeWvVvnj!HTOnHfIs@=<r?YXv2H$<Ed!{qD(wTY4 zx9G+y>VCp1o-Mg-h`O)o1j#B#Q(x0N7o$1j+3rq;2z%~Qv>>!Y6Rse7zy+S>YIRF? zEgVHp4T3rZ8<mk`OPg_KKJ$;{EX}L*Tk<g6!YY^!L|!PMOv0)raf)bV@5OsIdt7tp z&IV4`xS<`ms2W3sX@uN5hhtVKl?9`kowGX!@9LhIbG`Ya{p&O#Zia$TnxBafaYabb zb81x3mL@bZg^E@QFnM0UvFN<SWP35uP=b&J%5=&$-=(<L>8|a)aPOxYo%2`Qow5@I zH6K}Q9MP8Lf$QM_*s{d~K8n9V1;xqWBl~kgW4+Z{ufJ7D_ms<f(pz~+HtvV3rQ|q? z+Wp4%7<@9*(;h@&Q*P&M+Y2njW){3`1n)G&NfY)SWA?Jl<Df?RHrthWU}Q|EY|dHg z5vA2;>vbN{07M%{%`xUi`3U+t(Wg8VBOd~s^L|5oyB?ymfOwO>&7f|Kodvj`FYv1E zzL{4o#PE~;W&={avP0igD)s4^xkUkVnhc94e14hXq|?rx&;k>{MNO9Cq_J?$#as{H z<%tgy?-pIWy!DVFzESs;VrAr5!m~L(HjPM`Tu-re6%N3w`vE1go|90{!zVsMCBNFB zmSGaYJlcAYOqrfgY=!}8_Tmm{HgIZ|;x(iPZNUCGau12d>oMG)#~lf>7~ZluBoJ;x z;B>3x*-{`Fh1=>b5#+0MA;~QOd6e(Q^`SRLgJGHsdS2pCn;^ZWJgnZ?DKCV|M{l6n z2(DW1J+_?_cH%zLs0n6H$}o)^wYCz;2pJiUf!zRr53ut@QN8sb;}Fj{i2vHyv0U~} zl7>vrnWAgGIHNkI)F3TGysxJ&{%e|nSVs9B%Q)`>uhLu<c$KKjPubEsHX_JXrYrF3 zb-cRHt0%9!ZpSuXxrzH@cd`ucGK=YRt`@L5K?%~QO(zNIxA8d~ib0&M0-FuAXvn8| zahB!%`c?+z>0&Wd>ZLc;_>RU&mf~^m_QYSD#Res33)9V=!}yS{;l*NW_t?#UZThIe z3kTB8mbelH#xpL5RkQ-V6!F`nei!AU#a5<|a`^9$MGx8hb~s>|4>~l1jsvx%*=+QB zGVDt)3e*wgj`kNrzVV&=b{WwX7K+XVo->qassboCif>(xWn|E^)b!NqU?t1^EUPG) zF?Sk{EqIqID>yCgr{`lc-aKCg<4@|0Y3z_}%d$?Y3R;&3{)V4MVFs?j|E<<fRvFjg zU}1_vYrh<;d~wzxwP-TT*l<cCo&a07(fITDvL{sbTuB6J=GYw2y0V_P$yBQyqW(#Z zWk<xhI#9bUY~9A!fh<D|(K947qP+nVPwHm&D1&Eg1EwEm53<xNL-i@t0Tg7kvjx{$ zRZXZ#UWpHIs})n4=Qu>N>0|)=9wY~cs!-CFZ$|IOdkLAZX*k&gUpQP?t_f4iv=BBe zq0?N9Vx_UaLD#m3oC2|<c9W+SDNsLDL5|}K%Jg~8k)d?xBETh7ZlNc~eE$7WqR>C9 z$Sa<BBvux5|3tmHcPsB9dmn1<1zU^y{1r4=_3Pq;ym|ppf6#LCC#pwhwvfi&3dFLW zOONyMVcIb5aQua*DObD~5BVw-8@(K0fl$!uQ41tbULH@rZQRQ9{(8Xk!TK8S@AdI+ zum5GTHL&s?j85JwV~R1>=nTu$qKLd7PBmarw!;_=Mh&8}>9&7=n0I%&=-al_UE+Cf z7k#-4*~wjKC53m-y$_v1q-QYkC&c&TB?ITf?-z$3<|=MH*m$~D9A?E@k^hu)U6p8y zDR~l(wI4ac>at>VL(-`6k~{ZnSg$9rMVlX`?WVjtZdM%fsb{caHf_FI&83<}qNmxm z&4h{mFJIc&P~3xMd3jlkdtbIb!bZF2KJ<#?x3Uo~>X861C&VFzHzQ~qZ*_p$POUj& zb$zi}=W!nhe(k|6T785;dMDaU$)A2!ehU3S<R@|9J4Yir(<+?{{#!uj${_~eh7Ft% z8D;k}FgmQoSyli+KiR-pC^R)FC1}iLa_hX^vjyaf?ekrZclxxeU0<d>Slrug2OJ7V zTmGp}0dK6w9c@mR*K-*>`(Y7Zw`d@90u-3{3CPyAy~io)CQ8f#wDr=s=CwHUth800 zSKD)FoU;8D#gu#f4S<k*=2=3Uh-mMo-1Q#dj4`+PUfRCpy<n~!o$Ra*eROJg0zlvi z+m{)HtyY_C??sVO)7ytLa^b#^7lJ>Eq!jn`2={xuk9$joT}PjtQXq9wwIR5@uM+)n z96LbgICUY|3tNqCu|9BVZEON+qubZ=XBC^kAhuDr+L8T~>3^?C7G~_|M5;6vl;UpB zSe?<LLj}3s5`*1e*7t5;9&@mhPP1<xoo1~=={4rmX<z`{1CuaEwaA!7f7Z&k3EO#A zQ}lX)Jl8bhgQ0}QO95NF>aF|YyZCT3<mtm>g&ydlZoYo;kI{CCtoLGGYd7Jc9L)63 zOlxPK>Yty21{_e^BGq;sw4ML=C&ZpL3r<-!*DNV4NEUL_wUTc49ded8muYjzWpgKe zKr@wP<NQ^Nkj2V=ioN9}v}aS-X{R^yF|+_A$`e>o_P`oi<}fSmFsL4(sWN0tX;?qV zI@O=z9S=qe8{T@w)iqBJZ}miaE^15_f^N)Ie@F_T!PWUD_nTWy?!PA5hY#B#d(2-= zyWC@Dc6u76MnALJ{e8OL)By-rm2ooyLpPfEqwny?qcQ%=Fy<4@?sHYW4e)4lONOCJ zdPC(CjoB#dyxQXnM`FI)omX(TNol4f1dFD)*gdukS(R2~;WQ3EXvdDwv!ri;@fpVp z<FgmpxeMxU(oDhDP9A#)tBn*Fi-m*ei#TQR5SmKhB!y9uX@b#~Z?w>@$SIoHF$)~5 zXeGrq!rnc&uK+z-u{@8G9Df!q_OpW)Iqgc%D6py)nVlR&AkK6uWi}jDBvdN^2HJtX zPd#RtLWTw_aFuaJ2rzx3Kx}CR8B@u@0XSzWD$b@+5%*Si5TkcPG;C_&oZCi<dYsOb zi(WE|==bgmHJ<i^oJzD9XXr%QrG8H=3g&J!0l7(>iZ%6h9qFm>((n_5w53~4fNc)u z?HLMA`+#y3qC8S51)diqos$C;RV<!fbV<IO3;p$0o;8XdsTXNS`n1x|+SlXPZYMwb z4Au3(0E)W7;}j5ic-$3UAvR(tWH{G^hkpMpSsQwSI}r@~&<9pckWtPI%O*)NST?va z>q4L62g5G(Xg!T4{-#=nLYGUCq$3l~ZP{9OVmEhQ8<q`3dT^pG{rK0kqew<Bq<uiP z7Ml2@uukJ>Q+iIRWL@de6hy(fzT7ORM9+1XIL4aOk4FX1W|ca$H$A%5qK042_pkw5 z)0)4p8xQ@Y-t<`l3Vc1{;;(U4wC*b62%+mXUH9<|muYW$;aSo=Z)WB^n1=Dp7KJNY z{gx!M##m4C>FEj|8KqY~PIq@7K!r{IEI>rBL&Z3BKI7bN^+o;uL&c!kTtY7%<FamK z)ltgmzk(A|tJ4-b)i-e<%kYaiI9QImU}iD>)_!T0qRORr3Ax(jh+!4Huw)f+b0##I zwp=fWa2#S*Rt-4lv^%|DM|b)nGR$7f7mHK%ymoWgsT^7=IZDrlXl;QM?VH1cCzL4i z>bt-!Wi+gJ$_7U^(Y8JZr^j~Qb-)R<sno@z%cs1_lCJDH|E<mHRNLkqGl`m0<z4dX zqhh5urQ-N_G*>>5@7c||)IzaCv_@PHUXLhS(R{$oI6c*L1=XsD#g$?&;iD9Nx<163 z*Uz9dx;#7G8eDAb^NFEWD>*1tN}U}{=g`t}@J@ShmkuGZ&i0MvkC%08#5vg*bi z&^}wr2;zr@wfay;Y+nm;S(dK5Dhky&2qPmXsX}os<~9P4*r}V^np3dN3vJJ=qjDrH zIaX9Gg+-jUw%o)wN?n}mMmu{uXQ?s_jONU8lLHvL0h^256ee-8P?||gRg;fVL&tlG z$DK-6%h(Uv(=FmGVNzEe9fx5n4F{zhV;ji&cVu0Ix>!o9pU`$6t|@vrA5Uagdzip_ z=1)djw0mOIrRoOcq^r-K(bP%NQMF-cVoY=%ZFFs3^soty;FH~e;{6iZDdtbQz(pFK zuKo^=R{!Ka_OQ?Vj)^n>&<c0o{RRs+_!!G49Vt6`z4`FNci#CE`q@j!u4c8~SR-Y| zQA2y$Z2?PJL&qfEv%S!7%Vo2mqkVy7xQJlXmvF{?)XyH3oJ5`QA!vpN*#>H+GJHTA z_h7H^2IosVGTLW?PiX>~T2Jf&T)WvMt>cR;tF0zipE6w6s5Df;aQV2%H;*oH8>(xT z(L^C7HGbvTnxam1=VDhAy!MP~?o*t`{M_mRMY89j*=CN8tgrn5Wg&6I>g;Gc`z9<U z>YZ`)YtC0Tb}FjAiOxpmehUer{@taTA3goFC%_(xS`*!Z$;PQu6TD9Q+CxIJUOv<& zv-S#1k)Z++VOBWma39i6_h*H8y;2VyuM{R175JTP4o7t>=uqjDe|gl}z7>h6{yun+ z_|w<O8+I#4!y=t4^W#RS>~&z^k(<f3PJrW&4rb<Bfj>HpT(7O9s_cnU_fQ8ny-@t@ z{PDv6CD!CV&*vtp{V~3n>0)p;tG}R&V)mdVhtU@s_36uFo{ul{ry7lQUiy{R1u$E* zhx%vunZq-@^zMA`4tky#Cuw01wl}$_jcCFSy2^)NAnTmoj*wrp-T@yYJO_VN+qWT+ zBN2Z<Mla=gqQ6VUZFuGVLW~6Gn4{Ug4eO+UqtUF5`FPZ3HZ4r>8-(J!1fnU&)}aZ> zIv*c$$>S!ODUeNc_6($B_%uH%?Mn&nkC03X&;o@acB{ua^1wj+B{N}3!I36}aK&BI ztzO6yB=w`qFH5w~s8kIK1+=_3={-M`r2sAOb5J)aj(K|aZLlqR86bf?5r-lQ{4!0u z0N+T!TrNb1V}ZTD;eZS^{}hIojvS%ECC!(RgSlB)HfMyJ%vS{YXl4KXER#crbjdT+ zk74PYF;;QX6iI>16QCUzdKr}OL&l_pb6!O7&;tL<<nD^6SvUa26&}LextZY<&}79h zUPQe5x;3%n!}n7aP5P3P$ct3RYg{M6#+Qv<$EYJdRX>8bMt%>5*Y@w9h)G!w4JGTJ zg?uU!e`8(^8@D<O0g8OyMsrq23eP^Sh>ev|)@r;?#yweIr-^>}V0S2`a7c<*`J)H; z!rquK&h0xmSEN{z-tq1y&jI!1L*%i?$cKT#-0E4knykA=JS1<3L&PJp;so(|xAO7c z<UYQzC*qaDSI^yzMQR^?`t2A{egYx!*zVB%uJPF$IP{s-Ty4*^+q0+JowQV`3@VQz zDZFxc=gwJKrp@pV=Ovoj;vG~6u_GNBzflF%X37Yx{fG~Fp!{{HQc3n$l>j$GxdbU3 zLK7EgihuGzIOXs;n1)@d5q4n9qdinYRB<zd{)1}S3gf*~<w|RIrgeJ;;CkEikhQT= z4e)8o@|}cafR0yM$h2slUx#`W`F*B8z_<g}4j({=Xeb{au2d`P6#SsI5}=<Ktf&-C zp&bB)d(q<usN6igAM3b8a$0C_nwRi8Z~`|A2S_QMTdfw|>;+cfqJWKtee!RPxuoXe zG$`Ty8e+1r-1cdYO%7dNnm4(vB3881M;p!}Zg12sp{#y@h8UGF#|r_|rmTO{76s@5 zy{s*M>v6t#tjHH!?D7bYLzU>y(F7!UMngw@Ki@f$ajMK*L@Ji;vD$#Am=P7(wQq~X z%~WLM6v7Vj9PxU>?Zu5?((7sU#4TYVac+a-mhZZl&oAbZf-HExqoOP?iBZoJH))#j z%icZr!q#h_K$bDLM%F(h(`H*a#kM?7{f%C|Ff9iCh#$<(^c82LNZM7jMc;^})i*-a zl~3Ju*9Xvc(Yo_&32BYI*TT-cW!80g|BP{drTzLG%nM?;+czo}%|s<~b3rNX_NEH6 zT5u>Pjn4uP#;iBaL@icX!mE>8PcqidTkF{(-e@t8E}#>XFZUR-=SX}Y6t1QnevR`6 zGzqhdwa(9T9E*+6E($RYBmeO9?x1-UmMcAU&sobt67x+vzi1Q|KP{H$KAnSzbpadY z1z88SN46U1kF^<#>*D5m7T1kGXIJMs4K{n{w%X{Ae?@)6tc(7ee@Yj9YO_YYJ2%gr zLo@yH)hM{37Lzs8|80d7Nke>zlW>ROiGKQJR6tN|28M0XIDom7xGvvdAEjXEb@K+U zIEAK~8tq~U$&}GF--<b>%m=nnk86SISZL3Td&Z%YzAMVXN!nuH^Ow*D#F*@<Z?TSK zkeIGa%jY2S(0$05KwGusH${SvE=$cMUBwI62kSY;{g8OcIOf(?XDX&ro=dp=y@f&= zv+dAW%%)Jm#%U*rAd+xHPan}itKYZ@2ePn57flyRiR*LdL?YC$nJ?qKeZ_5bsuH^F zD`;Gu*VI1i^_jWELui9&Ks)TiwaJ{jx7DI(&WuA>RqN>1QALrML@J#ra~ii)Vcqp{ zXx`?Gf#IhM2^eCmUukDHP!RpmMmycm-?Yy@$k8EfwAgQu_qGa!B=Wh_id{n?uXc2x zS8+zYwpx|MD8h*`IH{F&)6QoT(k*EL-Jm*q!}Jq0DbzGIqO5@FPPEw%A|Ej|PXe5z z2>QN!xvUk?xD;LX;Z#h^m%*UsGp^+wEq1>}!kX(-x&gzqD-A;tO9>+v3HAUj8;yQu zfP$wA=q%y52mn&-k?Bh0n`$kPHw=F|Zn>O>y5~xd6J*O6cG!oTkcPado5j8kf2J^x zJBvgqijv0Mot+Du)Z#;SqRhKxTCw6A=zVvvR@;wD*tx)K^i}t+IZi#aa~4{1o9DZl zl2ErsI^@bmjzT7K380Y7D8#&3@GBb|l7(>W0c7V8eD#WGREyY?977i?`wp0kXK7F1 zeC(NZ;iJI^$`vSEW=>o-%v(_h8kT9ReXbzTp}0FRPOj1Zr4oiiYq4$X&$5oFNZ(p7 z{B6vz)rp@`<Oxeew<GM-00ndUk}bCu6m7+2g{DONdD?jEjuu5m6FvCzbFhAoP><*Y zL>>9j($^luKv=X>cvQi)pJF^RhOA35mUWSsAOsw#F__Rbxp$cw07{S({TAv&oGx|( z%@|!-Xb*U;=-@>kJ*-?86_}RfT94@NDH%f?v^8GWnXi3Vvw2-P2HeX>*nKSuD5i%* z=Wtf1kY&Cl=Fc^XXKSOb$Cz<Gr6&$<b}*W?fXzX#@A5a%NsiK~k84;v=5Rym^(*<_ z2APLA5;`c?OjVpH;lH#~M5l?S=Pj;PSRZ~_EG<<kOG%FF!mR%n>sg&u+vgM|I*mmg z6nr6q?ROtyRCWAXoYugHLCG{yw??$POx%{w#7#YRR<)+`6mOn1;-%aSv=2XU;aE_X z@i6EID{fJ^m8rKV`Z#Wd?4=31ZcDs3a1Bc@dtAYt)l?Y``O*78k)DQeUC|DxX7LbG z!(%=u&>6O89*3CjGtJRBHzcbg8y3<QM8Ea~4SkMKmJH~*do&8ljaa81B17xYMQl(H zk!ty&hZq6VcSp8oqt6pOM6*%$Y%au2S>Pe^HX02ca!P1GDG_4^2`g8%ivdc;W-LcQ zgStHIS-(=&=@e!PKtmxj#R(L}<cUbM(MV7#7I`1{5|(8DA{o6~TJjq#&J^<9I~kV8 zSqOH=z(M9H=3Dij<-I2OP2_RQ6d^?MS<w>i(8y^6jkOOe<N{>=d83HNWqBWr^$N^7 zQNrfJVWzEIM-BVGjvJYgmZY!vLR#YN_5+-D<Bb#z+KCerF&o<nGIbjFB0Oxi@o#IO z@hj@&{hlJWNs^M5pe=cPDMH81B~M67ywiF>z4^$ITWGI-?Zj?&m#S=<9PL>A`IDT) zRu%?R(Z?j;w54jQ+FjhRCXwA)qv({0+4G4XV^i({xka1v>y-*z#;j|<RxV>Xxp^4I zS*KZQMJHDPcO0V1l<&>xx6zQyRTul(Lbzm#bCzi<vgrwtbQQ9~#5i^c8+y2*Hx8)h zJ!=-hBk>P>(EyhQKutK0K>f`t@HMYKT!qJcHefybY4`p-Y-pPuBTzu@1vijFQ%g__ z7(w&6|Fe(?TwLI!pwvV)lrL0q`nwl$<S6dJd&*PP{e^r@2=gk#=7Zb2_p```Y2HB; z%dqiT2mb+*zC952NJZib1+rA<pee-4_r+2NUHmK1)yL5xc|UHomc!$CKLbl^{`kje z=%355ZJ<W)B)n532dN~tGpr8iCQf&4KouT(_^^#0*3(Cp@d*rGu+^4`{-gzBAVwXu z267PhAA_*-L?#Y&P3YlPM5-L1J*#5KVgcQ2l#(L3=*>#|8+xgx`>3HF7`R`i=}IL_ zP_B$U6t!XJz|w0qwSfx+57ZWASw|l?-okBBtD=IAZoC@RN{)zm3a(~IR^SMslc0^d zo?GAMj$=F6IS~~_4k!bHX$a&=;6e2)IvuW^?O<US?RASs;y+tvn+&kd!7rdrLF0?% zD4I6xSTl-&X3C<X$><m<gFd3A2L^66gFKE@1Hd}&G#MR2Bee*<T<U1M_9lFY6YZth zI<!|9R6=xj$DsrjM<=a?hGD0iqVRm8;uhA5ie_s9I$vx24C&(DnTZ!@o@+WtCyo8k zIIDI~z!<c16snx414o-NAs&EorT0&TqNRQd=nBGhH&sK%u9%HGcW}0kCcanM5katR z%hsoGYtwitM&}=26_v15Lo1nBD5Axigqx!%`K-mnyjwGMvpXIPL4Z{n&)dJ6_hX#I zKud4XRd<MbG$_hAqk-CgF2oU~Mr+1ZY1wdjv0Ua0*Nc_JP>F=*xl(Su0qX`t3DsZ> z3(L<|-ROeS(dcFO|7Y#JyCl1gJHdYTKJR^cpINr6Dl@CSg=>JY4S)ndCwc>t5@;k! zG@=mzf+G?XHI$=7(McRp91TScITAG*cV<>QYvvrC-9L8Ee1!cDyT7>aW#y~xYBV@! zd89^H1O0A9+=#g0;{`Z5?f`4%kza)o+QVu)MZ=0;tWz-j(Zp&R$j}G7<4pb*a`=jd zK|~sK(VDK|DQ=}=QuB(gIN|761lQMRjpu)8d+nKHXKgLmvdwsZXcSo7$t>^X<ihDT z4&L2!``E``oDo%1_hoD+s#~hVa$bO2P5;8((M`g0!!<%EX<c%8_zLCna8ibJp)bpB zge`_L6t36DzyNHlJd0Xy?BNa?P3%KYP!8y^PwE;tkY$*f<tb)EPjbt?u81l0Z9c)G zBCO2Ra5?pTZB!Qy?`&Mw4BiSJ=dv1j0FyKbk%nJ;3EV5#xzz--xmbg^iM`~$uRUNE zj%}p9E+#3-q8+l|G>v$s>K%)P%;{UruIt~_3j{)&b1Y)S%q|@hZZN@MU2%Dc{>N*l z9wRH|fk(?5qC?dvCQFc04H8dIDK8#@AWR52yejhrhm!VU%+ZTLGYD16XQ>Gk1^=r= z>-ih8QNoK<H^8FI9vW?pEC>rUJ)q;(R!r=jQ%z5kP_Pt=777s{^wJGiF#QOIkZk@b za()(E$VAtRZtVJ|8KMk8O`OzMpy;3+T_{*+Mlk%xRkZj&A_GMxVPYCwnqwU;XHH#0 zoy_Be>5a$Mn6eWw<syGFrt{;dmZHf~eL}HSNMe|7_qrRAELhz*?e#H%!El*vAS~}h zhKzj}spMcIN9OACTSCE&a!a#i>&Kd7xfaGjT2^=32oeVy>-<>lS*;lQThj_9EHKnd z&|>DOf505a_$Aq58pe8vf}0B%$ccMhOWhXcZ~{{V0w8sCEj$XMGVt0;m6W$i&kxB2 zUNK@ih)Su0xQ08|Hn3X-s{<4X>zl?IQzXZ3$Y$KnK=`JfV9>a(eF~LAz86H+FRQST zk&m^t#E|^qLn-E_oXItIeT)}oJJ)0^5sTY>8w1^dRE-O_PMrZ4J_ySepw3I($5sqT zP;myl4ODRIN*S-vDlKFB<HHV2azM^Z-<;%t+;sqXG6*a;Cde_cO#9VnT0(BQ306hB z0$!om2~9!-8eGGIRI$Qi*#I7WbhT__wl?tag;s^gY1dO@8oeY4D62nahf&u(gc*J= z_v-dBtQJ^-V>#rM7OP|*VDBfD0Re-Ji`e1#X(Udmd@AsCGqW^Ian)1J%_k|Ao!arZ z<@Bc*&>pw-qzMMY%x1^<K1TUziKYgoE7Pp2mg!;yt|wyxdDKm%Leh}H(<L7>u0$Dq zHL#+pKA`ib?!{|Q@DecpL-5uvp}LxLGNkYq!{DtBU4<jGozMx)@1yeh7eFYe?jlBU z2?pNR?M|MrAl(LcseI2N6<@>%wj0}%sJ)f9g@2F*$9vRk4b#1eH#qG|HR^cCKlec$ zF7CB2tSkb4f&8=Yt9|mkA91!q<^f!F>-T*e$2lh>zNu$dM$pPQi}S%gB1?FixJret z;zlK~D68P{R+Buh7>TPbdM@VkZ-5(JUmHR*FsyL*WJwLN%g`NojeBLx(?zwAtVmeb zDNHvSB0O6o3SmxQHv}f1DHuj&>vA-k^+h@PYZo!9PS|FC=sDBV`yQOs`Wr&f-hb** zKur5umes>>N3ib%aZ+ifH7UOaVEvP@c>XvBzf(!C&&h01P;k1P-4UtJo`8>1F;26* zikc>MP$!7DTcWC+suhn!__*jMbUl48>bR`yD(mbu<LvCr8z?~=GF#x0!~V?sFmW_h zecMlyk5MI;DB~4_PqBWF>9iTD>3+czR|X<zS8@0DonZJt1hWaM4s!^>lP5#uh<3@D z*ha@$v*r`+;GPLts@+?8IQ-0-IxDpqy(bhCeHP=eHH;!sqX5wYZ#Zj4{brV*M=69h z${Tv$GOVA-ir~f=4Jz3d6B0}&_B*x`8Liz!>>$`Km@d|JuC>(;UJO1r0HG1Qa3$KW z7o^*%b=klheHR#?SqU>*@j~;D5=po#%&nD#pFl_Mr(!ZC0`*5C%-sz#ujb=xF!h+# zoHpdnWEjcf&k&rwHnXyZKF;IaM*~Ee*3_U4xMO<n@BF=*qFU*{TTXaS7?g~`@w@Fj zM3QddiS_xLr{<--fu?n;9Vl%HG7WM4<OD;uN$FDQIH@acg!4x(8N;w7Svri^;rKUt znGHu(2~VT+$W6>hGwiSd#u@5Ogqi{uAy>)3JaRm?h5CU2gVYU?wOv)#6Gz709=SmI zaX**S!jh8~HekqFWNPm+;Ud>-W=nXlV$KO@hB0)w1LBDjpybXxC4P>KT}+QV1~Yj} zgj@ORc>YVWb0Xx{5pEcfSi@o<por4+49B%y;~(%ipNNT2;o7sFui=F8UZRmkBa%{v z*KTe9orAS|>Tp>-9CZ2p@qmyht*JvYL5^&}3cJ#hr|VMD4>pN@AK_=iw3yOCFFEoP z8W~fnFu)GnVaL>)=Mn``Iv17{wwO55gO>Sm-@^PB%-7U?X(I>``1CzZJ#QMAEAEXO z3UhQ(!va2xH?eh3bm|@F1n~p#L{N?Ont;6)P6RdG1L3(=g>OL_$L-)A!cILAJKzyj zqR{g~h<fK__%SWv1Y|qFYI`LrUZp<Q@nF;eb8)A#G7uUjZD~v(X2Mwv&u8iVfe2sM z?Dy$Ug^qo?Wtq#_$oA)vtuA-HR^&6sAN_kPx~}vs%hVc;#DRm<@5b1Z8nmW<-?J1H z%&jGK3eWi5FK{+-%yBBdbQfsORy4~a7c{#YZ0?FgN1AaBtAn|8=Sed8n+wUTKepIe zvi1*P29?U>uuod^uoky~jLw%IQ3NSyw$gk%!>fXjw~cw-y3>d|HgpMwyqd7^pY-Ey zASbS6`&)=@*s6>~m>s?7G4dr5S@k^S$!-u%M+`|y7C9J)t6-(PKoW=ltL$eNU0@{# zA3=VLnNS)&<kvt2-U2v1rBFYmZiERz8uGR)_@H=%jiLb;O(0|fsg4a39$Djq?M_^! z_qa;ml8=zHe;24><2P`Vg&J}(kiMse;9~WF-OkBdq+iGYAgC*64Ixg>-KB!3m;rc* zoJ;)r7Dd!lM_~aP5eF7(r8j%+jX^fdqCRT)nP&<{@M46uzS#7eNl=ESuoJ0`EsPqG ztfCi(Q_XCSC9S>#k7m0-&+#)~2M8SA+d2E~088~>1FW7RK3P$+#VPrBcY{%ieN8>G z?~izVtp{S_?~`I;oM8LQKaTUpED3vQ(Aa1j_}}&4>+G};5%%(N7NwXS-K*JTsOUvV zjrip_<<C5s72V!JGn=)t-eP3ipPEU^=<E<h0bysaU9@bgrXy(M4zGi_{X=VJq*I_> zKXuE8^H;HVip)w63+hAjdy;(o80l;!@EKQ$HP~A<TNj0)REEO+8O~Q+syP!;41nCy z|La`OkFi`&^OqezTpAeKpv6x&(8BUfDV^<jieu!<?Zj6s8+HAdNU+u`l(*j|x;uQH zJeM|7Ehn9HBzzUVKV<I72S<n}^T<IK0q>va&IwSg%;}O3YPb(7-c=E8D+Py4p$Z;S zXt16jV(*o6MJzD5+Iv&morVodPtH%=ktQmCZ|R7LA&_R<tw!OXX+U={%0vkw595bw zxDTLH(U4Le^4g~*E4@>p{@fi;e>96r+zYaZUmKRN(j?XWuWyCsXWzeq3{%%Qe^vc3 zh%!QZkd{#wm7U0y=t|aW%Abr)`Vark@aBj?HIM_rF1!)8x?yj)x@DkbKQ~7Tid$TZ z=^JL4cwilDV9~G>mdUT6;aHCf1<xlU>xttxeIY_Qi;TqxpTV3MUpN09N=h~Gj_pdl ziLYYi3nn&t*ql@6u>?G}BpxgH%v#Q4h(DJeBLs&#=ViK<qAaB!Sw0L<`8*asU!GN6 z)6o@~3Fu4pq(7C!*<PWFqL}wv1<+|Ip@#tI#$Wq}ci8d*9~u7C+Mb+^P1G0~T9jiO zvZL!CGw?=827=M5UGp&)cwK3}1m^~<0Du`%61~*c`v(LEqX<KvLQ+)MLRKRdO;MzG zo{sylUa0ov@DSU#m&>>5j?mbQRSm&t-Lc~!Ll08WPjyQ&P-=ozUog#W%!OcYL}|SJ zF)K3ThGZ+sUtzSI)jPy8@*Jxeuz|tzcANI;p@PnX>|Cdl%h(cOrI_dGs9(pvkGZ=M zJeC{q4Qrfz4czkv;F6BXjD^h1kCIRTmSl;6&LzhXo=~ua6>egm99TS2jKU@>#3sx6 zK)sIalpd$peBfHx1tu|uold4Qb2D2C5sWo-#X)qo;R#xljj>)&`>@^aJdAK%9}~Cj z7>f!uY#laq5h*o8$FNf09;xj|EzH1y^MY45!77j&sdL&&CPmAU3?+P4x8c*REqKz# zrB+|5b&Mh7;KNcRt+kvF&rP#&(%ouq54(NkOcFhojj>K(^EYRb5Ns@`q3UkWrwE1p z(%@OCKMihpHM%8;hEv4#Bo?KO+c;{aC%_3v(30M-D0eU~gFH)e@Hj_MpTuPZ;Ngm? z=#vcs=UIkzsu)KqG+}u~f$Qi((D&1plBA}cfhA1vY)}82KsTpz>_xCVFE+N%FEI=q zX;0Hbde6}f!5)MPGh$app)TrC+Xdp$f&zYF-+(QK2<F-XOE8(?p;J$udhU)`rJR!q zHH!Lk9M`ywORgZ?xHY*CMklmL4T4`#JjY2eo?%qI2Pd^e^Q|JLrQ88k!w0IlPG}xf z&xFUHi4y4m1H0Eq?+{Kv94n-NIU@bHVXmmc+X&}Bs#IyKd`eHCz+3K2fm^O|UP?kK z;<pio)hNInsxgR^K%LEwUG)q6dL`^0s9i4+#Wq&=&oU6<VOMh_+h{_Mii)nQC*A#T zsTkBPJN_+~%?X3W9TiIiM2DX#W&|=JppOI)X5EX&Ivyu$8sH8g-nedllcZ)RWGR*X zmh=7PTTpG#OggB`bFh0Mpi%xo*xT%MF|ec){S2<^-ZBqQ?<G1Eh;Ji=F3Z8;ZZ<e~ zfGqa0xYPuhKCF*gN!8s>E+Hb`0`0+L53eABG5{oI3ZYp;@?nfyAzLF!;e?n!vo(M3 zFgp&H5}YBp=CG5Ipmb0{g83mlEwO%a2}W#bd)+W1cf@4?sXbghROVAFC{Lu<uiL09 zwGA)E9iz9{zAOFOxI(1GBD;&suAn;gje}Fbx~O1X83$wjQkJ@KLe~gI4hH5=D=r9% zaiW5Aqx}!Z;Z~oGcHGF&;+DhmG%n!yHMM<5jXG&Na8unVmIzM#Yv0ZML=y&069IDv z<(T~z>b$H->L`kbc~qAA4Xlr7S$cz}T&;CZ3Ew5;PD*<I!Z32m*0jrUm~HjWFn_+{ zhEk>cLKu9p(jeX2G{_2{l|}Z8<3oZ)46|YuwT@BLydy@~PVk=uH*m0-*lM7T0Ch;( zEl8mX62)w0c`Y)O&9Q6wW?~}2ia~AIz78g;*F0jt7U*26ZysJ*F5hmocejS~VF=qb z8hloYGp%S3wy?kiF3?(5sHcRwu5S6;`1#nIaQthR(lVQfC^qck`nLz|N+wsj`}j#z z+jr|p#Mt~e1ioObB+2o!K8-22j)iwuU|5ZzYB(*`D@+Dh>KT$~#R5Ze9ox8Sm`zc` zOk8`wMTn}zAV}OKWw7b!DWIyX^`l>!eYNBbj1X?nl5YJp>^V1Rp>9vj+ssaxgd!xX zZOJHJ_e{+mI19bsvYx`zX<=v#a#EO<YDzn2P&+9~1**<%B)>BeKr-nfR>&l_f}mp| zNs0T%m_pw_uo`hQ)HW{<8z^O|OW+1H#C^y<J<V|`Z}+aqERzK(h|;VjYl<(zs?b?q zZmE<%FCbj|+Ss)cHfTSD-q{*<znzkI<Oo(u$-ldz>SvhX{^!cA$YNM054*R@-11uU zY$8ka0O}c@1>W!@PQJ9|!Tx-*q6ulrC0C5~tYQ5c6BREJahuBZJpR?U>=XrQx7=kb z$GowUBDRyaGwp<{{SVlq!ruYp{~^ih-*}do*6tUz^|)Vbt0*}@GwnZI-Sxg*ziZRN zvMgfaOjID%7;CV$kq^o^p~n6B1-Jg`S5%}BGZPQP%mZ--^bg|bnBVBiiX~$3%m1uC zJuO%rr-lAbW=nYXN2-fzw1(k!1K*XRVbJLcvK{+I?%ZPut}L}ggfLw=kD7~WpFnNF zQ$%6cMi@AX?K`O_#|nzq>YmCza#k0}H%$2CS%f(#G)Ar#Jz~p4(EKR&%YldELM{q% zDVIaQ4SN(*64l@D7w))=Wgm)*9<PlARhn9gS~oC}X5^Rzi)KtA(Z)s*+$_Stdl&K~ zJ3TDi3pNr(7$<JCAq_Ol7`8-2_M06TT&M}$Lg6gx#`M%4Dp7q7!ab{80?{yn4ubha zLQ`5*5F5aa=a+~{Y7tp!Qd;0VVmY1#DzD?sjv%Qq1`aUnk~5aEi0T##<Jna|Hj<qy zzNFD`Zqy4I_)}4qneKfBDM86Z!3FZwGP8@WW#+@N8x^QS(<7sI7V+@}&Falaz(ylW z7NH86Wz}^!O(&^rGMEQdj0`s5k%vpfFUcIGJcxiBfp<HmEJ?cjf`wU#Tiq>llyzvz zug_8xS7(?n8yUiB!Ni2sJPZ!ow(Nxe7XMBfFE<l894*^ox?$N`YPTjmO~M`N5tcy4 zmioBm&$1yF=-EZT#?5nZGwFX$LUbZg=mV7G*H3&<g<A3N8ETM-Bck#WfC?y|F285{ z{mqt!0(cO|G7%L*KZC4BmW-7ncv1ZZ3;P+<u0>RH^|&+`w|ae9Hrr?dk|o78Q8t@^ zex8vS2#km*g-k_s2&9;9i~&>FJb+yFI)=&ZGQhQ}3?ndB7f#o{f*96KAIaiU1nEEc zM$<F%vD-w5BDS$++EP?A)NN1*?Jq#Cg^*t4b%LZ3N>8|n<+8mbDu$T>D_>-O0*6op zdJ<N5Y8n#kh_(Lz0@pX&ncX=Z4pC-S__0lCYm5?b+aVSPqK?*>m}XvtXt3_5@?#;k zbm$kGd3UE}V$+zUqreM!M%QDK=3xVknv6ijdTyU`)>omk$x=+YfcHT$uC;K<h+bfS z41a<^I390-u#;9uNEu_6h{_P00N3KKC&aLQ6}{&I3xh@jyS+8+w1#7a(nkkP15nwD zh8j%`yMt_)v&eO!s7}CQ6m)m7KZE^y*b|LVmb^%F#~2kK+ZrpzJ?ssWOuf~CZP{=? zDm5oAn{*X9+tg*l==t|!O_>?hVo4N%zf7^Dq=v`3426_#g#{S<2<gK$N=uT%5+ky2 zo=?@5XSf(65;&Mr=mx5RETe&#ouFfPXrEz8OOSgpO0BS*+lj>hJraV1(pFs#3q9O{ z=`ggd?%oErmpkTY+{u+bCKq`uzi%elO;H@}hx*=39Pe6+ZEr-+m@+f#eJ8xP>#$T~ zhy`%3qSVG@C6I6;^o6+~Tq6Tw62UJ9%^)vO+oxcpD<(`>f}Oi!+p~hUfyRr}Mh4YR zY_l+Xwxv2MvZ$z%RhiTBQQZ`|I+73SvHHCUZDy)cf+s+691M&e<$(N_9Q2ZQSH_m^ z0Am_VtOdeq(?A-AZhT;ib_0bkq3;!*-EqbqW-P-b6cp?#L%y~bqxdHeTnq%q%G8>a zQxvMK>%kdx$;6GNDx!Le{p24vHpdOLwS|tZbv;ELP6Kg!k#z>x71$Vhjm&Od@)2Xr zO$Dn0^Q89eF2(*8+Om!|9BP?gt`bPAgNVLhE$G7X(Dw+Ku;K^(rjfS-J;FmOqR&Nw zjq%N}Z8z>&4h+faFV97r0~825E!4^(W3;vyDD#gO*o~-8fiPL6sMb$!8GlzRNa$#~ zbzXr8VE)7m(^0!;8s~c0%Vn#Ums%*)K+m<A?sj%h`$^&S49$R9j&TGViN7?Q`(~<# zT4Ka7tii}Itk!&J7hnz>`EVr5>rubM(n5&%&Uc(ku}c_ZXd6(8{fI5`CID!te&`C) zxO5{cyMYI28HGY0L`Dn2-=>SQZPh3Wxre#FSTa&1Vn8K%@fLEUhKFzyR`Ox_fbw&j z#g5)IoJ-rjZ|AMWj+1r$bR(FWj^9|i_=<<=Pj;ld;v(@~yG7my9T#+cAQT7a&U9tV zf8A;BbT_8?xY5(C<~0mB@|o$50)=_KVf+F%1)w;szmdCR)Ye}!@b;sq9?{{=<CfnU z@FmdYyulxBx+Rc{K&Z^UBT!gLtug-Kkce|F#StDR*D+HPM5q?2=?sc2w~Hw37n*3G z<lAY&OgT63sFYh$RIHlDMr1UAq3<+MiV=({qv$7|6<Zl-Vq#r7B9t{woAZ1-()z?f zC4hH_5Wd)anWoV4>J3G}%Gwx3+medlIRa^xH1s$7?XK6$v#qWv+YaX9Mes0~^sF8t zc!)q`in3`ew^flq6*INBJ4I=6ce5FJh1>RW=Aua4^<tV0w)Q-yu#bqEJQcvf-A`h; z3b;gu>ny=9orv-cPcW&R6b_&y?e{t6Z1+Z!C~Bf>v)Kz!T^kHrU>8q|5GoC1u#Mqr zjV9hx^>=f*cW&q+9peh_PK!N}GzTLqaWsZp3%VG-hUKS<^|%)$j#H!NLuHM+L%Rr$ z<QAM?s>oGx5Dc(V(JFoe*yu-?r=@*b3VW%=kXoaEhn}2%^eMF4WEqU&%s^5H4NP`S z3)y_jh=X23mK&0ZfR>%%@t0w%Duou?v4=e$wlyu7;TkaY-yoWW?e&5vvyozQV7kJ( z@g+1Ric%sl!?Uuk$PhTw^?uKaif*8K%)k_9<Cxy(_5l#&tU|I>2K)KX{3eirsnjqy zi_~zL_TqeB{WYQiY%*xKFQ-mwg?oY=3bADs6WM8=DLPn@7REs<6_o^)o>)+gp=TH$ zB<bE%Z93UO=*c7Y<|dlNv9Np`Ii?k&g&@>|c7p{Dv$};lkOgQ^1gjCT29Ka2UKpVo zA;rI~TVj0PSwMYt907hi*xd*?Nl!qNRjABA$ilFY-I1;+`9`L+cME8*FlmSR-cKDp zJWw5bG)xPv-|+`K>3!b#gLszKmMCSd0R{;Ve<xrIlQ+Vdmq-K+nUG!ms^sRGlx8R& z6(TjHVbv%SSG)sE+_Sapd3gi2LVCKv6b%*wd`%g<(G4^{<1XuS?s%4*oH8<9?sP7W z{V`*n(Vogdr!BWys_zN~OV6Wa1||Q|mA@8!B!tl7eXtqJ&GUT{ftV_zV6KbD=tz@N zh$F~jf#xrb6H*c-#^2Hc$5YTI0lhA{Gp24&{tU}4Bbe285hpgR*bT?ZWx2EO*QiE2 z&1+x9r-{SXpZ$TJ`jH9^39}N`)q$>^+50!9>f~_fJ<K0zVG>$r9=KganOsWh_pwoZ zd6i_T0L7iadn`|Z36a8=rG(<gVf5=6vSOMy8Ys<H!0yL(NQP24ouMQ4ha%J#dOu;% z?r+C(INi0?6scSIw&+b1Q9ftX?`Cy2_`k%iBodunGDOKC)!8p#xq@J~6&C67&XzhD zCfYOT-@()~(X_NcSO2|;Rxv>neWqVNQz+TqIiI!AWo30!xc(ycT-o)G!OaTuKHU__ zAi+TXF~@p;d4NB`y%C{_E5EO3NH*ivgkC}e7X8UJU$vBQh}~rvEDSqBPRA~LnQ4lM z7b{d{Nw94NJEB!Y*iZ(78WK275=3Dw4R?cq^k)r*zrr-fhOaSM+<*sTS;^i_w0x=A z4k|81C~#Y8?FRZckpC17^eDpG5<OS~x`RS-n3qUYNLY@p%g12gdoao|6kH`E5&-&h z&ZS%j9vAX=NM0)qUa|tIu|F1@Sb8BT=vT5d9hIAiv2<p-lFh6QjHio7AtH$GSLs=S z@prG|Vr_?@@2S&{DusKwfyAOJ1`uAFEx)D;-z_@g1I?ifUJHQo5m^KLL2#pPOb;xz zbKos>-7R)A7zJ>idXZsjEl+UKqy+QTyr}I@n4DhhSV(;_DKTx`gc`-XHVmtN8q0fY z@L<Y4P_L5!K&|bB74Lv);Xji*O)Blx{(%Y!anZ$TVqr{dz}-+1MWKm*XeCHmbS?0f z0{{8zn|Qc3hPnU-$7pguY{*80q@@5=akGVKg0j0fRwGE84z9wJJGv7(lS@mfCGZ3P zO&uUuYJ|kH{4+%TRRG&;ww=2}h<=&DzN-8Lll$zrgQjsS7Vi$QEC8|Z#&F3K__b&^ zs^9TGqz{=O?w-&az~Nm-MoD3Fn;E~7{2i83aHE5CfgUIr_>sWGn^|_;F!XK<-I~nC zbH0TzfUQq01Sn8bVfu(@ib<g$>_@Vpqt-&VrV(ZfE}Bw;8I7W+v=NFrR(nLWy@neH zP((w-l}?5QK-~)e5+tQ@nHAZ8`L&>n8t5me<8qUzn@<H3CYJw+*8mn!*YVm&@Zh6` zErhlaYFt~+RHA)Epl+#A$^YQyN7Y=$nfgO}a?l7174b<tu(2*f!vuPEwyVaE45bz# z{{G&!1?Sg*?!SH|kZblRRiSN?mnN3ypeMf)l-tiCYC=8|&}g0{Z@J^CzZNH+V_)@9 zEfvI%4o-sL9}MCuF+lZDeGV1hM&*~?A2P<66XFZr?Oi^;9CdO$s*5e{fwyl6sfTV% zNNb1)9QJfu@t$vX5w3uWu$EI11rR8Z?(HL5YvmY}Vk(NIo<8l>DKX%amEj}T&re>* z`4oT!Wr%g~&*^OAHGugx#4kxenMP=(=f`(~>rY}V<cw1ixns5o<|uN^xoyHr%$Eqj zm-ZLLj4Q66$cWM^K>s}aDxq-&ot<MinVL16dS49~qH30*YBG8{^-WBCm0erGBEPkV z(nXEf4sirjerf-g4=Vq7bpa$#q$_dyiYZDWeA-afr@^Xptu-VcOk%Lbo&{b#*l<=S z2WSO3g6Px47HXs^R(<v<hCNnTmxrxc6n*?$v=KTws;jRO68Lk}op2rhhb%y?W9A_u z1M_90tEOFD+!ipkw23NtbhcZmsyKl#glGQuu;U6xMron2cP>=??JbMNXz0hg4Q3Nz zqQa!b!YBN;jsKr$(1~l>U8vXjly5Qj>p1r=UmvtdP0IF@SAGH5_e#0La`Q&?i{pW= zS<*rQ0u(ijXmS?kIxcDzi<K!YdMcOv7eM^KiM^en7wFi6x7+<3M&=-NbJGY@^uhg# zGTX>nj^T8Bs^iLtS|vC{^1#{a3|n~)kHm3@g<cKLakaC`Ck48vl(c<fIUM~TPB?l$ z^U#Z$eHx*_I5AvEL>&wUUkhNI6%gtKC=D^zWFyou#I~k=$?w3MRbJhZgOfn_R4N!k zNX+-cb_W{_+RH-4kOv)AiyGBdpaalOjY(5=mthxi|LDx7iWVmLLa^-Mn<Lg+B*&^5 zOZ@}is`he{y00C*I=PZLm{#;oeaW2Sm;^H*HMKimfnlwnFgRC)%}9i~`BqoUk*W$i z16hs_kAt*B4A2ma$VR1C-IhB=8m6T6%2F!n0?;U&T!m_>#D`zo^4%ihC<^+L^H4KV zuQ235>odt5j2x}=U?2>b0r&mgPENzTncIfPlW6b?&_Qd9MGrwJ)9cK9S3!`y#*0+# zv#LO+uoG7bFp79K>_k9Hz>`upRSNpecLfX^o}>@i4iq)29~#kL0>naoEf^IWqkYs_ zrL@6O_1KhK&Ri2M>YW3-f^-#6jpr)Az<KhwO00FSZQ8@bnRr3a9H;31zQfEL=N!e_ zeFDDaD7P{29HCYDs0YHql-{z2y!Ju*e)Y`?-O5b-+2C^dc{6@9KcMps56#($6baB5 zzxL3X)kzNX3JW7;1e;4m&x}M!MlCutKwUT0O0HVR%iHHKQhy~chh*%L{RIxeA6|<G zvJx9=7NSG~3Lb@-(Pd1}-|<H&Q>NPys+R&YenWD;P;A9;P1Gs&EezDwFkwM)W?3&# zn*NZ6kaTJkAV|tQUP)1YDn%u#<lQmIkol<Kf!L54QxWDP2l)z+q<<@vu}zbQ0Neo= zq8+3_j36HwiZ>yc<l6y$Ccrog0J<;eBu!>S3biIp@I(;duY9pmTHu!xxsFUbPRbR3 zlRL{k8*L*RBh6xL@k%F6IrHsC4?X87S`%GaU_;Ha9GeZ<?w}(#4s*Ot7Itz#85<aD zlV=g;w;&CyYPN{XGYWo%np9Cd@-p2h_mCjw<Q*OZh#^<T<GiKbA))8+g4u|U6fYl- zA8X5ZhtF=#w9l0Kr~{AF4XxJ$>}jC<_gp!Foc{6GDM2@8WgS#BM3}mIDCnX|LH?x@ znEB~07Se>zr>NgIjExKlDb4sQm~Cs*k;0uxAg7Y$utaakw#(9E9iJp=cR%H4EU~*6 zrpCr$_F@AgK`i^Afw-e-{fVcUhf5rAelJ#=s5I1?){r5g*+Pc5{sPh|BlHd&$7gXH zKIJt~Yb2gX^}BaE_uZV(3(OdggyS$ME{8#L2!<Aa_Ynv-;+m9qN*i#3#b>3~;*7Y~ zUiF{`uTwgTx-9<@)dL9W4KO$;+Gy*8nY>UnR|&43H$p_s^4-|7<@Pz}B}11mJR8$< zw#K#;UyLkALPe5eN?UkEv3dau4ndx^#v_;(WzOb*1g@mwSME0N|Et#tWt&s+s$jc* z<8?u-5k1}T7P*J>zeLntt!6Q<p3{hmWYqo_QUPP9P|nQ)Wzg50cWKTfg2Ad|1eu5M zoZYg6;+T(HV4~3UHNRPL3Dg`!V1DZfN~zEy0Y<^QRO^J(-pM7-h~bph^w($|NvSD} zBlCd5Idrhve>pj$Y1pYP+Fg~o-4-$@i1I6vkn6EwvW*WuG*{$ebK;9sdyY{)15_g@ zY=kX(h_ux>k@k1N8!=W{I-r9T16Q4}JdSv;vKRj=;-`)tbgw$5$L!0GV8oE#JT%Zl zrdb=ahY&;%OtiX7-ZdNhM<mCR>l5zAplJC@@b4ct^u|z%rRD}bf30O1{+6Rzjl&R2 z546B&Sqy3C)`9JeCQdVa&WLjj0VxAXHF#R6bdL0n(Lgc2+eSBJ9Yd-EMJ)>Hs>zB$ zsKJ6CM&=*kb_C0q|A*uG-(oa`gUuwgDkhwnY<ts4L(M8SLu~jpLHCp)!TcQ7iRZd~ zt*|V6)Ubo5qO{Jb8WJXG4MvfS_#O}0Vi!WTw)m)mlkTvBfG+p@tguq-OPcI@;`dz5 zzPyO#?7{&$XKFW9PT8&fP5edZ;1b?vSgZuo9PgNTy)#BnZ8rNgM^zeKG>>oiD7P2< zJl6Mun!MBZNFyGDhQ7(O0p-(Ez2wB=Pt{I9TP~fDmt2n8Co4IATEGw6s$Lc1@wJ{Q zeUaH~oV%=^mV^vrN}Hc>_Q0?$!wGBzadmXCo^<>I`((`6L{JyfkHWp$9Sm2euk75? z)UIr8a0JR$=wfb|p(00dpo7In4U}ocBUH~cPNN`Q`yPe>!M;*FR}&G%#%5>~^I(BR zlqUhCt!4vI42a@+{O;~@VuJsOXkY4;tFLi>`2fLa!b5)-ScK{#@C?=c>D8|6*8>;K zDi8%XgX<{o<=)qT?c0Lu+i0L_D(Ej_?p?rBQTJldet8=SM+w!_wVNW%ek3UnRxYha z!IJ+eU+!AN-NHPZ(&jH!jvquYJ@~?vv!UYcT=FgK_(BDX;UB|$rQPrR-HQCxKYo&) zIq4J|)3P0#F2G7oIB`Hkms2zYfc<OSK)bcc3VDswIiX?qRqUTEf1aE@2?7QhBVTE& z5CIf5od5)4VJJAY0xQ7WI~(<fbxlM&D3Y{NArnX%5qG(K%9viqP$|1HM@PQzI7#u6 zkc})@cFwc`qg!Xk`b0v^6Y8D(CF1y!nTdIxGAFlu_lear2~Y60GaA(kDR|~F`q8Z0 z5zgDc9dhUmVpHyX5SNa}PwBJcXEr{M?kzjCQ7VKQbA~ou_ELTfxkjHFv`}J(EFGGY z1x$gc-QEUlq)YT-qF$}C-Qp5WRCJa3OtKrxqzt_*_&rYzs$9xAfdOWzwLhjMYA<It zrU3?q?x8|VXL(|wZ=ZP+eJCQ^;;Jq6**Nr6*9-pzS~>$n>Je?b>aq}JgYrcTvcSw_ zrXYj(Zaqjm7CJc+iGHe0k9CxlaNmpmLYl|p@;aq3ClnAuy93-ylxuMesQ8$`N1D4T zDZ-B>3hOH-rTK5rGI=W^LrGUlJio()7J5H{)%yS`VN^y>c1k<x4ro<K|B~T3IbnER z=g7Ug_PEsS{7qiPN7dxN*d3L))-UM@!&2`7T`rDre}4Hjt_|3(@2$e}FhI$LgIYAG zD2zOP-Pc$mdLKGlEJ=oQ26G1uK3EWN6s6$(9F<AMH6s{rbwv!afIE3d;OHZLXCHMd zy65jMELro112q$vo1{;Ps@6qLNJ8RKGZ7}Tno8KzPS?9DY5Fzg*Q*OBn}hp(yy%2Z zz*G6=30ftJhSWjPi67*>l$k*;%%!xcZQAm~vL7>aRGbZB*08aYr-lJVKg$nt`;XWS zD3l=vWSw~u>6>|ndAf9Q51|bm!S@0=Zo_Yi`XaIAH_FYniP^%Q><8%siN&nZ7ShNu zbjF%aI0X+XblV}c1H=;~TU2MT)#(o>+F&bD+Dg=fi6<k_;~^WyEL+JCZu2%;3VJv! zNf|b1S|N6ac(I<bX6+P;o*jkoZnr4bG4v$`&a0<vePM_L{FW#TP)lR8{seW;X0wf4 zLON^d1LUq%1j#y(eGmP`s1@E%;KkWm-Z9>9stf~0@S|X-7D^^DQB{j`6p~t~`;t(< zho)tyf2^g#;0mo?5m{MbAP1LkfCL&*+%c&xnIaV+7}0J1G=|KeuUw15NRzRguB96- z_!BG-b6vO66op#fVXUpWa)PE}6%M~*D!~Gs1<L*yMWGm4+cD}^Sa~{K#_Kr!A<sgv zrOS*wEikmiVnfq{-q!U_hBc;ct0_m`PxUxA1EpbNXej2BA@!eL3$RV{@-AEn(-x){ zDwNh-anx5?xmDzZSGR&2;?Xs({%}QqB0H#tPC#%I#X}q0D6C4XsV}QpjD~6n5i8@L z+04bdKS`&dkeG|9ie40;1crvItj{DLh`$8&f(lM!5c%j#65}7p0b;f&ATVts87~es zhRsk1@Ecl%=ILs@XZ?X^1Orc!M9agl7YPA9F+vXo+EesnRpjK!@-u<l(S@$#Q9K4t zw@jygNAXqkaO=t*GFw`6ro;nG9nJ@lq|PvlnX%^3cp0uua*lz`7`BJBP;X@zvgqP? z9bK|@Z0lD3`eg2WajrUc^k1q-6xgb%Ty`+}VmMbDn+Q{MwhEaoFyW2q!_(&P1*+YA zK(`H9ha!WfMHItAZHHsXmL(qB>qHyi*LZ`k`C%ogxtd%#xBQRzpCGwsg_9klGfB;@ zJ}NXA3KlOF7&?G<*#ip=Dd>xuh3pkycIMj|T2S^q%w~o~0YhOIZYOqD0}RZkuK8^q zw~mPZ<n!@BBwkhi(yYp#$m{w;5Z-PM^mb+_XE1tLu@tDCe}_ha8)s$-#sD7NL|H2Y z>w*LI)7&r+e5{>fahs?*fa~b;%A<%Y7=AQPp$Gl_&SZdv(E@ftQo#iqZsM2Gt`TYM z{nNcnZd~8OWNP&sOpECSH9`@#H68?7`iSe)@0Ra6QKF-`J7p@4l1m`=czzjG`I;hM z-IU#nGcCepeMeJR_d&JWR{Y(Dt0?WKLey`rYnq$Lj;`c`zcOT0;eNQ*Mv>KW$x0ys zBS-%VfkcMJ5Ohzp4zb%5BVx_i+m7U$51_<o+cNcU#JU!2VD5z=VI9Gh3A{k$jy|YP zQEnoM{kksbt<Ej4h)S%G{G_wFBgkcA`4^I_d0PW@HjNGhK|x&?tS>$3n}2}5ltYZ! zOm1|Th)y|ZMPxNFokNy@-&*={B<%i@2cT<iKY?d}f4sNQ4mXwJs(>siSWpkm=7x)L z+s1>J3VHm{7-hV!kCq5s4|@nTC^7{A>vW_}28!w&*{D2Qst%B|CAR2uTa^<S1-&bs zhdK6@x<g0CoM9|7Fa7!*!&e1#`<Mahx@@Em5Nk3u%q3Z15s(*RO^Tr?ddE`-Ge1|A z{|x1kB5p#@w1`@wR)TTfm?O8N*z{viAfUpew!=QDwV_AYu|Aw5FB!5DC3O`^`iaNR zNl!(kESG<_T>el^XV`fo2n#3)TMxFL=wcdkIyF=qabjaH*6q+(B+~C^aA8CNh7fAb zP?8K)jdxLKK({C&UK9(`jedsOeW5Ri$U|H}96-<Z(G$TnMwPKIi8@BjKy|y{4VqId zjA2^iJc?7Ty%;ee1R(Wmxgskb$}kaELU9)h1_y>d+zH<&FddJyh*Ibnw4-qYC{i;O z1M{U(XK-c%%SF8HdHs$lj)FTz!8`dOm4KIgIwn7eEVF;24lXl;+Unoa`zYLObSFh$ zQ}<6dBecuyk8Or<d~PE+v(B<pj~UfauTVL;+K?k&T@Wc!oR+BEw)%%;`=shaG-g!g ziCD@)1uTw(Qib2Ra(IVI#G_)x1MWvtz}KqX%<VO2#2%z|R#$RlRB))EJLdi0&bDPa z$;|>Xg}9N2z$m0jkp)C66`utde2xlz#Fgy#9*iXPN@C!Ljis?}gvvemWC}_dF^A?_ zN|naeMpT36D57+0`3%mj*Vw#QK}Ddb`x8vL!#bO3SLqC~K8g9r7`xwt>|hQ!!x|n# z8IQ60_H+}~H97`D7SpJvCzDfrM=9SSdWdc$tgXNtn=$k{-?NI<K8NgJ@^f9|dsdlx z6+;X4C04Hv&o^fw4Z=p8%58=sCXmFhe)ysK{g?hVc~89BnU-N-Y9!jWj<&AyWi?b( zKcRd*iNrrNqbD=*XzS|JBGdDtH5MJOm9<$P#)HT{g`$*r!;>&UMY@8mtElsHu`{qn zL#Qw;Qy<i}3gOK3?=|a^+<qiOYVEVqZ*|z$km1z7fMRE~6|G+mk$k{IG?X4pb{>1| zD<3^;{^&>6=jytb&+dohL0Vp8Pb%MN`fh7nZc2@1B`P<iUSN=ii!oo6s(wY|i&B;N zLL|fJU+Z_ifsUVnU76*=Oso?D32%Jzg_{u;LSg${fOf8*d`rtWz9nMd#`^D;8%wM0 zZ!}(%mXTm3>Y5&_1)~SpIP>*#pJXOJhxK^0f)hVKCuV=G>aS2c);-ryK&^fi|Ie;n z(QDF8-dvAj0BOu)01awGs5~&34fJkP#C4wXt+7N6>?d9ve0F29d(Za9sOb0i`#p7p zGqe%D{<r${k%Qeww!W=QA0BNyIDS?Xy#<y%`HLE6e8<Wyn}bSRzQk9q(qhu@e+6Gt zX~Alpo`~}t-*S2aG5DUD|CX`&RmZ=-p>-R{deLb#*Ndw^V&@;ini+f8rj=m&EBM8@ zc;2elI<GgaEGGbgQy$J@%J*$8_WxpQTUPT!UsW!hf%kPe>3-rvIzFjeU;7#=UFu)r zRfWjIptg%IIIUeIn;hLKdLU<4u5VN;XYap;mAmx&pS<)E_RRu5?Q_5V<xgQLj`5{> zEEMaW@zKS&Pm6)rv3;k5o%dkhX(k>mJpIgvAtCIWuYL-Rv*wHSIu9MXV{j@!=NRom zxq^W+m<x)1H5-T66?Bl`;t$943y83~{Ry@fLNLL{|ERtQN(K+P_WRW<3iOD275KMb zK^(z-6LM^4wzpB7pU*`xxe$nAaA9w!At`xXQuR}ibG$CF>6TzTb;Wc4`)D$q3X|z< zwAyI8Yv?=o@9M_RhZvjkrK@XcscpnuFY2r$W;_@ik^Qom{urc9NJh-d=##=C){ID8 z^1+L`{tA$&!&h!|Rncj`lE6~+sikbh@qaA(*igIL=XxazvCZ{YGVwg!*Nc{#ToglW zb5*Y0DgiK1h{zyqishsgO}}vVu>_0FUc9jU4Gg+*FTd@ET!@oLp518GHDgE;3*Vo* z3(@2SiG^Okb<jG=BaQiSae{^)T5_uCQ*1r;*{dv>P7_88PwP^}ds&K%prJ5Cc@HVQ zm-u0hT7(tmAJugOHUmZ&NowA6#R%4els{OAAMGRf2<Hre#wco7iDX)GD}57bg_^Eu zK+{afMyd8N)ADFAE~E-&!x7(ExW8DCg`LLqj;Kkx=&LVe_W-oL$?SA~PqsZCUK{lK zA8U*{y+6UN;ogMSxsCwg!%BqC`L_Cj;xK<K7d`+UTXV;VPK6MHP?azvfWc44W62dp z%!3@9VaDUh8@=W^Y%ragw81pMl9=pVHgcwR_F$&O_BdA6?ao!4X*H7_3@BKX+f92| z0JT1o_X+R~eoLUYA|W-uL!~nKpFkU}?MK`ScA^kk41N1w8hx$^ivc1Bc(hSl$8{KX zASD_G`MuO{%M-Adwjm~$F-`#Hs$`9unfNq>+<Zz(4_u^oF*Iro4S(&>Y77eSlhx`u zTC6lYt^6fvACGrOn;YX++&0joa6Qg?yW>2(j;0j1*^0j0H?-0DnJwls$Jjoc^sdef zXO@d`z1u(K`velcWIjPd!eI>K6Yf4xUoIgw6o{us<rVn#*gS(K3+#-<;H)q&@@|HW zO=ywu+llolKO8Qw55$pGyKnX#skc9neg)HU{50<F9^bx*mw^aMkt%Z1CU~Ua9P)06 z@t8a;?Em0T*%y7^WOmr=xQZubu&?vPFg+hltW1xizm*ZBL8sQ~k*+U(ub+KQHyR^s zU$U`cDz=jQYZT@C@34PP+(^JoeYT)bIG710=aK^w^<ThTZ<jVw_zCL7Ex#Ly2}{lo zBshcD2CiY@1<6l$90X+6mP<Juuk<wWVN!}%`rJpH86+g9dOrSHZ?Dw~au>4)v2d&_ zbvC=0{5wd)w;T*c3lzN=0j33cc5L{$Am)3$=2l*Voa@SxGspNMoP|F96ZY}}xe2uJ zlOOuK9Uobr!f~QbEHSk)F0v?0((q$wQP&h#wi;f5K_}4w9axqu$n|<oiZLzmIZ`8p zO9^@vLkEGlok*e%6rZJ;aP16Z33I7HTHkVYJ&&1<jJut5Lkvq`KR20gBBW~xyTN88 z$a>gRk+bn_rP$jjjJhX)iLqF!NH+o=fU`n-EphwlUwNY53eb2IIdR_?n;(j-`0;1Z zTBe$<B5Kz3ly=HJ1yRO0W)hV|9pgzl9H8W!K{`IrZ#El+(4YEYB)lQ=<cDOR?LIkW z`sj&$R4(`S_I|z78#QY5hD(c%#>om8%-{HC1FoGCI4%nD><2t_x|nYa;dQO$wajyp za;(IshRkyLci1{qAmE9hbTjiTHFBD9_^XbPZKAu=?6=N87UIH;Wjm>Ruk_9WC(xq& z=mZbOc>HD$-uMuWYLV924$d&+o2sieKa`?S`@Qe{L~yJ+m2cm}-b(O%q=Guo-z4Ao z2atl4FG%#F=s5)LJki87OH<8^tc7Wrv5@w57Z0L9`0<;F0-245iD8p<j6Fb?0v_-S zEh(gnTfVo|WD-jjVhg2Aq5PX~IR}qDfBVxIY3$VB!#&dPaNY5O;R6RHQxn&5?ylG` zDY=h(?qCnnM#SkKF9aJ=<gDkXUhJg}03B(b+i<ad%5!ukHc~H&?a2FcY~(^l4rAj5 zCpR2K`C_Mw4Vzk8pzjn$ZaC~Ry%E%8`3}3}AIw^<qA_m`13$#B&^LE9*4-VCsUMei zh1RLUH)CTQHrLxrL|`V%eY{dM#0B)8gDoMl51NQ@$5Ii#wS^{~*fkFDbFNEgd`pQP z=LW_xJeD*rcs0n(Q{2YION=^M>>MR^NeYyelBud+@A}xB7v`<UJrpps5#;gb?{7vJ zLblX{=1$Y^9QzuYB$p)TkQ9KIK+D4&MCDMF{B>uyBec3#XZEHaVXIpsN*^B&hw}pQ zjVGmi7@5&_U0V2V&Jtr>5F%3*#wClrfQIEbkc;U09(o;m>>;cUk_*>5kL+x{wus~x z2oXpSJhlK--~}W%zbwRV5B6A?8%8S<?dQ=Jdv+H3XB<2_k78*|1AgQ>`Vk}7#XT`Z zxIihOSLt^?Cj;*~R1J*RB%Lo3uztK;o)bGQ$uz`fv(@lAR)!e-VI0K4Y}u4ktRj^> z$5-X%eqSC8<o74L4e4ONkxBdeVqHhWe8F{8vd`sI1#Q8>^s0UxGkc-NQf<dOW9Ydp zny7`6r{4ZSib$t9v-d9|4yQV@n`xVM&x>0Dh!SAqFKjywJXZ*$oq2MXC`L%kCqIgW zc7dLE51V!Dq9BZt*!^sK*_KB`ac~aB=1#x$alORo>UlXmUDWg!w<)oI7AN5faFKWm z=ru+>1~t>f9TY;t^?WWEWO$MzCfbF~a?Q>$4Ye5--4SNiwXGx_C#gRggc)iMT$Xf} z!y4bEry3;rRor90jC;U-gO6PXKJcb7sO_H{j3OUsaleApsckGV-v+kFxfynFsu=s? zHZfuVf92J|7>309Elw~Yk1R*NM+3$McfiSTgqc0)qnr>XavAa%#DCxNo`EqFe-iDh z{Z`UwKb%H+HdSwo63pKEvaW6qjivceG>Y!2@fUd)h!q_|iI#3fWy0Xft6&NxqhPtP zI60TdVs^3Ji&12nMQ_>?9RyVdk{1@)P(aESo@^OVnT4`T5fv2Ijy?5!eYYszDqHRl z9Us~C{Ai%`y>n9M5zN<05aTe>oJ>AA`wCNc>$0A}x+9v9PD(*)7|uszAvY9W(qtcY z{FvbfRsBcJep7@-u{P#JeLWL})@QC+%8n_CN~f>6&4bPNkn{DTxqqO)tP1KgdEJUA zPa;3(klq>|j7d(6*7W1}+kjTSEVzR*RznUnkJT)U_lensSh`2y(Hiqhh}Pt)cD8m4 z9aMMjo${`zz0u~bNM2RB)R#Pz(xW;Ge*nMIV?!*a)Gv4kkL;Q!avW)BmoLE!RxSzF z5+m-MFJ?lbV0g7`oM9>whVt)Q>Liyh%F)?SzM!iOai*F-MfoDiPb87%8PXJswJpHw zOSt!PxN<?k;N@@8=~+24DTRT!LlsjicAx(qW%yOhVmX-%eoIKNq4xEVDbYQKdu1P; z`YrRokdo`E;EZiE)UHJ8`31%zTt|Kwg9*u<xPI9HGTOsu;O{tRF5<R~3sV<AXqT@9 z5E{|CQiGN2N=!N<4a1)j@CLCjnB?#Pa!+qeX{3{8zG~&8W-(~zaS!7?AjTGU?=?dg zeN3%M$C^h@*7uE|ANs8&R=i4bGK^4w*Tv`u)EuoT#7`}`dcir6$0%3iC`GH{O~CWR z=cM%BD%SEGM_x#;r}+!-LdBRWYA*w8<HPU7s1a3v8D3UR9}LPmZI~XgG<eWubs^QM zl^D}mbSjbs!15qTmWRIsFP29M>W7P|tNM9Bp1yDV1Y&^bjP?9GkStcUm*KqYA9<&x zZ(&aurZ39JdK0-v%Q0SJG)f5tDZaIz$?rcVUZCIo)ZD#lh4*Kyy^e<!$v(@j{>WZX zILsQg?<K^)gbOy$oyFlb`tq9K+pva=^T-N!8XyBmE#gnEd=>L@iu-cW7}AcxHfCfp ztiDcx-k0crmzn;dB*oMe=5#)C45!;-Wore+CP#?P%UBsgF85~Q{nsGcshI!d#TQlM z%eX%4(`BU0e95T6KY)gf*YdHtv|Fil^VxN%@Y$nK<aaM!pis_BBn($5j>>;q<BHPC zBYTp#yN}!E9RIx=8{^q*^m4n|K(|<1krwyv>iX`z6HS{SdR6CNj(Kg5IJDUc#(MDT z@QRrII4^@&)<tyQBkCl5pZN64#4)ch9=y6s^on#Eo~;r_ie6;{&X@T;fYJ+i@JfPK zqA+1CcvYh&M2`z{vOvIqmA*VUJS7kR++-GosG@@wO!j)+O^p8V`^)L)_Rx^Vf?+H) z(ygmI0{o^T6qj`xly)D*;}4IJU&pk*gaB49P7o_E16n_L6_>4jl>%CYRD+G?iQpX| zlY?jID(#rU4<#}9x5|aEur*iL6lcM_%LQI#F+BK@@k)SxltAgd1EOF)_BigkZUr7i zuF4z;7$4t98DAx1T&I-*tV5#fL`@eksb1I}j&`zp^8Ly9AirmG((3mYgMQoBZLxdU z5=gC5`0B8ONi`_rkkZ3Uc%SfoF~vy7wQeKp0P3?+<B;)HJQ}VJKR+pP`#&f`<;4%? zYV2$p6u&~olj2vsft8>8(JDrjoPlU>cP}GsW$hz)RXeGaa@1q-cb#$#D-B9-?y;ZZ zf6~IQlM1~Laa89VSh0+#`rWaj>M!94^9!c&1^VYp#$N3V{-Pg?|G_RN7jk_ROlp)! zk}G*7xq_t{z0oSVnu=Q^{{!bhEPdOx%uB@i6uvh%Gw)d5xa_efOm6#d?Vww5+W()$ z@G8(r{~rnvUyVi4n(3k#T}}kF9vcl(FQt0?GF{wDIs^{?{L-<v8odR?zV%N>2e4d7 zHxosVSf=)$yd+v9s7j(BTu;TB{s_kI)l@V#`SJ1hzQi=rKE}(&UK`8n?U#T!h|ABf z>7hGVtECXpleE9D9`M(A5dTvvd<GdhjG0Ga(mP_&+qr=0N5xcq9D`_7>t%(d6V*8T zbTEmo*Cio<KeTm9zk+ESy^aX4v~CrbXTXK5PFV|bdAonqjGjqKM6>ZF(e$Fc7@6NV zy55`H3Al$RWX?XU)6xHoXikK$Tjd19iB|co=l`cx{KndOFfQo4o7*We@3m9v(#Aa` zzU!|v?k3!fLDCLJZW$geO_^x9{Da+{3q2E|gT0~j08Ce8=I<3d2O0LVqpSUA8#fQ4 z97)_+UrNqJ@~9s+4@0Bgt6J7AC)`K9^(kW9h^w@8l>E1i*#l$g^bw`R)8cp}G&<db zPW#7OH|E=ut6&hA(ID5Q-j?!b%I1C3jR!|H?#K{*2i3|~hOnW~8?@vxGX|QCJMH^l zI5P+^+SF}sUaTx7F=$5l_}NF*owgc`Gdwr+AYRh1u&7&)#ge~F@h;Mk_!>M*6bj=9 z3S%N_k@A`|_~M7JdM&@%ms8Y?8A=jiXBT)s6?&K+=;W~Y5+g!26^5oF^nm%f(G83Y z3h%MJ47(C)czMWQVKxf<OO=r&PUNg*F8`d#>h(la^GT<--E9?K5Ol)uUphUO4g)Ml z>5m@X{yinx?i9Ou%_9i-R$R~v3py!l0R4;aa}g$9#sf;O4ulCgZ|<J`z;+W`2-EX{ zAo{y0YF-twfo+d*WVWOyF_OlCpRQ_8VRq-1IL1iDTrpC#Ue$CXe*tT{k$WCTse`wB zzl2yNYIk8>o%i!6Otl**g7yRnN8Mv3>O%oR<?sw$O^q}1$|{SEeIGSy7zzCdI3{MI z_aRR#P^=fiW5;|VHbz}aW752z%!+rY&uIEtbWzo1&_kCds3Vhy5345~tm4OX)r=3( z`$Fys4+q_dCO!;{Ogl6?*5_Cp=N%u@<ix>VcZkXAwN4=VCV67`ZVSe8=|RxNmh6)t znNOYs1z@-vQF#;N@!N!8=t&q8JIk^>_k}mmQJAct%dCZ}D6~SbM_UcwYe&Lh(SlDD zYdHCU8Sp4DvD8N&1Xcdm-@=PzM;vpW)<#KHRI!hpjHO;nZ}Gk8S^i(y)(njpb5%oj zTy*zcQ9+DYpKIp+#J2Y{X8@`nc!J*4jBxK0@@#`55F(q-Ky$V+Ww>l*e@HUc8`48J zzyeUxgKNtGH@yUHN)<%~8Ea1q>WPzx(jni<h8QDkxy>ld;}F{*m?~jhriTOqw)dc0 zz;Q)a#W+39N-Q%RnF@;XT~q-{Zhfi~f4O<2WeMkI{f_bHda=siLF5Vhw~5#MdBAi3 z*MqVE;1k;Q%RoSXngsQ}D=PSwy$QdsbJdW~hK2Q8CIevwtiDT}i|>+O#m%lUq`Y*j z4*p{hECK<?geWuc=-_R~cM$)^Kw9k+`jbSwNsAw-Jx!<Ha~a*)0oo!JQLI-m@@b!? z{2g*@v47-R!FfKq{}PZm{^f}p?7P}@Pj{ELxZ#T4oGKmW!Gm;P>gY7?PTks|;|T^0 zhTQt@YPxtu$_i(g2m?@HWy8X$dVBEUFkA+LQRtGLV*H(Ih#!R9>NjEguqSl=dT5~p z56iIYCvcyltg=ANkSMouDULZ)i#HtXcRiG80Qlv;=<j%9@Tn)BP}QgLapQqEK6O7C zSdSmCASN9H7!QujnN{+3MWqG*H!p-&!$pYyyD9|pAeet#8;)=R8o!e97$4SeV!-uU zdzGFPSKwgZqu1}J%|(O$x8&jSU>iBg9tI3OQijW6@~`QN;fVy<3e^>D*FQgxdjh)z zFNcCZ_XYc-+7om+H|hB#da5_|I!DI57aecPr2b8wQo{J~Qs92v>^foq)(d>k9UfRs z-)~xPJ=@k=bob9gkZjj|GqfP)Y1d)pIi{5|L*9bY6$n_S>Q@F?(Qp$3A?bk|wlLAv zR^;wMR~9X7d9!UH+i1H13Rc&6^V&aw*LQNY&np2CqdXF&#joke%Ba%&pk>sAh09R* z6_o!q(14*oLdZW_`x=j`*8R~mJ(7qOW9}cmNp|)SiZ9f3$5v1cj!CBmiU8hEL5v6P zg(GFZFV}QKWyfZ*wNL}V^EEu8m9994EBXDDgu6`G5zYHB6DVB{!cgoUQ}*KIrEuv7 zSy6OM&xx#VqtV8$F+<aG|6Q0@(9kgt9*o<!<nHOVF+|+NzRzr*?xCGfzhLS4R+??* zhF<jT8orf}RmD*z6INCUtQ9=M?xYcZ?pj$>cjt~0p~Ylo<z7p*7a`i6Qx(nQPG?5$ zW2Xb*Y=xVks^QsKvsyc;5B?<QV8xh~b1*pO97ONgHlRo_I9^e$_-$aUc@Sxj(Jei0 z4njlKpP+9)3Qk>f0M{s(JOOKk=R8Vvi4ucjr;)Z^EIysPf{!OjOS5nR^%<VkjUJd^ zOAv+Z({D&oY8W`V{yt_et|hCK@0hdK0X|qmr~2vthW7ud?;rS-&pqv#O~c*)gn1L6 z<-oJY4FgJstFK3oQHW17<PrB24lW1x_OG9Ga{PbFhWQ6jGrpY}IMT*KgGHDIF>1ZZ zq1PWZG&-N%)XX=Kq5P;dsOg@{dn#YJ%Ge{sYVH$@D#zx}Gej`%33SguCF4Vwtzmh7 z5H{t9f~JeN6}Mv*cmZ}XKm-vk>8L-8qWzoXJ&AI=OWqSVDc9tqe8S2@tMdrm+CNXT z^U$S%-z@I6q982TJGfE}8V<&hKS9d0@6OEJ+7L*Ok;*>yw)(JWVOf>AjOv-j{o%++ z9V}ona%DDnj-D{zYZdw912J#{EGhT3C(Ey6C=Onqyq<06bIwmuyccCXJWWaVcWIKK zBnf~YL{wCA<TdU8Y_OB-su7IxITq^4a}hn%Dp@4)=<R2_SXPNj*jTovrW`cwV2quD zb$!fzro$S?QLLNdFF3S(eDHIrG1^3}frK<%uXDB~4FrGjxj0ToY2xc7OJ+Z5DRO(i z-_9pc8FH~*G)^Zqj-Y;cWM&qN0l7<uD{rY(sfSpl2etH4kc@lSt6(L)T{_Q+-O$%2 z3w2L13+%;s+*B`ZV9Icv3&=y_bx>ozNwYuU4<4?B9st6m<}4i|kc7$)nDakK#h~!f zjfzQ6SRqw8Omn;C3t@cuGV^?LnY<7qUg0xoKBCGoxlFRTfie)~Yj%wfk01~+gd6tz z+B4%B+&Uyl2?4T>gU^>PS|YhPv)#swAp#`I%$_A8g*MPWk5vTZr1=3#UGz05{`)P^ zAeFznaSIGI(e~)@1u$Q(eMauZRp?XFb1?aQfsHzflfiEkvDl@eLxST4FYL9oM%Mhi zp5L>A03CTzMGODE#)gIN{O>dx8@Iwh9VV}J1LM^dq=Q!lyW=-|tCOP?sUF1{S$#wB zGIVA!Al^#RxQn(reg|+{;|B;H$J%g$Km!446d-?x%VeIC)+Ro#`%#D7+o7v}JZ)q? ze5nEYy0BI=^T@vuFJFFhn^peQz!e7D@M*5rZ~5r^cogt`vMu0DmF$I+%I_0p-yUGR z5;lfUv!qE*n?T<m;X)7Ls&)Or9zTbCrYGvu^ZCSxG8RmLR|ky8E6Dk^J)SfPc-?K_ z3_BT@&>LE}gA1!L2rb_mcp^vPiJ~}0B|3$ox-0S=p>cG|iazBLW{7AYA)w+$s_&x^ z%IkUM=QnB+Zln5{Vp(Y1hc<=|Bt^>=FY;>m;Uytl_=4*>lgpP2=s@ia3=>7VsEJwI ztn>}&RSi>(H!8&h1BT2RBJFzu{OxGb12KL5UK@Y=eTMokj>Et!G0Obj${ONU5K2Pn z6E8&z`p5wNpezVm<U`>@s=XZq-PZ*Nm6ld;7@!G<Lvh|~5*+KdiEMAayE`gpla@*q zqeqicp~8n4yqjC$jUXrsSLDl=KO@V1l&<XVR>dn1fHt>&bJfvXi^>pQzu7FB2d$!6 z8ud9S^aWl9v)lb}W!Qh`R`^z#2U3#Axt4%cWGahlmTTZD4(n<RC5)@$nrCj|t`h4t zgiyBSR~H}}AZ#ofg;t>p+N~gbv>{7P)apD_zscsQZuz!%TEtDI$I1(JRA_NB%DC%D zazf1YP0{aTt(@g}nS<f115q!$GnX&Vu9@oNKBj_Oxs68F8<zU8Wjmie#&dKMc&>^S z@vokA4hC|A&g*l~j*4>xEAxC%dv+E3npOun{(Xk}u#d%>uR{9P++9__tnJDp6mG$< zx`oeRLld206v+8i_$|wuV7~o;u0HITj#5MM+jJrI^IkV*>Ft=Axpx7#G`m+@V-|#$ zO`K|r95V#m{@?!&qxQcehTKQ2iN~@<d2@ER8ymwP#q-2}J$`!?Re|xICAzM7*^;oy zbQ3pukG=-ObM6O$f&7b@29Nzk*w>Ar@VM36Awv9)l-wQorvw393R8iu_npKyN3`}z zXcTO6bHvkv?YJJUdY6b^hsO7>8|n@sU)WB7jlZGtFmC-;NVp|_!p&2b7qOTX$5EqK z8F(Fo-?+;940Z%n9DM{?E_kl!?7>YG=PQN?5w+$FQM<6O2b?_EjqELnH*SS$>sHP` znOI9spz^{<0X}&vJVYrp{o(m`u(@&vY_ok4vUUr5TEVYlxs1=y$q2aaJN7b_9CV8u z-T@lUIs{Xqo&<@Hm3xj5z_%CO-OJi-M6vvjVk)~FiJ0Bw*K6v_HyAKrG6^iXRiyOj zH7-M@6b+cL!Ph2v+9+J%VZ&`>37~Z^J(EG!&^ldB6Z(4{Rg2<0GVvH+<BxsgSZsxA ztjSxb!tC(gsECrc7?Q<ZS{5+A=g-L4)BaAG6}p+DebL4)c~lHH9z;A2!F}Ps`dT9n zQM0d|JrhQVKO|?`3WnOFNTBVYi+SyH()>nxhj1c4nTO$_Na<)8$z+n3HP<+Ob^QKE zY}syIXv?T6k7A5CHEnY+4$Z|#XbN&>MRsrwJt!LLxyAnl1vlCR+eJ}xvr{lLb*(lw z5wtpDA&4d`I*57;s-l2sHK=HB6w!eL0nBM30$EkSoIgs-pQ<Ql*RUe^^hE(ncCbM} zSKkz=e}n-DPo|wqiK4eJU{qmzF_aX=z<kIx#yqp-^G>@Gb9|ekLUbNKV}f7zmw$x- z?)x#Rqj|HdS%dct6bVbGU-$`i^4VyNJDl1W9iw_1iyW&A>i!yS3&j6;VG6!OZyj|= z;_F8=CQ1?}<-Y}X_?Luhb1)8sQN%zp8rm&mOikm77Un<bc7$ab7(2_XP}I8_?4)o! z#hjL%T?<ip1(_p6zfDzP*x^pC8kd$n#yc6og#=CQqQsQ#?YKsRL+Wk`DxZ={?^e(r z0@yLgLNq~<;t@*#K34JqjmhHNK|a*-LtEIwmu}|*hAyC{rm-Pw;oe-Q^5fuXN0jnh zat!rc2c^;|R(=6vGOz{7gRO;5CP}dhOje|}TUC%SCT}ZsBUuWvG}h5Hjv)ih(>0j6 zuIx?7&gMr~gX9QE&MGB!D@v}&%cbTcx{=rp3T~YK99^HG5&3DNYS_vFPZBLul10K3 zx6HR|OzOsH2Bm%A7zdzcg)E9_`#1LcZo;rjWItB19JmJ6Iih4c<=*+(K}pF{a;l^X zt{FGK>XRk#sN9hA1D7c9K}w7ONMH6kr`fpgV344R*Cb%kA*Nf%Hp2}!P!x?R1bT?B zTo26>nvGSVAD*F0x!4(^VHRW225ro|+*G!jij2X7>JWooHAPj<P9TqxDkpoHQnx#N z_{gx#F)kYE$BhIO0}v%#oFQo(_3=M>dw>;Jh>fcaG{LhQVIG!01^7uiKUA{)K*L0^ zooqJ<?aSTcKi6nh&5WhbmwX3;@JlQufzeO(d*tN#(@Bn{I=*yS!t|!CcVbt8zkMF- zWfN^18y|Jm4KV;!a^Ymz?-Dgsx{a{eT~h_ja{)|}tc)?2QPyYU1dk*W-OYL@DDO0} z`D6tS30)bN0j_|Mg6xks-m_3tTm2#$N?6oUV1#MT4>7kx!k#=ykky9{8*=aL_2b(l zc}55O*zj(Yx(rq-S2Cq0<5Gp_Ysn6Ofu%^AxSz||yy&7W84c_YD_CgC*zY{o?QdiW zrsJZ(b{{j^(Z;{sP0n{QGzX(V>ip=FK8JQWc6Z+uthm!iv1U#)df~;Q+3!V4V~Is9 zs=S||8hfoB8^q7D&iNVP1#;Oy3}~NH{X+7&cBE%E>VKBeC<sg<k+)$$Z@o2TnyY?S zz~BFj>%dEYE{AGD7!ZZs7!X-Ig>rvf`Nn)y7yoTk2?@V>=oqHPTu{(DgE$aB6(yo2 z`Q}Tk@}z;|BFH3eAruf}#hNS&n?g5?OxKcoH_jW@U;=dtQfl8&Pz$7=5gRvROy<OM z_@Er@V1S8i9Ad}4R5UR}21#%Xk0@GT8X2XlHH$ed^X*)$D`f-rs7O+=Dm|9VPfs!( zH!VrXjbS`AE>evp+w9Nv;g0%j$C8T+F~;<WIl`o2sB4FxbeS}4DdA}}j;!y1b4|e4 zMU-5_xdnUbX`Tuv1lM@Pp?&tO7Ij${<-hJ#O^eTX_Rd*sb3y7&jvjf}-l&i}2YXmI zr;DKvh#buCLE4-u9oIf&<J62#O9Z9MCl=*SbS32=5IPc_Iepr924pFQi9addv?s6v z%TVlVn1M}8l?*A`X5zVBELNIp7?&a`nTz!`Qfyi##*2OgYDmLwVGOqWR67>&?)-B# zd7F=2O~Lc-bGa{DbsJ!VI1wvJDef62r1p`%siYEs0@89hb)`E%DdLUtS^XQ#kRD<R z66S@#Jn*rc@{NI{Bv2iej|2+dB<r^^EJFe3s-K(sO*Hso%7APzG!JNJTLH#@>1pjo z&Lc`$a{fw@ljxRuirAB#__U8XL|}~fp2L`f=w1!4T!eNPXD8Ni8I9I7?~P=J<!Dg^ znGqpFjwoXZ9wMja%czr8<=jIj8&j~{LblLUuq9z^hN>*u7AF3q>@UD4QR61p=OWPL zFfLFhzu4nXiWu%X9sX)0u|`vJb@l#pm?mPi|3Av!{8^Igy7POv+{~Mqm04MpRasg4 z_G)=+zkYk~jczo$fkuN(GysAi77{B-kOW#3*%Vii5=oJwNNV2|Gb7Jf;~9@MS{$}D z9!Dr_D;$n+#CRh7lYa9bLVwP!YV>Q8qM#Qfx+*IxEA!lQ&-y**tXcnwy`h2+pAHJg zO<M)lcw{lPaP|^Gfd~HMVt&FxU_%6v4#JcR9-ZFjjQ<8Fm7&0EbjStiP74kOs^&x6 znHT@68&I8bim}1^#Rg0BEcF8RsO{D%D|@g9q>mBd7#aPvu+AX3{0i*%unZE8_%0I; zl{;##9WWkceSfFFVL7-#v3}`HptIe%tA3NFy;io}LUERc$8EPqHyXwpOIr|1$7#~| z;Fq`PT!t^Pw-7ZlePhw!VrdRZ@4j3{?P3tK8K|{*YtI?4UiOoC^&-u=YF?+WO0oa6 zrNeI9+BmoBO}*BI+K|5Hq!_CVY6&{<et?)5IdEXQT}u^(<`3@RtoUCnx3K&X6G7x> zjJOfQ%MgL8Dq(an(oQm@(VOG}gzvtR2A5UiTsw$b*QX^rFEhfaGGH8A=3li@j~Ro% z26U#=y{67xH5pH%!6?(%w3Ys8M^U`!rQ2l{yU|7vrRybCa^nHRfg!Zp-^7x5aKBg0 z+^74xTo_?t^vHBU?pSV_ts*?RG<8qz7O^oF15mo-)v|r4m`uX(uxb?g`>x&Dq{znq z+%~1h`dQ!iZ6~G=cSX~n&#xryZfUq1_|^H8U4<&@=8Vy$@qbU{6LvR#1;?=f97a?J zeUdnc9=*GkWcg0ZS>HHW6J@%4EX0hVYtG$r<MOxgyLf`PyjsvWMF~=UTB97eNo&Ar zJN+N%f_3`*n69hw{OlPd4s!ow&o$vEV=^zuu(Wu@vNA>vT5q93-m|a&FXqSnJot%d zb?V-rS%26qluDvj_lY`2c5rU{6S1SRI)g3zvK{Kynj6Y9PWNN_J8ewdiOc@FH1Hd~ zQz_CD>m(JU_s#c*y*tVLE^cpmQ~BR|c37{4TjNM?u9XfPHOs4^ZEx&{rQ!pr0GMi3 zy%*QJS+s^f*PE3$9H*W(2V`W#`Ye0yLF=KsQg>yK-(T{rQ6+3?n8Pr@g0D~LQe)jO zZs|$-C3x-6`nn#Lm^4i?^)fwU!q1Q$$)v|)_f+osrO}P#8;rdnjlUluBmLF&awXrQ zD;=#}-XNlTs;aw11R9C1+$U&ax*^`b4>2^%21C`{H-%x`zb|ZErlqYDSGy$LX-#b7 z4T2faFAUV16|F8bvbB*#r!D1f?a<E%CA&Xh_RNXjIhH+rTDs4}01HcEsZm6&FGb9K z4{^Coe#|TVQfaW`Z}zpd3*2f*CvrelFuc_tdQqaU$ux<Kn)NW-Ymxo@+R+YkBadc8 zmozS5c~nvq@O31eDn1x}wD!kUl8ve{S#O=B2muLLQkKFPUQ2p#iwmW4=CwwS<L&Gp zZ$<Q}>ug#yWDbC|GBuuIaf+#O<2MR~i=DdBn<w-}LccU<Ff^H%`wPF2V&Zqe4D!7E zFal4u-r@f1PH)3o2M1a6da!_<_fw5=X;n_I+P`-FxT!j4KUAjUVc2yeH|X6hJ3Yr? z5R9Mw@FARz^#5L}4@hm8>>ILLQelPR`1MOW{WOeMKUJ4Dd?(gSW+W^%DdK=zGQtdg zeJ?8V*ET`ME{(WQl-2(HpzK~8xsN$&ZQ3mVXF7m;>ZnltYGW{%v^{q=^d7ODc7J_* zQhE;g6(e$l_1^Oj?r)T(>-e`W`EnNggXbNjAkzu`njb{pvo#Hj{PZm-<k90u+tv9< zvj>8sX4ri+#>7KPuiRPr(aIaxd;VWp_GP<qOk{EVqaVGousK(5@#)(?@#)(<`~wNk zg^u<r<9pTWKm6#Y9KYM^$#KqFMt=FNm1rfptnC&09+9|_S{|}Bi~pxbN6+xT<Ks6- zb5yJU{O`TplfR$%9``8O@WubRSNU5#{@&5A5|a7xdwb|y?qB}ypZg#lx_FNAN_;t7 zJPG~vAAT13NqzeCrQKcrcX@Yr@kl(>iKyy7|0;_I<Pm?$RUW!?dD`WZR;&5$&+Xpb zy^DMOlTYvy-&#I%ulL|v57ry?epDYr$RB;a`bPEMcTTSP$<N;I-TlE&|Lon~KmNUU zdq4R-Bm-`=y>6Co{GIB(H@<W4;Vb{d8E^mK?$0{o2fe%h#5FkMr(I)#=-aCs(tiF| z{^4Hr#7<Bm!+!jXyS<-r#@*h#-~ZXyFlYSOHJ0mjulk*P|L~oMyhEYC;c@fX4<6d5 z?|pW+_k+9t*!Rq54}Z`9v8NKI`uyjs-1fZ_Pxg<Ub+>o-#96^lT<c)W6Mnwx$>mO7 zFAxupi7DdYogk^~Uw;1Gp83K<y!VrLz?I+a{n&l}j62{~AHLUr>JIqALmd8(-NC~& zFlQNl7O{C?9*Ad0NWx4fXypq9Ot*(6Z0Kll_5m9}&VKl+=D94Xk{1SmOkDRar2_X@ z>U$4yDX=w85iT)5?e*^7`-gkq`SIVrzoYKoBO>AM-JiI}pYf|dxcd;-{<L4c`vXpS zKTphNl;3{%i47f1RiwxTc^m}NJtWIRvf;scbJp^_@4&wI-WJ-N{B?7t$+s=U8`KdI zckdno>0b3DitwlZGN(Osy`OT{yNI3laeqI6ZSTIn`{TsB@8|yHf<Nv4PHZi+v3>+E zpr9T|`v>$}Fb#B;4fuIP4@5aB+kX7a1$%w|S726Q#1q#vl=&&Y43GWHv)Io+y8Axv zPxd_`?tR=JXMP{n`X}#i@yie2U-VOC*@8B*KSi9KeCB`h?1y&C&pw-d@Xxq5XTOhY z^Mvra5bb^5HyrhTpHkL?n|PnsK5-}ijQf7yG`WA@@8jA=(eRY-@7nk8`~A`T#I@hY zot&WHKjZB8ecxtv7WYlUU}>iZAioCSWgl6&zVgh<M^@fi`GWX74e`K;eB?mv4yQg< zFUCUwxy8Tv=x}=2Sj7C6p$nWNaT9Y%%uW5-VPkrb15+52Ea#p1t}j>FZA@{Z7S5$7 z@iP-*Im|gCfL2Dw5Z@%fa>(!n$LU6?Qq^_MKlo`)8XhsF!?T7iV->8(Qf^wJsK{w} zJx2bLdnAyr>MkjV*s~^@FLmkE+uY6L*y-Wxk+*7Dc*b<5j_AALRL2qhQ->}yqsYyN z1Z`YmNsf1oxbgQ^(;$2GG`?)zP0I@KkX?19LsxKbqMdn?;q8+9pdEWoj?Fnskdwwm zHa()B?dK^?>Ye`DPHJI}QM$UMbp#ql=Dj_-a&zTH<5@yPh)m?vP{<Q1f?&c4mP!Q( zCt)K)EZ`qhR7r(v?vJ6>$e%5jgzzJT<@2dfkrNJS??}rkoG#)}uG&zQD)Srg7gKua zYF&2vR(p!0IC!)cQ_xlaEUl3p@4QEKEbkoZwpG?j^;lhT{laR2H>NLo2=c-HOX8%z zF|<MwlV2*dN*Uac)7jZ^88AH{3GGch*A9J!w>NhW6Mz8?=BnVT68<f;qoUWWGHD96 zKba(!j@2g!y*%JV4{Y3wxnVNt{N~CFD{ro#Xo1-uNQ9MeERMLi@JoN(<6(~)?*(gU z)^8G*v~YujoC`I^hbC(3`;ZtXUcRvpbvS`PA=QGJ4I4tYBRqUQTlbR-$+K3)?X}!q zUw?&e;FLyMSvXYD0g?AoIUR+nLW|-HRs#?!;U;f5SJ95v-y~HLdJS9e=gM+RmIGjw zeqliry-Tjv+1MGs8f?HU<9ywzd_p-HMSm9kdSSwXI0CVwqDr@8pC0&;<JUSnnTlir zgDyfM_B8M7YkDSc_;1njtK_9W928OFgl=Qnh-^39Ru0oN0bN|y$Fbu~($vM}eL&xe z=|L*<W*;XW@UfN8tbAE`kT3((fwHoJc?G}8yQv3%38@4x%%4zDQle5^>iJU`QwT2m z_ddBz0B7VM?dFhqNoDDHWsXDS5gh9wHlVV635s6^kE#8PtOldA8&+%5r2+e>)JVe1 zc04L{>75cyq8(y+8De2i#q=6~nRIWaKHz0l2ZVsqd-R6g3nPd9Z>NrHCDlA?Kc~uS zlG}%=N^f-;6fvc;JfuHotv7ovW>SM6|8`zs3+s110;#cQU-sq>?cL%Ryb8tIuB-h5 zSh2PuFK|XGt`Sykmh4JG=$mOIj<)rM7Sm6Z*X=UJC3(arg<yw4%-km%%oFJhOYcB^ zfC9_CuU86o|LK*>E4NoZyz<&Y#+u!~Cp+1Yx;|zxXl)_%VN>5H9ZSF-SS|~6W0hEp zTo%im>3IaC7ApkzFFxf8?3Bo6a-Lvgh+BGo1&PHCN<jswic0?nsZO)Y1H_k}tv+4t z2mL|Aqt-gSxOtgSwi8xH!|G(Utd5-=1POt{Ba1%Wh}Gbm$~n$#wZ)hynLg+@bP?Ml zl3T9r5QMrx(w8;$WM=a3yQCTht1YrER&=TQQUDai>Gff0H!cSG9T$>rTm8IC+kQ13 z2rl^n&qh#fz(m~hE03)_g-m#B<>&Bg765)jh=!2tJq^Qt2c9uL%!NrIo6tq5#2Z60 z4vB0uEIVbifxPyGU5|v~!pMf!d<&+XF4)w_g`v&e+ct62eXuG+yW@vxa4KlJdR%(d zIqO6Rq~$}J1X7%3`K6{+rhlRrK1v)qsXBEE1oQ>Zx3i0cFUxVKC|j$2ngQ3Qn|pD* zexXu?**dCg<9pF0jY7H}2JWeL3<vr$({l{Y=>qD-Nqj0biXQzG$#;`5r2V8<>4aWd zj+{IX^3;-y^HDdCoy~D8blmD*Lb{a&i<EVp#c^w!+RnQx_-RYN^ypF72BW#Na%Sbm z%G08k*ukQeJ;Rra-AnEljZXmd5JI8U{Uf1~w~GKC&DhmPh7qwA49#Wt*K$MMrCb%J zWFh$S+i^~Fp{th4o@*f7hQ(uHGq6Z3sHYip5cn6Y>Xz>{$klF#PWJdb589)l^<f}f zC~%;)_Nw!Gs}a^OJ3AY@Z`d{8@zNmvKf}bWOdOJz(x%mp+GIrgY7Ww;P>FT}cf$A{ z>slYl-7gZ=iU?evD*RF_b6QT7Y<PWN4ceut!z3*Sc@Pr2yicKknbZ^Jnuu0<hA8U2 zm2a$kkNs=(usl<aDp{}~>?B+IFyDt1-WVcH8+8QeRNjirg9r^cP&Pa)27yuB6uFzd z-teZQL-<iR8afiC=A5Y~l#>`aKXXI_U5{*}ur#Ffg{S#<c6fNXN=8-DT{5tgH&LsB z$}Qh!JTka2=FxT;pE-s$z`*`LJ1(}{siobDt<sd%hKR1a@tlI>Rh>PbmO+c9>A$d| z5_18!9J&qb4eedW>;m_O`f-lydOT{I5vPu0jhvFEELL0J?+#J%RLxz@6mwC1ucZ9y zUSTyotEeJ^Ld#ioKCaI-OP>Z4VY?N|vb?nvNm^-)_ZU;;I6cs4fbwp_;?>BZnjewl zfZAZO9GyB5+d+r)TBH3Qy-D*KM`@30wZZpR-dio=DMr%nVn<vzGUKBwpTMU5)s<gg z`TdnYUHK2JoY7opIH-I?ImlvduwA(&V-m1ZxeWc`Us)*DL%6?|*FD3+@V`0HuQhzu z!Yl%-Hf0s_y0Ob-ujDK|_OCz}xv0^CKFen=xmZAcaPQE3f%D1PifzKL)-kxJIj=cc zc;^>W#&>z?6Q0VPGBabtqC~dGzn<vgS{_*Kk5dYo7A+^JRYBdI!h}}-sT83O)Sw*= z&!Z%LXG4aXXj=^i$;6547}_z+;A}wmsID03NqgAnI{kS$$!B<+;}r8+ICuOWgNzjx zuMVp0E6ehCJ>cvJH@4Z|E3j6!zUlQz`p}aGxK)Cfyu&hL6)DC%TsS?cvm4i@y>>8^ zyi=yFoe~ni;xZ1xKd%d$@vWe=935loE1$VP+N=8X;NuWz3<lRBJ6-oFI6GoII0hyd zER@<AY;S)PWFD=#&yeJ;Xsa0sZcj0fMi(#y&1#l1&ZjHKY53t$Ch<MJ^6JW`S3bA$ zYb(FC@&_w_4mTj~Ap6u?tdYk)gYsgOv+-ohVvNg5uolZ4_G0y>ED|bK#2Q~0_Ne(& zc{x77I5O!}5uj#Cm*SDL4;yssL$mWE^4*a)J6bXazahI`#OuKkcK|oQD{uiP@?SpS zuDGc)wu&QFp3!1~;SQcNa7I918Tn&Rpi%h0H9F~@!XDL^@01hgw{7s0Xy7XtGAwKo zUbJQU`-ZL;XK;v|w3Rv;&QCSC&aBEx9UDjQg4)>%Gv*o-Cv($r)u~QGvSa{Fpnr}5 zP{bA6?W*_?;3S##5x8Qx5?Dju`ZYEuQ(o55S<27H<R=-R21aPwa1zwhtKwy7S#O&e zJ5>72Sh#f7q%#z=m;7VUExK^#j9GM5*IVVGfh;4OCRhjMlBP3hShwL(%l<4D-)!9j zlL@GaEzp@{$uns@()N(zZJUO(T%yTDWQ!}<u1F0pUO`yA#}!g{zJ_&i$ymf6hBMw> z`6`@2_A`g%hUP{BOj$q*0gO9=++`hDv_sjfX8E~EWU#zk3JuhsY~7ix8y_rm=u|4h zWGVTG#bxb<yA~f$4cbuFUsMDi$Z>ORPQO9pTXs{PWtmOAtqpuuRpYjbPI={SnEDr) zhIVHgFpynpw45ycd4b)O>0I51N+e5F+1d2;VI9QiHA=~osJhzeQ(K!A-V<@Uv(N3X zw|7+i*&u#`&hz<YtLmy@VFjx>HixHetJb*)4vV(*U7GaTaj!S3g1655*BFo&Tk3S6 zESwl+H}000@foi(4Wi%G7Flu_!!6~(Bmya5>mCI+K5*>v+-kOlnA3QUb#(=RtsPj{ ze_B<UP&tUwY^(;M{W4gNv{El~Q?9>SU%{DPuARvEA&9lBVn+*su{?MTu|CYo8A2{- zjZ~L}ul$)<gX~+*lm$c1E|#pDt-Tll%bPbwPpHyHQlcBC8`|M@t7Z9xD%p4F5I@;o z9d?I<sIlAgCc`;FfJq&W)}*B?-?Qm!hJnHy8Fvd$Zcpz8x`KoYiLAfvFu<)EqMucL zyRa`}>?HN}Cc^<4qO8|ePVi*NbM=YFh?jQVcnY7y3%<AV9eGZ45|1G0Y}m{nOQ7Y5 zXZJ<Qpfq@X!#79fS%n_rqw(}`FV?K#LK9BdMOFzFAc0|6&X=!33n(HyD~v7-i6}eV zlOKbZjUp3)MofavP8jyiMWB4t^wN4M_165f6w>o4LJ`$-;C1eA)5dLWzT?HwYmYKb zDULq69z|DGWPONEj3ANdt61MjqHgyzNCZ;xEvpM)C&-kupQf>%T-?)JNh_$}ZV{L{ zaCA2dgSUt;Oet}!PWb(teguSnP)V3DTECd|Hgc=IF=%2WStS_Pv#Xb!I#x;b+p&vF z$WTc~UvOH(rx-DZkn_C3R->FyGsBqr&UvcJ_2ZZ-QZ=O4m3K<f+Sdbljp2O4Cke4O z#FyJxxxgAdi*-RN0_sB}NC+hlg`Q$E2*;UC3<=rQ=D#dh!zdKe`a(^S4ZdMqVNzK` zxzO@bavk#qTauH-SoCD+W^yinHScTmz1gDoZQUw82V@+0;|{eR+MQv8>7?yeKaLM! zF*5L*WgwKBy|EMD-VdCj(tbzl=Tlv_4vJ=bX3qzxd4)?C&Ik|98jj!STJbn!)?5^x zDo5uA%8B}e(OT_qQ2yZR1cX>vZXDTV{smN~dZ3_v71o{lB&&l!2%F6+8C~cZmOM8@ zuy^pai4LjqwAG-WexHd>3|_bcP)KJz5H-Zpc%5Fb^l6NNEGui5Ee}xjJzpiImUne! zomp8QTzP)w<16p1e17GZp}wIwloFB%$%LB?X_w@bwP0<K+s3jpUJ7>fl!MENrQvM8 z>@6<Q;KRd4L$1g%9COwTz3q=poaitYEB!#02iM&Et~dP}!jKWK*YQ+pG^F+)rFZ$U z)`LO0W6?W?(W2IQ$Jt2#09pah$DPy#_z;R``V2qzXqE%mQXY8?7!PLq6X-P1UZ^qe zLUCNdQUiT8K!CcfM>c_n#$U+2vfcd)g<LLNplzVrL%SLtGwgxI)ZR2?K&jYG9=oXS z9XS78TJehu^+DOc<T`f489MYd$A8CX%!svWtMs(=L9q|X$>PtBRJDywri1gHhE=c4 z{Efa&j_9UHd=Hh3-%o@CWX*f4Q#0|+^JZ7P#J+eJJL_vJzq0b1D}N+w1eYK2-<gn7 z*jXqo>$PO^L$-{F8pIOZ?L&B^IB!@xq@D;TqetZ(Hj<dzT*K#R9S`boW){k9Bo<Bt z+>w+Sn=jMT*eo?)<dQ6+NHgxlYsi;`8U7OCoLkW`_#Znx=jfe^Zk$f&ggdg@M2c+p zYWH@AMg9DcVRi33f<n^8Hind+`~ir3{gl$<v(Lu(L7?>y;|+Co93#W#4T}J?=n^)h znB~ExNz^)aX&<2Mom#Z9LwNd5h;`%ZD!#d^aG>1aKbHdHhZidrt*Da-Fj?%*12<Z0 z(rqivC`hVfxG9IS72QBrs=T`k3urpbAP1{hd)Xa6rx&sV*xz2otfE`?4yyL-YCH9l zr-%`Z?B2+8PD$uzBN{Pc)1|_ME-v$A9x??_`yCWorQ`+=$-OmV*H?%Vd|>6Jl~3YR z{gRP;kd%dhl;ZkAUJM)l%W^H&OX7XJmbGOS&2k#5`xxGfQ&?7i$}${cWtr9G8lu_6 zALCTR5i?%M&)nbCBiVbr<%jY=N(Tz*u@gJii&3M8BkcGeqorJajdJobZ9<X;rl9@3 zYOQV;RT`OB?aTTiq<5<WLJrRp!mSR8*0}zSG{$swu3Kr|(u2yZjrQL{Q&g<i9er@v z*0Ea~-|=4Q&aKe^h<n-k6N#}CIahy<xzijEwseNM$(F<abw}MkHHUp`{&y`L+D4l> z(gbvzP&_h}%1s18eJ@I4=Gw-TCpd`>x|Wq4t<veF$VVyNs%O$Xji3f#x`axuxQDN% z2`d7ud~e^$w9{Qy<~HlG(DTp@W@i~>UG8tB1<$h-<}+xA6@m1Ubur$K5Eny177yz3 zCoa&ZEHItkHNfe_KCN)HvrY7=wLMKx**Jp7#Ba+vU|}ceUD#OLoNVe+xp(uhQxEO= z87w^pG4>|y>9qX6Fc2AEo(Li}8?jqr4t+JMb+UfP7e)<`Ib|Yb%yJbRVd(4UU|yez zCnZ#d#=0bM7^Lk^8614Kdx9@xbi$Mg<d0y*zd(HO3&<SN$A&))gVYQKmfU7|N{Ay* z$7w<W`7=+=c!47bCXYWofOHTep9!#C+;ejQ6ok-=ZwsXbu_)0TQQcE)O0mQCaP!Bv zilT7S5hG>km$N$vh|45TQ<OaX0`@e+qS&b)>NGo9rJf=({Ho<2%n8S)!vS+Iz6jN{ z<I#1HpyC0+#ZY|ia+Wh*+Q#N0^QD3&m|JS@UJRWLec?i2y9d#qj=GtXZg;V(ozS0R zX)}`BW$B!7ym8*DdbR!5>Snv*RtSXWUI_`VU)xHFA~qy&O~9qGZN=MrR)WKim&V{8 zSAB%IPdupa1w^~)I~;g}uJ0Xr*zsM=q!W=uO||#b#1XHfo8Mgdd6D_Bn#flPU_mVY zCjwX~hNmm+X+*kb+^JnYJTzypGC48;lCv(Hfj}`V>C4I(rI4HV_t)6FzW{Pz|4*cX zqi%gzSE=s@-S6A9tm2hzcS=@!q;;z|i~Nnkv#<GYN>vbPzbBE%(FG?y8~fGdDzjZf zs}zqmv7CyHdSyrtFDt6A4(&-JiEo^{9H26%<^K6d{~c3Vb(?56@-vv+t=904ReAjJ z<T?Qmv~c7<=GoNdJo;%SheVXOG$bU?<YGGSxR|Dt8r27BEu;fkw1KOtb>3ytcT%ZR zTT2HYivKW@(6bNx))cRGN<31$*5_9~iX{Hr%2!stweo%FEqo2P8r3Mo@^~WzUnXnC ziiDmdbz%Da=)M46>;_I8AubGe^IDR*P+9mI_f{kWq(3~8e?@_sl{1oF3@F3@Iec$i z2MK1$58Od65OPu&>apb?SvE*7TH!L^QDS+vj!K<sS#P<~AoA+ii2+q~lq|4*G*Du6 z9KOT5xgRlYqc@ntj#y05z6**u2~tqT$vH(8sna5kNkpg`NBk3~c**@Fod@?Wp0=YM znjaFCaQOcxHxlXrF-X4~Rn!>*nch{Z?HtSNAgs}>8&j(s_UO;4+$)4e>+3;5kkqO& z6P^yipx+g9!s^5md{wWs(-t`tZqs&F*^;qRziuNCr<594I14B8KGH{bj&!<=-uw`& zB^gclTNVY{64UirBzaSlz+b+6De&+m)60s=AB(gIBvL$T*1|*(kU4B7IWpq}E<HW? zAnp<|7KQ^c#&mYh+MRcO6;Y#QpCe;Vpf6GC9p9~zp6vDPYCR3_>EoUBTpB-pA=OtR z|L3E@`6fv=U3<Eoly8Y+Zha4jjUEOH)mo*MEG@$K3B{2qPVJEof#73Cr9=l3P44YZ zDt21*CsVO!Fkp5WE*4Sh;`^kLV<sfeUaBW)?@D??iu>dtHql~d@#&vlc^$9!t0F&y z=?)G(_;<P45y--r@aj?^%O^%^%#P%A`UMFWa>{*C!kN?ioK8q*L2F;AZ$t^CzklsR z>36c=ck_imCPrF#pJA?GC3CApVRgMu%v+*LF;<3@UZKhz)p9CqfBFjW?i^80QiT4C zj(3YGe&?w^Dre3Xu{PR3JXT@_!ttDn3OmVKBWuuP9D@Itt?TL4NvfiA$JM`&QoCTf zy4xMkw;J|fYrh}<CjRM}TbL+h(p@k445Qc6Pr;R*L%h@utqXRPRY??6{Ysq1Wdkv{ z3zguhWMhc;6}Ia|KUJ$mHFV4Mc7s-a@V^fl088RQwk<K4j?I;GD^Hjl<=vGpicAq& z30;uJ5EcR=U!bqyIw%H%!qA?i(-)*%GOT=r6cP3m?w0rrDpTIc8{YCSCmeC@#hS>1 z$kvec5J}VcLQ9|Rq8=~q1OOEtr}o8uGfp=8fm{2Q8)75GPq5+Xucu4Yvs%S!muL3l zU-IMP#)mV4g|{ACWrMe`RPwSzPujWut4hbajCR=kh=c=JNtrlg7t^kF*i-(WsIg65 zZDh4daleEUmD;o>ph62hSfbbm`Q3D!Oa)h?q>6p#B{gcQf*uwhAq_ae4&5to3DbjN z3}rF+*tIWEyVtr-{7zTso8tu+!!A{;4l`wdXrIgv*T{69LrT0%j_FhPd0!}F_PdZu z%oPy^Q(iVG$h>cQ$R^?V)I_yp4U7k5sK`<Cbwg?+(j{Gr0`|#%604S#K`Z<PJGEdY zO`{Ch;9T7&_8NDcI3a-O>3CwPN*$GF`?X;%y&9UzL2A-h_YYNS5m%u1mTRx6GR3&A zs@7Sut_3gzWK074YvL~9|4QztO5y7|R!KynhkF07HQZ8tI6^$TXR=Nf_`@O97jZEn zz(gQl;{8wZYVGV+#~yBO?Nmdhzt1G}w2XSVaaCbV+NZEv=;}{;@F7~ZsMlSGn%9UE zyh%J4;t9<_E(x7PJ;8|b?8XxndFuHf8_;LoA+MpQAv52oiP;A$qxCSRi2@rYl@J^+ z<)XPblSUThFJK~t3}JU3mjtbqR?ei4gdUW8#UVYS^(0moRdm*A9>?n>&BZ*?uGo4R zav|0`SFxz6U2&`z7^&_OR>A%D_MQ6BQ(s3TO{9AFAgYdNO@K9Sr7$2nnDCftkm2<{ zP^h5AP)e^=_UX3Jo#R%L%?r_4>l?FXU3EW%#~M#!CcwD9n`clB@o`cDXu74X;^m39 zdVb{<I8m%PVXnMEGc%Lqk}WK|-ZKI~HnQ2a9Prq^{28hk;^M!{_U6on*BCE$IYu3} zpIHDVdNFP2C@1~yGtO*r9a$Fy$1RuKgGNN%CjEC)rKc#Qw!+&_)yeeC_a9YJ@r0WX z+O=+(B4UfVmi|X_1`$_Pxz+v_#<E3L@=d=PF!mB+-b&-Mn<!@rGD%T|<@M`2x>-B} zG{<r~zto@#$gws+_>e6}W4US^6QLnUh=KOxxeX>*mYV%eR)wst`UO%gPNzyHBAO5j z(>q%otE}90g6s~x^XzbvCegYe0Ma?m9)>)LHb4;;`~88}7DMSNotTdoUYpR2sD%-M z4Iyj;wI$mfX$yBPNZpV~2b{YrtSkXwXeDHaa)+{~`GXaYa{f_@tym}Gj1~ETst(B; zytodhSY&}l&MJyQ9cVp|23P|X8&Au+RI{iba>@+eBL{~S<gOF257rN;|Kl=OkE4_a zf#p2Xb`%Adr&QpvLQ0<oXcp-!=%#Z{x>3dePM)h`Il$PPM?mRH$k`KGMrINB(e;Pe zug@Uu-d_0ycx)l$kpHq5g`sc<%;u6%G`uDcYGU3T<fZJ-8S!xQ{D$G=*(INgCgL;B zlEnOCXCE!dB*&o>%w-H#PC#r<uWZ|TK<ex=fE|6{(YF+Dp?50r=CyTfIU-$j2B1$^ zziJmnLT?hsqrTL`_pgyMMFmHX(dPmS(69Pg6zbim?UsgKsoS&KO(ay}AJQW|TsxZ$ zP{Y4ZWQNSPvhbN@eCQRs1poT9nv1+Id%9ISZ9koR%K8gbM5RsN8AkZ55z8ngOs5}E zYfspH$6cQkkwuNyDcYCEHg)5TRxf9OYI9O6+5P})wR9Ry6;696vY-*2=Y~kdJtG$d zh4gVEboa2cz9oB{Z6|~ld>xveJ;>WB`d$tSNnxx-{tGI@dGdkKSR^Iuvd}V~92Xml ztI2nc*!LccX)Y)i$9glK1QI~556DD<Mx1P}ndg6ugrmb_TQ$P<jY4OY!P;n(Rx(~v z@7mJ}IInPn=-kIJn)X3=X8M5EJAFdb7I2u0>M;pk-2o)i%<a5c3Y~_<fKxkh;!Kw! zIy-+#4aj+Rw^NpZB)Cf_B+8AcCAI#JKK3MJW~24t*Ecd83rr=CX0|HpWhJ*ctJ!2k z6~iVRD{)==rI1j!Rxdvjftd22A?)VaZNhT<C8yG&vB4lx8O=z*Efir?YQ$L6VV@9i zqzB;gtTBcBkxCgSxw67c&SfOWCz>j~`S(n&`X&<iRd&ZOt$f#D7ygP>GU^I@3A3uf ze<8BCdn51k0V~EbdA@IWf3akS*$<^HIi{Hr*<wsDh>h<dD$LNG)sVGitz^-VBLcY0 zm(~J05%I(24I}Ucv*x)uFq)cQMF*l-Sw`7|Q%;d<m@nXJehmAlN=9NA^a%K=%Lo=+ zz4?x~glQgyHKOL_{YGx}d&)}as}!qwObxL$IwpzzF-wh^vWLc}e~o2%11mZe>v+AS zpP&vscU!7ksYvsilyo>YIWvT%(+EhHDx+OeOtRY0DO{37s*jqq==H(08ODf2Wtx0p z-Z;M_RvQKmaE0^MdV!PK#;L@mAvrk&e%K^-6aHSU<g~U5@|oQ&0x)$>KrA@5QWN(O zq)TT5$Zt9&<coVMs2eQ!h8|gc)VR8^!`uUj`d}IQ<&V`$pJp1IO_e&jyViGRgkda~ zshH5E{tA)+&;$49yUmTA#)<ff2Yyp>AE%9d{+#h84V9;|vBW8Quvrg1F{F=79{Lco zFegyX`k;wrg?V*<SF>QU*%7dE#3T&43?H+ev!nc&okRBt=uptHx*S&8L%UTlcpUf! zj*psJPB$hj2S!6#=eKDhByg;QX5Sh%LmX$ur|YZU@hUXBTJ^(Ov*JxMyZe9O27(JY zh_PZy1fIjeu<5q@op;^jkp67bdHr_M25g*(BkMg<#a01j>Dyng$13Y@bnqram7P9~ z2~LtP@m@jyIt+yYPy8TTR3b~)1G%+HHuVx(_C>tPckjmrg$#xee$LaIU9dkrGIWu* z>=HH-fFDld^IBu%?@yQe<0xml$hU-EkkaT~{xviu5y5qNna>sn482WOTD~%szi0it zTR26N7BN9}4yFd(0W@!OPtPlRbEUWRt#gHalOR1!Kak?s%B`kV%Pe}VST#Z@A&s$8 zs|x10L>iSGPdSe|<#_`2Jp4Yo_craU(IM*6Z1=2HU9^1XKkC_}=CtQMbXMt1<i5)6 z-E?aZH&NGUJmMi_83^jCn*A=^U0l%4&Fae)oYHJqVy+}+W<VeNFm-kN<$hHR3%As7 z5jg?!1N5g%Zq?7`UAi;&yIi2sCR(lB{v@<ctcfyHpEpcA<R&O&L3w|c=+z=Sbm$>C z3=@ycL=y3L2qX!Cg_uV0KtBjioI@z?L2UD{=X;n>tcOS-qk1^(%cT%e2D&55y^F|{ zwUG<(wjry?+v)Um&`f2)rEGb6-0}0c4&3ZGnGCvKyQAG25o+8y+XZ2W?d=0YJV<Lw zh6I!c6eA$!@giTz5gC>W3#Pa_>1(&Y6vYRJS2}*>i^@w?c`&o3J(p_Fo2`vF{w<$Q zR(%_~lg8=NK<_re0}Omj18mQy!)jiP+~;VGc7|9afT?!WmS`asKBn38aTFsINxlmH z7Br7`(gPBOV55LSA-VvDG$S|dv;)6Q4jY3aK9Q*l(K!Xa{uY-0C4Bvtz$1UkL|lG# z<+oXjW#a?c6^3U;B8YJhK_QmBzQ1Ky2BD{r)hq;&#hE0!Il%uK0x>WPDvQSfRF$8P zSW&YR%u>wwHtQfuvWOMznsAs|BxD#1B)e?JDcI32lJfHsns&EEn$jnoLJ#%J;Lhmu z0Yf5fcA-5DR<F@bu4I+kbW1af6L=U#-C<ef29yk~Z;sLpKNwiRX_zl<Ra2|`Ve64S z;=}bDql)(oa+q*pbC@-sn^;9%&l0Ei=^EVLOcU<{f`_RKxMxJ-*U$x@!S&02bG6~6 zji;tr_z1ICqtvm_h1`+~x_16itZW+N0n{f<B&c2$Y&S6o!Xva9w%yt}_MWTG>s}>v z`bS_Wsd%BOft!~xZrm8mtI~O0`si$@s(WHJ1@YKmHAOebdfvgN{sgP}6)=yonnFT| z>n(Q!uZhVVv0kjM$EN_B_%BN0NS2Ye65jRLAhLoOd9uE&94iDI#3**T-g05tUdTGL zAE$C~Uo1XOf@6$hxL_T=E6&PPmR*)IuNmaH6U8Z1(gf2yauy@^I1WN*EI>!VH=xaM zMHnqaTel!2n}K4d@#3qHoPHC7wl1PIV!_sPBARfookj`eEv@&x!p^9eh%Xks+d<vl z9^8t&N3iQHUG(ac!gpVw`_j<uw%7k0Jr14IZBn<%^Gt+O&La*`2->jGzLL9$h}C8G zOXwk=ev@JKtGcq25lwy}eBnIvT&rjC0Kpt%mY3X9IP?<yu_un#nELjh(E15Gqx+T0 zCgknGR)!hzKZcEXZoS>|pS7IYRJAJ!p5cQkp%Qj_A02;-mHY_n_g)AMf-W{0WNbi9 zv$G(+(L*d2MmXz*Pqa`;e9T^5tf$zB#&z`leW5=`iJu;>$Ibqog4UhqZ;V2_4uzG! zM*kmh0a5i0r?xsDcgn=K{jy6z#<W#M#whD1&5cSWlFebRh#TXIl<YB~-*u<`>yU=Z z7+AT&##U}+XxHoAK7nJeSp5pVBWdO8F{ZVOc1x8Cz-yiM*Y8@SV7y_M;Y?we0C3z; z9=Q=|K6S!x457*l&2fH3Y@bh|$psZ9j{@UO5k$x!V}J@5BceEt<Tx}{Q=o4QW<bhQ z4&~!rF^Y2|*Z4Z3N4|R~Om4{S`S3D?5~(E-%%x=|XCd<V0TE~mx|=P*>%TxN-~>?j zK#y5LNC1;yd_5Tg5~r_Y0P)dT`UL@y1>hJ0_=ww)Znt4+!t)TgghlEz=uxrBd(mps zEf^!Lq7RqU1}a{)+jQI^@}S*<BnHT6iR1WJP|w+SeSNCJe2i{6_&jp4bXa<vd^7mi z=-DfIT=_HG-SMhb%WZ;|=li5_yVPXm#Mg>;V&NEJHB@U@&SIO}3_&X9ZJX&T>n^c+ zfSB5Qg+ONi)q-SKq)N>%Rg>~M4PB|3X(uO8c_lMvTXG#HW+ba1Ya;{~pT+zc;xE=_ z|Af;Zr?6&+@)hGhe1k9}!aZuW?OOe6QDdr@_D)fUMxg6Dl5`^sH_1?de1YQB1Ik#Q zrcHz!L0|UY0rJe0!?kJIt&G+-3DeT>?h`HP_Ey33Ci$ek4Xj$ZcdnCD1uGL=fAyoP zQvp{^QS<|xVTjEwRXYq(U5G^PQ~cfqXUGHba2|?ISZ&%M(YfF-akhLc5dYxisWU?) zGCOCunfLl>aE{!p6^7pgWrnf`X-fie?C2KHWC7z)_QqD%Svw7WjgqFl$FnMHuD&8z zR!gnB-nn{F?akGgn`UB>r)l;AD*mMW(59mE40>IBd?G8xFv5Iglc1iL-0aI!Kx=k^ zJdC-2VQfz3fRP|m6K|2PECjkY<$?B(Fw%G+3^N>9!rTr3UNn=6m`I!W<)Ul*v^=c; zS3J4VxRV12CA&|MHg49Nxt^0Kp+XG_u^;)sV-AsrR=kUxPj<8KJN^xwHGAtb{5MK8 zDRT2y!9@^?BfB;ZXn*RKTOTsmsmHPeX%cKuBS)02Qc4vVSyyk^JNkf$K9VLsAv-+s zr&8y-PKHTp3*W%6mK7BlYSs=}Y3O0N72r@VTmEptz4D0&0OI5<^@2VywfX9TaL8gq zSoso^VdX`<E^Jw!;VfSLHIIZ_Sb5sP2hHNosj4#?+EEerx=uoRbfc4#$v|ROo8+g* zPW{W&X}V#(eY#H$LFw{vIPF!@V9(xi;_V6pK}he=ZI?+PPIi{@o9D~w8?IGz0SHuF z+FWYyK*CUiKG{>p>ul6*;uz2bIHitmL7&Sk7xq-ro0J3OZrmEoN@+;U1B()GU^ENS z&Lm>}E#1~9dN@U95~K(}Ar*mfo>+JvF)4iW@{p;5Yc*1W`rk~;)l1bl3)Oh-<KAX7 zcGmh7F5Uu_`BDw`jW+2Ee<JoFR*c{WB&+=rD<nOU%-V>GW1$*w9iqX=2=m)=j2k%= zTEnp1NS@2Oa2rO7a8JU~ke|RcvK@sdA7bDf9C`KJgrIk8U!wj27btxS@MOhtXSSY` z?bqIFE4TYi>@bL9d#^!vT%>2yn|ZyDxdN+|YV86ihYCjg{p<8mb%rCSJEtyIpNXAd zAD21#FPey8<wlfI+_LMbF|L6%>m*M9_;eek*lUkIijj%t^?wt))OS~z%o%_qj*A0) zF~`0-M^~_6REQ{KtIeIbhXiEHpX~6{GMQ64RKka11RzM4Hh@r2{-A?sd?Nu43>9Pp zgSYYz{i9r{;_ZPF@u_Nd()nmcm<zn8m2@Y=)%-(jMygWD3z5yF;P)!onca^QhTEXR zuid+hB2gP#(3J|v8I8VyeIpUR!2QoXlbfeDgB<(OF@j+3=D1cdX3~j#O-5XD2aD%1 zGUOj4D#>$jvkOfvoMx;?Q6LiKS~8p*6)xbB<%o$A8(ocAyV!<=GM8Q=3?!BS&&ji! zEjl_pl5b7_z1<Q3M=M}{da2RPTfJyVMN>E)?6lf?;$*#+(`{l)(!BaJ>uNOhW4gbo zbA-g>&1gahiktvQ1xl}oD$S!CsRq<{$pHnDzDQ_7;<exckoy#`bt?nFdBg^5QXTUb z`Qy6{dvg9jTGILI=Q>Vzh(dRcabOUacFEcqvK{^O^w-k_XtMVy8|a9Nf~&9xyn4c` z_ITaK{@+^0cBRJU-pbdZ<Kn^T1IXhqp4?O<3Bns5@ft)mgnsg3f5zEt5q}}J#yLU2 zMOX<j$SYwRE^(jihVH!KfGmTQtO@2rF2+Hzn`V$W|E~l&TDJXNI95A*z~jNZq3j$` z^h`jp*(X!%W1f4YolUFFxCWbvek1289hY?D-v+IVe6w__R*F8_XghhY<^gQRlyOir z9h-oJgLlxVkf|Z%c5OZAZaL+R;eRZZz>(*>wiyhG&)on58G27@)yeGgFdS3HvaK#^ z$+9tBX#>!$uBkZ@UCaL{6;T8f>CWjt-K#tK_PGsUwY)2i9|5;Qe?uHla_%J8F>{ME z*i6GsolNLA_W+|)BD*t0nr%{5`6zn$EpW<Tq;60wR-xd1D5If1p;)1zkxV{dGghGC zdxv{+bm5In4QctJtcVmWdGGN!cCS<fKyeIz^fXH(D<Du?B;G;3JP}J|uPzHLM|}Pd zQthkl1F}<obXX7l=Lm9Qz+zOaT7iTx?LpMH*85flU2mg{5ex_WzSqFtCZuUO!S+^z zIZ2~!nqPmD&dC)!lxlZA^l3@jt53D+4dPjuFu3QhMI+n>C!YV%(HrXAzr<n2pp?Gr z>>N^_@ut1GK_4hL-m~p9!Brjl9cR_*G1ZZpS|`R6Cz0|>rQ+6K^`8K(iWUojRCI1| z3A??QgA|;uf*G{kXJ&+Ico^WEZmC7ndxTSod~?{AMbngZKJc^xQ~x6s*@B~5*aHh5 z--kjALmy(+7Fl1jW((R%K2!XxL-{lGW=UB>BVt+JWp<gxobl-bu!Fj})<OQ~d!b`J zl4GtCr;bVdf}&C9%ldTNPV=>(^hxq@syfLs!oUD|Dvf!OmF(wZo8-qf&hqKVuRMat z0f^EgfqT{a1{rxWNv>i{kZN7M8e>=bUeZ~8B~HsnPQT$+YpbOf=sdeap8(QMLu*Xd zf|zsEeAXG$Q5XTF06LVsJ-c0ZR3{MwDmsb%mCQt8x-%T&m%fO65ro20(qhIFN<jM> z?vz)2fU1#K!it9Dai{jApQM<Z929cN8SwssjN~*$G9!Q_JwMAE2S+upu{b6?JE(8O z&SlJoovc;8hEsk^@0nP?pHZ6*m?dluoKCG2cD;K2hrZpPbQ{FsfF*(QVm2~`InEhi zW+|S&?M-OPT><l0(_w3mXy<pu+IFg4hgr*>#!jV^spGz?!@VyEK*!VRpEusD4|1A= z=RGPFQ5$4>scbygfzNE>&!iyY!INUM_dq%k8?|<}nMO>MADJDa5Kr)(SUSV^>duTr zfFi<6hGw#bjZuYlBcv5NiJ-;!fovuPB#}}1$jEB!%>^m3g(O)jQP6*lhuLpg(`M*s z5|fr5(?KD5A;kfwtoEf$N;p9l;z-taxaFpP{UDO)XQ-*xqXv|DEpG3OAD+`Cr}S!P z(8;yi7|!8cU%%+4wTe^yH|pb*|L<-4lnndN6zO1{5HQM-&a*HS#C0E4@6<670@Zo5 z@8~Tu^((|S?q|D1YgJ88icNg_>mW5=AP)I9k*i-M<MqRpKV125SN_w=|Gx5n!)Zu7 zG`I<22{Cwbc`XzW4l|_Vz=9?mf>4l22+B9nM26)c3v9R8-<}bRzE}ltsrWgtBAo+{ z@?D?H@*7jGi<aat6diNEnDIhdF&i85N;Ww+fh^#MJuY;J)F4^EJPu=XRK&B$+=bO4 zpYiH;O!I@3?lq{p*R(^aD~?>&wX<Ea@8xXgU0UD(`Y!)%CP@G6D@>%=BXr#UtY=~B z14#1hrz0!4jTO>j6uKhV=-5NHFlL(T6qpY*WWesY<dQYD^m;%Ikc#?JK!X3@oR>~H z#SH>qJ9`2|Pb|OMa+92DTA(ykttrs57{E?W(MO3suf&f@x$*DsF=E9fo@$2_m?LG{ z=w|zIN++bcl5BIFgIJF-8zq#Kl4;|dj5HU>fa*kVzeK1Nh@2C(z_uj12|m~DFcwK# zL(r9ga2X+9#2R^6N%qADes8aPA@R?O@jx4SHj?8$t=!F7FL#phZ2Z#fNKjWK)V-%k zkHj^H?y6{JIv#Y0A3EL%4^YEt!)2d?tMJ<EQ~?`_kG+fpl5K|Ek+m~RKI6Y2R;CS# zagj=><Rf6+em*^7St$ov@|rBGY&XLRWV5~8yjikMegvb4e<BQ(=d2e<g1V(%_ahZ- z0l0iJq6_>RET2UXlDcfieJs2<Ab>NPQ9Nyd;_JoRVf2wS{2eNEcXw|WslE5~E@X`u zAV(h)J+W`=?%C|C6g4zx2VMIGrX65&hHH4?1X8I8E6KP6cA?Fr%uc_H^_|hRhSi5Y z#4T%dDMDj9q)N|8%m};;65|4jyxNfdDzrGEiio-`P>&tfFF#?oi%;Fdr#_}y@lkZB z)F|@6{IQ=9X7~4nh;}yZ)DtqveqvjYQ4<{DVh=&LI<Fh}-8G+6%^3(oLB!-j++QY> zm^LSCgUzj?wv$-BzC-hA=aFcQ{BZdyrNqzOtTpr-;aP%}{?!<k&uKz^J5J%H+uANx z*8#3cm3ua65Pkh?k}Ty$lg7=JcB9TH;YJGPI%2R&&1yuOROi&;MeC~bx;<usy)@MI zK+^y(*z%+HkV-A3;`}^y@;74AGvV+=%qTLro-@>AEP6zUQ0JlZkwBez82AiE<Av~q zp_X}2F_{+!X2>0>y%bq-nzh%RlIUksdWAT*g7kyr;Vz)W6AF=7qu-_RLln3#d!hAM zNPY0x;z|}h;f3Fh^{he8IZ*LmR}+wsI~$Z;Q<H>{1|LPBe$f8~-z#octvh|%77^%E zet2GoQGCKPubbS$7MASeAah?ZmXa(Ye<Fb8iC9SfAtXxeJHQ?BuYnEhAxVv961ez+ z2ylkk3w(X4+l&^I%N-ucW)T?;=;Z&+FvSsP$Q8-wpRdn!GLNE`mlaRgssZi=?d$uU zfUZ@F45(lI2pWxA9|VW*X4U9ssCx%RQi|GB=hJpAh-%+NHCOfqbOkGw#%YGCBf@wD zLQzUWv4`xB-3@oPaRw98_(Wn=X?FMqbClR6<=3tOma9C?E@6jU8V;kzxJx?=@R2`; z=o+&Z9sxUt=fyJ{>0p$GJRqLe%##3{yb(v8QzRiKq?0q{4|*BLSKiZHh0oIL%H=+D z$hRkN=<L-r%;<!%Aq|yrQ*7shlnQ#+>VV@4unfTYtf?AWYLF3>Nb)nmpF%{04UJLo zb#&6*2=!USqdna%Tk*tOf7~04!K9!o=+m{{&C6D?OHHQhk^|9b>jxf<PnC`2(l43{ zun&@%_#_#oZ=$Iey{lPAdF1=c3uBAan=Uy7vqUyCEDmRj`d(}TBW-=3(Q$`IU;xE$ zG_`sNiUmnVqKCN#5lEvsJwYHts(isMM)dB>?gB@Q@jZJU`>^G#x};+%GNN>j2)e3+ z;w_iG!BlOX!F$)?FRHKt6g`<n9X(#v`Yb6r0%H-KBk)Z8zT)omc&^{w*xEt4l&;!4 zQF<4%Jf@>Uc|E9Y)6s+$Q0QcaM>_ht^;;yX9QSj!d-($`SW~O!Z`6`<#c4%EGHZo1 z{j?j*tTlq4dO{JE1NxP)fU=IP`6TQ*!0-rw&bI^ABk#wK_GEY(Q7J$4R+}XPt&);L zhfB>tp~@+Z0FtkU0Z}0Sw?q#~ucTF0=wP`|B^qR;EnIaU4<djNfq30#I0L`N(7`7Z z8k*fIR?mB)dGQ6|QbT`(u7_c75t|K${kGlglM#3AGPpuoIXv4;)6-`<_-0pd$h&^( zHYDOf_~a&z9_30G)MiL+4jCeEhTTI2QId?ZX!Jh=tkmA|u<EonzOR~B2JFbzwRZIH zWM&0e58_Frru?Zjh}K>Tty&Wu_*&TxE@7|+ptHmHQhrSsmk=9}Ov^t(mlBl)1LD3H zi7!cRRB}eL*G%&c%rg_Y^rjL@H1;55Fg(V4llL@{T}a7$&xbVF0`g|OaI_byZpLM1 zM~H7exKx4x8hyWL(x&26L;H9YPcq95nM*CGegrT8VRJ|j5A0g;7#XmjG|bAt21<E1 zzUEJr#rW~C)289Z=_Ebxv>9uXeV4e=_PADG1=#n?dBv$E!JoO+ThwUghXJE?sK&d& zo*ta%$7vr2$U~J!r-E!_xXDyF3^@0w82~!!4U^=HcJ`##8Nr|K2{|9J!{???%2oR2 zJiq8swh&B^L}<3KZOnsuIg(#KG*eK-#gn~=u`SR_p`@H_Uhxs95*=PRh|9ww7pPSs z#!);^#C10c@l4Lvx^}(9f>U9Re5+hIM;e#WLG5emt@s>$0M4Y&t#hF+=IRr45lnP@ zJ|!Gm06F^5DR$&Wlt!DNs2m1v-^s}e*KE2-+Ot8!F6xb9+^0vwX{w^pZy3T(d<=#U za9~RFI4q=uqAcRw!7eH_A}B5}EW*5G<^P{N9DO0u|2jJ%4+SYbpnHfQcrQUOsqJ~2 zsGIcEGY<;^#06NWIgyJvXF?fhX*8V>=*W;&_9-8X50Q~Mj3fr5*@4S_%9{f@!JNg% zB0@#8%9o`$jyIx)cd;9e{1-?uUZO3N^y9$61CX+MLF>^DV-XKXrPp)tp~FN5c2TKP zD+=A-w5#O*!Z$In5lT0UIipoxR@DknE5zUk!><p<RM7uYSn}x3)}D&0^T*Op+TjJ~ zf0Pg!s0bYJXz%sJt8HE`t4-9T2IWA#M!QE#Lp{&&ssrnnDfCqJ`e5YQyA}Hk6QaB= zaPR!8_TRADy9Gh!-7EYOK_**$snP6yn7kKRAX0fisJ)0lRd6Ei>4RgDtj-LsJqGLl z0fQ%cmlc52;xQVZP>2Khgr*!6Vu>+-IO7d8<WG*)_^*89NZ#;gK9H}NMZ;9(13uv^ zvWUxOKvP)^vnro<BAOwn${v{dz1Zz_<`fDYq}J(@kCD(qCgG+vTz4(;Qro+TJ5INe z8p#%nxn|v-W)>seRKKj_Y7?rJ5f#Xa23g$su9HRs&UUj&6!rebj^iN38pT(z!UM%n z+U%5?QsYC6{^h#u71X53z(?vZun$_T(sMXmetQ6@akd-x0o04X_Df%&n3rJ6;0d}* z5|Bmb9D|%-w{Y-;*Hl3!jEO5Blhb_?9vA<75w9==5(4DHnzEaDMTz$Eoo67{5ORdB zhKQU4H6=B+KjVO$g^1uHhSKI+Mo#c*D&IQ94nWm=-`8oq?Ud>@5LUhum7Ezc3T(2~ zRObUg*Lybha6NOG?mXx!0EN+c_{6pKchQ<X)V%BVh`RS6Syrj_&$YuenN$n4L5)^y zed%D<skvcmeSaJ4gOqplN~Fk?N45M}qktXztOy1CqXU58WoI13?|3gbkEC6vWf9py zw^63>B>!hNIhp7S!pn3_b=2)EZxotP;{yvy!MXJ%=Kre6&3+ne@9)x+Olkt5oMBA_ zfFX`hRxGN8LA5ZKjbIS!9ip&h{~LF60sHW#IgaXragjAb+QTDGK&1<A$7~4M1Y)MK zTFWq!A-r5scw2tg*aG~h+zW>}f0@{;eG$+s6{#eN0(;A=_Y|c*<UFLilAr-m;Q1DS zjgmTJH!-eh<x-}$1=Rzc^%FF0qlpo1!7K@<(eGk_&?S^niRp|=+d`6I)%q<+O{*BP z1oY6L?g%BB)rnMk)o!UyOs?$)<$N6KDR9&%?|+&WosVI+g?B7)3e=W<8W7gar&Id6 zsOE=n<jG5$fP0*oJ9k6o5>owfo5T!(EXQwFCysSE-Xg>?Uf<S_Q?`kO^3>%^yOhLW zgDLOx1;7aRW3<R5+z-M>ntOo1#7tr2l5%^J$Evr1G!y^xUekx6)28PG(18c>Wlel* zifj^0)+?;Cp*Gt<s14r>-C3Ro=7yLb9OOgeF~JcMX_7y)+ZNwq;mv|_HTfXt&#dco z`aICJaa*~!-QpaDEm1TI0Jb58D?9;DRJ9t;x57#n>>ya<^aGe@L~YWVONo{RX18qZ z6cm1CNhk4X5U7uW_I$0I;rFLM5V_#lz)EM-&(L2gKfT+d^urG;->OFml}PUIIw4V_ zm}yi@m8(?-?aV4hyPX$Ww0i5W*N`zRJ^8Rk$?A@n!Ril3;R#8Tf$ow15;sj}mpAC_ z@@*q&%##Z{9xg;NEN>{b5IZ;(A}k;YM<E?85=BTa3CZ5^k2omj)(qK4{3EL%*J#|Q z=Ysu(=Fk$7qFV7KBs5`m1eg8qTN9^SVT^5?o|@efISn0e;*|%pwNst?Q+^WGR8?7@ z<r&kU-A%Jo*V!GJP175jaC<?Yr`Vs{<dNx~La(+yN#n!{$`!zXs_lf-v?b&?enZ(= zkua|iR}~AS3ZPNfNkms@>Q(RJlgi{_@>&<@BBlEzTO9julsj!zieC1n<PNbhVb#)8 zVVv>r)h+Uc_{j<<$ot066QI@?+f*c|M~8H%eSDJvjFjJfU8d6Id9U&)1_QE`ZqVom zI_U-6fCVz`WPNCZRocJ<yh-1q7s+Z#eW)SQl0}7og@__I_*V!mO4cwwOl&C594T3; z<(it)&9@I=cSC(yF;-(Hiy;dvqKM0xgfOQI^a^%hasLBCJYl3@i-f8Vbu-LGR}WuC zq^OMIEKG)2=gh~wMU!Q(#Hv{|OCZ$WrGK(@h6Mk(TDJZmdlKnW-^j8XDx|HEbHK<u zX-{R>iB`tL(4$loWS6DhMM$+edD%rL&3tu(Ur$qi^1F6G50^?hBiKZl^&q!9mDLgG zQ*KXpXvB>n&)Nmvsb*rYj%k+nJZ<y9frXxTwudVjG;H@4g@cWvM&8k(!#P;bt6{tm zR*)wTJiNffFlQ!n@U)4;7#SekF1!m}7Q}*DhN4FekJXV>;DXsv%JS#=OZ8#oy?mF` z<&Z3sY%i{t^T)+rAkLK?&;Tu~yLF2;lt3kr+60SAt(qT?u*I!y5!q2z<cYTS27%p* zeaEYofVSAJR^qm6cD(@7sl&8N8rBc$z1<@HI-y5N0zT){<!IjjM7^q$8&5X>1tZ!g z+vPzO{&$bbneWWosnhIlj>@b>nP3JOf*1Qes%-kZn742#`oaBZo-y*+R;>n2aZgfA zG;RyIBA7Je`{nYq@_5Kj&lE24M&b@L;XUZH5Uza8nS3PjMQDk?C&V)$P2MifLqeDZ zz)%rt!R&-jeFpMX=$T%wJw<yCt-<6RJDA^OQ0*jchLpXKJqcvGBcMCyv*+Trbknlp zKJ6unNDY#tOVyDT91@S%*v&gh%_({ZTSU73&cR0ePue?xexhJa$6@?^s}wX>#hs*C zN6_Cn0F?<qe|wU-e~c-}JmkQ6r{5rnFjz;w(SHTIP}etVpk&j|NnI5hJMR*)s}F*{ zF`XpLa~?p4#rBowgCb&*$V;la%rgruI1KNJD87G&hyYj$yAM*bTOk$S78_A0^?S8O z+iq0SD5o~qw|x|dRd#BA$*atL<u+8g*S4jm?h0WElXS4?c4F7ZbioSG5apxcdQ2U} z-)xpkUdh?n89&D4$JnV<`?SWy!S=IOE40cL(ijso0(Cp?b-*WuGbm^m&K2wHZ&p*H zIj%GPTm`hYj7%T8y&*z$eyKvxh6dMwflu<1XFAIY0`($sP(kJ{G>NbYg6_U0EBpdY zU<t_wKq&Z2{)@aKQpIbWlI1ov?|8E~ODM!;ATTGr3obg2UZw=*lwEsVIlJU7?dVc} zx;0LbF|GWVkdgBNK?Nee6X`l}N9zkZ8aV`oCH{rklv+}#WN*`dGrVCRSAQSeh*zQM zW~_RudPoS1k5$n3k@uJicmdkFI-*(GqtC8IqzRdlOgflw#cjHVV}$==IgPE13#&WN z1pkt{4`BE^bXt92@q|l%>;M`)Ve~i8#>SZ~5Oh4Lalee408JM7F~c;53_L!6IYclN zg=2VSLQvD2$Y1slBH@RAZ9W)mfKh&%9$Pm_ZnP#q)pS0hs5QvC1FO@Dov-pd@s?el z2tJE4O<)>d9$#tG*T4S3Tu%u%kaQxOH6`$djpR;Ix%nDaiW?2bj7*-lsduG23|Pie zrA0lz=MVpIWUZ~N0Q6W!+!WTmWI)8mJ4fG&n|MfXk-xkLHu;<M5&fN&KPHDszhR!i zn0>+t3+9l$V%R`-hVX%Z$OmSlK_Mt0B!gUsLNGoM7Q;Z9vLA$9pc156(AM~-UVhZb zi9rdy(4z=__L>MMUie&gG;Q#837+P1DKV$`5el#6Twzas<J%$T{d1P|ba#WfqScwk z)TYh_I9vflNz!nPpX9&Cz}jr!+BllJc52TH<86HeRGudA6gkEj9nZnSW8|@7m=owe zr)n{(fUJ@ew<w&g2R-~w>Q=xLt7w4U^}RF-^lk7Q)e4SON$qC41h?mLcnWD4{d=jb z0irM@+|S+wBhBS;v_PKP-4WL}sGUz*>)R<EAO?fW6lvPgtMpY%BHfF7<5ArnZ*C~{ zWpd%fdLC(5Ugah%ZmafniwVJP=l9Ds*X~J@kydR<+Rn>SjPzEtI<oBVH7@TuZx27? z(9i}(Jc$ubjO8l*g^4?ujc;0r2#xPE@InaUs4Z5Eb-_B~1jud{leLVCy^oWebH?G$ z{Hm&b3X7ecOkP(4s}z7Wrdf2G?(we@%~v!i{Z_r>7T5~q$Fb;0!y>U_@91%uL)_TL zhn`ri_}Qljx&on5-ZsH)A~mHdso5B<bP_!n5Jef$%W`4K8FmvMlH0$}Ydn_hM0gKw zm0AMf7^D3RJMwP2f6?}68yls+(Z`P5vd?C<{@8A>*2u$BRSu+x(E(n#S5V{BIiE1h zQ^f!&ob0VINNJ`Kb^v6QH{D`y(97)Fd~4ida49vp(VyhE06gM&vKh&f4=%ULR+_03 zc9BTt2HA-{BD~LoAQbJzE$!~gMv;ADv^0W<niP&NR|!X({jt~!92GlN9?{SD&=_V} zu#|Ex#dqW@iz~5j<ij5_2*mO~w(5dyL|YL+?9IdA-uw>jrsCCuvPVhsi-d%1Oh>{2 zmj4ncA4Y(8)gUftjBH0wlxEKS6g$WY+llY^r59rFvUQp)&2J%Dn~W;2#M+A2L8}0_ za;F$sumYit!1=bcH2Al@;o9r7(CcL&PyzsG=r9a;F<FC6Bs*D7IJrlh*pA<^2Odq4 z;}h8`O&8NP(`e3O$xGgr$Alkq9#g0SH5MToVr6EDmlS{!e4GQkm6MqAj6o#F45z~{ zGx3^?6wCAc_zH7zJvz}ilLCy=IhByNyhEF&M;RT{x0|%K1b~7rw(T)y9h;fbgvUMV zg;#A=&?ONJnwn}|DRosx|1r)CaYlC_-Z=&C_ApmoORJYEkFK{fx0baB-2*Bl$ddFt z=eGxxOZGn7{y8VExggCOE&xN+Jn=YJO;pieIT88RpqpCwHR62=66{M*1Zog9fh;sw z5(>QcV0fG8_6J148Zus}h-p3%)-gL9Qu2`uJz4lahQPcQQ(P#W8;ii$n@gJca@py0 z`u4WclR<jjITxzEy?RFcHh$LIvcPHEG2rmD09z5;s3$n$Wjg%}Tm&?U1?JIzN;}zw zZA*(AN&EyPMoJqfMH@>MqzS=vrhn6Cu3Cg8pdx=M1-2BJ&giTT-6&~9xK`id%GrFq zLkV?GZ=Cu!Jvt-PZY0i{lqVM;@9Ar&C|E`n(6(D812*mL>MO2#E{#8U0rUn_Yq}0f zP1+R|S(?R83FO@aPts?<_Q_Ul8_WDQaof)><d4Wivo8%5At`1PoQ7lH5M78#3Gp}# zrG$(qIW*Xk<zy<=a%l{^!p$Z;AXk*A*9>ACw|>c>vh|-0&e0!t!>gfI@Y19N&-RO! z)odWIV6`kgVBU$^(G9yt7h-+O=}tiH?1nuWy3%+*?>KeJ$elUk6i|1x&?)E-7L%ll zkRs)vMe<&$-}NLt7+t3)Z~f|1t-4!1`;ox=gR0$G>+1>8Fbf-=ia}BqUD6lCb{Tpu zamV;w@skdAHyU<hbv9?{lJkqR=IG1q50U1`x~q~?Bk~T?S`F*f@`-K_E}oBACOalS zag7Yc%V1tUMb1{@Dq;w*ZG~4c+YLoU+6$dIC>*~yW+){u<%Ka}YB-NG&-8MkX#gk7 zr$$u>V1Yku4GzvIemUamTruZUY!T$=>_}vbtfN`U-TWC!Sf})LAtUXBeh1{)?%S<; zLK44~--Nrqw4vhap`9^f9N>~QCmcdoR+9BWu#L1J*RS3|B~N#wbUvdWKxLm=I~|nM zV7P9zdl}dl3++f?%udKDmUrX!*#xk9;XPMT(K`qqzr5amCZnbO!R^Mkn{H>c8kK5C zB-tr=A^-`z$lb<%Ok5h;53PB)1;{NNq#C3ll`ABF<&TV=s_`AGXV>SnU>sbsO9Usw zLVB&Gx|cmmAQZsGiS_ZZ9W%2+yR48*UU`$=mA?Y+?e`Wt0qM#D3C+cR6S-iRnwLQ7 z7ldyt7+>gZJk-OP(3-bPOo1#V82`mG@L#zIvYM5UysseRL>QSxBCWZQaJ-e3Mpw#d zOB4!wOzvTP@TZ8K65%13lRohDG_6vbgXt1?4@Z=f5Exa_`f)wVvh{)XpX;g$sVHDX z)17#4M<c3|50gQ!wAStJODM4lb;;DR6IQile?|X}zBIO9rt~egXl*2Ap@74&@Dphr zMSVHTp>uk2d&Pf=N;ZKR`x@zFf;tpHA7Po%s*-qcbWqbtHEH7K5D)X!D|)n=JO+B6 zJ|8~$Vo+>%(7CD$+O^hHO)@1V`o7XcO(F_T>C5<_2j@0>_War&ojG9w<@di(l(ALq zC!cWlNR-jfR|?}E)*@1eA+w6Ep;KSM3&5g+ltRf_Zf3WzOhSF5Lq*v8`9itKVd;#r z*kk6uz-TxshdjPu{$*)I$8bHVd*NEshU_O63rT0B+x>A{&ocuISO+5j25H@wz&&0Y zFqyCln0}q0`Z_|%8P+ZG6<cVDLm}Y0PqUuASkqLAED_dv+6}9;RD#8kijF<b$^;VW z)83+bm6j^$00CE`To#yx?LSMID0T>q!5F_s_D_mHqaDmr>0eA`Ovu7e14)?^YkolC zI>3PFYapEU!G+n-aVvW_h8<=7QLput_PAQFQ{j&MOKFoPdIZ1qMBZ;Pvrux?=fFDL zL1TZC9ztJ--bQK}ni)-O-onO4>WB_uEAgr9qy@2MZCE7P8A3-9VCDme&T+GI{0GNm z`8X)FUjR>+TSpdDE-O;i3+l&7x)zr3!a*zuMA>(mRWGd5Ux_aGWH{2->RR7Ibpq83 zt;QP7^eNl&vi8|1O6<qzGD!d^?do<KUqm_Q^t;eAr-p_g*5Q}Z8ZhJ*08Fp)Si4!- z)AhRm3NWQr_=0xV{w(z-{WmlBbHl`nx)}c8)&Nh$&jF68DyPk6qlp#ul4D#0!L`}J z7I8{qrTA$LN-|{6c;0y;ec9D<^^MQ!>1<Mz?biOrDr@*1T0q(7vJ>^^8hk~M9PIYe z2bRw4Z-TCrIZ3}Iy2dc64;KsZ!~zHAx1by$UmsMEa4_Q{>jpS4<>ynB3|yX@FR)sy zfqc~%n<yyO;V9=rj<HEZsS7HDcdX)UaVkqH`$x_bOMwyzS!zisns5D2YzB-;9egHF z!m+M-w9)Q0tX^BEBuOB&ZEu9@%%Gw-iNlB}T8_HO4K_*Lif6@s>6+HeUxBl+x?y)3 zwq;3`q*ZcbYqn1~FI7YTLnTJ2C0DY6)g*~RAb}KYxf&$h6#Rkj|4td-x6R}~g6xFl zz$-nvmfDlOrlv<wF?R~$4}=39HT3>}uHL-Mjr2P6Wb8W-Kp+Bv9SJ0sOk^gJE0Rnm znPe81B8w~*Yhx8vrIJb|m6p=t(rQ_@BwMyhEz6rMTZ`QqyS<Ft?rx9!%uM&3_Kasd z$H#s8j8Fg5b7sEAe1ZAhH$Ya(DHRh51R@jnz3+YR^4#aP&<A>|Z1*i`_cQf9>2*vX zm|-B8dAY>6m3T!a?_iu|-V+TmlFIQWcEYU<Jv_!*=XnARS!brGq#Uj10R;4Ihh)b4 zUYT@`4pbM>Wlp3Qh@?Kw`r$+|{REkdgk^OKiQ58$Wo_h1C>+>2i#pqe)nN&WYXu`+ z6P&c#j0#ST{OvK9@g^}~gv1~|xq#JWkS1hT;fW1^RijVN9#{6oDl<_sv!M$zO7^0p z`x}=*1;*yfRW}|1RiNHVL%!BSH=G+CVJ=K|cXsf_NFvaQ@@;Ddrfc)-z>6?s>rIS# z)vW>np&GJ2b>A9zfU0Wmk(|&gx}#V7rEsKQ7ho)|;09d~l208_vZ2k3t^2iq-E3rk z!OTBAhfmTb6r9-yHE@!G2U%eMpHZ_^-=vE5i=64d!Q`oP5-9O$k<D0nN=lmJg*Zu~ z#7_(l;zL}pG03)|TrR^_)!D3M$~~mf68j_X2X~_$sgxq^sVXB|DE?TWa@<@6uwuB> z8_4r7GTA+{bL23Q2Y*vGU^9cBhhakW-CMEaY}#d`(wONR<_O3r%|LVC8`FS-S)%VD zaicNvc@(Ynd^;~afaH!LK1Z>83Wr(;I_VeT=3+jLR*B1<x;9RMm9hXFn?`@c@vG4n z;bx^~WZlC;y54<%J%O*VM|uOEGyci3K|n>E#!kry+j(yF@WCYQ<J&6?gFWTcXc<FB z5aL{MnA0cjX-spBfW1&9=+LwTLV%s=?)i47y%HOnv()|f*Q>_nSg!(S37ijcJGzB5 zx9?MA2~wDLNHIvi`<ZhlfxA~GwjNRO60W*Oc+kSDp%4(Fy%`e3t1Y03$XHlwkh_xV zlLh5@Rk~uq@Ouk$2-ZiIk9)koGV(4CmZi%^@|c(8NGTjL`3WtN_4+?>Zs_u76?E`| zZTLmMVT@V<M1Gx-!#O)YPUu(*?lbx6ozK#<T5{4D4CES!*Pd0|CXVK0u=SOl04uiL zO6UQ(#Eb~&jhXj~F@szP+G(ptX00bIS=B~2%|eLTF?CoZDDNU`ThIHgN~`rUB%tI0 z@r(#t$ocJ7-HMr*UiE;r8jeV+>iEc1)HymxtsQczXU3Q4&V#JkzilTcU|gCvs@ccN zMrUh<afx1YcxDA0&^^*cC-{?_3S;#t&iQYv8HGw*B-xP*7KyVXd#vN4^Ah6F*C;}l z1E<(77#$^ljF_X|&IXWGVIA<AWm`J3>y)gEIA+Yza=<e@H%9sr#f%s1;w)p8xpX{- z#La*POwLi^g><5@<4f|zFnXhBBHREHT?FuB>potqUF|x1a`wcoe^YXw?w5k3T%%YU z4QG+{`oc%9eWSbbtlQ7#j8VIV^gOa>Y|z93-`F)wh<*G^%+=*Q_&c%l^}nXxvDKiQ z2K|snPl%Jw7>L#Wcm{7?4U(c`$p9jKc9alKw8*}cycK?XiS8tP>B_!ijVMhfy=}6G zSUdvIeY0P8v<SARQWJ0xJ68|>m~1QcrL#4Wf~#bm)p>=?_ovwz2nA6pk&C*Dc*Xx( zYA>njr4kosfbw4VM65zwiKw}NpadU_ck(04HZN9$-02gu$@1}}u+jV@6B#<UIGB^C zPu?*|B-xIAqr!keD&<w}lbm@TX~(SmWgtVGl~EZGgK@<jp|Ee0V1>Lknl7lUvvOWE zSPTZ8rW@2~?xj{nL3tVsz5gAwymY0a<Rse6vEQmTYg(FC9e&wc<y5>S@Rm-KX+n)8 z0y9#hLQH!MRfTsi2;o!AP(>QT+%*^a2U;4VM+lv<W=120!^;lOWTHas%^H5~C8}^D zPq8%z9IK*#A`Vos@IMi)l9>c;<ToWY6N*3e9SJHa^Ck`ou48)$^SfNh7dwU%eJNko zNAAs6UG7wKXq6{zwG_3D6|EBQR;qf$=e-C+sBq9yL{YQ3U8f(D!!40*%!5rMuW=a1 zTDftaSz3I}a>z*-hNIb-*r(xIbmQiT@eMRHv{u_SMt1mR&s|#~sgX0%iP%qb{?atB zcSoIAPu3^bId%7rhE<YDhI@aX;}=Nb0UAHTS#>913sZ*MxLNx;LTBm_jISVt%a*^N z@0#Xml`)fc$N-lLj+tSU>erhzv2qSUEki1il$m>`Ya=9oe2E&)3rJk_R>UGQ&k8|{ zc~Bx08S^FPS$Qv1r<S7RO}s$9PgaA}G2NeMB>4s-62Zoxk$HQhbKKDtNE>-Js=8K_ zba2HnR>v?`rN9E19JvW}6DK|2{bVK1XXQ)mMO((9r?6w{{{=6Ha_<W5$hGM^#7Bb_ z3Nf_B+E9lLrg`~xx%U*ET}E&*WtxUp8fk036L>EYazmoY>{UPzU_yNA81K*Tu~bHQ zNFMY^^(+g^j^rf1!L(E1krF4bDB~dv4ywXES9-}ykE1H_&c{1SEk#mFn+D|FMJ_zC zB-4>QWD69V8Wb2{(Mgn3opw(okFs;3DtWUAaw+$d5|{WtED=9V4&H;`DXOf)=NSzj zl%f<e&&jHmH=)NM!gMGx5#Hjg`Ei^1h8%c?+4F~JK$Q9JBO||Eg0A<7cC-j;PdZ_B zD)*FoE|_CI=zqv_`@_1nx*BQF9^jE+28YJfbN(&Eb+<=`JKb*Rb}38E{D0BtX_qL9 zc$Z>+V2-Nrx0aYzdJMlw<=E)!9f6VYieBatX!cNh%sFSN^x7tR7V8%zBf)I(vJPV< zy!p_<x+VYs|4qj_3Qgv$q*gbg(+?oftYNfTyO04|G!y=e7w_Y>3^_A*)hbG-uH;q` z*s|7<VG@+%fdoZm#Xj>8jmF$6r({ulr(%c#<0p#gkaZB#UWC-#jQ138mJNdaSY*YT z5Fa?K5Ucs$dmw|Q`lHh+ND+ijNnu)whQB44x&(?{ok3RGDCsbK>LTVf?nW-tD6QDb zj5;KDLG4!RQl}OeH>o5^(h{U@kmd2)fm^OyJ_L8}cYvWqt-~-{c?}ri{fnz1Gh>oB zck6NG!!Yj{>9$_CMxpf?Kzv3WjbIRg)N>=l23!k*5h`6GCwsJ8@k?NK^o;?hXigJ3 zoWAsY=;exZTAbx+Eg08k$XK#HcNODWF?r@U&;23NR`O(rh;Wfr;cBbAog9Zsq9Rc7 zI+V5HI`$V1xm=C7<;8)$hn+^_7qXjp3hTn%Fy?B#7!e`m7g-SwLPg@HR!IDwO#Dig zpjaR>ONzpWXSf|Vxk2<ptrKtF))^fgSRJdQe~aGD^y{vB=eAvS`)>1LpC)o}Pu7bK z3@>gV)I5;moj5ript7}c$Q3FY&1G=!Sxr*>KtbVT!vqbZxiKoOW3j;TxIM_;84^c4 zMh+^Wy!_#6d@?FYOqI@Fa=(v@7~5NAQXl%)8tjaV`u*^4D8LHAsB9_22s+XWzuAq~ z!NU=Ixi?AEnJ~B-!6vgQA=+}-M%ILrx<~C14|R0dSY2_i0PnDDvM1n6FEfWEh`|Ve z?yrnmIA*4C2yqKIRnpIaeio@KF@QvKW5uU;licjb=}G?H(h5$Hqa<KSN2q0D+2p&d zL*dk8_mML$rE>e_MGPATQdSQer>>TtSX5bVR*MH@F%~>fcT#(jMdtjL*D#H;_Pm{& z(jzHX@r2r)vhvR2W#kGa{30a@hlC|W^WD<cz>Zd!lwwAIl>#?%{{?Va07AnraC)*N zG)9yGZozO%sf>UEZ>UE{2t)jWO)FUSY|2S^oJQ%G<`pfP!pF?cahZNHS%=IA#1XL~ z^fwgmjcO7(Yx-Ad-35b4BLS0+SRBS?k~<{l#FQ}#LO~fj>LebMyffNWjrkPz*U_A% z#W`)U5kpjv<m}9}>SZhiNoHI&)6DZA@Dq@I1c;<_NBR&u&Qx1JABy`*9RRqQ!yb1a z`8b=Ab->@YIoAb^@(dp8hvgI#xi9MDC*nu2%BD?}tm}op>PUAgDTzYZH5Dw#k6g+@ z_IQ7?cq)5U?Ary~OHRRG?~L_!(+NK@FdEEemj%Jwpf1b-F@S-BJgNR1eVneb3Bw(m zD9hm8$YZz3EX%+>9%Yf+x{}i@t!4o@5MX7)S*J949{f^$HPQXH*_!p3knMC|x)s~K z8;MD+g)Dg7Y*K-MeGsZiic>Nh1gB|VkPsY$x;t{({=G)UN?&)Jbt`2&qou8%iM9fI zTDqJZ!vFs?9_TB?yFaHeo?_5M1NrEVd`cy;eeolCC`w#pgH)@OvlNeGFO=>|JqYc` z!eRJ0^3?)lD#5{>lvz_)F?CyU3?$|fdVB7h*{2lI(pr~d7jRe(P!x0@Qv)FTRuy{_ z*w&U2tav-_5IWFiYoe7oGQ#w<bBL>l61mJ#(V0zryRu<8lgYDWgVwv$O7qcchCc7_ z&aC(cY4jju#FlRSqZW8xzn+@$Xh^y5v{8kLBi^FS%<aK=3OOHH1;<>&=3pDUkeJ}- z6FYC*Ek$cCiHe|GF@h|e&mh<f%^q@>$jhE##>m)82TgDQt&i=V!7s#A;@3D!Zj*8Q zw3@h32w2Pma>x5A9w^Z{YX2)S;-@3w;x+ZJtOHg;e17RH6^E6dDWQraQBPS9WjpM# z%CZ)28mJD8$o@?q$gd2fVj>w+rRQ$!SKApQul!PtK|c(vVN7p7xX(y2Cthh9uOvcc z$lwpS*Kj`%t$1v2CNOQgA%KUllfzg_?;eDi<Uuh4K^Y<~WZ(`XDk<KGju+2b=|h$M zJ-nEBGO3xnM^nn3^wH?>shjIH(0=Y=)7aqP2$};z3z@6Zq)<e=*iVD(h*kuKoX@K` z`rd@D?9h2V2H`C7b&NWH)LAJ@#Z6d}w#d-Q3`6mWL@t9&+RjltwY5b&9Lt3v7Bycg zs3iR5faX$>B5zbCe9UhWc$c)Re2%S3fyHXkc>1{#R4w;UV`v^nqxnwk_NP{S4Am1k z%XkQ*0qkp5`9-Ki<5GojLPm4z_%tv|#(#tz#;F8fAz11eG(k{B;WOVxc{sT)s=Op; z8uZ}hEb>Yur)lH{Hjecp9QC(?<l432*$CZM=$=h{!AE%W!rCI+iv?Hs9rQ)Ky2mOb zih>g%pRdp=(LMQrPbr&O$wE}@v7#x(k^o4IA~_K?AcRNAW>-4;2T`yee+ct)O~(4V zSHQ{C>UaY5n?e4`I2B^+a@c5JlxYT<HQ?Eh@uwL*P+`f^?;7p3VFvjSJKiWY8XX)G z^A#`)ou(H%bx0-N=7-pQ-Zpluy|R`uehtd3>haUyUR}F;chVTrg$ZDPQtv|#n8N{& z&O!tb+IDM%LhX7b0`kTcA>gie5-9lmiPoRh3BH)=qh<^TXYh?48Z@Gp^cK?m7_xk# z9ZF7Yz2#05k&-Z1g0>}tj+`aNk*04Y(1ERNWg$>0Y}n`)FFO+@W`0J7auY7gvI{_j zwGA)@We}a<ugUaOh53lixKRu-`ZMls|7B{WG?@ZR0E1VR$z%?*-Q5xA3&%3EyOR1~ zP<5TTUg?q?LANgTqfQPHy%+AkN3cZ9ZhW4zbhv+&9vRE2y>-%x*MTO@j6v(0hVjm3 z7H7`*&1w!fo?!?SfguAm&2~L}HKi)wfGHamp#U_gmmQhrkj_8L+B_3s`c%AIcvZ!8 z>$~u{zD}L!3-nBWM^%c{M;FIeq*zm(;DsJ4mO8WyDdH%Jki}!-n`p1>RRP-`@FGu( zNP)cX;6|h6B6Mz6N0fE($ex_uIMI?UVL6ub5yTf4iA$U+?i*f${6dDozRli?-(b7| z2yE|ZfHra9!?N96o#;u!?_V@4B+tnu<J}VfVFQ9DXoXp~qQ*x#-eny?c&TfR>>1@e zfQvd)NBxJ972h<Y{<>$SanuZiR(RSi9VZ{2Mg7i<@ucxr(~9|jX;Hfi-mkv;C80}$ zXIMvx<J_X&4ot#Y$D#m@;H<%P_g{_Z>@ey>l~#B9{dm{%OAW@L8XmK6oS<ZkOGeYT z{}$(eH*bt57#QvuLj}bUCB{T+%)Sn;qGI?}Py*n<CEdDVb-HKkL_Xeelg#Wke$`V% zKOa?@KP7%yFNCL-hVNoq_65Me_oe2OFJG=C`mQX6dLtJv>g2wc4gwdmdjx8z3=itS z>d5-Yc0dEhf8OpId6PU^O@CGVO>MZQ4d9Fpe6S$kLt9!--P`c--AH0qEpx~R;!|#D z?X{=$M$OO3m_m_cRNEicAZq4Z8s*@^Xium6)UR6Bd3qZRuVVgWE!W!{O~|@1!IFoe z%PVgB<VG1en0<=~sg}h|yhh1ZD_Zm;=0%iDFD_HxtKTzfO&X#~F+MCU6GO6$2LSOI z0ZUH2j13r0YUS5_5U&6l&-4oVpm&CxRMN99nLwG+@`H0fQoVvoHxVr-I_h3X5VaKv zVSYLFC2^9~F(6_;kRiWD43)f2y5&ILL02Y1RHmp%0w7sgH4GJtBgXtd*?7eO%YNj@ zuz4eQlI(#j4BoJ~7t4iVU7X=Ur48%pc(B(t;+n@?56wFv;b~QES}yxmoa9jp!amNt z6ZrOV25|Ck+k=jA48s<~tPFb_Hq?^ds0`?52<>Y@<p;J_Z4I+JSyt)xsU}&~F`f>| z?~;-=$bHn^v;-ujqm3%!?~XVzOI=_1iZJcwC*cDk{Z7-M{=K?c>87CQZEr|}3EsFj zY-!sZu$=)}3i$0vR+yWS6O4%@i2X@e+SZ{%+pf59<`J+{n0ml@kr|M%H@yvh(LJnE zqV&evF2Q64UNTN=iUD&l7X~CwoZIaIy<j-&f{5_eM{#)R@ZboR2cJwjiJK?0Ut-nW zGpAedmSUunT_uw}zs2;IAD#Q7bANvB-zcAj1(HC&NXyj3dEpD^WwP8(ERHNO%U!Ig zEIeOg(Kxt87nCyKwWypO>n?6QS~FI!aW6@%$t}<l6$0Umize|(@jSm>*;TgnczNdq z+BjLLKTQh2M9AnO^%pD_{tI?4aMPe3l|zz2Sq(%;R9Z1<n<Cq3&`|lnCcg8lz&K@6 z>j3^>Qe56vK<~J@<9KH5*_%Z12UarlNbEb|<*@F<w6Q3UtX=mA3@&54oThQH9_E*- zIk~^)4U#&g=;alykwP@6KiGD{@oMW$PQKXggHK8I56-0h(e_@~09Ml2$07q*)TxzG zP=*b4D_HP5ZFg3!mP`8oMpdD6d)TRJt?A8ictTH2;0MlC@K1b5=S7sp<Zz8zF-~id z>9bZ-X=Nw-;WDl8T8SPd!-6Rp*tQj>Xt1y@Y5GxYRI-FnrpK(`CUXTPO0f5){0V10 zIhoneB~I8QI+L?gP`k2LYMEJkN{6z@i@LzWYAk}<^5_8DR4(H+)?7WSqAaN+%ll<% zMKgFs)_i=$5yU8`nZs;r<`kt`lIBdlByXOAh^Mj#4yg6Z706Nvpj@w-27n9J`7CfP z@;=!sRPS3_GzM83{SzOy_Tp@x2FIhMzwLd$Y^1HN(kP|ZeI{+CY%jgjZ)V2M5oJMg z1;nhT+4F4sBPGo*MMr74LQNUu(pd{Bv3(2fDdAtZ3I^x{^rpYPoFyWzl=7@Z=O^+Z z;UZGn4qb$#O_UoTpVq0%Lv<~o6h0Vv8k8DE-$f=%cR?=Xi-?J2wOqpu>q5>WHy-oL z5VY(L5#HXoZ*|i|zaC~rt&-!=2NkrD&*>bHqJm4S2F3xr&$<yja$;kZ)McGfXB<Gm z0~*@El!Vu?I#4{v?v7jHSSf4el@VaKwQbuydUJZu^`{S`(j!5X0s{SkP*(WWhgD{P zk<YT5SX1{%hn=<^<eZ0sPVt#XL~HJEM%D@g#LtuYiw^X~mR5?J0HQIg9BO*G)l1vk zd58Ifgt*WfPGEH*a*Z9g4PfZiLG|^s+zV3qlMI<eQ&JtjPwe^$vIR;jrGAHKumGZi zVnZH3ka3DiFDI$!ZHD3<sEOH(eny;FB%;+iP5=fbJ5Wa$ClYI+<STDkCQ3zjMe=+b z{}Pi=Rg|p(jS1jqq!9&>8#&`K2f^^-0lfo21vPhSLD^^xU{)h#sWWXcZ05RoHQ)>Z zo->7BN>5rrqqj<+F@dZH$%MbIC9v<<`9HBCtm>UoMe{#Yr3+UouhOL9uHy`nN2CzI znXYBjssiganX&d}sy~W+X29W;zp7QDn8}}1{knQNWhQ{vTG1{;2hjoU(7r>Fjj3{H zastvjE>rS^75Sd3O4*JQ1O6_Q*7C7AgXIuF20XAuLTD)xLcuu<lv*k|j^&-pjevI` z*Aw(Q`^f#1DLGN7&GZK(P;sWLxC<@KpOmO+cS_exK+V`EIaal6cIR4XwR|voH7mJa ziUA~*nOmFMyY%I>y58RLNoxI13=?l-Jnb<YbYqB(j(^UF=Z7tAPU-P4Ki4n2mD|x3 zIN>RQn-}~GruMlqyPt&na5K4wB}Ij?t5`l9q9<o#70V}CymJDhl(VP6Q!WodbWHXh zpIaoM1c2(GO`<vSc||(H%3{A}0o{e4lMbaW;6<puYXal6jQ3i3y-ewcq^IR&4Pd*v ze?lVyj7!=VrEFwf2Ar3|k*dE(6}|cCW;K5__-(3j`6obpM^^3mE*Mpx5vI=sRxJub z=j<#hmy^EFUXjUeSJnCcibBZAZV?k)9NEQZ;EyeA3g@r*X*^q0%~<luf^9?YjG=BM z)e2egv84Db?wD96bz;jFLk`8hvF%J=!RU*4inQ7zJ{JUn`UbWhE27&c?&z|Q2X<r) zpFiEjeR}P*1<JqkySqa_bYTUE=Ev^H3VtK7Hr>dBl{^)4g)|S+#Qi22bWoubaP7W+ z3J5Jo7i*G+q^(2$JAB>hp>-KFv=!Vb#p|*AWzGn8Cwu6C1TGXL9tg#6^DU)ps-X;l z`3x4ZuWDp%`PX_0jhRZHj0r9;lswh`p!Se_ppl=cp9jdft#F|?6^Fd!J46-agUcC5 ztS67q9+3p{LH6<`t59eQy9l@yf>Ty1BZMrj9A~N~E>>PC8P<s#+GOM8LPxd}4;~PR zFei#!ub9z3{cdxIX1Un?*GZ3_IJ^m<HExP|Vn*=gR*N2@(0`YjAmu2;kp~I+;4&q4 z8!rbR70C0t4=Z**9}Y)>`}a^YI*T9~WG2$LbylGj(6<2a#)=l92l-*RNlwgfXnELo zX<>jw!+44@lN2Jo=V(8m3z?+Bqa5BSYF@W#EaS9>*a4Go&^gWjmwPTmk{!ASkl*7V zgH0q>XAcR9u~AzNNvVg+{Ws>A{1|@*URK!KH8+02&NdE9zev7CQiMi);@Wjq)5lsy z$=1PeF93G6SX;@>W?he`%+dUPfnmK9$N57rO5_FI&oK(?q%LWjGwUq%nJ#&lD++7( zGI?sLPxH4dH&XG}vE;JaU_a?sV&R`0`^&%9etfK;1=tCxq^LJeB-l~w&)b!?<mEli z{_NLR%~cL?JS2YrMVmc>Zx1>e+{yi@OXQJY<>+kVqv}6opbBgl(Wq%wo+|}&Yw8{_ zl)V#?4zTi(8@yoCy@ijbbC5INy55~mMRJoZLn>@DE6e@yg6+WKQrai4V%%w!`khYo z06aFSmj0rqRZoFjP*$a6M~Yc^<M|^hdcQ=Fb6UN_a=wr5^vUkG)rq~24SLLZO|fdi zrxu-70xa}iefr|`<^=%^vfSb!Ax?GX7P|)-sYEjSU|A{Q9?(3aC7D<po;||D1A|I` zT-QujK!%mV+WjOld-K@sK>MXNCnZ>C6Me$OMi6b=Z!+3<_oN!sdyHi?=1C0MW9okh z43lm<SEwslr{wt7Pb9b1z4dl(WSeWH$WFS?FgTrFcrZ#r5JZ4Bn>lMu$iu5(qgf&} z{9aBdMv8#_MFDIGi^e*nvyg>e@z8jdNF!<=0ea9EdU5=qNb{FCSf0ho2;)$9G90 zDa)c%OH`(|48_qH(W*rqb0Ke$uo>4zc2Ac5&WZyDfzlZyu9RkG*uv6l;4!34+0tIa z%29<ovXWIwvKEtYqWz)PZLjwAN#80poXD~24JjtznZOzs=ly9<@ZjrX=sSSO{t$t8 zZ~0cKd3@g~yRX9k3AHIbmYdH(?|Kmk%J6eFW3(uBor4Z}3fo-m_c2x!NLyzkjsV77 z>ClpB<55vP<6|w&feQcSz)@dfOJ%oZMS6$Nh!WsPODG6{mGennR#H;B#haE93j302 z9Fj!GHanBkmQkT)%Bk8BX<I%PObB^zbG2Tdj>mepwAk&NVP$1|va(kGHbFa?PXB%Y z^Cf7}6SLLqdzSF-1<s8*$9AdX^o*eE$Ni@9Ey_A;J#Zlu+c=k~EgOSD8?dpPb--;t zMY|77$aRG4XrmECE#MPzD}ybjnp1!<frvKx=|wrWtZ6dWuN~6HY5HgCXD$(1j~zD0 zDi!<dBdRl@=&Y6V2C1MnqD>-?1Ei(Au|l!rdE_D@e*7Jo*^?sA!s$I8i#SEJj=GD) z?OabpGN}(I4u_iU?1*}fpIExN6i6NO56Y{ZVU>Ziou&XHo~CCHPW%lHZDV>LWW`=x z@8s5AWB;nYu?1eXliSPzaf49v&wH=+t>IvDCHpR&^qx_<!OTc!Gj2<eeamePZ=r3G z^PCY}@y*OV@6yE_+2z^}kY7EX7%fWwW>asF6ZL�!GVd{xO-%^K=h&-HjY<d^ykI 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�%Wr^9@G+KLO5e*>u(+-GbEev`7!8RV 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Ό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%0AgNLk{1)QFQp}}ePpKP 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�+n6KgPZ1U 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%0D6Vif6pehv%9qcDu7*lzzh-~53r_eGoOP*M#&K7 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®M{cXW%Mcot*9w_>mh8IL2#BJkv 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%0A{hDkx`7)CY1&T#}1)s$pA4{za+ImP`Xmu-S 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�l<(x7MBiZcWP#%jTlx5XLHWBsX*0SK`XpP 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μ{ACJUjvb8ewr%u7=Ttyjo$) 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 HZT%~ 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%0A5}LDh#b4{|7SMo4He8 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�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 literal 0 HcmV?d00001 diff --git a/lua/luaconf.h b/lua/luaconf.h index 18be9a9e..4b9dc02b 100644 --- a/lua/luaconf.h +++ b/lua/luaconf.h @@ -545,7 +545,9 @@ ** without modifying the main part of the file. */ - +#if ANDROID +#define getlocaledecpoint() '.' +#endif #endif From b61c45bab51ea8af6fbf9a0e0624340390febcbe Mon Sep 17 00:00:00 2001 From: hanxi <hanxi.info@gmail.com> Date: Fri, 16 May 2014 19:43:03 +0800 Subject: [PATCH 3/4] clean code --- android/jni/main.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/android/jni/main.c b/android/jni/main.c index 919408e9..8b5a09d2 100644 --- a/android/jni/main.c +++ b/android/jni/main.c @@ -4,8 +4,6 @@ #include <jni.h> #include <EGL/egl.h> -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> #include <android_native_app_glue.h> #include <errno.h> @@ -200,7 +198,6 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) { case APP_CMD_GAINED_FOCUS: // When our app gains focus, we start monitoring the accelerometer. engine->animating = 1; - ejoy2d_win_resume(); break; case APP_CMD_LOST_FOCUS: // Also stop animating. From 5f4b14f0830d06ff0896168bd25b75906e4e6dca Mon Sep 17 00:00:00 2001 From: hanxi <hanxi.info@gmail.com> Date: Mon, 19 May 2014 13:05:03 +0800 Subject: [PATCH 4/4] add submodules freetype --- .gitmodules | 3 + android/jni/ndk_modules/freetype | 1 + android/jni/ndk_modules/freetype/Android.mk | 49 - android/jni/ndk_modules/freetype/CleanSpec.mk | 49 - .../jni/ndk_modules/freetype/builds/ft2unix.h | 61 - .../include/freetype/config/ftconfig.h | 528 -- .../include/freetype/config/ftheader.h | 780 -- .../include/freetype/config/ftmodule.h | 24 - .../include/freetype/config/ftoption.h | 733 -- .../include/freetype/config/ftstdlib.h | 173 - .../freetype/include/freetype/freetype.h | 3919 -------- .../freetype/include/freetype/ftadvanc.h | 179 - .../freetype/include/freetype/ftbbox.h | 94 - .../freetype/include/freetype/ftbdf.h | 209 - .../freetype/include/freetype/ftbitmap.h | 227 - .../freetype/include/freetype/ftcache.h | 1125 --- .../freetype/include/freetype/ftchapters.h | 103 - .../freetype/include/freetype/ftcid.h | 166 - .../freetype/include/freetype/fterrdef.h | 244 - .../freetype/include/freetype/fterrors.h | 206 - .../freetype/include/freetype/ftgasp.h | 120 - .../freetype/include/freetype/ftglyph.h | 613 -- .../freetype/include/freetype/ftgxval.h | 358 - .../freetype/include/freetype/ftgzip.h | 102 - .../freetype/include/freetype/ftimage.h | 1301 --- .../freetype/include/freetype/ftincrem.h | 353 - .../freetype/include/freetype/ftlcdfil.h | 213 - .../freetype/include/freetype/ftlist.h | 277 - .../freetype/include/freetype/ftlzw.h | 99 - .../freetype/include/freetype/ftmac.h | 274 - .../freetype/include/freetype/ftmm.h | 378 - .../freetype/include/freetype/ftmodapi.h | 483 - .../freetype/include/freetype/ftmoderr.h | 155 - .../freetype/include/freetype/ftotval.h | 203 - .../freetype/include/freetype/ftoutln.h | 537 -- .../freetype/include/freetype/ftpfr.h | 172 - .../freetype/include/freetype/ftrender.h | 230 - .../freetype/include/freetype/ftsizes.h | 159 - .../freetype/include/freetype/ftsnames.h | 200 - .../freetype/include/freetype/ftstroke.h | 716 -- .../freetype/include/freetype/ftsynth.h | 80 - .../freetype/include/freetype/ftsystem.h | 347 - .../freetype/include/freetype/fttrigon.h | 350 - .../freetype/include/freetype/fttypes.h | 588 -- .../freetype/include/freetype/ftwinfnt.h | 274 - .../freetype/include/freetype/ftxf86.h | 83 - .../include/freetype/internal/autohint.h | 231 - .../include/freetype/internal/ftcalc.h | 179 - .../include/freetype/internal/ftdebug.h | 250 - .../include/freetype/internal/ftdriver.h | 422 - .../include/freetype/internal/ftgloadr.h | 168 - .../include/freetype/internal/ftmemory.h | 380 - .../include/freetype/internal/ftobjs.h | 1428 --- .../include/freetype/internal/ftpic.h | 67 - .../include/freetype/internal/ftrfork.h | 196 - .../include/freetype/internal/ftserv.h | 620 -- .../include/freetype/internal/ftstream.h | 539 -- .../include/freetype/internal/fttrace.h | 139 - .../include/freetype/internal/ftvalid.h | 150 - .../include/freetype/internal/internal.h | 51 - .../include/freetype/internal/pcftypes.h | 56 - .../include/freetype/internal/psaux.h | 873 -- .../include/freetype/internal/pshints.h | 712 -- .../freetype/internal/services/svbdf.h | 77 - .../freetype/internal/services/svcid.h | 83 - .../freetype/internal/services/svgldict.h | 82 - .../freetype/internal/services/svgxval.h | 72 - .../freetype/internal/services/svkern.h | 51 - .../include/freetype/internal/services/svmm.h | 104 - .../freetype/internal/services/svotval.h | 55 - .../freetype/internal/services/svpfr.h | 66 - .../freetype/internal/services/svpostnm.h | 79 - .../freetype/internal/services/svpscmap.h | 164 - .../freetype/internal/services/svpsinfo.h | 92 - .../freetype/internal/services/svsfnt.h | 102 - .../freetype/internal/services/svttcmap.h | 106 - .../freetype/internal/services/svtteng.h | 53 - .../freetype/internal/services/svttglyf.h | 67 - .../freetype/internal/services/svwinfnt.h | 50 - .../freetype/internal/services/svxf86nm.h | 55 - .../freetype/include/freetype/internal/sfnt.h | 897 -- .../include/freetype/internal/t1types.h | 270 - .../include/freetype/internal/tttypes.h | 1543 ---- .../freetype/include/freetype/t1tables.h | 504 - .../freetype/include/freetype/ttnameid.h | 1247 --- .../freetype/include/freetype/tttables.h | 759 -- .../freetype/include/freetype/tttags.h | 107 - .../freetype/include/freetype/ttunpat.h | 59 - .../ndk_modules/freetype/include/ft2build.h | 39 - .../freetype/src/autofit/afangles.c | 292 - .../freetype/src/autofit/afangles.h | 7 - .../ndk_modules/freetype/src/autofit/afcjk.c | 1512 --- .../ndk_modules/freetype/src/autofit/afcjk.h | 57 - .../freetype/src/autofit/afdummy.c | 60 - .../freetype/src/autofit/afdummy.h | 42 - .../freetype/src/autofit/aferrors.h | 40 - .../freetype/src/autofit/afglobal.c | 323 - .../freetype/src/autofit/afglobal.h | 71 - .../freetype/src/autofit/afhints.c | 1142 --- .../freetype/src/autofit/afhints.h | 332 - .../freetype/src/autofit/afindic.c | 130 - .../freetype/src/autofit/afindic.h | 40 - .../freetype/src/autofit/aflatin.c | 2227 ----- .../freetype/src/autofit/aflatin.h | 212 - .../freetype/src/autofit/aflatin2.c | 2345 ----- .../freetype/src/autofit/aflatin2.h | 39 - .../freetype/src/autofit/afloader.c | 539 -- .../freetype/src/autofit/afloader.h | 73 - .../freetype/src/autofit/afmodule.c | 94 - .../freetype/src/autofit/afmodule.h | 37 - .../ndk_modules/freetype/src/autofit/afpic.c | 94 - .../ndk_modules/freetype/src/autofit/afpic.h | 64 - .../freetype/src/autofit/aftypes.h | 403 - .../ndk_modules/freetype/src/autofit/afwarp.c | 338 - .../ndk_modules/freetype/src/autofit/afwarp.h | 64 - .../freetype/src/autofit/autofit.c | 41 - .../ndk_modules/freetype/src/base/basepic.c | 83 - .../ndk_modules/freetype/src/base/basepic.h | 62 - .../ndk_modules/freetype/src/base/ftadvanc.c | 163 - .../jni/ndk_modules/freetype/src/base/ftapi.c | 121 - .../ndk_modules/freetype/src/base/ftbase.c | 41 - .../ndk_modules/freetype/src/base/ftbase.h | 57 - .../ndk_modules/freetype/src/base/ftbbox.c | 662 -- .../ndk_modules/freetype/src/base/ftbitmap.c | 663 -- .../ndk_modules/freetype/src/base/ftcalc.c | 957 -- .../ndk_modules/freetype/src/base/ftdbgmem.c | 997 -- .../ndk_modules/freetype/src/base/ftdebug.c | 246 - .../ndk_modules/freetype/src/base/ftgasp.c | 61 - .../ndk_modules/freetype/src/base/ftgloadr.c | 401 - .../ndk_modules/freetype/src/base/ftglyph.c | 627 -- .../ndk_modules/freetype/src/base/ftinit.c | 253 - .../ndk_modules/freetype/src/base/ftlcdfil.c | 376 - .../jni/ndk_modules/freetype/src/base/ftmm.c | 202 - .../ndk_modules/freetype/src/base/ftobjs.c | 4647 ---------- .../ndk_modules/freetype/src/base/ftoutln.c | 1129 --- .../ndk_modules/freetype/src/base/ftpatent.c | 286 - .../jni/ndk_modules/freetype/src/base/ftpic.c | 54 - .../ndk_modules/freetype/src/base/ftrfork.c | 821 -- .../ndk_modules/freetype/src/base/ftsnames.c | 94 - .../ndk_modules/freetype/src/base/ftstream.c | 864 -- .../ndk_modules/freetype/src/base/ftstroke.c | 2039 ----- .../ndk_modules/freetype/src/base/ftsynth.c | 160 - .../ndk_modules/freetype/src/base/ftsystem.c | 307 - .../ndk_modules/freetype/src/base/fttrigon.c | 546 -- .../ndk_modules/freetype/src/base/ftutil.c | 501 - .../ndk_modules/freetype/src/base/ftwinfnt.c | 51 - .../ndk_modules/freetype/src/base/ftxf86.c | 40 - .../jni/ndk_modules/freetype/src/cff/cff.c | 30 - .../ndk_modules/freetype/src/cff/cffcmap.c | 208 - .../ndk_modules/freetype/src/cff/cffcmap.h | 67 - .../ndk_modules/freetype/src/cff/cffdrivr.c | 671 -- .../ndk_modules/freetype/src/cff/cffdrivr.h | 38 - .../ndk_modules/freetype/src/cff/cfferrs.h | 41 - .../ndk_modules/freetype/src/cff/cffgload.c | 2972 ------ .../ndk_modules/freetype/src/cff/cffgload.h | 201 - .../ndk_modules/freetype/src/cff/cffload.c | 1671 ---- .../ndk_modules/freetype/src/cff/cffload.h | 83 - .../ndk_modules/freetype/src/cff/cffobjs.c | 1008 -- .../ndk_modules/freetype/src/cff/cffobjs.h | 181 - .../ndk_modules/freetype/src/cff/cffparse.c | 924 -- .../ndk_modules/freetype/src/cff/cffparse.h | 102 - .../jni/ndk_modules/freetype/src/cff/cffpic.c | 101 - .../jni/ndk_modules/freetype/src/cff/cffpic.h | 80 - .../ndk_modules/freetype/src/cff/cfftoken.h | 97 - .../ndk_modules/freetype/src/cff/cfftypes.h | 281 - .../ndk_modules/freetype/src/psaux/afmparse.c | 964 -- .../ndk_modules/freetype/src/psaux/afmparse.h | 88 - .../ndk_modules/freetype/src/psaux/psaux.c | 34 - .../ndk_modules/freetype/src/psaux/psauxerr.h | 41 - .../ndk_modules/freetype/src/psaux/psauxmod.c | 139 - .../ndk_modules/freetype/src/psaux/psauxmod.h | 42 - .../ndk_modules/freetype/src/psaux/psconv.c | 472 - .../ndk_modules/freetype/src/psaux/psconv.h | 71 - .../ndk_modules/freetype/src/psaux/psobjs.c | 1711 ---- .../ndk_modules/freetype/src/psaux/psobjs.h | 212 - .../ndk_modules/freetype/src/psaux/t1cmap.c | 341 - .../ndk_modules/freetype/src/psaux/t1cmap.h | 105 - .../ndk_modules/freetype/src/psaux/t1decode.c | 1598 ---- .../ndk_modules/freetype/src/psaux/t1decode.h | 64 - .../freetype/src/pshinter/pshalgo.c | 2308 ----- .../freetype/src/pshinter/pshalgo.h | 255 - .../freetype/src/pshinter/pshglob.c | 750 -- .../freetype/src/pshinter/pshglob.h | 196 - .../freetype/src/pshinter/pshinter.c | 29 - .../freetype/src/pshinter/pshmod.c | 118 - .../freetype/src/pshinter/pshmod.h | 39 - .../freetype/src/pshinter/pshnterr.h | 40 - .../freetype/src/pshinter/pshpic.c | 69 - .../freetype/src/pshinter/pshpic.h | 53 - .../freetype/src/pshinter/pshrec.c | 1224 --- .../freetype/src/pshinter/pshrec.h | 176 - .../freetype/src/psnames/psmodule.c | 597 -- .../freetype/src/psnames/psmodule.h | 38 - .../freetype/src/psnames/psnamerr.h | 41 - .../freetype/src/psnames/psnames.c | 26 - .../ndk_modules/freetype/src/psnames/pspic.c | 79 - .../ndk_modules/freetype/src/psnames/pspic.h | 54 - .../freetype/src/psnames/pstables.h | 4095 --------- .../ndk_modules/freetype/src/raster/ftmisc.h | 121 - .../freetype/src/raster/ftraster.c | 3565 -------- .../freetype/src/raster/ftraster.h | 46 - .../ndk_modules/freetype/src/raster/ftrend1.c | 291 - .../ndk_modules/freetype/src/raster/ftrend1.h | 44 - .../ndk_modules/freetype/src/raster/raster.c | 27 - .../freetype/src/raster/rasterrs.h | 41 - .../ndk_modules/freetype/src/raster/rastpic.c | 90 - .../ndk_modules/freetype/src/raster/rastpic.h | 50 - .../ndk_modules/freetype/src/sfnt/sfdriver.c | 651 -- .../ndk_modules/freetype/src/sfnt/sfdriver.h | 38 - .../ndk_modules/freetype/src/sfnt/sferrors.h | 41 - .../jni/ndk_modules/freetype/src/sfnt/sfnt.c | 42 - .../ndk_modules/freetype/src/sfnt/sfntpic.c | 102 - .../ndk_modules/freetype/src/sfnt/sfntpic.h | 88 - .../ndk_modules/freetype/src/sfnt/sfobjs.c | 1149 --- .../ndk_modules/freetype/src/sfnt/sfobjs.h | 54 - .../jni/ndk_modules/freetype/src/sfnt/ttbdf.c | 250 - .../jni/ndk_modules/freetype/src/sfnt/ttbdf.h | 46 - .../ndk_modules/freetype/src/sfnt/ttcmap.c | 3512 ------- .../ndk_modules/freetype/src/sfnt/ttcmap.h | 125 - .../ndk_modules/freetype/src/sfnt/ttcmapc.h | 55 - .../ndk_modules/freetype/src/sfnt/ttkern.c | 306 - .../ndk_modules/freetype/src/sfnt/ttkern.h | 52 - .../ndk_modules/freetype/src/sfnt/ttload.c | 1262 --- .../ndk_modules/freetype/src/sfnt/ttload.h | 112 - .../jni/ndk_modules/freetype/src/sfnt/ttmtx.c | 468 - .../jni/ndk_modules/freetype/src/sfnt/ttmtx.h | 55 - .../ndk_modules/freetype/src/sfnt/ttpost.c | 521 -- .../ndk_modules/freetype/src/sfnt/ttpost.h | 46 - .../ndk_modules/freetype/src/sfnt/ttsbit.c | 1508 --- .../ndk_modules/freetype/src/sfnt/ttsbit.h | 79 - .../ndk_modules/freetype/src/sfnt/ttsbit0.c | 1011 -- .../ndk_modules/freetype/src/smooth/ftgrays.c | 2091 ----- .../ndk_modules/freetype/src/smooth/ftgrays.h | 58 - .../freetype/src/smooth/ftsmerrs.h | 41 - .../freetype/src/smooth/ftsmooth.c | 481 - .../freetype/src/smooth/ftsmooth.h | 49 - .../ndk_modules/freetype/src/smooth/ftspic.c | 98 - .../ndk_modules/freetype/src/smooth/ftspic.h | 50 - .../ndk_modules/freetype/src/smooth/smooth.c | 27 - .../freetype/src/truetype/truetype.c | 37 - .../freetype/src/truetype/ttdriver.c | 487 - .../freetype/src/truetype/ttdriver.h | 38 - .../freetype/src/truetype/tterrors.h | 40 - .../freetype/src/truetype/ttgload.c | 2144 ----- .../freetype/src/truetype/ttgload.h | 63 - .../freetype/src/truetype/ttgxvar.c | 1548 ---- .../freetype/src/truetype/ttgxvar.h | 182 - .../freetype/src/truetype/ttinterp.c | 8138 ----------------- .../freetype/src/truetype/ttinterp.h | 319 - .../freetype/src/truetype/ttobjs.c | 951 -- .../freetype/src/truetype/ttobjs.h | 431 - .../ndk_modules/freetype/src/truetype/ttpic.c | 81 - .../ndk_modules/freetype/src/truetype/ttpic.h | 59 - .../freetype/src/truetype/ttpload.c | 572 -- .../freetype/src/truetype/ttpload.h | 75 - 255 files changed, 4 insertions(+), 117640 deletions(-) create mode 100644 .gitmodules create mode 160000 android/jni/ndk_modules/freetype delete mode 100644 android/jni/ndk_modules/freetype/Android.mk delete mode 100644 android/jni/ndk_modules/freetype/CleanSpec.mk delete mode 100644 android/jni/ndk_modules/freetype/builds/ft2unix.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/config/ftconfig.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/config/ftheader.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/config/ftmodule.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/config/ftoption.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/config/ftstdlib.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/freetype.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftadvanc.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftbbox.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftbdf.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftbitmap.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftcache.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftchapters.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftcid.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/fterrdef.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/fterrors.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftgasp.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftglyph.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftgxval.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftgzip.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftimage.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftincrem.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftlcdfil.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftlist.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftlzw.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftmac.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftmm.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftmodapi.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftmoderr.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftotval.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftoutln.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftpfr.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftrender.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftsizes.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftsnames.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftstroke.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftsynth.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftsystem.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/fttrigon.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/fttypes.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftwinfnt.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ftxf86.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/autohint.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftcalc.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftdebug.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftdriver.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftgloadr.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftmemory.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftobjs.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftpic.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftrfork.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftserv.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftstream.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/fttrace.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/ftvalid.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/internal.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/pcftypes.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/psaux.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/pshints.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svbdf.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svcid.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svgldict.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svgxval.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svkern.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svmm.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svotval.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svpfr.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svpostnm.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svpscmap.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svpsinfo.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svsfnt.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svttcmap.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svtteng.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svttglyf.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svwinfnt.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/services/svxf86nm.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/sfnt.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/t1types.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/internal/tttypes.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/t1tables.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ttnameid.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/tttables.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/tttags.h delete mode 100644 android/jni/ndk_modules/freetype/include/freetype/ttunpat.h delete mode 100644 android/jni/ndk_modules/freetype/include/ft2build.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afangles.c delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afangles.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afcjk.c delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afcjk.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afdummy.c delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afdummy.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/aferrors.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afglobal.c delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afglobal.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afhints.c delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afhints.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afindic.c delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afindic.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/aflatin.c delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/aflatin.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/aflatin2.c delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/aflatin2.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afloader.c delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afloader.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afmodule.c delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afmodule.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afpic.c delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afpic.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/aftypes.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afwarp.c delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/afwarp.h delete mode 100644 android/jni/ndk_modules/freetype/src/autofit/autofit.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/basepic.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/basepic.h delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftadvanc.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftapi.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftbase.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftbase.h delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftbbox.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftbitmap.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftcalc.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftdbgmem.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftdebug.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftgasp.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftgloadr.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftglyph.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftinit.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftlcdfil.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftmm.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftobjs.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftoutln.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftpatent.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftpic.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftrfork.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftsnames.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftstream.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftstroke.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftsynth.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftsystem.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/fttrigon.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftutil.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftwinfnt.c delete mode 100644 android/jni/ndk_modules/freetype/src/base/ftxf86.c delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cff.c delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffcmap.c delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffcmap.h delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffdrivr.c delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffdrivr.h delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cfferrs.h delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffgload.c delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffgload.h delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffload.c delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffload.h delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffobjs.c delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffobjs.h delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffparse.c delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffparse.h delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffpic.c delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cffpic.h delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cfftoken.h delete mode 100644 android/jni/ndk_modules/freetype/src/cff/cfftypes.h delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/afmparse.c delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/afmparse.h delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/psaux.c delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/psauxerr.h delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/psauxmod.c delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/psauxmod.h delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/psconv.c delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/psconv.h delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/psobjs.c delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/psobjs.h delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/t1cmap.c delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/t1cmap.h delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/t1decode.c delete mode 100644 android/jni/ndk_modules/freetype/src/psaux/t1decode.h delete mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshalgo.c delete mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshalgo.h delete mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshglob.c delete mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshglob.h delete mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshinter.c delete mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshmod.c delete mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshmod.h delete mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshnterr.h delete mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshpic.c delete mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshpic.h delete mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshrec.c delete mode 100644 android/jni/ndk_modules/freetype/src/pshinter/pshrec.h delete mode 100644 android/jni/ndk_modules/freetype/src/psnames/psmodule.c delete mode 100644 android/jni/ndk_modules/freetype/src/psnames/psmodule.h delete mode 100644 android/jni/ndk_modules/freetype/src/psnames/psnamerr.h delete mode 100644 android/jni/ndk_modules/freetype/src/psnames/psnames.c delete mode 100644 android/jni/ndk_modules/freetype/src/psnames/pspic.c delete mode 100644 android/jni/ndk_modules/freetype/src/psnames/pspic.h delete mode 100644 android/jni/ndk_modules/freetype/src/psnames/pstables.h delete mode 100644 android/jni/ndk_modules/freetype/src/raster/ftmisc.h delete mode 100644 android/jni/ndk_modules/freetype/src/raster/ftraster.c delete mode 100644 android/jni/ndk_modules/freetype/src/raster/ftraster.h delete mode 100644 android/jni/ndk_modules/freetype/src/raster/ftrend1.c delete mode 100644 android/jni/ndk_modules/freetype/src/raster/ftrend1.h delete mode 100644 android/jni/ndk_modules/freetype/src/raster/raster.c delete mode 100644 android/jni/ndk_modules/freetype/src/raster/rasterrs.h delete mode 100644 android/jni/ndk_modules/freetype/src/raster/rastpic.c delete mode 100644 android/jni/ndk_modules/freetype/src/raster/rastpic.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfdriver.c delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfdriver.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sferrors.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfnt.c delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfntpic.c delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfntpic.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfobjs.c delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/sfobjs.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttbdf.c delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttbdf.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttcmap.c delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttcmap.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttcmapc.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttkern.c delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttkern.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttload.c delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttload.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttmtx.c delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttmtx.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttpost.c delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttpost.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttsbit.c delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttsbit.h delete mode 100644 android/jni/ndk_modules/freetype/src/sfnt/ttsbit0.c delete mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftgrays.c delete mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftgrays.h delete mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftsmerrs.h delete mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftsmooth.c delete mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftsmooth.h delete mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftspic.c delete mode 100644 android/jni/ndk_modules/freetype/src/smooth/ftspic.h delete mode 100644 android/jni/ndk_modules/freetype/src/smooth/smooth.c delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/truetype.c delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttdriver.c delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttdriver.h delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/tterrors.h delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttgload.c delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttgload.h delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttgxvar.c delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttgxvar.h delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttinterp.c delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttinterp.h delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttobjs.c delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttobjs.h delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttpic.c delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttpic.h delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttpload.c delete mode 100644 android/jni/ndk_modules/freetype/src/truetype/ttpload.h diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..7148b366 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "android/jni/ndk_modules/freetype"] + path = android/jni/ndk_modules/freetype + url = git@github.com:hanxi/libfreetype-android.git diff --git a/android/jni/ndk_modules/freetype b/android/jni/ndk_modules/freetype new file mode 160000 index 00000000..9d58dda6 --- /dev/null +++ b/android/jni/ndk_modules/freetype @@ -0,0 +1 @@ +Subproject commit 9d58dda6885e4aed11b85046a1d2bd4096a6a600 diff --git a/android/jni/ndk_modules/freetype/Android.mk b/android/jni/ndk_modules/freetype/Android.mk deleted file mode 100644 index e9eeb058..00000000 --- a/android/jni/ndk_modules/freetype/Android.mk +++ /dev/null @@ -1,49 +0,0 @@ -# this is now the default FreeType build for Android -# -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE := libfreetype - -# compile in ARM mode, since the glyph loader/renderer is a hotspot -# when loading complex pages in the browser -# -LOCAL_ARM_MODE := arm - -LOCAL_SRC_FILES:= \ - src/base/ftbbox.c \ - src/base/ftbitmap.c \ - src/base/ftglyph.c \ - src/base/ftstroke.c \ - src/base/ftxf86.c \ - src/base/ftbase.c \ - src/base/ftsystem.c \ - src/base/ftinit.c \ - src/base/ftgasp.c \ - src/raster/raster.c \ - src/sfnt/sfnt.c \ - src/smooth/smooth.c \ - src/autofit/autofit.c \ - src/truetype/truetype.c \ - src/cff/cff.c \ - src/psnames/psnames.c \ - src/pshinter/pshinter.c - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/builds \ - $(LOCAL_PATH)/include - -LOCAL_MODULE:= freetype -LOCAL_MODULE_FILENAME:= libfreetype - -LOCAL_EXPORT_C_INCLUDES := \ - $(LOCAL_PATH)/builds \ - $(LOCAL_PATH)/include - -#LOCAL_CFLAGS += -W -Wall -#LOCAL_CFLAGS += -fPIC -DPIC -LOCAL_CFLAGS += "-DDARWIN_NO_CARBON" -LOCAL_CFLAGS += "-DFT2_BUILD_LIBRARY" -#LOCAL_CFLAGS += -O2 - -include $(BUILD_STATIC_LIBRARY) diff --git a/android/jni/ndk_modules/freetype/CleanSpec.mk b/android/jni/ndk_modules/freetype/CleanSpec.mk deleted file mode 100644 index b84e1b65..00000000 --- a/android/jni/ndk_modules/freetype/CleanSpec.mk +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright (C) 2007 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# If you don't need to do a full clean build but would like to touch -# a file or delete some intermediate files, add a clean step to the end -# of the list. These steps will only be run once, if they haven't been -# run before. -# -# E.g.: -# $(call add-clean-step, touch -c external/sqlite/sqlite3.h) -# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates) -# -# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with -# files that are missing or have been moved. -# -# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory. -# Use $(OUT_DIR) to refer to the "out" directory. -# -# If you need to re-do something that's already mentioned, just copy -# the command and add it to the bottom of the list. E.g., if a change -# that you made last week required touching a file and a change you -# made today requires touching the same file, just copy the old -# touch step and add it to the end of the list. -# -# ************************************************ -# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST -# ************************************************ - -# For example: -#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates) -#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates) -#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f) -#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*) - -# ************************************************ -# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST -# ************************************************ diff --git a/android/jni/ndk_modules/freetype/builds/ft2unix.h b/android/jni/ndk_modules/freetype/builds/ft2unix.h deleted file mode 100644 index 6a3b8d90..00000000 --- a/android/jni/ndk_modules/freetype/builds/ft2unix.h +++ /dev/null @@ -1,61 +0,0 @@ -/***************************************************************************/ -/* */ -/* ft2build.h */ -/* */ -/* Build macros of the FreeType 2 library. */ -/* */ -/* Copyright 1996-2001, 2003, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This is a Unix-specific version of <ft2build.h> that should be used */ - /* exclusively *after* installation of the library. */ - /* */ - /* It assumes that `/usr/local/include/freetype2' (or whatever is */ - /* returned by the `freetype-config --cflags' or `pkg-config --cflags' */ - /* command) is in your compilation include path. */ - /* */ - /* We don't need to do anything special in this release. However, for */ - /* a future FreeType 2 release, the following installation changes will */ - /* be performed: */ - /* */ - /* - The contents of `freetype-2.x/include/freetype' will be installed */ - /* to `/usr/local/include/freetype2' instead of */ - /* `/usr/local/include/freetype2/freetype'. */ - /* */ - /* - This file will #include <freetype2/config/ftheader.h>, instead */ - /* of <freetype/config/ftheader.h>. */ - /* */ - /* - The contents of `ftheader.h' will be processed with `sed' to */ - /* replace all `<freetype/xxx>' with `<freetype2/xxx>'. */ - /* */ - /* - Adding `/usr/local/include/freetype2' to your compilation include */ - /* path will not be necessary anymore. */ - /* */ - /* These changes will be transparent to client applications which use */ - /* freetype-config (or pkg-config). No modifications will be necessary */ - /* to compile with the new scheme. */ - /* */ - /*************************************************************************/ - - -#ifndef __FT2_BUILD_UNIX_H__ -#define __FT2_BUILD_UNIX_H__ - - /* `<prefix>/include/freetype2' must be in your current inclusion path */ -#include <freetype/config/ftheader.h> - -#endif /* __FT2_BUILD_UNIX_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/config/ftconfig.h b/android/jni/ndk_modules/freetype/include/freetype/config/ftconfig.h deleted file mode 100644 index cbe30f26..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/config/ftconfig.h +++ /dev/null @@ -1,528 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftconfig.h */ -/* */ -/* ANSI-specific configuration file (specification only). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This header file contains a number of macro definitions that are used */ - /* by the rest of the engine. Most of the macros here are automatically */ - /* determined at compile time, and you should not need to change it to */ - /* port FreeType, except to compile the library with a non-ANSI */ - /* compiler. */ - /* */ - /* Note however that if some specific modifications are needed, we */ - /* advise you to place a modified copy in your build directory. */ - /* */ - /* The build directory is usually `freetype/builds/<system>', and */ - /* contains system-specific files that are always included first when */ - /* building the library. */ - /* */ - /* This ANSI version should stay in `include/freetype/config'. */ - /* */ - /*************************************************************************/ - -#ifndef __FTCONFIG_H__ -#define __FTCONFIG_H__ - -#include <ft2build.h> -#include FT_CONFIG_OPTIONS_H -#include FT_CONFIG_STANDARD_LIBRARY_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ - /* */ - /* These macros can be toggled to suit a specific system. The current */ - /* ones are defaults used to compile FreeType in an ANSI C environment */ - /* (16bit compilers are also supported). Copy this file to your own */ - /* `freetype/builds/<system>' directory, and edit it to port the engine. */ - /* */ - /*************************************************************************/ - - - /* There are systems (like the Texas Instruments 'C54x) where a `char' */ - /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ - /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ - /* is probably unexpected. */ - /* */ - /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ - /* `char' type. */ - -#ifndef FT_CHAR_BIT -#define FT_CHAR_BIT CHAR_BIT -#endif - - - /* The size of an `int' type. */ -#if FT_UINT_MAX == 0xFFFFUL -#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) -#elif FT_UINT_MAX == 0xFFFFFFFFUL -#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) -#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL -#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) -#else -#error "Unsupported size of `int' type!" -#endif - - /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ - /* DM642) is recognized but avoided. */ -#if FT_ULONG_MAX == 0xFFFFFFFFUL -#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) -#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL -#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) -#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL -#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) -#else -#error "Unsupported size of `long' type!" -#endif - - - /* Preferred alignment of data */ -#define FT_ALIGNMENT 8 - - - /* FT_UNUSED is a macro used to indicate that a given parameter is not */ - /* used -- this is only used to get rid of unpleasant compiler warnings */ -#ifndef FT_UNUSED -#define FT_UNUSED( arg ) ( (arg) = (arg) ) -#endif - - - /*************************************************************************/ - /* */ - /* AUTOMATIC CONFIGURATION MACROS */ - /* */ - /* These macros are computed from the ones defined above. Don't touch */ - /* their definition, unless you know precisely what you are doing. No */ - /* porter should need to mess with them. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Mac support */ - /* */ - /* This is the only necessary change, so it is defined here instead */ - /* providing a new configuration file. */ - /* */ -#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ - ( defined( __MWERKS__ ) && defined( macintosh ) ) - /* no Carbon frameworks for 64bit 10.4.x */ -#include "AvailabilityMacros.h" -#if defined( __LP64__ ) && \ - ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) -#define DARWIN_NO_CARBON 1 -#else -#define FT_MACINTOSH 1 -#endif - -#elif defined( __SC__ ) || defined( __MRC__ ) - /* Classic MacOS compilers */ -#include "ConditionalMacros.h" -#if TARGET_OS_MAC -#define FT_MACINTOSH 1 -#endif - -#endif - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* basic_types */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Int16 */ - /* */ - /* <Description> */ - /* A typedef for a 16bit signed integer type. */ - /* */ - typedef signed short FT_Int16; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_UInt16 */ - /* */ - /* <Description> */ - /* A typedef for a 16bit unsigned integer type. */ - /* */ - typedef unsigned short FT_UInt16; - - /* */ - - - /* this #if 0 ... #endif clause is for documentation purposes */ -#if 0 - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Int32 */ - /* */ - /* <Description> */ - /* A typedef for a 32bit signed integer type. The size depends on */ - /* the configuration. */ - /* */ - typedef signed XXX FT_Int32; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_UInt32 */ - /* */ - /* A typedef for a 32bit unsigned integer type. The size depends on */ - /* the configuration. */ - /* */ - typedef unsigned XXX FT_UInt32; - - /* */ - -#endif - -#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT) - - typedef signed int FT_Int32; - typedef unsigned int FT_UInt32; - -#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT) - - typedef signed long FT_Int32; - typedef unsigned long FT_UInt32; - -#else -#error "no 32bit type found -- please check your configuration files" -#endif - - - /* look up an integer type that is at least 32 bits */ -#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT) - - typedef int FT_Fast; - typedef unsigned int FT_UFast; - -#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT) - - typedef long FT_Fast; - typedef unsigned long FT_UFast; - -#endif - - - /* determine whether we have a 64-bit int type for platforms without */ - /* Autoconf */ -#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) - - /* FT_LONG64 must be defined if a 64-bit type is available */ -#define FT_LONG64 -#define FT_INT64 long - -#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 - -#elif defined( __BORLANDC__ ) /* Borland C++ */ - - /* XXXX: We should probably check the value of __BORLANDC__ in order */ - /* to test the compiler version. */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 - -#elif defined( __WATCOMC__ ) /* Watcom C++ */ - - /* Watcom doesn't provide 64-bit data types */ - -#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ - -#define FT_LONG64 -#define FT_INT64 long long int - -#elif defined( __GNUC__ ) - - /* GCC provides the `long long' type */ -#define FT_LONG64 -#define FT_INT64 long long int - -#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ - - - /*************************************************************************/ - /* */ - /* A 64-bit data type will create compilation problems if you compile */ - /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */ - /* is defined. You can however ignore this rule by defining the */ - /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ - /* */ -#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) - -#ifdef __STDC__ - - /* undefine the 64-bit macros in strict ANSI compilation mode */ -#undef FT_LONG64 -#undef FT_INT64 - -#endif /* __STDC__ */ - -#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ - - -#define FT_BEGIN_STMNT do { -#define FT_END_STMNT } while ( 0 ) -#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT - - -#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER - /* Provide assembler fragments for performance-critical functions. */ - /* These must be defined `static __inline__' with GCC. */ - -#if defined( __CC_ARM ) || defined( __ARMCC__ ) /* RVCT */ -#define FT_MULFIX_ASSEMBLER FT_MulFix_arm - - /* documentation is in freetype.h */ - - static __inline FT_Int32 - FT_MulFix_arm( FT_Int32 a, - FT_Int32 b ) - { - register FT_Int32 t, t2; - - - __asm - { - smull t2, t, b, a /* (lo=t2,hi=t) = a*b */ - mov a, t, asr #31 /* a = (hi >> 31) */ - add a, a, #0x8000 /* a += 0x8000 */ - adds t2, t2, a /* t2 += a */ - adc t, t, #0 /* t += carry */ - mov a, t2, lsr #16 /* a = t2 >> 16 */ - orr a, a, t, lsl #16 /* a |= t << 16 */ - } - return a; - } - -#endif /* __CC_ARM || __ARMCC__ */ - - -#ifdef __GNUC__ - -#if defined( __arm__ ) && !defined( __thumb__ ) && \ - !( defined( __CC_ARM ) || defined( __ARMCC__ ) ) -#define FT_MULFIX_ASSEMBLER FT_MulFix_arm - - /* documentation is in freetype.h */ - - static __inline__ FT_Int32 - FT_MulFix_arm( FT_Int32 a, - FT_Int32 b ) - { - register FT_Int32 t, t2; - - - asm __volatile__ ( - "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ - "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ - "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ - "adds %1, %1, %0\n\t" /* %1 += %0 */ - "adc %2, %2, #0\n\t" /* %2 += carry */ - "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ - "orr %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ - : "=r"(a), "=&r"(t2), "=&r"(t) - : "r"(a), "r"(b) ); - return a; - } - -#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */ - -#if defined( __i386__ ) -#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 - - /* documentation is in freetype.h */ - - static __inline__ FT_Int32 - FT_MulFix_i386( FT_Int32 a, - FT_Int32 b ) - { - register FT_Int32 result; - - - __asm__ __volatile__ ( - "imul %%edx\n" - "movl %%edx, %%ecx\n" - "sarl $31, %%ecx\n" - "addl $0x8000, %%ecx\n" - "addl %%ecx, %%eax\n" - "adcl $0, %%edx\n" - "shrl $16, %%eax\n" - "shll $16, %%edx\n" - "addl %%edx, %%eax\n" - : "=a"(result), "=d"(b) - : "a"(a), "d"(b) - : "%ecx", "cc" ); - return result; - } - -#endif /* i386 */ - -#endif /* __GNUC__ */ - -#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ - - -#ifdef FT_CONFIG_OPTION_INLINE_MULFIX -#ifdef FT_MULFIX_ASSEMBLER -#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER -#endif -#endif - - -#ifdef FT_MAKE_OPTION_SINGLE_OBJECT - -#define FT_LOCAL( x ) static x -#define FT_LOCAL_DEF( x ) static x - -#else - -#ifdef __cplusplus -#define FT_LOCAL( x ) extern "C" x -#define FT_LOCAL_DEF( x ) extern "C" x -#else -#define FT_LOCAL( x ) extern x -#define FT_LOCAL_DEF( x ) x -#endif - -#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ - - -#ifndef FT_BASE - -#ifdef __cplusplus -#define FT_BASE( x ) extern "C" x -#else -#define FT_BASE( x ) extern x -#endif - -#endif /* !FT_BASE */ - - -#ifndef FT_BASE_DEF - -#ifdef __cplusplus -#define FT_BASE_DEF( x ) x -#else -#define FT_BASE_DEF( x ) x -#endif - -#endif /* !FT_BASE_DEF */ - - -#ifndef FT_EXPORT - -#ifdef __cplusplus -#define FT_EXPORT( x ) extern "C" x -#else -#define FT_EXPORT( x ) extern x -#endif - -#endif /* !FT_EXPORT */ - - -#ifndef FT_EXPORT_DEF - -#ifdef __cplusplus -#define FT_EXPORT_DEF( x ) extern "C" x -#else -#define FT_EXPORT_DEF( x ) extern x -#endif - -#endif /* !FT_EXPORT_DEF */ - - -#ifndef FT_EXPORT_VAR - -#ifdef __cplusplus -#define FT_EXPORT_VAR( x ) extern "C" x -#else -#define FT_EXPORT_VAR( x ) extern x -#endif - -#endif /* !FT_EXPORT_VAR */ - - /* The following macros are needed to compile the library with a */ - /* C++ compiler and with 16bit compilers. */ - /* */ - - /* This is special. Within C++, you must specify `extern "C"' for */ - /* functions which are used via function pointers, and you also */ - /* must do that for structures which contain function pointers to */ - /* assure C linkage -- it's not possible to have (local) anonymous */ - /* functions which are accessed by (global) function pointers. */ - /* */ - /* */ - /* FT_CALLBACK_DEF is used to _define_ a callback function. */ - /* */ - /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ - /* contains pointers to callback functions. */ - /* */ - /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ - /* that contains pointers to callback functions. */ - /* */ - /* */ - /* Some 16bit compilers have to redefine these macros to insert */ - /* the infamous `_cdecl' or `__fastcall' declarations. */ - /* */ -#ifndef FT_CALLBACK_DEF -#ifdef __cplusplus -#define FT_CALLBACK_DEF( x ) extern "C" x -#else -#define FT_CALLBACK_DEF( x ) static x -#endif -#endif /* FT_CALLBACK_DEF */ - -#ifndef FT_CALLBACK_TABLE -#ifdef __cplusplus -#define FT_CALLBACK_TABLE extern "C" -#define FT_CALLBACK_TABLE_DEF extern "C" -#else -#define FT_CALLBACK_TABLE extern -#define FT_CALLBACK_TABLE_DEF /* nothing */ -#endif -#endif /* FT_CALLBACK_TABLE */ - - -FT_END_HEADER - - -#endif /* __FTCONFIG_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/config/ftheader.h b/android/jni/ndk_modules/freetype/include/freetype/config/ftheader.h deleted file mode 100644 index b63945dc..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/config/ftheader.h +++ /dev/null @@ -1,780 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftheader.h */ -/* */ -/* Build macros of the FreeType 2 library. */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - -#ifndef __FT_HEADER_H__ -#define __FT_HEADER_H__ - - - /*@***********************************************************************/ - /* */ - /* <Macro> */ - /* FT_BEGIN_HEADER */ - /* */ - /* <Description> */ - /* This macro is used in association with @FT_END_HEADER in header */ - /* files to ensure that the declarations within are properly */ - /* encapsulated in an `extern "C" { .. }' block when included from a */ - /* C++ compiler. */ - /* */ -#ifdef __cplusplus -#define FT_BEGIN_HEADER extern "C" { -#else -#define FT_BEGIN_HEADER /* nothing */ -#endif - - - /*@***********************************************************************/ - /* */ - /* <Macro> */ - /* FT_END_HEADER */ - /* */ - /* <Description> */ - /* This macro is used in association with @FT_BEGIN_HEADER in header */ - /* files to ensure that the declarations within are properly */ - /* encapsulated in an `extern "C" { .. }' block when included from a */ - /* C++ compiler. */ - /* */ -#ifdef __cplusplus -#define FT_END_HEADER } -#else -#define FT_END_HEADER /* nothing */ -#endif - - - /*************************************************************************/ - /* */ - /* Aliases for the FreeType 2 public and configuration files. */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* <Section> */ - /* header_file_macros */ - /* */ - /* <Title> */ - /* Header File Macros */ - /* */ - /* <Abstract> */ - /* Macro definitions used to #include specific header files. */ - /* */ - /* <Description> */ - /* The following macros are defined to the name of specific */ - /* FreeType~2 header files. They can be used directly in #include */ - /* statements as in: */ - /* */ - /* { */ - /* #include FT_FREETYPE_H */ - /* #include FT_MULTIPLE_MASTERS_H */ - /* #include FT_GLYPH_H */ - /* } */ - /* */ - /* There are several reasons why we are now using macros to name */ - /* public header files. The first one is that such macros are not */ - /* limited to the infamous 8.3~naming rule required by DOS (and */ - /* `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h'). */ - /* */ - /* The second reason is that it allows for more flexibility in the */ - /* way FreeType~2 is installed on a given system. */ - /* */ - /*************************************************************************/ - - - /* configuration files */ - - /************************************************************************* - * - * @macro: - * FT_CONFIG_CONFIG_H - * - * @description: - * A macro used in #include statements to name the file containing - * FreeType~2 configuration data. - * - */ -#ifndef FT_CONFIG_CONFIG_H -#define FT_CONFIG_CONFIG_H <freetype/config/ftconfig.h> -#endif - - - /************************************************************************* - * - * @macro: - * FT_CONFIG_STANDARD_LIBRARY_H - * - * @description: - * A macro used in #include statements to name the file containing - * FreeType~2 interface to the standard C library functions. - * - */ -#ifndef FT_CONFIG_STANDARD_LIBRARY_H -#define FT_CONFIG_STANDARD_LIBRARY_H <freetype/config/ftstdlib.h> -#endif - - - /************************************************************************* - * - * @macro: - * FT_CONFIG_OPTIONS_H - * - * @description: - * A macro used in #include statements to name the file containing - * FreeType~2 project-specific configuration options. - * - */ -#ifndef FT_CONFIG_OPTIONS_H -#define FT_CONFIG_OPTIONS_H <freetype/config/ftoption.h> -#endif - - - /************************************************************************* - * - * @macro: - * FT_CONFIG_MODULES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * list of FreeType~2 modules that are statically linked to new library - * instances in @FT_Init_FreeType. - * - */ -#ifndef FT_CONFIG_MODULES_H -#define FT_CONFIG_MODULES_H <freetype/config/ftmodule.h> -#endif - - /* */ - - /* public headers */ - - /************************************************************************* - * - * @macro: - * FT_FREETYPE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * base FreeType~2 API. - * - */ -#define FT_FREETYPE_H <freetype/freetype.h> - - - /************************************************************************* - * - * @macro: - * FT_ERRORS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * list of FreeType~2 error codes (and messages). - * - * It is included by @FT_FREETYPE_H. - * - */ -#define FT_ERRORS_H <freetype/fterrors.h> - - - /************************************************************************* - * - * @macro: - * FT_MODULE_ERRORS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * list of FreeType~2 module error offsets (and messages). - * - */ -#define FT_MODULE_ERRORS_H <freetype/ftmoderr.h> - - - /************************************************************************* - * - * @macro: - * FT_SYSTEM_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 interface to low-level operations (i.e., memory management - * and stream i/o). - * - * It is included by @FT_FREETYPE_H. - * - */ -#define FT_SYSTEM_H <freetype/ftsystem.h> - - - /************************************************************************* - * - * @macro: - * FT_IMAGE_H - * - * @description: - * A macro used in #include statements to name the file containing type - * definitions related to glyph images (i.e., bitmaps, outlines, - * scan-converter parameters). - * - * It is included by @FT_FREETYPE_H. - * - */ -#define FT_IMAGE_H <freetype/ftimage.h> - - - /************************************************************************* - * - * @macro: - * FT_TYPES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * basic data types defined by FreeType~2. - * - * It is included by @FT_FREETYPE_H. - * - */ -#define FT_TYPES_H <freetype/fttypes.h> - - - /************************************************************************* - * - * @macro: - * FT_LIST_H - * - * @description: - * A macro used in #include statements to name the file containing the - * list management API of FreeType~2. - * - * (Most applications will never need to include this file.) - * - */ -#define FT_LIST_H <freetype/ftlist.h> - - - /************************************************************************* - * - * @macro: - * FT_OUTLINE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * scalable outline management API of FreeType~2. - * - */ -#define FT_OUTLINE_H <freetype/ftoutln.h> - - - /************************************************************************* - * - * @macro: - * FT_SIZES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * API which manages multiple @FT_Size objects per face. - * - */ -#define FT_SIZES_H <freetype/ftsizes.h> - - - /************************************************************************* - * - * @macro: - * FT_MODULE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * module management API of FreeType~2. - * - */ -#define FT_MODULE_H <freetype/ftmodapi.h> - - - /************************************************************************* - * - * @macro: - * FT_RENDER_H - * - * @description: - * A macro used in #include statements to name the file containing the - * renderer module management API of FreeType~2. - * - */ -#define FT_RENDER_H <freetype/ftrender.h> - - - /************************************************************************* - * - * @macro: - * FT_TYPE1_TABLES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * types and API specific to the Type~1 format. - * - */ -#define FT_TYPE1_TABLES_H <freetype/t1tables.h> - - - /************************************************************************* - * - * @macro: - * FT_TRUETYPE_IDS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * enumeration values which identify name strings, languages, encodings, - * etc. This file really contains a _large_ set of constant macro - * definitions, taken from the TrueType and OpenType specifications. - * - */ -#define FT_TRUETYPE_IDS_H <freetype/ttnameid.h> - - - /************************************************************************* - * - * @macro: - * FT_TRUETYPE_TABLES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * types and API specific to the TrueType (as well as OpenType) format. - * - */ -#define FT_TRUETYPE_TABLES_H <freetype/tttables.h> - - - /************************************************************************* - * - * @macro: - * FT_TRUETYPE_TAGS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of TrueType four-byte `tags' which identify blocks in - * SFNT-based font formats (i.e., TrueType and OpenType). - * - */ -#define FT_TRUETYPE_TAGS_H <freetype/tttags.h> - - - /************************************************************************* - * - * @macro: - * FT_BDF_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of an API which accesses BDF-specific strings from a - * face. - * - */ -#define FT_BDF_H <freetype/ftbdf.h> - - - /************************************************************************* - * - * @macro: - * FT_CID_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of an API which access CID font information from a - * face. - * - */ -#define FT_CID_H <freetype/ftcid.h> - - - /************************************************************************* - * - * @macro: - * FT_GZIP_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of an API which supports gzip-compressed files. - * - */ -#define FT_GZIP_H <freetype/ftgzip.h> - - - /************************************************************************* - * - * @macro: - * FT_LZW_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of an API which supports LZW-compressed files. - * - */ -#define FT_LZW_H <freetype/ftlzw.h> - - - /************************************************************************* - * - * @macro: - * FT_WINFONTS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * definitions of an API which supports Windows FNT files. - * - */ -#define FT_WINFONTS_H <freetype/ftwinfnt.h> - - - /************************************************************************* - * - * @macro: - * FT_GLYPH_H - * - * @description: - * A macro used in #include statements to name the file containing the - * API of the optional glyph management component. - * - */ -#define FT_GLYPH_H <freetype/ftglyph.h> - - - /************************************************************************* - * - * @macro: - * FT_BITMAP_H - * - * @description: - * A macro used in #include statements to name the file containing the - * API of the optional bitmap conversion component. - * - */ -#define FT_BITMAP_H <freetype/ftbitmap.h> - - - /************************************************************************* - * - * @macro: - * FT_BBOX_H - * - * @description: - * A macro used in #include statements to name the file containing the - * API of the optional exact bounding box computation routines. - * - */ -#define FT_BBOX_H <freetype/ftbbox.h> - - - /************************************************************************* - * - * @macro: - * FT_CACHE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * API of the optional FreeType~2 cache sub-system. - * - */ -#define FT_CACHE_H <freetype/ftcache.h> - - - /************************************************************************* - * - * @macro: - * FT_CACHE_IMAGE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * `glyph image' API of the FreeType~2 cache sub-system. - * - * It is used to define a cache for @FT_Glyph elements. You can also - * use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to - * store small glyph bitmaps, as it will use less memory. - * - * This macro is deprecated. Simply include @FT_CACHE_H to have all - * glyph image-related cache declarations. - * - */ -#define FT_CACHE_IMAGE_H FT_CACHE_H - - - /************************************************************************* - * - * @macro: - * FT_CACHE_SMALL_BITMAPS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * `small bitmaps' API of the FreeType~2 cache sub-system. - * - * It is used to define a cache for small glyph bitmaps in a relatively - * memory-efficient way. You can also use the API defined in - * @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images, - * including scalable outlines. - * - * This macro is deprecated. Simply include @FT_CACHE_H to have all - * small bitmaps-related cache declarations. - * - */ -#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H - - - /************************************************************************* - * - * @macro: - * FT_CACHE_CHARMAP_H - * - * @description: - * A macro used in #include statements to name the file containing the - * `charmap' API of the FreeType~2 cache sub-system. - * - * This macro is deprecated. Simply include @FT_CACHE_H to have all - * charmap-based cache declarations. - * - */ -#define FT_CACHE_CHARMAP_H FT_CACHE_H - - - /************************************************************************* - * - * @macro: - * FT_MAC_H - * - * @description: - * A macro used in #include statements to name the file containing the - * Macintosh-specific FreeType~2 API. The latter is used to access - * fonts embedded in resource forks. - * - * This header file must be explicitly included by client applications - * compiled on the Mac (note that the base API still works though). - * - */ -#define FT_MAC_H <freetype/ftmac.h> - - - /************************************************************************* - * - * @macro: - * FT_MULTIPLE_MASTERS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * optional multiple-masters management API of FreeType~2. - * - */ -#define FT_MULTIPLE_MASTERS_H <freetype/ftmm.h> - - - /************************************************************************* - * - * @macro: - * FT_SFNT_NAMES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * optional FreeType~2 API which accesses embedded `name' strings in - * SFNT-based font formats (i.e., TrueType and OpenType). - * - */ -#define FT_SFNT_NAMES_H <freetype/ftsnames.h> - - - /************************************************************************* - * - * @macro: - * FT_OPENTYPE_VALIDATE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * optional FreeType~2 API which validates OpenType tables (BASE, GDEF, - * GPOS, GSUB, JSTF). - * - */ -#define FT_OPENTYPE_VALIDATE_H <freetype/ftotval.h> - - - /************************************************************************* - * - * @macro: - * FT_GX_VALIDATE_H - * - * @description: - * A macro used in #include statements to name the file containing the - * optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat, - * mort, morx, bsln, just, kern, opbd, trak, prop). - * - */ -#define FT_GX_VALIDATE_H <freetype/ftgxval.h> - - - /************************************************************************* - * - * @macro: - * FT_PFR_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which accesses PFR-specific data. - * - */ -#define FT_PFR_H <freetype/ftpfr.h> - - - /************************************************************************* - * - * @macro: - * FT_STROKER_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which provides functions to stroke outline paths. - */ -#define FT_STROKER_H <freetype/ftstroke.h> - - - /************************************************************************* - * - * @macro: - * FT_SYNTHESIS_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which performs artificial obliquing and emboldening. - */ -#define FT_SYNTHESIS_H <freetype/ftsynth.h> - - - /************************************************************************* - * - * @macro: - * FT_XFREE86_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which provides functions specific to the XFree86 and - * X.Org X11 servers. - */ -#define FT_XFREE86_H <freetype/ftxf86.h> - - - /************************************************************************* - * - * @macro: - * FT_TRIGONOMETRY_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which performs trigonometric computations (e.g., - * cosines and arc tangents). - */ -#define FT_TRIGONOMETRY_H <freetype/fttrigon.h> - - - /************************************************************************* - * - * @macro: - * FT_LCD_FILTER_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which performs color filtering for subpixel rendering. - */ -#define FT_LCD_FILTER_H <freetype/ftlcdfil.h> - - - /************************************************************************* - * - * @macro: - * FT_UNPATENTED_HINTING_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which performs color filtering for subpixel rendering. - */ -#define FT_UNPATENTED_HINTING_H <freetype/ttunpat.h> - - - /************************************************************************* - * - * @macro: - * FT_INCREMENTAL_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which performs color filtering for subpixel rendering. - */ -#define FT_INCREMENTAL_H <freetype/ftincrem.h> - - - /************************************************************************* - * - * @macro: - * FT_GASP_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which returns entries from the TrueType GASP table. - */ -#define FT_GASP_H <freetype/ftgasp.h> - - - /************************************************************************* - * - * @macro: - * FT_ADVANCES_H - * - * @description: - * A macro used in #include statements to name the file containing the - * FreeType~2 API which returns individual and ranged glyph advances. - */ -#define FT_ADVANCES_H <freetype/ftadvanc.h> - - - /* */ - -#define FT_ERROR_DEFINITIONS_H <freetype/fterrdef.h> - - - /* The internals of the cache sub-system are no longer exposed. We */ - /* default to FT_CACHE_H at the moment just in case, but we know of */ - /* no rogue client that uses them. */ - /* */ -#define FT_CACHE_MANAGER_H <freetype/ftcache.h> -#define FT_CACHE_INTERNAL_MRU_H <freetype/ftcache.h> -#define FT_CACHE_INTERNAL_MANAGER_H <freetype/ftcache.h> -#define FT_CACHE_INTERNAL_CACHE_H <freetype/ftcache.h> -#define FT_CACHE_INTERNAL_GLYPH_H <freetype/ftcache.h> -#define FT_CACHE_INTERNAL_IMAGE_H <freetype/ftcache.h> -#define FT_CACHE_INTERNAL_SBITS_H <freetype/ftcache.h> - - -#define FT_INCREMENTAL_H <freetype/ftincrem.h> - -#define FT_TRUETYPE_UNPATENTED_H <freetype/ttunpat.h> - - - /* - * Include internal headers definitions from <freetype/internal/...> - * only when building the library. - */ -#ifdef FT2_BUILD_LIBRARY -#define FT_INTERNAL_INTERNAL_H <freetype/internal/internal.h> -#include FT_INTERNAL_INTERNAL_H -#endif /* FT2_BUILD_LIBRARY */ - - -#endif /* __FT2_BUILD_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/config/ftmodule.h b/android/jni/ndk_modules/freetype/include/freetype/config/ftmodule.h deleted file mode 100644 index e145790d..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/config/ftmodule.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * This file registers the FreeType modules compiled into the library. - * - * If you use GNU make, this file IS NOT USED! Instead, it is created in - * the objects directory (normally `<topdir>/objs/') based on information - * from `<topdir>/modules.cfg'. - * - * Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile - * FreeType without GNU make. - * - */ - -FT_USE_MODULE( FT_Module_Class, autofit_module_class ) -FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) -FT_USE_MODULE( FT_Module_Class, psnames_module_class ) -FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) -FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) - -/* EOF */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/config/ftoption.h b/android/jni/ndk_modules/freetype/include/freetype/config/ftoption.h deleted file mode 100644 index 22056e11..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/config/ftoption.h +++ /dev/null @@ -1,733 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftoption.h */ -/* */ -/* User-selectable configuration macros (specification only). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTOPTION_H__ -#define __FTOPTION_H__ - - -#include <ft2build.h> - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /* */ - /* USER-SELECTABLE CONFIGURATION MACROS */ - /* */ - /* This file contains the default configuration macro definitions for */ - /* a standard build of the FreeType library. There are three ways to */ - /* use this file to build project-specific versions of the library: */ - /* */ - /* - You can modify this file by hand, but this is not recommended in */ - /* cases where you would like to build several versions of the */ - /* library from a single source directory. */ - /* */ - /* - You can put a copy of this file in your build directory, more */ - /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */ - /* is the name of a directory that is included _before_ the FreeType */ - /* include path during compilation. */ - /* */ - /* The default FreeType Makefiles and Jamfiles use the build */ - /* directory `builds/<system>' by default, but you can easily change */ - /* that for your own projects. */ - /* */ - /* - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it */ - /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */ - /* locate this file during the build. For example, */ - /* */ - /* #define FT_CONFIG_OPTIONS_H <myftoptions.h> */ - /* #include <freetype/config/ftheader.h> */ - /* */ - /* will use `$BUILD/myftoptions.h' instead of this file for macro */ - /* definitions. */ - /* */ - /* Note also that you can similarly pre-define the macro */ - /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */ - /* that are statically linked to the library at compile time. By */ - /* default, this file is <freetype/config/ftmodule.h>. */ - /* */ - /* We highly recommend using the third method whenever possible. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Uncomment the line below if you want to activate sub-pixel rendering */ - /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */ - /* */ - /* Note that this feature is covered by several Microsoft patents */ - /* and should not be activated in any default build of the library. */ - /* */ - /* This macro has no impact on the FreeType API, only on its */ - /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */ - /* FT_Render_Glyph still generates a bitmap that is 3 times wider than */ - /* the original size in case this macro isn't defined; however, each */ - /* triplet of subpixels has R=G=B. */ - /* */ - /* This is done to allow FreeType clients to run unmodified, forcing */ - /* them to display normal gray-level anti-aliased glyphs. */ - /* */ -/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - - - /*************************************************************************/ - /* */ - /* Many compilers provide a non-ANSI 64-bit data type that can be used */ - /* by FreeType to speed up some computations. However, this will create */ - /* some problems when compiling the library in strict ANSI mode. */ - /* */ - /* For this reason, the use of 64-bit integers is normally disabled when */ - /* the __STDC__ macro is defined. You can however disable this by */ - /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */ - /* */ - /* For most compilers, this will only create compilation warnings when */ - /* building the library. */ - /* */ - /* ObNote: The compiler-specific 64-bit integers are detected in the */ - /* file `ftconfig.h' either statically or through the */ - /* `configure' script on supported platforms. */ - /* */ -#undef FT_CONFIG_OPTION_FORCE_INT64 - - - /*************************************************************************/ - /* */ - /* If this macro is defined, do not try to use an assembler version of */ - /* performance-critical functions (e.g. FT_MulFix). You should only do */ - /* that to verify that the assembler function works properly, or to */ - /* execute benchmark tests of the various implementations. */ -/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ - - - /*************************************************************************/ - /* */ - /* If this macro is defined, try to use an inlined assembler version of */ - /* the `FT_MulFix' function, which is a `hotspot' when loading and */ - /* hinting glyphs, and which should be executed as fast as possible. */ - /* */ - /* Note that if your compiler or CPU is not supported, this will default */ - /* to the standard and portable implementation found in `ftcalc.c'. */ - /* */ -#define FT_CONFIG_OPTION_INLINE_MULFIX - - - /*************************************************************************/ - /* */ - /* LZW-compressed file support. */ - /* */ - /* FreeType now handles font files that have been compressed with the */ - /* `compress' program. This is mostly used to parse many of the PCF */ - /* files that come with various X11 distributions. The implementation */ - /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ - /* (see src/lzw/ftgzip.c). */ - /* */ - /* Define this macro if you want to enable this `feature'. */ - /* */ -#define FT_CONFIG_OPTION_USE_LZW - - - /*************************************************************************/ - /* */ - /* Gzip-compressed file support. */ - /* */ - /* FreeType now handles font files that have been compressed with the */ - /* `gzip' program. This is mostly used to parse many of the PCF files */ - /* that come with XFree86. The implementation uses `zlib' to */ - /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ - /* */ - /* Define this macro if you want to enable this `feature'. See also */ - /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ - /* */ -#define FT_CONFIG_OPTION_USE_ZLIB - - - /*************************************************************************/ - /* */ - /* ZLib library selection */ - /* */ - /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ - /* It allows FreeType's `ftgzip' component to link to the system's */ - /* installation of the ZLib library. This is useful on systems like */ - /* Unix or VMS where it generally is already available. */ - /* */ - /* If you let it undefined, the component will use its own copy */ - /* of the zlib sources instead. These have been modified to be */ - /* included directly within the component and *not* export external */ - /* function names. This allows you to link any program with FreeType */ - /* _and_ ZLib without linking conflicts. */ - /* */ - /* Do not #undef this macro here since the build system might define */ - /* it for certain configurations only. */ - /* */ -/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ - - - /*************************************************************************/ - /* */ - /* DLL export compilation */ - /* */ - /* When compiling FreeType as a DLL, some systems/compilers need a */ - /* special keyword in front OR after the return type of function */ - /* declarations. */ - /* */ - /* Two macros are used within the FreeType source code to define */ - /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */ - /* */ - /* FT_EXPORT( return_type ) */ - /* */ - /* is used in a function declaration, as in */ - /* */ - /* FT_EXPORT( FT_Error ) */ - /* FT_Init_FreeType( FT_Library* alibrary ); */ - /* */ - /* */ - /* FT_EXPORT_DEF( return_type ) */ - /* */ - /* is used in a function definition, as in */ - /* */ - /* FT_EXPORT_DEF( FT_Error ) */ - /* FT_Init_FreeType( FT_Library* alibrary ) */ - /* { */ - /* ... some code ... */ - /* return FT_Err_Ok; */ - /* } */ - /* */ - /* You can provide your own implementation of FT_EXPORT and */ - /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */ - /* will be later automatically defined as `extern return_type' to */ - /* allow normal compilation. */ - /* */ - /* Do not #undef these macros here since the build system might define */ - /* them for certain configurations only. */ - /* */ -/* #define FT_EXPORT(x) extern x */ -/* #define FT_EXPORT_DEF(x) x */ - - - /*************************************************************************/ - /* */ - /* Glyph Postscript Names handling */ - /* */ - /* By default, FreeType 2 is compiled with the `psnames' module. This */ - /* module is in charge of converting a glyph name string into a */ - /* Unicode value, or return a Macintosh standard glyph name for the */ - /* use with the TrueType `post' table. */ - /* */ - /* Undefine this macro if you do not want `psnames' compiled in your */ - /* build of FreeType. This has the following effects: */ - /* */ - /* - The TrueType driver will provide its own set of glyph names, */ - /* if you build it to support postscript names in the TrueType */ - /* `post' table. */ - /* */ - /* - The Type 1 driver will not be able to synthesize a Unicode */ - /* charmap out of the glyphs found in the fonts. */ - /* */ - /* You would normally undefine this configuration macro when building */ - /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */ - /* */ -#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES - - - /*************************************************************************/ - /* */ - /* Postscript Names to Unicode Values support */ - /* */ - /* By default, FreeType 2 is built with the `PSNames' module compiled */ - /* in. Among other things, the module is used to convert a glyph name */ - /* into a Unicode value. This is especially useful in order to */ - /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */ - /* through a big table named the `Adobe Glyph List' (AGL). */ - /* */ - /* Undefine this macro if you do not want the Adobe Glyph List */ - /* compiled in your `PSNames' module. The Type 1 driver will not be */ - /* able to synthesize a Unicode charmap out of the glyphs found in the */ - /* fonts. */ - /* */ -#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - - - /*************************************************************************/ - /* */ - /* Support for Mac fonts */ - /* */ - /* Define this macro if you want support for outline fonts in Mac */ - /* format (mac dfont, mac resource, macbinary containing a mac */ - /* resource) on non-Mac platforms. */ - /* */ - /* Note that the `FOND' resource isn't checked. */ - /* */ -#define FT_CONFIG_OPTION_MAC_FONTS - - - /*************************************************************************/ - /* */ - /* Guessing methods to access embedded resource forks */ - /* */ - /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ - /* GNU/Linux). */ - /* */ - /* Resource forks which include fonts data are stored sometimes in */ - /* locations which users or developers don't expected. In some cases, */ - /* resource forks start with some offset from the head of a file. In */ - /* other cases, the actual resource fork is stored in file different */ - /* from what the user specifies. If this option is activated, */ - /* FreeType tries to guess whether such offsets or different file */ - /* names must be used. */ - /* */ - /* Note that normal, direct access of resource forks is controlled via */ - /* the FT_CONFIG_OPTION_MAC_FONTS option. */ - /* */ -#ifdef FT_CONFIG_OPTION_MAC_FONTS -#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK -#endif - - - /*************************************************************************/ - /* */ - /* Allow the use of FT_Incremental_Interface to load typefaces that */ - /* contain no glyph data, but supply it via a callback function. */ - /* This is required by clients supporting document formats which */ - /* supply font data incrementally as the document is parsed, such */ - /* as the Ghostscript interpreter for the PostScript language. */ - /* */ -/* #define FT_CONFIG_OPTION_INCREMENTAL */ - - - /*************************************************************************/ - /* */ - /* The size in bytes of the render pool used by the scan-line converter */ - /* to do all of its work. */ - /* */ - /* This must be greater than 4KByte if you use FreeType to rasterize */ - /* glyphs; otherwise, you may set it to zero to avoid unnecessary */ - /* allocation of the render pool. */ - /* */ -#define FT_RENDER_POOL_SIZE 16384L - - - /*************************************************************************/ - /* */ - /* FT_MAX_MODULES */ - /* */ - /* The maximum number of modules that can be registered in a single */ - /* FreeType library object. 32 is the default. */ - /* */ -#define FT_MAX_MODULES 32 - - - /*************************************************************************/ - /* */ - /* Debug level */ - /* */ - /* FreeType can be compiled in debug or trace mode. In debug mode, */ - /* errors are reported through the `ftdebug' component. In trace */ - /* mode, additional messages are sent to the standard output during */ - /* execution. */ - /* */ - /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */ - /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */ - /* */ - /* Don't define any of these macros to compile in `release' mode! */ - /* */ - /* Do not #undef these macros here since the build system might define */ - /* them for certain configurations only. */ - /* */ -/* #define FT_DEBUG_LEVEL_ERROR */ -/* #define FT_DEBUG_LEVEL_TRACE */ - - - /*************************************************************************/ - /* */ - /* Memory Debugging */ - /* */ - /* FreeType now comes with an integrated memory debugger that is */ - /* capable of detecting simple errors like memory leaks or double */ - /* deletes. To compile it within your build of the library, you */ - /* should define FT_DEBUG_MEMORY here. */ - /* */ - /* Note that the memory debugger is only activated at runtime when */ - /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */ - /* */ - /* Do not #undef this macro here since the build system might define */ - /* it for certain configurations only. */ - /* */ -/* #define FT_DEBUG_MEMORY */ - - - /*************************************************************************/ - /* */ - /* Module errors */ - /* */ - /* If this macro is set (which is _not_ the default), the higher byte */ - /* of an error code gives the module in which the error has occurred, */ - /* while the lower byte is the real error code. */ - /* */ - /* Setting this macro makes sense for debugging purposes only, since */ - /* it would break source compatibility of certain programs that use */ - /* FreeType 2. */ - /* */ - /* More details can be found in the files ftmoderr.h and fterrors.h. */ - /* */ -#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS - - - /*************************************************************************/ - /* */ - /* Position Independent Code */ - /* */ - /* If this macro is set (which is _not_ the default), FreeType2 will */ - /* avoid creating constants that require address fixups. Instead the */ - /* constants will be moved into a struct and additional intialization */ - /* code will be used. */ - /* */ - /* Setting this macro is needed for systems that prohibit address */ - /* fixups, such as BREW. */ - /* */ -/* #define FT_CONFIG_OPTION_PIC */ - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */ - /* embedded bitmaps in all formats using the SFNT module (namely */ - /* TrueType & OpenType). */ - /* */ -#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */ - /* load and enumerate the glyph Postscript names in a TrueType or */ - /* OpenType file. */ - /* */ - /* Note that when you do not compile the `PSNames' module by undefining */ - /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */ - /* contain additional code used to read the PS Names table from a font. */ - /* */ - /* (By default, the module uses `PSNames' to extract glyph names.) */ - /* */ -#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */ - /* access the internal name table in a SFNT-based format like TrueType */ - /* or OpenType. The name table contains various strings used to */ - /* describe the font, like family name, copyright, version, etc. It */ - /* does not contain any glyph name though. */ - /* */ - /* Accessing SFNT names is done through the functions declared in */ - /* `freetype/ftsnames.h'. */ - /* */ -#define TT_CONFIG_OPTION_SFNT_NAMES - - - /*************************************************************************/ - /* */ - /* TrueType CMap support */ - /* */ - /* Here you can fine-tune which TrueType CMap table format shall be */ - /* supported. */ -#define TT_CONFIG_CMAP_FORMAT_0 -#define TT_CONFIG_CMAP_FORMAT_2 -#define TT_CONFIG_CMAP_FORMAT_4 -#define TT_CONFIG_CMAP_FORMAT_6 -#define TT_CONFIG_CMAP_FORMAT_8 -#define TT_CONFIG_CMAP_FORMAT_10 -#define TT_CONFIG_CMAP_FORMAT_12 -#define TT_CONFIG_CMAP_FORMAT_13 -#define TT_CONFIG_CMAP_FORMAT_14 - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ - /* a bytecode interpreter in the TrueType driver. */ - /* */ - /* By undefining this, you will only compile the code necessary to load */ - /* TrueType glyphs without hinting. */ - /* */ - /* Do not #undef this macro here, since the build system might */ - /* define it for certain configurations only. */ - /* */ -/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ - - - /*************************************************************************/ - /* */ - /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */ - /* of the TrueType bytecode interpreter is used that doesn't implement */ - /* any of the patented opcodes and algorithms. The patents related to */ - /* TrueType hinting have expired worldwide since May 2010; this option */ - /* is now deprecated. */ - /* */ - /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* */ - /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, */ - /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ - /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */ - /* */ - /* This macro is only useful for a small number of font files (mostly */ - /* for Asian scripts) that require bytecode interpretation to properly */ - /* load glyphs. For all other fonts, this produces unpleasant results, */ - /* thus the unpatented interpreter is never used to load glyphs from */ - /* TrueType fonts unless one of the following two options is used. */ - /* */ - /* - The unpatented interpreter is explicitly activated by the user */ - /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */ - /* when opening the FT_Face. */ - /* */ - /* - FreeType detects that the FT_Face corresponds to one of the */ - /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */ - /* contains a hard-coded list of font names and other matching */ - /* parameters (see function `tt_face_init' in file */ - /* `src/truetype/ttobjs.c'). */ - /* */ - /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */ - /* */ - /* { */ - /* FT_Parameter parameter; */ - /* FT_Open_Args open_args; */ - /* */ - /* */ - /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */ - /* */ - /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */ - /* open_args.pathname = my_font_pathname; */ - /* open_args.num_params = 1; */ - /* open_args.params = ¶meter; */ - /* */ - /* error = FT_Open_Face( library, &open_args, index, &face ); */ - /* ... */ - /* } */ - /* */ -#define TT_CONFIG_OPTION_UNPATENTED_HINTING - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */ - /* bytecode interpreter with a huge switch statement, rather than a call */ - /* table. This results in smaller and faster code for a number of */ - /* architectures. */ - /* */ - /* Note however that on some compiler/processor combinations, undefining */ - /* this macro will generate faster, though larger, code. */ - /* */ -#define TT_CONFIG_OPTION_INTERPRETER_SWITCH - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */ - /* TrueType glyph loader to use Apple's definition of how to handle */ - /* component offsets in composite glyphs. */ - /* */ - /* Apple and MS disagree on the default behavior of component offsets */ - /* in composites. Apple says that they should be scaled by the scaling */ - /* factors in the transformation matrix (roughly, it's more complex) */ - /* while MS says they should not. OpenType defines two bits in the */ - /* composite flags array which can be used to disambiguate, but old */ - /* fonts will not have them. */ - /* */ - /* http://partners.adobe.com/asn/developer/opentype/glyf.html */ - /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */ - /* */ -#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */ - /* support for Apple's distortable font technology (fvar, gvar, cvar, */ - /* and avar tables). This has many similarities to Type 1 Multiple */ - /* Masters support. */ - /* */ -#define TT_CONFIG_OPTION_GX_VAR_SUPPORT - - - /*************************************************************************/ - /* */ - /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ - /* an embedded `BDF ' table within SFNT-based bitmap formats. */ - /* */ -#define TT_CONFIG_OPTION_BDF - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* T1_MAX_DICT_DEPTH is the maximal depth of nest dictionaries and */ - /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */ - /* required. */ - /* */ -#define T1_MAX_DICT_DEPTH 5 - - - /*************************************************************************/ - /* */ - /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ - /* calls during glyph loading. */ - /* */ -#define T1_MAX_SUBRS_CALLS 16 - - - /*************************************************************************/ - /* */ - /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ - /* minimum of 16 is required. */ - /* */ - /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */ - /* */ -#define T1_MAX_CHARSTRINGS_OPERANDS 256 - - - /*************************************************************************/ - /* */ - /* Define this configuration macro if you want to prevent the */ - /* compilation of `t1afm', which is in charge of reading Type 1 AFM */ - /* files into an existing face. Note that if set, the T1 driver will be */ - /* unable to produce kerning distances. */ - /* */ -#undef T1_CONFIG_OPTION_NO_AFM - - - /*************************************************************************/ - /* */ - /* Define this configuration macro if you want to prevent the */ - /* compilation of the Multiple Masters font support in the Type 1 */ - /* driver. */ - /* */ -#undef T1_CONFIG_OPTION_NO_MM_SUPPORT - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */ - /* support. */ - /* */ -#define AF_CONFIG_OPTION_CJK - - /*************************************************************************/ - /* */ - /* Compile autofit module with Indic script support. */ - /* */ -#define AF_CONFIG_OPTION_INDIC - - /* */ - - - /* - * Define this variable if you want to keep the layout of internal - * structures that was used prior to FreeType 2.2. This also compiles in - * a few obsolete functions to avoid linking problems on typical Unix - * distributions. - * - * For embedded systems or building a new distribution from scratch, it - * is recommended to disable the macro since it reduces the library's code - * size and activates a few memory-saving optimizations as well. - */ -#define FT_CONFIG_OPTION_OLD_INTERNALS - - - /* - * To detect legacy cache-lookup call from a rogue client (<= 2.1.7), - * we restrict the number of charmaps in a font. The current API of - * FTC_CMapCache_Lookup() takes cmap_index & charcode, but old API - * takes charcode only. To determine the passed value is for cmap_index - * or charcode, the possible cmap_index is restricted not to exceed - * the minimum possible charcode by a rogue client. It is also very - * unlikely that a rogue client is interested in Unicode values 0 to 15. - * - * NOTE: The original threshold was 4 deduced from popular number of - * cmap subtables in UCS-4 TrueType fonts, but now it is not - * irregular for OpenType fonts to have more than 4 subtables, - * because variation selector subtables are available for Apple - * and Microsoft platforms. - */ - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS -#define FT_MAX_CHARMAP_CACHEABLE 15 -#endif - - - /* - * This macro is defined if either unpatented or native TrueType - * hinting is requested by the definitions above. - */ -#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER -#define TT_USE_BYTECODE_INTERPRETER -#undef TT_CONFIG_OPTION_UNPATENTED_HINTING -#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING -#define TT_USE_BYTECODE_INTERPRETER -#endif - -FT_END_HEADER - - -#endif /* __FTOPTION_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/config/ftstdlib.h b/android/jni/ndk_modules/freetype/include/freetype/config/ftstdlib.h deleted file mode 100644 index 30ec14e7..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/config/ftstdlib.h +++ /dev/null @@ -1,173 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftstdlib.h */ -/* */ -/* ANSI-specific library and header configuration file (specification */ -/* only). */ -/* */ -/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to group all #includes to the ANSI C library that */ - /* FreeType normally requires. It also defines macros to rename the */ - /* standard functions within the FreeType source code. */ - /* */ - /* Load a file which defines __FTSTDLIB_H__ before this one to override */ - /* it. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTSTDLIB_H__ -#define __FTSTDLIB_H__ - - -#include <stddef.h> - -#define ft_ptrdiff_t ptrdiff_t - - - /**********************************************************************/ - /* */ - /* integer limits */ - /* */ - /* UINT_MAX and ULONG_MAX are used to automatically compute the size */ - /* of `int' and `long' in bytes at compile-time. So far, this works */ - /* for all platforms the library has been tested on. */ - /* */ - /* Note that on the extremely rare platforms that do not provide */ - /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some */ - /* old Crays where `int' is 36 bits), we do not make any guarantee */ - /* about the correct behaviour of FT2 with all fonts. */ - /* */ - /* In these case, `ftconfig.h' will refuse to compile anyway with a */ - /* message like `couldn't find 32-bit type' or something similar. */ - /* */ - /**********************************************************************/ - - -#include <limits.h> - -#define FT_CHAR_BIT CHAR_BIT -#define FT_INT_MAX INT_MAX -#define FT_INT_MIN INT_MIN -#define FT_UINT_MAX UINT_MAX -#define FT_ULONG_MAX ULONG_MAX - - - /**********************************************************************/ - /* */ - /* character and string processing */ - /* */ - /**********************************************************************/ - - -#include <string.h> - -#define ft_memchr memchr -#define ft_memcmp memcmp -#define ft_memcpy memcpy -#define ft_memmove memmove -#define ft_memset memset -#define ft_strcat strcat -#define ft_strcmp strcmp -#define ft_strcpy strcpy -#define ft_strlen strlen -#define ft_strncmp strncmp -#define ft_strncpy strncpy -#define ft_strrchr strrchr -#define ft_strstr strstr - - - /**********************************************************************/ - /* */ - /* file handling */ - /* */ - /**********************************************************************/ - - -#include <stdio.h> - -#define FT_FILE FILE -#define ft_fclose fclose -#define ft_fopen fopen -#define ft_fread fread -#define ft_fseek fseek -#define ft_ftell ftell -#define ft_sprintf sprintf - - - /**********************************************************************/ - /* */ - /* sorting */ - /* */ - /**********************************************************************/ - - -#include <stdlib.h> - -#define ft_qsort qsort - - - /**********************************************************************/ - /* */ - /* memory allocation */ - /* */ - /**********************************************************************/ - - -#define ft_scalloc calloc -#define ft_sfree free -#define ft_smalloc malloc -#define ft_srealloc realloc - - - /**********************************************************************/ - /* */ - /* miscellaneous */ - /* */ - /**********************************************************************/ - - -#define ft_atol atol -#define ft_labs labs - - - /**********************************************************************/ - /* */ - /* execution control */ - /* */ - /**********************************************************************/ - - -#include <setjmp.h> - -#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ - /* jmp_buf is defined as a macro */ - /* on certain platforms */ - -#define ft_longjmp longjmp -#define ft_setjmp( b ) setjmp( *(jmp_buf*) &(b) ) /* same thing here */ - - - /* the following is only used for debugging purposes, i.e., if */ - /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */ - -#include <stdarg.h> - - -#endif /* __FTSTDLIB_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/freetype.h b/android/jni/ndk_modules/freetype/include/freetype/freetype.h deleted file mode 100644 index 7799b70b..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/freetype.h +++ /dev/null @@ -1,3919 +0,0 @@ -/***************************************************************************/ -/* */ -/* freetype.h */ -/* */ -/* FreeType high-level API and common types (specification only). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef FT_FREETYPE_H -#error "`ft2build.h' hasn't been included yet!" -#error "Please always use macros to include FreeType header files." -#error "Example:" -#error " #include <ft2build.h>" -#error " #include FT_FREETYPE_H" -#endif - - -#ifndef __FREETYPE_H__ -#define __FREETYPE_H__ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_ERRORS_H -#include FT_TYPES_H - - -FT_BEGIN_HEADER - - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* user_allocation */ - /* */ - /* <Title> */ - /* User allocation */ - /* */ - /* <Abstract> */ - /* How client applications should allocate FreeType data structures. */ - /* */ - /* <Description> */ - /* FreeType assumes that structures allocated by the user and passed */ - /* as arguments are zeroed out except for the actual data. In other */ - /* words, it is recommended to use `calloc' (or variants of it) */ - /* instead of `malloc' for allocation. */ - /* */ - /*************************************************************************/ - - - - /*************************************************************************/ - /*************************************************************************/ - /* */ - /* B A S I C T Y P E S */ - /* */ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* base_interface */ - /* */ - /* <Title> */ - /* Base Interface */ - /* */ - /* <Abstract> */ - /* The FreeType~2 base font interface. */ - /* */ - /* <Description> */ - /* This section describes the public high-level API of FreeType~2. */ - /* */ - /* <Order> */ - /* FT_Library */ - /* FT_Face */ - /* FT_Size */ - /* FT_GlyphSlot */ - /* FT_CharMap */ - /* FT_Encoding */ - /* */ - /* FT_FaceRec */ - /* */ - /* FT_FACE_FLAG_SCALABLE */ - /* FT_FACE_FLAG_FIXED_SIZES */ - /* FT_FACE_FLAG_FIXED_WIDTH */ - /* FT_FACE_FLAG_HORIZONTAL */ - /* FT_FACE_FLAG_VERTICAL */ - /* FT_FACE_FLAG_SFNT */ - /* FT_FACE_FLAG_KERNING */ - /* FT_FACE_FLAG_MULTIPLE_MASTERS */ - /* FT_FACE_FLAG_GLYPH_NAMES */ - /* FT_FACE_FLAG_EXTERNAL_STREAM */ - /* FT_FACE_FLAG_FAST_GLYPHS */ - /* FT_FACE_FLAG_HINTER */ - /* */ - /* FT_STYLE_FLAG_BOLD */ - /* FT_STYLE_FLAG_ITALIC */ - /* */ - /* FT_SizeRec */ - /* FT_Size_Metrics */ - /* */ - /* FT_GlyphSlotRec */ - /* FT_Glyph_Metrics */ - /* FT_SubGlyph */ - /* */ - /* FT_Bitmap_Size */ - /* */ - /* FT_Init_FreeType */ - /* FT_Done_FreeType */ - /* */ - /* FT_New_Face */ - /* FT_Done_Face */ - /* FT_New_Memory_Face */ - /* FT_Open_Face */ - /* FT_Open_Args */ - /* FT_Parameter */ - /* FT_Attach_File */ - /* FT_Attach_Stream */ - /* */ - /* FT_Set_Char_Size */ - /* FT_Set_Pixel_Sizes */ - /* FT_Request_Size */ - /* FT_Select_Size */ - /* FT_Size_Request_Type */ - /* FT_Size_Request */ - /* FT_Set_Transform */ - /* FT_Load_Glyph */ - /* FT_Get_Char_Index */ - /* FT_Get_Name_Index */ - /* FT_Load_Char */ - /* */ - /* FT_OPEN_MEMORY */ - /* FT_OPEN_STREAM */ - /* FT_OPEN_PATHNAME */ - /* FT_OPEN_DRIVER */ - /* FT_OPEN_PARAMS */ - /* */ - /* FT_LOAD_DEFAULT */ - /* FT_LOAD_RENDER */ - /* FT_LOAD_MONOCHROME */ - /* FT_LOAD_LINEAR_DESIGN */ - /* FT_LOAD_NO_SCALE */ - /* FT_LOAD_NO_HINTING */ - /* FT_LOAD_NO_BITMAP */ - /* FT_LOAD_CROP_BITMAP */ - /* */ - /* FT_LOAD_VERTICAL_LAYOUT */ - /* FT_LOAD_IGNORE_TRANSFORM */ - /* FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH */ - /* FT_LOAD_FORCE_AUTOHINT */ - /* FT_LOAD_NO_RECURSE */ - /* FT_LOAD_PEDANTIC */ - /* */ - /* FT_LOAD_TARGET_NORMAL */ - /* FT_LOAD_TARGET_LIGHT */ - /* FT_LOAD_TARGET_MONO */ - /* FT_LOAD_TARGET_LCD */ - /* FT_LOAD_TARGET_LCD_V */ - /* */ - /* FT_Render_Glyph */ - /* FT_Render_Mode */ - /* FT_Get_Kerning */ - /* FT_Kerning_Mode */ - /* FT_Get_Track_Kerning */ - /* FT_Get_Glyph_Name */ - /* FT_Get_Postscript_Name */ - /* */ - /* FT_CharMapRec */ - /* FT_Select_Charmap */ - /* FT_Set_Charmap */ - /* FT_Get_Charmap_Index */ - /* */ - /* FT_FSTYPE_INSTALLABLE_EMBEDDING */ - /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING */ - /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING */ - /* FT_FSTYPE_EDITABLE_EMBEDDING */ - /* FT_FSTYPE_NO_SUBSETTING */ - /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY */ - /* */ - /* FT_Get_FSType_Flags */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Glyph_Metrics */ - /* */ - /* <Description> */ - /* A structure used to model the metrics of a single glyph. The */ - /* values are expressed in 26.6 fractional pixel format; if the flag */ - /* @FT_LOAD_NO_SCALE has been used while loading the glyph, values */ - /* are expressed in font units instead. */ - /* */ - /* <Fields> */ - /* width :: */ - /* The glyph's width. */ - /* */ - /* height :: */ - /* The glyph's height. */ - /* */ - /* horiBearingX :: */ - /* Left side bearing for horizontal layout. */ - /* */ - /* horiBearingY :: */ - /* Top side bearing for horizontal layout. */ - /* */ - /* horiAdvance :: */ - /* Advance width for horizontal layout. */ - /* */ - /* vertBearingX :: */ - /* Left side bearing for vertical layout. */ - /* */ - /* vertBearingY :: */ - /* Top side bearing for vertical layout. */ - /* */ - /* vertAdvance :: */ - /* Advance height for vertical layout. */ - /* */ - /* <Note> */ - /* If not disabled with @FT_LOAD_NO_HINTING, the values represent */ - /* dimensions of the hinted glyph (in case hinting is applicable). */ - /* */ - typedef struct FT_Glyph_Metrics_ - { - FT_Pos width; - FT_Pos height; - - FT_Pos horiBearingX; - FT_Pos horiBearingY; - FT_Pos horiAdvance; - - FT_Pos vertBearingX; - FT_Pos vertBearingY; - FT_Pos vertAdvance; - - } FT_Glyph_Metrics; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Bitmap_Size */ - /* */ - /* <Description> */ - /* This structure models the metrics of a bitmap strike (i.e., a set */ - /* of glyphs for a given point size and resolution) in a bitmap font. */ - /* It is used for the `available_sizes' field of @FT_Face. */ - /* */ - /* <Fields> */ - /* height :: The vertical distance, in pixels, between two */ - /* consecutive baselines. It is always positive. */ - /* */ - /* width :: The average width, in pixels, of all glyphs in the */ - /* strike. */ - /* */ - /* size :: The nominal size of the strike in 26.6 fractional */ - /* points. This field is not very useful. */ - /* */ - /* x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional */ - /* pixels. */ - /* */ - /* y_ppem :: The vertical ppem (nominal height) in 26.6 fractional */ - /* pixels. */ - /* */ - /* <Note> */ - /* Windows FNT: */ - /* The nominal size given in a FNT font is not reliable. Thus when */ - /* the driver finds it incorrect, it sets `size' to some calculated */ - /* values and sets `x_ppem' and `y_ppem' to the pixel width and */ - /* height given in the font, respectively. */ - /* */ - /* TrueType embedded bitmaps: */ - /* `size', `width', and `height' values are not contained in the */ - /* bitmap strike itself. They are computed from the global font */ - /* parameters. */ - /* */ - typedef struct FT_Bitmap_Size_ - { - FT_Short height; - FT_Short width; - - FT_Pos size; - - FT_Pos x_ppem; - FT_Pos y_ppem; - - } FT_Bitmap_Size; - - - /*************************************************************************/ - /*************************************************************************/ - /* */ - /* O B J E C T C L A S S E S */ - /* */ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Library */ - /* */ - /* <Description> */ - /* A handle to a FreeType library instance. Each `library' is */ - /* completely independent from the others; it is the `root' of a set */ - /* of objects like fonts, faces, sizes, etc. */ - /* */ - /* It also embeds a memory manager (see @FT_Memory), as well as a */ - /* scan-line converter object (see @FT_Raster). */ - /* */ - /* For multi-threading applications each thread should have its own */ - /* FT_Library object. */ - /* */ - /* <Note> */ - /* Library objects are normally created by @FT_Init_FreeType, and */ - /* destroyed with @FT_Done_FreeType. */ - /* */ - typedef struct FT_LibraryRec_ *FT_Library; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Module */ - /* */ - /* <Description> */ - /* A handle to a given FreeType module object. Each module can be a */ - /* font driver, a renderer, or anything else that provides services */ - /* to the formers. */ - /* */ - typedef struct FT_ModuleRec_* FT_Module; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Driver */ - /* */ - /* <Description> */ - /* A handle to a given FreeType font driver object. Each font driver */ - /* is a special module capable of creating faces from font files. */ - /* */ - typedef struct FT_DriverRec_* FT_Driver; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Renderer */ - /* */ - /* <Description> */ - /* A handle to a given FreeType renderer. A renderer is a special */ - /* module in charge of converting a glyph image to a bitmap, when */ - /* necessary. Each renderer supports a given glyph image format, and */ - /* one or more target surface depths. */ - /* */ - typedef struct FT_RendererRec_* FT_Renderer; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Face */ - /* */ - /* <Description> */ - /* A handle to a given typographic face object. A face object models */ - /* a given typeface, in a given style. */ - /* */ - /* <Note> */ - /* Each face object also owns a single @FT_GlyphSlot object, as well */ - /* as one or more @FT_Size objects. */ - /* */ - /* Use @FT_New_Face or @FT_Open_Face to create a new face object from */ - /* a given filepathname or a custom input stream. */ - /* */ - /* Use @FT_Done_Face to destroy it (along with its slot and sizes). */ - /* */ - /* <Also> */ - /* See @FT_FaceRec for the publicly accessible fields of a given face */ - /* object. */ - /* */ - typedef struct FT_FaceRec_* FT_Face; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Size */ - /* */ - /* <Description> */ - /* A handle to an object used to model a face scaled to a given */ - /* character size. */ - /* */ - /* <Note> */ - /* Each @FT_Face has an _active_ @FT_Size object that is used by */ - /* functions like @FT_Load_Glyph to determine the scaling */ - /* transformation which is used to load and hint glyphs and metrics. */ - /* */ - /* You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, */ - /* @FT_Request_Size or even @FT_Select_Size to change the content */ - /* (i.e., the scaling values) of the active @FT_Size. */ - /* */ - /* You can use @FT_New_Size to create additional size objects for a */ - /* given @FT_Face, but they won't be used by other functions until */ - /* you activate it through @FT_Activate_Size. Only one size can be */ - /* activated at any given time per face. */ - /* */ - /* <Also> */ - /* See @FT_SizeRec for the publicly accessible fields of a given size */ - /* object. */ - /* */ - typedef struct FT_SizeRec_* FT_Size; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_GlyphSlot */ - /* */ - /* <Description> */ - /* A handle to a given `glyph slot'. A slot is a container where it */ - /* is possible to load any of the glyphs contained in its parent */ - /* face. */ - /* */ - /* In other words, each time you call @FT_Load_Glyph or */ - /* @FT_Load_Char, the slot's content is erased by the new glyph data, */ - /* i.e., the glyph's metrics, its image (bitmap or outline), and */ - /* other control information. */ - /* */ - /* <Also> */ - /* See @FT_GlyphSlotRec for the publicly accessible glyph fields. */ - /* */ - typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_CharMap */ - /* */ - /* <Description> */ - /* A handle to a given character map. A charmap is used to translate */ - /* character codes in a given encoding into glyph indexes for its */ - /* parent's face. Some font formats may provide several charmaps per */ - /* font. */ - /* */ - /* Each face object owns zero or more charmaps, but only one of them */ - /* can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char. */ - /* */ - /* The list of available charmaps in a face is available through the */ - /* `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec. */ - /* */ - /* The currently active charmap is available as `face->charmap'. */ - /* You should call @FT_Set_Charmap to change it. */ - /* */ - /* <Note> */ - /* When a new face is created (either through @FT_New_Face or */ - /* @FT_Open_Face), the library looks for a Unicode charmap within */ - /* the list and automatically activates it. */ - /* */ - /* <Also> */ - /* See @FT_CharMapRec for the publicly accessible fields of a given */ - /* character map. */ - /* */ - typedef struct FT_CharMapRec_* FT_CharMap; - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_ENC_TAG */ - /* */ - /* <Description> */ - /* This macro converts four-letter tags into an unsigned long. It is */ - /* used to define `encoding' identifiers (see @FT_Encoding). */ - /* */ - /* <Note> */ - /* Since many 16-bit compilers don't like 32-bit enumerations, you */ - /* should redefine this macro in case of problems to something like */ - /* this: */ - /* */ - /* { */ - /* #define FT_ENC_TAG( value, a, b, c, d ) value */ - /* } */ - /* */ - /* to get a simple enumeration without assigning special numbers. */ - /* */ - -#ifndef FT_ENC_TAG -#define FT_ENC_TAG( value, a, b, c, d ) \ - value = ( ( (FT_UInt32)(a) << 24 ) | \ - ( (FT_UInt32)(b) << 16 ) | \ - ( (FT_UInt32)(c) << 8 ) | \ - (FT_UInt32)(d) ) - -#endif /* FT_ENC_TAG */ - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Encoding */ - /* */ - /* <Description> */ - /* An enumeration used to specify character sets supported by */ - /* charmaps. Used in the @FT_Select_Charmap API function. */ - /* */ - /* <Note> */ - /* Despite the name, this enumeration lists specific character */ - /* repertories (i.e., charsets), and not text encoding methods (e.g., */ - /* UTF-8, UTF-16, etc.). */ - /* */ - /* Other encodings might be defined in the future. */ - /* */ - /* <Values> */ - /* FT_ENCODING_NONE :: */ - /* The encoding value~0 is reserved. */ - /* */ - /* FT_ENCODING_UNICODE :: */ - /* Corresponds to the Unicode character set. This value covers */ - /* all versions of the Unicode repertoire, including ASCII and */ - /* Latin-1. Most fonts include a Unicode charmap, but not all */ - /* of them. */ - /* */ - /* For example, if you want to access Unicode value U+1F028 (and */ - /* the font contains it), use value 0x1F028 as the input value for */ - /* @FT_Get_Char_Index. */ - /* */ - /* FT_ENCODING_MS_SYMBOL :: */ - /* Corresponds to the Microsoft Symbol encoding, used to encode */ - /* mathematical symbols in the 32..255 character code range. For */ - /* more information, see `http://www.ceviz.net/symbol.htm'. */ - /* */ - /* FT_ENCODING_SJIS :: */ - /* Corresponds to Japanese SJIS encoding. More info at */ - /* at `http://langsupport.japanreference.com/encoding.shtml'. */ - /* See note on multi-byte encodings below. */ - /* */ - /* FT_ENCODING_GB2312 :: */ - /* Corresponds to an encoding system for Simplified Chinese as used */ - /* used in mainland China. */ - /* */ - /* FT_ENCODING_BIG5 :: */ - /* Corresponds to an encoding system for Traditional Chinese as */ - /* used in Taiwan and Hong Kong. */ - /* */ - /* FT_ENCODING_WANSUNG :: */ - /* Corresponds to the Korean encoding system known as Wansung. */ - /* For more information see */ - /* `http://www.microsoft.com/typography/unicode/949.txt'. */ - /* */ - /* FT_ENCODING_JOHAB :: */ - /* The Korean standard character set (KS~C 5601-1992), which */ - /* corresponds to MS Windows code page 1361. This character set */ - /* includes all possible Hangeul character combinations. */ - /* */ - /* FT_ENCODING_ADOBE_LATIN_1 :: */ - /* Corresponds to a Latin-1 encoding as defined in a Type~1 */ - /* PostScript font. It is limited to 256 character codes. */ - /* */ - /* FT_ENCODING_ADOBE_STANDARD :: */ - /* Corresponds to the Adobe Standard encoding, as found in Type~1, */ - /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ - /* codes. */ - /* */ - /* FT_ENCODING_ADOBE_EXPERT :: */ - /* Corresponds to the Adobe Expert encoding, as found in Type~1, */ - /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ - /* codes. */ - /* */ - /* FT_ENCODING_ADOBE_CUSTOM :: */ - /* Corresponds to a custom encoding, as found in Type~1, CFF, and */ - /* OpenType/CFF fonts. It is limited to 256 character codes. */ - /* */ - /* FT_ENCODING_APPLE_ROMAN :: */ - /* Corresponds to the 8-bit Apple roman encoding. Many TrueType */ - /* and OpenType fonts contain a charmap for this encoding, since */ - /* older versions of Mac OS are able to use it. */ - /* */ - /* FT_ENCODING_OLD_LATIN_2 :: */ - /* This value is deprecated and was never used nor reported by */ - /* FreeType. Don't use or test for it. */ - /* */ - /* FT_ENCODING_MS_SJIS :: */ - /* Same as FT_ENCODING_SJIS. Deprecated. */ - /* */ - /* FT_ENCODING_MS_GB2312 :: */ - /* Same as FT_ENCODING_GB2312. Deprecated. */ - /* */ - /* FT_ENCODING_MS_BIG5 :: */ - /* Same as FT_ENCODING_BIG5. Deprecated. */ - /* */ - /* FT_ENCODING_MS_WANSUNG :: */ - /* Same as FT_ENCODING_WANSUNG. Deprecated. */ - /* */ - /* FT_ENCODING_MS_JOHAB :: */ - /* Same as FT_ENCODING_JOHAB. Deprecated. */ - /* */ - /* <Note> */ - /* By default, FreeType automatically synthesizes a Unicode charmap */ - /* for PostScript fonts, using their glyph names dictionaries. */ - /* However, it also reports the encodings defined explicitly in the */ - /* font file, for the cases when they are needed, with the Adobe */ - /* values as well. */ - /* */ - /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */ - /* is neither Unicode nor ISO-8859-1 (otherwise it is set to */ - /* FT_ENCODING_UNICODE). Use @FT_Get_BDF_Charset_ID to find out */ - /* which encoding is really present. If, for example, the */ - /* `cs_registry' field is `KOI8' and the `cs_encoding' field is `R', */ - /* the font is encoded in KOI8-R. */ - /* */ - /* FT_ENCODING_NONE is always set (with a single exception) by the */ - /* winfonts driver. Use @FT_Get_WinFNT_Header and examine the */ - /* `charset' field of the @FT_WinFNT_HeaderRec structure to find out */ - /* which encoding is really present. For example, */ - /* @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for */ - /* Russian). */ - /* */ - /* FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */ - /* and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to */ - /* FT_ENCODING_APPLE_ROMAN). */ - /* */ - /* If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function */ - /* @FT_Get_CMap_Language_ID to query the Mac language ID which may */ - /* be needed to be able to distinguish Apple encoding variants. See */ - /* */ - /* http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT */ - /* */ - /* to get an idea how to do that. Basically, if the language ID */ - /* is~0, don't use it, otherwise subtract 1 from the language ID. */ - /* Then examine `encoding_id'. If, for example, `encoding_id' is */ - /* @TT_MAC_ID_ROMAN and the language ID (minus~1) is */ - /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */ - /* @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi */ - /* variant the Arabic encoding. */ - /* */ - typedef enum FT_Encoding_ - { - FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), - - FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), - FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), - - FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), - FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ), - FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), - FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), - FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), - - /* for backwards compatibility */ - FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, - FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312, - FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, - FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, - FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, - - FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), - FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), - FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), - FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), - - FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), - - FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) - - } FT_Encoding; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* ft_encoding_xxx */ - /* */ - /* <Description> */ - /* These constants are deprecated; use the corresponding @FT_Encoding */ - /* values instead. */ - /* */ -#define ft_encoding_none FT_ENCODING_NONE -#define ft_encoding_unicode FT_ENCODING_UNICODE -#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL -#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 -#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 -#define ft_encoding_sjis FT_ENCODING_SJIS -#define ft_encoding_gb2312 FT_ENCODING_GB2312 -#define ft_encoding_big5 FT_ENCODING_BIG5 -#define ft_encoding_wansung FT_ENCODING_WANSUNG -#define ft_encoding_johab FT_ENCODING_JOHAB - -#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD -#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT -#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM -#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_CharMapRec */ - /* */ - /* <Description> */ - /* The base charmap structure. */ - /* */ - /* <Fields> */ - /* face :: A handle to the parent face object. */ - /* */ - /* encoding :: An @FT_Encoding tag identifying the charmap. Use */ - /* this with @FT_Select_Charmap. */ - /* */ - /* platform_id :: An ID number describing the platform for the */ - /* following encoding ID. This comes directly from */ - /* the TrueType specification and should be emulated */ - /* for other formats. */ - /* */ - /* encoding_id :: A platform specific encoding number. This also */ - /* comes from the TrueType specification and should be */ - /* emulated similarly. */ - /* */ - typedef struct FT_CharMapRec_ - { - FT_Face face; - FT_Encoding encoding; - FT_UShort platform_id; - FT_UShort encoding_id; - - } FT_CharMapRec; - - - /*************************************************************************/ - /*************************************************************************/ - /* */ - /* B A S E O B J E C T C L A S S E S */ - /* */ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Face_Internal */ - /* */ - /* <Description> */ - /* An opaque handle to an `FT_Face_InternalRec' structure, used to */ - /* model private data of a given @FT_Face object. */ - /* */ - /* This structure might change between releases of FreeType~2 and is */ - /* not generally available to client applications. */ - /* */ - typedef struct FT_Face_InternalRec_* FT_Face_Internal; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_FaceRec */ - /* */ - /* <Description> */ - /* FreeType root face class structure. A face object models a */ - /* typeface in a font file. */ - /* */ - /* <Fields> */ - /* num_faces :: The number of faces in the font file. Some */ - /* font formats can have multiple faces in */ - /* a font file. */ - /* */ - /* face_index :: The index of the face in the font file. It */ - /* is set to~0 if there is only one face in */ - /* the font file. */ - /* */ - /* face_flags :: A set of bit flags that give important */ - /* information about the face; see */ - /* @FT_FACE_FLAG_XXX for the details. */ - /* */ - /* style_flags :: A set of bit flags indicating the style of */ - /* the face; see @FT_STYLE_FLAG_XXX for the */ - /* details. */ - /* */ - /* num_glyphs :: The number of glyphs in the face. If the */ - /* face is scalable and has sbits (see */ - /* `num_fixed_sizes'), it is set to the number */ - /* of outline glyphs. */ - /* */ - /* For CID-keyed fonts, this value gives the */ - /* highest CID used in the font. */ - /* */ - /* family_name :: The face's family name. This is an ASCII */ - /* string, usually in English, which describes */ - /* the typeface's family (like `Times New */ - /* Roman', `Bodoni', `Garamond', etc). This */ - /* is a least common denominator used to list */ - /* fonts. Some formats (TrueType & OpenType) */ - /* provide localized and Unicode versions of */ - /* this string. Applications should use the */ - /* format specific interface to access them. */ - /* Can be NULL (e.g., in fonts embedded in a */ - /* PDF file). */ - /* */ - /* style_name :: The face's style name. This is an ASCII */ - /* string, usually in English, which describes */ - /* the typeface's style (like `Italic', */ - /* `Bold', `Condensed', etc). Not all font */ - /* formats provide a style name, so this field */ - /* is optional, and can be set to NULL. As */ - /* for `family_name', some formats provide */ - /* localized and Unicode versions of this */ - /* string. Applications should use the format */ - /* specific interface to access them. */ - /* */ - /* num_fixed_sizes :: The number of bitmap strikes in the face. */ - /* Even if the face is scalable, there might */ - /* still be bitmap strikes, which are called */ - /* `sbits' in that case. */ - /* */ - /* available_sizes :: An array of @FT_Bitmap_Size for all bitmap */ - /* strikes in the face. It is set to NULL if */ - /* there is no bitmap strike. */ - /* */ - /* num_charmaps :: The number of charmaps in the face. */ - /* */ - /* charmaps :: An array of the charmaps of the face. */ - /* */ - /* generic :: A field reserved for client uses. See the */ - /* @FT_Generic type description. */ - /* */ - /* bbox :: The font bounding box. Coordinates are */ - /* expressed in font units (see */ - /* `units_per_EM'). The box is large enough */ - /* to contain any glyph from the font. Thus, */ - /* `bbox.yMax' can be seen as the `maximal */ - /* ascender', and `bbox.yMin' as the `minimal */ - /* descender'. Only relevant for scalable */ - /* formats. */ - /* */ - /* Note that the bounding box might be off by */ - /* (at least) one pixel for hinted fonts. See */ - /* @FT_Size_Metrics for further discussion. */ - /* */ - /* units_per_EM :: The number of font units per EM square for */ - /* this face. This is typically 2048 for */ - /* TrueType fonts, and 1000 for Type~1 fonts. */ - /* Only relevant for scalable formats. */ - /* */ - /* ascender :: The typographic ascender of the face, */ - /* expressed in font units. For font formats */ - /* not having this information, it is set to */ - /* `bbox.yMax'. Only relevant for scalable */ - /* formats. */ - /* */ - /* descender :: The typographic descender of the face, */ - /* expressed in font units. For font formats */ - /* not having this information, it is set to */ - /* `bbox.yMin'. Note that this field is */ - /* usually negative. Only relevant for */ - /* scalable formats. */ - /* */ - /* height :: The height is the vertical distance */ - /* between two consecutive baselines, */ - /* expressed in font units. It is always */ - /* positive. Only relevant for scalable */ - /* formats. */ - /* */ - /* max_advance_width :: The maximal advance width, in font units, */ - /* for all glyphs in this face. This can be */ - /* used to make word wrapping computations */ - /* faster. Only relevant for scalable */ - /* formats. */ - /* */ - /* max_advance_height :: The maximal advance height, in font units, */ - /* for all glyphs in this face. This is only */ - /* relevant for vertical layouts, and is set */ - /* to `height' for fonts that do not provide */ - /* vertical metrics. Only relevant for */ - /* scalable formats. */ - /* */ - /* underline_position :: The position, in font units, of the */ - /* underline line for this face. It is the */ - /* center of the underlining stem. Only */ - /* relevant for scalable formats. */ - /* */ - /* underline_thickness :: The thickness, in font units, of the */ - /* underline for this face. Only relevant for */ - /* scalable formats. */ - /* */ - /* glyph :: The face's associated glyph slot(s). */ - /* */ - /* size :: The current active size for this face. */ - /* */ - /* charmap :: The current active charmap for this face. */ - /* */ - /* <Note> */ - /* Fields may be changed after a call to @FT_Attach_File or */ - /* @FT_Attach_Stream. */ - /* */ - typedef struct FT_FaceRec_ - { - FT_Long num_faces; - FT_Long face_index; - - FT_Long face_flags; - FT_Long style_flags; - - FT_Long num_glyphs; - - FT_String* family_name; - FT_String* style_name; - - FT_Int num_fixed_sizes; - FT_Bitmap_Size* available_sizes; - - FT_Int num_charmaps; - FT_CharMap* charmaps; - - FT_Generic generic; - - /*# The following member variables (down to `underline_thickness') */ - /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ - /*# for bitmap fonts. */ - FT_BBox bbox; - - FT_UShort units_per_EM; - FT_Short ascender; - FT_Short descender; - FT_Short height; - - FT_Short max_advance_width; - FT_Short max_advance_height; - - FT_Short underline_position; - FT_Short underline_thickness; - - FT_GlyphSlot glyph; - FT_Size size; - FT_CharMap charmap; - - /*@private begin */ - - FT_Driver driver; - FT_Memory memory; - FT_Stream stream; - - FT_ListRec sizes_list; - - FT_Generic autohint; - void* extensions; - - FT_Face_Internal internal; - - /*@private end */ - - } FT_FaceRec; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_FACE_FLAG_XXX */ - /* */ - /* <Description> */ - /* A list of bit flags used in the `face_flags' field of the */ - /* @FT_FaceRec structure. They inform client applications of */ - /* properties of the corresponding face. */ - /* */ - /* <Values> */ - /* FT_FACE_FLAG_SCALABLE :: */ - /* Indicates that the face contains outline glyphs. This doesn't */ - /* prevent bitmap strikes, i.e., a face can have both this and */ - /* and @FT_FACE_FLAG_FIXED_SIZES set. */ - /* */ - /* FT_FACE_FLAG_FIXED_SIZES :: */ - /* Indicates that the face contains bitmap strikes. See also the */ - /* `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec. */ - /* */ - /* FT_FACE_FLAG_FIXED_WIDTH :: */ - /* Indicates that the face contains fixed-width characters (like */ - /* Courier, Lucido, MonoType, etc.). */ - /* */ - /* FT_FACE_FLAG_SFNT :: */ - /* Indicates that the face uses the `sfnt' storage scheme. For */ - /* now, this means TrueType and OpenType. */ - /* */ - /* FT_FACE_FLAG_HORIZONTAL :: */ - /* Indicates that the face contains horizontal glyph metrics. This */ - /* should be set for all common formats. */ - /* */ - /* FT_FACE_FLAG_VERTICAL :: */ - /* Indicates that the face contains vertical glyph metrics. This */ - /* is only available in some formats, not all of them. */ - /* */ - /* FT_FACE_FLAG_KERNING :: */ - /* Indicates that the face contains kerning information. If set, */ - /* the kerning distance can be retrieved through the function */ - /* @FT_Get_Kerning. Otherwise the function always return the */ - /* vector (0,0). Note that FreeType doesn't handle kerning data */ - /* from the `GPOS' table (as present in some OpenType fonts). */ - /* */ - /* FT_FACE_FLAG_FAST_GLYPHS :: */ - /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */ - /* */ - /* FT_FACE_FLAG_MULTIPLE_MASTERS :: */ - /* Indicates that the font contains multiple masters and is capable */ - /* of interpolating between them. See the multiple-masters */ - /* specific API for details. */ - /* */ - /* FT_FACE_FLAG_GLYPH_NAMES :: */ - /* Indicates that the font contains glyph names that can be */ - /* retrieved through @FT_Get_Glyph_Name. Note that some TrueType */ - /* fonts contain broken glyph name tables. Use the function */ - /* @FT_Has_PS_Glyph_Names when needed. */ - /* */ - /* FT_FACE_FLAG_EXTERNAL_STREAM :: */ - /* Used internally by FreeType to indicate that a face's stream was */ - /* provided by the client application and should not be destroyed */ - /* when @FT_Done_Face is called. Don't read or test this flag. */ - /* */ - /* FT_FACE_FLAG_HINTER :: */ - /* Set if the font driver has a hinting machine of its own. For */ - /* example, with TrueType fonts, it makes sense to use data from */ - /* the SFNT `gasp' table only if the native TrueType hinting engine */ - /* (with the bytecode interpreter) is available and active. */ - /* */ - /* FT_FACE_FLAG_CID_KEYED :: */ - /* Set if the font is CID-keyed. In that case, the font is not */ - /* accessed by glyph indices but by CID values. For subsetted */ - /* CID-keyed fonts this has the consequence that not all index */ - /* values are a valid argument to FT_Load_Glyph. Only the CID */ - /* values for which corresponding glyphs in the subsetted font */ - /* exist make FT_Load_Glyph return successfully; in all other cases */ - /* you get an `FT_Err_Invalid_Argument' error. */ - /* */ - /* Note that CID-keyed fonts which are in an SFNT wrapper don't */ - /* have this flag set since the glyphs are accessed in the normal */ - /* way (using contiguous indices); the `CID-ness' isn't visible to */ - /* the application. */ - /* */ - /* FT_FACE_FLAG_TRICKY :: */ - /* Set if the font is `tricky', this is, it always needs the */ - /* font format's native hinting engine to get a reasonable result. */ - /* A typical example is the Chinese font `mingli.ttf' which uses */ - /* TrueType bytecode instructions to move and scale all of its */ - /* subglyphs. */ - /* */ - /* It is not possible to autohint such fonts using */ - /* @FT_LOAD_FORCE_AUTOHINT; it will also ignore */ - /* @FT_LOAD_NO_HINTING. You have to set both FT_LOAD_NO_HINTING */ - /* and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */ - /* probably never want this except for demonstration purposes. */ - /* */ - /* Currently, there are six TrueType fonts in the list of tricky */ - /* fonts; they are hard-coded in file `ttobjs.c'. */ - /* */ -#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) -#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) -#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) -#define FT_FACE_FLAG_SFNT ( 1L << 3 ) -#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) -#define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) -#define FT_FACE_FLAG_KERNING ( 1L << 6 ) -#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) -#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) -#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) -#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) -#define FT_FACE_FLAG_HINTER ( 1L << 11 ) -#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 ) -#define FT_FACE_FLAG_TRICKY ( 1L << 13 ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_HORIZONTAL( face ) - * - * @description: - * A macro that returns true whenever a face object contains - * horizontal metrics (this is true for all font formats though). - * - * @also: - * @FT_HAS_VERTICAL can be used to check for vertical metrics. - * - */ -#define FT_HAS_HORIZONTAL( face ) \ - ( face->face_flags & FT_FACE_FLAG_HORIZONTAL ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_VERTICAL( face ) - * - * @description: - * A macro that returns true whenever a face object contains vertical - * metrics. - * - */ -#define FT_HAS_VERTICAL( face ) \ - ( face->face_flags & FT_FACE_FLAG_VERTICAL ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_KERNING( face ) - * - * @description: - * A macro that returns true whenever a face object contains kerning - * data that can be accessed with @FT_Get_Kerning. - * - */ -#define FT_HAS_KERNING( face ) \ - ( face->face_flags & FT_FACE_FLAG_KERNING ) - - - /************************************************************************* - * - * @macro: - * FT_IS_SCALABLE( face ) - * - * @description: - * A macro that returns true whenever a face object contains a scalable - * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF, - * and PFR font formats. - * - */ -#define FT_IS_SCALABLE( face ) \ - ( face->face_flags & FT_FACE_FLAG_SCALABLE ) - - - /************************************************************************* - * - * @macro: - * FT_IS_SFNT( face ) - * - * @description: - * A macro that returns true whenever a face object contains a font - * whose format is based on the SFNT storage scheme. This usually - * means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded - * bitmap fonts. - * - * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and - * @FT_TRUETYPE_TABLES_H are available. - * - */ -#define FT_IS_SFNT( face ) \ - ( face->face_flags & FT_FACE_FLAG_SFNT ) - - - /************************************************************************* - * - * @macro: - * FT_IS_FIXED_WIDTH( face ) - * - * @description: - * A macro that returns true whenever a face object contains a font face - * that contains fixed-width (or `monospace', `fixed-pitch', etc.) - * glyphs. - * - */ -#define FT_IS_FIXED_WIDTH( face ) \ - ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_FIXED_SIZES( face ) - * - * @description: - * A macro that returns true whenever a face object contains some - * embedded bitmaps. See the `available_sizes' field of the - * @FT_FaceRec structure. - * - */ -#define FT_HAS_FIXED_SIZES( face ) \ - ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_FAST_GLYPHS( face ) - * - * @description: - * Deprecated. - * - */ -#define FT_HAS_FAST_GLYPHS( face ) 0 - - - /************************************************************************* - * - * @macro: - * FT_HAS_GLYPH_NAMES( face ) - * - * @description: - * A macro that returns true whenever a face object contains some glyph - * names that can be accessed through @FT_Get_Glyph_Name. - * - */ -#define FT_HAS_GLYPH_NAMES( face ) \ - ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) - - - /************************************************************************* - * - * @macro: - * FT_HAS_MULTIPLE_MASTERS( face ) - * - * @description: - * A macro that returns true whenever a face object contains some - * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H - * are then available to choose the exact design you want. - * - */ -#define FT_HAS_MULTIPLE_MASTERS( face ) \ - ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) - - - /************************************************************************* - * - * @macro: - * FT_IS_CID_KEYED( face ) - * - * @description: - * A macro that returns true whenever a face object contains a CID-keyed - * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more - * details. - * - * If this macro is true, all functions defined in @FT_CID_H are - * available. - * - */ -#define FT_IS_CID_KEYED( face ) \ - ( face->face_flags & FT_FACE_FLAG_CID_KEYED ) - - - /************************************************************************* - * - * @macro: - * FT_IS_TRICKY( face ) - * - * @description: - * A macro that returns true whenever a face represents a `tricky' font. - * See the discussion of @FT_FACE_FLAG_TRICKY for more details. - * - */ -#define FT_IS_TRICKY( face ) \ - ( face->face_flags & FT_FACE_FLAG_TRICKY ) - - - /*************************************************************************/ - /* */ - /* <Const> */ - /* FT_STYLE_FLAG_XXX */ - /* */ - /* <Description> */ - /* A list of bit-flags used to indicate the style of a given face. */ - /* These are used in the `style_flags' field of @FT_FaceRec. */ - /* */ - /* <Values> */ - /* FT_STYLE_FLAG_ITALIC :: */ - /* Indicates that a given face style is italic or oblique. */ - /* */ - /* FT_STYLE_FLAG_BOLD :: */ - /* Indicates that a given face is bold. */ - /* */ - /* <Note> */ - /* The style information as provided by FreeType is very basic. More */ - /* details are beyond the scope and should be done on a higher level */ - /* (for example, by analyzing various fields of the `OS/2' table in */ - /* SFNT based fonts). */ - /* */ -#define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) -#define FT_STYLE_FLAG_BOLD ( 1 << 1 ) - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Size_Internal */ - /* */ - /* <Description> */ - /* An opaque handle to an `FT_Size_InternalRec' structure, used to */ - /* model private data of a given @FT_Size object. */ - /* */ - typedef struct FT_Size_InternalRec_* FT_Size_Internal; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Size_Metrics */ - /* */ - /* <Description> */ - /* The size metrics structure gives the metrics of a size object. */ - /* */ - /* <Fields> */ - /* x_ppem :: The width of the scaled EM square in pixels, hence */ - /* the term `ppem' (pixels per EM). It is also */ - /* referred to as `nominal width'. */ - /* */ - /* y_ppem :: The height of the scaled EM square in pixels, */ - /* hence the term `ppem' (pixels per EM). It is also */ - /* referred to as `nominal height'. */ - /* */ - /* x_scale :: A 16.16 fractional scaling value used to convert */ - /* horizontal metrics from font units to 26.6 */ - /* fractional pixels. Only relevant for scalable */ - /* font formats. */ - /* */ - /* y_scale :: A 16.16 fractional scaling value used to convert */ - /* vertical metrics from font units to 26.6 */ - /* fractional pixels. Only relevant for scalable */ - /* font formats. */ - /* */ - /* ascender :: The ascender in 26.6 fractional pixels. See */ - /* @FT_FaceRec for the details. */ - /* */ - /* descender :: The descender in 26.6 fractional pixels. See */ - /* @FT_FaceRec for the details. */ - /* */ - /* height :: The height in 26.6 fractional pixels. See */ - /* @FT_FaceRec for the details. */ - /* */ - /* max_advance :: The maximal advance width in 26.6 fractional */ - /* pixels. See @FT_FaceRec for the details. */ - /* */ - /* <Note> */ - /* The scaling values, if relevant, are determined first during a */ - /* size changing operation. The remaining fields are then set by the */ - /* driver. For scalable formats, they are usually set to scaled */ - /* values of the corresponding fields in @FT_FaceRec. */ - /* */ - /* Note that due to glyph hinting, these values might not be exact */ - /* for certain fonts. Thus they must be treated as unreliable */ - /* with an error margin of at least one pixel! */ - /* */ - /* Indeed, the only way to get the exact metrics is to render _all_ */ - /* glyphs. As this would be a definite performance hit, it is up to */ - /* client applications to perform such computations. */ - /* */ - /* The FT_Size_Metrics structure is valid for bitmap fonts also. */ - /* */ - typedef struct FT_Size_Metrics_ - { - FT_UShort x_ppem; /* horizontal pixels per EM */ - FT_UShort y_ppem; /* vertical pixels per EM */ - - FT_Fixed x_scale; /* scaling values used to convert font */ - FT_Fixed y_scale; /* units to 26.6 fractional pixels */ - - FT_Pos ascender; /* ascender in 26.6 frac. pixels */ - FT_Pos descender; /* descender in 26.6 frac. pixels */ - FT_Pos height; /* text height in 26.6 frac. pixels */ - FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ - - } FT_Size_Metrics; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_SizeRec */ - /* */ - /* <Description> */ - /* FreeType root size class structure. A size object models a face */ - /* object at a given size. */ - /* */ - /* <Fields> */ - /* face :: Handle to the parent face object. */ - /* */ - /* generic :: A typeless pointer, which is unused by the FreeType */ - /* library or any of its drivers. It can be used by */ - /* client applications to link their own data to each size */ - /* object. */ - /* */ - /* metrics :: Metrics for this size object. This field is read-only. */ - /* */ - typedef struct FT_SizeRec_ - { - FT_Face face; /* parent face object */ - FT_Generic generic; /* generic pointer for client uses */ - FT_Size_Metrics metrics; /* size metrics */ - FT_Size_Internal internal; - - } FT_SizeRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_SubGlyph */ - /* */ - /* <Description> */ - /* The subglyph structure is an internal object used to describe */ - /* subglyphs (for example, in the case of composites). */ - /* */ - /* <Note> */ - /* The subglyph implementation is not part of the high-level API, */ - /* hence the forward structure declaration. */ - /* */ - /* You can however retrieve subglyph information with */ - /* @FT_Get_SubGlyph_Info. */ - /* */ - typedef struct FT_SubGlyphRec_* FT_SubGlyph; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Slot_Internal */ - /* */ - /* <Description> */ - /* An opaque handle to an `FT_Slot_InternalRec' structure, used to */ - /* model private data of a given @FT_GlyphSlot object. */ - /* */ - typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_GlyphSlotRec */ - /* */ - /* <Description> */ - /* FreeType root glyph slot class structure. A glyph slot is a */ - /* container where individual glyphs can be loaded, be they in */ - /* outline or bitmap format. */ - /* */ - /* <Fields> */ - /* library :: A handle to the FreeType library instance */ - /* this slot belongs to. */ - /* */ - /* face :: A handle to the parent face object. */ - /* */ - /* next :: In some cases (like some font tools), several */ - /* glyph slots per face object can be a good */ - /* thing. As this is rare, the glyph slots are */ - /* listed through a direct, single-linked list */ - /* using its `next' field. */ - /* */ - /* generic :: A typeless pointer which is unused by the */ - /* FreeType library or any of its drivers. It */ - /* can be used by client applications to link */ - /* their own data to each glyph slot object. */ - /* */ - /* metrics :: The metrics of the last loaded glyph in the */ - /* slot. The returned values depend on the last */ - /* load flags (see the @FT_Load_Glyph API */ - /* function) and can be expressed either in 26.6 */ - /* fractional pixels or font units. */ - /* */ - /* Note that even when the glyph image is */ - /* transformed, the metrics are not. */ - /* */ - /* linearHoriAdvance :: The advance width of the unhinted glyph. */ - /* Its value is expressed in 16.16 fractional */ - /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ - /* when loading the glyph. This field can be */ - /* important to perform correct WYSIWYG layout. */ - /* Only relevant for outline glyphs. */ - /* */ - /* linearVertAdvance :: The advance height of the unhinted glyph. */ - /* Its value is expressed in 16.16 fractional */ - /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ - /* when loading the glyph. This field can be */ - /* important to perform correct WYSIWYG layout. */ - /* Only relevant for outline glyphs. */ - /* */ - /* advance :: This shorthand is, depending on */ - /* @FT_LOAD_IGNORE_TRANSFORM, the transformed */ - /* advance width for the glyph (in 26.6 */ - /* fractional pixel format). As specified with */ - /* @FT_LOAD_VERTICAL_LAYOUT, it uses either the */ - /* `horiAdvance' or the `vertAdvance' value of */ - /* `metrics' field. */ - /* */ - /* format :: This field indicates the format of the image */ - /* contained in the glyph slot. Typically */ - /* @FT_GLYPH_FORMAT_BITMAP, */ - /* @FT_GLYPH_FORMAT_OUTLINE, or */ - /* @FT_GLYPH_FORMAT_COMPOSITE, but others are */ - /* possible. */ - /* */ - /* bitmap :: This field is used as a bitmap descriptor */ - /* when the slot format is */ - /* @FT_GLYPH_FORMAT_BITMAP. Note that the */ - /* address and content of the bitmap buffer can */ - /* change between calls of @FT_Load_Glyph and a */ - /* few other functions. */ - /* */ - /* bitmap_left :: This is the bitmap's left bearing expressed */ - /* in integer pixels. Of course, this is only */ - /* valid if the format is */ - /* @FT_GLYPH_FORMAT_BITMAP. */ - /* */ - /* bitmap_top :: This is the bitmap's top bearing expressed in */ - /* integer pixels. Remember that this is the */ - /* distance from the baseline to the top-most */ - /* glyph scanline, upwards y~coordinates being */ - /* *positive*. */ - /* */ - /* outline :: The outline descriptor for the current glyph */ - /* image if its format is */ - /* @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is */ - /* loaded, `outline' can be transformed, */ - /* distorted, embolded, etc. However, it must */ - /* not be freed. */ - /* */ - /* num_subglyphs :: The number of subglyphs in a composite glyph. */ - /* This field is only valid for the composite */ - /* glyph format that should normally only be */ - /* loaded with the @FT_LOAD_NO_RECURSE flag. */ - /* For now this is internal to FreeType. */ - /* */ - /* subglyphs :: An array of subglyph descriptors for */ - /* composite glyphs. There are `num_subglyphs' */ - /* elements in there. Currently internal to */ - /* FreeType. */ - /* */ - /* control_data :: Certain font drivers can also return the */ - /* control data for a given glyph image (e.g. */ - /* TrueType bytecode, Type~1 charstrings, etc.). */ - /* This field is a pointer to such data. */ - /* */ - /* control_len :: This is the length in bytes of the control */ - /* data. */ - /* */ - /* other :: Really wicked formats can use this pointer to */ - /* present their own glyph image to client */ - /* applications. Note that the application */ - /* needs to know about the image format. */ - /* */ - /* lsb_delta :: The difference between hinted and unhinted */ - /* left side bearing while autohinting is */ - /* active. Zero otherwise. */ - /* */ - /* rsb_delta :: The difference between hinted and unhinted */ - /* right side bearing while autohinting is */ - /* active. Zero otherwise. */ - /* */ - /* <Note> */ - /* If @FT_Load_Glyph is called with default flags (see */ - /* @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in */ - /* its native format (e.g., an outline glyph for TrueType and Type~1 */ - /* formats). */ - /* */ - /* This image can later be converted into a bitmap by calling */ - /* @FT_Render_Glyph. This function finds the current renderer for */ - /* the native image's format, then invokes it. */ - /* */ - /* The renderer is in charge of transforming the native image through */ - /* the slot's face transformation fields, then converting it into a */ - /* bitmap that is returned in `slot->bitmap'. */ - /* */ - /* Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */ - /* to specify the position of the bitmap relative to the current pen */ - /* position (e.g., coordinates (0,0) on the baseline). Of course, */ - /* `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP. */ - /* */ - /* <Note> */ - /* Here a small pseudo code fragment which shows how to use */ - /* `lsb_delta' and `rsb_delta': */ - /* */ - /* { */ - /* FT_Pos origin_x = 0; */ - /* FT_Pos prev_rsb_delta = 0; */ - /* */ - /* */ - /* for all glyphs do */ - /* <compute kern between current and previous glyph and add it to */ - /* `origin_x'> */ - /* */ - /* <load glyph with `FT_Load_Glyph'> */ - /* */ - /* if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 ) */ - /* origin_x -= 64; */ - /* else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 ) */ - /* origin_x += 64; */ - /* */ - /* prev_rsb_delta = face->glyph->rsb_delta; */ - /* */ - /* <save glyph image, or render glyph, or ...> */ - /* */ - /* origin_x += face->glyph->advance.x; */ - /* endfor */ - /* } */ - /* */ - typedef struct FT_GlyphSlotRec_ - { - FT_Library library; - FT_Face face; - FT_GlyphSlot next; - FT_UInt reserved; /* retained for binary compatibility */ - FT_Generic generic; - - FT_Glyph_Metrics metrics; - FT_Fixed linearHoriAdvance; - FT_Fixed linearVertAdvance; - FT_Vector advance; - - FT_Glyph_Format format; - - FT_Bitmap bitmap; - FT_Int bitmap_left; - FT_Int bitmap_top; - - FT_Outline outline; - - FT_UInt num_subglyphs; - FT_SubGlyph subglyphs; - - void* control_data; - long control_len; - - FT_Pos lsb_delta; - FT_Pos rsb_delta; - - void* other; - - FT_Slot_Internal internal; - - } FT_GlyphSlotRec; - - - /*************************************************************************/ - /*************************************************************************/ - /* */ - /* F U N C T I O N S */ - /* */ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Init_FreeType */ - /* */ - /* <Description> */ - /* Initialize a new FreeType library object. The set of modules */ - /* that are registered by this function is determined at build time. */ - /* */ - /* <Output> */ - /* alibrary :: A handle to a new library object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* In case you want to provide your own memory allocating routines, */ - /* use @FT_New_Library instead, followed by a call to */ - /* @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module). */ - /* */ - FT_EXPORT( FT_Error ) - FT_Init_FreeType( FT_Library *alibrary ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_FreeType */ - /* */ - /* <Description> */ - /* Destroy a given FreeType library object and all of its children, */ - /* including resources, drivers, faces, sizes, etc. */ - /* */ - /* <Input> */ - /* library :: A handle to the target library object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Done_FreeType( FT_Library library ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_OPEN_XXX */ - /* */ - /* <Description> */ - /* A list of bit-field constants used within the `flags' field of the */ - /* @FT_Open_Args structure. */ - /* */ - /* <Values> */ - /* FT_OPEN_MEMORY :: This is a memory-based stream. */ - /* */ - /* FT_OPEN_STREAM :: Copy the stream from the `stream' field. */ - /* */ - /* FT_OPEN_PATHNAME :: Create a new input stream from a C~path */ - /* name. */ - /* */ - /* FT_OPEN_DRIVER :: Use the `driver' field. */ - /* */ - /* FT_OPEN_PARAMS :: Use the `num_params' and `params' fields. */ - /* */ - /* ft_open_memory :: Deprecated; use @FT_OPEN_MEMORY instead. */ - /* */ - /* ft_open_stream :: Deprecated; use @FT_OPEN_STREAM instead. */ - /* */ - /* ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead. */ - /* */ - /* ft_open_driver :: Deprecated; use @FT_OPEN_DRIVER instead. */ - /* */ - /* ft_open_params :: Deprecated; use @FT_OPEN_PARAMS instead. */ - /* */ - /* <Note> */ - /* The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME' */ - /* flags are mutually exclusive. */ - /* */ -#define FT_OPEN_MEMORY 0x1 -#define FT_OPEN_STREAM 0x2 -#define FT_OPEN_PATHNAME 0x4 -#define FT_OPEN_DRIVER 0x8 -#define FT_OPEN_PARAMS 0x10 - -#define ft_open_memory FT_OPEN_MEMORY /* deprecated */ -#define ft_open_stream FT_OPEN_STREAM /* deprecated */ -#define ft_open_pathname FT_OPEN_PATHNAME /* deprecated */ -#define ft_open_driver FT_OPEN_DRIVER /* deprecated */ -#define ft_open_params FT_OPEN_PARAMS /* deprecated */ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Parameter */ - /* */ - /* <Description> */ - /* A simple structure used to pass more or less generic parameters to */ - /* @FT_Open_Face. */ - /* */ - /* <Fields> */ - /* tag :: A four-byte identification tag. */ - /* */ - /* data :: A pointer to the parameter data. */ - /* */ - /* <Note> */ - /* The ID and function of parameters are driver-specific. See the */ - /* various FT_PARAM_TAG_XXX flags for more information. */ - /* */ - typedef struct FT_Parameter_ - { - FT_ULong tag; - FT_Pointer data; - - } FT_Parameter; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Open_Args */ - /* */ - /* <Description> */ - /* A structure used to indicate how to open a new font file or */ - /* stream. A pointer to such a structure can be used as a parameter */ - /* for the functions @FT_Open_Face and @FT_Attach_Stream. */ - /* */ - /* <Fields> */ - /* flags :: A set of bit flags indicating how to use the */ - /* structure. */ - /* */ - /* memory_base :: The first byte of the file in memory. */ - /* */ - /* memory_size :: The size in bytes of the file in memory. */ - /* */ - /* pathname :: A pointer to an 8-bit file pathname. */ - /* */ - /* stream :: A handle to a source stream object. */ - /* */ - /* driver :: This field is exclusively used by @FT_Open_Face; */ - /* it simply specifies the font driver to use to open */ - /* the face. If set to~0, FreeType tries to load the */ - /* face with each one of the drivers in its list. */ - /* */ - /* num_params :: The number of extra parameters. */ - /* */ - /* params :: Extra parameters passed to the font driver when */ - /* opening a new face. */ - /* */ - /* <Note> */ - /* The stream type is determined by the contents of `flags' which */ - /* are tested in the following order by @FT_Open_Face: */ - /* */ - /* If the `FT_OPEN_MEMORY' bit is set, assume that this is a */ - /* memory file of `memory_size' bytes, located at `memory_address'. */ - /* The data are are not copied, and the client is responsible for */ - /* releasing and destroying them _after_ the corresponding call to */ - /* @FT_Done_Face. */ - /* */ - /* Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a */ - /* custom input stream `stream' is used. */ - /* */ - /* Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this */ - /* is a normal file and use `pathname' to open it. */ - /* */ - /* If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to */ - /* open the file with the driver whose handler is in `driver'. */ - /* */ - /* If the `FT_OPEN_PARAMS' bit is set, the parameters given by */ - /* `num_params' and `params' is used. They are ignored otherwise. */ - /* */ - /* Ideally, both the `pathname' and `params' fields should be tagged */ - /* as `const'; this is missing for API backwards compatibility. In */ - /* other words, applications should treat them as read-only. */ - /* */ - typedef struct FT_Open_Args_ - { - FT_UInt flags; - const FT_Byte* memory_base; - FT_Long memory_size; - FT_String* pathname; - FT_Stream stream; - FT_Module driver; - FT_Int num_params; - FT_Parameter* params; - - } FT_Open_Args; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Face */ - /* */ - /* <Description> */ - /* This function calls @FT_Open_Face to open a font by its pathname. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library resource. */ - /* */ - /* <Input> */ - /* pathname :: A path to the font file. */ - /* */ - /* face_index :: The index of the face within the font. The first */ - /* face has index~0. */ - /* */ - /* <Output> */ - /* aface :: A handle to a new face object. If `face_index' is */ - /* greater than or equal to zero, it must be non-NULL. */ - /* See @FT_Open_Face for more details. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Face( FT_Library library, - const char* filepathname, - FT_Long face_index, - FT_Face *aface ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Memory_Face */ - /* */ - /* <Description> */ - /* This function calls @FT_Open_Face to open a font which has been */ - /* loaded into memory. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library resource. */ - /* */ - /* <Input> */ - /* file_base :: A pointer to the beginning of the font data. */ - /* */ - /* file_size :: The size of the memory chunk used by the font data. */ - /* */ - /* face_index :: The index of the face within the font. The first */ - /* face has index~0. */ - /* */ - /* <Output> */ - /* aface :: A handle to a new face object. If `face_index' is */ - /* greater than or equal to zero, it must be non-NULL. */ - /* See @FT_Open_Face for more details. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* You must not deallocate the memory before calling @FT_Done_Face. */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Memory_Face( FT_Library library, - const FT_Byte* file_base, - FT_Long file_size, - FT_Long face_index, - FT_Face *aface ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Open_Face */ - /* */ - /* <Description> */ - /* Create a face object from a given resource described by */ - /* @FT_Open_Args. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library resource. */ - /* */ - /* <Input> */ - /* args :: A pointer to an `FT_Open_Args' structure which must */ - /* be filled by the caller. */ - /* */ - /* face_index :: The index of the face within the font. The first */ - /* face has index~0. */ - /* */ - /* <Output> */ - /* aface :: A handle to a new face object. If `face_index' is */ - /* greater than or equal to zero, it must be non-NULL. */ - /* See note below. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* Unlike FreeType 1.x, this function automatically creates a glyph */ - /* slot for the face object which can be accessed directly through */ - /* `face->glyph'. */ - /* */ - /* FT_Open_Face can be used to quickly check whether the font */ - /* format of a given font resource is supported by FreeType. If the */ - /* `face_index' field is negative, the function's return value is~0 */ - /* if the font format is recognized, or non-zero otherwise; */ - /* the function returns a more or less empty face handle in `*aface' */ - /* (if `aface' isn't NULL). The only useful field in this special */ - /* case is `face->num_faces' which gives the number of faces within */ - /* the font file. After examination, the returned @FT_Face structure */ - /* should be deallocated with a call to @FT_Done_Face. */ - /* */ - /* Each new face object created with this function also owns a */ - /* default @FT_Size object, accessible as `face->size'. */ - /* */ - /* See the discussion of reference counters in the description of */ - /* @FT_Reference_Face. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Open_Face( FT_Library library, - const FT_Open_Args* args, - FT_Long face_index, - FT_Face *aface ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Attach_File */ - /* */ - /* <Description> */ - /* This function calls @FT_Attach_Stream to attach a file. */ - /* */ - /* <InOut> */ - /* face :: The target face object. */ - /* */ - /* <Input> */ - /* filepathname :: The pathname. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Attach_File( FT_Face face, - const char* filepathname ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Attach_Stream */ - /* */ - /* <Description> */ - /* `Attach' data to a face object. Normally, this is used to read */ - /* additional information for the face object. For example, you can */ - /* attach an AFM file that comes with a Type~1 font to get the */ - /* kerning values and other metrics. */ - /* */ - /* <InOut> */ - /* face :: The target face object. */ - /* */ - /* <Input> */ - /* parameters :: A pointer to @FT_Open_Args which must be filled by */ - /* the caller. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The meaning of the `attach' (i.e., what really happens when the */ - /* new file is read) is not fixed by FreeType itself. It really */ - /* depends on the font format (and thus the font driver). */ - /* */ - /* Client applications are expected to know what they are doing */ - /* when invoking this function. Most drivers simply do not implement */ - /* file attachments. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Attach_Stream( FT_Face face, - FT_Open_Args* parameters ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Reference_Face */ - /* */ - /* <Description> */ - /* A counter gets initialized to~1 at the time an @FT_Face structure */ - /* is created. This function increments the counter. @FT_Done_Face */ - /* then only destroys a face if the counter is~1, otherwise it simply */ - /* decrements the counter. */ - /* */ - /* This function helps in managing life-cycles of structures which */ - /* reference @FT_Face objects. */ - /* */ - /* <Input> */ - /* face :: A handle to a target face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Since> */ - /* 2.4.2 */ - /* */ - FT_EXPORT( FT_Error ) - FT_Reference_Face( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_Face */ - /* */ - /* <Description> */ - /* Discard a given face object, as well as all of its child slots and */ - /* sizes. */ - /* */ - /* <Input> */ - /* face :: A handle to a target face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* See the discussion of reference counters in the description of */ - /* @FT_Reference_Face. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Done_Face( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Select_Size */ - /* */ - /* <Description> */ - /* Select a bitmap strike. */ - /* */ - /* <InOut> */ - /* face :: A handle to a target face object. */ - /* */ - /* <Input> */ - /* strike_index :: The index of the bitmap strike in the */ - /* `available_sizes' field of @FT_FaceRec structure. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Select_Size( FT_Face face, - FT_Int strike_index ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Size_Request_Type */ - /* */ - /* <Description> */ - /* An enumeration type that lists the supported size request types. */ - /* */ - /* <Values> */ - /* FT_SIZE_REQUEST_TYPE_NOMINAL :: */ - /* The nominal size. The `units_per_EM' field of @FT_FaceRec is */ - /* used to determine both scaling values. */ - /* */ - /* FT_SIZE_REQUEST_TYPE_REAL_DIM :: */ - /* The real dimension. The sum of the the `Ascender' and (minus */ - /* of) the `Descender' fields of @FT_FaceRec are used to determine */ - /* both scaling values. */ - /* */ - /* FT_SIZE_REQUEST_TYPE_BBOX :: */ - /* The font bounding box. The width and height of the `bbox' field */ - /* of @FT_FaceRec are used to determine the horizontal and vertical */ - /* scaling value, respectively. */ - /* */ - /* FT_SIZE_REQUEST_TYPE_CELL :: */ - /* The `max_advance_width' field of @FT_FaceRec is used to */ - /* determine the horizontal scaling value; the vertical scaling */ - /* value is determined the same way as */ - /* @FT_SIZE_REQUEST_TYPE_REAL_DIM does. Finally, both scaling */ - /* values are set to the smaller one. This type is useful if you */ - /* want to specify the font size for, say, a window of a given */ - /* dimension and 80x24 cells. */ - /* */ - /* FT_SIZE_REQUEST_TYPE_SCALES :: */ - /* Specify the scaling values directly. */ - /* */ - /* <Note> */ - /* The above descriptions only apply to scalable formats. For bitmap */ - /* formats, the behaviour is up to the driver. */ - /* */ - /* See the note section of @FT_Size_Metrics if you wonder how size */ - /* requesting relates to scaling values. */ - /* */ - typedef enum FT_Size_Request_Type_ - { - FT_SIZE_REQUEST_TYPE_NOMINAL, - FT_SIZE_REQUEST_TYPE_REAL_DIM, - FT_SIZE_REQUEST_TYPE_BBOX, - FT_SIZE_REQUEST_TYPE_CELL, - FT_SIZE_REQUEST_TYPE_SCALES, - - FT_SIZE_REQUEST_TYPE_MAX - - } FT_Size_Request_Type; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Size_RequestRec */ - /* */ - /* <Description> */ - /* A structure used to model a size request. */ - /* */ - /* <Fields> */ - /* type :: See @FT_Size_Request_Type. */ - /* */ - /* width :: The desired width. */ - /* */ - /* height :: The desired height. */ - /* */ - /* horiResolution :: The horizontal resolution. If set to zero, */ - /* `width' is treated as a 26.6 fractional pixel */ - /* value. */ - /* */ - /* vertResolution :: The vertical resolution. If set to zero, */ - /* `height' is treated as a 26.6 fractional pixel */ - /* value. */ - /* */ - /* <Note> */ - /* If `width' is zero, then the horizontal scaling value is set equal */ - /* to the vertical scaling value, and vice versa. */ - /* */ - typedef struct FT_Size_RequestRec_ - { - FT_Size_Request_Type type; - FT_Long width; - FT_Long height; - FT_UInt horiResolution; - FT_UInt vertResolution; - - } FT_Size_RequestRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Size_Request */ - /* */ - /* <Description> */ - /* A handle to a size request structure. */ - /* */ - typedef struct FT_Size_RequestRec_ *FT_Size_Request; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Request_Size */ - /* */ - /* <Description> */ - /* Resize the scale of the active @FT_Size object in a face. */ - /* */ - /* <InOut> */ - /* face :: A handle to a target face object. */ - /* */ - /* <Input> */ - /* req :: A pointer to a @FT_Size_RequestRec. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* Although drivers may select the bitmap strike matching the */ - /* request, you should not rely on this if you intend to select a */ - /* particular bitmap strike. Use @FT_Select_Size instead in that */ - /* case. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Request_Size( FT_Face face, - FT_Size_Request req ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Char_Size */ - /* */ - /* <Description> */ - /* This function calls @FT_Request_Size to request the nominal size */ - /* (in points). */ - /* */ - /* <InOut> */ - /* face :: A handle to a target face object. */ - /* */ - /* <Input> */ - /* char_width :: The nominal width, in 26.6 fractional points. */ - /* */ - /* char_height :: The nominal height, in 26.6 fractional points. */ - /* */ - /* horz_resolution :: The horizontal resolution in dpi. */ - /* */ - /* vert_resolution :: The vertical resolution in dpi. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* If either the character width or height is zero, it is set equal */ - /* to the other value. */ - /* */ - /* If either the horizontal or vertical resolution is zero, it is set */ - /* equal to the other value. */ - /* */ - /* A character width or height smaller than 1pt is set to 1pt; if */ - /* both resolution values are zero, they are set to 72dpi. */ - /* */ - /* Don't use this function if you are using the FreeType cache API. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_Char_Size( FT_Face face, - FT_F26Dot6 char_width, - FT_F26Dot6 char_height, - FT_UInt horz_resolution, - FT_UInt vert_resolution ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Pixel_Sizes */ - /* */ - /* <Description> */ - /* This function calls @FT_Request_Size to request the nominal size */ - /* (in pixels). */ - /* */ - /* <InOut> */ - /* face :: A handle to the target face object. */ - /* */ - /* <Input> */ - /* pixel_width :: The nominal width, in pixels. */ - /* */ - /* pixel_height :: The nominal height, in pixels. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_Pixel_Sizes( FT_Face face, - FT_UInt pixel_width, - FT_UInt pixel_height ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Load_Glyph */ - /* */ - /* <Description> */ - /* A function used to load a single glyph into the glyph slot of a */ - /* face object. */ - /* */ - /* <InOut> */ - /* face :: A handle to the target face object where the glyph */ - /* is loaded. */ - /* */ - /* <Input> */ - /* glyph_index :: The index of the glyph in the font file. For */ - /* CID-keyed fonts (either in PS or in CFF format) */ - /* this argument specifies the CID value. */ - /* */ - /* load_flags :: A flag indicating what to load for this glyph. The */ - /* @FT_LOAD_XXX constants can be used to control the */ - /* glyph loading process (e.g., whether the outline */ - /* should be scaled, whether to load bitmaps or not, */ - /* whether to hint the outline, etc). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The loaded glyph may be transformed. See @FT_Set_Transform for */ - /* the details. */ - /* */ - /* For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is */ - /* returned for invalid CID values (this is, for CID values which */ - /* don't have a corresponding glyph in the font). See the discussion */ - /* of the @FT_FACE_FLAG_CID_KEYED flag for more details. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Load_Glyph( FT_Face face, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Load_Char */ - /* */ - /* <Description> */ - /* A function used to load a single glyph into the glyph slot of a */ - /* face object, according to its character code. */ - /* */ - /* <InOut> */ - /* face :: A handle to a target face object where the glyph */ - /* is loaded. */ - /* */ - /* <Input> */ - /* char_code :: The glyph's character code, according to the */ - /* current charmap used in the face. */ - /* */ - /* load_flags :: A flag indicating what to load for this glyph. The */ - /* @FT_LOAD_XXX constants can be used to control the */ - /* glyph loading process (e.g., whether the outline */ - /* should be scaled, whether to load bitmaps or not, */ - /* whether to hint the outline, etc). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Load_Char( FT_Face face, - FT_ULong char_code, - FT_Int32 load_flags ); - - - /************************************************************************* - * - * @enum: - * FT_LOAD_XXX - * - * @description: - * A list of bit-field constants used with @FT_Load_Glyph to indicate - * what kind of operations to perform during glyph loading. - * - * @values: - * FT_LOAD_DEFAULT :: - * Corresponding to~0, this value is used as the default glyph load - * operation. In this case, the following happens: - * - * 1. FreeType looks for a bitmap for the glyph corresponding to the - * face's current size. If one is found, the function returns. - * The bitmap data can be accessed from the glyph slot (see note - * below). - * - * 2. If no embedded bitmap is searched or found, FreeType looks for a - * scalable outline. If one is found, it is loaded from the font - * file, scaled to device pixels, then `hinted' to the pixel grid - * in order to optimize it. The outline data can be accessed from - * the glyph slot (see note below). - * - * Note that by default, the glyph loader doesn't render outlines into - * bitmaps. The following flags are used to modify this default - * behaviour to more specific and useful cases. - * - * FT_LOAD_NO_SCALE :: - * Don't scale the outline glyph loaded, but keep it in font units. - * - * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and - * unsets @FT_LOAD_RENDER. - * - * FT_LOAD_NO_HINTING :: - * Disable hinting. This generally generates `blurrier' bitmap glyph - * when the glyph is rendered in any of the anti-aliased modes. See - * also the note below. - * - * This flag is implied by @FT_LOAD_NO_SCALE. - * - * FT_LOAD_RENDER :: - * Call @FT_Render_Glyph after the glyph is loaded. By default, the - * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be - * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME. - * - * This flag is unset by @FT_LOAD_NO_SCALE. - * - * FT_LOAD_NO_BITMAP :: - * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this - * flag. - * - * @FT_LOAD_NO_SCALE always sets this flag. - * - * FT_LOAD_VERTICAL_LAYOUT :: - * Load the glyph for vertical text layout. _Don't_ use it as it is - * problematic currently. - * - * FT_LOAD_FORCE_AUTOHINT :: - * Indicates that the auto-hinter is preferred over the font's native - * hinter. See also the note below. - * - * FT_LOAD_CROP_BITMAP :: - * Indicates that the font driver should crop the loaded bitmap glyph - * (i.e., remove all space around its black bits). Not all drivers - * implement this. - * - * FT_LOAD_PEDANTIC :: - * Indicates that the font driver should perform pedantic verifications - * during glyph loading. This is mostly used to detect broken glyphs - * in fonts. By default, FreeType tries to handle broken fonts also. - * - * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH :: - * Indicates that the font driver should ignore the global advance - * width defined in the font. By default, that value is used as the - * advance width for all glyphs when the face has - * @FT_FACE_FLAG_FIXED_WIDTH set. - * - * This flag exists for historical reasons (to support buggy CJK - * fonts). - * - * FT_LOAD_NO_RECURSE :: - * This flag is only used internally. It merely indicates that the - * font driver should not load composite glyphs recursively. Instead, - * it should set the `num_subglyph' and `subglyphs' values of the - * glyph slot accordingly, and set `glyph->format' to - * @FT_GLYPH_FORMAT_COMPOSITE. - * - * The description of sub-glyphs is not available to client - * applications for now. - * - * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM. - * - * FT_LOAD_IGNORE_TRANSFORM :: - * Indicates that the transform matrix set by @FT_Set_Transform should - * be ignored. - * - * FT_LOAD_MONOCHROME :: - * This flag is used with @FT_LOAD_RENDER to indicate that you want to - * render an outline glyph to a 1-bit monochrome bitmap glyph, with - * 8~pixels packed into each byte of the bitmap data. - * - * Note that this has no effect on the hinting algorithm used. You - * should rather use @FT_LOAD_TARGET_MONO so that the - * monochrome-optimized hinting algorithm is used. - * - * FT_LOAD_LINEAR_DESIGN :: - * Indicates that the `linearHoriAdvance' and `linearVertAdvance' - * fields of @FT_GlyphSlotRec should be kept in font units. See - * @FT_GlyphSlotRec for details. - * - * FT_LOAD_NO_AUTOHINT :: - * Disable auto-hinter. See also the note below. - * - * @note: - * By default, hinting is enabled and the font's native hinter (see - * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can - * disable hinting by setting @FT_LOAD_NO_HINTING or change the - * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set - * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be - * used at all. - * - * See the description of @FT_FACE_FLAG_TRICKY for a special exception - * (affecting only a handful of Asian fonts). - * - * Besides deciding which hinter to use, you can also decide which - * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details. - * - */ -#define FT_LOAD_DEFAULT 0x0 -#define FT_LOAD_NO_SCALE 0x1 -#define FT_LOAD_NO_HINTING 0x2 -#define FT_LOAD_RENDER 0x4 -#define FT_LOAD_NO_BITMAP 0x8 -#define FT_LOAD_VERTICAL_LAYOUT 0x10 -#define FT_LOAD_FORCE_AUTOHINT 0x20 -#define FT_LOAD_CROP_BITMAP 0x40 -#define FT_LOAD_PEDANTIC 0x80 -#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH 0x200 -#define FT_LOAD_NO_RECURSE 0x400 -#define FT_LOAD_IGNORE_TRANSFORM 0x800 -#define FT_LOAD_MONOCHROME 0x1000 -#define FT_LOAD_LINEAR_DESIGN 0x2000 -#define FT_LOAD_NO_AUTOHINT 0x8000U - - /* */ - - /* used internally only by certain font drivers! */ -#define FT_LOAD_ADVANCE_ONLY 0x100 -#define FT_LOAD_SBITS_ONLY 0x4000 - - - /************************************************************************** - * - * @enum: - * FT_LOAD_TARGET_XXX - * - * @description: - * A list of values that are used to select a specific hinting algorithm - * to use by the hinter. You should OR one of these values to your - * `load_flags' when calling @FT_Load_Glyph. - * - * Note that font's native hinters may ignore the hinting algorithm you - * have specified (e.g., the TrueType bytecode interpreter). You can set - * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used. - * - * Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it - * always implies @FT_LOAD_FORCE_AUTOHINT. - * - * @values: - * FT_LOAD_TARGET_NORMAL :: - * This corresponds to the default hinting algorithm, optimized for - * standard gray-level rendering. For monochrome output, use - * @FT_LOAD_TARGET_MONO instead. - * - * FT_LOAD_TARGET_LIGHT :: - * A lighter hinting algorithm for non-monochrome modes. Many - * generated glyphs are more fuzzy but better resemble its original - * shape. A bit like rendering on Mac OS~X. - * - * As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT. - * - * FT_LOAD_TARGET_MONO :: - * Strong hinting algorithm that should only be used for monochrome - * output. The result is probably unpleasant if the glyph is rendered - * in non-monochrome modes. - * - * FT_LOAD_TARGET_LCD :: - * A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally - * decimated LCD displays. - * - * FT_LOAD_TARGET_LCD_V :: - * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically - * decimated LCD displays. - * - * @note: - * You should use only _one_ of the FT_LOAD_TARGET_XXX values in your - * `load_flags'. They can't be ORed. - * - * If @FT_LOAD_RENDER is also set, the glyph is rendered in the - * corresponding mode (i.e., the mode which matches the used algorithm - * best) unless @FT_LOAD_MONOCHROME is set. - * - * You can use a hinting algorithm that doesn't correspond to the same - * rendering mode. As an example, it is possible to use the `light' - * hinting algorithm and have the results rendered in horizontal LCD - * pixel mode, with code like - * - * { - * FT_Load_Glyph( face, glyph_index, - * load_flags | FT_LOAD_TARGET_LIGHT ); - * - * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); - * } - * - */ -#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) - -#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) -#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) -#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) -#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ) -#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ) - - - /************************************************************************** - * - * @macro: - * FT_LOAD_TARGET_MODE - * - * @description: - * Return the @FT_Render_Mode corresponding to a given - * @FT_LOAD_TARGET_XXX value. - * - */ -#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Transform */ - /* */ - /* <Description> */ - /* A function used to set the transformation that is applied to glyph */ - /* images when they are loaded into a glyph slot through */ - /* @FT_Load_Glyph. */ - /* */ - /* <InOut> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Input> */ - /* matrix :: A pointer to the transformation's 2x2 matrix. Use~0 for */ - /* the identity matrix. */ - /* delta :: A pointer to the translation vector. Use~0 for the null */ - /* vector. */ - /* */ - /* <Note> */ - /* The transformation is only applied to scalable image formats after */ - /* the glyph has been loaded. It means that hinting is unaltered by */ - /* the transformation and is performed on the character size given in */ - /* the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. */ - /* */ - /* Note that this also transforms the `face.glyph.advance' field, but */ - /* *not* the values in `face.glyph.metrics'. */ - /* */ - FT_EXPORT( void ) - FT_Set_Transform( FT_Face face, - FT_Matrix* matrix, - FT_Vector* delta ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Render_Mode */ - /* */ - /* <Description> */ - /* An enumeration type that lists the render modes supported by */ - /* FreeType~2. Each mode corresponds to a specific type of scanline */ - /* conversion performed on the outline. */ - /* */ - /* For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode' */ - /* field in the @FT_GlyphSlotRec structure gives the format of the */ - /* returned bitmap. */ - /* */ - /* All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity. */ - /* */ - /* <Values> */ - /* FT_RENDER_MODE_NORMAL :: */ - /* This is the default render mode; it corresponds to 8-bit */ - /* anti-aliased bitmaps. */ - /* */ - /* FT_RENDER_MODE_LIGHT :: */ - /* This is equivalent to @FT_RENDER_MODE_NORMAL. It is only */ - /* defined as a separate value because render modes are also used */ - /* indirectly to define hinting algorithm selectors. See */ - /* @FT_LOAD_TARGET_XXX for details. */ - /* */ - /* FT_RENDER_MODE_MONO :: */ - /* This mode corresponds to 1-bit bitmaps (with 2~levels of */ - /* opacity). */ - /* */ - /* FT_RENDER_MODE_LCD :: */ - /* This mode corresponds to horizontal RGB and BGR sub-pixel */ - /* displays like LCD screens. It produces 8-bit bitmaps that are */ - /* 3~times the width of the original glyph outline in pixels, and */ - /* which use the @FT_PIXEL_MODE_LCD mode. */ - /* */ - /* FT_RENDER_MODE_LCD_V :: */ - /* This mode corresponds to vertical RGB and BGR sub-pixel displays */ - /* (like PDA screens, rotated LCD displays, etc.). It produces */ - /* 8-bit bitmaps that are 3~times the height of the original */ - /* glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode. */ - /* */ - /* <Note> */ - /* The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */ - /* filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */ - /* (not active in the default builds). It is up to the caller to */ - /* either call @FT_Library_SetLcdFilter (if available) or do the */ - /* filtering itself. */ - /* */ - /* The selected render mode only affects vector glyphs of a font. */ - /* Embedded bitmaps often have a different pixel mode like */ - /* @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform */ - /* them into 8-bit pixmaps. */ - /* */ - typedef enum FT_Render_Mode_ - { - FT_RENDER_MODE_NORMAL = 0, - FT_RENDER_MODE_LIGHT, - FT_RENDER_MODE_MONO, - FT_RENDER_MODE_LCD, - FT_RENDER_MODE_LCD_V, - - FT_RENDER_MODE_MAX - - } FT_Render_Mode; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* ft_render_mode_xxx */ - /* */ - /* <Description> */ - /* These constants are deprecated. Use the corresponding */ - /* @FT_Render_Mode values instead. */ - /* */ - /* <Values> */ - /* ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL */ - /* ft_render_mode_mono :: see @FT_RENDER_MODE_MONO */ - /* */ -#define ft_render_mode_normal FT_RENDER_MODE_NORMAL -#define ft_render_mode_mono FT_RENDER_MODE_MONO - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Render_Glyph */ - /* */ - /* <Description> */ - /* Convert a given glyph image to a bitmap. It does so by inspecting */ - /* the glyph image format, finding the relevant renderer, and */ - /* invoking it. */ - /* */ - /* <InOut> */ - /* slot :: A handle to the glyph slot containing the image to */ - /* convert. */ - /* */ - /* <Input> */ - /* render_mode :: This is the render mode used to render the glyph */ - /* image into a bitmap. See @FT_Render_Mode for a */ - /* list of possible values. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Render_Glyph( FT_GlyphSlot slot, - FT_Render_Mode render_mode ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Kerning_Mode */ - /* */ - /* <Description> */ - /* An enumeration used to specify which kerning values to return in */ - /* @FT_Get_Kerning. */ - /* */ - /* <Values> */ - /* FT_KERNING_DEFAULT :: Return scaled and grid-fitted kerning */ - /* distances (value is~0). */ - /* */ - /* FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning */ - /* distances. */ - /* */ - /* FT_KERNING_UNSCALED :: Return the kerning vector in original font */ - /* units. */ - /* */ - typedef enum FT_Kerning_Mode_ - { - FT_KERNING_DEFAULT = 0, - FT_KERNING_UNFITTED, - FT_KERNING_UNSCALED - - } FT_Kerning_Mode; - - - /*************************************************************************/ - /* */ - /* <Const> */ - /* ft_kerning_default */ - /* */ - /* <Description> */ - /* This constant is deprecated. Please use @FT_KERNING_DEFAULT */ - /* instead. */ - /* */ -#define ft_kerning_default FT_KERNING_DEFAULT - - - /*************************************************************************/ - /* */ - /* <Const> */ - /* ft_kerning_unfitted */ - /* */ - /* <Description> */ - /* This constant is deprecated. Please use @FT_KERNING_UNFITTED */ - /* instead. */ - /* */ -#define ft_kerning_unfitted FT_KERNING_UNFITTED - - - /*************************************************************************/ - /* */ - /* <Const> */ - /* ft_kerning_unscaled */ - /* */ - /* <Description> */ - /* This constant is deprecated. Please use @FT_KERNING_UNSCALED */ - /* instead. */ - /* */ -#define ft_kerning_unscaled FT_KERNING_UNSCALED - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Kerning */ - /* */ - /* <Description> */ - /* Return the kerning vector between two glyphs of a same face. */ - /* */ - /* <Input> */ - /* face :: A handle to a source face object. */ - /* */ - /* left_glyph :: The index of the left glyph in the kern pair. */ - /* */ - /* right_glyph :: The index of the right glyph in the kern pair. */ - /* */ - /* kern_mode :: See @FT_Kerning_Mode for more information. */ - /* Determines the scale and dimension of the returned */ - /* kerning vector. */ - /* */ - /* <Output> */ - /* akerning :: The kerning vector. This is either in font units */ - /* or in pixels (26.6 format) for scalable formats, */ - /* and in pixels for fixed-sizes formats. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* Only horizontal layouts (left-to-right & right-to-left) are */ - /* supported by this method. Other layouts, or more sophisticated */ - /* kernings, are out of the scope of this API function -- they can be */ - /* implemented through format-specific interfaces. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Kerning( FT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph, - FT_UInt kern_mode, - FT_Vector *akerning ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Track_Kerning */ - /* */ - /* <Description> */ - /* Return the track kerning for a given face object at a given size. */ - /* */ - /* <Input> */ - /* face :: A handle to a source face object. */ - /* */ - /* point_size :: The point size in 16.16 fractional points. */ - /* */ - /* degree :: The degree of tightness. */ - /* */ - /* <Output> */ - /* akerning :: The kerning in 16.16 fractional points. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Track_Kerning( FT_Face face, - FT_Fixed point_size, - FT_Int degree, - FT_Fixed* akerning ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Glyph_Name */ - /* */ - /* <Description> */ - /* Retrieve the ASCII name of a given glyph in a face. This only */ - /* works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1. */ - /* */ - /* <Input> */ - /* face :: A handle to a source face object. */ - /* */ - /* glyph_index :: The glyph index. */ - /* */ - /* buffer_max :: The maximal number of bytes available in the */ - /* buffer. */ - /* */ - /* <Output> */ - /* buffer :: A pointer to a target buffer where the name is */ - /* copied to. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* An error is returned if the face doesn't provide glyph names or if */ - /* the glyph index is invalid. In all cases of failure, the first */ - /* byte of `buffer' is set to~0 to indicate an empty name. */ - /* */ - /* The glyph name is truncated to fit within the buffer if it is too */ - /* long. The returned string is always zero-terminated. */ - /* */ - /* This function is not compiled within the library if the config */ - /* macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in */ - /* `include/freetype/config/ftoptions.h'. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Glyph_Name( FT_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Postscript_Name */ - /* */ - /* <Description> */ - /* Retrieve the ASCII PostScript name of a given face, if available. */ - /* This only works with PostScript and TrueType fonts. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Return> */ - /* A pointer to the face's PostScript name. NULL if unavailable. */ - /* */ - /* <Note> */ - /* The returned pointer is owned by the face and is destroyed with */ - /* it. */ - /* */ - FT_EXPORT( const char* ) - FT_Get_Postscript_Name( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Select_Charmap */ - /* */ - /* <Description> */ - /* Select a given charmap by its encoding tag (as listed in */ - /* `freetype.h'). */ - /* */ - /* <InOut> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Input> */ - /* encoding :: A handle to the selected encoding. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* This function returns an error if no charmap in the face */ - /* corresponds to the encoding queried here. */ - /* */ - /* Because many fonts contain more than a single cmap for Unicode */ - /* encoding, this function has some special code to select the one */ - /* which covers Unicode best (`best' in the sense that a UCS-4 cmap */ - /* is preferred to a UCS-2 cmap). It is thus preferable to */ - /* @FT_Set_Charmap in this case. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Select_Charmap( FT_Face face, - FT_Encoding encoding ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Charmap */ - /* */ - /* <Description> */ - /* Select a given charmap for character code to glyph index mapping. */ - /* */ - /* <InOut> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Input> */ - /* charmap :: A handle to the selected charmap. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* This function returns an error if the charmap is not part of */ - /* the face (i.e., if it is not listed in the `face->charmaps' */ - /* table). */ - /* */ - /* It also fails if a type~14 charmap is selected. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_Charmap( FT_Face face, - FT_CharMap charmap ); - - - /************************************************************************* - * - * @function: - * FT_Get_Charmap_Index - * - * @description: - * Retrieve index of a given charmap. - * - * @input: - * charmap :: - * A handle to a charmap. - * - * @return: - * The index into the array of character maps within the face to which - * `charmap' belongs. If an error occurs, -1 is returned. - * - */ - FT_EXPORT( FT_Int ) - FT_Get_Charmap_Index( FT_CharMap charmap ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Char_Index */ - /* */ - /* <Description> */ - /* Return the glyph index of a given character code. This function */ - /* uses a charmap object to do the mapping. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* charcode :: The character code. */ - /* */ - /* <Return> */ - /* The glyph index. 0~means `undefined character code'. */ - /* */ - /* <Note> */ - /* If you use FreeType to manipulate the contents of font files */ - /* directly, be aware that the glyph index returned by this function */ - /* doesn't always correspond to the internal indices used within */ - /* the file. This is done to ensure that value~0 always corresponds */ - /* to the `missing glyph'. */ - /* */ - FT_EXPORT( FT_UInt ) - FT_Get_Char_Index( FT_Face face, - FT_ULong charcode ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_First_Char */ - /* */ - /* <Description> */ - /* This function is used to return the first character code in the */ - /* current charmap of a given face. It also returns the */ - /* corresponding glyph index. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Output> */ - /* agindex :: Glyph index of first character code. 0~if charmap is */ - /* empty. */ - /* */ - /* <Return> */ - /* The charmap's first character code. */ - /* */ - /* <Note> */ - /* You should use this function with @FT_Get_Next_Char to be able to */ - /* parse all character codes available in a given charmap. The code */ - /* should look like this: */ - /* */ - /* { */ - /* FT_ULong charcode; */ - /* FT_UInt gindex; */ - /* */ - /* */ - /* charcode = FT_Get_First_Char( face, &gindex ); */ - /* while ( gindex != 0 ) */ - /* { */ - /* ... do something with (charcode,gindex) pair ... */ - /* */ - /* charcode = FT_Get_Next_Char( face, charcode, &gindex ); */ - /* } */ - /* } */ - /* */ - /* Note that `*agindex' is set to~0 if the charmap is empty. The */ - /* result itself can be~0 in two cases: if the charmap is empty or */ - /* if the value~0 is the first valid character code. */ - /* */ - FT_EXPORT( FT_ULong ) - FT_Get_First_Char( FT_Face face, - FT_UInt *agindex ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Next_Char */ - /* */ - /* <Description> */ - /* This function is used to return the next character code in the */ - /* current charmap of a given face following the value `char_code', */ - /* as well as the corresponding glyph index. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* char_code :: The starting character code. */ - /* */ - /* <Output> */ - /* agindex :: Glyph index of next character code. 0~if charmap */ - /* is empty. */ - /* */ - /* <Return> */ - /* The charmap's next character code. */ - /* */ - /* <Note> */ - /* You should use this function with @FT_Get_First_Char to walk */ - /* over all character codes available in a given charmap. See the */ - /* note for this function for a simple code example. */ - /* */ - /* Note that `*agindex' is set to~0 when there are no more codes in */ - /* the charmap. */ - /* */ - FT_EXPORT( FT_ULong ) - FT_Get_Next_Char( FT_Face face, - FT_ULong char_code, - FT_UInt *agindex ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Name_Index */ - /* */ - /* <Description> */ - /* Return the glyph index of a given glyph name. This function uses */ - /* driver specific objects to do the translation. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* glyph_name :: The glyph name. */ - /* */ - /* <Return> */ - /* The glyph index. 0~means `undefined character code'. */ - /* */ - FT_EXPORT( FT_UInt ) - FT_Get_Name_Index( FT_Face face, - FT_String* glyph_name ); - - - /************************************************************************* - * - * @macro: - * FT_SUBGLYPH_FLAG_XXX - * - * @description: - * A list of constants used to describe subglyphs. Please refer to the - * TrueType specification for the meaning of the various flags. - * - * @values: - * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS :: - * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES :: - * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID :: - * FT_SUBGLYPH_FLAG_SCALE :: - * FT_SUBGLYPH_FLAG_XY_SCALE :: - * FT_SUBGLYPH_FLAG_2X2 :: - * FT_SUBGLYPH_FLAG_USE_MY_METRICS :: - * - */ -#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 -#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 -#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 -#define FT_SUBGLYPH_FLAG_SCALE 8 -#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 -#define FT_SUBGLYPH_FLAG_2X2 0x80 -#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 - - - /************************************************************************* - * - * @func: - * FT_Get_SubGlyph_Info - * - * @description: - * Retrieve a description of a given subglyph. Only use it if - * `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is - * returned otherwise. - * - * @input: - * glyph :: - * The source glyph slot. - * - * sub_index :: - * The index of the subglyph. Must be less than - * `glyph->num_subglyphs'. - * - * @output: - * p_index :: - * The glyph index of the subglyph. - * - * p_flags :: - * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX. - * - * p_arg1 :: - * The subglyph's first argument (if any). - * - * p_arg2 :: - * The subglyph's second argument (if any). - * - * p_transform :: - * The subglyph transformation (if any). - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The values of `*p_arg1', `*p_arg2', and `*p_transform' must be - * interpreted depending on the flags returned in `*p_flags'. See the - * TrueType specification for details. - * - */ - FT_EXPORT( FT_Error ) - FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, - FT_UInt sub_index, - FT_Int *p_index, - FT_UInt *p_flags, - FT_Int *p_arg1, - FT_Int *p_arg2, - FT_Matrix *p_transform ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_FSTYPE_XXX */ - /* */ - /* <Description> */ - /* A list of bit flags used in the `fsType' field of the OS/2 table */ - /* in a TrueType or OpenType font and the `FSType' entry in a */ - /* PostScript font. These bit flags are returned by */ - /* @FT_Get_FSType_Flags; they inform client applications of embedding */ - /* and subsetting restrictions associated with a font. */ - /* */ - /* See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for */ - /* more details. */ - /* */ - /* <Values> */ - /* FT_FSTYPE_INSTALLABLE_EMBEDDING :: */ - /* Fonts with no fsType bit set may be embedded and permanently */ - /* installed on the remote system by an application. */ - /* */ - /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: */ - /* Fonts that have only this bit set must not be modified, embedded */ - /* or exchanged in any manner without first obtaining permission of */ - /* the font software copyright owner. */ - /* */ - /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: */ - /* If this bit is set, the font may be embedded and temporarily */ - /* loaded on the remote system. Documents containing Preview & */ - /* Print fonts must be opened `read-only'; no edits can be applied */ - /* to the document. */ - /* */ - /* FT_FSTYPE_EDITABLE_EMBEDDING :: */ - /* If this bit is set, the font may be embedded but must only be */ - /* installed temporarily on other systems. In contrast to Preview */ - /* & Print fonts, documents containing editable fonts may be opened */ - /* for reading, editing is permitted, and changes may be saved. */ - /* */ - /* FT_FSTYPE_NO_SUBSETTING :: */ - /* If this bit is set, the font may not be subsetted prior to */ - /* embedding. */ - /* */ - /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: */ - /* If this bit is set, only bitmaps contained in the font may be */ - /* embedded; no outline data may be embedded. If there are no */ - /* bitmaps available in the font, then the font is unembeddable. */ - /* */ - /* <Note> */ - /* While the fsType flags can indicate that a font may be embedded, a */ - /* license with the font vendor may be separately required to use the */ - /* font in this way. */ - /* */ -#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000 -#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002 -#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004 -#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008 -#define FT_FSTYPE_NO_SUBSETTING 0x0100 -#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200 - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_FSType_Flags */ - /* */ - /* <Description> */ - /* Return the fsType flags for a font. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Return> */ - /* The fsType flags, @FT_FSTYPE_XXX. */ - /* */ - /* <Note> */ - /* Use this function rather than directly reading the `fs_type' field */ - /* in the @PS_FontInfoRec structure which is only guaranteed to */ - /* return the correct results for Type~1 fonts. */ - /* */ - FT_EXPORT( FT_UShort ) - FT_Get_FSType_Flags( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* glyph_variants */ - /* */ - /* <Title> */ - /* Glyph Variants */ - /* */ - /* <Abstract> */ - /* The FreeType~2 interface to Unicode Ideographic Variation */ - /* Sequences (IVS), using the SFNT cmap format~14. */ - /* */ - /* <Description> */ - /* Many CJK characters have variant forms. They are a sort of grey */ - /* area somewhere between being totally irrelevant and semantically */ - /* distinct; for this reason, the Unicode consortium decided to */ - /* introduce Ideographic Variation Sequences (IVS), consisting of a */ - /* Unicode base character and one of 240 variant selectors */ - /* (U+E0100-U+E01EF), instead of further extending the already huge */ - /* code range for CJK characters. */ - /* */ - /* An IVS is registered and unique; for further details please refer */ - /* to Unicode Technical Report #37, the Ideographic Variation */ - /* Database. To date (October 2007), the character with the most */ - /* variants is U+908A, having 8~such IVS. */ - /* */ - /* Adobe and MS decided to support IVS with a new cmap subtable */ - /* (format~14). It is an odd subtable because it is not a mapping of */ - /* input code points to glyphs, but contains lists of all variants */ - /* supported by the font. */ - /* */ - /* A variant may be either `default' or `non-default'. A default */ - /* variant is the one you will get for that code point if you look it */ - /* up in the standard Unicode cmap. A non-default variant is a */ - /* different glyph. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_GetCharVariantIndex */ - /* */ - /* <Description> */ - /* Return the glyph index of a given character code as modified by */ - /* the variation selector. */ - /* */ - /* <Input> */ - /* face :: */ - /* A handle to the source face object. */ - /* */ - /* charcode :: */ - /* The character code point in Unicode. */ - /* */ - /* variantSelector :: */ - /* The Unicode code point of the variation selector. */ - /* */ - /* <Return> */ - /* The glyph index. 0~means either `undefined character code', or */ - /* `undefined selector code', or `no variation selector cmap */ - /* subtable', or `current CharMap is not Unicode'. */ - /* */ - /* <Note> */ - /* If you use FreeType to manipulate the contents of font files */ - /* directly, be aware that the glyph index returned by this function */ - /* doesn't always correspond to the internal indices used within */ - /* the file. This is done to ensure that value~0 always corresponds */ - /* to the `missing glyph'. */ - /* */ - /* This function is only meaningful if */ - /* a) the font has a variation selector cmap sub table, */ - /* and */ - /* b) the current charmap has a Unicode encoding. */ - /* */ - /* <Since> */ - /* 2.3.6 */ - /* */ - FT_EXPORT( FT_UInt ) - FT_Face_GetCharVariantIndex( FT_Face face, - FT_ULong charcode, - FT_ULong variantSelector ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_GetCharVariantIsDefault */ - /* */ - /* <Description> */ - /* Check whether this variant of this Unicode character is the one to */ - /* be found in the `cmap'. */ - /* */ - /* <Input> */ - /* face :: */ - /* A handle to the source face object. */ - /* */ - /* charcode :: */ - /* The character codepoint in Unicode. */ - /* */ - /* variantSelector :: */ - /* The Unicode codepoint of the variation selector. */ - /* */ - /* <Return> */ - /* 1~if found in the standard (Unicode) cmap, 0~if found in the */ - /* variation selector cmap, or -1 if it is not a variant. */ - /* */ - /* <Note> */ - /* This function is only meaningful if the font has a variation */ - /* selector cmap subtable. */ - /* */ - /* <Since> */ - /* 2.3.6 */ - /* */ - FT_EXPORT( FT_Int ) - FT_Face_GetCharVariantIsDefault( FT_Face face, - FT_ULong charcode, - FT_ULong variantSelector ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_GetVariantSelectors */ - /* */ - /* <Description> */ - /* Return a zero-terminated list of Unicode variant selectors found */ - /* in the font. */ - /* */ - /* <Input> */ - /* face :: */ - /* A handle to the source face object. */ - /* */ - /* <Return> */ - /* A pointer to an array of selector code points, or NULL if there is */ - /* no valid variant selector cmap subtable. */ - /* */ - /* <Note> */ - /* The last item in the array is~0; the array is owned by the */ - /* @FT_Face object but can be overwritten or released on the next */ - /* call to a FreeType function. */ - /* */ - /* <Since> */ - /* 2.3.6 */ - /* */ - FT_EXPORT( FT_UInt32* ) - FT_Face_GetVariantSelectors( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_GetVariantsOfChar */ - /* */ - /* <Description> */ - /* Return a zero-terminated list of Unicode variant selectors found */ - /* for the specified character code. */ - /* */ - /* <Input> */ - /* face :: */ - /* A handle to the source face object. */ - /* */ - /* charcode :: */ - /* The character codepoint in Unicode. */ - /* */ - /* <Return> */ - /* A pointer to an array of variant selector code points which are */ - /* active for the given character, or NULL if the corresponding list */ - /* is empty. */ - /* */ - /* <Note> */ - /* The last item in the array is~0; the array is owned by the */ - /* @FT_Face object but can be overwritten or released on the next */ - /* call to a FreeType function. */ - /* */ - /* <Since> */ - /* 2.3.6 */ - /* */ - FT_EXPORT( FT_UInt32* ) - FT_Face_GetVariantsOfChar( FT_Face face, - FT_ULong charcode ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_GetCharsOfVariant */ - /* */ - /* <Description> */ - /* Return a zero-terminated list of Unicode character codes found for */ - /* the specified variant selector. */ - /* */ - /* <Input> */ - /* face :: */ - /* A handle to the source face object. */ - /* */ - /* variantSelector :: */ - /* The variant selector code point in Unicode. */ - /* */ - /* <Return> */ - /* A list of all the code points which are specified by this selector */ - /* (both default and non-default codes are returned) or NULL if there */ - /* is no valid cmap or the variant selector is invalid. */ - /* */ - /* <Note> */ - /* The last item in the array is~0; the array is owned by the */ - /* @FT_Face object but can be overwritten or released on the next */ - /* call to a FreeType function. */ - /* */ - /* <Since> */ - /* 2.3.6 */ - /* */ - FT_EXPORT( FT_UInt32* ) - FT_Face_GetCharsOfVariant( FT_Face face, - FT_ULong variantSelector ); - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* computations */ - /* */ - /* <Title> */ - /* Computations */ - /* */ - /* <Abstract> */ - /* Crunching fixed numbers and vectors. */ - /* */ - /* <Description> */ - /* This section contains various functions used to perform */ - /* computations on 16.16 fixed-float numbers or 2d vectors. */ - /* */ - /* <Order> */ - /* FT_MulDiv */ - /* FT_MulFix */ - /* FT_DivFix */ - /* FT_RoundFix */ - /* FT_CeilFix */ - /* FT_FloorFix */ - /* FT_Vector_Transform */ - /* FT_Matrix_Multiply */ - /* FT_Matrix_Invert */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_MulDiv */ - /* */ - /* <Description> */ - /* A very simple function used to perform the computation `(a*b)/c' */ - /* with maximal accuracy (it uses a 64-bit intermediate integer */ - /* whenever necessary). */ - /* */ - /* This function isn't necessarily as fast as some processor specific */ - /* operations, but is at least completely portable. */ - /* */ - /* <Input> */ - /* a :: The first multiplier. */ - /* b :: The second multiplier. */ - /* c :: The divisor. */ - /* */ - /* <Return> */ - /* The result of `(a*b)/c'. This function never traps when trying to */ - /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ - /* on the signs of `a' and `b'. */ - /* */ - FT_EXPORT( FT_Long ) - FT_MulDiv( FT_Long a, - FT_Long b, - FT_Long c ); - - - /* */ - - /* The following #if 0 ... #endif is for the documentation formatter, */ - /* hiding the internal `FT_MULFIX_INLINED' macro. */ - -#if 0 - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_MulFix */ - /* */ - /* <Description> */ - /* A very simple function used to perform the computation */ - /* `(a*b)/0x10000' with maximal accuracy. Most of the time this is */ - /* used to multiply a given value by a 16.16 fixed float factor. */ - /* */ - /* <Input> */ - /* a :: The first multiplier. */ - /* b :: The second multiplier. Use a 16.16 factor here whenever */ - /* possible (see note below). */ - /* */ - /* <Return> */ - /* The result of `(a*b)/0x10000'. */ - /* */ - /* <Note> */ - /* This function has been optimized for the case where the absolute */ - /* value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */ - /* As this happens mainly when scaling from notional units to */ - /* fractional pixels in FreeType, it resulted in noticeable speed */ - /* improvements between versions 2.x and 1.x. */ - /* */ - /* As a conclusion, always try to place a 16.16 factor as the */ - /* _second_ argument of this function; this can make a great */ - /* difference. */ - /* */ - FT_EXPORT( FT_Long ) - FT_MulFix( FT_Long a, - FT_Long b ); - - /* */ -#endif - -#ifdef FT_MULFIX_INLINED -#define FT_MulFix( a, b ) FT_MULFIX_INLINED( a, b ) -#else - FT_EXPORT( FT_Long ) - FT_MulFix( FT_Long a, - FT_Long b ); -#endif - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_DivFix */ - /* */ - /* <Description> */ - /* A very simple function used to perform the computation */ - /* `(a*0x10000)/b' with maximal accuracy. Most of the time, this is */ - /* used to divide a given value by a 16.16 fixed float factor. */ - /* */ - /* <Input> */ - /* a :: The first multiplier. */ - /* b :: The second multiplier. Use a 16.16 factor here whenever */ - /* possible (see note below). */ - /* */ - /* <Return> */ - /* The result of `(a*0x10000)/b'. */ - /* */ - /* <Note> */ - /* The optimization for FT_DivFix() is simple: If (a~<<~16) fits in */ - /* 32~bits, then the division is computed directly. Otherwise, we */ - /* use a specialized version of @FT_MulDiv. */ - /* */ - FT_EXPORT( FT_Long ) - FT_DivFix( FT_Long a, - FT_Long b ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_RoundFix */ - /* */ - /* <Description> */ - /* A very simple function used to round a 16.16 fixed number. */ - /* */ - /* <Input> */ - /* a :: The number to be rounded. */ - /* */ - /* <Return> */ - /* The result of `(a + 0x8000) & -0x10000'. */ - /* */ - FT_EXPORT( FT_Fixed ) - FT_RoundFix( FT_Fixed a ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_CeilFix */ - /* */ - /* <Description> */ - /* A very simple function used to compute the ceiling function of a */ - /* 16.16 fixed number. */ - /* */ - /* <Input> */ - /* a :: The number for which the ceiling function is to be computed. */ - /* */ - /* <Return> */ - /* The result of `(a + 0x10000 - 1) & -0x10000'. */ - /* */ - FT_EXPORT( FT_Fixed ) - FT_CeilFix( FT_Fixed a ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_FloorFix */ - /* */ - /* <Description> */ - /* A very simple function used to compute the floor function of a */ - /* 16.16 fixed number. */ - /* */ - /* <Input> */ - /* a :: The number for which the floor function is to be computed. */ - /* */ - /* <Return> */ - /* The result of `a & -0x10000'. */ - /* */ - FT_EXPORT( FT_Fixed ) - FT_FloorFix( FT_Fixed a ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Vector_Transform */ - /* */ - /* <Description> */ - /* Transform a single vector through a 2x2 matrix. */ - /* */ - /* <InOut> */ - /* vector :: The target vector to transform. */ - /* */ - /* <Input> */ - /* matrix :: A pointer to the source 2x2 matrix. */ - /* */ - /* <Note> */ - /* The result is undefined if either `vector' or `matrix' is invalid. */ - /* */ - FT_EXPORT( void ) - FT_Vector_Transform( FT_Vector* vec, - const FT_Matrix* matrix ); - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* version */ - /* */ - /* <Title> */ - /* FreeType Version */ - /* */ - /* <Abstract> */ - /* Functions and macros related to FreeType versions. */ - /* */ - /* <Description> */ - /* Note that those functions and macros are of limited use because */ - /* even a new release of FreeType with only documentation changes */ - /* increases the version number. */ - /* */ - /*************************************************************************/ - - - /************************************************************************* - * - * @enum: - * FREETYPE_XXX - * - * @description: - * These three macros identify the FreeType source code version. - * Use @FT_Library_Version to access them at runtime. - * - * @values: - * FREETYPE_MAJOR :: The major version number. - * FREETYPE_MINOR :: The minor version number. - * FREETYPE_PATCH :: The patch level. - * - * @note: - * The version number of FreeType if built as a dynamic link library - * with the `libtool' package is _not_ controlled by these three - * macros. - * - */ -#define FREETYPE_MAJOR 2 -#define FREETYPE_MINOR 4 -#define FREETYPE_PATCH 2 - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Library_Version */ - /* */ - /* <Description> */ - /* Return the version of the FreeType library being used. This is */ - /* useful when dynamically linking to the library, since one cannot */ - /* use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and */ - /* @FREETYPE_PATCH. */ - /* */ - /* <Input> */ - /* library :: A source library handle. */ - /* */ - /* <Output> */ - /* amajor :: The major version number. */ - /* */ - /* aminor :: The minor version number. */ - /* */ - /* apatch :: The patch version number. */ - /* */ - /* <Note> */ - /* The reason why this function takes a `library' argument is because */ - /* certain programs implement library initialization in a custom way */ - /* that doesn't use @FT_Init_FreeType. */ - /* */ - /* In such cases, the library version might not be available before */ - /* the library object has been created. */ - /* */ - FT_EXPORT( void ) - FT_Library_Version( FT_Library library, - FT_Int *amajor, - FT_Int *aminor, - FT_Int *apatch ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_CheckTrueTypePatents */ - /* */ - /* <Description> */ - /* Parse all bytecode instructions of a TrueType font file to check */ - /* whether any of the patented opcodes are used. This is only useful */ - /* if you want to be able to use the unpatented hinter with */ - /* fonts that do *not* use these opcodes. */ - /* */ - /* Note that this function parses *all* glyph instructions in the */ - /* font file, which may be slow. */ - /* */ - /* <Input> */ - /* face :: A face handle. */ - /* */ - /* <Return> */ - /* 1~if this is a TrueType font that uses one of the patented */ - /* opcodes, 0~otherwise. */ - /* */ - /* <Note> */ - /* Since May 2010, TrueType hinting is no longer patented. */ - /* */ - /* <Since> */ - /* 2.3.5 */ - /* */ - FT_EXPORT( FT_Bool ) - FT_Face_CheckTrueTypePatents( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Face_SetUnpatentedHinting */ - /* */ - /* <Description> */ - /* Enable or disable the unpatented hinter for a given face. */ - /* Only enable it if you have determined that the face doesn't */ - /* use any patented opcodes (see @FT_Face_CheckTrueTypePatents). */ - /* */ - /* <Input> */ - /* face :: A face handle. */ - /* */ - /* value :: New boolean setting. */ - /* */ - /* <Return> */ - /* The old setting value. This will always be false if this is not */ - /* an SFNT font, or if the unpatented hinter is not compiled in this */ - /* instance of the library. */ - /* */ - /* <Note> */ - /* Since May 2010, TrueType hinting is no longer patented. */ - /* */ - /* <Since> */ - /* 2.3.5 */ - /* */ - FT_EXPORT( FT_Bool ) - FT_Face_SetUnpatentedHinting( FT_Face face, - FT_Bool value ); - - /* */ - - -FT_END_HEADER - -#endif /* __FREETYPE_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftadvanc.h b/android/jni/ndk_modules/freetype/include/freetype/ftadvanc.h deleted file mode 100644 index b2451bec..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftadvanc.h +++ /dev/null @@ -1,179 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftadvanc.h */ -/* */ -/* Quick computation of advance widths (specification only). */ -/* */ -/* Copyright 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTADVANC_H__ -#define __FTADVANC_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /************************************************************************** - * - * @section: - * quick_advance - * - * @title: - * Quick retrieval of advance values - * - * @abstract: - * Retrieve horizontal and vertical advance values without processing - * glyph outlines, if possible. - * - * @description: - * This section contains functions to quickly extract advance values - * without handling glyph outlines, if possible. - */ - - - /*************************************************************************/ - /* */ - /* <Const> */ - /* FT_ADVANCE_FLAG_FAST_ONLY */ - /* */ - /* <Description> */ - /* A bit-flag to be OR-ed with the `flags' parameter of the */ - /* @FT_Get_Advance and @FT_Get_Advances functions. */ - /* */ - /* If set, it indicates that you want these functions to fail if the */ - /* corresponding hinting mode or font driver doesn't allow for very */ - /* quick advance computation. */ - /* */ - /* Typically, glyphs which are either unscaled, unhinted, bitmapped, */ - /* or light-hinted can have their advance width computed very */ - /* quickly. */ - /* */ - /* Normal and bytecode hinted modes, which require loading, scaling, */ - /* and hinting of the glyph outline, are extremely slow by */ - /* comparison. */ - /* */ -#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000UL - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Advance */ - /* */ - /* <Description> */ - /* Retrieve the advance value of a given glyph outline in an */ - /* @FT_Face. By default, the unhinted advance is returned in font */ - /* units. */ - /* */ - /* <Input> */ - /* face :: The source @FT_Face handle. */ - /* */ - /* gindex :: The glyph index. */ - /* */ - /* load_flags :: A set of bit flags similar to those used when */ - /* calling @FT_Load_Glyph, used to determine what kind */ - /* of advances you need. */ - /* <Output> */ - /* padvance :: The advance value, in either font units or 16.16 */ - /* format. */ - /* */ - /* If @FT_LOAD_VERTICAL_LAYOUT is set, this is the */ - /* vertical advance corresponding to a vertical layout. */ - /* Otherwise, it is the horizontal advance in a */ - /* horizontal layout. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */ - /* if the corresponding font backend doesn't have a quick way to */ - /* retrieve the advances. */ - /* */ - /* A scaled advance is returned in 16.16 format but isn't transformed */ - /* by the affine transformation specified by @FT_Set_Transform. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Advance( FT_Face face, - FT_UInt gindex, - FT_Int32 load_flags, - FT_Fixed *padvance ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Advances */ - /* */ - /* <Description> */ - /* Retrieve the advance values of several glyph outlines in an */ - /* @FT_Face. By default, the unhinted advances are returned in font */ - /* units. */ - /* */ - /* <Input> */ - /* face :: The source @FT_Face handle. */ - /* */ - /* start :: The first glyph index. */ - /* */ - /* count :: The number of advance values you want to retrieve. */ - /* */ - /* load_flags :: A set of bit flags similar to those used when */ - /* calling @FT_Load_Glyph. */ - /* */ - /* <Output> */ - /* padvance :: The advances, in either font units or 16.16 format. */ - /* This array must contain at least `count' elements. */ - /* */ - /* If @FT_LOAD_VERTICAL_LAYOUT is set, these are the */ - /* vertical advances corresponding to a vertical layout. */ - /* Otherwise, they are the horizontal advances in a */ - /* horizontal layout. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */ - /* if the corresponding font backend doesn't have a quick way to */ - /* retrieve the advances. */ - /* */ - /* Scaled advances are returned in 16.16 format but aren't */ - /* transformed by the affine transformation specified by */ - /* @FT_Set_Transform. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Advances( FT_Face face, - FT_UInt start, - FT_UInt count, - FT_Int32 load_flags, - FT_Fixed *padvances ); - -/* */ - - -FT_END_HEADER - -#endif /* __FTADVANC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftbbox.h b/android/jni/ndk_modules/freetype/include/freetype/ftbbox.h deleted file mode 100644 index 01fe3fb0..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftbbox.h +++ /dev/null @@ -1,94 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbbox.h */ -/* */ -/* FreeType exact bbox computation (specification). */ -/* */ -/* Copyright 1996-2001, 2003, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This component has a _single_ role: to compute exact outline bounding */ - /* boxes. */ - /* */ - /* It is separated from the rest of the engine for various technical */ - /* reasons. It may well be integrated in `ftoutln' later. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTBBOX_H__ -#define __FTBBOX_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* outline_processing */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Get_BBox */ - /* */ - /* <Description> */ - /* Compute the exact bounding box of an outline. This is slower */ - /* than computing the control box. However, it uses an advanced */ - /* algorithm which returns _very_ quickly when the two boxes */ - /* coincide. Otherwise, the outline Bézier arcs are traversed to */ - /* extract their extrema. */ - /* */ - /* <Input> */ - /* outline :: A pointer to the source outline. */ - /* */ - /* <Output> */ - /* abbox :: The outline's exact bounding box. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Get_BBox( FT_Outline* outline, - FT_BBox *abbox ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTBBOX_H__ */ - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftbdf.h b/android/jni/ndk_modules/freetype/include/freetype/ftbdf.h deleted file mode 100644 index 4f8baf84..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftbdf.h +++ /dev/null @@ -1,209 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbdf.h */ -/* */ -/* FreeType API for accessing BDF-specific strings (specification). */ -/* */ -/* Copyright 2002, 2003, 2004, 2006, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTBDF_H__ -#define __FTBDF_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* bdf_fonts */ - /* */ - /* <Title> */ - /* BDF and PCF Files */ - /* */ - /* <Abstract> */ - /* BDF and PCF specific API. */ - /* */ - /* <Description> */ - /* This section contains the declaration of functions specific to BDF */ - /* and PCF fonts. */ - /* */ - /*************************************************************************/ - - - /********************************************************************** - * - * @enum: - * FT_PropertyType - * - * @description: - * A list of BDF property types. - * - * @values: - * BDF_PROPERTY_TYPE_NONE :: - * Value~0 is used to indicate a missing property. - * - * BDF_PROPERTY_TYPE_ATOM :: - * Property is a string atom. - * - * BDF_PROPERTY_TYPE_INTEGER :: - * Property is a 32-bit signed integer. - * - * BDF_PROPERTY_TYPE_CARDINAL :: - * Property is a 32-bit unsigned integer. - */ - typedef enum BDF_PropertyType_ - { - BDF_PROPERTY_TYPE_NONE = 0, - BDF_PROPERTY_TYPE_ATOM = 1, - BDF_PROPERTY_TYPE_INTEGER = 2, - BDF_PROPERTY_TYPE_CARDINAL = 3 - - } BDF_PropertyType; - - - /********************************************************************** - * - * @type: - * BDF_Property - * - * @description: - * A handle to a @BDF_PropertyRec structure to model a given - * BDF/PCF property. - */ - typedef struct BDF_PropertyRec_* BDF_Property; - - - /********************************************************************** - * - * @struct: - * BDF_PropertyRec - * - * @description: - * This structure models a given BDF/PCF property. - * - * @fields: - * type :: - * The property type. - * - * u.atom :: - * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM. - * - * u.integer :: - * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER. - * - * u.cardinal :: - * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL. - */ - typedef struct BDF_PropertyRec_ - { - BDF_PropertyType type; - union { - const char* atom; - FT_Int32 integer; - FT_UInt32 cardinal; - - } u; - - } BDF_PropertyRec; - - - /********************************************************************** - * - * @function: - * FT_Get_BDF_Charset_ID - * - * @description: - * Retrieve a BDF font character set identity, according to - * the BDF specification. - * - * @input: - * face :: - * A handle to the input face. - * - * @output: - * acharset_encoding :: - * Charset encoding, as a C~string, owned by the face. - * - * acharset_registry :: - * Charset registry, as a C~string, owned by the face. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with BDF faces, returning an error otherwise. - */ - FT_EXPORT( FT_Error ) - FT_Get_BDF_Charset_ID( FT_Face face, - const char* *acharset_encoding, - const char* *acharset_registry ); - - - /********************************************************************** - * - * @function: - * FT_Get_BDF_Property - * - * @description: - * Retrieve a BDF property from a BDF or PCF font file. - * - * @input: - * face :: A handle to the input face. - * - * name :: The property name. - * - * @output: - * aproperty :: The property. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function works with BDF _and_ PCF fonts. It returns an error - * otherwise. It also returns an error if the property is not in the - * font. - * - * A `property' is a either key-value pair within the STARTPROPERTIES - * ... ENDPROPERTIES block of a BDF font or a key-value pair from the - * `info->props' array within a `FontRec' structure of a PCF font. - * - * Integer properties are always stored as `signed' within PCF fonts; - * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value - * for BDF fonts only. - * - * In case of error, `aproperty->type' is always set to - * @BDF_PROPERTY_TYPE_NONE. - */ - FT_EXPORT( FT_Error ) - FT_Get_BDF_Property( FT_Face face, - const char* prop_name, - BDF_PropertyRec *aproperty ); - - /* */ - -FT_END_HEADER - -#endif /* __FTBDF_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftbitmap.h b/android/jni/ndk_modules/freetype/include/freetype/ftbitmap.h deleted file mode 100644 index 92742369..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftbitmap.h +++ /dev/null @@ -1,227 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbitmap.h */ -/* */ -/* FreeType utility functions for bitmaps (specification). */ -/* */ -/* Copyright 2004, 2005, 2006, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTBITMAP_H__ -#define __FTBITMAP_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* bitmap_handling */ - /* */ - /* <Title> */ - /* Bitmap Handling */ - /* */ - /* <Abstract> */ - /* Handling FT_Bitmap objects. */ - /* */ - /* <Description> */ - /* This section contains functions for converting FT_Bitmap objects. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Bitmap_New */ - /* */ - /* <Description> */ - /* Initialize a pointer to an @FT_Bitmap structure. */ - /* */ - /* <InOut> */ - /* abitmap :: A pointer to the bitmap structure. */ - /* */ - FT_EXPORT( void ) - FT_Bitmap_New( FT_Bitmap *abitmap ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Bitmap_Copy */ - /* */ - /* <Description> */ - /* Copy a bitmap into another one. */ - /* */ - /* <Input> */ - /* library :: A handle to a library object. */ - /* */ - /* source :: A handle to the source bitmap. */ - /* */ - /* <Output> */ - /* target :: A handle to the target bitmap. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Bitmap_Copy( FT_Library library, - const FT_Bitmap *source, - FT_Bitmap *target); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Bitmap_Embolden */ - /* */ - /* <Description> */ - /* Embolden a bitmap. The new bitmap will be about `xStrength' */ - /* pixels wider and `yStrength' pixels higher. The left and bottom */ - /* borders are kept unchanged. */ - /* */ - /* <Input> */ - /* library :: A handle to a library object. */ - /* */ - /* xStrength :: How strong the glyph is emboldened horizontally. */ - /* Expressed in 26.6 pixel format. */ - /* */ - /* yStrength :: How strong the glyph is emboldened vertically. */ - /* Expressed in 26.6 pixel format. */ - /* */ - /* <InOut> */ - /* bitmap :: A handle to the target bitmap. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The current implementation restricts `xStrength' to be less than */ - /* or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. */ - /* */ - /* If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, */ - /* you should call @FT_GlyphSlot_Own_Bitmap on the slot first. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Bitmap_Embolden( FT_Library library, - FT_Bitmap* bitmap, - FT_Pos xStrength, - FT_Pos yStrength ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Bitmap_Convert */ - /* */ - /* <Description> */ - /* Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, or 8bpp to a */ - /* bitmap object with depth 8bpp, making the number of used bytes per */ - /* line (a.k.a. the `pitch') a multiple of `alignment'. */ - /* */ - /* <Input> */ - /* library :: A handle to a library object. */ - /* */ - /* source :: The source bitmap. */ - /* */ - /* alignment :: The pitch of the bitmap is a multiple of this */ - /* parameter. Common values are 1, 2, or 4. */ - /* */ - /* <Output> */ - /* target :: The target bitmap. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* It is possible to call @FT_Bitmap_Convert multiple times without */ - /* calling @FT_Bitmap_Done (the memory is simply reallocated). */ - /* */ - /* Use @FT_Bitmap_Done to finally remove the bitmap object. */ - /* */ - /* The `library' argument is taken to have access to FreeType's */ - /* memory handling functions. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Bitmap_Convert( FT_Library library, - const FT_Bitmap *source, - FT_Bitmap *target, - FT_Int alignment ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_GlyphSlot_Own_Bitmap */ - /* */ - /* <Description> */ - /* Make sure that a glyph slot owns `slot->bitmap'. */ - /* */ - /* <Input> */ - /* slot :: The glyph slot. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* This function is to be used in combination with */ - /* @FT_Bitmap_Embolden. */ - /* */ - FT_EXPORT( FT_Error ) - FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Bitmap_Done */ - /* */ - /* <Description> */ - /* Destroy a bitmap object created with @FT_Bitmap_New. */ - /* */ - /* <Input> */ - /* library :: A handle to a library object. */ - /* */ - /* bitmap :: The bitmap object to be freed. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The `library' argument is taken to have access to FreeType's */ - /* memory handling functions. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Bitmap_Done( FT_Library library, - FT_Bitmap *bitmap ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTBITMAP_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftcache.h b/android/jni/ndk_modules/freetype/include/freetype/ftcache.h deleted file mode 100644 index a9e1237b..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftcache.h +++ /dev/null @@ -1,1125 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcache.h */ -/* */ -/* FreeType Cache subsystem (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTCACHE_H__ -#define __FTCACHE_H__ - - -#include <ft2build.h> -#include FT_GLYPH_H - - -FT_BEGIN_HEADER - - - /************************************************************************* - * - * <Section> - * cache_subsystem - * - * <Title> - * Cache Sub-System - * - * <Abstract> - * How to cache face, size, and glyph data with FreeType~2. - * - * <Description> - * This section describes the FreeType~2 cache sub-system, which is used - * to limit the number of concurrently opened @FT_Face and @FT_Size - * objects, as well as caching information like character maps and glyph - * images while limiting their maximum memory usage. - * - * Note that all types and functions begin with the `FTC_' prefix. - * - * The cache is highly portable and thus doesn't know anything about the - * fonts installed on your system, or how to access them. This implies - * the following scheme: - * - * First, available or installed font faces are uniquely identified by - * @FTC_FaceID values, provided to the cache by the client. Note that - * the cache only stores and compares these values, and doesn't try to - * interpret them in any way. - * - * Second, the cache calls, only when needed, a client-provided function - * to convert a @FTC_FaceID into a new @FT_Face object. The latter is - * then completely managed by the cache, including its termination - * through @FT_Done_Face. - * - * Clients are free to map face IDs to anything else. The most simple - * usage is to associate them to a (pathname,face_index) pair that is - * used to call @FT_New_Face. However, more complex schemes are also - * possible. - * - * Note that for the cache to work correctly, the face ID values must be - * *persistent*, which means that the contents they point to should not - * change at runtime, or that their value should not become invalid. - * - * If this is unavoidable (e.g., when a font is uninstalled at runtime), - * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let - * the cache get rid of any references to the old @FTC_FaceID it may - * keep internally. Failure to do so will lead to incorrect behaviour - * or even crashes. - * - * To use the cache, start with calling @FTC_Manager_New to create a new - * @FTC_Manager object, which models a single cache instance. You can - * then look up @FT_Face and @FT_Size objects with - * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively. - * - * If you want to use the charmap caching, call @FTC_CMapCache_New, then - * later use @FTC_CMapCache_Lookup to perform the equivalent of - * @FT_Get_Char_Index, only much faster. - * - * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then - * later use @FTC_ImageCache_Lookup to retrieve the corresponding - * @FT_Glyph objects from the cache. - * - * If you need lots of small bitmaps, it is much more memory efficient - * to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This - * returns @FTC_SBitRec structures, which are used to store small - * bitmaps directly. (A small bitmap is one whose metrics and - * dimensions all fit into 8-bit integers). - * - * We hope to also provide a kerning cache in the near future. - * - * - * <Order> - * FTC_Manager - * FTC_FaceID - * FTC_Face_Requester - * - * FTC_Manager_New - * FTC_Manager_Reset - * FTC_Manager_Done - * FTC_Manager_LookupFace - * FTC_Manager_LookupSize - * FTC_Manager_RemoveFaceID - * - * FTC_Node - * FTC_Node_Unref - * - * FTC_ImageCache - * FTC_ImageCache_New - * FTC_ImageCache_Lookup - * - * FTC_SBit - * FTC_SBitCache - * FTC_SBitCache_New - * FTC_SBitCache_Lookup - * - * FTC_CMapCache - * FTC_CMapCache_New - * FTC_CMapCache_Lookup - * - *************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** BASIC TYPE DEFINITIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /************************************************************************* - * - * @type: FTC_FaceID - * - * @description: - * An opaque pointer type that is used to identity face objects. The - * contents of such objects is application-dependent. - * - * These pointers are typically used to point to a user-defined - * structure containing a font file path, and face index. - * - * @note: - * Never use NULL as a valid @FTC_FaceID. - * - * Face IDs are passed by the client to the cache manager, which calls, - * when needed, the @FTC_Face_Requester to translate them into new - * @FT_Face objects. - * - * If the content of a given face ID changes at runtime, or if the value - * becomes invalid (e.g., when uninstalling a font), you should - * immediately call @FTC_Manager_RemoveFaceID before any other cache - * function. - * - * Failure to do so will result in incorrect behaviour or even - * memory leaks and crashes. - */ - typedef FT_Pointer FTC_FaceID; - - - /************************************************************************ - * - * @functype: - * FTC_Face_Requester - * - * @description: - * A callback function provided by client applications. It is used by - * the cache manager to translate a given @FTC_FaceID into a new valid - * @FT_Face object, on demand. - * - * <Input> - * face_id :: - * The face ID to resolve. - * - * library :: - * A handle to a FreeType library object. - * - * req_data :: - * Application-provided request data (see note below). - * - * <Output> - * aface :: - * A new @FT_Face handle. - * - * <Return> - * FreeType error code. 0~means success. - * - * <Note> - * The third parameter `req_data' is the same as the one passed by the - * client when @FTC_Manager_New is called. - * - * The face requester should not perform funny things on the returned - * face object, like creating a new @FT_Size for it, or setting a - * transformation through @FT_Set_Transform! - */ - typedef FT_Error - (*FTC_Face_Requester)( FTC_FaceID face_id, - FT_Library library, - FT_Pointer request_data, - FT_Face* aface ); - - /* */ - -#define FT_POINTER_TO_ULONG( p ) ( (FT_ULong)(FT_Pointer)(p) ) - -#define FTC_FACE_ID_HASH( i ) \ - ((FT_UInt32)(( FT_POINTER_TO_ULONG( i ) >> 3 ) ^ \ - ( FT_POINTER_TO_ULONG( i ) << 7 ) ) ) - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CACHE MANAGER OBJECT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FTC_Manager */ - /* */ - /* <Description> */ - /* This object corresponds to one instance of the cache-subsystem. */ - /* It is used to cache one or more @FT_Face objects, along with */ - /* corresponding @FT_Size objects. */ - /* */ - /* The manager intentionally limits the total number of opened */ - /* @FT_Face and @FT_Size objects to control memory usage. See the */ - /* `max_faces' and `max_sizes' parameters of @FTC_Manager_New. */ - /* */ - /* The manager is also used to cache `nodes' of various types while */ - /* limiting their total memory usage. */ - /* */ - /* All limitations are enforced by keeping lists of managed objects */ - /* in most-recently-used order, and flushing old nodes to make room */ - /* for new ones. */ - /* */ - typedef struct FTC_ManagerRec_* FTC_Manager; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FTC_Node */ - /* */ - /* <Description> */ - /* An opaque handle to a cache node object. Each cache node is */ - /* reference-counted. A node with a count of~0 might be flushed */ - /* out of a full cache whenever a lookup request is performed. */ - /* */ - /* If you look up nodes, you have the ability to `acquire' them, */ - /* i.e., to increment their reference count. This will prevent the */ - /* node from being flushed out of the cache until you explicitly */ - /* `release' it (see @FTC_Node_Unref). */ - /* */ - /* See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. */ - /* */ - typedef struct FTC_NodeRec_* FTC_Node; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Manager_New */ - /* */ - /* <Description> */ - /* Create a new cache manager. */ - /* */ - /* <Input> */ - /* library :: The parent FreeType library handle to use. */ - /* */ - /* max_faces :: Maximum number of opened @FT_Face objects managed by */ - /* this cache instance. Use~0 for defaults. */ - /* */ - /* max_sizes :: Maximum number of opened @FT_Size objects managed by */ - /* this cache instance. Use~0 for defaults. */ - /* */ - /* max_bytes :: Maximum number of bytes to use for cached data nodes. */ - /* Use~0 for defaults. Note that this value does not */ - /* account for managed @FT_Face and @FT_Size objects. */ - /* */ - /* requester :: An application-provided callback used to translate */ - /* face IDs into real @FT_Face objects. */ - /* */ - /* req_data :: A generic pointer that is passed to the requester */ - /* each time it is called (see @FTC_Face_Requester). */ - /* */ - /* <Output> */ - /* amanager :: A handle to a new manager object. 0~in case of */ - /* failure. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_Manager_New( FT_Library library, - FT_UInt max_faces, - FT_UInt max_sizes, - FT_ULong max_bytes, - FTC_Face_Requester requester, - FT_Pointer req_data, - FTC_Manager *amanager ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Manager_Reset */ - /* */ - /* <Description> */ - /* Empty a given cache manager. This simply gets rid of all the */ - /* currently cached @FT_Face and @FT_Size objects within the manager. */ - /* */ - /* <InOut> */ - /* manager :: A handle to the manager. */ - /* */ - FT_EXPORT( void ) - FTC_Manager_Reset( FTC_Manager manager ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Manager_Done */ - /* */ - /* <Description> */ - /* Destroy a given manager after emptying it. */ - /* */ - /* <Input> */ - /* manager :: A handle to the target cache manager object. */ - /* */ - FT_EXPORT( void ) - FTC_Manager_Done( FTC_Manager manager ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Manager_LookupFace */ - /* */ - /* <Description> */ - /* Retrieve the @FT_Face object that corresponds to a given face ID */ - /* through a cache manager. */ - /* */ - /* <Input> */ - /* manager :: A handle to the cache manager. */ - /* */ - /* face_id :: The ID of the face object. */ - /* */ - /* <Output> */ - /* aface :: A handle to the face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The returned @FT_Face object is always owned by the manager. You */ - /* should never try to discard it yourself. */ - /* */ - /* The @FT_Face object doesn't necessarily have a current size object */ - /* (i.e., face->size can be 0). If you need a specific `font size', */ - /* use @FTC_Manager_LookupSize instead. */ - /* */ - /* Never change the face's transformation matrix (i.e., never call */ - /* the @FT_Set_Transform function) on a returned face! If you need */ - /* to transform glyphs, do it yourself after glyph loading. */ - /* */ - /* When you perform a lookup, out-of-memory errors are detected */ - /* _within_ the lookup and force incremental flushes of the cache */ - /* until enough memory is released for the lookup to succeed. */ - /* */ - /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ - /* already been completely flushed, and still no memory was available */ - /* for the operation. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_Manager_LookupFace( FTC_Manager manager, - FTC_FaceID face_id, - FT_Face *aface ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FTC_ScalerRec */ - /* */ - /* <Description> */ - /* A structure used to describe a given character size in either */ - /* pixels or points to the cache manager. See */ - /* @FTC_Manager_LookupSize. */ - /* */ - /* <Fields> */ - /* face_id :: The source face ID. */ - /* */ - /* width :: The character width. */ - /* */ - /* height :: The character height. */ - /* */ - /* pixel :: A Boolean. If 1, the `width' and `height' fields are */ - /* interpreted as integer pixel character sizes. */ - /* Otherwise, they are expressed as 1/64th of points. */ - /* */ - /* x_res :: Only used when `pixel' is value~0 to indicate the */ - /* horizontal resolution in dpi. */ - /* */ - /* y_res :: Only used when `pixel' is value~0 to indicate the */ - /* vertical resolution in dpi. */ - /* */ - /* <Note> */ - /* This type is mainly used to retrieve @FT_Size objects through the */ - /* cache manager. */ - /* */ - typedef struct FTC_ScalerRec_ - { - FTC_FaceID face_id; - FT_UInt width; - FT_UInt height; - FT_Int pixel; - FT_UInt x_res; - FT_UInt y_res; - - } FTC_ScalerRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FTC_Scaler */ - /* */ - /* <Description> */ - /* A handle to an @FTC_ScalerRec structure. */ - /* */ - typedef struct FTC_ScalerRec_* FTC_Scaler; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Manager_LookupSize */ - /* */ - /* <Description> */ - /* Retrieve the @FT_Size object that corresponds to a given */ - /* @FTC_ScalerRec pointer through a cache manager. */ - /* */ - /* <Input> */ - /* manager :: A handle to the cache manager. */ - /* */ - /* scaler :: A scaler handle. */ - /* */ - /* <Output> */ - /* asize :: A handle to the size object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The returned @FT_Size object is always owned by the manager. You */ - /* should never try to discard it by yourself. */ - /* */ - /* You can access the parent @FT_Face object simply as `size->face' */ - /* if you need it. Note that this object is also owned by the */ - /* manager. */ - /* */ - /* <Note> */ - /* When you perform a lookup, out-of-memory errors are detected */ - /* _within_ the lookup and force incremental flushes of the cache */ - /* until enough memory is released for the lookup to succeed. */ - /* */ - /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ - /* already been completely flushed, and still no memory is available */ - /* for the operation. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_Manager_LookupSize( FTC_Manager manager, - FTC_Scaler scaler, - FT_Size *asize ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_Node_Unref */ - /* */ - /* <Description> */ - /* Decrement a cache node's internal reference count. When the count */ - /* reaches 0, it is not destroyed but becomes eligible for subsequent */ - /* cache flushes. */ - /* */ - /* <Input> */ - /* node :: The cache node handle. */ - /* */ - /* manager :: The cache manager handle. */ - /* */ - FT_EXPORT( void ) - FTC_Node_Unref( FTC_Node node, - FTC_Manager manager ); - - - /************************************************************************* - * - * @function: - * FTC_Manager_RemoveFaceID - * - * @description: - * A special function used to indicate to the cache manager that - * a given @FTC_FaceID is no longer valid, either because its - * content changed, or because it was deallocated or uninstalled. - * - * @input: - * manager :: - * The cache manager handle. - * - * face_id :: - * The @FTC_FaceID to be removed. - * - * @note: - * This function flushes all nodes from the cache corresponding to this - * `face_id', with the exception of nodes with a non-null reference - * count. - * - * Such nodes are however modified internally so as to never appear - * in later lookups with the same `face_id' value, and to be immediately - * destroyed when released by all their users. - * - */ - FT_EXPORT( void ) - FTC_Manager_RemoveFaceID( FTC_Manager manager, - FTC_FaceID face_id ); - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* cache_subsystem */ - /* */ - /*************************************************************************/ - - /************************************************************************* - * - * @type: - * FTC_CMapCache - * - * @description: - * An opaque handle used to model a charmap cache. This cache is to - * hold character codes -> glyph indices mappings. - * - */ - typedef struct FTC_CMapCacheRec_* FTC_CMapCache; - - - /************************************************************************* - * - * @function: - * FTC_CMapCache_New - * - * @description: - * Create a new charmap cache. - * - * @input: - * manager :: - * A handle to the cache manager. - * - * @output: - * acache :: - * A new cache handle. NULL in case of error. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * Like all other caches, this one will be destroyed with the cache - * manager. - * - */ - FT_EXPORT( FT_Error ) - FTC_CMapCache_New( FTC_Manager manager, - FTC_CMapCache *acache ); - - - /************************************************************************ - * - * @function: - * FTC_CMapCache_Lookup - * - * @description: - * Translate a character code into a glyph index, using the charmap - * cache. - * - * @input: - * cache :: - * A charmap cache handle. - * - * face_id :: - * The source face ID. - * - * cmap_index :: - * The index of the charmap in the source face. Any negative value - * means to use the cache @FT_Face's default charmap. - * - * char_code :: - * The character code (in the corresponding charmap). - * - * @return: - * Glyph index. 0~means `no glyph'. - * - */ - FT_EXPORT( FT_UInt ) - FTC_CMapCache_Lookup( FTC_CMapCache cache, - FTC_FaceID face_id, - FT_Int cmap_index, - FT_UInt32 char_code ); - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* cache_subsystem */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** IMAGE CACHE OBJECT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /************************************************************************* - * - * @struct: - * FTC_ImageTypeRec - * - * @description: - * A structure used to model the type of images in a glyph cache. - * - * @fields: - * face_id :: - * The face ID. - * - * width :: - * The width in pixels. - * - * height :: - * The height in pixels. - * - * flags :: - * The load flags, as in @FT_Load_Glyph. - * - */ - typedef struct FTC_ImageTypeRec_ - { - FTC_FaceID face_id; - FT_Int width; - FT_Int height; - FT_Int32 flags; - - } FTC_ImageTypeRec; - - - /************************************************************************* - * - * @type: - * FTC_ImageType - * - * @description: - * A handle to an @FTC_ImageTypeRec structure. - * - */ - typedef struct FTC_ImageTypeRec_* FTC_ImageType; - - - /* */ - - -#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ - ( (d1)->face_id == (d2)->face_id && \ - (d1)->width == (d2)->width && \ - (d1)->flags == (d2)->flags ) - -#define FTC_IMAGE_TYPE_HASH( d ) \ - (FT_UFast)( FTC_FACE_ID_HASH( (d)->face_id ) ^ \ - ( (d)->width << 8 ) ^ (d)->height ^ \ - ( (d)->flags << 4 ) ) - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FTC_ImageCache */ - /* */ - /* <Description> */ - /* A handle to an glyph image cache object. They are designed to */ - /* hold many distinct glyph images while not exceeding a certain */ - /* memory threshold. */ - /* */ - typedef struct FTC_ImageCacheRec_* FTC_ImageCache; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_ImageCache_New */ - /* */ - /* <Description> */ - /* Create a new glyph image cache. */ - /* */ - /* <Input> */ - /* manager :: The parent manager for the image cache. */ - /* */ - /* <Output> */ - /* acache :: A handle to the new glyph image cache object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_ImageCache_New( FTC_Manager manager, - FTC_ImageCache *acache ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_ImageCache_Lookup */ - /* */ - /* <Description> */ - /* Retrieve a given glyph image from a glyph image cache. */ - /* */ - /* <Input> */ - /* cache :: A handle to the source glyph image cache. */ - /* */ - /* type :: A pointer to a glyph image type descriptor. */ - /* */ - /* gindex :: The glyph index to retrieve. */ - /* */ - /* <Output> */ - /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */ - /* failure. */ - /* */ - /* anode :: Used to return the address of of the corresponding cache */ - /* node after incrementing its reference count (see note */ - /* below). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The returned glyph is owned and managed by the glyph image cache. */ - /* Never try to transform or discard it manually! You can however */ - /* create a copy with @FT_Glyph_Copy and modify the new one. */ - /* */ - /* If `anode' is _not_ NULL, it receives the address of the cache */ - /* node containing the glyph image, after increasing its reference */ - /* count. This ensures that the node (as well as the @FT_Glyph) will */ - /* always be kept in the cache until you call @FTC_Node_Unref to */ - /* `release' it. */ - /* */ - /* If `anode' is NULL, the cache node is left unchanged, which means */ - /* that the @FT_Glyph could be flushed out of the cache on the next */ - /* call to one of the caching sub-system APIs. Don't assume that it */ - /* is persistent! */ - /* */ - FT_EXPORT( FT_Error ) - FTC_ImageCache_Lookup( FTC_ImageCache cache, - FTC_ImageType type, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_ImageCache_LookupScaler */ - /* */ - /* <Description> */ - /* A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec */ - /* to specify the face ID and its size. */ - /* */ - /* <Input> */ - /* cache :: A handle to the source glyph image cache. */ - /* */ - /* scaler :: A pointer to a scaler descriptor. */ - /* */ - /* load_flags :: The corresponding load flags. */ - /* */ - /* gindex :: The glyph index to retrieve. */ - /* */ - /* <Output> */ - /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */ - /* failure. */ - /* */ - /* anode :: Used to return the address of of the corresponding */ - /* cache node after incrementing its reference count */ - /* (see note below). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The returned glyph is owned and managed by the glyph image cache. */ - /* Never try to transform or discard it manually! You can however */ - /* create a copy with @FT_Glyph_Copy and modify the new one. */ - /* */ - /* If `anode' is _not_ NULL, it receives the address of the cache */ - /* node containing the glyph image, after increasing its reference */ - /* count. This ensures that the node (as well as the @FT_Glyph) will */ - /* always be kept in the cache until you call @FTC_Node_Unref to */ - /* `release' it. */ - /* */ - /* If `anode' is NULL, the cache node is left unchanged, which means */ - /* that the @FT_Glyph could be flushed out of the cache on the next */ - /* call to one of the caching sub-system APIs. Don't assume that it */ - /* is persistent! */ - /* */ - /* Calls to @FT_Set_Char_Size and friends have no effect on cached */ - /* glyphs; you should always use the FreeType cache API instead. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_ImageCache_LookupScaler( FTC_ImageCache cache, - FTC_Scaler scaler, - FT_ULong load_flags, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ); - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FTC_SBit */ - /* */ - /* <Description> */ - /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */ - /* structure for details. */ - /* */ - typedef struct FTC_SBitRec_* FTC_SBit; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FTC_SBitRec */ - /* */ - /* <Description> */ - /* A very compact structure used to describe a small glyph bitmap. */ - /* */ - /* <Fields> */ - /* width :: The bitmap width in pixels. */ - /* */ - /* height :: The bitmap height in pixels. */ - /* */ - /* left :: The horizontal distance from the pen position to the */ - /* left bitmap border (a.k.a. `left side bearing', or */ - /* `lsb'). */ - /* */ - /* top :: The vertical distance from the pen position (on the */ - /* baseline) to the upper bitmap border (a.k.a. `top */ - /* side bearing'). The distance is positive for upwards */ - /* y~coordinates. */ - /* */ - /* format :: The format of the glyph bitmap (monochrome or gray). */ - /* */ - /* max_grays :: Maximum gray level value (in the range 1 to~255). */ - /* */ - /* pitch :: The number of bytes per bitmap line. May be positive */ - /* or negative. */ - /* */ - /* xadvance :: The horizontal advance width in pixels. */ - /* */ - /* yadvance :: The vertical advance height in pixels. */ - /* */ - /* buffer :: A pointer to the bitmap pixels. */ - /* */ - typedef struct FTC_SBitRec_ - { - FT_Byte width; - FT_Byte height; - FT_Char left; - FT_Char top; - - FT_Byte format; - FT_Byte max_grays; - FT_Short pitch; - FT_Char xadvance; - FT_Char yadvance; - - FT_Byte* buffer; - - } FTC_SBitRec; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FTC_SBitCache */ - /* */ - /* <Description> */ - /* A handle to a small bitmap cache. These are special cache objects */ - /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */ - /* much more efficient way than the traditional glyph image cache */ - /* implemented by @FTC_ImageCache. */ - /* */ - typedef struct FTC_SBitCacheRec_* FTC_SBitCache; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_SBitCache_New */ - /* */ - /* <Description> */ - /* Create a new cache to store small glyph bitmaps. */ - /* */ - /* <Input> */ - /* manager :: A handle to the source cache manager. */ - /* */ - /* <Output> */ - /* acache :: A handle to the new sbit cache. NULL in case of error. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_SBitCache_New( FTC_Manager manager, - FTC_SBitCache *acache ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_SBitCache_Lookup */ - /* */ - /* <Description> */ - /* Look up a given small glyph bitmap in a given sbit cache and */ - /* `lock' it to prevent its flushing from the cache until needed. */ - /* */ - /* <Input> */ - /* cache :: A handle to the source sbit cache. */ - /* */ - /* type :: A pointer to the glyph image type descriptor. */ - /* */ - /* gindex :: The glyph index. */ - /* */ - /* <Output> */ - /* sbit :: A handle to a small bitmap descriptor. */ - /* */ - /* anode :: Used to return the address of of the corresponding cache */ - /* node after incrementing its reference count (see note */ - /* below). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The small bitmap descriptor and its bit buffer are owned by the */ - /* cache and should never be freed by the application. They might */ - /* as well disappear from memory on the next cache lookup, so don't */ - /* treat them as persistent data. */ - /* */ - /* The descriptor's `buffer' field is set to~0 to indicate a missing */ - /* glyph bitmap. */ - /* */ - /* If `anode' is _not_ NULL, it receives the address of the cache */ - /* node containing the bitmap, after increasing its reference count. */ - /* This ensures that the node (as well as the image) will always be */ - /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ - /* */ - /* If `anode' is NULL, the cache node is left unchanged, which means */ - /* that the bitmap could be flushed out of the cache on the next */ - /* call to one of the caching sub-system APIs. Don't assume that it */ - /* is persistent! */ - /* */ - FT_EXPORT( FT_Error ) - FTC_SBitCache_Lookup( FTC_SBitCache cache, - FTC_ImageType type, - FT_UInt gindex, - FTC_SBit *sbit, - FTC_Node *anode ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FTC_SBitCache_LookupScaler */ - /* */ - /* <Description> */ - /* A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec */ - /* to specify the face ID and its size. */ - /* */ - /* <Input> */ - /* cache :: A handle to the source sbit cache. */ - /* */ - /* scaler :: A pointer to the scaler descriptor. */ - /* */ - /* load_flags :: The corresponding load flags. */ - /* */ - /* gindex :: The glyph index. */ - /* */ - /* <Output> */ - /* sbit :: A handle to a small bitmap descriptor. */ - /* */ - /* anode :: Used to return the address of of the corresponding */ - /* cache node after incrementing its reference count */ - /* (see note below). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The small bitmap descriptor and its bit buffer are owned by the */ - /* cache and should never be freed by the application. They might */ - /* as well disappear from memory on the next cache lookup, so don't */ - /* treat them as persistent data. */ - /* */ - /* The descriptor's `buffer' field is set to~0 to indicate a missing */ - /* glyph bitmap. */ - /* */ - /* If `anode' is _not_ NULL, it receives the address of the cache */ - /* node containing the bitmap, after increasing its reference count. */ - /* This ensures that the node (as well as the image) will always be */ - /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ - /* */ - /* If `anode' is NULL, the cache node is left unchanged, which means */ - /* that the bitmap could be flushed out of the cache on the next */ - /* call to one of the caching sub-system APIs. Don't assume that it */ - /* is persistent! */ - /* */ - FT_EXPORT( FT_Error ) - FTC_SBitCache_LookupScaler( FTC_SBitCache cache, - FTC_Scaler scaler, - FT_ULong load_flags, - FT_UInt gindex, - FTC_SBit *sbit, - FTC_Node *anode ); - - - /* */ - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - /*@***********************************************************************/ - /* */ - /* <Struct> */ - /* FTC_FontRec */ - /* */ - /* <Description> */ - /* A simple structure used to describe a given `font' to the cache */ - /* manager. Note that a `font' is the combination of a given face */ - /* with a given character size. */ - /* */ - /* <Fields> */ - /* face_id :: The ID of the face to use. */ - /* */ - /* pix_width :: The character width in integer pixels. */ - /* */ - /* pix_height :: The character height in integer pixels. */ - /* */ - typedef struct FTC_FontRec_ - { - FTC_FaceID face_id; - FT_UShort pix_width; - FT_UShort pix_height; - - } FTC_FontRec; - - - /* */ - - -#define FTC_FONT_COMPARE( f1, f2 ) \ - ( (f1)->face_id == (f2)->face_id && \ - (f1)->pix_width == (f2)->pix_width && \ - (f1)->pix_height == (f2)->pix_height ) - -#define FTC_FONT_HASH( f ) \ - (FT_UInt32)( FTC_FACE_ID_HASH((f)->face_id) ^ \ - ((f)->pix_width << 8) ^ \ - ((f)->pix_height) ) - - typedef FTC_FontRec* FTC_Font; - - - FT_EXPORT( FT_Error ) - FTC_Manager_Lookup_Face( FTC_Manager manager, - FTC_FaceID face_id, - FT_Face *aface ); - - FT_EXPORT( FT_Error ) - FTC_Manager_Lookup_Size( FTC_Manager manager, - FTC_Font font, - FT_Face *aface, - FT_Size *asize ); - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - - /* */ - -FT_END_HEADER - -#endif /* __FTCACHE_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftchapters.h b/android/jni/ndk_modules/freetype/include/freetype/ftchapters.h deleted file mode 100644 index 7775a6bb..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftchapters.h +++ /dev/null @@ -1,103 +0,0 @@ -/***************************************************************************/ -/* */ -/* This file defines the structure of the FreeType reference. */ -/* It is used by the python script which generates the HTML files. */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* <Chapter> */ -/* general_remarks */ -/* */ -/* <Title> */ -/* General Remarks */ -/* */ -/* <Sections> */ -/* user_allocation */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* <Chapter> */ -/* core_api */ -/* */ -/* <Title> */ -/* Core API */ -/* */ -/* <Sections> */ -/* version */ -/* basic_types */ -/* base_interface */ -/* glyph_variants */ -/* glyph_management */ -/* mac_specific */ -/* sizes_management */ -/* header_file_macros */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* <Chapter> */ -/* format_specific */ -/* */ -/* <Title> */ -/* Format-Specific API */ -/* */ -/* <Sections> */ -/* multiple_masters */ -/* truetype_tables */ -/* type1_tables */ -/* sfnt_names */ -/* bdf_fonts */ -/* cid_fonts */ -/* pfr_fonts */ -/* winfnt_fonts */ -/* font_formats */ -/* gasp_table */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* <Chapter> */ -/* cache_subsystem */ -/* */ -/* <Title> */ -/* Cache Sub-System */ -/* */ -/* <Sections> */ -/* cache_subsystem */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* <Chapter> */ -/* support_api */ -/* */ -/* <Title> */ -/* Support API */ -/* */ -/* <Sections> */ -/* computations */ -/* list_processing */ -/* outline_processing */ -/* quick_advance */ -/* bitmap_handling */ -/* raster */ -/* glyph_stroker */ -/* system_interface */ -/* module_management */ -/* gzip */ -/* lzw */ -/* lcd_filtering */ -/* */ -/***************************************************************************/ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftcid.h b/android/jni/ndk_modules/freetype/include/freetype/ftcid.h deleted file mode 100644 index 203a30ca..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftcid.h +++ /dev/null @@ -1,166 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcid.h */ -/* */ -/* FreeType API for accessing CID font information (specification). */ -/* */ -/* Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTCID_H__ -#define __FTCID_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* cid_fonts */ - /* */ - /* <Title> */ - /* CID Fonts */ - /* */ - /* <Abstract> */ - /* CID-keyed font specific API. */ - /* */ - /* <Description> */ - /* This section contains the declaration of CID-keyed font specific */ - /* functions. */ - /* */ - /*************************************************************************/ - - - /********************************************************************** - * - * @function: - * FT_Get_CID_Registry_Ordering_Supplement - * - * @description: - * Retrieve the Registry/Ordering/Supplement triple (also known as the - * "R/O/S") from a CID-keyed font. - * - * @input: - * face :: - * A handle to the input face. - * - * @output: - * registry :: - * The registry, as a C~string, owned by the face. - * - * ordering :: - * The ordering, as a C~string, owned by the face. - * - * supplement :: - * The supplement. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with CID faces, returning an error - * otherwise. - * - * @since: - * 2.3.6 - */ - FT_EXPORT( FT_Error ) - FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, - const char* *registry, - const char* *ordering, - FT_Int *supplement); - - - /********************************************************************** - * - * @function: - * FT_Get_CID_Is_Internally_CID_Keyed - * - * @description: - * Retrieve the type of the input face, CID keyed or not. In - * constrast to the @FT_IS_CID_KEYED macro this function returns - * successfully also for CID-keyed fonts in an SNFT wrapper. - * - * @input: - * face :: - * A handle to the input face. - * - * @output: - * is_cid :: - * The type of the face as an @FT_Bool. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with CID faces and OpenType fonts, - * returning an error otherwise. - * - * @since: - * 2.3.9 - */ - FT_EXPORT( FT_Error ) - FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, - FT_Bool *is_cid ); - - - /********************************************************************** - * - * @function: - * FT_Get_CID_From_Glyph_Index - * - * @description: - * Retrieve the CID of the input glyph index. - * - * @input: - * face :: - * A handle to the input face. - * - * glyph_index :: - * The input glyph index. - * - * @output: - * cid :: - * The CID as an @FT_UInt. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with CID faces and OpenType fonts, - * returning an error otherwise. - * - * @since: - * 2.3.9 - */ - FT_EXPORT( FT_Error ) - FT_Get_CID_From_Glyph_Index( FT_Face face, - FT_UInt glyph_index, - FT_UInt *cid ); - - /* */ - -FT_END_HEADER - -#endif /* __FTCID_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/fterrdef.h b/android/jni/ndk_modules/freetype/include/freetype/fterrdef.h deleted file mode 100644 index bf522206..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/fterrdef.h +++ /dev/null @@ -1,244 +0,0 @@ -/***************************************************************************/ -/* */ -/* fterrdef.h */ -/* */ -/* FreeType error codes (specification). */ -/* */ -/* Copyright 2002, 2004, 2006, 2007, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*******************************************************************/ - /*******************************************************************/ - /***** *****/ - /***** LIST OF ERROR CODES/MESSAGES *****/ - /***** *****/ - /*******************************************************************/ - /*******************************************************************/ - - - /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */ - /* including this file. */ - - - /* generic errors */ - - FT_NOERRORDEF_( Ok, 0x00, \ - "no error" ) - - FT_ERRORDEF_( Cannot_Open_Resource, 0x01, \ - "cannot open resource" ) - FT_ERRORDEF_( Unknown_File_Format, 0x02, \ - "unknown file format" ) - FT_ERRORDEF_( Invalid_File_Format, 0x03, \ - "broken file" ) - FT_ERRORDEF_( Invalid_Version, 0x04, \ - "invalid FreeType version" ) - FT_ERRORDEF_( Lower_Module_Version, 0x05, \ - "module version is too low" ) - FT_ERRORDEF_( Invalid_Argument, 0x06, \ - "invalid argument" ) - FT_ERRORDEF_( Unimplemented_Feature, 0x07, \ - "unimplemented feature" ) - FT_ERRORDEF_( Invalid_Table, 0x08, \ - "broken table" ) - FT_ERRORDEF_( Invalid_Offset, 0x09, \ - "broken offset within table" ) - FT_ERRORDEF_( Array_Too_Large, 0x0A, \ - "array allocation size too large" ) - - /* glyph/character errors */ - - FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, \ - "invalid glyph index" ) - FT_ERRORDEF_( Invalid_Character_Code, 0x11, \ - "invalid character code" ) - FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, \ - "unsupported glyph image format" ) - FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, \ - "cannot render this glyph format" ) - FT_ERRORDEF_( Invalid_Outline, 0x14, \ - "invalid outline" ) - FT_ERRORDEF_( Invalid_Composite, 0x15, \ - "invalid composite glyph" ) - FT_ERRORDEF_( Too_Many_Hints, 0x16, \ - "too many hints" ) - FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, \ - "invalid pixel size" ) - - /* handle errors */ - - FT_ERRORDEF_( Invalid_Handle, 0x20, \ - "invalid object handle" ) - FT_ERRORDEF_( Invalid_Library_Handle, 0x21, \ - "invalid library handle" ) - FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, \ - "invalid module handle" ) - FT_ERRORDEF_( Invalid_Face_Handle, 0x23, \ - "invalid face handle" ) - FT_ERRORDEF_( Invalid_Size_Handle, 0x24, \ - "invalid size handle" ) - FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, \ - "invalid glyph slot handle" ) - FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, \ - "invalid charmap handle" ) - FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, \ - "invalid cache manager handle" ) - FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, \ - "invalid stream handle" ) - - /* driver errors */ - - FT_ERRORDEF_( Too_Many_Drivers, 0x30, \ - "too many modules" ) - FT_ERRORDEF_( Too_Many_Extensions, 0x31, \ - "too many extensions" ) - - /* memory errors */ - - FT_ERRORDEF_( Out_Of_Memory, 0x40, \ - "out of memory" ) - FT_ERRORDEF_( Unlisted_Object, 0x41, \ - "unlisted object" ) - - /* stream errors */ - - FT_ERRORDEF_( Cannot_Open_Stream, 0x51, \ - "cannot open stream" ) - FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, \ - "invalid stream seek" ) - FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, \ - "invalid stream skip" ) - FT_ERRORDEF_( Invalid_Stream_Read, 0x54, \ - "invalid stream read" ) - FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, \ - "invalid stream operation" ) - FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, \ - "invalid frame operation" ) - FT_ERRORDEF_( Nested_Frame_Access, 0x57, \ - "nested frame access" ) - FT_ERRORDEF_( Invalid_Frame_Read, 0x58, \ - "invalid frame read" ) - - /* raster errors */ - - FT_ERRORDEF_( Raster_Uninitialized, 0x60, \ - "raster uninitialized" ) - FT_ERRORDEF_( Raster_Corrupted, 0x61, \ - "raster corrupted" ) - FT_ERRORDEF_( Raster_Overflow, 0x62, \ - "raster overflow" ) - FT_ERRORDEF_( Raster_Negative_Height, 0x63, \ - "negative height while rastering" ) - - /* cache errors */ - - FT_ERRORDEF_( Too_Many_Caches, 0x70, \ - "too many registered caches" ) - - /* TrueType and SFNT errors */ - - FT_ERRORDEF_( Invalid_Opcode, 0x80, \ - "invalid opcode" ) - FT_ERRORDEF_( Too_Few_Arguments, 0x81, \ - "too few arguments" ) - FT_ERRORDEF_( Stack_Overflow, 0x82, \ - "stack overflow" ) - FT_ERRORDEF_( Code_Overflow, 0x83, \ - "code overflow" ) - FT_ERRORDEF_( Bad_Argument, 0x84, \ - "bad argument" ) - FT_ERRORDEF_( Divide_By_Zero, 0x85, \ - "division by zero" ) - FT_ERRORDEF_( Invalid_Reference, 0x86, \ - "invalid reference" ) - FT_ERRORDEF_( Debug_OpCode, 0x87, \ - "found debug opcode" ) - FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, \ - "found ENDF opcode in execution stream" ) - FT_ERRORDEF_( Nested_DEFS, 0x89, \ - "nested DEFS" ) - FT_ERRORDEF_( Invalid_CodeRange, 0x8A, \ - "invalid code range" ) - FT_ERRORDEF_( Execution_Too_Long, 0x8B, \ - "execution context too long" ) - FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, \ - "too many function definitions" ) - FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, \ - "too many instruction definitions" ) - FT_ERRORDEF_( Table_Missing, 0x8E, \ - "SFNT font table missing" ) - FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, \ - "horizontal header (hhea) table missing" ) - FT_ERRORDEF_( Locations_Missing, 0x90, \ - "locations (loca) table missing" ) - FT_ERRORDEF_( Name_Table_Missing, 0x91, \ - "name table missing" ) - FT_ERRORDEF_( CMap_Table_Missing, 0x92, \ - "character map (cmap) table missing" ) - FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, \ - "horizontal metrics (hmtx) table missing" ) - FT_ERRORDEF_( Post_Table_Missing, 0x94, \ - "PostScript (post) table missing" ) - FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, \ - "invalid horizontal metrics" ) - FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, \ - "invalid character map (cmap) format" ) - FT_ERRORDEF_( Invalid_PPem, 0x97, \ - "invalid ppem value" ) - FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, \ - "invalid vertical metrics" ) - FT_ERRORDEF_( Could_Not_Find_Context, 0x99, \ - "could not find context" ) - FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, \ - "invalid PostScript (post) table format" ) - FT_ERRORDEF_( Invalid_Post_Table, 0x9B, \ - "invalid PostScript (post) table" ) - - /* CFF, CID, and Type 1 errors */ - - FT_ERRORDEF_( Syntax_Error, 0xA0, \ - "opcode syntax error" ) - FT_ERRORDEF_( Stack_Underflow, 0xA1, \ - "argument stack underflow" ) - FT_ERRORDEF_( Ignore, 0xA2, \ - "ignore" ) - FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, \ - "no Unicode glyph name found" ) - - - /* BDF errors */ - - FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, \ - "`STARTFONT' field missing" ) - FT_ERRORDEF_( Missing_Font_Field, 0xB1, \ - "`FONT' field missing" ) - FT_ERRORDEF_( Missing_Size_Field, 0xB2, \ - "`SIZE' field missing" ) - FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, \ - "`FONTBOUNDINGBOX' field missing" ) - FT_ERRORDEF_( Missing_Chars_Field, 0xB4, \ - "`CHARS' field missing" ) - FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, \ - "`STARTCHAR' field missing" ) - FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, \ - "`ENCODING' field missing" ) - FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, \ - "`BBX' field missing" ) - FT_ERRORDEF_( Bbx_Too_Big, 0xB8, \ - "`BBX' too big" ) - FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, \ - "Font header corrupted or missing fields" ) - FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, \ - "Font glyphs corrupted or missing fields" ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/fterrors.h b/android/jni/ndk_modules/freetype/include/freetype/fterrors.h deleted file mode 100644 index 6600dadd..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/fterrors.h +++ /dev/null @@ -1,206 +0,0 @@ -/***************************************************************************/ -/* */ -/* fterrors.h */ -/* */ -/* FreeType error code handling (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2004, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This special header file is used to define the handling of FT2 */ - /* enumeration constants. It can also be used to generate error message */ - /* strings with a small macro trick explained below. */ - /* */ - /* I - Error Formats */ - /* ----------------- */ - /* */ - /* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be */ - /* defined in ftoption.h in order to make the higher byte indicate */ - /* the module where the error has happened (this is not compatible */ - /* with standard builds of FreeType 2). You can then use the macro */ - /* FT_ERROR_BASE macro to extract the generic error code from an */ - /* FT_Error value. */ - /* */ - /* */ - /* II - Error Message strings */ - /* -------------------------- */ - /* */ - /* The error definitions below are made through special macros that */ - /* allow client applications to build a table of error message strings */ - /* if they need it. The strings are not included in a normal build of */ - /* FreeType 2 to save space (most client applications do not use */ - /* them). */ - /* */ - /* To do so, you have to define the following macros before including */ - /* this file: */ - /* */ - /* FT_ERROR_START_LIST :: */ - /* This macro is called before anything else to define the start of */ - /* the error list. It is followed by several FT_ERROR_DEF calls */ - /* (see below). */ - /* */ - /* FT_ERROR_DEF( e, v, s ) :: */ - /* This macro is called to define one single error. */ - /* `e' is the error code identifier (e.g. FT_Err_Invalid_Argument). */ - /* `v' is the error numerical value. */ - /* `s' is the corresponding error string. */ - /* */ - /* FT_ERROR_END_LIST :: */ - /* This macro ends the list. */ - /* */ - /* Additionally, you have to undefine __FTERRORS_H__ before #including */ - /* this file. */ - /* */ - /* Here is a simple example: */ - /* */ - /* { */ - /* #undef __FTERRORS_H__ */ - /* #define FT_ERRORDEF( e, v, s ) { e, s }, */ - /* #define FT_ERROR_START_LIST { */ - /* #define FT_ERROR_END_LIST { 0, 0 } }; */ - /* */ - /* const struct */ - /* { */ - /* int err_code; */ - /* const char* err_msg; */ - /* } ft_errors[] = */ - /* */ - /* #include FT_ERRORS_H */ - /* } */ - /* */ - /*************************************************************************/ - - -#ifndef __FTERRORS_H__ -#define __FTERRORS_H__ - - - /* include module base error codes */ -#include FT_MODULE_ERRORS_H - - - /*******************************************************************/ - /*******************************************************************/ - /***** *****/ - /***** SETUP MACROS *****/ - /***** *****/ - /*******************************************************************/ - /*******************************************************************/ - - -#undef FT_NEED_EXTERN_C - -#undef FT_ERR_XCAT -#undef FT_ERR_CAT - -#define FT_ERR_XCAT( x, y ) x ## y -#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) - - - /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ - /* By default, we use `FT_Err_'. */ - /* */ -#ifndef FT_ERR_PREFIX -#define FT_ERR_PREFIX FT_Err_ -#endif - - - /* FT_ERR_BASE is used as the base for module-specific errors. */ - /* */ -#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS - -#ifndef FT_ERR_BASE -#define FT_ERR_BASE FT_Mod_Err_Base -#endif - -#else - -#undef FT_ERR_BASE -#define FT_ERR_BASE 0 - -#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ - - - /* If FT_ERRORDEF is not defined, we need to define a simple */ - /* enumeration type. */ - /* */ -#ifndef FT_ERRORDEF - -#define FT_ERRORDEF( e, v, s ) e = v, -#define FT_ERROR_START_LIST enum { -#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; - -#ifdef __cplusplus -#define FT_NEED_EXTERN_C - extern "C" { -#endif - -#endif /* !FT_ERRORDEF */ - - - /* this macro is used to define an error */ -#define FT_ERRORDEF_( e, v, s ) \ - FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) - - /* this is only used for <module>_Err_Ok, which must be 0! */ -#define FT_NOERRORDEF_( e, v, s ) \ - FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) - - -#ifdef FT_ERROR_START_LIST - FT_ERROR_START_LIST -#endif - - - /* now include the error codes */ -#include FT_ERROR_DEFINITIONS_H - - -#ifdef FT_ERROR_END_LIST - FT_ERROR_END_LIST -#endif - - - /*******************************************************************/ - /*******************************************************************/ - /***** *****/ - /***** SIMPLE CLEANUP *****/ - /***** *****/ - /*******************************************************************/ - /*******************************************************************/ - -#ifdef FT_NEED_EXTERN_C - } -#endif - -#undef FT_ERROR_START_LIST -#undef FT_ERROR_END_LIST - -#undef FT_ERRORDEF -#undef FT_ERRORDEF_ -#undef FT_NOERRORDEF_ - -#undef FT_NEED_EXTERN_C -#undef FT_ERR_CONCAT -#undef FT_ERR_BASE - - /* FT_KEEP_ERR_PREFIX is needed for ftvalid.h */ -#ifndef FT_KEEP_ERR_PREFIX -#undef FT_ERR_PREFIX -#endif - -#endif /* __FTERRORS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftgasp.h b/android/jni/ndk_modules/freetype/include/freetype/ftgasp.h deleted file mode 100644 index 91a769e5..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftgasp.h +++ /dev/null @@ -1,120 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgasp.h */ -/* */ -/* Access of TrueType's `gasp' table (specification). */ -/* */ -/* Copyright 2007, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef _FT_GASP_H_ -#define _FT_GASP_H_ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - - /*************************************************************************** - * - * @section: - * gasp_table - * - * @title: - * Gasp Table - * - * @abstract: - * Retrieving TrueType `gasp' table entries. - * - * @description: - * The function @FT_Get_Gasp can be used to query a TrueType or OpenType - * font for specific entries in its `gasp' table, if any. This is - * mainly useful when implementing native TrueType hinting with the - * bytecode interpreter to duplicate the Windows text rendering results. - */ - - /************************************************************************* - * - * @enum: - * FT_GASP_XXX - * - * @description: - * A list of values and/or bit-flags returned by the @FT_Get_Gasp - * function. - * - * @values: - * FT_GASP_NO_TABLE :: - * This special value means that there is no GASP table in this face. - * It is up to the client to decide what to do. - * - * FT_GASP_DO_GRIDFIT :: - * Grid-fitting and hinting should be performed at the specified ppem. - * This *really* means TrueType bytecode interpretation. - * - * FT_GASP_DO_GRAY :: - * Anti-aliased rendering should be performed at the specified ppem. - * - * FT_GASP_SYMMETRIC_SMOOTHING :: - * Smoothing along multiple axes must be used with ClearType. - * - * FT_GASP_SYMMETRIC_GRIDFIT :: - * Grid-fitting must be used with ClearType's symmetric smoothing. - * - * @note: - * `ClearType' is Microsoft's implementation of LCD rendering, partly - * protected by patents. - * - * @since: - * 2.3.0 - */ -#define FT_GASP_NO_TABLE -1 -#define FT_GASP_DO_GRIDFIT 0x01 -#define FT_GASP_DO_GRAY 0x02 -#define FT_GASP_SYMMETRIC_SMOOTHING 0x08 -#define FT_GASP_SYMMETRIC_GRIDFIT 0x10 - - - /************************************************************************* - * - * @func: - * FT_Get_Gasp - * - * @description: - * Read the `gasp' table from a TrueType or OpenType font file and - * return the entry corresponding to a given character pixel size. - * - * @input: - * face :: The source face handle. - * ppem :: The vertical character pixel size. - * - * @return: - * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no - * `gasp' table in the face. - * - * @since: - * 2.3.0 - */ - FT_EXPORT( FT_Int ) - FT_Get_Gasp( FT_Face face, - FT_UInt ppem ); - -/* */ - -#endif /* _FT_GASP_H_ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftglyph.h b/android/jni/ndk_modules/freetype/include/freetype/ftglyph.h deleted file mode 100644 index 0b8f0c04..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftglyph.h +++ /dev/null @@ -1,613 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftglyph.h */ -/* */ -/* FreeType convenience functions to handle glyphs (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file contains the definition of several convenience functions */ - /* that can be used by client applications to easily retrieve glyph */ - /* bitmaps and outlines from a given face. */ - /* */ - /* These functions should be optional if you are writing a font server */ - /* or text layout engine on top of FreeType. However, they are pretty */ - /* handy for many other simple uses of the library. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTGLYPH_H__ -#define __FTGLYPH_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* glyph_management */ - /* */ - /* <Title> */ - /* Glyph Management */ - /* */ - /* <Abstract> */ - /* Generic interface to manage individual glyph data. */ - /* */ - /* <Description> */ - /* This section contains definitions used to manage glyph data */ - /* through generic FT_Glyph objects. Each of them can contain a */ - /* bitmap, a vector outline, or even images in other formats. */ - /* */ - /*************************************************************************/ - - - /* forward declaration to a private type */ - typedef struct FT_Glyph_Class_ FT_Glyph_Class; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Glyph */ - /* */ - /* <Description> */ - /* Handle to an object used to model generic glyph images. It is a */ - /* pointer to the @FT_GlyphRec structure and can contain a glyph */ - /* bitmap or pointer. */ - /* */ - /* <Note> */ - /* Glyph objects are not owned by the library. You must thus release */ - /* them manually (through @FT_Done_Glyph) _before_ calling */ - /* @FT_Done_FreeType. */ - /* */ - typedef struct FT_GlyphRec_* FT_Glyph; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_GlyphRec */ - /* */ - /* <Description> */ - /* The root glyph structure contains a given glyph image plus its */ - /* advance width in 16.16 fixed float format. */ - /* */ - /* <Fields> */ - /* library :: A handle to the FreeType library object. */ - /* */ - /* clazz :: A pointer to the glyph's class. Private. */ - /* */ - /* format :: The format of the glyph's image. */ - /* */ - /* advance :: A 16.16 vector that gives the glyph's advance width. */ - /* */ - typedef struct FT_GlyphRec_ - { - FT_Library library; - const FT_Glyph_Class* clazz; - FT_Glyph_Format format; - FT_Vector advance; - - } FT_GlyphRec; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_BitmapGlyph */ - /* */ - /* <Description> */ - /* A handle to an object used to model a bitmap glyph image. This is */ - /* a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. */ - /* */ - typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_BitmapGlyphRec */ - /* */ - /* <Description> */ - /* A structure used for bitmap glyph images. This really is a */ - /* `sub-class' of @FT_GlyphRec. */ - /* */ - /* <Fields> */ - /* root :: The root @FT_Glyph fields. */ - /* */ - /* left :: The left-side bearing, i.e., the horizontal distance */ - /* from the current pen position to the left border of the */ - /* glyph bitmap. */ - /* */ - /* top :: The top-side bearing, i.e., the vertical distance from */ - /* the current pen position to the top border of the glyph */ - /* bitmap. This distance is positive for upwards~y! */ - /* */ - /* bitmap :: A descriptor for the bitmap. */ - /* */ - /* <Note> */ - /* You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have */ - /* `glyph->format == FT_GLYPH_FORMAT_BITMAP'. This lets you access */ - /* the bitmap's contents easily. */ - /* */ - /* The corresponding pixel buffer is always owned by @FT_BitmapGlyph */ - /* and is thus created and destroyed with it. */ - /* */ - typedef struct FT_BitmapGlyphRec_ - { - FT_GlyphRec root; - FT_Int left; - FT_Int top; - FT_Bitmap bitmap; - - } FT_BitmapGlyphRec; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_OutlineGlyph */ - /* */ - /* <Description> */ - /* A handle to an object used to model an outline glyph image. This */ - /* is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */ - /* */ - typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_OutlineGlyphRec */ - /* */ - /* <Description> */ - /* A structure used for outline (vectorial) glyph images. This */ - /* really is a `sub-class' of @FT_GlyphRec. */ - /* */ - /* <Fields> */ - /* root :: The root @FT_Glyph fields. */ - /* */ - /* outline :: A descriptor for the outline. */ - /* */ - /* <Note> */ - /* You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have */ - /* `glyph->format == FT_GLYPH_FORMAT_OUTLINE'. This lets you access */ - /* the outline's content easily. */ - /* */ - /* As the outline is extracted from a glyph slot, its coordinates are */ - /* expressed normally in 26.6 pixels, unless the flag */ - /* @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */ - /* */ - /* The outline's tables are always owned by the object and are */ - /* destroyed with it. */ - /* */ - typedef struct FT_OutlineGlyphRec_ - { - FT_GlyphRec root; - FT_Outline outline; - - } FT_OutlineGlyphRec; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Glyph */ - /* */ - /* <Description> */ - /* A function used to extract a glyph image from a slot. Note that */ - /* the created @FT_Glyph object must be released with @FT_Done_Glyph. */ - /* */ - /* <Input> */ - /* slot :: A handle to the source glyph slot. */ - /* */ - /* <Output> */ - /* aglyph :: A handle to the glyph object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Glyph( FT_GlyphSlot slot, - FT_Glyph *aglyph ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Glyph_Copy */ - /* */ - /* <Description> */ - /* A function used to copy a glyph image. Note that the created */ - /* @FT_Glyph object must be released with @FT_Done_Glyph. */ - /* */ - /* <Input> */ - /* source :: A handle to the source glyph object. */ - /* */ - /* <Output> */ - /* target :: A handle to the target glyph object. 0~in case of */ - /* error. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Glyph_Copy( FT_Glyph source, - FT_Glyph *target ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Glyph_Transform */ - /* */ - /* <Description> */ - /* Transform a glyph image if its format is scalable. */ - /* */ - /* <InOut> */ - /* glyph :: A handle to the target glyph object. */ - /* */ - /* <Input> */ - /* matrix :: A pointer to a 2x2 matrix to apply. */ - /* */ - /* delta :: A pointer to a 2d vector to apply. Coordinates are */ - /* expressed in 1/64th of a pixel. */ - /* */ - /* <Return> */ - /* FreeType error code (if not 0, the glyph format is not scalable). */ - /* */ - /* <Note> */ - /* The 2x2 transformation matrix is also applied to the glyph's */ - /* advance vector. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Glyph_Transform( FT_Glyph glyph, - FT_Matrix* matrix, - FT_Vector* delta ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Glyph_BBox_Mode */ - /* */ - /* <Description> */ - /* The mode how the values of @FT_Glyph_Get_CBox are returned. */ - /* */ - /* <Values> */ - /* FT_GLYPH_BBOX_UNSCALED :: */ - /* Return unscaled font units. */ - /* */ - /* FT_GLYPH_BBOX_SUBPIXELS :: */ - /* Return unfitted 26.6 coordinates. */ - /* */ - /* FT_GLYPH_BBOX_GRIDFIT :: */ - /* Return grid-fitted 26.6 coordinates. */ - /* */ - /* FT_GLYPH_BBOX_TRUNCATE :: */ - /* Return coordinates in integer pixels. */ - /* */ - /* FT_GLYPH_BBOX_PIXELS :: */ - /* Return grid-fitted pixel coordinates. */ - /* */ - typedef enum FT_Glyph_BBox_Mode_ - { - FT_GLYPH_BBOX_UNSCALED = 0, - FT_GLYPH_BBOX_SUBPIXELS = 0, - FT_GLYPH_BBOX_GRIDFIT = 1, - FT_GLYPH_BBOX_TRUNCATE = 2, - FT_GLYPH_BBOX_PIXELS = 3 - - } FT_Glyph_BBox_Mode; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* ft_glyph_bbox_xxx */ - /* */ - /* <Description> */ - /* These constants are deprecated. Use the corresponding */ - /* @FT_Glyph_BBox_Mode values instead. */ - /* */ - /* <Values> */ - /* ft_glyph_bbox_unscaled :: See @FT_GLYPH_BBOX_UNSCALED. */ - /* ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS. */ - /* ft_glyph_bbox_gridfit :: See @FT_GLYPH_BBOX_GRIDFIT. */ - /* ft_glyph_bbox_truncate :: See @FT_GLYPH_BBOX_TRUNCATE. */ - /* ft_glyph_bbox_pixels :: See @FT_GLYPH_BBOX_PIXELS. */ - /* */ -#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED -#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS -#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT -#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE -#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Glyph_Get_CBox */ - /* */ - /* <Description> */ - /* Return a glyph's `control box'. The control box encloses all the */ - /* outline's points, including Bézier control points. Though it */ - /* coincides with the exact bounding box for most glyphs, it can be */ - /* slightly larger in some situations (like when rotating an outline */ - /* which contains Bézier outside arcs). */ - /* */ - /* Computing the control box is very fast, while getting the bounding */ - /* box can take much more time as it needs to walk over all segments */ - /* and arcs in the outline. To get the latter, you can use the */ - /* `ftbbox' component which is dedicated to this single task. */ - /* */ - /* <Input> */ - /* glyph :: A handle to the source glyph object. */ - /* */ - /* mode :: The mode which indicates how to interpret the returned */ - /* bounding box values. */ - /* */ - /* <Output> */ - /* acbox :: The glyph coordinate bounding box. Coordinates are */ - /* expressed in 1/64th of pixels if it is grid-fitted. */ - /* */ - /* <Note> */ - /* Coordinates are relative to the glyph origin, using the y~upwards */ - /* convention. */ - /* */ - /* If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode' */ - /* must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font */ - /* units in 26.6 pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS */ - /* is another name for this constant. */ - /* */ - /* Note that the maximum coordinates are exclusive, which means that */ - /* one can compute the width and height of the glyph image (be it in */ - /* integer or 26.6 pixels) as: */ - /* */ - /* { */ - /* width = bbox.xMax - bbox.xMin; */ - /* height = bbox.yMax - bbox.yMin; */ - /* } */ - /* */ - /* Note also that for 26.6 coordinates, if `bbox_mode' is set to */ - /* @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, */ - /* which corresponds to: */ - /* */ - /* { */ - /* bbox.xMin = FLOOR(bbox.xMin); */ - /* bbox.yMin = FLOOR(bbox.yMin); */ - /* bbox.xMax = CEILING(bbox.xMax); */ - /* bbox.yMax = CEILING(bbox.yMax); */ - /* } */ - /* */ - /* To get the bbox in pixel coordinates, set `bbox_mode' to */ - /* @FT_GLYPH_BBOX_TRUNCATE. */ - /* */ - /* To get the bbox in grid-fitted pixel coordinates, set `bbox_mode' */ - /* to @FT_GLYPH_BBOX_PIXELS. */ - /* */ - FT_EXPORT( void ) - FT_Glyph_Get_CBox( FT_Glyph glyph, - FT_UInt bbox_mode, - FT_BBox *acbox ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Glyph_To_Bitmap */ - /* */ - /* <Description> */ - /* Convert a given glyph object to a bitmap glyph object. */ - /* */ - /* <InOut> */ - /* the_glyph :: A pointer to a handle to the target glyph. */ - /* */ - /* <Input> */ - /* render_mode :: An enumeration that describes how the data is */ - /* rendered. */ - /* */ - /* origin :: A pointer to a vector used to translate the glyph */ - /* image before rendering. Can be~0 (if no */ - /* translation). The origin is expressed in */ - /* 26.6 pixels. */ - /* */ - /* destroy :: A boolean that indicates that the original glyph */ - /* image should be destroyed by this function. It is */ - /* never destroyed in case of error. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* This function does nothing if the glyph format isn't scalable. */ - /* */ - /* The glyph image is translated with the `origin' vector before */ - /* rendering. */ - /* */ - /* The first parameter is a pointer to an @FT_Glyph handle, that will */ - /* be _replaced_ by this function (with newly allocated data). */ - /* Typically, you would use (omitting error handling): */ - /* */ - /* */ - /* { */ - /* FT_Glyph glyph; */ - /* FT_BitmapGlyph glyph_bitmap; */ - /* */ - /* */ - /* // load glyph */ - /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT ); */ - /* */ - /* // extract glyph image */ - /* error = FT_Get_Glyph( face->glyph, &glyph ); */ - /* */ - /* // convert to a bitmap (default render mode + destroying old) */ - /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */ - /* { */ - /* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, */ - /* 0, 1 ); */ - /* if ( error ) // `glyph' unchanged */ - /* ... */ - /* } */ - /* */ - /* // access bitmap content by typecasting */ - /* glyph_bitmap = (FT_BitmapGlyph)glyph; */ - /* */ - /* // do funny stuff with it, like blitting/drawing */ - /* ... */ - /* */ - /* // discard glyph image (bitmap or not) */ - /* FT_Done_Glyph( glyph ); */ - /* } */ - /* */ - /* */ - /* Here another example, again without error handling: */ - /* */ - /* */ - /* { */ - /* FT_Glyph glyphs[MAX_GLYPHS] */ - /* */ - /* */ - /* ... */ - /* */ - /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ - /* error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || */ - /* FT_Get_Glyph ( face->glyph, &glyph[idx] ); */ - /* */ - /* ... */ - /* */ - /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ - /* { */ - /* FT_Glyph bitmap = glyphs[idx]; */ - /* */ - /* */ - /* ... */ - /* */ - /* // after this call, `bitmap' no longer points into */ - /* // the `glyphs' array (and the old value isn't destroyed) */ - /* FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); */ - /* */ - /* ... */ - /* */ - /* FT_Done_Glyph( bitmap ); */ - /* } */ - /* */ - /* ... */ - /* */ - /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ - /* FT_Done_Glyph( glyphs[idx] ); */ - /* } */ - /* */ - FT_EXPORT( FT_Error ) - FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, - FT_Render_Mode render_mode, - FT_Vector* origin, - FT_Bool destroy ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_Glyph */ - /* */ - /* <Description> */ - /* Destroy a given glyph. */ - /* */ - /* <Input> */ - /* glyph :: A handle to the target glyph object. */ - /* */ - FT_EXPORT( void ) - FT_Done_Glyph( FT_Glyph glyph ); - - /* */ - - - /* other helpful functions */ - - /*************************************************************************/ - /* */ - /* <Section> */ - /* computations */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Matrix_Multiply */ - /* */ - /* <Description> */ - /* Perform the matrix operation `b = a*b'. */ - /* */ - /* <Input> */ - /* a :: A pointer to matrix `a'. */ - /* */ - /* <InOut> */ - /* b :: A pointer to matrix `b'. */ - /* */ - /* <Note> */ - /* The result is undefined if either `a' or `b' is zero. */ - /* */ - FT_EXPORT( void ) - FT_Matrix_Multiply( const FT_Matrix* a, - FT_Matrix* b ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Matrix_Invert */ - /* */ - /* <Description> */ - /* Invert a 2x2 matrix. Return an error if it can't be inverted. */ - /* */ - /* <InOut> */ - /* matrix :: A pointer to the target matrix. Remains untouched in */ - /* case of error. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Matrix_Invert( FT_Matrix* matrix ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTGLYPH_H__ */ - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftgxval.h b/android/jni/ndk_modules/freetype/include/freetype/ftgxval.h deleted file mode 100644 index 497015c1..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftgxval.h +++ /dev/null @@ -1,358 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgxval.h */ -/* */ -/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ -/* */ -/* Copyright 2004, 2005, 2006 by */ -/* Masatake YAMATO, Redhat K.K, */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTGXVAL_H__ -#define __FTGXVAL_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* gx_validation */ - /* */ - /* <Title> */ - /* TrueTypeGX/AAT Validation */ - /* */ - /* <Abstract> */ - /* An API to validate TrueTypeGX/AAT tables. */ - /* */ - /* <Description> */ - /* This section contains the declaration of functions to validate */ - /* some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, */ - /* trak, prop, lcar). */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* Warning: Use FT_VALIDATE_XXX to validate a table. */ - /* Following definitions are for gxvalid developers. */ - /* */ - /* */ - /*************************************************************************/ - -#define FT_VALIDATE_feat_INDEX 0 -#define FT_VALIDATE_mort_INDEX 1 -#define FT_VALIDATE_morx_INDEX 2 -#define FT_VALIDATE_bsln_INDEX 3 -#define FT_VALIDATE_just_INDEX 4 -#define FT_VALIDATE_kern_INDEX 5 -#define FT_VALIDATE_opbd_INDEX 6 -#define FT_VALIDATE_trak_INDEX 7 -#define FT_VALIDATE_prop_INDEX 8 -#define FT_VALIDATE_lcar_INDEX 9 -#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX - - - /************************************************************************* - * - * @macro: - * FT_VALIDATE_GX_LENGTH - * - * @description: - * The number of tables checked in this module. Use it as a parameter - * for the `table-length' argument of function @FT_TrueTypeGX_Validate. - */ -#define FT_VALIDATE_GX_LENGTH (FT_VALIDATE_GX_LAST_INDEX + 1) - - /* */ - - /* Up to 0x1000 is used by otvalid. - Ox2xxx is reserved for feature OT extension. */ -#define FT_VALIDATE_GX_START 0x4000 -#define FT_VALIDATE_GX_BITFIELD( tag ) \ - ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX ) - - - /********************************************************************** - * - * @enum: - * FT_VALIDATE_GXXXX - * - * @description: - * A list of bit-field constants used with @FT_TrueTypeGX_Validate to - * indicate which TrueTypeGX/AAT Type tables should be validated. - * - * @values: - * FT_VALIDATE_feat :: - * Validate `feat' table. - * - * FT_VALIDATE_mort :: - * Validate `mort' table. - * - * FT_VALIDATE_morx :: - * Validate `morx' table. - * - * FT_VALIDATE_bsln :: - * Validate `bsln' table. - * - * FT_VALIDATE_just :: - * Validate `just' table. - * - * FT_VALIDATE_kern :: - * Validate `kern' table. - * - * FT_VALIDATE_opbd :: - * Validate `opbd' table. - * - * FT_VALIDATE_trak :: - * Validate `trak' table. - * - * FT_VALIDATE_prop :: - * Validate `prop' table. - * - * FT_VALIDATE_lcar :: - * Validate `lcar' table. - * - * FT_VALIDATE_GX :: - * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern, - * opbd, trak, prop and lcar). - * - */ - -#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat ) -#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort ) -#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx ) -#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln ) -#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just ) -#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern ) -#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd ) -#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak ) -#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop ) -#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar ) - -#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \ - FT_VALIDATE_mort | \ - FT_VALIDATE_morx | \ - FT_VALIDATE_bsln | \ - FT_VALIDATE_just | \ - FT_VALIDATE_kern | \ - FT_VALIDATE_opbd | \ - FT_VALIDATE_trak | \ - FT_VALIDATE_prop | \ - FT_VALIDATE_lcar ) - - - /* */ - - /********************************************************************** - * - * @function: - * FT_TrueTypeGX_Validate - * - * @description: - * Validate various TrueTypeGX tables to assure that all offsets and - * indices are valid. The idea is that a higher-level library which - * actually does the text layout can access those tables without - * error checking (which can be quite time consuming). - * - * @input: - * face :: - * A handle to the input face. - * - * validation_flags :: - * A bit field which specifies the tables to be validated. See - * @FT_VALIDATE_GXXXX for possible values. - * - * table_length :: - * The size of the `tables' array. Normally, @FT_VALIDATE_GX_LENGTH - * should be passed. - * - * @output: - * tables :: - * The array where all validated sfnt tables are stored. - * The array itself must be allocated by a client. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with TrueTypeGX fonts, returning an error - * otherwise. - * - * After use, the application should deallocate the buffers pointed to by - * each `tables' element, by calling @FT_TrueTypeGX_Free. A NULL value - * indicates that the table either doesn't exist in the font, the - * application hasn't asked for validation, or the validator doesn't have - * the ability to validate the sfnt table. - */ - FT_EXPORT( FT_Error ) - FT_TrueTypeGX_Validate( FT_Face face, - FT_UInt validation_flags, - FT_Bytes tables[FT_VALIDATE_GX_LENGTH], - FT_UInt table_length ); - - - /* */ - - /********************************************************************** - * - * @function: - * FT_TrueTypeGX_Free - * - * @description: - * Free the buffer allocated by TrueTypeGX validator. - * - * @input: - * face :: - * A handle to the input face. - * - * table :: - * The pointer to the buffer allocated by - * @FT_TrueTypeGX_Validate. - * - * @note: - * This function must be used to free the buffer allocated by - * @FT_TrueTypeGX_Validate only. - */ - FT_EXPORT( void ) - FT_TrueTypeGX_Free( FT_Face face, - FT_Bytes table ); - - - /* */ - - /********************************************************************** - * - * @enum: - * FT_VALIDATE_CKERNXXX - * - * @description: - * A list of bit-field constants used with @FT_ClassicKern_Validate - * to indicate the classic kern dialect or dialects. If the selected - * type doesn't fit, @FT_ClassicKern_Validate regards the table as - * invalid. - * - * @values: - * FT_VALIDATE_MS :: - * Handle the `kern' table as a classic Microsoft kern table. - * - * FT_VALIDATE_APPLE :: - * Handle the `kern' table as a classic Apple kern table. - * - * FT_VALIDATE_CKERN :: - * Handle the `kern' as either classic Apple or Microsoft kern table. - */ -#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 ) -#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 ) - -#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE ) - - - /* */ - - /********************************************************************** - * - * @function: - * FT_ClassicKern_Validate - * - * @description: - * Validate classic (16-bit format) kern table to assure that the offsets - * and indices are valid. The idea is that a higher-level library which - * actually does the text layout can access those tables without error - * checking (which can be quite time consuming). - * - * The `kern' table validator in @FT_TrueTypeGX_Validate deals with both - * the new 32-bit format and the classic 16-bit format, while - * FT_ClassicKern_Validate only supports the classic 16-bit format. - * - * @input: - * face :: - * A handle to the input face. - * - * validation_flags :: - * A bit field which specifies the dialect to be validated. See - * @FT_VALIDATE_CKERNXXX for possible values. - * - * @output: - * ckern_table :: - * A pointer to the kern table. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * After use, the application should deallocate the buffers pointed to by - * `ckern_table', by calling @FT_ClassicKern_Free. A NULL value - * indicates that the table doesn't exist in the font. - */ - FT_EXPORT( FT_Error ) - FT_ClassicKern_Validate( FT_Face face, - FT_UInt validation_flags, - FT_Bytes *ckern_table ); - - - /* */ - - /********************************************************************** - * - * @function: - * FT_ClassicKern_Free - * - * @description: - * Free the buffer allocated by classic Kern validator. - * - * @input: - * face :: - * A handle to the input face. - * - * table :: - * The pointer to the buffer that is allocated by - * @FT_ClassicKern_Validate. - * - * @note: - * This function must be used to free the buffer allocated by - * @FT_ClassicKern_Validate only. - */ - FT_EXPORT( void ) - FT_ClassicKern_Free( FT_Face face, - FT_Bytes table ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTGXVAL_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftgzip.h b/android/jni/ndk_modules/freetype/include/freetype/ftgzip.h deleted file mode 100644 index acbc4f03..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftgzip.h +++ /dev/null @@ -1,102 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgzip.h */ -/* */ -/* Gzip-compressed stream support. */ -/* */ -/* Copyright 2002, 2003, 2004, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTGZIP_H__ -#define __FTGZIP_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /* */ - /* <Section> */ - /* gzip */ - /* */ - /* <Title> */ - /* GZIP Streams */ - /* */ - /* <Abstract> */ - /* Using gzip-compressed font files. */ - /* */ - /* <Description> */ - /* This section contains the declaration of Gzip-specific functions. */ - /* */ - /*************************************************************************/ - - - /************************************************************************ - * - * @function: - * FT_Stream_OpenGzip - * - * @description: - * Open a new stream to parse gzip-compressed font files. This is - * mainly used to support the compressed `*.pcf.gz' fonts that come - * with XFree86. - * - * @input: - * stream :: - * The target embedding stream. - * - * source :: - * The source stream. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The source stream must be opened _before_ calling this function. - * - * Calling the internal function `FT_Stream_Close' on the new stream will - * *not* call `FT_Stream_Close' on the source stream. None of the stream - * objects will be released to the heap. - * - * The stream implementation is very basic and resets the decompression - * process each time seeking backwards is needed within the stream. - * - * In certain builds of the library, gzip compression recognition is - * automatically handled when calling @FT_New_Face or @FT_Open_Face. - * This means that if no font driver is capable of handling the raw - * compressed file, the library will try to open a gzipped stream from - * it and re-open the face with it. - * - * This function may return `FT_Err_Unimplemented_Feature' if your build - * of FreeType was not compiled with zlib support. - */ - FT_EXPORT( FT_Error ) - FT_Stream_OpenGzip( FT_Stream stream, - FT_Stream source ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTGZIP_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftimage.h b/android/jni/ndk_modules/freetype/include/freetype/ftimage.h deleted file mode 100644 index 0272e92d..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftimage.h +++ /dev/null @@ -1,1301 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftimage.h */ -/* */ -/* FreeType glyph image formats and default raster interface */ -/* (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* Note: A `raster' is simply a scan-line converter, used to render */ - /* FT_Outlines into FT_Bitmaps. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTIMAGE_H__ -#define __FTIMAGE_H__ - - - /* _STANDALONE_ is from ftgrays.c */ -#ifndef _STANDALONE_ -#include <ft2build.h> -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* basic_types */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Pos */ - /* */ - /* <Description> */ - /* The type FT_Pos is used to store vectorial coordinates. Depending */ - /* on the context, these can represent distances in integer font */ - /* units, or 16.16, or 26.6 fixed float pixel coordinates. */ - /* */ - typedef signed long FT_Pos; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Vector */ - /* */ - /* <Description> */ - /* A simple structure used to store a 2D vector; coordinates are of */ - /* the FT_Pos type. */ - /* */ - /* <Fields> */ - /* x :: The horizontal coordinate. */ - /* y :: The vertical coordinate. */ - /* */ - typedef struct FT_Vector_ - { - FT_Pos x; - FT_Pos y; - - } FT_Vector; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_BBox */ - /* */ - /* <Description> */ - /* A structure used to hold an outline's bounding box, i.e., the */ - /* coordinates of its extrema in the horizontal and vertical */ - /* directions. */ - /* */ - /* <Fields> */ - /* xMin :: The horizontal minimum (left-most). */ - /* */ - /* yMin :: The vertical minimum (bottom-most). */ - /* */ - /* xMax :: The horizontal maximum (right-most). */ - /* */ - /* yMax :: The vertical maximum (top-most). */ - /* */ - /* <Note> */ - /* The bounding box is specified with the coordinates of the lower */ - /* left and the upper right corner. In PostScript, those values are */ - /* often called (llx,lly) and (urx,ury), respectively. */ - /* */ - /* If `yMin' is negative, this value gives the glyph's descender. */ - /* Otherwise, the glyph doesn't descend below the baseline. */ - /* Similarly, if `ymax' is positive, this value gives the glyph's */ - /* ascender. */ - /* */ - /* `xMin' gives the horizontal distance from the glyph's origin to */ - /* the left edge of the glyph's bounding box. If `xMin' is negative, */ - /* the glyph extends to the left of the origin. */ - /* */ - typedef struct FT_BBox_ - { - FT_Pos xMin, yMin; - FT_Pos xMax, yMax; - - } FT_BBox; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Pixel_Mode */ - /* */ - /* <Description> */ - /* An enumeration type used to describe the format of pixels in a */ - /* given bitmap. Note that additional formats may be added in the */ - /* future. */ - /* */ - /* <Values> */ - /* FT_PIXEL_MODE_NONE :: */ - /* Value~0 is reserved. */ - /* */ - /* FT_PIXEL_MODE_MONO :: */ - /* A monochrome bitmap, using 1~bit per pixel. Note that pixels */ - /* are stored in most-significant order (MSB), which means that */ - /* the left-most pixel in a byte has value 128. */ - /* */ - /* FT_PIXEL_MODE_GRAY :: */ - /* An 8-bit bitmap, generally used to represent anti-aliased glyph */ - /* images. Each pixel is stored in one byte. Note that the number */ - /* of `gray' levels is stored in the `num_grays' field of the */ - /* @FT_Bitmap structure (it generally is 256). */ - /* */ - /* FT_PIXEL_MODE_GRAY2 :: */ - /* A 2-bit per pixel bitmap, used to represent embedded */ - /* anti-aliased bitmaps in font files according to the OpenType */ - /* specification. We haven't found a single font using this */ - /* format, however. */ - /* */ - /* FT_PIXEL_MODE_GRAY4 :: */ - /* A 4-bit per pixel bitmap, representing embedded anti-aliased */ - /* bitmaps in font files according to the OpenType specification. */ - /* We haven't found a single font using this format, however. */ - /* */ - /* FT_PIXEL_MODE_LCD :: */ - /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */ - /* used for display on LCD displays; the bitmap is three times */ - /* wider than the original glyph image. See also */ - /* @FT_RENDER_MODE_LCD. */ - /* */ - /* FT_PIXEL_MODE_LCD_V :: */ - /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */ - /* used for display on rotated LCD displays; the bitmap is three */ - /* times taller than the original glyph image. See also */ - /* @FT_RENDER_MODE_LCD_V. */ - /* */ - typedef enum FT_Pixel_Mode_ - { - FT_PIXEL_MODE_NONE = 0, - FT_PIXEL_MODE_MONO, - FT_PIXEL_MODE_GRAY, - FT_PIXEL_MODE_GRAY2, - FT_PIXEL_MODE_GRAY4, - FT_PIXEL_MODE_LCD, - FT_PIXEL_MODE_LCD_V, - - FT_PIXEL_MODE_MAX /* do not remove */ - - } FT_Pixel_Mode; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* ft_pixel_mode_xxx */ - /* */ - /* <Description> */ - /* A list of deprecated constants. Use the corresponding */ - /* @FT_Pixel_Mode values instead. */ - /* */ - /* <Values> */ - /* ft_pixel_mode_none :: See @FT_PIXEL_MODE_NONE. */ - /* ft_pixel_mode_mono :: See @FT_PIXEL_MODE_MONO. */ - /* ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY. */ - /* ft_pixel_mode_pal2 :: See @FT_PIXEL_MODE_GRAY2. */ - /* ft_pixel_mode_pal4 :: See @FT_PIXEL_MODE_GRAY4. */ - /* */ -#define ft_pixel_mode_none FT_PIXEL_MODE_NONE -#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO -#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY -#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 -#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 - - /* */ - -#if 0 - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Palette_Mode */ - /* */ - /* <Description> */ - /* THIS TYPE IS DEPRECATED. DO NOT USE IT! */ - /* */ - /* An enumeration type to describe the format of a bitmap palette, */ - /* used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8. */ - /* */ - /* <Values> */ - /* ft_palette_mode_rgb :: The palette is an array of 3-byte RGB */ - /* records. */ - /* */ - /* ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA */ - /* records. */ - /* */ - /* <Note> */ - /* As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by */ - /* FreeType, these types are not handled by the library itself. */ - /* */ - typedef enum FT_Palette_Mode_ - { - ft_palette_mode_rgb = 0, - ft_palette_mode_rgba, - - ft_palette_mode_max /* do not remove */ - - } FT_Palette_Mode; - - /* */ - -#endif - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Bitmap */ - /* */ - /* <Description> */ - /* A structure used to describe a bitmap or pixmap to the raster. */ - /* Note that we now manage pixmaps of various depths through the */ - /* `pixel_mode' field. */ - /* */ - /* <Fields> */ - /* rows :: The number of bitmap rows. */ - /* */ - /* width :: The number of pixels in bitmap row. */ - /* */ - /* pitch :: The pitch's absolute value is the number of bytes */ - /* taken by one bitmap row, including padding. */ - /* However, the pitch is positive when the bitmap has */ - /* a `down' flow, and negative when it has an `up' */ - /* flow. In all cases, the pitch is an offset to add */ - /* to a bitmap pointer in order to go down one row. */ - /* */ - /* For the B/W rasterizer, `pitch' is always an even */ - /* number. */ - /* */ - /* buffer :: A typeless pointer to the bitmap buffer. This */ - /* value should be aligned on 32-bit boundaries in */ - /* most cases. */ - /* */ - /* num_grays :: This field is only used with */ - /* @FT_PIXEL_MODE_GRAY; it gives the number of gray */ - /* levels used in the bitmap. */ - /* */ - /* pixel_mode :: The pixel mode, i.e., how pixel bits are stored. */ - /* See @FT_Pixel_Mode for possible values. */ - /* */ - /* palette_mode :: This field is intended for paletted pixel modes; */ - /* it indicates how the palette is stored. Not */ - /* used currently. */ - /* */ - /* palette :: A typeless pointer to the bitmap palette; this */ - /* field is intended for paletted pixel modes. Not */ - /* used currently. */ - /* */ - /* <Note> */ - /* For now, the only pixel modes supported by FreeType are mono and */ - /* grays. However, drivers might be added in the future to support */ - /* more `colorful' options. */ - /* */ - typedef struct FT_Bitmap_ - { - int rows; - int width; - int pitch; - unsigned char* buffer; - short num_grays; - char pixel_mode; - char palette_mode; - void* palette; - - } FT_Bitmap; - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* outline_processing */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Outline */ - /* */ - /* <Description> */ - /* This structure is used to describe an outline to the scan-line */ - /* converter. */ - /* */ - /* <Fields> */ - /* n_contours :: The number of contours in the outline. */ - /* */ - /* n_points :: The number of points in the outline. */ - /* */ - /* points :: A pointer to an array of `n_points' @FT_Vector */ - /* elements, giving the outline's point coordinates. */ - /* */ - /* tags :: A pointer to an array of `n_points' chars, giving */ - /* each outline point's type. */ - /* */ - /* If bit~0 is unset, the point is `off' the curve, */ - /* i.e., a Bézier control point, while it is `on' if */ - /* set. */ - /* */ - /* Bit~1 is meaningful for `off' points only. If set, */ - /* it indicates a third-order Bézier arc control point; */ - /* and a second-order control point if unset. */ - /* */ - /* If bit~2 is set, bits 5-7 contain the drop-out mode */ - /* (as defined in the OpenType specification; the value */ - /* is the same as the argument to the SCANMODE */ - /* instruction). */ - /* */ - /* Bits 3 and~4 are reserved for internal purposes. */ - /* */ - /* contours :: An array of `n_contours' shorts, giving the end */ - /* point of each contour within the outline. For */ - /* example, the first contour is defined by the points */ - /* `0' to `contours[0]', the second one is defined by */ - /* the points `contours[0]+1' to `contours[1]', etc. */ - /* */ - /* flags :: A set of bit flags used to characterize the outline */ - /* and give hints to the scan-converter and hinter on */ - /* how to convert/grid-fit it. See @FT_OUTLINE_FLAGS. */ - /* */ - /* <Note> */ - /* The B/W rasterizer only checks bit~2 in the `tags' array for the */ - /* first point of each contour. The drop-out mode as given with */ - /* @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and */ - /* @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden. */ - /* */ - typedef struct FT_Outline_ - { - short n_contours; /* number of contours in glyph */ - short n_points; /* number of points in the glyph */ - - FT_Vector* points; /* the outline's points */ - char* tags; /* the points flags */ - short* contours; /* the contour end points */ - - int flags; /* outline masks */ - - } FT_Outline; - - /* Following limits must be consistent with */ - /* FT_Outline.{n_contours,n_points} */ -#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX -#define FT_OUTLINE_POINTS_MAX SHRT_MAX - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_OUTLINE_FLAGS */ - /* */ - /* <Description> */ - /* A list of bit-field constants use for the flags in an outline's */ - /* `flags' field. */ - /* */ - /* <Values> */ - /* FT_OUTLINE_NONE :: */ - /* Value~0 is reserved. */ - /* */ - /* FT_OUTLINE_OWNER :: */ - /* If set, this flag indicates that the outline's field arrays */ - /* (i.e., `points', `flags', and `contours') are `owned' by the */ - /* outline object, and should thus be freed when it is destroyed. */ - /* */ - /* FT_OUTLINE_EVEN_ODD_FILL :: */ - /* By default, outlines are filled using the non-zero winding rule. */ - /* If set to 1, the outline will be filled using the even-odd fill */ - /* rule (only works with the smooth rasterizer). */ - /* */ - /* FT_OUTLINE_REVERSE_FILL :: */ - /* By default, outside contours of an outline are oriented in */ - /* clock-wise direction, as defined in the TrueType specification. */ - /* This flag is set if the outline uses the opposite direction */ - /* (typically for Type~1 fonts). This flag is ignored by the scan */ - /* converter. */ - /* */ - /* FT_OUTLINE_IGNORE_DROPOUTS :: */ - /* By default, the scan converter will try to detect drop-outs in */ - /* an outline and correct the glyph bitmap to ensure consistent */ - /* shape continuity. If set, this flag hints the scan-line */ - /* converter to ignore such cases. See below for more information. */ - /* */ - /* FT_OUTLINE_SMART_DROPOUTS :: */ - /* Select smart dropout control. If unset, use simple dropout */ - /* control. Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See */ - /* below for more information. */ - /* */ - /* FT_OUTLINE_INCLUDE_STUBS :: */ - /* If set, turn pixels on for `stubs', otherwise exclude them. */ - /* Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for */ - /* more information. */ - /* */ - /* FT_OUTLINE_HIGH_PRECISION :: */ - /* This flag indicates that the scan-line converter should try to */ - /* convert this outline to bitmaps with the highest possible */ - /* quality. It is typically set for small character sizes. Note */ - /* that this is only a hint that might be completely ignored by a */ - /* given scan-converter. */ - /* */ - /* FT_OUTLINE_SINGLE_PASS :: */ - /* This flag is set to force a given scan-converter to only use a */ - /* single pass over the outline to render a bitmap glyph image. */ - /* Normally, it is set for very large character sizes. It is only */ - /* a hint that might be completely ignored by a given */ - /* scan-converter. */ - /* */ - /* <Note> */ - /* The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */ - /* and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth */ - /* rasterizer. */ - /* */ - /* There exists a second mechanism to pass the drop-out mode to the */ - /* B/W rasterizer; see the `tags' field in @FT_Outline. */ - /* */ - /* Please refer to the description of the `SCANTYPE' instruction in */ - /* the OpenType specification (in file `ttinst1.doc') how simple */ - /* drop-outs, smart drop-outs, and stubs are defined. */ - /* */ -#define FT_OUTLINE_NONE 0x0 -#define FT_OUTLINE_OWNER 0x1 -#define FT_OUTLINE_EVEN_ODD_FILL 0x2 -#define FT_OUTLINE_REVERSE_FILL 0x4 -#define FT_OUTLINE_IGNORE_DROPOUTS 0x8 -#define FT_OUTLINE_SMART_DROPOUTS 0x10 -#define FT_OUTLINE_INCLUDE_STUBS 0x20 - -#define FT_OUTLINE_HIGH_PRECISION 0x100 -#define FT_OUTLINE_SINGLE_PASS 0x200 - - - /************************************************************************* - * - * @enum: - * ft_outline_flags - * - * @description: - * These constants are deprecated. Please use the corresponding - * @FT_OUTLINE_FLAGS values. - * - * @values: - * ft_outline_none :: See @FT_OUTLINE_NONE. - * ft_outline_owner :: See @FT_OUTLINE_OWNER. - * ft_outline_even_odd_fill :: See @FT_OUTLINE_EVEN_ODD_FILL. - * ft_outline_reverse_fill :: See @FT_OUTLINE_REVERSE_FILL. - * ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS. - * ft_outline_high_precision :: See @FT_OUTLINE_HIGH_PRECISION. - * ft_outline_single_pass :: See @FT_OUTLINE_SINGLE_PASS. - */ -#define ft_outline_none FT_OUTLINE_NONE -#define ft_outline_owner FT_OUTLINE_OWNER -#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL -#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL -#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS -#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION -#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS - - /* */ - -#define FT_CURVE_TAG( flag ) ( flag & 3 ) - -#define FT_CURVE_TAG_ON 1 -#define FT_CURVE_TAG_CONIC 0 -#define FT_CURVE_TAG_CUBIC 2 - -#define FT_CURVE_TAG_HAS_SCANMODE 4 - -#define FT_CURVE_TAG_TOUCH_X 8 /* reserved for the TrueType hinter */ -#define FT_CURVE_TAG_TOUCH_Y 16 /* reserved for the TrueType hinter */ - -#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ - FT_CURVE_TAG_TOUCH_Y ) - -#define FT_Curve_Tag_On FT_CURVE_TAG_ON -#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC -#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC -#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X -#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Outline_MoveToFunc */ - /* */ - /* <Description> */ - /* A function pointer type used to describe the signature of a `move */ - /* to' function during outline walking/decomposition. */ - /* */ - /* A `move to' is emitted to start a new contour in an outline. */ - /* */ - /* <Input> */ - /* to :: A pointer to the target point of the `move to'. */ - /* */ - /* user :: A typeless pointer which is passed from the caller of the */ - /* decomposition function. */ - /* */ - /* <Return> */ - /* Error code. 0~means success. */ - /* */ - typedef int - (*FT_Outline_MoveToFunc)( const FT_Vector* to, - void* user ); - -#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Outline_LineToFunc */ - /* */ - /* <Description> */ - /* A function pointer type used to describe the signature of a `line */ - /* to' function during outline walking/decomposition. */ - /* */ - /* A `line to' is emitted to indicate a segment in the outline. */ - /* */ - /* <Input> */ - /* to :: A pointer to the target point of the `line to'. */ - /* */ - /* user :: A typeless pointer which is passed from the caller of the */ - /* decomposition function. */ - /* */ - /* <Return> */ - /* Error code. 0~means success. */ - /* */ - typedef int - (*FT_Outline_LineToFunc)( const FT_Vector* to, - void* user ); - -#define FT_Outline_LineTo_Func FT_Outline_LineToFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Outline_ConicToFunc */ - /* */ - /* <Description> */ - /* A function pointer type used to describe the signature of a `conic */ - /* to' function during outline walking or decomposition. */ - /* */ - /* A `conic to' is emitted to indicate a second-order Bézier arc in */ - /* the outline. */ - /* */ - /* <Input> */ - /* control :: An intermediate control point between the last position */ - /* and the new target in `to'. */ - /* */ - /* to :: A pointer to the target end point of the conic arc. */ - /* */ - /* user :: A typeless pointer which is passed from the caller of */ - /* the decomposition function. */ - /* */ - /* <Return> */ - /* Error code. 0~means success. */ - /* */ - typedef int - (*FT_Outline_ConicToFunc)( const FT_Vector* control, - const FT_Vector* to, - void* user ); - -#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Outline_CubicToFunc */ - /* */ - /* <Description> */ - /* A function pointer type used to describe the signature of a `cubic */ - /* to' function during outline walking or decomposition. */ - /* */ - /* A `cubic to' is emitted to indicate a third-order Bézier arc. */ - /* */ - /* <Input> */ - /* control1 :: A pointer to the first Bézier control point. */ - /* */ - /* control2 :: A pointer to the second Bézier control point. */ - /* */ - /* to :: A pointer to the target end point. */ - /* */ - /* user :: A typeless pointer which is passed from the caller of */ - /* the decomposition function. */ - /* */ - /* <Return> */ - /* Error code. 0~means success. */ - /* */ - typedef int - (*FT_Outline_CubicToFunc)( const FT_Vector* control1, - const FT_Vector* control2, - const FT_Vector* to, - void* user ); - -#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Outline_Funcs */ - /* */ - /* <Description> */ - /* A structure to hold various function pointers used during outline */ - /* decomposition in order to emit segments, conic, and cubic Béziers. */ - /* */ - /* <Fields> */ - /* move_to :: The `move to' emitter. */ - /* */ - /* line_to :: The segment emitter. */ - /* */ - /* conic_to :: The second-order Bézier arc emitter. */ - /* */ - /* cubic_to :: The third-order Bézier arc emitter. */ - /* */ - /* shift :: The shift that is applied to coordinates before they */ - /* are sent to the emitter. */ - /* */ - /* delta :: The delta that is applied to coordinates before they */ - /* are sent to the emitter, but after the shift. */ - /* */ - /* <Note> */ - /* The point coordinates sent to the emitters are the transformed */ - /* version of the original coordinates (this is important for high */ - /* accuracy during scan-conversion). The transformation is simple: */ - /* */ - /* { */ - /* x' = (x << shift) - delta */ - /* y' = (x << shift) - delta */ - /* } */ - /* */ - /* Set the values of `shift' and `delta' to~0 to get the original */ - /* point coordinates. */ - /* */ - typedef struct FT_Outline_Funcs_ - { - FT_Outline_MoveToFunc move_to; - FT_Outline_LineToFunc line_to; - FT_Outline_ConicToFunc conic_to; - FT_Outline_CubicToFunc cubic_to; - - int shift; - FT_Pos delta; - - } FT_Outline_Funcs; - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* basic_types */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_IMAGE_TAG */ - /* */ - /* <Description> */ - /* This macro converts four-letter tags to an unsigned long type. */ - /* */ - /* <Note> */ - /* Since many 16-bit compilers don't like 32-bit enumerations, you */ - /* should redefine this macro in case of problems to something like */ - /* this: */ - /* */ - /* { */ - /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value */ - /* } */ - /* */ - /* to get a simple enumeration without assigning special numbers. */ - /* */ -#ifndef FT_IMAGE_TAG -#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ - value = ( ( (unsigned long)_x1 << 24 ) | \ - ( (unsigned long)_x2 << 16 ) | \ - ( (unsigned long)_x3 << 8 ) | \ - (unsigned long)_x4 ) -#endif /* FT_IMAGE_TAG */ - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Glyph_Format */ - /* */ - /* <Description> */ - /* An enumeration type used to describe the format of a given glyph */ - /* image. Note that this version of FreeType only supports two image */ - /* formats, even though future font drivers will be able to register */ - /* their own format. */ - /* */ - /* <Values> */ - /* FT_GLYPH_FORMAT_NONE :: */ - /* The value~0 is reserved. */ - /* */ - /* FT_GLYPH_FORMAT_COMPOSITE :: */ - /* The glyph image is a composite of several other images. This */ - /* format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to */ - /* report compound glyphs (like accented characters). */ - /* */ - /* FT_GLYPH_FORMAT_BITMAP :: */ - /* The glyph image is a bitmap, and can be described as an */ - /* @FT_Bitmap. You generally need to access the `bitmap' field of */ - /* the @FT_GlyphSlotRec structure to read it. */ - /* */ - /* FT_GLYPH_FORMAT_OUTLINE :: */ - /* The glyph image is a vectorial outline made of line segments */ - /* and Bézier arcs; it can be described as an @FT_Outline; you */ - /* generally want to access the `outline' field of the */ - /* @FT_GlyphSlotRec structure to read it. */ - /* */ - /* FT_GLYPH_FORMAT_PLOTTER :: */ - /* The glyph image is a vectorial path with no inside and outside */ - /* contours. Some Type~1 fonts, like those in the Hershey family, */ - /* contain glyphs in this format. These are described as */ - /* @FT_Outline, but FreeType isn't currently capable of rendering */ - /* them correctly. */ - /* */ - typedef enum FT_Glyph_Format_ - { - FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), - - FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), - FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), - FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), - FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ) - - } FT_Glyph_Format; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* ft_glyph_format_xxx */ - /* */ - /* <Description> */ - /* A list of deprecated constants. Use the corresponding */ - /* @FT_Glyph_Format values instead. */ - /* */ - /* <Values> */ - /* ft_glyph_format_none :: See @FT_GLYPH_FORMAT_NONE. */ - /* ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE. */ - /* ft_glyph_format_bitmap :: See @FT_GLYPH_FORMAT_BITMAP. */ - /* ft_glyph_format_outline :: See @FT_GLYPH_FORMAT_OUTLINE. */ - /* ft_glyph_format_plotter :: See @FT_GLYPH_FORMAT_PLOTTER. */ - /* */ -#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE -#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE -#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP -#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE -#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** R A S T E R D E F I N I T I O N S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* A raster is a scan converter, in charge of rendering an outline into */ - /* a a bitmap. This section contains the public API for rasters. */ - /* */ - /* Note that in FreeType 2, all rasters are now encapsulated within */ - /* specific modules called `renderers'. See `freetype/ftrender.h' for */ - /* more details on renderers. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* raster */ - /* */ - /* <Title> */ - /* Scanline Converter */ - /* */ - /* <Abstract> */ - /* How vectorial outlines are converted into bitmaps and pixmaps. */ - /* */ - /* <Description> */ - /* This section contains technical definitions. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Raster */ - /* */ - /* <Description> */ - /* A handle (pointer) to a raster object. Each object can be used */ - /* independently to convert an outline into a bitmap or pixmap. */ - /* */ - typedef struct FT_RasterRec_* FT_Raster; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Span */ - /* */ - /* <Description> */ - /* A structure used to model a single span of gray (or black) pixels */ - /* when rendering a monochrome or anti-aliased bitmap. */ - /* */ - /* <Fields> */ - /* x :: The span's horizontal start position. */ - /* */ - /* len :: The span's length in pixels. */ - /* */ - /* coverage :: The span color/coverage, ranging from 0 (background) */ - /* to 255 (foreground). Only used for anti-aliased */ - /* rendering. */ - /* */ - /* <Note> */ - /* This structure is used by the span drawing callback type named */ - /* @FT_SpanFunc which takes the y~coordinate of the span as a */ - /* a parameter. */ - /* */ - /* The coverage value is always between 0 and 255. If you want less */ - /* gray values, the callback function has to reduce them. */ - /* */ - typedef struct FT_Span_ - { - short x; - unsigned short len; - unsigned char coverage; - - } FT_Span; - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_SpanFunc */ - /* */ - /* <Description> */ - /* A function used as a call-back by the anti-aliased renderer in */ - /* order to let client applications draw themselves the gray pixel */ - /* spans on each scan line. */ - /* */ - /* <Input> */ - /* y :: The scanline's y~coordinate. */ - /* */ - /* count :: The number of spans to draw on this scanline. */ - /* */ - /* spans :: A table of `count' spans to draw on the scanline. */ - /* */ - /* user :: User-supplied data that is passed to the callback. */ - /* */ - /* <Note> */ - /* This callback allows client applications to directly render the */ - /* gray spans of the anti-aliased bitmap to any kind of surfaces. */ - /* */ - /* This can be used to write anti-aliased outlines directly to a */ - /* given background bitmap, and even perform translucency. */ - /* */ - /* Note that the `count' field cannot be greater than a fixed value */ - /* defined by the `FT_MAX_GRAY_SPANS' configuration macro in */ - /* `ftoption.h'. By default, this value is set to~32, which means */ - /* that if there are more than 32~spans on a given scanline, the */ - /* callback is called several times with the same `y' parameter in */ - /* order to draw all callbacks. */ - /* */ - /* Otherwise, the callback is only called once per scan-line, and */ - /* only for those scanlines that do have `gray' pixels on them. */ - /* */ - typedef void - (*FT_SpanFunc)( int y, - int count, - const FT_Span* spans, - void* user ); - -#define FT_Raster_Span_Func FT_SpanFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_BitTest_Func */ - /* */ - /* <Description> */ - /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ - /* */ - /* A function used as a call-back by the monochrome scan-converter */ - /* to test whether a given target pixel is already set to the drawing */ - /* `color'. These tests are crucial to implement drop-out control */ - /* per-se the TrueType spec. */ - /* */ - /* <Input> */ - /* y :: The pixel's y~coordinate. */ - /* */ - /* x :: The pixel's x~coordinate. */ - /* */ - /* user :: User-supplied data that is passed to the callback. */ - /* */ - /* <Return> */ - /* 1~if the pixel is `set', 0~otherwise. */ - /* */ - typedef int - (*FT_Raster_BitTest_Func)( int y, - int x, - void* user ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_BitSet_Func */ - /* */ - /* <Description> */ - /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ - /* */ - /* A function used as a call-back by the monochrome scan-converter */ - /* to set an individual target pixel. This is crucial to implement */ - /* drop-out control according to the TrueType specification. */ - /* */ - /* <Input> */ - /* y :: The pixel's y~coordinate. */ - /* */ - /* x :: The pixel's x~coordinate. */ - /* */ - /* user :: User-supplied data that is passed to the callback. */ - /* */ - /* <Return> */ - /* 1~if the pixel is `set', 0~otherwise. */ - /* */ - typedef void - (*FT_Raster_BitSet_Func)( int y, - int x, - void* user ); - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_RASTER_FLAG_XXX */ - /* */ - /* <Description> */ - /* A list of bit flag constants as used in the `flags' field of a */ - /* @FT_Raster_Params structure. */ - /* */ - /* <Values> */ - /* FT_RASTER_FLAG_DEFAULT :: This value is 0. */ - /* */ - /* FT_RASTER_FLAG_AA :: This flag is set to indicate that an */ - /* anti-aliased glyph image should be */ - /* generated. Otherwise, it will be */ - /* monochrome (1-bit). */ - /* */ - /* FT_RASTER_FLAG_DIRECT :: This flag is set to indicate direct */ - /* rendering. In this mode, client */ - /* applications must provide their own span */ - /* callback. This lets them directly */ - /* draw or compose over an existing bitmap. */ - /* If this bit is not set, the target */ - /* pixmap's buffer _must_ be zeroed before */ - /* rendering. */ - /* */ - /* Note that for now, direct rendering is */ - /* only possible with anti-aliased glyphs. */ - /* */ - /* FT_RASTER_FLAG_CLIP :: This flag is only used in direct */ - /* rendering mode. If set, the output will */ - /* be clipped to a box specified in the */ - /* `clip_box' field of the */ - /* @FT_Raster_Params structure. */ - /* */ - /* Note that by default, the glyph bitmap */ - /* is clipped to the target pixmap, except */ - /* in direct rendering mode where all spans */ - /* are generated if no clipping box is set. */ - /* */ -#define FT_RASTER_FLAG_DEFAULT 0x0 -#define FT_RASTER_FLAG_AA 0x1 -#define FT_RASTER_FLAG_DIRECT 0x2 -#define FT_RASTER_FLAG_CLIP 0x4 - - /* deprecated */ -#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT -#define ft_raster_flag_aa FT_RASTER_FLAG_AA -#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT -#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Raster_Params */ - /* */ - /* <Description> */ - /* A structure to hold the arguments used by a raster's render */ - /* function. */ - /* */ - /* <Fields> */ - /* target :: The target bitmap. */ - /* */ - /* source :: A pointer to the source glyph image (e.g., an */ - /* @FT_Outline). */ - /* */ - /* flags :: The rendering flags. */ - /* */ - /* gray_spans :: The gray span drawing callback. */ - /* */ - /* black_spans :: The black span drawing callback. UNIMPLEMENTED! */ - /* */ - /* bit_test :: The bit test callback. UNIMPLEMENTED! */ - /* */ - /* bit_set :: The bit set callback. UNIMPLEMENTED! */ - /* */ - /* user :: User-supplied data that is passed to each drawing */ - /* callback. */ - /* */ - /* clip_box :: An optional clipping box. It is only used in */ - /* direct rendering mode. Note that coordinates here */ - /* should be expressed in _integer_ pixels (and not in */ - /* 26.6 fixed-point units). */ - /* */ - /* <Note> */ - /* An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA */ - /* bit flag is set in the `flags' field, otherwise a monochrome */ - /* bitmap is generated. */ - /* */ - /* If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the */ - /* raster will call the `gray_spans' callback to draw gray pixel */ - /* spans, in the case of an aa glyph bitmap, it will call */ - /* `black_spans', and `bit_test' and `bit_set' in the case of a */ - /* monochrome bitmap. This allows direct composition over a */ - /* pre-existing bitmap through user-provided callbacks to perform the */ - /* span drawing/composition. */ - /* */ - /* Note that the `bit_test' and `bit_set' callbacks are required when */ - /* rendering a monochrome bitmap, as they are crucial to implement */ - /* correct drop-out control as defined in the TrueType specification. */ - /* */ - typedef struct FT_Raster_Params_ - { - const FT_Bitmap* target; - const void* source; - int flags; - FT_SpanFunc gray_spans; - FT_SpanFunc black_spans; /* doesn't work! */ - FT_Raster_BitTest_Func bit_test; /* doesn't work! */ - FT_Raster_BitSet_Func bit_set; /* doesn't work! */ - void* user; - FT_BBox clip_box; - - } FT_Raster_Params; - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_NewFunc */ - /* */ - /* <Description> */ - /* A function used to create a new raster object. */ - /* */ - /* <Input> */ - /* memory :: A handle to the memory allocator. */ - /* */ - /* <Output> */ - /* raster :: A handle to the new raster object. */ - /* */ - /* <Return> */ - /* Error code. 0~means success. */ - /* */ - /* <Note> */ - /* The `memory' parameter is a typeless pointer in order to avoid */ - /* un-wanted dependencies on the rest of the FreeType code. In */ - /* practice, it is an @FT_Memory object, i.e., a handle to the */ - /* standard FreeType memory allocator. However, this field can be */ - /* completely ignored by a given raster implementation. */ - /* */ - typedef int - (*FT_Raster_NewFunc)( void* memory, - FT_Raster* raster ); - -#define FT_Raster_New_Func FT_Raster_NewFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_DoneFunc */ - /* */ - /* <Description> */ - /* A function used to destroy a given raster object. */ - /* */ - /* <Input> */ - /* raster :: A handle to the raster object. */ - /* */ - typedef void - (*FT_Raster_DoneFunc)( FT_Raster raster ); - -#define FT_Raster_Done_Func FT_Raster_DoneFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_ResetFunc */ - /* */ - /* <Description> */ - /* FreeType provides an area of memory called the `render pool', */ - /* available to all registered rasters. This pool can be freely used */ - /* during a given scan-conversion but is shared by all rasters. Its */ - /* content is thus transient. */ - /* */ - /* This function is called each time the render pool changes, or just */ - /* after a new raster object is created. */ - /* */ - /* <Input> */ - /* raster :: A handle to the new raster object. */ - /* */ - /* pool_base :: The address in memory of the render pool. */ - /* */ - /* pool_size :: The size in bytes of the render pool. */ - /* */ - /* <Note> */ - /* Rasters can ignore the render pool and rely on dynamic memory */ - /* allocation if they want to (a handle to the memory allocator is */ - /* passed to the raster constructor). However, this is not */ - /* recommended for efficiency purposes. */ - /* */ - typedef void - (*FT_Raster_ResetFunc)( FT_Raster raster, - unsigned char* pool_base, - unsigned long pool_size ); - -#define FT_Raster_Reset_Func FT_Raster_ResetFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_SetModeFunc */ - /* */ - /* <Description> */ - /* This function is a generic facility to change modes or attributes */ - /* in a given raster. This can be used for debugging purposes, or */ - /* simply to allow implementation-specific `features' in a given */ - /* raster module. */ - /* */ - /* <Input> */ - /* raster :: A handle to the new raster object. */ - /* */ - /* mode :: A 4-byte tag used to name the mode or property. */ - /* */ - /* args :: A pointer to the new mode/property to use. */ - /* */ - typedef int - (*FT_Raster_SetModeFunc)( FT_Raster raster, - unsigned long mode, - void* args ); - -#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Raster_RenderFunc */ - /* */ - /* <Description> */ - /* Invoke a given raster to scan-convert a given glyph image into a */ - /* target bitmap. */ - /* */ - /* <Input> */ - /* raster :: A handle to the raster object. */ - /* */ - /* params :: A pointer to an @FT_Raster_Params structure used to */ - /* store the rendering parameters. */ - /* */ - /* <Return> */ - /* Error code. 0~means success. */ - /* */ - /* <Note> */ - /* The exact format of the source image depends on the raster's glyph */ - /* format defined in its @FT_Raster_Funcs structure. It can be an */ - /* @FT_Outline or anything else in order to support a large array of */ - /* glyph formats. */ - /* */ - /* Note also that the render function can fail and return a */ - /* `FT_Err_Unimplemented_Feature' error code if the raster used does */ - /* not support direct composition. */ - /* */ - /* XXX: For now, the standard raster doesn't support direct */ - /* composition but this should change for the final release (see */ - /* the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c' */ - /* for examples of distinct implementations which support direct */ - /* composition). */ - /* */ - typedef int - (*FT_Raster_RenderFunc)( FT_Raster raster, - const FT_Raster_Params* params ); - -#define FT_Raster_Render_Func FT_Raster_RenderFunc - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Raster_Funcs */ - /* */ - /* <Description> */ - /* A structure used to describe a given raster class to the library. */ - /* */ - /* <Fields> */ - /* glyph_format :: The supported glyph format for this raster. */ - /* */ - /* raster_new :: The raster constructor. */ - /* */ - /* raster_reset :: Used to reset the render pool within the raster. */ - /* */ - /* raster_render :: A function to render a glyph into a given bitmap. */ - /* */ - /* raster_done :: The raster destructor. */ - /* */ - typedef struct FT_Raster_Funcs_ - { - FT_Glyph_Format glyph_format; - FT_Raster_NewFunc raster_new; - FT_Raster_ResetFunc raster_reset; - FT_Raster_SetModeFunc raster_set_mode; - FT_Raster_RenderFunc raster_render; - FT_Raster_DoneFunc raster_done; - - } FT_Raster_Funcs; - - - /* */ - - -FT_END_HEADER - -#endif /* __FTIMAGE_H__ */ - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftincrem.h b/android/jni/ndk_modules/freetype/include/freetype/ftincrem.h deleted file mode 100644 index aaf689ff..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftincrem.h +++ /dev/null @@ -1,353 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftincrem.h */ -/* */ -/* FreeType incremental loading (specification). */ -/* */ -/* Copyright 2002, 2003, 2006, 2007, 2008, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTINCREM_H__ -#define __FTINCREM_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************** - * - * @section: - * incremental - * - * @title: - * Incremental Loading - * - * @abstract: - * Custom Glyph Loading. - * - * @description: - * This section contains various functions used to perform so-called - * `incremental' glyph loading. This is a mode where all glyphs loaded - * from a given @FT_Face are provided by the client application, - * - * Apart from that, all other tables are loaded normally from the font - * file. This mode is useful when FreeType is used within another - * engine, e.g., a PostScript Imaging Processor. - * - * To enable this mode, you must use @FT_Open_Face, passing an - * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an - * @FT_Incremental_Interface value. See the comments for - * @FT_Incremental_InterfaceRec for an example. - * - */ - - - /*************************************************************************** - * - * @type: - * FT_Incremental - * - * @description: - * An opaque type describing a user-provided object used to implement - * `incremental' glyph loading within FreeType. This is used to support - * embedded fonts in certain environments (e.g., PostScript interpreters), - * where the glyph data isn't in the font file, or must be overridden by - * different values. - * - * @note: - * It is up to client applications to create and implement @FT_Incremental - * objects, as long as they provide implementations for the methods - * @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc - * and @FT_Incremental_GetGlyphMetricsFunc. - * - * See the description of @FT_Incremental_InterfaceRec to understand how - * to use incremental objects with FreeType. - * - */ - typedef struct FT_IncrementalRec_* FT_Incremental; - - - /*************************************************************************** - * - * @struct: - * FT_Incremental_MetricsRec - * - * @description: - * A small structure used to contain the basic glyph metrics returned - * by the @FT_Incremental_GetGlyphMetricsFunc method. - * - * @fields: - * bearing_x :: - * Left bearing, in font units. - * - * bearing_y :: - * Top bearing, in font units. - * - * advance :: - * Horizontal component of glyph advance, in font units. - * - * advance_v :: - * Vertical component of glyph advance, in font units. - * - * @note: - * These correspond to horizontal or vertical metrics depending on the - * value of the `vertical' argument to the function - * @FT_Incremental_GetGlyphMetricsFunc. - * - */ - typedef struct FT_Incremental_MetricsRec_ - { - FT_Long bearing_x; - FT_Long bearing_y; - FT_Long advance; - FT_Long advance_v; /* since 2.3.12 */ - - } FT_Incremental_MetricsRec; - - - /*************************************************************************** - * - * @struct: - * FT_Incremental_Metrics - * - * @description: - * A handle to an @FT_Incremental_MetricsRec structure. - * - */ - typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics; - - - /*************************************************************************** - * - * @type: - * FT_Incremental_GetGlyphDataFunc - * - * @description: - * A function called by FreeType to access a given glyph's data bytes - * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is - * enabled. - * - * Note that the format of the glyph's data bytes depends on the font - * file format. For TrueType, it must correspond to the raw bytes within - * the `glyf' table. For PostScript formats, it must correspond to the - * *unencrypted* charstring bytes, without any `lenIV' header. It is - * undefined for any other format. - * - * @input: - * incremental :: - * Handle to an opaque @FT_Incremental handle provided by the client - * application. - * - * glyph_index :: - * Index of relevant glyph. - * - * @output: - * adata :: - * A structure describing the returned glyph data bytes (which will be - * accessed as a read-only byte block). - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * If this function returns successfully the method - * @FT_Incremental_FreeGlyphDataFunc will be called later to release - * the data bytes. - * - * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for - * compound glyphs. - * - */ - typedef FT_Error - (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, - FT_UInt glyph_index, - FT_Data* adata ); - - - /*************************************************************************** - * - * @type: - * FT_Incremental_FreeGlyphDataFunc - * - * @description: - * A function used to release the glyph data bytes returned by a - * successful call to @FT_Incremental_GetGlyphDataFunc. - * - * @input: - * incremental :: - * A handle to an opaque @FT_Incremental handle provided by the client - * application. - * - * data :: - * A structure describing the glyph data bytes (which will be accessed - * as a read-only byte block). - * - */ - typedef void - (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, - FT_Data* data ); - - - /*************************************************************************** - * - * @type: - * FT_Incremental_GetGlyphMetricsFunc - * - * @description: - * A function used to retrieve the basic metrics of a given glyph index - * before accessing its data. This is necessary because, in certain - * formats like TrueType, the metrics are stored in a different place from - * the glyph images proper. - * - * @input: - * incremental :: - * A handle to an opaque @FT_Incremental handle provided by the client - * application. - * - * glyph_index :: - * Index of relevant glyph. - * - * vertical :: - * If true, return vertical metrics. - * - * ametrics :: - * This parameter is used for both input and output. - * The original glyph metrics, if any, in font units. If metrics are - * not available all the values must be set to zero. - * - * @output: - * ametrics :: - * The replacement glyph metrics in font units. - * - */ - typedef FT_Error - (*FT_Incremental_GetGlyphMetricsFunc) - ( FT_Incremental incremental, - FT_UInt glyph_index, - FT_Bool vertical, - FT_Incremental_MetricsRec *ametrics ); - - - /************************************************************************** - * - * @struct: - * FT_Incremental_FuncsRec - * - * @description: - * A table of functions for accessing fonts that load data - * incrementally. Used in @FT_Incremental_InterfaceRec. - * - * @fields: - * get_glyph_data :: - * The function to get glyph data. Must not be null. - * - * free_glyph_data :: - * The function to release glyph data. Must not be null. - * - * get_glyph_metrics :: - * The function to get glyph metrics. May be null if the font does - * not provide overriding glyph metrics. - * - */ - typedef struct FT_Incremental_FuncsRec_ - { - FT_Incremental_GetGlyphDataFunc get_glyph_data; - FT_Incremental_FreeGlyphDataFunc free_glyph_data; - FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; - - } FT_Incremental_FuncsRec; - - - /*************************************************************************** - * - * @struct: - * FT_Incremental_InterfaceRec - * - * @description: - * A structure to be used with @FT_Open_Face to indicate that the user - * wants to support incremental glyph loading. You should use it with - * @FT_PARAM_TAG_INCREMENTAL as in the following example: - * - * { - * FT_Incremental_InterfaceRec inc_int; - * FT_Parameter parameter; - * FT_Open_Args open_args; - * - * - * // set up incremental descriptor - * inc_int.funcs = my_funcs; - * inc_int.object = my_object; - * - * // set up optional parameter - * parameter.tag = FT_PARAM_TAG_INCREMENTAL; - * parameter.data = &inc_int; - * - * // set up FT_Open_Args structure - * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; - * open_args.pathname = my_font_pathname; - * open_args.num_params = 1; - * open_args.params = ¶meter; // we use one optional argument - * - * // open the font - * error = FT_Open_Face( library, &open_args, index, &face ); - * ... - * } - * - */ - typedef struct FT_Incremental_InterfaceRec_ - { - const FT_Incremental_FuncsRec* funcs; - FT_Incremental object; - - } FT_Incremental_InterfaceRec; - - - /*************************************************************************** - * - * @type: - * FT_Incremental_Interface - * - * @description: - * A pointer to an @FT_Incremental_InterfaceRec structure. - * - */ - typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface; - - - /*************************************************************************** - * - * @constant: - * FT_PARAM_TAG_INCREMENTAL - * - * @description: - * A constant used as the tag of @FT_Parameter structures to indicate - * an incremental loading object to be used by FreeType. - * - */ -#define FT_PARAM_TAG_INCREMENTAL FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) - - /* */ - -FT_END_HEADER - -#endif /* __FTINCREM_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftlcdfil.h b/android/jni/ndk_modules/freetype/include/freetype/ftlcdfil.h deleted file mode 100644 index 0b55ebee..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftlcdfil.h +++ /dev/null @@ -1,213 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftlcdfil.h */ -/* */ -/* FreeType API for color filtering of subpixel bitmap glyphs */ -/* (specification). */ -/* */ -/* Copyright 2006, 2007, 2008, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FT_LCD_FILTER_H__ -#define __FT_LCD_FILTER_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************** - * - * @section: - * lcd_filtering - * - * @title: - * LCD Filtering - * - * @abstract: - * Reduce color fringes of LCD-optimized bitmaps. - * - * @description: - * The @FT_Library_SetLcdFilter API can be used to specify a low-pass - * filter which is then applied to LCD-optimized bitmaps generated - * through @FT_Render_Glyph. This is useful to reduce color fringes - * which would occur with unfiltered rendering. - * - * Note that no filter is active by default, and that this function is - * *not* implemented in default builds of the library. You need to - * #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file - * in order to activate it. - */ - - - /**************************************************************************** - * - * @enum: - * FT_LcdFilter - * - * @description: - * A list of values to identify various types of LCD filters. - * - * @values: - * FT_LCD_FILTER_NONE :: - * Do not perform filtering. When used with subpixel rendering, this - * results in sometimes severe color fringes. - * - * FT_LCD_FILTER_DEFAULT :: - * The default filter reduces color fringes considerably, at the cost - * of a slight blurriness in the output. - * - * FT_LCD_FILTER_LIGHT :: - * The light filter is a variant that produces less blurriness at the - * cost of slightly more color fringes than the default one. It might - * be better, depending on taste, your monitor, or your personal vision. - * - * FT_LCD_FILTER_LEGACY :: - * This filter corresponds to the original libXft color filter. It - * provides high contrast output but can exhibit really bad color - * fringes if glyphs are not extremely well hinted to the pixel grid. - * In other words, it only works well if the TrueType bytecode - * interpreter is enabled *and* high-quality hinted fonts are used. - * - * This filter is only provided for comparison purposes, and might be - * disabled or stay unsupported in the future. - * - * @since: - * 2.3.0 - */ - typedef enum FT_LcdFilter_ - { - FT_LCD_FILTER_NONE = 0, - FT_LCD_FILTER_DEFAULT = 1, - FT_LCD_FILTER_LIGHT = 2, - FT_LCD_FILTER_LEGACY = 16, - - FT_LCD_FILTER_MAX /* do not remove */ - - } FT_LcdFilter; - - - /************************************************************************** - * - * @func: - * FT_Library_SetLcdFilter - * - * @description: - * This function is used to apply color filtering to LCD decimated - * bitmaps, like the ones used when calling @FT_Render_Glyph with - * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V. - * - * @input: - * library :: - * A handle to the target library instance. - * - * filter :: - * The filter type. - * - * You can use @FT_LCD_FILTER_NONE here to disable this feature, or - * @FT_LCD_FILTER_DEFAULT to use a default filter that should work - * well on most LCD screens. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This feature is always disabled by default. Clients must make an - * explicit call to this function with a `filter' value other than - * @FT_LCD_FILTER_NONE in order to enable it. - * - * Due to *PATENTS* covering subpixel rendering, this function doesn't - * do anything except returning `FT_Err_Unimplemented_Feature' if the - * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not - * defined in your build of the library, which should correspond to all - * default builds of FreeType. - * - * The filter affects glyph bitmaps rendered through @FT_Render_Glyph, - * @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char. - * - * It does _not_ affect the output of @FT_Outline_Render and - * @FT_Outline_Get_Bitmap. - * - * If this feature is activated, the dimensions of LCD glyph bitmaps are - * either larger or taller than the dimensions of the corresponding - * outline with regards to the pixel grid. For example, for - * @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and - * up to 3~pixels to the right. - * - * The bitmap offset values are adjusted correctly, so clients shouldn't - * need to modify their layout and glyph positioning code when enabling - * the filter. - * - * @since: - * 2.3.0 - */ - FT_EXPORT( FT_Error ) - FT_Library_SetLcdFilter( FT_Library library, - FT_LcdFilter filter ); - - - /************************************************************************** - * - * @func: - * FT_Library_SetLcdFilterWeights - * - * @description: - * Use this function to override the filter weights selected by - * @FT_Library_SetLcdFilter. By default, FreeType uses the quintuple - * (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10, - * 0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and - * FT_LCD_FILTER_LEGACY. - * - * @input: - * library :: - * A handle to the target library instance. - * - * weights :: - * A pointer to an array; the function copies the first five bytes and - * uses them to specify the filter weights. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * Due to *PATENTS* covering subpixel rendering, this function doesn't - * do anything except returning `FT_Err_Unimplemented_Feature' if the - * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not - * defined in your build of the library, which should correspond to all - * default builds of FreeType. - * - * This function must be called after @FT_Library_SetLcdFilter to have - * any effect. - * - * @since: - * 2.4.0 - */ - FT_EXPORT( FT_Error ) - FT_Library_SetLcdFilterWeights( FT_Library library, - unsigned char *weights ); - - /* */ - - -FT_END_HEADER - -#endif /* __FT_LCD_FILTER_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftlist.h b/android/jni/ndk_modules/freetype/include/freetype/ftlist.h deleted file mode 100644 index bb6f7f11..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftlist.h +++ /dev/null @@ -1,277 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftlist.h */ -/* */ -/* Generic list support for FreeType (specification). */ -/* */ -/* Copyright 1996-2001, 2003, 2007, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file implements functions relative to list processing. Its */ - /* data structures are defined in `freetype.h'. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTLIST_H__ -#define __FTLIST_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* list_processing */ - /* */ - /* <Title> */ - /* List Processing */ - /* */ - /* <Abstract> */ - /* Simple management of lists. */ - /* */ - /* <Description> */ - /* This section contains various definitions related to list */ - /* processing using doubly-linked nodes. */ - /* */ - /* <Order> */ - /* FT_List */ - /* FT_ListNode */ - /* FT_ListRec */ - /* FT_ListNodeRec */ - /* */ - /* FT_List_Add */ - /* FT_List_Insert */ - /* FT_List_Find */ - /* FT_List_Remove */ - /* FT_List_Up */ - /* FT_List_Iterate */ - /* FT_List_Iterator */ - /* FT_List_Finalize */ - /* FT_List_Destructor */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Find */ - /* */ - /* <Description> */ - /* Find the list node for a given listed object. */ - /* */ - /* <Input> */ - /* list :: A pointer to the parent list. */ - /* data :: The address of the listed object. */ - /* */ - /* <Return> */ - /* List node. NULL if it wasn't found. */ - /* */ - FT_EXPORT( FT_ListNode ) - FT_List_Find( FT_List list, - void* data ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Add */ - /* */ - /* <Description> */ - /* Append an element to the end of a list. */ - /* */ - /* <InOut> */ - /* list :: A pointer to the parent list. */ - /* node :: The node to append. */ - /* */ - FT_EXPORT( void ) - FT_List_Add( FT_List list, - FT_ListNode node ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Insert */ - /* */ - /* <Description> */ - /* Insert an element at the head of a list. */ - /* */ - /* <InOut> */ - /* list :: A pointer to parent list. */ - /* node :: The node to insert. */ - /* */ - FT_EXPORT( void ) - FT_List_Insert( FT_List list, - FT_ListNode node ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Remove */ - /* */ - /* <Description> */ - /* Remove a node from a list. This function doesn't check whether */ - /* the node is in the list! */ - /* */ - /* <Input> */ - /* node :: The node to remove. */ - /* */ - /* <InOut> */ - /* list :: A pointer to the parent list. */ - /* */ - FT_EXPORT( void ) - FT_List_Remove( FT_List list, - FT_ListNode node ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Up */ - /* */ - /* <Description> */ - /* Move a node to the head/top of a list. Used to maintain LRU */ - /* lists. */ - /* */ - /* <InOut> */ - /* list :: A pointer to the parent list. */ - /* node :: The node to move. */ - /* */ - FT_EXPORT( void ) - FT_List_Up( FT_List list, - FT_ListNode node ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_List_Iterator */ - /* */ - /* <Description> */ - /* An FT_List iterator function which is called during a list parse */ - /* by @FT_List_Iterate. */ - /* */ - /* <Input> */ - /* node :: The current iteration list node. */ - /* */ - /* user :: A typeless pointer passed to @FT_List_Iterate. */ - /* Can be used to point to the iteration's state. */ - /* */ - typedef FT_Error - (*FT_List_Iterator)( FT_ListNode node, - void* user ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Iterate */ - /* */ - /* <Description> */ - /* Parse a list and calls a given iterator function on each element. */ - /* Note that parsing is stopped as soon as one of the iterator calls */ - /* returns a non-zero value. */ - /* */ - /* <Input> */ - /* list :: A handle to the list. */ - /* iterator :: An iterator function, called on each node of the list. */ - /* user :: A user-supplied field which is passed as the second */ - /* argument to the iterator. */ - /* */ - /* <Return> */ - /* The result (a FreeType error code) of the last iterator call. */ - /* */ - FT_EXPORT( FT_Error ) - FT_List_Iterate( FT_List list, - FT_List_Iterator iterator, - void* user ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_List_Destructor */ - /* */ - /* <Description> */ - /* An @FT_List iterator function which is called during a list */ - /* finalization by @FT_List_Finalize to destroy all elements in a */ - /* given list. */ - /* */ - /* <Input> */ - /* system :: The current system object. */ - /* */ - /* data :: The current object to destroy. */ - /* */ - /* user :: A typeless pointer passed to @FT_List_Iterate. It can */ - /* be used to point to the iteration's state. */ - /* */ - typedef void - (*FT_List_Destructor)( FT_Memory memory, - void* data, - void* user ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_List_Finalize */ - /* */ - /* <Description> */ - /* Destroy all elements in the list as well as the list itself. */ - /* */ - /* <Input> */ - /* list :: A handle to the list. */ - /* */ - /* destroy :: A list destructor that will be applied to each element */ - /* of the list. */ - /* */ - /* memory :: The current memory object which handles deallocation. */ - /* */ - /* user :: A user-supplied field which is passed as the last */ - /* argument to the destructor. */ - /* */ - /* <Note> */ - /* This function expects that all nodes added by @FT_List_Add or */ - /* @FT_List_Insert have been dynamically allocated. */ - /* */ - FT_EXPORT( void ) - FT_List_Finalize( FT_List list, - FT_List_Destructor destroy, - FT_Memory memory, - void* user ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTLIST_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftlzw.h b/android/jni/ndk_modules/freetype/include/freetype/ftlzw.h deleted file mode 100644 index 00d40169..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftlzw.h +++ /dev/null @@ -1,99 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftlzw.h */ -/* */ -/* LZW-compressed stream support. */ -/* */ -/* Copyright 2004, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTLZW_H__ -#define __FTLZW_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /* */ - /* <Section> */ - /* lzw */ - /* */ - /* <Title> */ - /* LZW Streams */ - /* */ - /* <Abstract> */ - /* Using LZW-compressed font files. */ - /* */ - /* <Description> */ - /* This section contains the declaration of LZW-specific functions. */ - /* */ - /*************************************************************************/ - - /************************************************************************ - * - * @function: - * FT_Stream_OpenLZW - * - * @description: - * Open a new stream to parse LZW-compressed font files. This is - * mainly used to support the compressed `*.pcf.Z' fonts that come - * with XFree86. - * - * @input: - * stream :: The target embedding stream. - * - * source :: The source stream. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The source stream must be opened _before_ calling this function. - * - * Calling the internal function `FT_Stream_Close' on the new stream will - * *not* call `FT_Stream_Close' on the source stream. None of the stream - * objects will be released to the heap. - * - * The stream implementation is very basic and resets the decompression - * process each time seeking backwards is needed within the stream - * - * In certain builds of the library, LZW compression recognition is - * automatically handled when calling @FT_New_Face or @FT_Open_Face. - * This means that if no font driver is capable of handling the raw - * compressed file, the library will try to open a LZW stream from it - * and re-open the face with it. - * - * This function may return `FT_Err_Unimplemented_Feature' if your build - * of FreeType was not compiled with LZW support. - */ - FT_EXPORT( FT_Error ) - FT_Stream_OpenLZW( FT_Stream stream, - FT_Stream source ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTLZW_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftmac.h b/android/jni/ndk_modules/freetype/include/freetype/ftmac.h deleted file mode 100644 index ab5bab51..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftmac.h +++ /dev/null @@ -1,274 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmac.h */ -/* */ -/* Additional Mac-specific API. */ -/* */ -/* Copyright 1996-2001, 2004, 2006, 2007 by */ -/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* NOTE: Include this file after <freetype/freetype.h> and after any */ -/* Mac-specific headers (because this header uses Mac types such as */ -/* Handle, FSSpec, FSRef, etc.) */ -/* */ -/***************************************************************************/ - - -#ifndef __FTMAC_H__ -#define __FTMAC_H__ - - -#include <ft2build.h> - - -FT_BEGIN_HEADER - - -/* gcc-3.4.1 and later can warn about functions tagged as deprecated */ -#ifndef FT_DEPRECATED_ATTRIBUTE -#if defined(__GNUC__) && \ - ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) -#define FT_DEPRECATED_ATTRIBUTE __attribute__((deprecated)) -#else -#define FT_DEPRECATED_ATTRIBUTE -#endif -#endif - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* mac_specific */ - /* */ - /* <Title> */ - /* Mac Specific Interface */ - /* */ - /* <Abstract> */ - /* Only available on the Macintosh. */ - /* */ - /* <Description> */ - /* The following definitions are only available if FreeType is */ - /* compiled on a Macintosh. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Face_From_FOND */ - /* */ - /* <Description> */ - /* Create a new face object from a FOND resource. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library resource. */ - /* */ - /* <Input> */ - /* fond :: A FOND resource. */ - /* */ - /* face_index :: Only supported for the -1 `sanity check' special */ - /* case. */ - /* */ - /* <Output> */ - /* aface :: A handle to a new face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Notes> */ - /* This function can be used to create @FT_Face objects from fonts */ - /* that are installed in the system as follows. */ - /* */ - /* { */ - /* fond = GetResource( 'FOND', fontName ); */ - /* error = FT_New_Face_From_FOND( library, fond, 0, &face ); */ - /* } */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Face_From_FOND( FT_Library library, - Handle fond, - FT_Long face_index, - FT_Face *aface ) - FT_DEPRECATED_ATTRIBUTE; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_GetFile_From_Mac_Name */ - /* */ - /* <Description> */ - /* Return an FSSpec for the disk file containing the named font. */ - /* */ - /* <Input> */ - /* fontName :: Mac OS name of the font (e.g., Times New Roman */ - /* Bold). */ - /* */ - /* <Output> */ - /* pathSpec :: FSSpec to the file. For passing to */ - /* @FT_New_Face_From_FSSpec. */ - /* */ - /* face_index :: Index of the face. For passing to */ - /* @FT_New_Face_From_FSSpec. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_GetFile_From_Mac_Name( const char* fontName, - FSSpec* pathSpec, - FT_Long* face_index ) - FT_DEPRECATED_ATTRIBUTE; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_GetFile_From_Mac_ATS_Name */ - /* */ - /* <Description> */ - /* Return an FSSpec for the disk file containing the named font. */ - /* */ - /* <Input> */ - /* fontName :: Mac OS name of the font in ATS framework. */ - /* */ - /* <Output> */ - /* pathSpec :: FSSpec to the file. For passing to */ - /* @FT_New_Face_From_FSSpec. */ - /* */ - /* face_index :: Index of the face. For passing to */ - /* @FT_New_Face_From_FSSpec. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_GetFile_From_Mac_ATS_Name( const char* fontName, - FSSpec* pathSpec, - FT_Long* face_index ) - FT_DEPRECATED_ATTRIBUTE; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_GetFilePath_From_Mac_ATS_Name */ - /* */ - /* <Description> */ - /* Return a pathname of the disk file and face index for given font */ - /* name which is handled by ATS framework. */ - /* */ - /* <Input> */ - /* fontName :: Mac OS name of the font in ATS framework. */ - /* */ - /* <Output> */ - /* path :: Buffer to store pathname of the file. For passing */ - /* to @FT_New_Face. The client must allocate this */ - /* buffer before calling this function. */ - /* */ - /* maxPathSize :: Lengths of the buffer `path' that client allocated. */ - /* */ - /* face_index :: Index of the face. For passing to @FT_New_Face. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, - UInt8* path, - UInt32 maxPathSize, - FT_Long* face_index ) - FT_DEPRECATED_ATTRIBUTE; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Face_From_FSSpec */ - /* */ - /* <Description> */ - /* Create a new face object from a given resource and typeface index */ - /* using an FSSpec to the font file. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library resource. */ - /* */ - /* <Input> */ - /* spec :: FSSpec to the font file. */ - /* */ - /* face_index :: The index of the face within the resource. The */ - /* first face has index~0. */ - /* <Output> */ - /* aface :: A handle to a new face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* @FT_New_Face_From_FSSpec is identical to @FT_New_Face except */ - /* it accepts an FSSpec instead of a path. */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Face_From_FSSpec( FT_Library library, - const FSSpec *spec, - FT_Long face_index, - FT_Face *aface ) - FT_DEPRECATED_ATTRIBUTE; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Face_From_FSRef */ - /* */ - /* <Description> */ - /* Create a new face object from a given resource and typeface index */ - /* using an FSRef to the font file. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library resource. */ - /* */ - /* <Input> */ - /* spec :: FSRef to the font file. */ - /* */ - /* face_index :: The index of the face within the resource. The */ - /* first face has index~0. */ - /* <Output> */ - /* aface :: A handle to a new face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* @FT_New_Face_From_FSRef is identical to @FT_New_Face except */ - /* it accepts an FSRef instead of a path. */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Face_From_FSRef( FT_Library library, - const FSRef *ref, - FT_Long face_index, - FT_Face *aface ) - FT_DEPRECATED_ATTRIBUTE; - - /* */ - - -FT_END_HEADER - - -#endif /* __FTMAC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftmm.h b/android/jni/ndk_modules/freetype/include/freetype/ftmm.h deleted file mode 100644 index 3aefb9e4..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftmm.h +++ /dev/null @@ -1,378 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmm.h */ -/* */ -/* FreeType Multiple Master font interface (specification). */ -/* */ -/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTMM_H__ -#define __FTMM_H__ - - -#include <ft2build.h> -#include FT_TYPE1_TABLES_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* multiple_masters */ - /* */ - /* <Title> */ - /* Multiple Masters */ - /* */ - /* <Abstract> */ - /* How to manage Multiple Masters fonts. */ - /* */ - /* <Description> */ - /* The following types and functions are used to manage Multiple */ - /* Master fonts, i.e., the selection of specific design instances by */ - /* setting design axis coordinates. */ - /* */ - /* George Williams has extended this interface to make it work with */ - /* both Type~1 Multiple Masters fonts and GX distortable (var) */ - /* fonts. Some of these routines only work with MM fonts, others */ - /* will work with both types. They are similar enough that a */ - /* consistent interface makes sense. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_MM_Axis */ - /* */ - /* <Description> */ - /* A simple structure used to model a given axis in design space for */ - /* Multiple Masters fonts. */ - /* */ - /* This structure can't be used for GX var fonts. */ - /* */ - /* <Fields> */ - /* name :: The axis's name. */ - /* */ - /* minimum :: The axis's minimum design coordinate. */ - /* */ - /* maximum :: The axis's maximum design coordinate. */ - /* */ - typedef struct FT_MM_Axis_ - { - FT_String* name; - FT_Long minimum; - FT_Long maximum; - - } FT_MM_Axis; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Multi_Master */ - /* */ - /* <Description> */ - /* A structure used to model the axes and space of a Multiple Masters */ - /* font. */ - /* */ - /* This structure can't be used for GX var fonts. */ - /* */ - /* <Fields> */ - /* num_axis :: Number of axes. Cannot exceed~4. */ - /* */ - /* num_designs :: Number of designs; should be normally 2^num_axis */ - /* even though the Type~1 specification strangely */ - /* allows for intermediate designs to be present. This */ - /* number cannot exceed~16. */ - /* */ - /* axis :: A table of axis descriptors. */ - /* */ - typedef struct FT_Multi_Master_ - { - FT_UInt num_axis; - FT_UInt num_designs; - FT_MM_Axis axis[T1_MAX_MM_AXIS]; - - } FT_Multi_Master; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Var_Axis */ - /* */ - /* <Description> */ - /* A simple structure used to model a given axis in design space for */ - /* Multiple Masters and GX var fonts. */ - /* */ - /* <Fields> */ - /* name :: The axis's name. */ - /* Not always meaningful for GX. */ - /* */ - /* minimum :: The axis's minimum design coordinate. */ - /* */ - /* def :: The axis's default design coordinate. */ - /* FreeType computes meaningful default values for MM; it */ - /* is then an integer value, not in 16.16 format. */ - /* */ - /* maximum :: The axis's maximum design coordinate. */ - /* */ - /* tag :: The axis's tag (the GX equivalent to `name'). */ - /* FreeType provides default values for MM if possible. */ - /* */ - /* strid :: The entry in `name' table (another GX version of */ - /* `name'). */ - /* Not meaningful for MM. */ - /* */ - typedef struct FT_Var_Axis_ - { - FT_String* name; - - FT_Fixed minimum; - FT_Fixed def; - FT_Fixed maximum; - - FT_ULong tag; - FT_UInt strid; - - } FT_Var_Axis; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Var_Named_Style */ - /* */ - /* <Description> */ - /* A simple structure used to model a named style in a GX var font. */ - /* */ - /* This structure can't be used for MM fonts. */ - /* */ - /* <Fields> */ - /* coords :: The design coordinates for this style. */ - /* This is an array with one entry for each axis. */ - /* */ - /* strid :: The entry in `name' table identifying this style. */ - /* */ - typedef struct FT_Var_Named_Style_ - { - FT_Fixed* coords; - FT_UInt strid; - - } FT_Var_Named_Style; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_MM_Var */ - /* */ - /* <Description> */ - /* A structure used to model the axes and space of a Multiple Masters */ - /* or GX var distortable font. */ - /* */ - /* Some fields are specific to one format and not to the other. */ - /* */ - /* <Fields> */ - /* num_axis :: The number of axes. The maximum value is~4 for */ - /* MM; no limit in GX. */ - /* */ - /* num_designs :: The number of designs; should be normally */ - /* 2^num_axis for MM fonts. Not meaningful for GX */ - /* (where every glyph could have a different */ - /* number of designs). */ - /* */ - /* num_namedstyles :: The number of named styles; only meaningful for */ - /* GX which allows certain design coordinates to */ - /* have a string ID (in the `name' table) */ - /* associated with them. The font can tell the */ - /* user that, for example, Weight=1.5 is `Bold'. */ - /* */ - /* axis :: A table of axis descriptors. */ - /* GX fonts contain slightly more data than MM. */ - /* */ - /* namedstyles :: A table of named styles. */ - /* Only meaningful with GX. */ - /* */ - typedef struct FT_MM_Var_ - { - FT_UInt num_axis; - FT_UInt num_designs; - FT_UInt num_namedstyles; - FT_Var_Axis* axis; - FT_Var_Named_Style* namedstyle; - - } FT_MM_Var; - - - /* */ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Multi_Master */ - /* */ - /* <Description> */ - /* Retrieve the Multiple Master descriptor of a given font. */ - /* */ - /* This function can't be used with GX fonts. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face. */ - /* */ - /* <Output> */ - /* amaster :: The Multiple Masters descriptor. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Multi_Master( FT_Face face, - FT_Multi_Master *amaster ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_MM_Var */ - /* */ - /* <Description> */ - /* Retrieve the Multiple Master/GX var descriptor of a given font. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face. */ - /* */ - /* <Output> */ - /* amaster :: The Multiple Masters/GX var descriptor. */ - /* Allocates a data structure, which the user must free */ - /* (a single call to FT_FREE will do it). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_MM_Var( FT_Face face, - FT_MM_Var* *amaster ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_MM_Design_Coordinates */ - /* */ - /* <Description> */ - /* For Multiple Masters fonts, choose an interpolated font design */ - /* through design coordinates. */ - /* */ - /* This function can't be used with GX fonts. */ - /* */ - /* <InOut> */ - /* face :: A handle to the source face. */ - /* */ - /* <Input> */ - /* num_coords :: The number of design coordinates (must be equal to */ - /* the number of axes in the font). */ - /* */ - /* coords :: An array of design coordinates. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_MM_Design_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Var_Design_Coordinates */ - /* */ - /* <Description> */ - /* For Multiple Master or GX Var fonts, choose an interpolated font */ - /* design through design coordinates. */ - /* */ - /* <InOut> */ - /* face :: A handle to the source face. */ - /* */ - /* <Input> */ - /* num_coords :: The number of design coordinates (must be equal to */ - /* the number of axes in the font). */ - /* */ - /* coords :: An array of design coordinates. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_Var_Design_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_MM_Blend_Coordinates */ - /* */ - /* <Description> */ - /* For Multiple Masters and GX var fonts, choose an interpolated font */ - /* design through normalized blend coordinates. */ - /* */ - /* <InOut> */ - /* face :: A handle to the source face. */ - /* */ - /* <Input> */ - /* num_coords :: The number of design coordinates (must be equal to */ - /* the number of axes in the font). */ - /* */ - /* coords :: The design coordinates array (each element must be */ - /* between 0 and 1.0). */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_MM_Blend_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Var_Blend_Coordinates */ - /* */ - /* <Description> */ - /* This is another name of @FT_Set_MM_Blend_Coordinates. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_Var_Blend_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTMM_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftmodapi.h b/android/jni/ndk_modules/freetype/include/freetype/ftmodapi.h deleted file mode 100644 index 8f2e0179..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftmodapi.h +++ /dev/null @@ -1,483 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmodapi.h */ -/* */ -/* FreeType modules public interface (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTMODAPI_H__ -#define __FTMODAPI_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* module_management */ - /* */ - /* <Title> */ - /* Module Management */ - /* */ - /* <Abstract> */ - /* How to add, upgrade, and remove modules from FreeType. */ - /* */ - /* <Description> */ - /* The definitions below are used to manage modules within FreeType. */ - /* Modules can be added, upgraded, and removed at runtime. */ - /* */ - /*************************************************************************/ - - - /* module bit flags */ -#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ -#define FT_MODULE_RENDERER 2 /* this module is a renderer */ -#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ -#define FT_MODULE_STYLER 8 /* this module is a styler */ - -#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ - /* scalable fonts */ -#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ - /* support vector outlines */ -#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ - /* own hinter */ - - - /* deprecated values */ -#define ft_module_font_driver FT_MODULE_FONT_DRIVER -#define ft_module_renderer FT_MODULE_RENDERER -#define ft_module_hinter FT_MODULE_HINTER -#define ft_module_styler FT_MODULE_STYLER - -#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE -#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES -#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER - - - typedef FT_Pointer FT_Module_Interface; - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Module_Constructor */ - /* */ - /* <Description> */ - /* A function used to initialize (not create) a new module object. */ - /* */ - /* <Input> */ - /* module :: The module to initialize. */ - /* */ - typedef FT_Error - (*FT_Module_Constructor)( FT_Module module ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Module_Destructor */ - /* */ - /* <Description> */ - /* A function used to finalize (not destroy) a given module object. */ - /* */ - /* <Input> */ - /* module :: The module to finalize. */ - /* */ - typedef void - (*FT_Module_Destructor)( FT_Module module ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Module_Requester */ - /* */ - /* <Description> */ - /* A function used to query a given module for a specific interface. */ - /* */ - /* <Input> */ - /* module :: The module to finalize. */ - /* */ - /* name :: The name of the interface in the module. */ - /* */ - typedef FT_Module_Interface - (*FT_Module_Requester)( FT_Module module, - const char* name ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Module_Class */ - /* */ - /* <Description> */ - /* The module class descriptor. */ - /* */ - /* <Fields> */ - /* module_flags :: Bit flags describing the module. */ - /* */ - /* module_size :: The size of one module object/instance in */ - /* bytes. */ - /* */ - /* module_name :: The name of the module. */ - /* */ - /* module_version :: The version, as a 16.16 fixed number */ - /* (major.minor). */ - /* */ - /* module_requires :: The version of FreeType this module requires, */ - /* as a 16.16 fixed number (major.minor). Starts */ - /* at version 2.0, i.e., 0x20000. */ - /* */ - /* module_init :: The initializing function. */ - /* */ - /* module_done :: The finalizing function. */ - /* */ - /* get_interface :: The interface requesting function. */ - /* */ - typedef struct FT_Module_Class_ - { - FT_ULong module_flags; - FT_Long module_size; - const FT_String* module_name; - FT_Fixed module_version; - FT_Fixed module_requires; - - const void* module_interface; - - FT_Module_Constructor module_init; - FT_Module_Destructor module_done; - FT_Module_Requester get_interface; - - } FT_Module_Class; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Add_Module */ - /* */ - /* <Description> */ - /* Add a new module to a given library instance. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library object. */ - /* */ - /* <Input> */ - /* clazz :: A pointer to class descriptor for the module. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* An error will be returned if a module already exists by that name, */ - /* or if the module requires a version of FreeType that is too great. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Add_Module( FT_Library library, - const FT_Module_Class* clazz ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Module */ - /* */ - /* <Description> */ - /* Find a module by its name. */ - /* */ - /* <Input> */ - /* library :: A handle to the library object. */ - /* */ - /* module_name :: The module's name (as an ASCII string). */ - /* */ - /* <Return> */ - /* A module handle. 0~if none was found. */ - /* */ - /* <Note> */ - /* FreeType's internal modules aren't documented very well, and you */ - /* should look up the source code for details. */ - /* */ - FT_EXPORT( FT_Module ) - FT_Get_Module( FT_Library library, - const char* module_name ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Remove_Module */ - /* */ - /* <Description> */ - /* Remove a given module from a library instance. */ - /* */ - /* <InOut> */ - /* library :: A handle to a library object. */ - /* */ - /* <Input> */ - /* module :: A handle to a module object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The module object is destroyed by the function in case of success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Remove_Module( FT_Library library, - FT_Module module ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Reference_Library */ - /* */ - /* <Description> */ - /* A counter gets initialized to~1 at the time an @FT_Library */ - /* structure is created. This function increments the counter. */ - /* @FT_Done_Library then only destroys a library if the counter is~1, */ - /* otherwise it simply decrements the counter. */ - /* */ - /* This function helps in managing life-cycles of structures which */ - /* reference @FT_Library objects. */ - /* */ - /* <Input> */ - /* library :: A handle to a target library object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Since> */ - /* 2.4.2 */ - /* */ - FT_EXPORT( FT_Error ) - FT_Reference_Library( FT_Library library ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Library */ - /* */ - /* <Description> */ - /* This function is used to create a new FreeType library instance */ - /* from a given memory object. It is thus possible to use libraries */ - /* with distinct memory allocators within the same program. */ - /* */ - /* Normally, you would call this function (followed by a call to */ - /* @FT_Add_Default_Modules or a series of calls to @FT_Add_Module) */ - /* instead of @FT_Init_FreeType to initialize the FreeType library. */ - /* */ - /* Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a */ - /* library instance. */ - /* */ - /* <Input> */ - /* memory :: A handle to the original memory object. */ - /* */ - /* <Output> */ - /* alibrary :: A pointer to handle of a new library object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* See the discussion of reference counters in the description of */ - /* @FT_Reference_Library. */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Library( FT_Memory memory, - FT_Library *alibrary ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_Library */ - /* */ - /* <Description> */ - /* Discard a given library object. This closes all drivers and */ - /* discards all resource objects. */ - /* */ - /* <Input> */ - /* library :: A handle to the target library. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* See the discussion of reference counters in the description of */ - /* @FT_Reference_Library. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Done_Library( FT_Library library ); - -/* */ - - typedef void - (*FT_DebugHook_Func)( void* arg ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Debug_Hook */ - /* */ - /* <Description> */ - /* Set a debug hook function for debugging the interpreter of a font */ - /* format. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library object. */ - /* */ - /* <Input> */ - /* hook_index :: The index of the debug hook. You should use the */ - /* values defined in `ftobjs.h', e.g., */ - /* `FT_DEBUG_HOOK_TRUETYPE'. */ - /* */ - /* debug_hook :: The function used to debug the interpreter. */ - /* */ - /* <Note> */ - /* Currently, four debug hook slots are available, but only two (for */ - /* the TrueType and the Type~1 interpreter) are defined. */ - /* */ - /* Since the internal headers of FreeType are no longer installed, */ - /* the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly. */ - /* This is a bug and will be fixed in a forthcoming release. */ - /* */ - FT_EXPORT( void ) - FT_Set_Debug_Hook( FT_Library library, - FT_UInt hook_index, - FT_DebugHook_Func debug_hook ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Add_Default_Modules */ - /* */ - /* <Description> */ - /* Add the set of default drivers to a given library object. */ - /* This is only useful when you create a library object with */ - /* @FT_New_Library (usually to plug a custom memory manager). */ - /* */ - /* <InOut> */ - /* library :: A handle to a new library object. */ - /* */ - FT_EXPORT( void ) - FT_Add_Default_Modules( FT_Library library ); - - - - /************************************************************************** - * - * @section: - * truetype_engine - * - * @title: - * The TrueType Engine - * - * @abstract: - * TrueType bytecode support. - * - * @description: - * This section contains a function used to query the level of TrueType - * bytecode support compiled in this version of the library. - * - */ - - - /************************************************************************** - * - * @enum: - * FT_TrueTypeEngineType - * - * @description: - * A list of values describing which kind of TrueType bytecode - * engine is implemented in a given FT_Library instance. It is used - * by the @FT_Get_TrueType_Engine_Type function. - * - * @values: - * FT_TRUETYPE_ENGINE_TYPE_NONE :: - * The library doesn't implement any kind of bytecode interpreter. - * - * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED :: - * The library implements a bytecode interpreter that doesn't - * support the patented operations of the TrueType virtual machine. - * - * Its main use is to load certain Asian fonts which position and - * scale glyph components with bytecode instructions. It produces - * bad output for most other fonts. - * - * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: - * The library implements a bytecode interpreter that covers - * the full instruction set of the TrueType virtual machine (this - * was governed by patents until May 2010, hence the name). - * - * @since: - * 2.2 - * - */ - typedef enum FT_TrueTypeEngineType_ - { - FT_TRUETYPE_ENGINE_TYPE_NONE = 0, - FT_TRUETYPE_ENGINE_TYPE_UNPATENTED, - FT_TRUETYPE_ENGINE_TYPE_PATENTED - - } FT_TrueTypeEngineType; - - - /************************************************************************** - * - * @func: - * FT_Get_TrueType_Engine_Type - * - * @description: - * Return an @FT_TrueTypeEngineType value to indicate which level of - * the TrueType virtual machine a given library instance supports. - * - * @input: - * library :: - * A library instance. - * - * @return: - * A value indicating which level is supported. - * - * @since: - * 2.2 - * - */ - FT_EXPORT( FT_TrueTypeEngineType ) - FT_Get_TrueType_Engine_Type( FT_Library library ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTMODAPI_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftmoderr.h b/android/jni/ndk_modules/freetype/include/freetype/ftmoderr.h deleted file mode 100644 index b0115dd0..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftmoderr.h +++ /dev/null @@ -1,155 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmoderr.h */ -/* */ -/* FreeType module error offsets (specification). */ -/* */ -/* Copyright 2001, 2002, 2003, 2004, 2005 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the FreeType module error offsets. */ - /* */ - /* The lower byte gives the error code, the higher byte gives the */ - /* module. The base module has error offset 0. For example, the error */ - /* `FT_Err_Invalid_File_Format' has value 0x003, the error */ - /* `TT_Err_Invalid_File_Format' has value 0x1103, the error */ - /* `T1_Err_Invalid_File_Format' has value 0x1203, etc. */ - /* */ - /* Undefine the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in ftoption.h */ - /* to make the higher byte always zero (disabling the module error */ - /* mechanism). */ - /* */ - /* It can also be used to create a module error message table easily */ - /* with something like */ - /* */ - /* { */ - /* #undef __FTMODERR_H__ */ - /* #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, */ - /* #define FT_MODERR_START_LIST { */ - /* #define FT_MODERR_END_LIST { 0, 0 } }; */ - /* */ - /* const struct */ - /* { */ - /* int mod_err_offset; */ - /* const char* mod_err_msg */ - /* } ft_mod_errors[] = */ - /* */ - /* #include FT_MODULE_ERRORS_H */ - /* } */ - /* */ - /* To use such a table, all errors must be ANDed with 0xFF00 to remove */ - /* the error code. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTMODERR_H__ -#define __FTMODERR_H__ - - - /*******************************************************************/ - /*******************************************************************/ - /***** *****/ - /***** SETUP MACROS *****/ - /***** *****/ - /*******************************************************************/ - /*******************************************************************/ - - -#undef FT_NEED_EXTERN_C - -#ifndef FT_MODERRDEF - -#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS -#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v, -#else -#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0, -#endif - -#define FT_MODERR_START_LIST enum { -#define FT_MODERR_END_LIST FT_Mod_Err_Max }; - -#ifdef __cplusplus -#define FT_NEED_EXTERN_C - extern "C" { -#endif - -#endif /* !FT_MODERRDEF */ - - - /*******************************************************************/ - /*******************************************************************/ - /***** *****/ - /***** LIST MODULE ERROR BASES *****/ - /***** *****/ - /*******************************************************************/ - /*******************************************************************/ - - -#ifdef FT_MODERR_START_LIST - FT_MODERR_START_LIST -#endif - - - FT_MODERRDEF( Base, 0x000, "base module" ) - FT_MODERRDEF( Autofit, 0x100, "autofitter module" ) - FT_MODERRDEF( BDF, 0x200, "BDF module" ) - FT_MODERRDEF( Cache, 0x300, "cache module" ) - FT_MODERRDEF( CFF, 0x400, "CFF module" ) - FT_MODERRDEF( CID, 0x500, "CID module" ) - FT_MODERRDEF( Gzip, 0x600, "Gzip module" ) - FT_MODERRDEF( LZW, 0x700, "LZW module" ) - FT_MODERRDEF( OTvalid, 0x800, "OpenType validation module" ) - FT_MODERRDEF( PCF, 0x900, "PCF module" ) - FT_MODERRDEF( PFR, 0xA00, "PFR module" ) - FT_MODERRDEF( PSaux, 0xB00, "PS auxiliary module" ) - FT_MODERRDEF( PShinter, 0xC00, "PS hinter module" ) - FT_MODERRDEF( PSnames, 0xD00, "PS names module" ) - FT_MODERRDEF( Raster, 0xE00, "raster module" ) - FT_MODERRDEF( SFNT, 0xF00, "SFNT module" ) - FT_MODERRDEF( Smooth, 0x1000, "smooth raster module" ) - FT_MODERRDEF( TrueType, 0x1100, "TrueType module" ) - FT_MODERRDEF( Type1, 0x1200, "Type 1 module" ) - FT_MODERRDEF( Type42, 0x1300, "Type 42 module" ) - FT_MODERRDEF( Winfonts, 0x1400, "Windows FON/FNT module" ) - - -#ifdef FT_MODERR_END_LIST - FT_MODERR_END_LIST -#endif - - - /*******************************************************************/ - /*******************************************************************/ - /***** *****/ - /***** CLEANUP *****/ - /***** *****/ - /*******************************************************************/ - /*******************************************************************/ - - -#ifdef FT_NEED_EXTERN_C - } -#endif - -#undef FT_MODERR_START_LIST -#undef FT_MODERR_END_LIST -#undef FT_MODERRDEF -#undef FT_NEED_EXTERN_C - - -#endif /* __FTMODERR_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftotval.h b/android/jni/ndk_modules/freetype/include/freetype/ftotval.h deleted file mode 100644 index 027f2e88..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftotval.h +++ /dev/null @@ -1,203 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftotval.h */ -/* */ -/* FreeType API for validating OpenType tables (specification). */ -/* */ -/* Copyright 2004, 2005, 2006, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -/***************************************************************************/ -/* */ -/* */ -/* Warning: This module might be moved to a different library in the */ -/* future to avoid a tight dependency between FreeType and the */ -/* OpenType specification. */ -/* */ -/* */ -/***************************************************************************/ - - -#ifndef __FTOTVAL_H__ -#define __FTOTVAL_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* ot_validation */ - /* */ - /* <Title> */ - /* OpenType Validation */ - /* */ - /* <Abstract> */ - /* An API to validate OpenType tables. */ - /* */ - /* <Description> */ - /* This section contains the declaration of functions to validate */ - /* some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). */ - /* */ - /*************************************************************************/ - - - /********************************************************************** - * - * @enum: - * FT_VALIDATE_OTXXX - * - * @description: - * A list of bit-field constants used with @FT_OpenType_Validate to - * indicate which OpenType tables should be validated. - * - * @values: - * FT_VALIDATE_BASE :: - * Validate BASE table. - * - * FT_VALIDATE_GDEF :: - * Validate GDEF table. - * - * FT_VALIDATE_GPOS :: - * Validate GPOS table. - * - * FT_VALIDATE_GSUB :: - * Validate GSUB table. - * - * FT_VALIDATE_JSTF :: - * Validate JSTF table. - * - * FT_VALIDATE_MATH :: - * Validate MATH table. - * - * FT_VALIDATE_OT :: - * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). - * - */ -#define FT_VALIDATE_BASE 0x0100 -#define FT_VALIDATE_GDEF 0x0200 -#define FT_VALIDATE_GPOS 0x0400 -#define FT_VALIDATE_GSUB 0x0800 -#define FT_VALIDATE_JSTF 0x1000 -#define FT_VALIDATE_MATH 0x2000 - -#define FT_VALIDATE_OT FT_VALIDATE_BASE | \ - FT_VALIDATE_GDEF | \ - FT_VALIDATE_GPOS | \ - FT_VALIDATE_GSUB | \ - FT_VALIDATE_JSTF | \ - FT_VALIDATE_MATH - - /* */ - - /********************************************************************** - * - * @function: - * FT_OpenType_Validate - * - * @description: - * Validate various OpenType tables to assure that all offsets and - * indices are valid. The idea is that a higher-level library which - * actually does the text layout can access those tables without - * error checking (which can be quite time consuming). - * - * @input: - * face :: - * A handle to the input face. - * - * validation_flags :: - * A bit field which specifies the tables to be validated. See - * @FT_VALIDATE_OTXXX for possible values. - * - * @output: - * BASE_table :: - * A pointer to the BASE table. - * - * GDEF_table :: - * A pointer to the GDEF table. - * - * GPOS_table :: - * A pointer to the GPOS table. - * - * GSUB_table :: - * A pointer to the GSUB table. - * - * JSTF_table :: - * A pointer to the JSTF table. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with OpenType fonts, returning an error - * otherwise. - * - * After use, the application should deallocate the five tables with - * @FT_OpenType_Free. A NULL value indicates that the table either - * doesn't exist in the font, or the application hasn't asked for - * validation. - */ - FT_EXPORT( FT_Error ) - FT_OpenType_Validate( FT_Face face, - FT_UInt validation_flags, - FT_Bytes *BASE_table, - FT_Bytes *GDEF_table, - FT_Bytes *GPOS_table, - FT_Bytes *GSUB_table, - FT_Bytes *JSTF_table ); - - /* */ - - /********************************************************************** - * - * @function: - * FT_OpenType_Free - * - * @description: - * Free the buffer allocated by OpenType validator. - * - * @input: - * face :: - * A handle to the input face. - * - * table :: - * The pointer to the buffer that is allocated by - * @FT_OpenType_Validate. - * - * @note: - * This function must be used to free the buffer allocated by - * @FT_OpenType_Validate only. - */ - FT_EXPORT( void ) - FT_OpenType_Free( FT_Face face, - FT_Bytes table ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTOTVAL_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftoutln.h b/android/jni/ndk_modules/freetype/include/freetype/ftoutln.h deleted file mode 100644 index 2829a05c..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftoutln.h +++ /dev/null @@ -1,537 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftoutln.h */ -/* */ -/* Support for the FT_Outline type used to store glyph shapes of */ -/* most scalable font formats (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTOUTLN_H__ -#define __FTOUTLN_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* outline_processing */ - /* */ - /* <Title> */ - /* Outline Processing */ - /* */ - /* <Abstract> */ - /* Functions to create, transform, and render vectorial glyph images. */ - /* */ - /* <Description> */ - /* This section contains routines used to create and destroy scalable */ - /* glyph images known as `outlines'. These can also be measured, */ - /* transformed, and converted into bitmaps and pixmaps. */ - /* */ - /* <Order> */ - /* FT_Outline */ - /* FT_OUTLINE_FLAGS */ - /* FT_Outline_New */ - /* FT_Outline_Done */ - /* FT_Outline_Copy */ - /* FT_Outline_Translate */ - /* FT_Outline_Transform */ - /* FT_Outline_Embolden */ - /* FT_Outline_Reverse */ - /* FT_Outline_Check */ - /* */ - /* FT_Outline_Get_CBox */ - /* FT_Outline_Get_BBox */ - /* */ - /* FT_Outline_Get_Bitmap */ - /* FT_Outline_Render */ - /* */ - /* FT_Outline_Decompose */ - /* FT_Outline_Funcs */ - /* FT_Outline_MoveTo_Func */ - /* FT_Outline_LineTo_Func */ - /* FT_Outline_ConicTo_Func */ - /* FT_Outline_CubicTo_Func */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Decompose */ - /* */ - /* <Description> */ - /* Walk over an outline's structure to decompose it into individual */ - /* segments and Bézier arcs. This function also emits `move to' */ - /* operations to indicate the start of new contours in the outline. */ - /* */ - /* <Input> */ - /* outline :: A pointer to the source target. */ - /* */ - /* func_interface :: A table of `emitters', i.e., function pointers */ - /* called during decomposition to indicate path */ - /* operations. */ - /* */ - /* <InOut> */ - /* user :: A typeless pointer which is passed to each */ - /* emitter during the decomposition. It can be */ - /* used to store the state during the */ - /* decomposition. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Decompose( FT_Outline* outline, - const FT_Outline_Funcs* func_interface, - void* user ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_New */ - /* */ - /* <Description> */ - /* Create a new outline of a given size. */ - /* */ - /* <Input> */ - /* library :: A handle to the library object from where the */ - /* outline is allocated. Note however that the new */ - /* outline will *not* necessarily be *freed*, when */ - /* destroying the library, by @FT_Done_FreeType. */ - /* */ - /* numPoints :: The maximal number of points within the outline. */ - /* */ - /* numContours :: The maximal number of contours within the outline. */ - /* */ - /* <Output> */ - /* anoutline :: A handle to the new outline. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The reason why this function takes a `library' parameter is simply */ - /* to use the library's memory allocator. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_New( FT_Library library, - FT_UInt numPoints, - FT_Int numContours, - FT_Outline *anoutline ); - - - FT_EXPORT( FT_Error ) - FT_Outline_New_Internal( FT_Memory memory, - FT_UInt numPoints, - FT_Int numContours, - FT_Outline *anoutline ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Done */ - /* */ - /* <Description> */ - /* Destroy an outline created with @FT_Outline_New. */ - /* */ - /* <Input> */ - /* library :: A handle of the library object used to allocate the */ - /* outline. */ - /* */ - /* outline :: A pointer to the outline object to be discarded. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* If the outline's `owner' field is not set, only the outline */ - /* descriptor will be released. */ - /* */ - /* The reason why this function takes an `library' parameter is */ - /* simply to use ft_mem_free(). */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Done( FT_Library library, - FT_Outline* outline ); - - - FT_EXPORT( FT_Error ) - FT_Outline_Done_Internal( FT_Memory memory, - FT_Outline* outline ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Check */ - /* */ - /* <Description> */ - /* Check the contents of an outline descriptor. */ - /* */ - /* <Input> */ - /* outline :: A handle to a source outline. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Check( FT_Outline* outline ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Get_CBox */ - /* */ - /* <Description> */ - /* Return an outline's `control box'. The control box encloses all */ - /* the outline's points, including Bézier control points. Though it */ - /* coincides with the exact bounding box for most glyphs, it can be */ - /* slightly larger in some situations (like when rotating an outline */ - /* which contains Bézier outside arcs). */ - /* */ - /* Computing the control box is very fast, while getting the bounding */ - /* box can take much more time as it needs to walk over all segments */ - /* and arcs in the outline. To get the latter, you can use the */ - /* `ftbbox' component which is dedicated to this single task. */ - /* */ - /* <Input> */ - /* outline :: A pointer to the source outline descriptor. */ - /* */ - /* <Output> */ - /* acbox :: The outline's control box. */ - /* */ - FT_EXPORT( void ) - FT_Outline_Get_CBox( const FT_Outline* outline, - FT_BBox *acbox ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Translate */ - /* */ - /* <Description> */ - /* Apply a simple translation to the points of an outline. */ - /* */ - /* <InOut> */ - /* outline :: A pointer to the target outline descriptor. */ - /* */ - /* <Input> */ - /* xOffset :: The horizontal offset. */ - /* */ - /* yOffset :: The vertical offset. */ - /* */ - FT_EXPORT( void ) - FT_Outline_Translate( const FT_Outline* outline, - FT_Pos xOffset, - FT_Pos yOffset ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Copy */ - /* */ - /* <Description> */ - /* Copy an outline into another one. Both objects must have the */ - /* same sizes (number of points & number of contours) when this */ - /* function is called. */ - /* */ - /* <Input> */ - /* source :: A handle to the source outline. */ - /* */ - /* <Output> */ - /* target :: A handle to the target outline. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Copy( const FT_Outline* source, - FT_Outline *target ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Transform */ - /* */ - /* <Description> */ - /* Apply a simple 2x2 matrix to all of an outline's points. Useful */ - /* for applying rotations, slanting, flipping, etc. */ - /* */ - /* <InOut> */ - /* outline :: A pointer to the target outline descriptor. */ - /* */ - /* <Input> */ - /* matrix :: A pointer to the transformation matrix. */ - /* */ - /* <Note> */ - /* You can use @FT_Outline_Translate if you need to translate the */ - /* outline's points. */ - /* */ - FT_EXPORT( void ) - FT_Outline_Transform( const FT_Outline* outline, - const FT_Matrix* matrix ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Embolden */ - /* */ - /* <Description> */ - /* Embolden an outline. The new outline will be at most 4~times */ - /* `strength' pixels wider and higher. You may think of the left and */ - /* bottom borders as unchanged. */ - /* */ - /* Negative `strength' values to reduce the outline thickness are */ - /* possible also. */ - /* */ - /* <InOut> */ - /* outline :: A handle to the target outline. */ - /* */ - /* <Input> */ - /* strength :: How strong the glyph is emboldened. Expressed in */ - /* 26.6 pixel format. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The used algorithm to increase or decrease the thickness of the */ - /* glyph doesn't change the number of points; this means that certain */ - /* situations like acute angles or intersections are sometimes */ - /* handled incorrectly. */ - /* */ - /* If you need `better' metrics values you should call */ - /* @FT_Outline_Get_CBox ot @FT_Outline_Get_BBox. */ - /* */ - /* Example call: */ - /* */ - /* { */ - /* FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); */ - /* if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE ) */ - /* FT_Outline_Embolden( &face->slot->outline, strength ); */ - /* } */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Embolden( FT_Outline* outline, - FT_Pos strength ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Reverse */ - /* */ - /* <Description> */ - /* Reverse the drawing direction of an outline. This is used to */ - /* ensure consistent fill conventions for mirrored glyphs. */ - /* */ - /* <InOut> */ - /* outline :: A pointer to the target outline descriptor. */ - /* */ - /* <Note> */ - /* This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in */ - /* the outline's `flags' field. */ - /* */ - /* It shouldn't be used by a normal client application, unless it */ - /* knows what it is doing. */ - /* */ - FT_EXPORT( void ) - FT_Outline_Reverse( FT_Outline* outline ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Get_Bitmap */ - /* */ - /* <Description> */ - /* Render an outline within a bitmap. The outline's image is simply */ - /* OR-ed to the target bitmap. */ - /* */ - /* <Input> */ - /* library :: A handle to a FreeType library object. */ - /* */ - /* outline :: A pointer to the source outline descriptor. */ - /* */ - /* <InOut> */ - /* abitmap :: A pointer to the target bitmap descriptor. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* This function does NOT CREATE the bitmap, it only renders an */ - /* outline image within the one you pass to it! Consequently, the */ - /* various fields in `abitmap' should be set accordingly. */ - /* */ - /* It will use the raster corresponding to the default glyph format. */ - /* */ - /* The value of the `num_grays' field in `abitmap' is ignored. If */ - /* you select the gray-level rasterizer, and you want less than 256 */ - /* gray levels, you have to use @FT_Outline_Render directly. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Get_Bitmap( FT_Library library, - FT_Outline* outline, - const FT_Bitmap *abitmap ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Render */ - /* */ - /* <Description> */ - /* Render an outline within a bitmap using the current scan-convert. */ - /* This function uses an @FT_Raster_Params structure as an argument, */ - /* allowing advanced features like direct composition, translucency, */ - /* etc. */ - /* */ - /* <Input> */ - /* library :: A handle to a FreeType library object. */ - /* */ - /* outline :: A pointer to the source outline descriptor. */ - /* */ - /* <InOut> */ - /* params :: A pointer to an @FT_Raster_Params structure used to */ - /* describe the rendering operation. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* You should know what you are doing and how @FT_Raster_Params works */ - /* to use this function. */ - /* */ - /* The field `params.source' will be set to `outline' before the scan */ - /* converter is called, which means that the value you give to it is */ - /* actually ignored. */ - /* */ - /* The gray-level rasterizer always uses 256 gray levels. If you */ - /* want less gray levels, you have to provide your own span callback. */ - /* See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the */ - /* @FT_Raster_Params structure for more details. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Outline_Render( FT_Library library, - FT_Outline* outline, - FT_Raster_Params* params ); - - - /************************************************************************** - * - * @enum: - * FT_Orientation - * - * @description: - * A list of values used to describe an outline's contour orientation. - * - * The TrueType and PostScript specifications use different conventions - * to determine whether outline contours should be filled or unfilled. - * - * @values: - * FT_ORIENTATION_TRUETYPE :: - * According to the TrueType specification, clockwise contours must - * be filled, and counter-clockwise ones must be unfilled. - * - * FT_ORIENTATION_POSTSCRIPT :: - * According to the PostScript specification, counter-clockwise contours - * must be filled, and clockwise ones must be unfilled. - * - * FT_ORIENTATION_FILL_RIGHT :: - * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to - * remember that in TrueType, everything that is to the right of - * the drawing direction of a contour must be filled. - * - * FT_ORIENTATION_FILL_LEFT :: - * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to - * remember that in PostScript, everything that is to the left of - * the drawing direction of a contour must be filled. - * - * FT_ORIENTATION_NONE :: - * The orientation cannot be determined. That is, different parts of - * the glyph have different orientation. - * - */ - typedef enum FT_Orientation_ - { - FT_ORIENTATION_TRUETYPE = 0, - FT_ORIENTATION_POSTSCRIPT = 1, - FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, - FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, - FT_ORIENTATION_NONE - - } FT_Orientation; - - - /************************************************************************** - * - * @function: - * FT_Outline_Get_Orientation - * - * @description: - * This function analyzes a glyph outline and tries to compute its - * fill orientation (see @FT_Orientation). This is done by computing - * the direction of each global horizontal and/or vertical extrema - * within the outline. - * - * Note that this will return @FT_ORIENTATION_TRUETYPE for empty - * outlines. - * - * @input: - * outline :: - * A handle to the source outline. - * - * @return: - * The orientation. - * - */ - FT_EXPORT( FT_Orientation ) - FT_Outline_Get_Orientation( FT_Outline* outline ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTOUTLN_H__ */ - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftpfr.h b/android/jni/ndk_modules/freetype/include/freetype/ftpfr.h deleted file mode 100644 index 0b7b7d42..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftpfr.h +++ /dev/null @@ -1,172 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftpfr.h */ -/* */ -/* FreeType API for accessing PFR-specific data (specification only). */ -/* */ -/* Copyright 2002, 2003, 2004, 2006, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTPFR_H__ -#define __FTPFR_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* pfr_fonts */ - /* */ - /* <Title> */ - /* PFR Fonts */ - /* */ - /* <Abstract> */ - /* PFR/TrueDoc specific API. */ - /* */ - /* <Description> */ - /* This section contains the declaration of PFR-specific functions. */ - /* */ - /*************************************************************************/ - - - /********************************************************************** - * - * @function: - * FT_Get_PFR_Metrics - * - * @description: - * Return the outline and metrics resolutions of a given PFR face. - * - * @input: - * face :: Handle to the input face. It can be a non-PFR face. - * - * @output: - * aoutline_resolution :: - * Outline resolution. This is equivalent to `face->units_per_EM' - * for non-PFR fonts. Optional (parameter can be NULL). - * - * ametrics_resolution :: - * Metrics resolution. This is equivalent to `outline_resolution' - * for non-PFR fonts. Optional (parameter can be NULL). - * - * ametrics_x_scale :: - * A 16.16 fixed-point number used to scale distance expressed - * in metrics units to device sub-pixels. This is equivalent to - * `face->size->x_scale', but for metrics only. Optional (parameter - * can be NULL). - * - * ametrics_y_scale :: - * Same as `ametrics_x_scale' but for the vertical direction. - * optional (parameter can be NULL). - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * If the input face is not a PFR, this function will return an error. - * However, in all cases, it will return valid values. - */ - FT_EXPORT( FT_Error ) - FT_Get_PFR_Metrics( FT_Face face, - FT_UInt *aoutline_resolution, - FT_UInt *ametrics_resolution, - FT_Fixed *ametrics_x_scale, - FT_Fixed *ametrics_y_scale ); - - - /********************************************************************** - * - * @function: - * FT_Get_PFR_Kerning - * - * @description: - * Return the kerning pair corresponding to two glyphs in a PFR face. - * The distance is expressed in metrics units, unlike the result of - * @FT_Get_Kerning. - * - * @input: - * face :: A handle to the input face. - * - * left :: Index of the left glyph. - * - * right :: Index of the right glyph. - * - * @output: - * avector :: A kerning vector. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function always return distances in original PFR metrics - * units. This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED - * mode, which always returns distances converted to outline units. - * - * You can use the value of the `x_scale' and `y_scale' parameters - * returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels. - */ - FT_EXPORT( FT_Error ) - FT_Get_PFR_Kerning( FT_Face face, - FT_UInt left, - FT_UInt right, - FT_Vector *avector ); - - - /********************************************************************** - * - * @function: - * FT_Get_PFR_Advance - * - * @description: - * Return a given glyph advance, expressed in original metrics units, - * from a PFR font. - * - * @input: - * face :: A handle to the input face. - * - * gindex :: The glyph index. - * - * @output: - * aadvance :: The glyph advance in metrics units. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics - * to convert the advance to device sub-pixels (i.e., 1/64th of pixels). - */ - FT_EXPORT( FT_Error ) - FT_Get_PFR_Advance( FT_Face face, - FT_UInt gindex, - FT_Pos *aadvance ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTPFR_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftrender.h b/android/jni/ndk_modules/freetype/include/freetype/ftrender.h deleted file mode 100644 index e06a8142..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftrender.h +++ /dev/null @@ -1,230 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftrender.h */ -/* */ -/* FreeType renderer modules public interface (specification). */ -/* */ -/* Copyright 1996-2001, 2005, 2006, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTRENDER_H__ -#define __FTRENDER_H__ - - -#include <ft2build.h> -#include FT_MODULE_H -#include FT_GLYPH_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* module_management */ - /* */ - /*************************************************************************/ - - - /* create a new glyph object */ - typedef FT_Error - (*FT_Glyph_InitFunc)( FT_Glyph glyph, - FT_GlyphSlot slot ); - - /* destroys a given glyph object */ - typedef void - (*FT_Glyph_DoneFunc)( FT_Glyph glyph ); - - typedef void - (*FT_Glyph_TransformFunc)( FT_Glyph glyph, - const FT_Matrix* matrix, - const FT_Vector* delta ); - - typedef void - (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph, - FT_BBox* abbox ); - - typedef FT_Error - (*FT_Glyph_CopyFunc)( FT_Glyph source, - FT_Glyph target ); - - typedef FT_Error - (*FT_Glyph_PrepareFunc)( FT_Glyph glyph, - FT_GlyphSlot slot ); - -/* deprecated */ -#define FT_Glyph_Init_Func FT_Glyph_InitFunc -#define FT_Glyph_Done_Func FT_Glyph_DoneFunc -#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc -#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc -#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc -#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc - - - struct FT_Glyph_Class_ - { - FT_Long glyph_size; - FT_Glyph_Format glyph_format; - FT_Glyph_InitFunc glyph_init; - FT_Glyph_DoneFunc glyph_done; - FT_Glyph_CopyFunc glyph_copy; - FT_Glyph_TransformFunc glyph_transform; - FT_Glyph_GetBBoxFunc glyph_bbox; - FT_Glyph_PrepareFunc glyph_prepare; - }; - - - typedef FT_Error - (*FT_Renderer_RenderFunc)( FT_Renderer renderer, - FT_GlyphSlot slot, - FT_UInt mode, - const FT_Vector* origin ); - - typedef FT_Error - (*FT_Renderer_TransformFunc)( FT_Renderer renderer, - FT_GlyphSlot slot, - const FT_Matrix* matrix, - const FT_Vector* delta ); - - - typedef void - (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer, - FT_GlyphSlot slot, - FT_BBox* cbox ); - - - typedef FT_Error - (*FT_Renderer_SetModeFunc)( FT_Renderer renderer, - FT_ULong mode_tag, - FT_Pointer mode_ptr ); - -/* deprecated identifiers */ -#define FTRenderer_render FT_Renderer_RenderFunc -#define FTRenderer_transform FT_Renderer_TransformFunc -#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc -#define FTRenderer_setMode FT_Renderer_SetModeFunc - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Renderer_Class */ - /* */ - /* <Description> */ - /* The renderer module class descriptor. */ - /* */ - /* <Fields> */ - /* root :: The root @FT_Module_Class fields. */ - /* */ - /* glyph_format :: The glyph image format this renderer handles. */ - /* */ - /* render_glyph :: A method used to render the image that is in a */ - /* given glyph slot into a bitmap. */ - /* */ - /* transform_glyph :: A method used to transform the image that is in */ - /* a given glyph slot. */ - /* */ - /* get_glyph_cbox :: A method used to access the glyph's cbox. */ - /* */ - /* set_mode :: A method used to pass additional parameters. */ - /* */ - /* raster_class :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */ - /* This is a pointer to its raster's class. */ - /* */ - typedef struct FT_Renderer_Class_ - { - FT_Module_Class root; - - FT_Glyph_Format glyph_format; - - FT_Renderer_RenderFunc render_glyph; - FT_Renderer_TransformFunc transform_glyph; - FT_Renderer_GetCBoxFunc get_glyph_cbox; - FT_Renderer_SetModeFunc set_mode; - - FT_Raster_Funcs* raster_class; - - } FT_Renderer_Class; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Renderer */ - /* */ - /* <Description> */ - /* Retrieve the current renderer for a given glyph format. */ - /* */ - /* <Input> */ - /* library :: A handle to the library object. */ - /* */ - /* format :: The glyph format. */ - /* */ - /* <Return> */ - /* A renderer handle. 0~if none found. */ - /* */ - /* <Note> */ - /* An error will be returned if a module already exists by that name, */ - /* or if the module requires a version of FreeType that is too great. */ - /* */ - /* To add a new renderer, simply use @FT_Add_Module. To retrieve a */ - /* renderer by its name, use @FT_Get_Module. */ - /* */ - FT_EXPORT( FT_Renderer ) - FT_Get_Renderer( FT_Library library, - FT_Glyph_Format format ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Renderer */ - /* */ - /* <Description> */ - /* Set the current renderer to use, and set additional mode. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library object. */ - /* */ - /* <Input> */ - /* renderer :: A handle to the renderer object. */ - /* */ - /* num_params :: The number of additional parameters. */ - /* */ - /* parameters :: Additional parameters. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* In case of success, the renderer will be used to convert glyph */ - /* images in the renderer's known format into bitmaps. */ - /* */ - /* This doesn't change the current renderer for other formats. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Set_Renderer( FT_Library library, - FT_Renderer renderer, - FT_UInt num_params, - FT_Parameter* parameters ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTRENDER_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftsizes.h b/android/jni/ndk_modules/freetype/include/freetype/ftsizes.h deleted file mode 100644 index 3e548cc3..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftsizes.h +++ /dev/null @@ -1,159 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsizes.h */ -/* */ -/* FreeType size objects management (specification). */ -/* */ -/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Typical application would normally not need to use these functions. */ - /* However, they have been placed in a public API for the rare cases */ - /* where they are needed. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTSIZES_H__ -#define __FTSIZES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* sizes_management */ - /* */ - /* <Title> */ - /* Size Management */ - /* */ - /* <Abstract> */ - /* Managing multiple sizes per face. */ - /* */ - /* <Description> */ - /* When creating a new face object (e.g., with @FT_New_Face), an */ - /* @FT_Size object is automatically created and used to store all */ - /* pixel-size dependent information, available in the `face->size' */ - /* field. */ - /* */ - /* It is however possible to create more sizes for a given face, */ - /* mostly in order to manage several character pixel sizes of the */ - /* same font family and style. See @FT_New_Size and @FT_Done_Size. */ - /* */ - /* Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only */ - /* modify the contents of the current `active' size; you thus need */ - /* to use @FT_Activate_Size to change it. */ - /* */ - /* 99% of applications won't need the functions provided here, */ - /* especially if they use the caching sub-system, so be cautious */ - /* when using these. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Size */ - /* */ - /* <Description> */ - /* Create a new size object from a given face object. */ - /* */ - /* <Input> */ - /* face :: A handle to a parent face object. */ - /* */ - /* <Output> */ - /* asize :: A handle to a new size object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* You need to call @FT_Activate_Size in order to select the new size */ - /* for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, */ - /* @FT_Load_Glyph, @FT_Load_Char, etc. */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Size( FT_Face face, - FT_Size* size ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_Size */ - /* */ - /* <Description> */ - /* Discard a given size object. Note that @FT_Done_Face */ - /* automatically discards all size objects allocated with */ - /* @FT_New_Size. */ - /* */ - /* <Input> */ - /* size :: A handle to a target size object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Done_Size( FT_Size size ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Activate_Size */ - /* */ - /* <Description> */ - /* Even though it is possible to create several size objects for a */ - /* given face (see @FT_New_Size for details), functions like */ - /* @FT_Load_Glyph or @FT_Load_Char only use the one which has been */ - /* activated last to determine the `current character pixel size'. */ - /* */ - /* This function can be used to `activate' a previously created size */ - /* object. */ - /* */ - /* <Input> */ - /* size :: A handle to a target size object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* If `face' is the size's parent face object, this function changes */ - /* the value of `face->size' to the input size handle. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Activate_Size( FT_Size size ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTSIZES_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftsnames.h b/android/jni/ndk_modules/freetype/include/freetype/ftsnames.h deleted file mode 100644 index 485e4e16..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftsnames.h +++ /dev/null @@ -1,200 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsnames.h */ -/* */ -/* Simple interface to access SFNT name tables (which are used */ -/* to hold font names, copyright info, notices, etc.) (specification). */ -/* */ -/* This is _not_ used to retrieve glyph names! */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2006, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FT_SFNT_NAMES_H__ -#define __FT_SFNT_NAMES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* sfnt_names */ - /* */ - /* <Title> */ - /* SFNT Names */ - /* */ - /* <Abstract> */ - /* Access the names embedded in TrueType and OpenType files. */ - /* */ - /* <Description> */ - /* The TrueType and OpenType specifications allow the inclusion of */ - /* a special `names table' in font files. This table contains */ - /* textual (and internationalized) information regarding the font, */ - /* like family name, copyright, version, etc. */ - /* */ - /* The definitions below are used to access them if available. */ - /* */ - /* Note that this has nothing to do with glyph names! */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_SfntName */ - /* */ - /* <Description> */ - /* A structure used to model an SFNT `name' table entry. */ - /* */ - /* <Fields> */ - /* platform_id :: The platform ID for `string'. */ - /* */ - /* encoding_id :: The encoding ID for `string'. */ - /* */ - /* language_id :: The language ID for `string'. */ - /* */ - /* name_id :: An identifier for `string'. */ - /* */ - /* string :: The `name' string. Note that its format differs */ - /* depending on the (platform,encoding) pair. It can */ - /* be a Pascal String, a UTF-16 one, etc. */ - /* */ - /* Generally speaking, the string is not */ - /* zero-terminated. Please refer to the TrueType */ - /* specification for details. */ - /* */ - /* string_len :: The length of `string' in bytes. */ - /* */ - /* <Note> */ - /* Possible values for `platform_id', `encoding_id', `language_id', */ - /* and `name_id' are given in the file `ttnameid.h'. For details */ - /* please refer to the TrueType or OpenType specification. */ - /* */ - /* See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, */ - /* @TT_ISO_ID_XXX, and @TT_MS_ID_XXX. */ - /* */ - typedef struct FT_SfntName_ - { - FT_UShort platform_id; - FT_UShort encoding_id; - FT_UShort language_id; - FT_UShort name_id; - - FT_Byte* string; /* this string is *not* null-terminated! */ - FT_UInt string_len; /* in bytes */ - - } FT_SfntName; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Sfnt_Name_Count */ - /* */ - /* <Description> */ - /* Retrieve the number of name strings in the SFNT `name' table. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face. */ - /* */ - /* <Return> */ - /* The number of strings in the `name' table. */ - /* */ - FT_EXPORT( FT_UInt ) - FT_Get_Sfnt_Name_Count( FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Sfnt_Name */ - /* */ - /* <Description> */ - /* Retrieve a string of the SFNT `name' table for a given index. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face. */ - /* */ - /* idx :: The index of the `name' string. */ - /* */ - /* <Output> */ - /* aname :: The indexed @FT_SfntName structure. */ - /* */ - /* <Return> */ - /* FreeType error code. 0~means success. */ - /* */ - /* <Note> */ - /* The `string' array returned in the `aname' structure is not */ - /* null-terminated. The application should deallocate it if it is no */ - /* longer in use. */ - /* */ - /* Use @FT_Get_Sfnt_Name_Count to get the total number of available */ - /* `name' table entries, then do a loop until you get the right */ - /* platform, encoding, and name ID. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Get_Sfnt_Name( FT_Face face, - FT_UInt idx, - FT_SfntName *aname ); - - - /*************************************************************************** - * - * @constant: - * FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY - * - * @description: - * A constant used as the tag of @FT_Parameter structures to make - * FT_Open_Face() ignore preferred family subfamily names in `name' - * table since OpenType version 1.4. For backwards compatibility with - * legacy systems which has 4-face-per-family restriction. - * - */ -#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY FT_MAKE_TAG( 'i', 'g', 'p', 'f' ) - - - /*************************************************************************** - * - * @constant: - * FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY - * - * @description: - * A constant used as the tag of @FT_Parameter structures to make - * FT_Open_Face() ignore preferred subfamily names in `name' table since - * OpenType version 1.4. For backwards compatibility with legacy - * systems which has 4-face-per-family restriction. - * - */ -#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY FT_MAKE_TAG( 'i', 'g', 'p', 's' ) - - /* */ - - -FT_END_HEADER - -#endif /* __FT_SFNT_NAMES_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftstroke.h b/android/jni/ndk_modules/freetype/include/freetype/ftstroke.h deleted file mode 100644 index 3afb87df..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftstroke.h +++ /dev/null @@ -1,716 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftstroke.h */ -/* */ -/* FreeType path stroker (specification). */ -/* */ -/* Copyright 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FT_STROKE_H__ -#define __FT_STROKE_H__ - -#include <ft2build.h> -#include FT_OUTLINE_H -#include FT_GLYPH_H - - -FT_BEGIN_HEADER - - - /************************************************************************ - * - * @section: - * glyph_stroker - * - * @title: - * Glyph Stroker - * - * @abstract: - * Generating bordered and stroked glyphs. - * - * @description: - * This component generates stroked outlines of a given vectorial - * glyph. It also allows you to retrieve the `outside' and/or the - * `inside' borders of the stroke. - * - * This can be useful to generate `bordered' glyph, i.e., glyphs - * displayed with a coloured (and anti-aliased) border around their - * shape. - */ - - - /************************************************************** - * - * @type: - * FT_Stroker - * - * @description: - * Opaque handler to a path stroker object. - */ - typedef struct FT_StrokerRec_* FT_Stroker; - - - /************************************************************** - * - * @enum: - * FT_Stroker_LineJoin - * - * @description: - * These values determine how two joining lines are rendered - * in a stroker. - * - * @values: - * FT_STROKER_LINEJOIN_ROUND :: - * Used to render rounded line joins. Circular arcs are used - * to join two lines smoothly. - * - * FT_STROKER_LINEJOIN_BEVEL :: - * Used to render beveled line joins; i.e., the two joining lines - * are extended until they intersect. - * - * FT_STROKER_LINEJOIN_MITER :: - * Same as beveled rendering, except that an additional line - * break is added if the angle between the two joining lines - * is too closed (this is useful to avoid unpleasant spikes - * in beveled rendering). - */ - typedef enum FT_Stroker_LineJoin_ - { - FT_STROKER_LINEJOIN_ROUND = 0, - FT_STROKER_LINEJOIN_BEVEL, - FT_STROKER_LINEJOIN_MITER - - } FT_Stroker_LineJoin; - - - /************************************************************** - * - * @enum: - * FT_Stroker_LineCap - * - * @description: - * These values determine how the end of opened sub-paths are - * rendered in a stroke. - * - * @values: - * FT_STROKER_LINECAP_BUTT :: - * The end of lines is rendered as a full stop on the last - * point itself. - * - * FT_STROKER_LINECAP_ROUND :: - * The end of lines is rendered as a half-circle around the - * last point. - * - * FT_STROKER_LINECAP_SQUARE :: - * The end of lines is rendered as a square around the - * last point. - */ - typedef enum FT_Stroker_LineCap_ - { - FT_STROKER_LINECAP_BUTT = 0, - FT_STROKER_LINECAP_ROUND, - FT_STROKER_LINECAP_SQUARE - - } FT_Stroker_LineCap; - - - /************************************************************** - * - * @enum: - * FT_StrokerBorder - * - * @description: - * These values are used to select a given stroke border - * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. - * - * @values: - * FT_STROKER_BORDER_LEFT :: - * Select the left border, relative to the drawing direction. - * - * FT_STROKER_BORDER_RIGHT :: - * Select the right border, relative to the drawing direction. - * - * @note: - * Applications are generally interested in the `inside' and `outside' - * borders. However, there is no direct mapping between these and the - * `left' and `right' ones, since this really depends on the glyph's - * drawing orientation, which varies between font formats. - * - * You can however use @FT_Outline_GetInsideBorder and - * @FT_Outline_GetOutsideBorder to get these. - */ - typedef enum FT_StrokerBorder_ - { - FT_STROKER_BORDER_LEFT = 0, - FT_STROKER_BORDER_RIGHT - - } FT_StrokerBorder; - - - /************************************************************** - * - * @function: - * FT_Outline_GetInsideBorder - * - * @description: - * Retrieve the @FT_StrokerBorder value corresponding to the - * `inside' borders of a given outline. - * - * @input: - * outline :: - * The source outline handle. - * - * @return: - * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid - * outlines. - */ - FT_EXPORT( FT_StrokerBorder ) - FT_Outline_GetInsideBorder( FT_Outline* outline ); - - - /************************************************************** - * - * @function: - * FT_Outline_GetOutsideBorder - * - * @description: - * Retrieve the @FT_StrokerBorder value corresponding to the - * `outside' borders of a given outline. - * - * @input: - * outline :: - * The source outline handle. - * - * @return: - * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid - * outlines. - */ - FT_EXPORT( FT_StrokerBorder ) - FT_Outline_GetOutsideBorder( FT_Outline* outline ); - - - /************************************************************** - * - * @function: - * FT_Stroker_New - * - * @description: - * Create a new stroker object. - * - * @input: - * library :: - * FreeType library handle. - * - * @output: - * astroker :: - * A new stroker object handle. NULL in case of error. - * - * @return: - * FreeType error code. 0~means success. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_New( FT_Library library, - FT_Stroker *astroker ); - - - /************************************************************** - * - * @function: - * FT_Stroker_Set - * - * @description: - * Reset a stroker object's attributes. - * - * @input: - * stroker :: - * The target stroker handle. - * - * radius :: - * The border radius. - * - * line_cap :: - * The line cap style. - * - * line_join :: - * The line join style. - * - * miter_limit :: - * The miter limit for the FT_STROKER_LINEJOIN_MITER style, - * expressed as 16.16 fixed point value. - * - * @note: - * The radius is expressed in the same units as the outline - * coordinates. - */ - FT_EXPORT( void ) - FT_Stroker_Set( FT_Stroker stroker, - FT_Fixed radius, - FT_Stroker_LineCap line_cap, - FT_Stroker_LineJoin line_join, - FT_Fixed miter_limit ); - - - /************************************************************** - * - * @function: - * FT_Stroker_Rewind - * - * @description: - * Reset a stroker object without changing its attributes. - * You should call this function before beginning a new - * series of calls to @FT_Stroker_BeginSubPath or - * @FT_Stroker_EndSubPath. - * - * @input: - * stroker :: - * The target stroker handle. - */ - FT_EXPORT( void ) - FT_Stroker_Rewind( FT_Stroker stroker ); - - - /************************************************************** - * - * @function: - * FT_Stroker_ParseOutline - * - * @description: - * A convenience function used to parse a whole outline with - * the stroker. The resulting outline(s) can be retrieved - * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export. - * - * @input: - * stroker :: - * The target stroker handle. - * - * outline :: - * The source outline. - * - * opened :: - * A boolean. If~1, the outline is treated as an open path instead - * of a closed one. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * If `opened' is~0 (the default), the outline is treated as a closed - * path, and the stroker generates two distinct `border' outlines. - * - * If `opened' is~1, the outline is processed as an open path, and the - * stroker generates a single `stroke' outline. - * - * This function calls @FT_Stroker_Rewind automatically. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_ParseOutline( FT_Stroker stroker, - FT_Outline* outline, - FT_Bool opened ); - - - /************************************************************** - * - * @function: - * FT_Stroker_BeginSubPath - * - * @description: - * Start a new sub-path in the stroker. - * - * @input: - * stroker :: - * The target stroker handle. - * - * to :: - * A pointer to the start vector. - * - * open :: - * A boolean. If~1, the sub-path is treated as an open one. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function is useful when you need to stroke a path that is - * not stored as an @FT_Outline object. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_BeginSubPath( FT_Stroker stroker, - FT_Vector* to, - FT_Bool open ); - - - /************************************************************** - * - * @function: - * FT_Stroker_EndSubPath - * - * @description: - * Close the current sub-path in the stroker. - * - * @input: - * stroker :: - * The target stroker handle. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * You should call this function after @FT_Stroker_BeginSubPath. - * If the subpath was not `opened', this function `draws' a - * single line segment to the start position when needed. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_EndSubPath( FT_Stroker stroker ); - - - /************************************************************** - * - * @function: - * FT_Stroker_LineTo - * - * @description: - * `Draw' a single line segment in the stroker's current sub-path, - * from the last position. - * - * @input: - * stroker :: - * The target stroker handle. - * - * to :: - * A pointer to the destination point. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * You should call this function between @FT_Stroker_BeginSubPath and - * @FT_Stroker_EndSubPath. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_LineTo( FT_Stroker stroker, - FT_Vector* to ); - - - /************************************************************** - * - * @function: - * FT_Stroker_ConicTo - * - * @description: - * `Draw' a single quadratic Bézier in the stroker's current sub-path, - * from the last position. - * - * @input: - * stroker :: - * The target stroker handle. - * - * control :: - * A pointer to a Bézier control point. - * - * to :: - * A pointer to the destination point. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * You should call this function between @FT_Stroker_BeginSubPath and - * @FT_Stroker_EndSubPath. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_ConicTo( FT_Stroker stroker, - FT_Vector* control, - FT_Vector* to ); - - - /************************************************************** - * - * @function: - * FT_Stroker_CubicTo - * - * @description: - * `Draw' a single cubic Bézier in the stroker's current sub-path, - * from the last position. - * - * @input: - * stroker :: - * The target stroker handle. - * - * control1 :: - * A pointer to the first Bézier control point. - * - * control2 :: - * A pointer to second Bézier control point. - * - * to :: - * A pointer to the destination point. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * You should call this function between @FT_Stroker_BeginSubPath and - * @FT_Stroker_EndSubPath. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_CubicTo( FT_Stroker stroker, - FT_Vector* control1, - FT_Vector* control2, - FT_Vector* to ); - - - /************************************************************** - * - * @function: - * FT_Stroker_GetBorderCounts - * - * @description: - * Call this function once you have finished parsing your paths - * with the stroker. It returns the number of points and - * contours necessary to export one of the `border' or `stroke' - * outlines generated by the stroker. - * - * @input: - * stroker :: - * The target stroker handle. - * - * border :: - * The border index. - * - * @output: - * anum_points :: - * The number of points. - * - * anum_contours :: - * The number of contours. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * When an outline, or a sub-path, is `closed', the stroker generates - * two independent `border' outlines, named `left' and `right'. - * - * When the outline, or a sub-path, is `opened', the stroker merges - * the `border' outlines with caps. The `left' border receives all - * points, while the `right' border becomes empty. - * - * Use the function @FT_Stroker_GetCounts instead if you want to - * retrieve the counts associated to both borders. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_GetBorderCounts( FT_Stroker stroker, - FT_StrokerBorder border, - FT_UInt *anum_points, - FT_UInt *anum_contours ); - - - /************************************************************** - * - * @function: - * FT_Stroker_ExportBorder - * - * @description: - * Call this function after @FT_Stroker_GetBorderCounts to - * export the corresponding border to your own @FT_Outline - * structure. - * - * Note that this function appends the border points and - * contours to your outline, but does not try to resize its - * arrays. - * - * @input: - * stroker :: - * The target stroker handle. - * - * border :: - * The border index. - * - * outline :: - * The target outline handle. - * - * @note: - * Always call this function after @FT_Stroker_GetBorderCounts to - * get sure that there is enough room in your @FT_Outline object to - * receive all new data. - * - * When an outline, or a sub-path, is `closed', the stroker generates - * two independent `border' outlines, named `left' and `right' - * - * When the outline, or a sub-path, is `opened', the stroker merges - * the `border' outlines with caps. The `left' border receives all - * points, while the `right' border becomes empty. - * - * Use the function @FT_Stroker_Export instead if you want to - * retrieve all borders at once. - */ - FT_EXPORT( void ) - FT_Stroker_ExportBorder( FT_Stroker stroker, - FT_StrokerBorder border, - FT_Outline* outline ); - - - /************************************************************** - * - * @function: - * FT_Stroker_GetCounts - * - * @description: - * Call this function once you have finished parsing your paths - * with the stroker. It returns the number of points and - * contours necessary to export all points/borders from the stroked - * outline/path. - * - * @input: - * stroker :: - * The target stroker handle. - * - * @output: - * anum_points :: - * The number of points. - * - * anum_contours :: - * The number of contours. - * - * @return: - * FreeType error code. 0~means success. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_GetCounts( FT_Stroker stroker, - FT_UInt *anum_points, - FT_UInt *anum_contours ); - - - /************************************************************** - * - * @function: - * FT_Stroker_Export - * - * @description: - * Call this function after @FT_Stroker_GetBorderCounts to - * export all borders to your own @FT_Outline structure. - * - * Note that this function appends the border points and - * contours to your outline, but does not try to resize its - * arrays. - * - * @input: - * stroker :: - * The target stroker handle. - * - * outline :: - * The target outline handle. - */ - FT_EXPORT( void ) - FT_Stroker_Export( FT_Stroker stroker, - FT_Outline* outline ); - - - /************************************************************** - * - * @function: - * FT_Stroker_Done - * - * @description: - * Destroy a stroker object. - * - * @input: - * stroker :: - * A stroker handle. Can be NULL. - */ - FT_EXPORT( void ) - FT_Stroker_Done( FT_Stroker stroker ); - - - /************************************************************** - * - * @function: - * FT_Glyph_Stroke - * - * @description: - * Stroke a given outline glyph object with a given stroker. - * - * @inout: - * pglyph :: - * Source glyph handle on input, new glyph handle on output. - * - * @input: - * stroker :: - * A stroker handle. - * - * destroy :: - * A Boolean. If~1, the source glyph object is destroyed - * on success. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The source glyph is untouched in case of error. - */ - FT_EXPORT( FT_Error ) - FT_Glyph_Stroke( FT_Glyph *pglyph, - FT_Stroker stroker, - FT_Bool destroy ); - - - /************************************************************** - * - * @function: - * FT_Glyph_StrokeBorder - * - * @description: - * Stroke a given outline glyph object with a given stroker, but - * only return either its inside or outside border. - * - * @inout: - * pglyph :: - * Source glyph handle on input, new glyph handle on output. - * - * @input: - * stroker :: - * A stroker handle. - * - * inside :: - * A Boolean. If~1, return the inside border, otherwise - * the outside border. - * - * destroy :: - * A Boolean. If~1, the source glyph object is destroyed - * on success. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The source glyph is untouched in case of error. - */ - FT_EXPORT( FT_Error ) - FT_Glyph_StrokeBorder( FT_Glyph *pglyph, - FT_Stroker stroker, - FT_Bool inside, - FT_Bool destroy ); - - /* */ - -FT_END_HEADER - -#endif /* __FT_STROKE_H__ */ - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftsynth.h b/android/jni/ndk_modules/freetype/include/freetype/ftsynth.h deleted file mode 100644 index a068b792..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftsynth.h +++ /dev/null @@ -1,80 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsynth.h */ -/* */ -/* FreeType synthesizing code for emboldening and slanting */ -/* (specification). */ -/* */ -/* Copyright 2000-2001, 2003, 2006, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /********* *********/ - /********* WARNING, THIS IS ALPHA CODE! THIS API *********/ - /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ - /********* FREETYPE DEVELOPMENT TEAM *********/ - /********* *********/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* Main reason for not lifting the functions in this module to a */ - /* `standard' API is that the used parameters for emboldening and */ - /* slanting are not configurable. Consider the functions as a */ - /* code resource which should be copied into the application and */ - /* adapted to the particular needs. */ - - -#ifndef __FTSYNTH_H__ -#define __FTSYNTH_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /* Embolden a glyph by a `reasonable' value (which is highly a matter of */ - /* taste). This function is actually a convenience function, providing */ - /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */ - /* */ - /* For emboldened outlines the metrics are estimates only; if you need */ - /* precise values you should call @FT_Outline_Get_CBox. */ - FT_EXPORT( void ) - FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); - - /* Slant an outline glyph to the right by about 12 degrees. */ - FT_EXPORT( void ) - FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); - - /* */ - -FT_END_HEADER - -#endif /* __FTSYNTH_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftsystem.h b/android/jni/ndk_modules/freetype/include/freetype/ftsystem.h deleted file mode 100644 index e07460c5..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftsystem.h +++ /dev/null @@ -1,347 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsystem.h */ -/* */ -/* FreeType low-level system interface definition (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2005, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTSYSTEM_H__ -#define __FTSYSTEM_H__ - - -#include <ft2build.h> - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* system_interface */ - /* */ - /* <Title> */ - /* System Interface */ - /* */ - /* <Abstract> */ - /* How FreeType manages memory and i/o. */ - /* */ - /* <Description> */ - /* This section contains various definitions related to memory */ - /* management and i/o access. You need to understand this */ - /* information if you want to use a custom memory manager or you own */ - /* i/o streams. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* M E M O R Y M A N A G E M E N T */ - /* */ - /*************************************************************************/ - - - /************************************************************************* - * - * @type: - * FT_Memory - * - * @description: - * A handle to a given memory manager object, defined with an - * @FT_MemoryRec structure. - * - */ - typedef struct FT_MemoryRec_* FT_Memory; - - - /************************************************************************* - * - * @functype: - * FT_Alloc_Func - * - * @description: - * A function used to allocate `size' bytes from `memory'. - * - * @input: - * memory :: - * A handle to the source memory manager. - * - * size :: - * The size in bytes to allocate. - * - * @return: - * Address of new memory block. 0~in case of failure. - * - */ - typedef void* - (*FT_Alloc_Func)( FT_Memory memory, - long size ); - - - /************************************************************************* - * - * @functype: - * FT_Free_Func - * - * @description: - * A function used to release a given block of memory. - * - * @input: - * memory :: - * A handle to the source memory manager. - * - * block :: - * The address of the target memory block. - * - */ - typedef void - (*FT_Free_Func)( FT_Memory memory, - void* block ); - - - /************************************************************************* - * - * @functype: - * FT_Realloc_Func - * - * @description: - * A function used to re-allocate a given block of memory. - * - * @input: - * memory :: - * A handle to the source memory manager. - * - * cur_size :: - * The block's current size in bytes. - * - * new_size :: - * The block's requested new size. - * - * block :: - * The block's current address. - * - * @return: - * New block address. 0~in case of memory shortage. - * - * @note: - * In case of error, the old block must still be available. - * - */ - typedef void* - (*FT_Realloc_Func)( FT_Memory memory, - long cur_size, - long new_size, - void* block ); - - - /************************************************************************* - * - * @struct: - * FT_MemoryRec - * - * @description: - * A structure used to describe a given memory manager to FreeType~2. - * - * @fields: - * user :: - * A generic typeless pointer for user data. - * - * alloc :: - * A pointer type to an allocation function. - * - * free :: - * A pointer type to an memory freeing function. - * - * realloc :: - * A pointer type to a reallocation function. - * - */ - struct FT_MemoryRec_ - { - void* user; - FT_Alloc_Func alloc; - FT_Free_Func free; - FT_Realloc_Func realloc; - }; - - - /*************************************************************************/ - /* */ - /* I / O M A N A G E M E N T */ - /* */ - /*************************************************************************/ - - - /************************************************************************* - * - * @type: - * FT_Stream - * - * @description: - * A handle to an input stream. - * - */ - typedef struct FT_StreamRec_* FT_Stream; - - - /************************************************************************* - * - * @struct: - * FT_StreamDesc - * - * @description: - * A union type used to store either a long or a pointer. This is used - * to store a file descriptor or a `FILE*' in an input stream. - * - */ - typedef union FT_StreamDesc_ - { - long value; - void* pointer; - - } FT_StreamDesc; - - - /************************************************************************* - * - * @functype: - * FT_Stream_IoFunc - * - * @description: - * A function used to seek and read data from a given input stream. - * - * @input: - * stream :: - * A handle to the source stream. - * - * offset :: - * The offset of read in stream (always from start). - * - * buffer :: - * The address of the read buffer. - * - * count :: - * The number of bytes to read from the stream. - * - * @return: - * The number of bytes effectively read by the stream. - * - * @note: - * This function might be called to perform a seek or skip operation - * with a `count' of~0. A non-zero return value then indicates an - * error. - * - */ - typedef unsigned long - (*FT_Stream_IoFunc)( FT_Stream stream, - unsigned long offset, - unsigned char* buffer, - unsigned long count ); - - - /************************************************************************* - * - * @functype: - * FT_Stream_CloseFunc - * - * @description: - * A function used to close a given input stream. - * - * @input: - * stream :: - * A handle to the target stream. - * - */ - typedef void - (*FT_Stream_CloseFunc)( FT_Stream stream ); - - - /************************************************************************* - * - * @struct: - * FT_StreamRec - * - * @description: - * A structure used to describe an input stream. - * - * @input: - * base :: - * For memory-based streams, this is the address of the first stream - * byte in memory. This field should always be set to NULL for - * disk-based streams. - * - * size :: - * The stream size in bytes. - * - * pos :: - * The current position within the stream. - * - * descriptor :: - * This field is a union that can hold an integer or a pointer. It is - * used by stream implementations to store file descriptors or `FILE*' - * pointers. - * - * pathname :: - * This field is completely ignored by FreeType. However, it is often - * useful during debugging to use it to store the stream's filename - * (where available). - * - * read :: - * The stream's input function. - * - * close :: - * The stream's close function. - * - * memory :: - * The memory manager to use to preload frames. This is set - * internally by FreeType and shouldn't be touched by stream - * implementations. - * - * cursor :: - * This field is set and used internally by FreeType when parsing - * frames. - * - * limit :: - * This field is set and used internally by FreeType when parsing - * frames. - * - */ - typedef struct FT_StreamRec_ - { - unsigned char* base; - unsigned long size; - unsigned long pos; - - FT_StreamDesc descriptor; - FT_StreamDesc pathname; - FT_Stream_IoFunc read; - FT_Stream_CloseFunc close; - - FT_Memory memory; - unsigned char* cursor; - unsigned char* limit; - - } FT_StreamRec; - - - /* */ - - -FT_END_HEADER - -#endif /* __FTSYSTEM_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/fttrigon.h b/android/jni/ndk_modules/freetype/include/freetype/fttrigon.h deleted file mode 100644 index 6b77d2ee..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/fttrigon.h +++ /dev/null @@ -1,350 +0,0 @@ -/***************************************************************************/ -/* */ -/* fttrigon.h */ -/* */ -/* FreeType trigonometric functions (specification). */ -/* */ -/* Copyright 2001, 2003, 2005, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTTRIGON_H__ -#define __FTTRIGON_H__ - -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* computations */ - /* */ - /*************************************************************************/ - - - /************************************************************************* - * - * @type: - * FT_Angle - * - * @description: - * This type is used to model angle values in FreeType. Note that the - * angle is a 16.16 fixed float value expressed in degrees. - * - */ - typedef FT_Fixed FT_Angle; - - - /************************************************************************* - * - * @macro: - * FT_ANGLE_PI - * - * @description: - * The angle pi expressed in @FT_Angle units. - * - */ -#define FT_ANGLE_PI ( 180L << 16 ) - - - /************************************************************************* - * - * @macro: - * FT_ANGLE_2PI - * - * @description: - * The angle 2*pi expressed in @FT_Angle units. - * - */ -#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 ) - - - /************************************************************************* - * - * @macro: - * FT_ANGLE_PI2 - * - * @description: - * The angle pi/2 expressed in @FT_Angle units. - * - */ -#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 ) - - - /************************************************************************* - * - * @macro: - * FT_ANGLE_PI4 - * - * @description: - * The angle pi/4 expressed in @FT_Angle units. - * - */ -#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 ) - - - /************************************************************************* - * - * @function: - * FT_Sin - * - * @description: - * Return the sinus of a given angle in fixed point format. - * - * @input: - * angle :: - * The input angle. - * - * @return: - * The sinus value. - * - * @note: - * If you need both the sinus and cosinus for a given angle, use the - * function @FT_Vector_Unit. - * - */ - FT_EXPORT( FT_Fixed ) - FT_Sin( FT_Angle angle ); - - - /************************************************************************* - * - * @function: - * FT_Cos - * - * @description: - * Return the cosinus of a given angle in fixed point format. - * - * @input: - * angle :: - * The input angle. - * - * @return: - * The cosinus value. - * - * @note: - * If you need both the sinus and cosinus for a given angle, use the - * function @FT_Vector_Unit. - * - */ - FT_EXPORT( FT_Fixed ) - FT_Cos( FT_Angle angle ); - - - /************************************************************************* - * - * @function: - * FT_Tan - * - * @description: - * Return the tangent of a given angle in fixed point format. - * - * @input: - * angle :: - * The input angle. - * - * @return: - * The tangent value. - * - */ - FT_EXPORT( FT_Fixed ) - FT_Tan( FT_Angle angle ); - - - /************************************************************************* - * - * @function: - * FT_Atan2 - * - * @description: - * Return the arc-tangent corresponding to a given vector (x,y) in - * the 2d plane. - * - * @input: - * x :: - * The horizontal vector coordinate. - * - * y :: - * The vertical vector coordinate. - * - * @return: - * The arc-tangent value (i.e. angle). - * - */ - FT_EXPORT( FT_Angle ) - FT_Atan2( FT_Fixed x, - FT_Fixed y ); - - - /************************************************************************* - * - * @function: - * FT_Angle_Diff - * - * @description: - * Return the difference between two angles. The result is always - * constrained to the ]-PI..PI] interval. - * - * @input: - * angle1 :: - * First angle. - * - * angle2 :: - * Second angle. - * - * @return: - * Constrained value of `value2-value1'. - * - */ - FT_EXPORT( FT_Angle ) - FT_Angle_Diff( FT_Angle angle1, - FT_Angle angle2 ); - - - /************************************************************************* - * - * @function: - * FT_Vector_Unit - * - * @description: - * Return the unit vector corresponding to a given angle. After the - * call, the value of `vec.x' will be `sin(angle)', and the value of - * `vec.y' will be `cos(angle)'. - * - * This function is useful to retrieve both the sinus and cosinus of a - * given angle quickly. - * - * @output: - * vec :: - * The address of target vector. - * - * @input: - * angle :: - * The address of angle. - * - */ - FT_EXPORT( void ) - FT_Vector_Unit( FT_Vector* vec, - FT_Angle angle ); - - - /************************************************************************* - * - * @function: - * FT_Vector_Rotate - * - * @description: - * Rotate a vector by a given angle. - * - * @inout: - * vec :: - * The address of target vector. - * - * @input: - * angle :: - * The address of angle. - * - */ - FT_EXPORT( void ) - FT_Vector_Rotate( FT_Vector* vec, - FT_Angle angle ); - - - /************************************************************************* - * - * @function: - * FT_Vector_Length - * - * @description: - * Return the length of a given vector. - * - * @input: - * vec :: - * The address of target vector. - * - * @return: - * The vector length, expressed in the same units that the original - * vector coordinates. - * - */ - FT_EXPORT( FT_Fixed ) - FT_Vector_Length( FT_Vector* vec ); - - - /************************************************************************* - * - * @function: - * FT_Vector_Polarize - * - * @description: - * Compute both the length and angle of a given vector. - * - * @input: - * vec :: - * The address of source vector. - * - * @output: - * length :: - * The vector length. - * - * angle :: - * The vector angle. - * - */ - FT_EXPORT( void ) - FT_Vector_Polarize( FT_Vector* vec, - FT_Fixed *length, - FT_Angle *angle ); - - - /************************************************************************* - * - * @function: - * FT_Vector_From_Polar - * - * @description: - * Compute vector coordinates from a length and angle. - * - * @output: - * vec :: - * The address of source vector. - * - * @input: - * length :: - * The vector length. - * - * angle :: - * The vector angle. - * - */ - FT_EXPORT( void ) - FT_Vector_From_Polar( FT_Vector* vec, - FT_Fixed length, - FT_Angle angle ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTTRIGON_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/fttypes.h b/android/jni/ndk_modules/freetype/include/freetype/fttypes.h deleted file mode 100644 index a57ffa69..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/fttypes.h +++ /dev/null @@ -1,588 +0,0 @@ -/***************************************************************************/ -/* */ -/* fttypes.h */ -/* */ -/* FreeType simple types definitions (specification only). */ -/* */ -/* Copyright 1996-2001, 2002, 2004, 2006, 2007, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTTYPES_H__ -#define __FTTYPES_H__ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_SYSTEM_H -#include FT_IMAGE_H - -#include <stddef.h> - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* basic_types */ - /* */ - /* <Title> */ - /* Basic Data Types */ - /* */ - /* <Abstract> */ - /* The basic data types defined by the library. */ - /* */ - /* <Description> */ - /* This section contains the basic data types defined by FreeType~2, */ - /* ranging from simple scalar types to bitmap descriptors. More */ - /* font-specific structures are defined in a different section. */ - /* */ - /* <Order> */ - /* FT_Byte */ - /* FT_Bytes */ - /* FT_Char */ - /* FT_Int */ - /* FT_UInt */ - /* FT_Int16 */ - /* FT_UInt16 */ - /* FT_Int32 */ - /* FT_UInt32 */ - /* FT_Short */ - /* FT_UShort */ - /* FT_Long */ - /* FT_ULong */ - /* FT_Bool */ - /* FT_Offset */ - /* FT_PtrDist */ - /* FT_String */ - /* FT_Tag */ - /* FT_Error */ - /* FT_Fixed */ - /* FT_Pointer */ - /* FT_Pos */ - /* FT_Vector */ - /* FT_BBox */ - /* FT_Matrix */ - /* FT_FWord */ - /* FT_UFWord */ - /* FT_F2Dot14 */ - /* FT_UnitVector */ - /* FT_F26Dot6 */ - /* */ - /* */ - /* FT_Generic */ - /* FT_Generic_Finalizer */ - /* */ - /* FT_Bitmap */ - /* FT_Pixel_Mode */ - /* FT_Palette_Mode */ - /* FT_Glyph_Format */ - /* FT_IMAGE_TAG */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Bool */ - /* */ - /* <Description> */ - /* A typedef of unsigned char, used for simple booleans. As usual, */ - /* values 1 and~0 represent true and false, respectively. */ - /* */ - typedef unsigned char FT_Bool; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_FWord */ - /* */ - /* <Description> */ - /* A signed 16-bit integer used to store a distance in original font */ - /* units. */ - /* */ - typedef signed short FT_FWord; /* distance in FUnits */ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_UFWord */ - /* */ - /* <Description> */ - /* An unsigned 16-bit integer used to store a distance in original */ - /* font units. */ - /* */ - typedef unsigned short FT_UFWord; /* unsigned distance */ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Char */ - /* */ - /* <Description> */ - /* A simple typedef for the _signed_ char type. */ - /* */ - typedef signed char FT_Char; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Byte */ - /* */ - /* <Description> */ - /* A simple typedef for the _unsigned_ char type. */ - /* */ - typedef unsigned char FT_Byte; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Bytes */ - /* */ - /* <Description> */ - /* A typedef for constant memory areas. */ - /* */ - typedef const FT_Byte* FT_Bytes; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Tag */ - /* */ - /* <Description> */ - /* A typedef for 32-bit tags (as used in the SFNT format). */ - /* */ - typedef FT_UInt32 FT_Tag; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_String */ - /* */ - /* <Description> */ - /* A simple typedef for the char type, usually used for strings. */ - /* */ - typedef char FT_String; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Short */ - /* */ - /* <Description> */ - /* A typedef for signed short. */ - /* */ - typedef signed short FT_Short; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_UShort */ - /* */ - /* <Description> */ - /* A typedef for unsigned short. */ - /* */ - typedef unsigned short FT_UShort; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Int */ - /* */ - /* <Description> */ - /* A typedef for the int type. */ - /* */ - typedef signed int FT_Int; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_UInt */ - /* */ - /* <Description> */ - /* A typedef for the unsigned int type. */ - /* */ - typedef unsigned int FT_UInt; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Long */ - /* */ - /* <Description> */ - /* A typedef for signed long. */ - /* */ - typedef signed long FT_Long; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_ULong */ - /* */ - /* <Description> */ - /* A typedef for unsigned long. */ - /* */ - typedef unsigned long FT_ULong; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_F2Dot14 */ - /* */ - /* <Description> */ - /* A signed 2.14 fixed float type used for unit vectors. */ - /* */ - typedef signed short FT_F2Dot14; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_F26Dot6 */ - /* */ - /* <Description> */ - /* A signed 26.6 fixed float type used for vectorial pixel */ - /* coordinates. */ - /* */ - typedef signed long FT_F26Dot6; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Fixed */ - /* */ - /* <Description> */ - /* This type is used to store 16.16 fixed float values, like scaling */ - /* values or matrix coefficients. */ - /* */ - typedef signed long FT_Fixed; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Error */ - /* */ - /* <Description> */ - /* The FreeType error code type. A value of~0 is always interpreted */ - /* as a successful operation. */ - /* */ - typedef int FT_Error; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Pointer */ - /* */ - /* <Description> */ - /* A simple typedef for a typeless pointer. */ - /* */ - typedef void* FT_Pointer; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Offset */ - /* */ - /* <Description> */ - /* This is equivalent to the ANSI~C `size_t' type, i.e., the largest */ - /* _unsigned_ integer type used to express a file size or position, */ - /* or a memory block size. */ - /* */ - typedef size_t FT_Offset; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_PtrDist */ - /* */ - /* <Description> */ - /* This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the */ - /* largest _signed_ integer type used to express the distance */ - /* between two pointers. */ - /* */ - typedef ft_ptrdiff_t FT_PtrDist; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_UnitVector */ - /* */ - /* <Description> */ - /* A simple structure used to store a 2D vector unit vector. Uses */ - /* FT_F2Dot14 types. */ - /* */ - /* <Fields> */ - /* x :: Horizontal coordinate. */ - /* */ - /* y :: Vertical coordinate. */ - /* */ - typedef struct FT_UnitVector_ - { - FT_F2Dot14 x; - FT_F2Dot14 y; - - } FT_UnitVector; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Matrix */ - /* */ - /* <Description> */ - /* A simple structure used to store a 2x2 matrix. Coefficients are */ - /* in 16.16 fixed float format. The computation performed is: */ - /* */ - /* { */ - /* x' = x*xx + y*xy */ - /* y' = x*yx + y*yy */ - /* } */ - /* */ - /* <Fields> */ - /* xx :: Matrix coefficient. */ - /* */ - /* xy :: Matrix coefficient. */ - /* */ - /* yx :: Matrix coefficient. */ - /* */ - /* yy :: Matrix coefficient. */ - /* */ - typedef struct FT_Matrix_ - { - FT_Fixed xx, xy; - FT_Fixed yx, yy; - - } FT_Matrix; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Data */ - /* */ - /* <Description> */ - /* Read-only binary data represented as a pointer and a length. */ - /* */ - /* <Fields> */ - /* pointer :: The data. */ - /* */ - /* length :: The length of the data in bytes. */ - /* */ - typedef struct FT_Data_ - { - const FT_Byte* pointer; - FT_Int length; - - } FT_Data; - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Generic_Finalizer */ - /* */ - /* <Description> */ - /* Describe a function used to destroy the `client' data of any */ - /* FreeType object. See the description of the @FT_Generic type for */ - /* details of usage. */ - /* */ - /* <Input> */ - /* The address of the FreeType object which is under finalization. */ - /* Its client data is accessed through its `generic' field. */ - /* */ - typedef void (*FT_Generic_Finalizer)(void* object); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Generic */ - /* */ - /* <Description> */ - /* Client applications often need to associate their own data to a */ - /* variety of FreeType core objects. For example, a text layout API */ - /* might want to associate a glyph cache to a given size object. */ - /* */ - /* Most FreeType object contains a `generic' field, of type */ - /* FT_Generic, which usage is left to client applications and font */ - /* servers. */ - /* */ - /* It can be used to store a pointer to client-specific data, as well */ - /* as the address of a `finalizer' function, which will be called by */ - /* FreeType when the object is destroyed (for example, the previous */ - /* client example would put the address of the glyph cache destructor */ - /* in the `finalizer' field). */ - /* */ - /* <Fields> */ - /* data :: A typeless pointer to any client-specified data. This */ - /* field is completely ignored by the FreeType library. */ - /* */ - /* finalizer :: A pointer to a `generic finalizer' function, which */ - /* will be called when the object is destroyed. If this */ - /* field is set to NULL, no code will be called. */ - /* */ - typedef struct FT_Generic_ - { - void* data; - FT_Generic_Finalizer finalizer; - - } FT_Generic; - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_MAKE_TAG */ - /* */ - /* <Description> */ - /* This macro converts four-letter tags which are used to label */ - /* TrueType tables into an unsigned long to be used within FreeType. */ - /* */ - /* <Note> */ - /* The produced values *must* be 32-bit integers. Don't redefine */ - /* this macro. */ - /* */ -#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ - (FT_Tag) \ - ( ( (FT_ULong)_x1 << 24 ) | \ - ( (FT_ULong)_x2 << 16 ) | \ - ( (FT_ULong)_x3 << 8 ) | \ - (FT_ULong)_x4 ) - - - /*************************************************************************/ - /*************************************************************************/ - /* */ - /* L I S T M A N A G E M E N T */ - /* */ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* list_processing */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_ListNode */ - /* */ - /* <Description> */ - /* Many elements and objects in FreeType are listed through an */ - /* @FT_List record (see @FT_ListRec). As its name suggests, an */ - /* FT_ListNode is a handle to a single list element. */ - /* */ - typedef struct FT_ListNodeRec_* FT_ListNode; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_List */ - /* */ - /* <Description> */ - /* A handle to a list record (see @FT_ListRec). */ - /* */ - typedef struct FT_ListRec_* FT_List; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_ListNodeRec */ - /* */ - /* <Description> */ - /* A structure used to hold a single list element. */ - /* */ - /* <Fields> */ - /* prev :: The previous element in the list. NULL if first. */ - /* */ - /* next :: The next element in the list. NULL if last. */ - /* */ - /* data :: A typeless pointer to the listed object. */ - /* */ - typedef struct FT_ListNodeRec_ - { - FT_ListNode prev; - FT_ListNode next; - void* data; - - } FT_ListNodeRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_ListRec */ - /* */ - /* <Description> */ - /* A structure used to hold a simple doubly-linked list. These are */ - /* used in many parts of FreeType. */ - /* */ - /* <Fields> */ - /* head :: The head (first element) of doubly-linked list. */ - /* */ - /* tail :: The tail (last element) of doubly-linked list. */ - /* */ - typedef struct FT_ListRec_ - { - FT_ListNode head; - FT_ListNode tail; - - } FT_ListRec; - - - /* */ - -#define FT_IS_EMPTY( list ) ( (list).head == 0 ) - - /* return base error code (without module-specific prefix) */ -#define FT_ERROR_BASE( x ) ( (x) & 0xFF ) - - /* return module error code */ -#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) - -#define FT_BOOL( x ) ( (FT_Bool)( x ) ) - -FT_END_HEADER - -#endif /* __FTTYPES_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftwinfnt.h b/android/jni/ndk_modules/freetype/include/freetype/ftwinfnt.h deleted file mode 100644 index ea333535..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftwinfnt.h +++ /dev/null @@ -1,274 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftwinfnt.h */ -/* */ -/* FreeType API for accessing Windows fnt-specific data. */ -/* */ -/* Copyright 2003, 2004, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTWINFNT_H__ -#define __FTWINFNT_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* winfnt_fonts */ - /* */ - /* <Title> */ - /* Window FNT Files */ - /* */ - /* <Abstract> */ - /* Windows FNT specific API. */ - /* */ - /* <Description> */ - /* This section contains the declaration of Windows FNT specific */ - /* functions. */ - /* */ - /*************************************************************************/ - - - /************************************************************************* - * - * @enum: - * FT_WinFNT_ID_XXX - * - * @description: - * A list of valid values for the `charset' byte in - * @FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX - * encodings (except for cp1361) can be found at ftp://ftp.unicode.org - * in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is - * roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT. - * - * @values: - * FT_WinFNT_ID_DEFAULT :: - * This is used for font enumeration and font creation as a - * `don't care' value. Valid font files don't contain this value. - * When querying for information about the character set of the font - * that is currently selected into a specified device context, this - * return value (of the related Windows API) simply denotes failure. - * - * FT_WinFNT_ID_SYMBOL :: - * There is no known mapping table available. - * - * FT_WinFNT_ID_MAC :: - * Mac Roman encoding. - * - * FT_WinFNT_ID_OEM :: - * From Michael Pöttgen <michael@poettgen.de>: - * - * The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM - * is used for the charset of vector fonts, like `modern.fon', - * `roman.fon', and `script.fon' on Windows. - * - * The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value - * specifies a character set that is operating-system dependent. - * - * The `IFIMETRICS' documentation from the `Windows Driver - * Development Kit' says: This font supports an OEM-specific - * character set. The OEM character set is system dependent. - * - * In general OEM, as opposed to ANSI (i.e., cp1252), denotes the - * second default codepage that most international versions of - * Windows have. It is one of the OEM codepages from - * - * http://www.microsoft.com/globaldev/reference/cphome.mspx, - * - * and is used for the `DOS boxes', to support legacy applications. - * A German Windows version for example usually uses ANSI codepage - * 1252 and OEM codepage 850. - * - * FT_WinFNT_ID_CP874 :: - * A superset of Thai TIS 620 and ISO 8859-11. - * - * FT_WinFNT_ID_CP932 :: - * A superset of Japanese Shift-JIS (with minor deviations). - * - * FT_WinFNT_ID_CP936 :: - * A superset of simplified Chinese GB 2312-1980 (with different - * ordering and minor deviations). - * - * FT_WinFNT_ID_CP949 :: - * A superset of Korean Hangul KS~C 5601-1987 (with different - * ordering and minor deviations). - * - * FT_WinFNT_ID_CP950 :: - * A superset of traditional Chinese Big~5 ETen (with different - * ordering and minor deviations). - * - * FT_WinFNT_ID_CP1250 :: - * A superset of East European ISO 8859-2 (with slightly different - * ordering). - * - * FT_WinFNT_ID_CP1251 :: - * A superset of Russian ISO 8859-5 (with different ordering). - * - * FT_WinFNT_ID_CP1252 :: - * ANSI encoding. A superset of ISO 8859-1. - * - * FT_WinFNT_ID_CP1253 :: - * A superset of Greek ISO 8859-7 (with minor modifications). - * - * FT_WinFNT_ID_CP1254 :: - * A superset of Turkish ISO 8859-9. - * - * FT_WinFNT_ID_CP1255 :: - * A superset of Hebrew ISO 8859-8 (with some modifications). - * - * FT_WinFNT_ID_CP1256 :: - * A superset of Arabic ISO 8859-6 (with different ordering). - * - * FT_WinFNT_ID_CP1257 :: - * A superset of Baltic ISO 8859-13 (with some deviations). - * - * FT_WinFNT_ID_CP1258 :: - * For Vietnamese. This encoding doesn't cover all necessary - * characters. - * - * FT_WinFNT_ID_CP1361 :: - * Korean (Johab). - */ - -#define FT_WinFNT_ID_CP1252 0 -#define FT_WinFNT_ID_DEFAULT 1 -#define FT_WinFNT_ID_SYMBOL 2 -#define FT_WinFNT_ID_MAC 77 -#define FT_WinFNT_ID_CP932 128 -#define FT_WinFNT_ID_CP949 129 -#define FT_WinFNT_ID_CP1361 130 -#define FT_WinFNT_ID_CP936 134 -#define FT_WinFNT_ID_CP950 136 -#define FT_WinFNT_ID_CP1253 161 -#define FT_WinFNT_ID_CP1254 162 -#define FT_WinFNT_ID_CP1258 163 -#define FT_WinFNT_ID_CP1255 177 -#define FT_WinFNT_ID_CP1256 178 -#define FT_WinFNT_ID_CP1257 186 -#define FT_WinFNT_ID_CP1251 204 -#define FT_WinFNT_ID_CP874 222 -#define FT_WinFNT_ID_CP1250 238 -#define FT_WinFNT_ID_OEM 255 - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_WinFNT_HeaderRec */ - /* */ - /* <Description> */ - /* Windows FNT Header info. */ - /* */ - typedef struct FT_WinFNT_HeaderRec_ - { - FT_UShort version; - FT_ULong file_size; - FT_Byte copyright[60]; - FT_UShort file_type; - FT_UShort nominal_point_size; - FT_UShort vertical_resolution; - FT_UShort horizontal_resolution; - FT_UShort ascent; - FT_UShort internal_leading; - FT_UShort external_leading; - FT_Byte italic; - FT_Byte underline; - FT_Byte strike_out; - FT_UShort weight; - FT_Byte charset; - FT_UShort pixel_width; - FT_UShort pixel_height; - FT_Byte pitch_and_family; - FT_UShort avg_width; - FT_UShort max_width; - FT_Byte first_char; - FT_Byte last_char; - FT_Byte default_char; - FT_Byte break_char; - FT_UShort bytes_per_row; - FT_ULong device_offset; - FT_ULong face_name_offset; - FT_ULong bits_pointer; - FT_ULong bits_offset; - FT_Byte reserved; - FT_ULong flags; - FT_UShort A_space; - FT_UShort B_space; - FT_UShort C_space; - FT_UShort color_table_offset; - FT_ULong reserved1[4]; - - } FT_WinFNT_HeaderRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_WinFNT_Header */ - /* */ - /* <Description> */ - /* A handle to an @FT_WinFNT_HeaderRec structure. */ - /* */ - typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header; - - - /********************************************************************** - * - * @function: - * FT_Get_WinFNT_Header - * - * @description: - * Retrieve a Windows FNT font info header. - * - * @input: - * face :: A handle to the input face. - * - * @output: - * aheader :: The WinFNT header. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * This function only works with Windows FNT faces, returning an error - * otherwise. - */ - FT_EXPORT( FT_Error ) - FT_Get_WinFNT_Header( FT_Face face, - FT_WinFNT_HeaderRec *aheader ); - - - /* */ - -FT_END_HEADER - -#endif /* __FTWINFNT_H__ */ - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ftxf86.h b/android/jni/ndk_modules/freetype/include/freetype/ftxf86.h deleted file mode 100644 index 8c68afdc..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ftxf86.h +++ /dev/null @@ -1,83 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftxf86.h */ -/* */ -/* Support functions for X11. */ -/* */ -/* Copyright 2002, 2003, 2004, 2006, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTXF86_H__ -#define __FTXF86_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* font_formats */ - /* */ - /* <Title> */ - /* Font Formats */ - /* */ - /* <Abstract> */ - /* Getting the font format. */ - /* */ - /* <Description> */ - /* The single function in this section can be used to get the font */ - /* format. Note that this information is not needed normally; */ - /* however, there are special cases (like in PDF devices) where it is */ - /* important to differentiate, in spite of FreeType's uniform API. */ - /* */ - /* This function is in the X11/xf86 namespace for historical reasons */ - /* and in no way depends on that windowing system. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_X11_Font_Format */ - /* */ - /* <Description> */ - /* Return a string describing the format of a given face, using values */ - /* which can be used as an X11 FONT_PROPERTY. Possible values are */ - /* `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */ - /* `PFR', and `Windows~FNT'. */ - /* */ - /* <Input> */ - /* face :: */ - /* Input face handle. */ - /* */ - /* <Return> */ - /* Font format string. NULL in case of error. */ - /* */ - FT_EXPORT( const char* ) - FT_Get_X11_Font_Format( FT_Face face ); - - /* */ - -FT_END_HEADER - -#endif /* __FTXF86_H__ */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/autohint.h b/android/jni/ndk_modules/freetype/include/freetype/internal/autohint.h deleted file mode 100644 index 7e3a08a0..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/autohint.h +++ /dev/null @@ -1,231 +0,0 @@ -/***************************************************************************/ -/* */ -/* autohint.h */ -/* */ -/* High-level `autohint' module-specific interface (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* The auto-hinter is used to load and automatically hint glyphs if a */ - /* format-specific hinter isn't available. */ - /* */ - /*************************************************************************/ - - -#ifndef __AUTOHINT_H__ -#define __AUTOHINT_H__ - - - /*************************************************************************/ - /* */ - /* A small technical note regarding automatic hinting in order to */ - /* clarify this module interface. */ - /* */ - /* An automatic hinter might compute two kinds of data for a given face: */ - /* */ - /* - global hints: Usually some metrics that describe global properties */ - /* of the face. It is computed by scanning more or less */ - /* aggressively the glyphs in the face, and thus can be */ - /* very slow to compute (even if the size of global */ - /* hints is really small). */ - /* */ - /* - glyph hints: These describe some important features of the glyph */ - /* outline, as well as how to align them. They are */ - /* generally much faster to compute than global hints. */ - /* */ - /* The current FreeType auto-hinter does a pretty good job while */ - /* performing fast computations for both global and glyph hints. */ - /* However, we might be interested in introducing more complex and */ - /* powerful algorithms in the future, like the one described in the John */ - /* D. Hobby paper, which unfortunately requires a lot more horsepower. */ - /* */ - /* Because a sufficiently sophisticated font management system would */ - /* typically implement an LRU cache of opened face objects to reduce */ - /* memory usage, it is a good idea to be able to avoid recomputing */ - /* global hints every time the same face is re-opened. */ - /* */ - /* We thus provide the ability to cache global hints outside of the face */ - /* object, in order to speed up font re-opening time. Of course, this */ - /* feature is purely optional, so most client programs won't even notice */ - /* it. */ - /* */ - /* I initially thought that it would be a good idea to cache the glyph */ - /* hints too. However, my general idea now is that if you really need */ - /* to cache these too, you are simply in need of a new font format, */ - /* where all this information could be stored within the font file and */ - /* decoded on the fly. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - typedef struct FT_AutoHinterRec_ *FT_AutoHinter; - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_AutoHinter_GlobalGetFunc */ - /* */ - /* <Description> */ - /* Retrieves the global hints computed for a given face object the */ - /* resulting data is dissociated from the face and will survive a */ - /* call to FT_Done_Face(). It must be discarded through the API */ - /* FT_AutoHinter_GlobalDoneFunc(). */ - /* */ - /* <Input> */ - /* hinter :: A handle to the source auto-hinter. */ - /* */ - /* face :: A handle to the source face object. */ - /* */ - /* <Output> */ - /* global_hints :: A typeless pointer to the global hints. */ - /* */ - /* global_len :: The size in bytes of the global hints. */ - /* */ - typedef void - (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter, - FT_Face face, - void** global_hints, - long* global_len ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_AutoHinter_GlobalDoneFunc */ - /* */ - /* <Description> */ - /* Discards the global hints retrieved through */ - /* FT_AutoHinter_GlobalGetFunc(). This is the only way these hints */ - /* are freed from memory. */ - /* */ - /* <Input> */ - /* hinter :: A handle to the auto-hinter module. */ - /* */ - /* global :: A pointer to retrieved global hints to discard. */ - /* */ - typedef void - (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter, - void* global ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_AutoHinter_GlobalResetFunc */ - /* */ - /* <Description> */ - /* This function is used to recompute the global metrics in a given */ - /* font. This is useful when global font data changes (e.g. Multiple */ - /* Masters fonts where blend coordinates change). */ - /* */ - /* <Input> */ - /* hinter :: A handle to the source auto-hinter. */ - /* */ - /* face :: A handle to the face. */ - /* */ - typedef void - (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter, - FT_Face face ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_AutoHinter_GlyphLoadFunc */ - /* */ - /* <Description> */ - /* This function is used to load, scale, and automatically hint a */ - /* glyph from a given face. */ - /* */ - /* <Input> */ - /* face :: A handle to the face. */ - /* */ - /* glyph_index :: The glyph index. */ - /* */ - /* load_flags :: The load flags. */ - /* */ - /* <Note> */ - /* This function is capable of loading composite glyphs by hinting */ - /* each sub-glyph independently (which improves quality). */ - /* */ - /* It will call the font driver with FT_Load_Glyph(), with */ - /* FT_LOAD_NO_SCALE set. */ - /* */ - typedef FT_Error - (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter, - FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_AutoHinter_ServiceRec */ - /* */ - /* <Description> */ - /* The auto-hinter module's interface. */ - /* */ - typedef struct FT_AutoHinter_ServiceRec_ - { - FT_AutoHinter_GlobalResetFunc reset_face; - FT_AutoHinter_GlobalGetFunc get_global_hints; - FT_AutoHinter_GlobalDoneFunc done_global_hints; - FT_AutoHinter_GlyphLoadFunc load_glyph; - - } FT_AutoHinter_ServiceRec, *FT_AutoHinter_Service; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_AUTOHINTER_SERVICE(class_, reset_face_, get_global_hints_, \ - done_global_hints_, load_glyph_) \ - FT_CALLBACK_TABLE_DEF \ - const FT_AutoHinter_ServiceRec class_ = \ - { \ - reset_face_, get_global_hints_, done_global_hints_, load_glyph_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_AUTOHINTER_SERVICE(class_, reset_face_, get_global_hints_, \ - done_global_hints_, load_glyph_) \ - void \ - FT_Init_Class_##class_( FT_Library library, \ - FT_AutoHinter_ServiceRec* clazz) \ - { \ - FT_UNUSED(library); \ - clazz->reset_face = reset_face_; \ - clazz->get_global_hints = get_global_hints_; \ - clazz->done_global_hints = done_global_hints_; \ - clazz->load_glyph = load_glyph_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - -FT_END_HEADER - -#endif /* __AUTOHINT_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftcalc.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftcalc.h deleted file mode 100644 index f8b43247..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/ftcalc.h +++ /dev/null @@ -1,179 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcalc.h */ -/* */ -/* Arithmetic computations (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTCALC_H__ -#define __FTCALC_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_FixedSqrt */ - /* */ - /* <Description> */ - /* Computes the square root of a 16.16 fixed point value. */ - /* */ - /* <Input> */ - /* x :: The value to compute the root for. */ - /* */ - /* <Return> */ - /* The result of `sqrt(x)'. */ - /* */ - /* <Note> */ - /* This function is not very fast. */ - /* */ - FT_BASE( FT_Int32 ) - FT_SqrtFixed( FT_Int32 x ); - - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Sqrt32 */ - /* */ - /* <Description> */ - /* Computes the square root of an Int32 integer (which will be */ - /* handled as an unsigned long value). */ - /* */ - /* <Input> */ - /* x :: The value to compute the root for. */ - /* */ - /* <Return> */ - /* The result of `sqrt(x)'. */ - /* */ - FT_EXPORT( FT_Int32 ) - FT_Sqrt32( FT_Int32 x ); - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - - /*************************************************************************/ - /* */ - /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */ - /* */ - /*************************************************************************/ - - -#ifdef TT_USE_BYTECODE_INTERPRETER - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_MulDiv_No_Round */ - /* */ - /* <Description> */ - /* A very simple function used to perform the computation `(a*b)/c' */ - /* (without rounding) with maximal accuracy (it uses a 64-bit */ - /* intermediate integer whenever necessary). */ - /* */ - /* This function isn't necessarily as fast as some processor specific */ - /* operations, but is at least completely portable. */ - /* */ - /* <Input> */ - /* a :: The first multiplier. */ - /* b :: The second multiplier. */ - /* c :: The divisor. */ - /* */ - /* <Return> */ - /* The result of `(a*b)/c'. This function never traps when trying to */ - /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ - /* on the signs of `a' and `b'. */ - /* */ - FT_BASE( FT_Long ) - FT_MulDiv_No_Round( FT_Long a, - FT_Long b, - FT_Long c ); - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - - /* - * A variant of FT_Matrix_Multiply which scales its result afterwards. - * The idea is that both `a' and `b' are scaled by factors of 10 so that - * the values are as precise as possible to get a correct result during - * the 64bit multiplication. Let `sa' and `sb' be the scaling factors of - * `a' and `b', respectively, then the scaling factor of the result is - * `sa*sb'. - */ - FT_BASE( void ) - FT_Matrix_Multiply_Scaled( const FT_Matrix* a, - FT_Matrix *b, - FT_Long scaling ); - - - /* - * A variant of FT_Vector_Transform. See comments for - * FT_Matrix_Multiply_Scaled. - */ - - FT_BASE( void ) - FT_Vector_Transform_Scaled( FT_Vector* vector, - const FT_Matrix* matrix, - FT_Long scaling ); - - - /* - * Return -1, 0, or +1, depending on the orientation of a given corner. - * We use the Cartesian coordinate system, with positive vertical values - * going upwards. The function returns +1 if the corner turns to the - * left, -1 to the right, and 0 for undecidable cases. - */ - FT_BASE( FT_Int ) - ft_corner_orientation( FT_Pos in_x, - FT_Pos in_y, - FT_Pos out_x, - FT_Pos out_y ); - - /* - * Return TRUE if a corner is flat or nearly flat. This is equivalent to - * saying that the angle difference between the `in' and `out' vectors is - * very small. - */ - FT_BASE( FT_Int ) - ft_corner_is_flat( FT_Pos in_x, - FT_Pos in_y, - FT_Pos out_x, - FT_Pos out_y ); - - -#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 ) -#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 ) -#define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 ) -#define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) << 2 ) -#define FLOAT_TO_FIXED( x ) ( (FT_Long)( x * 65536.0 ) ) -#define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 ) - -#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \ - : ( -( ( 32 - (x) ) & -64 ) ) ) - - -FT_END_HEADER - -#endif /* __FTCALC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftdebug.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftdebug.h deleted file mode 100644 index 7baae353..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/ftdebug.h +++ /dev/null @@ -1,250 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftdebug.h */ -/* */ -/* Debugging and logging component (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2004, 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/* */ -/* IMPORTANT: A description of FreeType's debugging support can be */ -/* found in `docs/DEBUG.TXT'. Read it if you need to use or */ -/* understand this code. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTDEBUG_H__ -#define __FTDEBUG_H__ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */ - /* is already defined; this simplifies the following #ifdefs */ - /* */ -#ifdef FT_DEBUG_LEVEL_TRACE -#undef FT_DEBUG_LEVEL_ERROR -#define FT_DEBUG_LEVEL_ERROR -#endif - - - /*************************************************************************/ - /* */ - /* Define the trace enums as well as the trace levels array when they */ - /* are needed. */ - /* */ - /*************************************************************************/ - -#ifdef FT_DEBUG_LEVEL_TRACE - -#define FT_TRACE_DEF( x ) trace_ ## x , - - /* defining the enumeration */ - typedef enum FT_Trace_ - { -#include FT_INTERNAL_TRACE_H - trace_count - - } FT_Trace; - - - /* defining the array of trace levels, provided by `src/base/ftdebug.c' */ - extern int ft_trace_levels[trace_count]; - -#undef FT_TRACE_DEF - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - - /*************************************************************************/ - /* */ - /* Define the FT_TRACE macro */ - /* */ - /* IMPORTANT! */ - /* */ - /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */ - /* value before using any TRACE macro. */ - /* */ - /*************************************************************************/ - -#ifdef FT_DEBUG_LEVEL_TRACE - -#define FT_TRACE( level, varformat ) \ - do \ - { \ - if ( ft_trace_levels[FT_COMPONENT] >= level ) \ - FT_Message varformat; \ - } while ( 0 ) - -#else /* !FT_DEBUG_LEVEL_TRACE */ - -#define FT_TRACE( level, varformat ) do { } while ( 0 ) /* nothing */ - -#endif /* !FT_DEBUG_LEVEL_TRACE */ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Trace_Get_Count */ - /* */ - /* <Description> */ - /* Return the number of available trace components. */ - /* */ - /* <Return> */ - /* The number of trace components. 0 if FreeType 2 is not built with */ - /* FT_DEBUG_LEVEL_TRACE definition. */ - /* */ - /* <Note> */ - /* This function may be useful if you want to access elements of */ - /* the internal `ft_trace_levels' array by an index. */ - /* */ - FT_BASE( FT_Int ) - FT_Trace_Get_Count( void ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Trace_Get_Name */ - /* */ - /* <Description> */ - /* Return the name of a trace component. */ - /* */ - /* <Input> */ - /* The index of the trace component. */ - /* */ - /* <Return> */ - /* The name of the trace component. This is a statically allocated */ - /* C string, so do not free it after use. NULL if FreeType 2 is not */ - /* built with FT_DEBUG_LEVEL_TRACE definition. */ - /* */ - /* <Note> */ - /* Use @FT_Trace_Get_Count to get the number of available trace */ - /* components. */ - /* */ - /* This function may be useful if you want to control FreeType 2's */ - /* debug level in your application. */ - /* */ - FT_BASE( const char * ) - FT_Trace_Get_Name( FT_Int idx ); - - - /*************************************************************************/ - /* */ - /* You need two opening and closing parentheses! */ - /* */ - /* Example: FT_TRACE0(( "Value is %i", foo )) */ - /* */ - /* Output of the FT_TRACEX macros is sent to stderr. */ - /* */ - /*************************************************************************/ - -#define FT_TRACE0( varformat ) FT_TRACE( 0, varformat ) -#define FT_TRACE1( varformat ) FT_TRACE( 1, varformat ) -#define FT_TRACE2( varformat ) FT_TRACE( 2, varformat ) -#define FT_TRACE3( varformat ) FT_TRACE( 3, varformat ) -#define FT_TRACE4( varformat ) FT_TRACE( 4, varformat ) -#define FT_TRACE5( varformat ) FT_TRACE( 5, varformat ) -#define FT_TRACE6( varformat ) FT_TRACE( 6, varformat ) -#define FT_TRACE7( varformat ) FT_TRACE( 7, varformat ) - - - /*************************************************************************/ - /* */ - /* Define the FT_ERROR macro. */ - /* */ - /* Output of this macro is sent to stderr. */ - /* */ - /*************************************************************************/ - -#ifdef FT_DEBUG_LEVEL_ERROR - -#define FT_ERROR( varformat ) FT_Message varformat - -#else /* !FT_DEBUG_LEVEL_ERROR */ - -#define FT_ERROR( varformat ) do { } while ( 0 ) /* nothing */ - -#endif /* !FT_DEBUG_LEVEL_ERROR */ - - - /*************************************************************************/ - /* */ - /* Define the FT_ASSERT macro. */ - /* */ - /*************************************************************************/ - -#ifdef FT_DEBUG_LEVEL_ERROR - -#define FT_ASSERT( condition ) \ - do \ - { \ - if ( !( condition ) ) \ - FT_Panic( "assertion failed on line %d of file %s\n", \ - __LINE__, __FILE__ ); \ - } while ( 0 ) - -#else /* !FT_DEBUG_LEVEL_ERROR */ - -#define FT_ASSERT( condition ) do { } while ( 0 ) - -#endif /* !FT_DEBUG_LEVEL_ERROR */ - - - /*************************************************************************/ - /* */ - /* Define `FT_Message' and `FT_Panic' when needed. */ - /* */ - /*************************************************************************/ - -#ifdef FT_DEBUG_LEVEL_ERROR - -#include "stdio.h" /* for vfprintf() */ - - /* print a message */ - FT_BASE( void ) - FT_Message( const char* fmt, - ... ); - - /* print a message and exit */ - FT_BASE( void ) - FT_Panic( const char* fmt, - ... ); - -#endif /* FT_DEBUG_LEVEL_ERROR */ - - - FT_BASE( void ) - ft_debug_init( void ); - - -#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ - - /* We disable the warning `conditional expression is constant' here */ - /* in order to compile cleanly with the maximum level of warnings. */ -#pragma warning( disable : 4127 ) - -#endif /* _MSC_VER */ - - -FT_END_HEADER - -#endif /* __FTDEBUG_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftdriver.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftdriver.h deleted file mode 100644 index 1d06997b..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/ftdriver.h +++ /dev/null @@ -1,422 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftdriver.h */ -/* */ -/* FreeType font driver interface (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2006, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTDRIVER_H__ -#define __FTDRIVER_H__ - - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - typedef FT_Error - (*FT_Face_InitFunc)( FT_Stream stream, - FT_Face face, - FT_Int typeface_index, - FT_Int num_params, - FT_Parameter* parameters ); - - typedef void - (*FT_Face_DoneFunc)( FT_Face face ); - - - typedef FT_Error - (*FT_Size_InitFunc)( FT_Size size ); - - typedef void - (*FT_Size_DoneFunc)( FT_Size size ); - - - typedef FT_Error - (*FT_Slot_InitFunc)( FT_GlyphSlot slot ); - - typedef void - (*FT_Slot_DoneFunc)( FT_GlyphSlot slot ); - - - typedef FT_Error - (*FT_Size_RequestFunc)( FT_Size size, - FT_Size_Request req ); - - typedef FT_Error - (*FT_Size_SelectFunc)( FT_Size size, - FT_ULong size_index ); - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - typedef FT_Error - (*FT_Size_ResetPointsFunc)( FT_Size size, - FT_F26Dot6 char_width, - FT_F26Dot6 char_height, - FT_UInt horz_resolution, - FT_UInt vert_resolution ); - - typedef FT_Error - (*FT_Size_ResetPixelsFunc)( FT_Size size, - FT_UInt pixel_width, - FT_UInt pixel_height ); - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - typedef FT_Error - (*FT_Slot_LoadFunc)( FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - - typedef FT_UInt - (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap, - FT_Long charcode ); - - typedef FT_Long - (*FT_CharMap_CharNextFunc)( FT_CharMap charmap, - FT_Long charcode ); - - - typedef FT_Error - (*FT_Face_GetKerningFunc)( FT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph, - FT_Vector* kerning ); - - - typedef FT_Error - (*FT_Face_AttachFunc)( FT_Face face, - FT_Stream stream ); - - - typedef FT_Error - (*FT_Face_GetAdvancesFunc)( FT_Face face, - FT_UInt first, - FT_UInt count, - FT_Int32 flags, - FT_Fixed* advances ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Driver_ClassRec */ - /* */ - /* <Description> */ - /* The font driver class. This structure mostly contains pointers to */ - /* driver methods. */ - /* */ - /* <Fields> */ - /* root :: The parent module. */ - /* */ - /* face_object_size :: The size of a face object in bytes. */ - /* */ - /* size_object_size :: The size of a size object in bytes. */ - /* */ - /* slot_object_size :: The size of a glyph object in bytes. */ - /* */ - /* init_face :: The format-specific face constructor. */ - /* */ - /* done_face :: The format-specific face destructor. */ - /* */ - /* init_size :: The format-specific size constructor. */ - /* */ - /* done_size :: The format-specific size destructor. */ - /* */ - /* init_slot :: The format-specific slot constructor. */ - /* */ - /* done_slot :: The format-specific slot destructor. */ - /* */ - /* */ - /* load_glyph :: A function handle to load a glyph to a slot. */ - /* This field is mandatory! */ - /* */ - /* get_kerning :: A function handle to return the unscaled */ - /* kerning for a given pair of glyphs. Can be */ - /* set to 0 if the format doesn't support */ - /* kerning. */ - /* */ - /* attach_file :: This function handle is used to read */ - /* additional data for a face from another */ - /* file/stream. For example, this can be used to */ - /* add data from AFM or PFM files on a Type 1 */ - /* face, or a CIDMap on a CID-keyed face. */ - /* */ - /* get_advances :: A function handle used to return advance */ - /* widths of `count' glyphs (in font units), */ - /* starting at `first'. The `vertical' flag must */ - /* be set to get vertical advance heights. The */ - /* `advances' buffer is caller-allocated. */ - /* Currently not implemented. The idea of this */ - /* function is to be able to perform */ - /* device-independent text layout without loading */ - /* a single glyph image. */ - /* */ - /* request_size :: A handle to a function used to request the new */ - /* character size. Can be set to 0 if the */ - /* scaling done in the base layer suffices. */ - /* */ - /* select_size :: A handle to a function used to select a new */ - /* fixed size. It is used only if */ - /* @FT_FACE_FLAG_FIXED_SIZES is set. Can be set */ - /* to 0 if the scaling done in the base layer */ - /* suffices. */ - /* <Note> */ - /* Most function pointers, with the exception of `load_glyph', can be */ - /* set to 0 to indicate a default behaviour. */ - /* */ - typedef struct FT_Driver_ClassRec_ - { - FT_Module_Class root; - - FT_Long face_object_size; - FT_Long size_object_size; - FT_Long slot_object_size; - - FT_Face_InitFunc init_face; - FT_Face_DoneFunc done_face; - - FT_Size_InitFunc init_size; - FT_Size_DoneFunc done_size; - - FT_Slot_InitFunc init_slot; - FT_Slot_DoneFunc done_slot; - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - FT_Size_ResetPointsFunc set_char_sizes; - FT_Size_ResetPixelsFunc set_pixel_sizes; - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - FT_Slot_LoadFunc load_glyph; - - FT_Face_GetKerningFunc get_kerning; - FT_Face_AttachFunc attach_file; - FT_Face_GetAdvancesFunc get_advances; - - /* since version 2.2 */ - FT_Size_RequestFunc request_size; - FT_Size_SelectFunc select_size; - - } FT_Driver_ClassRec, *FT_Driver_Class; - - - /* - * The following functions are used as stubs for `set_char_sizes' and - * `set_pixel_sizes'; the code uses `request_size' and `select_size' - * functions instead. - * - * Implementation is in `src/base/ftobjs.c'. - */ -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - FT_BASE( FT_Error ) - ft_stub_set_char_sizes( FT_Size size, - FT_F26Dot6 width, - FT_F26Dot6 height, - FT_UInt horz_res, - FT_UInt vert_res ); - - FT_BASE( FT_Error ) - ft_stub_set_pixel_sizes( FT_Size size, - FT_UInt width, - FT_UInt height ); - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DECLARE_DRIVER */ - /* */ - /* <Description> */ - /* Used to create a forward declaration of a */ - /* FT_Driver_ClassRec stract instance. */ - /* */ - /* <Macro> */ - /* FT_DEFINE_DRIVER */ - /* */ - /* <Description> */ - /* Used to initialize an instance of FT_Driver_ClassRec struct. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ - /* to called with a pointer where the allocated stracture is returned.*/ - /* And when it is no longer needed a Destroy function needs */ - /* to be called to release that allocation. */ - /* fcinit.c (ft_create_default_module_classes) already contains */ - /* a mechanism to call these functions for the default modules */ - /* described in ftmodule.h */ - /* */ - /* Notice that the created Create and Destroy functions call */ - /* pic_init and pic_free function to allow you to manually allocate */ - /* and initialize any additional global data, like module specific */ - /* interface, and put them in the global pic container defined in */ - /* ftpic.h. if you don't need them just implement the functions as */ - /* empty to resolve the link error. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro */ - /* is used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS -#define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) \ - a_, b_, -#else - #define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) -#endif - -#define FT_DECLARE_DRIVER(class_) \ - FT_CALLBACK_TABLE \ - const FT_Driver_ClassRec class_; - -#define FT_DEFINE_DRIVER(class_, \ - flags_, size_, name_, version_, requires_, \ - interface_, init_, done_, get_interface_, \ - face_object_size_, size_object_size_, \ - slot_object_size_, init_face_, done_face_, \ - init_size_, done_size_, init_slot_, done_slot_, \ - old_set_char_sizes_, old_set_pixel_sizes_, \ - load_glyph_, get_kerning_, attach_file_, \ - get_advances_, request_size_, select_size_ ) \ - FT_CALLBACK_TABLE_DEF \ - const FT_Driver_ClassRec class_ = \ - { \ - FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_,interface_, \ - init_,done_,get_interface_) \ - \ - face_object_size_, \ - size_object_size_, \ - slot_object_size_, \ - \ - init_face_, \ - done_face_, \ - \ - init_size_, \ - done_size_, \ - \ - init_slot_, \ - done_slot_, \ - \ - FT_DEFINE_DRIVERS_OLD_INTERNALS(old_set_char_sizes_, old_set_pixel_sizes_) \ - \ - load_glyph_, \ - \ - get_kerning_, \ - attach_file_, \ - get_advances_, \ - \ - request_size_, \ - select_size_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS -#define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) \ - clazz->set_char_sizes = a_; \ - clazz->set_pixel_sizes = b_; -#else - #define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) -#endif - -#define FT_DECLARE_DRIVER(class_) FT_DECLARE_MODULE(class_) - -#define FT_DEFINE_DRIVER(class_, \ - flags_, size_, name_, version_, requires_, \ - interface_, init_, done_, get_interface_, \ - face_object_size_, size_object_size_, \ - slot_object_size_, init_face_, done_face_, \ - init_size_, done_size_, init_slot_, done_slot_, \ - old_set_char_sizes_, old_set_pixel_sizes_, \ - load_glyph_, get_kerning_, attach_file_, \ - get_advances_, request_size_, select_size_ ) \ - void class_##_pic_free( FT_Library library ); \ - FT_Error class_##_pic_init( FT_Library library ); \ - \ - void \ - FT_Destroy_Class_##class_( FT_Library library, \ - FT_Module_Class* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - FT_Driver_Class dclazz = (FT_Driver_Class)clazz; \ - class_##_pic_free( library ); \ - if ( dclazz ) \ - FT_FREE( dclazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_##class_( FT_Library library, \ - FT_Module_Class** output_class ) \ - { \ - FT_Driver_Class clazz; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - if ( FT_ALLOC( clazz, sizeof(*clazz) ) ) \ - return error; \ - \ - error = class_##_pic_init( library ); \ - if(error) \ - { \ - FT_FREE( clazz ); \ - return error; \ - } \ - \ - FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_,interface_, \ - init_,done_,get_interface_) \ - \ - clazz->face_object_size = face_object_size_; \ - clazz->size_object_size = size_object_size_; \ - clazz->slot_object_size = slot_object_size_; \ - \ - clazz->init_face = init_face_; \ - clazz->done_face = done_face_; \ - \ - clazz->init_size = init_size_; \ - clazz->done_size = done_size_; \ - \ - clazz->init_slot = init_slot_; \ - clazz->done_slot = done_slot_; \ - \ - FT_DEFINE_DRIVERS_OLD_INTERNALS(old_set_char_sizes_, old_set_pixel_sizes_) \ - \ - clazz->load_glyph = load_glyph_; \ - \ - clazz->get_kerning = get_kerning_; \ - clazz->attach_file = attach_file_; \ - clazz->get_advances = get_advances_; \ - \ - clazz->request_size = request_size_; \ - clazz->select_size = select_size_; \ - \ - *output_class = (FT_Module_Class*)clazz; \ - return FT_Err_Ok; \ - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - -FT_END_HEADER - -#endif /* __FTDRIVER_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftgloadr.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftgloadr.h deleted file mode 100644 index ce4dc6c9..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/ftgloadr.h +++ /dev/null @@ -1,168 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgloadr.h */ -/* */ -/* The FreeType glyph loader (specification). */ -/* */ -/* Copyright 2002, 2003, 2005, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTGLOADR_H__ -#define __FTGLOADR_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_GlyphLoader */ - /* */ - /* <Description> */ - /* The glyph loader is an internal object used to load several glyphs */ - /* together (for example, in the case of composites). */ - /* */ - /* <Note> */ - /* The glyph loader implementation is not part of the high-level API, */ - /* hence the forward structure declaration. */ - /* */ - typedef struct FT_GlyphLoaderRec_* FT_GlyphLoader ; - - -#if 0 /* moved to freetype.h in version 2.2 */ -#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 -#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 -#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 -#define FT_SUBGLYPH_FLAG_SCALE 8 -#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 -#define FT_SUBGLYPH_FLAG_2X2 0x80 -#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 -#endif - - - typedef struct FT_SubGlyphRec_ - { - FT_Int index; - FT_UShort flags; - FT_Int arg1; - FT_Int arg2; - FT_Matrix transform; - - } FT_SubGlyphRec; - - - typedef struct FT_GlyphLoadRec_ - { - FT_Outline outline; /* outline */ - FT_Vector* extra_points; /* extra points table */ - FT_Vector* extra_points2; /* second extra points table */ - FT_UInt num_subglyphs; /* number of subglyphs */ - FT_SubGlyph subglyphs; /* subglyphs */ - - } FT_GlyphLoadRec, *FT_GlyphLoad; - - - typedef struct FT_GlyphLoaderRec_ - { - FT_Memory memory; - FT_UInt max_points; - FT_UInt max_contours; - FT_UInt max_subglyphs; - FT_Bool use_extra; - - FT_GlyphLoadRec base; - FT_GlyphLoadRec current; - - void* other; /* for possible future extension? */ - - } FT_GlyphLoaderRec; - - - /* create new empty glyph loader */ - FT_BASE( FT_Error ) - FT_GlyphLoader_New( FT_Memory memory, - FT_GlyphLoader *aloader ); - - /* add an extra points table to a glyph loader */ - FT_BASE( FT_Error ) - FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ); - - /* destroy a glyph loader */ - FT_BASE( void ) - FT_GlyphLoader_Done( FT_GlyphLoader loader ); - - /* reset a glyph loader (frees everything int it) */ - FT_BASE( void ) - FT_GlyphLoader_Reset( FT_GlyphLoader loader ); - - /* rewind a glyph loader */ - FT_BASE( void ) - FT_GlyphLoader_Rewind( FT_GlyphLoader loader ); - - /* check that there is enough space to add `n_points' and `n_contours' */ - /* to the glyph loader */ - FT_BASE( FT_Error ) - FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, - FT_UInt n_points, - FT_UInt n_contours ); - - -#define FT_GLYPHLOADER_CHECK_P( _loader, _count ) \ - ( (_count) == 0 || ((_loader)->base.outline.n_points + \ - (_loader)->current.outline.n_points + \ - (unsigned long)(_count)) <= (_loader)->max_points ) - -#define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \ - ( (_count) == 0 || ((_loader)->base.outline.n_contours + \ - (_loader)->current.outline.n_contours + \ - (unsigned long)(_count)) <= (_loader)->max_contours ) - -#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours ) \ - ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points ) && \ - FT_GLYPHLOADER_CHECK_C( _loader, _contours ) ) \ - ? 0 \ - : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) ) - - - /* check that there is enough space to add `n_subs' sub-glyphs to */ - /* a glyph loader */ - FT_BASE( FT_Error ) - FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, - FT_UInt n_subs ); - - /* prepare a glyph loader, i.e. empty the current glyph */ - FT_BASE( void ) - FT_GlyphLoader_Prepare( FT_GlyphLoader loader ); - - /* add the current glyph to the base glyph */ - FT_BASE( void ) - FT_GlyphLoader_Add( FT_GlyphLoader loader ); - - /* copy points from one glyph loader to another */ - FT_BASE( FT_Error ) - FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, - FT_GlyphLoader source ); - - /* */ - - -FT_END_HEADER - -#endif /* __FTGLOADR_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftmemory.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftmemory.h deleted file mode 100644 index 026aa63e..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/ftmemory.h +++ /dev/null @@ -1,380 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmemory.h */ -/* */ -/* The FreeType memory management macros (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTMEMORY_H__ -#define __FTMEMORY_H__ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_TYPES_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_SET_ERROR */ - /* */ - /* <Description> */ - /* This macro is used to set an implicit `error' variable to a given */ - /* expression's value (usually a function call), and convert it to a */ - /* boolean which is set whenever the value is != 0. */ - /* */ -#undef FT_SET_ERROR -#define FT_SET_ERROR( expression ) \ - ( ( error = (expression) ) != 0 ) - - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** M E M O R Y ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* - * C++ refuses to handle statements like p = (void*)anything, with `p' a - * typed pointer. Since we don't have a `typeof' operator in standard - * C++, we have to use a template to emulate it. - */ - -#ifdef __cplusplus - - extern "C++" - template <typename T> inline T* - cplusplus_typeof( T*, - void *v ) - { - return static_cast <T*> ( v ); - } - -#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) ) - -#else - -#define FT_ASSIGNP( p, val ) (p) = (val) - -#endif - - - -#ifdef FT_DEBUG_MEMORY - - FT_BASE( const char* ) _ft_debug_file; - FT_BASE( long ) _ft_debug_lineno; - -#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \ - _ft_debug_lineno = __LINE__, \ - (exp) ) - -#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \ - _ft_debug_lineno = __LINE__, \ - FT_ASSIGNP( p, exp ) ) - -#else /* !FT_DEBUG_MEMORY */ - -#define FT_DEBUG_INNER( exp ) (exp) -#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp ) - -#endif /* !FT_DEBUG_MEMORY */ - - - /* - * The allocation functions return a pointer, and the error code - * is written to through the `p_error' parameter. See below for - * for documentation. - */ - - FT_BASE( FT_Pointer ) - ft_mem_alloc( FT_Memory memory, - FT_Long size, - FT_Error *p_error ); - - FT_BASE( FT_Pointer ) - ft_mem_qalloc( FT_Memory memory, - FT_Long size, - FT_Error *p_error ); - - FT_BASE( FT_Pointer ) - ft_mem_realloc( FT_Memory memory, - FT_Long item_size, - FT_Long cur_count, - FT_Long new_count, - void* block, - FT_Error *p_error ); - - FT_BASE( FT_Pointer ) - ft_mem_qrealloc( FT_Memory memory, - FT_Long item_size, - FT_Long cur_count, - FT_Long new_count, - void* block, - FT_Error *p_error ); - - FT_BASE( void ) - ft_mem_free( FT_Memory memory, - const void* P ); - - -#define FT_MEM_ALLOC( ptr, size ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) ) - -#define FT_MEM_FREE( ptr ) \ - FT_BEGIN_STMNT \ - ft_mem_free( memory, (ptr) ); \ - (ptr) = NULL; \ - FT_END_STMNT - -#define FT_MEM_NEW( ptr ) \ - FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) ) - -#define FT_MEM_REALLOC( ptr, cursz, newsz ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, 1, \ - (cursz), (newsz), \ - (ptr), &error ) ) - -#define FT_MEM_QALLOC( ptr, size ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, (size), &error ) ) - -#define FT_MEM_QNEW( ptr ) \ - FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) ) - -#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, 1, \ - (cursz), (newsz), \ - (ptr), &error ) ) - -#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ - (cursz), (newsz), \ - (ptr), &error ) ) - -#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (item_size), \ - 0, (count), \ - NULL, &error ) ) - -#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (itmsz), \ - (oldcnt), (newcnt), \ - (ptr), &error ) ) - -#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (item_size), \ - 0, (count), \ - NULL, &error ) ) - -#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (itmsz), \ - (oldcnt), (newcnt), \ - (ptr), &error ) ) - - -#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 ) - - -#define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count ) - -#define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count ) - -#define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count ) - - -#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) - -#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) - - -#define FT_ARRAY_ZERO( dest, count ) \ - FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) ) - -#define FT_ARRAY_COPY( dest, source, count ) \ - FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) ) - -#define FT_ARRAY_MOVE( dest, source, count ) \ - FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) ) - - - /* - * Return the maximum number of addressable elements in an array. - * We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid - * any problems. - */ -#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) ) - -#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) ) - - - /*************************************************************************/ - /* */ - /* The following functions macros expect that their pointer argument is */ - /* _typed_ in order to automatically compute array element sizes. */ - /* */ - -#define FT_MEM_NEW_ARRAY( ptr, count ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \ - 0, (count), \ - NULL, &error ) ) - -#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \ - (cursz), (newsz), \ - (ptr), &error ) ) - -#define FT_MEM_QNEW_ARRAY( ptr, count ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ - 0, (count), \ - NULL, &error ) ) - -#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ - FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ - (cursz), (newsz), \ - (ptr), &error ) ) - - -#define FT_ALLOC( ptr, size ) \ - FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) ) - -#define FT_REALLOC( ptr, cursz, newsz ) \ - FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) ) - -#define FT_ALLOC_MULT( ptr, count, item_size ) \ - FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) ) - -#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ - FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \ - newcnt, itmsz ) ) - -#define FT_QALLOC( ptr, size ) \ - FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) ) - -#define FT_QREALLOC( ptr, cursz, newsz ) \ - FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) ) - -#define FT_QALLOC_MULT( ptr, count, item_size ) \ - FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) ) - -#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ - FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \ - newcnt, itmsz ) ) - -#define FT_FREE( ptr ) FT_MEM_FREE( ptr ) - -#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) ) - -#define FT_NEW_ARRAY( ptr, count ) \ - FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) - -#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \ - FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) - -#define FT_QNEW( ptr ) \ - FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) ) - -#define FT_QNEW_ARRAY( ptr, count ) \ - FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) - -#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \ - FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) - - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - FT_BASE( FT_Error ) - FT_Alloc( FT_Memory memory, - FT_Long size, - void* *P ); - - FT_BASE( FT_Error ) - FT_QAlloc( FT_Memory memory, - FT_Long size, - void* *p ); - - FT_BASE( FT_Error ) - FT_Realloc( FT_Memory memory, - FT_Long current, - FT_Long size, - void* *P ); - - FT_BASE( FT_Error ) - FT_QRealloc( FT_Memory memory, - FT_Long current, - FT_Long size, - void* *p ); - - FT_BASE( void ) - FT_Free( FT_Memory memory, - void* *P ); - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - - FT_BASE( FT_Pointer ) - ft_mem_strdup( FT_Memory memory, - const char* str, - FT_Error *p_error ); - - FT_BASE( FT_Pointer ) - ft_mem_dup( FT_Memory memory, - const void* address, - FT_ULong size, - FT_Error *p_error ); - -#define FT_MEM_STRDUP( dst, str ) \ - (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error ) - -#define FT_STRDUP( dst, str ) \ - FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) ) - -#define FT_MEM_DUP( dst, address, size ) \ - (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error ) - -#define FT_DUP( dst, address, size ) \ - FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) ) - - - /* Return >= 1 if a truncation occurs. */ - /* Return 0 if the source string fits the buffer. */ - /* This is *not* the same as strlcpy(). */ - FT_BASE( FT_Int ) - ft_mem_strcpyn( char* dst, - const char* src, - FT_ULong size ); - -#define FT_STRCPYN( dst, src, size ) \ - ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) ) - - /* */ - - -FT_END_HEADER - -#endif /* __FTMEMORY_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftobjs.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftobjs.h deleted file mode 100644 index 670eb78a..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/ftobjs.h +++ /dev/null @@ -1,1428 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftobjs.h */ -/* */ -/* The FreeType private base classes (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file contains the definition of all internal FreeType classes. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTOBJS_H__ -#define __FTOBJS_H__ - -#include <ft2build.h> -#include FT_RENDER_H -#include FT_SIZES_H -#include FT_LCD_FILTER_H -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_GLYPH_LOADER_H -#include FT_INTERNAL_DRIVER_H -#include FT_INTERNAL_AUTOHINT_H -#include FT_INTERNAL_SERVICE_H -#include FT_INTERNAL_PIC_H - -#ifdef FT_CONFIG_OPTION_INCREMENTAL -#include FT_INCREMENTAL_H -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* Some generic definitions. */ - /* */ -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef NULL -#define NULL (void*)0 -#endif - - - /*************************************************************************/ - /* */ - /* The min and max functions missing in C. As usual, be careful not to */ - /* write things like FT_MIN( a++, b++ ) to avoid side effects. */ - /* */ -#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) -#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) - -#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) - - -#define FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) ) -#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + ((n)/2), n ) -#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + ((n)-1), n ) - -#define FT_PIX_FLOOR( x ) ( (x) & ~63 ) -#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 ) -#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) - - - /* - * Return the highest power of 2 that is <= value; this correspond to - * the highest bit in a given 32-bit value. - */ - FT_BASE( FT_UInt32 ) - ft_highpow2( FT_UInt32 value ); - - - /* - * character classification functions -- since these are used to parse - * font files, we must not use those in <ctypes.h> which are - * locale-dependent - */ -#define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U ) - -#define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \ - ( (unsigned)(x) - 'a' ) < 6U || \ - ( (unsigned)(x) - 'A' ) < 6U ) - - /* the next two macros assume ASCII representation */ -#define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U ) -#define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U ) - -#define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) ) -#define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) ) - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** C H A R M A P S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* handle to internal charmap object */ - typedef struct FT_CMapRec_* FT_CMap; - - /* handle to charmap class structure */ - typedef const struct FT_CMap_ClassRec_* FT_CMap_Class; - - /* internal charmap object structure */ - typedef struct FT_CMapRec_ - { - FT_CharMapRec charmap; - FT_CMap_Class clazz; - - } FT_CMapRec; - - /* typecase any pointer to a charmap handle */ -#define FT_CMAP( x ) ((FT_CMap)( x )) - - /* obvious macros */ -#define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id -#define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id -#define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding -#define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face - - - /* class method definitions */ - typedef FT_Error - (*FT_CMap_InitFunc)( FT_CMap cmap, - FT_Pointer init_data ); - - typedef void - (*FT_CMap_DoneFunc)( FT_CMap cmap ); - - typedef FT_UInt - (*FT_CMap_CharIndexFunc)( FT_CMap cmap, - FT_UInt32 char_code ); - - typedef FT_UInt - (*FT_CMap_CharNextFunc)( FT_CMap cmap, - FT_UInt32 *achar_code ); - - typedef FT_UInt - (*FT_CMap_CharVarIndexFunc)( FT_CMap cmap, - FT_CMap unicode_cmap, - FT_UInt32 char_code, - FT_UInt32 variant_selector ); - - typedef FT_Bool - (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap cmap, - FT_UInt32 char_code, - FT_UInt32 variant_selector ); - - typedef FT_UInt32 * - (*FT_CMap_VariantListFunc)( FT_CMap cmap, - FT_Memory mem ); - - typedef FT_UInt32 * - (*FT_CMap_CharVariantListFunc)( FT_CMap cmap, - FT_Memory mem, - FT_UInt32 char_code ); - - typedef FT_UInt32 * - (*FT_CMap_VariantCharListFunc)( FT_CMap cmap, - FT_Memory mem, - FT_UInt32 variant_selector ); - - - typedef struct FT_CMap_ClassRec_ - { - FT_ULong size; - FT_CMap_InitFunc init; - FT_CMap_DoneFunc done; - FT_CMap_CharIndexFunc char_index; - FT_CMap_CharNextFunc char_next; - - /* Subsequent entries are special ones for format 14 -- the variant */ - /* selector subtable which behaves like no other */ - - FT_CMap_CharVarIndexFunc char_var_index; - FT_CMap_CharVarIsDefaultFunc char_var_default; - FT_CMap_VariantListFunc variant_list; - FT_CMap_CharVariantListFunc charvariant_list; - FT_CMap_VariantCharListFunc variantchar_list; - - } FT_CMap_ClassRec; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DECLARE_CMAP_CLASS(class_) \ - FT_CALLBACK_TABLE const FT_CMap_ClassRec class_; - -#define FT_DEFINE_CMAP_CLASS(class_, size_, init_, done_, char_index_, \ - char_next_, char_var_index_, char_var_default_, variant_list_, \ - charvariant_list_, variantchar_list_) \ - FT_CALLBACK_TABLE_DEF \ - const FT_CMap_ClassRec class_ = \ - { \ - size_, init_, done_, char_index_, char_next_, char_var_index_, \ - char_var_default_, variant_list_, charvariant_list_, variantchar_list_ \ - }; -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DECLARE_CMAP_CLASS(class_) \ - void FT_Init_Class_##class_( FT_Library library, FT_CMap_ClassRec* clazz); - -#define FT_DEFINE_CMAP_CLASS(class_, size_, init_, done_, char_index_, \ - char_next_, char_var_index_, char_var_default_, variant_list_, \ - charvariant_list_, variantchar_list_) \ - void \ - FT_Init_Class_##class_( FT_Library library, \ - FT_CMap_ClassRec* clazz) \ - { \ - FT_UNUSED(library); \ - clazz->size = size_; \ - clazz->init = init_; \ - clazz->done = done_; \ - clazz->char_index = char_index_; \ - clazz->char_next = char_next_; \ - clazz->char_var_index = char_var_index_; \ - clazz->char_var_default = char_var_default_; \ - clazz->variant_list = variant_list_; \ - clazz->charvariant_list = charvariant_list_; \ - clazz->variantchar_list = variantchar_list_; \ - } -#endif /* FT_CONFIG_OPTION_PIC */ - - /* create a new charmap and add it to charmap->face */ - FT_BASE( FT_Error ) - FT_CMap_New( FT_CMap_Class clazz, - FT_Pointer init_data, - FT_CharMap charmap, - FT_CMap *acmap ); - - /* destroy a charmap and remove it from face's list */ - FT_BASE( void ) - FT_CMap_Done( FT_CMap cmap ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Face_InternalRec */ - /* */ - /* <Description> */ - /* This structure contains the internal fields of each FT_Face */ - /* object. These fields may change between different releases of */ - /* FreeType. */ - /* */ - /* <Fields> */ - /* max_points :: */ - /* The maximal number of points used to store the vectorial outline */ - /* of any glyph in this face. If this value cannot be known in */ - /* advance, or if the face isn't scalable, this should be set to 0. */ - /* Only relevant for scalable formats. */ - /* */ - /* max_contours :: */ - /* The maximal number of contours used to store the vectorial */ - /* outline of any glyph in this face. If this value cannot be */ - /* known in advance, or if the face isn't scalable, this should be */ - /* set to 0. Only relevant for scalable formats. */ - /* */ - /* transform_matrix :: */ - /* A 2x2 matrix of 16.16 coefficients used to transform glyph */ - /* outlines after they are loaded from the font. Only used by the */ - /* convenience functions. */ - /* */ - /* transform_delta :: */ - /* A translation vector used to transform glyph outlines after they */ - /* are loaded from the font. Only used by the convenience */ - /* functions. */ - /* */ - /* transform_flags :: */ - /* Some flags used to classify the transform. Only used by the */ - /* convenience functions. */ - /* */ - /* services :: */ - /* A cache for frequently used services. It should be only */ - /* accessed with the macro `FT_FACE_LOOKUP_SERVICE'. */ - /* */ - /* incremental_interface :: */ - /* If non-null, the interface through which glyph data and metrics */ - /* are loaded incrementally for faces that do not provide all of */ - /* this data when first opened. This field exists only if */ - /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ - /* */ - /* ignore_unpatented_hinter :: */ - /* This boolean flag instructs the glyph loader to ignore the */ - /* native font hinter, if one is found. This is exclusively used */ - /* in the case when the unpatented hinter is compiled within the */ - /* library. */ - /* */ - /* refcount :: */ - /* A counter initialized to~1 at the time an @FT_Face structure is */ - /* created. @FT_Reference_Face increments this counter, and */ - /* @FT_Done_Face only destroys a face if the counter is~1, */ - /* otherwise it simply decrements it. */ - /* */ - typedef struct FT_Face_InternalRec_ - { -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - FT_UShort reserved1; - FT_Short reserved2; -#endif - FT_Matrix transform_matrix; - FT_Vector transform_delta; - FT_Int transform_flags; - - FT_ServiceCacheRec services; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - FT_Incremental_InterfaceRec* incremental_interface; -#endif - - FT_Bool ignore_unpatented_hinter; - FT_UInt refcount; - - } FT_Face_InternalRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Slot_InternalRec */ - /* */ - /* <Description> */ - /* This structure contains the internal fields of each FT_GlyphSlot */ - /* object. These fields may change between different releases of */ - /* FreeType. */ - /* */ - /* <Fields> */ - /* loader :: The glyph loader object used to load outlines */ - /* into the glyph slot. */ - /* */ - /* flags :: Possible values are zero or */ - /* FT_GLYPH_OWN_BITMAP. The latter indicates */ - /* that the FT_GlyphSlot structure owns the */ - /* bitmap buffer. */ - /* */ - /* glyph_transformed :: Boolean. Set to TRUE when the loaded glyph */ - /* must be transformed through a specific */ - /* font transformation. This is _not_ the same */ - /* as the face transform set through */ - /* FT_Set_Transform(). */ - /* */ - /* glyph_matrix :: The 2x2 matrix corresponding to the glyph */ - /* transformation, if necessary. */ - /* */ - /* glyph_delta :: The 2d translation vector corresponding to */ - /* the glyph transformation, if necessary. */ - /* */ - /* glyph_hints :: Format-specific glyph hints management. */ - /* */ - -#define FT_GLYPH_OWN_BITMAP 0x1 - - typedef struct FT_Slot_InternalRec_ - { - FT_GlyphLoader loader; - FT_UInt flags; - FT_Bool glyph_transformed; - FT_Matrix glyph_matrix; - FT_Vector glyph_delta; - void* glyph_hints; - - } FT_GlyphSlot_InternalRec; - - -#if 0 - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Size_InternalRec */ - /* */ - /* <Description> */ - /* This structure contains the internal fields of each FT_Size */ - /* object. Currently, it's empty. */ - /* */ - /*************************************************************************/ - - typedef struct FT_Size_InternalRec_ - { - /* empty */ - - } FT_Size_InternalRec; - -#endif - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** M O D U L E S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_ModuleRec */ - /* */ - /* <Description> */ - /* A module object instance. */ - /* */ - /* <Fields> */ - /* clazz :: A pointer to the module's class. */ - /* */ - /* library :: A handle to the parent library object. */ - /* */ - /* memory :: A handle to the memory manager. */ - /* */ - /* generic :: A generic structure for user-level extensibility (?). */ - /* */ - typedef struct FT_ModuleRec_ - { - FT_Module_Class* clazz; - FT_Library library; - FT_Memory memory; - FT_Generic generic; - - } FT_ModuleRec; - - - /* typecast an object to a FT_Module */ -#define FT_MODULE( x ) ((FT_Module)( x )) -#define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz -#define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library -#define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory - - -#define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_FONT_DRIVER ) - -#define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_RENDERER ) - -#define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_HINTER ) - -#define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_STYLER ) - -#define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_DRIVER_SCALABLE ) - -#define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_DRIVER_NO_OUTLINES ) - -#define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ - FT_MODULE_DRIVER_HAS_HINTER ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Module_Interface */ - /* */ - /* <Description> */ - /* Finds a module and returns its specific interface as a typeless */ - /* pointer. */ - /* */ - /* <Input> */ - /* library :: A handle to the library object. */ - /* */ - /* module_name :: The module's name (as an ASCII string). */ - /* */ - /* <Return> */ - /* A module-specific interface if available, 0 otherwise. */ - /* */ - /* <Note> */ - /* You should better be familiar with FreeType internals to know */ - /* which module to look for, and what its interface is :-) */ - /* */ - FT_BASE( const void* ) - FT_Get_Module_Interface( FT_Library library, - const char* mod_name ); - - FT_BASE( FT_Pointer ) - ft_module_get_service( FT_Module module, - const char* service_id ); - - /* */ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* a few macros used to perform easy typecasts with minimal brain damage */ - -#define FT_FACE( x ) ((FT_Face)(x)) -#define FT_SIZE( x ) ((FT_Size)(x)) -#define FT_SLOT( x ) ((FT_GlyphSlot)(x)) - -#define FT_FACE_DRIVER( x ) FT_FACE( x )->driver -#define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library -#define FT_FACE_MEMORY( x ) FT_FACE( x )->memory -#define FT_FACE_STREAM( x ) FT_FACE( x )->stream - -#define FT_SIZE_FACE( x ) FT_SIZE( x )->face -#define FT_SLOT_FACE( x ) FT_SLOT( x )->face - -#define FT_FACE_SLOT( x ) FT_FACE( x )->glyph -#define FT_FACE_SIZE( x ) FT_FACE( x )->size - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_GlyphSlot */ - /* */ - /* <Description> */ - /* It is sometimes useful to have more than one glyph slot for a */ - /* given face object. This function is used to create additional */ - /* slots. All of them are automatically discarded when the face is */ - /* destroyed. */ - /* */ - /* <Input> */ - /* face :: A handle to a parent face object. */ - /* */ - /* <Output> */ - /* aslot :: A handle to a new glyph slot object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_BASE( FT_Error ) - FT_New_GlyphSlot( FT_Face face, - FT_GlyphSlot *aslot ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_GlyphSlot */ - /* */ - /* <Description> */ - /* Destroys a given glyph slot. Remember however that all slots are */ - /* automatically destroyed with its parent. Using this function is */ - /* not always mandatory. */ - /* */ - /* <Input> */ - /* slot :: A handle to a target glyph slot. */ - /* */ - FT_BASE( void ) - FT_Done_GlyphSlot( FT_GlyphSlot slot ); - - /* */ - -#define FT_REQUEST_WIDTH( req ) \ - ( (req)->horiResolution \ - ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \ - : (req)->width ) - -#define FT_REQUEST_HEIGHT( req ) \ - ( (req)->vertResolution \ - ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \ - : (req)->height ) - - - /* Set the metrics according to a bitmap strike. */ - FT_BASE( void ) - FT_Select_Metrics( FT_Face face, - FT_ULong strike_index ); - - - /* Set the metrics according to a size request. */ - FT_BASE( void ) - FT_Request_Metrics( FT_Face face, - FT_Size_Request req ); - - - /* Match a size request against `available_sizes'. */ - FT_BASE( FT_Error ) - FT_Match_Size( FT_Face face, - FT_Size_Request req, - FT_Bool ignore_width, - FT_ULong* size_index ); - - - /* Use the horizontal metrics to synthesize the vertical metrics. */ - /* If `advance' is zero, it is also synthesized. */ - FT_BASE( void ) - ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, - FT_Pos advance ); - - - /* Free the bitmap of a given glyphslot when needed (i.e., only when it */ - /* was allocated with ft_glyphslot_alloc_bitmap). */ - FT_BASE( void ) - ft_glyphslot_free_bitmap( FT_GlyphSlot slot ); - - - /* Allocate a new bitmap buffer in a glyph slot. */ - FT_BASE( FT_Error ) - ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, - FT_ULong size ); - - - /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */ - /* will not be freed by a later call to ft_glyphslot_free_bitmap. */ - FT_BASE( void ) - ft_glyphslot_set_bitmap( FT_GlyphSlot slot, - FT_Byte* buffer ); - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** R E N D E R E R S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#define FT_RENDERER( x ) ((FT_Renderer)( x )) -#define FT_GLYPH( x ) ((FT_Glyph)( x )) -#define FT_BITMAP_GLYPH( x ) ((FT_BitmapGlyph)( x )) -#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x )) - - - typedef struct FT_RendererRec_ - { - FT_ModuleRec root; - FT_Renderer_Class* clazz; - FT_Glyph_Format glyph_format; - FT_Glyph_Class glyph_class; - - FT_Raster raster; - FT_Raster_Render_Func raster_render; - FT_Renderer_RenderFunc render; - - } FT_RendererRec; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** F O N T D R I V E R S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* typecast a module into a driver easily */ -#define FT_DRIVER( x ) ((FT_Driver)(x)) - - /* typecast a module as a driver, and get its driver class */ -#define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_DriverRec */ - /* */ - /* <Description> */ - /* The root font driver class. A font driver is responsible for */ - /* managing and loading font files of a given format. */ - /* */ - /* <Fields> */ - /* root :: Contains the fields of the root module class. */ - /* */ - /* clazz :: A pointer to the font driver's class. Note that */ - /* this is NOT root.clazz. `class' wasn't used */ - /* as it is a reserved word in C++. */ - /* */ - /* faces_list :: The list of faces currently opened by this */ - /* driver. */ - /* */ - /* extensions :: A typeless pointer to the driver's extensions */ - /* registry, if they are supported through the */ - /* configuration macro FT_CONFIG_OPTION_EXTENSIONS. */ - /* */ - /* glyph_loader :: The glyph loader for all faces managed by this */ - /* driver. This object isn't defined for unscalable */ - /* formats. */ - /* */ - typedef struct FT_DriverRec_ - { - FT_ModuleRec root; - FT_Driver_Class clazz; - - FT_ListRec faces_list; - void* extensions; - - FT_GlyphLoader glyph_loader; - - } FT_DriverRec; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** L I B R A R I E S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* This hook is used by the TrueType debugger. It must be set to an */ - /* alternate truetype bytecode interpreter function. */ -#define FT_DEBUG_HOOK_TRUETYPE 0 - - - /* Set this debug hook to a non-null pointer to force unpatented hinting */ - /* for all faces when both TT_USE_BYTECODE_INTERPRETER and */ - /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined. This is only used */ - /* during debugging. */ -#define FT_DEBUG_HOOK_UNPATENTED_HINTING 1 - - - typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap, - FT_Render_Mode render_mode, - FT_Library library ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_LibraryRec */ - /* */ - /* <Description> */ - /* The FreeType library class. This is the root of all FreeType */ - /* data. Use FT_New_Library() to create a library object, and */ - /* FT_Done_Library() to discard it and all child objects. */ - /* */ - /* <Fields> */ - /* memory :: The library's memory object. Manages memory */ - /* allocation. */ - /* */ - /* generic :: Client data variable. Used to extend the */ - /* Library class by higher levels and clients. */ - /* */ - /* version_major :: The major version number of the library. */ - /* */ - /* version_minor :: The minor version number of the library. */ - /* */ - /* version_patch :: The current patch level of the library. */ - /* */ - /* num_modules :: The number of modules currently registered */ - /* within this library. This is set to 0 for new */ - /* libraries. New modules are added through the */ - /* FT_Add_Module() API function. */ - /* */ - /* modules :: A table used to store handles to the currently */ - /* registered modules. Note that each font driver */ - /* contains a list of its opened faces. */ - /* */ - /* renderers :: The list of renderers currently registered */ - /* within the library. */ - /* */ - /* cur_renderer :: The current outline renderer. This is a */ - /* shortcut used to avoid parsing the list on */ - /* each call to FT_Outline_Render(). It is a */ - /* handle to the current renderer for the */ - /* FT_GLYPH_FORMAT_OUTLINE format. */ - /* */ - /* auto_hinter :: XXX */ - /* */ - /* raster_pool :: The raster object's render pool. This can */ - /* ideally be changed dynamically at run-time. */ - /* */ - /* raster_pool_size :: The size of the render pool in bytes. */ - /* */ - /* debug_hooks :: XXX */ - /* */ - /* lcd_filter :: If subpixel rendering is activated, the */ - /* selected LCD filter mode. */ - /* */ - /* lcd_extra :: If subpixel rendering is activated, the number */ - /* of extra pixels needed for the LCD filter. */ - /* */ - /* lcd_weights :: If subpixel rendering is activated, the LCD */ - /* filter weights, if any. */ - /* */ - /* lcd_filter_func :: If subpixel rendering is activated, the LCD */ - /* filtering callback function. */ - /* */ - /* pic_container :: Contains global structs and tables, instead */ - /* of defining them globallly. */ - /* */ - /* refcount :: A counter initialized to~1 at the time an */ - /* @FT_Library structure is created. */ - /* @FT_Reference_Library increments this counter, */ - /* and @FT_Done_Library only destroys a library */ - /* if the counter is~1, otherwise it simply */ - /* decrements it. */ - /* */ - typedef struct FT_LibraryRec_ - { - FT_Memory memory; /* library's memory manager */ - - FT_Generic generic; - - FT_Int version_major; - FT_Int version_minor; - FT_Int version_patch; - - FT_UInt num_modules; - FT_Module modules[FT_MAX_MODULES]; /* module objects */ - - FT_ListRec renderers; /* list of renderers */ - FT_Renderer cur_renderer; /* current outline renderer */ - FT_Module auto_hinter; - - FT_Byte* raster_pool; /* scan-line conversion */ - /* render pool */ - FT_ULong raster_pool_size; /* size of render pool in bytes */ - - FT_DebugHook_Func debug_hooks[4]; - -#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - FT_LcdFilter lcd_filter; - FT_Int lcd_extra; /* number of extra pixels */ - FT_Byte lcd_weights[7]; /* filter weights, if any */ - FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ -#endif - -#ifdef FT_CONFIG_OPTION_PIC - FT_PIC_Container pic_container; -#endif - - FT_UInt refcount; - - } FT_LibraryRec; - - - FT_BASE( FT_Renderer ) - FT_Lookup_Renderer( FT_Library library, - FT_Glyph_Format format, - FT_ListNode* node ); - - FT_BASE( FT_Error ) - FT_Render_Glyph_Internal( FT_Library library, - FT_GlyphSlot slot, - FT_Render_Mode render_mode ); - - typedef const char* - (*FT_Face_GetPostscriptNameFunc)( FT_Face face ); - - typedef FT_Error - (*FT_Face_GetGlyphNameFunc)( FT_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ); - - typedef FT_UInt - (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, - FT_String* glyph_name ); - - -#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Memory */ - /* */ - /* <Description> */ - /* Creates a new memory object. */ - /* */ - /* <Return> */ - /* A pointer to the new memory object. 0 in case of error. */ - /* */ - FT_BASE( FT_Memory ) - FT_New_Memory( void ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_Memory */ - /* */ - /* <Description> */ - /* Discards memory manager. */ - /* */ - /* <Input> */ - /* memory :: A handle to the memory manager. */ - /* */ - FT_BASE( void ) - FT_Done_Memory( FT_Memory memory ); - -#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ - - - /* Define default raster's interface. The default raster is located in */ - /* `src/base/ftraster.c'. */ - /* */ - /* Client applications can register new rasters through the */ - /* FT_Set_Raster() API. */ - -#ifndef FT_NO_DEFAULT_RASTER - FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster; -#endif - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** PIC-Support Macros for ftimage.h ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DEFINE_OUTLINE_FUNCS */ - /* */ - /* <Description> */ - /* Used to initialize an instance of FT_Outline_Funcs struct. */ - /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ - /* called with a pre-allocated stracture to be filled. */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro */ - /* is used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_OUTLINE_FUNCS(class_, move_to_, line_to_, conic_to_, \ - cubic_to_, shift_, delta_) \ - static const FT_Outline_Funcs class_ = \ - { \ - move_to_, line_to_, conic_to_, cubic_to_, shift_, delta_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_OUTLINE_FUNCS(class_, move_to_, line_to_, conic_to_, \ - cubic_to_, shift_, delta_) \ - static FT_Error \ - Init_Class_##class_( FT_Outline_Funcs* clazz ) \ - { \ - clazz->move_to = move_to_; \ - clazz->line_to = line_to_; \ - clazz->conic_to = conic_to_; \ - clazz->cubic_to = cubic_to_; \ - clazz->shift = shift_; \ - clazz->delta = delta_; \ - return FT_Err_Ok; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DEFINE_RASTER_FUNCS */ - /* */ - /* <Description> */ - /* Used to initialize an instance of FT_Raster_Funcs struct. */ - /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ - /* called with a pre-allocated stracture to be filled. */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro */ - /* is used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_RASTER_FUNCS(class_, glyph_format_, raster_new_, \ - raster_reset_, raster_set_mode_, \ - raster_render_, raster_done_) \ - const FT_Raster_Funcs class_ = \ - { \ - glyph_format_, raster_new_, raster_reset_, \ - raster_set_mode_, raster_render_, raster_done_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_RASTER_FUNCS(class_, glyph_format_, raster_new_, \ - raster_reset_, raster_set_mode_, raster_render_, raster_done_) \ - void \ - FT_Init_Class_##class_( FT_Raster_Funcs* clazz ) \ - { \ - clazz->glyph_format = glyph_format_; \ - clazz->raster_new = raster_new_; \ - clazz->raster_reset = raster_reset_; \ - clazz->raster_set_mode = raster_set_mode_; \ - clazz->raster_render = raster_render_; \ - clazz->raster_done = raster_done_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** PIC-Support Macros for ftrender.h ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DEFINE_GLYPH */ - /* */ - /* <Description> */ - /* Used to initialize an instance of FT_Glyph_Class struct. */ - /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ - /* called with a pre-allocated stracture to be filled. */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro */ - /* is used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_GLYPH(class_, size_, format_, init_, done_, copy_, \ - transform_, bbox_, prepare_) \ - FT_CALLBACK_TABLE_DEF \ - const FT_Glyph_Class class_ = \ - { \ - size_, format_, init_, done_, copy_, transform_, bbox_, prepare_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_GLYPH(class_, size_, format_, init_, done_, copy_, \ - transform_, bbox_, prepare_) \ - void \ - FT_Init_Class_##class_( FT_Glyph_Class* clazz ) \ - { \ - clazz->glyph_size = size_; \ - clazz->glyph_format = format_; \ - clazz->glyph_init = init_; \ - clazz->glyph_done = done_; \ - clazz->glyph_copy = copy_; \ - clazz->glyph_transform = transform_; \ - clazz->glyph_bbox = bbox_; \ - clazz->glyph_prepare = prepare_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DECLARE_RENDERER */ - /* */ - /* <Description> */ - /* Used to create a forward declaration of a */ - /* FT_Renderer_Class stract instance. */ - /* */ - /* <Macro> */ - /* FT_DEFINE_RENDERER */ - /* */ - /* <Description> */ - /* Used to initialize an instance of FT_Renderer_Class struct. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ - /* to called with a pointer where the allocated stracture is returned.*/ - /* And when it is no longer needed a Destroy function needs */ - /* to be called to release that allocation. */ - /* fcinit.c (ft_create_default_module_classes) already contains */ - /* a mechanism to call these functions for the default modules */ - /* described in ftmodule.h */ - /* */ - /* Notice that the created Create and Destroy functions call */ - /* pic_init and pic_free function to allow you to manually allocate */ - /* and initialize any additional global data, like module specific */ - /* interface, and put them in the global pic container defined in */ - /* ftpic.h. if you don't need them just implement the functions as */ - /* empty to resolve the link error. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro */ - /* is used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DECLARE_RENDERER(class_) \ - FT_EXPORT_VAR( const FT_Renderer_Class ) class_; - -#define FT_DEFINE_RENDERER(class_, \ - flags_, size_, name_, version_, requires_, \ - interface_, init_, done_, get_interface_, \ - glyph_format_, render_glyph_, transform_glyph_, \ - get_glyph_cbox_, set_mode_, raster_class_ ) \ - FT_CALLBACK_TABLE_DEF \ - const FT_Renderer_Class class_ = \ - { \ - FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_, \ - interface_,init_,done_,get_interface_) \ - glyph_format_, \ - \ - render_glyph_, \ - transform_glyph_, \ - get_glyph_cbox_, \ - set_mode_, \ - \ - raster_class_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DECLARE_RENDERER(class_) FT_DECLARE_MODULE(class_) - -#define FT_DEFINE_RENDERER(class_, \ - flags_, size_, name_, version_, requires_, \ - interface_, init_, done_, get_interface_, \ - glyph_format_, render_glyph_, transform_glyph_, \ - get_glyph_cbox_, set_mode_, raster_class_ ) \ - void class_##_pic_free( FT_Library library ); \ - FT_Error class_##_pic_init( FT_Library library ); \ - \ - void \ - FT_Destroy_Class_##class_( FT_Library library, \ - FT_Module_Class* clazz ) \ - { \ - FT_Renderer_Class* rclazz = (FT_Renderer_Class*)clazz; \ - FT_Memory memory = library->memory; \ - class_##_pic_free( library ); \ - if ( rclazz ) \ - FT_FREE( rclazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_##class_( FT_Library library, \ - FT_Module_Class** output_class ) \ - { \ - FT_Renderer_Class* clazz; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - if ( FT_ALLOC( clazz, sizeof(*clazz) ) ) \ - return error; \ - \ - error = class_##_pic_init( library ); \ - if(error) \ - { \ - FT_FREE( clazz ); \ - return error; \ - } \ - \ - FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_, \ - interface_,init_,done_,get_interface_) \ - \ - clazz->glyph_format = glyph_format_; \ - \ - clazz->render_glyph = render_glyph_; \ - clazz->transform_glyph = transform_glyph_; \ - clazz->get_glyph_cbox = get_glyph_cbox_; \ - clazz->set_mode = set_mode_; \ - \ - clazz->raster_class = raster_class_; \ - \ - *output_class = (FT_Module_Class*)clazz; \ - return FT_Err_Ok; \ - } - - - -#endif /* FT_CONFIG_OPTION_PIC */ - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** PIC-Support Macros for ftmodapi.h ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#ifdef FT_CONFIG_OPTION_PIC - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Module_Creator */ - /* */ - /* <Description> */ - /* A function used to create (allocate) a new module class object. */ - /* The object's members are initialized, but the module itself is */ - /* not. */ - /* */ - /* <Input> */ - /* memory :: A handle to the memory manager. */ - /* output_class :: Initialized with the newly allocated class. */ - /* */ - typedef FT_Error - (*FT_Module_Creator)( FT_Memory memory, - FT_Module_Class** output_class ); - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* FT_Module_Destroyer */ - /* */ - /* <Description> */ - /* A function used to destroy (deallocate) a module class object. */ - /* */ - /* <Input> */ - /* memory :: A handle to the memory manager. */ - /* clazz :: Module class to destroy. */ - /* */ - typedef void - (*FT_Module_Destroyer)( FT_Memory memory, - FT_Module_Class* clazz ); - -#endif - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DECLARE_MODULE */ - /* */ - /* <Description> */ - /* Used to create a forward declaration of a */ - /* FT_Module_Class stract instance. */ - /* */ - /* <Macro> */ - /* FT_DEFINE_MODULE */ - /* */ - /* <Description> */ - /* Used to initialize an instance of FT_Module_Class struct. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ - /* to called with a pointer where the allocated stracture is returned.*/ - /* And when it is no longer needed a Destroy function needs */ - /* to be called to release that allocation. */ - /* fcinit.c (ft_create_default_module_classes) already contains */ - /* a mechanism to call these functions for the default modules */ - /* described in ftmodule.h */ - /* */ - /* Notice that the created Create and Destroy functions call */ - /* pic_init and pic_free function to allow you to manually allocate */ - /* and initialize any additional global data, like module specific */ - /* interface, and put them in the global pic container defined in */ - /* ftpic.h. if you don't need them just implement the functions as */ - /* empty to resolve the link error. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ - /* allocated in the global scope (or the scope where the macro */ - /* is used). */ - /* */ - /* <Macro> */ - /* FT_DEFINE_ROOT_MODULE */ - /* */ - /* <Description> */ - /* Used to initialize an instance of FT_Module_Class struct inside */ - /* another stract that contains it or in a function that initializes */ - /* that containing stract */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DECLARE_MODULE(class_) \ - FT_CALLBACK_TABLE \ - const FT_Module_Class class_; \ - -#define FT_DEFINE_ROOT_MODULE(flags_, size_, name_, version_, requires_, \ - interface_, init_, done_, get_interface_) \ - { \ - flags_, \ - size_, \ - \ - name_, \ - version_, \ - requires_, \ - \ - interface_, \ - \ - init_, \ - done_, \ - get_interface_, \ - }, - -#define FT_DEFINE_MODULE(class_, flags_, size_, name_, version_, requires_, \ - interface_, init_, done_, get_interface_) \ - FT_CALLBACK_TABLE_DEF \ - const FT_Module_Class class_ = \ - { \ - flags_, \ - size_, \ - \ - name_, \ - version_, \ - requires_, \ - \ - interface_, \ - \ - init_, \ - done_, \ - get_interface_, \ - }; - - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DECLARE_MODULE(class_) \ - FT_Error FT_Create_Class_##class_( FT_Library library, \ - FT_Module_Class** output_class ); \ - void FT_Destroy_Class_##class_( FT_Library library, \ - FT_Module_Class* clazz ); - -#define FT_DEFINE_ROOT_MODULE(flags_, size_, name_, version_, requires_, \ - interface_, init_, done_, get_interface_) \ - clazz->root.module_flags = flags_; \ - clazz->root.module_size = size_; \ - clazz->root.module_name = name_; \ - clazz->root.module_version = version_; \ - clazz->root.module_requires = requires_; \ - \ - clazz->root.module_interface = interface_; \ - \ - clazz->root.module_init = init_; \ - clazz->root.module_done = done_; \ - clazz->root.get_interface = get_interface_; - -#define FT_DEFINE_MODULE(class_, flags_, size_, name_, version_, requires_, \ - interface_, init_, done_, get_interface_) \ - void class_##_pic_free( FT_Library library ); \ - FT_Error class_##_pic_init( FT_Library library ); \ - \ - void \ - FT_Destroy_Class_##class_( FT_Library library, \ - FT_Module_Class* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - class_##_pic_free( library ); \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_##class_( FT_Library library, \ - FT_Module_Class** output_class ) \ - { \ - FT_Memory memory = library->memory; \ - FT_Module_Class* clazz; \ - FT_Error error; \ - \ - if ( FT_ALLOC( clazz, sizeof(*clazz) ) ) \ - return error; \ - error = class_##_pic_init( library ); \ - if(error) \ - { \ - FT_FREE( clazz ); \ - return error; \ - } \ - \ - clazz->module_flags = flags_; \ - clazz->module_size = size_; \ - clazz->module_name = name_; \ - clazz->module_version = version_; \ - clazz->module_requires = requires_; \ - \ - clazz->module_interface = interface_; \ - \ - clazz->module_init = init_; \ - clazz->module_done = done_; \ - clazz->get_interface = get_interface_; \ - \ - *output_class = clazz; \ - return FT_Err_Ok; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -FT_END_HEADER - -#endif /* __FTOBJS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftpic.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftpic.h deleted file mode 100644 index 1b31957d..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/ftpic.h +++ /dev/null @@ -1,67 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftpic.h */ -/* */ -/* The FreeType position independent code services (declaration). */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* Modules that ordinarily have const global data that need address */ - /* can instead define pointers here. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTPIC_H__ -#define __FTPIC_H__ - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC - - typedef struct FT_PIC_Container_ - { - /* pic containers for base */ - void* base; - /* pic containers for modules */ - void* autofit; - void* cff; - void* pshinter; - void* psnames; - void* raster; - void* sfnt; - void* smooth; - void* truetype; - } FT_PIC_Container; - - /* Initialize the various function tables, structs, etc. stored in the container. */ - FT_BASE( FT_Error ) - ft_pic_container_init( FT_Library library ); - - - /* Destroy the contents of the container. */ - FT_BASE( void ) - ft_pic_container_destroy( FT_Library library ); - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* __FTPIC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftrfork.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftrfork.h deleted file mode 100644 index aa573c87..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/ftrfork.h +++ /dev/null @@ -1,196 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftrfork.h */ -/* */ -/* Embedded resource forks accessor (specification). */ -/* */ -/* Copyright 2004, 2006, 2007 by */ -/* Masatake YAMATO and Redhat K.K. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* Development of the code in this file is support of */ -/* Information-technology Promotion Agency, Japan. */ -/***************************************************************************/ - - -#ifndef __FTRFORK_H__ -#define __FTRFORK_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - - /* Number of guessing rules supported in `FT_Raccess_Guess'. */ - /* Don't forget to increment the number if you add a new guessing rule. */ -#define FT_RACCESS_N_RULES 9 - - - /* A structure to describe a reference in a resource by its resource ID */ - /* and internal offset. The `POST' resource expects to be concatenated */ - /* by the order of resource IDs instead of its appearance in the file. */ - - typedef struct FT_RFork_Ref_ - { - FT_UShort res_id; - FT_ULong offset; - - } FT_RFork_Ref; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Raccess_Guess */ - /* */ - /* <Description> */ - /* Guess a file name and offset where the actual resource fork is */ - /* stored. The macro FT_RACCESS_N_RULES holds the number of */ - /* guessing rules; the guessed result for the Nth rule is */ - /* represented as a triplet: a new file name (new_names[N]), a file */ - /* offset (offsets[N]), and an error code (errors[N]). */ - /* */ - /* <Input> */ - /* library :: */ - /* A FreeType library instance. */ - /* */ - /* stream :: */ - /* A file stream containing the resource fork. */ - /* */ - /* base_name :: */ - /* The (base) file name of the resource fork used for some */ - /* guessing rules. */ - /* */ - /* <Output> */ - /* new_names :: */ - /* An array of guessed file names in which the resource forks may */ - /* exist. If `new_names[N]' is NULL, the guessed file name is */ - /* equal to `base_name'. */ - /* */ - /* offsets :: */ - /* An array of guessed file offsets. `offsets[N]' holds the file */ - /* offset of the possible start of the resource fork in file */ - /* `new_names[N]'. */ - /* */ - /* errors :: */ - /* An array of FreeType error codes. `errors[N]' is the error */ - /* code of Nth guessing rule function. If `errors[N]' is not */ - /* FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless. */ - /* */ - FT_BASE( void ) - FT_Raccess_Guess( FT_Library library, - FT_Stream stream, - char* base_name, - char** new_names, - FT_Long* offsets, - FT_Error* errors ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Raccess_Get_HeaderInfo */ - /* */ - /* <Description> */ - /* Get the information from the header of resource fork. The */ - /* information includes the file offset where the resource map */ - /* starts, and the file offset where the resource data starts. */ - /* `FT_Raccess_Get_DataOffsets' requires these two data. */ - /* */ - /* <Input> */ - /* library :: */ - /* A FreeType library instance. */ - /* */ - /* stream :: */ - /* A file stream containing the resource fork. */ - /* */ - /* rfork_offset :: */ - /* The file offset where the resource fork starts. */ - /* */ - /* <Output> */ - /* map_offset :: */ - /* The file offset where the resource map starts. */ - /* */ - /* rdata_pos :: */ - /* The file offset where the resource data starts. */ - /* */ - /* <Return> */ - /* FreeType error code. FT_Err_Ok means success. */ - /* */ - FT_BASE( FT_Error ) - FT_Raccess_Get_HeaderInfo( FT_Library library, - FT_Stream stream, - FT_Long rfork_offset, - FT_Long *map_offset, - FT_Long *rdata_pos ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Raccess_Get_DataOffsets */ - /* */ - /* <Description> */ - /* Get the data offsets for a tag in a resource fork. Offsets are */ - /* stored in an array because, in some cases, resources in a resource */ - /* fork have the same tag. */ - /* */ - /* <Input> */ - /* library :: */ - /* A FreeType library instance. */ - /* */ - /* stream :: */ - /* A file stream containing the resource fork. */ - /* */ - /* map_offset :: */ - /* The file offset where the resource map starts. */ - /* */ - /* rdata_pos :: */ - /* The file offset where the resource data starts. */ - /* */ - /* tag :: */ - /* The resource tag. */ - /* */ - /* <Output> */ - /* offsets :: */ - /* The stream offsets for the resource data specified by `tag'. */ - /* This array is allocated by the function, so you have to call */ - /* @ft_mem_free after use. */ - /* */ - /* count :: */ - /* The length of offsets array. */ - /* */ - /* <Return> */ - /* FreeType error code. FT_Err_Ok means success. */ - /* */ - /* <Note> */ - /* Normally you should use `FT_Raccess_Get_HeaderInfo' to get the */ - /* value for `map_offset' and `rdata_pos'. */ - /* */ - FT_BASE( FT_Error ) - FT_Raccess_Get_DataOffsets( FT_Library library, - FT_Stream stream, - FT_Long map_offset, - FT_Long rdata_pos, - FT_Long tag, - FT_Long **offsets, - FT_Long *count ); - - -FT_END_HEADER - -#endif /* __FTRFORK_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftserv.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftserv.h deleted file mode 100644 index 569b9f7e..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/ftserv.h +++ /dev/null @@ -1,620 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftserv.h */ -/* */ -/* The FreeType services (specification only). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* Each module can export one or more `services'. Each service is */ - /* identified by a constant string and modeled by a pointer; the latter */ - /* generally corresponds to a structure containing function pointers. */ - /* */ - /* Note that a service's data cannot be a mere function pointer because */ - /* in C it is possible that function pointers might be implemented */ - /* differently than data pointers (e.g. 48 bits instead of 32). */ - /* */ - /*************************************************************************/ - - -#ifndef __FTSERV_H__ -#define __FTSERV_H__ - - -FT_BEGIN_HEADER - -#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ - - /* we disable the warning `conditional expression is constant' here */ - /* in order to compile cleanly with the maximum level of warnings */ -#pragma warning( disable : 4127 ) - -#endif /* _MSC_VER */ - - /* - * @macro: - * FT_FACE_FIND_SERVICE - * - * @description: - * This macro is used to look up a service from a face's driver module. - * - * @input: - * face :: - * The source face handle. - * - * id :: - * A string describing the service as defined in the service's - * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to - * `multi-masters'). It is automatically prefixed with - * `FT_SERVICE_ID_'. - * - * @output: - * ptr :: - * A variable that receives the service pointer. Will be NULL - * if not found. - */ -#ifdef __cplusplus - -#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ - FT_Pointer _tmp_ = NULL; \ - FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ - \ - \ - if ( module->clazz->get_interface ) \ - _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ - *_pptr_ = _tmp_; \ - FT_END_STMNT - -#else /* !C++ */ - -#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ - FT_Pointer _tmp_ = NULL; \ - \ - if ( module->clazz->get_interface ) \ - _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ - ptr = _tmp_; \ - FT_END_STMNT - -#endif /* !C++ */ - - /* - * @macro: - * FT_FACE_FIND_GLOBAL_SERVICE - * - * @description: - * This macro is used to look up a service from all modules. - * - * @input: - * face :: - * The source face handle. - * - * id :: - * A string describing the service as defined in the service's - * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to - * `multi-masters'). It is automatically prefixed with - * `FT_SERVICE_ID_'. - * - * @output: - * ptr :: - * A variable that receives the service pointer. Will be NULL - * if not found. - */ -#ifdef __cplusplus - -#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ - FT_Pointer _tmp_; \ - FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ - \ - \ - _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ - *_pptr_ = _tmp_; \ - FT_END_STMNT - -#else /* !C++ */ - -#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ - FT_Pointer _tmp_; \ - \ - \ - _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ - ptr = _tmp_; \ - FT_END_STMNT - -#endif /* !C++ */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S E R V I C E D E S C R I P T O R S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * The following structure is used to _describe_ a given service - * to the library. This is useful to build simple static service lists. - */ - typedef struct FT_ServiceDescRec_ - { - const char* serv_id; /* service name */ - const void* serv_data; /* service pointer/data */ - - } FT_ServiceDescRec; - - typedef const FT_ServiceDescRec* FT_ServiceDesc; - - /*************************************************************************/ - /* */ - /* <Macro> */ - /* FT_DEFINE_SERVICEDESCREC1 .. FT_DEFINE_SERVICEDESCREC6 */ - /* */ - /* <Description> */ - /* Used to initialize an array of FT_ServiceDescRec structs. */ - /* */ - /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ - /* to called with a pointer where the allocated array is returned. */ - /* And when it is no longer needed a Destroy function needs */ - /* to be called to release that allocation. */ - /* */ - /* These functions should be manyally called from the pic_init and */ - /* pic_free functions of your module (see FT_DEFINE_MODULE) */ - /* */ - /* When FT_CONFIG_OPTION_PIC is not defined the array will be */ - /* allocated in the global scope (or the scope where the macro */ - /* is used). */ - /* */ -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \ - static const FT_ServiceDescRec class_[] = \ - { \ - {serv_id_1, serv_data_1}, \ - {NULL, NULL} \ - }; -#define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2) \ - static const FT_ServiceDescRec class_[] = \ - { \ - {serv_id_1, serv_data_1}, \ - {serv_id_2, serv_data_2}, \ - {NULL, NULL} \ - }; -#define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, serv_id_3, serv_data_3) \ - static const FT_ServiceDescRec class_[] = \ - { \ - {serv_id_1, serv_data_1}, \ - {serv_id_2, serv_data_2}, \ - {serv_id_3, serv_data_3}, \ - {NULL, NULL} \ - }; -#define FT_DEFINE_SERVICEDESCREC4(class_, serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4) \ - static const FT_ServiceDescRec class_[] = \ - { \ - {serv_id_1, serv_data_1}, \ - {serv_id_2, serv_data_2}, \ - {serv_id_3, serv_data_3}, \ - {serv_id_4, serv_data_4}, \ - {NULL, NULL} \ - }; -#define FT_DEFINE_SERVICEDESCREC5(class_, serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4, serv_id_5, serv_data_5) \ - static const FT_ServiceDescRec class_[] = \ - { \ - {serv_id_1, serv_data_1}, \ - {serv_id_2, serv_data_2}, \ - {serv_id_3, serv_data_3}, \ - {serv_id_4, serv_data_4}, \ - {serv_id_5, serv_data_5}, \ - {NULL, NULL} \ - }; -#define FT_DEFINE_SERVICEDESCREC6(class_, serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4, serv_id_5, serv_data_5, \ - serv_id_6, serv_data_6) \ - static const FT_ServiceDescRec class_[] = \ - { \ - {serv_id_1, serv_data_1}, \ - {serv_id_2, serv_data_2}, \ - {serv_id_3, serv_data_3}, \ - {serv_id_4, serv_data_4}, \ - {serv_id_5, serv_data_5}, \ - {serv_id_6, serv_data_6}, \ - {NULL, NULL} \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \ - void \ - FT_Destroy_Class_##class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_##class_( FT_Library library, \ - FT_ServiceDescRec** output_class) \ - { \ - FT_ServiceDescRec* clazz; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - if ( FT_ALLOC( clazz, sizeof(*clazz)*2 ) ) \ - return error; \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = NULL; \ - clazz[1].serv_data = NULL; \ - *output_class = clazz; \ - return FT_Err_Ok; \ - } - -#define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2) \ - void \ - FT_Destroy_Class_##class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_##class_( FT_Library library, \ - FT_ServiceDescRec** output_class) \ - { \ - FT_ServiceDescRec* clazz; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - if ( FT_ALLOC( clazz, sizeof(*clazz)*3 ) ) \ - return error; \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = serv_id_2; \ - clazz[1].serv_data = serv_data_2; \ - clazz[2].serv_id = NULL; \ - clazz[2].serv_data = NULL; \ - *output_class = clazz; \ - return FT_Err_Ok; \ - } - -#define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, serv_id_3, serv_data_3) \ - void \ - FT_Destroy_Class_##class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_##class_( FT_Library library, \ - FT_ServiceDescRec** output_class) \ - { \ - FT_ServiceDescRec* clazz; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - if ( FT_ALLOC( clazz, sizeof(*clazz)*4 ) ) \ - return error; \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = serv_id_2; \ - clazz[1].serv_data = serv_data_2; \ - clazz[2].serv_id = serv_id_3; \ - clazz[2].serv_data = serv_data_3; \ - clazz[3].serv_id = NULL; \ - clazz[3].serv_data = NULL; \ - *output_class = clazz; \ - return FT_Err_Ok; \ - } - -#define FT_DEFINE_SERVICEDESCREC4(class_, serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4) \ - void \ - FT_Destroy_Class_##class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_##class_( FT_Library library, \ - FT_ServiceDescRec** output_class) \ - { \ - FT_ServiceDescRec* clazz; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - if ( FT_ALLOC( clazz, sizeof(*clazz)*5 ) ) \ - return error; \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = serv_id_2; \ - clazz[1].serv_data = serv_data_2; \ - clazz[2].serv_id = serv_id_3; \ - clazz[2].serv_data = serv_data_3; \ - clazz[3].serv_id = serv_id_4; \ - clazz[3].serv_data = serv_data_4; \ - clazz[4].serv_id = NULL; \ - clazz[4].serv_data = NULL; \ - *output_class = clazz; \ - return FT_Err_Ok; \ - } - -#define FT_DEFINE_SERVICEDESCREC5(class_, serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, serv_id_3, serv_data_3, serv_id_4, \ - serv_data_4, serv_id_5, serv_data_5) \ - void \ - FT_Destroy_Class_##class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_##class_( FT_Library library, \ - FT_ServiceDescRec** output_class) \ - { \ - FT_ServiceDescRec* clazz; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - if ( FT_ALLOC( clazz, sizeof(*clazz)*6 ) ) \ - return error; \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = serv_id_2; \ - clazz[1].serv_data = serv_data_2; \ - clazz[2].serv_id = serv_id_3; \ - clazz[2].serv_data = serv_data_3; \ - clazz[3].serv_id = serv_id_4; \ - clazz[3].serv_data = serv_data_4; \ - clazz[4].serv_id = serv_id_5; \ - clazz[4].serv_data = serv_data_5; \ - clazz[5].serv_id = NULL; \ - clazz[5].serv_data = NULL; \ - *output_class = clazz; \ - return FT_Err_Ok; \ - } - -#define FT_DEFINE_SERVICEDESCREC6(class_, serv_id_1, serv_data_1, \ - serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ - serv_id_4, serv_data_4, serv_id_5, serv_data_5, \ - serv_id_6, serv_data_6) \ - void \ - FT_Destroy_Class_##class_( FT_Library library, \ - FT_ServiceDescRec* clazz ) \ - { \ - FT_Memory memory = library->memory; \ - if ( clazz ) \ - FT_FREE( clazz ); \ - } \ - \ - FT_Error \ - FT_Create_Class_##class_( FT_Library library, \ - FT_ServiceDescRec** output_class) \ - { \ - FT_ServiceDescRec* clazz; \ - FT_Error error; \ - FT_Memory memory = library->memory; \ - \ - if ( FT_ALLOC( clazz, sizeof(*clazz)*7 ) ) \ - return error; \ - clazz[0].serv_id = serv_id_1; \ - clazz[0].serv_data = serv_data_1; \ - clazz[1].serv_id = serv_id_2; \ - clazz[1].serv_data = serv_data_2; \ - clazz[2].serv_id = serv_id_3; \ - clazz[2].serv_data = serv_data_3; \ - clazz[3].serv_id = serv_id_4; \ - clazz[3].serv_data = serv_data_4; \ - clazz[4].serv_id = serv_id_5; \ - clazz[4].serv_data = serv_data_5; \ - clazz[5].serv_id = serv_id_6; \ - clazz[5].serv_data = serv_data_6; \ - clazz[6].serv_id = NULL; \ - clazz[6].serv_data = NULL; \ - *output_class = clazz; \ - return FT_Err_Ok; \ - } -#endif /* FT_CONFIG_OPTION_PIC */ - - /* - * Parse a list of FT_ServiceDescRec descriptors and look for - * a specific service by ID. Note that the last element in the - * array must be { NULL, NULL }, and that the function should - * return NULL if the service isn't available. - * - * This function can be used by modules to implement their - * `get_service' method. - */ - FT_BASE( FT_Pointer ) - ft_service_list_lookup( FT_ServiceDesc service_descriptors, - const char* service_id ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S E R V I C E S C A C H E *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * This structure is used to store a cache for several frequently used - * services. It is the type of `face->internal->services'. You - * should only use FT_FACE_LOOKUP_SERVICE to access it. - * - * All fields should have the type FT_Pointer to relax compilation - * dependencies. We assume the developer isn't completely stupid. - * - * Each field must be named `service_XXXX' where `XXX' corresponds to - * the correct FT_SERVICE_ID_XXXX macro. See the definition of - * FT_FACE_LOOKUP_SERVICE below how this is implemented. - * - */ - typedef struct FT_ServiceCacheRec_ - { - FT_Pointer service_POSTSCRIPT_FONT_NAME; - FT_Pointer service_MULTI_MASTERS; - FT_Pointer service_GLYPH_DICT; - FT_Pointer service_PFR_METRICS; - FT_Pointer service_WINFNT; - - } FT_ServiceCacheRec, *FT_ServiceCache; - - - /* - * A magic number used within the services cache. - */ -#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)-2) /* magic number */ - - - /* - * @macro: - * FT_FACE_LOOKUP_SERVICE - * - * @description: - * This macro is used to lookup a service from a face's driver module - * using its cache. - * - * @input: - * face:: - * The source face handle containing the cache. - * - * field :: - * The field name in the cache. - * - * id :: - * The service ID. - * - * @output: - * ptr :: - * A variable receiving the service data. NULL if not available. - */ -#ifdef __cplusplus - -#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Pointer svc; \ - FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \ - \ - \ - svc = FT_FACE( face )->internal->services. service_ ## id; \ - if ( svc == FT_SERVICE_UNAVAILABLE ) \ - svc = NULL; \ - else if ( svc == NULL ) \ - { \ - FT_FACE_FIND_SERVICE( face, svc, id ); \ - \ - FT_FACE( face )->internal->services. service_ ## id = \ - (FT_Pointer)( svc != NULL ? svc \ - : FT_SERVICE_UNAVAILABLE ); \ - } \ - *Pptr = svc; \ - FT_END_STMNT - -#else /* !C++ */ - -#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Pointer svc; \ - \ - \ - svc = FT_FACE( face )->internal->services. service_ ## id; \ - if ( svc == FT_SERVICE_UNAVAILABLE ) \ - svc = NULL; \ - else if ( svc == NULL ) \ - { \ - FT_FACE_FIND_SERVICE( face, svc, id ); \ - \ - FT_FACE( face )->internal->services. service_ ## id = \ - (FT_Pointer)( svc != NULL ? svc \ - : FT_SERVICE_UNAVAILABLE ); \ - } \ - ptr = svc; \ - FT_END_STMNT - -#endif /* !C++ */ - - /* - * A macro used to define new service structure types. - */ - -#define FT_DEFINE_SERVICE( name ) \ - typedef struct FT_Service_ ## name ## Rec_ \ - FT_Service_ ## name ## Rec ; \ - typedef struct FT_Service_ ## name ## Rec_ \ - const * FT_Service_ ## name ; \ - struct FT_Service_ ## name ## Rec_ - - /* */ - - /* - * The header files containing the services. - */ - -#define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h> -#define FT_SERVICE_CID_H <freetype/internal/services/svcid.h> -#define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h> -#define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h> -#define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h> -#define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h> -#define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h> -#define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h> -#define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h> -#define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h> -#define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h> -#define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h> -#define FT_SERVICE_TRUETYPE_ENGINE_H <freetype/internal/services/svtteng.h> -#define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h> -#define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h> -#define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h> -#define FT_SERVICE_TRUETYPE_GLYF_H <freetype/internal/services/svttglyf.h> - - /* */ - -FT_END_HEADER - -#endif /* __FTSERV_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftstream.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftstream.h deleted file mode 100644 index a91eb72d..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/ftstream.h +++ /dev/null @@ -1,539 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftstream.h */ -/* */ -/* Stream handling (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2004, 2005, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTSTREAM_H__ -#define __FTSTREAM_H__ - - -#include <ft2build.h> -#include FT_SYSTEM_H -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - - /* format of an 8-bit frame_op value: */ - /* */ - /* bit 76543210 */ - /* xxxxxxes */ - /* */ - /* s is set to 1 if the value is signed. */ - /* e is set to 1 if the value is little-endian. */ - /* xxx is a command. */ - -#define FT_FRAME_OP_SHIFT 2 -#define FT_FRAME_OP_SIGNED 1 -#define FT_FRAME_OP_LITTLE 2 -#define FT_FRAME_OP_COMMAND( x ) ( x >> FT_FRAME_OP_SHIFT ) - -#define FT_MAKE_FRAME_OP( command, little, sign ) \ - ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign ) - -#define FT_FRAME_OP_END 0 -#define FT_FRAME_OP_START 1 /* start a new frame */ -#define FT_FRAME_OP_BYTE 2 /* read 1-byte value */ -#define FT_FRAME_OP_SHORT 3 /* read 2-byte value */ -#define FT_FRAME_OP_LONG 4 /* read 4-byte value */ -#define FT_FRAME_OP_OFF3 5 /* read 3-byte value */ -#define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */ - - - typedef enum FT_Frame_Op_ - { - ft_frame_end = 0, - ft_frame_start = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ), - - ft_frame_byte = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 0 ), - ft_frame_schar = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 1 ), - - ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ), - ft_frame_short_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ), - ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ), - ft_frame_short_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ), - - ft_frame_ulong_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ), - ft_frame_long_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ), - ft_frame_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ), - ft_frame_long_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ), - - ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ), - ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ), - ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ), - ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ), - - ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ), - ft_frame_skip = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 ) - - } FT_Frame_Op; - - - typedef struct FT_Frame_Field_ - { - FT_Byte value; - FT_Byte size; - FT_UShort offset; - - } FT_Frame_Field; - - - /* Construct an FT_Frame_Field out of a structure type and a field name. */ - /* The structure type must be set in the FT_STRUCTURE macro before */ - /* calling the FT_FRAME_START() macro. */ - /* */ -#define FT_FIELD_SIZE( f ) \ - (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f ) - -#define FT_FIELD_SIZE_DELTA( f ) \ - (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] ) - -#define FT_FIELD_OFFSET( f ) \ - (FT_UShort)( offsetof( FT_STRUCTURE, f ) ) - -#define FT_FRAME_FIELD( frame_op, field ) \ - { \ - frame_op, \ - FT_FIELD_SIZE( field ), \ - FT_FIELD_OFFSET( field ) \ - } - -#define FT_MAKE_EMPTY_FIELD( frame_op ) { frame_op, 0, 0 } - -#define FT_FRAME_START( size ) { ft_frame_start, 0, size } -#define FT_FRAME_END { ft_frame_end, 0, 0 } - -#define FT_FRAME_LONG( f ) FT_FRAME_FIELD( ft_frame_long_be, f ) -#define FT_FRAME_ULONG( f ) FT_FRAME_FIELD( ft_frame_ulong_be, f ) -#define FT_FRAME_SHORT( f ) FT_FRAME_FIELD( ft_frame_short_be, f ) -#define FT_FRAME_USHORT( f ) FT_FRAME_FIELD( ft_frame_ushort_be, f ) -#define FT_FRAME_OFF3( f ) FT_FRAME_FIELD( ft_frame_off3_be, f ) -#define FT_FRAME_UOFF3( f ) FT_FRAME_FIELD( ft_frame_uoff3_be, f ) -#define FT_FRAME_BYTE( f ) FT_FRAME_FIELD( ft_frame_byte, f ) -#define FT_FRAME_CHAR( f ) FT_FRAME_FIELD( ft_frame_schar, f ) - -#define FT_FRAME_LONG_LE( f ) FT_FRAME_FIELD( ft_frame_long_le, f ) -#define FT_FRAME_ULONG_LE( f ) FT_FRAME_FIELD( ft_frame_ulong_le, f ) -#define FT_FRAME_SHORT_LE( f ) FT_FRAME_FIELD( ft_frame_short_le, f ) -#define FT_FRAME_USHORT_LE( f ) FT_FRAME_FIELD( ft_frame_ushort_le, f ) -#define FT_FRAME_OFF3_LE( f ) FT_FRAME_FIELD( ft_frame_off3_le, f ) -#define FT_FRAME_UOFF3_LE( f ) FT_FRAME_FIELD( ft_frame_uoff3_le, f ) - -#define FT_FRAME_SKIP_LONG { ft_frame_long_be, 0, 0 } -#define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 } -#define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 } - -#define FT_FRAME_BYTES( field, count ) \ - { \ - ft_frame_bytes, \ - count, \ - FT_FIELD_OFFSET( field ) \ - } - -#define FT_FRAME_SKIP_BYTES( count ) { ft_frame_skip, count, 0 } - - - /*************************************************************************/ - /* */ - /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */ - /* type `char*' or equivalent (1-byte elements). */ - /* */ - -#define FT_BYTE_( p, i ) ( ((const FT_Byte*)(p))[(i)] ) -#define FT_INT8_( p, i ) ( ((const FT_Char*)(p))[(i)] ) - -#define FT_INT16( x ) ( (FT_Int16)(x) ) -#define FT_UINT16( x ) ( (FT_UInt16)(x) ) -#define FT_INT32( x ) ( (FT_Int32)(x) ) -#define FT_UINT32( x ) ( (FT_UInt32)(x) ) - -#define FT_BYTE_I16( p, i, s ) ( FT_INT16( FT_BYTE_( p, i ) ) << (s) ) -#define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) ) -#define FT_BYTE_I32( p, i, s ) ( FT_INT32( FT_BYTE_( p, i ) ) << (s) ) -#define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) ) - -#define FT_INT8_I16( p, i, s ) ( FT_INT16( FT_INT8_( p, i ) ) << (s) ) -#define FT_INT8_U16( p, i, s ) ( FT_UINT16( FT_INT8_( p, i ) ) << (s) ) -#define FT_INT8_I32( p, i, s ) ( FT_INT32( FT_INT8_( p, i ) ) << (s) ) -#define FT_INT8_U32( p, i, s ) ( FT_UINT32( FT_INT8_( p, i ) ) << (s) ) - - -#define FT_PEEK_SHORT( p ) FT_INT16( FT_INT8_I16( p, 0, 8) | \ - FT_BYTE_I16( p, 1, 0) ) - -#define FT_PEEK_USHORT( p ) FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \ - FT_BYTE_U16( p, 1, 0 ) ) - -#define FT_PEEK_LONG( p ) FT_INT32( FT_INT8_I32( p, 0, 24 ) | \ - FT_BYTE_I32( p, 1, 16 ) | \ - FT_BYTE_I32( p, 2, 8 ) | \ - FT_BYTE_I32( p, 3, 0 ) ) - -#define FT_PEEK_ULONG( p ) FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \ - FT_BYTE_U32( p, 1, 16 ) | \ - FT_BYTE_U32( p, 2, 8 ) | \ - FT_BYTE_U32( p, 3, 0 ) ) - -#define FT_PEEK_OFF3( p ) FT_INT32( FT_INT8_I32( p, 0, 16 ) | \ - FT_BYTE_I32( p, 1, 8 ) | \ - FT_BYTE_I32( p, 2, 0 ) ) - -#define FT_PEEK_UOFF3( p ) FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \ - FT_BYTE_U32( p, 1, 8 ) | \ - FT_BYTE_U32( p, 2, 0 ) ) - -#define FT_PEEK_SHORT_LE( p ) FT_INT16( FT_INT8_I16( p, 1, 8 ) | \ - FT_BYTE_I16( p, 0, 0 ) ) - -#define FT_PEEK_USHORT_LE( p ) FT_UINT16( FT_BYTE_U16( p, 1, 8 ) | \ - FT_BYTE_U16( p, 0, 0 ) ) - -#define FT_PEEK_LONG_LE( p ) FT_INT32( FT_INT8_I32( p, 3, 24 ) | \ - FT_BYTE_I32( p, 2, 16 ) | \ - FT_BYTE_I32( p, 1, 8 ) | \ - FT_BYTE_I32( p, 0, 0 ) ) - -#define FT_PEEK_ULONG_LE( p ) FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \ - FT_BYTE_U32( p, 2, 16 ) | \ - FT_BYTE_U32( p, 1, 8 ) | \ - FT_BYTE_U32( p, 0, 0 ) ) - -#define FT_PEEK_OFF3_LE( p ) FT_INT32( FT_INT8_I32( p, 2, 16 ) | \ - FT_BYTE_I32( p, 1, 8 ) | \ - FT_BYTE_I32( p, 0, 0 ) ) - -#define FT_PEEK_UOFF3_LE( p ) FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \ - FT_BYTE_U32( p, 1, 8 ) | \ - FT_BYTE_U32( p, 0, 0 ) ) - - -#define FT_NEXT_CHAR( buffer ) \ - ( (signed char)*buffer++ ) - -#define FT_NEXT_BYTE( buffer ) \ - ( (unsigned char)*buffer++ ) - -#define FT_NEXT_SHORT( buffer ) \ - ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) ) - -#define FT_NEXT_USHORT( buffer ) \ - ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) ) - -#define FT_NEXT_OFF3( buffer ) \ - ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) ) - -#define FT_NEXT_UOFF3( buffer ) \ - ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) ) - -#define FT_NEXT_LONG( buffer ) \ - ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) ) - -#define FT_NEXT_ULONG( buffer ) \ - ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) ) - - -#define FT_NEXT_SHORT_LE( buffer ) \ - ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) ) - -#define FT_NEXT_USHORT_LE( buffer ) \ - ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) ) - -#define FT_NEXT_OFF3_LE( buffer ) \ - ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) ) - -#define FT_NEXT_UOFF3_LE( buffer ) \ - ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) ) - -#define FT_NEXT_LONG_LE( buffer ) \ - ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) ) - -#define FT_NEXT_ULONG_LE( buffer ) \ - ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) ) - - - /*************************************************************************/ - /* */ - /* Each GET_xxxx() macro uses an implicit `stream' variable. */ - /* */ -#if 0 -#define FT_GET_MACRO( type ) FT_NEXT_ ## type ( stream->cursor ) - -#define FT_GET_CHAR() FT_GET_MACRO( CHAR ) -#define FT_GET_BYTE() FT_GET_MACRO( BYTE ) -#define FT_GET_SHORT() FT_GET_MACRO( SHORT ) -#define FT_GET_USHORT() FT_GET_MACRO( USHORT ) -#define FT_GET_OFF3() FT_GET_MACRO( OFF3 ) -#define FT_GET_UOFF3() FT_GET_MACRO( UOFF3 ) -#define FT_GET_LONG() FT_GET_MACRO( LONG ) -#define FT_GET_ULONG() FT_GET_MACRO( ULONG ) -#define FT_GET_TAG4() FT_GET_MACRO( ULONG ) - -#define FT_GET_SHORT_LE() FT_GET_MACRO( SHORT_LE ) -#define FT_GET_USHORT_LE() FT_GET_MACRO( USHORT_LE ) -#define FT_GET_LONG_LE() FT_GET_MACRO( LONG_LE ) -#define FT_GET_ULONG_LE() FT_GET_MACRO( ULONG_LE ) - -#else -#define FT_GET_MACRO( func, type ) ( (type)func( stream ) ) - -#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetChar, FT_Char ) -#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetChar, FT_Byte ) -#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_Short ) -#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_UShort ) -#define FT_GET_OFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_Long ) -#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_ULong ) -#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetLong, FT_Long ) -#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong ) -#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong ) - -#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_Short ) -#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_UShort ) -#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_Long ) -#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_ULong ) -#endif - -#define FT_READ_MACRO( func, type, var ) \ - ( var = (type)func( stream, &error ), \ - error != FT_Err_Ok ) - -#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var ) -#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var ) -#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_Short, var ) -#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_UShort, var ) -#define FT_READ_OFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_Long, var ) -#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_ULong, var ) -#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_Long, var ) -#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_ULong, var ) - -#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_Short, var ) -#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_UShort, var ) -#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_Long, var ) -#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_ULong, var ) - - -#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM - - /* initialize a stream for reading a regular system stream */ - FT_BASE( FT_Error ) - FT_Stream_Open( FT_Stream stream, - const char* filepathname ); - -#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ - - - /* create a new (input) stream from an FT_Open_Args structure */ - FT_BASE( FT_Error ) - FT_Stream_New( FT_Library library, - const FT_Open_Args* args, - FT_Stream *astream ); - - /* free a stream */ - FT_BASE( void ) - FT_Stream_Free( FT_Stream stream, - FT_Int external ); - - /* initialize a stream for reading in-memory data */ - FT_BASE( void ) - FT_Stream_OpenMemory( FT_Stream stream, - const FT_Byte* base, - FT_ULong size ); - - /* close a stream (does not destroy the stream structure) */ - FT_BASE( void ) - FT_Stream_Close( FT_Stream stream ); - - - /* seek within a stream. position is relative to start of stream */ - FT_BASE( FT_Error ) - FT_Stream_Seek( FT_Stream stream, - FT_ULong pos ); - - /* skip bytes in a stream */ - FT_BASE( FT_Error ) - FT_Stream_Skip( FT_Stream stream, - FT_Long distance ); - - /* return current stream position */ - FT_BASE( FT_Long ) - FT_Stream_Pos( FT_Stream stream ); - - /* read bytes from a stream into a user-allocated buffer, returns an */ - /* error if not all bytes could be read. */ - FT_BASE( FT_Error ) - FT_Stream_Read( FT_Stream stream, - FT_Byte* buffer, - FT_ULong count ); - - /* read bytes from a stream at a given position */ - FT_BASE( FT_Error ) - FT_Stream_ReadAt( FT_Stream stream, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ); - - /* try to read bytes at the end of a stream; return number of bytes */ - /* really available */ - FT_BASE( FT_ULong ) - FT_Stream_TryRead( FT_Stream stream, - FT_Byte* buffer, - FT_ULong count ); - - /* Enter a frame of `count' consecutive bytes in a stream. Returns an */ - /* error if the frame could not be read/accessed. The caller can use */ - /* the FT_Stream_Get_XXX functions to retrieve frame data without */ - /* error checks. */ - /* */ - /* You must _always_ call FT_Stream_ExitFrame() once you have entered */ - /* a stream frame! */ - /* */ - FT_BASE( FT_Error ) - FT_Stream_EnterFrame( FT_Stream stream, - FT_ULong count ); - - /* exit a stream frame */ - FT_BASE( void ) - FT_Stream_ExitFrame( FT_Stream stream ); - - /* Extract a stream frame. If the stream is disk-based, a heap block */ - /* is allocated and the frame bytes are read into it. If the stream */ - /* is memory-based, this function simply set a pointer to the data. */ - /* */ - /* Useful to optimize access to memory-based streams transparently. */ - /* */ - /* All extracted frames must be `freed' with a call to the function */ - /* FT_Stream_ReleaseFrame(). */ - /* */ - FT_BASE( FT_Error ) - FT_Stream_ExtractFrame( FT_Stream stream, - FT_ULong count, - FT_Byte** pbytes ); - - /* release an extract frame (see FT_Stream_ExtractFrame) */ - FT_BASE( void ) - FT_Stream_ReleaseFrame( FT_Stream stream, - FT_Byte** pbytes ); - - /* read a byte from an entered frame */ - FT_BASE( FT_Char ) - FT_Stream_GetChar( FT_Stream stream ); - - /* read a 16-bit big-endian integer from an entered frame */ - FT_BASE( FT_Short ) - FT_Stream_GetShort( FT_Stream stream ); - - /* read a 24-bit big-endian integer from an entered frame */ - FT_BASE( FT_Long ) - FT_Stream_GetOffset( FT_Stream stream ); - - /* read a 32-bit big-endian integer from an entered frame */ - FT_BASE( FT_Long ) - FT_Stream_GetLong( FT_Stream stream ); - - /* read a 16-bit little-endian integer from an entered frame */ - FT_BASE( FT_Short ) - FT_Stream_GetShortLE( FT_Stream stream ); - - /* read a 32-bit little-endian integer from an entered frame */ - FT_BASE( FT_Long ) - FT_Stream_GetLongLE( FT_Stream stream ); - - - /* read a byte from a stream */ - FT_BASE( FT_Char ) - FT_Stream_ReadChar( FT_Stream stream, - FT_Error* error ); - - /* read a 16-bit big-endian integer from a stream */ - FT_BASE( FT_Short ) - FT_Stream_ReadShort( FT_Stream stream, - FT_Error* error ); - - /* read a 24-bit big-endian integer from a stream */ - FT_BASE( FT_Long ) - FT_Stream_ReadOffset( FT_Stream stream, - FT_Error* error ); - - /* read a 32-bit big-endian integer from a stream */ - FT_BASE( FT_Long ) - FT_Stream_ReadLong( FT_Stream stream, - FT_Error* error ); - - /* read a 16-bit little-endian integer from a stream */ - FT_BASE( FT_Short ) - FT_Stream_ReadShortLE( FT_Stream stream, - FT_Error* error ); - - /* read a 32-bit little-endian integer from a stream */ - FT_BASE( FT_Long ) - FT_Stream_ReadLongLE( FT_Stream stream, - FT_Error* error ); - - /* Read a structure from a stream. The structure must be described */ - /* by an array of FT_Frame_Field records. */ - FT_BASE( FT_Error ) - FT_Stream_ReadFields( FT_Stream stream, - const FT_Frame_Field* fields, - void* structure ); - - -#define FT_STREAM_POS() \ - FT_Stream_Pos( stream ) - -#define FT_STREAM_SEEK( position ) \ - FT_SET_ERROR( FT_Stream_Seek( stream, position ) ) - -#define FT_STREAM_SKIP( distance ) \ - FT_SET_ERROR( FT_Stream_Skip( stream, distance ) ) - -#define FT_STREAM_READ( buffer, count ) \ - FT_SET_ERROR( FT_Stream_Read( stream, \ - (FT_Byte*)buffer, \ - count ) ) - -#define FT_STREAM_READ_AT( position, buffer, count ) \ - FT_SET_ERROR( FT_Stream_ReadAt( stream, \ - position, \ - (FT_Byte*)buffer, \ - count ) ) - -#define FT_STREAM_READ_FIELDS( fields, object ) \ - FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) ) - - -#define FT_FRAME_ENTER( size ) \ - FT_SET_ERROR( \ - FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, size ) ) ) - -#define FT_FRAME_EXIT() \ - FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) ) - -#define FT_FRAME_EXTRACT( size, bytes ) \ - FT_SET_ERROR( \ - FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, size, \ - (FT_Byte**)&(bytes) ) ) ) - -#define FT_FRAME_RELEASE( bytes ) \ - FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream, \ - (FT_Byte**)&(bytes) ) ) - - -FT_END_HEADER - -#endif /* __FTSTREAM_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/fttrace.h b/android/jni/ndk_modules/freetype/include/freetype/internal/fttrace.h deleted file mode 100644 index e9b383a5..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/fttrace.h +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************/ -/* */ -/* fttrace.h */ -/* */ -/* Tracing handling (specification only). */ -/* */ -/* Copyright 2002, 2004, 2005, 2006, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /* definitions of trace levels for FreeType 2 */ - - /* the first level must always be `trace_any' */ -FT_TRACE_DEF( any ) - - /* base components */ -FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */ -FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */ -FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */ -FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */ -FT_TRACE_DEF( list ) /* list management (ftlist.c) */ -FT_TRACE_DEF( init ) /* initialization (ftinit.c) */ -FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */ -FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */ -FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */ -FT_TRACE_DEF( gloader ) /* glyph loader (ftgloadr.c) */ - -FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */ -FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */ -FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */ -FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */ -FT_TRACE_DEF( synth ) /* bold/slant synthesizer (ftsynth.c) */ - - /* Cache sub-system */ -FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ - - /* SFNT driver components */ -FT_TRACE_DEF( sfdriver ) /* SFNT font driver (sfdriver.c) */ -FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ -FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ -FT_TRACE_DEF( ttkern ) /* kerning handler (ttkern.c) */ -FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */ -FT_TRACE_DEF( ttmtx ) /* metrics-related tables (ttmtx.c) */ -FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */ -FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */ -FT_TRACE_DEF( ttbdf ) /* TrueType embedded BDF (ttbdf.c) */ - - /* TrueType driver components */ -FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */ -FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */ -FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */ -FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */ -FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */ -FT_TRACE_DEF( ttgxvar ) /* TrueType GX var handler (ttgxvar.c) */ - - /* Type 1 driver components */ -FT_TRACE_DEF( t1afm ) -FT_TRACE_DEF( t1driver ) -FT_TRACE_DEF( t1gload ) -FT_TRACE_DEF( t1hint ) -FT_TRACE_DEF( t1load ) -FT_TRACE_DEF( t1objs ) -FT_TRACE_DEF( t1parse ) - - /* PostScript helper module `psaux' */ -FT_TRACE_DEF( t1decode ) -FT_TRACE_DEF( psobjs ) - - /* PostScript hinting module `pshinter' */ -FT_TRACE_DEF( pshrec ) -FT_TRACE_DEF( pshalgo1 ) -FT_TRACE_DEF( pshalgo2 ) - - /* Type 2 driver components */ -FT_TRACE_DEF( cffdriver ) -FT_TRACE_DEF( cffgload ) -FT_TRACE_DEF( cffload ) -FT_TRACE_DEF( cffobjs ) -FT_TRACE_DEF( cffparse ) - - /* Type 42 driver component */ -FT_TRACE_DEF( t42 ) - - /* CID driver components */ -FT_TRACE_DEF( cidafm ) -FT_TRACE_DEF( ciddriver ) -FT_TRACE_DEF( cidgload ) -FT_TRACE_DEF( cidload ) -FT_TRACE_DEF( cidobjs ) -FT_TRACE_DEF( cidparse ) - - /* Windows font component */ -FT_TRACE_DEF( winfnt ) - - /* PCF font components */ -FT_TRACE_DEF( pcfdriver ) -FT_TRACE_DEF( pcfread ) - - /* BDF font components */ -FT_TRACE_DEF( bdfdriver ) -FT_TRACE_DEF( bdflib ) - - /* PFR font component */ -FT_TRACE_DEF( pfr ) - - /* OpenType validation components */ -FT_TRACE_DEF( otvmodule ) -FT_TRACE_DEF( otvcommon ) -FT_TRACE_DEF( otvbase ) -FT_TRACE_DEF( otvgdef ) -FT_TRACE_DEF( otvgpos ) -FT_TRACE_DEF( otvgsub ) -FT_TRACE_DEF( otvjstf ) -FT_TRACE_DEF( otvmath ) - - /* TrueTypeGX/AAT validation components */ -FT_TRACE_DEF( gxvmodule ) -FT_TRACE_DEF( gxvcommon ) -FT_TRACE_DEF( gxvfeat ) -FT_TRACE_DEF( gxvmort ) -FT_TRACE_DEF( gxvmorx ) -FT_TRACE_DEF( gxvbsln ) -FT_TRACE_DEF( gxvjust ) -FT_TRACE_DEF( gxvkern ) -FT_TRACE_DEF( gxvopbd ) -FT_TRACE_DEF( gxvtrak ) -FT_TRACE_DEF( gxvprop ) -FT_TRACE_DEF( gxvlcar ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/ftvalid.h b/android/jni/ndk_modules/freetype/include/freetype/internal/ftvalid.h deleted file mode 100644 index 00cd85e7..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/ftvalid.h +++ /dev/null @@ -1,150 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftvalid.h */ -/* */ -/* FreeType validation support (specification). */ -/* */ -/* Copyright 2004 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTVALID_H__ -#define __FTVALID_H__ - -#include <ft2build.h> -#include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_setjmp and ft_longjmp */ - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** V A L I D A T I O N ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* handle to a validation object */ - typedef struct FT_ValidatorRec_ volatile* FT_Validator; - - - /*************************************************************************/ - /* */ - /* There are three distinct validation levels defined here: */ - /* */ - /* FT_VALIDATE_DEFAULT :: */ - /* A table that passes this validation level can be used reliably by */ - /* FreeType. It generally means that all offsets have been checked to */ - /* prevent out-of-bound reads, that array counts are correct, etc. */ - /* */ - /* FT_VALIDATE_TIGHT :: */ - /* A table that passes this validation level can be used reliably and */ - /* doesn't contain invalid data. For example, a charmap table that */ - /* returns invalid glyph indices will not pass, even though it can */ - /* be used with FreeType in default mode (the library will simply */ - /* return an error later when trying to load the glyph). */ - /* */ - /* It also checks that fields which must be a multiple of 2, 4, or 8, */ - /* don't have incorrect values, etc. */ - /* */ - /* FT_VALIDATE_PARANOID :: */ - /* Only for font debugging. Checks that a table follows the */ - /* specification by 100%. Very few fonts will be able to pass this */ - /* level anyway but it can be useful for certain tools like font */ - /* editors/converters. */ - /* */ - typedef enum FT_ValidationLevel_ - { - FT_VALIDATE_DEFAULT = 0, - FT_VALIDATE_TIGHT, - FT_VALIDATE_PARANOID - - } FT_ValidationLevel; - - - /* validator structure */ - typedef struct FT_ValidatorRec_ - { - const FT_Byte* base; /* address of table in memory */ - const FT_Byte* limit; /* `base' + sizeof(table) in memory */ - FT_ValidationLevel level; /* validation level */ - FT_Error error; /* error returned. 0 means success */ - - ft_jmp_buf jump_buffer; /* used for exception handling */ - - } FT_ValidatorRec; - - -#define FT_VALIDATOR( x ) ((FT_Validator)( x )) - - - FT_BASE( void ) - ft_validator_init( FT_Validator valid, - const FT_Byte* base, - const FT_Byte* limit, - FT_ValidationLevel level ); - - /* Do not use this. It's broken and will cause your validator to crash */ - /* if you run it on an invalid font. */ - FT_BASE( FT_Int ) - ft_validator_run( FT_Validator valid ); - - /* Sets the error field in a validator, then calls `longjmp' to return */ - /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */ - /* error checks within the validation routines. */ - /* */ - FT_BASE( void ) - ft_validator_error( FT_Validator valid, - FT_Error error ); - - - /* Calls ft_validate_error. Assumes that the `valid' local variable */ - /* holds a pointer to the current validator object. */ - /* */ - /* Use preprocessor prescan to pass FT_ERR_PREFIX. */ - /* */ -#define FT_INVALID( _prefix, _error ) FT_INVALID_( _prefix, _error ) -#define FT_INVALID_( _prefix, _error ) \ - ft_validator_error( valid, _prefix ## _error ) - - /* called when a broken table is detected */ -#define FT_INVALID_TOO_SHORT \ - FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) - - /* called when an invalid offset is detected */ -#define FT_INVALID_OFFSET \ - FT_INVALID( FT_ERR_PREFIX, Invalid_Offset ) - - /* called when an invalid format/value is detected */ -#define FT_INVALID_FORMAT \ - FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) - - /* called when an invalid glyph index is detected */ -#define FT_INVALID_GLYPH_ID \ - FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index ) - - /* called when an invalid field value is detected */ -#define FT_INVALID_DATA \ - FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) - - -FT_END_HEADER - -#endif /* __FTVALID_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/internal.h b/android/jni/ndk_modules/freetype/include/freetype/internal/internal.h deleted file mode 100644 index f500a651..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/internal.h +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************/ -/* */ -/* internal.h */ -/* */ -/* Internal header files (specification only). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is automatically included by `ft2build.h'. */ - /* Do not include it manually! */ - /* */ - /*************************************************************************/ - - -#define FT_INTERNAL_OBJECTS_H <freetype/internal/ftobjs.h> -#define FT_INTERNAL_PIC_H <freetype/internal/ftpic.h> -#define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h> -#define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h> -#define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h> -#define FT_INTERNAL_CALC_H <freetype/internal/ftcalc.h> -#define FT_INTERNAL_DRIVER_H <freetype/internal/ftdriver.h> -#define FT_INTERNAL_TRACE_H <freetype/internal/fttrace.h> -#define FT_INTERNAL_GLYPH_LOADER_H <freetype/internal/ftgloadr.h> -#define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h> -#define FT_INTERNAL_SERVICE_H <freetype/internal/ftserv.h> -#define FT_INTERNAL_RFORK_H <freetype/internal/ftrfork.h> -#define FT_INTERNAL_VALIDATE_H <freetype/internal/ftvalid.h> - -#define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h> -#define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h> - -#define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h> -#define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h> -#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h> - -#define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h> - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/pcftypes.h b/android/jni/ndk_modules/freetype/include/freetype/internal/pcftypes.h deleted file mode 100644 index 382796ff..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/pcftypes.h +++ /dev/null @@ -1,56 +0,0 @@ -/* pcftypes.h - - FreeType font driver for pcf fonts - - Copyright (C) 2000, 2001, 2002 by - Francesco Zappa Nardelli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - - -#ifndef __PCFTYPES_H__ -#define __PCFTYPES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - typedef struct PCF_Public_FaceRec_ - { - FT_FaceRec root; - FT_StreamRec gzip_stream; - FT_Stream gzip_source; - - char* charset_encoding; - char* charset_registry; - - } PCF_Public_FaceRec, *PCF_Public_Face; - - -FT_END_HEADER - -#endif /* __PCFTYPES_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/psaux.h b/android/jni/ndk_modules/freetype/include/freetype/internal/psaux.h deleted file mode 100644 index a96e0dfa..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/psaux.h +++ /dev/null @@ -1,873 +0,0 @@ -/***************************************************************************/ -/* */ -/* psaux.h */ -/* */ -/* Auxiliary functions and data structures related to PostScript fonts */ -/* (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __PSAUX_H__ -#define __PSAUX_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1_TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - typedef struct PS_TableRec_* PS_Table; - typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_Table_FuncsRec */ - /* */ - /* <Description> */ - /* A set of function pointers to manage PS_Table objects. */ - /* */ - /* <Fields> */ - /* table_init :: Used to initialize a table. */ - /* */ - /* table_done :: Finalizes resp. destroy a given table. */ - /* */ - /* table_add :: Adds a new object to a table. */ - /* */ - /* table_release :: Releases table data, then finalizes it. */ - /* */ - typedef struct PS_Table_FuncsRec_ - { - FT_Error - (*init)( PS_Table table, - FT_Int count, - FT_Memory memory ); - - void - (*done)( PS_Table table ); - - FT_Error - (*add)( PS_Table table, - FT_Int idx, - void* object, - FT_PtrDist length ); - - void - (*release)( PS_Table table ); - - } PS_Table_FuncsRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_TableRec */ - /* */ - /* <Description> */ - /* A PS_Table is a simple object used to store an array of objects in */ - /* a single memory block. */ - /* */ - /* <Fields> */ - /* block :: The address in memory of the growheap's block. This */ - /* can change between two object adds, due to */ - /* reallocation. */ - /* */ - /* cursor :: The current top of the grow heap within its block. */ - /* */ - /* capacity :: The current size of the heap block. Increments by */ - /* 1kByte chunks. */ - /* */ - /* max_elems :: The maximum number of elements in table. */ - /* */ - /* num_elems :: The current number of elements in table. */ - /* */ - /* elements :: A table of element addresses within the block. */ - /* */ - /* lengths :: A table of element sizes within the block. */ - /* */ - /* memory :: The object used for memory operations */ - /* (alloc/realloc). */ - /* */ - /* funcs :: A table of method pointers for this object. */ - /* */ - typedef struct PS_TableRec_ - { - FT_Byte* block; /* current memory block */ - FT_Offset cursor; /* current cursor in memory block */ - FT_Offset capacity; /* current size of memory block */ - FT_Long init; - - FT_Int max_elems; - FT_Int num_elems; - FT_Byte** elements; /* addresses of table elements */ - FT_PtrDist* lengths; /* lengths of table elements */ - - FT_Memory memory; - PS_Table_FuncsRec funcs; - - } PS_TableRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 FIELDS & TOKENS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct PS_ParserRec_* PS_Parser; - - typedef struct T1_TokenRec_* T1_Token; - - typedef struct T1_FieldRec_* T1_Field; - - - /* simple enumeration type used to identify token types */ - typedef enum T1_TokenType_ - { - T1_TOKEN_TYPE_NONE = 0, - T1_TOKEN_TYPE_ANY, - T1_TOKEN_TYPE_STRING, - T1_TOKEN_TYPE_ARRAY, - T1_TOKEN_TYPE_KEY, /* aka `name' */ - - /* do not remove */ - T1_TOKEN_TYPE_MAX - - } T1_TokenType; - - - /* a simple structure used to identify tokens */ - typedef struct T1_TokenRec_ - { - FT_Byte* start; /* first character of token in input stream */ - FT_Byte* limit; /* first character after the token */ - T1_TokenType type; /* type of token */ - - } T1_TokenRec; - - - /* enumeration type used to identify object fields */ - typedef enum T1_FieldType_ - { - T1_FIELD_TYPE_NONE = 0, - T1_FIELD_TYPE_BOOL, - T1_FIELD_TYPE_INTEGER, - T1_FIELD_TYPE_FIXED, - T1_FIELD_TYPE_FIXED_1000, - T1_FIELD_TYPE_STRING, - T1_FIELD_TYPE_KEY, - T1_FIELD_TYPE_BBOX, - T1_FIELD_TYPE_INTEGER_ARRAY, - T1_FIELD_TYPE_FIXED_ARRAY, - T1_FIELD_TYPE_CALLBACK, - - /* do not remove */ - T1_FIELD_TYPE_MAX - - } T1_FieldType; - - - typedef enum T1_FieldLocation_ - { - T1_FIELD_LOCATION_CID_INFO, - T1_FIELD_LOCATION_FONT_DICT, - T1_FIELD_LOCATION_FONT_EXTRA, - T1_FIELD_LOCATION_FONT_INFO, - T1_FIELD_LOCATION_PRIVATE, - T1_FIELD_LOCATION_BBOX, - T1_FIELD_LOCATION_LOADER, - T1_FIELD_LOCATION_FACE, - T1_FIELD_LOCATION_BLEND, - - /* do not remove */ - T1_FIELD_LOCATION_MAX - - } T1_FieldLocation; - - - typedef void - (*T1_Field_ParseFunc)( FT_Face face, - FT_Pointer parser ); - - - /* structure type used to model object fields */ - typedef struct T1_FieldRec_ - { - const char* ident; /* field identifier */ - T1_FieldLocation location; - T1_FieldType type; /* type of field */ - T1_Field_ParseFunc reader; - FT_UInt offset; /* offset of field in object */ - FT_Byte size; /* size of field in bytes */ - FT_UInt array_max; /* maximal number of elements for */ - /* array */ - FT_UInt count_offset; /* offset of element count for */ - /* arrays; must not be zero if in */ - /* use -- in other words, a */ - /* `num_FOO' element must not */ - /* start the used structure if we */ - /* parse a `FOO' array */ - FT_UInt dict; /* where we expect it */ - } T1_FieldRec; - -#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */ -#define T1_FIELD_DICT_PRIVATE ( 1 << 1 ) - - - -#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \ - { \ - _ident, T1CODE, _type, \ - 0, \ - FT_FIELD_OFFSET( _fname ), \ - FT_FIELD_SIZE( _fname ), \ - 0, 0, \ - _dict \ - }, - -#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \ - { \ - _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ - (T1_Field_ParseFunc)_reader, \ - 0, 0, \ - 0, 0, \ - _dict \ - }, - -#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \ - { \ - _ident, T1CODE, _type, \ - 0, \ - FT_FIELD_OFFSET( _fname ), \ - FT_FIELD_SIZE_DELTA( _fname ), \ - _max, \ - FT_FIELD_OFFSET( num_ ## _fname ), \ - _dict \ - }, - -#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \ - { \ - _ident, T1CODE, _type, \ - 0, \ - FT_FIELD_OFFSET( _fname ), \ - FT_FIELD_SIZE_DELTA( _fname ), \ - _max, 0, \ - _dict \ - }, - - -#define T1_FIELD_BOOL( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict ) - -#define T1_FIELD_NUM( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict ) - -#define T1_FIELD_FIXED( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict ) - -#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \ - _dict ) - -#define T1_FIELD_STRING( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict ) - -#define T1_FIELD_KEY( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict ) - -#define T1_FIELD_BBOX( _ident, _fname, _dict ) \ - T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict ) - - -#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \ - T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ - _fname, _fmax, _dict ) - -#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \ - T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ - _fname, _fmax, _dict ) - -#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \ - T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ - _fname, _fmax, _dict ) - -#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \ - T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ - _fname, _fmax, _dict ) - -#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \ - T1_NEW_CALLBACK_FIELD( _ident, _name, _dict ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 PARSER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs; - - typedef struct PS_Parser_FuncsRec_ - { - void - (*init)( PS_Parser parser, - FT_Byte* base, - FT_Byte* limit, - FT_Memory memory ); - - void - (*done)( PS_Parser parser ); - - void - (*skip_spaces)( PS_Parser parser ); - void - (*skip_PS_token)( PS_Parser parser ); - - FT_Long - (*to_int)( PS_Parser parser ); - FT_Fixed - (*to_fixed)( PS_Parser parser, - FT_Int power_ten ); - - FT_Error - (*to_bytes)( PS_Parser parser, - FT_Byte* bytes, - FT_Offset max_bytes, - FT_Long* pnum_bytes, - FT_Bool delimiters ); - - FT_Int - (*to_coord_array)( PS_Parser parser, - FT_Int max_coords, - FT_Short* coords ); - FT_Int - (*to_fixed_array)( PS_Parser parser, - FT_Int max_values, - FT_Fixed* values, - FT_Int power_ten ); - - void - (*to_token)( PS_Parser parser, - T1_Token token ); - void - (*to_token_array)( PS_Parser parser, - T1_Token tokens, - FT_UInt max_tokens, - FT_Int* pnum_tokens ); - - FT_Error - (*load_field)( PS_Parser parser, - const T1_Field field, - void** objects, - FT_UInt max_objects, - FT_ULong* pflags ); - - FT_Error - (*load_field_table)( PS_Parser parser, - const T1_Field field, - void** objects, - FT_UInt max_objects, - FT_ULong* pflags ); - - } PS_Parser_FuncsRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_ParserRec */ - /* */ - /* <Description> */ - /* A PS_Parser is an object used to parse a Type 1 font very quickly. */ - /* */ - /* <Fields> */ - /* cursor :: The current position in the text. */ - /* */ - /* base :: Start of the processed text. */ - /* */ - /* limit :: End of the processed text. */ - /* */ - /* error :: The last error returned. */ - /* */ - /* memory :: The object used for memory operations (alloc/realloc). */ - /* */ - /* funcs :: A table of functions for the parser. */ - /* */ - typedef struct PS_ParserRec_ - { - FT_Byte* cursor; - FT_Byte* base; - FT_Byte* limit; - FT_Error error; - FT_Memory memory; - - PS_Parser_FuncsRec funcs; - - } PS_ParserRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 BUILDER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - typedef struct T1_BuilderRec_* T1_Builder; - - - typedef FT_Error - (*T1_Builder_Check_Points_Func)( T1_Builder builder, - FT_Int count ); - - typedef void - (*T1_Builder_Add_Point_Func)( T1_Builder builder, - FT_Pos x, - FT_Pos y, - FT_Byte flag ); - - typedef FT_Error - (*T1_Builder_Add_Point1_Func)( T1_Builder builder, - FT_Pos x, - FT_Pos y ); - - typedef FT_Error - (*T1_Builder_Add_Contour_Func)( T1_Builder builder ); - - typedef FT_Error - (*T1_Builder_Start_Point_Func)( T1_Builder builder, - FT_Pos x, - FT_Pos y ); - - typedef void - (*T1_Builder_Close_Contour_Func)( T1_Builder builder ); - - - typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs; - - typedef struct T1_Builder_FuncsRec_ - { - void - (*init)( T1_Builder builder, - FT_Face face, - FT_Size size, - FT_GlyphSlot slot, - FT_Bool hinting ); - - void - (*done)( T1_Builder builder ); - - T1_Builder_Check_Points_Func check_points; - T1_Builder_Add_Point_Func add_point; - T1_Builder_Add_Point1_Func add_point1; - T1_Builder_Add_Contour_Func add_contour; - T1_Builder_Start_Point_Func start_point; - T1_Builder_Close_Contour_Func close_contour; - - } T1_Builder_FuncsRec; - - - /* an enumeration type to handle charstring parsing states */ - typedef enum T1_ParseState_ - { - T1_Parse_Start, - T1_Parse_Have_Width, - T1_Parse_Have_Moveto, - T1_Parse_Have_Path - - } T1_ParseState; - - - /*************************************************************************/ - /* */ - /* <Structure> */ - /* T1_BuilderRec */ - /* */ - /* <Description> */ - /* A structure used during glyph loading to store its outline. */ - /* */ - /* <Fields> */ - /* memory :: The current memory object. */ - /* */ - /* face :: The current face object. */ - /* */ - /* glyph :: The current glyph slot. */ - /* */ - /* loader :: XXX */ - /* */ - /* base :: The base glyph outline. */ - /* */ - /* current :: The current glyph outline. */ - /* */ - /* max_points :: maximum points in builder outline */ - /* */ - /* max_contours :: Maximal number of contours in builder outline. */ - /* */ - /* pos_x :: The horizontal translation (if composite glyph). */ - /* */ - /* pos_y :: The vertical translation (if composite glyph). */ - /* */ - /* left_bearing :: The left side bearing point. */ - /* */ - /* advance :: The horizontal advance vector. */ - /* */ - /* bbox :: Unused. */ - /* */ - /* parse_state :: An enumeration which controls the charstring */ - /* parsing state. */ - /* */ - /* load_points :: If this flag is not set, no points are loaded. */ - /* */ - /* no_recurse :: Set but not used. */ - /* */ - /* metrics_only :: A boolean indicating that we only want to compute */ - /* the metrics of a given glyph, not load all of its */ - /* points. */ - /* */ - /* funcs :: An array of function pointers for the builder. */ - /* */ - typedef struct T1_BuilderRec_ - { - FT_Memory memory; - FT_Face face; - FT_GlyphSlot glyph; - FT_GlyphLoader loader; - FT_Outline* base; - FT_Outline* current; - - FT_Pos pos_x; - FT_Pos pos_y; - - FT_Vector left_bearing; - FT_Vector advance; - - FT_BBox bbox; /* bounding box */ - T1_ParseState parse_state; - FT_Bool load_points; - FT_Bool no_recurse; - - FT_Bool metrics_only; - - void* hints_funcs; /* hinter-specific */ - void* hints_globals; /* hinter-specific */ - - T1_Builder_FuncsRec funcs; - - } T1_BuilderRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 DECODER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#if 0 - - /*************************************************************************/ - /* */ - /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ - /* calls during glyph loading. */ - /* */ -#define T1_MAX_SUBRS_CALLS 8 - - - /*************************************************************************/ - /* */ - /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ - /* minimum of 16 is required. */ - /* */ -#define T1_MAX_CHARSTRINGS_OPERANDS 32 - -#endif /* 0 */ - - - typedef struct T1_Decoder_ZoneRec_ - { - FT_Byte* cursor; - FT_Byte* base; - FT_Byte* limit; - - } T1_Decoder_ZoneRec, *T1_Decoder_Zone; - - - typedef struct T1_DecoderRec_* T1_Decoder; - typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs; - - - typedef FT_Error - (*T1_Decoder_Callback)( T1_Decoder decoder, - FT_UInt glyph_index ); - - - typedef struct T1_Decoder_FuncsRec_ - { - FT_Error - (*init)( T1_Decoder decoder, - FT_Face face, - FT_Size size, - FT_GlyphSlot slot, - FT_Byte** glyph_names, - PS_Blend blend, - FT_Bool hinting, - FT_Render_Mode hint_mode, - T1_Decoder_Callback callback ); - - void - (*done)( T1_Decoder decoder ); - - FT_Error - (*parse_charstrings)( T1_Decoder decoder, - FT_Byte* base, - FT_UInt len ); - - } T1_Decoder_FuncsRec; - - - typedef struct T1_DecoderRec_ - { - T1_BuilderRec builder; - - FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; - FT_Long* top; - - T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; - T1_Decoder_Zone zone; - - FT_Service_PsCMaps psnames; /* for seac */ - FT_UInt num_glyphs; - FT_Byte** glyph_names; - - FT_Int lenIV; /* internal for sub routine calls */ - FT_UInt num_subrs; - FT_Byte** subrs; - FT_PtrDist* subrs_len; /* array of subrs length (optional) */ - - FT_Matrix font_matrix; - FT_Vector font_offset; - - FT_Int flex_state; - FT_Int num_flex_vectors; - FT_Vector flex_vectors[7]; - - PS_Blend blend; /* for multiple master support */ - - FT_Render_Mode hint_mode; - - T1_Decoder_Callback parse_callback; - T1_Decoder_FuncsRec funcs; - - FT_Long* buildchar; - FT_UInt len_buildchar; - - FT_Bool seac; - - } T1_DecoderRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** AFM PARSER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct AFM_ParserRec_* AFM_Parser; - - typedef struct AFM_Parser_FuncsRec_ - { - FT_Error - (*init)( AFM_Parser parser, - FT_Memory memory, - FT_Byte* base, - FT_Byte* limit ); - - void - (*done)( AFM_Parser parser ); - - FT_Error - (*parse)( AFM_Parser parser ); - - } AFM_Parser_FuncsRec; - - - typedef struct AFM_StreamRec_* AFM_Stream; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* AFM_ParserRec */ - /* */ - /* <Description> */ - /* An AFM_Parser is a parser for the AFM files. */ - /* */ - /* <Fields> */ - /* memory :: The object used for memory operations (alloc and */ - /* realloc). */ - /* */ - /* stream :: This is an opaque object. */ - /* */ - /* FontInfo :: The result will be stored here. */ - /* */ - /* get_index :: A user provided function to get a glyph index by its */ - /* name. */ - /* */ - typedef struct AFM_ParserRec_ - { - FT_Memory memory; - AFM_Stream stream; - - AFM_FontInfo FontInfo; - - FT_Int - (*get_index)( const char* name, - FT_Offset len, - void* user_data ); - - void* user_data; - - } AFM_ParserRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 CHARMAPS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes; - - typedef struct T1_CMap_ClassesRec_ - { - FT_CMap_Class standard; - FT_CMap_Class expert; - FT_CMap_Class custom; - FT_CMap_Class unicode; - - } T1_CMap_ClassesRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PSAux Module Interface *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct PSAux_ServiceRec_ - { - /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */ - const PS_Table_FuncsRec* ps_table_funcs; - const PS_Parser_FuncsRec* ps_parser_funcs; - const T1_Builder_FuncsRec* t1_builder_funcs; - const T1_Decoder_FuncsRec* t1_decoder_funcs; - - void - (*t1_decrypt)( FT_Byte* buffer, - FT_Offset length, - FT_UShort seed ); - - T1_CMap_Classes t1_cmap_classes; - - /* fields after this comment line were added after version 2.1.10 */ - const AFM_Parser_FuncsRec* afm_parser_funcs; - - } PSAux_ServiceRec, *PSAux_Service; - - /* backwards-compatible type definition */ - typedef PSAux_ServiceRec PSAux_Interface; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Some convenience functions *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define IS_PS_NEWLINE( ch ) \ - ( (ch) == '\r' || \ - (ch) == '\n' ) - -#define IS_PS_SPACE( ch ) \ - ( (ch) == ' ' || \ - IS_PS_NEWLINE( ch ) || \ - (ch) == '\t' || \ - (ch) == '\f' || \ - (ch) == '\0' ) - -#define IS_PS_SPECIAL( ch ) \ - ( (ch) == '/' || \ - (ch) == '(' || (ch) == ')' || \ - (ch) == '<' || (ch) == '>' || \ - (ch) == '[' || (ch) == ']' || \ - (ch) == '{' || (ch) == '}' || \ - (ch) == '%' ) - -#define IS_PS_DELIM( ch ) \ - ( IS_PS_SPACE( ch ) || \ - IS_PS_SPECIAL( ch ) ) - -#define IS_PS_DIGIT( ch ) \ - ( (ch) >= '0' && (ch) <= '9' ) - -#define IS_PS_XDIGIT( ch ) \ - ( IS_PS_DIGIT( ch ) || \ - ( (ch) >= 'A' && (ch) <= 'F' ) || \ - ( (ch) >= 'a' && (ch) <= 'f' ) ) - -#define IS_PS_BASE85( ch ) \ - ( (ch) >= '!' && (ch) <= 'u' ) - -#define IS_PS_TOKEN( cur, limit, token ) \ - ( (char)(cur)[0] == (token)[0] && \ - ( (cur) + sizeof ( (token) ) == (limit) || \ - ( (cur) + sizeof( (token) ) < (limit) && \ - IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \ - ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 ) - - -FT_END_HEADER - -#endif /* __PSAUX_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/pshints.h b/android/jni/ndk_modules/freetype/include/freetype/internal/pshints.h deleted file mode 100644 index 0c357651..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/pshints.h +++ /dev/null @@ -1,712 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshints.h */ -/* */ -/* Interface to Postscript-specific (Type 1 and Type 2) hints */ -/* recorders (specification only). These are used to support native */ -/* T1/T2 hints in the `type1', `cid', and `cff' font drivers. */ -/* */ -/* Copyright 2001, 2002, 2003, 2005, 2006, 2007, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __PSHINTS_H__ -#define __PSHINTS_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_TYPE1_TABLES_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** INTERNAL REPRESENTATION OF GLOBALS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct PSH_GlobalsRec_* PSH_Globals; - - typedef FT_Error - (*PSH_Globals_NewFunc)( FT_Memory memory, - T1_Private* private_dict, - PSH_Globals* aglobals ); - - typedef FT_Error - (*PSH_Globals_SetScaleFunc)( PSH_Globals globals, - FT_Fixed x_scale, - FT_Fixed y_scale, - FT_Fixed x_delta, - FT_Fixed y_delta ); - - typedef void - (*PSH_Globals_DestroyFunc)( PSH_Globals globals ); - - - typedef struct PSH_Globals_FuncsRec_ - { - PSH_Globals_NewFunc create; - PSH_Globals_SetScaleFunc set_scale; - PSH_Globals_DestroyFunc destroy; - - } PSH_Globals_FuncsRec, *PSH_Globals_Funcs; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PUBLIC TYPE 1 HINTS RECORDER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /************************************************************************* - * - * @type: - * T1_Hints - * - * @description: - * This is a handle to an opaque structure used to record glyph hints - * from a Type 1 character glyph character string. - * - * The methods used to operate on this object are defined by the - * @T1_Hints_FuncsRec structure. Recording glyph hints is normally - * achieved through the following scheme: - * - * - Open a new hint recording session by calling the `open' method. - * This rewinds the recorder and prepare it for new input. - * - * - For each hint found in the glyph charstring, call the corresponding - * method (`stem', `stem3', or `reset'). Note that these functions do - * not return an error code. - * - * - Close the recording session by calling the `close' method. It - * returns an error code if the hints were invalid or something - * strange happened (e.g., memory shortage). - * - * The hints accumulated in the object can later be used by the - * PostScript hinter. - * - */ - typedef struct T1_HintsRec_* T1_Hints; - - - /************************************************************************* - * - * @type: - * T1_Hints_Funcs - * - * @description: - * A pointer to the @T1_Hints_FuncsRec structure that defines the API of - * a given @T1_Hints object. - * - */ - typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs; - - - /************************************************************************* - * - * @functype: - * T1_Hints_OpenFunc - * - * @description: - * A method of the @T1_Hints class used to prepare it for a new Type 1 - * hints recording session. - * - * @input: - * hints :: - * A handle to the Type 1 hints recorder. - * - * @note: - * You should always call the @T1_Hints_CloseFunc method in order to - * close an opened recording session. - * - */ - typedef void - (*T1_Hints_OpenFunc)( T1_Hints hints ); - - - /************************************************************************* - * - * @functype: - * T1_Hints_SetStemFunc - * - * @description: - * A method of the @T1_Hints class used to record a new horizontal or - * vertical stem. This corresponds to the Type 1 `hstem' and `vstem' - * operators. - * - * @input: - * hints :: - * A handle to the Type 1 hints recorder. - * - * dimension :: - * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). - * - * coords :: - * Array of 2 coordinates in 16.16 format, used as (position,length) - * stem descriptor. - * - * @note: - * Use vertical coordinates (y) for horizontal stems (dim=0). Use - * horizontal coordinates (x) for vertical stems (dim=1). - * - * `coords[0]' is the absolute stem position (lowest coordinate); - * `coords[1]' is the length. - * - * The length can be negative, in which case it must be either -20 or - * -21. It is interpreted as a `ghost' stem, according to the Type 1 - * specification. - * - * If the length is -21 (corresponding to a bottom ghost stem), then - * the real stem position is `coords[0]+coords[1]'. - * - */ - typedef void - (*T1_Hints_SetStemFunc)( T1_Hints hints, - FT_UInt dimension, - FT_Fixed* coords ); - - - /************************************************************************* - * - * @functype: - * T1_Hints_SetStem3Func - * - * @description: - * A method of the @T1_Hints class used to record three - * counter-controlled horizontal or vertical stems at once. - * - * @input: - * hints :: - * A handle to the Type 1 hints recorder. - * - * dimension :: - * 0 for horizontal stems, 1 for vertical ones. - * - * coords :: - * An array of 6 values in 16.16 format, holding 3 (position,length) - * pairs for the counter-controlled stems. - * - * @note: - * Use vertical coordinates (y) for horizontal stems (dim=0). Use - * horizontal coordinates (x) for vertical stems (dim=1). - * - * The lengths cannot be negative (ghost stems are never - * counter-controlled). - * - */ - typedef void - (*T1_Hints_SetStem3Func)( T1_Hints hints, - FT_UInt dimension, - FT_Fixed* coords ); - - - /************************************************************************* - * - * @functype: - * T1_Hints_ResetFunc - * - * @description: - * A method of the @T1_Hints class used to reset the stems hints in a - * recording session. - * - * @input: - * hints :: - * A handle to the Type 1 hints recorder. - * - * end_point :: - * The index of the last point in the input glyph in which the - * previously defined hints apply. - * - */ - typedef void - (*T1_Hints_ResetFunc)( T1_Hints hints, - FT_UInt end_point ); - - - /************************************************************************* - * - * @functype: - * T1_Hints_CloseFunc - * - * @description: - * A method of the @T1_Hints class used to close a hint recording - * session. - * - * @input: - * hints :: - * A handle to the Type 1 hints recorder. - * - * end_point :: - * The index of the last point in the input glyph. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * The error code is set to indicate that an error occurred during the - * recording session. - * - */ - typedef FT_Error - (*T1_Hints_CloseFunc)( T1_Hints hints, - FT_UInt end_point ); - - - /************************************************************************* - * - * @functype: - * T1_Hints_ApplyFunc - * - * @description: - * A method of the @T1_Hints class used to apply hints to the - * corresponding glyph outline. Must be called once all hints have been - * recorded. - * - * @input: - * hints :: - * A handle to the Type 1 hints recorder. - * - * outline :: - * A pointer to the target outline descriptor. - * - * globals :: - * The hinter globals for this font. - * - * hint_mode :: - * Hinting information. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * On input, all points within the outline are in font coordinates. On - * output, they are in 1/64th of pixels. - * - * The scaling transformation is taken from the `globals' object which - * must correspond to the same font as the glyph. - * - */ - typedef FT_Error - (*T1_Hints_ApplyFunc)( T1_Hints hints, - FT_Outline* outline, - PSH_Globals globals, - FT_Render_Mode hint_mode ); - - - /************************************************************************* - * - * @struct: - * T1_Hints_FuncsRec - * - * @description: - * The structure used to provide the API to @T1_Hints objects. - * - * @fields: - * hints :: - * A handle to the T1 Hints recorder. - * - * open :: - * The function to open a recording session. - * - * close :: - * The function to close a recording session. - * - * stem :: - * The function to set a simple stem. - * - * stem3 :: - * The function to set counter-controlled stems. - * - * reset :: - * The function to reset stem hints. - * - * apply :: - * The function to apply the hints to the corresponding glyph outline. - * - */ - typedef struct T1_Hints_FuncsRec_ - { - T1_Hints hints; - T1_Hints_OpenFunc open; - T1_Hints_CloseFunc close; - T1_Hints_SetStemFunc stem; - T1_Hints_SetStem3Func stem3; - T1_Hints_ResetFunc reset; - T1_Hints_ApplyFunc apply; - - } T1_Hints_FuncsRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PUBLIC TYPE 2 HINTS RECORDER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /************************************************************************* - * - * @type: - * T2_Hints - * - * @description: - * This is a handle to an opaque structure used to record glyph hints - * from a Type 2 character glyph character string. - * - * The methods used to operate on this object are defined by the - * @T2_Hints_FuncsRec structure. Recording glyph hints is normally - * achieved through the following scheme: - * - * - Open a new hint recording session by calling the `open' method. - * This rewinds the recorder and prepare it for new input. - * - * - For each hint found in the glyph charstring, call the corresponding - * method (`stems', `hintmask', `counters'). Note that these - * functions do not return an error code. - * - * - Close the recording session by calling the `close' method. It - * returns an error code if the hints were invalid or something - * strange happened (e.g., memory shortage). - * - * The hints accumulated in the object can later be used by the - * Postscript hinter. - * - */ - typedef struct T2_HintsRec_* T2_Hints; - - - /************************************************************************* - * - * @type: - * T2_Hints_Funcs - * - * @description: - * A pointer to the @T2_Hints_FuncsRec structure that defines the API of - * a given @T2_Hints object. - * - */ - typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs; - - - /************************************************************************* - * - * @functype: - * T2_Hints_OpenFunc - * - * @description: - * A method of the @T2_Hints class used to prepare it for a new Type 2 - * hints recording session. - * - * @input: - * hints :: - * A handle to the Type 2 hints recorder. - * - * @note: - * You should always call the @T2_Hints_CloseFunc method in order to - * close an opened recording session. - * - */ - typedef void - (*T2_Hints_OpenFunc)( T2_Hints hints ); - - - /************************************************************************* - * - * @functype: - * T2_Hints_StemsFunc - * - * @description: - * A method of the @T2_Hints class used to set the table of stems in - * either the vertical or horizontal dimension. Equivalent to the - * `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators. - * - * @input: - * hints :: - * A handle to the Type 2 hints recorder. - * - * dimension :: - * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). - * - * count :: - * The number of stems. - * - * coords :: - * An array of `count' (position,length) pairs in 16.16 format. - * - * @note: - * Use vertical coordinates (y) for horizontal stems (dim=0). Use - * horizontal coordinates (x) for vertical stems (dim=1). - * - * There are `2*count' elements in the `coords' array. Each even - * element is an absolute position in font units, each odd element is a - * length in font units. - * - * A length can be negative, in which case it must be either -20 or - * -21. It is interpreted as a `ghost' stem, according to the Type 1 - * specification. - * - */ - typedef void - (*T2_Hints_StemsFunc)( T2_Hints hints, - FT_UInt dimension, - FT_UInt count, - FT_Fixed* coordinates ); - - - /************************************************************************* - * - * @functype: - * T2_Hints_MaskFunc - * - * @description: - * A method of the @T2_Hints class used to set a given hintmask (this - * corresponds to the `hintmask' Type 2 operator). - * - * @input: - * hints :: - * A handle to the Type 2 hints recorder. - * - * end_point :: - * The glyph index of the last point to which the previously defined - * or activated hints apply. - * - * bit_count :: - * The number of bits in the hint mask. - * - * bytes :: - * An array of bytes modelling the hint mask. - * - * @note: - * If the hintmask starts the charstring (before any glyph point - * definition), the value of `end_point' should be 0. - * - * `bit_count' is the number of meaningful bits in the `bytes' array; it - * must be equal to the total number of hints defined so far (i.e., - * horizontal+verticals). - * - * The `bytes' array can come directly from the Type 2 charstring and - * respects the same format. - * - */ - typedef void - (*T2_Hints_MaskFunc)( T2_Hints hints, - FT_UInt end_point, - FT_UInt bit_count, - const FT_Byte* bytes ); - - - /************************************************************************* - * - * @functype: - * T2_Hints_CounterFunc - * - * @description: - * A method of the @T2_Hints class used to set a given counter mask - * (this corresponds to the `hintmask' Type 2 operator). - * - * @input: - * hints :: - * A handle to the Type 2 hints recorder. - * - * end_point :: - * A glyph index of the last point to which the previously defined or - * active hints apply. - * - * bit_count :: - * The number of bits in the hint mask. - * - * bytes :: - * An array of bytes modelling the hint mask. - * - * @note: - * If the hintmask starts the charstring (before any glyph point - * definition), the value of `end_point' should be 0. - * - * `bit_count' is the number of meaningful bits in the `bytes' array; it - * must be equal to the total number of hints defined so far (i.e., - * horizontal+verticals). - * - * The `bytes' array can come directly from the Type 2 charstring and - * respects the same format. - * - */ - typedef void - (*T2_Hints_CounterFunc)( T2_Hints hints, - FT_UInt bit_count, - const FT_Byte* bytes ); - - - /************************************************************************* - * - * @functype: - * T2_Hints_CloseFunc - * - * @description: - * A method of the @T2_Hints class used to close a hint recording - * session. - * - * @input: - * hints :: - * A handle to the Type 2 hints recorder. - * - * end_point :: - * The index of the last point in the input glyph. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * The error code is set to indicate that an error occurred during the - * recording session. - * - */ - typedef FT_Error - (*T2_Hints_CloseFunc)( T2_Hints hints, - FT_UInt end_point ); - - - /************************************************************************* - * - * @functype: - * T2_Hints_ApplyFunc - * - * @description: - * A method of the @T2_Hints class used to apply hints to the - * corresponding glyph outline. Must be called after the `close' - * method. - * - * @input: - * hints :: - * A handle to the Type 2 hints recorder. - * - * outline :: - * A pointer to the target outline descriptor. - * - * globals :: - * The hinter globals for this font. - * - * hint_mode :: - * Hinting information. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * On input, all points within the outline are in font coordinates. On - * output, they are in 1/64th of pixels. - * - * The scaling transformation is taken from the `globals' object which - * must correspond to the same font than the glyph. - * - */ - typedef FT_Error - (*T2_Hints_ApplyFunc)( T2_Hints hints, - FT_Outline* outline, - PSH_Globals globals, - FT_Render_Mode hint_mode ); - - - /************************************************************************* - * - * @struct: - * T2_Hints_FuncsRec - * - * @description: - * The structure used to provide the API to @T2_Hints objects. - * - * @fields: - * hints :: - * A handle to the T2 hints recorder object. - * - * open :: - * The function to open a recording session. - * - * close :: - * The function to close a recording session. - * - * stems :: - * The function to set the dimension's stems table. - * - * hintmask :: - * The function to set hint masks. - * - * counter :: - * The function to set counter masks. - * - * apply :: - * The function to apply the hints on the corresponding glyph outline. - * - */ - typedef struct T2_Hints_FuncsRec_ - { - T2_Hints hints; - T2_Hints_OpenFunc open; - T2_Hints_CloseFunc close; - T2_Hints_StemsFunc stems; - T2_Hints_MaskFunc hintmask; - T2_Hints_CounterFunc counter; - T2_Hints_ApplyFunc apply; - - } T2_Hints_FuncsRec; - - - /* */ - - - typedef struct PSHinter_Interface_ - { - PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module ); - T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module ); - T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module ); - - } PSHinter_Interface; - - typedef PSHinter_Interface* PSHinter_Service; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_PSHINTER_INTERFACE(class_, get_globals_funcs_, \ - get_t1_funcs_, get_t2_funcs_) \ - static const PSHinter_Interface class_ = \ - { \ - get_globals_funcs_, get_t1_funcs_, get_t2_funcs_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_PSHINTER_INTERFACE(class_, get_globals_funcs_, \ - get_t1_funcs_, get_t2_funcs_) \ - void \ - FT_Init_Class_##class_( FT_Library library, \ - PSHinter_Interface* clazz) \ - { \ - FT_UNUSED(library); \ - clazz->get_globals_funcs = get_globals_funcs_; \ - clazz->get_t1_funcs = get_t1_funcs_; \ - clazz->get_t2_funcs = get_t2_funcs_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - -FT_END_HEADER - -#endif /* __PSHINTS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svbdf.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svbdf.h deleted file mode 100644 index 92642391..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svbdf.h +++ /dev/null @@ -1,77 +0,0 @@ -/***************************************************************************/ -/* */ -/* svbdf.h */ -/* */ -/* The FreeType BDF services (specification). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVBDF_H__ -#define __SVBDF_H__ - -#include FT_BDF_H -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_BDF "bdf" - - typedef FT_Error - (*FT_BDF_GetCharsetIdFunc)( FT_Face face, - const char* *acharset_encoding, - const char* *acharset_registry ); - - typedef FT_Error - (*FT_BDF_GetPropertyFunc)( FT_Face face, - const char* prop_name, - BDF_PropertyRec *aproperty ); - - - FT_DEFINE_SERVICE( BDF ) - { - FT_BDF_GetCharsetIdFunc get_charset_id; - FT_BDF_GetPropertyFunc get_property; - }; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_BDFRec(class_, get_charset_id_, get_property_) \ - static const FT_Service_BDFRec class_ = \ - { \ - get_charset_id_, get_property_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_BDFRec(class_, get_charset_id_, get_property_) \ - void \ - FT_Init_Class_##class_( FT_Service_BDFRec* clazz ) \ - { \ - clazz->get_charset_id = get_charset_id_; \ - clazz->get_property = get_property_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVBDF_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svcid.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svcid.h deleted file mode 100644 index 9b874b5e..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svcid.h +++ /dev/null @@ -1,83 +0,0 @@ -/***************************************************************************/ -/* */ -/* svcid.h */ -/* */ -/* The FreeType CID font services (specification). */ -/* */ -/* Copyright 2007, 2009 by Derek Clegg, Michael Toftdal. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVCID_H__ -#define __SVCID_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_CID "CID" - - typedef FT_Error - (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face face, - const char* *registry, - const char* *ordering, - FT_Int *supplement ); - typedef FT_Error - (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face face, - FT_Bool *is_cid ); - typedef FT_Error - (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face face, - FT_UInt glyph_index, - FT_UInt *cid ); - - FT_DEFINE_SERVICE( CID ) - { - FT_CID_GetRegistryOrderingSupplementFunc get_ros; - FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid; - FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index; - }; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_CIDREC(class_, get_ros_, \ - get_is_cid_, get_cid_from_glyph_index_ ) \ - static const FT_Service_CIDRec class_ = \ - { \ - get_ros_, get_is_cid_, get_cid_from_glyph_index_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_CIDREC(class_, get_ros_, \ - get_is_cid_, get_cid_from_glyph_index_ ) \ - void \ - FT_Init_Class_##class_( FT_Library library, \ - FT_Service_CIDRec* clazz) \ - { \ - FT_UNUSED(library); \ - clazz->get_ros = get_ros_; \ - clazz->get_is_cid = get_is_cid_; \ - clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVCID_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svgldict.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svgldict.h deleted file mode 100644 index d66a41d5..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svgldict.h +++ /dev/null @@ -1,82 +0,0 @@ -/***************************************************************************/ -/* */ -/* svgldict.h */ -/* */ -/* The FreeType glyph dictionary services (specification). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVGLDICT_H__ -#define __SVGLDICT_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - - /* - * A service used to retrieve glyph names, as well as to find the - * index of a given glyph name in a font. - * - */ - -#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict" - - - typedef FT_Error - (*FT_GlyphDict_GetNameFunc)( FT_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ); - - typedef FT_UInt - (*FT_GlyphDict_NameIndexFunc)( FT_Face face, - FT_String* glyph_name ); - - - FT_DEFINE_SERVICE( GlyphDict ) - { - FT_GlyphDict_GetNameFunc get_name; - FT_GlyphDict_NameIndexFunc name_index; /* optional */ - }; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_GLYPHDICTREC(class_, get_name_, name_index_) \ - static const FT_Service_GlyphDictRec class_ = \ - { \ - get_name_, name_index_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_GLYPHDICTREC(class_, get_name_, name_index_) \ - void \ - FT_Init_Class_##class_( FT_Library library, \ - FT_Service_GlyphDictRec* clazz) \ - { \ - FT_UNUSED(library); \ - clazz->get_name = get_name_; \ - clazz->name_index = name_index_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVGLDICT_H__ */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svgxval.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svgxval.h deleted file mode 100644 index 2cdab506..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svgxval.h +++ /dev/null @@ -1,72 +0,0 @@ -/***************************************************************************/ -/* */ -/* svgxval.h */ -/* */ -/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ -/* */ -/* Copyright 2004, 2005 by */ -/* Masatake YAMATO, Red Hat K.K., */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* */ -/* gxvalid is derived from both gxlayout module and otvalid module. */ -/* Development of gxlayout is supported by the Information-technology */ -/* Promotion Agency(IPA), Japan. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVGXVAL_H__ -#define __SVGXVAL_H__ - -#include FT_GX_VALIDATE_H -#include FT_INTERNAL_VALIDATE_H - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_GX_VALIDATE "truetypegx-validate" -#define FT_SERVICE_ID_CLASSICKERN_VALIDATE "classickern-validate" - - typedef FT_Error - (*gxv_validate_func)( FT_Face face, - FT_UInt gx_flags, - FT_Bytes tables[FT_VALIDATE_GX_LENGTH], - FT_UInt table_length ); - - - typedef FT_Error - (*ckern_validate_func)( FT_Face face, - FT_UInt ckern_flags, - FT_Bytes *ckern_table ); - - - FT_DEFINE_SERVICE( GXvalidate ) - { - gxv_validate_func validate; - }; - - FT_DEFINE_SERVICE( CKERNvalidate ) - { - ckern_validate_func validate; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVGXVAL_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svkern.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svkern.h deleted file mode 100644 index 1488adf4..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svkern.h +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************/ -/* */ -/* svkern.h */ -/* */ -/* The FreeType Kerning service (specification). */ -/* */ -/* Copyright 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVKERN_H__ -#define __SVKERN_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H - - -FT_BEGIN_HEADER - -#define FT_SERVICE_ID_KERNING "kerning" - - - typedef FT_Error - (*FT_Kerning_TrackGetFunc)( FT_Face face, - FT_Fixed point_size, - FT_Int degree, - FT_Fixed* akerning ); - - FT_DEFINE_SERVICE( Kerning ) - { - FT_Kerning_TrackGetFunc get_track; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVKERN_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svmm.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svmm.h deleted file mode 100644 index 66e1da22..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svmm.h +++ /dev/null @@ -1,104 +0,0 @@ -/***************************************************************************/ -/* */ -/* svmm.h */ -/* */ -/* The FreeType Multiple Masters and GX var services (specification). */ -/* */ -/* Copyright 2003, 2004 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVMM_H__ -#define __SVMM_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - - /* - * A service used to manage multiple-masters data in a given face. - * - * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H). - * - */ - -#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters" - - - typedef FT_Error - (*FT_Get_MM_Func)( FT_Face face, - FT_Multi_Master* master ); - - typedef FT_Error - (*FT_Get_MM_Var_Func)( FT_Face face, - FT_MM_Var* *master ); - - typedef FT_Error - (*FT_Set_MM_Design_Func)( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ); - - typedef FT_Error - (*FT_Set_Var_Design_Func)( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - typedef FT_Error - (*FT_Set_MM_Blend_Func)( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ); - - - FT_DEFINE_SERVICE( MultiMasters ) - { - FT_Get_MM_Func get_mm; - FT_Set_MM_Design_Func set_mm_design; - FT_Set_MM_Blend_Func set_mm_blend; - FT_Get_MM_Var_Func get_mm_var; - FT_Set_Var_Design_Func set_var_design; - }; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_MULTIMASTERSREC(class_, get_mm_, set_mm_design_, \ - set_mm_blend_, get_mm_var_, set_var_design_) \ - static const FT_Service_MultiMastersRec class_ = \ - { \ - get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_MULTIMASTERSREC(class_, get_mm_, set_mm_design_, \ - set_mm_blend_, get_mm_var_, set_var_design_) \ - void \ - FT_Init_Class_##class_( FT_Service_MultiMastersRec* clazz ) \ - { \ - clazz->get_mm = get_mm_; \ - clazz->set_mm_design = set_mm_design_; \ - clazz->set_mm_blend = set_mm_blend_; \ - clazz->get_mm_var = get_mm_var_; \ - clazz->set_var_design = set_var_design_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - -#endif /* __SVMM_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svotval.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svotval.h deleted file mode 100644 index 970bbd57..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svotval.h +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* svotval.h */ -/* */ -/* The FreeType OpenType validation service (specification). */ -/* */ -/* Copyright 2004, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVOTVAL_H__ -#define __SVOTVAL_H__ - -#include FT_OPENTYPE_VALIDATE_H -#include FT_INTERNAL_VALIDATE_H - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_OPENTYPE_VALIDATE "opentype-validate" - - - typedef FT_Error - (*otv_validate_func)( FT_Face volatile face, - FT_UInt ot_flags, - FT_Bytes *base, - FT_Bytes *gdef, - FT_Bytes *gpos, - FT_Bytes *gsub, - FT_Bytes *jstf ); - - - FT_DEFINE_SERVICE( OTvalidate ) - { - otv_validate_func validate; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVOTVAL_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpfr.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpfr.h deleted file mode 100644 index 462786f9..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpfr.h +++ /dev/null @@ -1,66 +0,0 @@ -/***************************************************************************/ -/* */ -/* svpfr.h */ -/* */ -/* Internal PFR service functions (specification). */ -/* */ -/* Copyright 2003, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVPFR_H__ -#define __SVPFR_H__ - -#include FT_PFR_H -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics" - - - typedef FT_Error - (*FT_PFR_GetMetricsFunc)( FT_Face face, - FT_UInt *aoutline, - FT_UInt *ametrics, - FT_Fixed *ax_scale, - FT_Fixed *ay_scale ); - - typedef FT_Error - (*FT_PFR_GetKerningFunc)( FT_Face face, - FT_UInt left, - FT_UInt right, - FT_Vector *avector ); - - typedef FT_Error - (*FT_PFR_GetAdvanceFunc)( FT_Face face, - FT_UInt gindex, - FT_Pos *aadvance ); - - - FT_DEFINE_SERVICE( PfrMetrics ) - { - FT_PFR_GetMetricsFunc get_metrics; - FT_PFR_GetKerningFunc get_kerning; - FT_PFR_GetAdvanceFunc get_advance; - - }; - - /* */ - -FT_END_HEADER - -#endif /* __SVPFR_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpostnm.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpostnm.h deleted file mode 100644 index 106c54f8..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpostnm.h +++ /dev/null @@ -1,79 +0,0 @@ -/***************************************************************************/ -/* */ -/* svpostnm.h */ -/* */ -/* The FreeType PostScript name services (specification). */ -/* */ -/* Copyright 2003, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVPOSTNM_H__ -#define __SVPOSTNM_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - /* - * A trivial service used to retrieve the PostScript name of a given - * font when available. The `get_name' field should never be NULL. - * - * The corresponding function can return NULL to indicate that the - * PostScript name is not available. - * - * The name is owned by the face and will be destroyed with it. - */ - -#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name" - - - typedef const char* - (*FT_PsName_GetFunc)( FT_Face face ); - - - FT_DEFINE_SERVICE( PsFontName ) - { - FT_PsName_GetFunc get_ps_font_name; - }; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_PSFONTNAMEREC(class_, get_ps_font_name_) \ - static const FT_Service_PsFontNameRec class_ = \ - { \ - get_ps_font_name_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_PSFONTNAMEREC(class_, get_ps_font_name_) \ - void \ - FT_Init_Class_##class_( FT_Library library, \ - FT_Service_PsFontNameRec* clazz) \ - { \ - FT_UNUSED(library); \ - clazz->get_ps_font_name = get_ps_font_name_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVPOSTNM_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpscmap.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpscmap.h deleted file mode 100644 index 961030cc..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpscmap.h +++ /dev/null @@ -1,164 +0,0 @@ -/***************************************************************************/ -/* */ -/* svpscmap.h */ -/* */ -/* The FreeType PostScript charmap service (specification). */ -/* */ -/* Copyright 2003, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVPSCMAP_H__ -#define __SVPSCMAP_H__ - -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps" - - - /* - * Adobe glyph name to unicode value. - */ - typedef FT_UInt32 - (*PS_Unicode_ValueFunc)( const char* glyph_name ); - - /* - * Macintosh name id to glyph name. NULL if invalid index. - */ - typedef const char* - (*PS_Macintosh_NameFunc)( FT_UInt name_index ); - - /* - * Adobe standard string ID to glyph name. NULL if invalid index. - */ - typedef const char* - (*PS_Adobe_Std_StringsFunc)( FT_UInt string_index ); - - - /* - * Simple unicode -> glyph index charmap built from font glyph names - * table. - */ - typedef struct PS_UniMap_ - { - FT_UInt32 unicode; /* bit 31 set: is glyph variant */ - FT_UInt glyph_index; - - } PS_UniMap; - - - typedef struct PS_UnicodesRec_* PS_Unicodes; - - typedef struct PS_UnicodesRec_ - { - FT_CMapRec cmap; - FT_UInt num_maps; - PS_UniMap* maps; - - } PS_UnicodesRec; - - - /* - * A function which returns a glyph name for a given index. Returns - * NULL if invalid index. - */ - typedef const char* - (*PS_GetGlyphNameFunc)( FT_Pointer data, - FT_UInt string_index ); - - /* - * A function used to release the glyph name returned by - * PS_GetGlyphNameFunc, when needed - */ - typedef void - (*PS_FreeGlyphNameFunc)( FT_Pointer data, - const char* name ); - - typedef FT_Error - (*PS_Unicodes_InitFunc)( FT_Memory memory, - PS_Unicodes unicodes, - FT_UInt num_glyphs, - PS_GetGlyphNameFunc get_glyph_name, - PS_FreeGlyphNameFunc free_glyph_name, - FT_Pointer glyph_data ); - - typedef FT_UInt - (*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes, - FT_UInt32 unicode ); - - typedef FT_UInt32 - (*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes, - FT_UInt32 *unicode ); - - - FT_DEFINE_SERVICE( PsCMaps ) - { - PS_Unicode_ValueFunc unicode_value; - - PS_Unicodes_InitFunc unicodes_init; - PS_Unicodes_CharIndexFunc unicodes_char_index; - PS_Unicodes_CharNextFunc unicodes_char_next; - - PS_Macintosh_NameFunc macintosh_name; - PS_Adobe_Std_StringsFunc adobe_std_strings; - const unsigned short* adobe_std_encoding; - const unsigned short* adobe_expert_encoding; - }; - - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_PSCMAPSREC(class_, unicode_value_, unicodes_init_, \ - unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ - adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_) \ - static const FT_Service_PsCMapsRec class_ = \ - { \ - unicode_value_, unicodes_init_, \ - unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ - adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_PSCMAPSREC(class_, unicode_value_, unicodes_init_, \ - unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ - adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_) \ - void \ - FT_Init_Class_##class_( FT_Library library, \ - FT_Service_PsCMapsRec* clazz) \ - { \ - FT_UNUSED(library); \ - clazz->unicode_value = unicode_value_; \ - clazz->unicodes_init = unicodes_init_; \ - clazz->unicodes_char_index = unicodes_char_index_; \ - clazz->unicodes_char_next = unicodes_char_next_; \ - clazz->macintosh_name = macintosh_name_; \ - clazz->adobe_std_strings = adobe_std_strings_; \ - clazz->adobe_std_encoding = adobe_std_encoding_; \ - clazz->adobe_expert_encoding = adobe_expert_encoding_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVPSCMAP_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpsinfo.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpsinfo.h deleted file mode 100644 index 91ba91e5..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svpsinfo.h +++ /dev/null @@ -1,92 +0,0 @@ -/***************************************************************************/ -/* */ -/* svpsinfo.h */ -/* */ -/* The FreeType PostScript info service (specification). */ -/* */ -/* Copyright 2003, 2004, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVPSINFO_H__ -#define __SVPSINFO_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_INTERNAL_TYPE1_TYPES_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info" - - - typedef FT_Error - (*PS_GetFontInfoFunc)( FT_Face face, - PS_FontInfoRec* afont_info ); - - typedef FT_Error - (*PS_GetFontExtraFunc)( FT_Face face, - PS_FontExtraRec* afont_extra ); - - typedef FT_Int - (*PS_HasGlyphNamesFunc)( FT_Face face ); - - typedef FT_Error - (*PS_GetFontPrivateFunc)( FT_Face face, - PS_PrivateRec* afont_private ); - - - FT_DEFINE_SERVICE( PsInfo ) - { - PS_GetFontInfoFunc ps_get_font_info; - PS_GetFontExtraFunc ps_get_font_extra; - PS_HasGlyphNamesFunc ps_has_glyph_names; - PS_GetFontPrivateFunc ps_get_font_private; - }; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_PSINFOREC(class_, get_font_info_, \ - ps_get_font_extra_, has_glyph_names_, get_font_private_) \ - static const FT_Service_PsInfoRec class_ = \ - { \ - get_font_info_, ps_get_font_extra_, has_glyph_names_, \ - get_font_private_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_PSINFOREC(class_, get_font_info_, \ - ps_get_font_extra_, has_glyph_names_, get_font_private_) \ - void \ - FT_Init_Class_##class_( FT_Library library, \ - FT_Service_PsInfoRec* clazz) \ - { \ - FT_UNUSED(library); \ - clazz->ps_get_font_info = get_font_info_; \ - clazz->ps_get_font_extra = ps_get_font_extra_; \ - clazz->ps_has_glyph_names = has_glyph_names_; \ - clazz->ps_get_font_private = get_font_private_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVPSINFO_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svsfnt.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svsfnt.h deleted file mode 100644 index 30bb1620..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svsfnt.h +++ /dev/null @@ -1,102 +0,0 @@ -/***************************************************************************/ -/* */ -/* svsfnt.h */ -/* */ -/* The FreeType SFNT table loading service (specification). */ -/* */ -/* Copyright 2003, 2004 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVSFNT_H__ -#define __SVSFNT_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H - - -FT_BEGIN_HEADER - - - /* - * SFNT table loading service. - */ - -#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table" - - - /* - * Used to implement FT_Load_Sfnt_Table(). - */ - typedef FT_Error - (*FT_SFNT_TableLoadFunc)( FT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte* buffer, - FT_ULong* length ); - - /* - * Used to implement FT_Get_Sfnt_Table(). - */ - typedef void* - (*FT_SFNT_TableGetFunc)( FT_Face face, - FT_Sfnt_Tag tag ); - - - /* - * Used to implement FT_Sfnt_Table_Info(). - */ - typedef FT_Error - (*FT_SFNT_TableInfoFunc)( FT_Face face, - FT_UInt idx, - FT_ULong *tag, - FT_ULong *offset, - FT_ULong *length ); - - - FT_DEFINE_SERVICE( SFNT_Table ) - { - FT_SFNT_TableLoadFunc load_table; - FT_SFNT_TableGetFunc get_table; - FT_SFNT_TableInfoFunc table_info; - }; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_SFNT_TABLEREC(class_, load_, get_, info_) \ - static const FT_Service_SFNT_TableRec class_ = \ - { \ - load_, get_, info_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_SFNT_TABLEREC(class_, load_, get_, info_) \ - void \ - FT_Init_Class_##class_( FT_Service_SFNT_TableRec* clazz ) \ - { \ - clazz->load_table = load_; \ - clazz->get_table = get_; \ - clazz->table_info = info_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - - -#endif /* __SVSFNT_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svttcmap.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svttcmap.h deleted file mode 100644 index 8af00351..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svttcmap.h +++ /dev/null @@ -1,106 +0,0 @@ -/***************************************************************************/ -/* */ -/* svttcmap.h */ -/* */ -/* The FreeType TrueType/sfnt cmap extra information service. */ -/* */ -/* Copyright 2003 by */ -/* Masatake YAMATO, Redhat K.K. */ -/* */ -/* Copyright 2003, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - -/* Development of this service is support of - Information-technology Promotion Agency, Japan. */ - -#ifndef __SVTTCMAP_H__ -#define __SVTTCMAP_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_TT_CMAP "tt-cmaps" - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_CMapInfo */ - /* */ - /* <Description> */ - /* A structure used to store TrueType/sfnt specific cmap information */ - /* which is not covered by the generic @FT_CharMap structure. This */ - /* structure can be accessed with the @FT_Get_TT_CMap_Info function. */ - /* */ - /* <Fields> */ - /* language :: */ - /* The language ID used in Mac fonts. Definitions of values are in */ - /* freetype/ttnameid.h. */ - /* */ - /* format :: */ - /* The cmap format. OpenType 1.5 defines the formats 0 (byte */ - /* encoding table), 2~(high-byte mapping through table), 4~(segment */ - /* mapping to delta values), 6~(trimmed table mapping), 8~(mixed */ - /* 16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented */ - /* coverage), and 14 (Unicode Variation Sequences). */ - /* */ - typedef struct TT_CMapInfo_ - { - FT_ULong language; - FT_Long format; - - } TT_CMapInfo; - - - typedef FT_Error - (*TT_CMap_Info_GetFunc)( FT_CharMap charmap, - TT_CMapInfo *cmap_info ); - - - FT_DEFINE_SERVICE( TTCMaps ) - { - TT_CMap_Info_GetFunc get_cmap_info; - }; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_TTCMAPSREC(class_, get_cmap_info_) \ - static const FT_Service_TTCMapsRec class_ = \ - { \ - get_cmap_info_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_TTCMAPSREC(class_, get_cmap_info_) \ - void \ - FT_Init_Class_##class_( FT_Library library, \ - FT_Service_TTCMapsRec* clazz) \ - { \ - FT_UNUSED(library); \ - clazz->get_cmap_info = get_cmap_info_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - -#endif /* __SVTTCMAP_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svtteng.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svtteng.h deleted file mode 100644 index 58e02a6f..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svtteng.h +++ /dev/null @@ -1,53 +0,0 @@ -/***************************************************************************/ -/* */ -/* svtteng.h */ -/* */ -/* The FreeType TrueType engine query service (specification). */ -/* */ -/* Copyright 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVTTENG_H__ -#define __SVTTENG_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - /* - * SFNT table loading service. - */ - -#define FT_SERVICE_ID_TRUETYPE_ENGINE "truetype-engine" - - /* - * Used to implement FT_Get_TrueType_Engine_Type - */ - - FT_DEFINE_SERVICE( TrueTypeEngine ) - { - FT_TrueTypeEngineType engine_type; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVTTENG_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svttglyf.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svttglyf.h deleted file mode 100644 index ab2dc9a9..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svttglyf.h +++ /dev/null @@ -1,67 +0,0 @@ -/***************************************************************************/ -/* */ -/* svttglyf.h */ -/* */ -/* The FreeType TrueType glyph service. */ -/* */ -/* Copyright 2007 by David Turner. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - -#ifndef __SVTTGLYF_H__ -#define __SVTTGLYF_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_TT_GLYF "tt-glyf" - - - typedef FT_ULong - (*TT_Glyf_GetLocationFunc)( FT_Face face, - FT_UInt gindex, - FT_ULong *psize ); - - FT_DEFINE_SERVICE( TTGlyf ) - { - TT_Glyf_GetLocationFunc get_location; - }; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_SERVICE_TTGLYFREC(class_, get_location_ ) \ - static const FT_Service_TTGlyfRec class_ = \ - { \ - get_location_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_SERVICE_TTGLYFREC(class_, get_location_ ) \ - void \ - FT_Init_Class_##class_( FT_Service_TTGlyfRec* clazz ) \ - { \ - clazz->get_location = get_location_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - - -FT_END_HEADER - -#endif /* __SVTTGLYF_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svwinfnt.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svwinfnt.h deleted file mode 100644 index 57f7765d..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svwinfnt.h +++ /dev/null @@ -1,50 +0,0 @@ -/***************************************************************************/ -/* */ -/* svwinfnt.h */ -/* */ -/* The FreeType Windows FNT/FONT service (specification). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVWINFNT_H__ -#define __SVWINFNT_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_WINFONTS_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_WINFNT "winfonts" - - typedef FT_Error - (*FT_WinFnt_GetHeaderFunc)( FT_Face face, - FT_WinFNT_HeaderRec *aheader ); - - - FT_DEFINE_SERVICE( WinFnt ) - { - FT_WinFnt_GetHeaderFunc get_header; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVWINFNT_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svxf86nm.h b/android/jni/ndk_modules/freetype/include/freetype/internal/services/svxf86nm.h deleted file mode 100644 index ca5d884a..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/services/svxf86nm.h +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* svxf86nm.h */ -/* */ -/* The FreeType XFree86 services (specification only). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVXF86NM_H__ -#define __SVXF86NM_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - - /* - * A trivial service used to return the name of a face's font driver, - * according to the XFree86 nomenclature. Note that the service data - * is a simple constant string pointer. - */ - -#define FT_SERVICE_ID_XF86_NAME "xf86-driver-name" - -#define FT_XF86_FORMAT_TRUETYPE "TrueType" -#define FT_XF86_FORMAT_TYPE_1 "Type 1" -#define FT_XF86_FORMAT_BDF "BDF" -#define FT_XF86_FORMAT_PCF "PCF" -#define FT_XF86_FORMAT_TYPE_42 "Type 42" -#define FT_XF86_FORMAT_CID "CID Type 1" -#define FT_XF86_FORMAT_CFF "CFF" -#define FT_XF86_FORMAT_PFR "PFR" -#define FT_XF86_FORMAT_WINFNT "Windows FNT" - - /* */ - - -FT_END_HEADER - - -#endif /* __SVXF86NM_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/sfnt.h b/android/jni/ndk_modules/freetype/include/freetype/internal/sfnt.h deleted file mode 100644 index 6326debd..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/sfnt.h +++ /dev/null @@ -1,897 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfnt.h */ -/* */ -/* High-level `sfnt' driver interface (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SFNT_H__ -#define __SFNT_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_DRIVER_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Init_Face_Func */ - /* */ - /* <Description> */ - /* First part of the SFNT face object initialization. This finds */ - /* the face in a SFNT file or collection, and load its format tag in */ - /* face->format_tag. */ - /* */ - /* <Input> */ - /* stream :: The input stream. */ - /* */ - /* face :: A handle to the target face object. */ - /* */ - /* face_index :: The index of the TrueType font, if we are opening a */ - /* collection. */ - /* */ - /* num_params :: The number of additional parameters. */ - /* */ - /* params :: Optional additional parameters. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The stream cursor must be at the font file's origin. */ - /* */ - /* This function recognizes fonts embedded in a `TrueType */ - /* collection'. */ - /* */ - /* Once the format tag has been validated by the font driver, it */ - /* should then call the TT_Load_Face_Func() callback to read the rest */ - /* of the SFNT tables in the object. */ - /* */ - typedef FT_Error - (*TT_Init_Face_Func)( FT_Stream stream, - TT_Face face, - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_Face_Func */ - /* */ - /* <Description> */ - /* Second part of the SFNT face object initialization. This loads */ - /* the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the */ - /* face object. */ - /* */ - /* <Input> */ - /* stream :: The input stream. */ - /* */ - /* face :: A handle to the target face object. */ - /* */ - /* face_index :: The index of the TrueType font, if we are opening a */ - /* collection. */ - /* */ - /* num_params :: The number of additional parameters. */ - /* */ - /* params :: Optional additional parameters. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* This function must be called after TT_Init_Face_Func(). */ - /* */ - typedef FT_Error - (*TT_Load_Face_Func)( FT_Stream stream, - TT_Face face, - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Done_Face_Func */ - /* */ - /* <Description> */ - /* A callback used to delete the common SFNT data from a face. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* <Note> */ - /* This function does NOT destroy the face object. */ - /* */ - typedef void - (*TT_Done_Face_Func)( TT_Face face ); - - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_SFNT_HeaderRec_Func */ - /* */ - /* <Description> */ - /* Loads the header of a SFNT font file. Supports collections. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* face_index :: The index of the TrueType font, if we are opening a */ - /* collection. */ - /* */ - /* <Output> */ - /* sfnt :: The SFNT header. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The stream cursor must be at the font file's origin. */ - /* */ - /* This function recognizes fonts embedded in a `TrueType */ - /* collection'. */ - /* */ - /* This function checks that the header is valid by looking at the */ - /* values of `search_range', `entry_selector', and `range_shift'. */ - /* */ - typedef FT_Error - (*TT_Load_SFNT_HeaderRec_Func)( TT_Face face, - FT_Stream stream, - FT_Long face_index, - SFNT_Header sfnt ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_Directory_Func */ - /* */ - /* <Description> */ - /* Loads the table directory into a face object. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* sfnt :: The SFNT header. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The stream cursor must be on the first byte after the 4-byte font */ - /* format tag. This is the case just after a call to */ - /* TT_Load_Format_Tag(). */ - /* */ - typedef FT_Error - (*TT_Load_Directory_Func)( TT_Face face, - FT_Stream stream, - SFNT_Header sfnt ); - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_Any_Func */ - /* */ - /* <Description> */ - /* Load any font table into client memory. */ - /* */ - /* <Input> */ - /* face :: The face object to look for. */ - /* */ - /* tag :: The tag of table to load. Use the value 0 if you want */ - /* to access the whole font file, else set this parameter */ - /* to a valid TrueType table tag that you can forge with */ - /* the MAKE_TT_TAG macro. */ - /* */ - /* offset :: The starting offset in the table (or the file if */ - /* tag == 0). */ - /* */ - /* length :: The address of the decision variable: */ - /* */ - /* If length == NULL: */ - /* Loads the whole table. Returns an error if */ - /* `offset' == 0! */ - /* */ - /* If *length == 0: */ - /* Exits immediately; returning the length of the given */ - /* table or of the font file, depending on the value of */ - /* `tag'. */ - /* */ - /* If *length != 0: */ - /* Loads the next `length' bytes of table or font, */ - /* starting at offset `offset' (in table or font too). */ - /* */ - /* <Output> */ - /* buffer :: The address of target buffer. */ - /* */ - /* <Return> */ - /* TrueType error code. 0 means success. */ - /* */ - typedef FT_Error - (*TT_Load_Any_Func)( TT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte *buffer, - FT_ULong* length ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Find_SBit_Image_Func */ - /* */ - /* <Description> */ - /* Check whether an embedded bitmap (an `sbit') exists for a given */ - /* glyph, at a given strike. */ - /* */ - /* <Input> */ - /* face :: The target face object. */ - /* */ - /* glyph_index :: The glyph index. */ - /* */ - /* strike_index :: The current strike index. */ - /* */ - /* <Output> */ - /* arange :: The SBit range containing the glyph index. */ - /* */ - /* astrike :: The SBit strike containing the glyph index. */ - /* */ - /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. Returns */ - /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */ - /* glyph. */ - /* */ - typedef FT_Error - (*TT_Find_SBit_Image_Func)( TT_Face face, - FT_UInt glyph_index, - FT_ULong strike_index, - TT_SBit_Range *arange, - TT_SBit_Strike *astrike, - FT_ULong *aglyph_offset ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_SBit_Metrics_Func */ - /* */ - /* <Description> */ - /* Get the big metrics for a given embedded bitmap. */ - /* */ - /* <Input> */ - /* stream :: The input stream. */ - /* */ - /* range :: The SBit range containing the glyph. */ - /* */ - /* <Output> */ - /* big_metrics :: A big SBit metrics structure for the glyph. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The stream cursor must be positioned at the glyph's offset within */ - /* the `EBDT' table before the call. */ - /* */ - /* If the image format uses variable metrics, the stream cursor is */ - /* positioned just after the metrics header in the `EBDT' table on */ - /* function exit. */ - /* */ - typedef FT_Error - (*TT_Load_SBit_Metrics_Func)( FT_Stream stream, - TT_SBit_Range range, - TT_SBit_Metrics metrics ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_SBit_Image_Func */ - /* */ - /* <Description> */ - /* Load a given glyph sbit image from the font resource. This also */ - /* returns its metrics. */ - /* */ - /* <Input> */ - /* face :: */ - /* The target face object. */ - /* */ - /* strike_index :: */ - /* The strike index. */ - /* */ - /* glyph_index :: */ - /* The current glyph index. */ - /* */ - /* load_flags :: */ - /* The current load flags. */ - /* */ - /* stream :: */ - /* The input stream. */ - /* */ - /* <Output> */ - /* amap :: */ - /* The target pixmap. */ - /* */ - /* ametrics :: */ - /* A big sbit metrics structure for the glyph image. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. Returns an error if no */ - /* glyph sbit exists for the index. */ - /* */ - /* <Note> */ - /* The `map.buffer' field is always freed before the glyph is loaded. */ - /* */ - typedef FT_Error - (*TT_Load_SBit_Image_Func)( TT_Face face, - FT_ULong strike_index, - FT_UInt glyph_index, - FT_UInt load_flags, - FT_Stream stream, - FT_Bitmap *amap, - TT_SBit_MetricsRec *ametrics ); - - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Set_SBit_Strike_OldFunc */ - /* */ - /* <Description> */ - /* Select an sbit strike for a given size request. */ - /* */ - /* <Input> */ - /* face :: The target face object. */ - /* */ - /* req :: The size request. */ - /* */ - /* <Output> */ - /* astrike_index :: The index of the sbit strike. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. Returns an error if no */ - /* sbit strike exists for the selected ppem values. */ - /* */ - typedef FT_Error - (*TT_Set_SBit_Strike_OldFunc)( TT_Face face, - FT_UInt x_ppem, - FT_UInt y_ppem, - FT_ULong* astrike_index ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_CharMap_Load_Func */ - /* */ - /* <Description> */ - /* Loads a given TrueType character map into memory. */ - /* */ - /* <Input> */ - /* face :: A handle to the parent face object. */ - /* */ - /* stream :: A handle to the current stream object. */ - /* */ - /* <InOut> */ - /* cmap :: A pointer to a cmap object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The function assumes that the stream is already in use (i.e., */ - /* opened). In case of error, all partially allocated tables are */ - /* released. */ - /* */ - typedef FT_Error - (*TT_CharMap_Load_Func)( TT_Face face, - void* cmap, - FT_Stream input ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_CharMap_Free_Func */ - /* */ - /* <Description> */ - /* Destroys a character mapping table. */ - /* */ - /* <Input> */ - /* face :: A handle to the parent face object. */ - /* */ - /* cmap :: A handle to a cmap object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - typedef FT_Error - (*TT_CharMap_Free_Func)( TT_Face face, - void* cmap ); - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Set_SBit_Strike_Func */ - /* */ - /* <Description> */ - /* Select an sbit strike for a given size request. */ - /* */ - /* <Input> */ - /* face :: The target face object. */ - /* */ - /* req :: The size request. */ - /* */ - /* <Output> */ - /* astrike_index :: The index of the sbit strike. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. Returns an error if no */ - /* sbit strike exists for the selected ppem values. */ - /* */ - typedef FT_Error - (*TT_Set_SBit_Strike_Func)( TT_Face face, - FT_Size_Request req, - FT_ULong* astrike_index ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_Strike_Metrics_Func */ - /* */ - /* <Description> */ - /* Load the metrics of a given strike. */ - /* */ - /* <Input> */ - /* face :: The target face object. */ - /* */ - /* strike_index :: The strike index. */ - /* */ - /* <Output> */ - /* metrics :: the metrics of the strike. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. Returns an error if no */ - /* such sbit strike exists. */ - /* */ - typedef FT_Error - (*TT_Load_Strike_Metrics_Func)( TT_Face face, - FT_ULong strike_index, - FT_Size_Metrics* metrics ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Get_PS_Name_Func */ - /* */ - /* <Description> */ - /* Get the PostScript glyph name of a glyph. */ - /* */ - /* <Input> */ - /* idx :: The glyph index. */ - /* */ - /* PSname :: The address of a string pointer. Will be NULL in case */ - /* of error, otherwise it is a pointer to the glyph name. */ - /* */ - /* You must not modify the returned string! */ - /* */ - /* <Output> */ - /* FreeType error code. 0 means success. */ - /* */ - typedef FT_Error - (*TT_Get_PS_Name_Func)( TT_Face face, - FT_UInt idx, - FT_String** PSname ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_Metrics_Func */ - /* */ - /* <Description> */ - /* Load a metrics table, which is a table with a horizontal and a */ - /* vertical version. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* vertical :: A boolean flag. If set, load the vertical one. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - typedef FT_Error - (*TT_Load_Metrics_Func)( TT_Face face, - FT_Stream stream, - FT_Bool vertical ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Get_Metrics_Func */ - /* */ - /* <Description> */ - /* Load the horizontal or vertical header in a face object. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* vertical :: A boolean flag. If set, load vertical metrics. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - typedef FT_Error - (*TT_Get_Metrics_Func)( TT_Face face, - FT_Bool vertical, - FT_UInt gindex, - FT_Short* abearing, - FT_UShort* aadvance ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Load_Table_Func */ - /* */ - /* <Description> */ - /* Load a given TrueType table. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The function uses `face->goto_table' to seek the stream to the */ - /* start of the table, except while loading the font directory. */ - /* */ - typedef FT_Error - (*TT_Load_Table_Func)( TT_Face face, - FT_Stream stream ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Free_Table_Func */ - /* */ - /* <Description> */ - /* Free a given TrueType table. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - typedef void - (*TT_Free_Table_Func)( TT_Face face ); - - - /* - * @functype: - * TT_Face_GetKerningFunc - * - * @description: - * Return the horizontal kerning value between two glyphs. - * - * @input: - * face :: A handle to the source face object. - * left_glyph :: The left glyph index. - * right_glyph :: The right glyph index. - * - * @return: - * The kerning value in font units. - */ - typedef FT_Int - (*TT_Face_GetKerningFunc)( TT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* SFNT_Interface */ - /* */ - /* <Description> */ - /* This structure holds pointers to the functions used to load and */ - /* free the basic tables that are required in a `sfnt' font file. */ - /* */ - /* <Fields> */ - /* Check the various xxx_Func() descriptions for details. */ - /* */ - typedef struct SFNT_Interface_ - { - TT_Loader_GotoTableFunc goto_table; - - TT_Init_Face_Func init_face; - TT_Load_Face_Func load_face; - TT_Done_Face_Func done_face; - FT_Module_Requester get_interface; - - TT_Load_Any_Func load_any; - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - TT_Load_SFNT_HeaderRec_Func load_sfnt_header; - TT_Load_Directory_Func load_directory; -#endif - - /* these functions are called by `load_face' but they can also */ - /* be called from external modules, if there is a need to do so */ - TT_Load_Table_Func load_head; - TT_Load_Metrics_Func load_hhea; - TT_Load_Table_Func load_cmap; - TT_Load_Table_Func load_maxp; - TT_Load_Table_Func load_os2; - TT_Load_Table_Func load_post; - - TT_Load_Table_Func load_name; - TT_Free_Table_Func free_name; - - /* optional tables */ -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - TT_Load_Table_Func load_hdmx_stub; - TT_Free_Table_Func free_hdmx_stub; -#endif - - /* this field was called `load_kerning' up to version 2.1.10 */ - TT_Load_Table_Func load_kern; - - TT_Load_Table_Func load_gasp; - TT_Load_Table_Func load_pclt; - - /* see `ttload.h'; this field was called `load_bitmap_header' up to */ - /* version 2.1.10 */ - TT_Load_Table_Func load_bhed; - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - /* see `ttsbit.h' */ - TT_Set_SBit_Strike_OldFunc set_sbit_strike_stub; - TT_Load_Table_Func load_sbits_stub; - - /* - * The following two fields appeared in version 2.1.8, and were placed - * between `load_sbits' and `load_sbit_image'. We support them as a - * special exception since they are used by Xfont library within the - * X.Org xserver, and because the probability that other rogue clients - * use the other version 2.1.7 fields below is _extremely_ low. - * - * Note that this forces us to disable an interesting memory-saving - * optimization though... - */ - - TT_Find_SBit_Image_Func find_sbit_image; - TT_Load_SBit_Metrics_Func load_sbit_metrics; - -#endif - - TT_Load_SBit_Image_Func load_sbit_image; - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - TT_Free_Table_Func free_sbits_stub; -#endif - - /* see `ttpost.h' */ - TT_Get_PS_Name_Func get_psname; - TT_Free_Table_Func free_psnames; - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - TT_CharMap_Load_Func load_charmap_stub; - TT_CharMap_Free_Func free_charmap_stub; -#endif - - /* starting here, the structure differs from version 2.1.7 */ - - /* this field was introduced in version 2.1.8, named `get_psname' */ - TT_Face_GetKerningFunc get_kerning; - - /* new elements introduced after version 2.1.10 */ - - /* load the font directory, i.e., the offset table and */ - /* the table directory */ - TT_Load_Table_Func load_font_dir; - TT_Load_Metrics_Func load_hmtx; - - TT_Load_Table_Func load_eblc; - TT_Free_Table_Func free_eblc; - - TT_Set_SBit_Strike_Func set_sbit_strike; - TT_Load_Strike_Metrics_Func load_strike_metrics; - - TT_Get_Metrics_Func get_metrics; - - } SFNT_Interface; - - - /* transitional */ - typedef SFNT_Interface* SFNT_Service; - -#ifndef FT_CONFIG_OPTION_PIC - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS -#define FT_DEFINE_DRIVERS_OLD_INTERNAL(a) \ - a, -#else - #define FT_DEFINE_DRIVERS_OLD_INTERNAL(a) -#endif -#define FT_INTERNAL(a) \ - a, - -#define FT_DEFINE_SFNT_INTERFACE(class_, \ - goto_table_, init_face_, load_face_, done_face_, get_interface_, \ - load_any_, load_sfnt_header_, load_directory_, load_head_, \ - load_hhea_, load_cmap_, load_maxp_, load_os2_, load_post_, \ - load_name_, free_name_, load_hdmx_stub_, free_hdmx_stub_, \ - load_kern_, load_gasp_, load_pclt_, load_bhed_, \ - set_sbit_strike_stub_, load_sbits_stub_, find_sbit_image_, \ - load_sbit_metrics_, load_sbit_image_, free_sbits_stub_, \ - get_psname_, free_psnames_, load_charmap_stub_, free_charmap_stub_, \ - get_kerning_, load_font_dir_, load_hmtx_, load_eblc_, free_eblc_, \ - set_sbit_strike_, load_strike_metrics_, get_metrics_ ) \ - static const SFNT_Interface class_ = \ - { \ - FT_INTERNAL(goto_table_) \ - FT_INTERNAL(init_face_) \ - FT_INTERNAL(load_face_) \ - FT_INTERNAL(done_face_) \ - FT_INTERNAL(get_interface_) \ - FT_INTERNAL(load_any_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sfnt_header_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(load_directory_) \ - FT_INTERNAL(load_head_) \ - FT_INTERNAL(load_hhea_) \ - FT_INTERNAL(load_cmap_) \ - FT_INTERNAL(load_maxp_) \ - FT_INTERNAL(load_os2_) \ - FT_INTERNAL(load_post_) \ - FT_INTERNAL(load_name_) \ - FT_INTERNAL(free_name_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(load_hdmx_stub_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(free_hdmx_stub_) \ - FT_INTERNAL(load_kern_) \ - FT_INTERNAL(load_gasp_) \ - FT_INTERNAL(load_pclt_) \ - FT_INTERNAL(load_bhed_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(set_sbit_strike_stub_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbits_stub_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(find_sbit_image_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbit_metrics_) \ - FT_INTERNAL(load_sbit_image_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(free_sbits_stub_) \ - FT_INTERNAL(get_psname_) \ - FT_INTERNAL(free_psnames_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(load_charmap_stub_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(free_charmap_stub_) \ - FT_INTERNAL(get_kerning_) \ - FT_INTERNAL(load_font_dir_) \ - FT_INTERNAL(load_hmtx_) \ - FT_INTERNAL(load_eblc_) \ - FT_INTERNAL(free_eblc_) \ - FT_INTERNAL(set_sbit_strike_) \ - FT_INTERNAL(load_strike_metrics_) \ - FT_INTERNAL(get_metrics_) \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS -#define FT_DEFINE_DRIVERS_OLD_INTERNAL(a, a_) \ - clazz->a = a_; -#else - #define FT_DEFINE_DRIVERS_OLD_INTERNAL(a, a_) -#endif -#define FT_INTERNAL(a, a_) \ - clazz->a = a_; - -#define FT_DEFINE_SFNT_INTERFACE(class_, \ - goto_table_, init_face_, load_face_, done_face_, get_interface_, \ - load_any_, load_sfnt_header_, load_directory_, load_head_, \ - load_hhea_, load_cmap_, load_maxp_, load_os2_, load_post_, \ - load_name_, free_name_, load_hdmx_stub_, free_hdmx_stub_, \ - load_kern_, load_gasp_, load_pclt_, load_bhed_, \ - set_sbit_strike_stub_, load_sbits_stub_, find_sbit_image_, \ - load_sbit_metrics_, load_sbit_image_, free_sbits_stub_, \ - get_psname_, free_psnames_, load_charmap_stub_, free_charmap_stub_, \ - get_kerning_, load_font_dir_, load_hmtx_, load_eblc_, free_eblc_, \ - set_sbit_strike_, load_strike_metrics_, get_metrics_ ) \ - void \ - FT_Init_Class_##class_( FT_Library library, SFNT_Interface* clazz ) \ - { \ - FT_UNUSED(library); \ - FT_INTERNAL(goto_table,goto_table_) \ - FT_INTERNAL(init_face,init_face_) \ - FT_INTERNAL(load_face,load_face_) \ - FT_INTERNAL(done_face,done_face_) \ - FT_INTERNAL(get_interface,get_interface_) \ - FT_INTERNAL(load_any,load_any_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sfnt_header,load_sfnt_header_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(load_directory,load_directory_) \ - FT_INTERNAL(load_head,load_head_) \ - FT_INTERNAL(load_hhea,load_hhea_) \ - FT_INTERNAL(load_cmap,load_cmap_) \ - FT_INTERNAL(load_maxp,load_maxp_) \ - FT_INTERNAL(load_os2,load_os2_) \ - FT_INTERNAL(load_post,load_post_) \ - FT_INTERNAL(load_name,load_name_) \ - FT_INTERNAL(free_name,free_name_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(load_hdmx_stub,load_hdmx_stub_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(free_hdmx_stub,free_hdmx_stub_) \ - FT_INTERNAL(load_kern,load_kern_) \ - FT_INTERNAL(load_gasp,load_gasp_) \ - FT_INTERNAL(load_pclt,load_pclt_) \ - FT_INTERNAL(load_bhed,load_bhed_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(set_sbit_strike_stub,set_sbit_strike_stub_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbits_stub,load_sbits_stub_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(find_sbit_image,find_sbit_image_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbit_metrics,load_sbit_metrics_) \ - FT_INTERNAL(load_sbit_image,load_sbit_image_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(free_sbits_stub,free_sbits_stub_) \ - FT_INTERNAL(get_psname,get_psname_) \ - FT_INTERNAL(free_psnames,free_psnames_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(load_charmap_stub,load_charmap_stub_) \ - FT_DEFINE_DRIVERS_OLD_INTERNAL(free_charmap_stub,free_charmap_stub_) \ - FT_INTERNAL(get_kerning,get_kerning_) \ - FT_INTERNAL(load_font_dir,load_font_dir_) \ - FT_INTERNAL(load_hmtx,load_hmtx_) \ - FT_INTERNAL(load_eblc,load_eblc_) \ - FT_INTERNAL(free_eblc,free_eblc_) \ - FT_INTERNAL(set_sbit_strike,set_sbit_strike_) \ - FT_INTERNAL(load_strike_metrics,load_strike_metrics_) \ - FT_INTERNAL(get_metrics,get_metrics_) \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - -FT_END_HEADER - -#endif /* __SFNT_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/t1types.h b/android/jni/ndk_modules/freetype/include/freetype/internal/t1types.h deleted file mode 100644 index 5f730637..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/t1types.h +++ /dev/null @@ -1,270 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1types.h */ -/* */ -/* Basic Type1/Type2 type definitions and interface (specification */ -/* only). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __T1TYPES_H__ -#define __T1TYPES_H__ - - -#include <ft2build.h> -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* T1_EncodingRec */ - /* */ - /* <Description> */ - /* A structure modeling a custom encoding. */ - /* */ - /* <Fields> */ - /* num_chars :: The number of character codes in the encoding. */ - /* Usually 256. */ - /* */ - /* code_first :: The lowest valid character code in the encoding. */ - /* */ - /* code_last :: The highest valid character code in the encoding */ - /* + 1. When equal to code_first there are no valid */ - /* character codes. */ - /* */ - /* char_index :: An array of corresponding glyph indices. */ - /* */ - /* char_name :: An array of corresponding glyph names. */ - /* */ - typedef struct T1_EncodingRecRec_ - { - FT_Int num_chars; - FT_Int code_first; - FT_Int code_last; - - FT_UShort* char_index; - FT_String** char_name; - - } T1_EncodingRec, *T1_Encoding; - - - typedef enum T1_EncodingType_ - { - T1_ENCODING_TYPE_NONE = 0, - T1_ENCODING_TYPE_ARRAY, - T1_ENCODING_TYPE_STANDARD, - T1_ENCODING_TYPE_ISOLATIN1, - T1_ENCODING_TYPE_EXPERT - - } T1_EncodingType; - - - /* used to hold extra data of PS_FontInfoRec that - * cannot be stored in the publicly defined structure. - * - * Note these can't be blended with multiple-masters. - */ - typedef struct PS_FontExtraRec_ - { - FT_UShort fs_type; - - } PS_FontExtraRec; - - - typedef struct T1_FontRec_ - { - PS_FontInfoRec font_info; /* font info dictionary */ - PS_FontExtraRec font_extra; /* font info extra fields */ - PS_PrivateRec private_dict; /* private dictionary */ - FT_String* font_name; /* top-level dictionary */ - - T1_EncodingType encoding_type; - T1_EncodingRec encoding; - - FT_Byte* subrs_block; - FT_Byte* charstrings_block; - FT_Byte* glyph_names_block; - - FT_Int num_subrs; - FT_Byte** subrs; - FT_PtrDist* subrs_len; - - FT_Int num_glyphs; - FT_String** glyph_names; /* array of glyph names */ - FT_Byte** charstrings; /* array of glyph charstrings */ - FT_PtrDist* charstrings_len; - - FT_Byte paint_type; - FT_Byte font_type; - FT_Matrix font_matrix; - FT_Vector font_offset; - FT_BBox font_bbox; - FT_Long font_id; - - FT_Fixed stroke_width; - - } T1_FontRec, *T1_Font; - - - typedef struct CID_SubrsRec_ - { - FT_UInt num_subrs; - FT_Byte** code; - - } CID_SubrsRec, *CID_Subrs; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** AFM FONT INFORMATION STRUCTURES ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct AFM_TrackKernRec_ - { - FT_Int degree; - FT_Fixed min_ptsize; - FT_Fixed min_kern; - FT_Fixed max_ptsize; - FT_Fixed max_kern; - - } AFM_TrackKernRec, *AFM_TrackKern; - - typedef struct AFM_KernPairRec_ - { - FT_Int index1; - FT_Int index2; - FT_Int x; - FT_Int y; - - } AFM_KernPairRec, *AFM_KernPair; - - typedef struct AFM_FontInfoRec_ - { - FT_Bool IsCIDFont; - FT_BBox FontBBox; - FT_Fixed Ascender; - FT_Fixed Descender; - AFM_TrackKern TrackKerns; /* free if non-NULL */ - FT_Int NumTrackKern; - AFM_KernPair KernPairs; /* free if non-NULL */ - FT_Int NumKernPair; - - } AFM_FontInfoRec, *AFM_FontInfo; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** ORIGINAL T1_FACE CLASS DEFINITION ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - typedef struct T1_FaceRec_* T1_Face; - typedef struct CID_FaceRec_* CID_Face; - - - typedef struct T1_FaceRec_ - { - FT_FaceRec root; - T1_FontRec type1; - const void* psnames; - const void* psaux; - const void* afm_data; - FT_CharMapRec charmaprecs[2]; - FT_CharMap charmaps[2]; - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - PS_Unicodes unicode_map; -#endif - - /* support for Multiple Masters fonts */ - PS_Blend blend; - - /* undocumented, optional: indices of subroutines that express */ - /* the NormalizeDesignVector and the ConvertDesignVector procedure, */ - /* respectively, as Type 2 charstrings; -1 if keywords not present */ - FT_Int ndv_idx; - FT_Int cdv_idx; - - /* undocumented, optional: has the same meaning as len_buildchar */ - /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25 */ - FT_UInt len_buildchar; - FT_Long* buildchar; - - /* since version 2.1 - interface to PostScript hinter */ - const void* pshinter; - - } T1_FaceRec; - - - typedef struct CID_FaceRec_ - { - FT_FaceRec root; - void* psnames; - void* psaux; - CID_FaceInfoRec cid; - PS_FontExtraRec font_extra; -#if 0 - void* afm_data; -#endif - CID_Subrs subrs; - - /* since version 2.1 - interface to PostScript hinter */ - void* pshinter; - - /* since version 2.1.8, but was originally positioned after `afm_data' */ - FT_Byte* binary_data; /* used if hex data has been converted */ - FT_Stream cid_stream; - - } CID_FaceRec; - - -FT_END_HEADER - -#endif /* __T1TYPES_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/internal/tttypes.h b/android/jni/ndk_modules/freetype/include/freetype/internal/tttypes.h deleted file mode 100644 index acbb863b..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/internal/tttypes.h +++ /dev/null @@ -1,1543 +0,0 @@ -/***************************************************************************/ -/* */ -/* tttypes.h */ -/* */ -/* Basic SFNT/TrueType type definitions and interface (specification */ -/* only). */ -/* */ -/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTTYPES_H__ -#define __TTTYPES_H__ - - -#include <ft2build.h> -#include FT_TRUETYPE_TABLES_H -#include FT_INTERNAL_OBJECTS_H - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_MULTIPLE_MASTERS_H -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TTC_HeaderRec */ - /* */ - /* <Description> */ - /* TrueType collection header. This table contains the offsets of */ - /* the font headers of each distinct TrueType face in the file. */ - /* */ - /* <Fields> */ - /* tag :: Must be `ttc ' to indicate a TrueType collection. */ - /* */ - /* version :: The version number. */ - /* */ - /* count :: The number of faces in the collection. The */ - /* specification says this should be an unsigned long, but */ - /* we use a signed long since we need the value -1 for */ - /* specific purposes. */ - /* */ - /* offsets :: The offsets of the font headers, one per face. */ - /* */ - typedef struct TTC_HeaderRec_ - { - FT_ULong tag; - FT_Fixed version; - FT_Long count; - FT_ULong* offsets; - - } TTC_HeaderRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* SFNT_HeaderRec */ - /* */ - /* <Description> */ - /* SFNT file format header. */ - /* */ - /* <Fields> */ - /* format_tag :: The font format tag. */ - /* */ - /* num_tables :: The number of tables in file. */ - /* */ - /* search_range :: Must be `16 * (max power of 2 <= num_tables)'. */ - /* */ - /* entry_selector :: Must be log2 of `search_range / 16'. */ - /* */ - /* range_shift :: Must be `num_tables * 16 - search_range'. */ - /* */ - typedef struct SFNT_HeaderRec_ - { - FT_ULong format_tag; - FT_UShort num_tables; - FT_UShort search_range; - FT_UShort entry_selector; - FT_UShort range_shift; - - FT_ULong offset; /* not in file */ - - } SFNT_HeaderRec, *SFNT_Header; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_TableRec */ - /* */ - /* <Description> */ - /* This structure describes a given table of a TrueType font. */ - /* */ - /* <Fields> */ - /* Tag :: A four-bytes tag describing the table. */ - /* */ - /* CheckSum :: The table checksum. This value can be ignored. */ - /* */ - /* Offset :: The offset of the table from the start of the TrueType */ - /* font in its resource. */ - /* */ - /* Length :: The table length (in bytes). */ - /* */ - typedef struct TT_TableRec_ - { - FT_ULong Tag; /* table type */ - FT_ULong CheckSum; /* table checksum */ - FT_ULong Offset; /* table file offset */ - FT_ULong Length; /* table length */ - - } TT_TableRec, *TT_Table; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_LongMetricsRec */ - /* */ - /* <Description> */ - /* A structure modeling the long metrics of the `hmtx' and `vmtx' */ - /* TrueType tables. The values are expressed in font units. */ - /* */ - /* <Fields> */ - /* advance :: The advance width or height for the glyph. */ - /* */ - /* bearing :: The left-side or top-side bearing for the glyph. */ - /* */ - typedef struct TT_LongMetricsRec_ - { - FT_UShort advance; - FT_Short bearing; - - } TT_LongMetricsRec, *TT_LongMetrics; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* TT_ShortMetrics */ - /* */ - /* <Description> */ - /* A simple type to model the short metrics of the `hmtx' and `vmtx' */ - /* tables. */ - /* */ - typedef FT_Short TT_ShortMetrics; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_NameEntryRec */ - /* */ - /* <Description> */ - /* A structure modeling TrueType name records. Name records are used */ - /* to store important strings like family name, style name, */ - /* copyright, etc. in _localized_ versions (i.e., language, encoding, */ - /* etc). */ - /* */ - /* <Fields> */ - /* platformID :: The ID of the name's encoding platform. */ - /* */ - /* encodingID :: The platform-specific ID for the name's encoding. */ - /* */ - /* languageID :: The platform-specific ID for the name's language. */ - /* */ - /* nameID :: The ID specifying what kind of name this is. */ - /* */ - /* stringLength :: The length of the string in bytes. */ - /* */ - /* stringOffset :: The offset to the string in the `name' table. */ - /* */ - /* string :: A pointer to the string's bytes. Note that these */ - /* are usually UTF-16 encoded characters. */ - /* */ - typedef struct TT_NameEntryRec_ - { - FT_UShort platformID; - FT_UShort encodingID; - FT_UShort languageID; - FT_UShort nameID; - FT_UShort stringLength; - FT_ULong stringOffset; - - /* this last field is not defined in the spec */ - /* but used by the FreeType engine */ - - FT_Byte* string; - - } TT_NameEntryRec, *TT_NameEntry; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_NameTableRec */ - /* */ - /* <Description> */ - /* A structure modeling the TrueType name table. */ - /* */ - /* <Fields> */ - /* format :: The format of the name table. */ - /* */ - /* numNameRecords :: The number of names in table. */ - /* */ - /* storageOffset :: The offset of the name table in the `name' */ - /* TrueType table. */ - /* */ - /* names :: An array of name records. */ - /* */ - /* stream :: the file's input stream. */ - /* */ - typedef struct TT_NameTableRec_ - { - FT_UShort format; - FT_UInt numNameRecords; - FT_UInt storageOffset; - TT_NameEntryRec* names; - FT_Stream stream; - - } TT_NameTableRec, *TT_NameTable; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_GaspRangeRec */ - /* */ - /* <Description> */ - /* A tiny structure used to model a gasp range according to the */ - /* TrueType specification. */ - /* */ - /* <Fields> */ - /* maxPPEM :: The maximum ppem value to which `gaspFlag' applies. */ - /* */ - /* gaspFlag :: A flag describing the grid-fitting and anti-aliasing */ - /* modes to be used. */ - /* */ - typedef struct TT_GaspRangeRec_ - { - FT_UShort maxPPEM; - FT_UShort gaspFlag; - - } TT_GaspRangeRec, *TT_GaspRange; - - -#define TT_GASP_GRIDFIT 0x01 -#define TT_GASP_DOGRAY 0x02 - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_GaspRec */ - /* */ - /* <Description> */ - /* A structure modeling the TrueType `gasp' table used to specify */ - /* grid-fitting and anti-aliasing behaviour. */ - /* */ - /* <Fields> */ - /* version :: The version number. */ - /* */ - /* numRanges :: The number of gasp ranges in table. */ - /* */ - /* gaspRanges :: An array of gasp ranges. */ - /* */ - typedef struct TT_Gasp_ - { - FT_UShort version; - FT_UShort numRanges; - TT_GaspRange gaspRanges; - - } TT_GaspRec; - - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_HdmxEntryRec */ - /* */ - /* <Description> */ - /* A small structure used to model the pre-computed widths of a given */ - /* size. They are found in the `hdmx' table. */ - /* */ - /* <Fields> */ - /* ppem :: The pixels per EM value at which these metrics apply. */ - /* */ - /* max_width :: The maximum advance width for this metric. */ - /* */ - /* widths :: An array of widths. Note: These are 8-bit bytes. */ - /* */ - typedef struct TT_HdmxEntryRec_ - { - FT_Byte ppem; - FT_Byte max_width; - FT_Byte* widths; - - } TT_HdmxEntryRec, *TT_HdmxEntry; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_HdmxRec */ - /* */ - /* <Description> */ - /* A structure used to model the `hdmx' table, which contains */ - /* pre-computed widths for a set of given sizes/dimensions. */ - /* */ - /* <Fields> */ - /* version :: The version number. */ - /* */ - /* num_records :: The number of hdmx records. */ - /* */ - /* records :: An array of hdmx records. */ - /* */ - typedef struct TT_HdmxRec_ - { - FT_UShort version; - FT_Short num_records; - TT_HdmxEntry records; - - } TT_HdmxRec, *TT_Hdmx; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_Kern0_PairRec */ - /* */ - /* <Description> */ - /* A structure used to model a kerning pair for the kerning table */ - /* format 0. The engine now loads this table if it finds one in the */ - /* font file. */ - /* */ - /* <Fields> */ - /* left :: The index of the left glyph in pair. */ - /* */ - /* right :: The index of the right glyph in pair. */ - /* */ - /* value :: The kerning distance. A positive value spaces the */ - /* glyphs, a negative one makes them closer. */ - /* */ - typedef struct TT_Kern0_PairRec_ - { - FT_UShort left; /* index of left glyph in pair */ - FT_UShort right; /* index of right glyph in pair */ - FT_FWord value; /* kerning value */ - - } TT_Kern0_PairRec, *TT_Kern0_Pair; - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** EMBEDDED BITMAPS SUPPORT ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_MetricsRec */ - /* */ - /* <Description> */ - /* A structure used to hold the big metrics of a given glyph bitmap */ - /* in a TrueType or OpenType font. These are usually found in the */ - /* `EBDT' (Microsoft) or `bloc' (Apple) table. */ - /* */ - /* <Fields> */ - /* height :: The glyph height in pixels. */ - /* */ - /* width :: The glyph width in pixels. */ - /* */ - /* horiBearingX :: The horizontal left bearing. */ - /* */ - /* horiBearingY :: The horizontal top bearing. */ - /* */ - /* horiAdvance :: The horizontal advance. */ - /* */ - /* vertBearingX :: The vertical left bearing. */ - /* */ - /* vertBearingY :: The vertical top bearing. */ - /* */ - /* vertAdvance :: The vertical advance. */ - /* */ - typedef struct TT_SBit_MetricsRec_ - { - FT_Byte height; - FT_Byte width; - - FT_Char horiBearingX; - FT_Char horiBearingY; - FT_Byte horiAdvance; - - FT_Char vertBearingX; - FT_Char vertBearingY; - FT_Byte vertAdvance; - - } TT_SBit_MetricsRec, *TT_SBit_Metrics; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_SmallMetricsRec */ - /* */ - /* <Description> */ - /* A structure used to hold the small metrics of a given glyph bitmap */ - /* in a TrueType or OpenType font. These are usually found in the */ - /* `EBDT' (Microsoft) or the `bdat' (Apple) table. */ - /* */ - /* <Fields> */ - /* height :: The glyph height in pixels. */ - /* */ - /* width :: The glyph width in pixels. */ - /* */ - /* bearingX :: The left-side bearing. */ - /* */ - /* bearingY :: The top-side bearing. */ - /* */ - /* advance :: The advance width or height. */ - /* */ - typedef struct TT_SBit_Small_Metrics_ - { - FT_Byte height; - FT_Byte width; - - FT_Char bearingX; - FT_Char bearingY; - FT_Byte advance; - - } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_LineMetricsRec */ - /* */ - /* <Description> */ - /* A structure used to describe the text line metrics of a given */ - /* bitmap strike, for either a horizontal or vertical layout. */ - /* */ - /* <Fields> */ - /* ascender :: The ascender in pixels. */ - /* */ - /* descender :: The descender in pixels. */ - /* */ - /* max_width :: The maximum glyph width in pixels. */ - /* */ - /* caret_slope_enumerator :: Rise of the caret slope, typically set */ - /* to 1 for non-italic fonts. */ - /* */ - /* caret_slope_denominator :: Rise of the caret slope, typically set */ - /* to 0 for non-italic fonts. */ - /* */ - /* caret_offset :: Offset in pixels to move the caret for */ - /* proper positioning. */ - /* */ - /* min_origin_SB :: Minimum of horiBearingX (resp. */ - /* vertBearingY). */ - /* min_advance_SB :: Minimum of */ - /* */ - /* horizontal advance - */ - /* ( horiBearingX + width ) */ - /* */ - /* resp. */ - /* */ - /* vertical advance - */ - /* ( vertBearingY + height ) */ - /* */ - /* max_before_BL :: Maximum of horiBearingY (resp. */ - /* vertBearingY). */ - /* */ - /* min_after_BL :: Minimum of */ - /* */ - /* horiBearingY - height */ - /* */ - /* resp. */ - /* */ - /* vertBearingX - width */ - /* */ - /* pads :: Unused (to make the size of the record */ - /* a multiple of 32 bits. */ - /* */ - typedef struct TT_SBit_LineMetricsRec_ - { - FT_Char ascender; - FT_Char descender; - FT_Byte max_width; - FT_Char caret_slope_numerator; - FT_Char caret_slope_denominator; - FT_Char caret_offset; - FT_Char min_origin_SB; - FT_Char min_advance_SB; - FT_Char max_before_BL; - FT_Char min_after_BL; - FT_Char pads[2]; - - } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_RangeRec */ - /* */ - /* <Description> */ - /* A TrueType/OpenType subIndexTable as defined in the `EBLC' */ - /* (Microsoft) or `bloc' (Apple) tables. */ - /* */ - /* <Fields> */ - /* first_glyph :: The first glyph index in the range. */ - /* */ - /* last_glyph :: The last glyph index in the range. */ - /* */ - /* index_format :: The format of index table. Valid values are 1 */ - /* to 5. */ - /* */ - /* image_format :: The format of `EBDT' image data. */ - /* */ - /* image_offset :: The offset to image data in `EBDT'. */ - /* */ - /* image_size :: For index formats 2 and 5. This is the size in */ - /* bytes of each glyph bitmap. */ - /* */ - /* big_metrics :: For index formats 2 and 5. This is the big */ - /* metrics for each glyph bitmap. */ - /* */ - /* num_glyphs :: For index formats 4 and 5. This is the number of */ - /* glyphs in the code array. */ - /* */ - /* glyph_offsets :: For index formats 1 and 3. */ - /* */ - /* glyph_codes :: For index formats 4 and 5. */ - /* */ - /* table_offset :: The offset of the index table in the `EBLC' */ - /* table. Only used during strike loading. */ - /* */ - typedef struct TT_SBit_RangeRec_ - { - FT_UShort first_glyph; - FT_UShort last_glyph; - - FT_UShort index_format; - FT_UShort image_format; - FT_ULong image_offset; - - FT_ULong image_size; - TT_SBit_MetricsRec metrics; - FT_ULong num_glyphs; - - FT_ULong* glyph_offsets; - FT_UShort* glyph_codes; - - FT_ULong table_offset; - - } TT_SBit_RangeRec, *TT_SBit_Range; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_StrikeRec */ - /* */ - /* <Description> */ - /* A structure used describe a given bitmap strike in the `EBLC' */ - /* (Microsoft) or `bloc' (Apple) tables. */ - /* */ - /* <Fields> */ - /* num_index_ranges :: The number of index ranges. */ - /* */ - /* index_ranges :: An array of glyph index ranges. */ - /* */ - /* color_ref :: Unused. `color_ref' is put in for future */ - /* enhancements, but these fields are already */ - /* in use by other platforms (e.g. Newton). */ - /* For details, please see */ - /* */ - /* http://fonts.apple.com/ */ - /* TTRefMan/RM06/Chap6bloc.html */ - /* */ - /* hori :: The line metrics for horizontal layouts. */ - /* */ - /* vert :: The line metrics for vertical layouts. */ - /* */ - /* start_glyph :: The lowest glyph index for this strike. */ - /* */ - /* end_glyph :: The highest glyph index for this strike. */ - /* */ - /* x_ppem :: The number of horizontal pixels per EM. */ - /* */ - /* y_ppem :: The number of vertical pixels per EM. */ - /* */ - /* bit_depth :: The bit depth. Valid values are 1, 2, 4, */ - /* and 8. */ - /* */ - /* flags :: Is this a vertical or horizontal strike? For */ - /* details, please see */ - /* */ - /* http://fonts.apple.com/ */ - /* TTRefMan/RM06/Chap6bloc.html */ - /* */ - typedef struct TT_SBit_StrikeRec_ - { - FT_Int num_ranges; - TT_SBit_Range sbit_ranges; - FT_ULong ranges_offset; - - FT_ULong color_ref; - - TT_SBit_LineMetricsRec hori; - TT_SBit_LineMetricsRec vert; - - FT_UShort start_glyph; - FT_UShort end_glyph; - - FT_Byte x_ppem; - FT_Byte y_ppem; - - FT_Byte bit_depth; - FT_Char flags; - - } TT_SBit_StrikeRec, *TT_SBit_Strike; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_ComponentRec */ - /* */ - /* <Description> */ - /* A simple structure to describe a compound sbit element. */ - /* */ - /* <Fields> */ - /* glyph_code :: The element's glyph index. */ - /* */ - /* x_offset :: The element's left bearing. */ - /* */ - /* y_offset :: The element's top bearing. */ - /* */ - typedef struct TT_SBit_ComponentRec_ - { - FT_UShort glyph_code; - FT_Char x_offset; - FT_Char y_offset; - - } TT_SBit_ComponentRec, *TT_SBit_Component; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_SBit_ScaleRec */ - /* */ - /* <Description> */ - /* A structure used describe a given bitmap scaling table, as defined */ - /* in the `EBSC' table. */ - /* */ - /* <Fields> */ - /* hori :: The horizontal line metrics. */ - /* */ - /* vert :: The vertical line metrics. */ - /* */ - /* x_ppem :: The number of horizontal pixels per EM. */ - /* */ - /* y_ppem :: The number of vertical pixels per EM. */ - /* */ - /* x_ppem_substitute :: Substitution x_ppem value. */ - /* */ - /* y_ppem_substitute :: Substitution y_ppem value. */ - /* */ - typedef struct TT_SBit_ScaleRec_ - { - TT_SBit_LineMetricsRec hori; - TT_SBit_LineMetricsRec vert; - - FT_Byte x_ppem; - FT_Byte y_ppem; - - FT_Byte x_ppem_substitute; - FT_Byte y_ppem_substitute; - - } TT_SBit_ScaleRec, *TT_SBit_Scale; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_Post_20Rec */ - /* */ - /* <Description> */ - /* Postscript names sub-table, format 2.0. Stores the PS name of */ - /* each glyph in the font face. */ - /* */ - /* <Fields> */ - /* num_glyphs :: The number of named glyphs in the table. */ - /* */ - /* num_names :: The number of PS names stored in the table. */ - /* */ - /* glyph_indices :: The indices of the glyphs in the names arrays. */ - /* */ - /* glyph_names :: The PS names not in Mac Encoding. */ - /* */ - typedef struct TT_Post_20Rec_ - { - FT_UShort num_glyphs; - FT_UShort num_names; - FT_UShort* glyph_indices; - FT_Char** glyph_names; - - } TT_Post_20Rec, *TT_Post_20; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_Post_25Rec */ - /* */ - /* <Description> */ - /* Postscript names sub-table, format 2.5. Stores the PS name of */ - /* each glyph in the font face. */ - /* */ - /* <Fields> */ - /* num_glyphs :: The number of glyphs in the table. */ - /* */ - /* offsets :: An array of signed offsets in a normal Mac */ - /* Postscript name encoding. */ - /* */ - typedef struct TT_Post_25_ - { - FT_UShort num_glyphs; - FT_Char* offsets; - - } TT_Post_25Rec, *TT_Post_25; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_Post_NamesRec */ - /* */ - /* <Description> */ - /* Postscript names table, either format 2.0 or 2.5. */ - /* */ - /* <Fields> */ - /* loaded :: A flag to indicate whether the PS names are loaded. */ - /* */ - /* format_20 :: The sub-table used for format 2.0. */ - /* */ - /* format_25 :: The sub-table used for format 2.5. */ - /* */ - typedef struct TT_Post_NamesRec_ - { - FT_Bool loaded; - - union - { - TT_Post_20Rec format_20; - TT_Post_25Rec format_25; - - } names; - - } TT_Post_NamesRec, *TT_Post_Names; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** GX VARIATION TABLE SUPPORT ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - typedef struct GX_BlendRec_ *GX_Blend; -#endif - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * These types are used to support a `BDF ' table that isn't part of the - * official TrueType specification. It is mainly used in SFNT-based - * bitmap fonts that were generated from a set of BDF fonts. - * - * The format of the table is as follows. - * - * USHORT version `BDF ' table version number, should be 0x0001. - * USHORT strikeCount Number of strikes (bitmap sizes) in this table. - * ULONG stringTable Offset (from start of BDF table) to string - * table. - * - * This is followed by an array of `strikeCount' descriptors, having the - * following format. - * - * USHORT ppem Vertical pixels per EM for this strike. - * USHORT numItems Number of items for this strike (properties and - * atoms). Maximum is 255. - * - * This array in turn is followed by `strikeCount' value sets. Each - * `value set' is an array of `numItems' items with the following format. - * - * ULONG item_name Offset in string table to item name. - * USHORT item_type The item type. Possible values are - * 0 => string (e.g., COMMENT) - * 1 => atom (e.g., FONT or even SIZE) - * 2 => int32 - * 3 => uint32 - * 0x10 => A flag to indicate a properties. This - * is ORed with the above values. - * ULONG item_value For strings => Offset into string table without - * the corresponding double quotes. - * For atoms => Offset into string table. - * For integers => Direct value. - * - * All strings in the string table consist of bytes and are - * zero-terminated. - * - */ - -#ifdef TT_CONFIG_OPTION_BDF - - typedef struct TT_BDFRec_ - { - FT_Byte* table; - FT_Byte* table_end; - FT_Byte* strings; - FT_ULong strings_size; - FT_UInt num_strikes; - FT_Bool loaded; - - } TT_BDFRec, *TT_BDF; - -#endif /* TT_CONFIG_OPTION_BDF */ - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** ORIGINAL TT_FACE CLASS DEFINITION ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This structure/class is defined here because it is common to the */ - /* following formats: TTF, OpenType-TT, and OpenType-CFF. */ - /* */ - /* Note, however, that the classes TT_Size and TT_GlyphSlot are not */ - /* shared between font drivers, and are thus defined in `ttobjs.h'. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* TT_Face */ - /* */ - /* <Description> */ - /* A handle to a TrueType face/font object. A TT_Face encapsulates */ - /* the resolution and scaling independent parts of a TrueType font */ - /* resource. */ - /* */ - /* <Note> */ - /* The TT_Face structure is also used as a `parent class' for the */ - /* OpenType-CFF class (T2_Face). */ - /* */ - typedef struct TT_FaceRec_* TT_Face; - - - /* a function type used for the truetype bytecode interpreter hooks */ - typedef FT_Error - (*TT_Interpreter)( void* exec_context ); - - /* forward declaration */ - typedef struct TT_LoaderRec_* TT_Loader; - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Loader_GotoTableFunc */ - /* */ - /* <Description> */ - /* Seeks a stream to the start of a given TrueType table. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* tag :: A 4-byte tag used to name the table. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Output> */ - /* length :: The length of the table in bytes. Set to 0 if not */ - /* needed. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The stream cursor must be at the font file's origin. */ - /* */ - typedef FT_Error - (*TT_Loader_GotoTableFunc)( TT_Face face, - FT_ULong tag, - FT_Stream stream, - FT_ULong* length ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Loader_StartGlyphFunc */ - /* */ - /* <Description> */ - /* Seeks a stream to the start of a given glyph element, and opens a */ - /* frame for it. */ - /* */ - /* <Input> */ - /* loader :: The current TrueType glyph loader object. */ - /* */ - /* glyph index :: The index of the glyph to access. */ - /* */ - /* offset :: The offset of the glyph according to the */ - /* `locations' table. */ - /* */ - /* byte_count :: The size of the frame in bytes. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* This function is normally equivalent to FT_STREAM_SEEK(offset) */ - /* followed by FT_FRAME_ENTER(byte_count) with the loader's stream, */ - /* but alternative formats (e.g. compressed ones) might use something */ - /* different. */ - /* */ - typedef FT_Error - (*TT_Loader_StartGlyphFunc)( TT_Loader loader, - FT_UInt glyph_index, - FT_ULong offset, - FT_UInt byte_count ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Loader_ReadGlyphFunc */ - /* */ - /* <Description> */ - /* Reads one glyph element (its header, a simple glyph, or a */ - /* composite) from the loader's current stream frame. */ - /* */ - /* <Input> */ - /* loader :: The current TrueType glyph loader object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - typedef FT_Error - (*TT_Loader_ReadGlyphFunc)( TT_Loader loader ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_Loader_EndGlyphFunc */ - /* */ - /* <Description> */ - /* Closes the current loader stream frame for the glyph. */ - /* */ - /* <Input> */ - /* loader :: The current TrueType glyph loader object. */ - /* */ - typedef void - (*TT_Loader_EndGlyphFunc)( TT_Loader loader ); - - - /*************************************************************************/ - /* */ - /* TrueType Face Type */ - /* */ - /* <Struct> */ - /* TT_Face */ - /* */ - /* <Description> */ - /* The TrueType face class. These objects model the resolution and */ - /* point-size independent data found in a TrueType font file. */ - /* */ - /* <Fields> */ - /* root :: The base FT_Face structure, managed by the */ - /* base layer. */ - /* */ - /* ttc_header :: The TrueType collection header, used when */ - /* the file is a `ttc' rather than a `ttf'. */ - /* For ordinary font files, the field */ - /* `ttc_header.count' is set to 0. */ - /* */ - /* format_tag :: The font format tag. */ - /* */ - /* num_tables :: The number of TrueType tables in this font */ - /* file. */ - /* */ - /* dir_tables :: The directory of TrueType tables for this */ - /* font file. */ - /* */ - /* header :: The font's font header (`head' table). */ - /* Read on font opening. */ - /* */ - /* horizontal :: The font's horizontal header (`hhea' */ - /* table). This field also contains the */ - /* associated horizontal metrics table */ - /* (`hmtx'). */ - /* */ - /* max_profile :: The font's maximum profile table. Read on */ - /* font opening. Note that some maximum */ - /* values cannot be taken directly from this */ - /* table. We thus define additional fields */ - /* below to hold the computed maxima. */ - /* */ - /* vertical_info :: A boolean which is set when the font file */ - /* contains vertical metrics. If not, the */ - /* value of the `vertical' field is */ - /* undefined. */ - /* */ - /* vertical :: The font's vertical header (`vhea' table). */ - /* This field also contains the associated */ - /* vertical metrics table (`vmtx'), if found. */ - /* IMPORTANT: The contents of this field is */ - /* undefined if the `verticalInfo' field is */ - /* unset. */ - /* */ - /* num_names :: The number of name records within this */ - /* TrueType font. */ - /* */ - /* name_table :: The table of name records (`name'). */ - /* */ - /* os2 :: The font's OS/2 table (`OS/2'). */ - /* */ - /* postscript :: The font's PostScript table (`post' */ - /* table). The PostScript glyph names are */ - /* not loaded by the driver on face opening. */ - /* See the `ttpost' module for more details. */ - /* */ - /* cmap_table :: Address of the face's `cmap' SFNT table */ - /* in memory (it's an extracted frame). */ - /* */ - /* cmap_size :: The size in bytes of the `cmap_table' */ - /* described above. */ - /* */ - /* goto_table :: A function called by each TrueType table */ - /* loader to position a stream's cursor to */ - /* the start of a given table according to */ - /* its tag. It defaults to TT_Goto_Face but */ - /* can be different for strange formats (e.g. */ - /* Type 42). */ - /* */ - /* access_glyph_frame :: A function used to access the frame of a */ - /* given glyph within the face's font file. */ - /* */ - /* forget_glyph_frame :: A function used to forget the frame of a */ - /* given glyph when all data has been loaded. */ - /* */ - /* read_glyph_header :: A function used to read a glyph header. */ - /* It must be called between an `access' and */ - /* `forget'. */ - /* */ - /* read_simple_glyph :: A function used to read a simple glyph. */ - /* It must be called after the header was */ - /* read, and before the `forget'. */ - /* */ - /* read_composite_glyph :: A function used to read a composite glyph. */ - /* It must be called after the header was */ - /* read, and before the `forget'. */ - /* */ - /* sfnt :: A pointer to the SFNT service. */ - /* */ - /* psnames :: A pointer to the PostScript names service. */ - /* */ - /* hdmx :: The face's horizontal device metrics */ - /* (`hdmx' table). This table is optional in */ - /* TrueType/OpenType fonts. */ - /* */ - /* gasp :: The grid-fitting and scaling properties */ - /* table (`gasp'). This table is optional in */ - /* TrueType/OpenType fonts. */ - /* */ - /* pclt :: The `pclt' SFNT table. */ - /* */ - /* num_sbit_strikes :: The number of sbit strikes, i.e., bitmap */ - /* sizes, embedded in this font. */ - /* */ - /* sbit_strikes :: An array of sbit strikes embedded in this */ - /* font. This table is optional in a */ - /* TrueType/OpenType font. */ - /* */ - /* num_sbit_scales :: The number of sbit scales for this font. */ - /* */ - /* sbit_scales :: Array of sbit scales embedded in this */ - /* font. This table is optional in a */ - /* TrueType/OpenType font. */ - /* */ - /* postscript_names :: A table used to store the Postscript names */ - /* of the glyphs for this font. See the */ - /* file `ttconfig.h' for comments on the */ - /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. */ - /* */ - /* num_locations :: The number of glyph locations in this */ - /* TrueType file. This should be */ - /* identical to the number of glyphs. */ - /* Ignored for Type 2 fonts. */ - /* */ - /* glyph_locations :: An array of longs. These are offsets to */ - /* glyph data within the `glyf' table. */ - /* Ignored for Type 2 font faces. */ - /* */ - /* glyf_len :: The length of the `glyf' table. Needed */ - /* for malformed `loca' tables. */ - /* */ - /* font_program_size :: Size in bytecodes of the face's font */ - /* program. 0 if none defined. Ignored for */ - /* Type 2 fonts. */ - /* */ - /* font_program :: The face's font program (bytecode stream) */ - /* executed at load time, also used during */ - /* glyph rendering. Comes from the `fpgm' */ - /* table. Ignored for Type 2 font fonts. */ - /* */ - /* cvt_program_size :: The size in bytecodes of the face's cvt */ - /* program. Ignored for Type 2 fonts. */ - /* */ - /* cvt_program :: The face's cvt program (bytecode stream) */ - /* executed each time an instance/size is */ - /* changed/reset. Comes from the `prep' */ - /* table. Ignored for Type 2 fonts. */ - /* */ - /* cvt_size :: Size of the control value table (in */ - /* entries). Ignored for Type 2 fonts. */ - /* */ - /* cvt :: The face's original control value table. */ - /* Coordinates are expressed in unscaled font */ - /* units. Comes from the `cvt ' table. */ - /* Ignored for Type 2 fonts. */ - /* */ - /* num_kern_pairs :: The number of kerning pairs present in the */ - /* font file. The engine only loads the */ - /* first horizontal format 0 kern table it */ - /* finds in the font file. Ignored for */ - /* Type 2 fonts. */ - /* */ - /* kern_table_index :: The index of the kerning table in the font */ - /* kerning directory. Ignored for Type 2 */ - /* fonts. */ - /* */ - /* interpreter :: A pointer to the TrueType bytecode */ - /* interpreters field is also used to hook */ - /* the debugger in `ttdebug'. */ - /* */ - /* unpatented_hinting :: If true, use only unpatented methods in */ - /* the bytecode interpreter. */ - /* */ - /* doblend :: A boolean which is set if the font should */ - /* be blended (this is for GX var). */ - /* */ - /* blend :: Contains the data needed to control GX */ - /* variation tables (rather like Multiple */ - /* Master data). */ - /* */ - /* extra :: Reserved for third-party font drivers. */ - /* */ - /* postscript_name :: The PS name of the font. Used by the */ - /* postscript name service. */ - /* */ - typedef struct TT_FaceRec_ - { - FT_FaceRec root; - - TTC_HeaderRec ttc_header; - - FT_ULong format_tag; - FT_UShort num_tables; - TT_Table dir_tables; - - TT_Header header; /* TrueType header table */ - TT_HoriHeader horizontal; /* TrueType horizontal header */ - - TT_MaxProfile max_profile; -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - FT_ULong max_components; /* stubbed to 0 */ -#endif - - FT_Bool vertical_info; - TT_VertHeader vertical; /* TT Vertical header, if present */ - - FT_UShort num_names; /* number of name records */ - TT_NameTableRec name_table; /* name table */ - - TT_OS2 os2; /* TrueType OS/2 table */ - TT_Postscript postscript; /* TrueType Postscript table */ - - FT_Byte* cmap_table; /* extracted `cmap' table */ - FT_ULong cmap_size; - - TT_Loader_GotoTableFunc goto_table; - - TT_Loader_StartGlyphFunc access_glyph_frame; - TT_Loader_EndGlyphFunc forget_glyph_frame; - TT_Loader_ReadGlyphFunc read_glyph_header; - TT_Loader_ReadGlyphFunc read_simple_glyph; - TT_Loader_ReadGlyphFunc read_composite_glyph; - - /* a typeless pointer to the SFNT_Interface table used to load */ - /* the basic TrueType tables in the face object */ - void* sfnt; - - /* a typeless pointer to the FT_Service_PsCMapsRec table used to */ - /* handle glyph names <-> unicode & Mac values */ - void* psnames; - - - /***********************************************************************/ - /* */ - /* Optional TrueType/OpenType tables */ - /* */ - /***********************************************************************/ - - /* horizontal device metrics */ -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - TT_HdmxRec hdmx; -#endif - - /* grid-fitting and scaling table */ - TT_GaspRec gasp; /* the `gasp' table */ - - /* PCL 5 table */ - TT_PCLT pclt; - - /* embedded bitmaps support */ -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - FT_ULong num_sbit_strikes; - TT_SBit_Strike sbit_strikes; -#endif - - FT_ULong num_sbit_scales; - TT_SBit_Scale sbit_scales; - - /* postscript names table */ - TT_Post_NamesRec postscript_names; - - - /***********************************************************************/ - /* */ - /* TrueType-specific fields (ignored by the OTF-Type2 driver) */ - /* */ - /***********************************************************************/ - - /* the glyph locations */ -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - FT_UShort num_locations_stub; - FT_Long* glyph_locations_stub; -#endif - - /* the font program, if any */ - FT_ULong font_program_size; - FT_Byte* font_program; - - /* the cvt program, if any */ - FT_ULong cvt_program_size; - FT_Byte* cvt_program; - - /* the original, unscaled, control value table */ - FT_ULong cvt_size; - FT_Short* cvt; - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - /* the format 0 kerning table, if any */ - FT_Int num_kern_pairs; - FT_Int kern_table_index; - TT_Kern0_Pair kern_pairs; -#endif - - /* A pointer to the bytecode interpreter to use. This is also */ - /* used to hook the debugger for the `ttdebug' utility. */ - TT_Interpreter interpreter; - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - /* Use unpatented hinting only. */ - FT_Bool unpatented_hinting; -#endif - - /***********************************************************************/ - /* */ - /* Other tables or fields. This is used by derivative formats like */ - /* OpenType. */ - /* */ - /***********************************************************************/ - - FT_Generic extra; - - const char* postscript_name; - - /* since version 2.1.8, but was originally placed after */ - /* `glyph_locations_stub' */ - FT_ULong glyf_len; - - /* since version 2.1.8, but was originally placed before `extra' */ -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Bool doblend; - GX_Blend blend; -#endif - - /* since version 2.2 */ - - FT_Byte* horz_metrics; - FT_ULong horz_metrics_size; - - FT_Byte* vert_metrics; - FT_ULong vert_metrics_size; - - FT_ULong num_locations; /* in broken TTF, gid > 0xFFFF */ - FT_Byte* glyph_locations; - - FT_Byte* hdmx_table; - FT_ULong hdmx_table_size; - FT_UInt hdmx_record_count; - FT_ULong hdmx_record_size; - FT_Byte* hdmx_record_sizes; - - FT_Byte* sbit_table; - FT_ULong sbit_table_size; - FT_UInt sbit_num_strikes; - - FT_Byte* kern_table; - FT_ULong kern_table_size; - FT_UInt num_kern_tables; - FT_UInt32 kern_avail_bits; - FT_UInt32 kern_order_bits; - -#ifdef TT_CONFIG_OPTION_BDF - TT_BDFRec bdf; -#endif /* TT_CONFIG_OPTION_BDF */ - - /* since 2.3.0 */ - FT_ULong horz_metrics_offset; - FT_ULong vert_metrics_offset; - - } TT_FaceRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_GlyphZoneRec */ - /* */ - /* <Description> */ - /* A glyph zone is used to load, scale and hint glyph outline */ - /* coordinates. */ - /* */ - /* <Fields> */ - /* memory :: A handle to the memory manager. */ - /* */ - /* max_points :: The maximal size in points of the zone. */ - /* */ - /* max_contours :: Max size in links contours of the zone. */ - /* */ - /* n_points :: The current number of points in the zone. */ - /* */ - /* n_contours :: The current number of contours in the zone. */ - /* */ - /* org :: The original glyph coordinates (font */ - /* units/scaled). */ - /* */ - /* cur :: The current glyph coordinates (scaled/hinted). */ - /* */ - /* tags :: The point control tags. */ - /* */ - /* contours :: The contours end points. */ - /* */ - /* first_point :: Offset of the current subglyph's first point. */ - /* */ - typedef struct TT_GlyphZoneRec_ - { - FT_Memory memory; - FT_UShort max_points; - FT_UShort max_contours; - FT_UShort n_points; /* number of points in zone */ - FT_Short n_contours; /* number of contours */ - - FT_Vector* org; /* original point coordinates */ - FT_Vector* cur; /* current point coordinates */ - FT_Vector* orus; /* original (unscaled) point coordinates */ - - FT_Byte* tags; /* current touch flags */ - FT_UShort* contours; /* contour end points */ - - FT_UShort first_point; /* offset of first (#0) point */ - - } TT_GlyphZoneRec, *TT_GlyphZone; - - - /* handle to execution context */ - typedef struct TT_ExecContextRec_* TT_ExecContext; - - /* glyph loader structure */ - typedef struct TT_LoaderRec_ - { - FT_Face face; - FT_Size size; - FT_GlyphSlot glyph; - FT_GlyphLoader gloader; - - FT_ULong load_flags; - FT_UInt glyph_index; - - FT_Stream stream; - FT_Int byte_len; - - FT_Short n_contours; - FT_BBox bbox; - FT_Int left_bearing; - FT_Int advance; - FT_Int linear; - FT_Bool linear_def; - FT_Bool preserve_pps; - FT_Vector pp1; - FT_Vector pp2; - - FT_ULong glyf_offset; - - /* the zone where we load our glyphs */ - TT_GlyphZoneRec base; - TT_GlyphZoneRec zone; - - TT_ExecContext exec; - FT_Byte* instructions; - FT_ULong ins_pos; - - /* for possible extensibility in other formats */ - void* other; - - /* since version 2.1.8 */ - FT_Int top_bearing; - FT_Int vadvance; - FT_Vector pp3; - FT_Vector pp4; - - /* since version 2.2.1 */ - FT_Byte* cursor; - FT_Byte* limit; - - } TT_LoaderRec; - - -FT_END_HEADER - -#endif /* __TTTYPES_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/t1tables.h b/android/jni/ndk_modules/freetype/include/freetype/t1tables.h deleted file mode 100644 index 5e2a3934..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/t1tables.h +++ /dev/null @@ -1,504 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1tables.h */ -/* */ -/* Basic Type 1/Type 2 tables definitions and interface (specification */ -/* only). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __T1TABLES_H__ -#define __T1TABLES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* type1_tables */ - /* */ - /* <Title> */ - /* Type 1 Tables */ - /* */ - /* <Abstract> */ - /* Type~1 (PostScript) specific font tables. */ - /* */ - /* <Description> */ - /* This section contains the definition of Type 1-specific tables, */ - /* including structures related to other PostScript font formats. */ - /* */ - /*************************************************************************/ - - - /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */ - /* structures in order to support Multiple Master fonts. */ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_FontInfoRec */ - /* */ - /* <Description> */ - /* A structure used to model a Type~1 or Type~2 FontInfo dictionary. */ - /* Note that for Multiple Master fonts, each instance has its own */ - /* FontInfo dictionary. */ - /* */ - typedef struct PS_FontInfoRec_ - { - FT_String* version; - FT_String* notice; - FT_String* full_name; - FT_String* family_name; - FT_String* weight; - FT_Long italic_angle; - FT_Bool is_fixed_pitch; - FT_Short underline_position; - FT_UShort underline_thickness; - - } PS_FontInfoRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_FontInfo */ - /* */ - /* <Description> */ - /* A handle to a @PS_FontInfoRec structure. */ - /* */ - typedef struct PS_FontInfoRec_* PS_FontInfo; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* T1_FontInfo */ - /* */ - /* <Description> */ - /* This type is equivalent to @PS_FontInfoRec. It is deprecated but */ - /* kept to maintain source compatibility between various versions of */ - /* FreeType. */ - /* */ - typedef PS_FontInfoRec T1_FontInfo; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_PrivateRec */ - /* */ - /* <Description> */ - /* A structure used to model a Type~1 or Type~2 private dictionary. */ - /* Note that for Multiple Master fonts, each instance has its own */ - /* Private dictionary. */ - /* */ - typedef struct PS_PrivateRec_ - { - FT_Int unique_id; - FT_Int lenIV; - - FT_Byte num_blue_values; - FT_Byte num_other_blues; - FT_Byte num_family_blues; - FT_Byte num_family_other_blues; - - FT_Short blue_values[14]; - FT_Short other_blues[10]; - - FT_Short family_blues [14]; - FT_Short family_other_blues[10]; - - FT_Fixed blue_scale; - FT_Int blue_shift; - FT_Int blue_fuzz; - - FT_UShort standard_width[1]; - FT_UShort standard_height[1]; - - FT_Byte num_snap_widths; - FT_Byte num_snap_heights; - FT_Bool force_bold; - FT_Bool round_stem_up; - - FT_Short snap_widths [13]; /* including std width */ - FT_Short snap_heights[13]; /* including std height */ - - FT_Fixed expansion_factor; - - FT_Long language_group; - FT_Long password; - - FT_Short min_feature[2]; - - } PS_PrivateRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_Private */ - /* */ - /* <Description> */ - /* A handle to a @PS_PrivateRec structure. */ - /* */ - typedef struct PS_PrivateRec_* PS_Private; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* T1_Private */ - /* */ - /* <Description> */ - /* This type is equivalent to @PS_PrivateRec. It is deprecated but */ - /* kept to maintain source compatibility between various versions of */ - /* FreeType. */ - /* */ - typedef PS_PrivateRec T1_Private; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* T1_Blend_Flags */ - /* */ - /* <Description> */ - /* A set of flags used to indicate which fields are present in a */ - /* given blend dictionary (font info or private). Used to support */ - /* Multiple Masters fonts. */ - /* */ - typedef enum T1_Blend_Flags_ - { - /*# required fields in a FontInfo blend dictionary */ - T1_BLEND_UNDERLINE_POSITION = 0, - T1_BLEND_UNDERLINE_THICKNESS, - T1_BLEND_ITALIC_ANGLE, - - /*# required fields in a Private blend dictionary */ - T1_BLEND_BLUE_VALUES, - T1_BLEND_OTHER_BLUES, - T1_BLEND_STANDARD_WIDTH, - T1_BLEND_STANDARD_HEIGHT, - T1_BLEND_STEM_SNAP_WIDTHS, - T1_BLEND_STEM_SNAP_HEIGHTS, - T1_BLEND_BLUE_SCALE, - T1_BLEND_BLUE_SHIFT, - T1_BLEND_FAMILY_BLUES, - T1_BLEND_FAMILY_OTHER_BLUES, - T1_BLEND_FORCE_BOLD, - - /*# never remove */ - T1_BLEND_MAX - - } T1_Blend_Flags; - - /* */ - - - /*# backwards compatible definitions */ -#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION -#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS -#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE -#define t1_blend_blue_values T1_BLEND_BLUE_VALUES -#define t1_blend_other_blues T1_BLEND_OTHER_BLUES -#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH -#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT -#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS -#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS -#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE -#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT -#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES -#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES -#define t1_blend_force_bold T1_BLEND_FORCE_BOLD -#define t1_blend_max T1_BLEND_MAX - - - /* maximum number of Multiple Masters designs, as defined in the spec */ -#define T1_MAX_MM_DESIGNS 16 - - /* maximum number of Multiple Masters axes, as defined in the spec */ -#define T1_MAX_MM_AXIS 4 - - /* maximum number of elements in a design map */ -#define T1_MAX_MM_MAP_POINTS 20 - - - /* this structure is used to store the BlendDesignMap entry for an axis */ - typedef struct PS_DesignMap_ - { - FT_Byte num_points; - FT_Long* design_points; - FT_Fixed* blend_points; - - } PS_DesignMapRec, *PS_DesignMap; - - /* backwards-compatible definition */ - typedef PS_DesignMapRec T1_DesignMap; - - - typedef struct PS_BlendRec_ - { - FT_UInt num_designs; - FT_UInt num_axis; - - FT_String* axis_names[T1_MAX_MM_AXIS]; - FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; - PS_DesignMapRec design_map[T1_MAX_MM_AXIS]; - - FT_Fixed* weight_vector; - FT_Fixed* default_weight_vector; - - PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1]; - PS_Private privates [T1_MAX_MM_DESIGNS + 1]; - - FT_ULong blend_bitflags; - - FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; - - /* since 2.3.0 */ - - /* undocumented, optional: the default design instance; */ - /* corresponds to default_weight_vector -- */ - /* num_default_design_vector == 0 means it is not present */ - /* in the font and associated metrics files */ - FT_UInt default_design_vector[T1_MAX_MM_DESIGNS]; - FT_UInt num_default_design_vector; - - } PS_BlendRec, *PS_Blend; - - - /* backwards-compatible definition */ - typedef PS_BlendRec T1_Blend; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CID_FaceDictRec */ - /* */ - /* <Description> */ - /* A structure used to represent data in a CID top-level dictionary. */ - /* */ - typedef struct CID_FaceDictRec_ - { - PS_PrivateRec private_dict; - - FT_UInt len_buildchar; - FT_Fixed forcebold_threshold; - FT_Pos stroke_width; - FT_Fixed expansion_factor; - - FT_Byte paint_type; - FT_Byte font_type; - FT_Matrix font_matrix; - FT_Vector font_offset; - - FT_UInt num_subrs; - FT_ULong subrmap_offset; - FT_Int sd_bytes; - - } CID_FaceDictRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CID_FaceDict */ - /* */ - /* <Description> */ - /* A handle to a @CID_FaceDictRec structure. */ - /* */ - typedef struct CID_FaceDictRec_* CID_FaceDict; - - /* */ - - - /* backwards-compatible definition */ - typedef CID_FaceDictRec CID_FontDict; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CID_FaceInfoRec */ - /* */ - /* <Description> */ - /* A structure used to represent CID Face information. */ - /* */ - typedef struct CID_FaceInfoRec_ - { - FT_String* cid_font_name; - FT_Fixed cid_version; - FT_Int cid_font_type; - - FT_String* registry; - FT_String* ordering; - FT_Int supplement; - - PS_FontInfoRec font_info; - FT_BBox font_bbox; - FT_ULong uid_base; - - FT_Int num_xuid; - FT_ULong xuid[16]; - - FT_ULong cidmap_offset; - FT_Int fd_bytes; - FT_Int gd_bytes; - FT_ULong cid_count; - - FT_Int num_dicts; - CID_FaceDict font_dicts; - - FT_ULong data_offset; - - } CID_FaceInfoRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CID_FaceInfo */ - /* */ - /* <Description> */ - /* A handle to a @CID_FaceInfoRec structure. */ - /* */ - typedef struct CID_FaceInfoRec_* CID_FaceInfo; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CID_Info */ - /* */ - /* <Description> */ - /* This type is equivalent to @CID_FaceInfoRec. It is deprecated but */ - /* kept to maintain source compatibility between various versions of */ - /* FreeType. */ - /* */ - typedef CID_FaceInfoRec CID_Info; - - - /************************************************************************ - * - * @function: - * FT_Has_PS_Glyph_Names - * - * @description: - * Return true if a given face provides reliable PostScript glyph - * names. This is similar to using the @FT_HAS_GLYPH_NAMES macro, - * except that certain fonts (mostly TrueType) contain incorrect - * glyph name tables. - * - * When this function returns true, the caller is sure that the glyph - * names returned by @FT_Get_Glyph_Name are reliable. - * - * @input: - * face :: - * face handle - * - * @return: - * Boolean. True if glyph names are reliable. - * - */ - FT_EXPORT( FT_Int ) - FT_Has_PS_Glyph_Names( FT_Face face ); - - - /************************************************************************ - * - * @function: - * FT_Get_PS_Font_Info - * - * @description: - * Retrieve the @PS_FontInfoRec structure corresponding to a given - * PostScript font. - * - * @input: - * face :: - * PostScript face handle. - * - * @output: - * afont_info :: - * Output font info structure pointer. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The string pointers within the font info structure are owned by - * the face and don't need to be freed by the caller. - * - * If the font's format is not PostScript-based, this function will - * return the `FT_Err_Invalid_Argument' error code. - * - */ - FT_EXPORT( FT_Error ) - FT_Get_PS_Font_Info( FT_Face face, - PS_FontInfo afont_info ); - - - /************************************************************************ - * - * @function: - * FT_Get_PS_Font_Private - * - * @description: - * Retrieve the @PS_PrivateRec structure corresponding to a given - * PostScript font. - * - * @input: - * face :: - * PostScript face handle. - * - * @output: - * afont_private :: - * Output private dictionary structure pointer. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * The string pointers within the @PS_PrivateRec structure are owned by - * the face and don't need to be freed by the caller. - * - * If the font's format is not PostScript-based, this function returns - * the `FT_Err_Invalid_Argument' error code. - * - */ - FT_EXPORT( FT_Error ) - FT_Get_PS_Font_Private( FT_Face face, - PS_Private afont_private ); - - /* */ - - -FT_END_HEADER - -#endif /* __T1TABLES_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ttnameid.h b/android/jni/ndk_modules/freetype/include/freetype/ttnameid.h deleted file mode 100644 index 66aef043..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ttnameid.h +++ /dev/null @@ -1,1247 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttnameid.h */ -/* */ -/* TrueType name ID definitions (specification only). */ -/* */ -/* Copyright 1996-2002, 2003, 2004, 2006, 2007, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTNAMEID_H__ -#define __TTNAMEID_H__ - - -#include <ft2build.h> - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Section> */ - /* truetype_tables */ - /* */ - - - /*************************************************************************/ - /* */ - /* Possible values for the `platform' identifier code in the name */ - /* records of the TTF `name' table. */ - /* */ - /*************************************************************************/ - - - /*********************************************************************** - * - * @enum: - * TT_PLATFORM_XXX - * - * @description: - * A list of valid values for the `platform_id' identifier code in - * @FT_CharMapRec and @FT_SfntName structures. - * - * @values: - * TT_PLATFORM_APPLE_UNICODE :: - * Used by Apple to indicate a Unicode character map and/or name entry. - * See @TT_APPLE_ID_XXX for corresponding `encoding_id' values. Note - * that name entries in this format are coded as big-endian UCS-2 - * character codes _only_. - * - * TT_PLATFORM_MACINTOSH :: - * Used by Apple to indicate a MacOS-specific charmap and/or name entry. - * See @TT_MAC_ID_XXX for corresponding `encoding_id' values. Note that - * most TrueType fonts contain an Apple roman charmap to be usable on - * MacOS systems (even if they contain a Microsoft charmap as well). - * - * TT_PLATFORM_ISO :: - * This value was used to specify ISO/IEC 10646 charmaps. It is however - * now deprecated. See @TT_ISO_ID_XXX for a list of corresponding - * `encoding_id' values. - * - * TT_PLATFORM_MICROSOFT :: - * Used by Microsoft to indicate Windows-specific charmaps. See - * @TT_MS_ID_XXX for a list of corresponding `encoding_id' values. - * Note that most fonts contain a Unicode charmap using - * (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS). - * - * TT_PLATFORM_CUSTOM :: - * Used to indicate application-specific charmaps. - * - * TT_PLATFORM_ADOBE :: - * This value isn't part of any font format specification, but is used - * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec - * structure. See @TT_ADOBE_ID_XXX. - */ - -#define TT_PLATFORM_APPLE_UNICODE 0 -#define TT_PLATFORM_MACINTOSH 1 -#define TT_PLATFORM_ISO 2 /* deprecated */ -#define TT_PLATFORM_MICROSOFT 3 -#define TT_PLATFORM_CUSTOM 4 -#define TT_PLATFORM_ADOBE 7 /* artificial */ - - - /*********************************************************************** - * - * @enum: - * TT_APPLE_ID_XXX - * - * @description: - * A list of valid values for the `encoding_id' for - * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries. - * - * @values: - * TT_APPLE_ID_DEFAULT :: - * Unicode version 1.0. - * - * TT_APPLE_ID_UNICODE_1_1 :: - * Unicode 1.1; specifies Hangul characters starting at U+34xx. - * - * TT_APPLE_ID_ISO_10646 :: - * Deprecated (identical to preceding). - * - * TT_APPLE_ID_UNICODE_2_0 :: - * Unicode 2.0 and beyond (UTF-16 BMP only). - * - * TT_APPLE_ID_UNICODE_32 :: - * Unicode 3.1 and beyond, using UTF-32. - * - * TT_APPLE_ID_VARIANT_SELECTOR :: - * From Adobe, not Apple. Not a normal cmap. Specifies variations - * on a real cmap. - */ - -#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ -#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ -#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ -#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ -#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */ -#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */ - - - /*********************************************************************** - * - * @enum: - * TT_MAC_ID_XXX - * - * @description: - * A list of valid values for the `encoding_id' for - * @TT_PLATFORM_MACINTOSH charmaps and name entries. - * - * @values: - * TT_MAC_ID_ROMAN :: - * TT_MAC_ID_JAPANESE :: - * TT_MAC_ID_TRADITIONAL_CHINESE :: - * TT_MAC_ID_KOREAN :: - * TT_MAC_ID_ARABIC :: - * TT_MAC_ID_HEBREW :: - * TT_MAC_ID_GREEK :: - * TT_MAC_ID_RUSSIAN :: - * TT_MAC_ID_RSYMBOL :: - * TT_MAC_ID_DEVANAGARI :: - * TT_MAC_ID_GURMUKHI :: - * TT_MAC_ID_GUJARATI :: - * TT_MAC_ID_ORIYA :: - * TT_MAC_ID_BENGALI :: - * TT_MAC_ID_TAMIL :: - * TT_MAC_ID_TELUGU :: - * TT_MAC_ID_KANNADA :: - * TT_MAC_ID_MALAYALAM :: - * TT_MAC_ID_SINHALESE :: - * TT_MAC_ID_BURMESE :: - * TT_MAC_ID_KHMER :: - * TT_MAC_ID_THAI :: - * TT_MAC_ID_LAOTIAN :: - * TT_MAC_ID_GEORGIAN :: - * TT_MAC_ID_ARMENIAN :: - * TT_MAC_ID_MALDIVIAN :: - * TT_MAC_ID_SIMPLIFIED_CHINESE :: - * TT_MAC_ID_TIBETAN :: - * TT_MAC_ID_MONGOLIAN :: - * TT_MAC_ID_GEEZ :: - * TT_MAC_ID_SLAVIC :: - * TT_MAC_ID_VIETNAMESE :: - * TT_MAC_ID_SINDHI :: - * TT_MAC_ID_UNINTERP :: - */ - -#define TT_MAC_ID_ROMAN 0 -#define TT_MAC_ID_JAPANESE 1 -#define TT_MAC_ID_TRADITIONAL_CHINESE 2 -#define TT_MAC_ID_KOREAN 3 -#define TT_MAC_ID_ARABIC 4 -#define TT_MAC_ID_HEBREW 5 -#define TT_MAC_ID_GREEK 6 -#define TT_MAC_ID_RUSSIAN 7 -#define TT_MAC_ID_RSYMBOL 8 -#define TT_MAC_ID_DEVANAGARI 9 -#define TT_MAC_ID_GURMUKHI 10 -#define TT_MAC_ID_GUJARATI 11 -#define TT_MAC_ID_ORIYA 12 -#define TT_MAC_ID_BENGALI 13 -#define TT_MAC_ID_TAMIL 14 -#define TT_MAC_ID_TELUGU 15 -#define TT_MAC_ID_KANNADA 16 -#define TT_MAC_ID_MALAYALAM 17 -#define TT_MAC_ID_SINHALESE 18 -#define TT_MAC_ID_BURMESE 19 -#define TT_MAC_ID_KHMER 20 -#define TT_MAC_ID_THAI 21 -#define TT_MAC_ID_LAOTIAN 22 -#define TT_MAC_ID_GEORGIAN 23 -#define TT_MAC_ID_ARMENIAN 24 -#define TT_MAC_ID_MALDIVIAN 25 -#define TT_MAC_ID_SIMPLIFIED_CHINESE 25 -#define TT_MAC_ID_TIBETAN 26 -#define TT_MAC_ID_MONGOLIAN 27 -#define TT_MAC_ID_GEEZ 28 -#define TT_MAC_ID_SLAVIC 29 -#define TT_MAC_ID_VIETNAMESE 30 -#define TT_MAC_ID_SINDHI 31 -#define TT_MAC_ID_UNINTERP 32 - - - /*********************************************************************** - * - * @enum: - * TT_ISO_ID_XXX - * - * @description: - * A list of valid values for the `encoding_id' for - * @TT_PLATFORM_ISO charmaps and name entries. - * - * Their use is now deprecated. - * - * @values: - * TT_ISO_ID_7BIT_ASCII :: - * ASCII. - * TT_ISO_ID_10646 :: - * ISO/10646. - * TT_ISO_ID_8859_1 :: - * Also known as Latin-1. - */ - -#define TT_ISO_ID_7BIT_ASCII 0 -#define TT_ISO_ID_10646 1 -#define TT_ISO_ID_8859_1 2 - - - /*********************************************************************** - * - * @enum: - * TT_MS_ID_XXX - * - * @description: - * A list of valid values for the `encoding_id' for - * @TT_PLATFORM_MICROSOFT charmaps and name entries. - * - * @values: - * TT_MS_ID_SYMBOL_CS :: - * Corresponds to Microsoft symbol encoding. See - * @FT_ENCODING_MS_SYMBOL. - * - * TT_MS_ID_UNICODE_CS :: - * Corresponds to a Microsoft WGL4 charmap, matching Unicode. See - * @FT_ENCODING_UNICODE. - * - * TT_MS_ID_SJIS :: - * Corresponds to SJIS Japanese encoding. See @FT_ENCODING_SJIS. - * - * TT_MS_ID_GB2312 :: - * Corresponds to Simplified Chinese as used in Mainland China. See - * @FT_ENCODING_GB2312. - * - * TT_MS_ID_BIG_5 :: - * Corresponds to Traditional Chinese as used in Taiwan and Hong Kong. - * See @FT_ENCODING_BIG5. - * - * TT_MS_ID_WANSUNG :: - * Corresponds to Korean Wansung encoding. See @FT_ENCODING_WANSUNG. - * - * TT_MS_ID_JOHAB :: - * Corresponds to Johab encoding. See @FT_ENCODING_JOHAB. - * - * TT_MS_ID_UCS_4 :: - * Corresponds to UCS-4 or UTF-32 charmaps. This has been added to - * the OpenType specification version 1.4 (mid-2001.) - */ - -#define TT_MS_ID_SYMBOL_CS 0 -#define TT_MS_ID_UNICODE_CS 1 -#define TT_MS_ID_SJIS 2 -#define TT_MS_ID_GB2312 3 -#define TT_MS_ID_BIG_5 4 -#define TT_MS_ID_WANSUNG 5 -#define TT_MS_ID_JOHAB 6 -#define TT_MS_ID_UCS_4 10 - - - /*********************************************************************** - * - * @enum: - * TT_ADOBE_ID_XXX - * - * @description: - * A list of valid values for the `encoding_id' for - * @TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific extension! - * - * @values: - * TT_ADOBE_ID_STANDARD :: - * Adobe standard encoding. - * TT_ADOBE_ID_EXPERT :: - * Adobe expert encoding. - * TT_ADOBE_ID_CUSTOM :: - * Adobe custom encoding. - * TT_ADOBE_ID_LATIN_1 :: - * Adobe Latin~1 encoding. - */ - -#define TT_ADOBE_ID_STANDARD 0 -#define TT_ADOBE_ID_EXPERT 1 -#define TT_ADOBE_ID_CUSTOM 2 -#define TT_ADOBE_ID_LATIN_1 3 - - - /*************************************************************************/ - /* */ - /* Possible values of the language identifier field in the name records */ - /* of the TTF `name' table if the `platform' identifier code is */ - /* TT_PLATFORM_MACINTOSH. */ - /* */ - /* The canonical source for the Apple assigned Language ID's is at */ - /* */ - /* http://fonts.apple.com/TTRefMan/RM06/Chap6name.html */ - /* */ -#define TT_MAC_LANGID_ENGLISH 0 -#define TT_MAC_LANGID_FRENCH 1 -#define TT_MAC_LANGID_GERMAN 2 -#define TT_MAC_LANGID_ITALIAN 3 -#define TT_MAC_LANGID_DUTCH 4 -#define TT_MAC_LANGID_SWEDISH 5 -#define TT_MAC_LANGID_SPANISH 6 -#define TT_MAC_LANGID_DANISH 7 -#define TT_MAC_LANGID_PORTUGUESE 8 -#define TT_MAC_LANGID_NORWEGIAN 9 -#define TT_MAC_LANGID_HEBREW 10 -#define TT_MAC_LANGID_JAPANESE 11 -#define TT_MAC_LANGID_ARABIC 12 -#define TT_MAC_LANGID_FINNISH 13 -#define TT_MAC_LANGID_GREEK 14 -#define TT_MAC_LANGID_ICELANDIC 15 -#define TT_MAC_LANGID_MALTESE 16 -#define TT_MAC_LANGID_TURKISH 17 -#define TT_MAC_LANGID_CROATIAN 18 -#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19 -#define TT_MAC_LANGID_URDU 20 -#define TT_MAC_LANGID_HINDI 21 -#define TT_MAC_LANGID_THAI 22 -#define TT_MAC_LANGID_KOREAN 23 -#define TT_MAC_LANGID_LITHUANIAN 24 -#define TT_MAC_LANGID_POLISH 25 -#define TT_MAC_LANGID_HUNGARIAN 26 -#define TT_MAC_LANGID_ESTONIAN 27 -#define TT_MAC_LANGID_LETTISH 28 -#define TT_MAC_LANGID_SAAMISK 29 -#define TT_MAC_LANGID_FAEROESE 30 -#define TT_MAC_LANGID_FARSI 31 -#define TT_MAC_LANGID_RUSSIAN 32 -#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33 -#define TT_MAC_LANGID_FLEMISH 34 -#define TT_MAC_LANGID_IRISH 35 -#define TT_MAC_LANGID_ALBANIAN 36 -#define TT_MAC_LANGID_ROMANIAN 37 -#define TT_MAC_LANGID_CZECH 38 -#define TT_MAC_LANGID_SLOVAK 39 -#define TT_MAC_LANGID_SLOVENIAN 40 -#define TT_MAC_LANGID_YIDDISH 41 -#define TT_MAC_LANGID_SERBIAN 42 -#define TT_MAC_LANGID_MACEDONIAN 43 -#define TT_MAC_LANGID_BULGARIAN 44 -#define TT_MAC_LANGID_UKRAINIAN 45 -#define TT_MAC_LANGID_BYELORUSSIAN 46 -#define TT_MAC_LANGID_UZBEK 47 -#define TT_MAC_LANGID_KAZAKH 48 -#define TT_MAC_LANGID_AZERBAIJANI 49 -#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49 -#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50 -#define TT_MAC_LANGID_ARMENIAN 51 -#define TT_MAC_LANGID_GEORGIAN 52 -#define TT_MAC_LANGID_MOLDAVIAN 53 -#define TT_MAC_LANGID_KIRGHIZ 54 -#define TT_MAC_LANGID_TAJIKI 55 -#define TT_MAC_LANGID_TURKMEN 56 -#define TT_MAC_LANGID_MONGOLIAN 57 -#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57 -#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58 -#define TT_MAC_LANGID_PASHTO 59 -#define TT_MAC_LANGID_KURDISH 60 -#define TT_MAC_LANGID_KASHMIRI 61 -#define TT_MAC_LANGID_SINDHI 62 -#define TT_MAC_LANGID_TIBETAN 63 -#define TT_MAC_LANGID_NEPALI 64 -#define TT_MAC_LANGID_SANSKRIT 65 -#define TT_MAC_LANGID_MARATHI 66 -#define TT_MAC_LANGID_BENGALI 67 -#define TT_MAC_LANGID_ASSAMESE 68 -#define TT_MAC_LANGID_GUJARATI 69 -#define TT_MAC_LANGID_PUNJABI 70 -#define TT_MAC_LANGID_ORIYA 71 -#define TT_MAC_LANGID_MALAYALAM 72 -#define TT_MAC_LANGID_KANNADA 73 -#define TT_MAC_LANGID_TAMIL 74 -#define TT_MAC_LANGID_TELUGU 75 -#define TT_MAC_LANGID_SINHALESE 76 -#define TT_MAC_LANGID_BURMESE 77 -#define TT_MAC_LANGID_KHMER 78 -#define TT_MAC_LANGID_LAO 79 -#define TT_MAC_LANGID_VIETNAMESE 80 -#define TT_MAC_LANGID_INDONESIAN 81 -#define TT_MAC_LANGID_TAGALOG 82 -#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83 -#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84 -#define TT_MAC_LANGID_AMHARIC 85 -#define TT_MAC_LANGID_TIGRINYA 86 -#define TT_MAC_LANGID_GALLA 87 -#define TT_MAC_LANGID_SOMALI 88 -#define TT_MAC_LANGID_SWAHILI 89 -#define TT_MAC_LANGID_RUANDA 90 -#define TT_MAC_LANGID_RUNDI 91 -#define TT_MAC_LANGID_CHEWA 92 -#define TT_MAC_LANGID_MALAGASY 93 -#define TT_MAC_LANGID_ESPERANTO 94 -#define TT_MAC_LANGID_WELSH 128 -#define TT_MAC_LANGID_BASQUE 129 -#define TT_MAC_LANGID_CATALAN 130 -#define TT_MAC_LANGID_LATIN 131 -#define TT_MAC_LANGID_QUECHUA 132 -#define TT_MAC_LANGID_GUARANI 133 -#define TT_MAC_LANGID_AYMARA 134 -#define TT_MAC_LANGID_TATAR 135 -#define TT_MAC_LANGID_UIGHUR 136 -#define TT_MAC_LANGID_DZONGKHA 137 -#define TT_MAC_LANGID_JAVANESE 138 -#define TT_MAC_LANGID_SUNDANESE 139 - - -#if 0 /* these seem to be errors that have been dropped */ - -#define TT_MAC_LANGID_SCOTTISH_GAELIC 140 -#define TT_MAC_LANGID_IRISH_GAELIC 141 - -#endif - - - /* The following codes are new as of 2000-03-10 */ -#define TT_MAC_LANGID_GALICIAN 140 -#define TT_MAC_LANGID_AFRIKAANS 141 -#define TT_MAC_LANGID_BRETON 142 -#define TT_MAC_LANGID_INUKTITUT 143 -#define TT_MAC_LANGID_SCOTTISH_GAELIC 144 -#define TT_MAC_LANGID_MANX_GAELIC 145 -#define TT_MAC_LANGID_IRISH_GAELIC 146 -#define TT_MAC_LANGID_TONGAN 147 -#define TT_MAC_LANGID_GREEK_POLYTONIC 148 -#define TT_MAC_LANGID_GREELANDIC 149 -#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 - - - /*************************************************************************/ - /* */ - /* Possible values of the language identifier field in the name records */ - /* of the TTF `name' table if the `platform' identifier code is */ - /* TT_PLATFORM_MICROSOFT. */ - /* */ - /* The canonical source for the MS assigned LCID's (seems to) be at */ - /* */ - /* http://www.microsoft.com/globaldev/reference/lcid-all.mspx */ - /* */ - /* It used to be at various places, among them */ - /* */ - /* http://www.microsoft.com/typography/OTSPEC/lcid-cp.txt */ - /* http://www.microsoft.com/globaldev/reference/loclanghome.asp */ - /* http://support.microsoft.com/support/kb/articles/Q224/8/04.ASP */ - /* http://msdn.microsoft.com/library/en-us/passport25/ */ - /* NET_Passport_VBScript_Documentation/Single_Sign_In/ */ - /* Advanced_Single_Sign_In/Localization_and_LCIDs.asp */ - /* */ - /* Hopefully, it seems now that the Globaldev site prevails... */ - /* (updated by Antoine, 2004-02-17) */ - -#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 -#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 -#define TT_MS_LANGID_ARABIC_IRAQ 0x0801 -#define TT_MS_LANGID_ARABIC_EGYPT 0x0c01 -#define TT_MS_LANGID_ARABIC_LIBYA 0x1001 -#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 -#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 -#define TT_MS_LANGID_ARABIC_TUNISIA 0x1c01 -#define TT_MS_LANGID_ARABIC_OMAN 0x2001 -#define TT_MS_LANGID_ARABIC_YEMEN 0x2401 -#define TT_MS_LANGID_ARABIC_SYRIA 0x2801 -#define TT_MS_LANGID_ARABIC_JORDAN 0x2c01 -#define TT_MS_LANGID_ARABIC_LEBANON 0x3001 -#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 -#define TT_MS_LANGID_ARABIC_UAE 0x3801 -#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3c01 -#define TT_MS_LANGID_ARABIC_QATAR 0x4001 -#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 -#define TT_MS_LANGID_CATALAN_SPAIN 0x0403 -#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 -#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 -#define TT_MS_LANGID_CHINESE_PRC 0x0804 -#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0c04 -#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 - -#if 1 /* this looks like the correct value */ -#define TT_MS_LANGID_CHINESE_MACAU 0x1404 -#else /* but beware, Microsoft may change its mind... - the most recent Word reference has the following: */ -#define TT_MS_LANGID_CHINESE_MACAU TT_MS_LANGID_CHINESE_HONG_KONG -#endif - -#if 0 /* used only with .NET `cultures'; commented out */ -#define TT_MS_LANGID_CHINESE_TRADITIONAL 0x7C04 -#endif - -#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 -#define TT_MS_LANGID_DANISH_DENMARK 0x0406 -#define TT_MS_LANGID_GERMAN_GERMANY 0x0407 -#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 -#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0c07 -#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 -#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407 -#define TT_MS_LANGID_GREEK_GREECE 0x0408 - - /* don't ask what this one means... It is commented out currently. */ -#if 0 -#define TT_MS_LANGID_GREEK_GREECE2 0x2008 -#endif - -#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 -#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 -#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 -#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0c09 -#define TT_MS_LANGID_ENGLISH_CANADA 0x1009 -#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 -#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 -#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1c09 -#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 -#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 -#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 -#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2c09 -#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 -#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 -#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 -#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3c09 -#define TT_MS_LANGID_ENGLISH_INDIA 0x4009 -#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 -#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 -#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040a -#define TT_MS_LANGID_SPANISH_MEXICO 0x080a -#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0c0a -#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100a -#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140a -#define TT_MS_LANGID_SPANISH_PANAMA 0x180a -#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1c0a -#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200a -#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240a -#define TT_MS_LANGID_SPANISH_PERU 0x280a -#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2c0a -#define TT_MS_LANGID_SPANISH_ECUADOR 0x300a -#define TT_MS_LANGID_SPANISH_CHILE 0x340a -#define TT_MS_LANGID_SPANISH_URUGUAY 0x380a -#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3c0a -#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400a -#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440a -#define TT_MS_LANGID_SPANISH_HONDURAS 0x480a -#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4c0a -#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500a -#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540a - /* The following ID blatantly violate MS specs by using a */ - /* sublanguage > 0x1F. */ -#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40aU -#define TT_MS_LANGID_FINNISH_FINLAND 0x040b -#define TT_MS_LANGID_FRENCH_FRANCE 0x040c -#define TT_MS_LANGID_FRENCH_BELGIUM 0x080c -#define TT_MS_LANGID_FRENCH_CANADA 0x0c0c -#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100c -#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140c -#define TT_MS_LANGID_FRENCH_MONACO 0x180c -#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1c0c -#define TT_MS_LANGID_FRENCH_REUNION 0x200c -#define TT_MS_LANGID_FRENCH_CONGO 0x240c - /* which was formerly: */ -#define TT_MS_LANGID_FRENCH_ZAIRE TT_MS_LANGID_FRENCH_CONGO -#define TT_MS_LANGID_FRENCH_SENEGAL 0x280c -#define TT_MS_LANGID_FRENCH_CAMEROON 0x2c0c -#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300c -#define TT_MS_LANGID_FRENCH_MALI 0x340c -#define TT_MS_LANGID_FRENCH_MOROCCO 0x380c -#define TT_MS_LANGID_FRENCH_HAITI 0x3c0c - /* and another violation of the spec (see 0xE40aU) */ -#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40cU -#define TT_MS_LANGID_HEBREW_ISRAEL 0x040d -#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040e -#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040f -#define TT_MS_LANGID_ITALIAN_ITALY 0x0410 -#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 -#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 -#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412 -#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 -#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 -#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 -#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 -#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 -#define TT_MS_LANGID_POLISH_POLAND 0x0415 -#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 -#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 -#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417 -#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 -#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 -#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 -#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 -#define TT_MS_LANGID_CROATIAN_CROATIA 0x041a -#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081a -#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0c1a - -#if 0 /* this used to be this value, but it looks like we were wrong */ -#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x101a -#else /* current sources say */ -#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101a -#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141a - /* and XPsp2 Platform SDK added (2004-07-26) */ - /* Names are shortened to be significant within 40 chars. */ -#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181a -#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x181a -#endif - -#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041b -#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041c -#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041d -#define TT_MS_LANGID_SWEDISH_FINLAND 0x081d -#define TT_MS_LANGID_THAI_THAILAND 0x041e -#define TT_MS_LANGID_TURKISH_TURKEY 0x041f -#define TT_MS_LANGID_URDU_PAKISTAN 0x0420 -#define TT_MS_LANGID_URDU_INDIA 0x0820 -#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 -#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 -#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 -#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424 -#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 -#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 -#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 -#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 -#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 -#define TT_MS_LANGID_FARSI_IRAN 0x0429 -#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042a -#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042b -#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042c -#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082c -#define TT_MS_LANGID_BASQUE_SPAIN 0x042d -#define TT_MS_LANGID_SORBIAN_GERMANY 0x042e -#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042f -#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 -#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 -#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432 -#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 -#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434 -#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435 -#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 -#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 -#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 -#define TT_MS_LANGID_HINDI_INDIA 0x0439 -#define TT_MS_LANGID_MALTESE_MALTA 0x043a - /* Added by XPsp2 Platform SDK (2004-07-26) */ -#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043b -#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083b -#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3b -#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103b -#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143b -#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183b -#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3b -#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203b -#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243b - /* ... and we also keep our old identifier... */ -#define TT_MS_LANGID_SAAMI_LAPONIA 0x043b - -#if 0 /* this seems to be a previous inversion */ -#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c -#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c -#else -#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c -#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c -#endif - -#define TT_MS_LANGID_YIDDISH_GERMANY 0x043d -#define TT_MS_LANGID_MALAY_MALAYSIA 0x043e -#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083e -#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043f -#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440 - /* alias declared in Windows 2000 */ -#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ - TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN - -#define TT_MS_LANGID_SWAHILI_KENYA 0x0441 -#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 -#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 -#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 -#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444 -#define TT_MS_LANGID_BENGALI_INDIA 0x0445 -#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 -#define TT_MS_LANGID_PUNJABI_INDIA 0x0446 -#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 -#define TT_MS_LANGID_GUJARATI_INDIA 0x0447 -#define TT_MS_LANGID_ORIYA_INDIA 0x0448 -#define TT_MS_LANGID_TAMIL_INDIA 0x0449 -#define TT_MS_LANGID_TELUGU_INDIA 0x044a -#define TT_MS_LANGID_KANNADA_INDIA 0x044b -#define TT_MS_LANGID_MALAYALAM_INDIA 0x044c -#define TT_MS_LANGID_ASSAMESE_INDIA 0x044d -#define TT_MS_LANGID_MARATHI_INDIA 0x044e -#define TT_MS_LANGID_SANSKRIT_INDIA 0x044f -#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 -#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN 0x0850 -#define TT_MS_LANGID_TIBETAN_CHINA 0x0451 - /* Don't use the next constant! It has */ - /* (1) the wrong spelling (Dzonghka) */ - /* (2) Microsoft doesn't officially define it -- */ - /* at least it is not in the List of Local */ - /* ID Values. */ - /* (3) Dzongkha is not the same language as */ - /* Tibetan, so merging it is wrong anyway. */ - /* */ - /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW. */ -#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 - -#if 0 - /* the following used to be defined */ -#define TT_MS_LANGID_TIBETAN_BHUTAN 0x0451 - /* ... but it was changed; */ -#else - /* So we will continue to #define it, but with the correct value */ -#define TT_MS_LANGID_TIBETAN_BHUTAN TT_MS_LANGID_DZONGHKA_BHUTAN -#endif - -#define TT_MS_LANGID_WELSH_WALES 0x0452 -#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 -#define TT_MS_LANGID_LAO_LAOS 0x0454 -#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 -#define TT_MS_LANGID_GALICIAN_SPAIN 0x0456 -#define TT_MS_LANGID_KONKANI_INDIA 0x0457 -#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 -#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 -#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 - /* Missing a LCID for Sindhi in Devanagari script */ -#define TT_MS_LANGID_SYRIAC_SYRIA 0x045a -#define TT_MS_LANGID_SINHALESE_SRI_LANKA 0x045b -#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045c -#define TT_MS_LANGID_INUKTITUT_CANADA 0x045d -#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045e -#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045f -#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN 0x085f - /* Missing a LCID for Tifinagh script */ -#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 - /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */ - /* script is yet unclear... might be Arabic, Nagari or Sharada */ -#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 - /* ... and aliased (by MS) for compatibility reasons. */ -#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA -#define TT_MS_LANGID_NEPALI_NEPAL 0x0461 -#define TT_MS_LANGID_NEPALI_INDIA 0x0861 -#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 -#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 -#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 -#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 - /* alias declared in Windows 2000 */ -#define TT_MS_LANGID_DIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES -#define TT_MS_LANGID_EDO_NIGERIA 0x0466 -#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 -#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 -#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 -#define TT_MS_LANGID_YORUBA_NIGERIA 0x046a -#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046b -#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086b -#define TT_MS_LANGID_QUECHUA_PERU 0x0c6b -#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA 0x046c - /* Also spelled by XPsp2 Platform SDK (2004-07-26) */ -#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ - TT_MS_LANGID_SEPEDI_SOUTH_AFRICA - /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */ -#define TT_MS_LANGID_IGBO_NIGERIA 0x0470 -#define TT_MS_LANGID_KANURI_NIGERIA 0x0471 -#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 -#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 -#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 - /* also spelled in the `Passport SDK' list as: */ -#define TT_MS_LANGID_TIGRIGNA_ERYTREA TT_MS_LANGID_TIGRIGNA_ERYTHREA -#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 -#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 -#define TT_MS_LANGID_LATIN 0x0476 -#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 - /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */ - /* not written (but OTOH the peculiar writing system is worth */ - /* studying). */ -#define TT_MS_LANGID_YI_CHINA 0x0478 -#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 - /* language codes from 0x047a to 0x047f are (still) unknown. */ -#define TT_MS_LANGID_UIGHUR_CHINA 0x0480 -#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 - -#if 0 /* not deemed useful for fonts */ -#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE 0x04ff -#endif - - - /*************************************************************************/ - /* */ - /* Possible values of the `name' identifier field in the name records of */ - /* the TTF `name' table. These values are platform independent. */ - /* */ -#define TT_NAME_ID_COPYRIGHT 0 -#define TT_NAME_ID_FONT_FAMILY 1 -#define TT_NAME_ID_FONT_SUBFAMILY 2 -#define TT_NAME_ID_UNIQUE_ID 3 -#define TT_NAME_ID_FULL_NAME 4 -#define TT_NAME_ID_VERSION_STRING 5 -#define TT_NAME_ID_PS_NAME 6 -#define TT_NAME_ID_TRADEMARK 7 - - /* the following values are from the OpenType spec */ -#define TT_NAME_ID_MANUFACTURER 8 -#define TT_NAME_ID_DESIGNER 9 -#define TT_NAME_ID_DESCRIPTION 10 -#define TT_NAME_ID_VENDOR_URL 11 -#define TT_NAME_ID_DESIGNER_URL 12 -#define TT_NAME_ID_LICENSE 13 -#define TT_NAME_ID_LICENSE_URL 14 - /* number 15 is reserved */ -#define TT_NAME_ID_PREFERRED_FAMILY 16 -#define TT_NAME_ID_PREFERRED_SUBFAMILY 17 -#define TT_NAME_ID_MAC_FULL_NAME 18 - - /* The following code is new as of 2000-01-21 */ -#define TT_NAME_ID_SAMPLE_TEXT 19 - - /* This is new in OpenType 1.3 */ -#define TT_NAME_ID_CID_FINDFONT_NAME 20 - - /* This is new in OpenType 1.5 */ -#define TT_NAME_ID_WWS_FAMILY 21 -#define TT_NAME_ID_WWS_SUBFAMILY 22 - - - /*************************************************************************/ - /* */ - /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */ - /* */ - /* Updated 08-Nov-2008. */ - /* */ - - /* Bit 0 Basic Latin */ -#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ - /* Bit 1 C1 Controls and Latin-1 Supplement */ -#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */ - /* Bit 2 Latin Extended-A */ -#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */ - /* Bit 3 Latin Extended-B */ -#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */ - /* Bit 4 IPA Extensions */ - /* Phonetic Extensions */ - /* Phonetic Extensions Supplement */ -#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ - /* U+1D00-U+1D7F */ - /* U+1D80-U+1DBF */ - /* Bit 5 Spacing Modifier Letters */ - /* Modifier Tone Letters */ -#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ - /* U+A700-U+A71F */ - /* Bit 6 Combining Diacritical Marks */ - /* Combining Diacritical Marks Supplement */ -#define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */ - /* U+1DC0-U+1DFF */ - /* Bit 7 Greek and Coptic */ -#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ - /* Bit 8 Coptic */ -#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */ - /* Bit 9 Cyrillic */ - /* Cyrillic Supplement */ - /* Cyrillic Extended-A */ - /* Cyrillic Extended-B */ -#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ - /* U+0500-U+052F */ - /* U+2DE0-U+2DFF */ - /* U+A640-U+A69F */ - /* Bit 10 Armenian */ -#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */ - /* Bit 11 Hebrew */ -#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */ - /* Bit 12 Vai */ -#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */ - /* Bit 13 Arabic */ - /* Arabic Supplement */ -#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ - /* U+0750-U+077F */ - /* Bit 14 NKo */ -#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */ - /* Bit 15 Devanagari */ -#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */ - /* Bit 16 Bengali */ -#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */ - /* Bit 17 Gurmukhi */ -#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */ - /* Bit 18 Gujarati */ -#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */ - /* Bit 19 Oriya */ -#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */ - /* Bit 20 Tamil */ -#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */ - /* Bit 21 Telugu */ -#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ - /* Bit 22 Kannada */ -#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */ - /* Bit 23 Malayalam */ -#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */ - /* Bit 24 Thai */ -#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */ - /* Bit 25 Lao */ -#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */ - /* Bit 26 Georgian */ - /* Georgian Supplement */ -#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ - /* U+2D00-U+2D2F */ - /* Bit 27 Balinese */ -#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */ - /* Bit 28 Hangul Jamo */ -#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ - /* Bit 29 Latin Extended Additional */ - /* Latin Extended-C */ - /* Latin Extended-D */ -#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ - /* U+2C60-U+2C7F */ - /* U+A720-U+A7FF */ - /* Bit 30 Greek Extended */ -#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ - /* Bit 31 General Punctuation */ - /* Supplemental Punctuation */ -#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ - /* U+2E00-U+2E7F */ - /* Bit 32 Superscripts And Subscripts */ -#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ - /* Bit 33 Currency Symbols */ -#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ - /* Bit 34 Combining Diacritical Marks For Symbols */ -#define TT_UCR_COMBINING_DIACRITICS_SYMB (1L << 2) /* U+20D0-U+20FF */ - /* Bit 35 Letterlike Symbols */ -#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ - /* Bit 36 Number Forms */ -#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */ - /* Bit 37 Arrows */ - /* Supplemental Arrows-A */ - /* Supplemental Arrows-B */ - /* Miscellaneous Symbols and Arrows */ -#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ - /* U+27F0-U+27FF */ - /* U+2900-U+297F */ - /* U+2B00-U+2BFF */ - /* Bit 38 Mathematical Operators */ - /* Supplemental Mathematical Operators */ - /* Miscellaneous Mathematical Symbols-A */ - /* Miscellaneous Mathematical Symbols-B */ -#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ - /* U+2A00-U+2AFF */ - /* U+27C0-U+27EF */ - /* U+2980-U+29FF */ - /* Bit 39 Miscellaneous Technical */ -#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */ - /* Bit 40 Control Pictures */ -#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */ - /* Bit 41 Optical Character Recognition */ -#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */ - /* Bit 42 Enclosed Alphanumerics */ -#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */ - /* Bit 43 Box Drawing */ -#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */ - /* Bit 44 Block Elements */ -#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */ - /* Bit 45 Geometric Shapes */ -#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */ - /* Bit 46 Miscellaneous Symbols */ -#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */ - /* Bit 47 Dingbats */ -#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */ - /* Bit 48 CJK Symbols and Punctuation */ -#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */ - /* Bit 49 Hiragana */ -#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */ - /* Bit 50 Katakana */ - /* Katakana Phonetic Extensions */ -#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ - /* U+31F0-U+31FF */ - /* Bit 51 Bopomofo */ - /* Bopomofo Extended */ -#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */ - /* U+31A0-U+31BF */ - /* Bit 52 Hangul Compatibility Jamo */ -#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */ - /* Bit 53 Phags-Pa */ -#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */ -#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */ -#define TT_UCR_PHAGSPA - /* Bit 54 Enclosed CJK Letters and Months */ -#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */ - /* Bit 55 CJK Compatibility */ -#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */ - /* Bit 56 Hangul Syllables */ -#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ - /* Bit 57 High Surrogates */ - /* High Private Use Surrogates */ - /* Low Surrogates */ - /* */ - /* According to OpenType specs v.1.3+, */ - /* setting bit 57 implies that there is */ - /* at least one codepoint beyond the */ - /* Basic Multilingual Plane that is */ - /* supported by this font. So it really */ - /* means >= U+10000 */ -#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ - /* U+DB80-U+DBFF */ - /* U+DC00-U+DFFF */ -#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES - /* Bit 58 Phoenician */ -#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/ - /* Bit 59 CJK Unified Ideographs */ - /* CJK Radicals Supplement */ - /* Kangxi Radicals */ - /* Ideographic Description Characters */ - /* CJK Unified Ideographs Extension A */ - /* CJK Unified Ideographs Extension B */ - /* Kanbun */ -#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */ - /* U+2E80-U+2EFF */ - /* U+2F00-U+2FDF */ - /* U+2FF0-U+2FFF */ - /* U+3400-U+4DB5 */ - /*U+20000-U+2A6DF*/ - /* U+3190-U+319F */ - /* Bit 60 Private Use */ -#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ - /* Bit 61 CJK Strokes */ - /* CJK Compatibility Ideographs */ - /* CJK Compatibility Ideographs Supplement */ -#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */ - /* U+F900-U+FAFF */ - /*U+2F800-U+2FA1F*/ - /* Bit 62 Alphabetic Presentation Forms */ -#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ - /* Bit 63 Arabic Presentation Forms-A */ -#define TT_UCR_ARABIC_PRESENTATIONS_A (1L << 31) /* U+FB50-U+FDFF */ - /* Bit 64 Combining Half Marks */ -#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ - /* Bit 65 Vertical forms */ - /* CJK Compatibility Forms */ -#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */ - /* U+FE30-U+FE4F */ - /* Bit 66 Small Form Variants */ -#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ - /* Bit 67 Arabic Presentation Forms-B */ -#define TT_UCR_ARABIC_PRESENTATIONS_B (1L << 3) /* U+FE70-U+FEFE */ - /* Bit 68 Halfwidth and Fullwidth Forms */ -#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ - /* Bit 69 Specials */ -#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */ - /* Bit 70 Tibetan */ -#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */ - /* Bit 71 Syriac */ -#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */ - /* Bit 72 Thaana */ -#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */ - /* Bit 73 Sinhala */ -#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */ - /* Bit 74 Myanmar */ -#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */ - /* Bit 75 Ethiopic */ - /* Ethiopic Supplement */ - /* Ethiopic Extended */ -#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ - /* U+1380-U+139F */ - /* U+2D80-U+2DDF */ - /* Bit 76 Cherokee */ -#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ - /* Bit 77 Unified Canadian Aboriginal Syllabics */ -#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */ - /* Bit 78 Ogham */ -#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */ - /* Bit 79 Runic */ -#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */ - /* Bit 80 Khmer */ - /* Khmer Symbols */ -#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ - /* U+19E0-U+19FF */ - /* Bit 81 Mongolian */ -#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */ - /* Bit 82 Braille Patterns */ -#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ - /* Bit 83 Yi Syllables */ - /* Yi Radicals */ -#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */ - /* U+A490-U+A4CF */ - /* Bit 84 Tagalog */ - /* Hanunoo */ - /* Buhid */ - /* Tagbanwa */ -#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */ - /* U+1720-U+173F */ - /* U+1740-U+175F */ - /* U+1760-U+177F */ - /* Bit 85 Old Italic */ -#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/ - /* Bit 86 Gothic */ -#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/ - /* Bit 87 Deseret */ -#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/ - /* Bit 88 Byzantine Musical Symbols */ - /* Musical Symbols */ - /* Ancient Greek Musical Notation */ -#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/ - /*U+1D100-U+1D1FF*/ - /*U+1D200-U+1D24F*/ - /* Bit 89 Mathematical Alphanumeric Symbols */ -#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/ - /* Bit 90 Private Use (plane 15) */ - /* Private Use (plane 16) */ -#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/ - /*U+100000-U+10FFFD*/ - /* Bit 91 Variation Selectors */ - /* Variation Selectors Supplement */ -#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */ - /*U+E0100-U+E01EF*/ - /* Bit 92 Tags */ -#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/ - /* Bit 93 Limbu */ -#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */ - /* Bit 94 Tai Le */ -#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */ - /* Bit 95 New Tai Lue */ -#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */ - /* Bit 96 Buginese */ -#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */ - /* Bit 97 Glagolitic */ -#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */ - /* Bit 98 Tifinagh */ -#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */ - /* Bit 99 Yijing Hexagram Symbols */ -#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */ - /* Bit 100 Syloti Nagri */ -#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */ - /* Bit 101 Linear B Syllabary */ - /* Linear B Ideograms */ - /* Aegean Numbers */ -#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/ - /*U+10080-U+100FF*/ - /*U+10100-U+1013F*/ - /* Bit 102 Ancient Greek Numbers */ -#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/ - /* Bit 103 Ugaritic */ -#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/ - /* Bit 104 Old Persian */ -#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/ - /* Bit 105 Shavian */ -#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/ - /* Bit 106 Osmanya */ -#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/ - /* Bit 107 Cypriot Syllabary */ -#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/ - /* Bit 108 Kharoshthi */ -#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/ - /* Bit 109 Tai Xuan Jing Symbols */ -#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/ - /* Bit 110 Cuneiform */ - /* Cuneiform Numbers and Punctuation */ -#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/ - /*U+12400-U+1247F*/ - /* Bit 111 Counting Rod Numerals */ -#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/ - /* Bit 112 Sundanese */ -#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */ - /* Bit 113 Lepcha */ -#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */ - /* Bit 114 Ol Chiki */ -#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */ - /* Bit 115 Saurashtra */ -#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */ - /* Bit 116 Kayah Li */ -#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */ - /* Bit 117 Rejang */ -#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */ - /* Bit 118 Cham */ -#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */ - /* Bit 119 Ancient Symbols */ -#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/ - /* Bit 120 Phaistos Disc */ -#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/ - /* Bit 121 Carian */ - /* Lycian */ - /* Lydian */ -#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/ - /*U+10280-U+1029F*/ - /*U+10920-U+1093F*/ - /* Bit 122 Domino Tiles */ - /* Mahjong Tiles */ -#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/ - /*U+1F000-U+1F02F*/ - /* Bit 123-127 Reserved for process-internal usage */ - - - /*************************************************************************/ - /* */ - /* Some compilers have a very limited length of identifiers. */ - /* */ -#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ ) -#define HAVE_LIMIT_ON_IDENTS -#endif - - -#ifndef HAVE_LIMIT_ON_IDENTS - - - /*************************************************************************/ - /* */ - /* Here some alias #defines in order to be clearer. */ - /* */ - /* These are not always #defined to stay within the 31~character limit */ - /* which some compilers have. */ - /* */ - /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern */ - /* Borland compilers (read: from BC++ 3.1 on) can increase this limit. */ - /* If you get a warning with such a compiler, use the -i40 switch. */ - /* */ -#define TT_UCR_ARABIC_PRESENTATION_FORMS_A \ - TT_UCR_ARABIC_PRESENTATIONS_A -#define TT_UCR_ARABIC_PRESENTATION_FORMS_B \ - TT_UCR_ARABIC_PRESENTATIONS_B - -#define TT_UCR_COMBINING_DIACRITICAL_MARKS \ - TT_UCR_COMBINING_DIACRITICS -#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ - TT_UCR_COMBINING_DIACRITICS_SYMB - - -#endif /* !HAVE_LIMIT_ON_IDENTS */ - - -FT_END_HEADER - -#endif /* __TTNAMEID_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/tttables.h b/android/jni/ndk_modules/freetype/include/freetype/tttables.h deleted file mode 100644 index 4610e501..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/tttables.h +++ /dev/null @@ -1,759 +0,0 @@ -/***************************************************************************/ -/* */ -/* tttables.h */ -/* */ -/* Basic SFNT/TrueType tables definitions and interface */ -/* (specification only). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTTABLES_H__ -#define __TTTABLES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /* */ - /* <Section> */ - /* truetype_tables */ - /* */ - /* <Title> */ - /* TrueType Tables */ - /* */ - /* <Abstract> */ - /* TrueType specific table types and functions. */ - /* */ - /* <Description> */ - /* This section contains the definition of TrueType-specific tables */ - /* as well as some routines used to access and process them. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_Header */ - /* */ - /* <Description> */ - /* A structure used to model a TrueType font header table. All */ - /* fields follow the TrueType specification. */ - /* */ - typedef struct TT_Header_ - { - FT_Fixed Table_Version; - FT_Fixed Font_Revision; - - FT_Long CheckSum_Adjust; - FT_Long Magic_Number; - - FT_UShort Flags; - FT_UShort Units_Per_EM; - - FT_Long Created [2]; - FT_Long Modified[2]; - - FT_Short xMin; - FT_Short yMin; - FT_Short xMax; - FT_Short yMax; - - FT_UShort Mac_Style; - FT_UShort Lowest_Rec_PPEM; - - FT_Short Font_Direction; - FT_Short Index_To_Loc_Format; - FT_Short Glyph_Data_Format; - - } TT_Header; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_HoriHeader */ - /* */ - /* <Description> */ - /* A structure used to model a TrueType horizontal header, the `hhea' */ - /* table, as well as the corresponding horizontal metrics table, */ - /* i.e., the `hmtx' table. */ - /* */ - /* <Fields> */ - /* Version :: The table version. */ - /* */ - /* Ascender :: The font's ascender, i.e., the distance */ - /* from the baseline to the top-most of all */ - /* glyph points found in the font. */ - /* */ - /* This value is invalid in many fonts, as */ - /* it is usually set by the font designer, */ - /* and often reflects only a portion of the */ - /* glyphs found in the font (maybe ASCII). */ - /* */ - /* You should use the `sTypoAscender' field */ - /* of the OS/2 table instead if you want */ - /* the correct one. */ - /* */ - /* Descender :: The font's descender, i.e., the distance */ - /* from the baseline to the bottom-most of */ - /* all glyph points found in the font. It */ - /* is negative. */ - /* */ - /* This value is invalid in many fonts, as */ - /* it is usually set by the font designer, */ - /* and often reflects only a portion of the */ - /* glyphs found in the font (maybe ASCII). */ - /* */ - /* You should use the `sTypoDescender' */ - /* field of the OS/2 table instead if you */ - /* want the correct one. */ - /* */ - /* Line_Gap :: The font's line gap, i.e., the distance */ - /* to add to the ascender and descender to */ - /* get the BTB, i.e., the */ - /* baseline-to-baseline distance for the */ - /* font. */ - /* */ - /* advance_Width_Max :: This field is the maximum of all advance */ - /* widths found in the font. It can be */ - /* used to compute the maximum width of an */ - /* arbitrary string of text. */ - /* */ - /* min_Left_Side_Bearing :: The minimum left side bearing of all */ - /* glyphs within the font. */ - /* */ - /* min_Right_Side_Bearing :: The minimum right side bearing of all */ - /* glyphs within the font. */ - /* */ - /* xMax_Extent :: The maximum horizontal extent (i.e., the */ - /* `width' of a glyph's bounding box) for */ - /* all glyphs in the font. */ - /* */ - /* caret_Slope_Rise :: The rise coefficient of the cursor's */ - /* slope of the cursor (slope=rise/run). */ - /* */ - /* caret_Slope_Run :: The run coefficient of the cursor's */ - /* slope. */ - /* */ - /* Reserved :: 8~reserved bytes. */ - /* */ - /* metric_Data_Format :: Always~0. */ - /* */ - /* number_Of_HMetrics :: Number of HMetrics entries in the `hmtx' */ - /* table -- this value can be smaller than */ - /* the total number of glyphs in the font. */ - /* */ - /* long_metrics :: A pointer into the `hmtx' table. */ - /* */ - /* short_metrics :: A pointer into the `hmtx' table. */ - /* */ - /* <Note> */ - /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ - /* be identical except for the names of their fields which */ - /* are different. */ - /* */ - /* This ensures that a single function in the `ttload' */ - /* module is able to read both the horizontal and vertical */ - /* headers. */ - /* */ - typedef struct TT_HoriHeader_ - { - FT_Fixed Version; - FT_Short Ascender; - FT_Short Descender; - FT_Short Line_Gap; - - FT_UShort advance_Width_Max; /* advance width maximum */ - - FT_Short min_Left_Side_Bearing; /* minimum left-sb */ - FT_Short min_Right_Side_Bearing; /* minimum right-sb */ - FT_Short xMax_Extent; /* xmax extents */ - FT_Short caret_Slope_Rise; - FT_Short caret_Slope_Run; - FT_Short caret_Offset; - - FT_Short Reserved[4]; - - FT_Short metric_Data_Format; - FT_UShort number_Of_HMetrics; - - /* The following fields are not defined by the TrueType specification */ - /* but they are used to connect the metrics header to the relevant */ - /* `HMTX' table. */ - - void* long_metrics; - void* short_metrics; - - } TT_HoriHeader; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_VertHeader */ - /* */ - /* <Description> */ - /* A structure used to model a TrueType vertical header, the `vhea' */ - /* table, as well as the corresponding vertical metrics table, i.e., */ - /* the `vmtx' table. */ - /* */ - /* <Fields> */ - /* Version :: The table version. */ - /* */ - /* Ascender :: The font's ascender, i.e., the distance */ - /* from the baseline to the top-most of */ - /* all glyph points found in the font. */ - /* */ - /* This value is invalid in many fonts, as */ - /* it is usually set by the font designer, */ - /* and often reflects only a portion of */ - /* the glyphs found in the font (maybe */ - /* ASCII). */ - /* */ - /* You should use the `sTypoAscender' */ - /* field of the OS/2 table instead if you */ - /* want the correct one. */ - /* */ - /* Descender :: The font's descender, i.e., the */ - /* distance from the baseline to the */ - /* bottom-most of all glyph points found */ - /* in the font. It is negative. */ - /* */ - /* This value is invalid in many fonts, as */ - /* it is usually set by the font designer, */ - /* and often reflects only a portion of */ - /* the glyphs found in the font (maybe */ - /* ASCII). */ - /* */ - /* You should use the `sTypoDescender' */ - /* field of the OS/2 table instead if you */ - /* want the correct one. */ - /* */ - /* Line_Gap :: The font's line gap, i.e., the distance */ - /* to add to the ascender and descender to */ - /* get the BTB, i.e., the */ - /* baseline-to-baseline distance for the */ - /* font. */ - /* */ - /* advance_Height_Max :: This field is the maximum of all */ - /* advance heights found in the font. It */ - /* can be used to compute the maximum */ - /* height of an arbitrary string of text. */ - /* */ - /* min_Top_Side_Bearing :: The minimum top side bearing of all */ - /* glyphs within the font. */ - /* */ - /* min_Bottom_Side_Bearing :: The minimum bottom side bearing of all */ - /* glyphs within the font. */ - /* */ - /* yMax_Extent :: The maximum vertical extent (i.e., the */ - /* `height' of a glyph's bounding box) for */ - /* all glyphs in the font. */ - /* */ - /* caret_Slope_Rise :: The rise coefficient of the cursor's */ - /* slope of the cursor (slope=rise/run). */ - /* */ - /* caret_Slope_Run :: The run coefficient of the cursor's */ - /* slope. */ - /* */ - /* caret_Offset :: The cursor's offset for slanted fonts. */ - /* This value is `reserved' in vmtx */ - /* version 1.0. */ - /* */ - /* Reserved :: 8~reserved bytes. */ - /* */ - /* metric_Data_Format :: Always~0. */ - /* */ - /* number_Of_HMetrics :: Number of VMetrics entries in the */ - /* `vmtx' table -- this value can be */ - /* smaller than the total number of glyphs */ - /* in the font. */ - /* */ - /* long_metrics :: A pointer into the `vmtx' table. */ - /* */ - /* short_metrics :: A pointer into the `vmtx' table. */ - /* */ - /* <Note> */ - /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ - /* be identical except for the names of their fields which */ - /* are different. */ - /* */ - /* This ensures that a single function in the `ttload' */ - /* module is able to read both the horizontal and vertical */ - /* headers. */ - /* */ - typedef struct TT_VertHeader_ - { - FT_Fixed Version; - FT_Short Ascender; - FT_Short Descender; - FT_Short Line_Gap; - - FT_UShort advance_Height_Max; /* advance height maximum */ - - FT_Short min_Top_Side_Bearing; /* minimum left-sb or top-sb */ - FT_Short min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */ - FT_Short yMax_Extent; /* xmax or ymax extents */ - FT_Short caret_Slope_Rise; - FT_Short caret_Slope_Run; - FT_Short caret_Offset; - - FT_Short Reserved[4]; - - FT_Short metric_Data_Format; - FT_UShort number_Of_VMetrics; - - /* The following fields are not defined by the TrueType specification */ - /* but they're used to connect the metrics header to the relevant */ - /* `HMTX' or `VMTX' table. */ - - void* long_metrics; - void* short_metrics; - - } TT_VertHeader; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_OS2 */ - /* */ - /* <Description> */ - /* A structure used to model a TrueType OS/2 table. This is the long */ - /* table version. All fields comply to the TrueType specification. */ - /* */ - /* Note that we now support old Mac fonts which do not include an */ - /* OS/2 table. In this case, the `version' field is always set to */ - /* 0xFFFF. */ - /* */ - typedef struct TT_OS2_ - { - FT_UShort version; /* 0x0001 - more or 0xFFFF */ - FT_Short xAvgCharWidth; - FT_UShort usWeightClass; - FT_UShort usWidthClass; - FT_Short fsType; - FT_Short ySubscriptXSize; - FT_Short ySubscriptYSize; - FT_Short ySubscriptXOffset; - FT_Short ySubscriptYOffset; - FT_Short ySuperscriptXSize; - FT_Short ySuperscriptYSize; - FT_Short ySuperscriptXOffset; - FT_Short ySuperscriptYOffset; - FT_Short yStrikeoutSize; - FT_Short yStrikeoutPosition; - FT_Short sFamilyClass; - - FT_Byte panose[10]; - - FT_ULong ulUnicodeRange1; /* Bits 0-31 */ - FT_ULong ulUnicodeRange2; /* Bits 32-63 */ - FT_ULong ulUnicodeRange3; /* Bits 64-95 */ - FT_ULong ulUnicodeRange4; /* Bits 96-127 */ - - FT_Char achVendID[4]; - - FT_UShort fsSelection; - FT_UShort usFirstCharIndex; - FT_UShort usLastCharIndex; - FT_Short sTypoAscender; - FT_Short sTypoDescender; - FT_Short sTypoLineGap; - FT_UShort usWinAscent; - FT_UShort usWinDescent; - - /* only version 1 tables: */ - - FT_ULong ulCodePageRange1; /* Bits 0-31 */ - FT_ULong ulCodePageRange2; /* Bits 32-63 */ - - /* only version 2 tables: */ - - FT_Short sxHeight; - FT_Short sCapHeight; - FT_UShort usDefaultChar; - FT_UShort usBreakChar; - FT_UShort usMaxContext; - - } TT_OS2; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_Postscript */ - /* */ - /* <Description> */ - /* A structure used to model a TrueType PostScript table. All fields */ - /* comply to the TrueType specification. This structure does not */ - /* reference the PostScript glyph names, which can be nevertheless */ - /* accessed with the `ttpost' module. */ - /* */ - typedef struct TT_Postscript_ - { - FT_Fixed FormatType; - FT_Fixed italicAngle; - FT_Short underlinePosition; - FT_Short underlineThickness; - FT_ULong isFixedPitch; - FT_ULong minMemType42; - FT_ULong maxMemType42; - FT_ULong minMemType1; - FT_ULong maxMemType1; - - /* Glyph names follow in the file, but we don't */ - /* load them by default. See the ttpost.c file. */ - - } TT_Postscript; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_PCLT */ - /* */ - /* <Description> */ - /* A structure used to model a TrueType PCLT table. All fields */ - /* comply to the TrueType specification. */ - /* */ - typedef struct TT_PCLT_ - { - FT_Fixed Version; - FT_ULong FontNumber; - FT_UShort Pitch; - FT_UShort xHeight; - FT_UShort Style; - FT_UShort TypeFamily; - FT_UShort CapHeight; - FT_UShort SymbolSet; - FT_Char TypeFace[16]; - FT_Char CharacterComplement[8]; - FT_Char FileName[6]; - FT_Char StrokeWeight; - FT_Char WidthType; - FT_Byte SerifStyle; - FT_Byte Reserved; - - } TT_PCLT; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_MaxProfile */ - /* */ - /* <Description> */ - /* The maximum profile is a table containing many max values which */ - /* can be used to pre-allocate arrays. This ensures that no memory */ - /* allocation occurs during a glyph load. */ - /* */ - /* <Fields> */ - /* version :: The version number. */ - /* */ - /* numGlyphs :: The number of glyphs in this TrueType */ - /* font. */ - /* */ - /* maxPoints :: The maximum number of points in a */ - /* non-composite TrueType glyph. See also */ - /* the structure element */ - /* `maxCompositePoints'. */ - /* */ - /* maxContours :: The maximum number of contours in a */ - /* non-composite TrueType glyph. See also */ - /* the structure element */ - /* `maxCompositeContours'. */ - /* */ - /* maxCompositePoints :: The maximum number of points in a */ - /* composite TrueType glyph. See also the */ - /* structure element `maxPoints'. */ - /* */ - /* maxCompositeContours :: The maximum number of contours in a */ - /* composite TrueType glyph. See also the */ - /* structure element `maxContours'. */ - /* */ - /* maxZones :: The maximum number of zones used for */ - /* glyph hinting. */ - /* */ - /* maxTwilightPoints :: The maximum number of points in the */ - /* twilight zone used for glyph hinting. */ - /* */ - /* maxStorage :: The maximum number of elements in the */ - /* storage area used for glyph hinting. */ - /* */ - /* maxFunctionDefs :: The maximum number of function */ - /* definitions in the TrueType bytecode for */ - /* this font. */ - /* */ - /* maxInstructionDefs :: The maximum number of instruction */ - /* definitions in the TrueType bytecode for */ - /* this font. */ - /* */ - /* maxStackElements :: The maximum number of stack elements used */ - /* during bytecode interpretation. */ - /* */ - /* maxSizeOfInstructions :: The maximum number of TrueType opcodes */ - /* used for glyph hinting. */ - /* */ - /* maxComponentElements :: The maximum number of simple (i.e., non- */ - /* composite) glyphs in a composite glyph. */ - /* */ - /* maxComponentDepth :: The maximum nesting depth of composite */ - /* glyphs. */ - /* */ - /* <Note> */ - /* This structure is only used during font loading. */ - /* */ - typedef struct TT_MaxProfile_ - { - FT_Fixed version; - FT_UShort numGlyphs; - FT_UShort maxPoints; - FT_UShort maxContours; - FT_UShort maxCompositePoints; - FT_UShort maxCompositeContours; - FT_UShort maxZones; - FT_UShort maxTwilightPoints; - FT_UShort maxStorage; - FT_UShort maxFunctionDefs; - FT_UShort maxInstructionDefs; - FT_UShort maxStackElements; - FT_UShort maxSizeOfInstructions; - FT_UShort maxComponentElements; - FT_UShort maxComponentDepth; - - } TT_MaxProfile; - - - /*************************************************************************/ - /* */ - /* <Enum> */ - /* FT_Sfnt_Tag */ - /* */ - /* <Description> */ - /* An enumeration used to specify the index of an SFNT table. */ - /* Used in the @FT_Get_Sfnt_Table API function. */ - /* */ - typedef enum FT_Sfnt_Tag_ - { - ft_sfnt_head = 0, /* TT_Header */ - ft_sfnt_maxp = 1, /* TT_MaxProfile */ - ft_sfnt_os2 = 2, /* TT_OS2 */ - ft_sfnt_hhea = 3, /* TT_HoriHeader */ - ft_sfnt_vhea = 4, /* TT_VertHeader */ - ft_sfnt_post = 5, /* TT_Postscript */ - ft_sfnt_pclt = 6, /* TT_PCLT */ - - sfnt_max /* internal end mark */ - - } FT_Sfnt_Tag; - - /* */ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Sfnt_Table */ - /* */ - /* <Description> */ - /* Return a pointer to a given SFNT table within a face. */ - /* */ - /* <Input> */ - /* face :: A handle to the source. */ - /* */ - /* tag :: The index of the SFNT table. */ - /* */ - /* <Return> */ - /* A type-less pointer to the table. This will be~0 in case of */ - /* error, or if the corresponding table was not found *OR* loaded */ - /* from the file. */ - /* */ - /* Use a typecast according to `tag' to access the structure */ - /* elements. */ - /* */ - /* <Note> */ - /* The table is owned by the face object and disappears with it. */ - /* */ - /* This function is only useful to access SFNT tables that are loaded */ - /* by the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for */ - /* a list. */ - /* */ - FT_EXPORT( void* ) - FT_Get_Sfnt_Table( FT_Face face, - FT_Sfnt_Tag tag ); - - - /************************************************************************** - * - * @function: - * FT_Load_Sfnt_Table - * - * @description: - * Load any font table into client memory. - * - * @input: - * face :: - * A handle to the source face. - * - * tag :: - * The four-byte tag of the table to load. Use the value~0 if you want - * to access the whole font file. Otherwise, you can use one of the - * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new - * one with @FT_MAKE_TAG. - * - * offset :: - * The starting offset in the table (or file if tag == 0). - * - * @output: - * buffer :: - * The target buffer address. The client must ensure that the memory - * array is big enough to hold the data. - * - * @inout: - * length :: - * If the `length' parameter is NULL, then try to load the whole table. - * Return an error code if it fails. - * - * Else, if `*length' is~0, exit immediately while returning the - * table's (or file) full size in it. - * - * Else the number of bytes to read from the table or file, from the - * starting offset. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * If you need to determine the table's length you should first call this - * function with `*length' set to~0, as in the following example: - * - * { - * FT_ULong length = 0; - * - * - * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); - * if ( error ) { ... table does not exist ... } - * - * buffer = malloc( length ); - * if ( buffer == NULL ) { ... not enough memory ... } - * - * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); - * if ( error ) { ... could not load table ... } - * } - */ - FT_EXPORT( FT_Error ) - FT_Load_Sfnt_Table( FT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte* buffer, - FT_ULong* length ); - - - /************************************************************************** - * - * @function: - * FT_Sfnt_Table_Info - * - * @description: - * Return information on an SFNT table. - * - * @input: - * face :: - * A handle to the source face. - * - * table_index :: - * The index of an SFNT table. The function returns - * FT_Err_Table_Missing for an invalid value. - * - * @output: - * tag :: - * The name tag of the SFNT table. - * - * length :: - * The length of the SFNT table. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * SFNT tables with length zero are treated as missing. - * - */ - FT_EXPORT( FT_Error ) - FT_Sfnt_Table_Info( FT_Face face, - FT_UInt table_index, - FT_ULong *tag, - FT_ULong *length ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_CMap_Language_ID */ - /* */ - /* <Description> */ - /* Return TrueType/sfnt specific cmap language ID. Definitions of */ - /* language ID values are in `freetype/ttnameid.h'. */ - /* */ - /* <Input> */ - /* charmap :: */ - /* The target charmap. */ - /* */ - /* <Return> */ - /* The language ID of `charmap'. If `charmap' doesn't belong to a */ - /* TrueType/sfnt face, just return~0 as the default value. */ - /* */ - FT_EXPORT( FT_ULong ) - FT_Get_CMap_Language_ID( FT_CharMap charmap ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_CMap_Format */ - /* */ - /* <Description> */ - /* Return TrueType/sfnt specific cmap format. */ - /* */ - /* <Input> */ - /* charmap :: */ - /* The target charmap. */ - /* */ - /* <Return> */ - /* The format of `charmap'. If `charmap' doesn't belong to a */ - /* TrueType/sfnt face, return -1. */ - /* */ - FT_EXPORT( FT_Long ) - FT_Get_CMap_Format( FT_CharMap charmap ); - - /* */ - - -FT_END_HEADER - -#endif /* __TTTABLES_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/tttags.h b/android/jni/ndk_modules/freetype/include/freetype/tttags.h deleted file mode 100644 index 307ce4b6..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/tttags.h +++ /dev/null @@ -1,107 +0,0 @@ -/***************************************************************************/ -/* */ -/* tttags.h */ -/* */ -/* Tags for TrueType and OpenType tables (specification only). */ -/* */ -/* Copyright 1996-2001, 2004, 2005, 2007, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTAGS_H__ -#define __TTAGS_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - -#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' ) -#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' ) -#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) -#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' ) -#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) -#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) -#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' ) -#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) -#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' ) -#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) -#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' ) -#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) -#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) -#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' ) -#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' ) -#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' ) -#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' ) -#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' ) -#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' ) -#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' ) -#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' ) -#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' ) -#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) -#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) -#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) -#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' ) -#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) -#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) -#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) -#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' ) -#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' ) -#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' ) -#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) -#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' ) -#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' ) -#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' ) -#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' ) -#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' ) -#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' ) -#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' ) -#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) -#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) -#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' ) -#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' ) -#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) -#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' ) -#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) -#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) -#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' ) -#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' ) -#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' ) -#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) -#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' ) -#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' ) -#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' ) -#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' ) -#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' ) -#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' ) -#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' ) -#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' ) -#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' ) -#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) -#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) -#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) - - -FT_END_HEADER - -#endif /* __TTAGS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/freetype/ttunpat.h b/android/jni/ndk_modules/freetype/include/freetype/ttunpat.h deleted file mode 100644 index a0162759..00000000 --- a/android/jni/ndk_modules/freetype/include/freetype/ttunpat.h +++ /dev/null @@ -1,59 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttunpat.h */ -/* */ -/* Definitions for the unpatented TrueType hinting system */ -/* */ -/* Copyright 2003, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* Written by Graham Asher <graham.asher@btinternet.com> */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTUNPAT_H__ -#define __TTUNPAT_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - -FT_BEGIN_HEADER - - - /*************************************************************************** - * - * @constant: - * FT_PARAM_TAG_UNPATENTED_HINTING - * - * @description: - * A constant used as the tag of an @FT_Parameter structure to indicate - * that unpatented methods only should be used by the TrueType bytecode - * interpreter for a typeface opened by @FT_Open_Face. - * - */ -#define FT_PARAM_TAG_UNPATENTED_HINTING FT_MAKE_TAG( 'u', 'n', 'p', 'a' ) - - /* */ - -FT_END_HEADER - - -#endif /* __TTUNPAT_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/include/ft2build.h b/android/jni/ndk_modules/freetype/include/ft2build.h deleted file mode 100644 index 923d887d..00000000 --- a/android/jni/ndk_modules/freetype/include/ft2build.h +++ /dev/null @@ -1,39 +0,0 @@ -/***************************************************************************/ -/* */ -/* ft2build.h */ -/* */ -/* FreeType 2 build and setup macros. */ -/* (Generic version) */ -/* */ -/* Copyright 1996-2001, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file corresponds to the default `ft2build.h' file for */ - /* FreeType 2. It uses the `freetype' include root. */ - /* */ - /* Note that specific platforms might use a different configuration. */ - /* See builds/unix/ft2unix.h for an example. */ - /* */ - /*************************************************************************/ - - -#ifndef __FT2_BUILD_GENERIC_H__ -#define __FT2_BUILD_GENERIC_H__ - -#include <freetype/config/ftheader.h> - -#endif /* __FT2_BUILD_GENERIC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afangles.c b/android/jni/ndk_modules/freetype/src/autofit/afangles.c deleted file mode 100644 index e2360d15..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afangles.c +++ /dev/null @@ -1,292 +0,0 @@ -/***************************************************************************/ -/* */ -/* afangles.c */ -/* */ -/* Routines used to compute vector angles with limited accuracy */ -/* and very high speed. It also contains sorting routines (body). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include "aftypes.h" - - -#if 0 - - FT_LOCAL_DEF( FT_Int ) - af_corner_is_flat( FT_Pos x_in, - FT_Pos y_in, - FT_Pos x_out, - FT_Pos y_out ) - { - FT_Pos ax = x_in; - FT_Pos ay = y_in; - - FT_Pos d_in, d_out, d_corner; - - - if ( ax < 0 ) - ax = -ax; - if ( ay < 0 ) - ay = -ay; - d_in = ax + ay; - - ax = x_out; - if ( ax < 0 ) - ax = -ax; - ay = y_out; - if ( ay < 0 ) - ay = -ay; - d_out = ax + ay; - - ax = x_out + x_in; - if ( ax < 0 ) - ax = -ax; - ay = y_out + y_in; - if ( ay < 0 ) - ay = -ay; - d_corner = ax + ay; - - return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); - } - - - FT_LOCAL_DEF( FT_Int ) - af_corner_orientation( FT_Pos x_in, - FT_Pos y_in, - FT_Pos x_out, - FT_Pos y_out ) - { - FT_Pos delta; - - - delta = x_in * y_out - y_in * x_out; - - if ( delta == 0 ) - return 0; - else - return 1 - 2 * ( delta < 0 ); - } - -#endif - - - /* - * We are not using `af_angle_atan' anymore, but we keep the source - * code below just in case... - */ - - -#if 0 - - - /* - * The trick here is to realize that we don't need a very accurate angle - * approximation. We are going to use the result of `af_angle_atan' to - * only compare the sign of angle differences, or check whether its - * magnitude is very small. - * - * The approximation - * - * dy * PI / (|dx|+|dy|) - * - * should be enough, and much faster to compute. - */ - FT_LOCAL_DEF( AF_Angle ) - af_angle_atan( FT_Fixed dx, - FT_Fixed dy ) - { - AF_Angle angle; - FT_Fixed ax = dx; - FT_Fixed ay = dy; - - - if ( ax < 0 ) - ax = -ax; - if ( ay < 0 ) - ay = -ay; - - ax += ay; - - if ( ax == 0 ) - angle = 0; - else - { - angle = ( AF_ANGLE_PI2 * dy ) / ( ax + ay ); - if ( dx < 0 ) - { - if ( angle >= 0 ) - angle = AF_ANGLE_PI - angle; - else - angle = -AF_ANGLE_PI - angle; - } - } - - return angle; - } - - -#elif 0 - - - /* the following table has been automatically generated with */ - /* the `mather.py' Python script */ - -#define AF_ATAN_BITS 8 - - static const FT_Byte af_arctan[1L << AF_ATAN_BITS] = - { - 0, 0, 1, 1, 1, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 5, - 5, 5, 6, 6, 6, 7, 7, 7, - 8, 8, 8, 9, 9, 9, 10, 10, - 10, 10, 11, 11, 11, 12, 12, 12, - 13, 13, 13, 14, 14, 14, 14, 15, - 15, 15, 16, 16, 16, 17, 17, 17, - 18, 18, 18, 18, 19, 19, 19, 20, - 20, 20, 21, 21, 21, 21, 22, 22, - 22, 23, 23, 23, 24, 24, 24, 24, - 25, 25, 25, 26, 26, 26, 26, 27, - 27, 27, 28, 28, 28, 28, 29, 29, - 29, 30, 30, 30, 30, 31, 31, 31, - 31, 32, 32, 32, 33, 33, 33, 33, - 34, 34, 34, 34, 35, 35, 35, 35, - 36, 36, 36, 36, 37, 37, 37, 38, - 38, 38, 38, 39, 39, 39, 39, 40, - 40, 40, 40, 41, 41, 41, 41, 42, - 42, 42, 42, 42, 43, 43, 43, 43, - 44, 44, 44, 44, 45, 45, 45, 45, - 46, 46, 46, 46, 46, 47, 47, 47, - 47, 48, 48, 48, 48, 48, 49, 49, - 49, 49, 50, 50, 50, 50, 50, 51, - 51, 51, 51, 51, 52, 52, 52, 52, - 52, 53, 53, 53, 53, 53, 54, 54, - 54, 54, 54, 55, 55, 55, 55, 55, - 56, 56, 56, 56, 56, 57, 57, 57, - 57, 57, 57, 58, 58, 58, 58, 58, - 59, 59, 59, 59, 59, 59, 60, 60, - 60, 60, 60, 61, 61, 61, 61, 61, - 61, 62, 62, 62, 62, 62, 62, 63, - 63, 63, 63, 63, 63, 64, 64, 64 - }; - - - FT_LOCAL_DEF( AF_Angle ) - af_angle_atan( FT_Fixed dx, - FT_Fixed dy ) - { - AF_Angle angle; - - - /* check trivial cases */ - if ( dy == 0 ) - { - angle = 0; - if ( dx < 0 ) - angle = AF_ANGLE_PI; - return angle; - } - else if ( dx == 0 ) - { - angle = AF_ANGLE_PI2; - if ( dy < 0 ) - angle = -AF_ANGLE_PI2; - return angle; - } - - angle = 0; - if ( dx < 0 ) - { - dx = -dx; - dy = -dy; - angle = AF_ANGLE_PI; - } - - if ( dy < 0 ) - { - FT_Pos tmp; - - - tmp = dx; - dx = -dy; - dy = tmp; - angle -= AF_ANGLE_PI2; - } - - if ( dx == 0 && dy == 0 ) - return 0; - - if ( dx == dy ) - angle += AF_ANGLE_PI4; - else if ( dx > dy ) - angle += af_arctan[FT_DivFix( dy, dx ) >> ( 16 - AF_ATAN_BITS )]; - else - angle += AF_ANGLE_PI2 - - af_arctan[FT_DivFix( dx, dy ) >> ( 16 - AF_ATAN_BITS )]; - - if ( angle > AF_ANGLE_PI ) - angle -= AF_ANGLE_2PI; - - return angle; - } - - -#endif /* 0 */ - - - FT_LOCAL_DEF( void ) - af_sort_pos( FT_UInt count, - FT_Pos* table ) - { - FT_UInt i, j; - FT_Pos swap; - - - for ( i = 1; i < count; i++ ) - { - for ( j = i; j > 0; j-- ) - { - if ( table[j] > table[j - 1] ) - break; - - swap = table[j]; - table[j] = table[j - 1]; - table[j - 1] = swap; - } - } - } - - - FT_LOCAL_DEF( void ) - af_sort_widths( FT_UInt count, - AF_Width table ) - { - FT_UInt i, j; - AF_WidthRec swap; - - - for ( i = 1; i < count; i++ ) - { - for ( j = i; j > 0; j-- ) - { - if ( table[j].org > table[j - 1].org ) - break; - - swap = table[j]; - table[j] = table[j - 1]; - table[j - 1] = swap; - } - } - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afangles.h b/android/jni/ndk_modules/freetype/src/autofit/afangles.h deleted file mode 100644 index f33f9e10..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afangles.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * afangles.h - * - * This is a dummy file, used to please the build system. It is never - * included by the auto-fitter sources. - * - */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afcjk.c b/android/jni/ndk_modules/freetype/src/autofit/afcjk.c deleted file mode 100644 index f3b1067e..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afcjk.c +++ /dev/null @@ -1,1512 +0,0 @@ -/***************************************************************************/ -/* */ -/* afcjk.c */ -/* */ -/* Auto-fitter hinting routines for CJK script (body). */ -/* */ -/* Copyright 2006, 2007, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /* - * The algorithm is based on akito's autohint patch, available here: - * - * http://www.kde.gr.jp/~akito/patch/freetype2/ - * - */ - -#include "aftypes.h" -#include "aflatin.h" - - -#ifdef AF_CONFIG_OPTION_CJK - -#include "afcjk.h" -#include "aferrors.h" - - -#ifdef AF_USE_WARPER -#include "afwarp.h" -#endif - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( FT_Error ) - af_cjk_metrics_init( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_CharMap oldmap = face->charmap; - - - metrics->units_per_em = face->units_per_EM; - - /* TODO are there blues? */ - - if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) - face->charmap = NULL; - else - { - /* latin's version would suffice */ - af_latin_metrics_init_widths( metrics, face, 0x7530 ); - af_latin_metrics_check_digits( metrics, face ); - } - - FT_Set_Charmap( face, oldmap ); - - return AF_Err_Ok; - } - - - static void - af_cjk_metrics_scale_dim( AF_LatinMetrics metrics, - AF_Scaler scaler, - AF_Dimension dim ) - { - AF_LatinAxis axis; - - - axis = &metrics->axis[dim]; - - if ( dim == AF_DIMENSION_HORZ ) - { - axis->scale = scaler->x_scale; - axis->delta = scaler->x_delta; - } - else - { - axis->scale = scaler->y_scale; - axis->delta = scaler->y_delta; - } - } - - - FT_LOCAL_DEF( void ) - af_cjk_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ) - { - metrics->root.scaler = *scaler; - - af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); - af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K G L Y P H A N A L Y S I S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static FT_Error - af_cjk_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - FT_Error error; - AF_Segment seg; - - - error = af_latin_hints_compute_segments( hints, dim ); - if ( error ) - return error; - - /* a segment is round if it doesn't have successive */ - /* on-curve points. */ - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Point pt = seg->first; - AF_Point last = seg->last; - AF_Flags f0 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); - AF_Flags f1; - - - seg->flags &= ~AF_EDGE_ROUND; - - for ( ; pt != last; f0 = f1 ) - { - pt = pt->next; - f1 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); - - if ( !f0 && !f1 ) - break; - - if ( pt == last ) - seg->flags |= AF_EDGE_ROUND; - } - } - - return AF_Err_Ok; - } - - - static void - af_cjk_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Direction major_dir = axis->major_dir; - AF_Segment seg1, seg2; - FT_Pos len_threshold; - FT_Pos dist_threshold; - - - len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); - - dist_threshold = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - dist_threshold = FT_DivFix( 64 * 3, dist_threshold ); - - /* now compare each segment to the others */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - /* the fake segments are for metrics hinting only */ - if ( seg1->first == seg1->last ) - continue; - - if ( seg1->dir != major_dir ) - continue; - - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - if ( seg2 != seg1 && seg1->dir + seg2->dir == 0 ) - { - FT_Pos dist = seg2->pos - seg1->pos; - - - if ( dist < 0 ) - continue; - - { - FT_Pos min = seg1->min_coord; - FT_Pos max = seg1->max_coord; - FT_Pos len; - - - if ( min < seg2->min_coord ) - min = seg2->min_coord; - - if ( max > seg2->max_coord ) - max = seg2->max_coord; - - len = max - min; - if ( len >= len_threshold ) - { - if ( dist * 8 < seg1->score * 9 && - ( dist * 8 < seg1->score * 7 || seg1->len < len ) ) - { - seg1->score = dist; - seg1->len = len; - seg1->link = seg2; - } - - if ( dist * 8 < seg2->score * 9 && - ( dist * 8 < seg2->score * 7 || seg2->len < len ) ) - { - seg2->score = dist; - seg2->len = len; - seg2->link = seg1; - } - } - } - } - } - - /* - * now compute the `serif' segments - * - * In Hanzi, some strokes are wider on one or both of the ends. - * We either identify the stems on the ends as serifs or remove - * the linkage, depending on the length of the stems. - * - */ - - { - AF_Segment link1, link2; - - - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - link1 = seg1->link; - if ( !link1 || link1->link != seg1 || link1->pos <= seg1->pos ) - continue; - - if ( seg1->score >= dist_threshold ) - continue; - - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - { - if ( seg2->pos > seg1->pos || seg1 == seg2 ) - continue; - - link2 = seg2->link; - if ( !link2 || link2->link != seg2 || link2->pos < link1->pos ) - continue; - - if ( seg1->pos == seg2->pos && link1->pos == link2->pos ) - continue; - - if ( seg2->score <= seg1->score || seg1->score * 4 <= seg2->score ) - continue; - - /* seg2 < seg1 < link1 < link2 */ - - if ( seg1->len >= seg2->len * 3 ) - { - AF_Segment seg; - - - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Segment link = seg->link; - - - if ( link == seg2 ) - { - seg->link = 0; - seg->serif = link1; - } - else if ( link == link2 ) - { - seg->link = 0; - seg->serif = seg1; - } - } - } - else - { - seg1->link = link1->link = 0; - - break; - } - } - } - } - - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - seg2 = seg1->link; - - if ( seg2 ) - { - seg2->num_linked++; - if ( seg2->link != seg1 ) - { - seg1->link = 0; - - if ( seg2->score < dist_threshold || seg1->score < seg2->score * 4 ) - seg1->serif = seg2->link; - else - seg2->num_linked--; - } - } - } - } - - - static FT_Error - af_cjk_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Error error = AF_Err_Ok; - FT_Memory memory = hints->memory; - AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; - - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - - FT_Fixed scale; - FT_Pos edge_distance_threshold; - - - axis->num_edges = 0; - - scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - - /*********************************************************************/ - /* */ - /* We begin by generating a sorted table of edges for the current */ - /* direction. To do so, we simply scan each segment and try to find */ - /* an edge in our table that corresponds to its position. */ - /* */ - /* If no edge is found, we create and insert a new edge in the */ - /* sorted table. Otherwise, we simply add the segment to the edge's */ - /* list which is then processed in the second step to compute the */ - /* edge's properties. */ - /* */ - /* Note that the edges table is sorted along the segment/edge */ - /* position. */ - /* */ - /*********************************************************************/ - - edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, - scale ); - if ( edge_distance_threshold > 64 / 4 ) - edge_distance_threshold = FT_DivFix( 64 / 4, scale ); - else - edge_distance_threshold = laxis->edge_distance_threshold; - - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge found = 0; - FT_Pos best = 0xFFFFU; - FT_Int ee; - - - /* look for an edge corresponding to the segment */ - for ( ee = 0; ee < axis->num_edges; ee++ ) - { - AF_Edge edge = axis->edges + ee; - FT_Pos dist; - - - if ( edge->dir != seg->dir ) - continue; - - dist = seg->pos - edge->fpos; - if ( dist < 0 ) - dist = -dist; - - if ( dist < edge_distance_threshold && dist < best ) - { - AF_Segment link = seg->link; - - - /* check whether all linked segments of the candidate edge */ - /* can make a single edge. */ - if ( link ) - { - AF_Segment seg1 = edge->first; - AF_Segment link1; - FT_Pos dist2 = 0; - - - do - { - link1 = seg1->link; - if ( link1 ) - { - dist2 = AF_SEGMENT_DIST( link, link1 ); - if ( dist2 >= edge_distance_threshold ) - break; - } - - } while ( ( seg1 = seg1->edge_next ) != edge->first ); - - if ( dist2 >= edge_distance_threshold ) - continue; - } - - best = dist; - found = edge; - } - } - - if ( !found ) - { - AF_Edge edge; - - - /* insert a new edge in the list and */ - /* sort according to the position */ - error = af_axis_hints_new_edge( axis, seg->pos, - (AF_Direction)seg->dir, - memory, &edge ); - if ( error ) - goto Exit; - - /* add the segment to the new edge's list */ - FT_ZERO( edge ); - - edge->first = seg; - edge->last = seg; - edge->fpos = seg->pos; - edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); - seg->edge_next = seg; - edge->dir = seg->dir; - } - else - { - /* if an edge was found, simply add the segment to the edge's */ - /* list */ - seg->edge_next = found->first; - found->last->edge_next = seg; - found->last = seg; - } - } - - /*********************************************************************/ - /* */ - /* Good, we now compute each edge's properties according to segments */ - /* found on its position. Basically, these are as follows. */ - /* */ - /* - edge's main direction */ - /* - stem edge, serif edge or both (which defaults to stem then) */ - /* - rounded edge, straight or both (which defaults to straight) */ - /* - link for edge */ - /* */ - /*********************************************************************/ - - /* first of all, set the `edge' field in each segment -- this is */ - /* required in order to compute edge links */ - /* */ - /* Note that removing this loop and setting the `edge' field of each */ - /* segment directly in the code above slows down execution speed for */ - /* some reasons on platforms like the Sun. */ - - { - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - - - for ( edge = edges; edge < edge_limit; edge++ ) - { - seg = edge->first; - if ( seg ) - do - { - seg->edge = edge; - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - - /* now compute each edge properties */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Int is_round = 0; /* does it contain round segments? */ - FT_Int is_straight = 0; /* does it contain straight segments? */ - - - seg = edge->first; - - do - { - FT_Bool is_serif; - - - /* check for roundness of segment */ - if ( seg->flags & AF_EDGE_ROUND ) - is_round++; - else - is_straight++; - - /* check for links -- if seg->serif is set, then seg->link must */ - /* be ignored */ - is_serif = (FT_Bool)( seg->serif && seg->serif->edge != edge ); - - if ( seg->link || is_serif ) - { - AF_Edge edge2; - AF_Segment seg2; - - - edge2 = edge->link; - seg2 = seg->link; - - if ( is_serif ) - { - seg2 = seg->serif; - edge2 = edge->serif; - } - - if ( edge2 ) - { - FT_Pos edge_delta; - FT_Pos seg_delta; - - - edge_delta = edge->fpos - edge2->fpos; - if ( edge_delta < 0 ) - edge_delta = -edge_delta; - - seg_delta = AF_SEGMENT_DIST( seg, seg2 ); - - if ( seg_delta < edge_delta ) - edge2 = seg2->edge; - } - else - edge2 = seg2->edge; - - if ( is_serif ) - { - edge->serif = edge2; - edge2->flags |= AF_EDGE_SERIF; - } - else - edge->link = edge2; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - - /* set the round/straight flags */ - edge->flags = AF_EDGE_NORMAL; - - if ( is_round > 0 && is_round >= is_straight ) - edge->flags |= AF_EDGE_ROUND; - - /* get rid of serifs if link is set */ - /* XXX: This gets rid of many unpleasant artefacts! */ - /* Example: the `c' in cour.pfa at size 13 */ - - if ( edge->serif && edge->link ) - edge->serif = 0; - } - } - - Exit: - return error; - } - - - static FT_Error - af_cjk_hints_detect_features( AF_GlyphHints hints, - AF_Dimension dim ) - { - FT_Error error; - - - error = af_cjk_hints_compute_segments( hints, dim ); - if ( !error ) - { - af_cjk_hints_link_segments( hints, dim ); - - error = af_cjk_hints_compute_edges( hints, dim ); - } - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - af_cjk_hints_init( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - FT_Render_Mode mode; - FT_UInt32 scaler_flags, other_flags; - - - af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics ); - - /* - * correct x_scale and y_scale when needed, since they may have - * been modified af_cjk_scale_dim above - */ - hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; - hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; - hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; - hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; - - /* compute flags depending on render mode, etc. */ - mode = metrics->root.scaler.render_mode; - -#ifdef AF_USE_WARPER - if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) - metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; -#endif - - scaler_flags = hints->scaler_flags; - other_flags = 0; - - /* - * We snap the width of vertical stems for the monochrome and - * horizontal LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) - other_flags |= AF_LATIN_HINTS_HORZ_SNAP; - - /* - * We snap the width of horizontal stems for the monochrome and - * vertical LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) - other_flags |= AF_LATIN_HINTS_VERT_SNAP; - - /* - * We adjust stems to full pixels only if we don't use the `light' mode. - */ - if ( mode != FT_RENDER_MODE_LIGHT ) - other_flags |= AF_LATIN_HINTS_STEM_ADJUST; - - if ( mode == FT_RENDER_MODE_MONO ) - other_flags |= AF_LATIN_HINTS_MONO; - - scaler_flags |= AF_SCALER_FLAG_NO_ADVANCE; - - hints->scaler_flags = scaler_flags; - hints->other_flags = other_flags; - - return 0; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K G L Y P H G R I D - F I T T I N G *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* snap a given width in scaled coordinates to one of the */ - /* current standard widths */ - - static FT_Pos - af_cjk_snap_width( AF_Width widths, - FT_Int count, - FT_Pos width ) - { - int n; - FT_Pos best = 64 + 32 + 2; - FT_Pos reference = width; - FT_Pos scaled; - - - for ( n = 0; n < count; n++ ) - { - FT_Pos w; - FT_Pos dist; - - - w = widths[n].cur; - dist = width - w; - if ( dist < 0 ) - dist = -dist; - if ( dist < best ) - { - best = dist; - reference = w; - } - } - - scaled = FT_PIX_ROUND( reference ); - - if ( width >= reference ) - { - if ( width < scaled + 48 ) - width = reference; - } - else - { - if ( width > scaled - 48 ) - width = reference; - } - - return width; - } - - - /* compute the snapped width of a given stem */ - - static FT_Pos - af_cjk_compute_stem_width( AF_GlyphHints hints, - AF_Dimension dim, - FT_Pos width, - AF_Edge_Flags base_flags, - AF_Edge_Flags stem_flags ) - { - AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; - AF_LatinAxis axis = & metrics->axis[dim]; - FT_Pos dist = width; - FT_Int sign = 0; - FT_Int vertical = ( dim == AF_DIMENSION_VERT ); - - FT_UNUSED( base_flags ); - FT_UNUSED( stem_flags ); - - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) - return width; - - if ( dist < 0 ) - { - dist = -width; - sign = 1; - } - - if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || - ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) - { - /* smooth hinting process: very lightly quantize the stem width */ - - if ( axis->width_count > 0 ) - { - if ( FT_ABS( dist - axis->widths[0].cur ) < 40 ) - { - dist = axis->widths[0].cur; - if ( dist < 48 ) - dist = 48; - - goto Done_Width; - } - } - - if ( dist < 54 ) - dist += ( 54 - dist ) / 2 ; - else if ( dist < 3 * 64 ) - { - FT_Pos delta; - - - delta = dist & 63; - dist &= -64; - - if ( delta < 10 ) - dist += delta; - else if ( delta < 22 ) - dist += 10; - else if ( delta < 42 ) - dist += delta; - else if ( delta < 54 ) - dist += 54; - else - dist += delta; - } - } - else - { - /* strong hinting process: snap the stem width to integer pixels */ - - dist = af_cjk_snap_width( axis->widths, axis->width_count, dist ); - - if ( vertical ) - { - /* in the case of vertical hinting, always round */ - /* the stem heights to integer pixels */ - - if ( dist >= 64 ) - dist = ( dist + 16 ) & ~63; - else - dist = 64; - } - else - { - if ( AF_LATIN_HINTS_DO_MONO( hints ) ) - { - /* monochrome horizontal hinting: snap widths to integer pixels */ - /* with a different threshold */ - - if ( dist < 64 ) - dist = 64; - else - dist = ( dist + 32 ) & ~63; - } - else - { - /* for horizontal anti-aliased hinting, we adopt a more subtle */ - /* approach: we strengthen small stems, round stems whose size */ - /* is between 1 and 2 pixels to an integer, otherwise nothing */ - - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - - else if ( dist < 128 ) - dist = ( dist + 22 ) & ~63; - else - /* round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & ~63; - } - } - } - - Done_Width: - if ( sign ) - dist = -dist; - - return dist; - } - - - /* align one stem edge relative to the previous stem edge */ - - static void - af_cjk_align_linked_edge( AF_GlyphHints hints, - AF_Dimension dim, - AF_Edge base_edge, - AF_Edge stem_edge ) - { - FT_Pos dist = stem_edge->opos - base_edge->opos; - - FT_Pos fitted_width = af_cjk_compute_stem_width( - hints, dim, dist, - (AF_Edge_Flags)base_edge->flags, - (AF_Edge_Flags)stem_edge->flags ); - - - stem_edge->pos = base_edge->pos + fitted_width; - } - - - static void - af_cjk_align_serif_edge( AF_GlyphHints hints, - AF_Edge base, - AF_Edge serif ) - { - FT_UNUSED( hints ); - - serif->pos = base->pos + ( serif->opos - base->opos ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** E D G E H I N T I N G ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#define AF_LIGHT_MODE_MAX_HORZ_GAP 9 -#define AF_LIGHT_MODE_MAX_VERT_GAP 15 -#define AF_LIGHT_MODE_MAX_DELTA_ABS 14 - - - static FT_Pos - af_hint_normal_stem( AF_GlyphHints hints, - AF_Edge edge, - AF_Edge edge2, - FT_Pos anchor, - AF_Dimension dim ) - { - FT_Pos org_len, cur_len, org_center; - FT_Pos cur_pos1, cur_pos2; - FT_Pos d_off1, u_off1, d_off2, u_off2, delta; - FT_Pos offset; - FT_Pos threshold = 64; - - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) - { - if ( ( edge->flags & AF_EDGE_ROUND ) && - ( edge2->flags & AF_EDGE_ROUND ) ) - { - if ( dim == AF_DIMENSION_VERT ) - threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP; - else - threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP; - } - else - { - if ( dim == AF_DIMENSION_VERT ) - threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP / 3; - else - threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP / 3; - } - } - - org_len = edge2->opos - edge->opos; - cur_len = af_cjk_compute_stem_width( hints, dim, org_len, - (AF_Edge_Flags)edge->flags, - (AF_Edge_Flags)edge2->flags ); - - org_center = ( edge->opos + edge2->opos ) / 2 + anchor; - cur_pos1 = org_center - cur_len / 2; - cur_pos2 = cur_pos1 + cur_len; - d_off1 = cur_pos1 - FT_PIX_FLOOR( cur_pos1 ); - d_off2 = cur_pos2 - FT_PIX_FLOOR( cur_pos2 ); - u_off1 = 64 - d_off1; - u_off2 = 64 - d_off2; - delta = 0; - - - if ( d_off1 == 0 || d_off2 == 0 ) - goto Exit; - - if ( cur_len <= threshold ) - { - if ( d_off2 < cur_len ) - { - if ( u_off1 <= d_off2 ) - delta = u_off1; - else - delta = -d_off2; - } - - goto Exit; - } - - if ( threshold < 64 ) - { - if ( d_off1 >= threshold || u_off1 >= threshold || - d_off2 >= threshold || u_off2 >= threshold ) - goto Exit; - } - - offset = cur_len % 64; - - if ( offset < 32 ) - { - if ( u_off1 <= offset || d_off2 <= offset ) - goto Exit; - } - else - offset = 64 - threshold; - - d_off1 = threshold - u_off1; - u_off1 = u_off1 - offset; - u_off2 = threshold - d_off2; - d_off2 = d_off2 - offset; - - if ( d_off1 <= u_off1 ) - u_off1 = -d_off1; - - if ( d_off2 <= u_off2 ) - u_off2 = -d_off2; - - if ( FT_ABS( u_off1 ) <= FT_ABS( u_off2 ) ) - delta = u_off1; - else - delta = u_off2; - - Exit: - -#if 1 - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) - { - if ( delta > AF_LIGHT_MODE_MAX_DELTA_ABS ) - delta = AF_LIGHT_MODE_MAX_DELTA_ABS; - else if ( delta < -AF_LIGHT_MODE_MAX_DELTA_ABS ) - delta = -AF_LIGHT_MODE_MAX_DELTA_ABS; - } -#endif - - cur_pos1 += delta; - - if ( edge->opos < edge2->opos ) - { - edge->pos = cur_pos1; - edge2->pos = cur_pos1 + cur_len; - } - else - { - edge->pos = cur_pos1 + cur_len; - edge2->pos = cur_pos1; - } - - return delta; - } - - - static void - af_cjk_hint_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - FT_PtrDist n_edges; - AF_Edge edge; - AF_Edge anchor = 0; - FT_Pos delta = 0; - FT_Int skipped = 0; - - - /* now we align all stem edges. */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - /* skip all non-stem edges */ - edge2 = edge->link; - if ( !edge2 ) - { - skipped++; - continue; - } - - /* now align the stem */ - - if ( edge2 < edge ) - { - af_cjk_align_linked_edge( hints, dim, edge2, edge ); - edge->flags |= AF_EDGE_DONE; - continue; - } - - if ( dim != AF_DIMENSION_VERT && !anchor ) - { - -#if 0 - if ( fixedpitch ) - { - AF_Edge left = edge; - AF_Edge right = edge_limit - 1; - AF_EdgeRec left1, left2, right1, right2; - FT_Pos target, center1, center2; - FT_Pos delta1, delta2, d1, d2; - - - while ( right > left && !right->link ) - right--; - - left1 = *left; - left2 = *left->link; - right1 = *right->link; - right2 = *right; - - delta = ( ( ( hinter->pp2.x + 32 ) & -64 ) - hinter->pp2.x ) / 2; - target = left->opos + ( right->opos - left->opos ) / 2 + delta - 16; - - delta1 = delta; - delta1 += af_hint_normal_stem( hints, left, left->link, - delta1, 0 ); - - if ( left->link != right ) - af_hint_normal_stem( hints, right->link, right, delta1, 0 ); - - center1 = left->pos + ( right->pos - left->pos ) / 2; - - if ( center1 >= target ) - delta2 = delta - 32; - else - delta2 = delta + 32; - - delta2 += af_hint_normal_stem( hints, &left1, &left2, delta2, 0 ); - - if ( delta1 != delta2 ) - { - if ( left->link != right ) - af_hint_normal_stem( hints, &right1, &right2, delta2, 0 ); - - center2 = left1.pos + ( right2.pos - left1.pos ) / 2; - - d1 = center1 - target; - d2 = center2 - target; - - if ( FT_ABS( d2 ) < FT_ABS( d1 ) ) - { - left->pos = left1.pos; - left->link->pos = left2.pos; - - if ( left->link != right ) - { - right->link->pos = right1.pos; - right->pos = right2.pos; - } - - delta1 = delta2; - } - } - - delta = delta1; - right->link->flags |= AF_EDGE_DONE; - right->flags |= AF_EDGE_DONE; - } - else - -#endif /* 0 */ - - delta = af_hint_normal_stem( hints, edge, edge2, 0, - AF_DIMENSION_HORZ ); - } - else - af_hint_normal_stem( hints, edge, edge2, delta, dim ); - -#if 0 - printf( "stem (%d,%d) adjusted (%.1f,%.1f)\n", - edge - edges, edge2 - edges, - ( edge->pos - edge->opos ) / 64.0, - ( edge2->pos - edge2->opos ) / 64.0 ); -#endif - - anchor = edge; - edge->flags |= AF_EDGE_DONE; - edge2->flags |= AF_EDGE_DONE; - } - - /* make sure that lowercase m's maintain their symmetry */ - - /* In general, lowercase m's have six vertical edges if they are sans */ - /* serif, or twelve if they are with serifs. This implementation is */ - /* based on that assumption, and seems to work very well with most */ - /* faces. However, if for a certain face this assumption is not */ - /* true, the m is just rendered like before. In addition, any stem */ - /* correction will only be applied to symmetrical glyphs (even if the */ - /* glyph is not an m), so the potential for unwanted distortion is */ - /* relatively low. */ - - /* We don't handle horizontal edges since we can't easily assure that */ - /* the third (lowest) stem aligns with the base line; it might end up */ - /* one pixel higher or lower. */ - - n_edges = edge_limit - edges; - if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) - { - AF_Edge edge1, edge2, edge3; - FT_Pos dist1, dist2, span; - - - if ( n_edges == 6 ) - { - edge1 = edges; - edge2 = edges + 2; - edge3 = edges + 4; - } - else - { - edge1 = edges + 1; - edge2 = edges + 5; - edge3 = edges + 9; - } - - dist1 = edge2->opos - edge1->opos; - dist2 = edge3->opos - edge2->opos; - - span = dist1 - dist2; - if ( span < 0 ) - span = -span; - - if ( edge1->link == edge1 + 1 && - edge2->link == edge2 + 1 && - edge3->link == edge3 + 1 && span < 8 ) - { - delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); - edge3->pos -= delta; - if ( edge3->link ) - edge3->link->pos -= delta; - - /* move the serifs along with the stem */ - if ( n_edges == 12 ) - { - ( edges + 8 )->pos -= delta; - ( edges + 11 )->pos -= delta; - } - - edge3->flags |= AF_EDGE_DONE; - if ( edge3->link ) - edge3->link->flags |= AF_EDGE_DONE; - } - } - - if ( !skipped ) - return; - - /* - * now hint the remaining edges (serifs and single) in order - * to complete our processing - */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - if ( edge->flags & AF_EDGE_DONE ) - continue; - - if ( edge->serif ) - { - af_cjk_align_serif_edge( hints, edge->serif, edge ); - edge->flags |= AF_EDGE_DONE; - skipped--; - } - } - - if ( !skipped ) - return; - - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge before, after; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - before = after = edge; - - while ( --before >= edges ) - if ( before->flags & AF_EDGE_DONE ) - break; - - while ( ++after < edge_limit ) - if ( after->flags & AF_EDGE_DONE ) - break; - - if ( before >= edges || after < edge_limit ) - { - if ( before < edges ) - af_cjk_align_serif_edge( hints, after, edge ); - else if ( after >= edge_limit ) - af_cjk_align_serif_edge( hints, before, edge ); - else - { - if ( after->fpos == before->fpos ) - edge->pos = before->pos; - else - edge->pos = before->pos + - FT_MulDiv( edge->fpos - before->fpos, - after->pos - before->pos, - after->fpos - before->fpos ); - } - } - } - } - - - static void - af_cjk_align_edge_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = & hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - FT_Bool snapping; - - - snapping = FT_BOOL( ( dim == AF_DIMENSION_HORZ && - AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) || - ( dim == AF_DIMENSION_VERT && - AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ); - - for ( edge = edges; edge < edge_limit; edge++ ) - { - /* move the points of each segment */ - /* in each edge to the edge's position */ - AF_Segment seg = edge->first; - - - if ( snapping ) - { - do - { - AF_Point point = seg->first; - - - for (;;) - { - if ( dim == AF_DIMENSION_HORZ ) - { - point->x = edge->pos; - point->flags |= AF_FLAG_TOUCH_X; - } - else - { - point->y = edge->pos; - point->flags |= AF_FLAG_TOUCH_Y; - } - - if ( point == seg->last ) - break; - - point = point->next; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - else - { - FT_Pos delta = edge->pos - edge->opos; - - - do - { - AF_Point point = seg->first; - - - for (;;) - { - if ( dim == AF_DIMENSION_HORZ ) - { - point->x += delta; - point->flags |= AF_FLAG_TOUCH_X; - } - else - { - point->y += delta; - point->flags |= AF_FLAG_TOUCH_Y; - } - - if ( point == seg->last ) - break; - - point = point->next; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - } - } - - - FT_LOCAL_DEF( FT_Error ) - af_cjk_hints_apply( AF_GlyphHints hints, - FT_Outline* outline, - AF_LatinMetrics metrics ) - { - FT_Error error; - int dim; - - FT_UNUSED( metrics ); - - - error = af_glyph_hints_reload( hints, outline ); - if ( error ) - goto Exit; - - /* analyze glyph outline */ - if ( AF_HINTS_DO_HORIZONTAL( hints ) ) - { - error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ ); - if ( error ) - goto Exit; - } - - if ( AF_HINTS_DO_VERTICAL( hints ) ) - { - error = af_cjk_hints_detect_features( hints, AF_DIMENSION_VERT ); - if ( error ) - goto Exit; - } - - /* grid-fit the outline */ - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || - ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) - { - -#ifdef AF_USE_WARPER - if ( dim == AF_DIMENSION_HORZ && - metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL ) - { - AF_WarperRec warper; - FT_Fixed scale; - FT_Pos delta; - - - af_warper_compute( &warper, hints, dim, &scale, &delta ); - af_glyph_hints_scale_dim( hints, dim, scale, delta ); - continue; - } -#endif /* AF_USE_WARPER */ - - af_cjk_hint_edges( hints, (AF_Dimension)dim ); - af_cjk_align_edge_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); - } - } - -#if 0 - af_glyph_hints_dump_points( hints ); - af_glyph_hints_dump_segments( hints ); - af_glyph_hints_dump_edges( hints ); -#endif - - af_glyph_hints_save( hints, outline ); - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K S C R I P T C L A S S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - static const AF_Script_UniRangeRec af_cjk_uniranges[] = - { -#if 0 - AF_UNIRANGE_REC( 0x0100UL, 0xFFFFUL ), /* why this? */ -#endif - AF_UNIRANGE_REC( 0x2E80UL, 0x2EFFUL ), /* CJK Radicals Supplement */ - AF_UNIRANGE_REC( 0x2F00UL, 0x2FDFUL ), /* Kangxi Radicals */ - AF_UNIRANGE_REC( 0x3000UL, 0x303FUL ), /* CJK Symbols and Punctuation */ - AF_UNIRANGE_REC( 0x3040UL, 0x309FUL ), /* Hiragana */ - AF_UNIRANGE_REC( 0x30A0UL, 0x30FFUL ), /* Katakana */ - AF_UNIRANGE_REC( 0x3100UL, 0x312FUL ), /* Bopomofo */ - AF_UNIRANGE_REC( 0x3130UL, 0x318FUL ), /* Hangul Compatibility Jamo */ - AF_UNIRANGE_REC( 0x31A0UL, 0x31BFUL ), /* Bopomofo Extended */ - AF_UNIRANGE_REC( 0x31C0UL, 0x31EFUL ), /* CJK Strokes */ - AF_UNIRANGE_REC( 0x31F0UL, 0x31FFUL ), /* Katakana Phonetic Extensions */ - AF_UNIRANGE_REC( 0x3200UL, 0x32FFUL ), /* Enclosed CJK Letters and Months */ - AF_UNIRANGE_REC( 0x3300UL, 0x33FFUL ), /* CJK Compatibility */ - AF_UNIRANGE_REC( 0x3400UL, 0x4DBFUL ), /* CJK Unified Ideographs Extension A */ - AF_UNIRANGE_REC( 0x4DC0UL, 0x4DFFUL ), /* Yijing Hexagram Symbols */ - AF_UNIRANGE_REC( 0x4E00UL, 0x9FFFUL ), /* CJK Unified Ideographs */ - AF_UNIRANGE_REC( 0xF900UL, 0xFAFFUL ), /* CJK Compatibility Ideographs */ - AF_UNIRANGE_REC( 0xFE30UL, 0xFE4FUL ), /* CJK Compatibility Forms */ - AF_UNIRANGE_REC( 0xFF00UL, 0xFFEFUL ), /* Halfwidth and Fullwidth Forms */ - AF_UNIRANGE_REC( 0x20000UL, 0x2A6DFUL ), /* CJK Unified Ideographs Extension B */ - AF_UNIRANGE_REC( 0x2F800UL, 0x2FA1FUL ), /* CJK Compatibility Ideographs Supplement */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - - AF_DEFINE_SCRIPT_CLASS(af_cjk_script_class, - AF_SCRIPT_CJK, - af_cjk_uniranges, - - sizeof( AF_LatinMetricsRec ), - - (AF_Script_InitMetricsFunc) af_cjk_metrics_init, - (AF_Script_ScaleMetricsFunc)af_cjk_metrics_scale, - (AF_Script_DoneMetricsFunc) NULL, - - (AF_Script_InitHintsFunc) af_cjk_hints_init, - (AF_Script_ApplyHintsFunc) af_cjk_hints_apply - ) - -#else /* !AF_CONFIG_OPTION_CJK */ - - static const AF_Script_UniRangeRec af_cjk_uniranges[] = - { - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - - AF_DEFINE_SCRIPT_CLASS(af_cjk_script_class, - AF_SCRIPT_CJK, - af_cjk_uniranges, - - sizeof( AF_LatinMetricsRec ), - - (AF_Script_InitMetricsFunc) NULL, - (AF_Script_ScaleMetricsFunc)NULL, - (AF_Script_DoneMetricsFunc) NULL, - - (AF_Script_InitHintsFunc) NULL, - (AF_Script_ApplyHintsFunc) NULL - ) - -#endif /* !AF_CONFIG_OPTION_CJK */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afcjk.h b/android/jni/ndk_modules/freetype/src/autofit/afcjk.h deleted file mode 100644 index 0b20d4ae..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afcjk.h +++ /dev/null @@ -1,57 +0,0 @@ -/***************************************************************************/ -/* */ -/* afcjk.h */ -/* */ -/* Auto-fitter hinting routines for CJK script (specification). */ -/* */ -/* Copyright 2006, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __AFCJK_H__ -#define __AFCJK_H__ - -#include "afhints.h" - - -FT_BEGIN_HEADER - - - /* the CJK-specific script class */ - - AF_DECLARE_SCRIPT_CLASS(af_cjk_script_class) - - - FT_LOCAL( FT_Error ) - af_cjk_metrics_init( AF_LatinMetrics metrics, - FT_Face face ); - - FT_LOCAL( void ) - af_cjk_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ); - - FT_LOCAL( FT_Error ) - af_cjk_hints_init( AF_GlyphHints hints, - AF_LatinMetrics metrics ); - - FT_LOCAL( FT_Error ) - af_cjk_hints_apply( AF_GlyphHints hints, - FT_Outline* outline, - AF_LatinMetrics metrics ); - -/* */ - -FT_END_HEADER - -#endif /* __AFCJK_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afdummy.c b/android/jni/ndk_modules/freetype/src/autofit/afdummy.c deleted file mode 100644 index 42b2fcb2..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afdummy.c +++ /dev/null @@ -1,60 +0,0 @@ -/***************************************************************************/ -/* */ -/* afdummy.c */ -/* */ -/* Auto-fitter dummy routines to be used if no hinting should be */ -/* performed (body). */ -/* */ -/* Copyright 2003, 2004, 2005 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include "afdummy.h" -#include "afhints.h" - - - static FT_Error - af_dummy_hints_init( AF_GlyphHints hints, - AF_ScriptMetrics metrics ) - { - af_glyph_hints_rescale( hints, - metrics ); - return 0; - } - - - static FT_Error - af_dummy_hints_apply( AF_GlyphHints hints, - FT_Outline* outline ) - { - FT_UNUSED( hints ); - FT_UNUSED( outline ); - - return 0; - } - - - AF_DEFINE_SCRIPT_CLASS(af_dummy_script_class, - AF_SCRIPT_NONE, - NULL, - - sizeof( AF_ScriptMetricsRec ), - - (AF_Script_InitMetricsFunc) NULL, - (AF_Script_ScaleMetricsFunc)NULL, - (AF_Script_DoneMetricsFunc) NULL, - - (AF_Script_InitHintsFunc) af_dummy_hints_init, - (AF_Script_ApplyHintsFunc) af_dummy_hints_apply - ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afdummy.h b/android/jni/ndk_modules/freetype/src/autofit/afdummy.h deleted file mode 100644 index b69ef437..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afdummy.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* afdummy.h */ -/* */ -/* Auto-fitter dummy routines to be used if no hinting should be */ -/* performed (specification). */ -/* */ -/* Copyright 2003, 2004, 2005 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __AFDUMMY_H__ -#define __AFDUMMY_H__ - -#include "aftypes.h" - - -FT_BEGIN_HEADER - - /* A dummy script metrics class used when no hinting should - * be performed. This is the default for non-latin glyphs! - */ - - AF_DECLARE_SCRIPT_CLASS(af_dummy_script_class) - -/* */ - -FT_END_HEADER - - -#endif /* __AFDUMMY_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/aferrors.h b/android/jni/ndk_modules/freetype/src/autofit/aferrors.h deleted file mode 100644 index c2ed5fe2..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/aferrors.h +++ /dev/null @@ -1,40 +0,0 @@ -/***************************************************************************/ -/* */ -/* aferrors.h */ -/* */ -/* Autofitter error codes (specification only). */ -/* */ -/* Copyright 2005 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the Autofitter error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __AFERRORS_H__ -#define __AFERRORS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#define FT_ERR_PREFIX AF_Err_ -#define FT_ERR_BASE FT_Mod_Err_Autofit - -#include FT_ERRORS_H - -#endif /* __AFERRORS_H__ */ - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afglobal.c b/android/jni/ndk_modules/freetype/src/autofit/afglobal.c deleted file mode 100644 index 178c884c..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afglobal.c +++ /dev/null @@ -1,323 +0,0 @@ -/***************************************************************************/ -/* */ -/* afglobal.c */ -/* */ -/* Auto-fitter routines to compute global hinting values (body). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include "afglobal.h" -#include "afdummy.h" -#include "aflatin.h" -#include "afcjk.h" -#include "afindic.h" -#include "afpic.h" - -#include "aferrors.h" - -#ifdef FT_OPTION_AUTOFIT2 -#include "aflatin2.h" -#endif - -#ifndef FT_CONFIG_OPTION_PIC - -/* when updating this table, don't forget to update - AF_SCRIPT_CLASSES_COUNT and autofit_module_class_pic_init */ - - /* populate this list when you add new scripts */ - static AF_ScriptClass const af_script_classes[] = - { - &af_dummy_script_class, -#ifdef FT_OPTION_AUTOFIT2 - &af_latin2_script_class, -#endif - &af_latin_script_class, - &af_cjk_script_class, - &af_indic_script_class, - NULL /* do not remove */ - }; - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* index of default script in `af_script_classes' */ -#define AF_SCRIPT_LIST_DEFAULT 2 - /* a bit mask indicating an uncovered glyph */ -#define AF_SCRIPT_LIST_NONE 0x7F - /* if this flag is set, we have an ASCII digit */ -#define AF_DIGIT 0x80 - - - /* - * Note that glyph_scripts[] is used to map each glyph into - * an index into the `af_script_classes' array. - * - */ - typedef struct AF_FaceGlobalsRec_ - { - FT_Face face; - FT_Long glyph_count; /* same as face->num_glyphs */ - FT_Byte* glyph_scripts; - - AF_ScriptMetrics metrics[AF_SCRIPT_MAX]; - - } AF_FaceGlobalsRec; - - - /* Compute the script index of each glyph within a given face. */ - - static FT_Error - af_face_globals_compute_script_coverage( AF_FaceGlobals globals ) - { - FT_Error error = AF_Err_Ok; - FT_Face face = globals->face; - FT_CharMap old_charmap = face->charmap; - FT_Byte* gscripts = globals->glyph_scripts; - FT_UInt ss, i; - - - /* the value 255 means `uncovered glyph' */ - FT_MEM_SET( globals->glyph_scripts, - AF_SCRIPT_LIST_NONE, - globals->glyph_count ); - - error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); - if ( error ) - { - /* - * Ignore this error; we simply use the default script. - * XXX: Shouldn't we rather disable hinting? - */ - error = AF_Err_Ok; - goto Exit; - } - - /* scan each script in a Unicode charmap */ - for ( ss = 0; AF_SCRIPT_CLASSES_GET[ss]; ss++ ) - { - AF_ScriptClass clazz = AF_SCRIPT_CLASSES_GET[ss]; - AF_Script_UniRange range; - - - if ( clazz->script_uni_ranges == NULL ) - continue; - - /* - * Scan all unicode points in the range and set the corresponding - * glyph script index. - */ - for ( range = clazz->script_uni_ranges; range->first != 0; range++ ) - { - FT_ULong charcode = range->first; - FT_UInt gindex; - - - gindex = FT_Get_Char_Index( face, charcode ); - - if ( gindex != 0 && - gindex < (FT_ULong)globals->glyph_count && - gscripts[gindex] == AF_SCRIPT_LIST_NONE ) - { - gscripts[gindex] = (FT_Byte)ss; - } - - for (;;) - { - charcode = FT_Get_Next_Char( face, charcode, &gindex ); - - if ( gindex == 0 || charcode > range->last ) - break; - - if ( gindex < (FT_ULong)globals->glyph_count && - gscripts[gindex] == AF_SCRIPT_LIST_NONE ) - { - gscripts[gindex] = (FT_Byte)ss; - } - } - } - } - - /* mark ASCII digits */ - for ( i = 0x30; i <= 0x39; i++ ) - { - FT_UInt gindex = FT_Get_Char_Index( face, i ); - - - if ( gindex != 0 && gindex < (FT_ULong)globals->glyph_count ) - gscripts[gindex] |= AF_DIGIT; - } - - Exit: - /* - * By default, all uncovered glyphs are set to the latin script. - * XXX: Shouldn't we disable hinting or do something similar? - */ - { - FT_Long nn; - - - for ( nn = 0; nn < globals->glyph_count; nn++ ) - { - if ( ( gscripts[nn] & ~AF_DIGIT ) == AF_SCRIPT_LIST_NONE ) - { - gscripts[nn] &= ~AF_SCRIPT_LIST_NONE; - gscripts[nn] |= AF_SCRIPT_LIST_DEFAULT; - } - } - } - - FT_Set_Charmap( face, old_charmap ); - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - af_face_globals_new( FT_Face face, - AF_FaceGlobals *aglobals ) - { - FT_Error error; - FT_Memory memory; - AF_FaceGlobals globals = NULL; - - - memory = face->memory; - - if ( !FT_ALLOC( globals, sizeof ( *globals ) + - face->num_glyphs * sizeof ( FT_Byte ) ) ) - { - globals->face = face; - globals->glyph_count = face->num_glyphs; - globals->glyph_scripts = (FT_Byte*)( globals + 1 ); - - error = af_face_globals_compute_script_coverage( globals ); - if ( error ) - { - af_face_globals_free( globals ); - globals = NULL; - } - } - - *aglobals = globals; - return error; - } - - - FT_LOCAL_DEF( void ) - af_face_globals_free( AF_FaceGlobals globals ) - { - if ( globals ) - { - FT_Memory memory = globals->face->memory; - FT_UInt nn; - - - for ( nn = 0; nn < AF_SCRIPT_MAX; nn++ ) - { - if ( globals->metrics[nn] ) - { - AF_ScriptClass clazz = AF_SCRIPT_CLASSES_GET[nn]; - - - FT_ASSERT( globals->metrics[nn]->clazz == clazz ); - - if ( clazz->script_metrics_done ) - clazz->script_metrics_done( globals->metrics[nn] ); - - FT_FREE( globals->metrics[nn] ); - } - } - - globals->glyph_count = 0; - globals->glyph_scripts = NULL; /* no need to free this one! */ - globals->face = NULL; - - FT_FREE( globals ); - } - } - - - FT_LOCAL_DEF( FT_Error ) - af_face_globals_get_metrics( AF_FaceGlobals globals, - FT_UInt gindex, - FT_UInt options, - AF_ScriptMetrics *ametrics ) - { - AF_ScriptMetrics metrics = NULL; - FT_UInt gidx; - AF_ScriptClass clazz; - FT_UInt script = options & 15; - const FT_Offset script_max = sizeof ( AF_SCRIPT_CLASSES_GET ) / - sizeof ( AF_SCRIPT_CLASSES_GET[0] ); - FT_Error error = AF_Err_Ok; - - - if ( gindex >= (FT_ULong)globals->glyph_count ) - { - error = AF_Err_Invalid_Argument; - goto Exit; - } - - gidx = script; - if ( gidx == 0 || gidx + 1 >= script_max ) - gidx = globals->glyph_scripts[gindex] & AF_SCRIPT_LIST_NONE; - - clazz = AF_SCRIPT_CLASSES_GET[gidx]; - if ( script == 0 ) - script = clazz->script; - - metrics = globals->metrics[clazz->script]; - if ( metrics == NULL ) - { - /* create the global metrics object when needed */ - FT_Memory memory = globals->face->memory; - - - if ( FT_ALLOC( metrics, clazz->script_metrics_size ) ) - goto Exit; - - metrics->clazz = clazz; - - if ( clazz->script_metrics_init ) - { - error = clazz->script_metrics_init( metrics, globals->face ); - if ( error ) - { - if ( clazz->script_metrics_done ) - clazz->script_metrics_done( metrics ); - - FT_FREE( metrics ); - goto Exit; - } - } - - globals->metrics[clazz->script] = metrics; - } - - Exit: - *ametrics = metrics; - - return error; - } - - - FT_LOCAL_DEF( FT_Bool ) - af_face_globals_is_digit( AF_FaceGlobals globals, - FT_UInt gindex ) - { - if ( gindex < (FT_ULong)globals->glyph_count ) - return (FT_Bool)( globals->glyph_scripts[gindex] & AF_DIGIT ); - - return (FT_Bool)0; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afglobal.h b/android/jni/ndk_modules/freetype/src/autofit/afglobal.h deleted file mode 100644 index 2a68e196..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afglobal.h +++ /dev/null @@ -1,71 +0,0 @@ -/***************************************************************************/ -/* */ -/* afglobal.h */ -/* */ -/* Auto-fitter routines to compute global hinting values */ -/* (specification). */ -/* */ -/* Copyright 2003, 2004, 2005, 2007, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __AF_GLOBAL_H__ -#define __AF_GLOBAL_H__ - - -#include "aftypes.h" - - -FT_BEGIN_HEADER - - - /************************************************************************/ - /************************************************************************/ - /***** *****/ - /***** F A C E G L O B A L S *****/ - /***** *****/ - /************************************************************************/ - /************************************************************************/ - - - /* - * model the global hints data for a given face, decomposed into - * script-specific items - */ - typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals; - - - FT_LOCAL( FT_Error ) - af_face_globals_new( FT_Face face, - AF_FaceGlobals *aglobals ); - - FT_LOCAL( FT_Error ) - af_face_globals_get_metrics( AF_FaceGlobals globals, - FT_UInt gindex, - FT_UInt options, - AF_ScriptMetrics *ametrics ); - - FT_LOCAL( void ) - af_face_globals_free( AF_FaceGlobals globals ); - - FT_LOCAL_DEF( FT_Bool ) - af_face_globals_is_digit( AF_FaceGlobals globals, - FT_UInt gindex ); - - /* */ - - -FT_END_HEADER - -#endif /* __AF_GLOBALS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afhints.c b/android/jni/ndk_modules/freetype/src/autofit/afhints.c deleted file mode 100644 index c3497091..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afhints.c +++ /dev/null @@ -1,1142 +0,0 @@ -/***************************************************************************/ -/* */ -/* afhints.c */ -/* */ -/* Auto-fitter hinting routines (body). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include "afhints.h" -#include "aferrors.h" -#include FT_INTERNAL_CALC_H - - - FT_LOCAL_DEF( FT_Error ) - af_axis_hints_new_segment( AF_AxisHints axis, - FT_Memory memory, - AF_Segment *asegment ) - { - FT_Error error = AF_Err_Ok; - AF_Segment segment = NULL; - - - if ( axis->num_segments >= axis->max_segments ) - { - FT_Int old_max = axis->max_segments; - FT_Int new_max = old_max; - FT_Int big_max = (FT_Int)( FT_INT_MAX / sizeof ( *segment ) ); - - - if ( old_max >= big_max ) - { - error = AF_Err_Out_Of_Memory; - goto Exit; - } - - new_max += ( new_max >> 2 ) + 4; - if ( new_max < old_max || new_max > big_max ) - new_max = big_max; - - if ( FT_RENEW_ARRAY( axis->segments, old_max, new_max ) ) - goto Exit; - - axis->max_segments = new_max; - } - - segment = axis->segments + axis->num_segments++; - - Exit: - *asegment = segment; - return error; - } - - - FT_LOCAL( FT_Error ) - af_axis_hints_new_edge( AF_AxisHints axis, - FT_Int fpos, - AF_Direction dir, - FT_Memory memory, - AF_Edge *aedge ) - { - FT_Error error = AF_Err_Ok; - AF_Edge edge = NULL; - AF_Edge edges; - - - if ( axis->num_edges >= axis->max_edges ) - { - FT_Int old_max = axis->max_edges; - FT_Int new_max = old_max; - FT_Int big_max = (FT_Int)( FT_INT_MAX / sizeof ( *edge ) ); - - - if ( old_max >= big_max ) - { - error = AF_Err_Out_Of_Memory; - goto Exit; - } - - new_max += ( new_max >> 2 ) + 4; - if ( new_max < old_max || new_max > big_max ) - new_max = big_max; - - if ( FT_RENEW_ARRAY( axis->edges, old_max, new_max ) ) - goto Exit; - - axis->max_edges = new_max; - } - - edges = axis->edges; - edge = edges + axis->num_edges; - - while ( edge > edges ) - { - if ( edge[-1].fpos < fpos ) - break; - - /* we want the edge with same position and minor direction */ - /* to appear before those in the major one in the list */ - if ( edge[-1].fpos == fpos && dir == axis->major_dir ) - break; - - edge[0] = edge[-1]; - edge--; - } - - axis->num_edges++; - - FT_ZERO( edge ); - edge->fpos = (FT_Short)fpos; - edge->dir = (FT_Char)dir; - - Exit: - *aedge = edge; - return error; - } - - -#ifdef AF_DEBUG - -#include FT_CONFIG_STANDARD_LIBRARY_H - - static const char* - af_dir_str( AF_Direction dir ) - { - const char* result; - - - switch ( dir ) - { - case AF_DIR_UP: - result = "up"; - break; - case AF_DIR_DOWN: - result = "down"; - break; - case AF_DIR_LEFT: - result = "left"; - break; - case AF_DIR_RIGHT: - result = "right"; - break; - default: - result = "none"; - } - - return result; - } - - -#define AF_INDEX_NUM( ptr, base ) ( (ptr) ? ( (ptr) - (base) ) : -1 ) - - - void - af_glyph_hints_dump_points( AF_GlyphHints hints ) - { - AF_Point points = hints->points; - AF_Point limit = points + hints->num_points; - AF_Point point; - - - printf( "Table of points:\n" ); - printf( " [ index | xorg | yorg | xscale | yscale " - "| xfit | yfit | flags ]\n" ); - - for ( point = points; point < limit; point++ ) - { - printf( " [ %5d | %5d | %5d | %-5.2f | %-5.2f " - "| %-5.2f | %-5.2f | %c%c%c%c%c%c ]\n", - point - points, - point->fx, - point->fy, - point->ox/64.0, - point->oy/64.0, - point->x/64.0, - point->y/64.0, - ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ? 'w' : ' ', - ( point->flags & AF_FLAG_INFLECTION ) ? 'i' : ' ', - ( point->flags & AF_FLAG_EXTREMA_X ) ? '<' : ' ', - ( point->flags & AF_FLAG_EXTREMA_Y ) ? 'v' : ' ', - ( point->flags & AF_FLAG_ROUND_X ) ? '(' : ' ', - ( point->flags & AF_FLAG_ROUND_Y ) ? 'u' : ' '); - } - printf( "\n" ); - } - - - static const char* - af_edge_flags_to_string( AF_Edge_Flags flags ) - { - static char temp[32]; - int pos = 0; - - - if ( flags & AF_EDGE_ROUND ) - { - ft_memcpy( temp + pos, "round", 5 ); - pos += 5; - } - if ( flags & AF_EDGE_SERIF ) - { - if ( pos > 0 ) - temp[pos++] = ' '; - ft_memcpy( temp + pos, "serif", 5 ); - pos += 5; - } - if ( pos == 0 ) - return "normal"; - - temp[pos] = 0; - - return temp; - } - - - /* A function to dump the array of linked segments. */ - void - af_glyph_hints_dump_segments( AF_GlyphHints hints ) - { - FT_Int dimension; - - - for ( dimension = 1; dimension >= 0; dimension-- ) - { - AF_AxisHints axis = &hints->axis[dimension]; - AF_Segment segments = axis->segments; - AF_Segment limit = segments + axis->num_segments; - AF_Segment seg; - - - printf ( "Table of %s segments:\n", - dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ); - printf ( " [ index | pos | dir | link | serif |" - " height | extra | flags ]\n" ); - - for ( seg = segments; seg < limit; seg++ ) - { - printf ( " [ %5d | %5.2g | %5s | %4d | %5d | %5d | %5d | %s ]\n", - seg - segments, - dimension == AF_DIMENSION_HORZ ? (int)seg->first->ox / 64.0 - : (int)seg->first->oy / 64.0, - af_dir_str( (AF_Direction)seg->dir ), - AF_INDEX_NUM( seg->link, segments ), - AF_INDEX_NUM( seg->serif, segments ), - seg->height, - seg->height - ( seg->max_coord - seg->min_coord ), - af_edge_flags_to_string( seg->flags ) ); - } - printf( "\n" ); - } - } - - - void - af_glyph_hints_dump_edges( AF_GlyphHints hints ) - { - FT_Int dimension; - - - for ( dimension = 1; dimension >= 0; dimension-- ) - { - AF_AxisHints axis = &hints->axis[dimension]; - AF_Edge edges = axis->edges; - AF_Edge limit = edges + axis->num_edges; - AF_Edge edge; - - - /* - * note: AF_DIMENSION_HORZ corresponds to _vertical_ edges - * since they have constant a X coordinate. - */ - printf ( "Table of %s edges:\n", - dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ); - printf ( " [ index | pos | dir | link |" - " serif | blue | opos | pos | flags ]\n" ); - - for ( edge = edges; edge < limit; edge++ ) - { - printf ( " [ %5d | %5.2g | %5s | %4d |" - " %5d | %c | %5.2f | %5.2f | %s ]\n", - edge - edges, - (int)edge->opos / 64.0, - af_dir_str( (AF_Direction)edge->dir ), - AF_INDEX_NUM( edge->link, edges ), - AF_INDEX_NUM( edge->serif, edges ), - edge->blue_edge ? 'y' : 'n', - edge->opos / 64.0, - edge->pos / 64.0, - af_edge_flags_to_string( edge->flags ) ); - } - printf( "\n" ); - } - } - -#else /* !AF_DEBUG */ - - /* these empty stubs are only used to link the `ftgrid' test program */ - /* when debugging is disabled */ - - void - af_glyph_hints_dump_points( AF_GlyphHints hints ) - { - FT_UNUSED( hints ); - } - - - void - af_glyph_hints_dump_segments( AF_GlyphHints hints ) - { - FT_UNUSED( hints ); - } - - - void - af_glyph_hints_dump_edges( AF_GlyphHints hints ) - { - FT_UNUSED( hints ); - } - -#endif /* !AF_DEBUG */ - - - /* compute the direction value of a given vector */ - FT_LOCAL_DEF( AF_Direction ) - af_direction_compute( FT_Pos dx, - FT_Pos dy ) - { - FT_Pos ll, ss; /* long and short arm lengths */ - AF_Direction dir; /* candidate direction */ - - - if ( dy >= dx ) - { - if ( dy >= -dx ) - { - dir = AF_DIR_UP; - ll = dy; - ss = dx; - } - else - { - dir = AF_DIR_LEFT; - ll = -dx; - ss = dy; - } - } - else /* dy < dx */ - { - if ( dy >= -dx ) - { - dir = AF_DIR_RIGHT; - ll = dx; - ss = dy; - } - else - { - dir = AF_DIR_DOWN; - ll = dy; - ss = dx; - } - } - - ss *= 14; - if ( FT_ABS( ll ) <= FT_ABS( ss ) ) - dir = AF_DIR_NONE; - - return dir; - } - - - FT_LOCAL_DEF( void ) - af_glyph_hints_init( AF_GlyphHints hints, - FT_Memory memory ) - { - FT_ZERO( hints ); - hints->memory = memory; - } - - - FT_LOCAL_DEF( void ) - af_glyph_hints_done( AF_GlyphHints hints ) - { - if ( hints && hints->memory ) - { - FT_Memory memory = hints->memory; - int dim; - - - /* - * note that we don't need to free the segment and edge - * buffers, since they are really within the hints->points array - */ - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_AxisHints axis = &hints->axis[dim]; - - - axis->num_segments = 0; - axis->max_segments = 0; - FT_FREE( axis->segments ); - - axis->num_edges = 0; - axis->max_edges = 0; - FT_FREE( axis->edges ); - } - - FT_FREE( hints->contours ); - hints->max_contours = 0; - hints->num_contours = 0; - - FT_FREE( hints->points ); - hints->num_points = 0; - hints->max_points = 0; - - hints->memory = NULL; - } - } - - - FT_LOCAL_DEF( void ) - af_glyph_hints_rescale( AF_GlyphHints hints, - AF_ScriptMetrics metrics ) - { - hints->metrics = metrics; - hints->scaler_flags = metrics->scaler.flags; - } - - - FT_LOCAL_DEF( FT_Error ) - af_glyph_hints_reload( AF_GlyphHints hints, - FT_Outline* outline ) - { - FT_Error error = AF_Err_Ok; - AF_Point points; - FT_UInt old_max, new_max; - FT_Fixed x_scale = hints->x_scale; - FT_Fixed y_scale = hints->y_scale; - FT_Pos x_delta = hints->x_delta; - FT_Pos y_delta = hints->y_delta; - FT_Memory memory = hints->memory; - - - hints->num_points = 0; - hints->num_contours = 0; - - hints->axis[0].num_segments = 0; - hints->axis[0].num_edges = 0; - hints->axis[1].num_segments = 0; - hints->axis[1].num_edges = 0; - - /* first of all, reallocate the contours array when necessary */ - new_max = (FT_UInt)outline->n_contours; - old_max = hints->max_contours; - if ( new_max > old_max ) - { - new_max = ( new_max + 3 ) & ~3; - - if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) ) - goto Exit; - - hints->max_contours = new_max; - } - - /* - * then reallocate the points arrays if necessary -- - * note that we reserve two additional point positions, used to - * hint metrics appropriately - */ - new_max = (FT_UInt)( outline->n_points + 2 ); - old_max = hints->max_points; - if ( new_max > old_max ) - { - new_max = ( new_max + 2 + 7 ) & ~7; - - if ( FT_RENEW_ARRAY( hints->points, old_max, new_max ) ) - goto Exit; - - hints->max_points = new_max; - } - - hints->num_points = outline->n_points; - hints->num_contours = outline->n_contours; - - /* We can't rely on the value of `FT_Outline.flags' to know the fill */ - /* direction used for a glyph, given that some fonts are broken (e.g., */ - /* the Arphic ones). We thus recompute it each time we need to. */ - /* */ - hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_UP; - hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_LEFT; - - if ( FT_Outline_Get_Orientation( outline ) == FT_ORIENTATION_POSTSCRIPT ) - { - hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_DOWN; - hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_RIGHT; - } - - hints->x_scale = x_scale; - hints->y_scale = y_scale; - hints->x_delta = x_delta; - hints->y_delta = y_delta; - - hints->xmin_delta = 0; - hints->xmax_delta = 0; - - points = hints->points; - if ( hints->num_points == 0 ) - goto Exit; - - { - AF_Point point; - AF_Point point_limit = points + hints->num_points; - - - /* compute coordinates & Bezier flags, next and prev */ - { - FT_Vector* vec = outline->points; - char* tag = outline->tags; - AF_Point end = points + outline->contours[0]; - AF_Point prev = end; - FT_Int contour_index = 0; - - - for ( point = points; point < point_limit; point++, vec++, tag++ ) - { - point->fx = (FT_Short)vec->x; - point->fy = (FT_Short)vec->y; - point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta; - point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta; - - switch ( FT_CURVE_TAG( *tag ) ) - { - case FT_CURVE_TAG_CONIC: - point->flags = AF_FLAG_CONIC; - break; - case FT_CURVE_TAG_CUBIC: - point->flags = AF_FLAG_CUBIC; - break; - default: - point->flags = 0; - } - - point->prev = prev; - prev->next = point; - prev = point; - - if ( point == end ) - { - if ( ++contour_index < outline->n_contours ) - { - end = points + outline->contours[contour_index]; - prev = end; - } - } - } - } - - /* set-up the contours array */ - { - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - short* end = outline->contours; - short idx = 0; - - - for ( ; contour < contour_limit; contour++, end++ ) - { - contour[0] = points + idx; - idx = (short)( end[0] + 1 ); - } - } - - /* compute directions of in & out vectors */ - { - AF_Point first = points; - AF_Point prev = NULL; - FT_Pos in_x = 0; - FT_Pos in_y = 0; - AF_Direction in_dir = AF_DIR_NONE; - - - for ( point = points; point < point_limit; point++ ) - { - AF_Point next; - FT_Pos out_x, out_y; - - - if ( point == first ) - { - prev = first->prev; - in_x = first->fx - prev->fx; - in_y = first->fy - prev->fy; - in_dir = af_direction_compute( in_x, in_y ); - first = prev + 1; - } - - point->in_dir = (FT_Char)in_dir; - - next = point->next; - out_x = next->fx - point->fx; - out_y = next->fy - point->fy; - - in_dir = af_direction_compute( out_x, out_y ); - point->out_dir = (FT_Char)in_dir; - - if ( point->flags & ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) ) - { - Is_Weak_Point: - point->flags |= AF_FLAG_WEAK_INTERPOLATION; - } - else if ( point->out_dir == point->in_dir ) - { - if ( point->out_dir != AF_DIR_NONE ) - goto Is_Weak_Point; - - if ( ft_corner_is_flat( in_x, in_y, out_x, out_y ) ) - goto Is_Weak_Point; - } - else if ( point->in_dir == -point->out_dir ) - goto Is_Weak_Point; - - in_x = out_x; - in_y = out_y; - prev = point; - } - } - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - af_glyph_hints_save( AF_GlyphHints hints, - FT_Outline* outline ) - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - FT_Vector* vec = outline->points; - char* tag = outline->tags; - - - for ( ; point < limit; point++, vec++, tag++ ) - { - vec->x = point->x; - vec->y = point->y; - - if ( point->flags & AF_FLAG_CONIC ) - tag[0] = FT_CURVE_TAG_CONIC; - else if ( point->flags & AF_FLAG_CUBIC ) - tag[0] = FT_CURVE_TAG_CUBIC; - else - tag[0] = FT_CURVE_TAG_ON; - } - } - - - /**************************************************************** - * - * EDGE POINT GRID-FITTING - * - ****************************************************************/ - - - FT_LOCAL_DEF( void ) - af_glyph_hints_align_edge_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = & hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - - - if ( dim == AF_DIMENSION_HORZ ) - { - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge edge = seg->edge; - AF_Point point, first, last; - - - if ( edge == NULL ) - continue; - - first = seg->first; - last = seg->last; - point = first; - for (;;) - { - point->x = edge->pos; - point->flags |= AF_FLAG_TOUCH_X; - - if ( point == last ) - break; - - point = point->next; - - } - } - } - else - { - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge edge = seg->edge; - AF_Point point, first, last; - - - if ( edge == NULL ) - continue; - - first = seg->first; - last = seg->last; - point = first; - for (;;) - { - point->y = edge->pos; - point->flags |= AF_FLAG_TOUCH_Y; - - if ( point == last ) - break; - - point = point->next; - } - } - } - } - - - /**************************************************************** - * - * STRONG POINT INTERPOLATION - * - ****************************************************************/ - - - /* hint the strong points -- this is equivalent to the TrueType `IP' */ - /* hinting instruction */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_align_strong_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_Point points = hints->points; - AF_Point point_limit = points + hints->num_points; - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Flags touch_flag; - - - if ( dim == AF_DIMENSION_HORZ ) - touch_flag = AF_FLAG_TOUCH_X; - else - touch_flag = AF_FLAG_TOUCH_Y; - - if ( edges < edge_limit ) - { - AF_Point point; - AF_Edge edge; - - - for ( point = points; point < point_limit; point++ ) - { - FT_Pos u, ou, fu; /* point position */ - FT_Pos delta; - - - if ( point->flags & touch_flag ) - continue; - - /* if this point is candidate to weak interpolation, we */ - /* interpolate it after all strong points have been processed */ - - if ( ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) && - !( point->flags & AF_FLAG_INFLECTION ) ) - continue; - - if ( dim == AF_DIMENSION_VERT ) - { - u = point->fy; - ou = point->oy; - } - else - { - u = point->fx; - ou = point->ox; - } - - fu = u; - - /* is the point before the first edge? */ - edge = edges; - delta = edge->fpos - u; - if ( delta >= 0 ) - { - u = edge->pos - ( edge->opos - ou ); - goto Store_Point; - } - - /* is the point after the last edge? */ - edge = edge_limit - 1; - delta = u - edge->fpos; - if ( delta >= 0 ) - { - u = edge->pos + ( ou - edge->opos ); - goto Store_Point; - } - - { - FT_PtrDist min, max, mid; - FT_Pos fpos; - - - /* find enclosing edges */ - min = 0; - max = edge_limit - edges; - -#if 1 - /* for small edge counts, a linear search is better */ - if ( max <= 8 ) - { - FT_PtrDist nn; - - for ( nn = 0; nn < max; nn++ ) - if ( edges[nn].fpos >= u ) - break; - - if ( edges[nn].fpos == u ) - { - u = edges[nn].pos; - goto Store_Point; - } - min = nn; - } - else -#endif - while ( min < max ) - { - mid = ( max + min ) >> 1; - edge = edges + mid; - fpos = edge->fpos; - - if ( u < fpos ) - max = mid; - else if ( u > fpos ) - min = mid + 1; - else - { - /* we are on the edge */ - u = edge->pos; - goto Store_Point; - } - } - - { - AF_Edge before = edges + min - 1; - AF_Edge after = edges + min + 0; - - - /* assert( before && after && before != after ) */ - if ( before->scale == 0 ) - before->scale = FT_DivFix( after->pos - before->pos, - after->fpos - before->fpos ); - - u = before->pos + FT_MulFix( fu - before->fpos, - before->scale ); - } - } - - Store_Point: - /* save the point position */ - if ( dim == AF_DIMENSION_HORZ ) - point->x = u; - else - point->y = u; - - point->flags |= touch_flag; - } - } - } - - - /**************************************************************** - * - * WEAK POINT INTERPOLATION - * - ****************************************************************/ - - - static void - af_iup_shift( AF_Point p1, - AF_Point p2, - AF_Point ref ) - { - AF_Point p; - FT_Pos delta = ref->u - ref->v; - - if ( delta == 0 ) - return; - - for ( p = p1; p < ref; p++ ) - p->u = p->v + delta; - - for ( p = ref + 1; p <= p2; p++ ) - p->u = p->v + delta; - } - - - static void - af_iup_interp( AF_Point p1, - AF_Point p2, - AF_Point ref1, - AF_Point ref2 ) - { - AF_Point p; - FT_Pos u; - FT_Pos v1 = ref1->v; - FT_Pos v2 = ref2->v; - FT_Pos d1 = ref1->u - v1; - FT_Pos d2 = ref2->u - v2; - - - if ( p1 > p2 ) - return; - - if ( v1 == v2 ) - { - for ( p = p1; p <= p2; p++ ) - { - u = p->v; - - if ( u <= v1 ) - u += d1; - else - u += d2; - - p->u = u; - } - return; - } - - if ( v1 < v2 ) - { - for ( p = p1; p <= p2; p++ ) - { - u = p->v; - - if ( u <= v1 ) - u += d1; - else if ( u >= v2 ) - u += d2; - else - u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 ); - - p->u = u; - } - } - else - { - for ( p = p1; p <= p2; p++ ) - { - u = p->v; - - if ( u <= v2 ) - u += d2; - else if ( u >= v1 ) - u += d1; - else - u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 ); - - p->u = u; - } - } - } - - - FT_LOCAL_DEF( void ) - af_glyph_hints_align_weak_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_Point points = hints->points; - AF_Point point_limit = points + hints->num_points; - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - AF_Flags touch_flag; - AF_Point point; - AF_Point end_point; - AF_Point first_point; - - - /* PASS 1: Move segment points to edge positions */ - - if ( dim == AF_DIMENSION_HORZ ) - { - touch_flag = AF_FLAG_TOUCH_X; - - for ( point = points; point < point_limit; point++ ) - { - point->u = point->x; - point->v = point->ox; - } - } - else - { - touch_flag = AF_FLAG_TOUCH_Y; - - for ( point = points; point < point_limit; point++ ) - { - point->u = point->y; - point->v = point->oy; - } - } - - point = points; - - for ( ; contour < contour_limit; contour++ ) - { - AF_Point first_touched, last_touched; - - - point = *contour; - end_point = point->prev; - first_point = point; - - /* find first touched point */ - for (;;) - { - if ( point > end_point ) /* no touched point in contour */ - goto NextContour; - - if ( point->flags & touch_flag ) - break; - - point++; - } - - first_touched = point; - last_touched = point; - - for (;;) - { - FT_ASSERT( point <= end_point && - ( point->flags & touch_flag ) != 0 ); - - /* skip any touched neighbhours */ - while ( point < end_point && ( point[1].flags & touch_flag ) != 0 ) - point++; - - last_touched = point; - - /* find the next touched point, if any */ - point ++; - for (;;) - { - if ( point > end_point ) - goto EndContour; - - if ( ( point->flags & touch_flag ) != 0 ) - break; - - point++; - } - - /* interpolate between last_touched and point */ - af_iup_interp( last_touched + 1, point - 1, - last_touched, point ); - } - - EndContour: - /* special case: only one point was touched */ - if ( last_touched == first_touched ) - { - af_iup_shift( first_point, end_point, first_touched ); - } - else /* interpolate the last part */ - { - if ( last_touched < end_point ) - af_iup_interp( last_touched + 1, end_point, - last_touched, first_touched ); - - if ( first_touched > points ) - af_iup_interp( first_point, first_touched - 1, - last_touched, first_touched ); - } - - NextContour: - ; - } - - /* now save the interpolated values back to x/y */ - if ( dim == AF_DIMENSION_HORZ ) - { - for ( point = points; point < point_limit; point++ ) - point->x = point->u; - } - else - { - for ( point = points; point < point_limit; point++ ) - point->y = point->u; - } - } - - -#ifdef AF_USE_WARPER - - FT_LOCAL_DEF( void ) - af_glyph_hints_scale_dim( AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed scale, - FT_Pos delta ) - { - AF_Point points = hints->points; - AF_Point points_limit = points + hints->num_points; - AF_Point point; - - - if ( dim == AF_DIMENSION_HORZ ) - { - for ( point = points; point < points_limit; point++ ) - point->x = FT_MulFix( point->fx, scale ) + delta; - } - else - { - for ( point = points; point < points_limit; point++ ) - point->y = FT_MulFix( point->fy, scale ) + delta; - } - } - -#endif /* AF_USE_WARPER */ - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afhints.h b/android/jni/ndk_modules/freetype/src/autofit/afhints.h deleted file mode 100644 index 10e673b3..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afhints.h +++ /dev/null @@ -1,332 +0,0 @@ -/***************************************************************************/ -/* */ -/* afhints.h */ -/* */ -/* Auto-fitter hinting routines (specification). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __AFHINTS_H__ -#define __AFHINTS_H__ - -#include "aftypes.h" - -#define xxAF_SORT_SEGMENTS - -FT_BEGIN_HEADER - - /* - * The definition of outline glyph hints. These are shared by all - * script analysis routines (until now). - */ - - typedef enum AF_Dimension_ - { - AF_DIMENSION_HORZ = 0, /* x coordinates, */ - /* i.e., vertical segments & edges */ - AF_DIMENSION_VERT = 1, /* y coordinates, */ - /* i.e., horizontal segments & edges */ - - AF_DIMENSION_MAX /* do not remove */ - - } AF_Dimension; - - - /* hint directions -- the values are computed so that two vectors are */ - /* in opposite directions iff `dir1 + dir2 == 0' */ - typedef enum AF_Direction_ - { - AF_DIR_NONE = 4, - AF_DIR_RIGHT = 1, - AF_DIR_LEFT = -1, - AF_DIR_UP = 2, - AF_DIR_DOWN = -2 - - } AF_Direction; - - - /* point hint flags */ - typedef enum AF_Flags_ - { - AF_FLAG_NONE = 0, - - /* point type flags */ - AF_FLAG_CONIC = 1 << 0, - AF_FLAG_CUBIC = 1 << 1, - AF_FLAG_CONTROL = AF_FLAG_CONIC | AF_FLAG_CUBIC, - - /* point extremum flags */ - AF_FLAG_EXTREMA_X = 1 << 2, - AF_FLAG_EXTREMA_Y = 1 << 3, - - /* point roundness flags */ - AF_FLAG_ROUND_X = 1 << 4, - AF_FLAG_ROUND_Y = 1 << 5, - - /* point touch flags */ - AF_FLAG_TOUCH_X = 1 << 6, - AF_FLAG_TOUCH_Y = 1 << 7, - - /* candidates for weak interpolation have this flag set */ - AF_FLAG_WEAK_INTERPOLATION = 1 << 8, - - /* all inflection points in the outline have this flag set */ - AF_FLAG_INFLECTION = 1 << 9 - - } AF_Flags; - - - /* edge hint flags */ - typedef enum AF_Edge_Flags_ - { - AF_EDGE_NORMAL = 0, - AF_EDGE_ROUND = 1 << 0, - AF_EDGE_SERIF = 1 << 1, - AF_EDGE_DONE = 1 << 2 - - } AF_Edge_Flags; - - - typedef struct AF_PointRec_* AF_Point; - typedef struct AF_SegmentRec_* AF_Segment; - typedef struct AF_EdgeRec_* AF_Edge; - - - typedef struct AF_PointRec_ - { - FT_UShort flags; /* point flags used by hinter */ - FT_Char in_dir; /* direction of inwards vector */ - FT_Char out_dir; /* direction of outwards vector */ - - FT_Pos ox, oy; /* original, scaled position */ - FT_Short fx, fy; /* original, unscaled position (font units) */ - FT_Pos x, y; /* current position */ - FT_Pos u, v; /* current (x,y) or (y,x) depending on context */ - - AF_Point next; /* next point in contour */ - AF_Point prev; /* previous point in contour */ - - } AF_PointRec; - - - typedef struct AF_SegmentRec_ - { - FT_Byte flags; /* edge/segment flags for this segment */ - FT_Char dir; /* segment direction */ - FT_Short pos; /* position of segment */ - FT_Short min_coord; /* minimum coordinate of segment */ - FT_Short max_coord; /* maximum coordinate of segment */ - FT_Short height; /* the hinted segment height */ - - AF_Edge edge; /* the segment's parent edge */ - AF_Segment edge_next; /* link to next segment in parent edge */ - - AF_Segment link; /* (stem) link segment */ - AF_Segment serif; /* primary segment for serifs */ - FT_Pos num_linked; /* number of linked segments */ - FT_Pos score; /* used during stem matching */ - FT_Pos len; /* used during stem matching */ - - AF_Point first; /* first point in edge segment */ - AF_Point last; /* last point in edge segment */ - AF_Point* contour; /* ptr to first point of segment's contour */ - - } AF_SegmentRec; - - - typedef struct AF_EdgeRec_ - { - FT_Short fpos; /* original, unscaled position (font units) */ - FT_Pos opos; /* original, scaled position */ - FT_Pos pos; /* current position */ - - FT_Byte flags; /* edge flags */ - FT_Char dir; /* edge direction */ - FT_Fixed scale; /* used to speed up interpolation between edges */ - AF_Width blue_edge; /* non-NULL if this is a blue edge */ - - AF_Edge link; - AF_Edge serif; - FT_Short num_linked; - - FT_Int score; - - AF_Segment first; - AF_Segment last; - - } AF_EdgeRec; - - - typedef struct AF_AxisHintsRec_ - { - FT_Int num_segments; - FT_Int max_segments; - AF_Segment segments; -#ifdef AF_SORT_SEGMENTS - FT_Int mid_segments; -#endif - - FT_Int num_edges; - FT_Int max_edges; - AF_Edge edges; - - AF_Direction major_dir; - - } AF_AxisHintsRec, *AF_AxisHints; - - - typedef struct AF_GlyphHintsRec_ - { - FT_Memory memory; - - FT_Fixed x_scale; - FT_Pos x_delta; - - FT_Fixed y_scale; - FT_Pos y_delta; - - FT_Pos edge_distance_threshold; - - FT_Int max_points; - FT_Int num_points; - AF_Point points; - - FT_Int max_contours; - FT_Int num_contours; - AF_Point* contours; - - AF_AxisHintsRec axis[AF_DIMENSION_MAX]; - - FT_UInt32 scaler_flags; /* copy of scaler flags */ - FT_UInt32 other_flags; /* free for script-specific */ - /* implementations */ - AF_ScriptMetrics metrics; - - FT_Pos xmin_delta; /* used for warping */ - FT_Pos xmax_delta; - - } AF_GlyphHintsRec; - - -#define AF_HINTS_TEST_SCALER( h, f ) ( (h)->scaler_flags & (f) ) -#define AF_HINTS_TEST_OTHER( h, f ) ( (h)->other_flags & (f) ) - - -#ifdef AF_DEBUG - -#define AF_HINTS_DO_HORIZONTAL( h ) \ - ( !_af_debug_disable_horz_hints && \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) ) - -#define AF_HINTS_DO_VERTICAL( h ) \ - ( !_af_debug_disable_vert_hints && \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) ) - -#define AF_HINTS_DO_ADVANCE( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) - -#define AF_HINTS_DO_BLUES( h ) ( !_af_debug_disable_blue_hints ) - -#else /* !AF_DEBUG */ - -#define AF_HINTS_DO_HORIZONTAL( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) - -#define AF_HINTS_DO_VERTICAL( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) - -#define AF_HINTS_DO_ADVANCE( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) - -#define AF_HINTS_DO_BLUES( h ) 1 - -#endif /* !AF_DEBUG */ - - - FT_LOCAL( AF_Direction ) - af_direction_compute( FT_Pos dx, - FT_Pos dy ); - - - FT_LOCAL( FT_Error ) - af_axis_hints_new_segment( AF_AxisHints axis, - FT_Memory memory, - AF_Segment *asegment ); - - FT_LOCAL( FT_Error) - af_axis_hints_new_edge( AF_AxisHints axis, - FT_Int fpos, - AF_Direction dir, - FT_Memory memory, - AF_Edge *edge ); - - FT_LOCAL( void ) - af_glyph_hints_init( AF_GlyphHints hints, - FT_Memory memory ); - - - - /* - * recompute all AF_Point in a AF_GlyphHints from the definitions - * in a source outline - */ - FT_LOCAL( void ) - af_glyph_hints_rescale( AF_GlyphHints hints, - AF_ScriptMetrics metrics ); - - FT_LOCAL( FT_Error ) - af_glyph_hints_reload( AF_GlyphHints hints, - FT_Outline* outline ); - - FT_LOCAL( void ) - af_glyph_hints_save( AF_GlyphHints hints, - FT_Outline* outline ); - - FT_LOCAL( void ) - af_glyph_hints_align_edge_points( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( void ) - af_glyph_hints_align_strong_points( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( void ) - af_glyph_hints_align_weak_points( AF_GlyphHints hints, - AF_Dimension dim ); - -#ifdef AF_USE_WARPER - FT_LOCAL( void ) - af_glyph_hints_scale_dim( AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed scale, - FT_Pos delta ); -#endif - - FT_LOCAL( void ) - af_glyph_hints_done( AF_GlyphHints hints ); - -/* */ - -#define AF_SEGMENT_LEN( seg ) ( (seg)->max_coord - (seg)->min_coord ) - -#define AF_SEGMENT_DIST( seg1, seg2 ) ( ( (seg1)->pos > (seg2)->pos ) \ - ? (seg1)->pos - (seg2)->pos \ - : (seg2)->pos - (seg1)->pos ) - - -FT_END_HEADER - -#endif /* __AFHINTS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afindic.c b/android/jni/ndk_modules/freetype/src/autofit/afindic.c deleted file mode 100644 index 1d9e9eaf..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afindic.c +++ /dev/null @@ -1,130 +0,0 @@ -/***************************************************************************/ -/* */ -/* afindic.c */ -/* */ -/* Auto-fitter hinting routines for Indic scripts (body). */ -/* */ -/* Copyright 2007 by */ -/* Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include "aftypes.h" -#include "aflatin.h" - - -#ifdef AF_CONFIG_OPTION_INDIC - -#include "afindic.h" -#include "aferrors.h" -#include "afcjk.h" - - -#ifdef AF_USE_WARPER -#include "afwarp.h" -#endif - - - static FT_Error - af_indic_metrics_init( AF_LatinMetrics metrics, - FT_Face face ) - { - /* use CJK routines */ - return af_cjk_metrics_init( metrics, face ); - } - - - static void - af_indic_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ) - { - /* use CJK routines */ - af_cjk_metrics_scale( metrics, scaler ); - } - - - static FT_Error - af_indic_hints_init( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - /* use CJK routines */ - return af_cjk_hints_init( hints, metrics ); - } - - - static FT_Error - af_indic_hints_apply( AF_GlyphHints hints, - FT_Outline* outline, - AF_LatinMetrics metrics) - { - /* use CJK routines */ - return af_cjk_hints_apply( hints, outline, metrics ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** I N D I C S C R I P T C L A S S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - static const AF_Script_UniRangeRec af_indic_uniranges[] = - { -#if 0 - AF_UNIRANGE_REC( 0x0100UL, 0xFFFFUL ), /* why this? */ -#endif - AF_UNIRANGE_REC( 0x0900UL, 0x0DFFUL), /* Indic Range */ - AF_UNIRANGE_REC( 0UL, 0UL) - }; - - - AF_DEFINE_SCRIPT_CLASS(af_indic_script_class, - AF_SCRIPT_INDIC, - af_indic_uniranges, - - sizeof( AF_LatinMetricsRec ), - - (AF_Script_InitMetricsFunc) af_indic_metrics_init, - (AF_Script_ScaleMetricsFunc)af_indic_metrics_scale, - (AF_Script_DoneMetricsFunc) NULL, - - (AF_Script_InitHintsFunc) af_indic_hints_init, - (AF_Script_ApplyHintsFunc) af_indic_hints_apply - ) - -#else /* !AF_CONFIG_OPTION_INDIC */ - - static const AF_Script_UniRangeRec af_indic_uniranges[] = - { - { 0, 0 } - }; - - - AF_DEFINE_SCRIPT_CLASS(af_indic_script_class, - AF_SCRIPT_INDIC, - af_indic_uniranges, - - sizeof( AF_LatinMetricsRec ), - - (AF_Script_InitMetricsFunc) NULL, - (AF_Script_ScaleMetricsFunc)NULL, - (AF_Script_DoneMetricsFunc) NULL, - - (AF_Script_InitHintsFunc) NULL, - (AF_Script_ApplyHintsFunc) NULL - ) - -#endif /* !AF_CONFIG_OPTION_INDIC */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afindic.h b/android/jni/ndk_modules/freetype/src/autofit/afindic.h deleted file mode 100644 index 662a9822..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afindic.h +++ /dev/null @@ -1,40 +0,0 @@ -/***************************************************************************/ -/* */ -/* afindic.h */ -/* */ -/* Auto-fitter hinting routines for Indic scripts (specification). */ -/* */ -/* Copyright 2007 by */ -/* Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __AFINDIC_H__ -#define __AFINDIC_H__ - -#include "afhints.h" - - -FT_BEGIN_HEADER - - - /* the Indic-specific script class */ - - AF_DECLARE_SCRIPT_CLASS(af_indic_script_class) - - -/* */ - -FT_END_HEADER - -#endif /* __AFINDIC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/aflatin.c b/android/jni/ndk_modules/freetype/src/autofit/aflatin.c deleted file mode 100644 index 8c6c430b..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/aflatin.c +++ /dev/null @@ -1,2227 +0,0 @@ -/***************************************************************************/ -/* */ -/* aflatin.c */ -/* */ -/* Auto-fitter hinting routines for latin script (body). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_ADVANCES_H - -#include "aflatin.h" -#include "aferrors.h" - - -#ifdef AF_USE_WARPER -#include "afwarp.h" -#endif - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - af_latin_metrics_init_widths( AF_LatinMetrics metrics, - FT_Face face, - FT_ULong charcode ) - { - /* scan the array of segments in each direction */ - AF_GlyphHintsRec hints[1]; - - - af_glyph_hints_init( hints, face->memory ); - - metrics->axis[AF_DIMENSION_HORZ].width_count = 0; - metrics->axis[AF_DIMENSION_VERT].width_count = 0; - - { - FT_Error error; - FT_UInt glyph_index; - int dim; - AF_LatinMetricsRec dummy[1]; - AF_Scaler scaler = &dummy->root.scaler; - - - glyph_index = FT_Get_Char_Index( face, charcode ); - if ( glyph_index == 0 ) - goto Exit; - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || face->glyph->outline.n_points <= 0 ) - goto Exit; - - FT_ZERO( dummy ); - - dummy->units_per_em = metrics->units_per_em; - scaler->x_scale = scaler->y_scale = 0x10000L; - scaler->x_delta = scaler->y_delta = 0; - scaler->face = face; - scaler->render_mode = FT_RENDER_MODE_NORMAL; - scaler->flags = 0; - - af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy ); - - error = af_glyph_hints_reload( hints, &face->glyph->outline ); - if ( error ) - goto Exit; - - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = &metrics->axis[dim]; - AF_AxisHints axhints = &hints->axis[dim]; - AF_Segment seg, limit, link; - FT_UInt num_widths = 0; - - - error = af_latin_hints_compute_segments( hints, - (AF_Dimension)dim ); - if ( error ) - goto Exit; - - af_latin_hints_link_segments( hints, - (AF_Dimension)dim ); - - seg = axhints->segments; - limit = seg + axhints->num_segments; - - for ( ; seg < limit; seg++ ) - { - link = seg->link; - - /* we only consider stem segments there! */ - if ( link && link->link == seg && link > seg ) - { - FT_Pos dist; - - - dist = seg->pos - link->pos; - if ( dist < 0 ) - dist = -dist; - - if ( num_widths < AF_LATIN_MAX_WIDTHS ) - axis->widths[ num_widths++ ].org = dist; - } - } - - af_sort_widths( num_widths, axis->widths ); - axis->width_count = num_widths; - } - - Exit: - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = &metrics->axis[dim]; - FT_Pos stdw; - - - stdw = ( axis->width_count > 0 ) - ? axis->widths[0].org - : AF_LATIN_CONSTANT( metrics, 50 ); - - /* let's try 20% of the smallest width */ - axis->edge_distance_threshold = stdw / 5; - axis->standard_width = stdw; - axis->extra_light = 0; - } - } - - af_glyph_hints_done( hints ); - } - - - -#define AF_LATIN_MAX_TEST_CHARACTERS 12 - - - static const char af_latin_blue_chars[AF_LATIN_MAX_BLUES] - [AF_LATIN_MAX_TEST_CHARACTERS + 1] = - { - "THEZOCQS", - "HEZLOCUS", - "fijkdbh", - "xzroesc", - "xzroesc", - "pqgjy" - }; - - - static void - af_latin_metrics_init_blues( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Pos flats [AF_LATIN_MAX_TEST_CHARACTERS]; - FT_Pos rounds[AF_LATIN_MAX_TEST_CHARACTERS]; - FT_Int num_flats; - FT_Int num_rounds; - FT_Int bb; - AF_LatinBlue blue; - FT_Error error; - AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; - FT_GlyphSlot glyph = face->glyph; - - - /* we compute the blues simply by loading each character from the */ - /* 'af_latin_blue_chars[blues]' string, then compute its top-most or */ - /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ - - AF_LOG(( "blue zones computation\n" )); - AF_LOG(( "------------------------------------------------\n" )); - - for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) - { - const char* p = af_latin_blue_chars[bb]; - const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; - FT_Pos* blue_ref; - FT_Pos* blue_shoot; - - - AF_LOG(( "blue %3d: ", bb )); - - num_flats = 0; - num_rounds = 0; - - for ( ; p < limit && *p; p++ ) - { - FT_UInt glyph_index; - FT_Pos best_y; /* same as points.y */ - FT_Int best_point, best_first, best_last; - FT_Vector* points; - FT_Bool round = 0; - - - AF_LOG(( "'%c'", *p )); - - /* load the character in the face -- skip unknown or empty ones */ - glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p ); - if ( glyph_index == 0 ) - continue; - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || glyph->outline.n_points <= 0 ) - continue; - - /* now compute min or max point indices and coordinates */ - points = glyph->outline.points; - best_point = -1; - best_y = 0; /* make compiler happy */ - best_first = 0; /* ditto */ - best_last = 0; /* ditto */ - - { - FT_Int nn; - FT_Int first = 0; - FT_Int last = -1; - - - for ( nn = 0; nn < glyph->outline.n_contours; first = last+1, nn++ ) - { - FT_Int old_best_point = best_point; - FT_Int pp; - - - last = glyph->outline.contours[nn]; - - /* Avoid single-point contours since they are never rasterized. */ - /* In some fonts, they correspond to mark attachment points */ - /* which are way outside of the glyph's real outline. */ - if ( last <= first ) - continue; - - if ( AF_LATIN_IS_TOP_BLUE( bb ) ) - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y > best_y ) - { - best_point = pp; - best_y = points[pp].y; - } - } - else - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y < best_y ) - { - best_point = pp; - best_y = points[pp].y; - } - } - - if ( best_point != old_best_point ) - { - best_first = first; - best_last = last; - } - } - AF_LOG(( "%5d", best_y )); - } - - /* now check whether the point belongs to a straight or round */ - /* segment; we first need to find in which contour the extremum */ - /* lies, then inspect its previous and next points */ - if ( best_point >= 0 ) - { - FT_Int prev, next; - FT_Pos dist; - - - /* now look for the previous and next points that are not on the */ - /* same Y coordinate. Threshold the `closeness'... */ - prev = best_point; - next = prev; - - do - { - if ( prev > best_first ) - prev--; - else - prev = best_last; - - dist = points[prev].y - best_y; - if ( dist < -5 || dist > 5 ) - break; - - } while ( prev != best_point ); - - do - { - if ( next < best_last ) - next++; - else - next = best_first; - - dist = points[next].y - best_y; - if ( dist < -5 || dist > 5 ) - break; - - } while ( next != best_point ); - - /* now, set the `round' flag depending on the segment's kind */ - round = FT_BOOL( - FT_CURVE_TAG( glyph->outline.tags[prev] ) != FT_CURVE_TAG_ON || - FT_CURVE_TAG( glyph->outline.tags[next] ) != FT_CURVE_TAG_ON ); - - AF_LOG(( "%c ", round ? 'r' : 'f' )); - } - - if ( round ) - rounds[num_rounds++] = best_y; - else - flats[num_flats++] = best_y; - } - - AF_LOG(( "\n" )); - - if ( num_flats == 0 && num_rounds == 0 ) - { - /* - * we couldn't find a single glyph to compute this blue zone, - * we will simply ignore it then - */ - AF_LOG(( "empty\n" )); - continue; - } - - /* we have computed the contents of the `rounds' and `flats' tables, */ - /* now determine the reference and overshoot position of the blue -- */ - /* we simply take the median value after a simple sort */ - af_sort_pos( num_rounds, rounds ); - af_sort_pos( num_flats, flats ); - - blue = & axis->blues[axis->blue_count]; - blue_ref = & blue->ref.org; - blue_shoot = & blue->shoot.org; - - axis->blue_count++; - - if ( num_flats == 0 ) - { - *blue_ref = - *blue_shoot = rounds[num_rounds / 2]; - } - else if ( num_rounds == 0 ) - { - *blue_ref = - *blue_shoot = flats[num_flats / 2]; - } - else - { - *blue_ref = flats[num_flats / 2]; - *blue_shoot = rounds[num_rounds / 2]; - } - - /* there are sometimes problems: if the overshoot position of top */ - /* zones is under its reference position, or the opposite for bottom */ - /* zones. We must thus check everything there and correct the errors */ - if ( *blue_shoot != *blue_ref ) - { - FT_Pos ref = *blue_ref; - FT_Pos shoot = *blue_shoot; - FT_Bool over_ref = FT_BOOL( shoot > ref ); - - - if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref ) - *blue_shoot = *blue_ref = ( shoot + ref ) / 2; - } - - blue->flags = 0; - if ( AF_LATIN_IS_TOP_BLUE( bb ) ) - blue->flags |= AF_LATIN_BLUE_TOP; - - /* - * The following flag is used later to adjust the y and x scales - * in order to optimize the pixel grid alignment of the top of small - * letters. - */ - if ( bb == AF_LATIN_BLUE_SMALL_TOP ) - blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; - - AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot )); - } - - return; - } - - - FT_LOCAL_DEF( void ) - af_latin_metrics_check_digits( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_UInt i; - FT_Bool started = 0, same_width = 1; - FT_Fixed advance, old_advance = 0; - - - /* check whether all ASCII digits have the same advance width; */ - /* digit `0' is 0x30 in all supported charmaps */ - for ( i = 0x30; i <= 0x39; i++ ) - { - FT_UInt glyph_index; - - - glyph_index = FT_Get_Char_Index( face, i ); - if ( glyph_index == 0 ) - continue; - - if ( FT_Get_Advance( face, glyph_index, - FT_LOAD_NO_SCALE | - FT_LOAD_NO_HINTING | - FT_LOAD_IGNORE_TRANSFORM, - &advance ) ) - continue; - - if ( started ) - { - if ( advance != old_advance ) - { - same_width = 0; - break; - } - } - else - { - old_advance = advance; - started = 1; - } - } - - metrics->root.digits_have_same_width = same_width; - } - - - FT_LOCAL_DEF( FT_Error ) - af_latin_metrics_init( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Error error = AF_Err_Ok; - FT_CharMap oldmap = face->charmap; - FT_UInt ee; - - static const FT_Encoding latin_encodings[] = - { - FT_ENCODING_UNICODE, - FT_ENCODING_APPLE_ROMAN, - FT_ENCODING_ADOBE_STANDARD, - FT_ENCODING_ADOBE_LATIN_1, - FT_ENCODING_NONE /* end of list */ - }; - - - metrics->units_per_em = face->units_per_EM; - - /* do we have a latin charmap in there? */ - for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ ) - { - error = FT_Select_Charmap( face, latin_encodings[ee] ); - if ( !error ) - break; - } - - if ( !error ) - { - /* For now, compute the standard width and height from the `o'. */ - af_latin_metrics_init_widths( metrics, face, 'o' ); - af_latin_metrics_init_blues( metrics, face ); - af_latin_metrics_check_digits( metrics, face ); - } - - FT_Set_Charmap( face, oldmap ); - return AF_Err_Ok; - } - - - static void - af_latin_metrics_scale_dim( AF_LatinMetrics metrics, - AF_Scaler scaler, - AF_Dimension dim ) - { - FT_Fixed scale; - FT_Pos delta; - AF_LatinAxis axis; - FT_UInt nn; - - - if ( dim == AF_DIMENSION_HORZ ) - { - scale = scaler->x_scale; - delta = scaler->x_delta; - } - else - { - scale = scaler->y_scale; - delta = scaler->y_delta; - } - - axis = &metrics->axis[dim]; - - if ( axis->org_scale == scale && axis->org_delta == delta ) - return; - - axis->org_scale = scale; - axis->org_delta = delta; - - /* - * correct X and Y scale to optimize the alignment of the top of small - * letters to the pixel grid - */ - { - AF_LatinAxis Axis = &metrics->axis[AF_DIMENSION_VERT]; - AF_LatinBlue blue = NULL; - - - for ( nn = 0; nn < Axis->blue_count; nn++ ) - { - if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) - { - blue = &Axis->blues[nn]; - break; - } - } - - if ( blue ) - { - FT_Pos scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); - FT_Pos fitted = ( scaled + 40 ) & ~63; - - - if ( scaled != fitted ) - { -#if 0 - if ( dim == AF_DIMENSION_HORZ ) - { - if ( fitted < scaled ) - scale -= scale / 50; /* scale *= 0.98 */ - } - else -#endif - if ( dim == AF_DIMENSION_VERT ) - { - scale = FT_MulDiv( scale, fitted, scaled ); - } - } - } - } - - axis->scale = scale; - axis->delta = delta; - - if ( dim == AF_DIMENSION_HORZ ) - { - metrics->root.scaler.x_scale = scale; - metrics->root.scaler.x_delta = delta; - } - else - { - metrics->root.scaler.y_scale = scale; - metrics->root.scaler.y_delta = delta; - } - - /* scale the standard widths */ - for ( nn = 0; nn < axis->width_count; nn++ ) - { - AF_Width width = axis->widths + nn; - - - width->cur = FT_MulFix( width->org, scale ); - width->fit = width->cur; - } - - /* an extra-light axis corresponds to a standard width that is */ - /* smaller than 0.75 pixels */ - axis->extra_light = - (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); - - if ( dim == AF_DIMENSION_VERT ) - { - /* scale the blue zones */ - for ( nn = 0; nn < axis->blue_count; nn++ ) - { - AF_LatinBlue blue = &axis->blues[nn]; - FT_Pos dist; - - - blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; - blue->ref.fit = blue->ref.cur; - blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; - blue->shoot.fit = blue->shoot.cur; - blue->flags &= ~AF_LATIN_BLUE_ACTIVE; - - /* a blue zone is only active if it is less than 3/4 pixels tall */ - dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); - if ( dist <= 48 && dist >= -48 ) - { - FT_Pos delta1, delta2; - - - delta1 = blue->shoot.org - blue->ref.org; - delta2 = delta1; - if ( delta1 < 0 ) - delta2 = -delta2; - - delta2 = FT_MulFix( delta2, scale ); - - if ( delta2 < 32 ) - delta2 = 0; - else if ( delta2 < 64 ) - delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); - else - delta2 = FT_PIX_ROUND( delta2 ); - - if ( delta1 < 0 ) - delta2 = -delta2; - - blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); - blue->shoot.fit = blue->ref.fit + delta2; - - blue->flags |= AF_LATIN_BLUE_ACTIVE; - } - } - } - } - - - FT_LOCAL_DEF( void ) - af_latin_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ) - { - metrics->root.scaler.render_mode = scaler->render_mode; - metrics->root.scaler.face = scaler->face; - - af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); - af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H A N A L Y S I S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( FT_Error ) - af_latin_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Memory memory = hints->memory; - FT_Error error = AF_Err_Ok; - AF_Segment segment = NULL; - AF_SegmentRec seg0; - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - AF_Direction major_dir, segment_dir; - - - FT_ZERO( &seg0 ); - seg0.score = 32000; - seg0.flags = AF_EDGE_NORMAL; - - major_dir = (AF_Direction)FT_ABS( axis->major_dir ); - segment_dir = major_dir; - - axis->num_segments = 0; - - /* set up (u,v) in each point */ - if ( dim == AF_DIMENSION_HORZ ) - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - - for ( ; point < limit; point++ ) - { - point->u = point->fx; - point->v = point->fy; - } - } - else - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - - for ( ; point < limit; point++ ) - { - point->u = point->fy; - point->v = point->fx; - } - } - - /* do each contour separately */ - for ( ; contour < contour_limit; contour++ ) - { - AF_Point point = contour[0]; - AF_Point last = point->prev; - int on_edge = 0; - FT_Pos min_pos = 32000; /* minimum segment pos != min_coord */ - FT_Pos max_pos = -32000; /* maximum segment pos != max_coord */ - FT_Bool passed; - - - if ( point == last ) /* skip singletons -- just in case */ - continue; - - if ( FT_ABS( last->out_dir ) == major_dir && - FT_ABS( point->out_dir ) == major_dir ) - { - /* we are already on an edge, try to locate its start */ - last = point; - - for (;;) - { - point = point->prev; - if ( FT_ABS( point->out_dir ) != major_dir ) - { - point = point->next; - break; - } - if ( point == last ) - break; - } - } - - last = point; - passed = 0; - - for (;;) - { - FT_Pos u, v; - - - if ( on_edge ) - { - u = point->u; - if ( u < min_pos ) - min_pos = u; - if ( u > max_pos ) - max_pos = u; - - if ( point->out_dir != segment_dir || point == last ) - { - /* we are just leaving an edge; record a new segment! */ - segment->last = point; - segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); - - /* a segment is round if either its first or last point */ - /* is a control point */ - if ( ( segment->first->flags | point->flags ) & - AF_FLAG_CONTROL ) - segment->flags |= AF_EDGE_ROUND; - - /* compute segment size */ - min_pos = max_pos = point->v; - - v = segment->first->v; - if ( v < min_pos ) - min_pos = v; - if ( v > max_pos ) - max_pos = v; - - segment->min_coord = (FT_Short)min_pos; - segment->max_coord = (FT_Short)max_pos; - segment->height = (FT_Short)( segment->max_coord - - segment->min_coord ); - - on_edge = 0; - segment = NULL; - /* fallthrough */ - } - } - - /* now exit if we are at the start/end point */ - if ( point == last ) - { - if ( passed ) - break; - passed = 1; - } - - if ( !on_edge && FT_ABS( point->out_dir ) == major_dir ) - { - /* this is the start of a new segment! */ - segment_dir = (AF_Direction)point->out_dir; - - /* clear all segment fields */ - error = af_axis_hints_new_segment( axis, memory, &segment ); - if ( error ) - goto Exit; - - segment[0] = seg0; - segment->dir = (FT_Char)segment_dir; - min_pos = max_pos = point->u; - segment->first = point; - segment->last = point; - segment->contour = contour; - on_edge = 1; - } - - point = point->next; - } - - } /* contours */ - - - /* now slightly increase the height of segments when this makes */ - /* sense -- this is used to better detect and ignore serifs */ - { - AF_Segment segments = axis->segments; - AF_Segment segments_end = segments + axis->num_segments; - - - for ( segment = segments; segment < segments_end; segment++ ) - { - AF_Point first = segment->first; - AF_Point last = segment->last; - FT_Pos first_v = first->v; - FT_Pos last_v = last->v; - - - if ( first == last ) - continue; - - if ( first_v < last_v ) - { - AF_Point p; - - - p = first->prev; - if ( p->v < first_v ) - segment->height = (FT_Short)( segment->height + - ( ( first_v - p->v ) >> 1 ) ); - - p = last->next; - if ( p->v > last_v ) - segment->height = (FT_Short)( segment->height + - ( ( p->v - last_v ) >> 1 ) ); - } - else - { - AF_Point p; - - - p = first->prev; - if ( p->v > first_v ) - segment->height = (FT_Short)( segment->height + - ( ( p->v - first_v ) >> 1 ) ); - - p = last->next; - if ( p->v < last_v ) - segment->height = (FT_Short)( segment->height + - ( ( last_v - p->v ) >> 1 ) ); - } - } - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - af_latin_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - FT_Pos len_threshold, len_score; - AF_Segment seg1, seg2; - - - len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); - if ( len_threshold == 0 ) - len_threshold = 1; - - len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); - - /* now compare each segment to the others */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - /* the fake segments are introduced to hint the metrics -- */ - /* we must never link them to anything */ - if ( seg1->dir != axis->major_dir || seg1->first == seg1->last ) - continue; - - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos ) - { - FT_Pos pos1 = seg1->pos; - FT_Pos pos2 = seg2->pos; - FT_Pos dist = pos2 - pos1; - - - if ( dist < 0 ) - dist = -dist; - - { - FT_Pos min = seg1->min_coord; - FT_Pos max = seg1->max_coord; - FT_Pos len, score; - - - if ( min < seg2->min_coord ) - min = seg2->min_coord; - - if ( max > seg2->max_coord ) - max = seg2->max_coord; - - len = max - min; - if ( len >= len_threshold ) - { - score = dist + len_score / len; - - if ( score < seg1->score ) - { - seg1->score = score; - seg1->link = seg2; - } - - if ( score < seg2->score ) - { - seg2->score = score; - seg2->link = seg1; - } - } - } - } - } - - /* now, compute the `serif' segments */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - seg2 = seg1->link; - - if ( seg2 ) - { - if ( seg2->link != seg1 ) - { - seg1->link = 0; - seg1->serif = seg2->link; - } - } - } - } - - - FT_LOCAL_DEF( FT_Error ) - af_latin_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Error error = AF_Err_Ok; - FT_Memory memory = hints->memory; - AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; - - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - - AF_Direction up_dir; - FT_Fixed scale; - FT_Pos edge_distance_threshold; - FT_Pos segment_length_threshold; - - - axis->num_edges = 0; - - scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - - up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP - : AF_DIR_RIGHT; - - /* - * We ignore all segments that are less than 1 pixels in length, - * to avoid many problems with serif fonts. We compute the - * corresponding threshold in font units. - */ - if ( dim == AF_DIMENSION_HORZ ) - segment_length_threshold = FT_DivFix( 64, hints->y_scale ); - else - segment_length_threshold = 0; - - /*********************************************************************/ - /* */ - /* We will begin by generating a sorted table of edges for the */ - /* current direction. To do so, we simply scan each segment and try */ - /* to find an edge in our table that corresponds to its position. */ - /* */ - /* If no edge is found, we create and insert a new edge in the */ - /* sorted table. Otherwise, we simply add the segment to the edge's */ - /* list which will be processed in the second step to compute the */ - /* edge's properties. */ - /* */ - /* Note that the edges table is sorted along the segment/edge */ - /* position. */ - /* */ - /*********************************************************************/ - - edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, - scale ); - if ( edge_distance_threshold > 64 / 4 ) - edge_distance_threshold = 64 / 4; - - edge_distance_threshold = FT_DivFix( edge_distance_threshold, - scale ); - - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge found = 0; - FT_Int ee; - - - if ( seg->height < segment_length_threshold ) - continue; - - /* A special case for serif edges: If they are smaller than */ - /* 1.5 pixels we ignore them. */ - if ( seg->serif && - 2 * seg->height < 3 * segment_length_threshold ) - continue; - - /* look for an edge corresponding to the segment */ - for ( ee = 0; ee < axis->num_edges; ee++ ) - { - AF_Edge edge = axis->edges + ee; - FT_Pos dist; - - - dist = seg->pos - edge->fpos; - if ( dist < 0 ) - dist = -dist; - - if ( dist < edge_distance_threshold && edge->dir == seg->dir ) - { - found = edge; - break; - } - } - - if ( !found ) - { - AF_Edge edge; - - - /* insert a new edge in the list and */ - /* sort according to the position */ - error = af_axis_hints_new_edge( axis, seg->pos, - (AF_Direction)seg->dir, - memory, &edge ); - if ( error ) - goto Exit; - - /* add the segment to the new edge's list */ - FT_ZERO( edge ); - - edge->first = seg; - edge->last = seg; - edge->fpos = seg->pos; - edge->dir = seg->dir; - edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); - seg->edge_next = seg; - } - else - { - /* if an edge was found, simply add the segment to the edge's */ - /* list */ - seg->edge_next = found->first; - found->last->edge_next = seg; - found->last = seg; - } - } - - - /*********************************************************************/ - /* */ - /* Good, we will now compute each edge's properties according to */ - /* segments found on its position. Basically, these are: */ - /* */ - /* - edge's main direction */ - /* - stem edge, serif edge or both (which defaults to stem then) */ - /* - rounded edge, straight or both (which defaults to straight) */ - /* - link for edge */ - /* */ - /*********************************************************************/ - - /* first of all, set the `edge' field in each segment -- this is */ - /* required in order to compute edge links */ - - /* - * Note that removing this loop and setting the `edge' field of each - * segment directly in the code above slows down execution speed for - * some reasons on platforms like the Sun. - */ - { - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - - - for ( edge = edges; edge < edge_limit; edge++ ) - { - seg = edge->first; - if ( seg ) - do - { - seg->edge = edge; - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - - /* now, compute each edge properties */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Int is_round = 0; /* does it contain round segments? */ - FT_Int is_straight = 0; /* does it contain straight segments? */ - FT_Pos ups = 0; /* number of upwards segments */ - FT_Pos downs = 0; /* number of downwards segments */ - - - seg = edge->first; - - do - { - FT_Bool is_serif; - - - /* check for roundness of segment */ - if ( seg->flags & AF_EDGE_ROUND ) - is_round++; - else - is_straight++; - - /* check for segment direction */ - if ( seg->dir == up_dir ) - ups += seg->max_coord-seg->min_coord; - else - downs += seg->max_coord-seg->min_coord; - - /* check for links -- if seg->serif is set, then seg->link must */ - /* be ignored */ - is_serif = (FT_Bool)( seg->serif && - seg->serif->edge && - seg->serif->edge != edge ); - - if ( ( seg->link && seg->link->edge != NULL ) || is_serif ) - { - AF_Edge edge2; - AF_Segment seg2; - - - edge2 = edge->link; - seg2 = seg->link; - - if ( is_serif ) - { - seg2 = seg->serif; - edge2 = edge->serif; - } - - if ( edge2 ) - { - FT_Pos edge_delta; - FT_Pos seg_delta; - - - edge_delta = edge->fpos - edge2->fpos; - if ( edge_delta < 0 ) - edge_delta = -edge_delta; - - seg_delta = seg->pos - seg2->pos; - if ( seg_delta < 0 ) - seg_delta = -seg_delta; - - if ( seg_delta < edge_delta ) - edge2 = seg2->edge; - } - else - edge2 = seg2->edge; - - if ( is_serif ) - { - edge->serif = edge2; - edge2->flags |= AF_EDGE_SERIF; - } - else - edge->link = edge2; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - - /* set the round/straight flags */ - edge->flags = AF_EDGE_NORMAL; - - if ( is_round > 0 && is_round >= is_straight ) - edge->flags |= AF_EDGE_ROUND; - -#if 0 - /* set the edge's main direction */ - edge->dir = AF_DIR_NONE; - - if ( ups > downs ) - edge->dir = (FT_Char)up_dir; - - else if ( ups < downs ) - edge->dir = (FT_Char)-up_dir; - - else if ( ups == downs ) - edge->dir = 0; /* both up and down! */ -#endif - - /* gets rid of serifs if link is set */ - /* XXX: This gets rid of many unpleasant artefacts! */ - /* Example: the `c' in cour.pfa at size 13 */ - - if ( edge->serif && edge->link ) - edge->serif = 0; - } - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - af_latin_hints_detect_features( AF_GlyphHints hints, - AF_Dimension dim ) - { - FT_Error error; - - - error = af_latin_hints_compute_segments( hints, dim ); - if ( !error ) - { - af_latin_hints_link_segments( hints, dim ); - - error = af_latin_hints_compute_edges( hints, dim ); - } - return error; - } - - - FT_LOCAL_DEF( void ) - af_latin_hints_compute_blue_edges( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - AF_AxisHints axis = &hints->axis[ AF_DIMENSION_VERT ]; - AF_Edge edge = axis->edges; - AF_Edge edge_limit = edge + axis->num_edges; - AF_LatinAxis latin = &metrics->axis[ AF_DIMENSION_VERT ]; - FT_Fixed scale = latin->scale; - - - /* compute which blue zones are active, i.e. have their scaled */ - /* size < 3/4 pixels */ - - /* for each horizontal edge search the blue zone which is closest */ - for ( ; edge < edge_limit; edge++ ) - { - FT_Int bb; - AF_Width best_blue = NULL; - FT_Pos best_dist; /* initial threshold */ - - - /* compute the initial threshold as a fraction of the EM size */ - best_dist = FT_MulFix( metrics->units_per_em / 40, scale ); - - if ( best_dist > 64 / 2 ) - best_dist = 64 / 2; - - for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) - { - AF_LatinBlue blue = latin->blues + bb; - FT_Bool is_top_blue, is_major_dir; - - - /* skip inactive blue zones (i.e., those that are too small) */ - if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) - continue; - - /* if it is a top zone, check for right edges -- if it is a bottom */ - /* zone, check for left edges */ - /* */ - /* of course, that's for TrueType */ - is_top_blue = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 ); - is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); - - /* if it is a top zone, the edge must be against the major */ - /* direction; if it is a bottom zone, it must be in the major */ - /* direction */ - if ( is_top_blue ^ is_major_dir ) - { - FT_Pos dist; - - - /* first of all, compare it to the reference position */ - dist = edge->fpos - blue->ref.org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = & blue->ref; - } - - /* now, compare it to the overshoot position if the edge is */ - /* rounded, and if the edge is over the reference position of a */ - /* top zone, or under the reference position of a bottom zone */ - if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) - { - FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); - - - if ( is_top_blue ^ is_under_ref ) - { - blue = latin->blues + bb; - dist = edge->fpos - blue->shoot.org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = & blue->shoot; - } - } - } - } - } - - if ( best_blue ) - edge->blue_edge = best_blue; - } - } - - - static FT_Error - af_latin_hints_init( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - FT_Render_Mode mode; - FT_UInt32 scaler_flags, other_flags; - FT_Face face = metrics->root.scaler.face; - - - af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics ); - - /* - * correct x_scale and y_scale if needed, since they may have - * been modified `af_latin_metrics_scale_dim' above - */ - hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; - hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; - hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; - hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; - - /* compute flags depending on render mode, etc. */ - mode = metrics->root.scaler.render_mode; - -#if 0 /* #ifdef AF_USE_WARPER */ - if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) - { - metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; - } -#endif - - scaler_flags = hints->scaler_flags; - other_flags = 0; - - /* - * We snap the width of vertical stems for the monochrome and - * horizontal LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) - other_flags |= AF_LATIN_HINTS_HORZ_SNAP; - - /* - * We snap the width of horizontal stems for the monochrome and - * vertical LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) - other_flags |= AF_LATIN_HINTS_VERT_SNAP; - - /* - * We adjust stems to full pixels only if we don't use the `light' mode. - */ - if ( mode != FT_RENDER_MODE_LIGHT ) - other_flags |= AF_LATIN_HINTS_STEM_ADJUST; - - if ( mode == FT_RENDER_MODE_MONO ) - other_flags |= AF_LATIN_HINTS_MONO; - - /* - * In `light' hinting mode we disable horizontal hinting completely. - * We also do it if the face is italic. - */ - if ( mode == FT_RENDER_MODE_LIGHT || - (face->style_flags & FT_STYLE_FLAG_ITALIC) != 0 ) - scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; - - hints->scaler_flags = scaler_flags; - hints->other_flags = other_flags; - - return 0; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* snap a given width in scaled coordinates to one of the */ - /* current standard widths */ - - static FT_Pos - af_latin_snap_width( AF_Width widths, - FT_Int count, - FT_Pos width ) - { - int n; - FT_Pos best = 64 + 32 + 2; - FT_Pos reference = width; - FT_Pos scaled; - - - for ( n = 0; n < count; n++ ) - { - FT_Pos w; - FT_Pos dist; - - - w = widths[n].cur; - dist = width - w; - if ( dist < 0 ) - dist = -dist; - if ( dist < best ) - { - best = dist; - reference = w; - } - } - - scaled = FT_PIX_ROUND( reference ); - - if ( width >= reference ) - { - if ( width < scaled + 48 ) - width = reference; - } - else - { - if ( width > scaled - 48 ) - width = reference; - } - - return width; - } - - - /* compute the snapped width of a given stem */ - - static FT_Pos - af_latin_compute_stem_width( AF_GlyphHints hints, - AF_Dimension dim, - FT_Pos width, - AF_Edge_Flags base_flags, - AF_Edge_Flags stem_flags ) - { - AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; - AF_LatinAxis axis = & metrics->axis[dim]; - FT_Pos dist = width; - FT_Int sign = 0; - FT_Int vertical = ( dim == AF_DIMENSION_VERT ); - - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || - axis->extra_light ) - return width; - - if ( dist < 0 ) - { - dist = -width; - sign = 1; - } - - if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || - ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) - { - /* smooth hinting process: very lightly quantize the stem width */ - - /* leave the widths of serifs alone */ - - if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) - goto Done_Width; - - else if ( ( base_flags & AF_EDGE_ROUND ) ) - { - if ( dist < 80 ) - dist = 64; - } - else if ( dist < 56 ) - dist = 56; - - if ( axis->width_count > 0 ) - { - FT_Pos delta; - - - /* compare to standard width */ - if ( axis->width_count > 0 ) - { - delta = dist - axis->widths[0].cur; - - if ( delta < 0 ) - delta = -delta; - - if ( delta < 40 ) - { - dist = axis->widths[0].cur; - if ( dist < 48 ) - dist = 48; - - goto Done_Width; - } - } - - if ( dist < 3 * 64 ) - { - delta = dist & 63; - dist &= -64; - - if ( delta < 10 ) - dist += delta; - - else if ( delta < 32 ) - dist += 10; - - else if ( delta < 54 ) - dist += 54; - - else - dist += delta; - } - else - dist = ( dist + 32 ) & ~63; - } - } - else - { - /* strong hinting process: snap the stem width to integer pixels */ - FT_Pos org_dist = dist; - - - dist = af_latin_snap_width( axis->widths, axis->width_count, dist ); - - if ( vertical ) - { - /* in the case of vertical hinting, always round */ - /* the stem heights to integer pixels */ - - if ( dist >= 64 ) - dist = ( dist + 16 ) & ~63; - else - dist = 64; - } - else - { - if ( AF_LATIN_HINTS_DO_MONO( hints ) ) - { - /* monochrome horizontal hinting: snap widths to integer pixels */ - /* with a different threshold */ - - if ( dist < 64 ) - dist = 64; - else - dist = ( dist + 32 ) & ~63; - } - else - { - /* for horizontal anti-aliased hinting, we adopt a more subtle */ - /* approach: we strengthen small stems, round stems whose size */ - /* is between 1 and 2 pixels to an integer, otherwise nothing */ - - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - - else if ( dist < 128 ) - { - /* We only round to an integer width if the corresponding */ - /* distortion is less than 1/4 pixel. Otherwise this */ - /* makes everything worse since the diagonals, which are */ - /* not hinted, appear a lot bolder or thinner than the */ - /* vertical stems. */ - - FT_Pos delta; - - - dist = ( dist + 22 ) & ~63; - delta = dist - org_dist; - if ( delta < 0 ) - delta = -delta; - - if (delta >= 16) - { - dist = org_dist; - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - } - } - else - /* round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & ~63; - } - } - } - - Done_Width: - if ( sign ) - dist = -dist; - - return dist; - } - - - /* align one stem edge relative to the previous stem edge */ - - static void - af_latin_align_linked_edge( AF_GlyphHints hints, - AF_Dimension dim, - AF_Edge base_edge, - AF_Edge stem_edge ) - { - FT_Pos dist = stem_edge->opos - base_edge->opos; - - FT_Pos fitted_width = af_latin_compute_stem_width( - hints, dim, dist, - (AF_Edge_Flags)base_edge->flags, - (AF_Edge_Flags)stem_edge->flags ); - - - stem_edge->pos = base_edge->pos + fitted_width; - - AF_LOG(( "LINK: edge %d (opos=%.2f) linked to (%.2f), " - "dist was %.2f, now %.2f\n", - stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0, - stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); - } - - - static void - af_latin_align_serif_edge( AF_GlyphHints hints, - AF_Edge base, - AF_Edge serif ) - { - FT_UNUSED( hints ); - - serif->pos = base->pos + (serif->opos - base->opos); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** E D G E H I N T I N G ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_LOCAL_DEF( void ) - af_latin_hint_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - FT_PtrDist n_edges; - AF_Edge edge; - AF_Edge anchor = 0; - FT_Int has_serifs = 0; - - - /* we begin by aligning all stems relative to the blue zone */ - /* if needed -- that's only for horizontal edges */ - - if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) - { - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Width blue; - AF_Edge edge1, edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - blue = edge->blue_edge; - edge1 = NULL; - edge2 = edge->link; - - if ( blue ) - { - edge1 = edge; - } - else if ( edge2 && edge2->blue_edge ) - { - blue = edge2->blue_edge; - edge1 = edge2; - edge2 = edge; - } - - if ( !edge1 ) - continue; - - AF_LOG(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), " - "was (%.2f)\n", - edge1-edges, edge1->opos / 64.0, blue->fit / 64.0, - edge1->pos / 64.0 )); - - edge1->pos = blue->fit; - edge1->flags |= AF_EDGE_DONE; - - if ( edge2 && !edge2->blue_edge ) - { - af_latin_align_linked_edge( hints, dim, edge1, edge2 ); - edge2->flags |= AF_EDGE_DONE; - } - - if ( !anchor ) - anchor = edge; - } - } - - /* now we will align all stem edges, trying to maintain the */ - /* relative order of stems in the glyph */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - /* skip all non-stem edges */ - edge2 = edge->link; - if ( !edge2 ) - { - has_serifs++; - continue; - } - - /* now align the stem */ - - /* this should not happen, but it's better to be safe */ - if ( edge2->blue_edge ) - { - AF_LOG(( "ASSERTION FAILED for edge %d\n", edge2-edges )); - - af_latin_align_linked_edge( hints, dim, edge2, edge ); - edge->flags |= AF_EDGE_DONE; - continue; - } - - if ( !anchor ) - { - FT_Pos org_len, org_center, cur_len; - FT_Pos cur_pos1, error1, error2, u_off, d_off; - - - org_len = edge2->opos - edge->opos; - cur_len = af_latin_compute_stem_width( - hints, dim, org_len, - (AF_Edge_Flags)edge->flags, - (AF_Edge_Flags)edge2->flags ); - if ( cur_len <= 64 ) - u_off = d_off = 32; - else - { - u_off = 38; - d_off = 26; - } - - if ( cur_len < 96 ) - { - org_center = edge->opos + ( org_len >> 1 ); - - cur_pos1 = FT_PIX_ROUND( org_center ); - - error1 = org_center - ( cur_pos1 - u_off ); - if ( error1 < 0 ) - error1 = -error1; - - error2 = org_center - ( cur_pos1 + d_off ); - if ( error2 < 0 ) - error2 = -error2; - - if ( error1 < error2 ) - cur_pos1 -= u_off; - else - cur_pos1 += d_off; - - edge->pos = cur_pos1 - cur_len / 2; - edge2->pos = edge->pos + cur_len; - } - else - edge->pos = FT_PIX_ROUND( edge->opos ); - - AF_LOG(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f) " - "snapped to (%.2f) (%.2f)\n", - edge-edges, edge->opos / 64.0, - edge2-edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0 )); - anchor = edge; - - edge->flags |= AF_EDGE_DONE; - - af_latin_align_linked_edge( hints, dim, edge, edge2 ); - } - else - { - FT_Pos org_pos, org_len, org_center, cur_len; - FT_Pos cur_pos1, cur_pos2, delta1, delta2; - - - org_pos = anchor->pos + ( edge->opos - anchor->opos ); - org_len = edge2->opos - edge->opos; - org_center = org_pos + ( org_len >> 1 ); - - cur_len = af_latin_compute_stem_width( - hints, dim, org_len, - (AF_Edge_Flags)edge->flags, - (AF_Edge_Flags)edge2->flags ); - - if ( edge2->flags & AF_EDGE_DONE ) - edge->pos = edge2->pos - cur_len; - - else if ( cur_len < 96 ) - { - FT_Pos u_off, d_off; - - - cur_pos1 = FT_PIX_ROUND( org_center ); - - if (cur_len <= 64 ) - u_off = d_off = 32; - else - { - u_off = 38; - d_off = 26; - } - - delta1 = org_center - ( cur_pos1 - u_off ); - if ( delta1 < 0 ) - delta1 = -delta1; - - delta2 = org_center - ( cur_pos1 + d_off ); - if ( delta2 < 0 ) - delta2 = -delta2; - - if ( delta1 < delta2 ) - cur_pos1 -= u_off; - else - cur_pos1 += d_off; - - edge->pos = cur_pos1 - cur_len / 2; - edge2->pos = cur_pos1 + cur_len / 2; - - AF_LOG(( "STEM: %d (opos=%.2f) to %d (opos=%.2f) " - "snapped to (%.2f) and (%.2f)\n", - edge-edges, edge->opos / 64.0, - edge2-edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0 )); - } - else - { - org_pos = anchor->pos + ( edge->opos - anchor->opos ); - org_len = edge2->opos - edge->opos; - org_center = org_pos + ( org_len >> 1 ); - - cur_len = af_latin_compute_stem_width( - hints, dim, org_len, - (AF_Edge_Flags)edge->flags, - (AF_Edge_Flags)edge2->flags ); - - cur_pos1 = FT_PIX_ROUND( org_pos ); - delta1 = cur_pos1 + ( cur_len >> 1 ) - org_center; - if ( delta1 < 0 ) - delta1 = -delta1; - - cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; - delta2 = cur_pos2 + ( cur_len >> 1 ) - org_center; - if ( delta2 < 0 ) - delta2 = -delta2; - - edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; - edge2->pos = edge->pos + cur_len; - - AF_LOG(( "STEM: %d (opos=%.2f) to %d (opos=%.2f) " - "snapped to (%.2f) and (%.2f)\n", - edge-edges, edge->opos / 64.0, - edge2-edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0 )); - } - - edge->flags |= AF_EDGE_DONE; - edge2->flags |= AF_EDGE_DONE; - - if ( edge > edges && edge->pos < edge[-1].pos ) - { - AF_LOG(( "BOUND: %d (pos=%.2f) to (%.2f)\n", - edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); - edge->pos = edge[-1].pos; - } - } - } - - /* make sure that lowercase m's maintain their symmetry */ - - /* In general, lowercase m's have six vertical edges if they are sans */ - /* serif, or twelve if they are with serifs. This implementation is */ - /* based on that assumption, and seems to work very well with most */ - /* faces. However, if for a certain face this assumption is not */ - /* true, the m is just rendered like before. In addition, any stem */ - /* correction will only be applied to symmetrical glyphs (even if the */ - /* glyph is not an m), so the potential for unwanted distortion is */ - /* relatively low. */ - - /* We don't handle horizontal edges since we can't easily assure that */ - /* the third (lowest) stem aligns with the base line; it might end up */ - /* one pixel higher or lower. */ - - n_edges = edge_limit - edges; - if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) - { - AF_Edge edge1, edge2, edge3; - FT_Pos dist1, dist2, span, delta; - - - if ( n_edges == 6 ) - { - edge1 = edges; - edge2 = edges + 2; - edge3 = edges + 4; - } - else - { - edge1 = edges + 1; - edge2 = edges + 5; - edge3 = edges + 9; - } - - dist1 = edge2->opos - edge1->opos; - dist2 = edge3->opos - edge2->opos; - - span = dist1 - dist2; - if ( span < 0 ) - span = -span; - - if ( span < 8 ) - { - delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); - edge3->pos -= delta; - if ( edge3->link ) - edge3->link->pos -= delta; - - /* move the serifs along with the stem */ - if ( n_edges == 12 ) - { - ( edges + 8 )->pos -= delta; - ( edges + 11 )->pos -= delta; - } - - edge3->flags |= AF_EDGE_DONE; - if ( edge3->link ) - edge3->link->flags |= AF_EDGE_DONE; - } - } - - if ( has_serifs || !anchor ) - { - /* - * now hint the remaining edges (serifs and single) in order - * to complete our processing - */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Pos delta; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - delta = 1000; - - if ( edge->serif ) - { - delta = edge->serif->opos - edge->opos; - if ( delta < 0 ) - delta = -delta; - } - - if ( delta < 64 + 16 ) - { - af_latin_align_serif_edge( hints, edge->serif, edge ); - AF_LOG(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f) " - "aligned to (%.2f)\n", - edge-edges, edge->opos / 64.0, - edge->serif - edges, edge->serif->opos / 64.0, - edge->pos / 64.0 )); - } - else if ( !anchor ) - { - AF_LOG(( "SERIF_ANCHOR: edge %d (opos=%.2f) snapped to (%.2f)\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); - edge->pos = FT_PIX_ROUND( edge->opos ); - anchor = edge; - } - else - { - AF_Edge before, after; - - - for ( before = edge - 1; before >= edges; before-- ) - if ( before->flags & AF_EDGE_DONE ) - break; - - for ( after = edge + 1; after < edge_limit; after++ ) - if ( after->flags & AF_EDGE_DONE ) - break; - - if ( before >= edges && before < edge && - after < edge_limit && after > edge ) - { - if ( after->opos == before->opos ) - edge->pos = before->pos; - else - edge->pos = before->pos + - FT_MulDiv( edge->opos - before->opos, - after->pos - before->pos, - after->opos - before->opos ); - AF_LOG(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f) " - "from %d (opos=%.2f)\n", - edge-edges, edge->opos / 64.0, - edge->pos / 64.0, before - edges, - before->opos / 64.0 )); - } - else - { - edge->pos = anchor->pos + - ( ( edge->opos - anchor->opos + 16 ) & ~31 ); - AF_LOG(( "SERIF_LINK2: edge %d (opos=%.2f) snapped to (%.2f)\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); - } - } - - edge->flags |= AF_EDGE_DONE; - - if ( edge > edges && edge->pos < edge[-1].pos ) - edge->pos = edge[-1].pos; - - if ( edge + 1 < edge_limit && - edge[1].flags & AF_EDGE_DONE && - edge->pos > edge[1].pos ) - edge->pos = edge[1].pos; - } - } - } - - - static FT_Error - af_latin_hints_apply( AF_GlyphHints hints, - FT_Outline* outline, - AF_LatinMetrics metrics ) - { - FT_Error error; - int dim; - - - error = af_glyph_hints_reload( hints, outline ); - if ( error ) - goto Exit; - - /* analyze glyph outline */ -#ifdef AF_USE_WARPER - if ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT || - AF_HINTS_DO_HORIZONTAL( hints ) ) -#else - if ( AF_HINTS_DO_HORIZONTAL( hints ) ) -#endif - { - error = af_latin_hints_detect_features( hints, AF_DIMENSION_HORZ ); - if ( error ) - goto Exit; - } - - if ( AF_HINTS_DO_VERTICAL( hints ) ) - { - error = af_latin_hints_detect_features( hints, AF_DIMENSION_VERT ); - if ( error ) - goto Exit; - - af_latin_hints_compute_blue_edges( hints, metrics ); - } - - /* grid-fit the outline */ - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { -#ifdef AF_USE_WARPER - if ( ( dim == AF_DIMENSION_HORZ && - metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ) ) - { - AF_WarperRec warper; - FT_Fixed scale; - FT_Pos delta; - - - af_warper_compute( &warper, hints, dim, &scale, &delta ); - af_glyph_hints_scale_dim( hints, dim, scale, delta ); - continue; - } -#endif - - if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || - ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) - { - af_latin_hint_edges( hints, (AF_Dimension)dim ); - af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); - } - } - af_glyph_hints_save( hints, outline ); - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N S C R I P T C L A S S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* XXX: this should probably fine tuned to differentiate better between */ - /* scripts... */ - - static const AF_Script_UniRangeRec af_latin_uniranges[] = - { - AF_UNIRANGE_REC( 0x0020UL, 0x007FUL ), /* Basic Latin (no control chars) */ - AF_UNIRANGE_REC( 0x00A0UL, 0x00FFUL ), /* Latin-1 Supplement (no control chars) */ - AF_UNIRANGE_REC( 0x0100UL, 0x017FUL ), /* Latin Extended-A */ - AF_UNIRANGE_REC( 0x0180UL, 0x024FUL ), /* Latin Extended-B */ - AF_UNIRANGE_REC( 0x0250UL, 0x02AFUL ), /* IPA Extensions */ - AF_UNIRANGE_REC( 0x02B0UL, 0x02FFUL ), /* Spacing Modifier Letters */ - AF_UNIRANGE_REC( 0x0300UL, 0x036FUL ), /* Combining Diacritical Marks */ - AF_UNIRANGE_REC( 0x0370UL, 0x03FFUL ), /* Greek and Coptic */ - AF_UNIRANGE_REC( 0x0400UL, 0x04FFUL ), /* Cyrillic */ - AF_UNIRANGE_REC( 0x0500UL, 0x052FUL ), /* Cyrillic Supplement */ - AF_UNIRANGE_REC( 0x1D00UL, 0x1D7FUL ), /* Phonetic Extensions */ - AF_UNIRANGE_REC( 0x1D80UL, 0x1DBFUL ), /* Phonetic Extensions Supplement */ - AF_UNIRANGE_REC( 0x1DC0UL, 0x1DFFUL ), /* Combining Diacritical Marks Supplement */ - AF_UNIRANGE_REC( 0x1E00UL, 0x1EFFUL ), /* Latin Extended Additional */ - AF_UNIRANGE_REC( 0x1F00UL, 0x1FFFUL ), /* Greek Extended */ - AF_UNIRANGE_REC( 0x2000UL, 0x206FUL ), /* General Punctuation */ - AF_UNIRANGE_REC( 0x2070UL, 0x209FUL ), /* Superscripts and Subscripts */ - AF_UNIRANGE_REC( 0x20A0UL, 0x20CFUL ), /* Currency Symbols */ - AF_UNIRANGE_REC( 0x2150UL, 0x218FUL ), /* Number Forms */ - AF_UNIRANGE_REC( 0x2460UL, 0x24FFUL ), /* Enclosed Alphanumerics */ - AF_UNIRANGE_REC( 0x2C60UL, 0x2C7FUL ), /* Latin Extended-C */ - AF_UNIRANGE_REC( 0x2DE0UL, 0x2DFFUL ), /* Cyrillic Extended-A */ - AF_UNIRANGE_REC( 0xA640UL, 0xA69FUL ), /* Cyrillic Extended-B */ - AF_UNIRANGE_REC( 0xA720UL, 0xA7FFUL ), /* Latin Extended-D */ - AF_UNIRANGE_REC( 0xFB00UL, 0xFB06UL ), /* Alphab. Present. Forms (Latin Ligs) */ - AF_UNIRANGE_REC( 0x1D400UL, 0x1D7FFUL ), /* Mathematical Alphanumeric Symbols */ - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - - AF_DEFINE_SCRIPT_CLASS(af_latin_script_class, - AF_SCRIPT_LATIN, - af_latin_uniranges, - - sizeof( AF_LatinMetricsRec ), - - (AF_Script_InitMetricsFunc) af_latin_metrics_init, - (AF_Script_ScaleMetricsFunc)af_latin_metrics_scale, - (AF_Script_DoneMetricsFunc) NULL, - - (AF_Script_InitHintsFunc) af_latin_hints_init, - (AF_Script_ApplyHintsFunc) af_latin_hints_apply - ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/aflatin.h b/android/jni/ndk_modules/freetype/src/autofit/aflatin.h deleted file mode 100644 index 660b10c8..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/aflatin.h +++ /dev/null @@ -1,212 +0,0 @@ -/***************************************************************************/ -/* */ -/* aflatin.h */ -/* */ -/* Auto-fitter hinting routines for latin script (specification). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __AFLATIN_H__ -#define __AFLATIN_H__ - -#include "afhints.h" - - -FT_BEGIN_HEADER - - - /* the latin-specific script class */ - - AF_DECLARE_SCRIPT_CLASS(af_latin_script_class) - - -/* constants are given with units_per_em == 2048 in mind */ -#define AF_LATIN_CONSTANT( metrics, c ) \ - ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* - * The following declarations could be embedded in the file `aflatin.c'; - * they have been made semi-public to allow alternate script hinters to - * re-use some of them. - */ - - - /* Latin (global) metrics management */ - - enum - { - AF_LATIN_BLUE_CAPITAL_TOP, - AF_LATIN_BLUE_CAPITAL_BOTTOM, - AF_LATIN_BLUE_SMALL_F_TOP, - AF_LATIN_BLUE_SMALL_TOP, - AF_LATIN_BLUE_SMALL_BOTTOM, - AF_LATIN_BLUE_SMALL_MINOR, - - AF_LATIN_BLUE_MAX - }; - - -#define AF_LATIN_IS_TOP_BLUE( b ) ( (b) == AF_LATIN_BLUE_CAPITAL_TOP || \ - (b) == AF_LATIN_BLUE_SMALL_F_TOP || \ - (b) == AF_LATIN_BLUE_SMALL_TOP ) - -#define AF_LATIN_MAX_WIDTHS 16 -#define AF_LATIN_MAX_BLUES AF_LATIN_BLUE_MAX - - - enum - { - AF_LATIN_BLUE_ACTIVE = 1 << 0, - AF_LATIN_BLUE_TOP = 1 << 1, - AF_LATIN_BLUE_ADJUSTMENT = 1 << 2, /* used for scale adjustment */ - /* optimization */ - AF_LATIN_BLUE_FLAG_MAX - }; - - - typedef struct AF_LatinBlueRec_ - { - AF_WidthRec ref; - AF_WidthRec shoot; - FT_UInt flags; - - } AF_LatinBlueRec, *AF_LatinBlue; - - - typedef struct AF_LatinAxisRec_ - { - FT_Fixed scale; - FT_Pos delta; - - FT_UInt width_count; - AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]; - FT_Pos edge_distance_threshold; - FT_Pos standard_width; - FT_Bool extra_light; - - /* ignored for horizontal metrics */ - FT_Bool control_overshoot; - FT_UInt blue_count; - AF_LatinBlueRec blues[AF_LATIN_BLUE_MAX]; - - FT_Fixed org_scale; - FT_Pos org_delta; - - } AF_LatinAxisRec, *AF_LatinAxis; - - - typedef struct AF_LatinMetricsRec_ - { - AF_ScriptMetricsRec root; - FT_UInt units_per_em; - AF_LatinAxisRec axis[AF_DIMENSION_MAX]; - - } AF_LatinMetricsRec, *AF_LatinMetrics; - - - FT_LOCAL( FT_Error ) - af_latin_metrics_init( AF_LatinMetrics metrics, - FT_Face face ); - - FT_LOCAL( void ) - af_latin_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ); - - FT_LOCAL( void ) - af_latin_metrics_init_widths( AF_LatinMetrics metrics, - FT_Face face, - FT_ULong charcode ); - - FT_LOCAL( void ) - af_latin_metrics_check_digits( AF_LatinMetrics metrics, - FT_Face face ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H A N A L Y S I S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - enum - { - AF_LATIN_HINTS_HORZ_SNAP = 1 << 0, /* enable stem width snapping */ - AF_LATIN_HINTS_VERT_SNAP = 1 << 1, /* enable stem height snapping */ - AF_LATIN_HINTS_STEM_ADJUST = 1 << 2, /* enable stem width/height */ - /* adjustment */ - AF_LATIN_HINTS_MONO = 1 << 3 /* indicate monochrome */ - /* rendering */ - }; - - -#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \ - AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP ) - -#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \ - AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP ) - -#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \ - AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST ) - -#define AF_LATIN_HINTS_DO_MONO( h ) \ - AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO ) - - - /* - * This shouldn't normally be exported. However, other scripts might - * like to use this function as-is. - */ - FT_LOCAL( FT_Error ) - af_latin_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ); - - /* - * This shouldn't normally be exported. However, other scripts might - * want to use this function as-is. - */ - FT_LOCAL( void ) - af_latin_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ); - - /* - * This shouldn't normally be exported. However, other scripts might - * want to use this function as-is. - */ - FT_LOCAL( FT_Error ) - af_latin_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( FT_Error ) - af_latin_hints_detect_features( AF_GlyphHints hints, - AF_Dimension dim ); - -/* */ - -FT_END_HEADER - -#endif /* __AFLATIN_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/aflatin2.c b/android/jni/ndk_modules/freetype/src/autofit/aflatin2.c deleted file mode 100644 index 6546475a..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/aflatin2.c +++ /dev/null @@ -1,2345 +0,0 @@ -/***************************************************************************/ -/* */ -/* aflatin.c */ -/* */ -/* Auto-fitter hinting routines for latin script (body). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include FT_ADVANCES_H - -#include "aflatin.h" -#include "aflatin2.h" -#include "aferrors.h" - - -#ifdef AF_USE_WARPER -#include "afwarp.h" -#endif - - FT_LOCAL_DEF( FT_Error ) - af_latin2_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL_DEF( void ) - af_latin2_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ); - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - af_latin2_metrics_init_widths( AF_LatinMetrics metrics, - FT_Face face, - FT_ULong charcode ) - { - /* scan the array of segments in each direction */ - AF_GlyphHintsRec hints[1]; - - - af_glyph_hints_init( hints, face->memory ); - - metrics->axis[AF_DIMENSION_HORZ].width_count = 0; - metrics->axis[AF_DIMENSION_VERT].width_count = 0; - - { - FT_Error error; - FT_UInt glyph_index; - int dim; - AF_LatinMetricsRec dummy[1]; - AF_Scaler scaler = &dummy->root.scaler; - - - glyph_index = FT_Get_Char_Index( face, charcode ); - if ( glyph_index == 0 ) - goto Exit; - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || face->glyph->outline.n_points <= 0 ) - goto Exit; - - FT_ZERO( dummy ); - - dummy->units_per_em = metrics->units_per_em; - scaler->x_scale = scaler->y_scale = 0x10000L; - scaler->x_delta = scaler->y_delta = 0; - scaler->face = face; - scaler->render_mode = FT_RENDER_MODE_NORMAL; - scaler->flags = 0; - - af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy ); - - error = af_glyph_hints_reload( hints, &face->glyph->outline ); - if ( error ) - goto Exit; - - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = &metrics->axis[dim]; - AF_AxisHints axhints = &hints->axis[dim]; - AF_Segment seg, limit, link; - FT_UInt num_widths = 0; - - - error = af_latin2_hints_compute_segments( hints, - (AF_Dimension)dim ); - if ( error ) - goto Exit; - - af_latin2_hints_link_segments( hints, - (AF_Dimension)dim ); - - seg = axhints->segments; - limit = seg + axhints->num_segments; - - for ( ; seg < limit; seg++ ) - { - link = seg->link; - - /* we only consider stem segments there! */ - if ( link && link->link == seg && link > seg ) - { - FT_Pos dist; - - - dist = seg->pos - link->pos; - if ( dist < 0 ) - dist = -dist; - - if ( num_widths < AF_LATIN_MAX_WIDTHS ) - axis->widths[ num_widths++ ].org = dist; - } - } - - af_sort_widths( num_widths, axis->widths ); - axis->width_count = num_widths; - } - - Exit: - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = &metrics->axis[dim]; - FT_Pos stdw; - - - stdw = ( axis->width_count > 0 ) - ? axis->widths[0].org - : AF_LATIN_CONSTANT( metrics, 50 ); - - /* let's try 20% of the smallest width */ - axis->edge_distance_threshold = stdw / 5; - axis->standard_width = stdw; - axis->extra_light = 0; - } - } - - af_glyph_hints_done( hints ); - } - - - -#define AF_LATIN_MAX_TEST_CHARACTERS 12 - - - static const char af_latin2_blue_chars[AF_LATIN_MAX_BLUES][AF_LATIN_MAX_TEST_CHARACTERS+1] = - { - "THEZOCQS", - "HEZLOCUS", - "fijkdbh", - "xzroesc", - "xzroesc", - "pqgjy" - }; - - - static void - af_latin2_metrics_init_blues( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Pos flats [AF_LATIN_MAX_TEST_CHARACTERS]; - FT_Pos rounds[AF_LATIN_MAX_TEST_CHARACTERS]; - FT_Int num_flats; - FT_Int num_rounds; - FT_Int bb; - AF_LatinBlue blue; - FT_Error error; - AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; - FT_GlyphSlot glyph = face->glyph; - - - /* we compute the blues simply by loading each character from the */ - /* 'af_latin2_blue_chars[blues]' string, then compute its top-most or */ - /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ - - AF_LOG(( "blue zones computation\n" )); - AF_LOG(( "------------------------------------------------\n" )); - - for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) - { - const char* p = af_latin2_blue_chars[bb]; - const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; - FT_Pos* blue_ref; - FT_Pos* blue_shoot; - - - AF_LOG(( "blue %3d: ", bb )); - - num_flats = 0; - num_rounds = 0; - - for ( ; p < limit && *p; p++ ) - { - FT_UInt glyph_index; - FT_Int best_point, best_y, best_first, best_last; - FT_Vector* points; - FT_Bool round; - - - AF_LOG(( "'%c'", *p )); - - /* load the character in the face -- skip unknown or empty ones */ - glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p ); - if ( glyph_index == 0 ) - continue; - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || glyph->outline.n_points <= 0 ) - continue; - - /* now compute min or max point indices and coordinates */ - points = glyph->outline.points; - best_point = -1; - best_y = 0; /* make compiler happy */ - best_first = 0; /* ditto */ - best_last = 0; /* ditto */ - - { - FT_Int nn; - FT_Int first = 0; - FT_Int last = -1; - - - for ( nn = 0; nn < glyph->outline.n_contours; first = last+1, nn++ ) - { - FT_Int old_best_point = best_point; - FT_Int pp; - - - last = glyph->outline.contours[nn]; - - /* Avoid single-point contours since they are never rasterized. */ - /* In some fonts, they correspond to mark attachment points */ - /* which are way outside of the glyph's real outline. */ - if ( last == first ) - continue; - - if ( AF_LATIN_IS_TOP_BLUE( bb ) ) - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y > best_y ) - { - best_point = pp; - best_y = points[pp].y; - } - } - else - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y < best_y ) - { - best_point = pp; - best_y = points[pp].y; - } - } - - if ( best_point != old_best_point ) - { - best_first = first; - best_last = last; - } - } - AF_LOG(( "%5d", best_y )); - } - - /* now check whether the point belongs to a straight or round */ - /* segment; we first need to find in which contour the extremum */ - /* lies, then inspect its previous and next points */ - { - FT_Int start, end, prev, next; - FT_Pos dist; - - - /* now look for the previous and next points that are not on the */ - /* same Y coordinate. Threshold the `closeness'... */ - start = end = best_point; - - do - { - prev = start-1; - if ( prev < best_first ) - prev = best_last; - - dist = points[prev].y - best_y; - if ( dist < -5 || dist > 5 ) - break; - - start = prev; - - } while ( start != best_point ); - - do - { - next = end+1; - if ( next > best_last ) - next = best_first; - - dist = points[next].y - best_y; - if ( dist < -5 || dist > 5 ) - break; - - end = next; - - } while ( end != best_point ); - - /* now, set the `round' flag depending on the segment's kind */ - round = FT_BOOL( - FT_CURVE_TAG( glyph->outline.tags[start] ) != FT_CURVE_TAG_ON || - FT_CURVE_TAG( glyph->outline.tags[ end ] ) != FT_CURVE_TAG_ON ); - - AF_LOG(( "%c ", round ? 'r' : 'f' )); - } - - if ( round ) - rounds[num_rounds++] = best_y; - else - flats[num_flats++] = best_y; - } - - AF_LOG(( "\n" )); - - if ( num_flats == 0 && num_rounds == 0 ) - { - /* - * we couldn't find a single glyph to compute this blue zone, - * we will simply ignore it then - */ - AF_LOG(( "empty\n" )); - continue; - } - - /* we have computed the contents of the `rounds' and `flats' tables, */ - /* now determine the reference and overshoot position of the blue -- */ - /* we simply take the median value after a simple sort */ - af_sort_pos( num_rounds, rounds ); - af_sort_pos( num_flats, flats ); - - blue = & axis->blues[axis->blue_count]; - blue_ref = & blue->ref.org; - blue_shoot = & blue->shoot.org; - - axis->blue_count++; - - if ( num_flats == 0 ) - { - *blue_ref = - *blue_shoot = rounds[num_rounds / 2]; - } - else if ( num_rounds == 0 ) - { - *blue_ref = - *blue_shoot = flats[num_flats / 2]; - } - else - { - *blue_ref = flats[num_flats / 2]; - *blue_shoot = rounds[num_rounds / 2]; - } - - /* there are sometimes problems: if the overshoot position of top */ - /* zones is under its reference position, or the opposite for bottom */ - /* zones. We must thus check everything there and correct the errors */ - if ( *blue_shoot != *blue_ref ) - { - FT_Pos ref = *blue_ref; - FT_Pos shoot = *blue_shoot; - FT_Bool over_ref = FT_BOOL( shoot > ref ); - - - if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref ) - *blue_shoot = *blue_ref = ( shoot + ref ) / 2; - } - - blue->flags = 0; - if ( AF_LATIN_IS_TOP_BLUE( bb ) ) - blue->flags |= AF_LATIN_BLUE_TOP; - - /* - * The following flags is used later to adjust the y and x scales - * in order to optimize the pixel grid alignment of the top of small - * letters. - */ - if ( bb == AF_LATIN_BLUE_SMALL_TOP ) - blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; - - AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot )); - } - - return; - } - - - FT_LOCAL_DEF( void ) - af_latin2_metrics_check_digits( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_UInt i; - FT_Bool started = 0, same_width = 1; - FT_Fixed advance, old_advance = 0; - - - /* check whether all ASCII digits have the same advance width; */ - /* digit `0' is 0x30 in all supported charmaps */ - for ( i = 0x30; i <= 0x39; i++ ) - { - FT_UInt glyph_index; - - - glyph_index = FT_Get_Char_Index( face, i ); - if ( glyph_index == 0 ) - continue; - - if ( FT_Get_Advance( face, glyph_index, - FT_LOAD_NO_SCALE | - FT_LOAD_NO_HINTING | - FT_LOAD_IGNORE_TRANSFORM, - &advance ) ) - continue; - - if ( started ) - { - if ( advance != old_advance ) - { - same_width = 0; - break; - } - } - else - { - old_advance = advance; - started = 1; - } - } - - metrics->root.digits_have_same_width = same_width; - } - - - FT_LOCAL_DEF( FT_Error ) - af_latin2_metrics_init( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Error error = AF_Err_Ok; - FT_CharMap oldmap = face->charmap; - FT_UInt ee; - - static const FT_Encoding latin_encodings[] = - { - FT_ENCODING_UNICODE, - FT_ENCODING_APPLE_ROMAN, - FT_ENCODING_ADOBE_STANDARD, - FT_ENCODING_ADOBE_LATIN_1, - FT_ENCODING_NONE /* end of list */ - }; - - - metrics->units_per_em = face->units_per_EM; - - /* do we have a latin charmap in there? */ - for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ ) - { - error = FT_Select_Charmap( face, latin_encodings[ee] ); - if ( !error ) - break; - } - - if ( !error ) - { - /* For now, compute the standard width and height from the `o'. */ - af_latin2_metrics_init_widths( metrics, face, 'o' ); - af_latin2_metrics_init_blues( metrics, face ); - af_latin2_metrics_check_digits( metrics, face ); - } - - FT_Set_Charmap( face, oldmap ); - return AF_Err_Ok; - } - - - static void - af_latin2_metrics_scale_dim( AF_LatinMetrics metrics, - AF_Scaler scaler, - AF_Dimension dim ) - { - FT_Fixed scale; - FT_Pos delta; - AF_LatinAxis axis; - FT_UInt nn; - - - if ( dim == AF_DIMENSION_HORZ ) - { - scale = scaler->x_scale; - delta = scaler->x_delta; - } - else - { - scale = scaler->y_scale; - delta = scaler->y_delta; - } - - axis = &metrics->axis[dim]; - - if ( axis->org_scale == scale && axis->org_delta == delta ) - return; - - axis->org_scale = scale; - axis->org_delta = delta; - - /* - * correct Y scale to optimize the alignment of the top of small - * letters to the pixel grid - */ - if ( dim == AF_DIMENSION_VERT ) - { - AF_LatinAxis vaxis = &metrics->axis[AF_DIMENSION_VERT]; - AF_LatinBlue blue = NULL; - - - for ( nn = 0; nn < vaxis->blue_count; nn++ ) - { - if ( vaxis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) - { - blue = &vaxis->blues[nn]; - break; - } - } - - if ( blue ) - { - FT_Pos scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); - FT_Pos fitted = ( scaled + 40 ) & ~63; - -#if 1 - if ( scaled != fitted ) - { - scale = FT_MulDiv( scale, fitted, scaled ); - AF_LOG(( "== scaled x-top = %.2g fitted = %.2g, scaling = %.4g\n", scaled/64.0, fitted/64.0, (fitted*1.0)/scaled )); - } -#endif - } - } - - axis->scale = scale; - axis->delta = delta; - - if ( dim == AF_DIMENSION_HORZ ) - { - metrics->root.scaler.x_scale = scale; - metrics->root.scaler.x_delta = delta; - } - else - { - metrics->root.scaler.y_scale = scale; - metrics->root.scaler.y_delta = delta; - } - - /* scale the standard widths */ - for ( nn = 0; nn < axis->width_count; nn++ ) - { - AF_Width width = axis->widths + nn; - - - width->cur = FT_MulFix( width->org, scale ); - width->fit = width->cur; - } - - /* an extra-light axis corresponds to a standard width that is */ - /* smaller than 0.75 pixels */ - axis->extra_light = - (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); - - if ( dim == AF_DIMENSION_VERT ) - { - /* scale the blue zones */ - for ( nn = 0; nn < axis->blue_count; nn++ ) - { - AF_LatinBlue blue = &axis->blues[nn]; - FT_Pos dist; - - - blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; - blue->ref.fit = blue->ref.cur; - blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; - blue->shoot.fit = blue->shoot.cur; - blue->flags &= ~AF_LATIN_BLUE_ACTIVE; - - /* a blue zone is only active if it is less than 3/4 pixels tall */ - dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); - if ( dist <= 48 && dist >= -48 ) - { - FT_Pos delta1, delta2; - - delta1 = blue->shoot.org - blue->ref.org; - delta2 = delta1; - if ( delta1 < 0 ) - delta2 = -delta2; - - delta2 = FT_MulFix( delta2, scale ); - - if ( delta2 < 32 ) - delta2 = 0; - else if ( delta2 < 64 ) - delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); - else - delta2 = FT_PIX_ROUND( delta2 ); - - if ( delta1 < 0 ) - delta2 = -delta2; - - blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); - blue->shoot.fit = blue->ref.fit + delta2; - - AF_LOG(( ">> activating blue zone %d: ref.cur=%.2g ref.fit=%.2g shoot.cur=%.2g shoot.fit=%.2g\n", - nn, blue->ref.cur/64.0, blue->ref.fit/64.0, - blue->shoot.cur/64.0, blue->shoot.fit/64.0 )); - - blue->flags |= AF_LATIN_BLUE_ACTIVE; - } - } - } - } - - - FT_LOCAL_DEF( void ) - af_latin2_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ) - { - metrics->root.scaler.render_mode = scaler->render_mode; - metrics->root.scaler.face = scaler->face; - - af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); - af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H A N A L Y S I S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define SORT_SEGMENTS - - FT_LOCAL_DEF( FT_Error ) - af_latin2_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Memory memory = hints->memory; - FT_Error error = AF_Err_Ok; - AF_Segment segment = NULL; - AF_SegmentRec seg0; - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - AF_Direction major_dir, segment_dir; - - - FT_ZERO( &seg0 ); - seg0.score = 32000; - seg0.flags = AF_EDGE_NORMAL; - - major_dir = (AF_Direction)FT_ABS( axis->major_dir ); - segment_dir = major_dir; - - axis->num_segments = 0; - - /* set up (u,v) in each point */ - if ( dim == AF_DIMENSION_HORZ ) - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - - for ( ; point < limit; point++ ) - { - point->u = point->fx; - point->v = point->fy; - } - } - else - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - - for ( ; point < limit; point++ ) - { - point->u = point->fy; - point->v = point->fx; - } - } - - /* do each contour separately */ - for ( ; contour < contour_limit; contour++ ) - { - AF_Point point = contour[0]; - AF_Point start = point; - AF_Point last = point->prev; - - - if ( point == last ) /* skip singletons -- just in case */ - continue; - - /* already on an edge ?, backtrack to find its start */ - if ( FT_ABS( point->in_dir ) == major_dir ) - { - point = point->prev; - - while ( point->in_dir == start->in_dir ) - point = point->prev; - } - else /* otherwise, find first segment start, if any */ - { - while ( FT_ABS( point->out_dir ) != major_dir ) - { - point = point->next; - - if ( point == start ) - goto NextContour; - } - } - - start = point; - - for (;;) - { - AF_Point first; - FT_Pos min_u, min_v, max_u, max_v; - - /* we're at the start of a new segment */ - FT_ASSERT( FT_ABS( point->out_dir ) == major_dir && - point->in_dir != point->out_dir ); - first = point; - - min_u = max_u = point->u; - min_v = max_v = point->v; - - point = point->next; - - while ( point->out_dir == first->out_dir ) - { - point = point->next; - - if ( point->u < min_u ) - min_u = point->u; - - if ( point->u > max_u ) - max_u = point->u; - } - - if ( point->v < min_v ) - min_v = point->v; - - if ( point->v > max_v ) - max_v = point->v; - - /* record new segment */ - error = af_axis_hints_new_segment( axis, memory, &segment ); - if ( error ) - goto Exit; - - segment[0] = seg0; - segment->dir = first->out_dir; - segment->first = first; - segment->last = point; - segment->contour = contour; - segment->pos = (FT_Short)(( min_u + max_u ) >> 1); - segment->min_coord = (FT_Short) min_v; - segment->max_coord = (FT_Short) max_v; - segment->height = (FT_Short)(max_v - min_v); - - /* a segment is round if it doesn't have successive */ - /* on-curve points. */ - { - AF_Point pt = first; - AF_Point last = point; - AF_Flags f0 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); - AF_Flags f1; - - - segment->flags &= ~AF_EDGE_ROUND; - - for ( ; pt != last; f0 = f1 ) - { - pt = pt->next; - f1 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); - - if ( !f0 && !f1 ) - break; - - if ( pt == last ) - segment->flags |= AF_EDGE_ROUND; - } - } - - /* this can happen in the case of a degenerate contour - * e.g. a 2-point vertical contour - */ - if ( point == start ) - break; - - /* jump to the start of the next segment, if any */ - while ( FT_ABS(point->out_dir) != major_dir ) - { - point = point->next; - - if ( point == start ) - goto NextContour; - } - } - - NextContour: - ; - } /* contours */ - - /* now slightly increase the height of segments when this makes */ - /* sense -- this is used to better detect and ignore serifs */ - { - AF_Segment segments = axis->segments; - AF_Segment segments_end = segments + axis->num_segments; - - - for ( segment = segments; segment < segments_end; segment++ ) - { - AF_Point first = segment->first; - AF_Point last = segment->last; - AF_Point p; - FT_Pos first_v = first->v; - FT_Pos last_v = last->v; - - - if ( first == last ) - continue; - - if ( first_v < last_v ) - { - p = first->prev; - if ( p->v < first_v ) - segment->height = (FT_Short)( segment->height + - ( ( first_v - p->v ) >> 1 ) ); - - p = last->next; - if ( p->v > last_v ) - segment->height = (FT_Short)( segment->height + - ( ( p->v - last_v ) >> 1 ) ); - } - else - { - p = first->prev; - if ( p->v > first_v ) - segment->height = (FT_Short)( segment->height + - ( ( p->v - first_v ) >> 1 ) ); - - p = last->next; - if ( p->v < last_v ) - segment->height = (FT_Short)( segment->height + - ( ( last_v - p->v ) >> 1 ) ); - } - } - } - -#ifdef AF_SORT_SEGMENTS - /* place all segments with a negative direction to the start - * of the array, used to speed up segment linking later... - */ - { - AF_Segment segments = axis->segments; - FT_UInt count = axis->num_segments; - FT_UInt ii, jj; - - for (ii = 0; ii < count; ii++) - { - if ( segments[ii].dir > 0 ) - { - for (jj = ii+1; jj < count; jj++) - { - if ( segments[jj].dir < 0 ) - { - AF_SegmentRec tmp; - - tmp = segments[ii]; - segments[ii] = segments[jj]; - segments[jj] = tmp; - - break; - } - } - - if ( jj == count ) - break; - } - } - axis->mid_segments = ii; - } -#endif - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - af_latin2_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; -#ifdef AF_SORT_SEGMENTS - AF_Segment segment_mid = segments + axis->mid_segments; -#endif - FT_Pos len_threshold, len_score; - AF_Segment seg1, seg2; - - - len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); - if ( len_threshold == 0 ) - len_threshold = 1; - - len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); - -#ifdef AF_SORT_SEGMENTS - for ( seg1 = segments; seg1 < segment_mid; seg1++ ) - { - if ( seg1->dir != axis->major_dir || seg1->first == seg1->last ) - continue; - - for ( seg2 = segment_mid; seg2 < segment_limit; seg2++ ) -#else - /* now compare each segment to the others */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - /* the fake segments are introduced to hint the metrics -- */ - /* we must never link them to anything */ - if ( seg1->dir != axis->major_dir || seg1->first == seg1->last ) - continue; - - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos ) -#endif - { - FT_Pos pos1 = seg1->pos; - FT_Pos pos2 = seg2->pos; - FT_Pos dist = pos2 - pos1; - - - if ( dist < 0 ) - continue; - - { - FT_Pos min = seg1->min_coord; - FT_Pos max = seg1->max_coord; - FT_Pos len, score; - - - if ( min < seg2->min_coord ) - min = seg2->min_coord; - - if ( max > seg2->max_coord ) - max = seg2->max_coord; - - len = max - min; - if ( len >= len_threshold ) - { - score = dist + len_score / len; - if ( score < seg1->score ) - { - seg1->score = score; - seg1->link = seg2; - } - - if ( score < seg2->score ) - { - seg2->score = score; - seg2->link = seg1; - } - } - } - } - } -#if 0 - } -#endif - - /* now, compute the `serif' segments */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - seg2 = seg1->link; - - if ( seg2 ) - { - if ( seg2->link != seg1 ) - { - seg1->link = 0; - seg1->serif = seg2->link; - } - } - } - } - - - FT_LOCAL_DEF( FT_Error ) - af_latin2_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Error error = AF_Err_Ok; - FT_Memory memory = hints->memory; - AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; - - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - - AF_Direction up_dir; - FT_Fixed scale; - FT_Pos edge_distance_threshold; - FT_Pos segment_length_threshold; - - - axis->num_edges = 0; - - scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - - up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP - : AF_DIR_RIGHT; - - /* - * We want to ignore very small (mostly serif) segments, we do that - * by ignoring those that whose length is less than a given fraction - * of the standard width. If there is no standard width, we ignore - * those that are less than a given size in pixels - * - * also, unlink serif segments that are linked to segments farther - * than 50% of the standard width - */ - if ( dim == AF_DIMENSION_HORZ ) - { - if ( laxis->width_count > 0 ) - segment_length_threshold = (laxis->standard_width * 10 ) >> 4; - else - segment_length_threshold = FT_DivFix( 64, hints->y_scale ); - } - else - segment_length_threshold = 0; - - /*********************************************************************/ - /* */ - /* We will begin by generating a sorted table of edges for the */ - /* current direction. To do so, we simply scan each segment and try */ - /* to find an edge in our table that corresponds to its position. */ - /* */ - /* If no edge is found, we create and insert a new edge in the */ - /* sorted table. Otherwise, we simply add the segment to the edge's */ - /* list which will be processed in the second step to compute the */ - /* edge's properties. */ - /* */ - /* Note that the edges table is sorted along the segment/edge */ - /* position. */ - /* */ - /*********************************************************************/ - - edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, - scale ); - if ( edge_distance_threshold > 64 / 4 ) - edge_distance_threshold = 64 / 4; - - edge_distance_threshold = FT_DivFix( edge_distance_threshold, - scale ); - - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge found = 0; - FT_Int ee; - - - if ( seg->height < segment_length_threshold ) - continue; - - /* A special case for serif edges: If they are smaller than */ - /* 1.5 pixels we ignore them. */ - if ( seg->serif ) - { - FT_Pos dist = seg->serif->pos - seg->pos; - - if (dist < 0) - dist = -dist; - - if (dist >= laxis->standard_width >> 1) - { - /* unlink this serif, it is too distant from its reference stem */ - seg->serif = NULL; - } - else if ( 2*seg->height < 3 * segment_length_threshold ) - continue; - } - - /* look for an edge corresponding to the segment */ - for ( ee = 0; ee < axis->num_edges; ee++ ) - { - AF_Edge edge = axis->edges + ee; - FT_Pos dist; - - - dist = seg->pos - edge->fpos; - if ( dist < 0 ) - dist = -dist; - - if ( dist < edge_distance_threshold && edge->dir == seg->dir ) - { - found = edge; - break; - } - } - - if ( !found ) - { - AF_Edge edge; - - - /* insert a new edge in the list and */ - /* sort according to the position */ - error = af_axis_hints_new_edge( axis, seg->pos, seg->dir, memory, &edge ); - if ( error ) - goto Exit; - - /* add the segment to the new edge's list */ - FT_ZERO( edge ); - - edge->first = seg; - edge->last = seg; - edge->fpos = seg->pos; - edge->dir = seg->dir; - edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); - seg->edge_next = seg; - } - else - { - /* if an edge was found, simply add the segment to the edge's */ - /* list */ - seg->edge_next = found->first; - found->last->edge_next = seg; - found->last = seg; - } - } - - - /*********************************************************************/ - /* */ - /* Good, we will now compute each edge's properties according to */ - /* segments found on its position. Basically, these are: */ - /* */ - /* - edge's main direction */ - /* - stem edge, serif edge or both (which defaults to stem then) */ - /* - rounded edge, straight or both (which defaults to straight) */ - /* - link for edge */ - /* */ - /*********************************************************************/ - - /* first of all, set the `edge' field in each segment -- this is */ - /* required in order to compute edge links */ - - /* - * Note that removing this loop and setting the `edge' field of each - * segment directly in the code above slows down execution speed for - * some reasons on platforms like the Sun. - */ - { - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - - - for ( edge = edges; edge < edge_limit; edge++ ) - { - seg = edge->first; - if ( seg ) - do - { - seg->edge = edge; - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - - /* now, compute each edge properties */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Int is_round = 0; /* does it contain round segments? */ - FT_Int is_straight = 0; /* does it contain straight segments? */ - FT_Pos ups = 0; /* number of upwards segments */ - FT_Pos downs = 0; /* number of downwards segments */ - - - seg = edge->first; - - do - { - FT_Bool is_serif; - - - /* check for roundness of segment */ - if ( seg->flags & AF_EDGE_ROUND ) - is_round++; - else - is_straight++; - - /* check for segment direction */ - if ( seg->dir == up_dir ) - ups += seg->max_coord-seg->min_coord; - else - downs += seg->max_coord-seg->min_coord; - - /* check for links -- if seg->serif is set, then seg->link must */ - /* be ignored */ - is_serif = (FT_Bool)( seg->serif && - seg->serif->edge && - seg->serif->edge != edge ); - - if ( ( seg->link && seg->link->edge != NULL ) || is_serif ) - { - AF_Edge edge2; - AF_Segment seg2; - - - edge2 = edge->link; - seg2 = seg->link; - - if ( is_serif ) - { - seg2 = seg->serif; - edge2 = edge->serif; - } - - if ( edge2 ) - { - FT_Pos edge_delta; - FT_Pos seg_delta; - - - edge_delta = edge->fpos - edge2->fpos; - if ( edge_delta < 0 ) - edge_delta = -edge_delta; - - seg_delta = seg->pos - seg2->pos; - if ( seg_delta < 0 ) - seg_delta = -seg_delta; - - if ( seg_delta < edge_delta ) - edge2 = seg2->edge; - } - else - edge2 = seg2->edge; - - if ( is_serif ) - { - edge->serif = edge2; - edge2->flags |= AF_EDGE_SERIF; - } - else - edge->link = edge2; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - - /* set the round/straight flags */ - edge->flags = AF_EDGE_NORMAL; - - if ( is_round > 0 && is_round >= is_straight ) - edge->flags |= AF_EDGE_ROUND; - -#if 0 - /* set the edge's main direction */ - edge->dir = AF_DIR_NONE; - - if ( ups > downs ) - edge->dir = (FT_Char)up_dir; - - else if ( ups < downs ) - edge->dir = (FT_Char)-up_dir; - - else if ( ups == downs ) - edge->dir = 0; /* both up and down! */ -#endif - - /* gets rid of serifs if link is set */ - /* XXX: This gets rid of many unpleasant artefacts! */ - /* Example: the `c' in cour.pfa at size 13 */ - - if ( edge->serif && edge->link ) - edge->serif = 0; - } - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - af_latin2_hints_detect_features( AF_GlyphHints hints, - AF_Dimension dim ) - { - FT_Error error; - - - error = af_latin2_hints_compute_segments( hints, dim ); - if ( !error ) - { - af_latin2_hints_link_segments( hints, dim ); - - error = af_latin2_hints_compute_edges( hints, dim ); - } - return error; - } - - - FT_LOCAL_DEF( void ) - af_latin2_hints_compute_blue_edges( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - AF_AxisHints axis = &hints->axis[ AF_DIMENSION_VERT ]; - AF_Edge edge = axis->edges; - AF_Edge edge_limit = edge + axis->num_edges; - AF_LatinAxis latin = &metrics->axis[ AF_DIMENSION_VERT ]; - FT_Fixed scale = latin->scale; - FT_Pos best_dist0; /* initial threshold */ - - - /* compute the initial threshold as a fraction of the EM size */ - best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale ); - - if ( best_dist0 > 64 / 2 ) - best_dist0 = 64 / 2; - - /* compute which blue zones are active, i.e. have their scaled */ - /* size < 3/4 pixels */ - - /* for each horizontal edge search the blue zone which is closest */ - for ( ; edge < edge_limit; edge++ ) - { - FT_Int bb; - AF_Width best_blue = NULL; - FT_Pos best_dist = best_dist0; - - for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) - { - AF_LatinBlue blue = latin->blues + bb; - FT_Bool is_top_blue, is_major_dir; - - - /* skip inactive blue zones (i.e., those that are too small) */ - if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) - continue; - - /* if it is a top zone, check for right edges -- if it is a bottom */ - /* zone, check for left edges */ - /* */ - /* of course, that's for TrueType */ - is_top_blue = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 ); - is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); - - /* if it is a top zone, the edge must be against the major */ - /* direction; if it is a bottom zone, it must be in the major */ - /* direction */ - if ( is_top_blue ^ is_major_dir ) - { - FT_Pos dist; - AF_Width compare; - - - /* if it's a rounded edge, compare it to the overshoot position */ - /* if it's a flat edge, compare it to the reference position */ - if ( edge->flags & AF_EDGE_ROUND ) - compare = &blue->shoot; - else - compare = &blue->ref; - - dist = edge->fpos - compare->org; - if (dist < 0) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = compare; - } - -#if 0 - /* now, compare it to the overshoot position if the edge is */ - /* rounded, and if the edge is over the reference position of a */ - /* top zone, or under the reference position of a bottom zone */ - if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) - { - FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); - - - if ( is_top_blue ^ is_under_ref ) - { - blue = latin->blues + bb; - dist = edge->fpos - blue->shoot.org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = & blue->shoot; - } - } - } -#endif - } - } - - if ( best_blue ) - edge->blue_edge = best_blue; - } - } - - - static FT_Error - af_latin2_hints_init( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - FT_Render_Mode mode; - FT_UInt32 scaler_flags, other_flags; - FT_Face face = metrics->root.scaler.face; - - - af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics ); - - /* - * correct x_scale and y_scale if needed, since they may have - * been modified `af_latin2_metrics_scale_dim' above - */ - hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; - hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; - hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; - hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; - - /* compute flags depending on render mode, etc. */ - mode = metrics->root.scaler.render_mode; - -#if 0 /* #ifdef AF_USE_WARPER */ - if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) - { - metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; - } -#endif - - scaler_flags = hints->scaler_flags; - other_flags = 0; - - /* - * We snap the width of vertical stems for the monochrome and - * horizontal LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) - other_flags |= AF_LATIN_HINTS_HORZ_SNAP; - - /* - * We snap the width of horizontal stems for the monochrome and - * vertical LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) - other_flags |= AF_LATIN_HINTS_VERT_SNAP; - - /* - * We adjust stems to full pixels only if we don't use the `light' mode. - */ - if ( mode != FT_RENDER_MODE_LIGHT ) - other_flags |= AF_LATIN_HINTS_STEM_ADJUST; - - if ( mode == FT_RENDER_MODE_MONO ) - other_flags |= AF_LATIN_HINTS_MONO; - - /* - * In `light' hinting mode we disable horizontal hinting completely. - * We also do it if the face is italic. - */ - if ( mode == FT_RENDER_MODE_LIGHT || - (face->style_flags & FT_STYLE_FLAG_ITALIC) != 0 ) - scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; - - hints->scaler_flags = scaler_flags; - hints->other_flags = other_flags; - - return 0; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* snap a given width in scaled coordinates to one of the */ - /* current standard widths */ - - static FT_Pos - af_latin2_snap_width( AF_Width widths, - FT_Int count, - FT_Pos width ) - { - int n; - FT_Pos best = 64 + 32 + 2; - FT_Pos reference = width; - FT_Pos scaled; - - - for ( n = 0; n < count; n++ ) - { - FT_Pos w; - FT_Pos dist; - - - w = widths[n].cur; - dist = width - w; - if ( dist < 0 ) - dist = -dist; - if ( dist < best ) - { - best = dist; - reference = w; - } - } - - scaled = FT_PIX_ROUND( reference ); - - if ( width >= reference ) - { - if ( width < scaled + 48 ) - width = reference; - } - else - { - if ( width > scaled - 48 ) - width = reference; - } - - return width; - } - - - /* compute the snapped width of a given stem */ - - static FT_Pos - af_latin2_compute_stem_width( AF_GlyphHints hints, - AF_Dimension dim, - FT_Pos width, - AF_Edge_Flags base_flags, - AF_Edge_Flags stem_flags ) - { - AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; - AF_LatinAxis axis = & metrics->axis[dim]; - FT_Pos dist = width; - FT_Int sign = 0; - FT_Int vertical = ( dim == AF_DIMENSION_VERT ); - - - FT_UNUSED(base_flags); - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || - axis->extra_light ) - return width; - - if ( dist < 0 ) - { - dist = -width; - sign = 1; - } - - if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || - ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) - { - /* smooth hinting process: very lightly quantize the stem width */ - - /* leave the widths of serifs alone */ - - if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) - goto Done_Width; - -#if 0 - else if ( ( base_flags & AF_EDGE_ROUND ) ) - { - if ( dist < 80 ) - dist = 64; - } - else if ( dist < 56 ) - dist = 56; -#endif - if ( axis->width_count > 0 ) - { - FT_Pos delta; - - - /* compare to standard width */ - if ( axis->width_count > 0 ) - { - delta = dist - axis->widths[0].cur; - - if ( delta < 0 ) - delta = -delta; - - if ( delta < 40 ) - { - dist = axis->widths[0].cur; - if ( dist < 48 ) - dist = 48; - - goto Done_Width; - } - } - - if ( dist < 3 * 64 ) - { - delta = dist & 63; - dist &= -64; - - if ( delta < 10 ) - dist += delta; - - else if ( delta < 32 ) - dist += 10; - - else if ( delta < 54 ) - dist += 54; - - else - dist += delta; - } - else - dist = ( dist + 32 ) & ~63; - } - } - else - { - /* strong hinting process: snap the stem width to integer pixels */ - FT_Pos org_dist = dist; - - - dist = af_latin2_snap_width( axis->widths, axis->width_count, dist ); - - if ( vertical ) - { - /* in the case of vertical hinting, always round */ - /* the stem heights to integer pixels */ - - if ( dist >= 64 ) - dist = ( dist + 16 ) & ~63; - else - dist = 64; - } - else - { - if ( AF_LATIN_HINTS_DO_MONO( hints ) ) - { - /* monochrome horizontal hinting: snap widths to integer pixels */ - /* with a different threshold */ - - if ( dist < 64 ) - dist = 64; - else - dist = ( dist + 32 ) & ~63; - } - else - { - /* for horizontal anti-aliased hinting, we adopt a more subtle */ - /* approach: we strengthen small stems, round stems whose size */ - /* is between 1 and 2 pixels to an integer, otherwise nothing */ - - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - - else if ( dist < 128 ) - { - /* We only round to an integer width if the corresponding */ - /* distortion is less than 1/4 pixel. Otherwise this */ - /* makes everything worse since the diagonals, which are */ - /* not hinted, appear a lot bolder or thinner than the */ - /* vertical stems. */ - - FT_Int delta; - - - dist = ( dist + 22 ) & ~63; - delta = dist - org_dist; - if ( delta < 0 ) - delta = -delta; - - if (delta >= 16) - { - dist = org_dist; - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - } - } - else - /* round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & ~63; - } - } - } - - Done_Width: - if ( sign ) - dist = -dist; - - return dist; - } - - - /* align one stem edge relative to the previous stem edge */ - - static void - af_latin2_align_linked_edge( AF_GlyphHints hints, - AF_Dimension dim, - AF_Edge base_edge, - AF_Edge stem_edge ) - { - FT_Pos dist = stem_edge->opos - base_edge->opos; - - FT_Pos fitted_width = af_latin2_compute_stem_width( - hints, dim, dist, - (AF_Edge_Flags)base_edge->flags, - (AF_Edge_Flags)stem_edge->flags ); - - - stem_edge->pos = base_edge->pos + fitted_width; - - AF_LOG(( "LINK: edge %d (opos=%.2f) linked to (%.2f), " - "dist was %.2f, now %.2f\n", - stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0, - stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); - } - - - static void - af_latin2_align_serif_edge( AF_GlyphHints hints, - AF_Edge base, - AF_Edge serif ) - { - FT_UNUSED( hints ); - - serif->pos = base->pos + (serif->opos - base->opos); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** E D G E H I N T I N G ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_LOCAL_DEF( void ) - af_latin2_hint_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - AF_Edge anchor = 0; - FT_Int has_serifs = 0; - FT_Pos anchor_drift = 0; - - - - AF_LOG(( "==== hinting %s edges =====\n", dim == AF_DIMENSION_HORZ ? "vertical" : "horizontal" )); - - /* we begin by aligning all stems relative to the blue zone */ - /* if needed -- that's only for horizontal edges */ - - if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) - { - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Width blue; - AF_Edge edge1, edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - blue = edge->blue_edge; - edge1 = NULL; - edge2 = edge->link; - - if ( blue ) - { - edge1 = edge; - } - else if ( edge2 && edge2->blue_edge ) - { - blue = edge2->blue_edge; - edge1 = edge2; - edge2 = edge; - } - - if ( !edge1 ) - continue; - - AF_LOG(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), " - "was (%.2f)\n", - edge1-edges, edge1->opos / 64.0, blue->fit / 64.0, - edge1->pos / 64.0 )); - - edge1->pos = blue->fit; - edge1->flags |= AF_EDGE_DONE; - - if ( edge2 && !edge2->blue_edge ) - { - af_latin2_align_linked_edge( hints, dim, edge1, edge2 ); - edge2->flags |= AF_EDGE_DONE; - } - - if ( !anchor ) - { - anchor = edge; - - anchor_drift = (anchor->pos - anchor->opos); - if (edge2) - anchor_drift = (anchor_drift + (edge2->pos - edge2->opos)) >> 1; - } - } - } - - /* now we will align all stem edges, trying to maintain the */ - /* relative order of stems in the glyph */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - /* skip all non-stem edges */ - edge2 = edge->link; - if ( !edge2 ) - { - has_serifs++; - continue; - } - - /* now align the stem */ - - /* this should not happen, but it's better to be safe */ - if ( edge2->blue_edge ) - { - AF_LOG(( "ASSERTION FAILED for edge %d\n", edge2-edges )); - - af_latin2_align_linked_edge( hints, dim, edge2, edge ); - edge->flags |= AF_EDGE_DONE; - continue; - } - - if ( !anchor ) - { - FT_Pos org_len, org_center, cur_len; - FT_Pos cur_pos1, error1, error2, u_off, d_off; - - - org_len = edge2->opos - edge->opos; - cur_len = af_latin2_compute_stem_width( - hints, dim, org_len, - (AF_Edge_Flags)edge->flags, - (AF_Edge_Flags)edge2->flags ); - if ( cur_len <= 64 ) - u_off = d_off = 32; - else - { - u_off = 38; - d_off = 26; - } - - if ( cur_len < 96 ) - { - org_center = edge->opos + ( org_len >> 1 ); - - cur_pos1 = FT_PIX_ROUND( org_center ); - - error1 = org_center - ( cur_pos1 - u_off ); - if ( error1 < 0 ) - error1 = -error1; - - error2 = org_center - ( cur_pos1 + d_off ); - if ( error2 < 0 ) - error2 = -error2; - - if ( error1 < error2 ) - cur_pos1 -= u_off; - else - cur_pos1 += d_off; - - edge->pos = cur_pos1 - cur_len / 2; - edge2->pos = edge->pos + cur_len; - } - else - edge->pos = FT_PIX_ROUND( edge->opos ); - - AF_LOG(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f) " - "snapped to (%.2f) (%.2f)\n", - edge-edges, edge->opos / 64.0, - edge2-edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0 )); - anchor = edge; - - edge->flags |= AF_EDGE_DONE; - - af_latin2_align_linked_edge( hints, dim, edge, edge2 ); - - edge2->flags |= AF_EDGE_DONE; - - anchor_drift = ( (anchor->pos - anchor->opos) + - (edge2->pos - edge2->opos)) >> 1; - - AF_LOG(( "DRIFT: %.2f\n", anchor_drift/64.0 )); - } - else - { - FT_Pos org_pos, org_len, org_center, cur_center, cur_len; - FT_Pos org_left, org_right; - - - org_pos = edge->opos + anchor_drift; - org_len = edge2->opos - edge->opos; - org_center = org_pos + ( org_len >> 1 ); - - cur_len = af_latin2_compute_stem_width( - hints, dim, org_len, - (AF_Edge_Flags)edge->flags, - (AF_Edge_Flags)edge2->flags ); - - org_left = org_pos + ((org_len - cur_len) >> 1); - org_right = org_pos + ((org_len + cur_len) >> 1); - - AF_LOG(( "ALIGN: left=%.2f right=%.2f ", org_left/64.0, org_right/64.0 )); - cur_center = org_center; - - if ( edge2->flags & AF_EDGE_DONE ) - { - AF_LOG(( "\n" )); - edge->pos = edge2->pos - cur_len; - } - else - { - /* we want to compare several displacement, and choose - * the one that increases fitness while minimizing - * distortion as well - */ - FT_Pos displacements[6], scores[6], org, fit, delta; - FT_UInt count = 0; - - /* note: don't even try to fit tiny stems */ - if ( cur_len < 32 ) - { - AF_LOG(( "tiny stem\n" )); - goto AlignStem; - } - - /* if the span is within a single pixel, don't touch it */ - if ( FT_PIX_FLOOR(org_left) == FT_PIX_CEIL(org_right) ) - { - AF_LOG(( "single pixel stem\n" )); - goto AlignStem; - } - - if (cur_len <= 96) - { - /* we want to avoid the absolute worst case which is - * when the left and right edges of the span each represent - * about 50% of the gray. we'd better want to change this - * to 25/75%, since this is much more pleasant to the eye with - * very acceptable distortion - */ - FT_Pos frac_left = (org_left) & 63; - FT_Pos frac_right = (org_right) & 63; - - if ( frac_left >= 22 && frac_left <= 42 && - frac_right >= 22 && frac_right <= 42 ) - { - org = frac_left; - fit = (org <= 32) ? 16 : 48; - delta = FT_ABS(fit - org); - displacements[count] = fit - org; - scores[count++] = delta; - AF_LOG(( "dispA=%.2f (%d) ", (fit - org)/64.0, delta )); - - org = frac_right; - fit = (org <= 32) ? 16 : 48; - delta = FT_ABS(fit - org); - displacements[count] = fit - org; - scores[count++] = delta; - AF_LOG(( "dispB=%.2f (%d) ", (fit - org)/64.0, delta )); - } - } - - /* snapping the left edge to the grid */ - org = org_left; - fit = FT_PIX_ROUND(org); - delta = FT_ABS(fit - org); - displacements[count] = fit - org; - scores[count++] = delta; - AF_LOG(( "dispC=%.2f (%d) ", (fit - org)/64.0, delta )); - - /* snapping the right edge to the grid */ - org = org_right; - fit = FT_PIX_ROUND(org); - delta = FT_ABS(fit - org); - displacements[count] = fit - org; - scores[count++] = delta; - AF_LOG(( "dispD=%.2f (%d) ", (fit - org)/64.0, delta )); - - /* now find the best displacement */ - { - FT_Pos best_score = scores[0]; - FT_Pos best_disp = displacements[0]; - FT_UInt nn; - - for (nn = 1; nn < count; nn++) - { - if (scores[nn] < best_score) - { - best_score = scores[nn]; - best_disp = displacements[nn]; - } - } - - cur_center = org_center + best_disp; - } - AF_LOG(( "\n" )); - } - - AlignStem: - edge->pos = cur_center - (cur_len >> 1); - edge2->pos = edge->pos + cur_len; - - AF_LOG(( "STEM1: %d (opos=%.2f) to %d (opos=%.2f) " - "snapped to (%.2f) and (%.2f), org_len = %.2f cur_len=%.2f\n", - edge-edges, edge->opos / 64.0, - edge2-edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0, - org_len / 64.0, cur_len / 64.0 )); - - edge->flags |= AF_EDGE_DONE; - edge2->flags |= AF_EDGE_DONE; - - if ( edge > edges && edge->pos < edge[-1].pos ) - { - AF_LOG(( "BOUND: %d (pos=%.2f) to (%.2f)\n", - edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); - edge->pos = edge[-1].pos; - } - } - } - - /* make sure that lowercase m's maintain their symmetry */ - - /* In general, lowercase m's have six vertical edges if they are sans */ - /* serif, or twelve if they are with serifs. This implementation is */ - /* based on that assumption, and seems to work very well with most */ - /* faces. However, if for a certain face this assumption is not */ - /* true, the m is just rendered like before. In addition, any stem */ - /* correction will only be applied to symmetrical glyphs (even if the */ - /* glyph is not an m), so the potential for unwanted distortion is */ - /* relatively low. */ - - /* We don't handle horizontal edges since we can't easily assure that */ - /* the third (lowest) stem aligns with the base line; it might end up */ - /* one pixel higher or lower. */ - -#if 0 - { - FT_Int n_edges = edge_limit - edges; - - - if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) - { - AF_Edge edge1, edge2, edge3; - FT_Pos dist1, dist2, span, delta; - - - if ( n_edges == 6 ) - { - edge1 = edges; - edge2 = edges + 2; - edge3 = edges + 4; - } - else - { - edge1 = edges + 1; - edge2 = edges + 5; - edge3 = edges + 9; - } - - dist1 = edge2->opos - edge1->opos; - dist2 = edge3->opos - edge2->opos; - - span = dist1 - dist2; - if ( span < 0 ) - span = -span; - - if ( span < 8 ) - { - delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); - edge3->pos -= delta; - if ( edge3->link ) - edge3->link->pos -= delta; - - /* move the serifs along with the stem */ - if ( n_edges == 12 ) - { - ( edges + 8 )->pos -= delta; - ( edges + 11 )->pos -= delta; - } - - edge3->flags |= AF_EDGE_DONE; - if ( edge3->link ) - edge3->link->flags |= AF_EDGE_DONE; - } - } - } -#endif - - if ( has_serifs || !anchor ) - { - /* - * now hint the remaining edges (serifs and single) in order - * to complete our processing - */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Pos delta; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - delta = 1000; - - if ( edge->serif ) - { - delta = edge->serif->opos - edge->opos; - if ( delta < 0 ) - delta = -delta; - } - - if ( delta < 64 + 16 ) - { - af_latin2_align_serif_edge( hints, edge->serif, edge ); - AF_LOG(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f) " - "aligned to (%.2f)\n", - edge-edges, edge->opos / 64.0, - edge->serif - edges, edge->serif->opos / 64.0, - edge->pos / 64.0 )); - } - else if ( !anchor ) - { - AF_LOG(( "SERIF_ANCHOR: edge %d (opos=%.2f) snapped to (%.2f)\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); - edge->pos = FT_PIX_ROUND( edge->opos ); - anchor = edge; - } - else - { - AF_Edge before, after; - - - for ( before = edge - 1; before >= edges; before-- ) - if ( before->flags & AF_EDGE_DONE ) - break; - - for ( after = edge + 1; after < edge_limit; after++ ) - if ( after->flags & AF_EDGE_DONE ) - break; - - if ( before >= edges && before < edge && - after < edge_limit && after > edge ) - { - if ( after->opos == before->opos ) - edge->pos = before->pos; - else - edge->pos = before->pos + - FT_MulDiv( edge->opos - before->opos, - after->pos - before->pos, - after->opos - before->opos ); - AF_LOG(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f) from %d (opos=%.2f)\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0, before - edges, before->opos / 64.0 )); - } - else - { - edge->pos = anchor->pos + (( edge->opos - anchor->opos + 16) & ~31); - - AF_LOG(( "SERIF_LINK2: edge %d (opos=%.2f) snapped to (%.2f)\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); - } - } - - edge->flags |= AF_EDGE_DONE; - - if ( edge > edges && edge->pos < edge[-1].pos ) - edge->pos = edge[-1].pos; - - if ( edge + 1 < edge_limit && - edge[1].flags & AF_EDGE_DONE && - edge->pos > edge[1].pos ) - edge->pos = edge[1].pos; - } - } - } - - - static FT_Error - af_latin2_hints_apply( AF_GlyphHints hints, - FT_Outline* outline, - AF_LatinMetrics metrics ) - { - FT_Error error; - int dim; - - - error = af_glyph_hints_reload( hints, outline ); - if ( error ) - goto Exit; - - /* analyze glyph outline */ -#ifdef AF_USE_WARPER - if ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT || - AF_HINTS_DO_HORIZONTAL( hints ) ) -#else - if ( AF_HINTS_DO_HORIZONTAL( hints ) ) -#endif - { - error = af_latin2_hints_detect_features( hints, AF_DIMENSION_HORZ ); - if ( error ) - goto Exit; - } - - if ( AF_HINTS_DO_VERTICAL( hints ) ) - { - error = af_latin2_hints_detect_features( hints, AF_DIMENSION_VERT ); - if ( error ) - goto Exit; - - af_latin2_hints_compute_blue_edges( hints, metrics ); - } - - /* grid-fit the outline */ - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { -#ifdef AF_USE_WARPER - if ( ( dim == AF_DIMENSION_HORZ && - metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ) ) - { - AF_WarperRec warper; - FT_Fixed scale; - FT_Pos delta; - - - af_warper_compute( &warper, hints, dim, &scale, &delta ); - af_glyph_hints_scale_dim( hints, dim, scale, delta ); - continue; - } -#endif - - if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || - ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) - { - af_latin2_hint_edges( hints, (AF_Dimension)dim ); - af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); - } - } - af_glyph_hints_save( hints, outline ); - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N S C R I P T C L A S S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - static const AF_Script_UniRangeRec af_latin2_uniranges[] = - { - AF_UNIRANGE_REC( 32UL, 127UL ), /* XXX: TODO: Add new Unicode ranges here! */ - AF_UNIRANGE_REC( 160UL, 255UL ), - AF_UNIRANGE_REC( 0UL, 0UL ) - }; - - - AF_DEFINE_SCRIPT_CLASS(af_latin2_script_class, - AF_SCRIPT_LATIN2, - af_latin2_uniranges, - - sizeof( AF_LatinMetricsRec ), - - (AF_Script_InitMetricsFunc) af_latin2_metrics_init, - (AF_Script_ScaleMetricsFunc)af_latin2_metrics_scale, - (AF_Script_DoneMetricsFunc) NULL, - - (AF_Script_InitHintsFunc) af_latin2_hints_init, - (AF_Script_ApplyHintsFunc) af_latin2_hints_apply - ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/aflatin2.h b/android/jni/ndk_modules/freetype/src/autofit/aflatin2.h deleted file mode 100644 index 925c6214..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/aflatin2.h +++ /dev/null @@ -1,39 +0,0 @@ -/***************************************************************************/ -/* */ -/* aflatin2.h */ -/* */ -/* Auto-fitter hinting routines for latin script (specification). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __AFLATIN2_H__ -#define __AFLATIN2_H__ - -#include "afhints.h" - - -FT_BEGIN_HEADER - - - /* the latin-specific script class */ - - AF_DECLARE_SCRIPT_CLASS(af_latin2_script_class) - -/* */ - -FT_END_HEADER - -#endif /* __AFLATIN_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afloader.c b/android/jni/ndk_modules/freetype/src/autofit/afloader.c deleted file mode 100644 index 6dd9f2a3..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afloader.c +++ /dev/null @@ -1,539 +0,0 @@ -/***************************************************************************/ -/* */ -/* afloader.c */ -/* */ -/* Auto-fitter glyph loading routines (body). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include "afloader.h" -#include "afhints.h" -#include "afglobal.h" -#include "aferrors.h" - - - FT_LOCAL_DEF( FT_Error ) - af_loader_init( AF_Loader loader, - FT_Memory memory ) - { - FT_ZERO( loader ); - - af_glyph_hints_init( &loader->hints, memory ); -#ifdef AF_DEBUG - _af_debug_hints = &loader->hints; -#endif - return FT_GlyphLoader_New( memory, &loader->gloader ); - } - - - FT_LOCAL_DEF( FT_Error ) - af_loader_reset( AF_Loader loader, - FT_Face face ) - { - FT_Error error = AF_Err_Ok; - - - loader->face = face; - loader->globals = (AF_FaceGlobals)face->autohint.data; - - FT_GlyphLoader_Rewind( loader->gloader ); - - if ( loader->globals == NULL ) - { - error = af_face_globals_new( face, &loader->globals ); - if ( !error ) - { - face->autohint.data = - (FT_Pointer)loader->globals; - face->autohint.finalizer = - (FT_Generic_Finalizer)af_face_globals_free; - } - } - - return error; - } - - - FT_LOCAL_DEF( void ) - af_loader_done( AF_Loader loader ) - { - af_glyph_hints_done( &loader->hints ); - - loader->face = NULL; - loader->globals = NULL; - -#ifdef AF_DEBUG - _af_debug_hints = NULL; -#endif - FT_GlyphLoader_Done( loader->gloader ); - loader->gloader = NULL; - } - - - static FT_Error - af_loader_load_g( AF_Loader loader, - AF_Scaler scaler, - FT_UInt glyph_index, - FT_Int32 load_flags, - FT_UInt depth ) - { - FT_Error error; - FT_Face face = loader->face; - FT_GlyphLoader gloader = loader->gloader; - AF_ScriptMetrics metrics = loader->metrics; - AF_GlyphHints hints = &loader->hints; - FT_GlyphSlot slot = face->glyph; - FT_Slot_Internal internal = slot->internal; - - - error = FT_Load_Glyph( face, glyph_index, load_flags ); - if ( error ) - goto Exit; - - loader->transformed = internal->glyph_transformed; - if ( loader->transformed ) - { - FT_Matrix inverse; - - - loader->trans_matrix = internal->glyph_matrix; - loader->trans_delta = internal->glyph_delta; - - inverse = loader->trans_matrix; - FT_Matrix_Invert( &inverse ); - FT_Vector_Transform( &loader->trans_delta, &inverse ); - } - - /* set linear metrics */ - slot->linearHoriAdvance = slot->metrics.horiAdvance; - slot->linearVertAdvance = slot->metrics.vertAdvance; - - switch ( slot->format ) - { - case FT_GLYPH_FORMAT_OUTLINE: - /* translate the loaded glyph when an internal transform is needed */ - if ( loader->transformed ) - FT_Outline_Translate( &slot->outline, - loader->trans_delta.x, - loader->trans_delta.y ); - - /* copy the outline points in the loader's current */ - /* extra points which is used to keep original glyph coordinates */ - error = FT_GLYPHLOADER_CHECK_POINTS( gloader, - slot->outline.n_points + 4, - slot->outline.n_contours ); - if ( error ) - goto Exit; - - FT_ARRAY_COPY( gloader->current.outline.points, - slot->outline.points, - slot->outline.n_points ); - - FT_ARRAY_COPY( gloader->current.outline.contours, - slot->outline.contours, - slot->outline.n_contours ); - - FT_ARRAY_COPY( gloader->current.outline.tags, - slot->outline.tags, - slot->outline.n_points ); - - gloader->current.outline.n_points = slot->outline.n_points; - gloader->current.outline.n_contours = slot->outline.n_contours; - - /* compute original horizontal phantom points (and ignore */ - /* vertical ones) */ - loader->pp1.x = hints->x_delta; - loader->pp1.y = hints->y_delta; - loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance, - hints->x_scale ) + hints->x_delta; - loader->pp2.y = hints->y_delta; - - /* be sure to check for spacing glyphs */ - if ( slot->outline.n_points == 0 ) - goto Hint_Metrics; - - /* now load the slot image into the auto-outline and run the */ - /* automatic hinting process */ - if ( metrics->clazz->script_hints_apply ) - metrics->clazz->script_hints_apply( hints, - &gloader->current.outline, - metrics ); - - /* we now need to hint the metrics according to the change in */ - /* width/positioning that occurred during the hinting process */ - if ( scaler->render_mode != FT_RENDER_MODE_LIGHT ) - { - FT_Pos old_rsb, old_lsb, new_lsb; - FT_Pos pp1x_uh, pp2x_uh; - AF_AxisHints axis = &hints->axis[AF_DIMENSION_HORZ]; - AF_Edge edge1 = axis->edges; /* leftmost edge */ - AF_Edge edge2 = edge1 + - axis->num_edges - 1; /* rightmost edge */ - - - if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) ) - { - old_rsb = loader->pp2.x - edge2->opos; - old_lsb = edge1->opos; - new_lsb = edge1->pos; - - /* remember unhinted values to later account */ - /* for rounding errors */ - - pp1x_uh = new_lsb - old_lsb; - pp2x_uh = edge2->pos + old_rsb; - - /* prefer too much space over too little space */ - /* for very small sizes */ - - if ( old_lsb < 24 ) - pp1x_uh -= 8; - - if ( old_rsb < 24 ) - pp2x_uh += 8; - - loader->pp1.x = FT_PIX_ROUND( pp1x_uh ); - loader->pp2.x = FT_PIX_ROUND( pp2x_uh ); - - if ( loader->pp1.x >= new_lsb && old_lsb > 0 ) - loader->pp1.x -= 64; - - if ( loader->pp2.x <= edge2->pos && old_rsb > 0 ) - loader->pp2.x += 64; - - slot->lsb_delta = loader->pp1.x - pp1x_uh; - slot->rsb_delta = loader->pp2.x - pp2x_uh; - } - else - { - FT_Pos pp1x = loader->pp1.x; - FT_Pos pp2x = loader->pp2.x; - - - loader->pp1.x = FT_PIX_ROUND( pp1x ); - loader->pp2.x = FT_PIX_ROUND( pp2x ); - - slot->lsb_delta = loader->pp1.x - pp1x; - slot->rsb_delta = loader->pp2.x - pp2x; - } - } - else - { - FT_Pos pp1x = loader->pp1.x; - FT_Pos pp2x = loader->pp2.x; - - - loader->pp1.x = FT_PIX_ROUND( pp1x + hints->xmin_delta ); - loader->pp2.x = FT_PIX_ROUND( pp2x + hints->xmax_delta ); - - slot->lsb_delta = loader->pp1.x - pp1x; - slot->rsb_delta = loader->pp2.x - pp2x; - } - - /* good, we simply add the glyph to our loader's base */ - FT_GlyphLoader_Add( gloader ); - break; - - case FT_GLYPH_FORMAT_COMPOSITE: - { - FT_UInt nn, num_subglyphs = slot->num_subglyphs; - FT_UInt num_base_subgs, start_point; - FT_SubGlyph subglyph; - - - start_point = gloader->base.outline.n_points; - - /* first of all, copy the subglyph descriptors in the glyph loader */ - error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs ); - if ( error ) - goto Exit; - - FT_ARRAY_COPY( gloader->current.subglyphs, - slot->subglyphs, - num_subglyphs ); - - gloader->current.num_subglyphs = num_subglyphs; - num_base_subgs = gloader->base.num_subglyphs; - - /* now, read each subglyph independently */ - for ( nn = 0; nn < num_subglyphs; nn++ ) - { - FT_Vector pp1, pp2; - FT_Pos x, y; - FT_UInt num_points, num_new_points, num_base_points; - - - /* gloader.current.subglyphs can change during glyph loading due */ - /* to re-allocation -- we must recompute the current subglyph on */ - /* each iteration */ - subglyph = gloader->base.subglyphs + num_base_subgs + nn; - - pp1 = loader->pp1; - pp2 = loader->pp2; - - num_base_points = gloader->base.outline.n_points; - - error = af_loader_load_g( loader, scaler, subglyph->index, - load_flags, depth + 1 ); - if ( error ) - goto Exit; - - /* recompute subglyph pointer */ - subglyph = gloader->base.subglyphs + num_base_subgs + nn; - - if ( subglyph->flags & FT_SUBGLYPH_FLAG_USE_MY_METRICS ) - { - pp1 = loader->pp1; - pp2 = loader->pp2; - } - else - { - loader->pp1 = pp1; - loader->pp2 = pp2; - } - - num_points = gloader->base.outline.n_points; - num_new_points = num_points - num_base_points; - - /* now perform the transform required for this subglyph */ - - if ( subglyph->flags & ( FT_SUBGLYPH_FLAG_SCALE | - FT_SUBGLYPH_FLAG_XY_SCALE | - FT_SUBGLYPH_FLAG_2X2 ) ) - { - FT_Vector* cur = gloader->base.outline.points + - num_base_points; - FT_Vector* limit = cur + num_new_points; - - - for ( ; cur < limit; cur++ ) - FT_Vector_Transform( cur, &subglyph->transform ); - } - - /* apply offset */ - - if ( !( subglyph->flags & FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ) ) - { - FT_Int k = subglyph->arg1; - FT_UInt l = subglyph->arg2; - FT_Vector* p1; - FT_Vector* p2; - - - if ( start_point + k >= num_base_points || - l >= (FT_UInt)num_new_points ) - { - error = AF_Err_Invalid_Composite; - goto Exit; - } - - l += num_base_points; - - /* for now, only use the current point coordinates; */ - /* we may consider another approach in the near future */ - p1 = gloader->base.outline.points + start_point + k; - p2 = gloader->base.outline.points + start_point + l; - - x = p1->x - p2->x; - y = p1->y - p2->y; - } - else - { - x = FT_MulFix( subglyph->arg1, hints->x_scale ) + hints->x_delta; - y = FT_MulFix( subglyph->arg2, hints->y_scale ) + hints->y_delta; - - x = FT_PIX_ROUND( x ); - y = FT_PIX_ROUND( y ); - } - - { - FT_Outline dummy = gloader->base.outline; - - - dummy.points += num_base_points; - dummy.n_points = (short)num_new_points; - - FT_Outline_Translate( &dummy, x, y ); - } - } - } - break; - - default: - /* we don't support other formats (yet?) */ - error = AF_Err_Unimplemented_Feature; - } - - Hint_Metrics: - if ( depth == 0 ) - { - FT_BBox bbox; - FT_Vector vvector; - - - vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX; - vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY; - vvector.x = FT_MulFix( vvector.x, metrics->scaler.x_scale ); - vvector.y = FT_MulFix( vvector.y, metrics->scaler.y_scale ); - - /* transform the hinted outline if needed */ - if ( loader->transformed ) - { - FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix ); - FT_Vector_Transform( &vvector, &loader->trans_matrix ); - } -#if 1 - /* we must translate our final outline by -pp1.x and compute */ - /* the new metrics */ - if ( loader->pp1.x ) - FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 ); -#endif - FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); - - bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); - bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); - bbox.xMax = FT_PIX_CEIL( bbox.xMax ); - bbox.yMax = FT_PIX_CEIL( bbox.yMax ); - - slot->metrics.width = bbox.xMax - bbox.xMin; - slot->metrics.height = bbox.yMax - bbox.yMin; - slot->metrics.horiBearingX = bbox.xMin; - slot->metrics.horiBearingY = bbox.yMax; - - slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x ); - slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y ); - - /* for mono-width fonts (like Andale, Courier, etc.) we need */ - /* to keep the original rounded advance width; ditto for */ - /* digits if all have the same advance width */ -#if 0 - if ( !FT_IS_FIXED_WIDTH( slot->face ) ) - slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; - else - slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, - x_scale ); -#else - if ( FT_IS_FIXED_WIDTH( slot->face ) || - ( af_face_globals_is_digit( loader->globals, glyph_index ) && - metrics->digits_have_same_width ) ) - { - slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, - metrics->scaler.x_scale ); - - /* Set delta values to 0. Otherwise code that uses them is */ - /* going to ruin the fixed advance width. */ - slot->lsb_delta = 0; - slot->rsb_delta = 0; - } - else - { - /* non-spacing glyphs must stay as-is */ - if ( slot->metrics.horiAdvance ) - slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; - } -#endif - - slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance, - metrics->scaler.y_scale ); - - slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); - slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance ); - - /* now copy outline into glyph slot */ - FT_GlyphLoader_Rewind( internal->loader ); - error = FT_GlyphLoader_CopyPoints( internal->loader, gloader ); - if ( error ) - goto Exit; - - slot->outline = internal->loader->base.outline; - slot->format = FT_GLYPH_FORMAT_OUTLINE; - } - -#ifdef DEBUG_HINTER - af_debug_hinter = hinter; -#endif - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - af_loader_load_glyph( AF_Loader loader, - FT_Face face, - FT_UInt gindex, - FT_UInt32 load_flags ) - { - FT_Error error; - FT_Size size = face->size; - AF_ScalerRec scaler; - - - if ( !size ) - return AF_Err_Invalid_Argument; - - FT_ZERO( &scaler ); - - scaler.face = face; - scaler.x_scale = size->metrics.x_scale; - scaler.x_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ - scaler.y_scale = size->metrics.y_scale; - scaler.y_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ - - scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); - scaler.flags = 0; /* XXX: fix this */ - - error = af_loader_reset( loader, face ); - if ( !error ) - { - AF_ScriptMetrics metrics; - FT_UInt options = 0; - - -#ifdef FT_OPTION_AUTOFIT2 - /* XXX: undocumented hook to activate the latin2 hinter */ - if ( load_flags & ( 1UL << 20 ) ) - options = 2; -#endif - - error = af_face_globals_get_metrics( loader->globals, gindex, - options, &metrics ); - if ( !error ) - { - loader->metrics = metrics; - - if ( metrics->clazz->script_metrics_scale ) - metrics->clazz->script_metrics_scale( metrics, &scaler ); - else - metrics->scaler = scaler; - - load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM; - load_flags &= ~FT_LOAD_RENDER; - - if ( metrics->clazz->script_hints_init ) - { - error = metrics->clazz->script_hints_init( &loader->hints, - metrics ); - if ( error ) - goto Exit; - } - - error = af_loader_load_g( loader, &scaler, gindex, load_flags, 0 ); - } - } - Exit: - return error; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afloader.h b/android/jni/ndk_modules/freetype/src/autofit/afloader.h deleted file mode 100644 index fa67c10f..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afloader.h +++ /dev/null @@ -1,73 +0,0 @@ -/***************************************************************************/ -/* */ -/* afloader.h */ -/* */ -/* Auto-fitter glyph loading routines (specification). */ -/* */ -/* Copyright 2003, 2004, 2005 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __AF_LOADER_H__ -#define __AF_LOADER_H__ - -#include "afhints.h" -#include "afglobal.h" - - -FT_BEGIN_HEADER - - typedef struct AF_LoaderRec_ - { - FT_Face face; /* current face */ - AF_FaceGlobals globals; /* current face globals */ - FT_GlyphLoader gloader; /* glyph loader */ - AF_GlyphHintsRec hints; - AF_ScriptMetrics metrics; - FT_Bool transformed; - FT_Matrix trans_matrix; - FT_Vector trans_delta; - FT_Vector pp1; - FT_Vector pp2; - /* we don't handle vertical phantom points */ - - } AF_LoaderRec, *AF_Loader; - - - FT_LOCAL( FT_Error ) - af_loader_init( AF_Loader loader, - FT_Memory memory ); - - - FT_LOCAL( FT_Error ) - af_loader_reset( AF_Loader loader, - FT_Face face ); - - - FT_LOCAL( void ) - af_loader_done( AF_Loader loader ); - - - FT_LOCAL( FT_Error ) - af_loader_load_glyph( AF_Loader loader, - FT_Face face, - FT_UInt gindex, - FT_UInt32 load_flags ); - -/* */ - - -FT_END_HEADER - -#endif /* __AF_LOADER_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afmodule.c b/android/jni/ndk_modules/freetype/src/autofit/afmodule.c deleted file mode 100644 index ec2d707c..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afmodule.c +++ /dev/null @@ -1,94 +0,0 @@ -/***************************************************************************/ -/* */ -/* afmodule.c */ -/* */ -/* Auto-fitter module implementation (body). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include "afmodule.h" -#include "afloader.h" -#include "afpic.h" - -#ifdef AF_DEBUG - int _af_debug; - int _af_debug_disable_horz_hints; - int _af_debug_disable_vert_hints; - int _af_debug_disable_blue_hints; - void* _af_debug_hints; -#endif - -#include FT_INTERNAL_OBJECTS_H - - - typedef struct FT_AutofitterRec_ - { - FT_ModuleRec root; - AF_LoaderRec loader[1]; - - } FT_AutofitterRec, *FT_Autofitter; - - - FT_CALLBACK_DEF( FT_Error ) - af_autofitter_init( FT_Autofitter module ) - { - return af_loader_init( module->loader, module->root.library->memory ); - } - - - FT_CALLBACK_DEF( void ) - af_autofitter_done( FT_Autofitter module ) - { - af_loader_done( module->loader ); - } - - - FT_CALLBACK_DEF( FT_Error ) - af_autofitter_load_glyph( FT_Autofitter module, - FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_UNUSED( size ); - - return af_loader_load_glyph( module->loader, slot->face, - glyph_index, load_flags ); - } - - - FT_DEFINE_AUTOHINTER_SERVICE(af_autofitter_service, - NULL, - NULL, - NULL, - (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph - ) - - FT_DEFINE_MODULE(autofit_module_class, - - FT_MODULE_HINTER, - sizeof ( FT_AutofitterRec ), - - "autofitter", - 0x10000L, /* version 1.0 of the autofitter */ - 0x20000L, /* requires FreeType 2.0 or above */ - - (const void*)&AF_AF_AUTOFITTER_SERVICE_GET, - - (FT_Module_Constructor)af_autofitter_init, - (FT_Module_Destructor) af_autofitter_done, - (FT_Module_Requester) NULL - ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afmodule.h b/android/jni/ndk_modules/freetype/src/autofit/afmodule.h deleted file mode 100644 index d9792399..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afmodule.h +++ /dev/null @@ -1,37 +0,0 @@ -/***************************************************************************/ -/* */ -/* afmodule.h */ -/* */ -/* Auto-fitter module implementation (specification). */ -/* */ -/* Copyright 2003, 2004, 2005 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __AFMODULE_H__ -#define __AFMODULE_H__ - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_MODULE_H - - -FT_BEGIN_HEADER - -FT_DECLARE_MODULE(autofit_module_class) - - -FT_END_HEADER - -#endif /* __AFMODULE_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afpic.c b/android/jni/ndk_modules/freetype/src/autofit/afpic.c deleted file mode 100644 index 5b9aba69..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afpic.c +++ /dev/null @@ -1,94 +0,0 @@ -/***************************************************************************/ -/* */ -/* afpic.c */ -/* */ -/* The FreeType position independent code services for autofit module. */ -/* */ -/* Copyright 2009, 2010 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "afpic.h" - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from afmodule.c */ - void FT_Init_Class_af_autofitter_service( FT_Library, FT_AutoHinter_ServiceRec*); - - /* forward declaration of PIC init functions from script classes */ -#include "aflatin.h" -#include "aflatin2.h" -#include "afcjk.h" -#include "afdummy.h" -#include "afindic.h" - - void - autofit_module_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - if ( pic_container->autofit ) - { - FT_FREE( pic_container->autofit ); - pic_container->autofit = NULL; - } - } - - - FT_Error - autofit_module_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_UInt ss; - FT_Error error = AF_Err_Ok; - AFModulePIC* container; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->autofit = container; - - /* initialize pointer table - this is how the module usually expects this data */ - for ( ss = 0 ; ss < AF_SCRIPT_CLASSES_REC_COUNT ; ss++ ) - { - container->af_script_classes[ss] = &container->af_script_classes_rec[ss]; - } - container->af_script_classes[AF_SCRIPT_CLASSES_COUNT-1] = NULL; - - /* add call to initialization function when you add new scripts */ - ss = 0; - FT_Init_Class_af_dummy_script_class(&container->af_script_classes_rec[ss++]); -#ifdef FT_OPTION_AUTOFIT2 - FT_Init_Class_af_latin2_script_class(&container->af_script_classes_rec[ss++]); -#endif - FT_Init_Class_af_latin_script_class(&container->af_script_classes_rec[ss++]); - FT_Init_Class_af_cjk_script_class(&container->af_script_classes_rec[ss++]); - FT_Init_Class_af_indic_script_class(&container->af_script_classes_rec[ss++]); - - FT_Init_Class_af_autofitter_service(library, &container->af_autofitter_service); - -/*Exit:*/ - if(error) - autofit_module_class_pic_free(library); - return error; - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afpic.h b/android/jni/ndk_modules/freetype/src/autofit/afpic.h deleted file mode 100644 index 80e62d39..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afpic.h +++ /dev/null @@ -1,64 +0,0 @@ -/***************************************************************************/ -/* */ -/* afpic.h */ -/* */ -/* The FreeType position independent code services for autofit module. */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __AFPIC_H__ -#define __AFPIC_H__ - - -FT_BEGIN_HEADER - -#include FT_INTERNAL_PIC_H - -#ifndef FT_CONFIG_OPTION_PIC - -#define AF_SCRIPT_CLASSES_GET af_script_classes -#define AF_AF_AUTOFITTER_SERVICE_GET af_autofitter_service - -#else /* FT_CONFIG_OPTION_PIC */ - -#include "aftypes.h" - -/* increase these when you add new scripts, and update autofit_module_class_pic_init */ -#ifdef FT_OPTION_AUTOFIT2 - #define AF_SCRIPT_CLASSES_COUNT 6 -#else - #define AF_SCRIPT_CLASSES_COUNT 5 -#endif -#define AF_SCRIPT_CLASSES_REC_COUNT (AF_SCRIPT_CLASSES_COUNT-1) - - typedef struct AFModulePIC_ - { - AF_ScriptClass af_script_classes[AF_SCRIPT_CLASSES_COUNT]; - AF_ScriptClassRec af_script_classes_rec[AF_SCRIPT_CLASSES_REC_COUNT]; - FT_AutoHinter_ServiceRec af_autofitter_service; - } AFModulePIC; - -#define GET_PIC(lib) ((AFModulePIC*)((lib)->pic_container.autofit)) -#define AF_SCRIPT_CLASSES_GET (GET_PIC(FT_FACE_LIBRARY(globals->face))->af_script_classes) -#define AF_AF_AUTOFITTER_SERVICE_GET (GET_PIC(library)->af_autofitter_service) - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* __AFPIC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/aftypes.h b/android/jni/ndk_modules/freetype/src/autofit/aftypes.h deleted file mode 100644 index 5574f0c3..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/aftypes.h +++ /dev/null @@ -1,403 +0,0 @@ -/***************************************************************************/ -/* */ -/* aftypes.h */ -/* */ -/* Auto-fitter types (specification only). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /************************************************************************* - * - * The auto-fitter is a complete rewrite of the old auto-hinter. - * Its main feature is the ability to differentiate between different - * scripts in order to apply language-specific rules. - * - * The code has also been compartmentized into several entities that - * should make algorithmic experimentation easier than with the old - * code. - * - * Finally, we get rid of the Catharon license, since this code is - * released under the FreeType one. - * - *************************************************************************/ - - -#ifndef __AFTYPES_H__ -#define __AFTYPES_H__ - -#include <ft2build.h> - -#include FT_FREETYPE_H -#include FT_OUTLINE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** D E B U G G I N G *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define xxAF_USE_WARPER /* only define to use warp hinting */ -#define xxAF_DEBUG - -#ifdef AF_DEBUG - -#include FT_CONFIG_STANDARD_LIBRARY_H - -#define AF_LOG( x ) do { if ( _af_debug ) printf x; } while ( 0 ) - -extern int _af_debug; -extern int _af_debug_disable_horz_hints; -extern int _af_debug_disable_vert_hints; -extern int _af_debug_disable_blue_hints; -extern void* _af_debug_hints; - -#else /* !AF_DEBUG */ - -#define AF_LOG( x ) do { } while ( 0 ) /* nothing */ - -#endif /* !AF_DEBUG */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** U T I L I T Y S T U F F *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct AF_WidthRec_ - { - FT_Pos org; /* original position/width in font units */ - FT_Pos cur; /* current/scaled position/width in device sub-pixels */ - FT_Pos fit; /* current/fitted position/width in device sub-pixels */ - - } AF_WidthRec, *AF_Width; - - - FT_LOCAL( void ) - af_sort_pos( FT_UInt count, - FT_Pos* table ); - - FT_LOCAL( void ) - af_sort_widths( FT_UInt count, - AF_Width widths ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** A N G L E T Y P E S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * The auto-fitter doesn't need a very high angular accuracy; - * this allows us to speed up some computations considerably with a - * light Cordic algorithm (see afangles.c). - */ - - typedef FT_Int AF_Angle; - - -#define AF_ANGLE_PI 256 -#define AF_ANGLE_2PI ( AF_ANGLE_PI * 2 ) -#define AF_ANGLE_PI2 ( AF_ANGLE_PI / 2 ) -#define AF_ANGLE_PI4 ( AF_ANGLE_PI / 4 ) - - -#if 0 - /* - * compute the angle of a given 2-D vector - */ - FT_LOCAL( AF_Angle ) - af_angle_atan( FT_Pos dx, - FT_Pos dy ); - - - /* - * compute `angle2 - angle1'; the result is always within - * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1] - */ - FT_LOCAL( AF_Angle ) - af_angle_diff( AF_Angle angle1, - AF_Angle angle2 ); -#endif /* 0 */ - - -#define AF_ANGLE_DIFF( result, angle1, angle2 ) \ - FT_BEGIN_STMNT \ - AF_Angle _delta = (angle2) - (angle1); \ - \ - \ - _delta %= AF_ANGLE_2PI; \ - if ( _delta < 0 ) \ - _delta += AF_ANGLE_2PI; \ - \ - if ( _delta > AF_ANGLE_PI ) \ - _delta -= AF_ANGLE_2PI; \ - \ - result = _delta; \ - FT_END_STMNT - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** O U T L I N E S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* opaque handle to glyph-specific hints -- see `afhints.h' for more - * details - */ - typedef struct AF_GlyphHintsRec_* AF_GlyphHints; - - /* This structure is used to model an input glyph outline to - * the auto-hinter. The latter will set the `hints' field - * depending on the glyph's script. - */ - typedef struct AF_OutlineRec_ - { - FT_Face face; - FT_Outline outline; - FT_UInt outline_resolution; - - FT_Int advance; - FT_UInt metrics_resolution; - - AF_GlyphHints hints; - - } AF_OutlineRec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S C A L E R S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * A scaler models the target pixel device that will receive the - * auto-hinted glyph image. - */ - - typedef enum AF_ScalerFlags_ - { - AF_SCALER_FLAG_NO_HORIZONTAL = 1, /* disable horizontal hinting */ - AF_SCALER_FLAG_NO_VERTICAL = 2, /* disable vertical hinting */ - AF_SCALER_FLAG_NO_ADVANCE = 4 /* disable advance hinting */ - - } AF_ScalerFlags; - - - typedef struct AF_ScalerRec_ - { - FT_Face face; /* source font face */ - FT_Fixed x_scale; /* from font units to 1/64th device pixels */ - FT_Fixed y_scale; /* from font units to 1/64th device pixels */ - FT_Pos x_delta; /* in 1/64th device pixels */ - FT_Pos y_delta; /* in 1/64th device pixels */ - FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */ - FT_UInt32 flags; /* additional control flags, see above */ - - } AF_ScalerRec, *AF_Scaler; - - -#define AF_SCALER_EQUAL_SCALES( a, b ) \ - ( (a)->x_scale == (b)->x_scale && \ - (a)->y_scale == (b)->y_scale && \ - (a)->x_delta == (b)->x_delta && \ - (a)->y_delta == (b)->y_delta ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S C R I P T S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * The list of know scripts. Each different script corresponds to the - * following information: - * - * - A set of Unicode ranges to test whether the face supports the - * script. - * - * - A specific global analyzer that will compute global metrics - * specific to the script. - * - * - A specific glyph analyzer that will compute segments and - * edges for each glyph covered by the script. - * - * - A specific grid-fitting algorithm that will distort the - * scaled glyph outline according to the results of the glyph - * analyzer. - * - * Note that a given analyzer and/or grid-fitting algorithm can be - * used by more than one script. - */ - - typedef enum AF_Script_ - { - AF_SCRIPT_NONE = 0, - AF_SCRIPT_LATIN = 1, - AF_SCRIPT_CJK = 2, - AF_SCRIPT_INDIC = 3, -#ifdef FT_OPTION_AUTOFIT2 - AF_SCRIPT_LATIN2, -#endif - - /* add new scripts here. Don't forget to update the list in */ - /* `afglobal.c'. */ - - AF_SCRIPT_MAX /* do not remove */ - - } AF_Script; - - - typedef struct AF_ScriptClassRec_ const* AF_ScriptClass; - - typedef struct AF_ScriptMetricsRec_ - { - AF_ScriptClass clazz; - AF_ScalerRec scaler; - FT_Bool digits_have_same_width; - - } AF_ScriptMetricsRec, *AF_ScriptMetrics; - - - /* This function parses an FT_Face to compute global metrics for - * a specific script. - */ - typedef FT_Error - (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics metrics, - FT_Face face ); - - typedef void - (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics metrics, - AF_Scaler scaler ); - - typedef void - (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics metrics ); - - - typedef FT_Error - (*AF_Script_InitHintsFunc)( AF_GlyphHints hints, - AF_ScriptMetrics metrics ); - - typedef void - (*AF_Script_ApplyHintsFunc)( AF_GlyphHints hints, - FT_Outline* outline, - AF_ScriptMetrics metrics ); - - - typedef struct AF_Script_UniRangeRec_ - { - FT_UInt32 first; - FT_UInt32 last; - - } AF_Script_UniRangeRec; - -#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) } - - typedef const AF_Script_UniRangeRec *AF_Script_UniRange; - - - typedef struct AF_ScriptClassRec_ - { - AF_Script script; - AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */ - - FT_Offset script_metrics_size; - AF_Script_InitMetricsFunc script_metrics_init; - AF_Script_ScaleMetricsFunc script_metrics_scale; - AF_Script_DoneMetricsFunc script_metrics_done; - - AF_Script_InitHintsFunc script_hints_init; - AF_Script_ApplyHintsFunc script_hints_apply; - - } AF_ScriptClassRec; - -/* Declare and define vtables for classes */ -#ifndef FT_CONFIG_OPTION_PIC - -#define AF_DECLARE_SCRIPT_CLASS(script_class) \ - FT_CALLBACK_TABLE const AF_ScriptClassRec \ - script_class; - -#define AF_DEFINE_SCRIPT_CLASS(script_class, script_, ranges, m_size, \ - m_init, m_scale, m_done, h_init, h_apply) \ - FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec \ - script_class = \ - { \ - script_, \ - ranges, \ - \ - m_size, \ - \ - m_init, \ - m_scale, \ - m_done, \ - \ - h_init, \ - h_apply \ - }; - -#else - -#define AF_DECLARE_SCRIPT_CLASS(script_class) \ - FT_LOCAL(void) \ - FT_Init_Class_##script_class(AF_ScriptClassRec* ac); - -#define AF_DEFINE_SCRIPT_CLASS(script_class, script_, ranges, m_size, \ - m_init, m_scale, m_done, h_init, h_apply) \ - FT_LOCAL_DEF(void) \ - FT_Init_Class_##script_class(AF_ScriptClassRec* ac) \ - { \ - ac->script = script_; \ - ac->script_uni_ranges = ranges; \ - \ - ac->script_metrics_size = m_size; \ - \ - ac->script_metrics_init = m_init; \ - ac->script_metrics_scale = m_scale; \ - ac->script_metrics_done = m_done; \ - \ - ac->script_hints_init = h_init; \ - ac->script_hints_apply = h_apply; \ - } -#endif - - -/* */ - -FT_END_HEADER - -#endif /* __AFTYPES_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afwarp.c b/android/jni/ndk_modules/freetype/src/autofit/afwarp.c deleted file mode 100644 index f5bb9b18..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afwarp.c +++ /dev/null @@ -1,338 +0,0 @@ -/***************************************************************************/ -/* */ -/* afwarp.c */ -/* */ -/* Auto-fitter warping algorithm (body). */ -/* */ -/* Copyright 2006, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include "afwarp.h" - -#ifdef AF_USE_WARPER - -#if 1 - static const AF_WarpScore - af_warper_weights[64] = - { - 35, 32, 30, 25, 20, 15, 12, 10, 5, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -1, -2, -5, -8,-10,-10,-20,-20,-30,-30, - - -30,-30,-20,-20,-10,-10, -8, -5, -2, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 5, 10, 12, 15, 20, 25, 30, 32, - }; -#else - static const AF_WarpScore - af_warper_weights[64] = - { - 30, 20, 10, 5, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -1, -2, -2, -5, -5,-10,-10,-15,-20, - - -20,-15,-15,-10,-10, -5, -5, -2, -2, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 4, 5, 10, 20, - }; -#endif - - - static void - af_warper_compute_line_best( AF_Warper warper, - FT_Fixed scale, - FT_Pos delta, - FT_Pos xx1, - FT_Pos xx2, - AF_WarpScore base_distort, - AF_Segment segments, - FT_UInt num_segments ) - { - FT_Int idx_min, idx_max, idx0; - FT_UInt nn; - AF_WarpScore scores[65]; - - - for ( nn = 0; nn < 65; nn++ ) - scores[nn] = 0; - - idx0 = xx1 - warper->t1; - - /* compute minimum and maximum indices */ - { - FT_Pos xx1min = warper->x1min; - FT_Pos xx1max = warper->x1max; - FT_Pos w = xx2 - xx1; - - - if ( xx1min + w < warper->x2min ) - xx1min = warper->x2min - w; - - xx1max = warper->x1max; - if ( xx1max + w > warper->x2max ) - xx1max = warper->x2max - w; - - idx_min = xx1min - warper->t1; - idx_max = xx1max - warper->t1; - - if ( idx_min < 0 || idx_min > idx_max || idx_max > 64 ) - { - AF_LOG(( "invalid indices:\n" - " min=%d max=%d, xx1=%ld xx2=%ld,\n" - " x1min=%ld x1max=%ld, x2min=%ld x2max=%ld\n", - idx_min, idx_max, xx1, xx2, - warper->x1min, warper->x1max, - warper->x2min, warper->x2max )); - return; - } - } - - for ( nn = 0; nn < num_segments; nn++ ) - { - FT_Pos len = segments[nn].max_coord - segments[nn].min_coord; - FT_Pos y0 = FT_MulFix( segments[nn].pos, scale ) + delta; - FT_Pos y = y0 + ( idx_min - idx0 ); - FT_Int idx; - - - for ( idx = idx_min; idx <= idx_max; idx++, y++ ) - scores[idx] += af_warper_weights[y & 63] * len; - } - - /* find best score */ - { - FT_Int idx; - - - for ( idx = idx_min; idx <= idx_max; idx++ ) - { - AF_WarpScore score = scores[idx]; - AF_WarpScore distort = base_distort + ( idx - idx0 ); - - - if ( score > warper->best_score || - ( score == warper->best_score && - distort < warper->best_distort ) ) - { - warper->best_score = score; - warper->best_distort = distort; - warper->best_scale = scale; - warper->best_delta = delta + ( idx - idx0 ); - } - } - } - } - - - FT_LOCAL_DEF( void ) - af_warper_compute( AF_Warper warper, - AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed *a_scale, - FT_Pos *a_delta ) - { - AF_AxisHints axis; - AF_Point points; - - FT_Fixed org_scale; - FT_Pos org_delta; - - FT_UInt nn, num_points, num_segments; - FT_Int X1, X2; - FT_Int w; - - AF_WarpScore base_distort; - AF_Segment segments; - - - /* get original scaling transformation */ - if ( dim == AF_DIMENSION_VERT ) - { - org_scale = hints->y_scale; - org_delta = hints->y_delta; - } - else - { - org_scale = hints->x_scale; - org_delta = hints->x_delta; - } - - warper->best_scale = org_scale; - warper->best_delta = org_delta; - warper->best_score = INT_MIN; - warper->best_distort = 0; - - axis = &hints->axis[dim]; - segments = axis->segments; - num_segments = axis->num_segments; - points = hints->points; - num_points = hints->num_points; - - *a_scale = org_scale; - *a_delta = org_delta; - - /* get X1 and X2, minimum and maximum in original coordinates */ - if ( num_segments < 1 ) - return; - -#if 1 - X1 = X2 = points[0].fx; - for ( nn = 1; nn < num_points; nn++ ) - { - FT_Int X = points[nn].fx; - - - if ( X < X1 ) - X1 = X; - if ( X > X2 ) - X2 = X; - } -#else - X1 = X2 = segments[0].pos; - for ( nn = 1; nn < num_segments; nn++ ) - { - FT_Int X = segments[nn].pos; - - - if ( X < X1 ) - X1 = X; - if ( X > X2 ) - X2 = X; - } -#endif - - if ( X1 >= X2 ) - return; - - warper->x1 = FT_MulFix( X1, org_scale ) + org_delta; - warper->x2 = FT_MulFix( X2, org_scale ) + org_delta; - - warper->t1 = AF_WARPER_FLOOR( warper->x1 ); - warper->t2 = AF_WARPER_CEIL( warper->x2 ); - - warper->x1min = warper->x1 & ~31; - warper->x1max = warper->x1min + 32; - warper->x2min = warper->x2 & ~31; - warper->x2max = warper->x2min + 32; - - if ( warper->x1max > warper->x2 ) - warper->x1max = warper->x2; - - if ( warper->x2min < warper->x1 ) - warper->x2min = warper->x1; - - warper->w0 = warper->x2 - warper->x1; - - if ( warper->w0 <= 64 ) - { - warper->x1max = warper->x1; - warper->x2min = warper->x2; - } - - warper->wmin = warper->x2min - warper->x1max; - warper->wmax = warper->x2max - warper->x1min; - -#if 1 - { - int margin = 16; - - - if ( warper->w0 <= 128 ) - { - margin = 8; - if ( warper->w0 <= 96 ) - margin = 4; - } - - if ( warper->wmin < warper->w0 - margin ) - warper->wmin = warper->w0 - margin; - - if ( warper->wmax > warper->w0 + margin ) - warper->wmax = warper->w0 + margin; - } - - if ( warper->wmin < warper->w0 * 3 / 4 ) - warper->wmin = warper->w0 * 3 / 4; - - if ( warper->wmax > warper->w0 * 5 / 4 ) - warper->wmax = warper->w0 * 5 / 4; -#else - /* no scaling, just translation */ - warper->wmin = warper->wmax = warper->w0; -#endif - - for ( w = warper->wmin; w <= warper->wmax; w++ ) - { - FT_Fixed new_scale; - FT_Pos new_delta; - FT_Pos xx1, xx2; - - - xx1 = warper->x1; - xx2 = warper->x2; - if ( w >= warper->w0 ) - { - xx1 -= w - warper->w0; - if ( xx1 < warper->x1min ) - { - xx2 += warper->x1min - xx1; - xx1 = warper->x1min; - } - } - else - { - xx1 -= w - warper->w0; - if ( xx1 > warper->x1max ) - { - xx2 -= xx1 - warper->x1max; - xx1 = warper->x1max; - } - } - - if ( xx1 < warper->x1 ) - base_distort = warper->x1 - xx1; - else - base_distort = xx1 - warper->x1; - - if ( xx2 < warper->x2 ) - base_distort += warper->x2 - xx2; - else - base_distort += xx2 - warper->x2; - - base_distort *= 10; - - new_scale = org_scale + FT_DivFix( w - warper->w0, X2 - X1 ); - new_delta = xx1 - FT_MulFix( X1, new_scale ); - - af_warper_compute_line_best( warper, new_scale, new_delta, xx1, xx2, - base_distort, - segments, num_segments ); - } - - { - FT_Fixed best_scale = warper->best_scale; - FT_Pos best_delta = warper->best_delta; - - - hints->xmin_delta = FT_MulFix( X1, best_scale - org_scale ) - + best_delta; - hints->xmax_delta = FT_MulFix( X2, best_scale - org_scale ) - + best_delta; - - *a_scale = best_scale; - *a_delta = best_delta; - } - } - -#else /* !AF_USE_WARPER */ - -char af_warper_dummy = 0; /* make compiler happy */ - -#endif /* !AF_USE_WARPER */ - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/afwarp.h b/android/jni/ndk_modules/freetype/src/autofit/afwarp.h deleted file mode 100644 index 7343fdd5..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/afwarp.h +++ /dev/null @@ -1,64 +0,0 @@ -/***************************************************************************/ -/* */ -/* afwarp.h */ -/* */ -/* Auto-fitter warping algorithm (specification). */ -/* */ -/* Copyright 2006, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __AFWARP_H__ -#define __AFWARP_H__ - -#include "afhints.h" - -FT_BEGIN_HEADER - -#define AF_WARPER_SCALE - -#define AF_WARPER_FLOOR( x ) ( (x) & ~63 ) -#define AF_WARPER_CEIL( x ) AF_WARPER_FLOOR( (x) + 63 ) - - - typedef FT_Int32 AF_WarpScore; - - typedef struct AF_WarperRec_ - { - FT_Pos x1, x2; - FT_Pos t1, t2; - FT_Pos x1min, x1max; - FT_Pos x2min, x2max; - FT_Pos w0, wmin, wmax; - - FT_Fixed best_scale; - FT_Pos best_delta; - AF_WarpScore best_score; - AF_WarpScore best_distort; - - } AF_WarperRec, *AF_Warper; - - - FT_LOCAL( void ) - af_warper_compute( AF_Warper warper, - AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed *a_scale, - FT_Fixed *a_delta ); - - -FT_END_HEADER - - -#endif /* __AFWARP_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/autofit/autofit.c b/android/jni/ndk_modules/freetype/src/autofit/autofit.c deleted file mode 100644 index 83b613e7..00000000 --- a/android/jni/ndk_modules/freetype/src/autofit/autofit.c +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* autofit.c */ -/* */ -/* Auto-fitter module (body). */ -/* */ -/* Copyright 2003, 2004, 2005, 2006, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT -#include <ft2build.h> -#include "afpic.c" -#include "afangles.c" -#include "afglobal.c" -#include "afhints.c" - -#include "afdummy.c" -#include "aflatin.c" -#ifdef FT_OPTION_AUTOFIT2 -#include "aflatin2.c" -#endif -#include "afcjk.c" -#include "afindic.c" - -#include "afloader.c" -#include "afmodule.c" - -#ifdef AF_USE_WARPER -#include "afwarp.c" -#endif - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/basepic.c b/android/jni/ndk_modules/freetype/src/base/basepic.c deleted file mode 100644 index c0bccb69..00000000 --- a/android/jni/ndk_modules/freetype/src/base/basepic.c +++ /dev/null @@ -1,83 +0,0 @@ -/***************************************************************************/ -/* */ -/* basepic.c */ -/* */ -/* The FreeType position independent code services for base. */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "basepic.h" - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from ftglyph.c */ - void FT_Init_Class_ft_outline_glyph_class(FT_Glyph_Class*); - void FT_Init_Class_ft_bitmap_glyph_class(FT_Glyph_Class*); - - /* forward declaration of PIC init functions from ftinit.c */ - FT_Error ft_create_default_module_classes(FT_Library); - void ft_destroy_default_module_classes(FT_Library); - - void - ft_base_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - if ( pic_container->base ) - { - /* Destroy default module classes (in case FT_Add_Default_Modules was used) */ - ft_destroy_default_module_classes( library ); - - FT_FREE( pic_container->base ); - pic_container->base = NULL; - } - } - - - FT_Error - ft_base_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - BasePIC* container; - FT_Memory memory = library->memory; - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof(*container) ); - pic_container->base = container; - - /* initialize default modules list and pointers */ - error = ft_create_default_module_classes( library ); - if ( error ) - goto Exit; - - /* initialize pointer table - this is how the module usually expects this data */ - FT_Init_Class_ft_outline_glyph_class(&container->ft_outline_glyph_class); - FT_Init_Class_ft_bitmap_glyph_class(&container->ft_bitmap_glyph_class); - -Exit: - if(error) - ft_base_pic_free(library); - return error; - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/basepic.h b/android/jni/ndk_modules/freetype/src/base/basepic.h deleted file mode 100644 index bb177457..00000000 --- a/android/jni/ndk_modules/freetype/src/base/basepic.h +++ /dev/null @@ -1,62 +0,0 @@ -/***************************************************************************/ -/* */ -/* basepic.h */ -/* */ -/* The FreeType position independent code services for base. */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __BASEPIC_H__ -#define __BASEPIC_H__ - - -FT_BEGIN_HEADER - -#include FT_INTERNAL_PIC_H - -#ifndef FT_CONFIG_OPTION_PIC -#define FT_OUTLINE_GLYPH_CLASS_GET &ft_outline_glyph_class -#define FT_BITMAP_GLYPH_CLASS_GET &ft_bitmap_glyph_class -#define FT_DEFAULT_MODULES_GET ft_default_modules - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_GLYPH_H - - typedef struct BasePIC_ - { - FT_Module_Class** default_module_classes; - FT_Glyph_Class ft_outline_glyph_class; - FT_Glyph_Class ft_bitmap_glyph_class; - } BasePIC; - -#define GET_PIC(lib) ((BasePIC*)((lib)->pic_container.base)) -#define FT_OUTLINE_GLYPH_CLASS_GET (&GET_PIC(library)->ft_outline_glyph_class) -#define FT_BITMAP_GLYPH_CLASS_GET (&GET_PIC(library)->ft_bitmap_glyph_class) -#define FT_DEFAULT_MODULES_GET (GET_PIC(library)->default_module_classes) - - void - ft_base_pic_free( FT_Library library ); - - FT_Error - ft_base_pic_init( FT_Library library ); - -#endif /* FT_CONFIG_OPTION_PIC */ - /* */ - -FT_END_HEADER - -#endif /* __BASEPIC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftadvanc.c b/android/jni/ndk_modules/freetype/src/base/ftadvanc.c deleted file mode 100644 index 8ab7fcb9..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftadvanc.c +++ /dev/null @@ -1,163 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftadvanc.c */ -/* */ -/* Quick computation of advance widths (body). */ -/* */ -/* Copyright 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_ADVANCES_H -#include FT_INTERNAL_OBJECTS_H - - - static FT_Error - _ft_face_scale_advances( FT_Face face, - FT_Fixed* advances, - FT_UInt count, - FT_Int32 flags ) - { - FT_Fixed scale; - FT_UInt nn; - - - if ( flags & FT_LOAD_NO_SCALE ) - return FT_Err_Ok; - - if ( face->size == NULL ) - return FT_Err_Invalid_Size_Handle; - - if ( flags & FT_LOAD_VERTICAL_LAYOUT ) - scale = face->size->metrics.y_scale; - else - scale = face->size->metrics.x_scale; - - /* this must be the same scaling as to get linear{Hori,Vert}Advance */ - /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c) */ - - for ( nn = 0; nn < count; nn++ ) - advances[nn] = FT_MulDiv( advances[nn], scale, 64 ); - - return FT_Err_Ok; - } - - - /* at the moment, we can perform fast advance retrieval only in */ - /* the following cases: */ - /* */ - /* - unscaled load */ - /* - unhinted load */ - /* - light-hinted load */ - -#define LOAD_ADVANCE_FAST_CHECK( flags ) \ - ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \ - FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT ) - - - /* documentation is in ftadvanc.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Advance( FT_Face face, - FT_UInt gindex, - FT_Int32 flags, - FT_Fixed *padvance ) - { - FT_Face_GetAdvancesFunc func; - - - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - if ( gindex >= (FT_UInt)face->num_glyphs ) - return FT_Err_Invalid_Glyph_Index; - - func = face->driver->clazz->get_advances; - if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) ) - { - FT_Error error; - - - error = func( face, gindex, 1, flags, padvance ); - if ( !error ) - return _ft_face_scale_advances( face, padvance, 1, flags ); - - if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) ) - return error; - } - - return FT_Get_Advances( face, gindex, 1, flags, padvance ); - } - - - /* documentation is in ftadvanc.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Advances( FT_Face face, - FT_UInt start, - FT_UInt count, - FT_Int32 flags, - FT_Fixed *padvances ) - { - FT_Face_GetAdvancesFunc func; - FT_UInt num, end, nn; - FT_Error error = FT_Err_Ok; - - - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - num = (FT_UInt)face->num_glyphs; - end = start + count; - if ( start >= num || end < start || end > num ) - return FT_Err_Invalid_Glyph_Index; - - if ( count == 0 ) - return FT_Err_Ok; - - func = face->driver->clazz->get_advances; - if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) ) - { - error = func( face, start, count, flags, padvances ); - if ( !error ) - goto Exit; - - if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) ) - return error; - } - - error = FT_Err_Ok; - - if ( flags & FT_ADVANCE_FLAG_FAST_ONLY ) - return FT_Err_Unimplemented_Feature; - - flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; - for ( nn = 0; nn < count; nn++ ) - { - error = FT_Load_Glyph( face, start + nn, flags ); - if ( error ) - break; - - padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) - ? face->glyph->advance.y - : face->glyph->advance.x; - } - - if ( error ) - return error; - - Exit: - return _ft_face_scale_advances( face, padvances, count, flags ); - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftapi.c b/android/jni/ndk_modules/freetype/src/base/ftapi.c deleted file mode 100644 index 8914d1f4..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftapi.c +++ /dev/null @@ -1,121 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftapi.c */ -/* */ -/* The FreeType compatibility functions (body). */ -/* */ -/* Copyright 2002 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_LIST_H -#include FT_OUTLINE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TABLES_H -#include FT_OUTLINE_H - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** C O M P A T I B I L I T Y ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* backwards compatibility API */ - - FT_BASE_DEF( void ) - FT_New_Memory_Stream( FT_Library library, - FT_Byte* base, - FT_ULong size, - FT_Stream stream ) - { - FT_UNUSED( library ); - - FT_Stream_OpenMemory( stream, base, size ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Seek_Stream( FT_Stream stream, - FT_ULong pos ) - { - return FT_Stream_Seek( stream, pos ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Skip_Stream( FT_Stream stream, - FT_Long distance ) - { - return FT_Stream_Skip( stream, distance ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Read_Stream( FT_Stream stream, - FT_Byte* buffer, - FT_ULong count ) - { - return FT_Stream_Read( stream, buffer, count ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Read_Stream_At( FT_Stream stream, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ) - { - return FT_Stream_ReadAt( stream, pos, buffer, count ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Extract_Frame( FT_Stream stream, - FT_ULong count, - FT_Byte** pbytes ) - { - return FT_Stream_ExtractFrame( stream, count, pbytes ); - } - - - FT_BASE_DEF( void ) - FT_Release_Frame( FT_Stream stream, - FT_Byte** pbytes ) - { - FT_Stream_ReleaseFrame( stream, pbytes ); - } - - FT_BASE_DEF( FT_Error ) - FT_Access_Frame( FT_Stream stream, - FT_ULong count ) - { - return FT_Stream_EnterFrame( stream, count ); - } - - - FT_BASE_DEF( void ) - FT_Forget_Frame( FT_Stream stream ) - { - FT_Stream_ExitFrame( stream ); - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftbase.c b/android/jni/ndk_modules/freetype/src/base/ftbase.c deleted file mode 100644 index 6a27ea95..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftbase.c +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbase.c */ -/* */ -/* Single object library component (body only). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include "ftpic.c" -#include "basepic.c" -#include "ftadvanc.c" -#include "ftcalc.c" -#include "ftdbgmem.c" -#include "ftgloadr.c" -#include "ftobjs.c" -#include "ftoutln.c" -#include "ftrfork.c" -#include "ftsnames.c" -#include "ftstream.c" -#include "fttrigon.c" -#include "ftutil.c" - -#if defined( FT_MACINTOSH ) && !defined ( DARWIN_NO_CARBON ) -#include "ftmac.c" -#endif - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftbase.h b/android/jni/ndk_modules/freetype/src/base/ftbase.h deleted file mode 100644 index 1dc49f3b..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftbase.h +++ /dev/null @@ -1,57 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbase.h */ -/* */ -/* The FreeType private functions used in base module (specification). */ -/* */ -/* Copyright 2008, 2010 by */ -/* David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTBASE_H__ -#define __FTBASE_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - - /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */ - /* font, and try to load a face specified by the face_index. */ - FT_LOCAL( FT_Error ) - open_face_PS_from_sfnt_stream( FT_Library library, - FT_Stream stream, - FT_Long face_index, - FT_Int num_params, - FT_Parameter *params, - FT_Face *aface ); - - - /* Create a new FT_Face given a buffer and a driver name. */ - /* From ftmac.c. */ - FT_LOCAL( FT_Error ) - open_face_from_buffer( FT_Library library, - FT_Byte* base, - FT_ULong size, - FT_Long face_index, - const char* driver_name, - FT_Face *aface ); - - -FT_END_HEADER - -#endif /* __FTBASE_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftbbox.c b/android/jni/ndk_modules/freetype/src/base/ftbbox.c deleted file mode 100644 index 4b8e9112..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftbbox.c +++ /dev/null @@ -1,662 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbbox.c */ -/* */ -/* FreeType bbox computation (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2004, 2006, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This component has a _single_ role: to compute exact outline bounding */ - /* boxes. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_BBOX_H -#include FT_IMAGE_H -#include FT_OUTLINE_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_OBJECTS_H - - - typedef struct TBBox_Rec_ - { - FT_Vector last; - FT_BBox bbox; - - } TBBox_Rec; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* BBox_Move_To */ - /* */ - /* <Description> */ - /* This function is used as a `move_to' and `line_to' emitter during */ - /* FT_Outline_Decompose(). It simply records the destination point */ - /* in `user->last'; no further computations are necessary since we */ - /* use the cbox as the starting bbox which must be refined. */ - /* */ - /* <Input> */ - /* to :: A pointer to the destination vector. */ - /* */ - /* <InOut> */ - /* user :: A pointer to the current walk context. */ - /* */ - /* <Return> */ - /* Always 0. Needed for the interface only. */ - /* */ - static int - BBox_Move_To( FT_Vector* to, - TBBox_Rec* user ) - { - user->last = *to; - - return 0; - } - - -#define CHECK_X( p, bbox ) \ - ( p->x < bbox.xMin || p->x > bbox.xMax ) - -#define CHECK_Y( p, bbox ) \ - ( p->y < bbox.yMin || p->y > bbox.yMax ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* BBox_Conic_Check */ - /* */ - /* <Description> */ - /* Finds the extrema of a 1-dimensional conic Bezier curve and update */ - /* a bounding range. This version uses direct computation, as it */ - /* doesn't need square roots. */ - /* */ - /* <Input> */ - /* y1 :: The start coordinate. */ - /* */ - /* y2 :: The coordinate of the control point. */ - /* */ - /* y3 :: The end coordinate. */ - /* */ - /* <InOut> */ - /* min :: The address of the current minimum. */ - /* */ - /* max :: The address of the current maximum. */ - /* */ - static void - BBox_Conic_Check( FT_Pos y1, - FT_Pos y2, - FT_Pos y3, - FT_Pos* min, - FT_Pos* max ) - { - if ( y1 <= y3 && y2 == y1 ) /* flat arc */ - goto Suite; - - if ( y1 < y3 ) - { - if ( y2 >= y1 && y2 <= y3 ) /* ascending arc */ - goto Suite; - } - else - { - if ( y2 >= y3 && y2 <= y1 ) /* descending arc */ - { - y2 = y1; - y1 = y3; - y3 = y2; - goto Suite; - } - } - - y1 = y3 = y1 - FT_MulDiv( y2 - y1, y2 - y1, y1 - 2*y2 + y3 ); - - Suite: - if ( y1 < *min ) *min = y1; - if ( y3 > *max ) *max = y3; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* BBox_Conic_To */ - /* */ - /* <Description> */ - /* This function is used as a `conic_to' emitter during */ - /* FT_Outline_Decompose(). It checks a conic Bezier curve with the */ - /* current bounding box, and computes its extrema if necessary to */ - /* update it. */ - /* */ - /* <Input> */ - /* control :: A pointer to a control point. */ - /* */ - /* to :: A pointer to the destination vector. */ - /* */ - /* <InOut> */ - /* user :: The address of the current walk context. */ - /* */ - /* <Return> */ - /* Always 0. Needed for the interface only. */ - /* */ - /* <Note> */ - /* In the case of a non-monotonous arc, we compute directly the */ - /* extremum coordinates, as it is sufficiently fast. */ - /* */ - static int - BBox_Conic_To( FT_Vector* control, - FT_Vector* to, - TBBox_Rec* user ) - { - /* we don't need to check `to' since it is always an `on' point, thus */ - /* within the bbox */ - - if ( CHECK_X( control, user->bbox ) ) - BBox_Conic_Check( user->last.x, - control->x, - to->x, - &user->bbox.xMin, - &user->bbox.xMax ); - - if ( CHECK_Y( control, user->bbox ) ) - BBox_Conic_Check( user->last.y, - control->y, - to->y, - &user->bbox.yMin, - &user->bbox.yMax ); - - user->last = *to; - - return 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* BBox_Cubic_Check */ - /* */ - /* <Description> */ - /* Finds the extrema of a 1-dimensional cubic Bezier curve and */ - /* updates a bounding range. This version uses splitting because we */ - /* don't want to use square roots and extra accuracy. */ - /* */ - /* <Input> */ - /* p1 :: The start coordinate. */ - /* */ - /* p2 :: The coordinate of the first control point. */ - /* */ - /* p3 :: The coordinate of the second control point. */ - /* */ - /* p4 :: The end coordinate. */ - /* */ - /* <InOut> */ - /* min :: The address of the current minimum. */ - /* */ - /* max :: The address of the current maximum. */ - /* */ - -#if 0 - - static void - BBox_Cubic_Check( FT_Pos p1, - FT_Pos p2, - FT_Pos p3, - FT_Pos p4, - FT_Pos* min, - FT_Pos* max ) - { - FT_Pos stack[32*3 + 1], *arc; - - - arc = stack; - - arc[0] = p1; - arc[1] = p2; - arc[2] = p3; - arc[3] = p4; - - do - { - FT_Pos y1 = arc[0]; - FT_Pos y2 = arc[1]; - FT_Pos y3 = arc[2]; - FT_Pos y4 = arc[3]; - - - if ( y1 == y4 ) - { - if ( y1 == y2 && y1 == y3 ) /* flat */ - goto Test; - } - else if ( y1 < y4 ) - { - if ( y2 >= y1 && y2 <= y4 && y3 >= y1 && y3 <= y4 ) /* ascending */ - goto Test; - } - else - { - if ( y2 >= y4 && y2 <= y1 && y3 >= y4 && y3 <= y1 ) /* descending */ - { - y2 = y1; - y1 = y4; - y4 = y2; - goto Test; - } - } - - /* unknown direction -- split the arc in two */ - arc[6] = y4; - arc[1] = y1 = ( y1 + y2 ) / 2; - arc[5] = y4 = ( y4 + y3 ) / 2; - y2 = ( y2 + y3 ) / 2; - arc[2] = y1 = ( y1 + y2 ) / 2; - arc[4] = y4 = ( y4 + y2 ) / 2; - arc[3] = ( y1 + y4 ) / 2; - - arc += 3; - goto Suite; - - Test: - if ( y1 < *min ) *min = y1; - if ( y4 > *max ) *max = y4; - arc -= 3; - - Suite: - ; - } while ( arc >= stack ); - } - -#else - - static void - test_cubic_extrema( FT_Pos y1, - FT_Pos y2, - FT_Pos y3, - FT_Pos y4, - FT_Fixed u, - FT_Pos* min, - FT_Pos* max ) - { - /* FT_Pos a = y4 - 3*y3 + 3*y2 - y1; */ - FT_Pos b = y3 - 2*y2 + y1; - FT_Pos c = y2 - y1; - FT_Pos d = y1; - FT_Pos y; - FT_Fixed uu; - - FT_UNUSED ( y4 ); - - - /* The polynomial is */ - /* */ - /* P(x) = a*x^3 + 3b*x^2 + 3c*x + d , */ - /* */ - /* dP/dx = 3a*x^2 + 6b*x + 3c . */ - /* */ - /* However, we also have */ - /* */ - /* dP/dx(u) = 0 , */ - /* */ - /* which implies by subtraction that */ - /* */ - /* P(u) = b*u^2 + 2c*u + d . */ - - if ( u > 0 && u < 0x10000L ) - { - uu = FT_MulFix( u, u ); - y = d + FT_MulFix( c, 2*u ) + FT_MulFix( b, uu ); - - if ( y < *min ) *min = y; - if ( y > *max ) *max = y; - } - } - - - static void - BBox_Cubic_Check( FT_Pos y1, - FT_Pos y2, - FT_Pos y3, - FT_Pos y4, - FT_Pos* min, - FT_Pos* max ) - { - /* always compare first and last points */ - if ( y1 < *min ) *min = y1; - else if ( y1 > *max ) *max = y1; - - if ( y4 < *min ) *min = y4; - else if ( y4 > *max ) *max = y4; - - /* now, try to see if there are split points here */ - if ( y1 <= y4 ) - { - /* flat or ascending arc test */ - if ( y1 <= y2 && y2 <= y4 && y1 <= y3 && y3 <= y4 ) - return; - } - else /* y1 > y4 */ - { - /* descending arc test */ - if ( y1 >= y2 && y2 >= y4 && y1 >= y3 && y3 >= y4 ) - return; - } - - /* There are some split points. Find them. */ - { - FT_Pos a = y4 - 3*y3 + 3*y2 - y1; - FT_Pos b = y3 - 2*y2 + y1; - FT_Pos c = y2 - y1; - FT_Pos d; - FT_Fixed t; - - - /* We need to solve `ax^2+2bx+c' here, without floating points! */ - /* The trick is to normalize to a different representation in order */ - /* to use our 16.16 fixed point routines. */ - /* */ - /* We compute FT_MulFix(b,b) and FT_MulFix(a,c) after normalization. */ - /* These values must fit into a single 16.16 value. */ - /* */ - /* We normalize a, b, and c to `8.16' fixed float values to ensure */ - /* that its product is held in a `16.16' value. */ - - { - FT_ULong t1, t2; - int shift = 0; - - - /* The following computation is based on the fact that for */ - /* any value `y', if `n' is the position of the most */ - /* significant bit of `abs(y)' (starting from 0 for the */ - /* least significant bit), then `y' is in the range */ - /* */ - /* -2^n..2^n-1 */ - /* */ - /* We want to shift `a', `b', and `c' concurrently in order */ - /* to ensure that they all fit in 8.16 values, which maps */ - /* to the integer range `-2^23..2^23-1'. */ - /* */ - /* Necessarily, we need to shift `a', `b', and `c' so that */ - /* the most significant bit of its absolute values is at */ - /* _most_ at position 23. */ - /* */ - /* We begin by computing `t1' as the bitwise `OR' of the */ - /* absolute values of `a', `b', `c'. */ - - t1 = (FT_ULong)( ( a >= 0 ) ? a : -a ); - t2 = (FT_ULong)( ( b >= 0 ) ? b : -b ); - t1 |= t2; - t2 = (FT_ULong)( ( c >= 0 ) ? c : -c ); - t1 |= t2; - - /* Now we can be sure that the most significant bit of `t1' */ - /* is the most significant bit of either `a', `b', or `c', */ - /* depending on the greatest integer range of the particular */ - /* variable. */ - /* */ - /* Next, we compute the `shift', by shifting `t1' as many */ - /* times as necessary to move its MSB to position 23. This */ - /* corresponds to a value of `t1' that is in the range */ - /* 0x40_0000..0x7F_FFFF. */ - /* */ - /* Finally, we shift `a', `b', and `c' by the same amount. */ - /* This ensures that all values are now in the range */ - /* -2^23..2^23, i.e., they are now expressed as 8.16 */ - /* fixed-float numbers. This also means that we are using */ - /* 24 bits of precision to compute the zeros, independently */ - /* of the range of the original polynomial coefficients. */ - /* */ - /* This algorithm should ensure reasonably accurate values */ - /* for the zeros. Note that they are only expressed with */ - /* 16 bits when computing the extrema (the zeros need to */ - /* be in 0..1 exclusive to be considered part of the arc). */ - - if ( t1 == 0 ) /* all coefficients are 0! */ - return; - - if ( t1 > 0x7FFFFFUL ) - { - do - { - shift++; - t1 >>= 1; - - } while ( t1 > 0x7FFFFFUL ); - - /* this loses some bits of precision, but we use 24 of them */ - /* for the computation anyway */ - a >>= shift; - b >>= shift; - c >>= shift; - } - else if ( t1 < 0x400000UL ) - { - do - { - shift++; - t1 <<= 1; - - } while ( t1 < 0x400000UL ); - - a <<= shift; - b <<= shift; - c <<= shift; - } - } - - /* handle a == 0 */ - if ( a == 0 ) - { - if ( b != 0 ) - { - t = - FT_DivFix( c, b ) / 2; - test_cubic_extrema( y1, y2, y3, y4, t, min, max ); - } - } - else - { - /* solve the equation now */ - d = FT_MulFix( b, b ) - FT_MulFix( a, c ); - if ( d < 0 ) - return; - - if ( d == 0 ) - { - /* there is a single split point at -b/a */ - t = - FT_DivFix( b, a ); - test_cubic_extrema( y1, y2, y3, y4, t, min, max ); - } - else - { - /* there are two solutions; we need to filter them */ - d = FT_SqrtFixed( (FT_Int32)d ); - t = - FT_DivFix( b - d, a ); - test_cubic_extrema( y1, y2, y3, y4, t, min, max ); - - t = - FT_DivFix( b + d, a ); - test_cubic_extrema( y1, y2, y3, y4, t, min, max ); - } - } - } - } - -#endif - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* BBox_Cubic_To */ - /* */ - /* <Description> */ - /* This function is used as a `cubic_to' emitter during */ - /* FT_Outline_Decompose(). It checks a cubic Bezier curve with the */ - /* current bounding box, and computes its extrema if necessary to */ - /* update it. */ - /* */ - /* <Input> */ - /* control1 :: A pointer to the first control point. */ - /* */ - /* control2 :: A pointer to the second control point. */ - /* */ - /* to :: A pointer to the destination vector. */ - /* */ - /* <InOut> */ - /* user :: The address of the current walk context. */ - /* */ - /* <Return> */ - /* Always 0. Needed for the interface only. */ - /* */ - /* <Note> */ - /* In the case of a non-monotonous arc, we don't compute directly */ - /* extremum coordinates, we subdivide instead. */ - /* */ - static int - BBox_Cubic_To( FT_Vector* control1, - FT_Vector* control2, - FT_Vector* to, - TBBox_Rec* user ) - { - /* we don't need to check `to' since it is always an `on' point, thus */ - /* within the bbox */ - - if ( CHECK_X( control1, user->bbox ) || - CHECK_X( control2, user->bbox ) ) - BBox_Cubic_Check( user->last.x, - control1->x, - control2->x, - to->x, - &user->bbox.xMin, - &user->bbox.xMax ); - - if ( CHECK_Y( control1, user->bbox ) || - CHECK_Y( control2, user->bbox ) ) - BBox_Cubic_Check( user->last.y, - control1->y, - control2->y, - to->y, - &user->bbox.yMin, - &user->bbox.yMax ); - - user->last = *to; - - return 0; - } - -FT_DEFINE_OUTLINE_FUNCS(bbox_interface, - (FT_Outline_MoveTo_Func) BBox_Move_To, - (FT_Outline_LineTo_Func) BBox_Move_To, - (FT_Outline_ConicTo_Func)BBox_Conic_To, - (FT_Outline_CubicTo_Func)BBox_Cubic_To, - 0, 0 - ) - - /* documentation is in ftbbox.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Get_BBox( FT_Outline* outline, - FT_BBox *abbox ) - { - FT_BBox cbox; - FT_BBox bbox; - FT_Vector* vec; - FT_UShort n; - - - if ( !abbox ) - return FT_Err_Invalid_Argument; - - if ( !outline ) - return FT_Err_Invalid_Outline; - - /* if outline is empty, return (0,0,0,0) */ - if ( outline->n_points == 0 || outline->n_contours <= 0 ) - { - abbox->xMin = abbox->xMax = 0; - abbox->yMin = abbox->yMax = 0; - return 0; - } - - /* We compute the control box as well as the bounding box of */ - /* all `on' points in the outline. Then, if the two boxes */ - /* coincide, we exit immediately. */ - - vec = outline->points; - bbox.xMin = bbox.xMax = cbox.xMin = cbox.xMax = vec->x; - bbox.yMin = bbox.yMax = cbox.yMin = cbox.yMax = vec->y; - vec++; - - for ( n = 1; n < outline->n_points; n++ ) - { - FT_Pos x = vec->x; - FT_Pos y = vec->y; - - - /* update control box */ - if ( x < cbox.xMin ) cbox.xMin = x; - if ( x > cbox.xMax ) cbox.xMax = x; - - if ( y < cbox.yMin ) cbox.yMin = y; - if ( y > cbox.yMax ) cbox.yMax = y; - - if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON ) - { - /* update bbox for `on' points only */ - if ( x < bbox.xMin ) bbox.xMin = x; - if ( x > bbox.xMax ) bbox.xMax = x; - - if ( y < bbox.yMin ) bbox.yMin = y; - if ( y > bbox.yMax ) bbox.yMax = y; - } - - vec++; - } - - /* test two boxes for equality */ - if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax || - cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax ) - { - /* the two boxes are different, now walk over the outline to */ - /* get the Bezier arc extrema. */ - - FT_Error error; - TBBox_Rec user; - -#ifdef FT_CONFIG_OPTION_PIC - FT_Outline_Funcs bbox_interface; - Init_Class_bbox_interface(&bbox_interface); -#endif - - user.bbox = bbox; - - error = FT_Outline_Decompose( outline, &bbox_interface, &user ); - if ( error ) - return error; - - *abbox = user.bbox; - } - else - *abbox = bbox; - - return FT_Err_Ok; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftbitmap.c b/android/jni/ndk_modules/freetype/src/base/ftbitmap.c deleted file mode 100644 index 46fcce61..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftbitmap.c +++ /dev/null @@ -1,663 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftbitmap.c */ -/* */ -/* FreeType utility functions for bitmaps (body). */ -/* */ -/* Copyright 2004, 2005, 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_BITMAP_H -#include FT_IMAGE_H -#include FT_INTERNAL_OBJECTS_H - - - static - const FT_Bitmap null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 }; - - - /* documentation is in ftbitmap.h */ - - FT_EXPORT_DEF( void ) - FT_Bitmap_New( FT_Bitmap *abitmap ) - { - *abitmap = null_bitmap; - } - - - /* documentation is in ftbitmap.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Bitmap_Copy( FT_Library library, - const FT_Bitmap *source, - FT_Bitmap *target) - { - FT_Memory memory = library->memory; - FT_Error error = FT_Err_Ok; - FT_Int pitch = source->pitch; - FT_ULong size; - - - if ( source == target ) - return FT_Err_Ok; - - if ( source->buffer == NULL ) - { - *target = *source; - - return FT_Err_Ok; - } - - if ( pitch < 0 ) - pitch = -pitch; - size = (FT_ULong)( pitch * source->rows ); - - if ( target->buffer ) - { - FT_Int target_pitch = target->pitch; - FT_ULong target_size; - - - if ( target_pitch < 0 ) - target_pitch = -target_pitch; - target_size = (FT_ULong)( target_pitch * target->rows ); - - if ( target_size != size ) - (void)FT_QREALLOC( target->buffer, target_size, size ); - } - else - (void)FT_QALLOC( target->buffer, size ); - - if ( !error ) - { - unsigned char *p; - - - p = target->buffer; - *target = *source; - target->buffer = p; - - FT_MEM_COPY( target->buffer, source->buffer, size ); - } - - return error; - } - - - static FT_Error - ft_bitmap_assure_buffer( FT_Memory memory, - FT_Bitmap* bitmap, - FT_UInt xpixels, - FT_UInt ypixels ) - { - FT_Error error; - int pitch; - int new_pitch; - FT_UInt bpp; - FT_Int i, width, height; - unsigned char* buffer; - - - width = bitmap->width; - height = bitmap->rows; - pitch = bitmap->pitch; - if ( pitch < 0 ) - pitch = -pitch; - - switch ( bitmap->pixel_mode ) - { - case FT_PIXEL_MODE_MONO: - bpp = 1; - new_pitch = ( width + xpixels + 7 ) >> 3; - break; - case FT_PIXEL_MODE_GRAY2: - bpp = 2; - new_pitch = ( width + xpixels + 3 ) >> 2; - break; - case FT_PIXEL_MODE_GRAY4: - bpp = 4; - new_pitch = ( width + xpixels + 1 ) >> 1; - break; - case FT_PIXEL_MODE_GRAY: - case FT_PIXEL_MODE_LCD: - case FT_PIXEL_MODE_LCD_V: - bpp = 8; - new_pitch = ( width + xpixels ); - break; - default: - return FT_Err_Invalid_Glyph_Format; - } - - /* if no need to allocate memory */ - if ( ypixels == 0 && new_pitch <= pitch ) - { - /* zero the padding */ - FT_Int bit_width = pitch * 8; - FT_Int bit_last = ( width + xpixels ) * bpp; - - - if ( bit_last < bit_width ) - { - FT_Byte* line = bitmap->buffer + ( bit_last >> 3 ); - FT_Byte* end = bitmap->buffer + pitch; - FT_Int shift = bit_last & 7; - FT_UInt mask = 0xFF00U >> shift; - FT_Int count = height; - - - for ( ; count > 0; count--, line += pitch, end += pitch ) - { - FT_Byte* write = line; - - - if ( shift > 0 ) - { - write[0] = (FT_Byte)( write[0] & mask ); - write++; - } - if ( write < end ) - FT_MEM_ZERO( write, end-write ); - } - } - - return FT_Err_Ok; - } - - if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) ) - return error; - - if ( bitmap->pitch > 0 ) - { - FT_Int len = ( width * bpp + 7 ) >> 3; - - - for ( i = 0; i < bitmap->rows; i++ ) - FT_MEM_COPY( buffer + new_pitch * ( ypixels + i ), - bitmap->buffer + pitch * i, len ); - } - else - { - FT_Int len = ( width * bpp + 7 ) >> 3; - - - for ( i = 0; i < bitmap->rows; i++ ) - FT_MEM_COPY( buffer + new_pitch * i, - bitmap->buffer + pitch * i, len ); - } - - FT_FREE( bitmap->buffer ); - bitmap->buffer = buffer; - - if ( bitmap->pitch < 0 ) - new_pitch = -new_pitch; - - /* set pitch only, width and height are left untouched */ - bitmap->pitch = new_pitch; - - return FT_Err_Ok; - } - - - /* documentation is in ftbitmap.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Bitmap_Embolden( FT_Library library, - FT_Bitmap* bitmap, - FT_Pos xStrength, - FT_Pos yStrength ) - { - FT_Error error; - unsigned char* p; - FT_Int i, x, y, pitch; - FT_Int xstr, ystr; - - - if ( !library ) - return FT_Err_Invalid_Library_Handle; - - if ( !bitmap || !bitmap->buffer ) - return FT_Err_Invalid_Argument; - - if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) || - ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) ) - return FT_Err_Invalid_Argument; - - xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6; - ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6; - - if ( xstr == 0 && ystr == 0 ) - return FT_Err_Ok; - else if ( xstr < 0 || ystr < 0 ) - return FT_Err_Invalid_Argument; - - switch ( bitmap->pixel_mode ) - { - case FT_PIXEL_MODE_GRAY2: - case FT_PIXEL_MODE_GRAY4: - { - FT_Bitmap tmp; - FT_Int align; - - - if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY2 ) - align = ( bitmap->width + xstr + 3 ) / 4; - else - align = ( bitmap->width + xstr + 1 ) / 2; - - FT_Bitmap_New( &tmp ); - - error = FT_Bitmap_Convert( library, bitmap, &tmp, align ); - if ( error ) - return error; - - FT_Bitmap_Done( library, bitmap ); - *bitmap = tmp; - } - break; - - case FT_PIXEL_MODE_MONO: - if ( xstr > 8 ) - xstr = 8; - break; - - case FT_PIXEL_MODE_LCD: - xstr *= 3; - break; - - case FT_PIXEL_MODE_LCD_V: - ystr *= 3; - break; - } - - error = ft_bitmap_assure_buffer( library->memory, bitmap, xstr, ystr ); - if ( error ) - return error; - - pitch = bitmap->pitch; - if ( pitch > 0 ) - p = bitmap->buffer + pitch * ystr; - else - { - pitch = -pitch; - p = bitmap->buffer + pitch * ( bitmap->rows - 1 ); - } - - /* for each row */ - for ( y = 0; y < bitmap->rows ; y++ ) - { - /* - * Horizontally: - * - * From the last pixel on, make each pixel or'ed with the - * `xstr' pixels before it. - */ - for ( x = pitch - 1; x >= 0; x-- ) - { - unsigned char tmp; - - - tmp = p[x]; - for ( i = 1; i <= xstr; i++ ) - { - if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO ) - { - p[x] |= tmp >> i; - - /* the maximum value of 8 for `xstr' comes from here */ - if ( x > 0 ) - p[x] |= p[x - 1] << ( 8 - i ); - -#if 0 - if ( p[x] == 0xff ) - break; -#endif - } - else - { - if ( x - i >= 0 ) - { - if ( p[x] + p[x - i] > bitmap->num_grays - 1 ) - { - p[x] = (unsigned char)(bitmap->num_grays - 1); - break; - } - else - { - p[x] = (unsigned char)(p[x] + p[x-i]); - if ( p[x] == bitmap->num_grays - 1 ) - break; - } - } - else - break; - } - } - } - - /* - * Vertically: - * - * Make the above `ystr' rows or'ed with it. - */ - for ( x = 1; x <= ystr; x++ ) - { - unsigned char* q; - - - q = p - bitmap->pitch * x; - for ( i = 0; i < pitch; i++ ) - q[i] |= p[i]; - } - - p += bitmap->pitch; - } - - bitmap->width += xstr; - bitmap->rows += ystr; - - return FT_Err_Ok; - } - - - /* documentation is in ftbitmap.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Bitmap_Convert( FT_Library library, - const FT_Bitmap *source, - FT_Bitmap *target, - FT_Int alignment ) - { - FT_Error error = FT_Err_Ok; - FT_Memory memory; - - - if ( !library ) - return FT_Err_Invalid_Library_Handle; - - memory = library->memory; - - switch ( source->pixel_mode ) - { - case FT_PIXEL_MODE_MONO: - case FT_PIXEL_MODE_GRAY: - case FT_PIXEL_MODE_GRAY2: - case FT_PIXEL_MODE_GRAY4: - case FT_PIXEL_MODE_LCD: - case FT_PIXEL_MODE_LCD_V: - { - FT_Int pad; - FT_Long old_size; - - - old_size = target->rows * target->pitch; - if ( old_size < 0 ) - old_size = -old_size; - - target->pixel_mode = FT_PIXEL_MODE_GRAY; - target->rows = source->rows; - target->width = source->width; - - pad = 0; - if ( alignment > 0 ) - { - pad = source->width % alignment; - if ( pad != 0 ) - pad = alignment - pad; - } - - target->pitch = source->width + pad; - - if ( target->rows * target->pitch > old_size && - FT_QREALLOC( target->buffer, - old_size, target->rows * target->pitch ) ) - return error; - } - break; - - default: - error = FT_Err_Invalid_Argument; - } - - switch ( source->pixel_mode ) - { - case FT_PIXEL_MODE_MONO: - { - FT_Byte* s = source->buffer; - FT_Byte* t = target->buffer; - FT_Int i; - - - target->num_grays = 2; - - for ( i = source->rows; i > 0; i-- ) - { - FT_Byte* ss = s; - FT_Byte* tt = t; - FT_Int j; - - - /* get the full bytes */ - for ( j = source->width >> 3; j > 0; j-- ) - { - FT_Int val = ss[0]; /* avoid a byte->int cast on each line */ - - - tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 ); - tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 ); - tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 ); - tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 ); - tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 ); - tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 ); - tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 ); - tt[7] = (FT_Byte)( val & 0x01 ); - - tt += 8; - ss += 1; - } - - /* get remaining pixels (if any) */ - j = source->width & 7; - if ( j > 0 ) - { - FT_Int val = *ss; - - - for ( ; j > 0; j-- ) - { - tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7); - val <<= 1; - tt += 1; - } - } - - s += source->pitch; - t += target->pitch; - } - } - break; - - - case FT_PIXEL_MODE_GRAY: - case FT_PIXEL_MODE_LCD: - case FT_PIXEL_MODE_LCD_V: - { - FT_Int width = source->width; - FT_Byte* s = source->buffer; - FT_Byte* t = target->buffer; - FT_Int s_pitch = source->pitch; - FT_Int t_pitch = target->pitch; - FT_Int i; - - - target->num_grays = 256; - - for ( i = source->rows; i > 0; i-- ) - { - FT_ARRAY_COPY( t, s, width ); - - s += s_pitch; - t += t_pitch; - } - } - break; - - - case FT_PIXEL_MODE_GRAY2: - { - FT_Byte* s = source->buffer; - FT_Byte* t = target->buffer; - FT_Int i; - - - target->num_grays = 4; - - for ( i = source->rows; i > 0; i-- ) - { - FT_Byte* ss = s; - FT_Byte* tt = t; - FT_Int j; - - - /* get the full bytes */ - for ( j = source->width >> 2; j > 0; j-- ) - { - FT_Int val = ss[0]; - - - tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); - tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 ); - tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 ); - tt[3] = (FT_Byte)( ( val & 0x03 ) ); - - ss += 1; - tt += 4; - } - - j = source->width & 3; - if ( j > 0 ) - { - FT_Int val = ss[0]; - - - for ( ; j > 0; j-- ) - { - tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); - val <<= 2; - tt += 1; - } - } - - s += source->pitch; - t += target->pitch; - } - } - break; - - - case FT_PIXEL_MODE_GRAY4: - { - FT_Byte* s = source->buffer; - FT_Byte* t = target->buffer; - FT_Int i; - - - target->num_grays = 16; - - for ( i = source->rows; i > 0; i-- ) - { - FT_Byte* ss = s; - FT_Byte* tt = t; - FT_Int j; - - - /* get the full bytes */ - for ( j = source->width >> 1; j > 0; j-- ) - { - FT_Int val = ss[0]; - - - tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 ); - tt[1] = (FT_Byte)( ( val & 0x0F ) ); - - ss += 1; - tt += 2; - } - - if ( source->width & 1 ) - tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 ); - - s += source->pitch; - t += target->pitch; - } - } - break; - - - default: - ; - } - - return error; - } - - - /* documentation is in ftbitmap.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ) - { - if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP && - !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) - { - FT_Bitmap bitmap; - FT_Error error; - - - FT_Bitmap_New( &bitmap ); - error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap ); - if ( error ) - return error; - - slot->bitmap = bitmap; - slot->internal->flags |= FT_GLYPH_OWN_BITMAP; - } - - return FT_Err_Ok; - } - - - /* documentation is in ftbitmap.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Bitmap_Done( FT_Library library, - FT_Bitmap *bitmap ) - { - FT_Memory memory; - - - if ( !library ) - return FT_Err_Invalid_Library_Handle; - - if ( !bitmap ) - return FT_Err_Invalid_Argument; - - memory = library->memory; - - FT_FREE( bitmap->buffer ); - *bitmap = null_bitmap; - - return FT_Err_Ok; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftcalc.c b/android/jni/ndk_modules/freetype/src/base/ftcalc.c deleted file mode 100644 index 3892fabf..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftcalc.c +++ /dev/null @@ -1,957 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcalc.c */ -/* */ -/* Arithmetic computations (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* Support for 1-complement arithmetic has been totally dropped in this */ - /* release. You can still write your own code if you need it. */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* Implementing basic computation routines. */ - /* */ - /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(), */ - /* and FT_FloorFix() are declared in freetype.h. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_GLYPH_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H - -#ifdef FT_MULFIX_INLINED -#undef FT_MulFix -#endif - -/* we need to define a 64-bits data type here */ - -#ifdef FT_LONG64 - - typedef FT_INT64 FT_Int64; - -#else - - typedef struct FT_Int64_ - { - FT_UInt32 lo; - FT_UInt32 hi; - - } FT_Int64; - -#endif /* FT_LONG64 */ - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_calc - - - /* The following three functions are available regardless of whether */ - /* FT_LONG64 is defined. */ - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_RoundFix( FT_Fixed a ) - { - return ( a >= 0 ) ? ( a + 0x8000L ) & ~0xFFFFL - : -((-a + 0x8000L ) & ~0xFFFFL ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_CeilFix( FT_Fixed a ) - { - return ( a >= 0 ) ? ( a + 0xFFFFL ) & ~0xFFFFL - : -((-a + 0xFFFFL ) & ~0xFFFFL ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_FloorFix( FT_Fixed a ) - { - return ( a >= 0 ) ? a & ~0xFFFFL - : -((-a) & ~0xFFFFL ); - } - - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - /* documentation is in ftcalc.h */ - - FT_EXPORT_DEF( FT_Int32 ) - FT_Sqrt32( FT_Int32 x ) - { - FT_UInt32 val, root, newroot, mask; - - - root = 0; - mask = (FT_UInt32)0x40000000UL; - val = (FT_UInt32)x; - - do - { - newroot = root + mask; - if ( newroot <= val ) - { - val -= newroot; - root = newroot + mask; - } - - root >>= 1; - mask >>= 2; - - } while ( mask != 0 ); - - return root; - } - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - -#ifdef FT_LONG64 - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_MulDiv( FT_Long a, - FT_Long b, - FT_Long c ) - { - FT_Int s; - FT_Long d; - - - s = 1; - if ( a < 0 ) { a = -a; s = -1; } - if ( b < 0 ) { b = -b; s = -s; } - if ( c < 0 ) { c = -c; s = -s; } - - d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c - : 0x7FFFFFFFL ); - - return ( s > 0 ) ? d : -d; - } - - -#ifdef TT_USE_BYTECODE_INTERPRETER - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( FT_Long ) - FT_MulDiv_No_Round( FT_Long a, - FT_Long b, - FT_Long c ) - { - FT_Int s; - FT_Long d; - - - s = 1; - if ( a < 0 ) { a = -a; s = -1; } - if ( b < 0 ) { b = -b; s = -s; } - if ( c < 0 ) { c = -c; s = -s; } - - d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c - : 0x7FFFFFFFL ); - - return ( s > 0 ) ? d : -d; - } - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_MulFix( FT_Long a, - FT_Long b ) - { -#ifdef FT_MULFIX_ASSEMBLER - - return FT_MULFIX_ASSEMBLER( a, b ); - -#else - - FT_Int s = 1; - FT_Long c; - - - if ( a < 0 ) - { - a = -a; - s = -1; - } - - if ( b < 0 ) - { - b = -b; - s = -s; - } - - c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 ); - - return ( s > 0 ) ? c : -c; - -#endif /* FT_MULFIX_ASSEMBLER */ - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_DivFix( FT_Long a, - FT_Long b ) - { - FT_Int32 s; - FT_UInt32 q; - - s = 1; - if ( a < 0 ) { a = -a; s = -1; } - if ( b < 0 ) { b = -b; s = -s; } - - if ( b == 0 ) - /* check for division by 0 */ - q = 0x7FFFFFFFL; - else - /* compute result directly */ - q = (FT_UInt32)( ( ( (FT_Int64)a << 16 ) + ( b >> 1 ) ) / b ); - - return ( s < 0 ? -(FT_Long)q : (FT_Long)q ); - } - - -#else /* !FT_LONG64 */ - - - static void - ft_multo64( FT_UInt32 x, - FT_UInt32 y, - FT_Int64 *z ) - { - FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; - - - lo1 = x & 0x0000FFFFU; hi1 = x >> 16; - lo2 = y & 0x0000FFFFU; hi2 = y >> 16; - - lo = lo1 * lo2; - i1 = lo1 * hi2; - i2 = lo2 * hi1; - hi = hi1 * hi2; - - /* Check carry overflow of i1 + i2 */ - i1 += i2; - hi += (FT_UInt32)( i1 < i2 ) << 16; - - hi += i1 >> 16; - i1 = i1 << 16; - - /* Check carry overflow of i1 + lo */ - lo += i1; - hi += ( lo < i1 ); - - z->lo = lo; - z->hi = hi; - } - - - static FT_UInt32 - ft_div64by32( FT_UInt32 hi, - FT_UInt32 lo, - FT_UInt32 y ) - { - FT_UInt32 r, q; - FT_Int i; - - - q = 0; - r = hi; - - if ( r >= y ) - return (FT_UInt32)0x7FFFFFFFL; - - i = 32; - do - { - r <<= 1; - q <<= 1; - r |= lo >> 31; - - if ( r >= (FT_UInt32)y ) - { - r -= y; - q |= 1; - } - lo <<= 1; - } while ( --i ); - - return q; - } - - - static void - FT_Add64( FT_Int64* x, - FT_Int64* y, - FT_Int64 *z ) - { - register FT_UInt32 lo, hi; - - - lo = x->lo + y->lo; - hi = x->hi + y->hi + ( lo < x->lo ); - - z->lo = lo; - z->hi = hi; - } - - - /* documentation is in freetype.h */ - - /* The FT_MulDiv function has been optimized thanks to ideas from */ - /* Graham Asher. The trick is to optimize computation when everything */ - /* fits within 32-bits (a rather common case). */ - /* */ - /* we compute 'a*b+c/2', then divide it by 'c'. (positive values) */ - /* */ - /* 46340 is FLOOR(SQRT(2^31-1)). */ - /* */ - /* if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 ) */ - /* */ - /* 0x7FFFFFFF - 0x7FFEA810 = 0x157F0 */ - /* */ - /* if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF ) */ - /* */ - /* and 2*0x157F0 = 176096 */ - /* */ - - FT_EXPORT_DEF( FT_Long ) - FT_MulDiv( FT_Long a, - FT_Long b, - FT_Long c ) - { - long s; - - - /* XXX: this function does not allow 64-bit arguments */ - if ( a == 0 || b == c ) - return a; - - s = a; a = FT_ABS( a ); - s ^= b; b = FT_ABS( b ); - s ^= c; c = FT_ABS( c ); - - if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 ) - a = ( a * b + ( c >> 1 ) ) / c; - - else if ( c > 0 ) - { - FT_Int64 temp, temp2; - - - ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp ); - - temp2.hi = 0; - temp2.lo = (FT_UInt32)(c >> 1); - FT_Add64( &temp, &temp2, &temp ); - a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c ); - } - else - a = 0x7FFFFFFFL; - - return ( s < 0 ? -a : a ); - } - - -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_BASE_DEF( FT_Long ) - FT_MulDiv_No_Round( FT_Long a, - FT_Long b, - FT_Long c ) - { - long s; - - - if ( a == 0 || b == c ) - return a; - - s = a; a = FT_ABS( a ); - s ^= b; b = FT_ABS( b ); - s ^= c; c = FT_ABS( c ); - - if ( a <= 46340L && b <= 46340L && c > 0 ) - a = a * b / c; - - else if ( c > 0 ) - { - FT_Int64 temp; - - - ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp ); - a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c ); - } - else - a = 0x7FFFFFFFL; - - return ( s < 0 ? -a : a ); - } - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_MulFix( FT_Long a, - FT_Long b ) - { -#ifdef FT_MULFIX_ASSEMBLER - - return FT_MULFIX_ASSEMBLER( a, b ); - -#elif 0 - - /* - * This code is nonportable. See comment below. - * - * However, on a platform where right-shift of a signed quantity fills - * the leftmost bits by copying the sign bit, it might be faster. - */ - - FT_Long sa, sb; - FT_ULong ua, ub; - - - if ( a == 0 || b == 0x10000L ) - return a; - - /* - * This is a clever way of converting a signed number `a' into its - * absolute value (stored back into `a') and its sign. The sign is - * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a' - * was negative. (Similarly for `b' and `sb'). - * - * Unfortunately, it doesn't work (at least not portably). - * - * It makes the assumption that right-shift on a negative signed value - * fills the leftmost bits by copying the sign bit. This is wrong. - * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206, - * the result of right-shift of a negative signed value is - * implementation-defined. At least one implementation fills the - * leftmost bits with 0s (i.e., it is exactly the same as an unsigned - * right shift). This means that when `a' is negative, `sa' ends up - * with the value 1 rather than -1. After that, everything else goes - * wrong. - */ - sa = ( a >> ( sizeof ( a ) * 8 - 1 ) ); - a = ( a ^ sa ) - sa; - sb = ( b >> ( sizeof ( b ) * 8 - 1 ) ); - b = ( b ^ sb ) - sb; - - ua = (FT_ULong)a; - ub = (FT_ULong)b; - - if ( ua <= 2048 && ub <= 1048576L ) - ua = ( ua * ub + 0x8000U ) >> 16; - else - { - FT_ULong al = ua & 0xFFFFU; - - - ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) + - ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 ); - } - - sa ^= sb, - ua = (FT_ULong)(( ua ^ sa ) - sa); - - return (FT_Long)ua; - -#else /* 0 */ - - FT_Long s; - FT_ULong ua, ub; - - - if ( a == 0 || b == 0x10000L ) - return a; - - s = a; a = FT_ABS( a ); - s ^= b; b = FT_ABS( b ); - - ua = (FT_ULong)a; - ub = (FT_ULong)b; - - if ( ua <= 2048 && ub <= 1048576L ) - ua = ( ua * ub + 0x8000UL ) >> 16; - else - { - FT_ULong al = ua & 0xFFFFUL; - - - ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) + - ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 ); - } - - return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua ); - -#endif /* 0 */ - - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_DivFix( FT_Long a, - FT_Long b ) - { - FT_Int32 s; - FT_UInt32 q; - - - /* XXX: this function does not allow 64-bit arguments */ - s = (FT_Int32)a; a = FT_ABS( a ); - s ^= (FT_Int32)b; b = FT_ABS( b ); - - if ( b == 0 ) - { - /* check for division by 0 */ - q = (FT_UInt32)0x7FFFFFFFL; - } - else if ( ( a >> 16 ) == 0 ) - { - /* compute result directly */ - q = (FT_UInt32)( (a << 16) + (b >> 1) ) / (FT_UInt32)b; - } - else - { - /* we need more bits; we have to do it by hand */ - FT_Int64 temp, temp2; - - temp.hi = (FT_Int32) (a >> 16); - temp.lo = (FT_UInt32)(a << 16); - temp2.hi = 0; - temp2.lo = (FT_UInt32)( b >> 1 ); - FT_Add64( &temp, &temp2, &temp ); - q = ft_div64by32( temp.hi, temp.lo, (FT_Int32)b ); - } - - return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); - } - - -#if 0 - - /* documentation is in ftcalc.h */ - - FT_EXPORT_DEF( void ) - FT_MulTo64( FT_Int32 x, - FT_Int32 y, - FT_Int64 *z ) - { - FT_Int32 s; - - - s = x; x = FT_ABS( x ); - s ^= y; y = FT_ABS( y ); - - ft_multo64( x, y, z ); - - if ( s < 0 ) - { - z->lo = (FT_UInt32)-(FT_Int32)z->lo; - z->hi = ~z->hi + !( z->lo ); - } - } - - - /* apparently, the second version of this code is not compiled correctly */ - /* on Mac machines with the MPW C compiler.. tsk, tsk, tsk... */ - -#if 1 - - FT_EXPORT_DEF( FT_Int32 ) - FT_Div64by32( FT_Int64* x, - FT_Int32 y ) - { - FT_Int32 s; - FT_UInt32 q, r, i, lo; - - - s = x->hi; - if ( s < 0 ) - { - x->lo = (FT_UInt32)-(FT_Int32)x->lo; - x->hi = ~x->hi + !x->lo; - } - s ^= y; y = FT_ABS( y ); - - /* Shortcut */ - if ( x->hi == 0 ) - { - if ( y > 0 ) - q = x->lo / y; - else - q = 0x7FFFFFFFL; - - return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); - } - - r = x->hi; - lo = x->lo; - - if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */ - return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL ); - /* Return Max/Min Int32 if division overflow. */ - /* This includes division by zero! */ - q = 0; - for ( i = 0; i < 32; i++ ) - { - r <<= 1; - q <<= 1; - r |= lo >> 31; - - if ( r >= (FT_UInt32)y ) - { - r -= y; - q |= 1; - } - lo <<= 1; - } - - return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); - } - -#else /* 0 */ - - FT_EXPORT_DEF( FT_Int32 ) - FT_Div64by32( FT_Int64* x, - FT_Int32 y ) - { - FT_Int32 s; - FT_UInt32 q; - - - s = x->hi; - if ( s < 0 ) - { - x->lo = (FT_UInt32)-(FT_Int32)x->lo; - x->hi = ~x->hi + !x->lo; - } - s ^= y; y = FT_ABS( y ); - - /* Shortcut */ - if ( x->hi == 0 ) - { - if ( y > 0 ) - q = ( x->lo + ( y >> 1 ) ) / y; - else - q = 0x7FFFFFFFL; - - return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); - } - - q = ft_div64by32( x->hi, x->lo, y ); - - return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); - } - -#endif /* 0 */ - -#endif /* 0 */ - - -#endif /* FT_LONG64 */ - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( void ) - FT_Matrix_Multiply( const FT_Matrix* a, - FT_Matrix *b ) - { - FT_Fixed xx, xy, yx, yy; - - - if ( !a || !b ) - return; - - xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx ); - xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy ); - yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx ); - yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy ); - - b->xx = xx; b->xy = xy; - b->yx = yx; b->yy = yy; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Matrix_Invert( FT_Matrix* matrix ) - { - FT_Pos delta, xx, yy; - - - if ( !matrix ) - return FT_Err_Invalid_Argument; - - /* compute discriminant */ - delta = FT_MulFix( matrix->xx, matrix->yy ) - - FT_MulFix( matrix->xy, matrix->yx ); - - if ( !delta ) - return FT_Err_Invalid_Argument; /* matrix can't be inverted */ - - matrix->xy = - FT_DivFix( matrix->xy, delta ); - matrix->yx = - FT_DivFix( matrix->yx, delta ); - - xx = matrix->xx; - yy = matrix->yy; - - matrix->xx = FT_DivFix( yy, delta ); - matrix->yy = FT_DivFix( xx, delta ); - - return FT_Err_Ok; - } - - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( void ) - FT_Matrix_Multiply_Scaled( const FT_Matrix* a, - FT_Matrix *b, - FT_Long scaling ) - { - FT_Fixed xx, xy, yx, yy; - - FT_Long val = 0x10000L * scaling; - - - if ( !a || !b ) - return; - - xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val ); - xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val ); - yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val ); - yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val ); - - b->xx = xx; b->xy = xy; - b->yx = yx; b->yy = yy; - } - - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( void ) - FT_Vector_Transform_Scaled( FT_Vector* vector, - const FT_Matrix* matrix, - FT_Long scaling ) - { - FT_Pos xz, yz; - - FT_Long val = 0x10000L * scaling; - - - if ( !vector || !matrix ) - return; - - xz = FT_MulDiv( vector->x, matrix->xx, val ) + - FT_MulDiv( vector->y, matrix->xy, val ); - - yz = FT_MulDiv( vector->x, matrix->yx, val ) + - FT_MulDiv( vector->y, matrix->yy, val ); - - vector->x = xz; - vector->y = yz; - } - - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( FT_Int32 ) - FT_SqrtFixed( FT_Int32 x ) - { - FT_UInt32 root, rem_hi, rem_lo, test_div; - FT_Int count; - - - root = 0; - - if ( x > 0 ) - { - rem_hi = 0; - rem_lo = x; - count = 24; - do - { - rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 ); - rem_lo <<= 2; - root <<= 1; - test_div = ( root << 1 ) + 1; - - if ( rem_hi >= test_div ) - { - rem_hi -= test_div; - root += 1; - } - } while ( --count ); - } - - return (FT_Int32)root; - } - - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( FT_Int ) - ft_corner_orientation( FT_Pos in_x, - FT_Pos in_y, - FT_Pos out_x, - FT_Pos out_y ) - { - FT_Long result; /* avoid overflow on 16-bit system */ - - - /* deal with the trivial cases quickly */ - if ( in_y == 0 ) - { - if ( in_x >= 0 ) - result = out_y; - else - result = -out_y; - } - else if ( in_x == 0 ) - { - if ( in_y >= 0 ) - result = -out_x; - else - result = out_x; - } - else if ( out_y == 0 ) - { - if ( out_x >= 0 ) - result = in_y; - else - result = -in_y; - } - else if ( out_x == 0 ) - { - if ( out_y >= 0 ) - result = -in_x; - else - result = in_x; - } - else /* general case */ - { -#ifdef FT_LONG64 - - FT_Int64 delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x; - - - if ( delta == 0 ) - result = 0; - else - result = 1 - 2 * ( delta < 0 ); - -#else - - FT_Int64 z1, z2; - - - /* XXX: this function does not allow 64-bit arguments */ - ft_multo64( (FT_Int32)in_x, (FT_Int32)out_y, &z1 ); - ft_multo64( (FT_Int32)in_y, (FT_Int32)out_x, &z2 ); - - if ( z1.hi > z2.hi ) - result = +1; - else if ( z1.hi < z2.hi ) - result = -1; - else if ( z1.lo > z2.lo ) - result = +1; - else if ( z1.lo < z2.lo ) - result = -1; - else - result = 0; - -#endif - } - - /* XXX: only the sign of return value, +1/0/-1 must be used */ - return (FT_Int)result; - } - - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( FT_Int ) - ft_corner_is_flat( FT_Pos in_x, - FT_Pos in_y, - FT_Pos out_x, - FT_Pos out_y ) - { - FT_Pos ax = in_x; - FT_Pos ay = in_y; - - FT_Pos d_in, d_out, d_corner; - - - if ( ax < 0 ) - ax = -ax; - if ( ay < 0 ) - ay = -ay; - d_in = ax + ay; - - ax = out_x; - if ( ax < 0 ) - ax = -ax; - ay = out_y; - if ( ay < 0 ) - ay = -ay; - d_out = ax + ay; - - ax = out_x + in_x; - if ( ax < 0 ) - ax = -ax; - ay = out_y + in_y; - if ( ay < 0 ) - ay = -ay; - d_corner = ax + ay; - - return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftdbgmem.c b/android/jni/ndk_modules/freetype/src/base/ftdbgmem.c deleted file mode 100644 index 160269d1..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftdbgmem.c +++ /dev/null @@ -1,997 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftdbgmem.c */ -/* */ -/* Memory debugger (body). */ -/* */ -/* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_MEMORY_H -#include FT_SYSTEM_H -#include FT_ERRORS_H -#include FT_TYPES_H - - -#ifdef FT_DEBUG_MEMORY - -#define KEEPALIVE /* `Keep alive' means that freed blocks aren't released - * to the heap. This is useful to detect double-frees - * or weird heap corruption, but it uses large amounts of - * memory, however. - */ - -#include FT_CONFIG_STANDARD_LIBRARY_H - - FT_BASE_DEF( const char* ) _ft_debug_file = 0; - FT_BASE_DEF( long ) _ft_debug_lineno = 0; - - extern void - FT_DumpMemory( FT_Memory memory ); - - - typedef struct FT_MemSourceRec_* FT_MemSource; - typedef struct FT_MemNodeRec_* FT_MemNode; - typedef struct FT_MemTableRec_* FT_MemTable; - - -#define FT_MEM_VAL( addr ) ((FT_ULong)(FT_Pointer)( addr )) - - /* - * This structure holds statistics for a single allocation/release - * site. This is useful to know where memory operations happen the - * most. - */ - typedef struct FT_MemSourceRec_ - { - const char* file_name; - long line_no; - - FT_Long cur_blocks; /* current number of allocated blocks */ - FT_Long max_blocks; /* max. number of allocated blocks */ - FT_Long all_blocks; /* total number of blocks allocated */ - - FT_Long cur_size; /* current cumulative allocated size */ - FT_Long max_size; /* maximum cumulative allocated size */ - FT_Long all_size; /* total cumulative allocated size */ - - FT_Long cur_max; /* current maximum allocated size */ - - FT_UInt32 hash; - FT_MemSource link; - - } FT_MemSourceRec; - - - /* - * We don't need a resizable array for the memory sources, because - * their number is pretty limited within FreeType. - */ -#define FT_MEM_SOURCE_BUCKETS 128 - - /* - * This structure holds information related to a single allocated - * memory block. If KEEPALIVE is defined, blocks that are freed by - * FreeType are never released to the system. Instead, their `size' - * field is set to -size. This is mainly useful to detect double frees, - * at the price of large memory footprint during execution. - */ - typedef struct FT_MemNodeRec_ - { - FT_Byte* address; - FT_Long size; /* < 0 if the block was freed */ - - FT_MemSource source; - -#ifdef KEEPALIVE - const char* free_file_name; - FT_Long free_line_no; -#endif - - FT_MemNode link; - - } FT_MemNodeRec; - - - /* - * The global structure, containing compound statistics and all hash - * tables. - */ - typedef struct FT_MemTableRec_ - { - FT_ULong size; - FT_ULong nodes; - FT_MemNode* buckets; - - FT_ULong alloc_total; - FT_ULong alloc_current; - FT_ULong alloc_max; - FT_ULong alloc_count; - - FT_Bool bound_total; - FT_ULong alloc_total_max; - - FT_Bool bound_count; - FT_ULong alloc_count_max; - - FT_MemSource sources[FT_MEM_SOURCE_BUCKETS]; - - FT_Bool keep_alive; - - FT_Memory memory; - FT_Pointer memory_user; - FT_Alloc_Func alloc; - FT_Free_Func free; - FT_Realloc_Func realloc; - - } FT_MemTableRec; - - -#define FT_MEM_SIZE_MIN 7 -#define FT_MEM_SIZE_MAX 13845163 - -#define FT_FILENAME( x ) ((x) ? (x) : "unknown file") - - - /* - * Prime numbers are ugly to handle. It would be better to implement - * L-Hashing, which is 10% faster and doesn't require divisions. - */ - static const FT_UInt ft_mem_primes[] = - { - 7, - 11, - 19, - 37, - 73, - 109, - 163, - 251, - 367, - 557, - 823, - 1237, - 1861, - 2777, - 4177, - 6247, - 9371, - 14057, - 21089, - 31627, - 47431, - 71143, - 106721, - 160073, - 240101, - 360163, - 540217, - 810343, - 1215497, - 1823231, - 2734867, - 4102283, - 6153409, - 9230113, - 13845163, - }; - - - static FT_ULong - ft_mem_closest_prime( FT_ULong num ) - { - FT_UInt i; - - - for ( i = 0; - i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ ) - if ( ft_mem_primes[i] > num ) - return ft_mem_primes[i]; - - return FT_MEM_SIZE_MAX; - } - - - extern void - ft_mem_debug_panic( const char* fmt, - ... ) - { - va_list ap; - - - printf( "FreeType.Debug: " ); - - va_start( ap, fmt ); - vprintf( fmt, ap ); - va_end( ap ); - - printf( "\n" ); - exit( EXIT_FAILURE ); - } - - - static FT_Pointer - ft_mem_table_alloc( FT_MemTable table, - FT_Long size ) - { - FT_Memory memory = table->memory; - FT_Pointer block; - - - memory->user = table->memory_user; - block = table->alloc( memory, size ); - memory->user = table; - - return block; - } - - - static void - ft_mem_table_free( FT_MemTable table, - FT_Pointer block ) - { - FT_Memory memory = table->memory; - - - memory->user = table->memory_user; - table->free( memory, block ); - memory->user = table; - } - - - static void - ft_mem_table_resize( FT_MemTable table ) - { - FT_ULong new_size; - - - new_size = ft_mem_closest_prime( table->nodes ); - if ( new_size != table->size ) - { - FT_MemNode* new_buckets; - FT_ULong i; - - - new_buckets = (FT_MemNode *) - ft_mem_table_alloc( table, - new_size * sizeof ( FT_MemNode ) ); - if ( new_buckets == NULL ) - return; - - FT_ARRAY_ZERO( new_buckets, new_size ); - - for ( i = 0; i < table->size; i++ ) - { - FT_MemNode node, next, *pnode; - FT_ULong hash; - - - node = table->buckets[i]; - while ( node ) - { - next = node->link; - hash = FT_MEM_VAL( node->address ) % new_size; - pnode = new_buckets + hash; - - node->link = pnode[0]; - pnode[0] = node; - - node = next; - } - } - - if ( table->buckets ) - ft_mem_table_free( table, table->buckets ); - - table->buckets = new_buckets; - table->size = new_size; - } - } - - - static FT_MemTable - ft_mem_table_new( FT_Memory memory ) - { - FT_MemTable table; - - - table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) ); - if ( table == NULL ) - goto Exit; - - FT_ZERO( table ); - - table->size = FT_MEM_SIZE_MIN; - table->nodes = 0; - - table->memory = memory; - - table->memory_user = memory->user; - - table->alloc = memory->alloc; - table->realloc = memory->realloc; - table->free = memory->free; - - table->buckets = (FT_MemNode *) - memory->alloc( memory, - table->size * sizeof ( FT_MemNode ) ); - if ( table->buckets ) - FT_ARRAY_ZERO( table->buckets, table->size ); - else - { - memory->free( memory, table ); - table = NULL; - } - - Exit: - return table; - } - - - static void - ft_mem_table_destroy( FT_MemTable table ) - { - FT_ULong i; - - - FT_DumpMemory( table->memory ); - - if ( table ) - { - FT_Long leak_count = 0; - FT_ULong leaks = 0; - - - /* remove all blocks from the table, revealing leaked ones */ - for ( i = 0; i < table->size; i++ ) - { - FT_MemNode *pnode = table->buckets + i, next, node = *pnode; - - - while ( node ) - { - next = node->link; - node->link = 0; - - if ( node->size > 0 ) - { - printf( - "leaked memory block at address %p, size %8ld in (%s:%ld)\n", - node->address, node->size, - FT_FILENAME( node->source->file_name ), - node->source->line_no ); - - leak_count++; - leaks += node->size; - - ft_mem_table_free( table, node->address ); - } - - node->address = NULL; - node->size = 0; - - ft_mem_table_free( table, node ); - node = next; - } - table->buckets[i] = 0; - } - - ft_mem_table_free( table, table->buckets ); - table->buckets = NULL; - - table->size = 0; - table->nodes = 0; - - /* remove all sources */ - for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ ) - { - FT_MemSource source, next; - - - for ( source = table->sources[i]; source != NULL; source = next ) - { - next = source->link; - ft_mem_table_free( table, source ); - } - - table->sources[i] = NULL; - } - - printf( - "FreeType: total memory allocations = %ld\n", table->alloc_total ); - printf( - "FreeType: maximum memory footprint = %ld\n", table->alloc_max ); - - ft_mem_table_free( table, table ); - - if ( leak_count > 0 ) - ft_mem_debug_panic( - "FreeType: %ld bytes of memory leaked in %ld blocks\n", - leaks, leak_count ); - - printf( "FreeType: no memory leaks detected\n" ); - } - } - - - static FT_MemNode* - ft_mem_table_get_nodep( FT_MemTable table, - FT_Byte* address ) - { - FT_ULong hash; - FT_MemNode *pnode, node; - - - hash = FT_MEM_VAL( address ); - pnode = table->buckets + ( hash % table->size ); - - for (;;) - { - node = pnode[0]; - if ( !node ) - break; - - if ( node->address == address ) - break; - - pnode = &node->link; - } - return pnode; - } - - - static FT_MemSource - ft_mem_table_get_source( FT_MemTable table ) - { - FT_UInt32 hash; - FT_MemSource node, *pnode; - - - /* cast to FT_PtrDist first since void* can be larger */ - /* than FT_UInt32 and GCC 4.1.1 emits a warning */ - hash = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file + - (FT_UInt32)( 5 * _ft_debug_lineno ); - pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS]; - - for ( ;; ) - { - node = *pnode; - if ( node == NULL ) - break; - - if ( node->file_name == _ft_debug_file && - node->line_no == _ft_debug_lineno ) - goto Exit; - - pnode = &node->link; - } - - node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) ); - if ( node == NULL ) - ft_mem_debug_panic( - "not enough memory to perform memory debugging\n" ); - - node->file_name = _ft_debug_file; - node->line_no = _ft_debug_lineno; - - node->cur_blocks = 0; - node->max_blocks = 0; - node->all_blocks = 0; - - node->cur_size = 0; - node->max_size = 0; - node->all_size = 0; - - node->cur_max = 0; - - node->link = NULL; - node->hash = hash; - *pnode = node; - - Exit: - return node; - } - - - static void - ft_mem_table_set( FT_MemTable table, - FT_Byte* address, - FT_ULong size, - FT_Long delta ) - { - FT_MemNode *pnode, node; - - - if ( table ) - { - FT_MemSource source; - - - pnode = ft_mem_table_get_nodep( table, address ); - node = *pnode; - if ( node ) - { - if ( node->size < 0 ) - { - /* This block was already freed. Our memory is now completely */ - /* corrupted! */ - /* This can only happen in keep-alive mode. */ - ft_mem_debug_panic( - "memory heap corrupted (allocating freed block)" ); - } - else - { - /* This block was already allocated. This means that our memory */ - /* is also corrupted! */ - ft_mem_debug_panic( - "memory heap corrupted (re-allocating allocated block at" - " %p, of size %ld)\n" - "org=%s:%d new=%s:%d\n", - node->address, node->size, - FT_FILENAME( node->source->file_name ), node->source->line_no, - FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); - } - } - - /* we need to create a new node in this table */ - node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) ); - if ( node == NULL ) - ft_mem_debug_panic( "not enough memory to run memory tests" ); - - node->address = address; - node->size = size; - node->source = source = ft_mem_table_get_source( table ); - - if ( delta == 0 ) - { - /* this is an allocation */ - source->all_blocks++; - source->cur_blocks++; - if ( source->cur_blocks > source->max_blocks ) - source->max_blocks = source->cur_blocks; - } - - if ( size > (FT_ULong)source->cur_max ) - source->cur_max = size; - - if ( delta != 0 ) - { - /* we are growing or shrinking a reallocated block */ - source->cur_size += delta; - table->alloc_current += delta; - } - else - { - /* we are allocating a new block */ - source->cur_size += size; - table->alloc_current += size; - } - - source->all_size += size; - - if ( source->cur_size > source->max_size ) - source->max_size = source->cur_size; - - node->free_file_name = NULL; - node->free_line_no = 0; - - node->link = pnode[0]; - - pnode[0] = node; - table->nodes++; - - table->alloc_total += size; - - if ( table->alloc_current > table->alloc_max ) - table->alloc_max = table->alloc_current; - - if ( table->nodes * 3 < table->size || - table->size * 3 < table->nodes ) - ft_mem_table_resize( table ); - } - } - - - static void - ft_mem_table_remove( FT_MemTable table, - FT_Byte* address, - FT_Long delta ) - { - if ( table ) - { - FT_MemNode *pnode, node; - - - pnode = ft_mem_table_get_nodep( table, address ); - node = *pnode; - if ( node ) - { - FT_MemSource source; - - - if ( node->size < 0 ) - ft_mem_debug_panic( - "freeing memory block at %p more than once at (%s:%ld)\n" - "block allocated at (%s:%ld) and released at (%s:%ld)", - address, - FT_FILENAME( _ft_debug_file ), _ft_debug_lineno, - FT_FILENAME( node->source->file_name ), node->source->line_no, - FT_FILENAME( node->free_file_name ), node->free_line_no ); - - /* scramble the node's content for additional safety */ - FT_MEM_SET( address, 0xF3, node->size ); - - if ( delta == 0 ) - { - source = node->source; - - source->cur_blocks--; - source->cur_size -= node->size; - - table->alloc_current -= node->size; - } - - if ( table->keep_alive ) - { - /* we simply invert the node's size to indicate that the node */ - /* was freed. */ - node->size = -node->size; - node->free_file_name = _ft_debug_file; - node->free_line_no = _ft_debug_lineno; - } - else - { - table->nodes--; - - *pnode = node->link; - - node->size = 0; - node->source = NULL; - - ft_mem_table_free( table, node ); - - if ( table->nodes * 3 < table->size || - table->size * 3 < table->nodes ) - ft_mem_table_resize( table ); - } - } - else - ft_mem_debug_panic( - "trying to free unknown block at %p in (%s:%ld)\n", - address, - FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); - } - } - - - extern FT_Pointer - ft_mem_debug_alloc( FT_Memory memory, - FT_Long size ) - { - FT_MemTable table = (FT_MemTable)memory->user; - FT_Byte* block; - - - if ( size <= 0 ) - ft_mem_debug_panic( "negative block size allocation (%ld)", size ); - - /* return NULL if the maximum number of allocations was reached */ - if ( table->bound_count && - table->alloc_count >= table->alloc_count_max ) - return NULL; - - /* return NULL if this allocation would overflow the maximum heap size */ - if ( table->bound_total && - table->alloc_total_max - table->alloc_current > (FT_ULong)size ) - return NULL; - - block = (FT_Byte *)ft_mem_table_alloc( table, size ); - if ( block ) - { - ft_mem_table_set( table, block, (FT_ULong)size, 0 ); - - table->alloc_count++; - } - - _ft_debug_file = "<unknown>"; - _ft_debug_lineno = 0; - - return (FT_Pointer)block; - } - - - extern void - ft_mem_debug_free( FT_Memory memory, - FT_Pointer block ) - { - FT_MemTable table = (FT_MemTable)memory->user; - - - if ( block == NULL ) - ft_mem_debug_panic( "trying to free NULL in (%s:%ld)", - FT_FILENAME( _ft_debug_file ), - _ft_debug_lineno ); - - ft_mem_table_remove( table, (FT_Byte*)block, 0 ); - - if ( !table->keep_alive ) - ft_mem_table_free( table, block ); - - table->alloc_count--; - - _ft_debug_file = "<unknown>"; - _ft_debug_lineno = 0; - } - - - extern FT_Pointer - ft_mem_debug_realloc( FT_Memory memory, - FT_Long cur_size, - FT_Long new_size, - FT_Pointer block ) - { - FT_MemTable table = (FT_MemTable)memory->user; - FT_MemNode node, *pnode; - FT_Pointer new_block; - FT_Long delta; - - const char* file_name = FT_FILENAME( _ft_debug_file ); - FT_Long line_no = _ft_debug_lineno; - - - /* unlikely, but possible */ - if ( new_size == cur_size ) - return block; - - /* the following is valid according to ANSI C */ -#if 0 - if ( block == NULL || cur_size == 0 ) - ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)", - file_name, line_no ); -#endif - - /* while the following is allowed in ANSI C also, we abort since */ - /* such case should be handled by FreeType. */ - if ( new_size <= 0 ) - ft_mem_debug_panic( - "trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)", - block, cur_size, file_name, line_no ); - - /* check `cur_size' value */ - pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block ); - node = *pnode; - if ( !node ) - ft_mem_debug_panic( - "trying to reallocate unknown block at %p in (%s:%ld)", - block, file_name, line_no ); - - if ( node->size <= 0 ) - ft_mem_debug_panic( - "trying to reallocate freed block at %p in (%s:%ld)", - block, file_name, line_no ); - - if ( node->size != cur_size ) - ft_mem_debug_panic( "invalid ft_realloc request for %p. cur_size is " - "%ld instead of %ld in (%s:%ld)", - block, cur_size, node->size, file_name, line_no ); - - /* return NULL if the maximum number of allocations was reached */ - if ( table->bound_count && - table->alloc_count >= table->alloc_count_max ) - return NULL; - - delta = (FT_Long)( new_size - cur_size ); - - /* return NULL if this allocation would overflow the maximum heap size */ - if ( delta > 0 && - table->bound_total && - table->alloc_current + (FT_ULong)delta > table->alloc_total_max ) - return NULL; - - new_block = (FT_Byte *)ft_mem_table_alloc( table, new_size ); - if ( new_block == NULL ) - return NULL; - - ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta ); - - ft_memcpy( new_block, block, cur_size < new_size ? cur_size : new_size ); - - ft_mem_table_remove( table, (FT_Byte*)block, delta ); - - _ft_debug_file = "<unknown>"; - _ft_debug_lineno = 0; - - if ( !table->keep_alive ) - ft_mem_table_free( table, block ); - - return new_block; - } - - - extern FT_Int - ft_mem_debug_init( FT_Memory memory ) - { - FT_MemTable table; - FT_Int result = 0; - - - if ( getenv( "FT2_DEBUG_MEMORY" ) ) - { - table = ft_mem_table_new( memory ); - if ( table ) - { - const char* p; - - - memory->user = table; - memory->alloc = ft_mem_debug_alloc; - memory->realloc = ft_mem_debug_realloc; - memory->free = ft_mem_debug_free; - - p = getenv( "FT2_ALLOC_TOTAL_MAX" ); - if ( p != NULL ) - { - FT_Long total_max = ft_atol( p ); - - - if ( total_max > 0 ) - { - table->bound_total = 1; - table->alloc_total_max = (FT_ULong)total_max; - } - } - - p = getenv( "FT2_ALLOC_COUNT_MAX" ); - if ( p != NULL ) - { - FT_Long total_count = ft_atol( p ); - - - if ( total_count > 0 ) - { - table->bound_count = 1; - table->alloc_count_max = (FT_ULong)total_count; - } - } - - p = getenv( "FT2_KEEP_ALIVE" ); - if ( p != NULL ) - { - FT_Long keep_alive = ft_atol( p ); - - - if ( keep_alive > 0 ) - table->keep_alive = 1; - } - - result = 1; - } - } - return result; - } - - - extern void - ft_mem_debug_done( FT_Memory memory ) - { - FT_MemTable table = (FT_MemTable)memory->user; - - - if ( table ) - { - memory->free = table->free; - memory->realloc = table->realloc; - memory->alloc = table->alloc; - - ft_mem_table_destroy( table ); - memory->user = NULL; - } - } - - - - static int - ft_mem_source_compare( const void* p1, - const void* p2 ) - { - FT_MemSource s1 = *(FT_MemSource*)p1; - FT_MemSource s2 = *(FT_MemSource*)p2; - - - if ( s2->max_size > s1->max_size ) - return 1; - else if ( s2->max_size < s1->max_size ) - return -1; - else - return 0; - } - - - extern void - FT_DumpMemory( FT_Memory memory ) - { - FT_MemTable table = (FT_MemTable)memory->user; - - - if ( table ) - { - FT_MemSource* bucket = table->sources; - FT_MemSource* limit = bucket + FT_MEM_SOURCE_BUCKETS; - FT_MemSource* sources; - FT_UInt nn, count; - const char* fmt; - - - count = 0; - for ( ; bucket < limit; bucket++ ) - { - FT_MemSource source = *bucket; - - - for ( ; source; source = source->link ) - count++; - } - - sources = (FT_MemSource*)ft_mem_table_alloc( - table, sizeof ( *sources ) * count ); - - count = 0; - for ( bucket = table->sources; bucket < limit; bucket++ ) - { - FT_MemSource source = *bucket; - - - for ( ; source; source = source->link ) - sources[count++] = source; - } - - ft_qsort( sources, count, sizeof ( *sources ), ft_mem_source_compare ); - - printf( "FreeType Memory Dump: " - "current=%ld max=%ld total=%ld count=%ld\n", - table->alloc_current, table->alloc_max, - table->alloc_total, table->alloc_count ); - printf( " block block sizes sizes sizes source\n" ); - printf( " count high sum highsum max location\n" ); - printf( "-------------------------------------------------\n" ); - - fmt = "%6ld %6ld %8ld %8ld %8ld %s:%d\n"; - - for ( nn = 0; nn < count; nn++ ) - { - FT_MemSource source = sources[nn]; - - - printf( fmt, - source->cur_blocks, source->max_blocks, - source->cur_size, source->max_size, source->cur_max, - FT_FILENAME( source->file_name ), - source->line_no ); - } - printf( "------------------------------------------------\n" ); - - ft_mem_table_free( table, sources ); - } - } - -#else /* !FT_DEBUG_MEMORY */ - - /* ANSI C doesn't like empty source files */ - typedef int _debug_mem_dummy; - -#endif /* !FT_DEBUG_MEMORY */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftdebug.c b/android/jni/ndk_modules/freetype/src/base/ftdebug.c deleted file mode 100644 index 2adbeabe..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftdebug.c +++ /dev/null @@ -1,246 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftdebug.c */ -/* */ -/* Debugging and logging component (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2004, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This component contains various macros and functions used to ease the */ - /* debugging of the FreeType engine. Its main purpose is in assertion */ - /* checking, tracing, and error detection. */ - /* */ - /* There are now three debugging modes: */ - /* */ - /* - trace mode */ - /* */ - /* Error and trace messages are sent to the log file (which can be the */ - /* standard error output). */ - /* */ - /* - error mode */ - /* */ - /* Only error messages are generated. */ - /* */ - /* - release mode: */ - /* */ - /* No error message is sent or generated. The code is free from any */ - /* debugging parts. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_DEBUG_H - - -#ifdef FT_DEBUG_LEVEL_ERROR - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( void ) - FT_Message( const char* fmt, ... ) - { - va_list ap; - - - va_start( ap, fmt ); - vfprintf( stderr, fmt, ap ); - va_end( ap ); - } - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( void ) - FT_Panic( const char* fmt, ... ) - { - va_list ap; - - - va_start( ap, fmt ); - vfprintf( stderr, fmt, ap ); - va_end( ap ); - - exit( EXIT_FAILURE ); - } - -#endif /* FT_DEBUG_LEVEL_ERROR */ - - - -#ifdef FT_DEBUG_LEVEL_TRACE - - /* array of trace levels, initialized to 0 */ - int ft_trace_levels[trace_count]; - - - /* define array of trace toggle names */ -#define FT_TRACE_DEF( x ) #x , - - static const char* ft_trace_toggles[trace_count + 1] = - { -#include FT_INTERNAL_TRACE_H - NULL - }; - -#undef FT_TRACE_DEF - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( FT_Int ) - FT_Trace_Get_Count( void ) - { - return trace_count; - } - - - /* documentation is in ftdebug.h */ - - FT_BASE_DEF( const char * ) - FT_Trace_Get_Name( FT_Int idx ) - { - int max = FT_Trace_Get_Count(); - - - if ( idx < max ) - return ft_trace_toggles[idx]; - else - return NULL; - } - - - /*************************************************************************/ - /* */ - /* Initialize the tracing sub-system. This is done by retrieving the */ - /* value of the `FT2_DEBUG' environment variable. It must be a list of */ - /* toggles, separated by spaces, `;', or `,'. Example: */ - /* */ - /* export FT2_DEBUG="any:3 memory:7 stream:5" */ - /* */ - /* This requests that all levels be set to 3, except the trace level for */ - /* the memory and stream components which are set to 7 and 5, */ - /* respectively. */ - /* */ - /* See the file <include/freetype/internal/fttrace.h> for details of the */ - /* available toggle names. */ - /* */ - /* The level must be between 0 and 7; 0 means quiet (except for serious */ - /* runtime errors), and 7 means _very_ verbose. */ - /* */ - FT_BASE_DEF( void ) - ft_debug_init( void ) - { - const char* ft2_debug = getenv( "FT2_DEBUG" ); - - - if ( ft2_debug ) - { - const char* p = ft2_debug; - const char* q; - - - for ( ; *p; p++ ) - { - /* skip leading whitespace and separators */ - if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) - continue; - - /* read toggle name, followed by ':' */ - q = p; - while ( *p && *p != ':' ) - p++; - - if ( *p == ':' && p > q ) - { - FT_Int n, i, len = (FT_Int)( p - q ); - FT_Int level = -1, found = -1; - - - for ( n = 0; n < trace_count; n++ ) - { - const char* toggle = ft_trace_toggles[n]; - - - for ( i = 0; i < len; i++ ) - { - if ( toggle[i] != q[i] ) - break; - } - - if ( i == len && toggle[i] == 0 ) - { - found = n; - break; - } - } - - /* read level */ - p++; - if ( *p ) - { - level = *p++ - '0'; - if ( level < 0 || level > 7 ) - level = -1; - } - - if ( found >= 0 && level >= 0 ) - { - if ( found == trace_any ) - { - /* special case for `any' */ - for ( n = 0; n < trace_count; n++ ) - ft_trace_levels[n] = level; - } - else - ft_trace_levels[found] = level; - } - } - } - } - } - - -#else /* !FT_DEBUG_LEVEL_TRACE */ - - - FT_BASE_DEF( void ) - ft_debug_init( void ) - { - /* nothing */ - } - - - FT_BASE_DEF( FT_Int ) - FT_Trace_Get_Count( void ) - { - return 0; - } - - - FT_BASE_DEF( const char * ) - FT_Trace_Get_Name( FT_Int idx ) - { - FT_UNUSED( idx ); - - return NULL; - } - - -#endif /* !FT_DEBUG_LEVEL_TRACE */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftgasp.c b/android/jni/ndk_modules/freetype/src/base/ftgasp.c deleted file mode 100644 index 8485d292..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftgasp.c +++ /dev/null @@ -1,61 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgasp.c */ -/* */ -/* Access of TrueType's `gasp' table (body). */ -/* */ -/* Copyright 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_GASP_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - - FT_EXPORT_DEF( FT_Int ) - FT_Get_Gasp( FT_Face face, - FT_UInt ppem ) - { - FT_Int result = FT_GASP_NO_TABLE; - - - if ( face && FT_IS_SFNT( face ) ) - { - TT_Face ttface = (TT_Face)face; - - - if ( ttface->gasp.numRanges > 0 ) - { - TT_GaspRange range = ttface->gasp.gaspRanges; - TT_GaspRange range_end = range + ttface->gasp.numRanges; - - - while ( ppem > range->maxPPEM ) - { - range++; - if ( range >= range_end ) - goto Exit; - } - - result = range->gaspFlag; - - /* ensure that we don't have spurious bits */ - if ( ttface->gasp.version == 0 ) - result &= 3; - } - } - Exit: - return result; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftgloadr.c b/android/jni/ndk_modules/freetype/src/base/ftgloadr.c deleted file mode 100644 index 84834501..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftgloadr.c +++ /dev/null @@ -1,401 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgloadr.c */ -/* */ -/* The FreeType glyph loader (body). */ -/* */ -/* Copyright 2002, 2003, 2004, 2005, 2006, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_GLYPH_LOADER_H -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_OBJECTS_H - -#undef FT_COMPONENT -#define FT_COMPONENT trace_gloader - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** *****/ - /***** G L Y P H L O A D E R *****/ - /***** *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* The glyph loader is a simple object which is used to load a set of */ - /* glyphs easily. It is critical for the correct loading of composites. */ - /* */ - /* Ideally, one can see it as a stack of abstract `glyph' objects. */ - /* */ - /* loader.base Is really the bottom of the stack. It describes a */ - /* single glyph image made of the juxtaposition of */ - /* several glyphs (those `in the stack'). */ - /* */ - /* loader.current Describes the top of the stack, on which a new */ - /* glyph can be loaded. */ - /* */ - /* Rewind Clears the stack. */ - /* Prepare Set up `loader.current' for addition of a new glyph */ - /* image. */ - /* Add Add the `current' glyph image to the `base' one, */ - /* and prepare for another one. */ - /* */ - /* The glyph loader is now a base object. Each driver used to */ - /* re-implement it in one way or the other, which wasted code and */ - /* energy. */ - /* */ - /*************************************************************************/ - - - /* create a new glyph loader */ - FT_BASE_DEF( FT_Error ) - FT_GlyphLoader_New( FT_Memory memory, - FT_GlyphLoader *aloader ) - { - FT_GlyphLoader loader = NULL; - FT_Error error; - - - if ( !FT_NEW( loader ) ) - { - loader->memory = memory; - *aloader = loader; - } - return error; - } - - - /* rewind the glyph loader - reset counters to 0 */ - FT_BASE_DEF( void ) - FT_GlyphLoader_Rewind( FT_GlyphLoader loader ) - { - FT_GlyphLoad base = &loader->base; - FT_GlyphLoad current = &loader->current; - - - base->outline.n_points = 0; - base->outline.n_contours = 0; - base->num_subglyphs = 0; - - *current = *base; - } - - - /* reset the glyph loader, frees all allocated tables */ - /* and starts from zero */ - FT_BASE_DEF( void ) - FT_GlyphLoader_Reset( FT_GlyphLoader loader ) - { - FT_Memory memory = loader->memory; - - - FT_FREE( loader->base.outline.points ); - FT_FREE( loader->base.outline.tags ); - FT_FREE( loader->base.outline.contours ); - FT_FREE( loader->base.extra_points ); - FT_FREE( loader->base.subglyphs ); - - loader->base.extra_points2 = NULL; - - loader->max_points = 0; - loader->max_contours = 0; - loader->max_subglyphs = 0; - - FT_GlyphLoader_Rewind( loader ); - } - - - /* delete a glyph loader */ - FT_BASE_DEF( void ) - FT_GlyphLoader_Done( FT_GlyphLoader loader ) - { - if ( loader ) - { - FT_Memory memory = loader->memory; - - - FT_GlyphLoader_Reset( loader ); - FT_FREE( loader ); - } - } - - - /* re-adjust the `current' outline fields */ - static void - FT_GlyphLoader_Adjust_Points( FT_GlyphLoader loader ) - { - FT_Outline* base = &loader->base.outline; - FT_Outline* current = &loader->current.outline; - - - current->points = base->points + base->n_points; - current->tags = base->tags + base->n_points; - current->contours = base->contours + base->n_contours; - - /* handle extra points table - if any */ - if ( loader->use_extra ) - { - loader->current.extra_points = loader->base.extra_points + - base->n_points; - - loader->current.extra_points2 = loader->base.extra_points2 + - base->n_points; - } - } - - - FT_BASE_DEF( FT_Error ) - FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ) - { - FT_Error error; - FT_Memory memory = loader->memory; - - - if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) ) - { - loader->use_extra = 1; - loader->base.extra_points2 = loader->base.extra_points + - loader->max_points; - - FT_GlyphLoader_Adjust_Points( loader ); - } - return error; - } - - - /* re-adjust the `current' subglyphs field */ - static void - FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader loader ) - { - FT_GlyphLoad base = &loader->base; - FT_GlyphLoad current = &loader->current; - - - current->subglyphs = base->subglyphs + base->num_subglyphs; - } - - - /* Ensure that we can add `n_points' and `n_contours' to our glyph. */ - /* This function reallocates its outline tables if necessary. Note that */ - /* it DOESN'T change the number of points within the loader! */ - /* */ - FT_BASE_DEF( FT_Error ) - FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, - FT_UInt n_points, - FT_UInt n_contours ) - { - FT_Memory memory = loader->memory; - FT_Error error = FT_Err_Ok; - FT_Outline* base = &loader->base.outline; - FT_Outline* current = &loader->current.outline; - FT_Bool adjust = 0; - - FT_UInt new_max, old_max; - - - /* check points & tags */ - new_max = base->n_points + current->n_points + n_points; - old_max = loader->max_points; - - if ( new_max > old_max ) - { - new_max = FT_PAD_CEIL( new_max, 8 ); - - if ( new_max > FT_OUTLINE_POINTS_MAX ) - return FT_Err_Array_Too_Large; - - if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) || - FT_RENEW_ARRAY( base->tags, old_max, new_max ) ) - goto Exit; - - if ( loader->use_extra ) - { - if ( FT_RENEW_ARRAY( loader->base.extra_points, - old_max * 2, new_max * 2 ) ) - goto Exit; - - FT_ARRAY_MOVE( loader->base.extra_points + new_max, - loader->base.extra_points + old_max, - old_max ); - - loader->base.extra_points2 = loader->base.extra_points + new_max; - } - - adjust = 1; - loader->max_points = new_max; - } - - /* check contours */ - old_max = loader->max_contours; - new_max = base->n_contours + current->n_contours + - n_contours; - if ( new_max > old_max ) - { - new_max = FT_PAD_CEIL( new_max, 4 ); - - if ( new_max > FT_OUTLINE_CONTOURS_MAX ) - return FT_Err_Array_Too_Large; - - if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) - goto Exit; - - adjust = 1; - loader->max_contours = new_max; - } - - if ( adjust ) - FT_GlyphLoader_Adjust_Points( loader ); - - Exit: - return error; - } - - - /* Ensure that we can add `n_subglyphs' to our glyph. this function */ - /* reallocates its subglyphs table if necessary. Note that it DOES */ - /* NOT change the number of subglyphs within the loader! */ - /* */ - FT_BASE_DEF( FT_Error ) - FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, - FT_UInt n_subs ) - { - FT_Memory memory = loader->memory; - FT_Error error = FT_Err_Ok; - FT_UInt new_max, old_max; - - FT_GlyphLoad base = &loader->base; - FT_GlyphLoad current = &loader->current; - - - new_max = base->num_subglyphs + current->num_subglyphs + n_subs; - old_max = loader->max_subglyphs; - if ( new_max > old_max ) - { - new_max = FT_PAD_CEIL( new_max, 2 ); - if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) ) - goto Exit; - - loader->max_subglyphs = new_max; - - FT_GlyphLoader_Adjust_Subglyphs( loader ); - } - - Exit: - return error; - } - - - /* prepare loader for the addition of a new glyph on top of the base one */ - FT_BASE_DEF( void ) - FT_GlyphLoader_Prepare( FT_GlyphLoader loader ) - { - FT_GlyphLoad current = &loader->current; - - - current->outline.n_points = 0; - current->outline.n_contours = 0; - current->num_subglyphs = 0; - - FT_GlyphLoader_Adjust_Points ( loader ); - FT_GlyphLoader_Adjust_Subglyphs( loader ); - } - - - /* add current glyph to the base image - and prepare for another */ - FT_BASE_DEF( void ) - FT_GlyphLoader_Add( FT_GlyphLoader loader ) - { - FT_GlyphLoad base; - FT_GlyphLoad current; - - FT_UInt n_curr_contours; - FT_UInt n_base_points; - FT_UInt n; - - - if ( !loader ) - return; - - base = &loader->base; - current = &loader->current; - - n_curr_contours = current->outline.n_contours; - n_base_points = base->outline.n_points; - - base->outline.n_points = - (short)( base->outline.n_points + current->outline.n_points ); - base->outline.n_contours = - (short)( base->outline.n_contours + current->outline.n_contours ); - - base->num_subglyphs += current->num_subglyphs; - - /* adjust contours count in newest outline */ - for ( n = 0; n < n_curr_contours; n++ ) - current->outline.contours[n] = - (short)( current->outline.contours[n] + n_base_points ); - - /* prepare for another new glyph image */ - FT_GlyphLoader_Prepare( loader ); - } - - - FT_BASE_DEF( FT_Error ) - FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, - FT_GlyphLoader source ) - { - FT_Error error; - FT_UInt num_points = source->base.outline.n_points; - FT_UInt num_contours = source->base.outline.n_contours; - - - error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours ); - if ( !error ) - { - FT_Outline* out = &target->base.outline; - FT_Outline* in = &source->base.outline; - - - FT_ARRAY_COPY( out->points, in->points, - num_points ); - FT_ARRAY_COPY( out->tags, in->tags, - num_points ); - FT_ARRAY_COPY( out->contours, in->contours, - num_contours ); - - /* do we need to copy the extra points? */ - if ( target->use_extra && source->use_extra ) - { - FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points, - num_points ); - FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2, - num_points ); - } - - out->n_points = (short)num_points; - out->n_contours = (short)num_contours; - - FT_GlyphLoader_Adjust_Points( target ); - } - - return error; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftglyph.c b/android/jni/ndk_modules/freetype/src/base/ftglyph.c deleted file mode 100644 index b2205080..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftglyph.c +++ /dev/null @@ -1,627 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftglyph.c */ -/* */ -/* FreeType convenience functions to handle glyphs (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2007, 2008, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* This file contains the definition of several convenience functions */ - /* that can be used by client applications to easily retrieve glyph */ - /* bitmaps and outlines from a given face. */ - /* */ - /* These functions should be optional if you are writing a font server */ - /* or text layout engine on top of FreeType. However, they are pretty */ - /* handy for many other simple uses of the library. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_GLYPH_H -#include FT_OUTLINE_H -#include FT_BITMAP_H -#include FT_INTERNAL_OBJECTS_H - -#include "basepic.h" - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_glyph - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** FT_BitmapGlyph support ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_CALLBACK_DEF( FT_Error ) - ft_bitmap_glyph_init( FT_Glyph bitmap_glyph, - FT_GlyphSlot slot ) - { - FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; - FT_Error error = FT_Err_Ok; - FT_Library library = FT_GLYPH( glyph )->library; - - - if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) - { - error = FT_Err_Invalid_Glyph_Format; - goto Exit; - } - - glyph->left = slot->bitmap_left; - glyph->top = slot->bitmap_top; - - /* do lazy copying whenever possible */ - if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) - { - glyph->bitmap = slot->bitmap; - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; - } - else - { - FT_Bitmap_New( &glyph->bitmap ); - error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap ); - } - - Exit: - return error; - } - - - FT_CALLBACK_DEF( FT_Error ) - ft_bitmap_glyph_copy( FT_Glyph bitmap_source, - FT_Glyph bitmap_target ) - { - FT_Library library = bitmap_source->library; - FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source; - FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target; - - - target->left = source->left; - target->top = source->top; - - return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap ); - } - - - FT_CALLBACK_DEF( void ) - ft_bitmap_glyph_done( FT_Glyph bitmap_glyph ) - { - FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; - FT_Library library = FT_GLYPH( glyph )->library; - - - FT_Bitmap_Done( library, &glyph->bitmap ); - } - - - FT_CALLBACK_DEF( void ) - ft_bitmap_glyph_bbox( FT_Glyph bitmap_glyph, - FT_BBox* cbox ) - { - FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; - - - cbox->xMin = glyph->left << 6; - cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 ); - cbox->yMax = glyph->top << 6; - cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 ); - } - - - FT_DEFINE_GLYPH(ft_bitmap_glyph_class, - sizeof ( FT_BitmapGlyphRec ), - FT_GLYPH_FORMAT_BITMAP, - - ft_bitmap_glyph_init, - ft_bitmap_glyph_done, - ft_bitmap_glyph_copy, - 0, /* FT_Glyph_TransformFunc */ - ft_bitmap_glyph_bbox, - 0 /* FT_Glyph_PrepareFunc */ - ) - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** FT_OutlineGlyph support ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_CALLBACK_DEF( FT_Error ) - ft_outline_glyph_init( FT_Glyph outline_glyph, - FT_GlyphSlot slot ) - { - FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; - FT_Error error = FT_Err_Ok; - FT_Library library = FT_GLYPH( glyph )->library; - FT_Outline* source = &slot->outline; - FT_Outline* target = &glyph->outline; - - - /* check format in glyph slot */ - if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) - { - error = FT_Err_Invalid_Glyph_Format; - goto Exit; - } - - /* allocate new outline */ - error = FT_Outline_New( library, source->n_points, source->n_contours, - &glyph->outline ); - if ( error ) - goto Exit; - - FT_Outline_Copy( source, target ); - - Exit: - return error; - } - - - FT_CALLBACK_DEF( void ) - ft_outline_glyph_done( FT_Glyph outline_glyph ) - { - FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; - - - FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline ); - } - - - FT_CALLBACK_DEF( FT_Error ) - ft_outline_glyph_copy( FT_Glyph outline_source, - FT_Glyph outline_target ) - { - FT_OutlineGlyph source = (FT_OutlineGlyph)outline_source; - FT_OutlineGlyph target = (FT_OutlineGlyph)outline_target; - FT_Error error; - FT_Library library = FT_GLYPH( source )->library; - - - error = FT_Outline_New( library, source->outline.n_points, - source->outline.n_contours, &target->outline ); - if ( !error ) - FT_Outline_Copy( &source->outline, &target->outline ); - - return error; - } - - - FT_CALLBACK_DEF( void ) - ft_outline_glyph_transform( FT_Glyph outline_glyph, - const FT_Matrix* matrix, - const FT_Vector* delta ) - { - FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; - - - if ( matrix ) - FT_Outline_Transform( &glyph->outline, matrix ); - - if ( delta ) - FT_Outline_Translate( &glyph->outline, delta->x, delta->y ); - } - - - FT_CALLBACK_DEF( void ) - ft_outline_glyph_bbox( FT_Glyph outline_glyph, - FT_BBox* bbox ) - { - FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; - - - FT_Outline_Get_CBox( &glyph->outline, bbox ); - } - - - FT_CALLBACK_DEF( FT_Error ) - ft_outline_glyph_prepare( FT_Glyph outline_glyph, - FT_GlyphSlot slot ) - { - FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; - - - slot->format = FT_GLYPH_FORMAT_OUTLINE; - slot->outline = glyph->outline; - slot->outline.flags &= ~FT_OUTLINE_OWNER; - - return FT_Err_Ok; - } - - - FT_DEFINE_GLYPH( ft_outline_glyph_class, - sizeof ( FT_OutlineGlyphRec ), - FT_GLYPH_FORMAT_OUTLINE, - - ft_outline_glyph_init, - ft_outline_glyph_done, - ft_outline_glyph_copy, - ft_outline_glyph_transform, - ft_outline_glyph_bbox, - ft_outline_glyph_prepare - ) - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** FT_Glyph class and API ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - static FT_Error - ft_new_glyph( FT_Library library, - const FT_Glyph_Class* clazz, - FT_Glyph* aglyph ) - { - FT_Memory memory = library->memory; - FT_Error error; - FT_Glyph glyph = NULL; - - - *aglyph = 0; - - if ( !FT_ALLOC( glyph, clazz->glyph_size ) ) - { - glyph->library = library; - glyph->clazz = clazz; - glyph->format = clazz->glyph_format; - - *aglyph = glyph; - } - - return error; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Glyph_Copy( FT_Glyph source, - FT_Glyph *target ) - { - FT_Glyph copy; - FT_Error error; - const FT_Glyph_Class* clazz; - - - /* check arguments */ - if ( !target ) - { - error = FT_Err_Invalid_Argument; - goto Exit; - } - - *target = 0; - - if ( !source || !source->clazz ) - { - error = FT_Err_Invalid_Argument; - goto Exit; - } - - clazz = source->clazz; - error = ft_new_glyph( source->library, clazz, © ); - if ( error ) - goto Exit; - - copy->advance = source->advance; - copy->format = source->format; - - if ( clazz->glyph_copy ) - error = clazz->glyph_copy( source, copy ); - - if ( error ) - FT_Done_Glyph( copy ); - else - *target = copy; - - Exit: - return error; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Glyph( FT_GlyphSlot slot, - FT_Glyph *aglyph ) - { - FT_Library library; - FT_Error error; - FT_Glyph glyph; - - const FT_Glyph_Class* clazz = 0; - - - if ( !slot ) - return FT_Err_Invalid_Slot_Handle; - - library = slot->library; - - if ( !aglyph ) - return FT_Err_Invalid_Argument; - - /* if it is a bitmap, that's easy :-) */ - if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) - clazz = FT_BITMAP_GLYPH_CLASS_GET; - - /* if it is an outline */ - else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) - clazz = FT_OUTLINE_GLYPH_CLASS_GET; - - else - { - /* try to find a renderer that supports the glyph image format */ - FT_Renderer render = FT_Lookup_Renderer( library, slot->format, 0 ); - - - if ( render ) - clazz = &render->glyph_class; - } - - if ( !clazz ) - { - error = FT_Err_Invalid_Glyph_Format; - goto Exit; - } - - /* create FT_Glyph object */ - error = ft_new_glyph( library, clazz, &glyph ); - if ( error ) - goto Exit; - - /* copy advance while converting it to 16.16 format */ - glyph->advance.x = slot->advance.x << 10; - glyph->advance.y = slot->advance.y << 10; - - /* now import the image from the glyph slot */ - error = clazz->glyph_init( glyph, slot ); - - /* if an error occurred, destroy the glyph */ - if ( error ) - FT_Done_Glyph( glyph ); - else - *aglyph = glyph; - - Exit: - return error; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Glyph_Transform( FT_Glyph glyph, - FT_Matrix* matrix, - FT_Vector* delta ) - { - const FT_Glyph_Class* clazz; - FT_Error error = FT_Err_Ok; - - - if ( !glyph || !glyph->clazz ) - error = FT_Err_Invalid_Argument; - else - { - clazz = glyph->clazz; - if ( clazz->glyph_transform ) - { - /* transform glyph image */ - clazz->glyph_transform( glyph, matrix, delta ); - - /* transform advance vector */ - if ( matrix ) - FT_Vector_Transform( &glyph->advance, matrix ); - } - else - error = FT_Err_Invalid_Glyph_Format; - } - return error; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( void ) - FT_Glyph_Get_CBox( FT_Glyph glyph, - FT_UInt bbox_mode, - FT_BBox *acbox ) - { - const FT_Glyph_Class* clazz; - - - if ( !acbox ) - return; - - acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0; - - if ( !glyph || !glyph->clazz ) - return; - else - { - clazz = glyph->clazz; - if ( !clazz->glyph_bbox ) - return; - else - { - /* retrieve bbox in 26.6 coordinates */ - clazz->glyph_bbox( glyph, acbox ); - - /* perform grid fitting if needed */ - if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT || - bbox_mode == FT_GLYPH_BBOX_PIXELS ) - { - acbox->xMin = FT_PIX_FLOOR( acbox->xMin ); - acbox->yMin = FT_PIX_FLOOR( acbox->yMin ); - acbox->xMax = FT_PIX_CEIL( acbox->xMax ); - acbox->yMax = FT_PIX_CEIL( acbox->yMax ); - } - - /* convert to integer pixels if needed */ - if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE || - bbox_mode == FT_GLYPH_BBOX_PIXELS ) - { - acbox->xMin >>= 6; - acbox->yMin >>= 6; - acbox->xMax >>= 6; - acbox->yMax >>= 6; - } - } - } - return; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, - FT_Render_Mode render_mode, - FT_Vector* origin, - FT_Bool destroy ) - { - FT_GlyphSlotRec dummy; - FT_GlyphSlot_InternalRec dummy_internal; - FT_Error error = FT_Err_Ok; - FT_Glyph glyph; - FT_BitmapGlyph bitmap = NULL; - - const FT_Glyph_Class* clazz; - -#ifdef FT_CONFIG_OPTION_PIC - FT_Library library = FT_GLYPH( glyph )->library; -#endif - - - /* check argument */ - if ( !the_glyph ) - goto Bad; - - /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */ - /* then calling FT_Render_Glyph_Internal() */ - - glyph = *the_glyph; - if ( !glyph ) - goto Bad; - - clazz = glyph->clazz; - - /* when called with a bitmap glyph, do nothing and return successfully */ - if ( clazz == FT_BITMAP_GLYPH_CLASS_GET ) - goto Exit; - - if ( !clazz || !clazz->glyph_prepare ) - goto Bad; - - FT_MEM_ZERO( &dummy, sizeof ( dummy ) ); - FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) ); - dummy.internal = &dummy_internal; - dummy.library = glyph->library; - dummy.format = clazz->glyph_format; - - /* create result bitmap glyph */ - error = ft_new_glyph( glyph->library, FT_BITMAP_GLYPH_CLASS_GET, - (FT_Glyph*)(void*)&bitmap ); - if ( error ) - goto Exit; - -#if 1 - /* if `origin' is set, translate the glyph image */ - if ( origin ) - FT_Glyph_Transform( glyph, 0, origin ); -#else - FT_UNUSED( origin ); -#endif - - /* prepare dummy slot for rendering */ - error = clazz->glyph_prepare( glyph, &dummy ); - if ( !error ) - error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode ); - -#if 1 - if ( !destroy && origin ) - { - FT_Vector v; - - - v.x = -origin->x; - v.y = -origin->y; - FT_Glyph_Transform( glyph, 0, &v ); - } -#endif - - if ( error ) - goto Exit; - - /* in case of success, copy the bitmap to the glyph bitmap */ - error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy ); - if ( error ) - goto Exit; - - /* copy advance */ - bitmap->root.advance = glyph->advance; - - if ( destroy ) - FT_Done_Glyph( glyph ); - - *the_glyph = FT_GLYPH( bitmap ); - - Exit: - if ( error && bitmap ) - FT_Done_Glyph( FT_GLYPH( bitmap ) ); - - return error; - - Bad: - error = FT_Err_Invalid_Argument; - goto Exit; - } - - - /* documentation is in ftglyph.h */ - - FT_EXPORT_DEF( void ) - FT_Done_Glyph( FT_Glyph glyph ) - { - if ( glyph ) - { - FT_Memory memory = glyph->library->memory; - const FT_Glyph_Class* clazz = glyph->clazz; - - - if ( clazz->glyph_done ) - clazz->glyph_done( glyph ); - - FT_FREE( glyph ); - } - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftinit.c b/android/jni/ndk_modules/freetype/src/base/ftinit.c deleted file mode 100644 index 305177a7..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftinit.c +++ /dev/null @@ -1,253 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftinit.c */ -/* */ -/* FreeType initialization layer (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2005, 2007, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* The purpose of this file is to implement the following two */ - /* functions: */ - /* */ - /* FT_Add_Default_Modules(): */ - /* This function is used to add the set of default modules to a */ - /* fresh new library object. The set is taken from the header file */ - /* `freetype/config/ftmodule.h'. See the document `FreeType 2.0 */ - /* Build System' for more information. */ - /* */ - /* FT_Init_FreeType(): */ - /* This function creates a system object for the current platform, */ - /* builds a library out of it, then calls FT_Default_Drivers(). */ - /* */ - /* Note that even if FT_Init_FreeType() uses the implementation of the */ - /* system object defined at build time, client applications are still */ - /* able to provide their own `ftsystem.c'. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_MODULE_H -#include "basepic.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_init - -#ifndef FT_CONFIG_OPTION_PIC - -#undef FT_USE_MODULE -#ifdef __cplusplus -#define FT_USE_MODULE( type, x ) extern "C" const type x; -#else -#define FT_USE_MODULE( type, x ) extern const type x; -#endif - - -#include FT_CONFIG_MODULES_H - - -#undef FT_USE_MODULE -#define FT_USE_MODULE( type, x ) (const FT_Module_Class*)&(x), - - static - const FT_Module_Class* const ft_default_modules[] = - { -#include FT_CONFIG_MODULES_H - 0 - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#ifdef __cplusplus -#define FT_EXTERNC extern "C" -#else -#define FT_EXTERNC extern -#endif - - /* declare the module's class creation/destruction functions */ -#undef FT_USE_MODULE -#define FT_USE_MODULE( type, x ) \ - FT_EXTERNC FT_Error FT_Create_Class_##x( FT_Library library, FT_Module_Class** output_class ); \ - FT_EXTERNC void FT_Destroy_Class_##x( FT_Library library, FT_Module_Class* clazz ); - -#include FT_CONFIG_MODULES_H - - - /* count all module classes */ -#undef FT_USE_MODULE -#define FT_USE_MODULE( type, x ) MODULE_CLASS_##x, - - enum - { -#include FT_CONFIG_MODULES_H - FT_NUM_MODULE_CLASSES - }; - - /* destroy all module classes */ -#undef FT_USE_MODULE -#define FT_USE_MODULE( type, x ) \ - if ( classes[i] ) { FT_Destroy_Class_##x(library, classes[i]); } \ - i++; \ - - FT_BASE_DEF( void ) - ft_destroy_default_module_classes( FT_Library library ) - { - FT_Module_Class** classes; - FT_Memory memory; - FT_UInt i; - BasePIC* pic_container = (BasePIC*)library->pic_container.base; - - if ( !pic_container->default_module_classes ) - return; - - memory = library->memory; - classes = pic_container->default_module_classes; - i = 0; - -#include FT_CONFIG_MODULES_H - - FT_FREE( classes ); - pic_container->default_module_classes = 0; - } - - /* initialize all module classes and the pointer table */ -#undef FT_USE_MODULE -#define FT_USE_MODULE( type, x ) \ - error = FT_Create_Class_##x(library, &clazz); \ - if (error) goto Exit; \ - classes[i++] = clazz; - - FT_BASE_DEF( FT_Error ) - ft_create_default_module_classes( FT_Library library ) - { - FT_Error error; - FT_Memory memory; - FT_Module_Class** classes; - FT_Module_Class* clazz; - FT_UInt i; - BasePIC* pic_container = (BasePIC*)library->pic_container.base; - - memory = library->memory; - pic_container->default_module_classes = 0; - - if ( FT_ALLOC(classes, sizeof(FT_Module_Class*) * (FT_NUM_MODULE_CLASSES + 1) ) ) - return error; - /* initialize all pointers to 0, especially the last one */ - for (i = 0; i < FT_NUM_MODULE_CLASSES; i++) - classes[i] = 0; - classes[FT_NUM_MODULE_CLASSES] = 0; - - i = 0; - -#include FT_CONFIG_MODULES_H - -Exit: - if (error) ft_destroy_default_module_classes( library ); - else pic_container->default_module_classes = classes; - - return error; - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( void ) - FT_Add_Default_Modules( FT_Library library ) - { - FT_Error error; - const FT_Module_Class* const* cur; - - - /* test for valid `library' delayed to FT_Add_Module() */ - - cur = FT_DEFAULT_MODULES_GET; - while ( *cur ) - { - error = FT_Add_Module( library, *cur ); - /* notify errors, but don't stop */ - if ( error ) - FT_TRACE0(( "FT_Add_Default_Module:" - " Cannot install `%s', error = 0x%x\n", - (*cur)->module_name, error )); - cur++; - } - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Init_FreeType( FT_Library *alibrary ) - { - FT_Error error; - FT_Memory memory; - - - /* First of all, allocate a new system object -- this function is part */ - /* of the system-specific component, i.e. `ftsystem.c'. */ - - memory = FT_New_Memory(); - if ( !memory ) - { - FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" )); - return FT_Err_Unimplemented_Feature; - } - - /* build a library out of it, then fill it with the set of */ - /* default drivers. */ - - error = FT_New_Library( memory, alibrary ); - if ( error ) - FT_Done_Memory( memory ); - else - FT_Add_Default_Modules( *alibrary ); - - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Done_FreeType( FT_Library library ) - { - if ( library ) - { - FT_Memory memory = library->memory; - - - /* Discard the library object */ - FT_Done_Library( library ); - - /* discard memory manager */ - FT_Done_Memory( memory ); - } - - return FT_Err_Ok; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftlcdfil.c b/android/jni/ndk_modules/freetype/src/base/ftlcdfil.c deleted file mode 100644 index 0da4ba16..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftlcdfil.c +++ /dev/null @@ -1,376 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftlcdfil.c */ -/* */ -/* FreeType API for color filtering of subpixel bitmap glyphs (body). */ -/* */ -/* Copyright 2006, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_LCD_FILTER_H -#include FT_IMAGE_H -#include FT_INTERNAL_OBJECTS_H - - -#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - -/* define USE_LEGACY to implement the legacy filter */ -#define USE_LEGACY - - /* FIR filter used by the default and light filters */ - static void - _ft_lcd_filter_fir( FT_Bitmap* bitmap, - FT_Render_Mode mode, - FT_Library library ) - { - FT_Byte* weights = library->lcd_weights; - FT_UInt width = (FT_UInt)bitmap->width; - FT_UInt height = (FT_UInt)bitmap->rows; - - - /* horizontal in-place FIR filter */ - if ( mode == FT_RENDER_MODE_LCD && width >= 4 ) - { - FT_Byte* line = bitmap->buffer; - - - for ( ; height > 0; height--, line += bitmap->pitch ) - { - FT_UInt fir[5]; - FT_UInt val1, xx; - - - val1 = line[0]; - fir[0] = weights[2] * val1; - fir[1] = weights[3] * val1; - fir[2] = weights[4] * val1; - fir[3] = 0; - fir[4] = 0; - - val1 = line[1]; - fir[0] += weights[1] * val1; - fir[1] += weights[2] * val1; - fir[2] += weights[3] * val1; - fir[3] += weights[4] * val1; - - for ( xx = 2; xx < width; xx++ ) - { - FT_UInt val, pix; - - - val = line[xx]; - pix = fir[0] + weights[0] * val; - fir[0] = fir[1] + weights[1] * val; - fir[1] = fir[2] + weights[2] * val; - fir[2] = fir[3] + weights[3] * val; - fir[3] = weights[4] * val; - - pix >>= 8; - pix |= -( pix >> 8 ); - line[xx - 2] = (FT_Byte)pix; - } - - { - FT_UInt pix; - - - pix = fir[0] >> 8; - pix |= -( pix >> 8 ); - line[xx - 2] = (FT_Byte)pix; - - pix = fir[1] >> 8; - pix |= -( pix >> 8 ); - line[xx - 1] = (FT_Byte)pix; - } - } - } - - /* vertical in-place FIR filter */ - else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 ) - { - FT_Byte* column = bitmap->buffer; - FT_Int pitch = bitmap->pitch; - - - for ( ; width > 0; width--, column++ ) - { - FT_Byte* col = column; - FT_UInt fir[5]; - FT_UInt val1, yy; - - - val1 = col[0]; - fir[0] = weights[2] * val1; - fir[1] = weights[3] * val1; - fir[2] = weights[4] * val1; - fir[3] = 0; - fir[4] = 0; - col += pitch; - - val1 = col[0]; - fir[0] += weights[1] * val1; - fir[1] += weights[2] * val1; - fir[2] += weights[3] * val1; - fir[3] += weights[4] * val1; - col += pitch; - - for ( yy = 2; yy < height; yy++ ) - { - FT_UInt val, pix; - - - val = col[0]; - pix = fir[0] + weights[0] * val; - fir[0] = fir[1] + weights[1] * val; - fir[1] = fir[2] + weights[2] * val; - fir[2] = fir[3] + weights[3] * val; - fir[3] = weights[4] * val; - - pix >>= 8; - pix |= -( pix >> 8 ); - col[-2 * pitch] = (FT_Byte)pix; - col += pitch; - } - - { - FT_UInt pix; - - - pix = fir[0] >> 8; - pix |= -( pix >> 8 ); - col[-2 * pitch] = (FT_Byte)pix; - - pix = fir[1] >> 8; - pix |= -( pix >> 8 ); - col[-pitch] = (FT_Byte)pix; - } - } - } - } - - -#ifdef USE_LEGACY - - /* intra-pixel filter used by the legacy filter */ - static void - _ft_lcd_filter_legacy( FT_Bitmap* bitmap, - FT_Render_Mode mode, - FT_Library library ) - { - FT_UInt width = (FT_UInt)bitmap->width; - FT_UInt height = (FT_UInt)bitmap->rows; - FT_Int pitch = bitmap->pitch; - - static const int filters[3][3] = - { - { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 }, - { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 }, - { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 } - }; - - FT_UNUSED( library ); - - - /* horizontal in-place intra-pixel filter */ - if ( mode == FT_RENDER_MODE_LCD && width >= 3 ) - { - FT_Byte* line = bitmap->buffer; - - - for ( ; height > 0; height--, line += pitch ) - { - FT_UInt xx; - - - for ( xx = 0; xx < width; xx += 3 ) - { - FT_UInt r = 0; - FT_UInt g = 0; - FT_UInt b = 0; - FT_UInt p; - - - p = line[xx]; - r += filters[0][0] * p; - g += filters[0][1] * p; - b += filters[0][2] * p; - - p = line[xx + 1]; - r += filters[1][0] * p; - g += filters[1][1] * p; - b += filters[1][2] * p; - - p = line[xx + 2]; - r += filters[2][0] * p; - g += filters[2][1] * p; - b += filters[2][2] * p; - - line[xx] = (FT_Byte)( r / 65536 ); - line[xx + 1] = (FT_Byte)( g / 65536 ); - line[xx + 2] = (FT_Byte)( b / 65536 ); - } - } - } - else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 ) - { - FT_Byte* column = bitmap->buffer; - - - for ( ; width > 0; width--, column++ ) - { - FT_Byte* col = column; - FT_Byte* col_end = col + height * pitch; - - - for ( ; col < col_end; col += 3 * pitch ) - { - FT_UInt r = 0; - FT_UInt g = 0; - FT_UInt b = 0; - FT_UInt p; - - - p = col[0]; - r += filters[0][0] * p; - g += filters[0][1] * p; - b += filters[0][2] * p; - - p = col[pitch]; - r += filters[1][0] * p; - g += filters[1][1] * p; - b += filters[1][2] * p; - - p = col[pitch * 2]; - r += filters[2][0] * p; - g += filters[2][1] * p; - b += filters[2][2] * p; - - col[0] = (FT_Byte)( r / 65536 ); - col[pitch] = (FT_Byte)( g / 65536 ); - col[2 * pitch] = (FT_Byte)( b / 65536 ); - } - } - } - } - -#endif /* USE_LEGACY */ - - - FT_EXPORT_DEF( FT_Error ) - FT_Library_SetLcdFilterWeights( FT_Library library, - unsigned char *weights ) - { - if ( !library || !weights ) - return FT_Err_Invalid_Argument; - - ft_memcpy( library->lcd_weights, weights, 5 ); - - return FT_Err_Ok; - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Library_SetLcdFilter( FT_Library library, - FT_LcdFilter filter ) - { - static const FT_Byte light_filter[5] = - { 0x00, 0x55, 0x56, 0x55, 0x00 }; - /* the values here sum up to a value larger than 256, */ - /* providing a cheap gamma correction */ - static const FT_Byte default_filter[5] = - { 0x10, 0x40, 0x70, 0x40, 0x10 }; - - - if ( !library ) - return FT_Err_Invalid_Argument; - - switch ( filter ) - { - case FT_LCD_FILTER_NONE: - library->lcd_filter_func = NULL; - library->lcd_extra = 0; - break; - - case FT_LCD_FILTER_DEFAULT: -#if defined( FT_FORCE_LEGACY_LCD_FILTER ) - - library->lcd_filter_func = _ft_lcd_filter_legacy; - library->lcd_extra = 0; - -#elif defined( FT_FORCE_LIGHT_LCD_FILTER ) - - ft_memcpy( library->lcd_weights, light_filter, 5 ); - library->lcd_filter_func = _ft_lcd_filter_fir; - library->lcd_extra = 2; - -#else - - ft_memcpy( library->lcd_weights, default_filter, 5 ); - library->lcd_filter_func = _ft_lcd_filter_fir; - library->lcd_extra = 2; - -#endif - - break; - - case FT_LCD_FILTER_LIGHT: - ft_memcpy( library->lcd_weights, light_filter, 5 ); - library->lcd_filter_func = _ft_lcd_filter_fir; - library->lcd_extra = 2; - break; - -#ifdef USE_LEGACY - - case FT_LCD_FILTER_LEGACY: - library->lcd_filter_func = _ft_lcd_filter_legacy; - library->lcd_extra = 0; - break; - -#endif - - default: - return FT_Err_Invalid_Argument; - } - - library->lcd_filter = filter; - - return FT_Err_Ok; - } - -#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - - FT_EXPORT_DEF( FT_Error ) - FT_Library_SetLcdFilterWeights( FT_Library library, - unsigned char *weights ) - { - FT_UNUSED( library ); - FT_UNUSED( weights ); - - return FT_Err_Unimplemented_Feature; - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Library_SetLcdFilter( FT_Library library, - FT_LcdFilter filter ) - { - FT_UNUSED( library ); - FT_UNUSED( filter ); - - return FT_Err_Unimplemented_Feature; - } - -#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftmm.c b/android/jni/ndk_modules/freetype/src/base/ftmm.c deleted file mode 100644 index 03077298..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftmm.c +++ /dev/null @@ -1,202 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmm.c */ -/* */ -/* Multiple Master font support (body). */ -/* */ -/* Copyright 1996-2001, 2003, 2004, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_MULTIPLE_MASTERS_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_mm - - - static FT_Error - ft_face_get_mm_service( FT_Face face, - FT_Service_MultiMasters *aservice ) - { - FT_Error error; - - - *aservice = NULL; - - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - error = FT_Err_Invalid_Argument; - - if ( FT_HAS_MULTIPLE_MASTERS( face ) ) - { - FT_FACE_LOOKUP_SERVICE( face, - *aservice, - MULTI_MASTERS ); - - if ( *aservice ) - error = FT_Err_Ok; - } - - return error; - } - - - /* documentation is in ftmm.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Multi_Master( FT_Face face, - FT_Multi_Master *amaster ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_Err_Invalid_Argument; - if ( service->get_mm ) - error = service->get_mm( face, amaster ); - } - - return error; - } - - - /* documentation is in ftmm.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_MM_Var( FT_Face face, - FT_MM_Var* *amaster ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_Err_Invalid_Argument; - if ( service->get_mm_var ) - error = service->get_mm_var( face, amaster ); - } - - return error; - } - - - /* documentation is in ftmm.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_MM_Design_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_Err_Invalid_Argument; - if ( service->set_mm_design ) - error = service->set_mm_design( face, num_coords, coords ); - } - - return error; - } - - - /* documentation is in ftmm.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_Var_Design_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_Err_Invalid_Argument; - if ( service->set_var_design ) - error = service->set_var_design( face, num_coords, coords ); - } - - return error; - } - - - /* documentation is in ftmm.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_MM_Blend_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_Err_Invalid_Argument; - if ( service->set_mm_blend ) - error = service->set_mm_blend( face, num_coords, coords ); - } - - return error; - } - - - /* documentation is in ftmm.h */ - - /* This is exactly the same as the previous function. It exists for */ - /* orthogonality. */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_Var_Blend_Coordinates( FT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_Err_Invalid_Argument; - if ( service->set_mm_blend ) - error = service->set_mm_blend( face, num_coords, coords ); - } - - return error; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftobjs.c b/android/jni/ndk_modules/freetype/src/base/ftobjs.c deleted file mode 100644 index 7f38df0c..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftobjs.c +++ /dev/null @@ -1,4647 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftobjs.c */ -/* */ -/* The FreeType private base classes (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_LIST_H -#include FT_OUTLINE_H -#include FT_INTERNAL_VALIDATE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_RFORK_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H /* for SFNT_Load_Table_Func */ -#include FT_TRUETYPE_TABLES_H -#include FT_TRUETYPE_TAGS_H -#include FT_TRUETYPE_IDS_H - -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_TT_CMAP_H -#include FT_SERVICE_KERNING_H -#include FT_SERVICE_TRUETYPE_ENGINE_H - -#ifdef FT_CONFIG_OPTION_MAC_FONTS -#include "ftbase.h" -#endif - -#define GRID_FIT_METRICS - - - FT_BASE_DEF( FT_Pointer ) - ft_service_list_lookup( FT_ServiceDesc service_descriptors, - const char* service_id ) - { - FT_Pointer result = NULL; - FT_ServiceDesc desc = service_descriptors; - - - if ( desc && service_id ) - { - for ( ; desc->serv_id != NULL; desc++ ) - { - if ( ft_strcmp( desc->serv_id, service_id ) == 0 ) - { - result = (FT_Pointer)desc->serv_data; - break; - } - } - } - - return result; - } - - - FT_BASE_DEF( void ) - ft_validator_init( FT_Validator valid, - const FT_Byte* base, - const FT_Byte* limit, - FT_ValidationLevel level ) - { - valid->base = base; - valid->limit = limit; - valid->level = level; - valid->error = FT_Err_Ok; - } - - - FT_BASE_DEF( FT_Int ) - ft_validator_run( FT_Validator valid ) - { - /* This function doesn't work! None should call it. */ - FT_UNUSED( valid ); - - return -1; - } - - - FT_BASE_DEF( void ) - ft_validator_error( FT_Validator valid, - FT_Error error ) - { - /* since the cast below also disables the compiler's */ - /* type check, we introduce a dummy variable, which */ - /* will be optimized away */ - volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer; - - - valid->error = error; - - /* throw away volatileness; use `jump_buffer' or the */ - /* compiler may warn about an unused local variable */ - ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** S T R E A M ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* create a new input stream from an FT_Open_Args structure */ - /* */ - FT_BASE_DEF( FT_Error ) - FT_Stream_New( FT_Library library, - const FT_Open_Args* args, - FT_Stream *astream ) - { - FT_Error error; - FT_Memory memory; - FT_Stream stream; - - - *astream = 0; - - if ( !library ) - return FT_Err_Invalid_Library_Handle; - - if ( !args ) - return FT_Err_Invalid_Argument; - - memory = library->memory; - - if ( FT_NEW( stream ) ) - goto Exit; - - stream->memory = memory; - - if ( args->flags & FT_OPEN_MEMORY ) - { - /* create a memory-based stream */ - FT_Stream_OpenMemory( stream, - (const FT_Byte*)args->memory_base, - args->memory_size ); - } - else if ( args->flags & FT_OPEN_PATHNAME ) - { - /* create a normal system stream */ - error = FT_Stream_Open( stream, args->pathname ); - stream->pathname.pointer = args->pathname; - } - else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream ) - { - /* use an existing, user-provided stream */ - - /* in this case, we do not need to allocate a new stream object */ - /* since the caller is responsible for closing it himself */ - FT_FREE( stream ); - stream = args->stream; - } - else - error = FT_Err_Invalid_Argument; - - if ( error ) - FT_FREE( stream ); - else - stream->memory = memory; /* just to be certain */ - - *astream = stream; - - Exit: - return error; - } - - - FT_BASE_DEF( void ) - FT_Stream_Free( FT_Stream stream, - FT_Int external ) - { - if ( stream ) - { - FT_Memory memory = stream->memory; - - - FT_Stream_Close( stream ); - - if ( !external ) - FT_FREE( stream ); - } - } - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_objs - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - static FT_Error - ft_glyphslot_init( FT_GlyphSlot slot ) - { - FT_Driver driver = slot->face->driver; - FT_Driver_Class clazz = driver->clazz; - FT_Memory memory = driver->root.memory; - FT_Error error = FT_Err_Ok; - FT_Slot_Internal internal = NULL; - - - slot->library = driver->root.library; - - if ( FT_NEW( internal ) ) - goto Exit; - - slot->internal = internal; - - if ( FT_DRIVER_USES_OUTLINES( driver ) ) - error = FT_GlyphLoader_New( memory, &internal->loader ); - - if ( !error && clazz->init_slot ) - error = clazz->init_slot( slot ); - - Exit: - return error; - } - - - FT_BASE_DEF( void ) - ft_glyphslot_free_bitmap( FT_GlyphSlot slot ) - { - if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) - { - FT_Memory memory = FT_FACE_MEMORY( slot->face ); - - - FT_FREE( slot->bitmap.buffer ); - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; - } - else - { - /* assume that the bitmap buffer was stolen or not */ - /* allocated from the heap */ - slot->bitmap.buffer = NULL; - } - } - - - FT_BASE_DEF( void ) - ft_glyphslot_set_bitmap( FT_GlyphSlot slot, - FT_Byte* buffer ) - { - ft_glyphslot_free_bitmap( slot ); - - slot->bitmap.buffer = buffer; - - FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 ); - } - - - FT_BASE_DEF( FT_Error ) - ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, - FT_ULong size ) - { - FT_Memory memory = FT_FACE_MEMORY( slot->face ); - FT_Error error; - - - if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) - FT_FREE( slot->bitmap.buffer ); - else - slot->internal->flags |= FT_GLYPH_OWN_BITMAP; - - (void)FT_ALLOC( slot->bitmap.buffer, size ); - return error; - } - - - static void - ft_glyphslot_clear( FT_GlyphSlot slot ) - { - /* free bitmap if needed */ - ft_glyphslot_free_bitmap( slot ); - - /* clear all public fields in the glyph slot */ - FT_ZERO( &slot->metrics ); - FT_ZERO( &slot->outline ); - - slot->bitmap.width = 0; - slot->bitmap.rows = 0; - slot->bitmap.pitch = 0; - slot->bitmap.pixel_mode = 0; - /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */ - - slot->bitmap_left = 0; - slot->bitmap_top = 0; - slot->num_subglyphs = 0; - slot->subglyphs = 0; - slot->control_data = 0; - slot->control_len = 0; - slot->other = 0; - slot->format = FT_GLYPH_FORMAT_NONE; - - slot->linearHoriAdvance = 0; - slot->linearVertAdvance = 0; - slot->lsb_delta = 0; - slot->rsb_delta = 0; - } - - - static void - ft_glyphslot_done( FT_GlyphSlot slot ) - { - FT_Driver driver = slot->face->driver; - FT_Driver_Class clazz = driver->clazz; - FT_Memory memory = driver->root.memory; - - - if ( clazz->done_slot ) - clazz->done_slot( slot ); - - /* free bitmap buffer if needed */ - ft_glyphslot_free_bitmap( slot ); - - /* slot->internal might be NULL in out-of-memory situations */ - if ( slot->internal ) - { - /* free glyph loader */ - if ( FT_DRIVER_USES_OUTLINES( driver ) ) - { - FT_GlyphLoader_Done( slot->internal->loader ); - slot->internal->loader = 0; - } - - FT_FREE( slot->internal ); - } - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( FT_Error ) - FT_New_GlyphSlot( FT_Face face, - FT_GlyphSlot *aslot ) - { - FT_Error error; - FT_Driver driver; - FT_Driver_Class clazz; - FT_Memory memory; - FT_GlyphSlot slot; - - - if ( !face || !face->driver ) - return FT_Err_Invalid_Argument; - - driver = face->driver; - clazz = driver->clazz; - memory = driver->root.memory; - - FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" )); - if ( !FT_ALLOC( slot, clazz->slot_object_size ) ) - { - slot->face = face; - - error = ft_glyphslot_init( slot ); - if ( error ) - { - ft_glyphslot_done( slot ); - FT_FREE( slot ); - goto Exit; - } - - slot->next = face->glyph; - face->glyph = slot; - - if ( aslot ) - *aslot = slot; - } - else if ( aslot ) - *aslot = 0; - - - Exit: - FT_TRACE4(( "FT_New_GlyphSlot: Return %d\n", error )); - return error; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( void ) - FT_Done_GlyphSlot( FT_GlyphSlot slot ) - { - if ( slot ) - { - FT_Driver driver = slot->face->driver; - FT_Memory memory = driver->root.memory; - FT_GlyphSlot prev; - FT_GlyphSlot cur; - - - /* Remove slot from its parent face's list */ - prev = NULL; - cur = slot->face->glyph; - - while ( cur ) - { - if ( cur == slot ) - { - if ( !prev ) - slot->face->glyph = cur->next; - else - prev->next = cur->next; - - ft_glyphslot_done( slot ); - FT_FREE( slot ); - break; - } - prev = cur; - cur = cur->next; - } - } - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( void ) - FT_Set_Transform( FT_Face face, - FT_Matrix* matrix, - FT_Vector* delta ) - { - FT_Face_Internal internal; - - - if ( !face ) - return; - - internal = face->internal; - - internal->transform_flags = 0; - - if ( !matrix ) - { - internal->transform_matrix.xx = 0x10000L; - internal->transform_matrix.xy = 0; - internal->transform_matrix.yx = 0; - internal->transform_matrix.yy = 0x10000L; - matrix = &internal->transform_matrix; - } - else - internal->transform_matrix = *matrix; - - /* set transform_flags bit flag 0 if `matrix' isn't the identity */ - if ( ( matrix->xy | matrix->yx ) || - matrix->xx != 0x10000L || - matrix->yy != 0x10000L ) - internal->transform_flags |= 1; - - if ( !delta ) - { - internal->transform_delta.x = 0; - internal->transform_delta.y = 0; - delta = &internal->transform_delta; - } - else - internal->transform_delta = *delta; - - /* set transform_flags bit flag 1 if `delta' isn't the null vector */ - if ( delta->x | delta->y ) - internal->transform_flags |= 2; - } - - - static FT_Renderer - ft_lookup_glyph_renderer( FT_GlyphSlot slot ); - - -#ifdef GRID_FIT_METRICS - static void - ft_glyphslot_grid_fit_metrics( FT_GlyphSlot slot, - FT_Bool vertical ) - { - FT_Glyph_Metrics* metrics = &slot->metrics; - FT_Pos right, bottom; - - - if ( vertical ) - { - metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); - metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY ); - - right = FT_PIX_CEIL( metrics->vertBearingX + metrics->width ); - bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height ); - - metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); - metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); - - metrics->width = right - metrics->vertBearingX; - metrics->height = bottom - metrics->vertBearingY; - } - else - { - metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); - metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); - - right = FT_PIX_CEIL ( metrics->horiBearingX + metrics->width ); - bottom = FT_PIX_FLOOR( metrics->horiBearingY - metrics->height ); - - metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); - metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY ); - - metrics->width = right - metrics->horiBearingX; - metrics->height = metrics->horiBearingY - bottom; - } - - metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance ); - metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance ); - } -#endif /* GRID_FIT_METRICS */ - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Load_Glyph( FT_Face face, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_Error error; - FT_Driver driver; - FT_GlyphSlot slot; - FT_Library library; - FT_Bool autohint = FALSE; - FT_Module hinter; - - - if ( !face || !face->size || !face->glyph ) - return FT_Err_Invalid_Face_Handle; - - /* The validity test for `glyph_index' is performed by the */ - /* font drivers. */ - - slot = face->glyph; - ft_glyphslot_clear( slot ); - - driver = face->driver; - library = driver->root.library; - hinter = library->auto_hinter; - - /* resolve load flags dependencies */ - - if ( load_flags & FT_LOAD_NO_RECURSE ) - load_flags |= FT_LOAD_NO_SCALE | - FT_LOAD_IGNORE_TRANSFORM; - - if ( load_flags & FT_LOAD_NO_SCALE ) - { - load_flags |= FT_LOAD_NO_HINTING | - FT_LOAD_NO_BITMAP; - - load_flags &= ~FT_LOAD_RENDER; - } - - /* - * Determine whether we need to auto-hint or not. - * The general rules are: - * - * - Do only auto-hinting if we have a hinter module, a scalable font - * format dealing with outlines, and no transforms except simple - * slants and/or rotations by integer multiples of 90 degrees. - * - * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't - * have a native font hinter. - * - * - Otherwise, auto-hint for LIGHT hinting mode. - * - * - Exception: The font is `tricky' and requires the native hinter to - * load properly. - */ - - if ( hinter && - !( load_flags & FT_LOAD_NO_HINTING ) && - !( load_flags & FT_LOAD_NO_AUTOHINT ) && - FT_DRIVER_IS_SCALABLE( driver ) && - FT_DRIVER_USES_OUTLINES( driver ) && - !FT_IS_TRICKY( face ) && - ( ( face->internal->transform_matrix.yx == 0 && - face->internal->transform_matrix.xx != 0 ) || - ( face->internal->transform_matrix.xx == 0 && - face->internal->transform_matrix.yx != 0 ) ) ) - { - if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) || - !FT_DRIVER_HAS_HINTER( driver ) ) - autohint = TRUE; - else - { - FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); - - - if ( mode == FT_RENDER_MODE_LIGHT || - face->internal->ignore_unpatented_hinter ) - autohint = TRUE; - } - } - - if ( autohint ) - { - FT_AutoHinter_Service hinting; - - - /* try to load embedded bitmaps first if available */ - /* */ - /* XXX: This is really a temporary hack that should disappear */ - /* promptly with FreeType 2.1! */ - /* */ - if ( FT_HAS_FIXED_SIZES( face ) && - ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) - { - error = driver->clazz->load_glyph( slot, face->size, - glyph_index, - load_flags | FT_LOAD_SBITS_ONLY ); - - if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP ) - goto Load_Ok; - } - - { - FT_Face_Internal internal = face->internal; - FT_Int transform_flags = internal->transform_flags; - - - /* since the auto-hinter calls FT_Load_Glyph by itself, */ - /* make sure that glyphs aren't transformed */ - internal->transform_flags = 0; - - /* load auto-hinted outline */ - hinting = (FT_AutoHinter_Service)hinter->clazz->module_interface; - - error = hinting->load_glyph( (FT_AutoHinter)hinter, - slot, face->size, - glyph_index, load_flags ); - - internal->transform_flags = transform_flags; - } - } - else - { - error = driver->clazz->load_glyph( slot, - face->size, - glyph_index, - load_flags ); - if ( error ) - goto Exit; - - if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) - { - /* check that the loaded outline is correct */ - error = FT_Outline_Check( &slot->outline ); - if ( error ) - goto Exit; - -#ifdef GRID_FIT_METRICS - if ( !( load_flags & FT_LOAD_NO_HINTING ) ) - ft_glyphslot_grid_fit_metrics( slot, - FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) ); -#endif - } - } - - Load_Ok: - /* compute the advance */ - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - { - slot->advance.x = 0; - slot->advance.y = slot->metrics.vertAdvance; - } - else - { - slot->advance.x = slot->metrics.horiAdvance; - slot->advance.y = 0; - } - - /* compute the linear advance in 16.16 pixels */ - if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 && - ( FT_IS_SCALABLE( face ) ) ) - { - FT_Size_Metrics* metrics = &face->size->metrics; - - - /* it's tricky! */ - slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance, - metrics->x_scale, 64 ); - - slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance, - metrics->y_scale, 64 ); - } - - if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 ) - { - FT_Face_Internal internal = face->internal; - - - /* now, transform the glyph image if needed */ - if ( internal->transform_flags ) - { - /* get renderer */ - FT_Renderer renderer = ft_lookup_glyph_renderer( slot ); - - - if ( renderer ) - error = renderer->clazz->transform_glyph( - renderer, slot, - &internal->transform_matrix, - &internal->transform_delta ); - else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) - { - /* apply `standard' transformation if no renderer is available */ - if ( &internal->transform_matrix ) - FT_Outline_Transform( &slot->outline, - &internal->transform_matrix ); - - if ( &internal->transform_delta ) - FT_Outline_Translate( &slot->outline, - internal->transform_delta.x, - internal->transform_delta.y ); - } - - /* transform advance */ - FT_Vector_Transform( &slot->advance, &internal->transform_matrix ); - } - } - - FT_TRACE5(( " x advance: %d\n" , slot->advance.x )); - FT_TRACE5(( " y advance: %d\n" , slot->advance.y )); - - FT_TRACE5(( " linear x advance: %d\n" , slot->linearHoriAdvance )); - FT_TRACE5(( " linear y advance: %d\n" , slot->linearVertAdvance )); - - /* do we need to render the image now? */ - if ( !error && - slot->format != FT_GLYPH_FORMAT_BITMAP && - slot->format != FT_GLYPH_FORMAT_COMPOSITE && - load_flags & FT_LOAD_RENDER ) - { - FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); - - - if ( mode == FT_RENDER_MODE_NORMAL && - (load_flags & FT_LOAD_MONOCHROME ) ) - mode = FT_RENDER_MODE_MONO; - - error = FT_Render_Glyph( slot, mode ); - } - - Exit: - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Load_Char( FT_Face face, - FT_ULong char_code, - FT_Int32 load_flags ) - { - FT_UInt glyph_index; - - - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - glyph_index = (FT_UInt)char_code; - if ( face->charmap ) - glyph_index = FT_Get_Char_Index( face, char_code ); - - return FT_Load_Glyph( face, glyph_index, load_flags ); - } - - - /* destructor for sizes list */ - static void - destroy_size( FT_Memory memory, - FT_Size size, - FT_Driver driver ) - { - /* finalize client-specific data */ - if ( size->generic.finalizer ) - size->generic.finalizer( size ); - - /* finalize format-specific stuff */ - if ( driver->clazz->done_size ) - driver->clazz->done_size( size ); - - FT_FREE( size->internal ); - FT_FREE( size ); - } - - - static void - ft_cmap_done_internal( FT_CMap cmap ); - - - static void - destroy_charmaps( FT_Face face, - FT_Memory memory ) - { - FT_Int n; - - - if ( !face ) - return; - - for ( n = 0; n < face->num_charmaps; n++ ) - { - FT_CMap cmap = FT_CMAP( face->charmaps[n] ); - - - ft_cmap_done_internal( cmap ); - - face->charmaps[n] = NULL; - } - - FT_FREE( face->charmaps ); - face->num_charmaps = 0; - } - - - /* destructor for faces list */ - static void - destroy_face( FT_Memory memory, - FT_Face face, - FT_Driver driver ) - { - FT_Driver_Class clazz = driver->clazz; - - - /* discard auto-hinting data */ - if ( face->autohint.finalizer ) - face->autohint.finalizer( face->autohint.data ); - - /* Discard glyph slots for this face. */ - /* Beware! FT_Done_GlyphSlot() changes the field `face->glyph' */ - while ( face->glyph ) - FT_Done_GlyphSlot( face->glyph ); - - /* discard all sizes for this face */ - FT_List_Finalize( &face->sizes_list, - (FT_List_Destructor)destroy_size, - memory, - driver ); - face->size = 0; - - /* now discard client data */ - if ( face->generic.finalizer ) - face->generic.finalizer( face ); - - /* discard charmaps */ - destroy_charmaps( face, memory ); - - /* finalize format-specific stuff */ - if ( clazz->done_face ) - clazz->done_face( face ); - - /* close the stream for this face if needed */ - FT_Stream_Free( - face->stream, - ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); - - face->stream = 0; - - /* get rid of it */ - if ( face->internal ) - { - FT_FREE( face->internal ); - } - FT_FREE( face ); - } - - - static void - Destroy_Driver( FT_Driver driver ) - { - FT_List_Finalize( &driver->faces_list, - (FT_List_Destructor)destroy_face, - driver->root.memory, - driver ); - - /* check whether we need to drop the driver's glyph loader */ - if ( FT_DRIVER_USES_OUTLINES( driver ) ) - FT_GlyphLoader_Done( driver->glyph_loader ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* find_unicode_charmap */ - /* */ - /* <Description> */ - /* This function finds a Unicode charmap, if there is one. */ - /* And if there is more than one, it tries to favour the more */ - /* extensive one, i.e., one that supports UCS-4 against those which */ - /* are limited to the BMP (said UCS-2 encoding.) */ - /* */ - /* This function is called from open_face() (just below), and also */ - /* from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ). */ - /* */ - static FT_Error - find_unicode_charmap( FT_Face face ) - { - FT_CharMap* first; - FT_CharMap* cur; - - - /* caller should have already checked that `face' is valid */ - FT_ASSERT( face ); - - first = face->charmaps; - - if ( !first ) - return FT_Err_Invalid_CharMap_Handle; - - /* - * The original TrueType specification(s) only specified charmap - * formats that are capable of mapping 8 or 16 bit character codes to - * glyph indices. - * - * However, recent updates to the Apple and OpenType specifications - * introduced new formats that are capable of mapping 32-bit character - * codes as well. And these are already used on some fonts, mainly to - * map non-BMP Asian ideographs as defined in Unicode. - * - * For compatibility purposes, these fonts generally come with - * *several* Unicode charmaps: - * - * - One of them in the "old" 16-bit format, that cannot access - * all glyphs in the font. - * - * - Another one in the "new" 32-bit format, that can access all - * the glyphs. - * - * This function has been written to always favor a 32-bit charmap - * when found. Otherwise, a 16-bit one is returned when found. - */ - - /* Since the `interesting' table, with IDs (3,10), is normally the */ - /* last one, we loop backwards. This loses with type1 fonts with */ - /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP */ - /* chars (.01% ?), and this is the same about 99.99% of the time! */ - - cur = first + face->num_charmaps; /* points after the last one */ - - for ( ; --cur >= first; ) - { - if ( cur[0]->encoding == FT_ENCODING_UNICODE ) - { - /* XXX If some new encodings to represent UCS-4 are added, */ - /* they should be added here. */ - if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT && - cur[0]->encoding_id == TT_MS_ID_UCS_4 ) || - ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && - cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ) - { -#ifdef FT_MAX_CHARMAP_CACHEABLE - if ( cur - first > FT_MAX_CHARMAP_CACHEABLE ) - { - FT_ERROR(( "find_unicode_charmap: UCS-4 cmap is found " - "at too late position (%d)\n", cur - first )); - continue; - } -#endif - face->charmap = cur[0]; - return FT_Err_Ok; - } - } - } - - /* We do not have any UCS-4 charmap. */ - /* Do the loop again and search for UCS-2 charmaps. */ - cur = first + face->num_charmaps; - - for ( ; --cur >= first; ) - { - if ( cur[0]->encoding == FT_ENCODING_UNICODE ) - { -#ifdef FT_MAX_CHARMAP_CACHEABLE - if ( cur - first > FT_MAX_CHARMAP_CACHEABLE ) - { - FT_ERROR(( "find_unicode_charmap: UCS-2 cmap is found " - "at too late position (%d)\n", cur - first )); - continue; - } -#endif - face->charmap = cur[0]; - return FT_Err_Ok; - } - } - - return FT_Err_Invalid_CharMap_Handle; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* find_variant_selector_charmap */ - /* */ - /* <Description> */ - /* This function finds the variant selector charmap, if there is one. */ - /* There can only be one (platform=0, specific=5, format=14). */ - /* */ - static FT_CharMap - find_variant_selector_charmap( FT_Face face ) - { - FT_CharMap* first; - FT_CharMap* end; - FT_CharMap* cur; - - - /* caller should have already checked that `face' is valid */ - FT_ASSERT( face ); - - first = face->charmaps; - - if ( !first ) - return NULL; - - end = first + face->num_charmaps; /* points after the last one */ - - for ( cur = first; cur < end; ++cur ) - { - if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && - cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR && - FT_Get_CMap_Format( cur[0] ) == 14 ) -#ifdef FT_MAX_CHARMAP_CACHEABLE - if ( cur - first > FT_MAX_CHARMAP_CACHEABLE ) - { - FT_ERROR(( "find_unicode_charmap: UVS cmap is found " - "at too late position (%d)\n", cur - first )); - continue; - } -#endif - return cur[0]; - } - - return NULL; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* open_face */ - /* */ - /* <Description> */ - /* This function does some work for FT_Open_Face(). */ - /* */ - static FT_Error - open_face( FT_Driver driver, - FT_Stream stream, - FT_Long face_index, - FT_Int num_params, - FT_Parameter* params, - FT_Face *aface ) - { - FT_Memory memory; - FT_Driver_Class clazz; - FT_Face face = 0; - FT_Error error, error2; - FT_Face_Internal internal = NULL; - - - clazz = driver->clazz; - memory = driver->root.memory; - - /* allocate the face object and perform basic initialization */ - if ( FT_ALLOC( face, clazz->face_object_size ) ) - goto Fail; - - if ( FT_NEW( internal ) ) - goto Fail; - - face->internal = internal; - - face->driver = driver; - face->memory = memory; - face->stream = stream; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - { - int i; - - - face->internal->incremental_interface = 0; - for ( i = 0; i < num_params && !face->internal->incremental_interface; - i++ ) - if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL ) - face->internal->incremental_interface = - (FT_Incremental_Interface)params[i].data; - } -#endif - - if ( clazz->init_face ) - error = clazz->init_face( stream, - face, - (FT_Int)face_index, - num_params, - params ); - if ( error ) - goto Fail; - - /* select Unicode charmap by default */ - error2 = find_unicode_charmap( face ); - - /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */ - /* is returned. */ - - /* no error should happen, but we want to play safe */ - if ( error2 && error2 != FT_Err_Invalid_CharMap_Handle ) - { - error = error2; - goto Fail; - } - - *aface = face; - - Fail: - if ( error ) - { - destroy_charmaps( face, memory ); - if ( clazz->done_face ) - clazz->done_face( face ); - FT_FREE( internal ); - FT_FREE( face ); - *aface = 0; - } - - return error; - } - - - /* there's a Mac-specific extended implementation of FT_New_Face() */ - /* in src/base/ftmac.c */ - -#if !defined( FT_MACINTOSH ) || defined( DARWIN_NO_CARBON ) - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_New_Face( FT_Library library, - const char* pathname, - FT_Long face_index, - FT_Face *aface ) - { - FT_Open_Args args; - - - /* test for valid `library' and `aface' delayed to FT_Open_Face() */ - if ( !pathname ) - return FT_Err_Invalid_Argument; - - args.flags = FT_OPEN_PATHNAME; - args.pathname = (char*)pathname; - args.stream = NULL; - - return FT_Open_Face( library, &args, face_index, aface ); - } - -#endif /* defined( FT_MACINTOSH ) && !defined( DARWIN_NO_CARBON ) */ - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_New_Memory_Face( FT_Library library, - const FT_Byte* file_base, - FT_Long file_size, - FT_Long face_index, - FT_Face *aface ) - { - FT_Open_Args args; - - - /* test for valid `library' and `face' delayed to FT_Open_Face() */ - if ( !file_base ) - return FT_Err_Invalid_Argument; - - args.flags = FT_OPEN_MEMORY; - args.memory_base = file_base; - args.memory_size = file_size; - args.stream = NULL; - - return FT_Open_Face( library, &args, face_index, aface ); - } - - -#ifdef FT_CONFIG_OPTION_MAC_FONTS - - /* The behavior here is very similar to that in base/ftmac.c, but it */ - /* is designed to work on non-mac systems, so no mac specific calls. */ - /* */ - /* We look at the file and determine if it is a mac dfont file or a mac */ - /* resource file, or a macbinary file containing a mac resource file. */ - /* */ - /* Unlike ftmac I'm not going to look at a `FOND'. I don't really see */ - /* the point, especially since there may be multiple `FOND' resources. */ - /* Instead I'll just look for `sfnt' and `POST' resources, ordered as */ - /* they occur in the file. */ - /* */ - /* Note that multiple `POST' resources do not mean multiple postscript */ - /* fonts; they all get jammed together to make what is essentially a */ - /* pfb file. */ - /* */ - /* We aren't interested in `NFNT' or `FONT' bitmap resources. */ - /* */ - /* As soon as we get an `sfnt' load it into memory and pass it off to */ - /* FT_Open_Face. */ - /* */ - /* If we have a (set of) `POST' resources, massage them into a (memory) */ - /* pfb file and pass that to FT_Open_Face. (As with ftmac.c I'm not */ - /* going to try to save the kerning info. After all that lives in the */ - /* `FOND' which isn't in the file containing the `POST' resources so */ - /* we don't really have access to it. */ - - - /* Finalizer for a memory stream; gets called by FT_Done_Face(). */ - /* It frees the memory it uses. */ - /* From ftmac.c. */ - static void - memory_stream_close( FT_Stream stream ) - { - FT_Memory memory = stream->memory; - - - FT_FREE( stream->base ); - - stream->size = 0; - stream->base = 0; - stream->close = 0; - } - - - /* Create a new memory stream from a buffer and a size. */ - /* From ftmac.c. */ - static FT_Error - new_memory_stream( FT_Library library, - FT_Byte* base, - FT_ULong size, - FT_Stream_CloseFunc close, - FT_Stream *astream ) - { - FT_Error error; - FT_Memory memory; - FT_Stream stream; - - - if ( !library ) - return FT_Err_Invalid_Library_Handle; - - if ( !base ) - return FT_Err_Invalid_Argument; - - *astream = 0; - memory = library->memory; - if ( FT_NEW( stream ) ) - goto Exit; - - FT_Stream_OpenMemory( stream, base, size ); - - stream->close = close; - - *astream = stream; - - Exit: - return error; - } - - - /* Create a new FT_Face given a buffer and a driver name. */ - /* from ftmac.c */ - FT_LOCAL_DEF( FT_Error ) - open_face_from_buffer( FT_Library library, - FT_Byte* base, - FT_ULong size, - FT_Long face_index, - const char* driver_name, - FT_Face *aface ) - { - FT_Open_Args args; - FT_Error error; - FT_Stream stream = NULL; - FT_Memory memory = library->memory; - - - error = new_memory_stream( library, - base, - size, - memory_stream_close, - &stream ); - if ( error ) - { - FT_FREE( base ); - return error; - } - - args.flags = FT_OPEN_STREAM; - args.stream = stream; - if ( driver_name ) - { - args.flags = args.flags | FT_OPEN_DRIVER; - args.driver = FT_Get_Module( library, driver_name ); - } - -#ifdef FT_MACINTOSH - /* At this point, face_index has served its purpose; */ - /* whoever calls this function has already used it to */ - /* locate the correct font data. We should not propagate */ - /* this index to FT_Open_Face() (unless it is negative). */ - - if ( face_index > 0 ) - face_index = 0; -#endif - - error = FT_Open_Face( library, &args, face_index, aface ); - - if ( error == FT_Err_Ok ) - (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; - else -#ifdef FT_MACINTOSH - FT_Stream_Free( stream, 0 ); -#else - { - FT_Stream_Close( stream ); - FT_FREE( stream ); - } -#endif - - return error; - } - - - /* Look up `TYP1' or `CID ' table from sfnt table directory. */ - /* `offset' and `length' must exclude the binary header in tables. */ - - /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */ - /* format too. Here, since we can't expect that the TrueType font */ - /* driver is loaded unconditially, we must parse the font by */ - /* ourselves. We are only interested in the name of the table and */ - /* the offset. */ - - static FT_Error - ft_lookup_PS_in_sfnt_stream( FT_Stream stream, - FT_Long face_index, - FT_ULong* offset, - FT_ULong* length, - FT_Bool* is_sfnt_cid ) - { - FT_Error error; - FT_UShort numTables; - FT_Long pstable_index; - FT_ULong tag; - int i; - - - *offset = 0; - *length = 0; - *is_sfnt_cid = FALSE; - - /* TODO: support for sfnt-wrapped PS/CID in TTC format */ - - /* version check for 'typ1' (should be ignored?) */ - if ( FT_READ_ULONG( tag ) ) - return error; - if ( tag != TTAG_typ1 ) - return FT_Err_Unknown_File_Format; - - if ( FT_READ_USHORT( numTables ) ) - return error; - if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */ - return error; - - pstable_index = -1; - *is_sfnt_cid = FALSE; - - for ( i = 0; i < numTables; i++ ) - { - if ( FT_READ_ULONG( tag ) || FT_STREAM_SKIP( 4 ) || - FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) ) - return error; - - if ( tag == TTAG_CID ) - { - pstable_index++; - *offset += 22; - *length -= 22; - *is_sfnt_cid = TRUE; - if ( face_index < 0 ) - return FT_Err_Ok; - } - else if ( tag == TTAG_TYP1 ) - { - pstable_index++; - *offset += 24; - *length -= 24; - *is_sfnt_cid = FALSE; - if ( face_index < 0 ) - return FT_Err_Ok; - } - if ( face_index >= 0 && pstable_index == face_index ) - return FT_Err_Ok; - } - return FT_Err_Table_Missing; - } - - - FT_LOCAL_DEF( FT_Error ) - open_face_PS_from_sfnt_stream( FT_Library library, - FT_Stream stream, - FT_Long face_index, - FT_Int num_params, - FT_Parameter *params, - FT_Face *aface ) - { - FT_Error error; - FT_Memory memory = library->memory; - FT_ULong offset, length; - FT_Long pos; - FT_Bool is_sfnt_cid; - FT_Byte* sfnt_ps; - - FT_UNUSED( num_params ); - FT_UNUSED( params ); - - - pos = FT_Stream_Pos( stream ); - - error = ft_lookup_PS_in_sfnt_stream( stream, - face_index, - &offset, - &length, - &is_sfnt_cid ); - if ( error ) - goto Exit; - - if ( FT_Stream_Seek( stream, pos + offset ) ) - goto Exit; - - if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) ) - goto Exit; - - error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length ); - if ( error ) - goto Exit; - - error = open_face_from_buffer( library, - sfnt_ps, - length, - face_index < 0 ? face_index : 0, - is_sfnt_cid ? "cid" : "type1", - aface ); - Exit: - { - FT_Error error1; - - - if ( error == FT_Err_Unknown_File_Format ) - { - error1 = FT_Stream_Seek( stream, pos ); - if ( error1 ) - return error1; - } - - return error; - } - } - - -#if !defined( FT_MACINTOSH ) || defined( DARWIN_NO_CARBON ) - - /* The resource header says we've got resource_cnt `POST' (type1) */ - /* resources in this file. They all need to be coalesced into */ - /* one lump which gets passed on to the type1 driver. */ - /* Here can be only one PostScript font in a file so face_index */ - /* must be 0 (or -1). */ - /* */ - static FT_Error - Mac_Read_POST_Resource( FT_Library library, - FT_Stream stream, - FT_Long *offsets, - FT_Long resource_cnt, - FT_Long face_index, - FT_Face *aface ) - { - FT_Error error = FT_Err_Cannot_Open_Resource; - FT_Memory memory = library->memory; - FT_Byte* pfb_data; - int i, type, flags; - FT_Long len; - FT_Long pfb_len, pfb_pos, pfb_lenpos; - FT_Long rlen, temp; - - - if ( face_index == -1 ) - face_index = 0; - if ( face_index != 0 ) - return error; - - /* Find the length of all the POST resources, concatenated. Assume */ - /* worst case (each resource in its own section). */ - pfb_len = 0; - for ( i = 0; i < resource_cnt; ++i ) - { - error = FT_Stream_Seek( stream, offsets[i] ); - if ( error ) - goto Exit; - if ( FT_READ_LONG( temp ) ) - goto Exit; - pfb_len += temp + 6; - } - - if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) ) - goto Exit; - - pfb_data[0] = 0x80; - pfb_data[1] = 1; /* Ascii section */ - pfb_data[2] = 0; /* 4-byte length, fill in later */ - pfb_data[3] = 0; - pfb_data[4] = 0; - pfb_data[5] = 0; - pfb_pos = 6; - pfb_lenpos = 2; - - len = 0; - type = 1; - for ( i = 0; i < resource_cnt; ++i ) - { - error = FT_Stream_Seek( stream, offsets[i] ); - if ( error ) - goto Exit2; - if ( FT_READ_LONG( rlen ) ) - goto Exit; - if ( FT_READ_USHORT( flags ) ) - goto Exit; - FT_TRACE3(( "POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n", - i, offsets[i], rlen, flags )); - - /* postpone the check of rlen longer than buffer until FT_Stream_Read() */ - if ( ( flags >> 8 ) == 0 ) /* Comment, should not be loaded */ - continue; - - /* the flags are part of the resource, so rlen >= 2. */ - /* but some fonts declare rlen = 0 for empty fragment */ - if ( rlen > 2 ) - rlen -= 2; - else - rlen = 0; - - if ( ( flags >> 8 ) == type ) - len += rlen; - else - { - if ( pfb_lenpos + 3 > pfb_len + 2 ) - goto Exit2; - pfb_data[pfb_lenpos ] = (FT_Byte)( len ); - pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); - pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); - pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); - - if ( ( flags >> 8 ) == 5 ) /* End of font mark */ - break; - - if ( pfb_pos + 6 > pfb_len + 2 ) - goto Exit2; - pfb_data[pfb_pos++] = 0x80; - - type = flags >> 8; - len = rlen; - - pfb_data[pfb_pos++] = (FT_Byte)type; - pfb_lenpos = pfb_pos; - pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */ - pfb_data[pfb_pos++] = 0; - pfb_data[pfb_pos++] = 0; - pfb_data[pfb_pos++] = 0; - } - - error = FT_Err_Cannot_Open_Resource; - if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len ) - goto Exit2; - - error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen ); - if ( error ) - goto Exit2; - pfb_pos += rlen; - } - - if ( pfb_pos + 2 > pfb_len + 2 ) - goto Exit2; - pfb_data[pfb_pos++] = 0x80; - pfb_data[pfb_pos++] = 3; - - if ( pfb_lenpos + 3 > pfb_len + 2 ) - goto Exit2; - pfb_data[pfb_lenpos ] = (FT_Byte)( len ); - pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); - pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); - pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); - - return open_face_from_buffer( library, - pfb_data, - pfb_pos, - face_index, - "type1", - aface ); - - Exit2: - FT_FREE( pfb_data ); - - Exit: - return error; - } - - - /* The resource header says we've got resource_cnt `sfnt' */ - /* (TrueType/OpenType) resources in this file. Look through */ - /* them for the one indicated by face_index, load it into mem, */ - /* pass it on the the truetype driver and return it. */ - /* */ - static FT_Error - Mac_Read_sfnt_Resource( FT_Library library, - FT_Stream stream, - FT_Long *offsets, - FT_Long resource_cnt, - FT_Long face_index, - FT_Face *aface ) - { - FT_Memory memory = library->memory; - FT_Byte* sfnt_data; - FT_Error error; - FT_Long flag_offset; - FT_Long rlen; - int is_cff; - FT_Long face_index_in_resource = 0; - - - if ( face_index == -1 ) - face_index = 0; - if ( face_index >= resource_cnt ) - return FT_Err_Cannot_Open_Resource; - - flag_offset = offsets[face_index]; - error = FT_Stream_Seek( stream, flag_offset ); - if ( error ) - goto Exit; - - if ( FT_READ_LONG( rlen ) ) - goto Exit; - if ( rlen == -1 ) - return FT_Err_Cannot_Open_Resource; - - error = open_face_PS_from_sfnt_stream( library, - stream, - face_index, - 0, NULL, - aface ); - if ( !error ) - goto Exit; - - /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */ - if ( FT_Stream_Seek( stream, flag_offset + 4 ) ) - goto Exit; - - if ( FT_ALLOC( sfnt_data, (FT_Long)rlen ) ) - return error; - error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, rlen ); - if ( error ) - goto Exit; - - is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); - error = open_face_from_buffer( library, - sfnt_data, - rlen, - face_index_in_resource, - is_cff ? "cff" : "truetype", - aface ); - - Exit: - return error; - } - - - /* Check for a valid resource fork header, or a valid dfont */ - /* header. In a resource fork the first 16 bytes are repeated */ - /* at the location specified by bytes 4-7. In a dfont bytes */ - /* 4-7 point to 16 bytes of zeroes instead. */ - /* */ - static FT_Error - IsMacResource( FT_Library library, - FT_Stream stream, - FT_Long resource_offset, - FT_Long face_index, - FT_Face *aface ) - { - FT_Memory memory = library->memory; - FT_Error error; - FT_Long map_offset, rdara_pos; - FT_Long *data_offsets; - FT_Long count; - - - error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset, - &map_offset, &rdara_pos ); - if ( error ) - return error; - - error = FT_Raccess_Get_DataOffsets( library, stream, - map_offset, rdara_pos, - TTAG_POST, - &data_offsets, &count ); - if ( !error ) - { - error = Mac_Read_POST_Resource( library, stream, data_offsets, count, - face_index, aface ); - FT_FREE( data_offsets ); - /* POST exists in an LWFN providing a single face */ - if ( !error ) - (*aface)->num_faces = 1; - return error; - } - - error = FT_Raccess_Get_DataOffsets( library, stream, - map_offset, rdara_pos, - TTAG_sfnt, - &data_offsets, &count ); - if ( !error ) - { - FT_Long face_index_internal = face_index % count; - - - error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count, - face_index_internal, aface ); - FT_FREE( data_offsets ); - if ( !error ) - (*aface)->num_faces = count; - } - - return error; - } - - - /* Check for a valid macbinary header, and if we find one */ - /* check that the (flattened) resource fork in it is valid. */ - /* */ - static FT_Error - IsMacBinary( FT_Library library, - FT_Stream stream, - FT_Long face_index, - FT_Face *aface ) - { - unsigned char header[128]; - FT_Error error; - FT_Long dlen, offset; - - - if ( NULL == stream ) - return FT_Err_Invalid_Stream_Operation; - - error = FT_Stream_Seek( stream, 0 ); - if ( error ) - goto Exit; - - error = FT_Stream_Read( stream, (FT_Byte*)header, 128 ); - if ( error ) - goto Exit; - - if ( header[ 0] != 0 || - header[74] != 0 || - header[82] != 0 || - header[ 1] == 0 || - header[ 1] > 33 || - header[63] != 0 || - header[2 + header[1]] != 0 ) - return FT_Err_Unknown_File_Format; - - dlen = ( header[0x53] << 24 ) | - ( header[0x54] << 16 ) | - ( header[0x55] << 8 ) | - header[0x56]; -#if 0 - rlen = ( header[0x57] << 24 ) | - ( header[0x58] << 16 ) | - ( header[0x59] << 8 ) | - header[0x5a]; -#endif /* 0 */ - offset = 128 + ( ( dlen + 127 ) & ~127 ); - - return IsMacResource( library, stream, offset, face_index, aface ); - - Exit: - return error; - } - - - static FT_Error - load_face_in_embedded_rfork( FT_Library library, - FT_Stream stream, - FT_Long face_index, - FT_Face *aface, - const FT_Open_Args *args ) - { - -#undef FT_COMPONENT -#define FT_COMPONENT trace_raccess - - FT_Memory memory = library->memory; - FT_Error error = FT_Err_Unknown_File_Format; - int i; - - char * file_names[FT_RACCESS_N_RULES]; - FT_Long offsets[FT_RACCESS_N_RULES]; - FT_Error errors[FT_RACCESS_N_RULES]; - - FT_Open_Args args2; - FT_Stream stream2 = 0; - - - FT_Raccess_Guess( library, stream, - args->pathname, file_names, offsets, errors ); - - for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) - { - if ( errors[i] ) - { - FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i )); - continue; - } - - args2.flags = FT_OPEN_PATHNAME; - args2.pathname = file_names[i] ? file_names[i] : args->pathname; - - FT_TRACE3(( "Try rule %d: %s (offset=%d) ...", - i, args2.pathname, offsets[i] )); - - error = FT_Stream_New( library, &args2, &stream2 ); - if ( error ) - { - FT_TRACE3(( "failed\n" )); - continue; - } - - error = IsMacResource( library, stream2, offsets[i], - face_index, aface ); - FT_Stream_Free( stream2, 0 ); - - FT_TRACE3(( "%s\n", error ? "failed": "successful" )); - - if ( !error ) - break; - } - - for (i = 0; i < FT_RACCESS_N_RULES; i++) - { - if ( file_names[i] ) - FT_FREE( file_names[i] ); - } - - /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */ - if ( error ) - error = FT_Err_Unknown_File_Format; - - return error; - -#undef FT_COMPONENT -#define FT_COMPONENT trace_objs - - } - - - /* Check for some macintosh formats without Carbon framework. */ - /* Is this a macbinary file? If so look at the resource fork. */ - /* Is this a mac dfont file? */ - /* Is this an old style resource fork? (in data) */ - /* Else call load_face_in_embedded_rfork to try extra rules */ - /* (defined in `ftrfork.c'). */ - /* */ - static FT_Error - load_mac_face( FT_Library library, - FT_Stream stream, - FT_Long face_index, - FT_Face *aface, - const FT_Open_Args *args ) - { - FT_Error error; - FT_UNUSED( args ); - - - error = IsMacBinary( library, stream, face_index, aface ); - if ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format ) - { - -#undef FT_COMPONENT -#define FT_COMPONENT trace_raccess - - FT_TRACE3(( "Try as dfont: %s ...", args->pathname )); - - error = IsMacResource( library, stream, 0, face_index, aface ); - - FT_TRACE3(( "%s\n", error ? "failed" : "successful" )); - -#undef FT_COMPONENT -#define FT_COMPONENT trace_objs - - } - - if ( ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format || - FT_ERROR_BASE( error ) == FT_Err_Invalid_Stream_Operation ) && - ( args->flags & FT_OPEN_PATHNAME ) ) - error = load_face_in_embedded_rfork( library, stream, - face_index, aface, args ); - return error; - } -#endif - -#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Open_Face( FT_Library library, - const FT_Open_Args* args, - FT_Long face_index, - FT_Face *aface ) - { - FT_Error error; - FT_Driver driver; - FT_Memory memory; - FT_Stream stream = NULL; - FT_Face face = NULL; - FT_ListNode node = NULL; - FT_Bool external_stream; - FT_Module* cur; - FT_Module* limit; - - - /* test for valid `library' delayed to */ - /* FT_Stream_New() */ - - if ( ( !aface && face_index >= 0 ) || !args ) - return FT_Err_Invalid_Argument; - - external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) && - args->stream ); - - /* create input stream */ - error = FT_Stream_New( library, args, &stream ); - if ( error ) - goto Fail3; - - memory = library->memory; - - /* If the font driver is specified in the `args' structure, use */ - /* it. Otherwise, we scan the list of registered drivers. */ - if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver ) - { - driver = FT_DRIVER( args->driver ); - - /* not all modules are drivers, so check... */ - if ( FT_MODULE_IS_DRIVER( driver ) ) - { - FT_Int num_params = 0; - FT_Parameter* params = 0; - - - if ( args->flags & FT_OPEN_PARAMS ) - { - num_params = args->num_params; - params = args->params; - } - - error = open_face( driver, stream, face_index, - num_params, params, &face ); - if ( !error ) - goto Success; - } - else - error = FT_Err_Invalid_Handle; - - FT_Stream_Free( stream, external_stream ); - goto Fail; - } - else - { - /* check each font driver for an appropriate format */ - cur = library->modules; - limit = cur + library->num_modules; - - - for ( ; cur < limit; cur++ ) - { - /* not all modules are font drivers, so check... */ - if ( FT_MODULE_IS_DRIVER( cur[0] ) ) - { - FT_Int num_params = 0; - FT_Parameter* params = 0; - - - driver = FT_DRIVER( cur[0] ); - - if ( args->flags & FT_OPEN_PARAMS ) - { - num_params = args->num_params; - params = args->params; - } - - error = open_face( driver, stream, face_index, - num_params, params, &face ); - if ( !error ) - goto Success; - -#ifdef FT_CONFIG_OPTION_MAC_FONTS - if ( ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 && - FT_ERROR_BASE( error ) == FT_Err_Table_Missing ) - { - /* TrueType but essential tables are missing */ - if ( FT_Stream_Seek( stream, 0 ) ) - break; - - error = open_face_PS_from_sfnt_stream( library, - stream, - face_index, - num_params, - params, - aface ); - if ( !error ) - { - FT_Stream_Free( stream, external_stream ); - return error; - } - } -#endif - - if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format ) - goto Fail3; - } - } - - Fail3: - /* If we are on the mac, and we get an FT_Err_Invalid_Stream_Operation */ - /* it may be because we have an empty data fork, so we need to check */ - /* the resource fork. */ - if ( FT_ERROR_BASE( error ) != FT_Err_Cannot_Open_Stream && - FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format && - FT_ERROR_BASE( error ) != FT_Err_Invalid_Stream_Operation ) - goto Fail2; - -#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS ) - error = load_mac_face( library, stream, face_index, aface, args ); - if ( !error ) - { - /* We don't want to go to Success here. We've already done that. */ - /* On the other hand, if we succeeded we still need to close this */ - /* stream (we opened a different stream which extracted the */ - /* interesting information out of this stream here. That stream */ - /* will still be open and the face will point to it). */ - FT_Stream_Free( stream, external_stream ); - return error; - } - - if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format ) - goto Fail2; -#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ - - /* no driver is able to handle this format */ - error = FT_Err_Unknown_File_Format; - - Fail2: - FT_Stream_Free( stream, external_stream ); - goto Fail; - } - - Success: - FT_TRACE4(( "FT_Open_Face: New face object, adding to list\n" )); - - /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */ - if ( external_stream ) - face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM; - - /* add the face object to its driver's list */ - if ( FT_NEW( node ) ) - goto Fail; - - node->data = face; - /* don't assume driver is the same as face->driver, so use */ - /* face->driver instead. */ - FT_List_Add( &face->driver->faces_list, node ); - - /* now allocate a glyph slot object for the face */ - FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" )); - - if ( face_index >= 0 ) - { - error = FT_New_GlyphSlot( face, NULL ); - if ( error ) - goto Fail; - - /* finally, allocate a size object for the face */ - { - FT_Size size; - - - FT_TRACE4(( "FT_Open_Face: Creating size object\n" )); - - error = FT_New_Size( face, &size ); - if ( error ) - goto Fail; - - face->size = size; - } - } - - /* some checks */ - - if ( FT_IS_SCALABLE( face ) ) - { - if ( face->height < 0 ) - face->height = (FT_Short)-face->height; - - if ( !FT_HAS_VERTICAL( face ) ) - face->max_advance_height = (FT_Short)face->height; - } - - if ( FT_HAS_FIXED_SIZES( face ) ) - { - FT_Int i; - - - for ( i = 0; i < face->num_fixed_sizes; i++ ) - { - FT_Bitmap_Size* bsize = face->available_sizes + i; - - - if ( bsize->height < 0 ) - bsize->height = (FT_Short)-bsize->height; - if ( bsize->x_ppem < 0 ) - bsize->x_ppem = (FT_Short)-bsize->x_ppem; - if ( bsize->y_ppem < 0 ) - bsize->y_ppem = -bsize->y_ppem; - } - } - - /* initialize internal face data */ - { - FT_Face_Internal internal = face->internal; - - - internal->transform_matrix.xx = 0x10000L; - internal->transform_matrix.xy = 0; - internal->transform_matrix.yx = 0; - internal->transform_matrix.yy = 0x10000L; - - internal->transform_delta.x = 0; - internal->transform_delta.y = 0; - - internal->refcount = 1; - } - - if ( aface ) - *aface = face; - else - FT_Done_Face( face ); - - goto Exit; - - Fail: - FT_Done_Face( face ); - - Exit: - FT_TRACE4(( "FT_Open_Face: Return %d\n", error )); - - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Attach_File( FT_Face face, - const char* filepathname ) - { - FT_Open_Args open; - - - /* test for valid `face' delayed to FT_Attach_Stream() */ - - if ( !filepathname ) - return FT_Err_Invalid_Argument; - - open.stream = NULL; - open.flags = FT_OPEN_PATHNAME; - open.pathname = (char*)filepathname; - - return FT_Attach_Stream( face, &open ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Attach_Stream( FT_Face face, - FT_Open_Args* parameters ) - { - FT_Stream stream; - FT_Error error; - FT_Driver driver; - - FT_Driver_Class clazz; - - - /* test for valid `parameters' delayed to FT_Stream_New() */ - - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - driver = face->driver; - if ( !driver ) - return FT_Err_Invalid_Driver_Handle; - - error = FT_Stream_New( driver->root.library, parameters, &stream ); - if ( error ) - goto Exit; - - /* we implement FT_Attach_Stream in each driver through the */ - /* `attach_file' interface */ - - error = FT_Err_Unimplemented_Feature; - clazz = driver->clazz; - if ( clazz->attach_file ) - error = clazz->attach_file( face, stream ); - - /* close the attached stream */ - FT_Stream_Free( stream, - (FT_Bool)( parameters->stream && - ( parameters->flags & FT_OPEN_STREAM ) ) ); - - Exit: - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Reference_Face( FT_Face face ) - { - face->internal->refcount++; - - return FT_Err_Ok; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Done_Face( FT_Face face ) - { - FT_Error error; - FT_Driver driver; - FT_Memory memory; - FT_ListNode node; - - - error = FT_Err_Invalid_Face_Handle; - if ( face && face->driver ) - { - face->internal->refcount--; - if ( face->internal->refcount > 0 ) - error = FT_Err_Ok; - else - { - driver = face->driver; - memory = driver->root.memory; - - /* find face in driver's list */ - node = FT_List_Find( &driver->faces_list, face ); - if ( node ) - { - /* remove face object from the driver's list */ - FT_List_Remove( &driver->faces_list, node ); - FT_FREE( node ); - - /* now destroy the object proper */ - destroy_face( memory, face, driver ); - error = FT_Err_Ok; - } - } - } - - return error; - } - - - /* documentation is in ftobjs.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_New_Size( FT_Face face, - FT_Size *asize ) - { - FT_Error error; - FT_Memory memory; - FT_Driver driver; - FT_Driver_Class clazz; - - FT_Size size = 0; - FT_ListNode node = 0; - - - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - if ( !asize ) - return FT_Err_Invalid_Size_Handle; - - if ( !face->driver ) - return FT_Err_Invalid_Driver_Handle; - - *asize = 0; - - driver = face->driver; - clazz = driver->clazz; - memory = face->memory; - - /* Allocate new size object and perform basic initialisation */ - if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) ) - goto Exit; - - size->face = face; - - /* for now, do not use any internal fields in size objects */ - size->internal = 0; - - if ( clazz->init_size ) - error = clazz->init_size( size ); - - /* in case of success, add to the face's list */ - if ( !error ) - { - *asize = size; - node->data = size; - FT_List_Add( &face->sizes_list, node ); - } - - Exit: - if ( error ) - { - FT_FREE( node ); - FT_FREE( size ); - } - - return error; - } - - - /* documentation is in ftobjs.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Done_Size( FT_Size size ) - { - FT_Error error; - FT_Driver driver; - FT_Memory memory; - FT_Face face; - FT_ListNode node; - - - if ( !size ) - return FT_Err_Invalid_Size_Handle; - - face = size->face; - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - driver = face->driver; - if ( !driver ) - return FT_Err_Invalid_Driver_Handle; - - memory = driver->root.memory; - - error = FT_Err_Ok; - node = FT_List_Find( &face->sizes_list, size ); - if ( node ) - { - FT_List_Remove( &face->sizes_list, node ); - FT_FREE( node ); - - if ( face->size == size ) - { - face->size = 0; - if ( face->sizes_list.head ) - face->size = (FT_Size)(face->sizes_list.head->data); - } - - destroy_size( memory, size, driver ); - } - else - error = FT_Err_Invalid_Size_Handle; - - return error; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( FT_Error ) - FT_Match_Size( FT_Face face, - FT_Size_Request req, - FT_Bool ignore_width, - FT_ULong* size_index ) - { - FT_Int i; - FT_Long w, h; - - - if ( !FT_HAS_FIXED_SIZES( face ) ) - return FT_Err_Invalid_Face_Handle; - - /* FT_Bitmap_Size doesn't provide enough info... */ - if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) - return FT_Err_Unimplemented_Feature; - - w = FT_REQUEST_WIDTH ( req ); - h = FT_REQUEST_HEIGHT( req ); - - if ( req->width && !req->height ) - h = w; - else if ( !req->width && req->height ) - w = h; - - w = FT_PIX_ROUND( w ); - h = FT_PIX_ROUND( h ); - - for ( i = 0; i < face->num_fixed_sizes; i++ ) - { - FT_Bitmap_Size* bsize = face->available_sizes + i; - - - if ( h != FT_PIX_ROUND( bsize->y_ppem ) ) - continue; - - if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width ) - { - if ( size_index ) - *size_index = (FT_ULong)i; - - return FT_Err_Ok; - } - } - - return FT_Err_Invalid_Pixel_Size; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( void ) - ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, - FT_Pos advance ) - { - FT_Pos height = metrics->height; - - - /* compensate for glyph with bbox above/below the baseline */ - if ( metrics->horiBearingY < 0 ) - { - if ( height < metrics->horiBearingY ) - height = metrics->horiBearingY; - } - else if ( metrics->horiBearingY > 0 ) - height -= metrics->horiBearingY; - - /* the factor 1.2 is a heuristical value */ - if ( !advance ) - advance = height * 12 / 10; - - metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2; - metrics->vertBearingY = ( advance - height ) / 2; - metrics->vertAdvance = advance; - } - - - static void - ft_recompute_scaled_metrics( FT_Face face, - FT_Size_Metrics* metrics ) - { - /* Compute root ascender, descender, test height, and max_advance */ - -#ifdef GRID_FIT_METRICS - metrics->ascender = FT_PIX_CEIL( FT_MulFix( face->ascender, - metrics->y_scale ) ); - - metrics->descender = FT_PIX_FLOOR( FT_MulFix( face->descender, - metrics->y_scale ) ); - - metrics->height = FT_PIX_ROUND( FT_MulFix( face->height, - metrics->y_scale ) ); - - metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width, - metrics->x_scale ) ); -#else /* !GRID_FIT_METRICS */ - metrics->ascender = FT_MulFix( face->ascender, - metrics->y_scale ); - - metrics->descender = FT_MulFix( face->descender, - metrics->y_scale ); - - metrics->height = FT_MulFix( face->height, - metrics->y_scale ); - - metrics->max_advance = FT_MulFix( face->max_advance_width, - metrics->x_scale ); -#endif /* !GRID_FIT_METRICS */ - } - - - FT_BASE_DEF( void ) - FT_Select_Metrics( FT_Face face, - FT_ULong strike_index ) - { - FT_Size_Metrics* metrics; - FT_Bitmap_Size* bsize; - - - metrics = &face->size->metrics; - bsize = face->available_sizes + strike_index; - - metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 ); - metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 ); - - if ( FT_IS_SCALABLE( face ) ) - { - metrics->x_scale = FT_DivFix( bsize->x_ppem, - face->units_per_EM ); - metrics->y_scale = FT_DivFix( bsize->y_ppem, - face->units_per_EM ); - - ft_recompute_scaled_metrics( face, metrics ); - } - else - { - metrics->x_scale = 1L << 16; - metrics->y_scale = 1L << 16; - metrics->ascender = bsize->y_ppem; - metrics->descender = 0; - metrics->height = bsize->height << 6; - metrics->max_advance = bsize->x_ppem; - } - } - - - FT_BASE_DEF( void ) - FT_Request_Metrics( FT_Face face, - FT_Size_Request req ) - { - FT_Size_Metrics* metrics; - - - metrics = &face->size->metrics; - - if ( FT_IS_SCALABLE( face ) ) - { - FT_Long w = 0, h = 0, scaled_w = 0, scaled_h = 0; - - - switch ( req->type ) - { - case FT_SIZE_REQUEST_TYPE_NOMINAL: - w = h = face->units_per_EM; - break; - - case FT_SIZE_REQUEST_TYPE_REAL_DIM: - w = h = face->ascender - face->descender; - break; - - case FT_SIZE_REQUEST_TYPE_BBOX: - w = face->bbox.xMax - face->bbox.xMin; - h = face->bbox.yMax - face->bbox.yMin; - break; - - case FT_SIZE_REQUEST_TYPE_CELL: - w = face->max_advance_width; - h = face->ascender - face->descender; - break; - - case FT_SIZE_REQUEST_TYPE_SCALES: - metrics->x_scale = (FT_Fixed)req->width; - metrics->y_scale = (FT_Fixed)req->height; - if ( !metrics->x_scale ) - metrics->x_scale = metrics->y_scale; - else if ( !metrics->y_scale ) - metrics->y_scale = metrics->x_scale; - goto Calculate_Ppem; - - case FT_SIZE_REQUEST_TYPE_MAX: - break; - } - - /* to be on the safe side */ - if ( w < 0 ) - w = -w; - - if ( h < 0 ) - h = -h; - - scaled_w = FT_REQUEST_WIDTH ( req ); - scaled_h = FT_REQUEST_HEIGHT( req ); - - /* determine scales */ - if ( req->width ) - { - metrics->x_scale = FT_DivFix( scaled_w, w ); - - if ( req->height ) - { - metrics->y_scale = FT_DivFix( scaled_h, h ); - - if ( req->type == FT_SIZE_REQUEST_TYPE_CELL ) - { - if ( metrics->y_scale > metrics->x_scale ) - metrics->y_scale = metrics->x_scale; - else - metrics->x_scale = metrics->y_scale; - } - } - else - { - metrics->y_scale = metrics->x_scale; - scaled_h = FT_MulDiv( scaled_w, h, w ); - } - } - else - { - metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h ); - scaled_w = FT_MulDiv( scaled_h, w, h ); - } - - Calculate_Ppem: - /* calculate the ppems */ - if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) - { - scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale ); - scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale ); - } - - metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 ); - metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 ); - - ft_recompute_scaled_metrics( face, metrics ); - } - else - { - FT_ZERO( metrics ); - metrics->x_scale = 1L << 16; - metrics->y_scale = 1L << 16; - } - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Select_Size( FT_Face face, - FT_Int strike_index ) - { - FT_Driver_Class clazz; - - - if ( !face || !FT_HAS_FIXED_SIZES( face ) ) - return FT_Err_Invalid_Face_Handle; - - if ( strike_index < 0 || strike_index >= face->num_fixed_sizes ) - return FT_Err_Invalid_Argument; - - clazz = face->driver->clazz; - - if ( clazz->select_size ) - return clazz->select_size( face->size, (FT_ULong)strike_index ); - - FT_Select_Metrics( face, (FT_ULong)strike_index ); - - return FT_Err_Ok; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Request_Size( FT_Face face, - FT_Size_Request req ) - { - FT_Driver_Class clazz; - FT_ULong strike_index; - - - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - if ( !req || req->width < 0 || req->height < 0 || - req->type >= FT_SIZE_REQUEST_TYPE_MAX ) - return FT_Err_Invalid_Argument; - - clazz = face->driver->clazz; - - if ( clazz->request_size ) - return clazz->request_size( face->size, req ); - - /* - * The reason that a driver doesn't have `request_size' defined is - * either that the scaling here suffices or that the supported formats - * are bitmap-only and size matching is not implemented. - * - * In the latter case, a simple size matching is done. - */ - if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) ) - { - FT_Error error; - - - error = FT_Match_Size( face, req, 0, &strike_index ); - if ( error ) - return error; - - FT_TRACE3(( "FT_Request_Size: bitmap strike %lu matched\n", - strike_index )); - - return FT_Select_Size( face, (FT_Int)strike_index ); - } - - FT_Request_Metrics( face, req ); - - return FT_Err_Ok; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_Char_Size( FT_Face face, - FT_F26Dot6 char_width, - FT_F26Dot6 char_height, - FT_UInt horz_resolution, - FT_UInt vert_resolution ) - { - FT_Size_RequestRec req; - - - if ( !char_width ) - char_width = char_height; - else if ( !char_height ) - char_height = char_width; - - if ( !horz_resolution ) - horz_resolution = vert_resolution; - else if ( !vert_resolution ) - vert_resolution = horz_resolution; - - if ( char_width < 1 * 64 ) - char_width = 1 * 64; - if ( char_height < 1 * 64 ) - char_height = 1 * 64; - - if ( !horz_resolution ) - horz_resolution = vert_resolution = 72; - - req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; - req.width = char_width; - req.height = char_height; - req.horiResolution = horz_resolution; - req.vertResolution = vert_resolution; - - return FT_Request_Size( face, &req ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_Pixel_Sizes( FT_Face face, - FT_UInt pixel_width, - FT_UInt pixel_height ) - { - FT_Size_RequestRec req; - - - if ( pixel_width == 0 ) - pixel_width = pixel_height; - else if ( pixel_height == 0 ) - pixel_height = pixel_width; - - if ( pixel_width < 1 ) - pixel_width = 1; - if ( pixel_height < 1 ) - pixel_height = 1; - - /* use `>=' to avoid potential compiler warning on 16bit platforms */ - if ( pixel_width >= 0xFFFFU ) - pixel_width = 0xFFFFU; - if ( pixel_height >= 0xFFFFU ) - pixel_height = 0xFFFFU; - - req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; - req.width = pixel_width << 6; - req.height = pixel_height << 6; - req.horiResolution = 0; - req.vertResolution = 0; - - return FT_Request_Size( face, &req ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Kerning( FT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph, - FT_UInt kern_mode, - FT_Vector *akerning ) - { - FT_Error error = FT_Err_Ok; - FT_Driver driver; - - - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - if ( !akerning ) - return FT_Err_Invalid_Argument; - - driver = face->driver; - - akerning->x = 0; - akerning->y = 0; - - if ( driver->clazz->get_kerning ) - { - error = driver->clazz->get_kerning( face, - left_glyph, - right_glyph, - akerning ); - if ( !error ) - { - if ( kern_mode != FT_KERNING_UNSCALED ) - { - akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale ); - akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale ); - - if ( kern_mode != FT_KERNING_UNFITTED ) - { - /* we scale down kerning values for small ppem values */ - /* to avoid that rounding makes them too big. */ - /* `25' has been determined heuristically. */ - if ( face->size->metrics.x_ppem < 25 ) - akerning->x = FT_MulDiv( akerning->x, - face->size->metrics.x_ppem, 25 ); - if ( face->size->metrics.y_ppem < 25 ) - akerning->y = FT_MulDiv( akerning->y, - face->size->metrics.y_ppem, 25 ); - - akerning->x = FT_PIX_ROUND( akerning->x ); - akerning->y = FT_PIX_ROUND( akerning->y ); - } - } - } - } - - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Track_Kerning( FT_Face face, - FT_Fixed point_size, - FT_Int degree, - FT_Fixed* akerning ) - { - FT_Service_Kerning service; - FT_Error error = FT_Err_Ok; - - - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - if ( !akerning ) - return FT_Err_Invalid_Argument; - - FT_FACE_FIND_SERVICE( face, service, KERNING ); - if ( !service ) - return FT_Err_Unimplemented_Feature; - - error = service->get_track( face, - point_size, - degree, - akerning ); - - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Select_Charmap( FT_Face face, - FT_Encoding encoding ) - { - FT_CharMap* cur; - FT_CharMap* limit; - - - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - if ( encoding == FT_ENCODING_NONE ) - return FT_Err_Invalid_Argument; - - /* FT_ENCODING_UNICODE is special. We try to find the `best' Unicode */ - /* charmap available, i.e., one with UCS-4 characters, if possible. */ - /* */ - /* This is done by find_unicode_charmap() above, to share code. */ - if ( encoding == FT_ENCODING_UNICODE ) - return find_unicode_charmap( face ); - - cur = face->charmaps; - if ( !cur ) - return FT_Err_Invalid_CharMap_Handle; - - limit = cur + face->num_charmaps; - - for ( ; cur < limit; cur++ ) - { - if ( cur[0]->encoding == encoding ) - { -#ifdef FT_MAX_CHARMAP_CACHEABLE - if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE ) - { - FT_ERROR(( "FT_Select_Charmap: requested charmap is found (%d), " - "but in too late position to cache\n", - cur - face->charmaps )); - continue; - } -#endif - face->charmap = cur[0]; - return 0; - } - } - - return FT_Err_Invalid_Argument; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_Charmap( FT_Face face, - FT_CharMap charmap ) - { - FT_CharMap* cur; - FT_CharMap* limit; - - - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - cur = face->charmaps; - if ( !cur ) - return FT_Err_Invalid_CharMap_Handle; - if ( FT_Get_CMap_Format( charmap ) == 14 ) - return FT_Err_Invalid_Argument; - - limit = cur + face->num_charmaps; - - for ( ; cur < limit; cur++ ) - { - if ( cur[0] == charmap ) - { -#ifdef FT_MAX_CHARMAP_CACHEABLE - if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE ) - { - FT_ERROR(( "FT_Set_Charmap: requested charmap is found (%d), " - "but in too late position to cache\n", - cur - face->charmaps )); - continue; - } -#endif - face->charmap = cur[0]; - return 0; - } - } - return FT_Err_Invalid_Argument; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Int ) - FT_Get_Charmap_Index( FT_CharMap charmap ) - { - FT_Int i; - - - if ( !charmap || !charmap->face ) - return -1; - - for ( i = 0; i < charmap->face->num_charmaps; i++ ) - if ( charmap->face->charmaps[i] == charmap ) - break; - - FT_ASSERT( i < charmap->face->num_charmaps ); - -#ifdef FT_MAX_CHARMAP_CACHEABLE - if ( i > FT_MAX_CHARMAP_CACHEABLE ) - { - FT_ERROR(( "FT_Get_Charmap_Index: requested charmap is found (%d), " - "but in too late position to cache\n", - i )); - return -i; - } -#endif - return i; - } - - - static void - ft_cmap_done_internal( FT_CMap cmap ) - { - FT_CMap_Class clazz = cmap->clazz; - FT_Face face = cmap->charmap.face; - FT_Memory memory = FT_FACE_MEMORY(face); - - - if ( clazz->done ) - clazz->done( cmap ); - - FT_FREE( cmap ); - } - - - FT_BASE_DEF( void ) - FT_CMap_Done( FT_CMap cmap ) - { - if ( cmap ) - { - FT_Face face = cmap->charmap.face; - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_Error error; - FT_Int i, j; - - - for ( i = 0; i < face->num_charmaps; i++ ) - { - if ( (FT_CMap)face->charmaps[i] == cmap ) - { - FT_CharMap last_charmap = face->charmaps[face->num_charmaps - 1]; - - - if ( FT_RENEW_ARRAY( face->charmaps, - face->num_charmaps, - face->num_charmaps - 1 ) ) - return; - - /* remove it from our list of charmaps */ - for ( j = i + 1; j < face->num_charmaps; j++ ) - { - if ( j == face->num_charmaps - 1 ) - face->charmaps[j - 1] = last_charmap; - else - face->charmaps[j - 1] = face->charmaps[j]; - } - - face->num_charmaps--; - - if ( (FT_CMap)face->charmap == cmap ) - face->charmap = NULL; - - ft_cmap_done_internal( cmap ); - - break; - } - } - } - } - - - FT_BASE_DEF( FT_Error ) - FT_CMap_New( FT_CMap_Class clazz, - FT_Pointer init_data, - FT_CharMap charmap, - FT_CMap *acmap ) - { - FT_Error error = FT_Err_Ok; - FT_Face face; - FT_Memory memory; - FT_CMap cmap; - - - if ( clazz == NULL || charmap == NULL || charmap->face == NULL ) - return FT_Err_Invalid_Argument; - - face = charmap->face; - memory = FT_FACE_MEMORY( face ); - - if ( !FT_ALLOC( cmap, clazz->size ) ) - { - cmap->charmap = *charmap; - cmap->clazz = clazz; - - if ( clazz->init ) - { - error = clazz->init( cmap, init_data ); - if ( error ) - goto Fail; - } - - /* add it to our list of charmaps */ - if ( FT_RENEW_ARRAY( face->charmaps, - face->num_charmaps, - face->num_charmaps + 1 ) ) - goto Fail; - - face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap; - } - - Exit: - if ( acmap ) - *acmap = cmap; - - return error; - - Fail: - ft_cmap_done_internal( cmap ); - cmap = NULL; - goto Exit; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UInt ) - FT_Get_Char_Index( FT_Face face, - FT_ULong charcode ) - { - FT_UInt result = 0; - - - if ( face && face->charmap ) - { - FT_CMap cmap = FT_CMAP( face->charmap ); - - - if ( charcode > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); - FT_TRACE1(( " 0x%x is truncated\n", charcode )); - } - result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode ); - } - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_ULong ) - FT_Get_First_Char( FT_Face face, - FT_UInt *agindex ) - { - FT_ULong result = 0; - FT_UInt gindex = 0; - - - if ( face && face->charmap && face->num_glyphs ) - { - gindex = FT_Get_Char_Index( face, 0 ); - if ( gindex == 0 || gindex >= (FT_UInt)face->num_glyphs ) - result = FT_Get_Next_Char( face, 0, &gindex ); - } - - if ( agindex ) - *agindex = gindex; - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_ULong ) - FT_Get_Next_Char( FT_Face face, - FT_ULong charcode, - FT_UInt *agindex ) - { - FT_ULong result = 0; - FT_UInt gindex = 0; - - - if ( face && face->charmap && face->num_glyphs ) - { - FT_UInt32 code = (FT_UInt32)charcode; - FT_CMap cmap = FT_CMAP( face->charmap ); - - - do { - gindex = cmap->clazz->char_next( cmap, &code ); - } while ( gindex >= (FT_UInt)face->num_glyphs ); - - result = ( gindex == 0 ) ? 0 : code; - } - - if ( agindex ) - *agindex = gindex; - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UInt ) - FT_Face_GetCharVariantIndex( FT_Face face, - FT_ULong charcode, - FT_ULong variantSelector ) - { - FT_UInt result = 0; - - - if ( face && face->charmap && - face->charmap->encoding == FT_ENCODING_UNICODE ) - { - FT_CharMap charmap = find_variant_selector_charmap( face ); - FT_CMap ucmap = FT_CMAP( face->charmap ); - - - if ( charmap != NULL ) - { - FT_CMap vcmap = FT_CMAP( charmap ); - - - if ( charcode > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); - FT_TRACE1(( " 0x%x is truncated\n", charcode )); - } - if ( variantSelector > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); - FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); - } - - result = vcmap->clazz->char_var_index( vcmap, ucmap, - (FT_UInt32)charcode, - (FT_UInt32)variantSelector ); - } - } - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Int ) - FT_Face_GetCharVariantIsDefault( FT_Face face, - FT_ULong charcode, - FT_ULong variantSelector ) - { - FT_Int result = -1; - - - if ( face ) - { - FT_CharMap charmap = find_variant_selector_charmap( face ); - - - if ( charmap != NULL ) - { - FT_CMap vcmap = FT_CMAP( charmap ); - - - if ( charcode > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); - FT_TRACE1(( " 0x%x is truncated\n", charcode )); - } - if ( variantSelector > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); - FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); - } - - result = vcmap->clazz->char_var_default( vcmap, - (FT_UInt32)charcode, - (FT_UInt32)variantSelector ); - } - } - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UInt32* ) - FT_Face_GetVariantSelectors( FT_Face face ) - { - FT_UInt32 *result = NULL; - - - if ( face ) - { - FT_CharMap charmap = find_variant_selector_charmap( face ); - - - if ( charmap != NULL ) - { - FT_CMap vcmap = FT_CMAP( charmap ); - FT_Memory memory = FT_FACE_MEMORY( face ); - - - result = vcmap->clazz->variant_list( vcmap, memory ); - } - } - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UInt32* ) - FT_Face_GetVariantsOfChar( FT_Face face, - FT_ULong charcode ) - { - FT_UInt32 *result = NULL; - - - if ( face ) - { - FT_CharMap charmap = find_variant_selector_charmap( face ); - - - if ( charmap != NULL ) - { - FT_CMap vcmap = FT_CMAP( charmap ); - FT_Memory memory = FT_FACE_MEMORY( face ); - - - if ( charcode > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); - FT_TRACE1(( " 0x%x is truncated\n", charcode )); - } - - result = vcmap->clazz->charvariant_list( vcmap, memory, - (FT_UInt32)charcode ); - } - } - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UInt32* ) - FT_Face_GetCharsOfVariant( FT_Face face, - FT_ULong variantSelector ) - { - FT_UInt32 *result = NULL; - - - if ( face ) - { - FT_CharMap charmap = find_variant_selector_charmap( face ); - - - if ( charmap != NULL ) - { - FT_CMap vcmap = FT_CMAP( charmap ); - FT_Memory memory = FT_FACE_MEMORY( face ); - - - if ( variantSelector > 0xFFFFFFFFUL ) - { - FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); - FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); - } - - result = vcmap->clazz->variantchar_list( vcmap, memory, - (FT_UInt32)variantSelector ); - } - } - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_UInt ) - FT_Get_Name_Index( FT_Face face, - FT_String* glyph_name ) - { - FT_UInt result = 0; - - - if ( face && FT_HAS_GLYPH_NAMES( face ) ) - { - FT_Service_GlyphDict service; - - - FT_FACE_LOOKUP_SERVICE( face, - service, - GLYPH_DICT ); - - if ( service && service->name_index ) - result = service->name_index( face, glyph_name ); - } - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Glyph_Name( FT_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ) - { - FT_Error error = FT_Err_Invalid_Argument; - - - /* clean up buffer */ - if ( buffer && buffer_max > 0 ) - ((FT_Byte*)buffer)[0] = 0; - - if ( face && - (FT_Long)glyph_index <= face->num_glyphs && - FT_HAS_GLYPH_NAMES( face ) ) - { - FT_Service_GlyphDict service; - - - FT_FACE_LOOKUP_SERVICE( face, - service, - GLYPH_DICT ); - - if ( service && service->get_name ) - error = service->get_name( face, glyph_index, buffer, buffer_max ); - } - - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( const char* ) - FT_Get_Postscript_Name( FT_Face face ) - { - const char* result = NULL; - - - if ( !face ) - goto Exit; - - if ( !result ) - { - FT_Service_PsFontName service; - - - FT_FACE_LOOKUP_SERVICE( face, - service, - POSTSCRIPT_FONT_NAME ); - - if ( service && service->get_ps_font_name ) - result = service->get_ps_font_name( face ); - } - - Exit: - return result; - } - - - /* documentation is in tttables.h */ - - FT_EXPORT_DEF( void* ) - FT_Get_Sfnt_Table( FT_Face face, - FT_Sfnt_Tag tag ) - { - void* table = 0; - FT_Service_SFNT_Table service; - - - if ( face && FT_IS_SFNT( face ) ) - { - FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - if ( service != NULL ) - table = service->get_table( face, tag ); - } - - return table; - } - - - /* documentation is in tttables.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Load_Sfnt_Table( FT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte* buffer, - FT_ULong* length ) - { - FT_Service_SFNT_Table service; - - - if ( !face || !FT_IS_SFNT( face ) ) - return FT_Err_Invalid_Face_Handle; - - FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - if ( service == NULL ) - return FT_Err_Unimplemented_Feature; - - return service->load_table( face, tag, offset, buffer, length ); - } - - - /* documentation is in tttables.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Sfnt_Table_Info( FT_Face face, - FT_UInt table_index, - FT_ULong *tag, - FT_ULong *length ) - { - FT_Service_SFNT_Table service; - FT_ULong offset; - - - if ( !face || !FT_IS_SFNT( face ) ) - return FT_Err_Invalid_Face_Handle; - - FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - if ( service == NULL ) - return FT_Err_Unimplemented_Feature; - - return service->table_info( face, table_index, tag, &offset, length ); - } - - - /* documentation is in tttables.h */ - - FT_EXPORT_DEF( FT_ULong ) - FT_Get_CMap_Language_ID( FT_CharMap charmap ) - { - FT_Service_TTCMaps service; - FT_Face face; - TT_CMapInfo cmap_info; - - - if ( !charmap || !charmap->face ) - return 0; - - face = charmap->face; - FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); - if ( service == NULL ) - return 0; - if ( service->get_cmap_info( charmap, &cmap_info )) - return 0; - - return cmap_info.language; - } - - - /* documentation is in tttables.h */ - - FT_EXPORT_DEF( FT_Long ) - FT_Get_CMap_Format( FT_CharMap charmap ) - { - FT_Service_TTCMaps service; - FT_Face face; - TT_CMapInfo cmap_info; - - - if ( !charmap || !charmap->face ) - return -1; - - face = charmap->face; - FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); - if ( service == NULL ) - return -1; - if ( service->get_cmap_info( charmap, &cmap_info )) - return -1; - - return cmap_info.format; - } - - - /* documentation is in ftsizes.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Activate_Size( FT_Size size ) - { - FT_Face face; - - - if ( size == NULL ) - return FT_Err_Invalid_Argument; - - face = size->face; - if ( face == NULL || face->driver == NULL ) - return FT_Err_Invalid_Argument; - - /* we don't need anything more complex than that; all size objects */ - /* are already listed by the face */ - face->size = size; - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** R E N D E R E R S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - /* lookup a renderer by glyph format in the library's list */ - FT_BASE_DEF( FT_Renderer ) - FT_Lookup_Renderer( FT_Library library, - FT_Glyph_Format format, - FT_ListNode* node ) - { - FT_ListNode cur; - FT_Renderer result = 0; - - - if ( !library ) - goto Exit; - - cur = library->renderers.head; - - if ( node ) - { - if ( *node ) - cur = (*node)->next; - *node = 0; - } - - while ( cur ) - { - FT_Renderer renderer = FT_RENDERER( cur->data ); - - - if ( renderer->glyph_format == format ) - { - if ( node ) - *node = cur; - - result = renderer; - break; - } - cur = cur->next; - } - - Exit: - return result; - } - - - static FT_Renderer - ft_lookup_glyph_renderer( FT_GlyphSlot slot ) - { - FT_Face face = slot->face; - FT_Library library = FT_FACE_LIBRARY( face ); - FT_Renderer result = library->cur_renderer; - - - if ( !result || result->glyph_format != slot->format ) - result = FT_Lookup_Renderer( library, slot->format, 0 ); - - return result; - } - - - static void - ft_set_current_renderer( FT_Library library ) - { - FT_Renderer renderer; - - - renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 ); - library->cur_renderer = renderer; - } - - - static FT_Error - ft_add_renderer( FT_Module module ) - { - FT_Library library = module->library; - FT_Memory memory = library->memory; - FT_Error error; - FT_ListNode node = NULL; - - - if ( FT_NEW( node ) ) - goto Exit; - - { - FT_Renderer render = FT_RENDERER( module ); - FT_Renderer_Class* clazz = (FT_Renderer_Class*)module->clazz; - - - render->clazz = clazz; - render->glyph_format = clazz->glyph_format; - - /* allocate raster object if needed */ - if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && - clazz->raster_class->raster_new ) - { - error = clazz->raster_class->raster_new( memory, &render->raster ); - if ( error ) - goto Fail; - - render->raster_render = clazz->raster_class->raster_render; - render->render = clazz->render_glyph; - } - - /* add to list */ - node->data = module; - FT_List_Add( &library->renderers, node ); - - ft_set_current_renderer( library ); - } - - Fail: - if ( error ) - FT_FREE( node ); - - Exit: - return error; - } - - - static void - ft_remove_renderer( FT_Module module ) - { - FT_Library library = module->library; - FT_Memory memory = library->memory; - FT_ListNode node; - - - node = FT_List_Find( &library->renderers, module ); - if ( node ) - { - FT_Renderer render = FT_RENDERER( module ); - - - /* release raster object, if any */ - if ( render->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && - render->raster ) - render->clazz->raster_class->raster_done( render->raster ); - - /* remove from list */ - FT_List_Remove( &library->renderers, node ); - FT_FREE( node ); - - ft_set_current_renderer( library ); - } - } - - - /* documentation is in ftrender.h */ - - FT_EXPORT_DEF( FT_Renderer ) - FT_Get_Renderer( FT_Library library, - FT_Glyph_Format format ) - { - /* test for valid `library' delayed to FT_Lookup_Renderer() */ - - return FT_Lookup_Renderer( library, format, 0 ); - } - - - /* documentation is in ftrender.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Set_Renderer( FT_Library library, - FT_Renderer renderer, - FT_UInt num_params, - FT_Parameter* parameters ) - { - FT_ListNode node; - FT_Error error = FT_Err_Ok; - - - if ( !library ) - return FT_Err_Invalid_Library_Handle; - - if ( !renderer ) - return FT_Err_Invalid_Argument; - - node = FT_List_Find( &library->renderers, renderer ); - if ( !node ) - { - error = FT_Err_Invalid_Argument; - goto Exit; - } - - FT_List_Up( &library->renderers, node ); - - if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE ) - library->cur_renderer = renderer; - - if ( num_params > 0 ) - { - FT_Renderer_SetModeFunc set_mode = renderer->clazz->set_mode; - - - for ( ; num_params > 0; num_params-- ) - { - error = set_mode( renderer, parameters->tag, parameters->data ); - if ( error ) - break; - } - } - - Exit: - return error; - } - - - FT_BASE_DEF( FT_Error ) - FT_Render_Glyph_Internal( FT_Library library, - FT_GlyphSlot slot, - FT_Render_Mode render_mode ) - { - FT_Error error = FT_Err_Ok; - FT_Renderer renderer; - - - /* if it is already a bitmap, no need to do anything */ - switch ( slot->format ) - { - case FT_GLYPH_FORMAT_BITMAP: /* already a bitmap, don't do anything */ - break; - - default: - { - FT_ListNode node = 0; - FT_Bool update = 0; - - - /* small shortcut for the very common case */ - if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) - { - renderer = library->cur_renderer; - node = library->renderers.head; - } - else - renderer = FT_Lookup_Renderer( library, slot->format, &node ); - - error = FT_Err_Unimplemented_Feature; - while ( renderer ) - { - error = renderer->render( renderer, slot, render_mode, NULL ); - if ( !error || - FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph ) - break; - - /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ - /* is unsupported by the current renderer for this glyph image */ - /* format. */ - - /* now, look for another renderer that supports the same */ - /* format. */ - renderer = FT_Lookup_Renderer( library, slot->format, &node ); - update = 1; - } - - /* if we changed the current renderer for the glyph image format */ - /* we need to select it as the next current one */ - if ( !error && update && renderer ) - FT_Set_Renderer( library, renderer, 0, 0 ); - } - } - - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Render_Glyph( FT_GlyphSlot slot, - FT_Render_Mode render_mode ) - { - FT_Library library; - - - if ( !slot || !slot->face ) - return FT_Err_Invalid_Argument; - - library = FT_FACE_LIBRARY( slot->face ); - - return FT_Render_Glyph_Internal( library, slot, render_mode ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** M O D U L E S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Destroy_Module */ - /* */ - /* <Description> */ - /* Destroys a given module object. For drivers, this also destroys */ - /* all child faces. */ - /* */ - /* <InOut> */ - /* module :: A handle to the target driver object. */ - /* */ - /* <Note> */ - /* The driver _must_ be LOCKED! */ - /* */ - static void - Destroy_Module( FT_Module module ) - { - FT_Memory memory = module->memory; - FT_Module_Class* clazz = module->clazz; - FT_Library library = module->library; - - - /* finalize client-data - before anything else */ - if ( module->generic.finalizer ) - module->generic.finalizer( module ); - - if ( library && library->auto_hinter == module ) - library->auto_hinter = 0; - - /* if the module is a renderer */ - if ( FT_MODULE_IS_RENDERER( module ) ) - ft_remove_renderer( module ); - - /* if the module is a font driver, add some steps */ - if ( FT_MODULE_IS_DRIVER( module ) ) - Destroy_Driver( FT_DRIVER( module ) ); - - /* finalize the module object */ - if ( clazz->module_done ) - clazz->module_done( module ); - - /* discard it */ - FT_FREE( module ); - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Add_Module( FT_Library library, - const FT_Module_Class* clazz ) - { - FT_Error error; - FT_Memory memory; - FT_Module module; - FT_UInt nn; - - -#define FREETYPE_VER_FIXED ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \ - FREETYPE_MINOR ) - - if ( !library ) - return FT_Err_Invalid_Library_Handle; - - if ( !clazz ) - return FT_Err_Invalid_Argument; - - /* check freetype version */ - if ( clazz->module_requires > FREETYPE_VER_FIXED ) - return FT_Err_Invalid_Version; - - /* look for a module with the same name in the library's table */ - for ( nn = 0; nn < library->num_modules; nn++ ) - { - module = library->modules[nn]; - if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 ) - { - /* this installed module has the same name, compare their versions */ - if ( clazz->module_version <= module->clazz->module_version ) - return FT_Err_Lower_Module_Version; - - /* remove the module from our list, then exit the loop to replace */ - /* it by our new version.. */ - FT_Remove_Module( library, module ); - break; - } - } - - memory = library->memory; - error = FT_Err_Ok; - - if ( library->num_modules >= FT_MAX_MODULES ) - { - error = FT_Err_Too_Many_Drivers; - goto Exit; - } - - /* allocate module object */ - if ( FT_ALLOC( module, clazz->module_size ) ) - goto Exit; - - /* base initialization */ - module->library = library; - module->memory = memory; - module->clazz = (FT_Module_Class*)clazz; - - /* check whether the module is a renderer - this must be performed */ - /* before the normal module initialization */ - if ( FT_MODULE_IS_RENDERER( module ) ) - { - /* add to the renderers list */ - error = ft_add_renderer( module ); - if ( error ) - goto Fail; - } - - /* is the module a auto-hinter? */ - if ( FT_MODULE_IS_HINTER( module ) ) - library->auto_hinter = module; - - /* if the module is a font driver */ - if ( FT_MODULE_IS_DRIVER( module ) ) - { - /* allocate glyph loader if needed */ - FT_Driver driver = FT_DRIVER( module ); - - - driver->clazz = (FT_Driver_Class)module->clazz; - if ( FT_DRIVER_USES_OUTLINES( driver ) ) - { - error = FT_GlyphLoader_New( memory, &driver->glyph_loader ); - if ( error ) - goto Fail; - } - } - - if ( clazz->module_init ) - { - error = clazz->module_init( module ); - if ( error ) - goto Fail; - } - - /* add module to the library's table */ - library->modules[library->num_modules++] = module; - - Exit: - return error; - - Fail: - if ( FT_MODULE_IS_DRIVER( module ) ) - { - FT_Driver driver = FT_DRIVER( module ); - - - if ( FT_DRIVER_USES_OUTLINES( driver ) ) - FT_GlyphLoader_Done( driver->glyph_loader ); - } - - if ( FT_MODULE_IS_RENDERER( module ) ) - { - FT_Renderer renderer = FT_RENDERER( module ); - - - if ( renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && - renderer->raster ) - renderer->clazz->raster_class->raster_done( renderer->raster ); - } - - FT_FREE( module ); - goto Exit; - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Module ) - FT_Get_Module( FT_Library library, - const char* module_name ) - { - FT_Module result = 0; - FT_Module* cur; - FT_Module* limit; - - - if ( !library || !module_name ) - return result; - - cur = library->modules; - limit = cur + library->num_modules; - - for ( ; cur < limit; cur++ ) - if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 ) - { - result = cur[0]; - break; - } - - return result; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( const void* ) - FT_Get_Module_Interface( FT_Library library, - const char* mod_name ) - { - FT_Module module; - - - /* test for valid `library' delayed to FT_Get_Module() */ - - module = FT_Get_Module( library, mod_name ); - - return module ? module->clazz->module_interface : 0; - } - - - FT_BASE_DEF( FT_Pointer ) - ft_module_get_service( FT_Module module, - const char* service_id ) - { - FT_Pointer result = NULL; - - if ( module ) - { - FT_ASSERT( module->clazz && module->clazz->get_interface ); - - /* first, look for the service in the module - */ - if ( module->clazz->get_interface ) - result = module->clazz->get_interface( module, service_id ); - - if ( result == NULL ) - { - /* we didn't find it, look in all other modules then - */ - FT_Library library = module->library; - FT_Module* cur = library->modules; - FT_Module* limit = cur + library->num_modules; - - for ( ; cur < limit; cur++ ) - { - if ( cur[0] != module ) - { - FT_ASSERT( cur[0]->clazz ); - - if ( cur[0]->clazz->get_interface ) - { - result = cur[0]->clazz->get_interface( cur[0], service_id ); - if ( result != NULL ) - break; - } - } - } - } - } - - return result; - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Remove_Module( FT_Library library, - FT_Module module ) - { - /* try to find the module from the table, then remove it from there */ - - if ( !library ) - return FT_Err_Invalid_Library_Handle; - - if ( module ) - { - FT_Module* cur = library->modules; - FT_Module* limit = cur + library->num_modules; - - - for ( ; cur < limit; cur++ ) - { - if ( cur[0] == module ) - { - /* remove it from the table */ - library->num_modules--; - limit--; - while ( cur < limit ) - { - cur[0] = cur[1]; - cur++; - } - limit[0] = 0; - - /* destroy the module */ - Destroy_Module( module ); - - return FT_Err_Ok; - } - } - } - return FT_Err_Invalid_Driver_Handle; - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** L I B R A R Y ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Reference_Library( FT_Library library ) - { - library->refcount++; - - return FT_Err_Ok; - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_New_Library( FT_Memory memory, - FT_Library *alibrary ) - { - FT_Library library = NULL; - FT_Error error; - - - if ( !memory ) - return FT_Err_Invalid_Argument; - -#ifdef FT_DEBUG_LEVEL_ERROR - /* init debugging support */ - ft_debug_init(); -#endif - - /* first of all, allocate the library object */ - if ( FT_NEW( library ) ) - return error; - - library->memory = memory; - -#ifdef FT_CONFIG_OPTION_PIC - /* initialize position independent code containers */ - error = ft_pic_container_init( library ); - if ( error ) - goto Fail; -#endif - - /* allocate the render pool */ - library->raster_pool_size = FT_RENDER_POOL_SIZE; -#if FT_RENDER_POOL_SIZE > 0 - if ( FT_ALLOC( library->raster_pool, FT_RENDER_POOL_SIZE ) ) - goto Fail; -#endif - - library->version_major = FREETYPE_MAJOR; - library->version_minor = FREETYPE_MINOR; - library->version_patch = FREETYPE_PATCH; - - library->refcount = 1; - - /* That's ok now */ - *alibrary = library; - - return FT_Err_Ok; - - Fail: -#ifdef FT_CONFIG_OPTION_PIC - ft_pic_container_destroy( library ); -#endif - FT_FREE( library ); - return error; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( void ) - FT_Library_Version( FT_Library library, - FT_Int *amajor, - FT_Int *aminor, - FT_Int *apatch ) - { - FT_Int major = 0; - FT_Int minor = 0; - FT_Int patch = 0; - - - if ( library ) - { - major = library->version_major; - minor = library->version_minor; - patch = library->version_patch; - } - - if ( amajor ) - *amajor = major; - - if ( aminor ) - *aminor = minor; - - if ( apatch ) - *apatch = patch; - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Done_Library( FT_Library library ) - { - FT_Memory memory; - - - if ( !library ) - return FT_Err_Invalid_Library_Handle; - - library->refcount--; - if ( library->refcount > 0 ) - goto Exit; - - memory = library->memory; - - /* Discard client-data */ - if ( library->generic.finalizer ) - library->generic.finalizer( library ); - - /* - * Close all faces in the library. If we don't do this, we can have - * some subtle memory leaks. - * - * Example: - * - * - the cff font driver uses the pshinter module in cff_size_done - * - if the pshinter module is destroyed before the cff font driver, - * opened FT_Face objects managed by the driver are not properly - * destroyed, resulting in a memory leak - * - * Some faces are dependent on other faces, like Type42 faces that - * depend on TrueType faces synthesized internally. - * - * The order of drivers should be specified in driver_name[]. - */ - { - FT_UInt m, n; - const char* driver_name[] = { "type42", NULL }; - - - for ( m = 0; - m < sizeof ( driver_name ) / sizeof ( driver_name[0] ); - m++ ) - { - for ( n = 0; n < library->num_modules; n++ ) - { - FT_Module module = library->modules[n]; - const char* module_name = module->clazz->module_name; - FT_List faces; - - - if ( driver_name[m] && - ft_strcmp( module_name, driver_name[m] ) != 0 ) - continue; - - if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 ) - continue; - - FT_TRACE7(( "FT_Done_Library: close faces for %s\n", module_name )); - - faces = &FT_DRIVER( module )->faces_list; - while ( faces->head ) - { - FT_Done_Face( FT_FACE( faces->head->data ) ); - if ( faces->head ) - FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" )); - } - } - } - } - - /* Close all other modules in the library */ -#if 1 - /* XXX Modules are removed in the reversed order so that */ - /* type42 module is removed before truetype module. This */ - /* avoids double free in some occasions. It is a hack. */ - while ( library->num_modules > 0 ) - FT_Remove_Module( library, - library->modules[library->num_modules - 1] ); -#else - { - FT_UInt n; - - - for ( n = 0; n < library->num_modules; n++ ) - { - FT_Module module = library->modules[n]; - - - if ( module ) - { - Destroy_Module( module ); - library->modules[n] = 0; - } - } - } -#endif - - /* Destroy raster objects */ - FT_FREE( library->raster_pool ); - library->raster_pool_size = 0; - -#ifdef FT_CONFIG_OPTION_PIC - /* Destroy pic container contents */ - ft_pic_container_destroy( library ); -#endif - - FT_FREE( library ); - - Exit: - return FT_Err_Ok; - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( void ) - FT_Set_Debug_Hook( FT_Library library, - FT_UInt hook_index, - FT_DebugHook_Func debug_hook ) - { - if ( library && debug_hook && - hook_index < - ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) ) - library->debug_hooks[hook_index] = debug_hook; - } - - - /* documentation is in ftmodapi.h */ - - FT_EXPORT_DEF( FT_TrueTypeEngineType ) - FT_Get_TrueType_Engine_Type( FT_Library library ) - { - FT_TrueTypeEngineType result = FT_TRUETYPE_ENGINE_TYPE_NONE; - - - if ( library ) - { - FT_Module module = FT_Get_Module( library, "truetype" ); - - - if ( module ) - { - FT_Service_TrueTypeEngine service; - - - service = (FT_Service_TrueTypeEngine) - ft_module_get_service( module, - FT_SERVICE_ID_TRUETYPE_ENGINE ); - if ( service ) - result = service->engine_type; - } - } - - return result; - } - - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - FT_BASE_DEF( FT_Error ) - ft_stub_set_char_sizes( FT_Size size, - FT_F26Dot6 width, - FT_F26Dot6 height, - FT_UInt horz_res, - FT_UInt vert_res ) - { - FT_Size_RequestRec req; - FT_Driver driver = size->face->driver; - - - if ( driver->clazz->request_size ) - { - req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; - req.width = width; - req.height = height; - - if ( horz_res == 0 ) - horz_res = vert_res; - - if ( vert_res == 0 ) - vert_res = horz_res; - - if ( horz_res == 0 ) - horz_res = vert_res = 72; - - req.horiResolution = horz_res; - req.vertResolution = vert_res; - - return driver->clazz->request_size( size, &req ); - } - - return 0; - } - - - FT_BASE_DEF( FT_Error ) - ft_stub_set_pixel_sizes( FT_Size size, - FT_UInt width, - FT_UInt height ) - { - FT_Size_RequestRec req; - FT_Driver driver = size->face->driver; - - - if ( driver->clazz->request_size ) - { - req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; - req.width = width << 6; - req.height = height << 6; - req.horiResolution = 0; - req.vertResolution = 0; - - return driver->clazz->request_size( size, &req ); - } - - return 0; - } - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, - FT_UInt sub_index, - FT_Int *p_index, - FT_UInt *p_flags, - FT_Int *p_arg1, - FT_Int *p_arg2, - FT_Matrix *p_transform ) - { - FT_Error error = FT_Err_Invalid_Argument; - - - if ( glyph && - glyph->subglyphs && - glyph->format == FT_GLYPH_FORMAT_COMPOSITE && - sub_index < glyph->num_subglyphs ) - { - FT_SubGlyph subg = glyph->subglyphs + sub_index; - - - *p_index = subg->index; - *p_flags = subg->flags; - *p_arg1 = subg->arg1; - *p_arg2 = subg->arg2; - *p_transform = subg->transform; - } - - return error; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftoutln.c b/android/jni/ndk_modules/freetype/src/base/ftoutln.c deleted file mode 100644 index 356b1561..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftoutln.c +++ /dev/null @@ -1,1129 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftoutln.c */ -/* */ -/* FreeType outline management (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* All functions are declared in freetype.h. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_OUTLINE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_TRIGONOMETRY_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_outline - - - static - const FT_Outline null_outline = { 0, 0, 0, 0, 0, 0 }; - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Decompose( FT_Outline* outline, - const FT_Outline_Funcs* func_interface, - void* user ) - { -#undef SCALED -#define SCALED( x ) ( ( (x) << shift ) - delta ) - - FT_Vector v_last; - FT_Vector v_control; - FT_Vector v_start; - - FT_Vector* point; - FT_Vector* limit; - char* tags; - - FT_Error error; - - FT_Int n; /* index of contour in outline */ - FT_UInt first; /* index of first point in contour */ - FT_Int tag; /* current point's state */ - - FT_Int shift; - FT_Pos delta; - - - if ( !outline || !func_interface ) - return FT_Err_Invalid_Argument; - - shift = func_interface->shift; - delta = func_interface->delta; - first = 0; - - for ( n = 0; n < outline->n_contours; n++ ) - { - FT_Int last; /* index of last point in contour */ - - - FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); - - last = outline->contours[n]; - if ( last < 0 ) - goto Invalid_Outline; - limit = outline->points + last; - - v_start = outline->points[first]; - v_start.x = SCALED( v_start.x ); - v_start.y = SCALED( v_start.y ); - - v_last = outline->points[last]; - v_last.x = SCALED( v_last.x ); - v_last.y = SCALED( v_last.y ); - - v_control = v_start; - - point = outline->points + first; - tags = outline->tags + first; - tag = FT_CURVE_TAG( tags[0] ); - - /* A contour cannot start with a cubic control point! */ - if ( tag == FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - /* check first point to determine origin */ - if ( tag == FT_CURVE_TAG_CONIC ) - { - /* first point is conic control. Yes, this happens. */ - if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) - { - /* start at last point if it is on the curve */ - v_start = v_last; - limit--; - } - else - { - /* if both first and last points are conic, */ - /* start at their middle and record its position */ - /* for closure */ - v_start.x = ( v_start.x + v_last.x ) / 2; - v_start.y = ( v_start.y + v_last.y ) / 2; - - v_last = v_start; - } - point--; - tags--; - } - - FT_TRACE5(( " move to (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0 )); - error = func_interface->move_to( &v_start, user ); - if ( error ) - goto Exit; - - while ( point < limit ) - { - point++; - tags++; - - tag = FT_CURVE_TAG( tags[0] ); - switch ( tag ) - { - case FT_CURVE_TAG_ON: /* emit a single line_to */ - { - FT_Vector vec; - - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - FT_TRACE5(( " line to (%.2f, %.2f)\n", - vec.x / 64.0, vec.y / 64.0 )); - error = func_interface->line_to( &vec, user ); - if ( error ) - goto Exit; - continue; - } - - case FT_CURVE_TAG_CONIC: /* consume conic arcs */ - v_control.x = SCALED( point->x ); - v_control.y = SCALED( point->y ); - - Do_Conic: - if ( point < limit ) - { - FT_Vector vec; - FT_Vector v_middle; - - - point++; - tags++; - tag = FT_CURVE_TAG( tags[0] ); - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - if ( tag == FT_CURVE_TAG_ON ) - { - FT_TRACE5(( " conic to (%.2f, %.2f)" - " with control (%.2f, %.2f)\n", - vec.x / 64.0, vec.y / 64.0, - v_control.x / 64.0, v_control.y / 64.0 )); - error = func_interface->conic_to( &v_control, &vec, user ); - if ( error ) - goto Exit; - continue; - } - - if ( tag != FT_CURVE_TAG_CONIC ) - goto Invalid_Outline; - - v_middle.x = ( v_control.x + vec.x ) / 2; - v_middle.y = ( v_control.y + vec.y ) / 2; - - FT_TRACE5(( " conic to (%.2f, %.2f)" - " with control (%.2f, %.2f)\n", - v_middle.x / 64.0, v_middle.y / 64.0, - v_control.x / 64.0, v_control.y / 64.0 )); - error = func_interface->conic_to( &v_control, &v_middle, user ); - if ( error ) - goto Exit; - - v_control = vec; - goto Do_Conic; - } - - FT_TRACE5(( " conic to (%.2f, %.2f)" - " with control (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0, - v_control.x / 64.0, v_control.y / 64.0 )); - error = func_interface->conic_to( &v_control, &v_start, user ); - goto Close; - - default: /* FT_CURVE_TAG_CUBIC */ - { - FT_Vector vec1, vec2; - - - if ( point + 1 > limit || - FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - point += 2; - tags += 2; - - vec1.x = SCALED( point[-2].x ); - vec1.y = SCALED( point[-2].y ); - - vec2.x = SCALED( point[-1].x ); - vec2.y = SCALED( point[-1].y ); - - if ( point <= limit ) - { - FT_Vector vec; - - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - FT_TRACE5(( " cubic to (%.2f, %.2f)" - " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", - vec.x / 64.0, vec.y / 64.0, - vec1.x / 64.0, vec1.y / 64.0, - vec2.x / 64.0, vec2.y / 64.0 )); - error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); - if ( error ) - goto Exit; - continue; - } - - FT_TRACE5(( " cubic to (%.2f, %.2f)" - " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0, - vec1.x / 64.0, vec1.y / 64.0, - vec2.x / 64.0, vec2.y / 64.0 )); - error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); - goto Close; - } - } - } - - /* close the contour with a line segment */ - FT_TRACE5(( " line to (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0 )); - error = func_interface->line_to( &v_start, user ); - - Close: - if ( error ) - goto Exit; - - first = last + 1; - } - - FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); - return FT_Err_Ok; - - Exit: - FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); - return error; - - Invalid_Outline: - return FT_Err_Invalid_Outline; - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_New_Internal( FT_Memory memory, - FT_UInt numPoints, - FT_Int numContours, - FT_Outline *anoutline ) - { - FT_Error error; - - - if ( !anoutline || !memory ) - return FT_Err_Invalid_Argument; - - *anoutline = null_outline; - - if ( FT_NEW_ARRAY( anoutline->points, numPoints ) || - FT_NEW_ARRAY( anoutline->tags, numPoints ) || - FT_NEW_ARRAY( anoutline->contours, numContours ) ) - goto Fail; - - anoutline->n_points = (FT_UShort)numPoints; - anoutline->n_contours = (FT_Short)numContours; - anoutline->flags |= FT_OUTLINE_OWNER; - - return FT_Err_Ok; - - Fail: - anoutline->flags |= FT_OUTLINE_OWNER; - FT_Outline_Done_Internal( memory, anoutline ); - - return error; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_New( FT_Library library, - FT_UInt numPoints, - FT_Int numContours, - FT_Outline *anoutline ) - { - if ( !library ) - return FT_Err_Invalid_Library_Handle; - - return FT_Outline_New_Internal( library->memory, numPoints, - numContours, anoutline ); - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Check( FT_Outline* outline ) - { - if ( outline ) - { - FT_Int n_points = outline->n_points; - FT_Int n_contours = outline->n_contours; - FT_Int end0, end; - FT_Int n; - - - /* empty glyph? */ - if ( n_points == 0 && n_contours == 0 ) - return 0; - - /* check point and contour counts */ - if ( n_points <= 0 || n_contours <= 0 ) - goto Bad; - - end0 = end = -1; - for ( n = 0; n < n_contours; n++ ) - { - end = outline->contours[n]; - - /* note that we don't accept empty contours */ - if ( end <= end0 || end >= n_points ) - goto Bad; - - end0 = end; - } - - if ( end != n_points - 1 ) - goto Bad; - - /* XXX: check the tags array */ - return 0; - } - - Bad: - return FT_Err_Invalid_Argument; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Copy( const FT_Outline* source, - FT_Outline *target ) - { - FT_Int is_owner; - - - if ( !source || !target || - source->n_points != target->n_points || - source->n_contours != target->n_contours ) - return FT_Err_Invalid_Argument; - - if ( source == target ) - return FT_Err_Ok; - - FT_ARRAY_COPY( target->points, source->points, source->n_points ); - - FT_ARRAY_COPY( target->tags, source->tags, source->n_points ); - - FT_ARRAY_COPY( target->contours, source->contours, source->n_contours ); - - /* copy all flags, except the `FT_OUTLINE_OWNER' one */ - is_owner = target->flags & FT_OUTLINE_OWNER; - target->flags = source->flags; - - target->flags &= ~FT_OUTLINE_OWNER; - target->flags |= is_owner; - - return FT_Err_Ok; - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Done_Internal( FT_Memory memory, - FT_Outline* outline ) - { - if ( memory && outline ) - { - if ( outline->flags & FT_OUTLINE_OWNER ) - { - FT_FREE( outline->points ); - FT_FREE( outline->tags ); - FT_FREE( outline->contours ); - } - *outline = null_outline; - - return FT_Err_Ok; - } - else - return FT_Err_Invalid_Argument; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Done( FT_Library library, - FT_Outline* outline ) - { - /* check for valid `outline' in FT_Outline_Done_Internal() */ - - if ( !library ) - return FT_Err_Invalid_Library_Handle; - - return FT_Outline_Done_Internal( library->memory, outline ); - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( void ) - FT_Outline_Get_CBox( const FT_Outline* outline, - FT_BBox *acbox ) - { - FT_Pos xMin, yMin, xMax, yMax; - - - if ( outline && acbox ) - { - if ( outline->n_points == 0 ) - { - xMin = 0; - yMin = 0; - xMax = 0; - yMax = 0; - } - else - { - FT_Vector* vec = outline->points; - FT_Vector* limit = vec + outline->n_points; - - - xMin = xMax = vec->x; - yMin = yMax = vec->y; - vec++; - - for ( ; vec < limit; vec++ ) - { - FT_Pos x, y; - - - x = vec->x; - if ( x < xMin ) xMin = x; - if ( x > xMax ) xMax = x; - - y = vec->y; - if ( y < yMin ) yMin = y; - if ( y > yMax ) yMax = y; - } - } - acbox->xMin = xMin; - acbox->xMax = xMax; - acbox->yMin = yMin; - acbox->yMax = yMax; - } - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( void ) - FT_Outline_Translate( const FT_Outline* outline, - FT_Pos xOffset, - FT_Pos yOffset ) - { - FT_UShort n; - FT_Vector* vec; - - - if ( !outline ) - return; - - vec = outline->points; - - for ( n = 0; n < outline->n_points; n++ ) - { - vec->x += xOffset; - vec->y += yOffset; - vec++; - } - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( void ) - FT_Outline_Reverse( FT_Outline* outline ) - { - FT_UShort n; - FT_Int first, last; - - - if ( !outline ) - return; - - first = 0; - - for ( n = 0; n < outline->n_contours; n++ ) - { - last = outline->contours[n]; - - /* reverse point table */ - { - FT_Vector* p = outline->points + first; - FT_Vector* q = outline->points + last; - FT_Vector swap; - - - while ( p < q ) - { - swap = *p; - *p = *q; - *q = swap; - p++; - q--; - } - } - - /* reverse tags table */ - { - char* p = outline->tags + first; - char* q = outline->tags + last; - char swap; - - - while ( p < q ) - { - swap = *p; - *p = *q; - *q = swap; - p++; - q--; - } - } - - first = last + 1; - } - - outline->flags ^= FT_OUTLINE_REVERSE_FILL; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Render( FT_Library library, - FT_Outline* outline, - FT_Raster_Params* params ) - { - FT_Error error; - FT_Bool update = FALSE; - FT_Renderer renderer; - FT_ListNode node; - - - if ( !library ) - return FT_Err_Invalid_Library_Handle; - - if ( !outline || !params ) - return FT_Err_Invalid_Argument; - - renderer = library->cur_renderer; - node = library->renderers.head; - - params->source = (void*)outline; - - error = FT_Err_Cannot_Render_Glyph; - while ( renderer ) - { - error = renderer->raster_render( renderer->raster, params ); - if ( !error || FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph ) - break; - - /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ - /* is unsupported by the current renderer for this glyph image */ - /* format */ - - /* now, look for another renderer that supports the same */ - /* format */ - renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, - &node ); - update = TRUE; - } - - /* if we changed the current renderer for the glyph image format */ - /* we need to select it as the next current one */ - if ( !error && update && renderer ) - FT_Set_Renderer( library, renderer, 0, 0 ); - - return error; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Get_Bitmap( FT_Library library, - FT_Outline* outline, - const FT_Bitmap *abitmap ) - { - FT_Raster_Params params; - - - if ( !abitmap ) - return FT_Err_Invalid_Argument; - - /* other checks are delayed to FT_Outline_Render() */ - - params.target = abitmap; - params.flags = 0; - - if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY || - abitmap->pixel_mode == FT_PIXEL_MODE_LCD || - abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V ) - params.flags |= FT_RASTER_FLAG_AA; - - return FT_Outline_Render( library, outline, ¶ms ); - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( void ) - FT_Vector_Transform( FT_Vector* vector, - const FT_Matrix* matrix ) - { - FT_Pos xz, yz; - - - if ( !vector || !matrix ) - return; - - xz = FT_MulFix( vector->x, matrix->xx ) + - FT_MulFix( vector->y, matrix->xy ); - - yz = FT_MulFix( vector->x, matrix->yx ) + - FT_MulFix( vector->y, matrix->yy ); - - vector->x = xz; - vector->y = yz; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( void ) - FT_Outline_Transform( const FT_Outline* outline, - const FT_Matrix* matrix ) - { - FT_Vector* vec; - FT_Vector* limit; - - - if ( !outline || !matrix ) - return; - - vec = outline->points; - limit = vec + outline->n_points; - - for ( ; vec < limit; vec++ ) - FT_Vector_Transform( vec, matrix ); - } - - -#if 0 - -#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last ) \ - do { \ - (first) = ( c > 0 ) ? (outline)->points + \ - (outline)->contours[c - 1] + 1 \ - : (outline)->points; \ - (last) = (outline)->points + (outline)->contours[c]; \ - } while ( 0 ) - - - /* Is a point in some contour? */ - /* */ - /* We treat every point of the contour as if it */ - /* it were ON. That is, we allow false positives, */ - /* but disallow false negatives. (XXX really?) */ - static FT_Bool - ft_contour_has( FT_Outline* outline, - FT_Short c, - FT_Vector* point ) - { - FT_Vector* first; - FT_Vector* last; - FT_Vector* a; - FT_Vector* b; - FT_UInt n = 0; - - - FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); - - for ( a = first; a <= last; a++ ) - { - FT_Pos x; - FT_Int intersect; - - - b = ( a == last ) ? first : a + 1; - - intersect = ( a->y - point->y ) ^ ( b->y - point->y ); - - /* a and b are on the same side */ - if ( intersect >= 0 ) - { - if ( intersect == 0 && a->y == point->y ) - { - if ( ( a->x <= point->x && b->x >= point->x ) || - ( a->x >= point->x && b->x <= point->x ) ) - return 1; - } - - continue; - } - - x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y ); - - if ( x < point->x ) - n++; - else if ( x == point->x ) - return 1; - } - - return ( n % 2 ); - } - - - static FT_Bool - ft_contour_enclosed( FT_Outline* outline, - FT_UShort c ) - { - FT_Vector* first; - FT_Vector* last; - FT_Short i; - - - FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); - - for ( i = 0; i < outline->n_contours; i++ ) - { - if ( i != c && ft_contour_has( outline, i, first ) ) - { - FT_Vector* pt; - - - for ( pt = first + 1; pt <= last; pt++ ) - if ( !ft_contour_has( outline, i, pt ) ) - return 0; - - return 1; - } - } - - return 0; - } - - - /* This version differs from the public one in that each */ - /* part (contour not enclosed in another contour) of the */ - /* outline is checked for orientation. This is */ - /* necessary for some buggy CJK fonts. */ - static FT_Orientation - ft_outline_get_orientation( FT_Outline* outline ) - { - FT_Short i; - FT_Vector* first; - FT_Vector* last; - FT_Orientation orient = FT_ORIENTATION_NONE; - - - first = outline->points; - for ( i = 0; i < outline->n_contours; i++, first = last + 1 ) - { - FT_Vector* point; - FT_Vector* xmin_point; - FT_Pos xmin; - - - last = outline->points + outline->contours[i]; - - /* skip degenerate contours */ - if ( last < first + 2 ) - continue; - - if ( ft_contour_enclosed( outline, i ) ) - continue; - - xmin = first->x; - xmin_point = first; - - for ( point = first + 1; point <= last; point++ ) - { - if ( point->x < xmin ) - { - xmin = point->x; - xmin_point = point; - } - } - - /* check the orientation of the contour */ - { - FT_Vector* prev; - FT_Vector* next; - FT_Orientation o; - - - prev = ( xmin_point == first ) ? last : xmin_point - 1; - next = ( xmin_point == last ) ? first : xmin_point + 1; - - if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) > - FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) ) - o = FT_ORIENTATION_POSTSCRIPT; - else - o = FT_ORIENTATION_TRUETYPE; - - if ( orient == FT_ORIENTATION_NONE ) - orient = o; - else if ( orient != o ) - return FT_ORIENTATION_NONE; - } - } - - return orient; - } - -#endif /* 0 */ - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Outline_Embolden( FT_Outline* outline, - FT_Pos strength ) - { - FT_Vector* points; - FT_Vector v_prev, v_first, v_next, v_cur; - FT_Angle rotate, angle_in, angle_out; - FT_Int c, n, first; - FT_Int orientation; - - - if ( !outline ) - return FT_Err_Invalid_Argument; - - strength /= 2; - if ( strength == 0 ) - return FT_Err_Ok; - - orientation = FT_Outline_Get_Orientation( outline ); - if ( orientation == FT_ORIENTATION_NONE ) - { - if ( outline->n_contours ) - return FT_Err_Invalid_Argument; - else - return FT_Err_Ok; - } - - if ( orientation == FT_ORIENTATION_TRUETYPE ) - rotate = -FT_ANGLE_PI2; - else - rotate = FT_ANGLE_PI2; - - points = outline->points; - - first = 0; - for ( c = 0; c < outline->n_contours; c++ ) - { - int last = outline->contours[c]; - - - v_first = points[first]; - v_prev = points[last]; - v_cur = v_first; - - for ( n = first; n <= last; n++ ) - { - FT_Vector in, out; - FT_Angle angle_diff; - FT_Pos d; - FT_Fixed scale; - - - if ( n < last ) - v_next = points[n + 1]; - else - v_next = v_first; - - /* compute the in and out vectors */ - in.x = v_cur.x - v_prev.x; - in.y = v_cur.y - v_prev.y; - - out.x = v_next.x - v_cur.x; - out.y = v_next.y - v_cur.y; - - angle_in = FT_Atan2( in.x, in.y ); - angle_out = FT_Atan2( out.x, out.y ); - angle_diff = FT_Angle_Diff( angle_in, angle_out ); - scale = FT_Cos( angle_diff / 2 ); - - if ( scale < 0x4000L && scale > -0x4000L ) - in.x = in.y = 0; - else - { - d = FT_DivFix( strength, scale ); - - FT_Vector_From_Polar( &in, d, angle_in + angle_diff / 2 - rotate ); - } - - outline->points[n].x = v_cur.x + strength + in.x; - outline->points[n].y = v_cur.y + strength + in.y; - - v_prev = v_cur; - v_cur = v_next; - } - - first = last + 1; - } - - return FT_Err_Ok; - } - - - /* documentation is in ftoutln.h */ - - FT_EXPORT_DEF( FT_Orientation ) - FT_Outline_Get_Orientation( FT_Outline* outline ) - { - FT_Pos xmin = 32768L; - FT_Pos xmin_ymin = 32768L; - FT_Pos xmin_ymax = -32768L; - FT_Vector* xmin_first = NULL; - FT_Vector* xmin_last = NULL; - - short* contour; - - FT_Vector* first; - FT_Vector* last; - FT_Vector* prev; - FT_Vector* point; - - int i; - FT_Pos ray_y[3]; - FT_Orientation result[3] = - { FT_ORIENTATION_NONE, FT_ORIENTATION_NONE, FT_ORIENTATION_NONE }; - - - if ( !outline || outline->n_points <= 0 ) - return FT_ORIENTATION_TRUETYPE; - - /* We use the nonzero winding rule to find the orientation. */ - /* Since glyph outlines behave much more `regular' than arbitrary */ - /* cubic or quadratic curves, this test deals with the polygon */ - /* only which is spanned up by the control points. */ - - first = outline->points; - for ( contour = outline->contours; - contour < outline->contours + outline->n_contours; - contour++, first = last + 1 ) - { - FT_Pos contour_xmin = 32768L; - FT_Pos contour_xmax = -32768L; - FT_Pos contour_ymin = 32768L; - FT_Pos contour_ymax = -32768L; - - - last = outline->points + *contour; - - /* skip degenerate contours */ - if ( last < first + 2 ) - continue; - - for ( point = first; point <= last; ++point ) - { - if ( point->x < contour_xmin ) - contour_xmin = point->x; - - if ( point->x > contour_xmax ) - contour_xmax = point->x; - - if ( point->y < contour_ymin ) - contour_ymin = point->y; - - if ( point->y > contour_ymax ) - contour_ymax = point->y; - } - - if ( contour_xmin < xmin && - contour_xmin != contour_xmax && - contour_ymin != contour_ymax ) - { - xmin = contour_xmin; - xmin_ymin = contour_ymin; - xmin_ymax = contour_ymax; - xmin_first = first; - xmin_last = last; - } - } - - if ( xmin == 32768L ) - return FT_ORIENTATION_TRUETYPE; - - ray_y[0] = ( xmin_ymin * 3 + xmin_ymax ) >> 2; - ray_y[1] = ( xmin_ymin + xmin_ymax ) >> 1; - ray_y[2] = ( xmin_ymin + xmin_ymax * 3 ) >> 2; - - for ( i = 0; i < 3; i++ ) - { - FT_Pos left_x; - FT_Pos right_x; - FT_Vector* left1; - FT_Vector* left2; - FT_Vector* right1; - FT_Vector* right2; - - - RedoRay: - left_x = 32768L; - right_x = -32768L; - - left1 = left2 = right1 = right2 = NULL; - - prev = xmin_last; - for ( point = xmin_first; point <= xmin_last; prev = point, ++point ) - { - FT_Pos tmp_x; - - - if ( point->y == ray_y[i] || prev->y == ray_y[i] ) - { - ray_y[i]++; - goto RedoRay; - } - - if ( ( point->y < ray_y[i] && prev->y < ray_y[i] ) || - ( point->y > ray_y[i] && prev->y > ray_y[i] ) ) - continue; - - tmp_x = FT_MulDiv( point->x - prev->x, - ray_y[i] - prev->y, - point->y - prev->y ) + prev->x; - - if ( tmp_x < left_x ) - { - left_x = tmp_x; - left1 = prev; - left2 = point; - } - - if ( tmp_x > right_x ) - { - right_x = tmp_x; - right1 = prev; - right2 = point; - } - } - - if ( left1 && right1 ) - { - if ( left1->y < left2->y && right1->y > right2->y ) - result[i] = FT_ORIENTATION_TRUETYPE; - else if ( left1->y > left2->y && right1->y < right2->y ) - result[i] = FT_ORIENTATION_POSTSCRIPT; - else - result[i] = FT_ORIENTATION_NONE; - } - } - - if ( result[0] != FT_ORIENTATION_NONE && - ( result[0] == result[1] || result[0] == result[2] ) ) - return result[0]; - - if ( result[1] != FT_ORIENTATION_NONE && result[1] == result[2] ) - return result[1]; - - return FT_ORIENTATION_TRUETYPE; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftpatent.c b/android/jni/ndk_modules/freetype/src/base/ftpatent.c deleted file mode 100644 index 501cab52..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftpatent.c +++ /dev/null @@ -1,286 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftpatent.c */ -/* */ -/* FreeType API for checking patented TrueType bytecode instructions */ -/* (body). */ -/* */ -/* Copyright 2007, 2008, 2010 by David Turner. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_TRUETYPE_GLYF_H - - - static FT_Bool - _tt_check_patents_in_range( FT_Stream stream, - FT_ULong size ) - { - FT_Bool result = FALSE; - FT_Error error; - FT_Bytes p, end; - - - if ( FT_FRAME_ENTER( size ) ) - return 0; - - p = stream->cursor; - end = p + size; - - while ( p < end ) - { - switch (p[0]) - { - case 0x06: /* SPvTL // */ - case 0x07: /* SPvTL + */ - case 0x08: /* SFvTL // */ - case 0x09: /* SFvTL + */ - case 0x0A: /* SPvFS */ - case 0x0B: /* SFvFS */ - result = TRUE; - goto Exit; - - case 0x40: - if ( p + 1 >= end ) - goto Exit; - - p += p[1] + 2; - break; - - case 0x41: - if ( p + 1 >= end ) - goto Exit; - - p += p[1] * 2 + 2; - break; - - case 0x71: /* DELTAP2 */ - case 0x72: /* DELTAP3 */ - case 0x73: /* DELTAC0 */ - case 0x74: /* DELTAC1 */ - case 0x75: /* DELTAC2 */ - result = TRUE; - goto Exit; - - case 0xB0: - case 0xB1: - case 0xB2: - case 0xB3: - case 0xB4: - case 0xB5: - case 0xB6: - case 0xB7: - p += ( p[0] - 0xB0 ) + 2; - break; - - case 0xB8: - case 0xB9: - case 0xBA: - case 0xBB: - case 0xBC: - case 0xBD: - case 0xBE: - case 0xBF: - p += ( p[0] - 0xB8 ) * 2 + 3; - break; - - default: - p += 1; - break; - } - } - - Exit: - FT_UNUSED( error ); - FT_FRAME_EXIT(); - return result; - } - - - static FT_Bool - _tt_check_patents_in_table( FT_Face face, - FT_ULong tag ) - { - FT_Stream stream = face->stream; - FT_Error error = FT_Err_Ok; - FT_Service_SFNT_Table service; - FT_Bool result = FALSE; - - - FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - - if ( service ) - { - FT_UInt i = 0; - FT_ULong tag_i = 0, offset_i = 0, length_i = 0; - - - for ( i = 0; !error && tag_i != tag ; i++ ) - error = service->table_info( face, i, - &tag_i, &offset_i, &length_i ); - - if ( error || - FT_STREAM_SEEK( offset_i ) ) - goto Exit; - - result = _tt_check_patents_in_range( stream, length_i ); - } - - Exit: - return result; - } - - - static FT_Bool - _tt_face_check_patents( FT_Face face ) - { - FT_Stream stream = face->stream; - FT_UInt gindex; - FT_Error error; - FT_Bool result; - - FT_Service_TTGlyf service; - - - result = _tt_check_patents_in_table( face, TTAG_fpgm ); - if ( result ) - goto Exit; - - result = _tt_check_patents_in_table( face, TTAG_prep ); - if ( result ) - goto Exit; - - FT_FACE_FIND_SERVICE( face, service, TT_GLYF ); - if ( service == NULL ) - goto Exit; - - for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ ) - { - FT_ULong offset, num_ins, size; - FT_Int num_contours; - - - offset = service->get_location( face, gindex, &size ); - if ( size == 0 ) - continue; - - if ( FT_STREAM_SEEK( offset ) || - FT_READ_SHORT( num_contours ) ) - continue; - - if ( num_contours >= 0 ) /* simple glyph */ - { - if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) ) - continue; - } - else /* compound glyph */ - { - FT_Bool has_instr = 0; - - - if ( FT_STREAM_SKIP( 8 ) ) - continue; - - /* now read each component */ - for (;;) - { - FT_UInt flags, toskip; - - - if( FT_READ_USHORT( flags ) ) - break; - - toskip = 2 + 1 + 1; - - if ( ( flags & ( 1 << 0 ) ) != 0 ) /* ARGS_ARE_WORDS */ - toskip += 2; - - if ( ( flags & ( 1 << 3 ) ) != 0 ) /* WE_HAVE_A_SCALE */ - toskip += 2; - else if ( ( flags & ( 1 << 6 ) ) != 0 ) /* WE_HAVE_X_Y_SCALE */ - toskip += 4; - else if ( ( flags & ( 1 << 7 ) ) != 0 ) /* WE_HAVE_A_2x2 */ - toskip += 8; - - if ( ( flags & ( 1 << 8 ) ) != 0 ) /* WE_HAVE_INSTRUCTIONS */ - has_instr = 1; - - if ( FT_STREAM_SKIP( toskip ) ) - goto NextGlyph; - - if ( ( flags & ( 1 << 5 ) ) == 0 ) /* MORE_COMPONENTS */ - break; - } - - if ( !has_instr ) - goto NextGlyph; - } - - if ( FT_READ_USHORT( num_ins ) ) - continue; - - result = _tt_check_patents_in_range( stream, num_ins ); - if ( result ) - goto Exit; - - NextGlyph: - ; - } - - Exit: - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Bool ) - FT_Face_CheckTrueTypePatents( FT_Face face ) - { - FT_Bool result = FALSE; - - - if ( face && FT_IS_SFNT( face ) ) - result = _tt_face_check_patents( face ); - - return result; - } - - - /* documentation is in freetype.h */ - - FT_EXPORT_DEF( FT_Bool ) - FT_Face_SetUnpatentedHinting( FT_Face face, - FT_Bool value ) - { - FT_Bool result = FALSE; - - -#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \ - !defined( TT_CONFIG_OPTION_BYTECODE_INTEPRETER ) - if ( face && FT_IS_SFNT( face ) ) - { - result = !face->internal->ignore_unpatented_hinter; - face->internal->ignore_unpatented_hinter = !value; - } -#else - FT_UNUSED( face ); - FT_UNUSED( value ); -#endif - - return result; - } - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftpic.c b/android/jni/ndk_modules/freetype/src/base/ftpic.c deleted file mode 100644 index d5271a97..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftpic.c +++ /dev/null @@ -1,54 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftpic.c */ -/* */ -/* The FreeType position independent code services (body). */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "basepic.h" - -#ifdef FT_CONFIG_OPTION_PIC - - /* documentation is in ftpic.h */ - - FT_BASE_DEF( FT_Error ) - ft_pic_container_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - - FT_MEM_SET( pic_container, 0, sizeof(*pic_container) ); - - error = ft_base_pic_init( library ); - if(error) - return error; - - return FT_Err_Ok; - } - - - /* Destroy the contents of the container. */ - FT_BASE_DEF( void ) - ft_pic_container_destroy( FT_Library library ) - { - ft_base_pic_free( library ); - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftrfork.c b/android/jni/ndk_modules/freetype/src/base/ftrfork.c deleted file mode 100644 index f64d28b2..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftrfork.c +++ /dev/null @@ -1,821 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftrfork.c */ -/* */ -/* Embedded resource forks accessor (body). */ -/* */ -/* Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ -/* Masatake YAMATO and Redhat K.K. */ -/* */ -/* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */ -/* derived from ftobjs.c. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - -/***************************************************************************/ -/* Development of the code in this file is support of */ -/* Information-technology Promotion Agency, Japan. */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_RFORK_H - - -#undef FT_COMPONENT -#define FT_COMPONENT trace_raccess - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** Resource fork directory access ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - FT_BASE_DEF( FT_Error ) - FT_Raccess_Get_HeaderInfo( FT_Library library, - FT_Stream stream, - FT_Long rfork_offset, - FT_Long *map_offset, - FT_Long *rdata_pos ) - { - FT_Error error; - unsigned char head[16], head2[16]; - FT_Long map_pos, rdata_len; - int allzeros, allmatch, i; - FT_Long type_list; - - FT_UNUSED( library ); - - - error = FT_Stream_Seek( stream, rfork_offset ); - if ( error ) - return error; - - error = FT_Stream_Read( stream, (FT_Byte *)head, 16 ); - if ( error ) - return error; - - *rdata_pos = rfork_offset + ( ( head[0] << 24 ) | - ( head[1] << 16 ) | - ( head[2] << 8 ) | - head[3] ); - map_pos = rfork_offset + ( ( head[4] << 24 ) | - ( head[5] << 16 ) | - ( head[6] << 8 ) | - head[7] ); - rdata_len = ( head[ 8] << 24 ) | - ( head[ 9] << 16 ) | - ( head[10] << 8 ) | - head[11]; - - /* map_len = head[12] .. head[15] */ - - if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset ) - return FT_Err_Unknown_File_Format; - - error = FT_Stream_Seek( stream, map_pos ); - if ( error ) - return error; - - head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */ - - error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 ); - if ( error ) - return error; - - allzeros = 1; - allmatch = 1; - for ( i = 0; i < 16; ++i ) - { - if ( head2[i] != 0 ) - allzeros = 0; - if ( head2[i] != head[i] ) - allmatch = 0; - } - if ( !allzeros && !allmatch ) - return FT_Err_Unknown_File_Format; - - /* If we have reached this point then it is probably a mac resource */ - /* file. Now, does it contain any interesting resources? */ - /* Skip handle to next resource map, the file resource number, and */ - /* attributes. */ - (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */ - + 2 /* skip file resource number */ - + 2 ); /* skip attributes */ - - if ( FT_READ_USHORT( type_list ) ) - return error; - if ( type_list == -1 ) - return FT_Err_Unknown_File_Format; - - error = FT_Stream_Seek( stream, map_pos + type_list ); - if ( error ) - return error; - - *map_offset = map_pos + type_list; - return FT_Err_Ok; - } - - - static int - ft_raccess_sort_ref_by_id( FT_RFork_Ref* a, - FT_RFork_Ref* b ) - { - if ( a->res_id < b->res_id ) - return -1; - else if ( a->res_id > b->res_id ) - return 1; - else - return 0; - } - - - FT_BASE_DEF( FT_Error ) - FT_Raccess_Get_DataOffsets( FT_Library library, - FT_Stream stream, - FT_Long map_offset, - FT_Long rdata_pos, - FT_Long tag, - FT_Long **offsets, - FT_Long *count ) - { - FT_Error error; - int i, j, cnt, subcnt; - FT_Long tag_internal, rpos; - FT_Memory memory = library->memory; - FT_Long temp; - FT_Long *offsets_internal; - FT_RFork_Ref *ref; - - - error = FT_Stream_Seek( stream, map_offset ); - if ( error ) - return error; - - if ( FT_READ_USHORT( cnt ) ) - return error; - cnt++; - - for ( i = 0; i < cnt; ++i ) - { - if ( FT_READ_LONG( tag_internal ) || - FT_READ_USHORT( subcnt ) || - FT_READ_USHORT( rpos ) ) - return error; - - FT_TRACE2(( "Resource tags: %c%c%c%c\n", - (char)( 0xff & ( tag_internal >> 24 ) ), - (char)( 0xff & ( tag_internal >> 16 ) ), - (char)( 0xff & ( tag_internal >> 8 ) ), - (char)( 0xff & ( tag_internal >> 0 ) ) )); - - if ( tag_internal == tag ) - { - *count = subcnt + 1; - rpos += map_offset; - - error = FT_Stream_Seek( stream, rpos ); - if ( error ) - return error; - - if ( FT_NEW_ARRAY( ref, *count ) ) - return error; - - for ( j = 0; j < *count; ++j ) - { - if ( FT_READ_USHORT( ref[j].res_id ) ) - goto Exit; - if ( FT_STREAM_SKIP( 2 ) ) /* resource name */ - goto Exit; - if ( FT_READ_LONG( temp ) ) - goto Exit; - if ( FT_STREAM_SKIP( 4 ) ) /* mbz */ - goto Exit; - - ref[j].offset = temp & 0xFFFFFFL; - } - - ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ), - ( int(*)(const void*, const void*) ) - ft_raccess_sort_ref_by_id ); - - if ( FT_NEW_ARRAY( offsets_internal, *count ) ) - goto Exit; - - /* XXX: duplicated reference ID, - * gap between reference IDs are acceptable? - * further investigation on Apple implementation is needed. - */ - for ( j = 0; j < *count; ++j ) - offsets_internal[j] = rdata_pos + ref[j].offset; - - *offsets = offsets_internal; - error = FT_Err_Ok; - - Exit: - FT_FREE( ref ); - return error; - } - } - - return FT_Err_Cannot_Open_Resource; - } - - -#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** Guessing functions ****/ - /**** ****/ - /**** When you add a new guessing function, ****/ - /**** update FT_RACCESS_N_RULES in ftrfork.h. ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - typedef FT_Error - (*raccess_guess_func)( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - - static FT_Error - raccess_guess_apple_double( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_apple_single( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_darwin_ufs_export( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_darwin_newvfs( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_darwin_hfsplus( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_vfat( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_linux_cap( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_linux_double( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_linux_netatalk( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ); - - - /*************************************************************************/ - /**** ****/ - /**** Helper functions ****/ - /**** ****/ - /*************************************************************************/ - - static FT_Error - raccess_guess_apple_generic( FT_Library library, - FT_Stream stream, - char *base_file_name, - FT_Int32 magic, - FT_Long *result_offset ); - - static FT_Error - raccess_guess_linux_double_from_file_name( FT_Library library, - char * file_name, - FT_Long *result_offset ); - - static char * - raccess_make_file_name( FT_Memory memory, - const char *original_name, - const char *insertion ); - - - FT_BASE_DEF( void ) - FT_Raccess_Guess( FT_Library library, - FT_Stream stream, - char* base_name, - char **new_names, - FT_Long *offsets, - FT_Error *errors ) - { - FT_Long i; - - - raccess_guess_func funcs[FT_RACCESS_N_RULES] = - { - raccess_guess_apple_double, - raccess_guess_apple_single, - raccess_guess_darwin_ufs_export, - raccess_guess_darwin_newvfs, - raccess_guess_darwin_hfsplus, - raccess_guess_vfat, - raccess_guess_linux_cap, - raccess_guess_linux_double, - raccess_guess_linux_netatalk, - }; - - for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) - { - new_names[i] = NULL; - if ( NULL != stream ) - errors[i] = FT_Stream_Seek( stream, 0 ); - else - errors[i] = FT_Err_Ok; - - if ( errors[i] ) - continue ; - - errors[i] = (funcs[i])( library, stream, base_name, - &(new_names[i]), &(offsets[i]) ); - } - - return; - } - - - static FT_Error - raccess_guess_apple_double( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - FT_Int32 magic = ( 0x00 << 24 ) | - ( 0x05 << 16 ) | - ( 0x16 << 8 ) | - 0x07; - - - *result_file_name = NULL; - if ( NULL == stream ) - return FT_Err_Cannot_Open_Stream; - - return raccess_guess_apple_generic( library, stream, base_file_name, - magic, result_offset ); - } - - - static FT_Error - raccess_guess_apple_single( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - FT_Int32 magic = ( 0x00 << 24 ) | - ( 0x05 << 16 ) | - ( 0x16 << 8 ) | - 0x00; - - - *result_file_name = NULL; - if ( NULL == stream ) - return FT_Err_Cannot_Open_Stream; - - return raccess_guess_apple_generic( library, stream, base_file_name, - magic, result_offset ); - } - - - static FT_Error - raccess_guess_darwin_ufs_export( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - char* newpath; - FT_Error error; - FT_Memory memory; - - FT_UNUSED( stream ); - - - memory = library->memory; - newpath = raccess_make_file_name( memory, base_file_name, "._" ); - if ( !newpath ) - return FT_Err_Out_Of_Memory; - - error = raccess_guess_linux_double_from_file_name( library, newpath, - result_offset ); - if ( !error ) - *result_file_name = newpath; - else - FT_FREE( newpath ); - - return error; - } - - - static FT_Error - raccess_guess_darwin_hfsplus( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - /* - Only meaningful on systems with hfs+ drivers (or Macs). - */ - FT_Error error; - char* newpath; - FT_Memory memory; - FT_Long base_file_len = ft_strlen( base_file_name ); - - FT_UNUSED( stream ); - - - memory = library->memory; - - if ( base_file_len + 6 > FT_INT_MAX ) - return FT_Err_Array_Too_Large; - - if ( FT_ALLOC( newpath, base_file_len + 6 ) ) - return error; - - FT_MEM_COPY( newpath, base_file_name, base_file_len ); - FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 ); - - *result_file_name = newpath; - *result_offset = 0; - - return FT_Err_Ok; - } - - - static FT_Error - raccess_guess_darwin_newvfs( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - /* - Only meaningful on systems with Mac OS X (> 10.1). - */ - FT_Error error; - char* newpath; - FT_Memory memory; - FT_Long base_file_len = ft_strlen( base_file_name ); - - FT_UNUSED( stream ); - - - memory = library->memory; - - if ( base_file_len + 18 > FT_INT_MAX ) - return FT_Err_Array_Too_Large; - - if ( FT_ALLOC( newpath, base_file_len + 18 ) ) - return error; - - FT_MEM_COPY( newpath, base_file_name, base_file_len ); - FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 ); - - *result_file_name = newpath; - *result_offset = 0; - - return FT_Err_Ok; - } - - - static FT_Error - raccess_guess_vfat( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - char* newpath; - FT_Memory memory; - - FT_UNUSED( stream ); - - - memory = library->memory; - - newpath = raccess_make_file_name( memory, base_file_name, - "resource.frk/" ); - if ( !newpath ) - return FT_Err_Out_Of_Memory; - - *result_file_name = newpath; - *result_offset = 0; - - return FT_Err_Ok; - } - - - static FT_Error - raccess_guess_linux_cap( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - char* newpath; - FT_Memory memory; - - FT_UNUSED( stream ); - - - memory = library->memory; - - newpath = raccess_make_file_name( memory, base_file_name, ".resource/" ); - if ( !newpath ) - return FT_Err_Out_Of_Memory; - - *result_file_name = newpath; - *result_offset = 0; - - return FT_Err_Ok; - } - - - static FT_Error - raccess_guess_linux_double( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - char* newpath; - FT_Error error; - FT_Memory memory; - - FT_UNUSED( stream ); - - - memory = library->memory; - - newpath = raccess_make_file_name( memory, base_file_name, "%" ); - if ( !newpath ) - return FT_Err_Out_Of_Memory; - - error = raccess_guess_linux_double_from_file_name( library, newpath, - result_offset ); - if ( !error ) - *result_file_name = newpath; - else - FT_FREE( newpath ); - - return error; - } - - - static FT_Error - raccess_guess_linux_netatalk( FT_Library library, - FT_Stream stream, - char *base_file_name, - char **result_file_name, - FT_Long *result_offset ) - { - char* newpath; - FT_Error error; - FT_Memory memory; - - FT_UNUSED( stream ); - - - memory = library->memory; - - newpath = raccess_make_file_name( memory, base_file_name, - ".AppleDouble/" ); - if ( !newpath ) - return FT_Err_Out_Of_Memory; - - error = raccess_guess_linux_double_from_file_name( library, newpath, - result_offset ); - if ( !error ) - *result_file_name = newpath; - else - FT_FREE( newpath ); - - return error; - } - - - static FT_Error - raccess_guess_apple_generic( FT_Library library, - FT_Stream stream, - char *base_file_name, - FT_Int32 magic, - FT_Long *result_offset ) - { - FT_Int32 magic_from_stream; - FT_Error error; - FT_Int32 version_number = 0; - FT_UShort n_of_entries; - - int i; - FT_UInt32 entry_id, entry_offset, entry_length = 0; - - const FT_UInt32 resource_fork_entry_id = 0x2; - - FT_UNUSED( library ); - FT_UNUSED( base_file_name ); - FT_UNUSED( version_number ); - FT_UNUSED( entry_length ); - - - if ( FT_READ_LONG( magic_from_stream ) ) - return error; - if ( magic_from_stream != magic ) - return FT_Err_Unknown_File_Format; - - if ( FT_READ_LONG( version_number ) ) - return error; - - /* filler */ - error = FT_Stream_Skip( stream, 16 ); - if ( error ) - return error; - - if ( FT_READ_USHORT( n_of_entries ) ) - return error; - if ( n_of_entries == 0 ) - return FT_Err_Unknown_File_Format; - - for ( i = 0; i < n_of_entries; i++ ) - { - if ( FT_READ_LONG( entry_id ) ) - return error; - if ( entry_id == resource_fork_entry_id ) - { - if ( FT_READ_LONG( entry_offset ) || - FT_READ_LONG( entry_length ) ) - continue; - *result_offset = entry_offset; - - return FT_Err_Ok; - } - else - { - error = FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */ - if ( error ) - return error; - } - } - - return FT_Err_Unknown_File_Format; - } - - - static FT_Error - raccess_guess_linux_double_from_file_name( FT_Library library, - char *file_name, - FT_Long *result_offset ) - { - FT_Open_Args args2; - FT_Stream stream2; - char * nouse = NULL; - FT_Error error; - - - args2.flags = FT_OPEN_PATHNAME; - args2.pathname = file_name; - error = FT_Stream_New( library, &args2, &stream2 ); - if ( error ) - return error; - - error = raccess_guess_apple_double( library, stream2, file_name, - &nouse, result_offset ); - - FT_Stream_Free( stream2, 0 ); - - return error; - } - - - static char* - raccess_make_file_name( FT_Memory memory, - const char *original_name, - const char *insertion ) - { - char* new_name = NULL; - const char* tmp; - const char* slash; - size_t new_length; - FT_Error error = FT_Err_Ok; - - FT_UNUSED( error ); - - - new_length = ft_strlen( original_name ) + ft_strlen( insertion ); - if ( FT_ALLOC( new_name, new_length + 1 ) ) - return NULL; - - tmp = ft_strrchr( original_name, '/' ); - if ( tmp ) - { - ft_strncpy( new_name, original_name, tmp - original_name + 1 ); - new_name[tmp - original_name + 1] = '\0'; - slash = tmp + 1; - } - else - { - slash = original_name; - new_name[0] = '\0'; - } - - ft_strcat( new_name, insertion ); - ft_strcat( new_name, slash ); - - return new_name; - } - - -#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ - - - /*************************************************************************/ - /* Dummy function; just sets errors */ - /*************************************************************************/ - - FT_BASE_DEF( void ) - FT_Raccess_Guess( FT_Library library, - FT_Stream stream, - char *base_name, - char **new_names, - FT_Long *offsets, - FT_Error *errors ) - { - int i; - - FT_UNUSED( library ); - FT_UNUSED( stream ); - FT_UNUSED( base_name ); - - - for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) - { - new_names[i] = NULL; - offsets[i] = 0; - errors[i] = FT_Err_Unimplemented_Feature; - } - } - - -#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftsnames.c b/android/jni/ndk_modules/freetype/src/base/ftsnames.c deleted file mode 100644 index 3447888c..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftsnames.c +++ /dev/null @@ -1,94 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsnames.c */ -/* */ -/* Simple interface to access SFNT name tables (which are used */ -/* to hold font names, copyright info, notices, etc.) (body). */ -/* */ -/* This is _not_ used to retrieve glyph names! */ -/* */ -/* Copyright 1996-2001, 2002, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_SFNT_NAMES_H -#include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_INTERNAL_STREAM_H - - -#ifdef TT_CONFIG_OPTION_SFNT_NAMES - - - /* documentation is in ftsnames.h */ - - FT_EXPORT_DEF( FT_UInt ) - FT_Get_Sfnt_Name_Count( FT_Face face ) - { - return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0; - } - - - /* documentation is in ftsnames.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Sfnt_Name( FT_Face face, - FT_UInt idx, - FT_SfntName *aname ) - { - FT_Error error = FT_Err_Invalid_Argument; - - - if ( aname && face && FT_IS_SFNT( face ) ) - { - TT_Face ttface = (TT_Face)face; - - - if ( idx < (FT_UInt)ttface->num_names ) - { - TT_NameEntryRec* entry = ttface->name_table.names + idx; - - - /* load name on demand */ - if ( entry->stringLength > 0 && entry->string == NULL ) - { - FT_Memory memory = face->memory; - FT_Stream stream = face->stream; - - - if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || - FT_STREAM_SEEK( entry->stringOffset ) || - FT_STREAM_READ( entry->string, entry->stringLength ) ) - { - FT_FREE( entry->string ); - entry->stringLength = 0; - } - } - - aname->platform_id = entry->platformID; - aname->encoding_id = entry->encodingID; - aname->language_id = entry->languageID; - aname->name_id = entry->nameID; - aname->string = (FT_Byte*)entry->string; - aname->string_len = entry->stringLength; - - error = FT_Err_Ok; - } - } - - return error; - } - - -#endif /* TT_CONFIG_OPTION_SFNT_NAMES */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftstream.c b/android/jni/ndk_modules/freetype/src/base/ftstream.c deleted file mode 100644 index 210aaa48..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftstream.c +++ /dev/null @@ -1,864 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftstream.c */ -/* */ -/* I/O stream support (body). */ -/* */ -/* Copyright 2000-2001, 2002, 2004, 2005, 2006, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_stream - - - FT_BASE_DEF( void ) - FT_Stream_OpenMemory( FT_Stream stream, - const FT_Byte* base, - FT_ULong size ) - { - stream->base = (FT_Byte*) base; - stream->size = size; - stream->pos = 0; - stream->cursor = 0; - stream->read = 0; - stream->close = 0; - } - - - FT_BASE_DEF( void ) - FT_Stream_Close( FT_Stream stream ) - { - if ( stream && stream->close ) - stream->close( stream ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_Seek( FT_Stream stream, - FT_ULong pos ) - { - FT_Error error = FT_Err_Ok; - - - if ( stream->read ) - { - if ( stream->read( stream, pos, 0, 0 ) ) - { - FT_ERROR(( "FT_Stream_Seek:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - pos, stream->size )); - - error = FT_Err_Invalid_Stream_Operation; - } - } - /* note that seeking to the first position after the file is valid */ - else if ( pos > stream->size ) - { - FT_ERROR(( "FT_Stream_Seek:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - pos, stream->size )); - - error = FT_Err_Invalid_Stream_Operation; - } - - if ( !error ) - stream->pos = pos; - - return error; - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_Skip( FT_Stream stream, - FT_Long distance ) - { - if ( distance < 0 ) - return FT_Err_Invalid_Stream_Operation; - - return FT_Stream_Seek( stream, (FT_ULong)( stream->pos + distance ) ); - } - - - FT_BASE_DEF( FT_Long ) - FT_Stream_Pos( FT_Stream stream ) - { - return stream->pos; - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_Read( FT_Stream stream, - FT_Byte* buffer, - FT_ULong count ) - { - return FT_Stream_ReadAt( stream, stream->pos, buffer, count ); - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_ReadAt( FT_Stream stream, - FT_ULong pos, - FT_Byte* buffer, - FT_ULong count ) - { - FT_Error error = FT_Err_Ok; - FT_ULong read_bytes; - - - if ( pos >= stream->size ) - { - FT_ERROR(( "FT_Stream_ReadAt:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - pos, stream->size )); - - return FT_Err_Invalid_Stream_Operation; - } - - if ( stream->read ) - read_bytes = stream->read( stream, pos, buffer, count ); - else - { - read_bytes = stream->size - pos; - if ( read_bytes > count ) - read_bytes = count; - - FT_MEM_COPY( buffer, stream->base + pos, read_bytes ); - } - - stream->pos = pos + read_bytes; - - if ( read_bytes < count ) - { - FT_ERROR(( "FT_Stream_ReadAt:" - " invalid read; expected %lu bytes, got %lu\n", - count, read_bytes )); - - error = FT_Err_Invalid_Stream_Operation; - } - - return error; - } - - - FT_BASE_DEF( FT_ULong ) - FT_Stream_TryRead( FT_Stream stream, - FT_Byte* buffer, - FT_ULong count ) - { - FT_ULong read_bytes = 0; - - - if ( stream->pos >= stream->size ) - goto Exit; - - if ( stream->read ) - read_bytes = stream->read( stream, stream->pos, buffer, count ); - else - { - read_bytes = stream->size - stream->pos; - if ( read_bytes > count ) - read_bytes = count; - - FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes ); - } - - stream->pos += read_bytes; - - Exit: - return read_bytes; - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_ExtractFrame( FT_Stream stream, - FT_ULong count, - FT_Byte** pbytes ) - { - FT_Error error; - - - error = FT_Stream_EnterFrame( stream, count ); - if ( !error ) - { - *pbytes = (FT_Byte*)stream->cursor; - - /* equivalent to FT_Stream_ExitFrame(), with no memory block release */ - stream->cursor = 0; - stream->limit = 0; - } - - return error; - } - - - FT_BASE_DEF( void ) - FT_Stream_ReleaseFrame( FT_Stream stream, - FT_Byte** pbytes ) - { - if ( stream && stream->read ) - { - FT_Memory memory = stream->memory; - -#ifdef FT_DEBUG_MEMORY - ft_mem_free( memory, *pbytes ); - *pbytes = NULL; -#else - FT_FREE( *pbytes ); -#endif - } - *pbytes = 0; - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_EnterFrame( FT_Stream stream, - FT_ULong count ) - { - FT_Error error = FT_Err_Ok; - FT_ULong read_bytes; - - - /* check for nested frame access */ - FT_ASSERT( stream && stream->cursor == 0 ); - - if ( stream->read ) - { - /* allocate the frame in memory */ - FT_Memory memory = stream->memory; - - - /* simple sanity check */ - if ( count > stream->size ) - { - FT_ERROR(( "FT_Stream_EnterFrame:" - " frame size (%lu) larger than stream size (%lu)\n", - count, stream->size )); - - error = FT_Err_Invalid_Stream_Operation; - goto Exit; - } - -#ifdef FT_DEBUG_MEMORY - /* assume _ft_debug_file and _ft_debug_lineno are already set */ - stream->base = (unsigned char*)ft_mem_qalloc( memory, count, &error ); - if ( error ) - goto Exit; -#else - if ( FT_QALLOC( stream->base, count ) ) - goto Exit; -#endif - /* read it */ - read_bytes = stream->read( stream, stream->pos, - stream->base, count ); - if ( read_bytes < count ) - { - FT_ERROR(( "FT_Stream_EnterFrame:" - " invalid read; expected %lu bytes, got %lu\n", - count, read_bytes )); - - FT_FREE( stream->base ); - error = FT_Err_Invalid_Stream_Operation; - } - stream->cursor = stream->base; - stream->limit = stream->cursor + count; - stream->pos += read_bytes; - } - else - { - /* check current and new position */ - if ( stream->pos >= stream->size || - stream->size - stream->pos < count ) - { - FT_ERROR(( "FT_Stream_EnterFrame:" - " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n", - stream->pos, count, stream->size )); - - error = FT_Err_Invalid_Stream_Operation; - goto Exit; - } - - /* set cursor */ - stream->cursor = stream->base + stream->pos; - stream->limit = stream->cursor + count; - stream->pos += count; - } - - Exit: - return error; - } - - - FT_BASE_DEF( void ) - FT_Stream_ExitFrame( FT_Stream stream ) - { - /* IMPORTANT: The assertion stream->cursor != 0 was removed, given */ - /* that it is possible to access a frame of length 0 in */ - /* some weird fonts (usually, when accessing an array of */ - /* 0 records, like in some strange kern tables). */ - /* */ - /* In this case, the loader code handles the 0-length table */ - /* gracefully; however, stream.cursor is really set to 0 by the */ - /* FT_Stream_EnterFrame() call, and this is not an error. */ - /* */ - FT_ASSERT( stream ); - - if ( stream->read ) - { - FT_Memory memory = stream->memory; - -#ifdef FT_DEBUG_MEMORY - ft_mem_free( memory, stream->base ); - stream->base = NULL; -#else - FT_FREE( stream->base ); -#endif - } - stream->cursor = 0; - stream->limit = 0; - } - - - FT_BASE_DEF( FT_Char ) - FT_Stream_GetChar( FT_Stream stream ) - { - FT_Char result; - - - FT_ASSERT( stream && stream->cursor ); - - result = 0; - if ( stream->cursor < stream->limit ) - result = *stream->cursor++; - - return result; - } - - - FT_BASE_DEF( FT_Short ) - FT_Stream_GetShort( FT_Stream stream ) - { - FT_Byte* p; - FT_Short result; - - - FT_ASSERT( stream && stream->cursor ); - - result = 0; - p = stream->cursor; - if ( p + 1 < stream->limit ) - result = FT_NEXT_SHORT( p ); - stream->cursor = p; - - return result; - } - - - FT_BASE_DEF( FT_Short ) - FT_Stream_GetShortLE( FT_Stream stream ) - { - FT_Byte* p; - FT_Short result; - - - FT_ASSERT( stream && stream->cursor ); - - result = 0; - p = stream->cursor; - if ( p + 1 < stream->limit ) - result = FT_NEXT_SHORT_LE( p ); - stream->cursor = p; - - return result; - } - - - FT_BASE_DEF( FT_Long ) - FT_Stream_GetOffset( FT_Stream stream ) - { - FT_Byte* p; - FT_Long result; - - - FT_ASSERT( stream && stream->cursor ); - - result = 0; - p = stream->cursor; - if ( p + 2 < stream->limit ) - result = FT_NEXT_OFF3( p ); - stream->cursor = p; - return result; - } - - - FT_BASE_DEF( FT_Long ) - FT_Stream_GetLong( FT_Stream stream ) - { - FT_Byte* p; - FT_Long result; - - - FT_ASSERT( stream && stream->cursor ); - - result = 0; - p = stream->cursor; - if ( p + 3 < stream->limit ) - result = FT_NEXT_LONG( p ); - stream->cursor = p; - return result; - } - - - FT_BASE_DEF( FT_Long ) - FT_Stream_GetLongLE( FT_Stream stream ) - { - FT_Byte* p; - FT_Long result; - - - FT_ASSERT( stream && stream->cursor ); - - result = 0; - p = stream->cursor; - if ( p + 3 < stream->limit ) - result = FT_NEXT_LONG_LE( p ); - stream->cursor = p; - return result; - } - - - FT_BASE_DEF( FT_Char ) - FT_Stream_ReadChar( FT_Stream stream, - FT_Error* error ) - { - FT_Byte result = 0; - - - FT_ASSERT( stream ); - - *error = FT_Err_Ok; - - if ( stream->read ) - { - if ( stream->read( stream, stream->pos, &result, 1L ) != 1L ) - goto Fail; - } - else - { - if ( stream->pos < stream->size ) - result = stream->base[stream->pos]; - else - goto Fail; - } - stream->pos++; - - return result; - - Fail: - *error = FT_Err_Invalid_Stream_Operation; - FT_ERROR(( "FT_Stream_ReadChar:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - stream->pos, stream->size )); - - return 0; - } - - - FT_BASE_DEF( FT_Short ) - FT_Stream_ReadShort( FT_Stream stream, - FT_Error* error ) - { - FT_Byte reads[2]; - FT_Byte* p = 0; - FT_Short result = 0; - - - FT_ASSERT( stream ); - - *error = FT_Err_Ok; - - if ( stream->pos + 1 < stream->size ) - { - if ( stream->read ) - { - if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) - goto Fail; - - p = reads; - } - else - { - p = stream->base + stream->pos; - } - - if ( p ) - result = FT_NEXT_SHORT( p ); - } - else - goto Fail; - - stream->pos += 2; - - return result; - - Fail: - *error = FT_Err_Invalid_Stream_Operation; - FT_ERROR(( "FT_Stream_ReadShort:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - stream->pos, stream->size )); - - return 0; - } - - - FT_BASE_DEF( FT_Short ) - FT_Stream_ReadShortLE( FT_Stream stream, - FT_Error* error ) - { - FT_Byte reads[2]; - FT_Byte* p = 0; - FT_Short result = 0; - - - FT_ASSERT( stream ); - - *error = FT_Err_Ok; - - if ( stream->pos + 1 < stream->size ) - { - if ( stream->read ) - { - if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) - goto Fail; - - p = reads; - } - else - { - p = stream->base + stream->pos; - } - - if ( p ) - result = FT_NEXT_SHORT_LE( p ); - } - else - goto Fail; - - stream->pos += 2; - - return result; - - Fail: - *error = FT_Err_Invalid_Stream_Operation; - FT_ERROR(( "FT_Stream_ReadShortLE:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - stream->pos, stream->size )); - - return 0; - } - - - FT_BASE_DEF( FT_Long ) - FT_Stream_ReadOffset( FT_Stream stream, - FT_Error* error ) - { - FT_Byte reads[3]; - FT_Byte* p = 0; - FT_Long result = 0; - - - FT_ASSERT( stream ); - - *error = FT_Err_Ok; - - if ( stream->pos + 2 < stream->size ) - { - if ( stream->read ) - { - if (stream->read( stream, stream->pos, reads, 3L ) != 3L ) - goto Fail; - - p = reads; - } - else - { - p = stream->base + stream->pos; - } - - if ( p ) - result = FT_NEXT_OFF3( p ); - } - else - goto Fail; - - stream->pos += 3; - - return result; - - Fail: - *error = FT_Err_Invalid_Stream_Operation; - FT_ERROR(( "FT_Stream_ReadOffset:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - stream->pos, stream->size )); - - return 0; - } - - - FT_BASE_DEF( FT_Long ) - FT_Stream_ReadLong( FT_Stream stream, - FT_Error* error ) - { - FT_Byte reads[4]; - FT_Byte* p = 0; - FT_Long result = 0; - - - FT_ASSERT( stream ); - - *error = FT_Err_Ok; - - if ( stream->pos + 3 < stream->size ) - { - if ( stream->read ) - { - if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) - goto Fail; - - p = reads; - } - else - { - p = stream->base + stream->pos; - } - - if ( p ) - result = FT_NEXT_LONG( p ); - } - else - goto Fail; - - stream->pos += 4; - - return result; - - Fail: - *error = FT_Err_Invalid_Stream_Operation; - FT_ERROR(( "FT_Stream_ReadLong:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - stream->pos, stream->size )); - - return 0; - } - - - FT_BASE_DEF( FT_Long ) - FT_Stream_ReadLongLE( FT_Stream stream, - FT_Error* error ) - { - FT_Byte reads[4]; - FT_Byte* p = 0; - FT_Long result = 0; - - - FT_ASSERT( stream ); - - *error = FT_Err_Ok; - - if ( stream->pos + 3 < stream->size ) - { - if ( stream->read ) - { - if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) - goto Fail; - - p = reads; - } - else - { - p = stream->base + stream->pos; - } - - if ( p ) - result = FT_NEXT_LONG_LE( p ); - } - else - goto Fail; - - stream->pos += 4; - - return result; - - Fail: - *error = FT_Err_Invalid_Stream_Operation; - FT_ERROR(( "FT_Stream_ReadLongLE:" - " invalid i/o; pos = 0x%lx, size = 0x%lx\n", - stream->pos, stream->size )); - - return 0; - } - - - FT_BASE_DEF( FT_Error ) - FT_Stream_ReadFields( FT_Stream stream, - const FT_Frame_Field* fields, - void* structure ) - { - FT_Error error; - FT_Bool frame_accessed = 0; - FT_Byte* cursor; - - if ( !fields || !stream ) - return FT_Err_Invalid_Argument; - - cursor = stream->cursor; - - error = FT_Err_Ok; - do - { - FT_ULong value; - FT_Int sign_shift; - FT_Byte* p; - - - switch ( fields->value ) - { - case ft_frame_start: /* access a new frame */ - error = FT_Stream_EnterFrame( stream, fields->offset ); - if ( error ) - goto Exit; - - frame_accessed = 1; - cursor = stream->cursor; - fields++; - continue; /* loop! */ - - case ft_frame_bytes: /* read a byte sequence */ - case ft_frame_skip: /* skip some bytes */ - { - FT_UInt len = fields->size; - - - if ( cursor + len > stream->limit ) - { - error = FT_Err_Invalid_Stream_Operation; - goto Exit; - } - - if ( fields->value == ft_frame_bytes ) - { - p = (FT_Byte*)structure + fields->offset; - FT_MEM_COPY( p, cursor, len ); - } - cursor += len; - fields++; - continue; - } - - case ft_frame_byte: - case ft_frame_schar: /* read a single byte */ - value = FT_NEXT_BYTE(cursor); - sign_shift = 24; - break; - - case ft_frame_short_be: - case ft_frame_ushort_be: /* read a 2-byte big-endian short */ - value = FT_NEXT_USHORT(cursor); - sign_shift = 16; - break; - - case ft_frame_short_le: - case ft_frame_ushort_le: /* read a 2-byte little-endian short */ - value = FT_NEXT_USHORT_LE(cursor); - sign_shift = 16; - break; - - case ft_frame_long_be: - case ft_frame_ulong_be: /* read a 4-byte big-endian long */ - value = FT_NEXT_ULONG(cursor); - sign_shift = 0; - break; - - case ft_frame_long_le: - case ft_frame_ulong_le: /* read a 4-byte little-endian long */ - value = FT_NEXT_ULONG_LE(cursor); - sign_shift = 0; - break; - - case ft_frame_off3_be: - case ft_frame_uoff3_be: /* read a 3-byte big-endian long */ - value = FT_NEXT_UOFF3(cursor); - sign_shift = 8; - break; - - case ft_frame_off3_le: - case ft_frame_uoff3_le: /* read a 3-byte little-endian long */ - value = FT_NEXT_UOFF3_LE(cursor); - sign_shift = 8; - break; - - default: - /* otherwise, exit the loop */ - stream->cursor = cursor; - goto Exit; - } - - /* now, compute the signed value is necessary */ - if ( fields->value & FT_FRAME_OP_SIGNED ) - value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift ); - - /* finally, store the value in the object */ - - p = (FT_Byte*)structure + fields->offset; - switch ( fields->size ) - { - case (8 / FT_CHAR_BIT): - *(FT_Byte*)p = (FT_Byte)value; - break; - - case (16 / FT_CHAR_BIT): - *(FT_UShort*)p = (FT_UShort)value; - break; - - case (32 / FT_CHAR_BIT): - *(FT_UInt32*)p = (FT_UInt32)value; - break; - - default: /* for 64-bit systems */ - *(FT_ULong*)p = (FT_ULong)value; - } - - /* go to next field */ - fields++; - } - while ( 1 ); - - Exit: - /* close the frame if it was opened by this read */ - if ( frame_accessed ) - FT_Stream_ExitFrame( stream ); - - return error; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftstroke.c b/android/jni/ndk_modules/freetype/src/base/ftstroke.c deleted file mode 100644 index 75bcbded..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftstroke.c +++ /dev/null @@ -1,2039 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftstroke.c */ -/* */ -/* FreeType path stroker (body). */ -/* */ -/* Copyright 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_STROKER_H -#include FT_TRIGONOMETRY_H -#include FT_OUTLINE_H -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_StrokerBorder ) - FT_Outline_GetInsideBorder( FT_Outline* outline ) - { - FT_Orientation o = FT_Outline_Get_Orientation( outline ); - - - return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT - : FT_STROKER_BORDER_LEFT ; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_StrokerBorder ) - FT_Outline_GetOutsideBorder( FT_Outline* outline ) - { - FT_Orientation o = FT_Outline_Get_Orientation( outline ); - - - return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT - : FT_STROKER_BORDER_RIGHT ; - } - - - /***************************************************************************/ - /***************************************************************************/ - /***** *****/ - /***** BEZIER COMPUTATIONS *****/ - /***** *****/ - /***************************************************************************/ - /***************************************************************************/ - -#define FT_SMALL_CONIC_THRESHOLD ( FT_ANGLE_PI / 6 ) -#define FT_SMALL_CUBIC_THRESHOLD ( FT_ANGLE_PI / 6 ) -#define FT_EPSILON 2 - -#define FT_IS_SMALL( x ) ( (x) > -FT_EPSILON && (x) < FT_EPSILON ) - - - static FT_Pos - ft_pos_abs( FT_Pos x ) - { - return x >= 0 ? x : -x ; - } - - - static void - ft_conic_split( FT_Vector* base ) - { - FT_Pos a, b; - - - base[4].x = base[2].x; - b = base[1].x; - a = base[3].x = ( base[2].x + b ) / 2; - b = base[1].x = ( base[0].x + b ) / 2; - base[2].x = ( a + b ) / 2; - - base[4].y = base[2].y; - b = base[1].y; - a = base[3].y = ( base[2].y + b ) / 2; - b = base[1].y = ( base[0].y + b ) / 2; - base[2].y = ( a + b ) / 2; - } - - - static FT_Bool - ft_conic_is_small_enough( FT_Vector* base, - FT_Angle *angle_in, - FT_Angle *angle_out ) - { - FT_Vector d1, d2; - FT_Angle theta; - FT_Int close1, close2; - - - d1.x = base[1].x - base[2].x; - d1.y = base[1].y - base[2].y; - d2.x = base[0].x - base[1].x; - d2.y = base[0].y - base[1].y; - - close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); - close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); - - if ( close1 ) - { - if ( close2 ) - *angle_in = *angle_out = 0; - else - *angle_in = *angle_out = FT_Atan2( d2.x, d2.y ); - } - else if ( close2 ) - { - *angle_in = *angle_out = FT_Atan2( d1.x, d1.y ); - } - else - { - *angle_in = FT_Atan2( d1.x, d1.y ); - *angle_out = FT_Atan2( d2.x, d2.y ); - } - - theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) ); - - return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD ); - } - - - static void - ft_cubic_split( FT_Vector* base ) - { - FT_Pos a, b, c, d; - - - base[6].x = base[3].x; - c = base[1].x; - d = base[2].x; - base[1].x = a = ( base[0].x + c ) / 2; - base[5].x = b = ( base[3].x + d ) / 2; - c = ( c + d ) / 2; - base[2].x = a = ( a + c ) / 2; - base[4].x = b = ( b + c ) / 2; - base[3].x = ( a + b ) / 2; - - base[6].y = base[3].y; - c = base[1].y; - d = base[2].y; - base[1].y = a = ( base[0].y + c ) / 2; - base[5].y = b = ( base[3].y + d ) / 2; - c = ( c + d ) / 2; - base[2].y = a = ( a + c ) / 2; - base[4].y = b = ( b + c ) / 2; - base[3].y = ( a + b ) / 2; - } - - - static FT_Bool - ft_cubic_is_small_enough( FT_Vector* base, - FT_Angle *angle_in, - FT_Angle *angle_mid, - FT_Angle *angle_out ) - { - FT_Vector d1, d2, d3; - FT_Angle theta1, theta2; - FT_Int close1, close2, close3; - - - d1.x = base[2].x - base[3].x; - d1.y = base[2].y - base[3].y; - d2.x = base[1].x - base[2].x; - d2.y = base[1].y - base[2].y; - d3.x = base[0].x - base[1].x; - d3.y = base[0].y - base[1].y; - - close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); - close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); - close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y ); - - if ( close1 || close3 ) - { - if ( close2 ) - { - /* basically a point */ - *angle_in = *angle_out = *angle_mid = 0; - } - else if ( close1 ) - { - *angle_in = *angle_mid = FT_Atan2( d2.x, d2.y ); - *angle_out = FT_Atan2( d3.x, d3.y ); - } - else /* close2 */ - { - *angle_in = FT_Atan2( d1.x, d1.y ); - *angle_mid = *angle_out = FT_Atan2( d2.x, d2.y ); - } - } - else if ( close2 ) - { - *angle_in = *angle_mid = FT_Atan2( d1.x, d1.y ); - *angle_out = FT_Atan2( d3.x, d3.y ); - } - else - { - *angle_in = FT_Atan2( d1.x, d1.y ); - *angle_mid = FT_Atan2( d2.x, d2.y ); - *angle_out = FT_Atan2( d3.x, d3.y ); - } - - theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_mid ) ); - theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) ); - - return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD && - theta2 < FT_SMALL_CUBIC_THRESHOLD ); - } - - - /***************************************************************************/ - /***************************************************************************/ - /***** *****/ - /***** STROKE BORDERS *****/ - /***** *****/ - /***************************************************************************/ - /***************************************************************************/ - - typedef enum FT_StrokeTags_ - { - FT_STROKE_TAG_ON = 1, /* on-curve point */ - FT_STROKE_TAG_CUBIC = 2, /* cubic off-point */ - FT_STROKE_TAG_BEGIN = 4, /* sub-path start */ - FT_STROKE_TAG_END = 8 /* sub-path end */ - - } FT_StrokeTags; - -#define FT_STROKE_TAG_BEGIN_END (FT_STROKE_TAG_BEGIN|FT_STROKE_TAG_END) - - typedef struct FT_StrokeBorderRec_ - { - FT_UInt num_points; - FT_UInt max_points; - FT_Vector* points; - FT_Byte* tags; - FT_Bool movable; - FT_Int start; /* index of current sub-path start point */ - FT_Memory memory; - FT_Bool valid; - - } FT_StrokeBorderRec, *FT_StrokeBorder; - - - static FT_Error - ft_stroke_border_grow( FT_StrokeBorder border, - FT_UInt new_points ) - { - FT_UInt old_max = border->max_points; - FT_UInt new_max = border->num_points + new_points; - FT_Error error = FT_Err_Ok; - - - if ( new_max > old_max ) - { - FT_UInt cur_max = old_max; - FT_Memory memory = border->memory; - - - while ( cur_max < new_max ) - cur_max += ( cur_max >> 1 ) + 16; - - if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) || - FT_RENEW_ARRAY( border->tags, old_max, cur_max ) ) - goto Exit; - - border->max_points = cur_max; - } - - Exit: - return error; - } - - - static void - ft_stroke_border_close( FT_StrokeBorder border, - FT_Bool reverse ) - { - FT_UInt start = border->start; - FT_UInt count = border->num_points; - - - FT_ASSERT( border->start >= 0 ); - - /* don't record empty paths! */ - if ( count <= start + 1U ) - border->num_points = start; - else - { - /* copy the last point to the start of this sub-path, since */ - /* it contains the `adjusted' starting coordinates */ - border->num_points = --count; - border->points[start] = border->points[count]; - - if ( reverse ) - { - /* reverse the points */ - { - FT_Vector* vec1 = border->points + start + 1; - FT_Vector* vec2 = border->points + count - 1; - - - for ( ; vec1 < vec2; vec1++, vec2-- ) - { - FT_Vector tmp; - - - tmp = *vec1; - *vec1 = *vec2; - *vec2 = tmp; - } - } - - /* then the tags */ - { - FT_Byte* tag1 = border->tags + start + 1; - FT_Byte* tag2 = border->tags + count - 1; - - - for ( ; tag1 < tag2; tag1++, tag2-- ) - { - FT_Byte tmp; - - - tmp = *tag1; - *tag1 = *tag2; - *tag2 = tmp; - } - } - } - - border->tags[start ] |= FT_STROKE_TAG_BEGIN; - border->tags[count - 1] |= FT_STROKE_TAG_END; - } - - border->start = -1; - border->movable = FALSE; - } - - - static FT_Error - ft_stroke_border_lineto( FT_StrokeBorder border, - FT_Vector* to, - FT_Bool movable ) - { - FT_Error error = FT_Err_Ok; - - - FT_ASSERT( border->start >= 0 ); - - if ( border->movable ) - { - /* move last point */ - border->points[border->num_points - 1] = *to; - } - else - { - /* add one point */ - error = ft_stroke_border_grow( border, 1 ); - if ( !error ) - { - FT_Vector* vec = border->points + border->num_points; - FT_Byte* tag = border->tags + border->num_points; - - - vec[0] = *to; - tag[0] = FT_STROKE_TAG_ON; - - border->num_points += 1; - } - } - border->movable = movable; - return error; - } - - - static FT_Error - ft_stroke_border_conicto( FT_StrokeBorder border, - FT_Vector* control, - FT_Vector* to ) - { - FT_Error error; - - - FT_ASSERT( border->start >= 0 ); - - error = ft_stroke_border_grow( border, 2 ); - if ( !error ) - { - FT_Vector* vec = border->points + border->num_points; - FT_Byte* tag = border->tags + border->num_points; - - vec[0] = *control; - vec[1] = *to; - - tag[0] = 0; - tag[1] = FT_STROKE_TAG_ON; - - border->num_points += 2; - } - border->movable = FALSE; - return error; - } - - - static FT_Error - ft_stroke_border_cubicto( FT_StrokeBorder border, - FT_Vector* control1, - FT_Vector* control2, - FT_Vector* to ) - { - FT_Error error; - - - FT_ASSERT( border->start >= 0 ); - - error = ft_stroke_border_grow( border, 3 ); - if ( !error ) - { - FT_Vector* vec = border->points + border->num_points; - FT_Byte* tag = border->tags + border->num_points; - - - vec[0] = *control1; - vec[1] = *control2; - vec[2] = *to; - - tag[0] = FT_STROKE_TAG_CUBIC; - tag[1] = FT_STROKE_TAG_CUBIC; - tag[2] = FT_STROKE_TAG_ON; - - border->num_points += 3; - } - border->movable = FALSE; - return error; - } - - -#define FT_ARC_CUBIC_ANGLE ( FT_ANGLE_PI / 2 ) - - - static FT_Error - ft_stroke_border_arcto( FT_StrokeBorder border, - FT_Vector* center, - FT_Fixed radius, - FT_Angle angle_start, - FT_Angle angle_diff ) - { - FT_Angle total, angle, step, rotate, next, theta; - FT_Vector a, b, a2, b2; - FT_Fixed length; - FT_Error error = FT_Err_Ok; - - - /* compute start point */ - FT_Vector_From_Polar( &a, radius, angle_start ); - a.x += center->x; - a.y += center->y; - - total = angle_diff; - angle = angle_start; - rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2; - - while ( total != 0 ) - { - step = total; - if ( step > FT_ARC_CUBIC_ANGLE ) - step = FT_ARC_CUBIC_ANGLE; - - else if ( step < -FT_ARC_CUBIC_ANGLE ) - step = -FT_ARC_CUBIC_ANGLE; - - next = angle + step; - theta = step; - if ( theta < 0 ) - theta = -theta; - - theta >>= 1; - - /* compute end point */ - FT_Vector_From_Polar( &b, radius, next ); - b.x += center->x; - b.y += center->y; - - /* compute first and second control points */ - length = FT_MulDiv( radius, FT_Sin( theta ) * 4, - ( 0x10000L + FT_Cos( theta ) ) * 3 ); - - FT_Vector_From_Polar( &a2, length, angle + rotate ); - a2.x += a.x; - a2.y += a.y; - - FT_Vector_From_Polar( &b2, length, next - rotate ); - b2.x += b.x; - b2.y += b.y; - - /* add cubic arc */ - error = ft_stroke_border_cubicto( border, &a2, &b2, &b ); - if ( error ) - break; - - /* process the rest of the arc ?? */ - a = b; - total -= step; - angle = next; - } - - return error; - } - - - static FT_Error - ft_stroke_border_moveto( FT_StrokeBorder border, - FT_Vector* to ) - { - /* close current open path if any ? */ - if ( border->start >= 0 ) - ft_stroke_border_close( border, FALSE ); - - border->start = border->num_points; - border->movable = FALSE; - - return ft_stroke_border_lineto( border, to, FALSE ); - } - - - static void - ft_stroke_border_init( FT_StrokeBorder border, - FT_Memory memory ) - { - border->memory = memory; - border->points = NULL; - border->tags = NULL; - - border->num_points = 0; - border->max_points = 0; - border->start = -1; - border->valid = FALSE; - } - - - static void - ft_stroke_border_reset( FT_StrokeBorder border ) - { - border->num_points = 0; - border->start = -1; - border->valid = FALSE; - } - - - static void - ft_stroke_border_done( FT_StrokeBorder border ) - { - FT_Memory memory = border->memory; - - - FT_FREE( border->points ); - FT_FREE( border->tags ); - - border->num_points = 0; - border->max_points = 0; - border->start = -1; - border->valid = FALSE; - } - - - static FT_Error - ft_stroke_border_get_counts( FT_StrokeBorder border, - FT_UInt *anum_points, - FT_UInt *anum_contours ) - { - FT_Error error = FT_Err_Ok; - FT_UInt num_points = 0; - FT_UInt num_contours = 0; - - FT_UInt count = border->num_points; - FT_Vector* point = border->points; - FT_Byte* tags = border->tags; - FT_Int in_contour = 0; - - - for ( ; count > 0; count--, num_points++, point++, tags++ ) - { - if ( tags[0] & FT_STROKE_TAG_BEGIN ) - { - if ( in_contour != 0 ) - goto Fail; - - in_contour = 1; - } - else if ( in_contour == 0 ) - goto Fail; - - if ( tags[0] & FT_STROKE_TAG_END ) - { - in_contour = 0; - num_contours++; - } - } - - if ( in_contour != 0 ) - goto Fail; - - border->valid = TRUE; - - Exit: - *anum_points = num_points; - *anum_contours = num_contours; - return error; - - Fail: - num_points = 0; - num_contours = 0; - goto Exit; - } - - - static void - ft_stroke_border_export( FT_StrokeBorder border, - FT_Outline* outline ) - { - /* copy point locations */ - FT_ARRAY_COPY( outline->points + outline->n_points, - border->points, - border->num_points ); - - /* copy tags */ - { - FT_UInt count = border->num_points; - FT_Byte* read = border->tags; - FT_Byte* write = (FT_Byte*)outline->tags + outline->n_points; - - - for ( ; count > 0; count--, read++, write++ ) - { - if ( *read & FT_STROKE_TAG_ON ) - *write = FT_CURVE_TAG_ON; - else if ( *read & FT_STROKE_TAG_CUBIC ) - *write = FT_CURVE_TAG_CUBIC; - else - *write = FT_CURVE_TAG_CONIC; - } - } - - /* copy contours */ - { - FT_UInt count = border->num_points; - FT_Byte* tags = border->tags; - FT_Short* write = outline->contours + outline->n_contours; - FT_Short idx = (FT_Short)outline->n_points; - - - for ( ; count > 0; count--, tags++, idx++ ) - { - if ( *tags & FT_STROKE_TAG_END ) - { - *write++ = idx; - outline->n_contours++; - } - } - } - - outline->n_points = (short)( outline->n_points + border->num_points ); - - FT_ASSERT( FT_Outline_Check( outline ) == 0 ); - } - - - /***************************************************************************/ - /***************************************************************************/ - /***** *****/ - /***** STROKER *****/ - /***** *****/ - /***************************************************************************/ - /***************************************************************************/ - -#define FT_SIDE_TO_ROTATE( s ) ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI ) - - typedef struct FT_StrokerRec_ - { - FT_Angle angle_in; - FT_Angle angle_out; - FT_Vector center; - FT_Bool first_point; - FT_Bool subpath_open; - FT_Angle subpath_angle; - FT_Vector subpath_start; - - FT_Stroker_LineCap line_cap; - FT_Stroker_LineJoin line_join; - FT_Fixed miter_limit; - FT_Fixed radius; - - FT_Bool valid; - FT_StrokeBorderRec borders[2]; - FT_Library library; - - } FT_StrokerRec; - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_New( FT_Library library, - FT_Stroker *astroker ) - { - FT_Error error; - FT_Memory memory; - FT_Stroker stroker; - - - if ( !library ) - return FT_Err_Invalid_Argument; - - memory = library->memory; - - if ( !FT_NEW( stroker ) ) - { - stroker->library = library; - - ft_stroke_border_init( &stroker->borders[0], memory ); - ft_stroke_border_init( &stroker->borders[1], memory ); - } - *astroker = stroker; - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( void ) - FT_Stroker_Set( FT_Stroker stroker, - FT_Fixed radius, - FT_Stroker_LineCap line_cap, - FT_Stroker_LineJoin line_join, - FT_Fixed miter_limit ) - { - stroker->radius = radius; - stroker->line_cap = line_cap; - stroker->line_join = line_join; - stroker->miter_limit = miter_limit; - - FT_Stroker_Rewind( stroker ); - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( void ) - FT_Stroker_Rewind( FT_Stroker stroker ) - { - if ( stroker ) - { - ft_stroke_border_reset( &stroker->borders[0] ); - ft_stroke_border_reset( &stroker->borders[1] ); - } - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( void ) - FT_Stroker_Done( FT_Stroker stroker ) - { - if ( stroker ) - { - FT_Memory memory = stroker->library->memory; - - - ft_stroke_border_done( &stroker->borders[0] ); - ft_stroke_border_done( &stroker->borders[1] ); - - stroker->library = NULL; - FT_FREE( stroker ); - } - } - - - /* creates a circular arc at a corner or cap */ - static FT_Error - ft_stroker_arcto( FT_Stroker stroker, - FT_Int side ) - { - FT_Angle total, rotate; - FT_Fixed radius = stroker->radius; - FT_Error error = FT_Err_Ok; - FT_StrokeBorder border = stroker->borders + side; - - - rotate = FT_SIDE_TO_ROTATE( side ); - - total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); - if ( total == FT_ANGLE_PI ) - total = -rotate * 2; - - error = ft_stroke_border_arcto( border, - &stroker->center, - radius, - stroker->angle_in + rotate, - total ); - border->movable = FALSE; - return error; - } - - - /* adds a cap at the end of an opened path */ - static FT_Error - ft_stroker_cap( FT_Stroker stroker, - FT_Angle angle, - FT_Int side ) - { - FT_Error error = FT_Err_Ok; - - - if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND ) - { - /* add a round cap */ - stroker->angle_in = angle; - stroker->angle_out = angle + FT_ANGLE_PI; - error = ft_stroker_arcto( stroker, side ); - } - else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE ) - { - /* add a square cap */ - FT_Vector delta, delta2; - FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); - FT_Fixed radius = stroker->radius; - FT_StrokeBorder border = stroker->borders + side; - - - FT_Vector_From_Polar( &delta2, radius, angle + rotate ); - FT_Vector_From_Polar( &delta, radius, angle ); - - delta.x += stroker->center.x + delta2.x; - delta.y += stroker->center.y + delta2.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - FT_Vector_From_Polar( &delta2, radius, angle - rotate ); - FT_Vector_From_Polar( &delta, radius, angle ); - - delta.x += delta2.x + stroker->center.x; - delta.y += delta2.y + stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT ) - { - /* add a butt ending */ - FT_Vector delta; - FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); - FT_Fixed radius = stroker->radius; - FT_StrokeBorder border = stroker->borders + side; - - - FT_Vector_From_Polar( &delta, radius, angle + rotate ); - - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - FT_Vector_From_Polar( &delta, radius, angle - rotate ); - - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - - Exit: - return error; - } - - - /* process an inside corner, i.e. compute intersection */ - static FT_Error - ft_stroker_inside( FT_Stroker stroker, - FT_Int side) - { - FT_StrokeBorder border = stroker->borders + side; - FT_Angle phi, theta, rotate; - FT_Fixed length, thcos, sigma; - FT_Vector delta; - FT_Error error = FT_Err_Ok; - - - rotate = FT_SIDE_TO_ROTATE( side ); - - /* compute median angle */ - theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); - if ( theta == FT_ANGLE_PI ) - theta = rotate; - else - theta = theta / 2; - - phi = stroker->angle_in + theta; - - thcos = FT_Cos( theta ); - sigma = FT_MulFix( stroker->miter_limit, thcos ); - - /* TODO: find better criterion to switch off the optimization */ - if ( sigma < 0x10000L ) - { - FT_Vector_From_Polar( &delta, stroker->radius, - stroker->angle_out + rotate ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - border->movable = FALSE; - } - else - { - length = FT_DivFix( stroker->radius, thcos ); - - FT_Vector_From_Polar( &delta, length, phi + rotate ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - } - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - - return error; - } - - - /* process an outside corner, i.e. compute bevel/miter/round */ - static FT_Error - ft_stroker_outside( FT_Stroker stroker, - FT_Int side ) - { - FT_StrokeBorder border = stroker->borders + side; - FT_Error error; - FT_Angle rotate; - - - if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND ) - error = ft_stroker_arcto( stroker, side ); - else - { - /* this is a mitered or beveled corner */ - FT_Fixed sigma, radius = stroker->radius; - FT_Angle theta, phi; - FT_Fixed thcos; - FT_Bool miter; - - - rotate = FT_SIDE_TO_ROTATE( side ); - miter = FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_MITER ); - - theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); - if ( theta == FT_ANGLE_PI ) - { - theta = rotate; - phi = stroker->angle_in; - } - else - { - theta = theta / 2; - phi = stroker->angle_in + theta + rotate; - } - - thcos = FT_Cos( theta ); - sigma = FT_MulFix( stroker->miter_limit, thcos ); - - /* FT_Sin(x) = 0 for x <= 57 */ - if ( sigma >= 0x10000L || ft_pos_abs( theta ) <= 57 ) - miter = FALSE; - - if ( miter ) /* this is a miter (broken angle) */ - { - FT_Vector middle, delta; - FT_Fixed length; - - - /* compute middle point */ - FT_Vector_From_Polar( &middle, - FT_MulFix( radius, stroker->miter_limit ), - phi ); - middle.x += stroker->center.x; - middle.y += stroker->center.y; - - /* compute first angle point */ - length = FT_MulFix( radius, - FT_DivFix( 0x10000L - sigma, - ft_pos_abs( FT_Sin( theta ) ) ) ); - - FT_Vector_From_Polar( &delta, length, phi + rotate ); - delta.x += middle.x; - delta.y += middle.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - /* compute second angle point */ - FT_Vector_From_Polar( &delta, length, phi - rotate ); - delta.x += middle.x; - delta.y += middle.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - /* finally, add a movable end point */ - FT_Vector_From_Polar( &delta, radius, stroker->angle_out + rotate ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, TRUE ); - } - - else /* this is a bevel (intersection) */ - { - FT_Fixed length; - FT_Vector delta; - - - length = FT_DivFix( stroker->radius, thcos ); - - FT_Vector_From_Polar( &delta, length, phi ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - /* now add end point */ - FT_Vector_From_Polar( &delta, stroker->radius, - stroker->angle_out + rotate ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, TRUE ); - } - } - - Exit: - return error; - } - - - static FT_Error - ft_stroker_process_corner( FT_Stroker stroker ) - { - FT_Error error = FT_Err_Ok; - FT_Angle turn; - FT_Int inside_side; - - - turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); - - /* no specific corner processing is required if the turn is 0 */ - if ( turn == 0 ) - goto Exit; - - /* when we turn to the right, the inside side is 0 */ - inside_side = 0; - - /* otherwise, the inside side is 1 */ - if ( turn < 0 ) - inside_side = 1; - - /* process the inside side */ - error = ft_stroker_inside( stroker, inside_side ); - if ( error ) - goto Exit; - - /* process the outside side */ - error = ft_stroker_outside( stroker, 1 - inside_side ); - - Exit: - return error; - } - - - /* add two points to the left and right borders corresponding to the */ - /* start of the subpath */ - static FT_Error - ft_stroker_subpath_start( FT_Stroker stroker, - FT_Angle start_angle ) - { - FT_Vector delta; - FT_Vector point; - FT_Error error; - FT_StrokeBorder border; - - - FT_Vector_From_Polar( &delta, stroker->radius, - start_angle + FT_ANGLE_PI2 ); - - point.x = stroker->center.x + delta.x; - point.y = stroker->center.y + delta.y; - - border = stroker->borders; - error = ft_stroke_border_moveto( border, &point ); - if ( error ) - goto Exit; - - point.x = stroker->center.x - delta.x; - point.y = stroker->center.y - delta.y; - - border++; - error = ft_stroke_border_moveto( border, &point ); - - /* save angle for last cap */ - stroker->subpath_angle = start_angle; - stroker->first_point = FALSE; - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_LineTo( FT_Stroker stroker, - FT_Vector* to ) - { - FT_Error error = FT_Err_Ok; - FT_StrokeBorder border; - FT_Vector delta; - FT_Angle angle; - FT_Int side; - - delta.x = to->x - stroker->center.x; - delta.y = to->y - stroker->center.y; - - angle = FT_Atan2( delta.x, delta.y ); - FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 ); - - /* process corner if necessary */ - if ( stroker->first_point ) - { - /* This is the first segment of a subpath. We need to */ - /* add a point to each border at their respective starting */ - /* point locations. */ - error = ft_stroker_subpath_start( stroker, angle ); - if ( error ) - goto Exit; - } - else - { - /* process the current corner */ - stroker->angle_out = angle; - error = ft_stroker_process_corner( stroker ); - if ( error ) - goto Exit; - } - - /* now add a line segment to both the `inside' and `outside' paths */ - - for ( border = stroker->borders, side = 1; side >= 0; side--, border++ ) - { - FT_Vector point; - - - point.x = to->x + delta.x; - point.y = to->y + delta.y; - - error = ft_stroke_border_lineto( border, &point, TRUE ); - if ( error ) - goto Exit; - - delta.x = -delta.x; - delta.y = -delta.y; - } - - stroker->angle_in = angle; - stroker->center = *to; - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_ConicTo( FT_Stroker stroker, - FT_Vector* control, - FT_Vector* to ) - { - FT_Error error = FT_Err_Ok; - FT_Vector bez_stack[34]; - FT_Vector* arc; - FT_Vector* limit = bez_stack + 30; - FT_Angle start_angle; - FT_Bool first_arc = TRUE; - - - arc = bez_stack; - arc[0] = *to; - arc[1] = *control; - arc[2] = stroker->center; - - while ( arc >= bez_stack ) - { - FT_Angle angle_in, angle_out; - - - angle_in = angle_out = 0; /* remove compiler warnings */ - - if ( arc < limit && - !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) ) - { - ft_conic_split( arc ); - arc += 2; - continue; - } - - if ( first_arc ) - { - first_arc = FALSE; - - start_angle = angle_in; - - /* process corner if necessary */ - if ( stroker->first_point ) - error = ft_stroker_subpath_start( stroker, start_angle ); - else - { - stroker->angle_out = start_angle; - error = ft_stroker_process_corner( stroker ); - } - } - - /* the arc's angle is small enough; we can add it directly to each */ - /* border */ - { - FT_Vector ctrl, end; - FT_Angle theta, phi, rotate; - FT_Fixed length; - FT_Int side; - - - theta = FT_Angle_Diff( angle_in, angle_out ) / 2; - phi = angle_in + theta; - length = FT_DivFix( stroker->radius, FT_Cos( theta ) ); - - for ( side = 0; side <= 1; side++ ) - { - rotate = FT_SIDE_TO_ROTATE( side ); - - /* compute control point */ - FT_Vector_From_Polar( &ctrl, length, phi + rotate ); - ctrl.x += arc[1].x; - ctrl.y += arc[1].y; - - /* compute end point */ - FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); - end.x += arc[0].x; - end.y += arc[0].y; - - error = ft_stroke_border_conicto( stroker->borders + side, - &ctrl, &end ); - if ( error ) - goto Exit; - } - } - - arc -= 2; - - if ( arc < bez_stack ) - stroker->angle_in = angle_out; - } - - stroker->center = *to; - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_CubicTo( FT_Stroker stroker, - FT_Vector* control1, - FT_Vector* control2, - FT_Vector* to ) - { - FT_Error error = FT_Err_Ok; - FT_Vector bez_stack[37]; - FT_Vector* arc; - FT_Vector* limit = bez_stack + 32; - FT_Angle start_angle; - FT_Bool first_arc = TRUE; - - - arc = bez_stack; - arc[0] = *to; - arc[1] = *control2; - arc[2] = *control1; - arc[3] = stroker->center; - - while ( arc >= bez_stack ) - { - FT_Angle angle_in, angle_mid, angle_out; - - - /* remove compiler warnings */ - angle_in = angle_out = angle_mid = 0; - - if ( arc < limit && - !ft_cubic_is_small_enough( arc, &angle_in, - &angle_mid, &angle_out ) ) - { - ft_cubic_split( arc ); - arc += 3; - continue; - } - - if ( first_arc ) - { - first_arc = FALSE; - - /* process corner if necessary */ - start_angle = angle_in; - - if ( stroker->first_point ) - error = ft_stroker_subpath_start( stroker, start_angle ); - else - { - stroker->angle_out = start_angle; - error = ft_stroker_process_corner( stroker ); - } - if ( error ) - goto Exit; - } - - /* the arc's angle is small enough; we can add it directly to each */ - /* border */ - { - FT_Vector ctrl1, ctrl2, end; - FT_Angle theta1, phi1, theta2, phi2, rotate; - FT_Fixed length1, length2; - FT_Int side; - - - theta1 = ft_pos_abs( angle_mid - angle_in ) / 2; - theta2 = ft_pos_abs( angle_out - angle_mid ) / 2; - phi1 = (angle_mid + angle_in ) / 2; - phi2 = (angle_mid + angle_out ) / 2; - length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) ); - length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) ); - - for ( side = 0; side <= 1; side++ ) - { - rotate = FT_SIDE_TO_ROTATE( side ); - - /* compute control points */ - FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate ); - ctrl1.x += arc[2].x; - ctrl1.y += arc[2].y; - - FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate ); - ctrl2.x += arc[1].x; - ctrl2.y += arc[1].y; - - /* compute end point */ - FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); - end.x += arc[0].x; - end.y += arc[0].y; - - error = ft_stroke_border_cubicto( stroker->borders + side, - &ctrl1, &ctrl2, &end ); - if ( error ) - goto Exit; - } - } - - arc -= 3; - if ( arc < bez_stack ) - stroker->angle_in = angle_out; - } - - stroker->center = *to; - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_BeginSubPath( FT_Stroker stroker, - FT_Vector* to, - FT_Bool open ) - { - /* We cannot process the first point, because there is not enough */ - /* information regarding its corner/cap. The latter will be processed */ - /* in the `FT_Stroker_EndSubPath' routine. */ - /* */ - stroker->first_point = TRUE; - stroker->center = *to; - stroker->subpath_open = open; - - /* record the subpath start point for each border */ - stroker->subpath_start = *to; - - return FT_Err_Ok; - } - - - static FT_Error - ft_stroker_add_reverse_left( FT_Stroker stroker, - FT_Bool open ) - { - FT_StrokeBorder right = stroker->borders + 0; - FT_StrokeBorder left = stroker->borders + 1; - FT_Int new_points; - FT_Error error = FT_Err_Ok; - - - FT_ASSERT( left->start >= 0 ); - - new_points = left->num_points - left->start; - if ( new_points > 0 ) - { - error = ft_stroke_border_grow( right, (FT_UInt)new_points ); - if ( error ) - goto Exit; - - { - FT_Vector* dst_point = right->points + right->num_points; - FT_Byte* dst_tag = right->tags + right->num_points; - FT_Vector* src_point = left->points + left->num_points - 1; - FT_Byte* src_tag = left->tags + left->num_points - 1; - - while ( src_point >= left->points + left->start ) - { - *dst_point = *src_point; - *dst_tag = *src_tag; - - if ( open ) - dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END; - else - { - FT_Byte ttag = (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END ); - - - /* switch begin/end tags if necessary */ - if ( ttag == FT_STROKE_TAG_BEGIN || - ttag == FT_STROKE_TAG_END ) - dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END; - - } - - src_point--; - src_tag--; - dst_point++; - dst_tag++; - } - } - - left->num_points = left->start; - right->num_points += new_points; - - right->movable = FALSE; - left->movable = FALSE; - } - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - /* there's a lot of magic in this function! */ - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_EndSubPath( FT_Stroker stroker ) - { - FT_Error error = FT_Err_Ok; - - - if ( stroker->subpath_open ) - { - FT_StrokeBorder right = stroker->borders; - - /* All right, this is an opened path, we need to add a cap between */ - /* right & left, add the reverse of left, then add a final cap */ - /* between left & right. */ - error = ft_stroker_cap( stroker, stroker->angle_in, 0 ); - if ( error ) - goto Exit; - - /* add reversed points from `left' to `right' */ - error = ft_stroker_add_reverse_left( stroker, TRUE ); - if ( error ) - goto Exit; - - /* now add the final cap */ - stroker->center = stroker->subpath_start; - error = ft_stroker_cap( stroker, - stroker->subpath_angle + FT_ANGLE_PI, 0 ); - if ( error ) - goto Exit; - - /* Now end the right subpath accordingly. The left one is */ - /* rewind and doesn't need further processing. */ - ft_stroke_border_close( right, FALSE ); - } - else - { - FT_Angle turn; - FT_Int inside_side; - - /* close the path if needed */ - if ( stroker->center.x != stroker->subpath_start.x || - stroker->center.y != stroker->subpath_start.y ) - { - error = FT_Stroker_LineTo( stroker, &stroker->subpath_start ); - if ( error ) - goto Exit; - } - - /* process the corner */ - stroker->angle_out = stroker->subpath_angle; - turn = FT_Angle_Diff( stroker->angle_in, - stroker->angle_out ); - - /* no specific corner processing is required if the turn is 0 */ - if ( turn != 0 ) - { - /* when we turn to the right, the inside side is 0 */ - inside_side = 0; - - /* otherwise, the inside side is 1 */ - if ( turn < 0 ) - inside_side = 1; - - error = ft_stroker_inside( stroker, inside_side ); - if ( error ) - goto Exit; - - /* process the outside side */ - error = ft_stroker_outside( stroker, 1 - inside_side ); - if ( error ) - goto Exit; - } - - /* then end our two subpaths */ - ft_stroke_border_close( stroker->borders + 0, TRUE ); - ft_stroke_border_close( stroker->borders + 1, FALSE ); - } - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_GetBorderCounts( FT_Stroker stroker, - FT_StrokerBorder border, - FT_UInt *anum_points, - FT_UInt *anum_contours ) - { - FT_UInt num_points = 0, num_contours = 0; - FT_Error error; - - - if ( !stroker || border > 1 ) - { - error = FT_Err_Invalid_Argument; - goto Exit; - } - - error = ft_stroke_border_get_counts( stroker->borders + border, - &num_points, &num_contours ); - Exit: - if ( anum_points ) - *anum_points = num_points; - - if ( anum_contours ) - *anum_contours = num_contours; - - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_GetCounts( FT_Stroker stroker, - FT_UInt *anum_points, - FT_UInt *anum_contours ) - { - FT_UInt count1, count2, num_points = 0; - FT_UInt count3, count4, num_contours = 0; - FT_Error error; - - - error = ft_stroke_border_get_counts( stroker->borders + 0, - &count1, &count2 ); - if ( error ) - goto Exit; - - error = ft_stroke_border_get_counts( stroker->borders + 1, - &count3, &count4 ); - if ( error ) - goto Exit; - - num_points = count1 + count3; - num_contours = count2 + count4; - - Exit: - *anum_points = num_points; - *anum_contours = num_contours; - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( void ) - FT_Stroker_ExportBorder( FT_Stroker stroker, - FT_StrokerBorder border, - FT_Outline* outline ) - { - if ( border == FT_STROKER_BORDER_LEFT || - border == FT_STROKER_BORDER_RIGHT ) - { - FT_StrokeBorder sborder = & stroker->borders[border]; - - - if ( sborder->valid ) - ft_stroke_border_export( sborder, outline ); - } - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( void ) - FT_Stroker_Export( FT_Stroker stroker, - FT_Outline* outline ) - { - FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline ); - FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline ); - } - - - /* documentation is in ftstroke.h */ - - /* - * The following is very similar to FT_Outline_Decompose, except - * that we do support opened paths, and do not scale the outline. - */ - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_ParseOutline( FT_Stroker stroker, - FT_Outline* outline, - FT_Bool opened ) - { - FT_Vector v_last; - FT_Vector v_control; - FT_Vector v_start; - - FT_Vector* point; - FT_Vector* limit; - char* tags; - - FT_Error error; - - FT_Int n; /* index of contour in outline */ - FT_UInt first; /* index of first point in contour */ - FT_Int tag; /* current point's state */ - - - if ( !outline || !stroker ) - return FT_Err_Invalid_Argument; - - FT_Stroker_Rewind( stroker ); - - first = 0; - - for ( n = 0; n < outline->n_contours; n++ ) - { - FT_UInt last; /* index of last point in contour */ - - - last = outline->contours[n]; - limit = outline->points + last; - - /* skip empty points; we don't stroke these */ - if ( last <= first ) - { - first = last + 1; - continue; - } - - v_start = outline->points[first]; - v_last = outline->points[last]; - - v_control = v_start; - - point = outline->points + first; - tags = outline->tags + first; - tag = FT_CURVE_TAG( tags[0] ); - - /* A contour cannot start with a cubic control point! */ - if ( tag == FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - /* check first point to determine origin */ - if ( tag == FT_CURVE_TAG_CONIC ) - { - /* First point is conic control. Yes, this happens. */ - if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) - { - /* start at last point if it is on the curve */ - v_start = v_last; - limit--; - } - else - { - /* if both first and last points are conic, */ - /* start at their middle */ - v_start.x = ( v_start.x + v_last.x ) / 2; - v_start.y = ( v_start.y + v_last.y ) / 2; - } - point--; - tags--; - } - - error = FT_Stroker_BeginSubPath( stroker, &v_start, opened ); - if ( error ) - goto Exit; - - while ( point < limit ) - { - point++; - tags++; - - tag = FT_CURVE_TAG( tags[0] ); - switch ( tag ) - { - case FT_CURVE_TAG_ON: /* emit a single line_to */ - { - FT_Vector vec; - - - vec.x = point->x; - vec.y = point->y; - - error = FT_Stroker_LineTo( stroker, &vec ); - if ( error ) - goto Exit; - continue; - } - - case FT_CURVE_TAG_CONIC: /* consume conic arcs */ - v_control.x = point->x; - v_control.y = point->y; - - Do_Conic: - if ( point < limit ) - { - FT_Vector vec; - FT_Vector v_middle; - - - point++; - tags++; - tag = FT_CURVE_TAG( tags[0] ); - - vec = point[0]; - - if ( tag == FT_CURVE_TAG_ON ) - { - error = FT_Stroker_ConicTo( stroker, &v_control, &vec ); - if ( error ) - goto Exit; - continue; - } - - if ( tag != FT_CURVE_TAG_CONIC ) - goto Invalid_Outline; - - v_middle.x = ( v_control.x + vec.x ) / 2; - v_middle.y = ( v_control.y + vec.y ) / 2; - - error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle ); - if ( error ) - goto Exit; - - v_control = vec; - goto Do_Conic; - } - - error = FT_Stroker_ConicTo( stroker, &v_control, &v_start ); - goto Close; - - default: /* FT_CURVE_TAG_CUBIC */ - { - FT_Vector vec1, vec2; - - - if ( point + 1 > limit || - FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - point += 2; - tags += 2; - - vec1 = point[-2]; - vec2 = point[-1]; - - if ( point <= limit ) - { - FT_Vector vec; - - - vec = point[0]; - - error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec ); - if ( error ) - goto Exit; - continue; - } - - error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start ); - goto Close; - } - } - } - - Close: - if ( error ) - goto Exit; - - error = FT_Stroker_EndSubPath( stroker ); - if ( error ) - goto Exit; - - first = last + 1; - } - - return FT_Err_Ok; - - Exit: - return error; - - Invalid_Outline: - return FT_Err_Invalid_Outline; - } - -/* declare an extern to access ft_outline_glyph_class global allocated - in ftglyph.c, and use the FT_OUTLINE_GLYPH_CLASS_GET macro to access - it when FT_CONFIG_OPTION_PIC is defined */ -#ifndef FT_CONFIG_OPTION_PIC - extern const FT_Glyph_Class ft_outline_glyph_class; -#endif -#include "basepic.h" - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Glyph_Stroke( FT_Glyph *pglyph, - FT_Stroker stroker, - FT_Bool destroy ) - { - FT_Error error = FT_Err_Invalid_Argument; - FT_Glyph glyph = NULL; - FT_Library library = stroker->library; - FT_UNUSED(library); - - if ( pglyph == NULL ) - goto Exit; - - glyph = *pglyph; - if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) - goto Exit; - - { - FT_Glyph copy; - - - error = FT_Glyph_Copy( glyph, © ); - if ( error ) - goto Exit; - - glyph = copy; - } - - { - FT_OutlineGlyph oglyph = (FT_OutlineGlyph) glyph; - FT_Outline* outline = &oglyph->outline; - FT_UInt num_points, num_contours; - - - error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); - if ( error ) - goto Fail; - - (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); - - FT_Outline_Done( glyph->library, outline ); - - error = FT_Outline_New( glyph->library, - num_points, num_contours, outline ); - if ( error ) - goto Fail; - - outline->n_points = 0; - outline->n_contours = 0; - - FT_Stroker_Export( stroker, outline ); - } - - if ( destroy ) - FT_Done_Glyph( *pglyph ); - - *pglyph = glyph; - goto Exit; - - Fail: - FT_Done_Glyph( glyph ); - glyph = NULL; - - if ( !destroy ) - *pglyph = NULL; - - Exit: - return error; - } - - - /* documentation is in ftstroke.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Glyph_StrokeBorder( FT_Glyph *pglyph, - FT_Stroker stroker, - FT_Bool inside, - FT_Bool destroy ) - { - FT_Error error = FT_Err_Invalid_Argument; - FT_Glyph glyph = NULL; - FT_Library library = stroker->library; - FT_UNUSED(library); - - if ( pglyph == NULL ) - goto Exit; - - glyph = *pglyph; - if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) - goto Exit; - - { - FT_Glyph copy; - - - error = FT_Glyph_Copy( glyph, © ); - if ( error ) - goto Exit; - - glyph = copy; - } - - { - FT_OutlineGlyph oglyph = (FT_OutlineGlyph) glyph; - FT_StrokerBorder border; - FT_Outline* outline = &oglyph->outline; - FT_UInt num_points, num_contours; - - - border = FT_Outline_GetOutsideBorder( outline ); - if ( inside ) - { - if ( border == FT_STROKER_BORDER_LEFT ) - border = FT_STROKER_BORDER_RIGHT; - else - border = FT_STROKER_BORDER_LEFT; - } - - error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); - if ( error ) - goto Fail; - - (void)FT_Stroker_GetBorderCounts( stroker, border, - &num_points, &num_contours ); - - FT_Outline_Done( glyph->library, outline ); - - error = FT_Outline_New( glyph->library, - num_points, - num_contours, - outline ); - if ( error ) - goto Fail; - - outline->n_points = 0; - outline->n_contours = 0; - - FT_Stroker_ExportBorder( stroker, border, outline ); - } - - if ( destroy ) - FT_Done_Glyph( *pglyph ); - - *pglyph = glyph; - goto Exit; - - Fail: - FT_Done_Glyph( glyph ); - glyph = NULL; - - if ( !destroy ) - *pglyph = NULL; - - Exit: - return error; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftsynth.c b/android/jni/ndk_modules/freetype/src/base/ftsynth.c deleted file mode 100644 index ba3c633e..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftsynth.c +++ /dev/null @@ -1,160 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsynth.c */ -/* */ -/* FreeType synthesizing code for emboldening and slanting (body). */ -/* */ -/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_SYNTHESIS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_OUTLINE_H -#include FT_BITMAP_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_synth - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** EXPERIMENTAL OBLIQUING SUPPORT ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - /* documentation is in ftsynth.h */ - - FT_EXPORT_DEF( void ) - FT_GlyphSlot_Oblique( FT_GlyphSlot slot ) - { - FT_Matrix transform; - FT_Outline* outline = &slot->outline; - - - /* only oblique outline glyphs */ - if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) - return; - - /* we don't touch the advance width */ - - /* For italic, simply apply a shear transform, with an angle */ - /* of about 12 degrees. */ - - transform.xx = 0x10000L; - transform.yx = 0x00000L; - - transform.xy = 0x06000L; - transform.yy = 0x10000L; - - FT_Outline_Transform( outline, &transform ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** EXPERIMENTAL EMBOLDENING/OUTLINING SUPPORT ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* documentation is in ftsynth.h */ - - FT_EXPORT_DEF( void ) - FT_GlyphSlot_Embolden( FT_GlyphSlot slot ) - { - FT_Library library = slot->library; - FT_Face face = slot->face; - FT_Error error; - FT_Pos xstr, ystr; - - - if ( slot->format != FT_GLYPH_FORMAT_OUTLINE && - slot->format != FT_GLYPH_FORMAT_BITMAP ) - return; - - /* some reasonable strength */ - xstr = FT_MulFix( face->units_per_EM, - face->size->metrics.y_scale ) / 24; - ystr = xstr; - - if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) - { - /* ignore error */ - (void)FT_Outline_Embolden( &slot->outline, xstr ); - - /* this is more than enough for most glyphs; if you need accurate */ - /* values, you have to call FT_Outline_Get_CBox */ - xstr = xstr * 2; - ystr = xstr; - } - else if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) - { - /* round to full pixels */ - xstr &= ~63; - if ( xstr == 0 ) - xstr = 1 << 6; - ystr &= ~63; - - /* - * XXX: overflow check for 16-bit system, for compatibility - * with FT_GlyphSlot_Embolden() since freetype-2.1.10. - * unfortunately, this function return no informations - * about the cause of error. - */ - if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN ) - { - FT_TRACE1(( "FT_GlyphSlot_Embolden:" )); - FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr )); - return; - } - error = FT_GlyphSlot_Own_Bitmap( slot ); - if ( error ) - return; - - error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr ); - if ( error ) - return; - } - - if ( slot->advance.x ) - slot->advance.x += xstr; - - if ( slot->advance.y ) - slot->advance.y += ystr; - - slot->metrics.width += xstr; - slot->metrics.height += ystr; - slot->metrics.horiBearingY += ystr; - slot->metrics.horiAdvance += xstr; - slot->metrics.vertBearingX -= xstr / 2; - slot->metrics.vertBearingY += ystr; - slot->metrics.vertAdvance += ystr; - - /* XXX: 16-bit overflow case must be excluded before here */ - if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) - slot->bitmap_top += (FT_Int)( ystr >> 6 ); - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftsystem.c b/android/jni/ndk_modules/freetype/src/base/ftsystem.c deleted file mode 100644 index ba86005c..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftsystem.c +++ /dev/null @@ -1,307 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsystem.c */ -/* */ -/* ANSI-specific FreeType low-level system interface (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2006, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* This file contains the default interface used by FreeType to access */ - /* low-level, i.e. memory management, i/o access as well as thread */ - /* synchronisation. It can be replaced by user-specific routines if */ - /* necessary. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_SYSTEM_H -#include FT_ERRORS_H -#include FT_TYPES_H - - - /*************************************************************************/ - /* */ - /* MEMORY MANAGEMENT INTERFACE */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* It is not necessary to do any error checking for the */ - /* allocation-related functions. This will be done by the higher level */ - /* routines like ft_mem_alloc() or ft_mem_realloc(). */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_alloc */ - /* */ - /* <Description> */ - /* The memory allocation function. */ - /* */ - /* <Input> */ - /* memory :: A pointer to the memory object. */ - /* */ - /* size :: The requested size in bytes. */ - /* */ - /* <Return> */ - /* The address of newly allocated block. */ - /* */ - FT_CALLBACK_DEF( void* ) - ft_alloc( FT_Memory memory, - long size ) - { - FT_UNUSED( memory ); - - return ft_smalloc( size ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_realloc */ - /* */ - /* <Description> */ - /* The memory reallocation function. */ - /* */ - /* <Input> */ - /* memory :: A pointer to the memory object. */ - /* */ - /* cur_size :: The current size of the allocated memory block. */ - /* */ - /* new_size :: The newly requested size in bytes. */ - /* */ - /* block :: The current address of the block in memory. */ - /* */ - /* <Return> */ - /* The address of the reallocated memory block. */ - /* */ - FT_CALLBACK_DEF( void* ) - ft_realloc( FT_Memory memory, - long cur_size, - long new_size, - void* block ) - { - FT_UNUSED( memory ); - FT_UNUSED( cur_size ); - - return ft_srealloc( block, new_size ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_free */ - /* */ - /* <Description> */ - /* The memory release function. */ - /* */ - /* <Input> */ - /* memory :: A pointer to the memory object. */ - /* */ - /* block :: The address of block in memory to be freed. */ - /* */ - FT_CALLBACK_DEF( void ) - ft_free( FT_Memory memory, - void* block ) - { - FT_UNUSED( memory ); - - ft_sfree( block ); - } - - - /*************************************************************************/ - /* */ - /* RESOURCE MANAGEMENT INTERFACE */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_io - - /* We use the macro STREAM_FILE for convenience to extract the */ - /* system-specific stream handle from a given FreeType stream object */ -#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_ansi_stream_close */ - /* */ - /* <Description> */ - /* The function to close a stream. */ - /* */ - /* <Input> */ - /* stream :: A pointer to the stream object. */ - /* */ - FT_CALLBACK_DEF( void ) - ft_ansi_stream_close( FT_Stream stream ) - { - ft_fclose( STREAM_FILE( stream ) ); - - stream->descriptor.pointer = NULL; - stream->size = 0; - stream->base = 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_ansi_stream_io */ - /* */ - /* <Description> */ - /* The function to open a stream. */ - /* */ - /* <Input> */ - /* stream :: A pointer to the stream object. */ - /* */ - /* offset :: The position in the data stream to start reading. */ - /* */ - /* buffer :: The address of buffer to store the read data. */ - /* */ - /* count :: The number of bytes to read from the stream. */ - /* */ - /* <Return> */ - /* The number of bytes actually read. If `count' is zero (this is, */ - /* the function is used for seeking), a non-zero return value */ - /* indicates an error. */ - /* */ - FT_CALLBACK_DEF( unsigned long ) - ft_ansi_stream_io( FT_Stream stream, - unsigned long offset, - unsigned char* buffer, - unsigned long count ) - { - FT_FILE* file; - - - if ( !count && offset > stream->size ) - return 1; - - file = STREAM_FILE( stream ); - - if ( stream->pos != offset ) - ft_fseek( file, offset, SEEK_SET ); - - return (unsigned long)ft_fread( buffer, 1, count, file ); - } - - - /* documentation is in ftstream.h */ - - FT_BASE_DEF( FT_Error ) - FT_Stream_Open( FT_Stream stream, - const char* filepathname ) - { - FT_FILE* file; - - - if ( !stream ) - return FT_Err_Invalid_Stream_Handle; - - file = ft_fopen( filepathname, "rb" ); - if ( !file ) - { - FT_ERROR(( "FT_Stream_Open:" - " could not open `%s'\n", filepathname )); - - return FT_Err_Cannot_Open_Resource; - } - - ft_fseek( file, 0, SEEK_END ); - stream->size = ft_ftell( file ); - ft_fseek( file, 0, SEEK_SET ); - - stream->descriptor.pointer = file; - stream->pathname.pointer = (char*)filepathname; - stream->pos = 0; - - stream->read = ft_ansi_stream_io; - stream->close = ft_ansi_stream_close; - - FT_TRACE1(( "FT_Stream_Open:" )); - FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", - filepathname, stream->size )); - - return FT_Err_Ok; - } - - -#ifdef FT_DEBUG_MEMORY - - extern FT_Int - ft_mem_debug_init( FT_Memory memory ); - - extern void - ft_mem_debug_done( FT_Memory memory ); - -#endif - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( FT_Memory ) - FT_New_Memory( void ) - { - FT_Memory memory; - - - memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) ); - if ( memory ) - { - memory->user = 0; - memory->alloc = ft_alloc; - memory->realloc = ft_realloc; - memory->free = ft_free; -#ifdef FT_DEBUG_MEMORY - ft_mem_debug_init( memory ); -#endif - } - - return memory; - } - - - /* documentation is in ftobjs.h */ - - FT_BASE_DEF( void ) - FT_Done_Memory( FT_Memory memory ) - { -#ifdef FT_DEBUG_MEMORY - ft_mem_debug_done( memory ); -#endif - ft_sfree( memory ); - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/fttrigon.c b/android/jni/ndk_modules/freetype/src/base/fttrigon.c deleted file mode 100644 index fdf433ab..00000000 --- a/android/jni/ndk_modules/freetype/src/base/fttrigon.c +++ /dev/null @@ -1,546 +0,0 @@ -/***************************************************************************/ -/* */ -/* fttrigon.c */ -/* */ -/* FreeType trigonometric functions (body). */ -/* */ -/* Copyright 2001, 2002, 2003, 2004, 2005 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_TRIGONOMETRY_H - - - /* the following is 0.2715717684432231 * 2^30 */ -#define FT_TRIG_COSCALE 0x11616E8EUL - - /* this table was generated for FT_PI = 180L << 16, i.e. degrees */ -#define FT_TRIG_MAX_ITERS 23 - - static const FT_Fixed - ft_trig_arctan_table[24] = - { - 4157273L, 2949120L, 1740967L, 919879L, 466945L, 234379L, 117304L, - 58666L, 29335L, 14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L, - 57L, 29L, 14L, 7L, 4L, 2L, 1L - }; - - /* the Cordic shrink factor, multiplied by 2^32 */ -#define FT_TRIG_SCALE 1166391785UL /* 0x4585BA38UL */ - - -#ifdef FT_CONFIG_HAS_INT64 - - /* multiply a given value by the CORDIC shrink factor */ - static FT_Fixed - ft_trig_downscale( FT_Fixed val ) - { - FT_Fixed s; - FT_Int64 v; - - - s = val; - val = ( val >= 0 ) ? val : -val; - - v = ( val * (FT_Int64)FT_TRIG_SCALE ) + 0x100000000UL; - val = (FT_Fixed)( v >> 32 ); - - return ( s >= 0 ) ? val : -val; - } - -#else /* !FT_CONFIG_HAS_INT64 */ - - /* multiply a given value by the CORDIC shrink factor */ - static FT_Fixed - ft_trig_downscale( FT_Fixed val ) - { - FT_Fixed s; - FT_UInt32 v1, v2, k1, k2, hi, lo1, lo2, lo3; - - - s = val; - val = ( val >= 0 ) ? val : -val; - - v1 = (FT_UInt32)val >> 16; - v2 = (FT_UInt32)(val & 0xFFFFL); - - k1 = (FT_UInt32)FT_TRIG_SCALE >> 16; /* constant */ - k2 = (FT_UInt32)(FT_TRIG_SCALE & 0xFFFFL); /* constant */ - - hi = k1 * v1; - lo1 = k1 * v2 + k2 * v1; /* can't overflow */ - - lo2 = ( k2 * v2 ) >> 16; - lo3 = ( lo1 >= lo2 ) ? lo1 : lo2; - lo1 += lo2; - - hi += lo1 >> 16; - if ( lo1 < lo3 ) - hi += (FT_UInt32)0x10000UL; - - val = (FT_Fixed)hi; - - return ( s >= 0 ) ? val : -val; - } - -#endif /* !FT_CONFIG_HAS_INT64 */ - - - static FT_Int - ft_trig_prenorm( FT_Vector* vec ) - { - FT_Fixed x, y, z; - FT_Int shift; - - - x = vec->x; - y = vec->y; - - z = ( ( x >= 0 ) ? x : - x ) | ( (y >= 0) ? y : -y ); - shift = 0; - -#if 1 - /* determine msb bit index in `shift' */ - if ( z >= ( 1L << 16 ) ) - { - z >>= 16; - shift += 16; - } - if ( z >= ( 1L << 8 ) ) - { - z >>= 8; - shift += 8; - } - if ( z >= ( 1L << 4 ) ) - { - z >>= 4; - shift += 4; - } - if ( z >= ( 1L << 2 ) ) - { - z >>= 2; - shift += 2; - } - if ( z >= ( 1L << 1 ) ) - { - z >>= 1; - shift += 1; - } - - if ( shift <= 27 ) - { - shift = 27 - shift; - vec->x = x << shift; - vec->y = y << shift; - } - else - { - shift -= 27; - vec->x = x >> shift; - vec->y = y >> shift; - shift = -shift; - } - -#else /* 0 */ - - if ( z < ( 1L << 27 ) ) - { - do - { - shift++; - z <<= 1; - } while ( z < ( 1L << 27 ) ); - vec->x = x << shift; - vec->y = y << shift; - } - else if ( z > ( 1L << 28 ) ) - { - do - { - shift++; - z >>= 1; - } while ( z > ( 1L << 28 ) ); - - vec->x = x >> shift; - vec->y = y >> shift; - shift = -shift; - } - -#endif /* 0 */ - - return shift; - } - - - static void - ft_trig_pseudo_rotate( FT_Vector* vec, - FT_Angle theta ) - { - FT_Int i; - FT_Fixed x, y, xtemp; - const FT_Fixed *arctanptr; - - - x = vec->x; - y = vec->y; - - /* Get angle between -90 and 90 degrees */ - while ( theta <= -FT_ANGLE_PI2 ) - { - x = -x; - y = -y; - theta += FT_ANGLE_PI; - } - - while ( theta > FT_ANGLE_PI2 ) - { - x = -x; - y = -y; - theta -= FT_ANGLE_PI; - } - - /* Initial pseudorotation, with left shift */ - arctanptr = ft_trig_arctan_table; - - if ( theta < 0 ) - { - xtemp = x + ( y << 1 ); - y = y - ( x << 1 ); - x = xtemp; - theta += *arctanptr++; - } - else - { - xtemp = x - ( y << 1 ); - y = y + ( x << 1 ); - x = xtemp; - theta -= *arctanptr++; - } - - /* Subsequent pseudorotations, with right shifts */ - i = 0; - do - { - if ( theta < 0 ) - { - xtemp = x + ( y >> i ); - y = y - ( x >> i ); - x = xtemp; - theta += *arctanptr++; - } - else - { - xtemp = x - ( y >> i ); - y = y + ( x >> i ); - x = xtemp; - theta -= *arctanptr++; - } - } while ( ++i < FT_TRIG_MAX_ITERS ); - - vec->x = x; - vec->y = y; - } - - - static void - ft_trig_pseudo_polarize( FT_Vector* vec ) - { - FT_Fixed theta; - FT_Fixed yi, i; - FT_Fixed x, y; - const FT_Fixed *arctanptr; - - - x = vec->x; - y = vec->y; - - /* Get the vector into the right half plane */ - theta = 0; - if ( x < 0 ) - { - x = -x; - y = -y; - theta = 2 * FT_ANGLE_PI2; - } - - if ( y > 0 ) - theta = - theta; - - arctanptr = ft_trig_arctan_table; - - if ( y < 0 ) - { - /* Rotate positive */ - yi = y + ( x << 1 ); - x = x - ( y << 1 ); - y = yi; - theta -= *arctanptr++; /* Subtract angle */ - } - else - { - /* Rotate negative */ - yi = y - ( x << 1 ); - x = x + ( y << 1 ); - y = yi; - theta += *arctanptr++; /* Add angle */ - } - - i = 0; - do - { - if ( y < 0 ) - { - /* Rotate positive */ - yi = y + ( x >> i ); - x = x - ( y >> i ); - y = yi; - theta -= *arctanptr++; - } - else - { - /* Rotate negative */ - yi = y - ( x >> i ); - x = x + ( y >> i ); - y = yi; - theta += *arctanptr++; - } - } while ( ++i < FT_TRIG_MAX_ITERS ); - - /* round theta */ - if ( theta >= 0 ) - theta = FT_PAD_ROUND( theta, 32 ); - else - theta = -FT_PAD_ROUND( -theta, 32 ); - - vec->x = x; - vec->y = theta; - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_Cos( FT_Angle angle ) - { - FT_Vector v; - - - v.x = FT_TRIG_COSCALE >> 2; - v.y = 0; - ft_trig_pseudo_rotate( &v, angle ); - - return v.x / ( 1 << 12 ); - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_Sin( FT_Angle angle ) - { - return FT_Cos( FT_ANGLE_PI2 - angle ); - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_Tan( FT_Angle angle ) - { - FT_Vector v; - - - v.x = FT_TRIG_COSCALE >> 2; - v.y = 0; - ft_trig_pseudo_rotate( &v, angle ); - - return FT_DivFix( v.y, v.x ); - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( FT_Angle ) - FT_Atan2( FT_Fixed dx, - FT_Fixed dy ) - { - FT_Vector v; - - - if ( dx == 0 && dy == 0 ) - return 0; - - v.x = dx; - v.y = dy; - ft_trig_prenorm( &v ); - ft_trig_pseudo_polarize( &v ); - - return v.y; - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( void ) - FT_Vector_Unit( FT_Vector* vec, - FT_Angle angle ) - { - vec->x = FT_TRIG_COSCALE >> 2; - vec->y = 0; - ft_trig_pseudo_rotate( vec, angle ); - vec->x >>= 12; - vec->y >>= 12; - } - - - /* these macros return 0 for positive numbers, - and -1 for negative ones */ -#define FT_SIGN_LONG( x ) ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) ) -#define FT_SIGN_INT( x ) ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) ) -#define FT_SIGN_INT32( x ) ( (x) >> 31 ) -#define FT_SIGN_INT16( x ) ( (x) >> 15 ) - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( void ) - FT_Vector_Rotate( FT_Vector* vec, - FT_Angle angle ) - { - FT_Int shift; - FT_Vector v; - - - v.x = vec->x; - v.y = vec->y; - - if ( angle && ( v.x != 0 || v.y != 0 ) ) - { - shift = ft_trig_prenorm( &v ); - ft_trig_pseudo_rotate( &v, angle ); - v.x = ft_trig_downscale( v.x ); - v.y = ft_trig_downscale( v.y ); - - if ( shift > 0 ) - { - FT_Int32 half = (FT_Int32)1L << ( shift - 1 ); - - - vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift; - vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift; - } - else - { - shift = -shift; - vec->x = v.x << shift; - vec->y = v.y << shift; - } - } - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( FT_Fixed ) - FT_Vector_Length( FT_Vector* vec ) - { - FT_Int shift; - FT_Vector v; - - - v = *vec; - - /* handle trivial cases */ - if ( v.x == 0 ) - { - return ( v.y >= 0 ) ? v.y : -v.y; - } - else if ( v.y == 0 ) - { - return ( v.x >= 0 ) ? v.x : -v.x; - } - - /* general case */ - shift = ft_trig_prenorm( &v ); - ft_trig_pseudo_polarize( &v ); - - v.x = ft_trig_downscale( v.x ); - - if ( shift > 0 ) - return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift; - - return v.x << -shift; - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( void ) - FT_Vector_Polarize( FT_Vector* vec, - FT_Fixed *length, - FT_Angle *angle ) - { - FT_Int shift; - FT_Vector v; - - - v = *vec; - - if ( v.x == 0 && v.y == 0 ) - return; - - shift = ft_trig_prenorm( &v ); - ft_trig_pseudo_polarize( &v ); - - v.x = ft_trig_downscale( v.x ); - - *length = ( shift >= 0 ) ? ( v.x >> shift ) : ( v.x << -shift ); - *angle = v.y; - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( void ) - FT_Vector_From_Polar( FT_Vector* vec, - FT_Fixed length, - FT_Angle angle ) - { - vec->x = length; - vec->y = 0; - - FT_Vector_Rotate( vec, angle ); - } - - - /* documentation is in fttrigon.h */ - - FT_EXPORT_DEF( FT_Angle ) - FT_Angle_Diff( FT_Angle angle1, - FT_Angle angle2 ) - { - FT_Angle delta = angle2 - angle1; - - - delta %= FT_ANGLE_2PI; - if ( delta < 0 ) - delta += FT_ANGLE_2PI; - - if ( delta > FT_ANGLE_PI ) - delta -= FT_ANGLE_2PI; - - return delta; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftutil.c b/android/jni/ndk_modules/freetype/src/base/ftutil.c deleted file mode 100644 index 5f77be55..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftutil.c +++ /dev/null @@ -1,501 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftutil.c */ -/* */ -/* FreeType utility file for memory and list management (body). */ -/* */ -/* Copyright 2002, 2004, 2005, 2006, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_OBJECTS_H -#include FT_LIST_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_memory - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** *****/ - /***** M E M O R Y M A N A G E M E N T *****/ - /***** *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_BASE_DEF( FT_Pointer ) - ft_mem_alloc( FT_Memory memory, - FT_Long size, - FT_Error *p_error ) - { - FT_Error error; - FT_Pointer block = ft_mem_qalloc( memory, size, &error ); - - if ( !error && size > 0 ) - FT_MEM_ZERO( block, size ); - - *p_error = error; - return block; - } - - - FT_BASE_DEF( FT_Pointer ) - ft_mem_qalloc( FT_Memory memory, - FT_Long size, - FT_Error *p_error ) - { - FT_Error error = FT_Err_Ok; - FT_Pointer block = NULL; - - - if ( size > 0 ) - { - block = memory->alloc( memory, size ); - if ( block == NULL ) - error = FT_Err_Out_Of_Memory; - } - else if ( size < 0 ) - { - /* may help catch/prevent security issues */ - error = FT_Err_Invalid_Argument; - } - - *p_error = error; - return block; - } - - - FT_BASE_DEF( FT_Pointer ) - ft_mem_realloc( FT_Memory memory, - FT_Long item_size, - FT_Long cur_count, - FT_Long new_count, - void* block, - FT_Error *p_error ) - { - FT_Error error = FT_Err_Ok; - - block = ft_mem_qrealloc( memory, item_size, - cur_count, new_count, block, &error ); - if ( !error && new_count > cur_count ) - FT_MEM_ZERO( (char*)block + cur_count * item_size, - ( new_count - cur_count ) * item_size ); - - *p_error = error; - return block; - } - - - FT_BASE_DEF( FT_Pointer ) - ft_mem_qrealloc( FT_Memory memory, - FT_Long item_size, - FT_Long cur_count, - FT_Long new_count, - void* block, - FT_Error *p_error ) - { - FT_Error error = FT_Err_Ok; - - - /* Note that we now accept `item_size == 0' as a valid parameter, in - * order to cover very weird cases where an ALLOC_MULT macro would be - * called. - */ - if ( cur_count < 0 || new_count < 0 || item_size < 0 ) - { - /* may help catch/prevent nasty security issues */ - error = FT_Err_Invalid_Argument; - } - else if ( new_count == 0 || item_size == 0 ) - { - ft_mem_free( memory, block ); - block = NULL; - } - else if ( new_count > FT_INT_MAX/item_size ) - { - error = FT_Err_Array_Too_Large; - } - else if ( cur_count == 0 ) - { - FT_ASSERT( block == NULL ); - - block = ft_mem_alloc( memory, new_count*item_size, &error ); - } - else - { - FT_Pointer block2; - FT_Long cur_size = cur_count*item_size; - FT_Long new_size = new_count*item_size; - - - block2 = memory->realloc( memory, cur_size, new_size, block ); - if ( block2 == NULL ) - error = FT_Err_Out_Of_Memory; - else - block = block2; - } - - *p_error = error; - return block; - } - - - FT_BASE_DEF( void ) - ft_mem_free( FT_Memory memory, - const void *P ) - { - if ( P ) - memory->free( memory, (void*)P ); - } - - - FT_BASE_DEF( FT_Pointer ) - ft_mem_dup( FT_Memory memory, - const void* address, - FT_ULong size, - FT_Error *p_error ) - { - FT_Error error; - FT_Pointer p = ft_mem_qalloc( memory, size, &error ); - - - if ( !error && address ) - ft_memcpy( p, address, size ); - - *p_error = error; - return p; - } - - - FT_BASE_DEF( FT_Pointer ) - ft_mem_strdup( FT_Memory memory, - const char* str, - FT_Error *p_error ) - { - FT_ULong len = str ? (FT_ULong)ft_strlen( str ) + 1 - : 0; - - - return ft_mem_dup( memory, str, len, p_error ); - } - - - FT_BASE_DEF( FT_Int ) - ft_mem_strcpyn( char* dst, - const char* src, - FT_ULong size ) - { - while ( size > 1 && *src != 0 ) - { - *dst++ = *src++; - size--; - } - - *dst = 0; /* always zero-terminate */ - - return *src != 0; - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** *****/ - /***** D O U B L Y L I N K E D L I S T S *****/ - /***** *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - -#undef FT_COMPONENT -#define FT_COMPONENT trace_list - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( FT_ListNode ) - FT_List_Find( FT_List list, - void* data ) - { - FT_ListNode cur; - - - cur = list->head; - while ( cur ) - { - if ( cur->data == data ) - return cur; - - cur = cur->next; - } - - return (FT_ListNode)0; - } - - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( void ) - FT_List_Add( FT_List list, - FT_ListNode node ) - { - FT_ListNode before = list->tail; - - - node->next = 0; - node->prev = before; - - if ( before ) - before->next = node; - else - list->head = node; - - list->tail = node; - } - - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( void ) - FT_List_Insert( FT_List list, - FT_ListNode node ) - { - FT_ListNode after = list->head; - - - node->next = after; - node->prev = 0; - - if ( !after ) - list->tail = node; - else - after->prev = node; - - list->head = node; - } - - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( void ) - FT_List_Remove( FT_List list, - FT_ListNode node ) - { - FT_ListNode before, after; - - - before = node->prev; - after = node->next; - - if ( before ) - before->next = after; - else - list->head = after; - - if ( after ) - after->prev = before; - else - list->tail = before; - } - - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( void ) - FT_List_Up( FT_List list, - FT_ListNode node ) - { - FT_ListNode before, after; - - - before = node->prev; - after = node->next; - - /* check whether we are already on top of the list */ - if ( !before ) - return; - - before->next = after; - - if ( after ) - after->prev = before; - else - list->tail = before; - - node->prev = 0; - node->next = list->head; - list->head->prev = node; - list->head = node; - } - - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_List_Iterate( FT_List list, - FT_List_Iterator iterator, - void* user ) - { - FT_ListNode cur = list->head; - FT_Error error = FT_Err_Ok; - - - while ( cur ) - { - FT_ListNode next = cur->next; - - - error = iterator( cur, user ); - if ( error ) - break; - - cur = next; - } - - return error; - } - - - /* documentation is in ftlist.h */ - - FT_EXPORT_DEF( void ) - FT_List_Finalize( FT_List list, - FT_List_Destructor destroy, - FT_Memory memory, - void* user ) - { - FT_ListNode cur; - - - cur = list->head; - while ( cur ) - { - FT_ListNode next = cur->next; - void* data = cur->data; - - - if ( destroy ) - destroy( memory, data, user ); - - FT_FREE( cur ); - cur = next; - } - - list->head = 0; - list->tail = 0; - } - - - FT_BASE_DEF( FT_UInt32 ) - ft_highpow2( FT_UInt32 value ) - { - FT_UInt32 value2; - - - /* - * We simply clear the lowest bit in each iteration. When - * we reach 0, we know that the previous value was our result. - */ - for ( ;; ) - { - value2 = value & (value - 1); /* clear lowest bit */ - if ( value2 == 0 ) - break; - - value = value2; - } - return value; - } - - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - FT_BASE_DEF( FT_Error ) - FT_Alloc( FT_Memory memory, - FT_Long size, - void* *P ) - { - FT_Error error; - - - (void)FT_ALLOC( *P, size ); - return error; - } - - - FT_BASE_DEF( FT_Error ) - FT_QAlloc( FT_Memory memory, - FT_Long size, - void* *p ) - { - FT_Error error; - - - (void)FT_QALLOC( *p, size ); - return error; - } - - - FT_BASE_DEF( FT_Error ) - FT_Realloc( FT_Memory memory, - FT_Long current, - FT_Long size, - void* *P ) - { - FT_Error error; - - - (void)FT_REALLOC( *P, current, size ); - return error; - } - - - FT_BASE_DEF( FT_Error ) - FT_QRealloc( FT_Memory memory, - FT_Long current, - FT_Long size, - void* *p ) - { - FT_Error error; - - - (void)FT_QREALLOC( *p, current, size ); - return error; - } - - - FT_BASE_DEF( void ) - FT_Free( FT_Memory memory, - void* *P ) - { - if ( *P ) - FT_MEM_FREE( *P ); - } - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftwinfnt.c b/android/jni/ndk_modules/freetype/src/base/ftwinfnt.c deleted file mode 100644 index bc2e90e1..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftwinfnt.c +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftwinfnt.c */ -/* */ -/* FreeType API for accessing Windows FNT specific info (body). */ -/* */ -/* Copyright 2003, 2004 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_WINFONTS_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_WINFNT_H - - - /* documentation is in ftwinfnt.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_WinFNT_Header( FT_Face face, - FT_WinFNT_HeaderRec *header ) - { - FT_Service_WinFnt service; - FT_Error error; - - - error = FT_Err_Invalid_Argument; - - if ( face != NULL ) - { - FT_FACE_LOOKUP_SERVICE( face, service, WINFNT ); - - if ( service != NULL ) - { - error = service->get_header( face, header ); - } - } - - return error; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/base/ftxf86.c b/android/jni/ndk_modules/freetype/src/base/ftxf86.c deleted file mode 100644 index a4bf767d..00000000 --- a/android/jni/ndk_modules/freetype/src/base/ftxf86.c +++ /dev/null @@ -1,40 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftxf86.c */ -/* */ -/* FreeType utility file for X11 support (body). */ -/* */ -/* Copyright 2002, 2003, 2004 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_XFREE86_H -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_XFREE86_NAME_H - - - /* documentation is in ftxf86.h */ - - FT_EXPORT_DEF( const char* ) - FT_Get_X11_Font_Format( FT_Face face ) - { - const char* result = NULL; - - - if ( face ) - FT_FACE_FIND_SERVICE( face, result, XF86_NAME ); - - return result; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cff.c b/android/jni/ndk_modules/freetype/src/cff/cff.c deleted file mode 100644 index fccfd442..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cff.c +++ /dev/null @@ -1,30 +0,0 @@ -/***************************************************************************/ -/* */ -/* cff.c */ -/* */ -/* FreeType OpenType driver component (body only). */ -/* */ -/* Copyright 1996-2001, 2002 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "cffpic.c" -#include "cffdrivr.c" -#include "cffparse.c" -#include "cffload.c" -#include "cffobjs.c" -#include "cffgload.c" -#include "cffcmap.c" - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffcmap.c b/android/jni/ndk_modules/freetype/src/cff/cffcmap.c deleted file mode 100644 index 12983711..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffcmap.c +++ /dev/null @@ -1,208 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffcmap.c */ -/* */ -/* CFF character mapping table (cmap) support (body). */ -/* */ -/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include "cffcmap.h" -#include "cffload.h" - -#include "cfferrs.h" - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_CALLBACK_DEF( FT_Error ) - cff_cmap_encoding_init( CFF_CMapStd cmap ) - { - TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); - CFF_Font cff = (CFF_Font)face->extra.data; - CFF_Encoding encoding = &cff->encoding; - - - cmap->gids = encoding->codes; - - return 0; - } - - - FT_CALLBACK_DEF( void ) - cff_cmap_encoding_done( CFF_CMapStd cmap ) - { - cmap->gids = NULL; - } - - - FT_CALLBACK_DEF( FT_UInt ) - cff_cmap_encoding_char_index( CFF_CMapStd cmap, - FT_UInt32 char_code ) - { - FT_UInt result = 0; - - - if ( char_code < 256 ) - result = cmap->gids[char_code]; - - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - cff_cmap_encoding_char_next( CFF_CMapStd cmap, - FT_UInt32 *pchar_code ) - { - FT_UInt result = 0; - FT_UInt32 char_code = *pchar_code; - - - *pchar_code = 0; - - if ( char_code < 255 ) - { - FT_UInt code = (FT_UInt)(char_code + 1); - - - for (;;) - { - if ( code >= 256 ) - break; - - result = cmap->gids[code]; - if ( result != 0 ) - { - *pchar_code = code; - break; - } - - code++; - } - } - return result; - } - - - FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec, - sizeof ( CFF_CMapStdRec ), - - (FT_CMap_InitFunc) cff_cmap_encoding_init, - (FT_CMap_DoneFunc) cff_cmap_encoding_done, - (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, - (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, - - NULL, NULL, NULL, NULL, NULL - ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_CALLBACK_DEF( const char* ) - cff_sid_to_glyph_name( TT_Face face, - FT_UInt idx ) - { - CFF_Font cff = (CFF_Font)face->extra.data; - CFF_Charset charset = &cff->charset; - FT_UInt sid = charset->sids[idx]; - - - return cff_index_get_sid_string( cff, sid ); - } - - - FT_CALLBACK_DEF( FT_Error ) - cff_cmap_unicode_init( PS_Unicodes unicodes ) - { - TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); - CFF_Font cff = (CFF_Font)face->extra.data; - CFF_Charset charset = &cff->charset; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; - - - /* can't build Unicode map for CID-keyed font */ - /* because we don't know glyph names. */ - if ( !charset->sids ) - return CFF_Err_No_Unicode_Glyph_Name; - - return psnames->unicodes_init( memory, - unicodes, - cff->num_glyphs, - (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name, - (PS_FreeGlyphNameFunc)NULL, - (FT_Pointer)face ); - } - - - FT_CALLBACK_DEF( void ) - cff_cmap_unicode_done( PS_Unicodes unicodes ) - { - FT_Face face = FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); - - - FT_FREE( unicodes->maps ); - unicodes->num_maps = 0; - } - - - FT_CALLBACK_DEF( FT_UInt ) - cff_cmap_unicode_char_index( PS_Unicodes unicodes, - FT_UInt32 char_code ) - { - TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); - CFF_Font cff = (CFF_Font)face->extra.data; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; - - - return psnames->unicodes_char_index( unicodes, char_code ); - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - cff_cmap_unicode_char_next( PS_Unicodes unicodes, - FT_UInt32 *pchar_code ) - { - TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); - CFF_Font cff = (CFF_Font)face->extra.data; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; - - - return psnames->unicodes_char_next( unicodes, pchar_code ); - } - - - FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec, - sizeof ( PS_UnicodesRec ), - - (FT_CMap_InitFunc) cff_cmap_unicode_init, - (FT_CMap_DoneFunc) cff_cmap_unicode_done, - (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, - (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, - - NULL, NULL, NULL, NULL, NULL - ) - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffcmap.h b/android/jni/ndk_modules/freetype/src/cff/cffcmap.h deleted file mode 100644 index 3f7f67bb..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffcmap.h +++ /dev/null @@ -1,67 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffcmap.h */ -/* */ -/* CFF character mapping table (cmap) support (specification). */ -/* */ -/* Copyright 2002, 2003, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CFFCMAP_H__ -#define __CFFCMAP_H__ - -#include "cffobjs.h" - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* standard (and expert) encoding cmaps */ - typedef struct CFF_CMapStdRec_* CFF_CMapStd; - - typedef struct CFF_CMapStdRec_ - { - FT_CMapRec cmap; - FT_UShort* gids; /* up to 256 elements */ - - } CFF_CMapStdRec; - - - FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* unicode (synthetic) cmaps */ - - FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec) - - -FT_END_HEADER - -#endif /* __CFFCMAP_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffdrivr.c b/android/jni/ndk_modules/freetype/src/cff/cffdrivr.c deleted file mode 100644 index 39f04ee1..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffdrivr.c +++ /dev/null @@ -1,671 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffdrivr.c */ -/* */ -/* OpenType font driver implementation (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_SERVICE_CID_H -#include FT_SERVICE_POSTSCRIPT_INFO_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_TT_CMAP_H - -#include "cffdrivr.h" -#include "cffgload.h" -#include "cffload.h" -#include "cffcmap.h" -#include "cffparse.h" - -#include "cfferrs.h" -#include "cffpic.h" - -#include FT_SERVICE_XFREE86_NAME_H -#include FT_SERVICE_GLYPH_DICT_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cffdriver - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** F A C E S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#undef PAIR_TAG -#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \ - (FT_ULong)right ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_get_kerning */ - /* */ - /* <Description> */ - /* A driver method used to return the kerning vector between two */ - /* glyphs of the same face. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* left_glyph :: The index of the left glyph in the kern pair. */ - /* */ - /* right_glyph :: The index of the right glyph in the kern pair. */ - /* */ - /* <Output> */ - /* kerning :: The kerning vector. This is in font units for */ - /* scalable formats, and in pixels for fixed-sizes */ - /* formats. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* Only horizontal layouts (left-to-right & right-to-left) are */ - /* supported by this function. Other layouts, or more sophisticated */ - /* kernings, are out of scope of this method (the basic driver */ - /* interface is meant to be simple). */ - /* */ - /* They can be implemented by format-specific interfaces. */ - /* */ - FT_CALLBACK_DEF( FT_Error ) - cff_get_kerning( FT_Face ttface, /* TT_Face */ - FT_UInt left_glyph, - FT_UInt right_glyph, - FT_Vector* kerning ) - { - TT_Face face = (TT_Face)ttface; - SFNT_Service sfnt = (SFNT_Service)face->sfnt; - - - kerning->x = 0; - kerning->y = 0; - - if ( sfnt ) - kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); - - return CFF_Err_Ok; - } - - -#undef PAIR_TAG - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Load_Glyph */ - /* */ - /* <Description> */ - /* A driver method used to load a glyph within a given glyph slot. */ - /* */ - /* <Input> */ - /* slot :: A handle to the target slot object where the glyph */ - /* will be loaded. */ - /* */ - /* size :: A handle to the source face size at which the glyph */ - /* must be scaled, loaded, etc. */ - /* */ - /* glyph_index :: The index of the glyph in the font file. */ - /* */ - /* load_flags :: A flag indicating what to load for this glyph. The */ - /* FT_LOAD_??? constants can be used to control the */ - /* glyph loading process (e.g., whether the outline */ - /* should be scaled, whether to load bitmaps or not, */ - /* whether to hint the outline, etc). */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_CALLBACK_DEF( FT_Error ) - Load_Glyph( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */ - FT_Size cffsize, /* CFF_Size */ - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_Error error; - CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot; - CFF_Size size = (CFF_Size)cffsize; - - - if ( !slot ) - return CFF_Err_Invalid_Slot_Handle; - - /* check whether we want a scaled outline or bitmap */ - if ( !size ) - load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; - - /* reset the size object if necessary */ - if ( load_flags & FT_LOAD_NO_SCALE ) - size = NULL; - - if ( size ) - { - /* these two objects must have the same parent */ - if ( cffsize->face != cffslot->face ) - return CFF_Err_Invalid_Face_Handle; - } - - /* now load the glyph outline if necessary */ - error = cff_slot_load( slot, size, glyph_index, load_flags ); - - /* force drop-out mode to 2 - irrelevant now */ - /* slot->outline.dropout_mode = 2; */ - - return error; - } - - - FT_CALLBACK_DEF( FT_Error ) - cff_get_advances( FT_Face face, - FT_UInt start, - FT_UInt count, - FT_Int32 flags, - FT_Fixed* advances ) - { - FT_UInt nn; - FT_Error error = CFF_Err_Ok; - FT_GlyphSlot slot = face->glyph; - - - flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; - - for ( nn = 0; nn < count; nn++ ) - { - error = Load_Glyph( slot, face->size, start + nn, flags ); - if ( error ) - break; - - advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) - ? slot->linearVertAdvance - : slot->linearHoriAdvance; - } - - return error; - } - - - /* - * GLYPH DICT SERVICE - * - */ - - static FT_Error - cff_get_glyph_name( CFF_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ) - { - CFF_Font font = (CFF_Font)face->extra.data; - FT_String* gname; - FT_UShort sid; - FT_Error error; - - - if ( !font->psnames ) - { - FT_ERROR(( "cff_get_glyph_name:" - " cannot get glyph name from CFF & CEF fonts\n" - " " - " without the `PSNames' module\n" )); - error = CFF_Err_Unknown_File_Format; - goto Exit; - } - - /* first, locate the sid in the charset table */ - sid = font->charset.sids[glyph_index]; - - /* now, lookup the name itself */ - gname = cff_index_get_sid_string( font, sid ); - - if ( gname ) - FT_STRCPYN( buffer, gname, buffer_max ); - - error = CFF_Err_Ok; - - Exit: - return error; - } - - - static FT_UInt - cff_get_name_index( CFF_Face face, - FT_String* glyph_name ) - { - CFF_Font cff; - CFF_Charset charset; - FT_Service_PsCMaps psnames; - FT_String* name; - FT_UShort sid; - FT_UInt i; - - - cff = (CFF_FontRec *)face->extra.data; - charset = &cff->charset; - - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); - if ( !psnames ) - return 0; - - for ( i = 0; i < cff->num_glyphs; i++ ) - { - sid = charset->sids[i]; - - if ( sid > 390 ) - name = cff_index_get_string( cff, sid - 391 ); - else - name = (FT_String *)psnames->adobe_std_strings( sid ); - - if ( !name ) - continue; - - if ( !ft_strcmp( glyph_name, name ) ) - return i; - } - - return 0; - } - - - FT_DEFINE_SERVICE_GLYPHDICTREC(cff_service_glyph_dict, - (FT_GlyphDict_GetNameFunc) cff_get_glyph_name, - (FT_GlyphDict_NameIndexFunc)cff_get_name_index - ) - - - /* - * POSTSCRIPT INFO SERVICE - * - */ - - static FT_Int - cff_ps_has_glyph_names( FT_Face face ) - { - return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0; - } - - - static FT_Error - cff_ps_get_font_info( CFF_Face face, - PS_FontInfoRec* afont_info ) - { - CFF_Font cff = (CFF_Font)face->extra.data; - FT_Error error = CFF_Err_Ok; - - - if ( cff && cff->font_info == NULL ) - { - CFF_FontRecDict dict = &cff->top_font.font_dict; - PS_FontInfoRec *font_info; - FT_Memory memory = face->root.memory; - - - if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) ) - goto Fail; - - font_info->version = cff_index_get_sid_string( cff, - dict->version ); - font_info->notice = cff_index_get_sid_string( cff, - dict->notice ); - font_info->full_name = cff_index_get_sid_string( cff, - dict->full_name ); - font_info->family_name = cff_index_get_sid_string( cff, - dict->family_name ); - font_info->weight = cff_index_get_sid_string( cff, - dict->weight ); - font_info->italic_angle = dict->italic_angle; - font_info->is_fixed_pitch = dict->is_fixed_pitch; - font_info->underline_position = (FT_Short)dict->underline_position; - font_info->underline_thickness = (FT_Short)dict->underline_thickness; - - cff->font_info = font_info; - } - - if ( cff ) - *afont_info = *cff->font_info; - - Fail: - return error; - } - - - FT_DEFINE_SERVICE_PSINFOREC(cff_service_ps_info, - (PS_GetFontInfoFunc) cff_ps_get_font_info, - (PS_GetFontExtraFunc) NULL, - (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, - (PS_GetFontPrivateFunc)NULL /* unsupported with CFF fonts */ - ) - - - /* - * POSTSCRIPT NAME SERVICE - * - */ - - static const char* - cff_get_ps_name( CFF_Face face ) - { - CFF_Font cff = (CFF_Font)face->extra.data; - - - return (const char*)cff->font_name; - } - - - FT_DEFINE_SERVICE_PSFONTNAMEREC(cff_service_ps_name, - (FT_PsName_GetFunc)cff_get_ps_name - ) - - - /* - * TT CMAP INFO - * - * If the charmap is a synthetic Unicode encoding cmap or - * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO - * service defined in SFNT module. - * - * Otherwise call the service function in the sfnt module. - * - */ - static FT_Error - cff_get_cmap_info( FT_CharMap charmap, - TT_CMapInfo *cmap_info ) - { - FT_CMap cmap = FT_CMAP( charmap ); - FT_Error error = CFF_Err_Ok; - FT_Face face = FT_CMAP_FACE( cmap ); - FT_Library library = FT_FACE_LIBRARY( face ); - - - cmap_info->language = 0; - cmap_info->format = 0; - - if ( cmap->clazz != &FT_CFF_CMAP_ENCODING_CLASS_REC_GET && - cmap->clazz != &FT_CFF_CMAP_UNICODE_CLASS_REC_GET ) - { - FT_Module sfnt = FT_Get_Module( library, "sfnt" ); - FT_Service_TTCMaps service = - (FT_Service_TTCMaps)ft_module_get_service( sfnt, - FT_SERVICE_ID_TT_CMAP ); - - - if ( service && service->get_cmap_info ) - error = service->get_cmap_info( charmap, cmap_info ); - } - - return error; - } - - - FT_DEFINE_SERVICE_TTCMAPSREC(cff_service_get_cmap_info, - (TT_CMap_Info_GetFunc)cff_get_cmap_info - ) - - - /* - * CID INFO SERVICE - * - */ - static FT_Error - cff_get_ros( CFF_Face face, - const char* *registry, - const char* *ordering, - FT_Int *supplement ) - { - FT_Error error = CFF_Err_Ok; - CFF_Font cff = (CFF_Font)face->extra.data; - - - if ( cff ) - { - CFF_FontRecDict dict = &cff->top_font.font_dict; - - - if ( dict->cid_registry == 0xFFFFU ) - { - error = CFF_Err_Invalid_Argument; - goto Fail; - } - - if ( registry ) - { - if ( cff->registry == NULL ) - cff->registry = cff_index_get_sid_string( cff, - dict->cid_registry ); - *registry = cff->registry; - } - - if ( ordering ) - { - if ( cff->ordering == NULL ) - cff->ordering = cff_index_get_sid_string( cff, - dict->cid_ordering ); - *ordering = cff->ordering; - } - - /* - * XXX: According to Adobe TechNote #5176, the supplement in CFF - * can be a real number. We truncate it to fit public API - * since freetype-2.3.6. - */ - if ( supplement ) - { - if ( dict->cid_supplement < FT_INT_MIN || - dict->cid_supplement > FT_INT_MAX ) - FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n", - dict->cid_supplement )); - *supplement = (FT_Int)dict->cid_supplement; - } - } - - Fail: - return error; - } - - - static FT_Error - cff_get_is_cid( CFF_Face face, - FT_Bool *is_cid ) - { - FT_Error error = CFF_Err_Ok; - CFF_Font cff = (CFF_Font)face->extra.data; - - - *is_cid = 0; - - if ( cff ) - { - CFF_FontRecDict dict = &cff->top_font.font_dict; - - - if ( dict->cid_registry != 0xFFFFU ) - *is_cid = 1; - } - - return error; - } - - - static FT_Error - cff_get_cid_from_glyph_index( CFF_Face face, - FT_UInt glyph_index, - FT_UInt *cid ) - { - FT_Error error = CFF_Err_Ok; - CFF_Font cff; - - - cff = (CFF_Font)face->extra.data; - - if ( cff ) - { - FT_UInt c; - CFF_FontRecDict dict = &cff->top_font.font_dict; - - - if ( dict->cid_registry == 0xFFFFU ) - { - error = CFF_Err_Invalid_Argument; - goto Fail; - } - - if ( glyph_index > cff->num_glyphs ) - { - error = CFF_Err_Invalid_Argument; - goto Fail; - } - - c = cff->charset.sids[glyph_index]; - - if ( cid ) - *cid = c; - } - - Fail: - return error; - } - - - FT_DEFINE_SERVICE_CIDREC(cff_service_cid_info, - (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros, - (FT_CID_GetIsInternallyCIDKeyedFunc) cff_get_is_cid, - (FT_CID_GetCIDFromGlyphIndexFunc) cff_get_cid_from_glyph_index - ) - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** D R I V E R I N T E R F A C E ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ -#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES - FT_DEFINE_SERVICEDESCREC6(cff_services, - FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF, - FT_SERVICE_ID_POSTSCRIPT_INFO, &FT_CFF_SERVICE_PS_INFO_GET, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET, - FT_SERVICE_ID_GLYPH_DICT, &FT_CFF_SERVICE_GLYPH_DICT_GET, - FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET, - FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_GET - ) -#else - FT_DEFINE_SERVICEDESCREC5(cff_services, - FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF, - FT_SERVICE_ID_POSTSCRIPT_INFO, &FT_CFF_SERVICE_PS_INFO_GET, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET, - FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET, - FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_GET - ) -#endif - - FT_CALLBACK_DEF( FT_Module_Interface ) - cff_get_interface( FT_Module driver, /* CFF_Driver */ - const char* module_interface ) - { - FT_Module sfnt; - FT_Module_Interface result; - - - result = ft_service_list_lookup( FT_CFF_SERVICES_GET, module_interface ); - if ( result != NULL ) - return result; - - if ( !driver ) - return NULL; - - /* we pass our request to the `sfnt' module */ - sfnt = FT_Get_Module( driver->library, "sfnt" ); - - return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; - } - - - /* The FT_DriverInterface structure is defined in ftdriver.h. */ - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS -#define CFF_SIZE_SELECT cff_size_select -#else -#define CFF_SIZE_SELECT 0 -#endif - - FT_DEFINE_DRIVER(cff_driver_class, - FT_MODULE_FONT_DRIVER | - FT_MODULE_DRIVER_SCALABLE | - FT_MODULE_DRIVER_HAS_HINTER, - - sizeof( CFF_DriverRec ), - "cff", - 0x10000L, - 0x20000L, - - 0, /* module-specific interface */ - - cff_driver_init, - cff_driver_done, - cff_get_interface, - - /* now the specific driver fields */ - sizeof( TT_FaceRec ), - sizeof( CFF_SizeRec ), - sizeof( CFF_GlyphSlotRec ), - - cff_face_init, - cff_face_done, - cff_size_init, - cff_size_done, - cff_slot_init, - cff_slot_done, - - ft_stub_set_char_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - Load_Glyph, - - cff_get_kerning, - 0, /* FT_Face_AttachFunc */ - cff_get_advances, /* FT_Face_GetAdvancesFunc */ - - cff_size_request, - - CFF_SIZE_SELECT - ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffdrivr.h b/android/jni/ndk_modules/freetype/src/cff/cffdrivr.h deleted file mode 100644 index 50e81387..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffdrivr.h +++ /dev/null @@ -1,38 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffdrivr.h */ -/* */ -/* High-level OpenType driver interface (specification). */ -/* */ -/* Copyright 1996-2001, 2002 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CFFDRIVER_H__ -#define __CFFDRIVER_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_DRIVER_H - - -FT_BEGIN_HEADER - - - FT_DECLARE_DRIVER( cff_driver_class ) - - -FT_END_HEADER - -#endif /* __CFFDRIVER_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cfferrs.h b/android/jni/ndk_modules/freetype/src/cff/cfferrs.h deleted file mode 100644 index 1b2a5c95..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cfferrs.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* cfferrs.h */ -/* */ -/* CFF error codes (specification only). */ -/* */ -/* Copyright 2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the CFF error enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __CFFERRS_H__ -#define __CFFERRS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#define FT_ERR_PREFIX CFF_Err_ -#define FT_ERR_BASE FT_Mod_Err_CFF - - -#include FT_ERRORS_H - -#endif /* __CFFERRS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffgload.c b/android/jni/ndk_modules/freetype/src/cff/cffgload.c deleted file mode 100644 index e99ee706..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffgload.c +++ /dev/null @@ -1,2972 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffgload.c */ -/* */ -/* OpenType Glyph Loader (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_OUTLINE_H - -#include "cffobjs.h" -#include "cffload.h" -#include "cffgload.h" - -#include "cfferrs.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cffgload - - - typedef enum CFF_Operator_ - { - cff_op_unknown = 0, - - cff_op_rmoveto, - cff_op_hmoveto, - cff_op_vmoveto, - - cff_op_rlineto, - cff_op_hlineto, - cff_op_vlineto, - - cff_op_rrcurveto, - cff_op_hhcurveto, - cff_op_hvcurveto, - cff_op_rcurveline, - cff_op_rlinecurve, - cff_op_vhcurveto, - cff_op_vvcurveto, - - cff_op_flex, - cff_op_hflex, - cff_op_hflex1, - cff_op_flex1, - - cff_op_endchar, - - cff_op_hstem, - cff_op_vstem, - cff_op_hstemhm, - cff_op_vstemhm, - - cff_op_hintmask, - cff_op_cntrmask, - cff_op_dotsection, /* deprecated, acts as no-op */ - - cff_op_abs, - cff_op_add, - cff_op_sub, - cff_op_div, - cff_op_neg, - cff_op_random, - cff_op_mul, - cff_op_sqrt, - - cff_op_blend, - - cff_op_drop, - cff_op_exch, - cff_op_index, - cff_op_roll, - cff_op_dup, - - cff_op_put, - cff_op_get, - cff_op_store, - cff_op_load, - - cff_op_and, - cff_op_or, - cff_op_not, - cff_op_eq, - cff_op_ifelse, - - cff_op_callsubr, - cff_op_callgsubr, - cff_op_return, - - /* Type 1 opcodes: invalid but seen in real life */ - cff_op_hsbw, - cff_op_closepath, - cff_op_callothersubr, - cff_op_pop, - cff_op_seac, - cff_op_sbw, - cff_op_setcurrentpoint, - - /* do not remove */ - cff_op_max - - } CFF_Operator; - - -#define CFF_COUNT_CHECK_WIDTH 0x80 -#define CFF_COUNT_EXACT 0x40 -#define CFF_COUNT_CLEAR_STACK 0x20 - - /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are */ - /* used for checking the width and requested numbers of arguments */ - /* only; they are set to zero afterwards */ - - /* the other two flags are informative only and unused currently */ - - static const FT_Byte cff_argument_counts[] = - { - 0, /* unknown */ - - 2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */ - 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, - 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, - - 0 | CFF_COUNT_CLEAR_STACK, /* rlineto */ - 0 | CFF_COUNT_CLEAR_STACK, - 0 | CFF_COUNT_CLEAR_STACK, - - 0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */ - 0 | CFF_COUNT_CLEAR_STACK, - 0 | CFF_COUNT_CLEAR_STACK, - 0 | CFF_COUNT_CLEAR_STACK, - 0 | CFF_COUNT_CLEAR_STACK, - 0 | CFF_COUNT_CLEAR_STACK, - 0 | CFF_COUNT_CLEAR_STACK, - - 13, /* flex */ - 7, - 9, - 11, - - 0 | CFF_COUNT_CHECK_WIDTH, /* endchar */ - - 2 | CFF_COUNT_CHECK_WIDTH, /* hstem */ - 2 | CFF_COUNT_CHECK_WIDTH, - 2 | CFF_COUNT_CHECK_WIDTH, - 2 | CFF_COUNT_CHECK_WIDTH, - - 0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */ - 0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */ - 0, /* dotsection */ - - 1, /* abs */ - 2, - 2, - 2, - 1, - 0, - 2, - 1, - - 1, /* blend */ - - 1, /* drop */ - 2, - 1, - 2, - 1, - - 2, /* put */ - 1, - 4, - 3, - - 2, /* and */ - 2, - 1, - 2, - 4, - - 1, /* callsubr */ - 1, - 0, - - 2, /* hsbw */ - 0, - 0, - 0, - 5, /* seac */ - 4, /* sbw */ - 2 /* setcurrentpoint */ - }; - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /********** *********/ - /********** *********/ - /********** GENERIC CHARSTRING PARSING *********/ - /********** *********/ - /********** *********/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_builder_init */ - /* */ - /* <Description> */ - /* Initializes a given glyph builder. */ - /* */ - /* <InOut> */ - /* builder :: A pointer to the glyph builder to initialize. */ - /* */ - /* <Input> */ - /* face :: The current face object. */ - /* */ - /* size :: The current size object. */ - /* */ - /* glyph :: The current glyph object. */ - /* */ - /* hinting :: Whether hinting is active. */ - /* */ - static void - cff_builder_init( CFF_Builder* builder, - TT_Face face, - CFF_Size size, - CFF_GlyphSlot glyph, - FT_Bool hinting ) - { - builder->path_begun = 0; - builder->load_points = 1; - - builder->face = face; - builder->glyph = glyph; - builder->memory = face->root.memory; - - if ( glyph ) - { - FT_GlyphLoader loader = glyph->root.internal->loader; - - - builder->loader = loader; - builder->base = &loader->base.outline; - builder->current = &loader->current.outline; - FT_GlyphLoader_Rewind( loader ); - - builder->hints_globals = 0; - builder->hints_funcs = 0; - - if ( hinting && size ) - { - CFF_Internal internal = (CFF_Internal)size->root.internal; - - - builder->hints_globals = (void *)internal->topfont; - builder->hints_funcs = glyph->root.internal->glyph_hints; - } - } - - builder->pos_x = 0; - builder->pos_y = 0; - - builder->left_bearing.x = 0; - builder->left_bearing.y = 0; - builder->advance.x = 0; - builder->advance.y = 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_builder_done */ - /* */ - /* <Description> */ - /* Finalizes a given glyph builder. Its contents can still be used */ - /* after the call, but the function saves important information */ - /* within the corresponding glyph slot. */ - /* */ - /* <Input> */ - /* builder :: A pointer to the glyph builder to finalize. */ - /* */ - static void - cff_builder_done( CFF_Builder* builder ) - { - CFF_GlyphSlot glyph = builder->glyph; - - - if ( glyph ) - glyph->root.outline = *builder->base; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_compute_bias */ - /* */ - /* <Description> */ - /* Computes the bias value in dependence of the number of glyph */ - /* subroutines. */ - /* */ - /* <Input> */ - /* in_charstring_type :: The `CharstringType' value of the top DICT */ - /* dictionary. */ - /* */ - /* num_subrs :: The number of glyph subroutines. */ - /* */ - /* <Return> */ - /* The bias value. */ - static FT_Int - cff_compute_bias( FT_Int in_charstring_type, - FT_UInt num_subrs ) - { - FT_Int result; - - - if ( in_charstring_type == 1 ) - result = 0; - else if ( num_subrs < 1240 ) - result = 107; - else if ( num_subrs < 33900U ) - result = 1131; - else - result = 32768U; - - return result; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_decoder_init */ - /* */ - /* <Description> */ - /* Initializes a given glyph decoder. */ - /* */ - /* <InOut> */ - /* decoder :: A pointer to the glyph builder to initialize. */ - /* */ - /* <Input> */ - /* face :: The current face object. */ - /* */ - /* size :: The current size object. */ - /* */ - /* slot :: The current glyph object. */ - /* */ - /* hinting :: Whether hinting is active. */ - /* */ - /* hint_mode :: The hinting mode. */ - /* */ - FT_LOCAL_DEF( void ) - cff_decoder_init( CFF_Decoder* decoder, - TT_Face face, - CFF_Size size, - CFF_GlyphSlot slot, - FT_Bool hinting, - FT_Render_Mode hint_mode ) - { - CFF_Font cff = (CFF_Font)face->extra.data; - - - /* clear everything */ - FT_MEM_ZERO( decoder, sizeof ( *decoder ) ); - - /* initialize builder */ - cff_builder_init( &decoder->builder, face, size, slot, hinting ); - - /* initialize Type2 decoder */ - decoder->cff = cff; - decoder->num_globals = cff->global_subrs_index.count; - decoder->globals = cff->global_subrs; - decoder->globals_bias = cff_compute_bias( - cff->top_font.font_dict.charstring_type, - decoder->num_globals ); - - decoder->hint_mode = hint_mode; - } - - - /* this function is used to select the subfont */ - /* and the locals subrs array */ - FT_LOCAL_DEF( FT_Error ) - cff_decoder_prepare( CFF_Decoder* decoder, - CFF_Size size, - FT_UInt glyph_index ) - { - CFF_Builder *builder = &decoder->builder; - CFF_Font cff = (CFF_Font)builder->face->extra.data; - CFF_SubFont sub = &cff->top_font; - FT_Error error = CFF_Err_Ok; - - - /* manage CID fonts */ - if ( cff->num_subfonts ) - { - FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, glyph_index ); - - - if ( fd_index >= cff->num_subfonts ) - { - FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" )); - error = CFF_Err_Invalid_File_Format; - goto Exit; - } - - FT_TRACE3(( "glyph index %d (subfont %d):\n", glyph_index, fd_index )); - - sub = cff->subfonts[fd_index]; - - if ( builder->hints_funcs && size ) - { - CFF_Internal internal = (CFF_Internal)size->root.internal; - - - /* for CFFs without subfonts, this value has already been set */ - builder->hints_globals = (void *)internal->subfonts[fd_index]; - } - } -#ifdef FT_DEBUG_LEVEL_TRACE - else - FT_TRACE3(( "glyph index %d:\n", glyph_index )); -#endif - - decoder->num_locals = sub->local_subrs_index.count; - decoder->locals = sub->local_subrs; - decoder->locals_bias = cff_compute_bias( - decoder->cff->top_font.font_dict.charstring_type, - decoder->num_locals ); - - decoder->glyph_width = sub->private_dict.default_width; - decoder->nominal_width = sub->private_dict.nominal_width; - - Exit: - return error; - } - - - /* check that there is enough space for `count' more points */ - static FT_Error - check_points( CFF_Builder* builder, - FT_Int count ) - { - return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); - } - - - /* add a new point, do not check space */ - static void - cff_builder_add_point( CFF_Builder* builder, - FT_Pos x, - FT_Pos y, - FT_Byte flag ) - { - FT_Outline* outline = builder->current; - - - if ( builder->load_points ) - { - FT_Vector* point = outline->points + outline->n_points; - FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; - - - point->x = x >> 16; - point->y = y >> 16; - *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); - } - - outline->n_points++; - } - - - /* check space for a new on-curve point, then add it */ - static FT_Error - cff_builder_add_point1( CFF_Builder* builder, - FT_Pos x, - FT_Pos y ) - { - FT_Error error; - - - error = check_points( builder, 1 ); - if ( !error ) - cff_builder_add_point( builder, x, y, 1 ); - - return error; - } - - - /* check space for a new contour, then add it */ - static FT_Error - cff_builder_add_contour( CFF_Builder* builder ) - { - FT_Outline* outline = builder->current; - FT_Error error; - - - if ( !builder->load_points ) - { - outline->n_contours++; - return CFF_Err_Ok; - } - - error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); - if ( !error ) - { - if ( outline->n_contours > 0 ) - outline->contours[outline->n_contours - 1] = - (short)( outline->n_points - 1 ); - - outline->n_contours++; - } - - return error; - } - - - /* if a path was begun, add its first on-curve point */ - static FT_Error - cff_builder_start_point( CFF_Builder* builder, - FT_Pos x, - FT_Pos y ) - { - FT_Error error = CFF_Err_Ok; - - - /* test whether we are building a new contour */ - if ( !builder->path_begun ) - { - builder->path_begun = 1; - error = cff_builder_add_contour( builder ); - if ( !error ) - error = cff_builder_add_point1( builder, x, y ); - } - - return error; - } - - - /* close the current contour */ - static void - cff_builder_close_contour( CFF_Builder* builder ) - { - FT_Outline* outline = builder->current; - FT_Int first; - - - if ( !outline ) - return; - - first = outline->n_contours <= 1 - ? 0 : outline->contours[outline->n_contours - 2] + 1; - - /* We must not include the last point in the path if it */ - /* is located on the first point. */ - if ( outline->n_points > 1 ) - { - FT_Vector* p1 = outline->points + first; - FT_Vector* p2 = outline->points + outline->n_points - 1; - FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; - - - /* `delete' last point only if it coincides with the first */ - /* point and if it is not a control point (which can happen). */ - if ( p1->x == p2->x && p1->y == p2->y ) - if ( *control == FT_CURVE_TAG_ON ) - outline->n_points--; - } - - if ( outline->n_contours > 0 ) - { - /* Don't add contours only consisting of one point, i.e., */ - /* check whether begin point and last point are the same. */ - if ( first == outline->n_points - 1 ) - { - outline->n_contours--; - outline->n_points--; - } - else - outline->contours[outline->n_contours - 1] = - (short)( outline->n_points - 1 ); - } - } - - - static FT_Int - cff_lookup_glyph_by_stdcharcode( CFF_Font cff, - FT_Int charcode ) - { - FT_UInt n; - FT_UShort glyph_sid; - - - /* CID-keyed fonts don't have glyph names */ - if ( !cff->charset.sids ) - return -1; - - /* check range of standard char code */ - if ( charcode < 0 || charcode > 255 ) - return -1; - - /* Get code to SID mapping from `cff_standard_encoding'. */ - glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode ); - - for ( n = 0; n < cff->num_glyphs; n++ ) - { - if ( cff->charset.sids[n] == glyph_sid ) - return n; - } - - return -1; - } - - - static FT_Error - cff_get_glyph_data( TT_Face face, - FT_UInt glyph_index, - FT_Byte** pointer, - FT_ULong* length ) - { -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* For incremental fonts get the character data using the */ - /* callback function. */ - if ( face->root.internal->incremental_interface ) - { - FT_Data data; - FT_Error error = - face->root.internal->incremental_interface->funcs->get_glyph_data( - face->root.internal->incremental_interface->object, - glyph_index, &data ); - - - *pointer = (FT_Byte*)data.pointer; - *length = data.length; - - return error; - } - else -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - { - CFF_Font cff = (CFF_Font)(face->extra.data); - - - return cff_index_access_element( &cff->charstrings_index, glyph_index, - pointer, length ); - } - } - - - static void - cff_free_glyph_data( TT_Face face, - FT_Byte** pointer, - FT_ULong length ) - { -#ifndef FT_CONFIG_OPTION_INCREMENTAL - FT_UNUSED( length ); -#endif - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* For incremental fonts get the character data using the */ - /* callback function. */ - if ( face->root.internal->incremental_interface ) - { - FT_Data data; - - - data.pointer = *pointer; - data.length = length; - - face->root.internal->incremental_interface->funcs->free_glyph_data( - face->root.internal->incremental_interface->object, &data ); - } - else -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - { - CFF_Font cff = (CFF_Font)(face->extra.data); - - - cff_index_forget_element( &cff->charstrings_index, pointer ); - } - } - - - static FT_Error - cff_operator_seac( CFF_Decoder* decoder, - FT_Pos asb, - FT_Pos adx, - FT_Pos ady, - FT_Int bchar, - FT_Int achar ) - { - FT_Error error; - CFF_Builder* builder = &decoder->builder; - FT_Int bchar_index, achar_index; - TT_Face face = decoder->builder.face; - FT_Vector left_bearing, advance; - FT_Byte* charstring; - FT_ULong charstring_len; - FT_Pos glyph_width; - - - if ( decoder->seac ) - { - FT_ERROR(( "cff_operator_seac: invalid nested seac\n" )); - return CFF_Err_Syntax_Error; - } - - adx += decoder->builder.left_bearing.x; - ady += decoder->builder.left_bearing.y; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* Incremental fonts don't necessarily have valid charsets. */ - /* They use the character code, not the glyph index, in this case. */ - if ( face->root.internal->incremental_interface ) - { - bchar_index = bchar; - achar_index = achar; - } - else -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - { - CFF_Font cff = (CFF_Font)(face->extra.data); - - - bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar ); - achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar ); - } - - if ( bchar_index < 0 || achar_index < 0 ) - { - FT_ERROR(( "cff_operator_seac:" - " invalid seac character code arguments\n" )); - return CFF_Err_Syntax_Error; - } - - /* If we are trying to load a composite glyph, do not load the */ - /* accent character and return the array of subglyphs. */ - if ( builder->no_recurse ) - { - FT_GlyphSlot glyph = (FT_GlyphSlot)builder->glyph; - FT_GlyphLoader loader = glyph->internal->loader; - FT_SubGlyph subg; - - - /* reallocate subglyph array if necessary */ - error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); - if ( error ) - goto Exit; - - subg = loader->current.subglyphs; - - /* subglyph 0 = base character */ - subg->index = bchar_index; - subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | - FT_SUBGLYPH_FLAG_USE_MY_METRICS; - subg->arg1 = 0; - subg->arg2 = 0; - subg++; - - /* subglyph 1 = accent character */ - subg->index = achar_index; - subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; - subg->arg1 = (FT_Int)( adx >> 16 ); - subg->arg2 = (FT_Int)( ady >> 16 ); - - /* set up remaining glyph fields */ - glyph->num_subglyphs = 2; - glyph->subglyphs = loader->base.subglyphs; - glyph->format = FT_GLYPH_FORMAT_COMPOSITE; - - loader->current.num_subglyphs = 2; - } - - FT_GlyphLoader_Prepare( builder->loader ); - - /* First load `bchar' in builder */ - error = cff_get_glyph_data( face, bchar_index, - &charstring, &charstring_len ); - if ( !error ) - { - /* the seac operator must not be nested */ - decoder->seac = TRUE; - error = cff_decoder_parse_charstrings( decoder, charstring, - charstring_len ); - decoder->seac = FALSE; - - cff_free_glyph_data( face, &charstring, charstring_len ); - - if ( error ) - goto Exit; - } - - /* Save the left bearing, advance and glyph width of the base */ - /* character as they will be erased by the next load. */ - - left_bearing = builder->left_bearing; - advance = builder->advance; - glyph_width = decoder->glyph_width; - - builder->left_bearing.x = 0; - builder->left_bearing.y = 0; - - builder->pos_x = adx - asb; - builder->pos_y = ady; - - /* Now load `achar' on top of the base outline. */ - error = cff_get_glyph_data( face, achar_index, - &charstring, &charstring_len ); - if ( !error ) - { - /* the seac operator must not be nested */ - decoder->seac = TRUE; - error = cff_decoder_parse_charstrings( decoder, charstring, - charstring_len ); - decoder->seac = FALSE; - - cff_free_glyph_data( face, &charstring, charstring_len ); - - if ( error ) - goto Exit; - } - - /* Restore the left side bearing, advance and glyph width */ - /* of the base character. */ - builder->left_bearing = left_bearing; - builder->advance = advance; - decoder->glyph_width = glyph_width; - - builder->pos_x = 0; - builder->pos_y = 0; - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_decoder_parse_charstrings */ - /* */ - /* <Description> */ - /* Parses a given Type 2 charstrings program. */ - /* */ - /* <InOut> */ - /* decoder :: The current Type 1 decoder. */ - /* */ - /* <Input> */ - /* charstring_base :: The base of the charstring stream. */ - /* */ - /* charstring_len :: The length in bytes of the charstring stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - cff_decoder_parse_charstrings( CFF_Decoder* decoder, - FT_Byte* charstring_base, - FT_ULong charstring_len ) - { - FT_Error error; - CFF_Decoder_Zone* zone; - FT_Byte* ip; - FT_Byte* limit; - CFF_Builder* builder = &decoder->builder; - FT_Pos x, y; - FT_Fixed seed; - FT_Fixed* stack; - FT_Int charstring_type = - decoder->cff->top_font.font_dict.charstring_type; - - T2_Hints_Funcs hinter; - - - /* set default width */ - decoder->num_hints = 0; - decoder->read_width = 1; - - /* compute random seed from stack address of parameter */ - seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed ^ - (FT_PtrDist)(char*)&decoder ^ - (FT_PtrDist)(char*)&charstring_base ) & - FT_ULONG_MAX ) ; - seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; - if ( seed == 0 ) - seed = 0x7384; - - /* initialize the decoder */ - decoder->top = decoder->stack; - decoder->zone = decoder->zones; - zone = decoder->zones; - stack = decoder->top; - - hinter = (T2_Hints_Funcs)builder->hints_funcs; - - builder->path_begun = 0; - - zone->base = charstring_base; - limit = zone->limit = charstring_base + charstring_len; - ip = zone->cursor = zone->base; - - error = CFF_Err_Ok; - - x = builder->pos_x; - y = builder->pos_y; - - /* begin hints recording session, if any */ - if ( hinter ) - hinter->open( hinter->hints ); - - /* now execute loop */ - while ( ip < limit ) - { - CFF_Operator op; - FT_Byte v; - - - /********************************************************************/ - /* */ - /* Decode operator or operand */ - /* */ - v = *ip++; - if ( v >= 32 || v == 28 ) - { - FT_Int shift = 16; - FT_Int32 val; - - - /* this is an operand, push it on the stack */ - if ( v == 28 ) - { - if ( ip + 1 >= limit ) - goto Syntax_Error; - val = (FT_Short)( ( (FT_Short)ip[0] << 8 ) | ip[1] ); - ip += 2; - } - else if ( v < 247 ) - val = (FT_Int32)v - 139; - else if ( v < 251 ) - { - if ( ip >= limit ) - goto Syntax_Error; - val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108; - } - else if ( v < 255 ) - { - if ( ip >= limit ) - goto Syntax_Error; - val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108; - } - else - { - if ( ip + 3 >= limit ) - goto Syntax_Error; - val = ( (FT_Int32)ip[0] << 24 ) | - ( (FT_Int32)ip[1] << 16 ) | - ( (FT_Int32)ip[2] << 8 ) | - ip[3]; - ip += 4; - if ( charstring_type == 2 ) - shift = 0; - } - if ( decoder->top - stack >= CFF_MAX_OPERANDS ) - goto Stack_Overflow; - - val <<= shift; - *decoder->top++ = val; - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !( val & 0xFFFFL ) ) - FT_TRACE4(( " %ld", (FT_Int32)( val >> 16 ) )); - else - FT_TRACE4(( " %.2f", val / 65536.0 )); -#endif - - } - else - { - /* The specification says that normally arguments are to be taken */ - /* from the bottom of the stack. However, this seems not to be */ - /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */ - /* arguments similar to a PS interpreter. */ - - FT_Fixed* args = decoder->top; - FT_Int num_args = (FT_Int)( args - decoder->stack ); - FT_Int req_args; - - - /* find operator */ - op = cff_op_unknown; - - switch ( v ) - { - case 1: - op = cff_op_hstem; - break; - case 3: - op = cff_op_vstem; - break; - case 4: - op = cff_op_vmoveto; - break; - case 5: - op = cff_op_rlineto; - break; - case 6: - op = cff_op_hlineto; - break; - case 7: - op = cff_op_vlineto; - break; - case 8: - op = cff_op_rrcurveto; - break; - case 9: - op = cff_op_closepath; - break; - case 10: - op = cff_op_callsubr; - break; - case 11: - op = cff_op_return; - break; - case 12: - { - if ( ip >= limit ) - goto Syntax_Error; - v = *ip++; - - switch ( v ) - { - case 0: - op = cff_op_dotsection; - break; - case 1: /* this is actually the Type1 vstem3 operator */ - op = cff_op_vstem; - break; - case 2: /* this is actually the Type1 hstem3 operator */ - op = cff_op_hstem; - break; - case 3: - op = cff_op_and; - break; - case 4: - op = cff_op_or; - break; - case 5: - op = cff_op_not; - break; - case 6: - op = cff_op_seac; - break; - case 7: - op = cff_op_sbw; - break; - case 8: - op = cff_op_store; - break; - case 9: - op = cff_op_abs; - break; - case 10: - op = cff_op_add; - break; - case 11: - op = cff_op_sub; - break; - case 12: - op = cff_op_div; - break; - case 13: - op = cff_op_load; - break; - case 14: - op = cff_op_neg; - break; - case 15: - op = cff_op_eq; - break; - case 16: - op = cff_op_callothersubr; - break; - case 17: - op = cff_op_pop; - break; - case 18: - op = cff_op_drop; - break; - case 20: - op = cff_op_put; - break; - case 21: - op = cff_op_get; - break; - case 22: - op = cff_op_ifelse; - break; - case 23: - op = cff_op_random; - break; - case 24: - op = cff_op_mul; - break; - case 26: - op = cff_op_sqrt; - break; - case 27: - op = cff_op_dup; - break; - case 28: - op = cff_op_exch; - break; - case 29: - op = cff_op_index; - break; - case 30: - op = cff_op_roll; - break; - case 33: - op = cff_op_setcurrentpoint; - break; - case 34: - op = cff_op_hflex; - break; - case 35: - op = cff_op_flex; - break; - case 36: - op = cff_op_hflex1; - break; - case 37: - op = cff_op_flex1; - break; - default: - /* decrement ip for syntax error message */ - ip--; - } - } - break; - case 13: - op = cff_op_hsbw; - break; - case 14: - op = cff_op_endchar; - break; - case 16: - op = cff_op_blend; - break; - case 18: - op = cff_op_hstemhm; - break; - case 19: - op = cff_op_hintmask; - break; - case 20: - op = cff_op_cntrmask; - break; - case 21: - op = cff_op_rmoveto; - break; - case 22: - op = cff_op_hmoveto; - break; - case 23: - op = cff_op_vstemhm; - break; - case 24: - op = cff_op_rcurveline; - break; - case 25: - op = cff_op_rlinecurve; - break; - case 26: - op = cff_op_vvcurveto; - break; - case 27: - op = cff_op_hhcurveto; - break; - case 29: - op = cff_op_callgsubr; - break; - case 30: - op = cff_op_vhcurveto; - break; - case 31: - op = cff_op_hvcurveto; - break; - default: - break; - } - - if ( op == cff_op_unknown ) - goto Syntax_Error; - - /* check arguments */ - req_args = cff_argument_counts[op]; - if ( req_args & CFF_COUNT_CHECK_WIDTH ) - { - if ( num_args > 0 && decoder->read_width ) - { - /* If `nominal_width' is non-zero, the number is really a */ - /* difference against `nominal_width'. Else, the number here */ - /* is truly a width, not a difference against `nominal_width'. */ - /* If the font does not set `nominal_width', then */ - /* `nominal_width' defaults to zero, and so we can set */ - /* `glyph_width' to `nominal_width' plus number on the stack */ - /* -- for either case. */ - - FT_Int set_width_ok; - - - switch ( op ) - { - case cff_op_hmoveto: - case cff_op_vmoveto: - set_width_ok = num_args & 2; - break; - - case cff_op_hstem: - case cff_op_vstem: - case cff_op_hstemhm: - case cff_op_vstemhm: - case cff_op_rmoveto: - case cff_op_hintmask: - case cff_op_cntrmask: - set_width_ok = num_args & 1; - break; - - case cff_op_endchar: - /* If there is a width specified for endchar, we either have */ - /* 1 argument or 5 arguments. We like to argue. */ - set_width_ok = ( num_args == 5 ) || ( num_args == 1 ); - break; - - default: - set_width_ok = 0; - break; - } - - if ( set_width_ok ) - { - decoder->glyph_width = decoder->nominal_width + - ( stack[0] >> 16 ); - - if ( decoder->width_only ) - { - /* we only want the advance width; stop here */ - break; - } - - /* Consumed an argument. */ - num_args--; - } - } - - decoder->read_width = 0; - req_args = 0; - } - - req_args &= 0x000F; - if ( num_args < req_args ) - goto Stack_Underflow; - args -= req_args; - num_args -= req_args; - - /* At this point, `args' points to the first argument of the */ - /* operand in case `req_args' isn't zero. Otherwise, we have */ - /* to adjust `args' manually. */ - - /* Note that we only pop arguments from the stack which we */ - /* really need and can digest so that we can continue in case */ - /* of superfluous stack elements. */ - - switch ( op ) - { - case cff_op_hstem: - case cff_op_vstem: - case cff_op_hstemhm: - case cff_op_vstemhm: - /* the number of arguments is always even here */ - FT_TRACE4(( - op == cff_op_hstem ? " hstem\n" : - ( op == cff_op_vstem ? " vstem\n" : - ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) )); - - if ( hinter ) - hinter->stems( hinter->hints, - ( op == cff_op_hstem || op == cff_op_hstemhm ), - num_args / 2, - args - ( num_args & ~1 ) ); - - decoder->num_hints += num_args / 2; - args = stack; - break; - - case cff_op_hintmask: - case cff_op_cntrmask: - FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" )); - - /* implement vstem when needed -- */ - /* the specification doesn't say it, but this also works */ - /* with the 'cntrmask' operator */ - /* */ - if ( num_args > 0 ) - { - if ( hinter ) - hinter->stems( hinter->hints, - 0, - num_args / 2, - args - ( num_args & ~1 ) ); - - decoder->num_hints += num_args / 2; - } - - /* In a valid charstring there must be at least one byte */ - /* after `hintmask' or `cntrmask' (e.g., for a `return' */ - /* instruction). Additionally, there must be space for */ - /* `num_hints' bits. */ - - if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit ) - goto Syntax_Error; - - if ( hinter ) - { - if ( op == cff_op_hintmask ) - hinter->hintmask( hinter->hints, - builder->current->n_points, - decoder->num_hints, - ip ); - else - hinter->counter( hinter->hints, - decoder->num_hints, - ip ); - } - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_UInt maskbyte; - - - FT_TRACE4(( " (maskbytes:" )); - - for ( maskbyte = 0; - maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 ); - maskbyte++, ip++ ) - FT_TRACE4(( " 0x%02X", *ip )); - - FT_TRACE4(( ")\n" )); - } -#else - ip += ( decoder->num_hints + 7 ) >> 3; -#endif - args = stack; - break; - - case cff_op_rmoveto: - FT_TRACE4(( " rmoveto\n" )); - - cff_builder_close_contour( builder ); - builder->path_begun = 0; - x += args[-2]; - y += args[-1]; - args = stack; - break; - - case cff_op_vmoveto: - FT_TRACE4(( " vmoveto\n" )); - - cff_builder_close_contour( builder ); - builder->path_begun = 0; - y += args[-1]; - args = stack; - break; - - case cff_op_hmoveto: - FT_TRACE4(( " hmoveto\n" )); - - cff_builder_close_contour( builder ); - builder->path_begun = 0; - x += args[-1]; - args = stack; - break; - - case cff_op_rlineto: - FT_TRACE4(( " rlineto\n" )); - - if ( cff_builder_start_point ( builder, x, y ) || - check_points( builder, num_args / 2 ) ) - goto Fail; - - if ( num_args < 2 ) - goto Stack_Underflow; - - args -= num_args & ~1; - while ( args < decoder->top ) - { - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 1 ); - args += 2; - } - args = stack; - break; - - case cff_op_hlineto: - case cff_op_vlineto: - { - FT_Int phase = ( op == cff_op_hlineto ); - - - FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n" - : " vlineto\n" )); - - if ( num_args < 1 ) - goto Stack_Underflow; - - if ( cff_builder_start_point ( builder, x, y ) || - check_points( builder, num_args ) ) - goto Fail; - - args = stack; - while ( args < decoder->top ) - { - if ( phase ) - x += args[0]; - else - y += args[0]; - - if ( cff_builder_add_point1( builder, x, y ) ) - goto Fail; - - args++; - phase ^= 1; - } - args = stack; - } - break; - - case cff_op_rrcurveto: - { - FT_Int nargs; - - - FT_TRACE4(( " rrcurveto\n" )); - - if ( num_args < 6 ) - goto Stack_Underflow; - - nargs = num_args - num_args % 6; - - if ( cff_builder_start_point ( builder, x, y ) || - check_points( builder, nargs / 2 ) ) - goto Fail; - - args -= nargs; - while ( args < decoder->top ) - { - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[2]; - y += args[3]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[4]; - y += args[5]; - cff_builder_add_point( builder, x, y, 1 ); - args += 6; - } - args = stack; - } - break; - - case cff_op_vvcurveto: - { - FT_Int nargs; - - - FT_TRACE4(( " vvcurveto\n" )); - - if ( num_args < 4 ) - goto Stack_Underflow; - - /* if num_args isn't of the form 4n or 4n+1, */ - /* we reduce it to 4n+1 */ - - nargs = num_args - num_args % 4; - if ( num_args - nargs > 0 ) - nargs += 1; - - if ( cff_builder_start_point( builder, x, y ) ) - goto Fail; - - args -= nargs; - - if ( nargs & 1 ) - { - x += args[0]; - args++; - nargs--; - } - - if ( check_points( builder, 3 * ( nargs / 4 ) ) ) - goto Fail; - - while ( args < decoder->top ) - { - y += args[0]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[1]; - y += args[2]; - cff_builder_add_point( builder, x, y, 0 ); - y += args[3]; - cff_builder_add_point( builder, x, y, 1 ); - args += 4; - } - args = stack; - } - break; - - case cff_op_hhcurveto: - { - FT_Int nargs; - - - FT_TRACE4(( " hhcurveto\n" )); - - if ( num_args < 4 ) - goto Stack_Underflow; - - /* if num_args isn't of the form 4n or 4n+1, */ - /* we reduce it to 4n+1 */ - - nargs = num_args - num_args % 4; - if ( num_args - nargs > 0 ) - nargs += 1; - - if ( cff_builder_start_point( builder, x, y ) ) - goto Fail; - - args -= nargs; - if ( nargs & 1 ) - { - y += args[0]; - args++; - nargs--; - } - - if ( check_points( builder, 3 * ( nargs / 4 ) ) ) - goto Fail; - - while ( args < decoder->top ) - { - x += args[0]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[1]; - y += args[2]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[3]; - cff_builder_add_point( builder, x, y, 1 ); - args += 4; - } - args = stack; - } - break; - - case cff_op_vhcurveto: - case cff_op_hvcurveto: - { - FT_Int phase; - FT_Int nargs; - - - FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n" - : " hvcurveto\n" )); - - if ( cff_builder_start_point( builder, x, y ) ) - goto Fail; - - if ( num_args < 4 ) - goto Stack_Underflow; - - /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */ - /* we reduce it to the largest one which fits */ - - nargs = num_args - num_args % 4; - if ( num_args - nargs > 0 ) - nargs += 1; - - args -= nargs; - if ( check_points( builder, ( nargs / 4 ) * 3 ) ) - goto Stack_Underflow; - - phase = ( op == cff_op_hvcurveto ); - - while ( nargs >= 4 ) - { - nargs -= 4; - if ( phase ) - { - x += args[0]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[1]; - y += args[2]; - cff_builder_add_point( builder, x, y, 0 ); - y += args[3]; - if ( nargs == 1 ) - x += args[4]; - cff_builder_add_point( builder, x, y, 1 ); - } - else - { - y += args[0]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[1]; - y += args[2]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[3]; - if ( nargs == 1 ) - y += args[4]; - cff_builder_add_point( builder, x, y, 1 ); - } - args += 4; - phase ^= 1; - } - args = stack; - } - break; - - case cff_op_rlinecurve: - { - FT_Int num_lines; - FT_Int nargs; - - - FT_TRACE4(( " rlinecurve\n" )); - - if ( num_args < 8 ) - goto Stack_Underflow; - - nargs = num_args & ~1; - num_lines = ( nargs - 6 ) / 2; - - if ( cff_builder_start_point( builder, x, y ) || - check_points( builder, num_lines + 3 ) ) - goto Fail; - - args -= nargs; - - /* first, add the line segments */ - while ( num_lines > 0 ) - { - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 1 ); - args += 2; - num_lines--; - } - - /* then the curve */ - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[2]; - y += args[3]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[4]; - y += args[5]; - cff_builder_add_point( builder, x, y, 1 ); - args = stack; - } - break; - - case cff_op_rcurveline: - { - FT_Int num_curves; - FT_Int nargs; - - - FT_TRACE4(( " rcurveline\n" )); - - if ( num_args < 8 ) - goto Stack_Underflow; - - nargs = num_args - 2; - nargs = nargs - nargs % 6 + 2; - num_curves = ( nargs - 2 ) / 6; - - if ( cff_builder_start_point ( builder, x, y ) || - check_points( builder, num_curves * 3 + 2 ) ) - goto Fail; - - args -= nargs; - - /* first, add the curves */ - while ( num_curves > 0 ) - { - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[2]; - y += args[3]; - cff_builder_add_point( builder, x, y, 0 ); - x += args[4]; - y += args[5]; - cff_builder_add_point( builder, x, y, 1 ); - args += 6; - num_curves--; - } - - /* then the final line */ - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 1 ); - args = stack; - } - break; - - case cff_op_hflex1: - { - FT_Pos start_y; - - - FT_TRACE4(( " hflex1\n" )); - - /* adding five more points: 4 control points, 1 on-curve point */ - /* -- make sure we have enough space for the start point if it */ - /* needs to be added */ - if ( cff_builder_start_point( builder, x, y ) || - check_points( builder, 6 ) ) - goto Fail; - - /* record the starting point's y position for later use */ - start_y = y; - - /* first control point */ - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, 0 ); - - /* second control point */ - x += args[2]; - y += args[3]; - cff_builder_add_point( builder, x, y, 0 ); - - /* join point; on curve, with y-value the same as the last */ - /* control point's y-value */ - x += args[4]; - cff_builder_add_point( builder, x, y, 1 ); - - /* third control point, with y-value the same as the join */ - /* point's y-value */ - x += args[5]; - cff_builder_add_point( builder, x, y, 0 ); - - /* fourth control point */ - x += args[6]; - y += args[7]; - cff_builder_add_point( builder, x, y, 0 ); - - /* ending point, with y-value the same as the start */ - x += args[8]; - y = start_y; - cff_builder_add_point( builder, x, y, 1 ); - - args = stack; - break; - } - - case cff_op_hflex: - { - FT_Pos start_y; - - - FT_TRACE4(( " hflex\n" )); - - /* adding six more points; 4 control points, 2 on-curve points */ - if ( cff_builder_start_point( builder, x, y ) || - check_points( builder, 6 ) ) - goto Fail; - - /* record the starting point's y-position for later use */ - start_y = y; - - /* first control point */ - x += args[0]; - cff_builder_add_point( builder, x, y, 0 ); - - /* second control point */ - x += args[1]; - y += args[2]; - cff_builder_add_point( builder, x, y, 0 ); - - /* join point; on curve, with y-value the same as the last */ - /* control point's y-value */ - x += args[3]; - cff_builder_add_point( builder, x, y, 1 ); - - /* third control point, with y-value the same as the join */ - /* point's y-value */ - x += args[4]; - cff_builder_add_point( builder, x, y, 0 ); - - /* fourth control point */ - x += args[5]; - y = start_y; - cff_builder_add_point( builder, x, y, 0 ); - - /* ending point, with y-value the same as the start point's */ - /* y-value -- we don't add this point, though */ - x += args[6]; - cff_builder_add_point( builder, x, y, 1 ); - - args = stack; - break; - } - - case cff_op_flex1: - { - FT_Pos start_x, start_y; /* record start x, y values for */ - /* alter use */ - FT_Fixed dx = 0, dy = 0; /* used in horizontal/vertical */ - /* algorithm below */ - FT_Int horizontal, count; - FT_Fixed* temp; - - - FT_TRACE4(( " flex1\n" )); - - /* adding six more points; 4 control points, 2 on-curve points */ - if ( cff_builder_start_point( builder, x, y ) || - check_points( builder, 6 ) ) - goto Fail; - - /* record the starting point's x, y position for later use */ - start_x = x; - start_y = y; - - /* XXX: figure out whether this is supposed to be a horizontal */ - /* or vertical flex; the Type 2 specification is vague... */ - - temp = args; - - /* grab up to the last argument */ - for ( count = 5; count > 0; count-- ) - { - dx += temp[0]; - dy += temp[1]; - temp += 2; - } - - if ( dx < 0 ) - dx = -dx; - if ( dy < 0 ) - dy = -dy; - - /* strange test, but here it is... */ - horizontal = ( dx > dy ); - - for ( count = 5; count > 0; count-- ) - { - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, - (FT_Bool)( count == 3 ) ); - args += 2; - } - - /* is last operand an x- or y-delta? */ - if ( horizontal ) - { - x += args[0]; - y = start_y; - } - else - { - x = start_x; - y += args[0]; - } - - cff_builder_add_point( builder, x, y, 1 ); - - args = stack; - break; - } - - case cff_op_flex: - { - FT_UInt count; - - - FT_TRACE4(( " flex\n" )); - - if ( cff_builder_start_point( builder, x, y ) || - check_points( builder, 6 ) ) - goto Fail; - - for ( count = 6; count > 0; count-- ) - { - x += args[0]; - y += args[1]; - cff_builder_add_point( builder, x, y, - (FT_Bool)( count == 4 || count == 1 ) ); - args += 2; - } - - args = stack; - } - break; - - case cff_op_seac: - FT_TRACE4(( " seac\n" )); - - error = cff_operator_seac( decoder, - args[0], args[1], args[2], - (FT_Int)( args[3] >> 16 ), - (FT_Int)( args[4] >> 16 ) ); - - /* add current outline to the glyph slot */ - FT_GlyphLoader_Add( builder->loader ); - - /* return now! */ - FT_TRACE4(( "\n" )); - return error; - - case cff_op_endchar: - FT_TRACE4(( " endchar\n" )); - - /* We are going to emulate the seac operator. */ - if ( num_args >= 4 ) - { - /* Save glyph width so that the subglyphs don't overwrite it. */ - FT_Pos glyph_width = decoder->glyph_width; - - error = cff_operator_seac( decoder, - 0L, args[-4], args[-3], - (FT_Int)( args[-2] >> 16 ), - (FT_Int)( args[-1] >> 16 ) ); - - decoder->glyph_width = glyph_width; - } - else - { - if ( !error ) - error = CFF_Err_Ok; - - cff_builder_close_contour( builder ); - - /* close hints recording session */ - if ( hinter ) - { - if ( hinter->close( hinter->hints, - builder->current->n_points ) ) - goto Syntax_Error; - - /* apply hints to the loaded glyph outline now */ - hinter->apply( hinter->hints, - builder->current, - (PSH_Globals)builder->hints_globals, - decoder->hint_mode ); - } - - /* add current outline to the glyph slot */ - FT_GlyphLoader_Add( builder->loader ); - } - - /* return now! */ - FT_TRACE4(( "\n" )); - return error; - - case cff_op_abs: - FT_TRACE4(( " abs\n" )); - - if ( args[0] < 0 ) - args[0] = -args[0]; - args++; - break; - - case cff_op_add: - FT_TRACE4(( " add\n" )); - - args[0] += args[1]; - args++; - break; - - case cff_op_sub: - FT_TRACE4(( " sub\n" )); - - args[0] -= args[1]; - args++; - break; - - case cff_op_div: - FT_TRACE4(( " div\n" )); - - args[0] = FT_DivFix( args[0], args[1] ); - args++; - break; - - case cff_op_neg: - FT_TRACE4(( " neg\n" )); - - args[0] = -args[0]; - args++; - break; - - case cff_op_random: - { - FT_Fixed Rand; - - - FT_TRACE4(( " rand\n" )); - - Rand = seed; - if ( Rand >= 0x8000L ) - Rand++; - - args[0] = Rand; - seed = FT_MulFix( seed, 0x10000L - seed ); - if ( seed == 0 ) - seed += 0x2873; - args++; - } - break; - - case cff_op_mul: - FT_TRACE4(( " mul\n" )); - - args[0] = FT_MulFix( args[0], args[1] ); - args++; - break; - - case cff_op_sqrt: - FT_TRACE4(( " sqrt\n" )); - - if ( args[0] > 0 ) - { - FT_Int count = 9; - FT_Fixed root = args[0]; - FT_Fixed new_root; - - - for (;;) - { - new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1; - if ( new_root == root || count <= 0 ) - break; - root = new_root; - } - args[0] = new_root; - } - else - args[0] = 0; - args++; - break; - - case cff_op_drop: - /* nothing */ - FT_TRACE4(( " drop\n" )); - - break; - - case cff_op_exch: - { - FT_Fixed tmp; - - - FT_TRACE4(( " exch\n" )); - - tmp = args[0]; - args[0] = args[1]; - args[1] = tmp; - args += 2; - } - break; - - case cff_op_index: - { - FT_Int idx = (FT_Int)( args[0] >> 16 ); - - - FT_TRACE4(( " index\n" )); - - if ( idx < 0 ) - idx = 0; - else if ( idx > num_args - 2 ) - idx = num_args - 2; - args[0] = args[-( idx + 1 )]; - args++; - } - break; - - case cff_op_roll: - { - FT_Int count = (FT_Int)( args[0] >> 16 ); - FT_Int idx = (FT_Int)( args[1] >> 16 ); - - - FT_TRACE4(( " roll\n" )); - - if ( count <= 0 ) - count = 1; - - args -= count; - if ( args < stack ) - goto Stack_Underflow; - - if ( idx >= 0 ) - { - while ( idx > 0 ) - { - FT_Fixed tmp = args[count - 1]; - FT_Int i; - - - for ( i = count - 2; i >= 0; i-- ) - args[i + 1] = args[i]; - args[0] = tmp; - idx--; - } - } - else - { - while ( idx < 0 ) - { - FT_Fixed tmp = args[0]; - FT_Int i; - - - for ( i = 0; i < count - 1; i++ ) - args[i] = args[i + 1]; - args[count - 1] = tmp; - idx++; - } - } - args += count; - } - break; - - case cff_op_dup: - FT_TRACE4(( " dup\n" )); - - args[1] = args[0]; - args += 2; - break; - - case cff_op_put: - { - FT_Fixed val = args[0]; - FT_Int idx = (FT_Int)( args[1] >> 16 ); - - - FT_TRACE4(( " put\n" )); - - if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS ) - decoder->buildchar[idx] = val; - } - break; - - case cff_op_get: - { - FT_Int idx = (FT_Int)( args[0] >> 16 ); - FT_Fixed val = 0; - - - FT_TRACE4(( " get\n" )); - - if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS ) - val = decoder->buildchar[idx]; - - args[0] = val; - args++; - } - break; - - case cff_op_store: - FT_TRACE4(( " store\n")); - - goto Unimplemented; - - case cff_op_load: - FT_TRACE4(( " load\n" )); - - goto Unimplemented; - - case cff_op_dotsection: - /* this operator is deprecated and ignored by the parser */ - FT_TRACE4(( " dotsection\n" )); - break; - - case cff_op_closepath: - /* this is an invalid Type 2 operator; however, there */ - /* exist fonts which are incorrectly converted from probably */ - /* Type 1 to CFF, and some parsers seem to accept it */ - - FT_TRACE4(( " closepath (invalid op)\n" )); - - args = stack; - break; - - case cff_op_hsbw: - /* this is an invalid Type 2 operator; however, there */ - /* exist fonts which are incorrectly converted from probably */ - /* Type 1 to CFF, and some parsers seem to accept it */ - - FT_TRACE4(( " hsbw (invalid op)\n" )); - - decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 ); - - decoder->builder.left_bearing.x = args[0]; - decoder->builder.left_bearing.y = 0; - - x = decoder->builder.pos_x + args[0]; - y = decoder->builder.pos_y; - args = stack; - break; - - case cff_op_sbw: - /* this is an invalid Type 2 operator; however, there */ - /* exist fonts which are incorrectly converted from probably */ - /* Type 1 to CFF, and some parsers seem to accept it */ - - FT_TRACE4(( " sbw (invalid op)\n" )); - - decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 ); - - decoder->builder.left_bearing.x = args[0]; - decoder->builder.left_bearing.y = args[1]; - - x = decoder->builder.pos_x + args[0]; - y = decoder->builder.pos_y + args[1]; - args = stack; - break; - - case cff_op_setcurrentpoint: - /* this is an invalid Type 2 operator; however, there */ - /* exist fonts which are incorrectly converted from probably */ - /* Type 1 to CFF, and some parsers seem to accept it */ - - FT_TRACE4(( " setcurrentpoint (invalid op)\n" )); - - x = decoder->builder.pos_x + args[0]; - y = decoder->builder.pos_y + args[1]; - args = stack; - break; - - case cff_op_callothersubr: - /* this is an invalid Type 2 operator; however, there */ - /* exist fonts which are incorrectly converted from probably */ - /* Type 1 to CFF, and some parsers seem to accept it */ - - FT_TRACE4(( " callothersubr (invalid op)\n" )); - - /* subsequent `pop' operands should add the arguments, */ - /* this is the implementation described for `unknown' other */ - /* subroutines in the Type1 spec. */ - /* */ - /* XXX Fix return arguments (see discussion below). */ - args -= 2 + ( args[-2] >> 16 ); - if ( args < stack ) - goto Stack_Underflow; - break; - - case cff_op_pop: - /* this is an invalid Type 2 operator; however, there */ - /* exist fonts which are incorrectly converted from probably */ - /* Type 1 to CFF, and some parsers seem to accept it */ - - FT_TRACE4(( " pop (invalid op)\n" )); - - /* XXX Increasing `args' is wrong: After a certain number of */ - /* `pop's we get a stack overflow. Reason for doing it is */ - /* code like this (actually found in a CFF font): */ - /* */ - /* 17 1 3 callothersubr */ - /* pop */ - /* callsubr */ - /* */ - /* Since we handle `callothersubr' as a no-op, and */ - /* `callsubr' needs at least one argument, `pop' can't be a */ - /* no-op too as it basically should be. */ - /* */ - /* The right solution would be to provide real support for */ - /* `callothersubr' as done in `t1decode.c', however, given */ - /* the fact that CFF fonts with `pop' are invalid, it is */ - /* questionable whether it is worth the time. */ - args++; - break; - - case cff_op_and: - { - FT_Fixed cond = args[0] && args[1]; - - - FT_TRACE4(( " and\n" )); - - args[0] = cond ? 0x10000L : 0; - args++; - } - break; - - case cff_op_or: - { - FT_Fixed cond = args[0] || args[1]; - - - FT_TRACE4(( " or\n" )); - - args[0] = cond ? 0x10000L : 0; - args++; - } - break; - - case cff_op_eq: - { - FT_Fixed cond = !args[0]; - - - FT_TRACE4(( " eq\n" )); - - args[0] = cond ? 0x10000L : 0; - args++; - } - break; - - case cff_op_ifelse: - { - FT_Fixed cond = ( args[2] <= args[3] ); - - - FT_TRACE4(( " ifelse\n" )); - - if ( !cond ) - args[0] = args[1]; - args++; - } - break; - - case cff_op_callsubr: - { - FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + - decoder->locals_bias ); - - - FT_TRACE4(( " callsubr(%d)\n", idx )); - - if ( idx >= decoder->num_locals ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " invalid local subr index\n" )); - goto Syntax_Error; - } - - if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " too many nested subrs\n" )); - goto Syntax_Error; - } - - zone->cursor = ip; /* save current instruction pointer */ - - zone++; - zone->base = decoder->locals[idx]; - zone->limit = decoder->locals[idx + 1]; - zone->cursor = zone->base; - - if ( !zone->base || zone->limit == zone->base ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " invoking empty subrs\n" )); - goto Syntax_Error; - } - - decoder->zone = zone; - ip = zone->base; - limit = zone->limit; - } - break; - - case cff_op_callgsubr: - { - FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + - decoder->globals_bias ); - - - FT_TRACE4(( " callgsubr(%d)\n", idx )); - - if ( idx >= decoder->num_globals ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " invalid global subr index\n" )); - goto Syntax_Error; - } - - if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " too many nested subrs\n" )); - goto Syntax_Error; - } - - zone->cursor = ip; /* save current instruction pointer */ - - zone++; - zone->base = decoder->globals[idx]; - zone->limit = decoder->globals[idx + 1]; - zone->cursor = zone->base; - - if ( !zone->base || zone->limit == zone->base ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " invoking empty subrs\n" )); - goto Syntax_Error; - } - - decoder->zone = zone; - ip = zone->base; - limit = zone->limit; - } - break; - - case cff_op_return: - FT_TRACE4(( " return\n" )); - - if ( decoder->zone <= decoder->zones ) - { - FT_ERROR(( "cff_decoder_parse_charstrings:" - " unexpected return\n" )); - goto Syntax_Error; - } - - decoder->zone--; - zone = decoder->zone; - ip = zone->cursor; - limit = zone->limit; - break; - - default: - Unimplemented: - FT_ERROR(( "Unimplemented opcode: %d", ip[-1] )); - - if ( ip[-1] == 12 ) - FT_ERROR(( " %d", ip[0] )); - FT_ERROR(( "\n" )); - - return CFF_Err_Unimplemented_Feature; - } - - decoder->top = args; - - if ( decoder->top - stack >= CFF_MAX_OPERANDS ) - goto Stack_Overflow; - - } /* general operator processing */ - - } /* while ip < limit */ - - FT_TRACE4(( "..end..\n\n" )); - - Fail: - return error; - - Syntax_Error: - FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" )); - return CFF_Err_Invalid_File_Format; - - Stack_Underflow: - FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" )); - return CFF_Err_Too_Few_Arguments; - - Stack_Overflow: - FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" )); - return CFF_Err_Stack_Overflow; - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /********** *********/ - /********** *********/ - /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ - /********** *********/ - /********** The following code is in charge of computing *********/ - /********** the maximum advance width of the font. It *********/ - /********** quickly processes each glyph charstring to *********/ - /********** extract the value from either a `sbw' or `seac' *********/ - /********** operator. *********/ - /********** *********/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#if 0 /* unused until we support pure CFF fonts */ - - - FT_LOCAL_DEF( FT_Error ) - cff_compute_max_advance( TT_Face face, - FT_Int* max_advance ) - { - FT_Error error = CFF_Err_Ok; - CFF_Decoder decoder; - FT_Int glyph_index; - CFF_Font cff = (CFF_Font)face->other; - - - *max_advance = 0; - - /* Initialize load decoder */ - cff_decoder_init( &decoder, face, 0, 0, 0, 0 ); - - decoder.builder.metrics_only = 1; - decoder.builder.load_points = 0; - - /* For each glyph, parse the glyph charstring and extract */ - /* the advance width. */ - for ( glyph_index = 0; glyph_index < face->root.num_glyphs; - glyph_index++ ) - { - FT_Byte* charstring; - FT_ULong charstring_len; - - - /* now get load the unscaled outline */ - error = cff_get_glyph_data( face, glyph_index, - &charstring, &charstring_len ); - if ( !error ) - { - error = cff_decoder_prepare( &decoder, size, glyph_index ); - if ( !error ) - error = cff_decoder_parse_charstrings( &decoder, - charstring, - charstring_len ); - - cff_free_glyph_data( face, &charstring, &charstring_len ); - } - - /* ignore the error if one has occurred -- skip to next glyph */ - error = CFF_Err_Ok; - } - - *max_advance = decoder.builder.advance.x; - - return CFF_Err_Ok; - } - - -#endif /* 0 */ - - - FT_LOCAL_DEF( FT_Error ) - cff_slot_load( CFF_GlyphSlot glyph, - CFF_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_Error error; - CFF_Decoder decoder; - TT_Face face = (TT_Face)glyph->root.face; - FT_Bool hinting, force_scaling; - CFF_Font cff = (CFF_Font)face->extra.data; - - FT_Matrix font_matrix; - FT_Vector font_offset; - - - force_scaling = FALSE; - - /* in a CID-keyed font, consider `glyph_index' as a CID and map */ - /* it immediately to the real glyph_index -- if it isn't a */ - /* subsetted font, glyph_indices and CIDs are identical, though */ - if ( cff->top_font.font_dict.cid_registry != 0xFFFFU && - cff->charset.cids ) - { - /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */ - if ( glyph_index != 0 ) - { - glyph_index = cff_charset_cid_to_gindex( &cff->charset, - glyph_index ); - if ( glyph_index == 0 ) - return CFF_Err_Invalid_Argument; - } - } - else if ( glyph_index >= cff->num_glyphs ) - return CFF_Err_Invalid_Argument; - - if ( load_flags & FT_LOAD_NO_RECURSE ) - load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; - - glyph->x_scale = 0x10000L; - glyph->y_scale = 0x10000L; - if ( size ) - { - glyph->x_scale = size->root.metrics.x_scale; - glyph->y_scale = size->root.metrics.y_scale; - } - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - /* try to load embedded bitmap if any */ - /* */ - /* XXX: The convention should be emphasized in */ - /* the documents because it can be confusing. */ - if ( size ) - { - CFF_Face cff_face = (CFF_Face)size->root.face; - SFNT_Service sfnt = (SFNT_Service)cff_face->sfnt; - FT_Stream stream = cff_face->root.stream; - - - if ( size->strike_index != 0xFFFFFFFFUL && - sfnt->load_eblc && - ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) - { - TT_SBit_MetricsRec metrics; - - - error = sfnt->load_sbit_image( face, - size->strike_index, - glyph_index, - (FT_Int)load_flags, - stream, - &glyph->root.bitmap, - &metrics ); - - if ( !error ) - { - glyph->root.outline.n_points = 0; - glyph->root.outline.n_contours = 0; - - glyph->root.metrics.width = (FT_Pos)metrics.width << 6; - glyph->root.metrics.height = (FT_Pos)metrics.height << 6; - - glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6; - glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6; - glyph->root.metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6; - - glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6; - glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6; - glyph->root.metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6; - - glyph->root.format = FT_GLYPH_FORMAT_BITMAP; - - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - { - glyph->root.bitmap_left = metrics.vertBearingX; - glyph->root.bitmap_top = metrics.vertBearingY; - } - else - { - glyph->root.bitmap_left = metrics.horiBearingX; - glyph->root.bitmap_top = metrics.horiBearingY; - } - return error; - } - } - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - /* return immediately if we only want the embedded bitmaps */ - if ( load_flags & FT_LOAD_SBITS_ONLY ) - return CFF_Err_Invalid_Argument; - - /* if we have a CID subfont, use its matrix (which has already */ - /* been multiplied with the root matrix) */ - - /* this scaling is only relevant if the PS hinter isn't active */ - if ( cff->num_subfonts ) - { - FT_ULong top_upm, sub_upm; - FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, - glyph_index ); - - if ( fd_index >= cff->num_subfonts ) - fd_index = cff->num_subfonts - 1; - - top_upm = cff->top_font.font_dict.units_per_em; - sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em; - - - font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix; - font_offset = cff->subfonts[fd_index]->font_dict.font_offset; - - if ( top_upm != sub_upm ) - { - glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm ); - glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm ); - - force_scaling = TRUE; - } - } - else - { - font_matrix = cff->top_font.font_dict.font_matrix; - font_offset = cff->top_font.font_dict.font_offset; - } - - glyph->root.outline.n_points = 0; - glyph->root.outline.n_contours = 0; - - hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 && - ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); - - glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */ - - { - FT_Byte* charstring; - FT_ULong charstring_len; - - - cff_decoder_init( &decoder, face, size, glyph, hinting, - FT_LOAD_TARGET_MODE( load_flags ) ); - - if ( load_flags & FT_LOAD_ADVANCE_ONLY ) - decoder.width_only = TRUE; - - decoder.builder.no_recurse = - (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE ); - - /* now load the unscaled outline */ - error = cff_get_glyph_data( face, glyph_index, - &charstring, &charstring_len ); - if ( error ) - goto Glyph_Build_Finished; - - error = cff_decoder_prepare( &decoder, size, glyph_index ); - if ( error ) - goto Glyph_Build_Finished; - - error = cff_decoder_parse_charstrings( &decoder, - charstring, - charstring_len ); - - cff_free_glyph_data( face, &charstring, charstring_len ); - - if ( error ) - goto Glyph_Build_Finished; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* Control data and length may not be available for incremental */ - /* fonts. */ - if ( face->root.internal->incremental_interface ) - { - glyph->root.control_data = 0; - glyph->root.control_len = 0; - } - else -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - /* We set control_data and control_len if charstrings is loaded. */ - /* See how charstring loads at cff_index_access_element() in */ - /* cffload.c. */ - { - CFF_Index csindex = &cff->charstrings_index; - - - if ( csindex->offsets ) - { - glyph->root.control_data = csindex->bytes + - csindex->offsets[glyph_index] - 1; - glyph->root.control_len = charstring_len; - } - } - - Glyph_Build_Finished: - /* save new glyph tables, if no error */ - if ( !error ) - cff_builder_done( &decoder.builder ); - /* XXX: anything to do for broken glyph entry? */ - } - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - /* Incremental fonts can optionally override the metrics. */ - if ( !error && - face->root.internal->incremental_interface && - face->root.internal->incremental_interface->funcs->get_glyph_metrics ) - { - FT_Incremental_MetricsRec metrics; - - - metrics.bearing_x = decoder.builder.left_bearing.x; - metrics.bearing_y = 0; - metrics.advance = decoder.builder.advance.x; - metrics.advance_v = decoder.builder.advance.y; - - error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( - face->root.internal->incremental_interface->object, - glyph_index, FALSE, &metrics ); - - decoder.builder.left_bearing.x = metrics.bearing_x; - decoder.builder.advance.x = metrics.advance; - decoder.builder.advance.y = metrics.advance_v; - } - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - if ( !error ) - { - /* Now, set the metrics -- this is rather simple, as */ - /* the left side bearing is the xMin, and the top side */ - /* bearing the yMax. */ - - /* For composite glyphs, return only left side bearing and */ - /* advance width. */ - if ( load_flags & FT_LOAD_NO_RECURSE ) - { - FT_Slot_Internal internal = glyph->root.internal; - - - glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x; - glyph->root.metrics.horiAdvance = decoder.glyph_width; - internal->glyph_matrix = font_matrix; - internal->glyph_delta = font_offset; - internal->glyph_transformed = 1; - } - else - { - FT_BBox cbox; - FT_Glyph_Metrics* metrics = &glyph->root.metrics; - FT_Vector advance; - FT_Bool has_vertical_info; - - - /* copy the _unscaled_ advance width */ - metrics->horiAdvance = decoder.glyph_width; - glyph->root.linearHoriAdvance = decoder.glyph_width; - glyph->root.internal->glyph_transformed = 0; - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - has_vertical_info = FT_BOOL( face->vertical_info && - face->vertical.number_Of_VMetrics > 0 && - face->vertical.long_metrics ); -#else - has_vertical_info = FT_BOOL( face->vertical_info && - face->vertical.number_Of_VMetrics > 0 ); -#endif - - /* get the vertical metrics from the vtmx table if we have one */ - if ( has_vertical_info ) - { - FT_Short vertBearingY = 0; - FT_UShort vertAdvance = 0; - - - ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, - glyph_index, - &vertBearingY, - &vertAdvance ); - metrics->vertBearingY = vertBearingY; - metrics->vertAdvance = vertAdvance; - } - else - { - /* make up vertical ones */ - if ( face->os2.version != 0xFFFFU ) - metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender - - face->os2.sTypoDescender ); - else - metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender - - face->horizontal.Descender ); - } - - glyph->root.linearVertAdvance = metrics->vertAdvance; - - glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; - - glyph->root.outline.flags = 0; - if ( size && size->root.metrics.y_ppem < 24 ) - glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION; - - glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL; - - if ( !( font_matrix.xx == 0x10000L && - font_matrix.yy == 0x10000L && - font_matrix.xy == 0 && - font_matrix.yx == 0 ) ) - FT_Outline_Transform( &glyph->root.outline, &font_matrix ); - - if ( !( font_offset.x == 0 && - font_offset.y == 0 ) ) - FT_Outline_Translate( &glyph->root.outline, - font_offset.x, font_offset.y ); - - advance.x = metrics->horiAdvance; - advance.y = 0; - FT_Vector_Transform( &advance, &font_matrix ); - metrics->horiAdvance = advance.x + font_offset.x; - - advance.x = 0; - advance.y = metrics->vertAdvance; - FT_Vector_Transform( &advance, &font_matrix ); - metrics->vertAdvance = advance.y + font_offset.y; - - if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling ) - { - /* scale the outline and the metrics */ - FT_Int n; - FT_Outline* cur = &glyph->root.outline; - FT_Vector* vec = cur->points; - FT_Fixed x_scale = glyph->x_scale; - FT_Fixed y_scale = glyph->y_scale; - - - /* First of all, scale the points */ - if ( !hinting || !decoder.builder.hints_funcs ) - for ( n = cur->n_points; n > 0; n--, vec++ ) - { - vec->x = FT_MulFix( vec->x, x_scale ); - vec->y = FT_MulFix( vec->y, y_scale ); - } - - /* Then scale the metrics */ - metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); - metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); - } - - /* compute the other metrics */ - FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); - - metrics->width = cbox.xMax - cbox.xMin; - metrics->height = cbox.yMax - cbox.yMin; - - metrics->horiBearingX = cbox.xMin; - metrics->horiBearingY = cbox.yMax; - - if ( has_vertical_info ) - metrics->vertBearingX = metrics->horiBearingX - - metrics->horiAdvance / 2; - else - { - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - ft_synthesize_vertical_metrics( metrics, - metrics->vertAdvance ); - } - } - } - - return error; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffgload.h b/android/jni/ndk_modules/freetype/src/cff/cffgload.h deleted file mode 100644 index 38937be5..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffgload.h +++ /dev/null @@ -1,201 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffgload.h */ -/* */ -/* OpenType Glyph Loader (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CFFGLOAD_H__ -#define __CFFGLOAD_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include "cffobjs.h" - - -FT_BEGIN_HEADER - - -#define CFF_MAX_OPERANDS 48 -#define CFF_MAX_SUBRS_CALLS 32 -#define CFF_MAX_TRANS_ELEMENTS 32 - - - /*************************************************************************/ - /* */ - /* <Structure> */ - /* CFF_Builder */ - /* */ - /* <Description> */ - /* A structure used during glyph loading to store its outline. */ - /* */ - /* <Fields> */ - /* memory :: The current memory object. */ - /* */ - /* face :: The current face object. */ - /* */ - /* glyph :: The current glyph slot. */ - /* */ - /* loader :: The current glyph loader. */ - /* */ - /* base :: The base glyph outline. */ - /* */ - /* current :: The current glyph outline. */ - /* */ - /* pos_x :: The horizontal translation (if composite glyph). */ - /* */ - /* pos_y :: The vertical translation (if composite glyph). */ - /* */ - /* left_bearing :: The left side bearing point. */ - /* */ - /* advance :: The horizontal advance vector. */ - /* */ - /* bbox :: Unused. */ - /* */ - /* path_begun :: A flag which indicates that a new path has begun. */ - /* */ - /* load_points :: If this flag is not set, no points are loaded. */ - /* */ - /* no_recurse :: Set but not used. */ - /* */ - /* metrics_only :: A boolean indicating that we only want to compute */ - /* the metrics of a given glyph, not load all of its */ - /* points. */ - /* */ - /* hints_funcs :: Auxiliary pointer for hinting. */ - /* */ - /* hints_globals :: Auxiliary pointer for hinting. */ - /* */ - typedef struct CFF_Builder_ - { - FT_Memory memory; - TT_Face face; - CFF_GlyphSlot glyph; - FT_GlyphLoader loader; - FT_Outline* base; - FT_Outline* current; - - FT_Pos pos_x; - FT_Pos pos_y; - - FT_Vector left_bearing; - FT_Vector advance; - - FT_BBox bbox; /* bounding box */ - FT_Bool path_begun; - FT_Bool load_points; - FT_Bool no_recurse; - - FT_Bool metrics_only; - - void* hints_funcs; /* hinter-specific */ - void* hints_globals; /* hinter-specific */ - - } CFF_Builder; - - - /* execution context charstring zone */ - - typedef struct CFF_Decoder_Zone_ - { - FT_Byte* base; - FT_Byte* limit; - FT_Byte* cursor; - - } CFF_Decoder_Zone; - - - typedef struct CFF_Decoder_ - { - CFF_Builder builder; - CFF_Font cff; - - FT_Fixed stack[CFF_MAX_OPERANDS + 1]; - FT_Fixed* top; - - CFF_Decoder_Zone zones[CFF_MAX_SUBRS_CALLS + 1]; - CFF_Decoder_Zone* zone; - - FT_Int flex_state; - FT_Int num_flex_vectors; - FT_Vector flex_vectors[7]; - - FT_Pos glyph_width; - FT_Pos nominal_width; - - FT_Bool read_width; - FT_Bool width_only; - FT_Int num_hints; - FT_Fixed buildchar[CFF_MAX_TRANS_ELEMENTS]; - - FT_UInt num_locals; - FT_UInt num_globals; - - FT_Int locals_bias; - FT_Int globals_bias; - - FT_Byte** locals; - FT_Byte** globals; - - FT_Byte** glyph_names; /* for pure CFF fonts only */ - FT_UInt num_glyphs; /* number of glyphs in font */ - - FT_Render_Mode hint_mode; - - FT_Bool seac; - - } CFF_Decoder; - - - FT_LOCAL( void ) - cff_decoder_init( CFF_Decoder* decoder, - TT_Face face, - CFF_Size size, - CFF_GlyphSlot slot, - FT_Bool hinting, - FT_Render_Mode hint_mode ); - - FT_LOCAL( FT_Error ) - cff_decoder_prepare( CFF_Decoder* decoder, - CFF_Size size, - FT_UInt glyph_index ); - -#if 0 /* unused until we support pure CFF fonts */ - - /* Compute the maximum advance width of a font through quick parsing */ - FT_LOCAL( FT_Error ) - cff_compute_max_advance( TT_Face face, - FT_Int* max_advance ); - -#endif /* 0 */ - - FT_LOCAL( FT_Error ) - cff_decoder_parse_charstrings( CFF_Decoder* decoder, - FT_Byte* charstring_base, - FT_ULong charstring_len ); - - FT_LOCAL( FT_Error ) - cff_slot_load( CFF_GlyphSlot glyph, - CFF_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - -FT_END_HEADER - -#endif /* __CFFGLOAD_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffload.c b/android/jni/ndk_modules/freetype/src/cff/cffload.c deleted file mode 100644 index 42e77309..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffload.c +++ /dev/null @@ -1,1671 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffload.c */ -/* */ -/* OpenType and CFF data/program tables loader (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include FT_TYPE1_TABLES_H - -#include "cffload.h" -#include "cffparse.h" - -#include "cfferrs.h" - - -#if 1 - - static const FT_UShort cff_isoadobe_charset[229] = - { - 0, 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 - }; - - static const FT_UShort cff_expert_charset[166] = - { - 0, 1, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 13, 14, 15, 99, - 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 27, 28, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 109, 110, - 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 158, 155, 163, 319, - 320, 321, 322, 323, 324, 325, 326, 150, - 164, 169, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, - 341, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378 - }; - - static const FT_UShort cff_expertsubset_charset[87] = - { - 0, 1, 231, 232, 235, 236, 237, 238, - 13, 14, 15, 99, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 27, 28, - 249, 250, 251, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, - 266, 109, 110, 267, 268, 269, 270, 272, - 300, 301, 302, 305, 314, 315, 158, 155, - 163, 320, 321, 322, 323, 324, 325, 326, - 150, 164, 169, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 337, 338, 339, - 340, 341, 342, 343, 344, 345, 346 - }; - - static const FT_UShort cff_standard_encoding[256] = - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 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, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, - 0, 111, 112, 113, 114, 0, 115, 116, - 117, 118, 119, 120, 121, 122, 0, 123, - 0, 124, 125, 126, 127, 128, 129, 130, - 131, 0, 132, 133, 0, 134, 135, 136, - 137, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 138, 0, 139, 0, 0, 0, 0, - 140, 141, 142, 143, 0, 0, 0, 0, - 0, 144, 0, 0, 0, 145, 0, 0, - 146, 147, 148, 149, 0, 0, 0, 0 - }; - - static const FT_UShort cff_expert_encoding[256] = - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 229, 230, 0, 231, 232, 233, 234, - 235, 236, 237, 238, 13, 14, 15, 99, - 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 27, 28, 249, 250, 251, 252, - 0, 253, 254, 255, 256, 257, 0, 0, - 0, 258, 0, 0, 259, 260, 261, 262, - 0, 0, 263, 264, 265, 0, 266, 109, - 110, 267, 268, 269, 0, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 304, 305, 306, 0, 0, 307, 308, - 309, 310, 311, 0, 312, 0, 0, 312, - 0, 0, 314, 315, 0, 0, 316, 317, - 318, 0, 0, 0, 158, 155, 163, 319, - 320, 321, 322, 323, 324, 325, 0, 0, - 326, 150, 164, 169, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, - 339, 340, 341, 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 377, 378 - }; - -#endif /* 1 */ - - - FT_LOCAL_DEF( FT_UShort ) - cff_get_standard_encoding( FT_UInt charcode ) - { - return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode] - : 0 ); - } - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cffload - - - /* read an offset from the index's stream current position */ - static FT_ULong - cff_index_read_offset( CFF_Index idx, - FT_Error *errorp ) - { - FT_Error error; - FT_Stream stream = idx->stream; - FT_Byte tmp[4]; - FT_ULong result = 0; - - - if ( !FT_STREAM_READ( tmp, idx->off_size ) ) - { - FT_Int nn; - - - for ( nn = 0; nn < idx->off_size; nn++ ) - result = ( result << 8 ) | tmp[nn]; - } - - *errorp = error; - return result; - } - - - static FT_Error - cff_index_init( CFF_Index idx, - FT_Stream stream, - FT_Bool load ) - { - FT_Error error; - FT_Memory memory = stream->memory; - FT_UShort count; - - - FT_MEM_ZERO( idx, sizeof ( *idx ) ); - - idx->stream = stream; - idx->start = FT_STREAM_POS(); - if ( !FT_READ_USHORT( count ) && - count > 0 ) - { - FT_Byte offsize; - FT_ULong size; - - - /* there is at least one element; read the offset size, */ - /* then access the offset table to compute the index's total size */ - if ( FT_READ_BYTE( offsize ) ) - goto Exit; - - if ( offsize < 1 || offsize > 4 ) - { - error = CFF_Err_Invalid_Table; - goto Exit; - } - - idx->count = count; - idx->off_size = offsize; - size = (FT_ULong)( count + 1 ) * offsize; - - idx->data_offset = idx->start + 3 + size; - - if ( FT_STREAM_SKIP( size - offsize ) ) - goto Exit; - - size = cff_index_read_offset( idx, &error ); - if ( error ) - goto Exit; - - if ( size == 0 ) - { - error = CFF_Err_Invalid_Table; - goto Exit; - } - - idx->data_size = --size; - - if ( load ) - { - /* load the data */ - if ( FT_FRAME_EXTRACT( size, idx->bytes ) ) - goto Exit; - } - else - { - /* skip the data */ - if ( FT_STREAM_SKIP( size ) ) - goto Exit; - } - } - - Exit: - if ( error ) - FT_FREE( idx->offsets ); - - return error; - } - - - static void - cff_index_done( CFF_Index idx ) - { - if ( idx->stream ) - { - FT_Stream stream = idx->stream; - FT_Memory memory = stream->memory; - - - if ( idx->bytes ) - FT_FRAME_RELEASE( idx->bytes ); - - FT_FREE( idx->offsets ); - FT_MEM_ZERO( idx, sizeof ( *idx ) ); - } - } - - - static FT_Error - cff_index_load_offsets( CFF_Index idx ) - { - FT_Error error = CFF_Err_Ok; - FT_Stream stream = idx->stream; - FT_Memory memory = stream->memory; - - - if ( idx->count > 0 && idx->offsets == NULL ) - { - FT_Byte offsize = idx->off_size; - FT_ULong data_size; - FT_Byte* p; - FT_Byte* p_end; - FT_ULong* poff; - - - data_size = (FT_ULong)( idx->count + 1 ) * offsize; - - if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) || - FT_STREAM_SEEK( idx->start + 3 ) || - FT_FRAME_ENTER( data_size ) ) - goto Exit; - - poff = idx->offsets; - p = (FT_Byte*)stream->cursor; - p_end = p + data_size; - - switch ( offsize ) - { - case 1: - for ( ; p < p_end; p++, poff++ ) - poff[0] = p[0]; - break; - - case 2: - for ( ; p < p_end; p += 2, poff++ ) - poff[0] = FT_PEEK_USHORT( p ); - break; - - case 3: - for ( ; p < p_end; p += 3, poff++ ) - poff[0] = FT_PEEK_OFF3( p ); - break; - - default: - for ( ; p < p_end; p += 4, poff++ ) - poff[0] = FT_PEEK_ULONG( p ); - } - - FT_FRAME_EXIT(); - } - - Exit: - if ( error ) - FT_FREE( idx->offsets ); - - return error; - } - - - /* Allocate a table containing pointers to an index's elements. */ - /* The `pool' argument makes this function convert the index */ - /* entries to C-style strings (this is, NULL-terminated). */ - static FT_Error - cff_index_get_pointers( CFF_Index idx, - FT_Byte*** table, - FT_Byte** pool ) - { - FT_Error error = CFF_Err_Ok; - FT_Memory memory = idx->stream->memory; - FT_Byte** t; - FT_Byte* new_bytes = NULL; - - - *table = NULL; - - if ( idx->offsets == NULL ) - { - error = cff_index_load_offsets( idx ); - if ( error ) - goto Exit; - } - - if ( idx->count > 0 && - !FT_NEW_ARRAY( t, idx->count + 1 ) && - ( !pool || !FT_ALLOC( new_bytes, - idx->data_size + idx->count ) ) ) - { - FT_ULong n, cur_offset; - FT_ULong extra = 0; - FT_Byte* org_bytes = idx->bytes; - - - /* at this point, `idx->offsets' can't be NULL */ - cur_offset = idx->offsets[0] - 1; - - /* sanity check */ - if ( cur_offset >= idx->data_size ) - { - FT_TRACE0(( "cff_index_get_pointers:" - " invalid first offset value %d set to zero\n", - cur_offset )); - cur_offset = 0; - } - - if ( !pool ) - t[0] = org_bytes + cur_offset; - else - t[0] = new_bytes + cur_offset; - - for ( n = 1; n <= idx->count; n++ ) - { - FT_ULong next_offset = idx->offsets[n] - 1; - - - /* empty slot + two sanity checks for invalid offset tables */ - if ( next_offset == 0 || - next_offset < cur_offset || - ( next_offset >= idx->data_size && n < idx->count ) ) - next_offset = cur_offset; - - if ( !pool ) - t[n] = org_bytes + next_offset; - else - { - t[n] = new_bytes + next_offset + extra; - - if ( next_offset != cur_offset ) - { - FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] ); - t[n][0] = '\0'; - t[n] += 1; - extra++; - } - } - - cur_offset = next_offset; - } - *table = t; - - if ( pool ) - *pool = new_bytes; - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - cff_index_access_element( CFF_Index idx, - FT_UInt element, - FT_Byte** pbytes, - FT_ULong* pbyte_len ) - { - FT_Error error = CFF_Err_Ok; - - - if ( idx && idx->count > element ) - { - /* compute start and end offsets */ - FT_Stream stream = idx->stream; - FT_ULong off1, off2 = 0; - - - /* load offsets from file or the offset table */ - if ( !idx->offsets ) - { - FT_ULong pos = element * idx->off_size; - - - if ( FT_STREAM_SEEK( idx->start + 3 + pos ) ) - goto Exit; - - off1 = cff_index_read_offset( idx, &error ); - if ( error ) - goto Exit; - - if ( off1 != 0 ) - { - do - { - element++; - off2 = cff_index_read_offset( idx, &error ); - } - while ( off2 == 0 && element < idx->count ); - } - } - else /* use offsets table */ - { - off1 = idx->offsets[element]; - if ( off1 ) - { - do - { - element++; - off2 = idx->offsets[element]; - - } while ( off2 == 0 && element < idx->count ); - } - } - - /* access element */ - if ( off1 && off2 > off1 ) - { - *pbyte_len = off2 - off1; - - if ( idx->bytes ) - { - /* this index was completely loaded in memory, that's easy */ - *pbytes = idx->bytes + off1 - 1; - } - else - { - /* this index is still on disk/file, access it through a frame */ - if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) || - FT_FRAME_EXTRACT( off2 - off1, *pbytes ) ) - goto Exit; - } - } - else - { - /* empty index element */ - *pbytes = 0; - *pbyte_len = 0; - } - } - else - error = CFF_Err_Invalid_Argument; - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - cff_index_forget_element( CFF_Index idx, - FT_Byte** pbytes ) - { - if ( idx->bytes == 0 ) - { - FT_Stream stream = idx->stream; - - - FT_FRAME_RELEASE( *pbytes ); - } - } - - - /* get an entry from Name INDEX */ - FT_LOCAL_DEF( FT_String* ) - cff_index_get_name( CFF_Font font, - FT_UInt element ) - { - CFF_Index idx = &font->name_index; - FT_Memory memory = idx->stream->memory; - FT_Byte* bytes; - FT_ULong byte_len; - FT_Error error; - FT_String* name = 0; - - - error = cff_index_access_element( idx, element, &bytes, &byte_len ); - if ( error ) - goto Exit; - - if ( !FT_ALLOC( name, byte_len + 1 ) ) - { - FT_MEM_COPY( name, bytes, byte_len ); - name[byte_len] = 0; - } - cff_index_forget_element( idx, &bytes ); - - Exit: - return name; - } - - - /* get an entry from String INDEX */ - FT_LOCAL_DEF( FT_String* ) - cff_index_get_string( CFF_Font font, - FT_UInt element ) - { - return ( element < font->num_strings ) - ? (FT_String*)font->strings[element] - : NULL; - } - - - FT_LOCAL_DEF( FT_String* ) - cff_index_get_sid_string( CFF_Font font, - FT_UInt sid ) - { - /* value 0xFFFFU indicates a missing dictionary entry */ - if ( sid == 0xFFFFU ) - return NULL; - - /* if it is not a standard string, return it */ - if ( sid > 390 ) - return cff_index_get_string( font, sid - 391 ); - - /* CID-keyed CFF fonts don't have glyph names */ - if ( !font->psnames ) - return NULL; - - /* this is a standard string */ - return (FT_String *)font->psnames->adobe_std_strings( sid ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** FD Select table support ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - - - static void - CFF_Done_FD_Select( CFF_FDSelect fdselect, - FT_Stream stream ) - { - if ( fdselect->data ) - FT_FRAME_RELEASE( fdselect->data ); - - fdselect->data_size = 0; - fdselect->format = 0; - fdselect->range_count = 0; - } - - - static FT_Error - CFF_Load_FD_Select( CFF_FDSelect fdselect, - FT_UInt num_glyphs, - FT_Stream stream, - FT_ULong offset ) - { - FT_Error error; - FT_Byte format; - FT_UInt num_ranges; - - - /* read format */ - if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) ) - goto Exit; - - fdselect->format = format; - fdselect->cache_count = 0; /* clear cache */ - - switch ( format ) - { - case 0: /* format 0, that's simple */ - fdselect->data_size = num_glyphs; - goto Load_Data; - - case 3: /* format 3, a tad more complex */ - if ( FT_READ_USHORT( num_ranges ) ) - goto Exit; - - fdselect->data_size = num_ranges * 3 + 2; - - Load_Data: - if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) ) - goto Exit; - break; - - default: /* hmm... that's wrong */ - error = CFF_Err_Invalid_File_Format; - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Byte ) - cff_fd_select_get( CFF_FDSelect fdselect, - FT_UInt glyph_index ) - { - FT_Byte fd = 0; - - - switch ( fdselect->format ) - { - case 0: - fd = fdselect->data[glyph_index]; - break; - - case 3: - /* first, compare to cache */ - if ( (FT_UInt)( glyph_index - fdselect->cache_first ) < - fdselect->cache_count ) - { - fd = fdselect->cache_fd; - break; - } - - /* then, lookup the ranges array */ - { - FT_Byte* p = fdselect->data; - FT_Byte* p_limit = p + fdselect->data_size; - FT_Byte fd2; - FT_UInt first, limit; - - - first = FT_NEXT_USHORT( p ); - do - { - if ( glyph_index < first ) - break; - - fd2 = *p++; - limit = FT_NEXT_USHORT( p ); - - if ( glyph_index < limit ) - { - fd = fd2; - - /* update cache */ - fdselect->cache_first = first; - fdselect->cache_count = limit-first; - fdselect->cache_fd = fd2; - break; - } - first = limit; - - } while ( p < p_limit ); - } - break; - - default: - ; - } - - return fd; - } - - - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** CFF font support ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - - static FT_Error - cff_charset_compute_cids( CFF_Charset charset, - FT_UInt num_glyphs, - FT_Memory memory ) - { - FT_Error error = CFF_Err_Ok; - FT_UInt i; - FT_Long j; - FT_UShort max_cid = 0; - - - if ( charset->max_cid > 0 ) - goto Exit; - - for ( i = 0; i < num_glyphs; i++ ) - if ( charset->sids[i] > max_cid ) - max_cid = charset->sids[i]; - max_cid++; - - if ( FT_NEW_ARRAY( charset->cids, max_cid ) ) - goto Exit; - - /* When multiple GIDs map to the same CID, we choose the lowest */ - /* GID. This is not described in any spec, but it matches the */ - /* behaviour of recent Acroread versions. */ - for ( j = num_glyphs - 1; j >= 0 ; j-- ) - charset->cids[charset->sids[j]] = (FT_UShort)j; - - charset->max_cid = max_cid; - charset->num_glyphs = num_glyphs; - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_UInt ) - cff_charset_cid_to_gindex( CFF_Charset charset, - FT_UInt cid ) - { - FT_UInt result = 0; - - - if ( cid < charset->max_cid ) - result = charset->cids[cid]; - - return result; - } - - - static void - cff_charset_free_cids( CFF_Charset charset, - FT_Memory memory ) - { - FT_FREE( charset->cids ); - charset->max_cid = 0; - } - - - static void - cff_charset_done( CFF_Charset charset, - FT_Stream stream ) - { - FT_Memory memory = stream->memory; - - - cff_charset_free_cids( charset, memory ); - - FT_FREE( charset->sids ); - charset->format = 0; - charset->offset = 0; - } - - - static FT_Error - cff_charset_load( CFF_Charset charset, - FT_UInt num_glyphs, - FT_Stream stream, - FT_ULong base_offset, - FT_ULong offset, - FT_Bool invert ) - { - FT_Memory memory = stream->memory; - FT_Error error = CFF_Err_Ok; - FT_UShort glyph_sid; - - - /* If the the offset is greater than 2, we have to parse the */ - /* charset table. */ - if ( offset > 2 ) - { - FT_UInt j; - - - charset->offset = base_offset + offset; - - /* Get the format of the table. */ - if ( FT_STREAM_SEEK( charset->offset ) || - FT_READ_BYTE( charset->format ) ) - goto Exit; - - /* Allocate memory for sids. */ - if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) - goto Exit; - - /* assign the .notdef glyph */ - charset->sids[0] = 0; - - switch ( charset->format ) - { - case 0: - if ( num_glyphs > 0 ) - { - if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) ) - goto Exit; - - for ( j = 1; j < num_glyphs; j++ ) - { - FT_UShort sid = FT_GET_USHORT(); - - - /* this constant is given in the CFF specification */ - if ( sid < 65000L ) - charset->sids[j] = sid; - else - { - FT_TRACE0(( "cff_charset_load:" - " invalid SID value %d set to zero\n", sid )); - charset->sids[j] = 0; - } - } - - FT_FRAME_EXIT(); - } - break; - - case 1: - case 2: - { - FT_UInt nleft; - FT_UInt i; - - - j = 1; - - while ( j < num_glyphs ) - { - /* Read the first glyph sid of the range. */ - if ( FT_READ_USHORT( glyph_sid ) ) - goto Exit; - - /* Read the number of glyphs in the range. */ - if ( charset->format == 2 ) - { - if ( FT_READ_USHORT( nleft ) ) - goto Exit; - } - else - { - if ( FT_READ_BYTE( nleft ) ) - goto Exit; - } - - /* check whether the range contains at least one valid glyph; */ - /* the constant is given in the CFF specification */ - if ( glyph_sid >= 65000L ) - { - FT_ERROR(( "cff_charset_load: invalid SID range\n" )); - error = CFF_Err_Invalid_File_Format; - goto Exit; - } - - /* try to rescue some of the SIDs if `nleft' is too large */ - if ( nleft > 65000L - 1L || glyph_sid >= 65000L - nleft ) - { - FT_ERROR(( "cff_charset_load: invalid SID range trimmed\n" )); - nleft = ( FT_UInt )( 65000L - 1L - glyph_sid ); - } - - /* Fill in the range of sids -- `nleft + 1' glyphs. */ - for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ ) - charset->sids[j] = glyph_sid; - } - } - break; - - default: - FT_ERROR(( "cff_charset_load: invalid table format\n" )); - error = CFF_Err_Invalid_File_Format; - goto Exit; - } - } - else - { - /* Parse default tables corresponding to offset == 0, 1, or 2. */ - /* CFF specification intimates the following: */ - /* */ - /* In order to use a predefined charset, the following must be */ - /* true: The charset constructed for the glyphs in the font's */ - /* charstrings dictionary must match the predefined charset in */ - /* the first num_glyphs. */ - - charset->offset = offset; /* record charset type */ - - switch ( (FT_UInt)offset ) - { - case 0: - if ( num_glyphs > 229 ) - { - FT_ERROR(( "cff_charset_load: implicit charset larger than\n" - "predefined charset (Adobe ISO-Latin)\n" )); - error = CFF_Err_Invalid_File_Format; - goto Exit; - } - - /* Allocate memory for sids. */ - if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) - goto Exit; - - /* Copy the predefined charset into the allocated memory. */ - FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs ); - - break; - - case 1: - if ( num_glyphs > 166 ) - { - FT_ERROR(( "cff_charset_load: implicit charset larger than\n" - "predefined charset (Adobe Expert)\n" )); - error = CFF_Err_Invalid_File_Format; - goto Exit; - } - - /* Allocate memory for sids. */ - if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) - goto Exit; - - /* Copy the predefined charset into the allocated memory. */ - FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs ); - - break; - - case 2: - if ( num_glyphs > 87 ) - { - FT_ERROR(( "cff_charset_load: implicit charset larger than\n" - "predefined charset (Adobe Expert Subset)\n" )); - error = CFF_Err_Invalid_File_Format; - goto Exit; - } - - /* Allocate memory for sids. */ - if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) - goto Exit; - - /* Copy the predefined charset into the allocated memory. */ - FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs ); - - break; - - default: - error = CFF_Err_Invalid_File_Format; - goto Exit; - } - } - - /* we have to invert the `sids' array for subsetted CID-keyed fonts */ - if ( invert ) - error = cff_charset_compute_cids( charset, num_glyphs, memory ); - - Exit: - /* Clean up if there was an error. */ - if ( error ) - { - FT_FREE( charset->sids ); - FT_FREE( charset->cids ); - charset->format = 0; - charset->offset = 0; - charset->sids = 0; - } - - return error; - } - - - static void - cff_encoding_done( CFF_Encoding encoding ) - { - encoding->format = 0; - encoding->offset = 0; - encoding->count = 0; - } - - - static FT_Error - cff_encoding_load( CFF_Encoding encoding, - CFF_Charset charset, - FT_UInt num_glyphs, - FT_Stream stream, - FT_ULong base_offset, - FT_ULong offset ) - { - FT_Error error = CFF_Err_Ok; - FT_UInt count; - FT_UInt j; - FT_UShort glyph_sid; - FT_UInt glyph_code; - - - /* Check for charset->sids. If we do not have this, we fail. */ - if ( !charset->sids ) - { - error = CFF_Err_Invalid_File_Format; - goto Exit; - } - - /* Zero out the code to gid/sid mappings. */ - for ( j = 0; j < 256; j++ ) - { - encoding->sids [j] = 0; - encoding->codes[j] = 0; - } - - /* Note: The encoding table in a CFF font is indexed by glyph index; */ - /* the first encoded glyph index is 1. Hence, we read the character */ - /* code (`glyph_code') at index j and make the assignment: */ - /* */ - /* encoding->codes[glyph_code] = j + 1 */ - /* */ - /* We also make the assignment: */ - /* */ - /* encoding->sids[glyph_code] = charset->sids[j + 1] */ - /* */ - /* This gives us both a code to GID and a code to SID mapping. */ - - if ( offset > 1 ) - { - encoding->offset = base_offset + offset; - - /* we need to parse the table to determine its size */ - if ( FT_STREAM_SEEK( encoding->offset ) || - FT_READ_BYTE( encoding->format ) || - FT_READ_BYTE( count ) ) - goto Exit; - - switch ( encoding->format & 0x7F ) - { - case 0: - { - FT_Byte* p; - - - /* By convention, GID 0 is always ".notdef" and is never */ - /* coded in the font. Hence, the number of codes found */ - /* in the table is `count+1'. */ - /* */ - encoding->count = count + 1; - - if ( FT_FRAME_ENTER( count ) ) - goto Exit; - - p = (FT_Byte*)stream->cursor; - - for ( j = 1; j <= count; j++ ) - { - glyph_code = *p++; - - /* Make sure j is not too big. */ - if ( j < num_glyphs ) - { - /* Assign code to GID mapping. */ - encoding->codes[glyph_code] = (FT_UShort)j; - - /* Assign code to SID mapping. */ - encoding->sids[glyph_code] = charset->sids[j]; - } - } - - FT_FRAME_EXIT(); - } - break; - - case 1: - { - FT_UInt nleft; - FT_UInt i = 1; - FT_UInt k; - - - encoding->count = 0; - - /* Parse the Format1 ranges. */ - for ( j = 0; j < count; j++, i += nleft ) - { - /* Read the first glyph code of the range. */ - if ( FT_READ_BYTE( glyph_code ) ) - goto Exit; - - /* Read the number of codes in the range. */ - if ( FT_READ_BYTE( nleft ) ) - goto Exit; - - /* Increment nleft, so we read `nleft + 1' codes/sids. */ - nleft++; - - /* compute max number of character codes */ - if ( (FT_UInt)nleft > encoding->count ) - encoding->count = nleft; - - /* Fill in the range of codes/sids. */ - for ( k = i; k < nleft + i; k++, glyph_code++ ) - { - /* Make sure k is not too big. */ - if ( k < num_glyphs && glyph_code < 256 ) - { - /* Assign code to GID mapping. */ - encoding->codes[glyph_code] = (FT_UShort)k; - - /* Assign code to SID mapping. */ - encoding->sids[glyph_code] = charset->sids[k]; - } - } - } - - /* simple check; one never knows what can be found in a font */ - if ( encoding->count > 256 ) - encoding->count = 256; - } - break; - - default: - FT_ERROR(( "cff_encoding_load: invalid table format\n" )); - error = CFF_Err_Invalid_File_Format; - goto Exit; - } - - /* Parse supplemental encodings, if any. */ - if ( encoding->format & 0x80 ) - { - FT_UInt gindex; - - - /* count supplements */ - if ( FT_READ_BYTE( count ) ) - goto Exit; - - for ( j = 0; j < count; j++ ) - { - /* Read supplemental glyph code. */ - if ( FT_READ_BYTE( glyph_code ) ) - goto Exit; - - /* Read the SID associated with this glyph code. */ - if ( FT_READ_USHORT( glyph_sid ) ) - goto Exit; - - /* Assign code to SID mapping. */ - encoding->sids[glyph_code] = glyph_sid; - - /* First, look up GID which has been assigned to */ - /* SID glyph_sid. */ - for ( gindex = 0; gindex < num_glyphs; gindex++ ) - { - if ( charset->sids[gindex] == glyph_sid ) - { - encoding->codes[glyph_code] = (FT_UShort)gindex; - break; - } - } - } - } - } - else - { - /* We take into account the fact a CFF font can use a predefined */ - /* encoding without containing all of the glyphs encoded by this */ - /* encoding (see the note at the end of section 12 in the CFF */ - /* specification). */ - - switch ( (FT_UInt)offset ) - { - case 0: - /* First, copy the code to SID mapping. */ - FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 ); - goto Populate; - - case 1: - /* First, copy the code to SID mapping. */ - FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 ); - - Populate: - /* Construct code to GID mapping from code to SID mapping */ - /* and charset. */ - - encoding->count = 0; - - error = cff_charset_compute_cids( charset, num_glyphs, - stream->memory ); - if ( error ) - goto Exit; - - for ( j = 0; j < 256; j++ ) - { - FT_UInt sid = encoding->sids[j]; - FT_UInt gid = 0; - - - if ( sid ) - gid = cff_charset_cid_to_gindex( charset, sid ); - - if ( gid != 0 ) - { - encoding->codes[j] = (FT_UShort)gid; - - if ( encoding->count < j + 1 ) - encoding->count = j + 1; - } - else - { - encoding->codes[j] = 0; - encoding->sids [j] = 0; - } - } - break; - - default: - FT_ERROR(( "cff_encoding_load: invalid table format\n" )); - error = CFF_Err_Invalid_File_Format; - goto Exit; - } - } - - Exit: - - /* Clean up if there was an error. */ - return error; - } - - - static FT_Error - cff_subfont_load( CFF_SubFont font, - CFF_Index idx, - FT_UInt font_index, - FT_Stream stream, - FT_ULong base_offset, - FT_Library library ) - { - FT_Error error; - CFF_ParserRec parser; - FT_Byte* dict = NULL; - FT_ULong dict_len; - CFF_FontRecDict top = &font->font_dict; - CFF_Private priv = &font->private_dict; - - - cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library ); - - /* set defaults */ - FT_MEM_ZERO( top, sizeof ( *top ) ); - - top->underline_position = -100L << 16; - top->underline_thickness = 50L << 16; - top->charstring_type = 2; - top->font_matrix.xx = 0x10000L; - top->font_matrix.yy = 0x10000L; - top->cid_count = 8720; - - /* we use the implementation specific SID value 0xFFFF to indicate */ - /* missing entries */ - top->version = 0xFFFFU; - top->notice = 0xFFFFU; - top->copyright = 0xFFFFU; - top->full_name = 0xFFFFU; - top->family_name = 0xFFFFU; - top->weight = 0xFFFFU; - top->embedded_postscript = 0xFFFFU; - - top->cid_registry = 0xFFFFU; - top->cid_ordering = 0xFFFFU; - top->cid_font_name = 0xFFFFU; - - error = cff_index_access_element( idx, font_index, &dict, &dict_len ); - if ( !error ) - error = cff_parser_run( &parser, dict, dict + dict_len ); - - cff_index_forget_element( idx, &dict ); - - if ( error ) - goto Exit; - - /* if it is a CID font, we stop there */ - if ( top->cid_registry != 0xFFFFU ) - goto Exit; - - /* parse the private dictionary, if any */ - if ( top->private_offset && top->private_size ) - { - /* set defaults */ - FT_MEM_ZERO( priv, sizeof ( *priv ) ); - - priv->blue_shift = 7; - priv->blue_fuzz = 1; - priv->lenIV = -1; - priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); - priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); - - cff_parser_init( &parser, CFF_CODE_PRIVATE, priv, library ); - - if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) || - FT_FRAME_ENTER( font->font_dict.private_size ) ) - goto Exit; - - error = cff_parser_run( &parser, - (FT_Byte*)stream->cursor, - (FT_Byte*)stream->limit ); - FT_FRAME_EXIT(); - if ( error ) - goto Exit; - - /* ensure that `num_blue_values' is even */ - priv->num_blue_values &= ~1; - } - - /* read the local subrs, if any */ - if ( priv->local_subrs_offset ) - { - if ( FT_STREAM_SEEK( base_offset + top->private_offset + - priv->local_subrs_offset ) ) - goto Exit; - - error = cff_index_init( &font->local_subrs_index, stream, 1 ); - if ( error ) - goto Exit; - - error = cff_index_get_pointers( &font->local_subrs_index, - &font->local_subrs, NULL ); - if ( error ) - goto Exit; - } - - Exit: - return error; - } - - - static void - cff_subfont_done( FT_Memory memory, - CFF_SubFont subfont ) - { - if ( subfont ) - { - cff_index_done( &subfont->local_subrs_index ); - FT_FREE( subfont->local_subrs ); - } - } - - - FT_LOCAL_DEF( FT_Error ) - cff_font_load( FT_Library library, - FT_Stream stream, - FT_Int face_index, - CFF_Font font, - FT_Bool pure_cff ) - { - static const FT_Frame_Field cff_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE CFF_FontRec - - FT_FRAME_START( 4 ), - FT_FRAME_BYTE( version_major ), - FT_FRAME_BYTE( version_minor ), - FT_FRAME_BYTE( header_size ), - FT_FRAME_BYTE( absolute_offsize ), - FT_FRAME_END - }; - - FT_Error error; - FT_Memory memory = stream->memory; - FT_ULong base_offset; - CFF_FontRecDict dict; - CFF_IndexRec string_index; - - - FT_ZERO( font ); - FT_ZERO( &string_index ); - - font->stream = stream; - font->memory = memory; - dict = &font->top_font.font_dict; - base_offset = FT_STREAM_POS(); - - /* read CFF font header */ - if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) ) - goto Exit; - - /* check format */ - if ( font->version_major != 1 || - font->header_size < 4 || - font->absolute_offsize > 4 ) - { - FT_TRACE2(( "[not a CFF font header]\n" )); - error = CFF_Err_Unknown_File_Format; - goto Exit; - } - - /* skip the rest of the header */ - if ( FT_STREAM_SKIP( font->header_size - 4 ) ) - goto Exit; - - /* read the name, top dict, string and global subrs index */ - if ( FT_SET_ERROR( cff_index_init( &font->name_index, - stream, 0 ) ) || - FT_SET_ERROR( cff_index_init( &font->font_dict_index, - stream, 0 ) ) || - FT_SET_ERROR( cff_index_init( &string_index, - stream, 1 ) ) || - FT_SET_ERROR( cff_index_init( &font->global_subrs_index, - stream, 1 ) ) || - FT_SET_ERROR( cff_index_get_pointers( &string_index, - &font->strings, - &font->string_pool ) ) ) - goto Exit; - - font->num_strings = string_index.count; - - /* well, we don't really forget the `disabled' fonts... */ - font->num_faces = font->name_index.count; - if ( face_index >= (FT_Int)font->num_faces ) - { - FT_ERROR(( "cff_font_load: incorrect face index = %d\n", - face_index )); - error = CFF_Err_Invalid_Argument; - } - - /* in case of a font format check, simply exit now */ - if ( face_index < 0 ) - goto Exit; - - /* now, parse the top-level font dictionary */ - error = cff_subfont_load( &font->top_font, - &font->font_dict_index, - face_index, - stream, - base_offset, - library ); - if ( error ) - goto Exit; - - if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) - goto Exit; - - error = cff_index_init( &font->charstrings_index, stream, 0 ); - if ( error ) - goto Exit; - - /* now, check for a CID font */ - if ( dict->cid_registry != 0xFFFFU ) - { - CFF_IndexRec fd_index; - CFF_SubFont sub; - FT_UInt idx; - - - /* this is a CID-keyed font, we must now allocate a table of */ - /* sub-fonts, then load each of them separately */ - if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) ) - goto Exit; - - error = cff_index_init( &fd_index, stream, 0 ); - if ( error ) - goto Exit; - - if ( fd_index.count > CFF_MAX_CID_FONTS ) - { - FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" )); - goto Fail_CID; - } - - /* allocate & read each font dict independently */ - font->num_subfonts = fd_index.count; - if ( FT_NEW_ARRAY( sub, fd_index.count ) ) - goto Fail_CID; - - /* set up pointer table */ - for ( idx = 0; idx < fd_index.count; idx++ ) - font->subfonts[idx] = sub + idx; - - /* now load each subfont independently */ - for ( idx = 0; idx < fd_index.count; idx++ ) - { - sub = font->subfonts[idx]; - error = cff_subfont_load( sub, &fd_index, idx, - stream, base_offset, library ); - if ( error ) - goto Fail_CID; - } - - /* now load the FD Select array */ - error = CFF_Load_FD_Select( &font->fd_select, - font->charstrings_index.count, - stream, - base_offset + dict->cid_fd_select_offset ); - - Fail_CID: - cff_index_done( &fd_index ); - - if ( error ) - goto Exit; - } - else - font->num_subfonts = 0; - - /* read the charstrings index now */ - if ( dict->charstrings_offset == 0 ) - { - FT_ERROR(( "cff_font_load: no charstrings offset\n" )); - error = CFF_Err_Unknown_File_Format; - goto Exit; - } - - font->num_glyphs = font->charstrings_index.count; - - error = cff_index_get_pointers( &font->global_subrs_index, - &font->global_subrs, NULL ); - - if ( error ) - goto Exit; - - /* read the Charset and Encoding tables if available */ - if ( font->num_glyphs > 0 ) - { - FT_Bool invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff ); - - - error = cff_charset_load( &font->charset, font->num_glyphs, stream, - base_offset, dict->charset_offset, invert ); - if ( error ) - goto Exit; - - /* CID-keyed CFFs don't have an encoding */ - if ( dict->cid_registry == 0xFFFFU ) - { - error = cff_encoding_load( &font->encoding, - &font->charset, - font->num_glyphs, - stream, - base_offset, - dict->encoding_offset ); - if ( error ) - goto Exit; - } - } - - /* get the font name (/CIDFontName for CID-keyed fonts, */ - /* /FontName otherwise) */ - font->font_name = cff_index_get_name( font, face_index ); - - Exit: - cff_index_done( &string_index ); - - return error; - } - - - FT_LOCAL_DEF( void ) - cff_font_done( CFF_Font font ) - { - FT_Memory memory = font->memory; - FT_UInt idx; - - - cff_index_done( &font->global_subrs_index ); - cff_index_done( &font->font_dict_index ); - cff_index_done( &font->name_index ); - cff_index_done( &font->charstrings_index ); - - /* release font dictionaries, but only if working with */ - /* a CID keyed CFF font */ - if ( font->num_subfonts > 0 ) - { - for ( idx = 0; idx < font->num_subfonts; idx++ ) - cff_subfont_done( memory, font->subfonts[idx] ); - - /* the subfonts array has been allocated as a single block */ - FT_FREE( font->subfonts[0] ); - } - - cff_encoding_done( &font->encoding ); - cff_charset_done( &font->charset, font->stream ); - - cff_subfont_done( memory, &font->top_font ); - - CFF_Done_FD_Select( &font->fd_select, font->stream ); - - FT_FREE( font->font_info ); - - FT_FREE( font->font_name ); - FT_FREE( font->global_subrs ); - FT_FREE( font->strings ); - FT_FREE( font->string_pool ); - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffload.h b/android/jni/ndk_modules/freetype/src/cff/cffload.h deleted file mode 100644 index c755de9a..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffload.h +++ /dev/null @@ -1,83 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffload.h */ -/* */ -/* OpenType & CFF data/program tables loader (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2007, 2008, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CFFLOAD_H__ -#define __CFFLOAD_H__ - - -#include <ft2build.h> -#include "cfftypes.h" - - -FT_BEGIN_HEADER - - FT_LOCAL( FT_UShort ) - cff_get_standard_encoding( FT_UInt charcode ); - - - FT_LOCAL( FT_String* ) - cff_index_get_string( CFF_Font font, - FT_UInt element ); - - FT_LOCAL( FT_String* ) - cff_index_get_sid_string( CFF_Font font, - FT_UInt sid ); - - - FT_LOCAL( FT_Error ) - cff_index_access_element( CFF_Index idx, - FT_UInt element, - FT_Byte** pbytes, - FT_ULong* pbyte_len ); - - FT_LOCAL( void ) - cff_index_forget_element( CFF_Index idx, - FT_Byte** pbytes ); - - FT_LOCAL( FT_String* ) - cff_index_get_name( CFF_Font font, - FT_UInt element ); - - - FT_LOCAL( FT_UInt ) - cff_charset_cid_to_gindex( CFF_Charset charset, - FT_UInt cid ); - - - FT_LOCAL( FT_Error ) - cff_font_load( FT_Library library, - FT_Stream stream, - FT_Int face_index, - CFF_Font font, - FT_Bool pure_cff ); - - FT_LOCAL( void ) - cff_font_done( CFF_Font font ); - - - FT_LOCAL( FT_Byte ) - cff_fd_select_get( CFF_FDSelect fdselect, - FT_UInt glyph_index ); - - -FT_END_HEADER - -#endif /* __CFFLOAD_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffobjs.c b/android/jni/ndk_modules/freetype/src/cff/cffobjs.c deleted file mode 100644 index f8b07c35..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffobjs.c +++ /dev/null @@ -1,1008 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffobjs.c */ -/* */ -/* OpenType objects manager (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_STREAM_H -#include FT_ERRORS_H -#include FT_TRUETYPE_IDS_H -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_SFNT_H -#include "cffobjs.h" -#include "cffload.h" -#include "cffcmap.h" -#include "cfferrs.h" -#include "cffpic.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cffobjs - - - /*************************************************************************/ - /* */ - /* SIZE FUNCTIONS */ - /* */ - /* Note that we store the global hints in the size's `internal' root */ - /* field. */ - /* */ - /*************************************************************************/ - - - static PSH_Globals_Funcs - cff_size_get_globals_funcs( CFF_Size size ) - { - CFF_Face face = (CFF_Face)size->root.face; - CFF_Font font = (CFF_Font)face->extra.data; - PSHinter_Service pshinter = font->pshinter; - FT_Module module; - - - module = FT_Get_Module( size->root.face->driver->root.library, - "pshinter" ); - return ( module && pshinter && pshinter->get_globals_funcs ) - ? pshinter->get_globals_funcs( module ) - : 0; - } - - - FT_LOCAL_DEF( void ) - cff_size_done( FT_Size cffsize ) /* CFF_Size */ - { - CFF_Size size = (CFF_Size)cffsize; - CFF_Face face = (CFF_Face)size->root.face; - CFF_Font font = (CFF_Font)face->extra.data; - CFF_Internal internal = (CFF_Internal)cffsize->internal; - - - if ( internal ) - { - PSH_Globals_Funcs funcs; - - - funcs = cff_size_get_globals_funcs( size ); - if ( funcs ) - { - FT_UInt i; - - - funcs->destroy( internal->topfont ); - - for ( i = font->num_subfonts; i > 0; i-- ) - funcs->destroy( internal->subfonts[i - 1] ); - } - - /* `internal' is freed by destroy_size (in ftobjs.c) */ - } - } - - - /* CFF and Type 1 private dictionaries have slightly different */ - /* structures; we need to synthesize a Type 1 dictionary on the fly */ - - static void - cff_make_private_dict( CFF_SubFont subfont, - PS_Private priv ) - { - CFF_Private cpriv = &subfont->private_dict; - FT_UInt n, count; - - - FT_MEM_ZERO( priv, sizeof ( *priv ) ); - - count = priv->num_blue_values = cpriv->num_blue_values; - for ( n = 0; n < count; n++ ) - priv->blue_values[n] = (FT_Short)cpriv->blue_values[n]; - - count = priv->num_other_blues = cpriv->num_other_blues; - for ( n = 0; n < count; n++ ) - priv->other_blues[n] = (FT_Short)cpriv->other_blues[n]; - - count = priv->num_family_blues = cpriv->num_family_blues; - for ( n = 0; n < count; n++ ) - priv->family_blues[n] = (FT_Short)cpriv->family_blues[n]; - - count = priv->num_family_other_blues = cpriv->num_family_other_blues; - for ( n = 0; n < count; n++ ) - priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n]; - - priv->blue_scale = cpriv->blue_scale; - priv->blue_shift = (FT_Int)cpriv->blue_shift; - priv->blue_fuzz = (FT_Int)cpriv->blue_fuzz; - - priv->standard_width[0] = (FT_UShort)cpriv->standard_width; - priv->standard_height[0] = (FT_UShort)cpriv->standard_height; - - count = priv->num_snap_widths = cpriv->num_snap_widths; - for ( n = 0; n < count; n++ ) - priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n]; - - count = priv->num_snap_heights = cpriv->num_snap_heights; - for ( n = 0; n < count; n++ ) - priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n]; - - priv->force_bold = cpriv->force_bold; - priv->language_group = cpriv->language_group; - priv->lenIV = cpriv->lenIV; - } - - - FT_LOCAL_DEF( FT_Error ) - cff_size_init( FT_Size cffsize ) /* CFF_Size */ - { - CFF_Size size = (CFF_Size)cffsize; - FT_Error error = CFF_Err_Ok; - PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size ); - - - if ( funcs ) - { - CFF_Face face = (CFF_Face)cffsize->face; - CFF_Font font = (CFF_Font)face->extra.data; - CFF_Internal internal; - - PS_PrivateRec priv; - FT_Memory memory = cffsize->face->memory; - - FT_UInt i; - - - if ( FT_NEW( internal ) ) - goto Exit; - - cff_make_private_dict( &font->top_font, &priv ); - error = funcs->create( cffsize->face->memory, &priv, - &internal->topfont ); - if ( error ) - goto Exit; - - for ( i = font->num_subfonts; i > 0; i-- ) - { - CFF_SubFont sub = font->subfonts[i - 1]; - - - cff_make_private_dict( sub, &priv ); - error = funcs->create( cffsize->face->memory, &priv, - &internal->subfonts[i - 1] ); - if ( error ) - goto Exit; - } - - cffsize->internal = (FT_Size_Internal)(void*)internal; - } - - size->strike_index = 0xFFFFFFFFUL; - - Exit: - return error; - } - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - FT_LOCAL_DEF( FT_Error ) - cff_size_select( FT_Size size, - FT_ULong strike_index ) - { - CFF_Size cffsize = (CFF_Size)size; - PSH_Globals_Funcs funcs; - - - cffsize->strike_index = strike_index; - - FT_Select_Metrics( size->face, strike_index ); - - funcs = cff_size_get_globals_funcs( cffsize ); - - if ( funcs ) - { - CFF_Face face = (CFF_Face)size->face; - CFF_Font font = (CFF_Font)face->extra.data; - CFF_Internal internal = (CFF_Internal)size->internal; - - FT_ULong top_upm = font->top_font.font_dict.units_per_em; - FT_UInt i; - - - funcs->set_scale( internal->topfont, - size->metrics.x_scale, size->metrics.y_scale, - 0, 0 ); - - for ( i = font->num_subfonts; i > 0; i-- ) - { - CFF_SubFont sub = font->subfonts[i - 1]; - FT_ULong sub_upm = sub->font_dict.units_per_em; - FT_Pos x_scale, y_scale; - - - if ( top_upm != sub_upm ) - { - x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); - y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); - } - else - { - x_scale = size->metrics.x_scale; - y_scale = size->metrics.y_scale; - } - - funcs->set_scale( internal->subfonts[i - 1], - x_scale, y_scale, 0, 0 ); - } - } - - return CFF_Err_Ok; - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - - FT_LOCAL_DEF( FT_Error ) - cff_size_request( FT_Size size, - FT_Size_Request req ) - { - CFF_Size cffsize = (CFF_Size)size; - PSH_Globals_Funcs funcs; - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - if ( FT_HAS_FIXED_SIZES( size->face ) ) - { - CFF_Face cffface = (CFF_Face)size->face; - SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; - FT_ULong strike_index; - - - if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) ) - cffsize->strike_index = 0xFFFFFFFFUL; - else - return cff_size_select( size, strike_index ); - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - FT_Request_Metrics( size->face, req ); - - funcs = cff_size_get_globals_funcs( cffsize ); - - if ( funcs ) - { - CFF_Face cffface = (CFF_Face)size->face; - CFF_Font font = (CFF_Font)cffface->extra.data; - CFF_Internal internal = (CFF_Internal)size->internal; - - FT_ULong top_upm = font->top_font.font_dict.units_per_em; - FT_UInt i; - - - funcs->set_scale( internal->topfont, - size->metrics.x_scale, size->metrics.y_scale, - 0, 0 ); - - for ( i = font->num_subfonts; i > 0; i-- ) - { - CFF_SubFont sub = font->subfonts[i - 1]; - FT_ULong sub_upm = sub->font_dict.units_per_em; - FT_Pos x_scale, y_scale; - - - if ( top_upm != sub_upm ) - { - x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); - y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); - } - else - { - x_scale = size->metrics.x_scale; - y_scale = size->metrics.y_scale; - } - - funcs->set_scale( internal->subfonts[i - 1], - x_scale, y_scale, 0, 0 ); - } - } - - return CFF_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* SLOT FUNCTIONS */ - /* */ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - cff_slot_done( FT_GlyphSlot slot ) - { - slot->internal->glyph_hints = 0; - } - - - FT_LOCAL_DEF( FT_Error ) - cff_slot_init( FT_GlyphSlot slot ) - { - CFF_Face face = (CFF_Face)slot->face; - CFF_Font font = (CFF_Font)face->extra.data; - PSHinter_Service pshinter = font->pshinter; - - - if ( pshinter ) - { - FT_Module module; - - - module = FT_Get_Module( slot->face->driver->root.library, - "pshinter" ); - if ( module ) - { - T2_Hints_Funcs funcs; - - - funcs = pshinter->get_t2_funcs( module ); - slot->internal->glyph_hints = (void*)funcs; - } - } - - return CFF_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* FACE FUNCTIONS */ - /* */ - /*************************************************************************/ - - static FT_String* - cff_strcpy( FT_Memory memory, - const FT_String* source ) - { - FT_Error error; - FT_String* result; - - - (void)FT_STRDUP( result, source ); - - FT_UNUSED( error ); - - return result; - } - - - /* Strip all subset prefixes of the form `ABCDEF+'. Usually, there */ - /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold' */ - /* have been seen in the wild. */ - - static void - remove_subset_prefix( FT_String* name ) - { - FT_Int32 idx = 0; - FT_Int32 length = strlen( name ) + 1; - FT_Bool continue_search = 1; - - - while ( continue_search ) - { - if ( length >= 7 && name[6] == '+' ) - { - for ( idx = 0; idx < 6; idx++ ) - { - /* ASCII uppercase letters */ - if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) ) - continue_search = 0; - } - - if ( continue_search ) - { - for ( idx = 7; idx < length; idx++ ) - name[idx - 7] = name[idx]; - } - } - else - continue_search = 0; - } - } - - - FT_LOCAL_DEF( FT_Error ) - cff_face_init( FT_Stream stream, - FT_Face cffface, /* CFF_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ) - { - CFF_Face face = (CFF_Face)cffface; - FT_Error error; - SFNT_Service sfnt; - FT_Service_PsCMaps psnames; - PSHinter_Service pshinter; - FT_Bool pure_cff = 1; - FT_Bool sfnt_format = 0; - FT_Library library = cffface->driver->root.library; - - - sfnt = (SFNT_Service)FT_Get_Module_Interface( - library, "sfnt" ); - if ( !sfnt ) - goto Bad_Format; - - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); - - pshinter = (PSHinter_Service)FT_Get_Module_Interface( - library, "pshinter" ); - - /* create input stream from resource */ - if ( FT_STREAM_SEEK( 0 ) ) - goto Exit; - - /* check whether we have a valid OpenType file */ - error = sfnt->init_face( stream, face, face_index, num_params, params ); - if ( !error ) - { - if ( face->format_tag != TTAG_OTTO ) /* `OTTO'; OpenType/CFF font */ - { - FT_TRACE2(( "[not a valid OpenType/CFF font]\n" )); - goto Bad_Format; - } - - /* if we are performing a simple font format check, exit immediately */ - if ( face_index < 0 ) - return CFF_Err_Ok; - - /* UNDOCUMENTED! A CFF in an SFNT can have only a single font. */ - if ( face_index > 0 ) - { - FT_ERROR(( "cff_face_init: invalid face index\n" )); - error = CFF_Err_Invalid_Argument; - goto Exit; - } - - sfnt_format = 1; - - /* now, the font can be either an OpenType/CFF font, or an SVG CEF */ - /* font; in the latter case it doesn't have a `head' table */ - error = face->goto_table( face, TTAG_head, stream, 0 ); - if ( !error ) - { - pure_cff = 0; - - /* load font directory */ - error = sfnt->load_face( stream, face, 0, num_params, params ); - if ( error ) - goto Exit; - } - else - { - /* load the `cmap' table explicitly */ - error = sfnt->load_cmap( face, stream ); - if ( error ) - goto Exit; - - /* XXX: we don't load the GPOS table, as OpenType Layout */ - /* support will be added later to a layout library on top of */ - /* FreeType 2 */ - } - - /* now load the CFF part of the file */ - error = face->goto_table( face, TTAG_CFF, stream, 0 ); - if ( error ) - goto Exit; - } - else - { - /* rewind to start of file; we are going to load a pure-CFF font */ - if ( FT_STREAM_SEEK( 0 ) ) - goto Exit; - error = CFF_Err_Ok; - } - - /* now load and parse the CFF table in the file */ - { - CFF_Font cff; - CFF_FontRecDict dict; - FT_Memory memory = cffface->memory; - FT_Int32 flags; - FT_UInt i; - - - if ( FT_NEW( cff ) ) - goto Exit; - - face->extra.data = cff; - error = cff_font_load( library, stream, face_index, cff, pure_cff ); - if ( error ) - goto Exit; - - cff->pshinter = pshinter; - cff->psnames = psnames; - - cffface->face_index = face_index; - - /* Complement the root flags with some interesting information. */ - /* Note that this is only necessary for pure CFF and CEF fonts; */ - /* SFNT based fonts use the `name' table instead. */ - - cffface->num_glyphs = cff->num_glyphs; - - dict = &cff->top_font.font_dict; - - /* we need the `PSNames' module for CFF and CEF formats */ - /* which aren't CID-keyed */ - if ( dict->cid_registry == 0xFFFFU && !psnames ) - { - FT_ERROR(( "cff_face_init:" - " cannot open CFF & CEF fonts\n" - " " - " without the `PSNames' module\n" )); - goto Bad_Format; - } - - if ( !dict->units_per_em ) - dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM; - - /* Normalize the font matrix so that `matrix->xx' is 1; the */ - /* scaling is done with `units_per_em' then (at this point, */ - /* it already contains the scaling factor, but without */ - /* normalization of the matrix). */ - /* */ - /* Note that the offsets must be expressed in integer font */ - /* units. */ - - { - FT_Matrix* matrix = &dict->font_matrix; - FT_Vector* offset = &dict->font_offset; - FT_ULong* upm = &dict->units_per_em; - FT_Fixed temp = FT_ABS( matrix->yy ); - - - if ( temp != 0x10000L ) - { - *upm = FT_DivFix( *upm, temp ); - - matrix->xx = FT_DivFix( matrix->xx, temp ); - matrix->yx = FT_DivFix( matrix->yx, temp ); - matrix->xy = FT_DivFix( matrix->xy, temp ); - matrix->yy = FT_DivFix( matrix->yy, temp ); - offset->x = FT_DivFix( offset->x, temp ); - offset->y = FT_DivFix( offset->y, temp ); - } - - offset->x >>= 16; - offset->y >>= 16; - } - - for ( i = cff->num_subfonts; i > 0; i-- ) - { - CFF_FontRecDict sub = &cff->subfonts[i - 1]->font_dict; - CFF_FontRecDict top = &cff->top_font.font_dict; - - FT_Matrix* matrix; - FT_Vector* offset; - FT_ULong* upm; - FT_Fixed temp; - - - if ( sub->units_per_em ) - { - FT_Long scaling; - - - if ( top->units_per_em > 1 && sub->units_per_em > 1 ) - scaling = FT_MIN( top->units_per_em, sub->units_per_em ); - else - scaling = 1; - - FT_Matrix_Multiply_Scaled( &top->font_matrix, - &sub->font_matrix, - scaling ); - FT_Vector_Transform_Scaled( &sub->font_offset, - &top->font_matrix, - scaling ); - - sub->units_per_em = FT_MulDiv( sub->units_per_em, - top->units_per_em, - scaling ); - } - else - { - sub->font_matrix = top->font_matrix; - sub->font_offset = top->font_offset; - - sub->units_per_em = top->units_per_em; - } - - matrix = &sub->font_matrix; - offset = &sub->font_offset; - upm = &sub->units_per_em; - temp = FT_ABS( matrix->yy ); - - if ( temp != 0x10000L ) - { - *upm = FT_DivFix( *upm, temp ); - - /* if *upm is larger than 100*1000 we divide by 1000 -- */ - /* this can happen if e.g. there is no top-font FontMatrix */ - /* and the subfont FontMatrix already contains the complete */ - /* scaling for the subfont (see section 5.11 of the PLRM) */ - - /* 100 is a heuristic value */ - - if ( *upm > 100L * 1000L ) - *upm = ( *upm + 500 ) / 1000; - - matrix->xx = FT_DivFix( matrix->xx, temp ); - matrix->yx = FT_DivFix( matrix->yx, temp ); - matrix->xy = FT_DivFix( matrix->xy, temp ); - matrix->yy = FT_DivFix( matrix->yy, temp ); - offset->x = FT_DivFix( offset->x, temp ); - offset->y = FT_DivFix( offset->y, temp ); - } - - offset->x >>= 16; - offset->y >>= 16; - } - - if ( pure_cff ) - { - char* style_name = NULL; - - - /* set up num_faces */ - cffface->num_faces = cff->num_faces; - - /* compute number of glyphs */ - if ( dict->cid_registry != 0xFFFFU ) - cffface->num_glyphs = cff->charset.max_cid; - else - cffface->num_glyphs = cff->charstrings_index.count; - - /* set global bbox, as well as EM size */ - cffface->bbox.xMin = dict->font_bbox.xMin >> 16; - cffface->bbox.yMin = dict->font_bbox.yMin >> 16; - /* no `U' suffix here to 0xFFFF! */ - cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16; - cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16; - - cffface->units_per_EM = (FT_UShort)( dict->units_per_em ); - - cffface->ascender = (FT_Short)( cffface->bbox.yMax ); - cffface->descender = (FT_Short)( cffface->bbox.yMin ); - - cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 ); - if ( cffface->height < cffface->ascender - cffface->descender ) - cffface->height = (FT_Short)( cffface->ascender - cffface->descender ); - - cffface->underline_position = - (FT_Short)( dict->underline_position >> 16 ); - cffface->underline_thickness = - (FT_Short)( dict->underline_thickness >> 16 ); - - /* retrieve font family & style name */ - cffface->family_name = cff_index_get_name( cff, face_index ); - if ( cffface->family_name ) - { - char* full = cff_index_get_sid_string( cff, - dict->full_name ); - char* fullp = full; - char* family = cffface->family_name; - char* family_name = NULL; - - - remove_subset_prefix( cffface->family_name ); - - if ( dict->family_name ) - { - family_name = cff_index_get_sid_string( cff, - dict->family_name ); - if ( family_name ) - family = family_name; - } - - /* We try to extract the style name from the full name. */ - /* We need to ignore spaces and dashes during the search. */ - if ( full && family ) - { - while ( *fullp ) - { - /* skip common characters at the start of both strings */ - if ( *fullp == *family ) - { - family++; - fullp++; - continue; - } - - /* ignore spaces and dashes in full name during comparison */ - if ( *fullp == ' ' || *fullp == '-' ) - { - fullp++; - continue; - } - - /* ignore spaces and dashes in family name during comparison */ - if ( *family == ' ' || *family == '-' ) - { - family++; - continue; - } - - if ( !*family && *fullp ) - { - /* The full name begins with the same characters as the */ - /* family name, with spaces and dashes removed. In this */ - /* case, the remaining string in `fullp' will be used as */ - /* the style name. */ - style_name = cff_strcpy( memory, fullp ); - } - break; - } - } - } - else - { - char *cid_font_name = - cff_index_get_sid_string( cff, - dict->cid_font_name ); - - - /* do we have a `/FontName' for a CID-keyed font? */ - if ( cid_font_name ) - cffface->family_name = cff_strcpy( memory, cid_font_name ); - } - - if ( style_name ) - cffface->style_name = style_name; - else - /* assume "Regular" style if we don't know better */ - cffface->style_name = cff_strcpy( memory, (char *)"Regular" ); - - /*******************************************************************/ - /* */ - /* Compute face flags. */ - /* */ - flags = (FT_UInt32)( FT_FACE_FLAG_SCALABLE | /* scalable outlines */ - FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ - FT_FACE_FLAG_HINTER ); /* has native hinter */ - - if ( sfnt_format ) - flags |= (FT_UInt32)FT_FACE_FLAG_SFNT; - - /* fixed width font? */ - if ( dict->is_fixed_pitch ) - flags |= (FT_UInt32)FT_FACE_FLAG_FIXED_WIDTH; - - /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */ -#if 0 - /* kerning available? */ - if ( face->kern_pairs ) - flags |= (FT_UInt32)FT_FACE_FLAG_KERNING; -#endif - - cffface->face_flags = flags; - - /*******************************************************************/ - /* */ - /* Compute style flags. */ - /* */ - flags = 0; - - if ( dict->italic_angle ) - flags |= FT_STYLE_FLAG_ITALIC; - - { - char *weight = cff_index_get_sid_string( cff, - dict->weight ); - - - if ( weight ) - if ( !ft_strcmp( weight, "Bold" ) || - !ft_strcmp( weight, "Black" ) ) - flags |= FT_STYLE_FLAG_BOLD; - } - - /* double check */ - if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name ) - if ( !ft_strncmp( cffface->style_name, "Bold", 4 ) || - !ft_strncmp( cffface->style_name, "Black", 5 ) ) - flags |= FT_STYLE_FLAG_BOLD; - - cffface->style_flags = flags; - } - - -#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES - /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */ - /* has unset this flag because of the 3.0 `post' table. */ - if ( dict->cid_registry == 0xFFFFU ) - cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; -#endif - - if ( dict->cid_registry != 0xFFFFU && pure_cff ) - cffface->face_flags |= FT_FACE_FLAG_CID_KEYED; - - - /*******************************************************************/ - /* */ - /* Compute char maps. */ - /* */ - - /* Try to synthesize a Unicode charmap if there is none available */ - /* already. If an OpenType font contains a Unicode "cmap", we */ - /* will use it, whatever be in the CFF part of the file. */ - { - FT_CharMapRec cmaprec; - FT_CharMap cmap; - FT_UInt nn; - CFF_Encoding encoding = &cff->encoding; - - - for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ ) - { - cmap = cffface->charmaps[nn]; - - /* Windows Unicode? */ - if ( cmap->platform_id == TT_PLATFORM_MICROSOFT && - cmap->encoding_id == TT_MS_ID_UNICODE_CS ) - goto Skip_Unicode; - - /* Apple Unicode platform id? */ - if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE ) - goto Skip_Unicode; /* Apple Unicode */ - } - - /* since CID-keyed fonts don't contain glyph names, we can't */ - /* construct a cmap */ - if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU ) - goto Exit; - -#ifdef FT_MAX_CHARMAP_CACHEABLE - if ( nn + 1 > FT_MAX_CHARMAP_CACHEABLE ) - { - FT_ERROR(( "cff_face_init: no Unicode cmap is found, " - "and too many subtables (%d) to add synthesized cmap\n", - nn )); - goto Exit; - } -#endif - - /* we didn't find a Unicode charmap -- synthesize one */ - cmaprec.face = cffface; - cmaprec.platform_id = TT_PLATFORM_MICROSOFT; - cmaprec.encoding_id = TT_MS_ID_UNICODE_CS; - cmaprec.encoding = FT_ENCODING_UNICODE; - - nn = (FT_UInt)cffface->num_charmaps; - - error = FT_CMap_New( &FT_CFF_CMAP_UNICODE_CLASS_REC_GET, NULL, - &cmaprec, NULL ); - if ( error && FT_Err_No_Unicode_Glyph_Name != error ) - goto Exit; - error = FT_Err_Ok; - - /* if no Unicode charmap was previously selected, select this one */ - if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps ) - cffface->charmap = cffface->charmaps[nn]; - - Skip_Unicode: -#ifdef FT_MAX_CHARMAP_CACHEABLE - if ( nn > FT_MAX_CHARMAP_CACHEABLE ) - { - FT_ERROR(( "cff_face_init: Unicode cmap is found, " - "but too many preceding subtables (%d) to access\n", - nn - 1 )); - goto Exit; - } -#endif - if ( encoding->count > 0 ) - { - FT_CMap_Class clazz; - - - cmaprec.face = cffface; - cmaprec.platform_id = TT_PLATFORM_ADOBE; /* Adobe platform id */ - - if ( encoding->offset == 0 ) - { - cmaprec.encoding_id = TT_ADOBE_ID_STANDARD; - cmaprec.encoding = FT_ENCODING_ADOBE_STANDARD; - clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; - } - else if ( encoding->offset == 1 ) - { - cmaprec.encoding_id = TT_ADOBE_ID_EXPERT; - cmaprec.encoding = FT_ENCODING_ADOBE_EXPERT; - clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; - } - else - { - cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM; - cmaprec.encoding = FT_ENCODING_ADOBE_CUSTOM; - clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; - } - - error = FT_CMap_New( clazz, NULL, &cmaprec, NULL ); - } - } - } - - Exit: - return error; - - Bad_Format: - error = CFF_Err_Unknown_File_Format; - goto Exit; - } - - - FT_LOCAL_DEF( void ) - cff_face_done( FT_Face cffface ) /* CFF_Face */ - { - CFF_Face face = (CFF_Face)cffface; - FT_Memory memory; - SFNT_Service sfnt; - - - if ( !face ) - return; - - memory = cffface->memory; - sfnt = (SFNT_Service)face->sfnt; - - if ( sfnt ) - sfnt->done_face( face ); - - { - CFF_Font cff = (CFF_Font)face->extra.data; - - - if ( cff ) - { - cff_font_done( cff ); - FT_FREE( face->extra.data ); - } - } - } - - - FT_LOCAL_DEF( FT_Error ) - cff_driver_init( FT_Module module ) - { - FT_UNUSED( module ); - - return CFF_Err_Ok; - } - - - FT_LOCAL_DEF( void ) - cff_driver_done( FT_Module module ) - { - FT_UNUSED( module ); - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffobjs.h b/android/jni/ndk_modules/freetype/src/cff/cffobjs.h deleted file mode 100644 index 3c81cee0..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffobjs.h +++ /dev/null @@ -1,181 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffobjs.h */ -/* */ -/* OpenType objects manager (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CFFOBJS_H__ -#define __CFFOBJS_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include "cfftypes.h" -#include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* CFF_Driver */ - /* */ - /* <Description> */ - /* A handle to an OpenType driver object. */ - /* */ - typedef struct CFF_DriverRec_* CFF_Driver; - - typedef TT_Face CFF_Face; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* CFF_Size */ - /* */ - /* <Description> */ - /* A handle to an OpenType size object. */ - /* */ - typedef struct CFF_SizeRec_ - { - FT_SizeRec root; - FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ - - } CFF_SizeRec, *CFF_Size; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* CFF_GlyphSlot */ - /* */ - /* <Description> */ - /* A handle to an OpenType glyph slot object. */ - /* */ - typedef struct CFF_GlyphSlotRec_ - { - FT_GlyphSlotRec root; - - FT_Bool hint; - FT_Bool scaled; - - FT_Fixed x_scale; - FT_Fixed y_scale; - - } CFF_GlyphSlotRec, *CFF_GlyphSlot; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* CFF_Internal */ - /* */ - /* <Description> */ - /* The interface to the `internal' field of `FT_Size'. */ - /* */ - typedef struct CFF_InternalRec_ - { - PSH_Globals topfont; - PSH_Globals subfonts[CFF_MAX_CID_FONTS]; - - } CFF_InternalRec, *CFF_Internal; - - - /*************************************************************************/ - /* */ - /* Subglyph transformation record. */ - /* */ - typedef struct CFF_Transform_ - { - FT_Fixed xx, xy; /* transformation matrix coefficients */ - FT_Fixed yx, yy; - FT_F26Dot6 ox, oy; /* offsets */ - - } CFF_Transform; - - - /***********************************************************************/ - /* */ - /* TrueType driver class. */ - /* */ - typedef struct CFF_DriverRec_ - { - FT_DriverRec root; - void* extension_component; - - } CFF_DriverRec; - - - FT_LOCAL( FT_Error ) - cff_size_init( FT_Size size ); /* CFF_Size */ - - FT_LOCAL( void ) - cff_size_done( FT_Size size ); /* CFF_Size */ - - FT_LOCAL( FT_Error ) - cff_size_request( FT_Size size, - FT_Size_Request req ); - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - FT_LOCAL( FT_Error ) - cff_size_select( FT_Size size, - FT_ULong strike_index ); - -#endif - - FT_LOCAL( void ) - cff_slot_done( FT_GlyphSlot slot ); - - FT_LOCAL( FT_Error ) - cff_slot_init( FT_GlyphSlot slot ); - - - /*************************************************************************/ - /* */ - /* Face functions */ - /* */ - FT_LOCAL( FT_Error ) - cff_face_init( FT_Stream stream, - FT_Face face, /* CFF_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - FT_LOCAL( void ) - cff_face_done( FT_Face face ); /* CFF_Face */ - - - /*************************************************************************/ - /* */ - /* Driver functions */ - /* */ - FT_LOCAL( FT_Error ) - cff_driver_init( FT_Module module ); - - FT_LOCAL( void ) - cff_driver_done( FT_Module module ); - - -FT_END_HEADER - -#endif /* __CFFOBJS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffparse.c b/android/jni/ndk_modules/freetype/src/cff/cffparse.c deleted file mode 100644 index 0d11a727..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffparse.c +++ /dev/null @@ -1,924 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffparse.c */ -/* */ -/* CFF token stream parser (body) */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include "cffparse.h" -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_DEBUG_H - -#include "cfferrs.h" -#include "cffpic.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_cffparse - - - - - FT_LOCAL_DEF( void ) - cff_parser_init( CFF_Parser parser, - FT_UInt code, - void* object, - FT_Library library) - { - FT_MEM_ZERO( parser, sizeof ( *parser ) ); - - parser->top = parser->stack; - parser->object_code = code; - parser->object = object; - parser->library = library; - } - - - /* read an integer */ - static FT_Long - cff_parse_integer( FT_Byte* start, - FT_Byte* limit ) - { - FT_Byte* p = start; - FT_Int v = *p++; - FT_Long val = 0; - - - if ( v == 28 ) - { - if ( p + 2 > limit ) - goto Bad; - - val = (FT_Short)( ( (FT_Int)p[0] << 8 ) | p[1] ); - p += 2; - } - else if ( v == 29 ) - { - if ( p + 4 > limit ) - goto Bad; - - val = ( (FT_Long)p[0] << 24 ) | - ( (FT_Long)p[1] << 16 ) | - ( (FT_Long)p[2] << 8 ) | - p[3]; - p += 4; - } - else if ( v < 247 ) - { - val = v - 139; - } - else if ( v < 251 ) - { - if ( p + 1 > limit ) - goto Bad; - - val = ( v - 247 ) * 256 + p[0] + 108; - p++; - } - else - { - if ( p + 1 > limit ) - goto Bad; - - val = -( v - 251 ) * 256 - p[0] - 108; - p++; - } - - Exit: - return val; - - Bad: - val = 0; - goto Exit; - } - - - static const FT_Long power_tens[] = - { - 1L, - 10L, - 100L, - 1000L, - 10000L, - 100000L, - 1000000L, - 10000000L, - 100000000L, - 1000000000L - }; - - - /* read a real */ - static FT_Fixed - cff_parse_real( FT_Byte* start, - FT_Byte* limit, - FT_Long power_ten, - FT_Long* scaling ) - { - FT_Byte* p = start; - FT_UInt nib; - FT_UInt phase; - - FT_Long result, number, exponent; - FT_Int sign = 0, exponent_sign = 0; - FT_Long exponent_add, integer_length, fraction_length; - - - if ( scaling ) - *scaling = 0; - - result = 0; - - number = 0; - exponent = 0; - - exponent_add = 0; - integer_length = 0; - fraction_length = 0; - - /* First of all, read the integer part. */ - phase = 4; - - for (;;) - { - /* If we entered this iteration with phase == 4, we need to */ - /* read a new byte. This also skips past the initial 0x1E. */ - if ( phase ) - { - p++; - - /* Make sure we don't read past the end. */ - if ( p >= limit ) - goto Exit; - } - - /* Get the nibble. */ - nib = ( p[0] >> phase ) & 0xF; - phase = 4 - phase; - - if ( nib == 0xE ) - sign = 1; - else if ( nib > 9 ) - break; - else - { - /* Increase exponent if we can't add the digit. */ - if ( number >= 0xCCCCCCCL ) - exponent_add++; - /* Skip leading zeros. */ - else if ( nib || number ) - { - integer_length++; - number = number * 10 + nib; - } - } - } - - /* Read fraction part, if any. */ - if ( nib == 0xa ) - for (;;) - { - /* If we entered this iteration with phase == 4, we need */ - /* to read a new byte. */ - if ( phase ) - { - p++; - - /* Make sure we don't read past the end. */ - if ( p >= limit ) - goto Exit; - } - - /* Get the nibble. */ - nib = ( p[0] >> phase ) & 0xF; - phase = 4 - phase; - if ( nib >= 10 ) - break; - - /* Skip leading zeros if possible. */ - if ( !nib && !number ) - exponent_add--; - /* Only add digit if we don't overflow. */ - else if ( number < 0xCCCCCCCL && fraction_length < 9 ) - { - fraction_length++; - number = number * 10 + nib; - } - } - - /* Read exponent, if any. */ - if ( nib == 12 ) - { - exponent_sign = 1; - nib = 11; - } - - if ( nib == 11 ) - { - for (;;) - { - /* If we entered this iteration with phase == 4, */ - /* we need to read a new byte. */ - if ( phase ) - { - p++; - - /* Make sure we don't read past the end. */ - if ( p >= limit ) - goto Exit; - } - - /* Get the nibble. */ - nib = ( p[0] >> phase ) & 0xF; - phase = 4 - phase; - if ( nib >= 10 ) - break; - - exponent = exponent * 10 + nib; - - /* Arbitrarily limit exponent. */ - if ( exponent > 1000 ) - goto Exit; - } - - if ( exponent_sign ) - exponent = -exponent; - } - - /* We don't check `power_ten' and `exponent_add'. */ - exponent += power_ten + exponent_add; - - if ( scaling ) - { - /* Only use `fraction_length'. */ - fraction_length += integer_length; - exponent += integer_length; - - if ( fraction_length <= 5 ) - { - if ( number > 0x7FFFL ) - { - result = FT_DivFix( number, 10 ); - *scaling = exponent - fraction_length + 1; - } - else - { - if ( exponent > 0 ) - { - FT_Long new_fraction_length, shift; - - - /* Make `scaling' as small as possible. */ - new_fraction_length = FT_MIN( exponent, 5 ); - exponent -= new_fraction_length; - shift = new_fraction_length - fraction_length; - - number *= power_tens[shift]; - if ( number > 0x7FFFL ) - { - number /= 10; - exponent += 1; - } - } - else - exponent -= fraction_length; - - result = number << 16; - *scaling = exponent; - } - } - else - { - if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL ) - { - result = FT_DivFix( number, power_tens[fraction_length - 4] ); - *scaling = exponent - 4; - } - else - { - result = FT_DivFix( number, power_tens[fraction_length - 5] ); - *scaling = exponent - 5; - } - } - } - else - { - integer_length += exponent; - fraction_length -= exponent; - - /* Check for overflow and underflow. */ - if ( FT_ABS( integer_length ) > 5 ) - goto Exit; - - /* Remove non-significant digits. */ - if ( integer_length < 0 ) - { - number /= power_tens[-integer_length]; - fraction_length += integer_length; - } - - /* this can only happen if exponent was non-zero */ - if ( fraction_length == 10 ) - { - number /= 10; - fraction_length -= 1; - } - - /* Convert into 16.16 format. */ - if ( fraction_length > 0 ) - { - if ( ( number / power_tens[fraction_length] ) > 0x7FFFL ) - goto Exit; - - result = FT_DivFix( number, power_tens[fraction_length] ); - } - else - { - number *= power_tens[-fraction_length]; - - if ( number > 0x7FFFL ) - goto Exit; - - result = number << 16; - } - } - - if ( sign ) - result = -result; - - Exit: - return result; - } - - - /* read a number, either integer or real */ - static FT_Long - cff_parse_num( FT_Byte** d ) - { - return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 ) - : cff_parse_integer( d[0], d[1] ); - } - - - /* read a floating point number, either integer or real */ - static FT_Fixed - cff_parse_fixed( FT_Byte** d ) - { - return **d == 30 ? cff_parse_real( d[0], d[1], 0, NULL ) - : cff_parse_integer( d[0], d[1] ) << 16; - } - - - /* read a floating point number, either integer or real, */ - /* but return `10^scaling' times the number read in */ - static FT_Fixed - cff_parse_fixed_scaled( FT_Byte** d, - FT_Long scaling ) - { - return **d == 30 ? cff_parse_real( d[0], d[1], scaling, NULL ) - : ( cff_parse_integer( d[0], d[1] ) * - power_tens[scaling] ) << 16; - } - - - /* read a floating point number, either integer or real, */ - /* and return it as precise as possible -- `scaling' returns */ - /* the scaling factor (as a power of 10) */ - static FT_Fixed - cff_parse_fixed_dynamic( FT_Byte** d, - FT_Long* scaling ) - { - FT_ASSERT( scaling ); - - if ( **d == 30 ) - return cff_parse_real( d[0], d[1], 0, scaling ); - else - { - FT_Long number; - FT_Int integer_length; - - - number = cff_parse_integer( d[0], d[1] ); - - if ( number > 0x7FFFL ) - { - for ( integer_length = 5; integer_length < 10; integer_length++ ) - if ( number < power_tens[integer_length] ) - break; - - if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL ) - { - *scaling = integer_length - 4; - return FT_DivFix( number, power_tens[integer_length - 4] ); - } - else - { - *scaling = integer_length - 5; - return FT_DivFix( number, power_tens[integer_length - 5] ); - } - } - else - { - *scaling = 0; - return number << 16; - } - } - } - - - static FT_Error - cff_parse_font_matrix( CFF_Parser parser ) - { - CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; - FT_Matrix* matrix = &dict->font_matrix; - FT_Vector* offset = &dict->font_offset; - FT_ULong* upm = &dict->units_per_em; - FT_Byte** data = parser->stack; - FT_Error error = CFF_Err_Stack_Underflow; - - - if ( parser->top >= parser->stack + 6 ) - { - FT_Long scaling; - - - error = CFF_Err_Ok; - - /* We expect a well-formed font matrix, this is, the matrix elements */ - /* `xx' and `yy' are of approximately the same magnitude. To avoid */ - /* loss of precision, we use the magnitude of element `xx' to scale */ - /* all other elements. The scaling factor is then contained in the */ - /* `units_per_em' value. */ - - matrix->xx = cff_parse_fixed_dynamic( data++, &scaling ); - - scaling = -scaling; - - if ( scaling < 0 || scaling > 9 ) - { - /* Return default matrix in case of unlikely values. */ - matrix->xx = 0x10000L; - matrix->yx = 0; - matrix->yx = 0; - matrix->yy = 0x10000L; - offset->x = 0; - offset->y = 0; - *upm = 1; - - goto Exit; - } - - matrix->yx = cff_parse_fixed_scaled( data++, scaling ); - matrix->xy = cff_parse_fixed_scaled( data++, scaling ); - matrix->yy = cff_parse_fixed_scaled( data++, scaling ); - offset->x = cff_parse_fixed_scaled( data++, scaling ); - offset->y = cff_parse_fixed_scaled( data, scaling ); - - *upm = power_tens[scaling]; - } - - Exit: - return error; - } - - - static FT_Error - cff_parse_font_bbox( CFF_Parser parser ) - { - CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; - FT_BBox* bbox = &dict->font_bbox; - FT_Byte** data = parser->stack; - FT_Error error; - - - error = CFF_Err_Stack_Underflow; - - if ( parser->top >= parser->stack + 4 ) - { - bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) ); - bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) ); - bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) ); - bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) ); - error = CFF_Err_Ok; - } - - return error; - } - - - static FT_Error - cff_parse_private_dict( CFF_Parser parser ) - { - CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; - FT_Byte** data = parser->stack; - FT_Error error; - - - error = CFF_Err_Stack_Underflow; - - if ( parser->top >= parser->stack + 2 ) - { - dict->private_size = cff_parse_num( data++ ); - dict->private_offset = cff_parse_num( data ); - error = CFF_Err_Ok; - } - - return error; - } - - - static FT_Error - cff_parse_cid_ros( CFF_Parser parser ) - { - CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; - FT_Byte** data = parser->stack; - FT_Error error; - - - error = CFF_Err_Stack_Underflow; - - if ( parser->top >= parser->stack + 3 ) - { - dict->cid_registry = (FT_UInt)cff_parse_num ( data++ ); - dict->cid_ordering = (FT_UInt)cff_parse_num ( data++ ); - if ( **data == 30 ) - FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); - dict->cid_supplement = cff_parse_num( data ); - if ( dict->cid_supplement < 0 ) - FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n", - dict->cid_supplement )); - error = CFF_Err_Ok; - } - - return error; - } - - -#define CFF_FIELD_NUM( code, name ) \ - CFF_FIELD( code, name, cff_kind_num ) -#define CFF_FIELD_FIXED( code, name ) \ - CFF_FIELD( code, name, cff_kind_fixed ) -#define CFF_FIELD_FIXED_1000( code, name ) \ - CFF_FIELD( code, name, cff_kind_fixed_thousand ) -#define CFF_FIELD_STRING( code, name ) \ - CFF_FIELD( code, name, cff_kind_string ) -#define CFF_FIELD_BOOL( code, name ) \ - CFF_FIELD( code, name, cff_kind_bool ) -#define CFF_FIELD_DELTA( code, name, max ) \ - CFF_FIELD( code, name, cff_kind_delta ) - -#define CFFCODE_TOPDICT 0x1000 -#define CFFCODE_PRIVATE 0x2000 - -#ifndef FT_CONFIG_OPTION_PIC - -#define CFF_FIELD_CALLBACK( code, name ) \ - { \ - cff_kind_callback, \ - code | CFFCODE, \ - 0, 0, \ - cff_parse_ ## name, \ - 0, 0 \ - }, - -#undef CFF_FIELD -#define CFF_FIELD( code, name, kind ) \ - { \ - kind, \ - code | CFFCODE, \ - FT_FIELD_OFFSET( name ), \ - FT_FIELD_SIZE( name ), \ - 0, 0, 0 \ - }, - -#undef CFF_FIELD_DELTA -#define CFF_FIELD_DELTA( code, name, max ) \ - { \ - cff_kind_delta, \ - code | CFFCODE, \ - FT_FIELD_OFFSET( name ), \ - FT_FIELD_SIZE_DELTA( name ), \ - 0, \ - max, \ - FT_FIELD_OFFSET( num_ ## name ) \ - }, - - static const CFF_Field_Handler cff_field_handlers[] = - { - -#include "cfftoken.h" - - { 0, 0, 0, 0, 0, 0, 0 } - }; - - -#else /* FT_CONFIG_OPTION_PIC */ - - void FT_Destroy_Class_cff_field_handlers(FT_Library library, CFF_Field_Handler* clazz) - { - FT_Memory memory = library->memory; - if ( clazz ) - FT_FREE( clazz ); - } - - FT_Error FT_Create_Class_cff_field_handlers(FT_Library library, CFF_Field_Handler** output_class) - { - CFF_Field_Handler* clazz; - FT_Error error; - FT_Memory memory = library->memory; - int i=0; - -#undef CFF_FIELD -#undef CFF_FIELD_DELTA -#undef CFF_FIELD_CALLBACK -#define CFF_FIELD_CALLBACK( code, name ) i++; -#define CFF_FIELD( code, name, kind ) i++; -#define CFF_FIELD_DELTA( code, name, max ) i++; - -#include "cfftoken.h" - i++;/*{ 0, 0, 0, 0, 0, 0, 0 }*/ - - if ( FT_ALLOC( clazz, sizeof(CFF_Field_Handler)*i ) ) - return error; - - i=0; -#undef CFF_FIELD -#undef CFF_FIELD_DELTA -#undef CFF_FIELD_CALLBACK - -#define CFF_FIELD_CALLBACK( code_, name_ ) \ - clazz[i].kind = cff_kind_callback; \ - clazz[i].code = code_ | CFFCODE; \ - clazz[i].offset = 0; \ - clazz[i].size = 0; \ - clazz[i].reader = cff_parse_ ## name_; \ - clazz[i].array_max = 0; \ - clazz[i].count_offset = 0; \ - i++; - -#undef CFF_FIELD -#define CFF_FIELD( code_, name_, kind_ ) \ - clazz[i].kind = kind_; \ - clazz[i].code = code_ | CFFCODE; \ - clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ - clazz[i].size = FT_FIELD_SIZE( name_ ); \ - clazz[i].reader = 0; \ - clazz[i].array_max = 0; \ - clazz[i].count_offset = 0; \ - i++; \ - -#undef CFF_FIELD_DELTA -#define CFF_FIELD_DELTA( code_, name_, max_ ) \ - clazz[i].kind = cff_kind_delta; \ - clazz[i].code = code_ | CFFCODE; \ - clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ - clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ - clazz[i].reader = 0; \ - clazz[i].array_max = max_; \ - clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ - i++; - -#include "cfftoken.h" - - clazz[i].kind = 0; - clazz[i].code = 0; - clazz[i].offset = 0; - clazz[i].size = 0; - clazz[i].reader = 0; - clazz[i].array_max = 0; - clazz[i].count_offset = 0; - - *output_class = clazz; - return CFF_Err_Ok; - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - - - FT_LOCAL_DEF( FT_Error ) - cff_parser_run( CFF_Parser parser, - FT_Byte* start, - FT_Byte* limit ) - { - FT_Byte* p = start; - FT_Error error = CFF_Err_Ok; - FT_Library library = parser->library; - FT_UNUSED(library); - - - parser->top = parser->stack; - parser->start = start; - parser->limit = limit; - parser->cursor = start; - - while ( p < limit ) - { - FT_UInt v = *p; - - - if ( v >= 27 && v != 31 ) - { - /* it's a number; we will push its position on the stack */ - if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH ) - goto Stack_Overflow; - - *parser->top ++ = p; - - /* now, skip it */ - if ( v == 30 ) - { - /* skip real number */ - p++; - for (;;) - { - /* An unterminated floating point number at the */ - /* end of a dictionary is invalid but harmless. */ - if ( p >= limit ) - goto Exit; - v = p[0] >> 4; - if ( v == 15 ) - break; - v = p[0] & 0xF; - if ( v == 15 ) - break; - p++; - } - } - else if ( v == 28 ) - p += 2; - else if ( v == 29 ) - p += 4; - else if ( v > 246 ) - p += 1; - } - else - { - /* This is not a number, hence it's an operator. Compute its code */ - /* and look for it in our current list. */ - - FT_UInt code; - FT_UInt num_args = (FT_UInt) - ( parser->top - parser->stack ); - const CFF_Field_Handler* field; - - - *parser->top = p; - code = v; - if ( v == 12 ) - { - /* two byte operator */ - p++; - if ( p >= limit ) - goto Syntax_Error; - - code = 0x100 | p[0]; - } - code = code | parser->object_code; - - for ( field = FT_CFF_FIELD_HANDLERS_GET; field->kind; field++ ) - { - if ( field->code == (FT_Int)code ) - { - /* we found our field's handler; read it */ - FT_Long val; - FT_Byte* q = (FT_Byte*)parser->object + field->offset; - - - /* check that we have enough arguments -- except for */ - /* delta encoded arrays, which can be empty */ - if ( field->kind != cff_kind_delta && num_args < 1 ) - goto Stack_Underflow; - - switch ( field->kind ) - { - case cff_kind_bool: - case cff_kind_string: - case cff_kind_num: - val = cff_parse_num( parser->stack ); - goto Store_Number; - - case cff_kind_fixed: - val = cff_parse_fixed( parser->stack ); - goto Store_Number; - - case cff_kind_fixed_thousand: - val = cff_parse_fixed_scaled( parser->stack, 3 ); - - Store_Number: - switch ( field->size ) - { - case (8 / FT_CHAR_BIT): - *(FT_Byte*)q = (FT_Byte)val; - break; - - case (16 / FT_CHAR_BIT): - *(FT_Short*)q = (FT_Short)val; - break; - - case (32 / FT_CHAR_BIT): - *(FT_Int32*)q = (FT_Int)val; - break; - - default: /* for 64-bit systems */ - *(FT_Long*)q = val; - } - break; - - case cff_kind_delta: - { - FT_Byte* qcount = (FT_Byte*)parser->object + - field->count_offset; - - FT_Byte** data = parser->stack; - - - if ( num_args > field->array_max ) - num_args = field->array_max; - - /* store count */ - *qcount = (FT_Byte)num_args; - - val = 0; - while ( num_args > 0 ) - { - val += cff_parse_num( data++ ); - switch ( field->size ) - { - case (8 / FT_CHAR_BIT): - *(FT_Byte*)q = (FT_Byte)val; - break; - - case (16 / FT_CHAR_BIT): - *(FT_Short*)q = (FT_Short)val; - break; - - case (32 / FT_CHAR_BIT): - *(FT_Int32*)q = (FT_Int)val; - break; - - default: /* for 64-bit systems */ - *(FT_Long*)q = val; - } - - q += field->size; - num_args--; - } - } - break; - - default: /* callback */ - error = field->reader( parser ); - if ( error ) - goto Exit; - } - goto Found; - } - } - - /* this is an unknown operator, or it is unsupported; */ - /* we will ignore it for now. */ - - Found: - /* clear stack */ - parser->top = parser->stack; - } - p++; - } - - Exit: - return error; - - Stack_Overflow: - error = CFF_Err_Invalid_Argument; - goto Exit; - - Stack_Underflow: - error = CFF_Err_Invalid_Argument; - goto Exit; - - Syntax_Error: - error = CFF_Err_Invalid_Argument; - goto Exit; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffparse.h b/android/jni/ndk_modules/freetype/src/cff/cffparse.h deleted file mode 100644 index 7e2c00a0..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffparse.h +++ /dev/null @@ -1,102 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffparse.h */ -/* */ -/* CFF token stream parser (specification) */ -/* */ -/* Copyright 1996-2001, 2002, 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CFF_PARSE_H__ -#define __CFF_PARSE_H__ - - -#include <ft2build.h> -#include "cfftypes.h" -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - -#define CFF_MAX_STACK_DEPTH 96 - -#define CFF_CODE_TOPDICT 0x1000 -#define CFF_CODE_PRIVATE 0x2000 - - - typedef struct CFF_ParserRec_ - { - FT_Library library; - FT_Byte* start; - FT_Byte* limit; - FT_Byte* cursor; - - FT_Byte* stack[CFF_MAX_STACK_DEPTH + 1]; - FT_Byte** top; - - FT_UInt object_code; - void* object; - - } CFF_ParserRec, *CFF_Parser; - - - FT_LOCAL( void ) - cff_parser_init( CFF_Parser parser, - FT_UInt code, - void* object, - FT_Library library); - - FT_LOCAL( FT_Error ) - cff_parser_run( CFF_Parser parser, - FT_Byte* start, - FT_Byte* limit ); - - - enum - { - cff_kind_none = 0, - cff_kind_num, - cff_kind_fixed, - cff_kind_fixed_thousand, - cff_kind_string, - cff_kind_bool, - cff_kind_delta, - cff_kind_callback, - - cff_kind_max /* do not remove */ - }; - - - /* now generate handlers for the most simple fields */ - typedef FT_Error (*CFF_Field_Reader)( CFF_Parser parser ); - - typedef struct CFF_Field_Handler_ - { - int kind; - int code; - FT_UInt offset; - FT_Byte size; - CFF_Field_Reader reader; - FT_UInt array_max; - FT_UInt count_offset; - - } CFF_Field_Handler; - - -FT_END_HEADER - - -#endif /* __CFF_PARSE_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffpic.c b/android/jni/ndk_modules/freetype/src/cff/cffpic.c deleted file mode 100644 index 5d01bd45..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffpic.c +++ /dev/null @@ -1,101 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffpic.c */ -/* */ -/* The FreeType position independent code services for cff module. */ -/* */ -/* Copyright 2009, 2010 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "cffpic.h" - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from cffdrivr.c */ - FT_Error FT_Create_Class_cff_services( FT_Library, FT_ServiceDescRec**); - void FT_Destroy_Class_cff_services( FT_Library, FT_ServiceDescRec*); - void FT_Init_Class_cff_service_ps_info( FT_Library, FT_Service_PsInfoRec*); - void FT_Init_Class_cff_service_glyph_dict( FT_Library, FT_Service_GlyphDictRec*); - void FT_Init_Class_cff_service_ps_name( FT_Library, FT_Service_PsFontNameRec*); - void FT_Init_Class_cff_service_get_cmap_info( FT_Library, FT_Service_TTCMapsRec*); - void FT_Init_Class_cff_service_cid_info( FT_Library, FT_Service_CIDRec*); - - /* forward declaration of PIC init functions from cffparse.c */ - FT_Error FT_Create_Class_cff_field_handlers( FT_Library, CFF_Field_Handler**); - void FT_Destroy_Class_cff_field_handlers( FT_Library, CFF_Field_Handler*); - - /* forward declaration of PIC init functions from cffcmap.c */ - void FT_Init_Class_cff_cmap_encoding_class_rec( FT_Library, FT_CMap_ClassRec*); - void FT_Init_Class_cff_cmap_unicode_class_rec( FT_Library, FT_CMap_ClassRec*); - - void - cff_driver_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - if ( pic_container->cff ) - { - CffModulePIC* container = (CffModulePIC*)pic_container->cff; - if(container->cff_services) - FT_Destroy_Class_cff_services(library, container->cff_services); - container->cff_services = NULL; - if(container->cff_field_handlers) - FT_Destroy_Class_cff_field_handlers(library, container->cff_field_handlers); - container->cff_field_handlers = NULL; - FT_FREE( container ); - pic_container->cff = NULL; - } - } - - - FT_Error - cff_driver_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = CFF_Err_Ok; - CffModulePIC* container; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->cff = container; - - /* initialize pointer table - this is how the module usually expects this data */ - error = FT_Create_Class_cff_services(library, &container->cff_services); - if(error) - goto Exit; - error = FT_Create_Class_cff_field_handlers(library, &container->cff_field_handlers); - if(error) - goto Exit; - FT_Init_Class_cff_service_ps_info(library, &container->cff_service_ps_info); - FT_Init_Class_cff_service_glyph_dict(library, &container->cff_service_glyph_dict); - FT_Init_Class_cff_service_ps_name(library, &container->cff_service_ps_name); - FT_Init_Class_cff_service_get_cmap_info(library, &container->cff_service_get_cmap_info); - FT_Init_Class_cff_service_cid_info(library, &container->cff_service_cid_info); - FT_Init_Class_cff_cmap_encoding_class_rec(library, &container->cff_cmap_encoding_class_rec); - FT_Init_Class_cff_cmap_unicode_class_rec(library, &container->cff_cmap_unicode_class_rec); -Exit: - if(error) - cff_driver_class_pic_free(library); - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cffpic.h b/android/jni/ndk_modules/freetype/src/cff/cffpic.h deleted file mode 100644 index e29d0681..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cffpic.h +++ /dev/null @@ -1,80 +0,0 @@ -/***************************************************************************/ -/* */ -/* cffpic.h */ -/* */ -/* The FreeType position independent code services for cff module. */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CFFPIC_H__ -#define __CFFPIC_H__ - - -FT_BEGIN_HEADER - -#include FT_INTERNAL_PIC_H - -#ifndef FT_CONFIG_OPTION_PIC -#define FT_CFF_SERVICE_PS_INFO_GET cff_service_ps_info -#define FT_CFF_SERVICE_GLYPH_DICT_GET cff_service_glyph_dict -#define FT_CFF_SERVICE_PS_NAME_GET cff_service_ps_name -#define FT_CFF_SERVICE_GET_CMAP_INFO_GET cff_service_get_cmap_info -#define FT_CFF_SERVICE_CID_INFO_GET cff_service_cid_info -#define FT_CFF_SERVICES_GET cff_services -#define FT_CFF_CMAP_ENCODING_CLASS_REC_GET cff_cmap_encoding_class_rec -#define FT_CFF_CMAP_UNICODE_CLASS_REC_GET cff_cmap_unicode_class_rec -#define FT_CFF_FIELD_HANDLERS_GET cff_field_handlers - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_SERVICE_GLYPH_DICT_H -#include "cffparse.h" -#include FT_SERVICE_POSTSCRIPT_INFO_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_TT_CMAP_H -#include FT_SERVICE_CID_H - - typedef struct CffModulePIC_ - { - FT_ServiceDescRec* cff_services; - CFF_Field_Handler* cff_field_handlers; - FT_Service_PsInfoRec cff_service_ps_info; - FT_Service_GlyphDictRec cff_service_glyph_dict; - FT_Service_PsFontNameRec cff_service_ps_name; - FT_Service_TTCMapsRec cff_service_get_cmap_info; - FT_Service_CIDRec cff_service_cid_info; - FT_CMap_ClassRec cff_cmap_encoding_class_rec; - FT_CMap_ClassRec cff_cmap_unicode_class_rec; - } CffModulePIC; - -#define GET_PIC(lib) ((CffModulePIC*)((lib)->pic_container.cff)) -#define FT_CFF_SERVICE_PS_INFO_GET (GET_PIC(library)->cff_service_ps_info) -#define FT_CFF_SERVICE_GLYPH_DICT_GET (GET_PIC(library)->cff_service_glyph_dict) -#define FT_CFF_SERVICE_PS_NAME_GET (GET_PIC(library)->cff_service_ps_name) -#define FT_CFF_SERVICE_GET_CMAP_INFO_GET (GET_PIC(library)->cff_service_get_cmap_info) -#define FT_CFF_SERVICE_CID_INFO_GET (GET_PIC(library)->cff_service_cid_info) -#define FT_CFF_SERVICES_GET (GET_PIC(library)->cff_services) -#define FT_CFF_CMAP_ENCODING_CLASS_REC_GET (GET_PIC(library)->cff_cmap_encoding_class_rec) -#define FT_CFF_CMAP_UNICODE_CLASS_REC_GET (GET_PIC(library)->cff_cmap_unicode_class_rec) -#define FT_CFF_FIELD_HANDLERS_GET (GET_PIC(library)->cff_field_handlers) - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* __CFFPIC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cfftoken.h b/android/jni/ndk_modules/freetype/src/cff/cfftoken.h deleted file mode 100644 index 6bb27d5c..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cfftoken.h +++ /dev/null @@ -1,97 +0,0 @@ -/***************************************************************************/ -/* */ -/* cfftoken.h */ -/* */ -/* CFF token definitions (specification only). */ -/* */ -/* Copyright 1996-2001, 2002, 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#undef FT_STRUCTURE -#define FT_STRUCTURE CFF_FontRecDictRec - -#undef CFFCODE -#define CFFCODE CFFCODE_TOPDICT - - CFF_FIELD_STRING ( 0, version ) - CFF_FIELD_STRING ( 1, notice ) - CFF_FIELD_STRING ( 0x100, copyright ) - CFF_FIELD_STRING ( 2, full_name ) - CFF_FIELD_STRING ( 3, family_name ) - CFF_FIELD_STRING ( 4, weight ) - CFF_FIELD_BOOL ( 0x101, is_fixed_pitch ) - CFF_FIELD_FIXED ( 0x102, italic_angle ) - CFF_FIELD_FIXED ( 0x103, underline_position ) - CFF_FIELD_FIXED ( 0x104, underline_thickness ) - CFF_FIELD_NUM ( 0x105, paint_type ) - CFF_FIELD_NUM ( 0x106, charstring_type ) - CFF_FIELD_CALLBACK( 0x107, font_matrix ) - CFF_FIELD_NUM ( 13, unique_id ) - CFF_FIELD_CALLBACK( 5, font_bbox ) - CFF_FIELD_NUM ( 0x108, stroke_width ) - CFF_FIELD_NUM ( 15, charset_offset ) - CFF_FIELD_NUM ( 16, encoding_offset ) - CFF_FIELD_NUM ( 17, charstrings_offset ) - CFF_FIELD_CALLBACK( 18, private_dict ) - CFF_FIELD_NUM ( 0x114, synthetic_base ) - CFF_FIELD_STRING ( 0x115, embedded_postscript ) - -#if 0 - CFF_FIELD_STRING ( 0x116, base_font_name ) - CFF_FIELD_DELTA ( 0x117, base_font_blend, 16 ) - CFF_FIELD_CALLBACK( 0x118, multiple_master ) - CFF_FIELD_CALLBACK( 0x119, blend_axis_types ) -#endif - - CFF_FIELD_CALLBACK( 0x11E, cid_ros ) - CFF_FIELD_NUM ( 0x11F, cid_font_version ) - CFF_FIELD_NUM ( 0x120, cid_font_revision ) - CFF_FIELD_NUM ( 0x121, cid_font_type ) - CFF_FIELD_NUM ( 0x122, cid_count ) - CFF_FIELD_NUM ( 0x123, cid_uid_base ) - CFF_FIELD_NUM ( 0x124, cid_fd_array_offset ) - CFF_FIELD_NUM ( 0x125, cid_fd_select_offset ) - CFF_FIELD_STRING ( 0x126, cid_font_name ) - -#if 0 - CFF_FIELD_NUM ( 0x127, chameleon ) -#endif - - -#undef FT_STRUCTURE -#define FT_STRUCTURE CFF_PrivateRec -#undef CFFCODE -#define CFFCODE CFFCODE_PRIVATE - - CFF_FIELD_DELTA ( 6, blue_values, 14 ) - CFF_FIELD_DELTA ( 7, other_blues, 10 ) - CFF_FIELD_DELTA ( 8, family_blues, 14 ) - CFF_FIELD_DELTA ( 9, family_other_blues, 10 ) - CFF_FIELD_FIXED_1000( 0x109, blue_scale ) - CFF_FIELD_NUM ( 0x10A, blue_shift ) - CFF_FIELD_NUM ( 0x10B, blue_fuzz ) - CFF_FIELD_NUM ( 10, standard_width ) - CFF_FIELD_NUM ( 11, standard_height ) - CFF_FIELD_DELTA ( 0x10C, snap_widths, 13 ) - CFF_FIELD_DELTA ( 0x10D, snap_heights, 13 ) - CFF_FIELD_BOOL ( 0x10E, force_bold ) - CFF_FIELD_FIXED ( 0x10F, force_bold_threshold ) - CFF_FIELD_NUM ( 0x110, lenIV ) - CFF_FIELD_NUM ( 0x111, language_group ) - CFF_FIELD_FIXED ( 0x112, expansion_factor ) - CFF_FIELD_NUM ( 0x113, initial_random_seed ) - CFF_FIELD_NUM ( 19, local_subrs_offset ) - CFF_FIELD_NUM ( 20, default_width ) - CFF_FIELD_NUM ( 21, nominal_width ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/cff/cfftypes.h b/android/jni/ndk_modules/freetype/src/cff/cfftypes.h deleted file mode 100644 index d4053576..00000000 --- a/android/jni/ndk_modules/freetype/src/cff/cfftypes.h +++ /dev/null @@ -1,281 +0,0 @@ -/***************************************************************************/ -/* */ -/* cfftypes.h */ -/* */ -/* Basic OpenType/CFF type definitions and interface (specification */ -/* only). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2006, 2007, 2008, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CFFTYPES_H__ -#define __CFFTYPES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CFF_IndexRec */ - /* */ - /* <Description> */ - /* A structure used to model a CFF Index table. */ - /* */ - /* <Fields> */ - /* stream :: The source input stream. */ - /* */ - /* start :: The position of the first index byte in the */ - /* input stream. */ - /* */ - /* count :: The number of elements in the index. */ - /* */ - /* off_size :: The size in bytes of object offsets in index. */ - /* */ - /* data_offset :: The position of first data byte in the index's */ - /* bytes. */ - /* */ - /* data_size :: The size of the data table in this index. */ - /* */ - /* offsets :: A table of element offsets in the index. Must be */ - /* loaded explicitly. */ - /* */ - /* bytes :: If the index is loaded in memory, its bytes. */ - /* */ - typedef struct CFF_IndexRec_ - { - FT_Stream stream; - FT_ULong start; - FT_UInt count; - FT_Byte off_size; - FT_ULong data_offset; - FT_ULong data_size; - - FT_ULong* offsets; - FT_Byte* bytes; - - } CFF_IndexRec, *CFF_Index; - - - typedef struct CFF_EncodingRec_ - { - FT_UInt format; - FT_ULong offset; - - FT_UInt count; - FT_UShort sids [256]; /* avoid dynamic allocations */ - FT_UShort codes[256]; - - } CFF_EncodingRec, *CFF_Encoding; - - - typedef struct CFF_CharsetRec_ - { - - FT_UInt format; - FT_ULong offset; - - FT_UShort* sids; - FT_UShort* cids; /* the inverse mapping of `sids'; only needed */ - /* for CID-keyed fonts */ - FT_UInt max_cid; - FT_UInt num_glyphs; - - } CFF_CharsetRec, *CFF_Charset; - - - typedef struct CFF_FontRecDictRec_ - { - FT_UInt version; - FT_UInt notice; - FT_UInt copyright; - FT_UInt full_name; - FT_UInt family_name; - FT_UInt weight; - FT_Bool is_fixed_pitch; - FT_Fixed italic_angle; - FT_Fixed underline_position; - FT_Fixed underline_thickness; - FT_Int paint_type; - FT_Int charstring_type; - FT_Matrix font_matrix; - FT_ULong units_per_em; /* temporarily used as scaling value also */ - FT_Vector font_offset; - FT_ULong unique_id; - FT_BBox font_bbox; - FT_Pos stroke_width; - FT_ULong charset_offset; - FT_ULong encoding_offset; - FT_ULong charstrings_offset; - FT_ULong private_offset; - FT_ULong private_size; - FT_Long synthetic_base; - FT_UInt embedded_postscript; - - /* these should only be used for the top-level font dictionary */ - FT_UInt cid_registry; - FT_UInt cid_ordering; - FT_Long cid_supplement; - - FT_Long cid_font_version; - FT_Long cid_font_revision; - FT_Long cid_font_type; - FT_ULong cid_count; - FT_ULong cid_uid_base; - FT_ULong cid_fd_array_offset; - FT_ULong cid_fd_select_offset; - FT_UInt cid_font_name; - - } CFF_FontRecDictRec, *CFF_FontRecDict; - - - typedef struct CFF_PrivateRec_ - { - FT_Byte num_blue_values; - FT_Byte num_other_blues; - FT_Byte num_family_blues; - FT_Byte num_family_other_blues; - - FT_Pos blue_values[14]; - FT_Pos other_blues[10]; - FT_Pos family_blues[14]; - FT_Pos family_other_blues[10]; - - FT_Fixed blue_scale; - FT_Pos blue_shift; - FT_Pos blue_fuzz; - FT_Pos standard_width; - FT_Pos standard_height; - - FT_Byte num_snap_widths; - FT_Byte num_snap_heights; - FT_Pos snap_widths[13]; - FT_Pos snap_heights[13]; - FT_Bool force_bold; - FT_Fixed force_bold_threshold; - FT_Int lenIV; - FT_Int language_group; - FT_Fixed expansion_factor; - FT_Long initial_random_seed; - FT_ULong local_subrs_offset; - FT_Pos default_width; - FT_Pos nominal_width; - - } CFF_PrivateRec, *CFF_Private; - - - typedef struct CFF_FDSelectRec_ - { - FT_Byte format; - FT_UInt range_count; - - /* that's the table, taken from the file `as is' */ - FT_Byte* data; - FT_UInt data_size; - - /* small cache for format 3 only */ - FT_UInt cache_first; - FT_UInt cache_count; - FT_Byte cache_fd; - - } CFF_FDSelectRec, *CFF_FDSelect; - - - /* A SubFont packs a font dict and a private dict together. They are */ - /* needed to support CID-keyed CFF fonts. */ - typedef struct CFF_SubFontRec_ - { - CFF_FontRecDictRec font_dict; - CFF_PrivateRec private_dict; - - CFF_IndexRec local_subrs_index; - FT_Byte** local_subrs; /* array of pointers into Local Subrs INDEX data */ - - } CFF_SubFontRec, *CFF_SubFont; - - - /* maximum number of sub-fonts in a CID-keyed file */ -#define CFF_MAX_CID_FONTS 32 - - - typedef struct CFF_FontRec_ - { - FT_Stream stream; - FT_Memory memory; - FT_UInt num_faces; - FT_UInt num_glyphs; - - FT_Byte version_major; - FT_Byte version_minor; - FT_Byte header_size; - FT_Byte absolute_offsize; - - - CFF_IndexRec name_index; - CFF_IndexRec top_dict_index; - CFF_IndexRec global_subrs_index; - - CFF_EncodingRec encoding; - CFF_CharsetRec charset; - - CFF_IndexRec charstrings_index; - CFF_IndexRec font_dict_index; - CFF_IndexRec private_index; - CFF_IndexRec local_subrs_index; - - FT_String* font_name; - - /* array of pointers into Global Subrs INDEX data */ - FT_Byte** global_subrs; - - /* array of pointers into String INDEX data stored at string_pool */ - FT_UInt num_strings; - FT_Byte** strings; - FT_Byte* string_pool; - - CFF_SubFontRec top_font; - FT_UInt num_subfonts; - CFF_SubFont subfonts[CFF_MAX_CID_FONTS]; - - CFF_FDSelectRec fd_select; - - /* interface to PostScript hinter */ - PSHinter_Service pshinter; - - /* interface to Postscript Names service */ - FT_Service_PsCMaps psnames; - - /* since version 2.3.0 */ - PS_FontInfoRec* font_info; /* font info dictionary */ - - /* since version 2.3.6 */ - FT_String* registry; - FT_String* ordering; - - } CFF_FontRec, *CFF_Font; - - -FT_END_HEADER - -#endif /* __CFFTYPES_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/afmparse.c b/android/jni/ndk_modules/freetype/src/psaux/afmparse.c deleted file mode 100644 index d7de3736..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/afmparse.c +++ /dev/null @@ -1,964 +0,0 @@ -/***************************************************************************/ -/* */ -/* afmparse.c */ -/* */ -/* AFM parser (body). */ -/* */ -/* Copyright 2006, 2007, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_POSTSCRIPT_AUX_H - -#include "afmparse.h" -#include "psconv.h" - -#include "psauxerr.h" - - -/***************************************************************************/ -/* */ -/* AFM_Stream */ -/* */ -/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib. */ -/* */ -/* */ - - enum - { - AFM_STREAM_STATUS_NORMAL, - AFM_STREAM_STATUS_EOC, - AFM_STREAM_STATUS_EOL, - AFM_STREAM_STATUS_EOF - }; - - - typedef struct AFM_StreamRec_ - { - FT_Byte* cursor; - FT_Byte* base; - FT_Byte* limit; - - FT_Int status; - - } AFM_StreamRec; - - -#ifndef EOF -#define EOF -1 -#endif - - - /* this works because empty lines are ignored */ -#define AFM_IS_NEWLINE( ch ) ( (ch) == '\r' || (ch) == '\n' ) - -#define AFM_IS_EOF( ch ) ( (ch) == EOF || (ch) == '\x1a' ) -#define AFM_IS_SPACE( ch ) ( (ch) == ' ' || (ch) == '\t' ) - - /* column separator; there is no `column' in the spec actually */ -#define AFM_IS_SEP( ch ) ( (ch) == ';' ) - -#define AFM_GETC() \ - ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \ - : EOF ) - -#define AFM_STREAM_KEY_BEGIN( stream ) \ - (char*)( (stream)->cursor - 1 ) - -#define AFM_STREAM_KEY_LEN( stream, key ) \ - ( (char*)(stream)->cursor - key - 1 ) - -#define AFM_STATUS_EOC( stream ) \ - ( (stream)->status >= AFM_STREAM_STATUS_EOC ) - -#define AFM_STATUS_EOL( stream ) \ - ( (stream)->status >= AFM_STREAM_STATUS_EOL ) - -#define AFM_STATUS_EOF( stream ) \ - ( (stream)->status >= AFM_STREAM_STATUS_EOF ) - - - static int - afm_stream_skip_spaces( AFM_Stream stream ) - { - int ch = 0; /* make stupid compiler happy */ - - - if ( AFM_STATUS_EOC( stream ) ) - return ';'; - - while ( 1 ) - { - ch = AFM_GETC(); - if ( !AFM_IS_SPACE( ch ) ) - break; - } - - if ( AFM_IS_NEWLINE( ch ) ) - stream->status = AFM_STREAM_STATUS_EOL; - else if ( AFM_IS_SEP( ch ) ) - stream->status = AFM_STREAM_STATUS_EOC; - else if ( AFM_IS_EOF( ch ) ) - stream->status = AFM_STREAM_STATUS_EOF; - - return ch; - } - - - /* read a key or value in current column */ - static char* - afm_stream_read_one( AFM_Stream stream ) - { - char* str; - int ch; - - - afm_stream_skip_spaces( stream ); - if ( AFM_STATUS_EOC( stream ) ) - return NULL; - - str = AFM_STREAM_KEY_BEGIN( stream ); - - while ( 1 ) - { - ch = AFM_GETC(); - if ( AFM_IS_SPACE( ch ) ) - break; - else if ( AFM_IS_NEWLINE( ch ) ) - { - stream->status = AFM_STREAM_STATUS_EOL; - break; - } - else if ( AFM_IS_SEP( ch ) ) - { - stream->status = AFM_STREAM_STATUS_EOC; - break; - } - else if ( AFM_IS_EOF( ch ) ) - { - stream->status = AFM_STREAM_STATUS_EOF; - break; - } - } - - return str; - } - - - /* read a string (i.e., read to EOL) */ - static char* - afm_stream_read_string( AFM_Stream stream ) - { - char* str; - int ch; - - - afm_stream_skip_spaces( stream ); - if ( AFM_STATUS_EOL( stream ) ) - return NULL; - - str = AFM_STREAM_KEY_BEGIN( stream ); - - /* scan to eol */ - while ( 1 ) - { - ch = AFM_GETC(); - if ( AFM_IS_NEWLINE( ch ) ) - { - stream->status = AFM_STREAM_STATUS_EOL; - break; - } - else if ( AFM_IS_EOF( ch ) ) - { - stream->status = AFM_STREAM_STATUS_EOF; - break; - } - } - - return str; - } - - - /*************************************************************************/ - /* */ - /* AFM_Parser */ - /* */ - /* */ - - /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */ - typedef enum AFM_Token_ - { - AFM_TOKEN_ASCENDER, - AFM_TOKEN_AXISLABEL, - AFM_TOKEN_AXISTYPE, - AFM_TOKEN_B, - AFM_TOKEN_BLENDAXISTYPES, - AFM_TOKEN_BLENDDESIGNMAP, - AFM_TOKEN_BLENDDESIGNPOSITIONS, - AFM_TOKEN_C, - AFM_TOKEN_CC, - AFM_TOKEN_CH, - AFM_TOKEN_CAPHEIGHT, - AFM_TOKEN_CHARWIDTH, - AFM_TOKEN_CHARACTERSET, - AFM_TOKEN_CHARACTERS, - AFM_TOKEN_DESCENDER, - AFM_TOKEN_ENCODINGSCHEME, - AFM_TOKEN_ENDAXIS, - AFM_TOKEN_ENDCHARMETRICS, - AFM_TOKEN_ENDCOMPOSITES, - AFM_TOKEN_ENDDIRECTION, - AFM_TOKEN_ENDFONTMETRICS, - AFM_TOKEN_ENDKERNDATA, - AFM_TOKEN_ENDKERNPAIRS, - AFM_TOKEN_ENDTRACKKERN, - AFM_TOKEN_ESCCHAR, - AFM_TOKEN_FAMILYNAME, - AFM_TOKEN_FONTBBOX, - AFM_TOKEN_FONTNAME, - AFM_TOKEN_FULLNAME, - AFM_TOKEN_ISBASEFONT, - AFM_TOKEN_ISCIDFONT, - AFM_TOKEN_ISFIXEDPITCH, - AFM_TOKEN_ISFIXEDV, - AFM_TOKEN_ITALICANGLE, - AFM_TOKEN_KP, - AFM_TOKEN_KPH, - AFM_TOKEN_KPX, - AFM_TOKEN_KPY, - AFM_TOKEN_L, - AFM_TOKEN_MAPPINGSCHEME, - AFM_TOKEN_METRICSSETS, - AFM_TOKEN_N, - AFM_TOKEN_NOTICE, - AFM_TOKEN_PCC, - AFM_TOKEN_STARTAXIS, - AFM_TOKEN_STARTCHARMETRICS, - AFM_TOKEN_STARTCOMPOSITES, - AFM_TOKEN_STARTDIRECTION, - AFM_TOKEN_STARTFONTMETRICS, - AFM_TOKEN_STARTKERNDATA, - AFM_TOKEN_STARTKERNPAIRS, - AFM_TOKEN_STARTKERNPAIRS0, - AFM_TOKEN_STARTKERNPAIRS1, - AFM_TOKEN_STARTTRACKKERN, - AFM_TOKEN_STDHW, - AFM_TOKEN_STDVW, - AFM_TOKEN_TRACKKERN, - AFM_TOKEN_UNDERLINEPOSITION, - AFM_TOKEN_UNDERLINETHICKNESS, - AFM_TOKEN_VV, - AFM_TOKEN_VVECTOR, - AFM_TOKEN_VERSION, - AFM_TOKEN_W, - AFM_TOKEN_W0, - AFM_TOKEN_W0X, - AFM_TOKEN_W0Y, - AFM_TOKEN_W1, - AFM_TOKEN_W1X, - AFM_TOKEN_W1Y, - AFM_TOKEN_WX, - AFM_TOKEN_WY, - AFM_TOKEN_WEIGHT, - AFM_TOKEN_WEIGHTVECTOR, - AFM_TOKEN_XHEIGHT, - N_AFM_TOKENS, - AFM_TOKEN_UNKNOWN - - } AFM_Token; - - - static const char* const afm_key_table[N_AFM_TOKENS] = - { - "Ascender", - "AxisLabel", - "AxisType", - "B", - "BlendAxisTypes", - "BlendDesignMap", - "BlendDesignPositions", - "C", - "CC", - "CH", - "CapHeight", - "CharWidth", - "CharacterSet", - "Characters", - "Descender", - "EncodingScheme", - "EndAxis", - "EndCharMetrics", - "EndComposites", - "EndDirection", - "EndFontMetrics", - "EndKernData", - "EndKernPairs", - "EndTrackKern", - "EscChar", - "FamilyName", - "FontBBox", - "FontName", - "FullName", - "IsBaseFont", - "IsCIDFont", - "IsFixedPitch", - "IsFixedV", - "ItalicAngle", - "KP", - "KPH", - "KPX", - "KPY", - "L", - "MappingScheme", - "MetricsSets", - "N", - "Notice", - "PCC", - "StartAxis", - "StartCharMetrics", - "StartComposites", - "StartDirection", - "StartFontMetrics", - "StartKernData", - "StartKernPairs", - "StartKernPairs0", - "StartKernPairs1", - "StartTrackKern", - "StdHW", - "StdVW", - "TrackKern", - "UnderlinePosition", - "UnderlineThickness", - "VV", - "VVector", - "Version", - "W", - "W0", - "W0X", - "W0Y", - "W1", - "W1X", - "W1Y", - "WX", - "WY", - "Weight", - "WeightVector", - "XHeight" - }; - - - /* - * `afm_parser_read_vals' and `afm_parser_next_key' provide - * high-level operations to an AFM_Stream. The rest of the - * parser functions should use them without accessing the - * AFM_Stream directly. - */ - - FT_LOCAL_DEF( FT_Int ) - afm_parser_read_vals( AFM_Parser parser, - AFM_Value vals, - FT_UInt n ) - { - AFM_Stream stream = parser->stream; - char* str; - FT_UInt i; - - - if ( n > AFM_MAX_ARGUMENTS ) - return 0; - - for ( i = 0; i < n; i++ ) - { - FT_Offset len; - AFM_Value val = vals + i; - - - if ( val->type == AFM_VALUE_TYPE_STRING ) - str = afm_stream_read_string( stream ); - else - str = afm_stream_read_one( stream ); - - if ( !str ) - break; - - len = AFM_STREAM_KEY_LEN( stream, str ); - - switch ( val->type ) - { - case AFM_VALUE_TYPE_STRING: - case AFM_VALUE_TYPE_NAME: - { - FT_Memory memory = parser->memory; - FT_Error error; - - - if ( !FT_QALLOC( val->u.s, len + 1 ) ) - { - ft_memcpy( val->u.s, str, len ); - val->u.s[len] = '\0'; - } - } - break; - - case AFM_VALUE_TYPE_FIXED: - val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str, - (FT_Byte*)str + len, 0 ); - break; - - case AFM_VALUE_TYPE_INTEGER: - val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str, - (FT_Byte*)str + len ); - break; - - case AFM_VALUE_TYPE_BOOL: - val->u.b = FT_BOOL( len == 4 && - !ft_strncmp( str, "true", 4 ) ); - break; - - case AFM_VALUE_TYPE_INDEX: - if ( parser->get_index ) - val->u.i = parser->get_index( str, len, parser->user_data ); - else - val->u.i = 0; - break; - } - } - - return i; - } - - - FT_LOCAL_DEF( char* ) - afm_parser_next_key( AFM_Parser parser, - FT_Bool line, - FT_Offset* len ) - { - AFM_Stream stream = parser->stream; - char* key = 0; /* make stupid compiler happy */ - - - if ( line ) - { - while ( 1 ) - { - /* skip current line */ - if ( !AFM_STATUS_EOL( stream ) ) - afm_stream_read_string( stream ); - - stream->status = AFM_STREAM_STATUS_NORMAL; - key = afm_stream_read_one( stream ); - - /* skip empty line */ - if ( !key && - !AFM_STATUS_EOF( stream ) && - AFM_STATUS_EOL( stream ) ) - continue; - - break; - } - } - else - { - while ( 1 ) - { - /* skip current column */ - while ( !AFM_STATUS_EOC( stream ) ) - afm_stream_read_one( stream ); - - stream->status = AFM_STREAM_STATUS_NORMAL; - key = afm_stream_read_one( stream ); - - /* skip empty column */ - if ( !key && - !AFM_STATUS_EOF( stream ) && - AFM_STATUS_EOC( stream ) ) - continue; - - break; - } - } - - if ( len ) - *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key ) - : 0; - - return key; - } - - - static AFM_Token - afm_tokenize( const char* key, - FT_Offset len ) - { - int n; - - - for ( n = 0; n < N_AFM_TOKENS; n++ ) - { - if ( *( afm_key_table[n] ) == *key ) - { - for ( ; n < N_AFM_TOKENS; n++ ) - { - if ( *( afm_key_table[n] ) != *key ) - return AFM_TOKEN_UNKNOWN; - - if ( ft_strncmp( afm_key_table[n], key, len ) == 0 ) - return (AFM_Token) n; - } - } - } - - return AFM_TOKEN_UNKNOWN; - } - - - FT_LOCAL_DEF( FT_Error ) - afm_parser_init( AFM_Parser parser, - FT_Memory memory, - FT_Byte* base, - FT_Byte* limit ) - { - AFM_Stream stream = NULL; - FT_Error error; - - - if ( FT_NEW( stream ) ) - return error; - - stream->cursor = stream->base = base; - stream->limit = limit; - - /* don't skip the first line during the first call */ - stream->status = AFM_STREAM_STATUS_EOL; - - parser->memory = memory; - parser->stream = stream; - parser->FontInfo = NULL; - parser->get_index = NULL; - - return PSaux_Err_Ok; - } - - - FT_LOCAL( void ) - afm_parser_done( AFM_Parser parser ) - { - FT_Memory memory = parser->memory; - - - FT_FREE( parser->stream ); - } - - - FT_LOCAL_DEF( FT_Error ) - afm_parser_read_int( AFM_Parser parser, - FT_Int* aint ) - { - AFM_ValueRec val; - - - val.type = AFM_VALUE_TYPE_INTEGER; - - if ( afm_parser_read_vals( parser, &val, 1 ) == 1 ) - { - *aint = val.u.i; - - return PSaux_Err_Ok; - } - else - return PSaux_Err_Syntax_Error; - } - - - static FT_Error - afm_parse_track_kern( AFM_Parser parser ) - { - AFM_FontInfo fi = parser->FontInfo; - AFM_TrackKern tk; - char* key; - FT_Offset len; - int n = -1; - - - if ( afm_parser_read_int( parser, &fi->NumTrackKern ) ) - goto Fail; - - if ( fi->NumTrackKern ) - { - FT_Memory memory = parser->memory; - FT_Error error; - - - if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) ) - return error; - } - - while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) - { - AFM_ValueRec shared_vals[5]; - - - switch ( afm_tokenize( key, len ) ) - { - case AFM_TOKEN_TRACKKERN: - n++; - - if ( n >= fi->NumTrackKern ) - goto Fail; - - tk = fi->TrackKerns + n; - - shared_vals[0].type = AFM_VALUE_TYPE_INTEGER; - shared_vals[1].type = AFM_VALUE_TYPE_FIXED; - shared_vals[2].type = AFM_VALUE_TYPE_FIXED; - shared_vals[3].type = AFM_VALUE_TYPE_FIXED; - shared_vals[4].type = AFM_VALUE_TYPE_FIXED; - if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 ) - goto Fail; - - tk->degree = shared_vals[0].u.i; - tk->min_ptsize = shared_vals[1].u.f; - tk->min_kern = shared_vals[2].u.f; - tk->max_ptsize = shared_vals[3].u.f; - tk->max_kern = shared_vals[4].u.f; - - /* is this correct? */ - if ( tk->degree < 0 && tk->min_kern > 0 ) - tk->min_kern = -tk->min_kern; - break; - - case AFM_TOKEN_ENDTRACKKERN: - case AFM_TOKEN_ENDKERNDATA: - case AFM_TOKEN_ENDFONTMETRICS: - fi->NumTrackKern = n + 1; - return PSaux_Err_Ok; - - case AFM_TOKEN_UNKNOWN: - break; - - default: - goto Fail; - } - } - - Fail: - return PSaux_Err_Syntax_Error; - } - - -#undef KERN_INDEX -#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 ) - - - /* compare two kerning pairs */ - FT_CALLBACK_DEF( int ) - afm_compare_kern_pairs( const void* a, - const void* b ) - { - AFM_KernPair kp1 = (AFM_KernPair)a; - AFM_KernPair kp2 = (AFM_KernPair)b; - - FT_ULong index1 = KERN_INDEX( kp1->index1, kp1->index2 ); - FT_ULong index2 = KERN_INDEX( kp2->index1, kp2->index2 ); - - - if ( index1 > index2 ) - return 1; - else if ( index1 < index2 ) - return -1; - else - return 0; - } - - - static FT_Error - afm_parse_kern_pairs( AFM_Parser parser ) - { - AFM_FontInfo fi = parser->FontInfo; - AFM_KernPair kp; - char* key; - FT_Offset len; - int n = -1; - - - if ( afm_parser_read_int( parser, &fi->NumKernPair ) ) - goto Fail; - - if ( fi->NumKernPair ) - { - FT_Memory memory = parser->memory; - FT_Error error; - - - if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) - return error; - } - - while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) - { - AFM_Token token = afm_tokenize( key, len ); - - - switch ( token ) - { - case AFM_TOKEN_KP: - case AFM_TOKEN_KPX: - case AFM_TOKEN_KPY: - { - FT_Int r; - AFM_ValueRec shared_vals[4]; - - - n++; - - if ( n >= fi->NumKernPair ) - goto Fail; - - kp = fi->KernPairs + n; - - shared_vals[0].type = AFM_VALUE_TYPE_INDEX; - shared_vals[1].type = AFM_VALUE_TYPE_INDEX; - shared_vals[2].type = AFM_VALUE_TYPE_INTEGER; - shared_vals[3].type = AFM_VALUE_TYPE_INTEGER; - r = afm_parser_read_vals( parser, shared_vals, 4 ); - if ( r < 3 ) - goto Fail; - - kp->index1 = shared_vals[0].u.i; - kp->index2 = shared_vals[1].u.i; - if ( token == AFM_TOKEN_KPY ) - { - kp->x = 0; - kp->y = shared_vals[2].u.i; - } - else - { - kp->x = shared_vals[2].u.i; - kp->y = ( token == AFM_TOKEN_KP && r == 4 ) - ? shared_vals[3].u.i : 0; - } - } - break; - - case AFM_TOKEN_ENDKERNPAIRS: - case AFM_TOKEN_ENDKERNDATA: - case AFM_TOKEN_ENDFONTMETRICS: - fi->NumKernPair = n + 1; - ft_qsort( fi->KernPairs, fi->NumKernPair, - sizeof( AFM_KernPairRec ), - afm_compare_kern_pairs ); - return PSaux_Err_Ok; - - case AFM_TOKEN_UNKNOWN: - break; - - default: - goto Fail; - } - } - - Fail: - return PSaux_Err_Syntax_Error; - } - - - static FT_Error - afm_parse_kern_data( AFM_Parser parser ) - { - FT_Error error; - char* key; - FT_Offset len; - - - while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) - { - switch ( afm_tokenize( key, len ) ) - { - case AFM_TOKEN_STARTTRACKKERN: - error = afm_parse_track_kern( parser ); - if ( error ) - return error; - break; - - case AFM_TOKEN_STARTKERNPAIRS: - case AFM_TOKEN_STARTKERNPAIRS0: - error = afm_parse_kern_pairs( parser ); - if ( error ) - return error; - break; - - case AFM_TOKEN_ENDKERNDATA: - case AFM_TOKEN_ENDFONTMETRICS: - return PSaux_Err_Ok; - - case AFM_TOKEN_UNKNOWN: - break; - - default: - goto Fail; - } - } - - Fail: - return PSaux_Err_Syntax_Error; - } - - - static FT_Error - afm_parser_skip_section( AFM_Parser parser, - FT_UInt n, - AFM_Token end_section ) - { - char* key; - FT_Offset len; - - - while ( n-- > 0 ) - { - key = afm_parser_next_key( parser, 1, NULL ); - if ( !key ) - goto Fail; - } - - while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) - { - AFM_Token token = afm_tokenize( key, len ); - - - if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS ) - return PSaux_Err_Ok; - } - - Fail: - return PSaux_Err_Syntax_Error; - } - - - FT_LOCAL_DEF( FT_Error ) - afm_parser_parse( AFM_Parser parser ) - { - FT_Memory memory = parser->memory; - AFM_FontInfo fi = parser->FontInfo; - FT_Error error = PSaux_Err_Syntax_Error; - char* key; - FT_Offset len; - FT_Int metrics_sets = 0; - - - if ( !fi ) - return PSaux_Err_Invalid_Argument; - - key = afm_parser_next_key( parser, 1, &len ); - if ( !key || len != 16 || - ft_strncmp( key, "StartFontMetrics", 16 ) != 0 ) - return PSaux_Err_Unknown_File_Format; - - while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) - { - AFM_ValueRec shared_vals[4]; - - - switch ( afm_tokenize( key, len ) ) - { - case AFM_TOKEN_METRICSSETS: - if ( afm_parser_read_int( parser, &metrics_sets ) ) - goto Fail; - - if ( metrics_sets != 0 && metrics_sets != 2 ) - { - error = PSaux_Err_Unimplemented_Feature; - - goto Fail; - } - break; - - case AFM_TOKEN_ISCIDFONT: - shared_vals[0].type = AFM_VALUE_TYPE_BOOL; - if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) - goto Fail; - - fi->IsCIDFont = shared_vals[0].u.b; - break; - - case AFM_TOKEN_FONTBBOX: - shared_vals[0].type = AFM_VALUE_TYPE_FIXED; - shared_vals[1].type = AFM_VALUE_TYPE_FIXED; - shared_vals[2].type = AFM_VALUE_TYPE_FIXED; - shared_vals[3].type = AFM_VALUE_TYPE_FIXED; - if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 ) - goto Fail; - - fi->FontBBox.xMin = shared_vals[0].u.f; - fi->FontBBox.yMin = shared_vals[1].u.f; - fi->FontBBox.xMax = shared_vals[2].u.f; - fi->FontBBox.yMax = shared_vals[3].u.f; - break; - - case AFM_TOKEN_ASCENDER: - shared_vals[0].type = AFM_VALUE_TYPE_FIXED; - if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) - goto Fail; - - fi->Ascender = shared_vals[0].u.f; - break; - - case AFM_TOKEN_DESCENDER: - shared_vals[0].type = AFM_VALUE_TYPE_FIXED; - if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) - goto Fail; - - fi->Descender = shared_vals[0].u.f; - break; - - case AFM_TOKEN_STARTCHARMETRICS: - { - FT_Int n = 0; - - - if ( afm_parser_read_int( parser, &n ) ) - goto Fail; - - error = afm_parser_skip_section( parser, n, - AFM_TOKEN_ENDCHARMETRICS ); - if ( error ) - return error; - } - break; - - case AFM_TOKEN_STARTKERNDATA: - error = afm_parse_kern_data( parser ); - if ( error ) - goto Fail; - /* fall through since we only support kern data */ - - case AFM_TOKEN_ENDFONTMETRICS: - return PSaux_Err_Ok; - - default: - break; - } - } - - Fail: - FT_FREE( fi->TrackKerns ); - fi->NumTrackKern = 0; - - FT_FREE( fi->KernPairs ); - fi->NumKernPair = 0; - - fi->IsCIDFont = 0; - - return error; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/afmparse.h b/android/jni/ndk_modules/freetype/src/psaux/afmparse.h deleted file mode 100644 index 35d96046..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/afmparse.h +++ /dev/null @@ -1,88 +0,0 @@ -/***************************************************************************/ -/* */ -/* afmparse.h */ -/* */ -/* AFM parser (specification). */ -/* */ -/* Copyright 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __AFMPARSE_H__ -#define __AFMPARSE_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_AUX_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - afm_parser_init( AFM_Parser parser, - FT_Memory memory, - FT_Byte* base, - FT_Byte* limit ); - - - FT_LOCAL( void ) - afm_parser_done( AFM_Parser parser ); - - - FT_LOCAL( FT_Error ) - afm_parser_parse( AFM_Parser parser ); - - - enum AFM_ValueType_ - { - AFM_VALUE_TYPE_STRING, - AFM_VALUE_TYPE_NAME, - AFM_VALUE_TYPE_FIXED, /* real number */ - AFM_VALUE_TYPE_INTEGER, - AFM_VALUE_TYPE_BOOL, - AFM_VALUE_TYPE_INDEX /* glyph index */ - }; - - - typedef struct AFM_ValueRec_ - { - enum AFM_ValueType_ type; - union - { - char* s; - FT_Fixed f; - FT_Int i; - FT_Bool b; - - } u; - - } AFM_ValueRec, *AFM_Value; - -#define AFM_MAX_ARGUMENTS 5 - - FT_LOCAL( FT_Int ) - afm_parser_read_vals( AFM_Parser parser, - AFM_Value vals, - FT_UInt n ); - - /* read the next key from the next line or column */ - FT_LOCAL( char* ) - afm_parser_next_key( AFM_Parser parser, - FT_Bool line, - FT_Offset* len ); - -FT_END_HEADER - -#endif /* __AFMPARSE_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psaux.c b/android/jni/ndk_modules/freetype/src/psaux/psaux.c deleted file mode 100644 index a4b9c5c6..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/psaux.c +++ /dev/null @@ -1,34 +0,0 @@ -/***************************************************************************/ -/* */ -/* psaux.c */ -/* */ -/* FreeType auxiliary PostScript driver component (body only). */ -/* */ -/* Copyright 1996-2001, 2002, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "psobjs.c" -#include "psauxmod.c" -#include "t1decode.c" -#include "t1cmap.c" - -#ifndef T1_CONFIG_OPTION_NO_AFM -#include "afmparse.c" -#endif - -#include "psconv.c" - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psauxerr.h b/android/jni/ndk_modules/freetype/src/psaux/psauxerr.h deleted file mode 100644 index d0baa3cb..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/psauxerr.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* psauxerr.h */ -/* */ -/* PS auxiliary module error codes (specification only). */ -/* */ -/* Copyright 2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the PS auxiliary module error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __PSAUXERR_H__ -#define __PSAUXERR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#define FT_ERR_PREFIX PSaux_Err_ -#define FT_ERR_BASE FT_Mod_Err_PSaux - -#include FT_ERRORS_H - -#endif /* __PSAUXERR_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psauxmod.c b/android/jni/ndk_modules/freetype/src/psaux/psauxmod.c deleted file mode 100644 index 4c3579f7..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/psauxmod.c +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************/ -/* */ -/* psauxmod.c */ -/* */ -/* FreeType auxiliary PostScript module implementation (body). */ -/* */ -/* Copyright 2000-2001, 2002, 2003, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include "psauxmod.h" -#include "psobjs.h" -#include "t1decode.h" -#include "t1cmap.h" - -#ifndef T1_CONFIG_OPTION_NO_AFM -#include "afmparse.h" -#endif - - - FT_CALLBACK_TABLE_DEF - const PS_Table_FuncsRec ps_table_funcs = - { - ps_table_new, - ps_table_done, - ps_table_add, - ps_table_release - }; - - - FT_CALLBACK_TABLE_DEF - const PS_Parser_FuncsRec ps_parser_funcs = - { - ps_parser_init, - ps_parser_done, - ps_parser_skip_spaces, - ps_parser_skip_PS_token, - ps_parser_to_int, - ps_parser_to_fixed, - ps_parser_to_bytes, - ps_parser_to_coord_array, - ps_parser_to_fixed_array, - ps_parser_to_token, - ps_parser_to_token_array, - ps_parser_load_field, - ps_parser_load_field_table - }; - - - FT_CALLBACK_TABLE_DEF - const T1_Builder_FuncsRec t1_builder_funcs = - { - t1_builder_init, - t1_builder_done, - t1_builder_check_points, - t1_builder_add_point, - t1_builder_add_point1, - t1_builder_add_contour, - t1_builder_start_point, - t1_builder_close_contour - }; - - - FT_CALLBACK_TABLE_DEF - const T1_Decoder_FuncsRec t1_decoder_funcs = - { - t1_decoder_init, - t1_decoder_done, - t1_decoder_parse_charstrings - }; - - -#ifndef T1_CONFIG_OPTION_NO_AFM - FT_CALLBACK_TABLE_DEF - const AFM_Parser_FuncsRec afm_parser_funcs = - { - afm_parser_init, - afm_parser_done, - afm_parser_parse - }; -#endif - - - FT_CALLBACK_TABLE_DEF - const T1_CMap_ClassesRec t1_cmap_classes = - { - &t1_cmap_standard_class_rec, - &t1_cmap_expert_class_rec, - &t1_cmap_custom_class_rec, - &t1_cmap_unicode_class_rec - }; - - - static - const PSAux_Interface psaux_interface = - { - &ps_table_funcs, - &ps_parser_funcs, - &t1_builder_funcs, - &t1_decoder_funcs, - t1_decrypt, - - (const T1_CMap_ClassesRec*) &t1_cmap_classes, - -#ifndef T1_CONFIG_OPTION_NO_AFM - &afm_parser_funcs, -#else - 0, -#endif - }; - - - FT_CALLBACK_TABLE_DEF - const FT_Module_Class psaux_module_class = - { - 0, - sizeof( FT_ModuleRec ), - "psaux", - 0x20000L, - 0x20000L, - - &psaux_interface, /* module-specific interface */ - - (FT_Module_Constructor)0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - }; - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psauxmod.h b/android/jni/ndk_modules/freetype/src/psaux/psauxmod.h deleted file mode 100644 index 35e042db..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/psauxmod.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* psauxmod.h */ -/* */ -/* FreeType auxiliary PostScript module implementation (specification). */ -/* */ -/* Copyright 2000-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __PSAUXMOD_H__ -#define __PSAUXMOD_H__ - - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - -#ifdef FT_CONFIG_OPTION_PIC -#error "this module does not support PIC yet" -#endif - - - FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class; - - -FT_END_HEADER - -#endif /* __PSAUXMOD_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psconv.c b/android/jni/ndk_modules/freetype/src/psaux/psconv.c deleted file mode 100644 index 1531d8f0..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/psconv.c +++ /dev/null @@ -1,472 +0,0 @@ -/***************************************************************************/ -/* */ -/* psconv.c */ -/* */ -/* Some convenience conversions (body). */ -/* */ -/* Copyright 2006, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_AUX_H - -#include "psconv.h" -#include "psauxerr.h" - - - /* The following array is used by various functions to quickly convert */ - /* digits (both decimal and non-decimal) into numbers. */ - -#if 'A' == 65 - /* ASCII */ - - static const FT_Char ft_char_table[128] = - { - /* 0x00 */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, - -1, 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, -1, -1, -1, -1, -1, - -1, 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, -1, -1, -1, -1, -1, - }; - - /* no character >= 0x80 can represent a valid number */ -#define OP >= - -#endif /* 'A' == 65 */ - -#if 'A' == 193 - /* EBCDIC */ - - static const FT_Char ft_char_table[128] = - { - /* 0x80 */ - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, - -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, - -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, - -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, - -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, - }; - - /* no character < 0x80 can represent a valid number */ -#define OP < - -#endif /* 'A' == 193 */ - - - FT_LOCAL_DEF( FT_Int ) - PS_Conv_Strtol( FT_Byte** cursor, - FT_Byte* limit, - FT_Int base ) - { - FT_Byte* p = *cursor; - FT_Int num = 0; - FT_Bool sign = 0; - - - if ( p == limit || base < 2 || base > 36 ) - return 0; - - if ( *p == '-' || *p == '+' ) - { - sign = FT_BOOL( *p == '-' ); - - p++; - if ( p == limit ) - return 0; - } - - for ( ; p < limit; p++ ) - { - FT_Char c; - - - if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) - break; - - c = ft_char_table[*p & 0x7f]; - - if ( c < 0 || c >= base ) - break; - - num = num * base + c; - } - - if ( sign ) - num = -num; - - *cursor = p; - - return num; - } - - - FT_LOCAL_DEF( FT_Int ) - PS_Conv_ToInt( FT_Byte** cursor, - FT_Byte* limit ) - - { - FT_Byte* p; - FT_Int num; - - - num = PS_Conv_Strtol( cursor, limit, 10 ); - p = *cursor; - - if ( p < limit && *p == '#' ) - { - *cursor = p + 1; - - return PS_Conv_Strtol( cursor, limit, num ); - } - else - return num; - } - - - FT_LOCAL_DEF( FT_Fixed ) - PS_Conv_ToFixed( FT_Byte** cursor, - FT_Byte* limit, - FT_Int power_ten ) - { - FT_Byte* p = *cursor; - FT_Fixed integral; - FT_Long decimal = 0, divider = 1; - FT_Bool sign = 0; - - - if ( p == limit ) - return 0; - - if ( *p == '-' || *p == '+' ) - { - sign = FT_BOOL( *p == '-' ); - - p++; - if ( p == limit ) - return 0; - } - - if ( *p != '.' ) - integral = PS_Conv_ToInt( &p, limit ) << 16; - else - integral = 0; - - /* read the decimal part */ - if ( p < limit && *p == '.' ) - { - p++; - - for ( ; p < limit; p++ ) - { - FT_Char c; - - - if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) - break; - - c = ft_char_table[*p & 0x7f]; - - if ( c < 0 || c >= 10 ) - break; - - if ( !integral && power_ten > 0 ) - { - power_ten--; - decimal = decimal * 10 + c; - } - else - { - if ( divider < 10000000L ) - { - decimal = decimal * 10 + c; - divider *= 10; - } - } - } - } - - /* read exponent, if any */ - if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) ) - { - p++; - power_ten += PS_Conv_ToInt( &p, limit ); - } - - while ( power_ten > 0 ) - { - integral *= 10; - decimal *= 10; - power_ten--; - } - - while ( power_ten < 0 ) - { - integral /= 10; - divider *= 10; - power_ten++; - } - - if ( decimal ) - integral += FT_DivFix( decimal, divider ); - - if ( sign ) - integral = -integral; - - *cursor = p; - - return integral; - } - - -#if 0 - FT_LOCAL_DEF( FT_UInt ) - PS_Conv_StringDecode( FT_Byte** cursor, - FT_Byte* limit, - FT_Byte* buffer, - FT_Offset n ) - { - FT_Byte* p; - FT_UInt r = 0; - - - for ( p = *cursor; r < n && p < limit; p++ ) - { - FT_Byte b; - - - if ( *p != '\\' ) - { - buffer[r++] = *p; - - continue; - } - - p++; - - switch ( *p ) - { - case 'n': - b = '\n'; - break; - case 'r': - b = '\r'; - break; - case 't': - b = '\t'; - break; - case 'b': - b = '\b'; - break; - case 'f': - b = '\f'; - break; - case '\r': - p++; - if ( *p != '\n' ) - { - b = *p; - - break; - } - /* no break */ - case '\n': - continue; - break; - default: - if ( IS_PS_DIGIT( *p ) ) - { - b = *p - '0'; - - p++; - - if ( IS_PS_DIGIT( *p ) ) - { - b = b * 8 + *p - '0'; - - p++; - - if ( IS_PS_DIGIT( *p ) ) - b = b * 8 + *p - '0'; - else - { - buffer[r++] = b; - b = *p; - } - } - else - { - buffer[r++] = b; - b = *p; - } - } - else - b = *p; - break; - } - - buffer[r++] = b; - } - - *cursor = p; - - return r; - } -#endif /* 0 */ - - - FT_LOCAL_DEF( FT_UInt ) - PS_Conv_ASCIIHexDecode( FT_Byte** cursor, - FT_Byte* limit, - FT_Byte* buffer, - FT_Offset n ) - { - FT_Byte* p; - FT_UInt r = 0; - FT_UInt w = 0; - FT_UInt pad = 0x01; - - - n *= 2; - -#if 1 - - p = *cursor; - if ( n > (FT_UInt)( limit - p ) ) - n = (FT_UInt)( limit - p ); - - /* we try to process two nibbles at a time to be as fast as possible */ - for ( ; r < n; r++ ) - { - FT_UInt c = p[r]; - - - if ( IS_PS_SPACE( c ) ) - continue; - - if ( c OP 0x80 ) - break; - - c = ft_char_table[c & 0x7F]; - if ( (unsigned)c >= 16 ) - break; - - pad = ( pad << 4 ) | c; - if ( pad & 0x100 ) - { - buffer[w++] = (FT_Byte)pad; - pad = 0x01; - } - } - - if ( pad != 0x01 ) - buffer[w++] = (FT_Byte)( pad << 4 ); - - *cursor = p + r; - - return w; - -#else /* 0 */ - - for ( r = 0; r < n; r++ ) - { - FT_Char c; - - - if ( IS_PS_SPACE( *p ) ) - continue; - - if ( *p OP 0x80 ) - break; - - c = ft_char_table[*p & 0x7f]; - - if ( (unsigned)c >= 16 ) - break; - - if ( r & 1 ) - { - *buffer = (FT_Byte)(*buffer + c); - buffer++; - } - else - *buffer = (FT_Byte)(c << 4); - - r++; - } - - *cursor = p; - - return ( r + 1 ) / 2; - -#endif /* 0 */ - - } - - - FT_LOCAL_DEF( FT_UInt ) - PS_Conv_EexecDecode( FT_Byte** cursor, - FT_Byte* limit, - FT_Byte* buffer, - FT_Offset n, - FT_UShort* seed ) - { - FT_Byte* p; - FT_UInt r; - FT_UInt s = *seed; - - -#if 1 - - p = *cursor; - if ( n > (FT_UInt)(limit - p) ) - n = (FT_UInt)(limit - p); - - for ( r = 0; r < n; r++ ) - { - FT_UInt val = p[r]; - FT_UInt b = ( val ^ ( s >> 8 ) ); - - - s = ( (val + s)*52845U + 22719 ) & 0xFFFFU; - buffer[r] = (FT_Byte) b; - } - - *cursor = p + n; - *seed = (FT_UShort)s; - -#else /* 0 */ - - for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ ) - { - FT_Byte b = (FT_Byte)( *p ^ ( s >> 8 ) ); - - - s = (FT_UShort)( ( *p + s ) * 52845U + 22719 ); - *buffer++ = b; - } - *cursor = p; - *seed = s; - -#endif /* 0 */ - - return r; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psconv.h b/android/jni/ndk_modules/freetype/src/psaux/psconv.h deleted file mode 100644 index 84854ba0..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/psconv.h +++ /dev/null @@ -1,71 +0,0 @@ -/***************************************************************************/ -/* */ -/* psconv.h */ -/* */ -/* Some convenience conversions (specification). */ -/* */ -/* Copyright 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __PSCONV_H__ -#define __PSCONV_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_AUX_H - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Int ) - PS_Conv_Strtol( FT_Byte** cursor, - FT_Byte* limit, - FT_Int base ); - - - FT_LOCAL( FT_Int ) - PS_Conv_ToInt( FT_Byte** cursor, - FT_Byte* limit ); - - FT_LOCAL( FT_Fixed ) - PS_Conv_ToFixed( FT_Byte** cursor, - FT_Byte* limit, - FT_Int power_ten ); - -#if 0 - FT_LOCAL( FT_UInt ) - PS_Conv_StringDecode( FT_Byte** cursor, - FT_Byte* limit, - FT_Byte* buffer, - FT_Offset n ); -#endif - - FT_LOCAL( FT_UInt ) - PS_Conv_ASCIIHexDecode( FT_Byte** cursor, - FT_Byte* limit, - FT_Byte* buffer, - FT_Offset n ); - - FT_LOCAL( FT_UInt ) - PS_Conv_EexecDecode( FT_Byte** cursor, - FT_Byte* limit, - FT_Byte* buffer, - FT_Offset n, - FT_UShort* seed ); - - -FT_END_HEADER - -#endif /* __PSCONV_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psobjs.c b/android/jni/ndk_modules/freetype/src/psaux/psobjs.c deleted file mode 100644 index 45c74191..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/psobjs.c +++ /dev/null @@ -1,1711 +0,0 @@ -/***************************************************************************/ -/* */ -/* psobjs.c */ -/* */ -/* Auxiliary functions for PostScript fonts (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H - -#include "psobjs.h" -#include "psconv.h" - -#include "psauxerr.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_psobjs - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PS_TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ps_table_new */ - /* */ - /* <Description> */ - /* Initializes a PS_Table. */ - /* */ - /* <InOut> */ - /* table :: The address of the target table. */ - /* */ - /* <Input> */ - /* count :: The table size = the maximum number of elements. */ - /* */ - /* memory :: The memory object to use for all subsequent */ - /* reallocations. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - ps_table_new( PS_Table table, - FT_Int count, - FT_Memory memory ) - { - FT_Error error; - - - table->memory = memory; - if ( FT_NEW_ARRAY( table->elements, count ) || - FT_NEW_ARRAY( table->lengths, count ) ) - goto Exit; - - table->max_elems = count; - table->init = 0xDEADBEEFUL; - table->num_elems = 0; - table->block = 0; - table->capacity = 0; - table->cursor = 0; - - *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs; - - Exit: - if ( error ) - FT_FREE( table->elements ); - - return error; - } - - - static void - shift_elements( PS_Table table, - FT_Byte* old_base ) - { - FT_PtrDist delta = table->block - old_base; - FT_Byte** offset = table->elements; - FT_Byte** limit = offset + table->max_elems; - - - for ( ; offset < limit; offset++ ) - { - if ( offset[0] ) - offset[0] += delta; - } - } - - - static FT_Error - reallocate_t1_table( PS_Table table, - FT_Long new_size ) - { - FT_Memory memory = table->memory; - FT_Byte* old_base = table->block; - FT_Error error; - - - /* allocate new base block */ - if ( FT_ALLOC( table->block, new_size ) ) - { - table->block = old_base; - return error; - } - - /* copy elements and shift offsets */ - if ( old_base ) - { - FT_MEM_COPY( table->block, old_base, table->capacity ); - shift_elements( table, old_base ); - FT_FREE( old_base ); - } - - table->capacity = new_size; - - return PSaux_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ps_table_add */ - /* */ - /* <Description> */ - /* Adds an object to a PS_Table, possibly growing its memory block. */ - /* */ - /* <InOut> */ - /* table :: The target table. */ - /* */ - /* <Input> */ - /* idx :: The index of the object in the table. */ - /* */ - /* object :: The address of the object to copy in memory. */ - /* */ - /* length :: The length in bytes of the source object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. An error is returned if a */ - /* reallocation fails. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - ps_table_add( PS_Table table, - FT_Int idx, - void* object, - FT_PtrDist length ) - { - if ( idx < 0 || idx >= table->max_elems ) - { - FT_ERROR(( "ps_table_add: invalid index\n" )); - return PSaux_Err_Invalid_Argument; - } - - if ( length < 0 ) - { - FT_ERROR(( "ps_table_add: invalid length\n" )); - return PSaux_Err_Invalid_Argument; - } - - /* grow the base block if needed */ - if ( table->cursor + length > table->capacity ) - { - FT_Error error; - FT_Offset new_size = table->capacity; - FT_Long in_offset; - - - in_offset = (FT_Long)((FT_Byte*)object - table->block); - if ( (FT_ULong)in_offset >= table->capacity ) - in_offset = -1; - - while ( new_size < table->cursor + length ) - { - /* increase size by 25% and round up to the nearest multiple - of 1024 */ - new_size += ( new_size >> 2 ) + 1; - new_size = FT_PAD_CEIL( new_size, 1024 ); - } - - error = reallocate_t1_table( table, new_size ); - if ( error ) - return error; - - if ( in_offset >= 0 ) - object = table->block + in_offset; - } - - /* add the object to the base block and adjust offset */ - table->elements[idx] = table->block + table->cursor; - table->lengths [idx] = length; - FT_MEM_COPY( table->block + table->cursor, object, length ); - - table->cursor += length; - return PSaux_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ps_table_done */ - /* */ - /* <Description> */ - /* Finalizes a PS_TableRec (i.e., reallocate it to its current */ - /* cursor). */ - /* */ - /* <InOut> */ - /* table :: The target table. */ - /* */ - /* <Note> */ - /* This function does NOT release the heap's memory block. It is up */ - /* to the caller to clean it, or reference it in its own structures. */ - /* */ - FT_LOCAL_DEF( void ) - ps_table_done( PS_Table table ) - { - FT_Memory memory = table->memory; - FT_Error error; - FT_Byte* old_base = table->block; - - - /* should never fail, because rec.cursor <= rec.size */ - if ( !old_base ) - return; - - if ( FT_ALLOC( table->block, table->cursor ) ) - return; - FT_MEM_COPY( table->block, old_base, table->cursor ); - shift_elements( table, old_base ); - - table->capacity = table->cursor; - FT_FREE( old_base ); - - FT_UNUSED( error ); - } - - - FT_LOCAL_DEF( void ) - ps_table_release( PS_Table table ) - { - FT_Memory memory = table->memory; - - - if ( (FT_ULong)table->init == 0xDEADBEEFUL ) - { - FT_FREE( table->block ); - FT_FREE( table->elements ); - FT_FREE( table->lengths ); - table->init = 0; - } - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 PARSER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* first character must be already part of the comment */ - - static void - skip_comment( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur = *acur; - - - while ( cur < limit ) - { - if ( IS_PS_NEWLINE( *cur ) ) - break; - cur++; - } - - *acur = cur; - } - - - static void - skip_spaces( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur = *acur; - - - while ( cur < limit ) - { - if ( !IS_PS_SPACE( *cur ) ) - { - if ( *cur == '%' ) - /* According to the PLRM, a comment is equal to a space. */ - skip_comment( &cur, limit ); - else - break; - } - cur++; - } - - *acur = cur; - } - - -#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' ) - - - /* first character must be `('; */ - /* *acur is positioned at the character after the closing `)' */ - - static FT_Error - skip_literal_string( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur = *acur; - FT_Int embed = 0; - FT_Error error = PSaux_Err_Invalid_File_Format; - unsigned int i; - - - while ( cur < limit ) - { - FT_Byte c = *cur; - - - ++cur; - - if ( c == '\\' ) - { - /* Red Book 3rd ed., section `Literal Text Strings', p. 29: */ - /* A backslash can introduce three different types */ - /* of escape sequences: */ - /* - a special escaped char like \r, \n, etc. */ - /* - a one-, two-, or three-digit octal number */ - /* - none of the above in which case the backslash is ignored */ - - if ( cur == limit ) - /* error (or to be ignored?) */ - break; - - switch ( *cur ) - { - /* skip `special' escape */ - case 'n': - case 'r': - case 't': - case 'b': - case 'f': - case '\\': - case '(': - case ')': - ++cur; - break; - - default: - /* skip octal escape or ignore backslash */ - for ( i = 0; i < 3 && cur < limit; ++i ) - { - if ( !IS_OCTAL_DIGIT( *cur ) ) - break; - - ++cur; - } - } - } - else if ( c == '(' ) - embed++; - else if ( c == ')' ) - { - embed--; - if ( embed == 0 ) - { - error = PSaux_Err_Ok; - break; - } - } - } - - *acur = cur; - - return error; - } - - - /* first character must be `<' */ - - static FT_Error - skip_string( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur = *acur; - FT_Error err = PSaux_Err_Ok; - - - while ( ++cur < limit ) - { - /* All whitespace characters are ignored. */ - skip_spaces( &cur, limit ); - if ( cur >= limit ) - break; - - if ( !IS_PS_XDIGIT( *cur ) ) - break; - } - - if ( cur < limit && *cur != '>' ) - { - FT_ERROR(( "skip_string: missing closing delimiter `>'\n" )); - err = PSaux_Err_Invalid_File_Format; - } - else - cur++; - - *acur = cur; - return err; - } - - - /* first character must be the opening brace that */ - /* starts the procedure */ - - /* NB: [ and ] need not match: */ - /* `/foo {[} def' is a valid PostScript fragment, */ - /* even within a Type1 font */ - - static FT_Error - skip_procedure( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur; - FT_Int embed = 0; - FT_Error error = PSaux_Err_Ok; - - - FT_ASSERT( **acur == '{' ); - - for ( cur = *acur; cur < limit && error == PSaux_Err_Ok; ++cur ) - { - switch ( *cur ) - { - case '{': - ++embed; - break; - - case '}': - --embed; - if ( embed == 0 ) - { - ++cur; - goto end; - } - break; - - case '(': - error = skip_literal_string( &cur, limit ); - break; - - case '<': - error = skip_string( &cur, limit ); - break; - - case '%': - skip_comment( &cur, limit ); - break; - } - } - - end: - if ( embed != 0 ) - error = PSaux_Err_Invalid_File_Format; - - *acur = cur; - - return error; - } - - - /***********************************************************************/ - /* */ - /* All exported parsing routines handle leading whitespace and stop at */ - /* the first character which isn't part of the just handled token. */ - /* */ - /***********************************************************************/ - - - FT_LOCAL_DEF( void ) - ps_parser_skip_PS_token( PS_Parser parser ) - { - /* Note: PostScript allows any non-delimiting, non-whitespace */ - /* character in a name (PS Ref Manual, 3rd ed, p31). */ - /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */ - - FT_Byte* cur = parser->cursor; - FT_Byte* limit = parser->limit; - FT_Error error = PSaux_Err_Ok; - - - skip_spaces( &cur, limit ); /* this also skips comments */ - if ( cur >= limit ) - goto Exit; - - /* self-delimiting, single-character tokens */ - if ( *cur == '[' || *cur == ']' ) - { - cur++; - goto Exit; - } - - /* skip balanced expressions (procedures and strings) */ - - if ( *cur == '{' ) /* {...} */ - { - error = skip_procedure( &cur, limit ); - goto Exit; - } - - if ( *cur == '(' ) /* (...) */ - { - error = skip_literal_string( &cur, limit ); - goto Exit; - } - - if ( *cur == '<' ) /* <...> */ - { - if ( cur + 1 < limit && *(cur + 1) == '<' ) /* << */ - { - cur++; - cur++; - } - else - error = skip_string( &cur, limit ); - - goto Exit; - } - - if ( *cur == '>' ) - { - cur++; - if ( cur >= limit || *cur != '>' ) /* >> */ - { - FT_ERROR(( "ps_parser_skip_PS_token:" - " unexpected closing delimiter `>'\n" )); - error = PSaux_Err_Invalid_File_Format; - goto Exit; - } - cur++; - goto Exit; - } - - if ( *cur == '/' ) - cur++; - - /* anything else */ - while ( cur < limit ) - { - /* *cur might be invalid (e.g., ')' or '}'), but this */ - /* is handled by the test `cur == parser->cursor' below */ - if ( IS_PS_DELIM( *cur ) ) - break; - - cur++; - } - - Exit: - if ( cur == parser->cursor ) - { - FT_ERROR(( "ps_parser_skip_PS_token:" - " current token is `%c' which is self-delimiting\n" - " " - " but invalid at this point\n", - *cur )); - - error = PSaux_Err_Invalid_File_Format; - } - - parser->error = error; - parser->cursor = cur; - } - - - FT_LOCAL_DEF( void ) - ps_parser_skip_spaces( PS_Parser parser ) - { - skip_spaces( &parser->cursor, parser->limit ); - } - - - /* `token' here means either something between balanced delimiters */ - /* or the next token; the delimiters are not removed. */ - - FT_LOCAL_DEF( void ) - ps_parser_to_token( PS_Parser parser, - T1_Token token ) - { - FT_Byte* cur; - FT_Byte* limit; - FT_Int embed; - - - token->type = T1_TOKEN_TYPE_NONE; - token->start = 0; - token->limit = 0; - - /* first of all, skip leading whitespace */ - ps_parser_skip_spaces( parser ); - - cur = parser->cursor; - limit = parser->limit; - - if ( cur >= limit ) - return; - - switch ( *cur ) - { - /************* check for literal string *****************/ - case '(': - token->type = T1_TOKEN_TYPE_STRING; - token->start = cur; - - if ( skip_literal_string( &cur, limit ) == PSaux_Err_Ok ) - token->limit = cur; - break; - - /************* check for programs/array *****************/ - case '{': - token->type = T1_TOKEN_TYPE_ARRAY; - token->start = cur; - - if ( skip_procedure( &cur, limit ) == PSaux_Err_Ok ) - token->limit = cur; - break; - - /************* check for table/array ********************/ - /* XXX: in theory we should also look for "<<" */ - /* since this is semantically equivalent to "["; */ - /* in practice it doesn't matter (?) */ - case '[': - token->type = T1_TOKEN_TYPE_ARRAY; - embed = 1; - token->start = cur++; - - /* we need this to catch `[ ]' */ - parser->cursor = cur; - ps_parser_skip_spaces( parser ); - cur = parser->cursor; - - while ( cur < limit && !parser->error ) - { - /* XXX: this is wrong because it does not */ - /* skip comments, procedures, and strings */ - if ( *cur == '[' ) - embed++; - else if ( *cur == ']' ) - { - embed--; - if ( embed <= 0 ) - { - token->limit = ++cur; - break; - } - } - - parser->cursor = cur; - ps_parser_skip_PS_token( parser ); - /* we need this to catch `[XXX ]' */ - ps_parser_skip_spaces ( parser ); - cur = parser->cursor; - } - break; - - /* ************ otherwise, it is any token **************/ - default: - token->start = cur; - token->type = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY ); - ps_parser_skip_PS_token( parser ); - cur = parser->cursor; - if ( !parser->error ) - token->limit = cur; - } - - if ( !token->limit ) - { - token->start = 0; - token->type = T1_TOKEN_TYPE_NONE; - } - - parser->cursor = cur; - } - - - /* NB: `tokens' can be NULL if we only want to count */ - /* the number of array elements */ - - FT_LOCAL_DEF( void ) - ps_parser_to_token_array( PS_Parser parser, - T1_Token tokens, - FT_UInt max_tokens, - FT_Int* pnum_tokens ) - { - T1_TokenRec master; - - - *pnum_tokens = -1; - - /* this also handles leading whitespace */ - ps_parser_to_token( parser, &master ); - - if ( master.type == T1_TOKEN_TYPE_ARRAY ) - { - FT_Byte* old_cursor = parser->cursor; - FT_Byte* old_limit = parser->limit; - T1_Token cur = tokens; - T1_Token limit = cur + max_tokens; - - - /* don't include outermost delimiters */ - parser->cursor = master.start + 1; - parser->limit = master.limit - 1; - - while ( parser->cursor < parser->limit ) - { - T1_TokenRec token; - - - ps_parser_to_token( parser, &token ); - if ( !token.type ) - break; - - if ( tokens != NULL && cur < limit ) - *cur = token; - - cur++; - } - - *pnum_tokens = (FT_Int)( cur - tokens ); - - parser->cursor = old_cursor; - parser->limit = old_limit; - } - } - - - /* first character must be a delimiter or a part of a number */ - /* NB: `coords' can be NULL if we just want to skip the */ - /* array; in this case we ignore `max_coords' */ - - static FT_Int - ps_tocoordarray( FT_Byte* *acur, - FT_Byte* limit, - FT_Int max_coords, - FT_Short* coords ) - { - FT_Byte* cur = *acur; - FT_Int count = 0; - FT_Byte c, ender; - - - if ( cur >= limit ) - goto Exit; - - /* check for the beginning of an array; otherwise, only one number */ - /* will be read */ - c = *cur; - ender = 0; - - if ( c == '[' ) - ender = ']'; - else if ( c == '{' ) - ender = '}'; - - if ( ender ) - cur++; - - /* now, read the coordinates */ - while ( cur < limit ) - { - FT_Short dummy; - FT_Byte* old_cur; - - - /* skip whitespace in front of data */ - skip_spaces( &cur, limit ); - if ( cur >= limit ) - goto Exit; - - if ( *cur == ender ) - { - cur++; - break; - } - - old_cur = cur; - - if ( coords != NULL && count >= max_coords ) - break; - - /* call PS_Conv_ToFixed() even if coords == NULL */ - /* to properly parse number at `cur' */ - *( coords != NULL ? &coords[count] : &dummy ) = - (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 ); - - if ( old_cur == cur ) - { - count = -1; - goto Exit; - } - else - count++; - - if ( !ender ) - break; - } - - Exit: - *acur = cur; - return count; - } - - - /* first character must be a delimiter or a part of a number */ - /* NB: `values' can be NULL if we just want to skip the */ - /* array; in this case we ignore `max_values' */ - - static FT_Int - ps_tofixedarray( FT_Byte* *acur, - FT_Byte* limit, - FT_Int max_values, - FT_Fixed* values, - FT_Int power_ten ) - { - FT_Byte* cur = *acur; - FT_Int count = 0; - FT_Byte c, ender; - - - if ( cur >= limit ) - goto Exit; - - /* Check for the beginning of an array. Otherwise, only one number */ - /* will be read. */ - c = *cur; - ender = 0; - - if ( c == '[' ) - ender = ']'; - else if ( c == '{' ) - ender = '}'; - - if ( ender ) - cur++; - - /* now, read the values */ - while ( cur < limit ) - { - FT_Fixed dummy; - FT_Byte* old_cur; - - - /* skip whitespace in front of data */ - skip_spaces( &cur, limit ); - if ( cur >= limit ) - goto Exit; - - if ( *cur == ender ) - { - cur++; - break; - } - - old_cur = cur; - - if ( values != NULL && count >= max_values ) - break; - - /* call PS_Conv_ToFixed() even if coords == NULL */ - /* to properly parse number at `cur' */ - *( values != NULL ? &values[count] : &dummy ) = - PS_Conv_ToFixed( &cur, limit, power_ten ); - - if ( old_cur == cur ) - { - count = -1; - goto Exit; - } - else - count++; - - if ( !ender ) - break; - } - - Exit: - *acur = cur; - return count; - } - - -#if 0 - - static FT_String* - ps_tostring( FT_Byte** cursor, - FT_Byte* limit, - FT_Memory memory ) - { - FT_Byte* cur = *cursor; - FT_PtrDist len = 0; - FT_Int count; - FT_String* result; - FT_Error error; - - - /* XXX: some stupid fonts have a `Notice' or `Copyright' string */ - /* that simply doesn't begin with an opening parenthesis, even */ - /* though they have a closing one! E.g. "amuncial.pfb" */ - /* */ - /* We must deal with these ill-fated cases there. Note that */ - /* these fonts didn't work with the old Type 1 driver as the */ - /* notice/copyright was not recognized as a valid string token */ - /* and made the old token parser commit errors. */ - - while ( cur < limit && ( *cur == ' ' || *cur == '\t' ) ) - cur++; - if ( cur + 1 >= limit ) - return 0; - - if ( *cur == '(' ) - cur++; /* skip the opening parenthesis, if there is one */ - - *cursor = cur; - count = 0; - - /* then, count its length */ - for ( ; cur < limit; cur++ ) - { - if ( *cur == '(' ) - count++; - - else if ( *cur == ')' ) - { - count--; - if ( count < 0 ) - break; - } - } - - len = cur - *cursor; - if ( cur >= limit || FT_ALLOC( result, len + 1 ) ) - return 0; - - /* now copy the string */ - FT_MEM_COPY( result, *cursor, len ); - result[len] = '\0'; - *cursor = cur; - return result; - } - -#endif /* 0 */ - - - static int - ps_tobool( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur = *acur; - FT_Bool result = 0; - - - /* return 1 if we find `true', 0 otherwise */ - if ( cur + 3 < limit && - cur[0] == 't' && - cur[1] == 'r' && - cur[2] == 'u' && - cur[3] == 'e' ) - { - result = 1; - cur += 5; - } - else if ( cur + 4 < limit && - cur[0] == 'f' && - cur[1] == 'a' && - cur[2] == 'l' && - cur[3] == 's' && - cur[4] == 'e' ) - { - result = 0; - cur += 6; - } - - *acur = cur; - return result; - } - - - /* load a simple field (i.e. non-table) into the current list of objects */ - - FT_LOCAL_DEF( FT_Error ) - ps_parser_load_field( PS_Parser parser, - const T1_Field field, - void** objects, - FT_UInt max_objects, - FT_ULong* pflags ) - { - T1_TokenRec token; - FT_Byte* cur; - FT_Byte* limit; - FT_UInt count; - FT_UInt idx; - FT_Error error; - - - /* this also skips leading whitespace */ - ps_parser_to_token( parser, &token ); - if ( !token.type ) - goto Fail; - - count = 1; - idx = 0; - cur = token.start; - limit = token.limit; - - /* we must detect arrays in /FontBBox */ - if ( field->type == T1_FIELD_TYPE_BBOX ) - { - T1_TokenRec token2; - FT_Byte* old_cur = parser->cursor; - FT_Byte* old_limit = parser->limit; - - - /* don't include delimiters */ - parser->cursor = token.start + 1; - parser->limit = token.limit - 1; - - ps_parser_to_token( parser, &token2 ); - parser->cursor = old_cur; - parser->limit = old_limit; - - if ( token2.type == T1_TOKEN_TYPE_ARRAY ) - goto FieldArray; - } - else if ( token.type == T1_TOKEN_TYPE_ARRAY ) - { - FieldArray: - /* if this is an array and we have no blend, an error occurs */ - if ( max_objects == 0 ) - goto Fail; - - count = max_objects; - idx = 1; - - /* don't include delimiters */ - cur++; - limit--; - } - - for ( ; count > 0; count--, idx++ ) - { - FT_Byte* q = (FT_Byte*)objects[idx] + field->offset; - FT_Long val; - FT_String* string; - - - skip_spaces( &cur, limit ); - - switch ( field->type ) - { - case T1_FIELD_TYPE_BOOL: - val = ps_tobool( &cur, limit ); - goto Store_Integer; - - case T1_FIELD_TYPE_FIXED: - val = PS_Conv_ToFixed( &cur, limit, 0 ); - goto Store_Integer; - - case T1_FIELD_TYPE_FIXED_1000: - val = PS_Conv_ToFixed( &cur, limit, 3 ); - goto Store_Integer; - - case T1_FIELD_TYPE_INTEGER: - val = PS_Conv_ToInt( &cur, limit ); - /* fall through */ - - Store_Integer: - switch ( field->size ) - { - case (8 / FT_CHAR_BIT): - *(FT_Byte*)q = (FT_Byte)val; - break; - - case (16 / FT_CHAR_BIT): - *(FT_UShort*)q = (FT_UShort)val; - break; - - case (32 / FT_CHAR_BIT): - *(FT_UInt32*)q = (FT_UInt32)val; - break; - - default: /* for 64-bit systems */ - *(FT_Long*)q = val; - } - break; - - case T1_FIELD_TYPE_STRING: - case T1_FIELD_TYPE_KEY: - { - FT_Memory memory = parser->memory; - FT_UInt len = (FT_UInt)( limit - cur ); - - - if ( cur >= limit ) - break; - - /* we allow both a string or a name */ - /* for cases like /FontName (foo) def */ - if ( token.type == T1_TOKEN_TYPE_KEY ) - { - /* don't include leading `/' */ - len--; - cur++; - } - else if ( token.type == T1_TOKEN_TYPE_STRING ) - { - /* don't include delimiting parentheses */ - /* XXX we don't handle <<...>> here */ - /* XXX should we convert octal escapes? */ - /* if so, what encoding should we use? */ - cur++; - len -= 2; - } - else - { - FT_ERROR(( "ps_parser_load_field:" - " expected a name or string\n" - " " - " but found token of type %d instead\n", - token.type )); - error = PSaux_Err_Invalid_File_Format; - goto Exit; - } - - /* for this to work (FT_String**)q must have been */ - /* initialized to NULL */ - if ( *(FT_String**)q != NULL ) - { - FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n", - field->ident )); - FT_FREE( *(FT_String**)q ); - *(FT_String**)q = NULL; - } - - if ( FT_ALLOC( string, len + 1 ) ) - goto Exit; - - FT_MEM_COPY( string, cur, len ); - string[len] = 0; - - *(FT_String**)q = string; - } - break; - - case T1_FIELD_TYPE_BBOX: - { - FT_Fixed temp[4]; - FT_BBox* bbox = (FT_BBox*)q; - FT_Int result; - - - result = ps_tofixedarray( &cur, limit, 4, temp, 0 ); - - if ( result < 0 ) - { - FT_ERROR(( "ps_parser_load_field:" - " expected four integers in bounding box\n" )); - error = PSaux_Err_Invalid_File_Format; - goto Exit; - } - - bbox->xMin = FT_RoundFix( temp[0] ); - bbox->yMin = FT_RoundFix( temp[1] ); - bbox->xMax = FT_RoundFix( temp[2] ); - bbox->yMax = FT_RoundFix( temp[3] ); - } - break; - - default: - /* an error occurred */ - goto Fail; - } - } - -#if 0 /* obsolete -- keep for reference */ - if ( pflags ) - *pflags |= 1L << field->flag_bit; -#else - FT_UNUSED( pflags ); -#endif - - error = PSaux_Err_Ok; - - Exit: - return error; - - Fail: - error = PSaux_Err_Invalid_File_Format; - goto Exit; - } - - -#define T1_MAX_TABLE_ELEMENTS 32 - - - FT_LOCAL_DEF( FT_Error ) - ps_parser_load_field_table( PS_Parser parser, - const T1_Field field, - void** objects, - FT_UInt max_objects, - FT_ULong* pflags ) - { - T1_TokenRec elements[T1_MAX_TABLE_ELEMENTS]; - T1_Token token; - FT_Int num_elements; - FT_Error error = PSaux_Err_Ok; - FT_Byte* old_cursor; - FT_Byte* old_limit; - T1_FieldRec fieldrec = *(T1_Field)field; - - - fieldrec.type = T1_FIELD_TYPE_INTEGER; - if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY || - field->type == T1_FIELD_TYPE_BBOX ) - fieldrec.type = T1_FIELD_TYPE_FIXED; - - ps_parser_to_token_array( parser, elements, - T1_MAX_TABLE_ELEMENTS, &num_elements ); - if ( num_elements < 0 ) - { - error = PSaux_Err_Ignore; - goto Exit; - } - if ( (FT_UInt)num_elements > field->array_max ) - num_elements = field->array_max; - - old_cursor = parser->cursor; - old_limit = parser->limit; - - /* we store the elements count if necessary; */ - /* we further assume that `count_offset' can't be zero */ - if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 ) - *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) = - (FT_Byte)num_elements; - - /* we now load each element, adjusting the field.offset on each one */ - token = elements; - for ( ; num_elements > 0; num_elements--, token++ ) - { - parser->cursor = token->start; - parser->limit = token->limit; - ps_parser_load_field( parser, &fieldrec, objects, max_objects, 0 ); - fieldrec.offset += fieldrec.size; - } - -#if 0 /* obsolete -- keep for reference */ - if ( pflags ) - *pflags |= 1L << field->flag_bit; -#else - FT_UNUSED( pflags ); -#endif - - parser->cursor = old_cursor; - parser->limit = old_limit; - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Long ) - ps_parser_to_int( PS_Parser parser ) - { - ps_parser_skip_spaces( parser ); - return PS_Conv_ToInt( &parser->cursor, parser->limit ); - } - - - /* first character must be `<' if `delimiters' is non-zero */ - - FT_LOCAL_DEF( FT_Error ) - ps_parser_to_bytes( PS_Parser parser, - FT_Byte* bytes, - FT_Offset max_bytes, - FT_Long* pnum_bytes, - FT_Bool delimiters ) - { - FT_Error error = PSaux_Err_Ok; - FT_Byte* cur; - - - ps_parser_skip_spaces( parser ); - cur = parser->cursor; - - if ( cur >= parser->limit ) - goto Exit; - - if ( delimiters ) - { - if ( *cur != '<' ) - { - FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" )); - error = PSaux_Err_Invalid_File_Format; - goto Exit; - } - - cur++; - } - - *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur, - parser->limit, - bytes, - max_bytes ); - - if ( delimiters ) - { - if ( cur < parser->limit && *cur != '>' ) - { - FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" )); - error = PSaux_Err_Invalid_File_Format; - goto Exit; - } - - cur++; - } - - parser->cursor = cur; - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Fixed ) - ps_parser_to_fixed( PS_Parser parser, - FT_Int power_ten ) - { - ps_parser_skip_spaces( parser ); - return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten ); - } - - - FT_LOCAL_DEF( FT_Int ) - ps_parser_to_coord_array( PS_Parser parser, - FT_Int max_coords, - FT_Short* coords ) - { - ps_parser_skip_spaces( parser ); - return ps_tocoordarray( &parser->cursor, parser->limit, - max_coords, coords ); - } - - - FT_LOCAL_DEF( FT_Int ) - ps_parser_to_fixed_array( PS_Parser parser, - FT_Int max_values, - FT_Fixed* values, - FT_Int power_ten ) - { - ps_parser_skip_spaces( parser ); - return ps_tofixedarray( &parser->cursor, parser->limit, - max_values, values, power_ten ); - } - - -#if 0 - - FT_LOCAL_DEF( FT_String* ) - T1_ToString( PS_Parser parser ) - { - return ps_tostring( &parser->cursor, parser->limit, parser->memory ); - } - - - FT_LOCAL_DEF( FT_Bool ) - T1_ToBool( PS_Parser parser ) - { - return ps_tobool( &parser->cursor, parser->limit ); - } - -#endif /* 0 */ - - - FT_LOCAL_DEF( void ) - ps_parser_init( PS_Parser parser, - FT_Byte* base, - FT_Byte* limit, - FT_Memory memory ) - { - parser->error = PSaux_Err_Ok; - parser->base = base; - parser->limit = limit; - parser->cursor = base; - parser->memory = memory; - parser->funcs = ps_parser_funcs; - } - - - FT_LOCAL_DEF( void ) - ps_parser_done( PS_Parser parser ) - { - FT_UNUSED( parser ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 BUILDER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* <Function> */ - /* t1_builder_init */ - /* */ - /* <Description> */ - /* Initializes a given glyph builder. */ - /* */ - /* <InOut> */ - /* builder :: A pointer to the glyph builder to initialize. */ - /* */ - /* <Input> */ - /* face :: The current face object. */ - /* */ - /* size :: The current size object. */ - /* */ - /* glyph :: The current glyph object. */ - /* */ - /* hinting :: Whether hinting should be applied. */ - /* */ - FT_LOCAL_DEF( void ) - t1_builder_init( T1_Builder builder, - FT_Face face, - FT_Size size, - FT_GlyphSlot glyph, - FT_Bool hinting ) - { - builder->parse_state = T1_Parse_Start; - builder->load_points = 1; - - builder->face = face; - builder->glyph = glyph; - builder->memory = face->memory; - - if ( glyph ) - { - FT_GlyphLoader loader = glyph->internal->loader; - - - builder->loader = loader; - builder->base = &loader->base.outline; - builder->current = &loader->current.outline; - FT_GlyphLoader_Rewind( loader ); - - builder->hints_globals = size->internal; - builder->hints_funcs = 0; - - if ( hinting ) - builder->hints_funcs = glyph->internal->glyph_hints; - } - - builder->pos_x = 0; - builder->pos_y = 0; - - builder->left_bearing.x = 0; - builder->left_bearing.y = 0; - builder->advance.x = 0; - builder->advance.y = 0; - - builder->funcs = t1_builder_funcs; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* t1_builder_done */ - /* */ - /* <Description> */ - /* Finalizes a given glyph builder. Its contents can still be used */ - /* after the call, but the function saves important information */ - /* within the corresponding glyph slot. */ - /* */ - /* <Input> */ - /* builder :: A pointer to the glyph builder to finalize. */ - /* */ - FT_LOCAL_DEF( void ) - t1_builder_done( T1_Builder builder ) - { - FT_GlyphSlot glyph = builder->glyph; - - - if ( glyph ) - glyph->outline = *builder->base; - } - - - /* check that there is enough space for `count' more points */ - FT_LOCAL_DEF( FT_Error ) - t1_builder_check_points( T1_Builder builder, - FT_Int count ) - { - return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); - } - - - /* add a new point, do not check space */ - FT_LOCAL_DEF( void ) - t1_builder_add_point( T1_Builder builder, - FT_Pos x, - FT_Pos y, - FT_Byte flag ) - { - FT_Outline* outline = builder->current; - - - if ( builder->load_points ) - { - FT_Vector* point = outline->points + outline->n_points; - FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; - - - point->x = FIXED_TO_INT( x ); - point->y = FIXED_TO_INT( y ); - *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); - } - outline->n_points++; - } - - - /* check space for a new on-curve point, then add it */ - FT_LOCAL_DEF( FT_Error ) - t1_builder_add_point1( T1_Builder builder, - FT_Pos x, - FT_Pos y ) - { - FT_Error error; - - - error = t1_builder_check_points( builder, 1 ); - if ( !error ) - t1_builder_add_point( builder, x, y, 1 ); - - return error; - } - - - /* check space for a new contour, then add it */ - FT_LOCAL_DEF( FT_Error ) - t1_builder_add_contour( T1_Builder builder ) - { - FT_Outline* outline = builder->current; - FT_Error error; - - - /* this might happen in invalid fonts */ - if ( !outline ) - { - FT_ERROR(( "t1_builder_add_contour: no outline to add points to\n" )); - return PSaux_Err_Invalid_File_Format; - } - - if ( !builder->load_points ) - { - outline->n_contours++; - return PSaux_Err_Ok; - } - - error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); - if ( !error ) - { - if ( outline->n_contours > 0 ) - outline->contours[outline->n_contours - 1] = - (short)( outline->n_points - 1 ); - - outline->n_contours++; - } - - return error; - } - - - /* if a path was begun, add its first on-curve point */ - FT_LOCAL_DEF( FT_Error ) - t1_builder_start_point( T1_Builder builder, - FT_Pos x, - FT_Pos y ) - { - FT_Error error = PSaux_Err_Invalid_File_Format; - - - /* test whether we are building a new contour */ - - if ( builder->parse_state == T1_Parse_Have_Path ) - error = PSaux_Err_Ok; - else - { - builder->parse_state = T1_Parse_Have_Path; - error = t1_builder_add_contour( builder ); - if ( !error ) - error = t1_builder_add_point1( builder, x, y ); - } - - return error; - } - - - /* close the current contour */ - FT_LOCAL_DEF( void ) - t1_builder_close_contour( T1_Builder builder ) - { - FT_Outline* outline = builder->current; - FT_Int first; - - - if ( !outline ) - return; - - first = outline->n_contours <= 1 - ? 0 : outline->contours[outline->n_contours - 2] + 1; - - /* We must not include the last point in the path if it */ - /* is located on the first point. */ - if ( outline->n_points > 1 ) - { - FT_Vector* p1 = outline->points + first; - FT_Vector* p2 = outline->points + outline->n_points - 1; - FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; - - - /* `delete' last point only if it coincides with the first */ - /* point and it is not a control point (which can happen). */ - if ( p1->x == p2->x && p1->y == p2->y ) - if ( *control == FT_CURVE_TAG_ON ) - outline->n_points--; - } - - if ( outline->n_contours > 0 ) - { - /* Don't add contours only consisting of one point, i.e., */ - /* check whether the first and the last point is the same. */ - if ( first == outline->n_points - 1 ) - { - outline->n_contours--; - outline->n_points--; - } - else - outline->contours[outline->n_contours - 1] = - (short)( outline->n_points - 1 ); - } - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** OTHER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - t1_decrypt( FT_Byte* buffer, - FT_Offset length, - FT_UShort seed ) - { - PS_Conv_EexecDecode( &buffer, - buffer + length, - buffer, - length, - &seed ); - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/psobjs.h b/android/jni/ndk_modules/freetype/src/psaux/psobjs.h deleted file mode 100644 index e380c60d..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/psobjs.h +++ /dev/null @@ -1,212 +0,0 @@ -/***************************************************************************/ -/* */ -/* psobjs.h */ -/* */ -/* Auxiliary functions for PostScript fonts (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __PSOBJS_H__ -#define __PSOBJS_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_AUX_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1_TABLE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_CALLBACK_TABLE - const PS_Table_FuncsRec ps_table_funcs; - - FT_CALLBACK_TABLE - const PS_Parser_FuncsRec ps_parser_funcs; - - FT_CALLBACK_TABLE - const T1_Builder_FuncsRec t1_builder_funcs; - - - FT_LOCAL( FT_Error ) - ps_table_new( PS_Table table, - FT_Int count, - FT_Memory memory ); - - FT_LOCAL( FT_Error ) - ps_table_add( PS_Table table, - FT_Int idx, - void* object, - FT_PtrDist length ); - - FT_LOCAL( void ) - ps_table_done( PS_Table table ); - - - FT_LOCAL( void ) - ps_table_release( PS_Table table ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 PARSER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_LOCAL( void ) - ps_parser_skip_spaces( PS_Parser parser ); - - FT_LOCAL( void ) - ps_parser_skip_PS_token( PS_Parser parser ); - - FT_LOCAL( void ) - ps_parser_to_token( PS_Parser parser, - T1_Token token ); - - FT_LOCAL( void ) - ps_parser_to_token_array( PS_Parser parser, - T1_Token tokens, - FT_UInt max_tokens, - FT_Int* pnum_tokens ); - - FT_LOCAL( FT_Error ) - ps_parser_load_field( PS_Parser parser, - const T1_Field field, - void** objects, - FT_UInt max_objects, - FT_ULong* pflags ); - - FT_LOCAL( FT_Error ) - ps_parser_load_field_table( PS_Parser parser, - const T1_Field field, - void** objects, - FT_UInt max_objects, - FT_ULong* pflags ); - - FT_LOCAL( FT_Long ) - ps_parser_to_int( PS_Parser parser ); - - - FT_LOCAL( FT_Error ) - ps_parser_to_bytes( PS_Parser parser, - FT_Byte* bytes, - FT_Offset max_bytes, - FT_Long* pnum_bytes, - FT_Bool delimiters ); - - - FT_LOCAL( FT_Fixed ) - ps_parser_to_fixed( PS_Parser parser, - FT_Int power_ten ); - - - FT_LOCAL( FT_Int ) - ps_parser_to_coord_array( PS_Parser parser, - FT_Int max_coords, - FT_Short* coords ); - - FT_LOCAL( FT_Int ) - ps_parser_to_fixed_array( PS_Parser parser, - FT_Int max_values, - FT_Fixed* values, - FT_Int power_ten ); - - - FT_LOCAL( void ) - ps_parser_init( PS_Parser parser, - FT_Byte* base, - FT_Byte* limit, - FT_Memory memory ); - - FT_LOCAL( void ) - ps_parser_done( PS_Parser parser ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** T1 BUILDER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - t1_builder_init( T1_Builder builder, - FT_Face face, - FT_Size size, - FT_GlyphSlot glyph, - FT_Bool hinting ); - - FT_LOCAL( void ) - t1_builder_done( T1_Builder builder ); - - FT_LOCAL( FT_Error ) - t1_builder_check_points( T1_Builder builder, - FT_Int count ); - - FT_LOCAL( void ) - t1_builder_add_point( T1_Builder builder, - FT_Pos x, - FT_Pos y, - FT_Byte flag ); - - FT_LOCAL( FT_Error ) - t1_builder_add_point1( T1_Builder builder, - FT_Pos x, - FT_Pos y ); - - FT_LOCAL( FT_Error ) - t1_builder_add_contour( T1_Builder builder ); - - - FT_LOCAL( FT_Error ) - t1_builder_start_point( T1_Builder builder, - FT_Pos x, - FT_Pos y ); - - - FT_LOCAL( void ) - t1_builder_close_contour( T1_Builder builder ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** OTHER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL( void ) - t1_decrypt( FT_Byte* buffer, - FT_Offset length, - FT_UShort seed ); - - -FT_END_HEADER - -#endif /* __PSOBJS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/t1cmap.c b/android/jni/ndk_modules/freetype/src/psaux/t1cmap.c deleted file mode 100644 index f933e4da..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/t1cmap.c +++ /dev/null @@ -1,341 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1cmap.c */ -/* */ -/* Type 1 character map support (body). */ -/* */ -/* Copyright 2002, 2003, 2006, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include "t1cmap.h" - -#include FT_INTERNAL_DEBUG_H - -#include "psauxerr.h" - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - t1_cmap_std_init( T1_CMapStd cmap, - FT_Int is_expert ) - { - T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; - - - cmap->num_glyphs = face->type1.num_glyphs; - cmap->glyph_names = (const char* const*)face->type1.glyph_names; - cmap->sid_to_string = psnames->adobe_std_strings; - cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding - : psnames->adobe_std_encoding; - - FT_ASSERT( cmap->code_to_sid != NULL ); - } - - - FT_CALLBACK_DEF( void ) - t1_cmap_std_done( T1_CMapStd cmap ) - { - cmap->num_glyphs = 0; - cmap->glyph_names = NULL; - cmap->sid_to_string = NULL; - cmap->code_to_sid = NULL; - } - - - FT_CALLBACK_DEF( FT_UInt ) - t1_cmap_std_char_index( T1_CMapStd cmap, - FT_UInt32 char_code ) - { - FT_UInt result = 0; - - - if ( char_code < 256 ) - { - FT_UInt code, n; - const char* glyph_name; - - - /* convert character code to Adobe SID string */ - code = cmap->code_to_sid[char_code]; - glyph_name = cmap->sid_to_string( code ); - - /* look for the corresponding glyph name */ - for ( n = 0; n < cmap->num_glyphs; n++ ) - { - const char* gname = cmap->glyph_names[n]; - - - if ( gname && gname[0] == glyph_name[0] && - ft_strcmp( gname, glyph_name ) == 0 ) - { - result = n; - break; - } - } - } - - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - t1_cmap_std_char_next( T1_CMapStd cmap, - FT_UInt32 *pchar_code ) - { - FT_UInt result = 0; - FT_UInt32 char_code = *pchar_code + 1; - - - while ( char_code < 256 ) - { - result = t1_cmap_std_char_index( cmap, char_code ); - if ( result != 0 ) - goto Exit; - - char_code++; - } - char_code = 0; - - Exit: - *pchar_code = char_code; - return result; - } - - - FT_CALLBACK_DEF( FT_Error ) - t1_cmap_standard_init( T1_CMapStd cmap ) - { - t1_cmap_std_init( cmap, 0 ); - return 0; - } - - - FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec - t1_cmap_standard_class_rec = - { - sizeof ( T1_CMapStdRec ), - - (FT_CMap_InitFunc) t1_cmap_standard_init, - (FT_CMap_DoneFunc) t1_cmap_std_done, - (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, - (FT_CMap_CharNextFunc) t1_cmap_std_char_next, - - NULL, NULL, NULL, NULL, NULL - }; - - - FT_CALLBACK_DEF( FT_Error ) - t1_cmap_expert_init( T1_CMapStd cmap ) - { - t1_cmap_std_init( cmap, 1 ); - return 0; - } - - FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec - t1_cmap_expert_class_rec = - { - sizeof ( T1_CMapStdRec ), - - (FT_CMap_InitFunc) t1_cmap_expert_init, - (FT_CMap_DoneFunc) t1_cmap_std_done, - (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, - (FT_CMap_CharNextFunc) t1_cmap_std_char_next, - - NULL, NULL, NULL, NULL, NULL - }; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 CUSTOM ENCODING CMAP *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_CALLBACK_DEF( FT_Error ) - t1_cmap_custom_init( T1_CMapCustom cmap ) - { - T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); - T1_Encoding encoding = &face->type1.encoding; - - - cmap->first = encoding->code_first; - cmap->count = (FT_UInt)( encoding->code_last - cmap->first ); - cmap->indices = encoding->char_index; - - FT_ASSERT( cmap->indices != NULL ); - FT_ASSERT( encoding->code_first <= encoding->code_last ); - - return 0; - } - - - FT_CALLBACK_DEF( void ) - t1_cmap_custom_done( T1_CMapCustom cmap ) - { - cmap->indices = NULL; - cmap->first = 0; - cmap->count = 0; - } - - - FT_CALLBACK_DEF( FT_UInt ) - t1_cmap_custom_char_index( T1_CMapCustom cmap, - FT_UInt32 char_code ) - { - FT_UInt result = 0; - - - if ( ( char_code >= cmap->first ) && - ( char_code < ( cmap->first + cmap->count ) ) ) - result = cmap->indices[char_code]; - - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - t1_cmap_custom_char_next( T1_CMapCustom cmap, - FT_UInt32 *pchar_code ) - { - FT_UInt result = 0; - FT_UInt32 char_code = *pchar_code; - - - ++char_code; - - if ( char_code < cmap->first ) - char_code = cmap->first; - - for ( ; char_code < ( cmap->first + cmap->count ); char_code++ ) - { - result = cmap->indices[char_code]; - if ( result != 0 ) - goto Exit; - } - - char_code = 0; - - Exit: - *pchar_code = char_code; - return result; - } - - - FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec - t1_cmap_custom_class_rec = - { - sizeof ( T1_CMapCustomRec ), - - (FT_CMap_InitFunc) t1_cmap_custom_init, - (FT_CMap_DoneFunc) t1_cmap_custom_done, - (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index, - (FT_CMap_CharNextFunc) t1_cmap_custom_char_next, - - NULL, NULL, NULL, NULL, NULL - }; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_CALLBACK_DEF( const char * ) - t1_get_glyph_name( T1_Face face, - FT_UInt idx ) - { - return face->type1.glyph_names[idx]; - } - - - FT_CALLBACK_DEF( FT_Error ) - t1_cmap_unicode_init( PS_Unicodes unicodes ) - { - T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; - - - return psnames->unicodes_init( memory, - unicodes, - face->type1.num_glyphs, - (PS_GetGlyphNameFunc)&t1_get_glyph_name, - (PS_FreeGlyphNameFunc)NULL, - (FT_Pointer)face ); - } - - - FT_CALLBACK_DEF( void ) - t1_cmap_unicode_done( PS_Unicodes unicodes ) - { - FT_Face face = FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); - - - FT_FREE( unicodes->maps ); - unicodes->num_maps = 0; - } - - - FT_CALLBACK_DEF( FT_UInt ) - t1_cmap_unicode_char_index( PS_Unicodes unicodes, - FT_UInt32 char_code ) - { - T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; - - - return psnames->unicodes_char_index( unicodes, char_code ); - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - t1_cmap_unicode_char_next( PS_Unicodes unicodes, - FT_UInt32 *pchar_code ) - { - T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; - - - return psnames->unicodes_char_next( unicodes, pchar_code ); - } - - - FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec - t1_cmap_unicode_class_rec = - { - sizeof ( PS_UnicodesRec ), - - (FT_CMap_InitFunc) t1_cmap_unicode_init, - (FT_CMap_DoneFunc) t1_cmap_unicode_done, - (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index, - (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next, - - NULL, NULL, NULL, NULL, NULL - }; - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/t1cmap.h b/android/jni/ndk_modules/freetype/src/psaux/t1cmap.h deleted file mode 100644 index 7ae65d2f..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/t1cmap.h +++ /dev/null @@ -1,105 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1cmap.h */ -/* */ -/* Type 1 character map support (specification). */ -/* */ -/* Copyright 2002, 2003, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __T1CMAP_H__ -#define __T1CMAP_H__ - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_TYPE1_TYPES_H - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* standard (and expert) encoding cmaps */ - typedef struct T1_CMapStdRec_* T1_CMapStd; - - typedef struct T1_CMapStdRec_ - { - FT_CMapRec cmap; - - const FT_UShort* code_to_sid; - PS_Adobe_Std_StringsFunc sid_to_string; - - FT_UInt num_glyphs; - const char* const* glyph_names; - - } T1_CMapStdRec; - - - FT_CALLBACK_TABLE const FT_CMap_ClassRec - t1_cmap_standard_class_rec; - - FT_CALLBACK_TABLE const FT_CMap_ClassRec - t1_cmap_expert_class_rec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 CUSTOM ENCODING CMAP *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct T1_CMapCustomRec_* T1_CMapCustom; - - typedef struct T1_CMapCustomRec_ - { - FT_CMapRec cmap; - FT_UInt first; - FT_UInt count; - FT_UShort* indices; - - } T1_CMapCustomRec; - - - FT_CALLBACK_TABLE const FT_CMap_ClassRec - t1_cmap_custom_class_rec; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* unicode (synthetic) cmaps */ - - FT_CALLBACK_TABLE const FT_CMap_ClassRec - t1_cmap_unicode_class_rec; - - /* */ - - -FT_END_HEADER - -#endif /* __T1CMAP_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/t1decode.c b/android/jni/ndk_modules/freetype/src/psaux/t1decode.c deleted file mode 100644 index babf3ba1..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/t1decode.c +++ /dev/null @@ -1,1598 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1decode.c */ -/* */ -/* PostScript Type 1 decoding routines (body). */ -/* */ -/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H -#include FT_OUTLINE_H - -#include "t1decode.h" -#include "psobjs.h" - -#include "psauxerr.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_t1decode - - - typedef enum T1_Operator_ - { - op_none = 0, - op_endchar, - op_hsbw, - op_seac, - op_sbw, - op_closepath, - op_hlineto, - op_hmoveto, - op_hvcurveto, - op_rlineto, - op_rmoveto, - op_rrcurveto, - op_vhcurveto, - op_vlineto, - op_vmoveto, - op_dotsection, - op_hstem, - op_hstem3, - op_vstem, - op_vstem3, - op_div, - op_callothersubr, - op_callsubr, - op_pop, - op_return, - op_setcurrentpoint, - op_unknown15, - - op_max /* never remove this one */ - - } T1_Operator; - - - static - const FT_Int t1_args_count[op_max] = - { - 0, /* none */ - 0, /* endchar */ - 2, /* hsbw */ - 5, /* seac */ - 4, /* sbw */ - 0, /* closepath */ - 1, /* hlineto */ - 1, /* hmoveto */ - 4, /* hvcurveto */ - 2, /* rlineto */ - 2, /* rmoveto */ - 6, /* rrcurveto */ - 4, /* vhcurveto */ - 1, /* vlineto */ - 1, /* vmoveto */ - 0, /* dotsection */ - 2, /* hstem */ - 6, /* hstem3 */ - 2, /* vstem */ - 6, /* vstem3 */ - 2, /* div */ - -1, /* callothersubr */ - 1, /* callsubr */ - 0, /* pop */ - 0, /* return */ - 2, /* setcurrentpoint */ - 2 /* opcode 15 (undocumented and obsolete) */ - }; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* t1_lookup_glyph_by_stdcharcode */ - /* */ - /* <Description> */ - /* Looks up a given glyph by its StandardEncoding charcode. Used to */ - /* implement the SEAC Type 1 operator. */ - /* */ - /* <Input> */ - /* face :: The current face object. */ - /* */ - /* charcode :: The character code to look for. */ - /* */ - /* <Return> */ - /* A glyph index in the font face. Returns -1 if the corresponding */ - /* glyph wasn't found. */ - /* */ - static FT_Int - t1_lookup_glyph_by_stdcharcode( T1_Decoder decoder, - FT_Int charcode ) - { - FT_UInt n; - const FT_String* glyph_name; - FT_Service_PsCMaps psnames = decoder->psnames; - - - /* check range of standard char code */ - if ( charcode < 0 || charcode > 255 ) - return -1; - - glyph_name = psnames->adobe_std_strings( - psnames->adobe_std_encoding[charcode]); - - for ( n = 0; n < decoder->num_glyphs; n++ ) - { - FT_String* name = (FT_String*)decoder->glyph_names[n]; - - - if ( name && - name[0] == glyph_name[0] && - ft_strcmp( name, glyph_name ) == 0 ) - return n; - } - - return -1; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* t1operator_seac */ - /* */ - /* <Description> */ - /* Implements the `seac' Type 1 operator for a Type 1 decoder. */ - /* */ - /* <Input> */ - /* decoder :: The current CID decoder. */ - /* */ - /* asb :: The accent's side bearing. */ - /* */ - /* adx :: The horizontal offset of the accent. */ - /* */ - /* ady :: The vertical offset of the accent. */ - /* */ - /* bchar :: The base character's StandardEncoding charcode. */ - /* */ - /* achar :: The accent character's StandardEncoding charcode. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - t1operator_seac( T1_Decoder decoder, - FT_Pos asb, - FT_Pos adx, - FT_Pos ady, - FT_Int bchar, - FT_Int achar ) - { - FT_Error error; - FT_Int bchar_index, achar_index; -#if 0 - FT_Int n_base_points; - FT_Outline* base = decoder->builder.base; -#endif - FT_Vector left_bearing, advance; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - T1_Face face = (T1_Face)decoder->builder.face; -#endif - - - if ( decoder->seac ) - { - FT_ERROR(( "t1operator_seac: invalid nested seac\n" )); - return PSaux_Err_Syntax_Error; - } - - /* seac weirdness */ - adx += decoder->builder.left_bearing.x; - - /* `glyph_names' is set to 0 for CID fonts which do not */ - /* include an encoding. How can we deal with these? */ -#ifdef FT_CONFIG_OPTION_INCREMENTAL - if ( decoder->glyph_names == 0 && - !face->root.internal->incremental_interface ) -#else - if ( decoder->glyph_names == 0 ) -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - { - FT_ERROR(( "t1operator_seac:" - " glyph names table not available in this font\n" )); - return PSaux_Err_Syntax_Error; - } - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - if ( face->root.internal->incremental_interface ) - { - /* the caller must handle the font encoding also */ - bchar_index = bchar; - achar_index = achar; - } - else -#endif - { - bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar ); - achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar ); - } - - if ( bchar_index < 0 || achar_index < 0 ) - { - FT_ERROR(( "t1operator_seac:" - " invalid seac character code arguments\n" )); - return PSaux_Err_Syntax_Error; - } - - /* if we are trying to load a composite glyph, do not load the */ - /* accent character and return the array of subglyphs. */ - if ( decoder->builder.no_recurse ) - { - FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; - FT_GlyphLoader loader = glyph->internal->loader; - FT_SubGlyph subg; - - - /* reallocate subglyph array if necessary */ - error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); - if ( error ) - goto Exit; - - subg = loader->current.subglyphs; - - /* subglyph 0 = base character */ - subg->index = bchar_index; - subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | - FT_SUBGLYPH_FLAG_USE_MY_METRICS; - subg->arg1 = 0; - subg->arg2 = 0; - subg++; - - /* subglyph 1 = accent character */ - subg->index = achar_index; - subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; - subg->arg1 = (FT_Int)FIXED_TO_INT( adx - asb ); - subg->arg2 = (FT_Int)FIXED_TO_INT( ady ); - - /* set up remaining glyph fields */ - glyph->num_subglyphs = 2; - glyph->subglyphs = loader->base.subglyphs; - glyph->format = FT_GLYPH_FORMAT_COMPOSITE; - - loader->current.num_subglyphs = 2; - goto Exit; - } - - /* First load `bchar' in builder */ - /* now load the unscaled outline */ - - FT_GlyphLoader_Prepare( decoder->builder.loader ); /* prepare loader */ - - /* the seac operator must not be nested */ - decoder->seac = TRUE; - error = t1_decoder_parse_glyph( decoder, bchar_index ); - decoder->seac = FALSE; - if ( error ) - goto Exit; - - /* save the left bearing and width of the base character */ - /* as they will be erased by the next load. */ - - left_bearing = decoder->builder.left_bearing; - advance = decoder->builder.advance; - - decoder->builder.left_bearing.x = 0; - decoder->builder.left_bearing.y = 0; - - decoder->builder.pos_x = adx - asb; - decoder->builder.pos_y = ady; - - /* Now load `achar' on top of */ - /* the base outline */ - - /* the seac operator must not be nested */ - decoder->seac = TRUE; - error = t1_decoder_parse_glyph( decoder, achar_index ); - decoder->seac = FALSE; - if ( error ) - goto Exit; - - /* restore the left side bearing and */ - /* advance width of the base character */ - - decoder->builder.left_bearing = left_bearing; - decoder->builder.advance = advance; - - decoder->builder.pos_x = 0; - decoder->builder.pos_y = 0; - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* t1_decoder_parse_charstrings */ - /* */ - /* <Description> */ - /* Parses a given Type 1 charstrings program. */ - /* */ - /* <Input> */ - /* decoder :: The current Type 1 decoder. */ - /* */ - /* charstring_base :: The base address of the charstring stream. */ - /* */ - /* charstring_len :: The length in bytes of the charstring stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - t1_decoder_parse_charstrings( T1_Decoder decoder, - FT_Byte* charstring_base, - FT_UInt charstring_len ) - { - FT_Error error; - T1_Decoder_Zone zone; - FT_Byte* ip; - FT_Byte* limit; - T1_Builder builder = &decoder->builder; - FT_Pos x, y, orig_x, orig_y; - FT_Int known_othersubr_result_cnt = 0; - FT_Int unknown_othersubr_result_cnt = 0; - FT_Bool large_int; - FT_Fixed seed; - - T1_Hints_Funcs hinter; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_Bool bol = TRUE; -#endif - - - /* we don't want to touch the source code -- use macro trick */ -#define start_point t1_builder_start_point -#define check_points t1_builder_check_points -#define add_point t1_builder_add_point -#define add_point1 t1_builder_add_point1 -#define add_contour t1_builder_add_contour -#define close_contour t1_builder_close_contour - - - /* compute random seed from stack address of parameter */ - seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed ^ - (FT_PtrDist)(char*)&decoder ^ - (FT_PtrDist)(char*)&charstring_base ) & - FT_ULONG_MAX ) ; - seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; - if ( seed == 0 ) - seed = 0x7384; - - /* First of all, initialize the decoder */ - decoder->top = decoder->stack; - decoder->zone = decoder->zones; - zone = decoder->zones; - - builder->parse_state = T1_Parse_Start; - - hinter = (T1_Hints_Funcs)builder->hints_funcs; - - /* a font that reads BuildCharArray without setting */ - /* its values first is buggy, but ... */ - FT_ASSERT( ( decoder->len_buildchar == 0 ) == - ( decoder->buildchar == NULL ) ); - - if ( decoder->len_buildchar > 0 ) - ft_memset( &decoder->buildchar[0], - 0, - sizeof( decoder->buildchar[0] ) * decoder->len_buildchar ); - - FT_TRACE4(( "\n" - "Start charstring\n" )); - - zone->base = charstring_base; - limit = zone->limit = charstring_base + charstring_len; - ip = zone->cursor = zone->base; - - error = PSaux_Err_Ok; - - x = orig_x = builder->pos_x; - y = orig_y = builder->pos_y; - - /* begin hints recording session, if any */ - if ( hinter ) - hinter->open( hinter->hints ); - - large_int = FALSE; - - /* now, execute loop */ - while ( ip < limit ) - { - FT_Long* top = decoder->top; - T1_Operator op = op_none; - FT_Int32 value = 0; - - - FT_ASSERT( known_othersubr_result_cnt == 0 || - unknown_othersubr_result_cnt == 0 ); - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( bol ) - { - FT_TRACE5(( " (%d)", decoder->top - decoder->stack )); - bol = FALSE; - } -#endif - - /*********************************************************************/ - /* */ - /* Decode operator or operand */ - /* */ - /* */ - - /* first of all, decompress operator or value */ - switch ( *ip++ ) - { - case 1: - op = op_hstem; - break; - - case 3: - op = op_vstem; - break; - case 4: - op = op_vmoveto; - break; - case 5: - op = op_rlineto; - break; - case 6: - op = op_hlineto; - break; - case 7: - op = op_vlineto; - break; - case 8: - op = op_rrcurveto; - break; - case 9: - op = op_closepath; - break; - case 10: - op = op_callsubr; - break; - case 11: - op = op_return; - break; - - case 13: - op = op_hsbw; - break; - case 14: - op = op_endchar; - break; - - case 15: /* undocumented, obsolete operator */ - op = op_unknown15; - break; - - case 21: - op = op_rmoveto; - break; - case 22: - op = op_hmoveto; - break; - - case 30: - op = op_vhcurveto; - break; - case 31: - op = op_hvcurveto; - break; - - case 12: - if ( ip > limit ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " invalid escape (12+EOF)\n" )); - goto Syntax_Error; - } - - switch ( *ip++ ) - { - case 0: - op = op_dotsection; - break; - case 1: - op = op_vstem3; - break; - case 2: - op = op_hstem3; - break; - case 6: - op = op_seac; - break; - case 7: - op = op_sbw; - break; - case 12: - op = op_div; - break; - case 16: - op = op_callothersubr; - break; - case 17: - op = op_pop; - break; - case 33: - op = op_setcurrentpoint; - break; - - default: - FT_ERROR(( "t1_decoder_parse_charstrings:" - " invalid escape (12+%d)\n", - ip[-1] )); - goto Syntax_Error; - } - break; - - case 255: /* four bytes integer */ - if ( ip + 4 > limit ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unexpected EOF in integer\n" )); - goto Syntax_Error; - } - - value = (FT_Int32)( ( (FT_Long)ip[0] << 24 ) | - ( (FT_Long)ip[1] << 16 ) | - ( (FT_Long)ip[2] << 8 ) | - ip[3] ); - ip += 4; - - /* According to the specification, values > 32000 or < -32000 must */ - /* be followed by a `div' operator to make the result be in the */ - /* range [-32000;32000]. We expect that the second argument of */ - /* `div' is not a large number. Additionally, we don't handle */ - /* stuff like `<large1> <large2> <num> div <num> div' or */ - /* <large1> <large2> <num> div div'. This is probably not allowed */ - /* anyway. */ - if ( value > 32000 || value < -32000 ) - { - if ( large_int ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " no `div' after large integer\n" )); - } - else - large_int = TRUE; - } - else - { - if ( !large_int ) - value <<= 16; - } - - break; - - default: - if ( ip[-1] >= 32 ) - { - if ( ip[-1] < 247 ) - value = (FT_Int32)ip[-1] - 139; - else - { - if ( ++ip > limit ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unexpected EOF in integer\n" )); - goto Syntax_Error; - } - - if ( ip[-2] < 251 ) - value = ( ( (FT_Int32)ip[-2] - 247 ) << 8 ) + ip[-1] + 108; - else - value = -( ( ( (FT_Int32)ip[-2] - 251 ) << 8 ) + ip[-1] + 108 ); - } - - if ( !large_int ) - value <<= 16; - } - else - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " invalid byte (%d)\n", ip[-1] )); - goto Syntax_Error; - } - } - - if ( unknown_othersubr_result_cnt > 0 ) - { - switch ( op ) - { - case op_callsubr: - case op_return: - case op_none: - case op_pop: - break; - - default: - /* all operands have been transferred by previous pops */ - unknown_othersubr_result_cnt = 0; - break; - } - } - - if ( large_int && !( op == op_none || op == op_div ) ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " no `div' after large integer\n" )); - - large_int = FALSE; - } - - /*********************************************************************/ - /* */ - /* Push value on stack, or process operator */ - /* */ - /* */ - if ( op == op_none ) - { - if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS ) - { - FT_ERROR(( "t1_decoder_parse_charstrings: stack overflow\n" )); - goto Syntax_Error; - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( large_int ) - FT_TRACE4(( " %ld", value )); - else - FT_TRACE4(( " %ld", (FT_Int32)( value >> 16 ) )); -#endif - - *top++ = value; - decoder->top = top; - } - else if ( op == op_callothersubr ) /* callothersubr */ - { - FT_Int subr_no; - FT_Int arg_cnt; - - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( " callothersubr\n" )); - bol = TRUE; -#endif - - if ( top - decoder->stack < 2 ) - goto Stack_Underflow; - - top -= 2; - - subr_no = (FT_Int)( top[1] >> 16 ); - arg_cnt = (FT_Int)( top[0] >> 16 ); - - /***********************************************************/ - /* */ - /* remove all operands to callothersubr from the stack */ - /* */ - /* for handled othersubrs, where we know the number of */ - /* arguments, we increase the stack by the value of */ - /* known_othersubr_result_cnt */ - /* */ - /* for unhandled othersubrs the following pops adjust the */ - /* stack pointer as necessary */ - - if ( arg_cnt > top - decoder->stack ) - goto Stack_Underflow; - - top -= arg_cnt; - - known_othersubr_result_cnt = 0; - unknown_othersubr_result_cnt = 0; - - /* XXX TODO: The checks to `arg_count == <whatever>' */ - /* might not be correct; an othersubr expects a certain */ - /* number of operands on the PostScript stack (as opposed */ - /* to the T1 stack) but it doesn't have to put them there */ - /* by itself; previous othersubrs might have left the */ - /* operands there if they were not followed by an */ - /* appropriate number of pops */ - /* */ - /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */ - /* accept a font that contains charstrings like */ - /* */ - /* 100 200 2 20 callothersubr */ - /* 300 1 20 callothersubr pop */ - /* */ - /* Perhaps this is the reason why BuildCharArray exists. */ - - switch ( subr_no ) - { - case 1: /* start flex feature */ - if ( arg_cnt != 0 ) - goto Unexpected_OtherSubr; - - decoder->flex_state = 1; - decoder->num_flex_vectors = 0; - if ( start_point( builder, x, y ) || - check_points( builder, 6 ) ) - goto Fail; - break; - - case 2: /* add flex vectors */ - { - FT_Int idx; - - - if ( arg_cnt != 0 ) - goto Unexpected_OtherSubr; - - /* note that we should not add a point for index 0; */ - /* this will move our current position to the flex */ - /* point without adding any point to the outline */ - idx = decoder->num_flex_vectors++; - if ( idx > 0 && idx < 7 ) - add_point( builder, - x, - y, - (FT_Byte)( idx == 3 || idx == 6 ) ); - } - break; - - case 0: /* end flex feature */ - if ( arg_cnt != 3 ) - goto Unexpected_OtherSubr; - - if ( decoder->flex_state == 0 || - decoder->num_flex_vectors != 7 ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unexpected flex end\n" )); - goto Syntax_Error; - } - - /* the two `results' are popped by the following setcurrentpoint */ - top[0] = x; - top[1] = y; - known_othersubr_result_cnt = 2; - break; - - case 3: /* change hints */ - if ( arg_cnt != 1 ) - goto Unexpected_OtherSubr; - - known_othersubr_result_cnt = 1; - - if ( hinter ) - hinter->reset( hinter->hints, builder->current->n_points ); - break; - - case 12: - case 13: - /* counter control hints, clear stack */ - top = decoder->stack; - break; - - case 14: - case 15: - case 16: - case 17: - case 18: /* multiple masters */ - { - PS_Blend blend = decoder->blend; - FT_UInt num_points, nn, mm; - FT_Long* delta; - FT_Long* values; - - - if ( !blend ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unexpected multiple masters operator\n" )); - goto Syntax_Error; - } - - num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 ); - if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " incorrect number of multiple masters arguments\n" )); - goto Syntax_Error; - } - - /* we want to compute: */ - /* */ - /* a0*w0 + a1*w1 + ... + ak*wk */ - /* */ - /* but we only have the a0, a1-a0, a2-a0, .. ak-a0 */ - /* however, given that w0 + w1 + ... + wk == 1, we can */ - /* rewrite it easily as: */ - /* */ - /* a0 + (a1-a0)*w1 + (a2-a0)*w2 + .. + (ak-a0)*wk */ - /* */ - /* where k == num_designs-1 */ - /* */ - /* I guess that's why it's written in this `compact' */ - /* form. */ - /* */ - delta = top + num_points; - values = top; - for ( nn = 0; nn < num_points; nn++ ) - { - FT_Long tmp = values[0]; - - - for ( mm = 1; mm < blend->num_designs; mm++ ) - tmp += FT_MulFix( *delta++, blend->weight_vector[mm] ); - - *values++ = tmp; - } - - known_othersubr_result_cnt = num_points; - break; - } - - case 19: - /* <idx> 1 19 callothersubr */ - /* => replace elements starting from index cvi( <idx> ) */ - /* of BuildCharArray with WeightVector */ - { - FT_Int idx; - PS_Blend blend = decoder->blend; - - - if ( arg_cnt != 1 || blend == NULL ) - goto Unexpected_OtherSubr; - - idx = (FT_Int)( top[0] >> 16 ); - - if ( idx < 0 || - idx + blend->num_designs > decoder->len_buildchar ) - goto Unexpected_OtherSubr; - - ft_memcpy( &decoder->buildchar[idx], - blend->weight_vector, - blend->num_designs * - sizeof( blend->weight_vector[0] ) ); - } - break; - - case 20: - /* <arg1> <arg2> 2 20 callothersubr pop */ - /* ==> push <arg1> + <arg2> onto T1 stack */ - if ( arg_cnt != 2 ) - goto Unexpected_OtherSubr; - - top[0] += top[1]; /* XXX (over|under)flow */ - - known_othersubr_result_cnt = 1; - break; - - case 21: - /* <arg1> <arg2> 2 21 callothersubr pop */ - /* ==> push <arg1> - <arg2> onto T1 stack */ - if ( arg_cnt != 2 ) - goto Unexpected_OtherSubr; - - top[0] -= top[1]; /* XXX (over|under)flow */ - - known_othersubr_result_cnt = 1; - break; - - case 22: - /* <arg1> <arg2> 2 22 callothersubr pop */ - /* ==> push <arg1> * <arg2> onto T1 stack */ - if ( arg_cnt != 2 ) - goto Unexpected_OtherSubr; - - top[0] = FT_MulFix( top[0], top[1] ); - - known_othersubr_result_cnt = 1; - break; - - case 23: - /* <arg1> <arg2> 2 23 callothersubr pop */ - /* ==> push <arg1> / <arg2> onto T1 stack */ - if ( arg_cnt != 2 || top[1] == 0 ) - goto Unexpected_OtherSubr; - - top[0] = FT_DivFix( top[0], top[1] ); - - known_othersubr_result_cnt = 1; - break; - - case 24: - /* <val> <idx> 2 24 callothersubr */ - /* ==> set BuildCharArray[cvi( <idx> )] = <val> */ - { - FT_Int idx; - PS_Blend blend = decoder->blend; - - - if ( arg_cnt != 2 || blend == NULL ) - goto Unexpected_OtherSubr; - - idx = (FT_Int)( top[1] >> 16 ); - - if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) - goto Unexpected_OtherSubr; - - decoder->buildchar[idx] = top[0]; - } - break; - - case 25: - /* <idx> 1 25 callothersubr pop */ - /* ==> push BuildCharArray[cvi( idx )] */ - /* onto T1 stack */ - { - FT_Int idx; - PS_Blend blend = decoder->blend; - - - if ( arg_cnt != 1 || blend == NULL ) - goto Unexpected_OtherSubr; - - idx = (FT_Int)( top[0] >> 16 ); - - if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) - goto Unexpected_OtherSubr; - - top[0] = decoder->buildchar[idx]; - } - - known_othersubr_result_cnt = 1; - break; - -#if 0 - case 26: - /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */ - /* leave mark on T1 stack */ - /* <val> <idx> ==> set BuildCharArray[cvi( <idx> )] = <val> */ - XXX which routine has left its mark on the (PostScript) stack?; - break; -#endif - - case 27: - /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */ - /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */ - /* otherwise push <res2> */ - if ( arg_cnt != 4 ) - goto Unexpected_OtherSubr; - - if ( top[2] > top[3] ) - top[0] = top[1]; - - known_othersubr_result_cnt = 1; - break; - - case 28: - /* 0 28 callothersubr pop */ - /* => push random value from interval [0, 1) onto stack */ - if ( arg_cnt != 0 ) - goto Unexpected_OtherSubr; - - { - FT_Fixed Rand; - - - Rand = seed; - if ( Rand >= 0x8000L ) - Rand++; - - top[0] = Rand; - - seed = FT_MulFix( seed, 0x10000L - seed ); - if ( seed == 0 ) - seed += 0x2873; - } - - known_othersubr_result_cnt = 1; - break; - - default: - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unknown othersubr [%d %d], wish me luck\n", - arg_cnt, subr_no )); - unknown_othersubr_result_cnt = arg_cnt; - break; - - Unexpected_OtherSubr: - FT_ERROR(( "t1_decoder_parse_charstrings:" - " invalid othersubr [%d %d]\n", arg_cnt, subr_no )); - goto Syntax_Error; - } - - top += known_othersubr_result_cnt; - - decoder->top = top; - } - else /* general operator */ - { - FT_Int num_args = t1_args_count[op]; - - - FT_ASSERT( num_args >= 0 ); - - if ( top - decoder->stack < num_args ) - goto Stack_Underflow; - - /* XXX Operators usually take their operands from the */ - /* bottom of the stack, i.e., the operands are */ - /* decoder->stack[0], ..., decoder->stack[num_args - 1]; */ - /* only div, callsubr, and callothersubr are different. */ - /* In practice it doesn't matter (?). */ - -#ifdef FT_DEBUG_LEVEL_TRACE - - switch ( op ) - { - case op_callsubr: - case op_div: - case op_callothersubr: - case op_pop: - case op_return: - break; - - default: - if ( top - decoder->stack != num_args ) - FT_TRACE0(( "t1_decoder_parse_charstrings:" - " too much operands on the stack" - " (seen %d, expected %d)\n", - top - decoder->stack, num_args )); - break; - } - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - top -= num_args; - - switch ( op ) - { - case op_endchar: - FT_TRACE4(( " endchar\n" )); - - close_contour( builder ); - - /* close hints recording session */ - if ( hinter ) - { - if ( hinter->close( hinter->hints, builder->current->n_points ) ) - goto Syntax_Error; - - /* apply hints to the loaded glyph outline now */ - hinter->apply( hinter->hints, - builder->current, - (PSH_Globals)builder->hints_globals, - decoder->hint_mode ); - } - - /* add current outline to the glyph slot */ - FT_GlyphLoader_Add( builder->loader ); - - /* the compiler should optimize away this empty loop but ... */ - -#ifdef FT_DEBUG_LEVEL_TRACE - - if ( decoder->len_buildchar > 0 ) - { - FT_UInt i; - - - FT_TRACE4(( "BuildCharArray = [ " )); - - for ( i = 0; i < decoder->len_buildchar; ++i ) - FT_TRACE4(( "%d ", decoder->buildchar[ i ] )); - - FT_TRACE4(( "]\n" )); - } - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - FT_TRACE4(( "\n" )); - - /* return now! */ - return PSaux_Err_Ok; - - case op_hsbw: - FT_TRACE4(( " hsbw" )); - - builder->parse_state = T1_Parse_Have_Width; - - builder->left_bearing.x += top[0]; - builder->advance.x = top[1]; - builder->advance.y = 0; - - orig_x = x = builder->pos_x + top[0]; - orig_y = y = builder->pos_y; - - FT_UNUSED( orig_y ); - - /* the `metrics_only' indicates that we only want to compute */ - /* the glyph's metrics (lsb + advance width), not load the */ - /* rest of it; so exit immediately */ - if ( builder->metrics_only ) - return PSaux_Err_Ok; - - break; - - case op_seac: - return t1operator_seac( decoder, - top[0], - top[1], - top[2], - (FT_Int)( top[3] >> 16 ), - (FT_Int)( top[4] >> 16 ) ); - - case op_sbw: - FT_TRACE4(( " sbw" )); - - builder->parse_state = T1_Parse_Have_Width; - - builder->left_bearing.x += top[0]; - builder->left_bearing.y += top[1]; - builder->advance.x = top[2]; - builder->advance.y = top[3]; - - x = builder->pos_x + top[0]; - y = builder->pos_y + top[1]; - - /* the `metrics_only' indicates that we only want to compute */ - /* the glyph's metrics (lsb + advance width), not load the */ - /* rest of it; so exit immediately */ - if ( builder->metrics_only ) - return PSaux_Err_Ok; - - break; - - case op_closepath: - FT_TRACE4(( " closepath" )); - - /* if there is no path, `closepath' is a no-op */ - if ( builder->parse_state == T1_Parse_Have_Path || - builder->parse_state == T1_Parse_Have_Moveto ) - close_contour( builder ); - - builder->parse_state = T1_Parse_Have_Width; - break; - - case op_hlineto: - FT_TRACE4(( " hlineto" )); - - if ( start_point( builder, x, y ) ) - goto Fail; - - x += top[0]; - goto Add_Line; - - case op_hmoveto: - FT_TRACE4(( " hmoveto" )); - - x += top[0]; - if ( !decoder->flex_state ) - { - if ( builder->parse_state == T1_Parse_Start ) - goto Syntax_Error; - builder->parse_state = T1_Parse_Have_Moveto; - } - break; - - case op_hvcurveto: - FT_TRACE4(( " hvcurveto" )); - - if ( start_point( builder, x, y ) || - check_points( builder, 3 ) ) - goto Fail; - - x += top[0]; - add_point( builder, x, y, 0 ); - x += top[1]; - y += top[2]; - add_point( builder, x, y, 0 ); - y += top[3]; - add_point( builder, x, y, 1 ); - break; - - case op_rlineto: - FT_TRACE4(( " rlineto" )); - - if ( start_point( builder, x, y ) ) - goto Fail; - - x += top[0]; - y += top[1]; - - Add_Line: - if ( add_point1( builder, x, y ) ) - goto Fail; - break; - - case op_rmoveto: - FT_TRACE4(( " rmoveto" )); - - x += top[0]; - y += top[1]; - if ( !decoder->flex_state ) - { - if ( builder->parse_state == T1_Parse_Start ) - goto Syntax_Error; - builder->parse_state = T1_Parse_Have_Moveto; - } - break; - - case op_rrcurveto: - FT_TRACE4(( " rrcurveto" )); - - if ( start_point( builder, x, y ) || - check_points( builder, 3 ) ) - goto Fail; - - x += top[0]; - y += top[1]; - add_point( builder, x, y, 0 ); - - x += top[2]; - y += top[3]; - add_point( builder, x, y, 0 ); - - x += top[4]; - y += top[5]; - add_point( builder, x, y, 1 ); - break; - - case op_vhcurveto: - FT_TRACE4(( " vhcurveto" )); - - if ( start_point( builder, x, y ) || - check_points( builder, 3 ) ) - goto Fail; - - y += top[0]; - add_point( builder, x, y, 0 ); - x += top[1]; - y += top[2]; - add_point( builder, x, y, 0 ); - x += top[3]; - add_point( builder, x, y, 1 ); - break; - - case op_vlineto: - FT_TRACE4(( " vlineto" )); - - if ( start_point( builder, x, y ) ) - goto Fail; - - y += top[0]; - goto Add_Line; - - case op_vmoveto: - FT_TRACE4(( " vmoveto" )); - - y += top[0]; - if ( !decoder->flex_state ) - { - if ( builder->parse_state == T1_Parse_Start ) - goto Syntax_Error; - builder->parse_state = T1_Parse_Have_Moveto; - } - break; - - case op_div: - FT_TRACE4(( " div" )); - - /* if `large_int' is set, we divide unscaled numbers; */ - /* otherwise, we divide numbers in 16.16 format -- */ - /* in both cases, it is the same operation */ - *top = FT_DivFix( top[0], top[1] ); - ++top; - - large_int = FALSE; - break; - - case op_callsubr: - { - FT_Int idx; - - - FT_TRACE4(( " callsubr" )); - - idx = (FT_Int)( top[0] >> 16 ); - if ( idx < 0 || idx >= (FT_Int)decoder->num_subrs ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " invalid subrs index\n" )); - goto Syntax_Error; - } - - if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " too many nested subrs\n" )); - goto Syntax_Error; - } - - zone->cursor = ip; /* save current instruction pointer */ - - zone++; - - /* The Type 1 driver stores subroutines without the seed bytes. */ - /* The CID driver stores subroutines with seed bytes. This */ - /* case is taken care of when decoder->subrs_len == 0. */ - zone->base = decoder->subrs[idx]; - - if ( decoder->subrs_len ) - zone->limit = zone->base + decoder->subrs_len[idx]; - else - { - /* We are using subroutines from a CID font. We must adjust */ - /* for the seed bytes. */ - zone->base += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); - zone->limit = decoder->subrs[idx + 1]; - } - - zone->cursor = zone->base; - - if ( !zone->base ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " invoking empty subrs\n" )); - goto Syntax_Error; - } - - decoder->zone = zone; - ip = zone->base; - limit = zone->limit; - break; - } - - case op_pop: - FT_TRACE4(( " pop" )); - - if ( known_othersubr_result_cnt > 0 ) - { - known_othersubr_result_cnt--; - /* ignore, we pushed the operands ourselves */ - break; - } - - if ( unknown_othersubr_result_cnt == 0 ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " no more operands for othersubr\n" )); - goto Syntax_Error; - } - - unknown_othersubr_result_cnt--; - top++; /* `push' the operand to callothersubr onto the stack */ - break; - - case op_return: - FT_TRACE4(( " return" )); - - if ( zone <= decoder->zones ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unexpected return\n" )); - goto Syntax_Error; - } - - zone--; - ip = zone->cursor; - limit = zone->limit; - decoder->zone = zone; - break; - - case op_dotsection: - FT_TRACE4(( " dotsection" )); - - break; - - case op_hstem: - FT_TRACE4(( " hstem" )); - - /* record horizontal hint */ - if ( hinter ) - { - /* top[0] += builder->left_bearing.y; */ - hinter->stem( hinter->hints, 1, top ); - } - break; - - case op_hstem3: - FT_TRACE4(( " hstem3" )); - - /* record horizontal counter-controlled hints */ - if ( hinter ) - hinter->stem3( hinter->hints, 1, top ); - break; - - case op_vstem: - FT_TRACE4(( " vstem" )); - - /* record vertical hint */ - if ( hinter ) - { - top[0] += orig_x; - hinter->stem( hinter->hints, 0, top ); - } - break; - - case op_vstem3: - FT_TRACE4(( " vstem3" )); - - /* record vertical counter-controlled hints */ - if ( hinter ) - { - FT_Pos dx = orig_x; - - - top[0] += dx; - top[2] += dx; - top[4] += dx; - hinter->stem3( hinter->hints, 0, top ); - } - break; - - case op_setcurrentpoint: - FT_TRACE4(( " setcurrentpoint" )); - - /* From the T1 specification, section 6.4: */ - /* */ - /* The setcurrentpoint command is used only in */ - /* conjunction with results from OtherSubrs procedures. */ - - /* known_othersubr_result_cnt != 0 is already handled */ - /* above. */ - - /* Note, however, that both Ghostscript and Adobe */ - /* Distiller handle this situation by silently ignoring */ - /* the inappropriate `setcurrentpoint' instruction. So */ - /* we do the same. */ -#if 0 - - if ( decoder->flex_state != 1 ) - { - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unexpected `setcurrentpoint'\n" )); - goto Syntax_Error; - } - else - ... -#endif - - x = top[0]; - y = top[1]; - decoder->flex_state = 0; - break; - - case op_unknown15: - FT_TRACE4(( " opcode_15" )); - /* nothing to do except to pop the two arguments */ - break; - - default: - FT_ERROR(( "t1_decoder_parse_charstrings:" - " unhandled opcode %d\n", op )); - goto Syntax_Error; - } - - /* XXX Operators usually clear the operand stack; */ - /* only div, callsubr, callothersubr, pop, and */ - /* return are different. */ - /* In practice it doesn't matter (?). */ - - decoder->top = top; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( "\n" )); - bol = TRUE; -#endif - - } /* general operator processing */ - - } /* while ip < limit */ - - FT_TRACE4(( "..end..\n\n" )); - - Fail: - return error; - - Syntax_Error: - return PSaux_Err_Syntax_Error; - - Stack_Underflow: - return PSaux_Err_Stack_Underflow; - } - - - /* parse a single Type 1 glyph */ - FT_LOCAL_DEF( FT_Error ) - t1_decoder_parse_glyph( T1_Decoder decoder, - FT_UInt glyph ) - { - return decoder->parse_callback( decoder, glyph ); - } - - - /* initialize T1 decoder */ - FT_LOCAL_DEF( FT_Error ) - t1_decoder_init( T1_Decoder decoder, - FT_Face face, - FT_Size size, - FT_GlyphSlot slot, - FT_Byte** glyph_names, - PS_Blend blend, - FT_Bool hinting, - FT_Render_Mode hint_mode, - T1_Decoder_Callback parse_callback ) - { - FT_MEM_ZERO( decoder, sizeof ( *decoder ) ); - - /* retrieve PSNames interface from list of current modules */ - { - FT_Service_PsCMaps psnames = 0; - - - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); - if ( !psnames ) - { - FT_ERROR(( "t1_decoder_init:" - " the `psnames' module is not available\n" )); - return PSaux_Err_Unimplemented_Feature; - } - - decoder->psnames = psnames; - } - - t1_builder_init( &decoder->builder, face, size, slot, hinting ); - - /* decoder->buildchar and decoder->len_buildchar have to be */ - /* initialized by the caller since we cannot know the length */ - /* of the BuildCharArray */ - - decoder->num_glyphs = (FT_UInt)face->num_glyphs; - decoder->glyph_names = glyph_names; - decoder->hint_mode = hint_mode; - decoder->blend = blend; - decoder->parse_callback = parse_callback; - - decoder->funcs = t1_decoder_funcs; - - return PSaux_Err_Ok; - } - - - /* finalize T1 decoder */ - FT_LOCAL_DEF( void ) - t1_decoder_done( T1_Decoder decoder ) - { - t1_builder_done( &decoder->builder ); - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psaux/t1decode.h b/android/jni/ndk_modules/freetype/src/psaux/t1decode.h deleted file mode 100644 index 00728db5..00000000 --- a/android/jni/ndk_modules/freetype/src/psaux/t1decode.h +++ /dev/null @@ -1,64 +0,0 @@ -/***************************************************************************/ -/* */ -/* t1decode.h */ -/* */ -/* PostScript Type 1 decoding routines (specification). */ -/* */ -/* Copyright 2000-2001, 2002, 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __T1DECODE_H__ -#define __T1DECODE_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_TYPE1_TYPES_H - - -FT_BEGIN_HEADER - - - FT_CALLBACK_TABLE - const T1_Decoder_FuncsRec t1_decoder_funcs; - - - FT_LOCAL( FT_Error ) - t1_decoder_parse_glyph( T1_Decoder decoder, - FT_UInt glyph_index ); - - FT_LOCAL( FT_Error ) - t1_decoder_parse_charstrings( T1_Decoder decoder, - FT_Byte* base, - FT_UInt len ); - - FT_LOCAL( FT_Error ) - t1_decoder_init( T1_Decoder decoder, - FT_Face face, - FT_Size size, - FT_GlyphSlot slot, - FT_Byte** glyph_names, - PS_Blend blend, - FT_Bool hinting, - FT_Render_Mode hint_mode, - T1_Decoder_Callback parse_glyph ); - - FT_LOCAL( void ) - t1_decoder_done( T1_Decoder decoder ); - - -FT_END_HEADER - -#endif /* __T1DECODE_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshalgo.c b/android/jni/ndk_modules/freetype/src/pshinter/pshalgo.c deleted file mode 100644 index 4b087859..00000000 --- a/android/jni/ndk_modules/freetype/src/pshinter/pshalgo.c +++ /dev/null @@ -1,2308 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshalgo.c */ -/* */ -/* PostScript hinting algorithm (body). */ -/* */ -/* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 */ -/* by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include "pshalgo.h" - -#include "pshnterr.h" - - -#undef FT_COMPONENT -#define FT_COMPONENT trace_pshalgo2 - - -#ifdef DEBUG_HINTER - PSH_Hint_Table ps_debug_hint_table = 0; - PSH_HintFunc ps_debug_hint_func = 0; - PSH_Glyph ps_debug_glyph = 0; -#endif - - -#define COMPUTE_INFLEXS /* compute inflection points to optimize `S' */ - /* and similar glyphs */ -#define STRONGER /* slightly increase the contrast of smooth */ - /* hinting */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** BASIC HINTS RECORDINGS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* return true if two stem hints overlap */ - static FT_Int - psh_hint_overlap( PSH_Hint hint1, - PSH_Hint hint2 ) - { - return hint1->org_pos + hint1->org_len >= hint2->org_pos && - hint2->org_pos + hint2->org_len >= hint1->org_pos; - } - - - /* destroy hints table */ - static void - psh_hint_table_done( PSH_Hint_Table table, - FT_Memory memory ) - { - FT_FREE( table->zones ); - table->num_zones = 0; - table->zone = 0; - - FT_FREE( table->sort ); - FT_FREE( table->hints ); - table->num_hints = 0; - table->max_hints = 0; - table->sort_global = 0; - } - - - /* deactivate all hints in a table */ - static void - psh_hint_table_deactivate( PSH_Hint_Table table ) - { - FT_UInt count = table->max_hints; - PSH_Hint hint = table->hints; - - - for ( ; count > 0; count--, hint++ ) - { - psh_hint_deactivate( hint ); - hint->order = -1; - } - } - - - /* internal function to record a new hint */ - static void - psh_hint_table_record( PSH_Hint_Table table, - FT_UInt idx ) - { - PSH_Hint hint = table->hints + idx; - - - if ( idx >= table->max_hints ) - { - FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx )); - return; - } - - /* ignore active hints */ - if ( psh_hint_is_active( hint ) ) - return; - - psh_hint_activate( hint ); - - /* now scan the current active hint set to check */ - /* whether `hint' overlaps with another hint */ - { - PSH_Hint* sorted = table->sort_global; - FT_UInt count = table->num_hints; - PSH_Hint hint2; - - - hint->parent = 0; - for ( ; count > 0; count--, sorted++ ) - { - hint2 = sorted[0]; - - if ( psh_hint_overlap( hint, hint2 ) ) - { - hint->parent = hint2; - break; - } - } - } - - if ( table->num_hints < table->max_hints ) - table->sort_global[table->num_hints++] = hint; - else - FT_TRACE0(( "psh_hint_table_record: too many sorted hints! BUG!\n" )); - } - - - static void - psh_hint_table_record_mask( PSH_Hint_Table table, - PS_Mask hint_mask ) - { - FT_Int mask = 0, val = 0; - FT_Byte* cursor = hint_mask->bytes; - FT_UInt idx, limit; - - - limit = hint_mask->num_bits; - - for ( idx = 0; idx < limit; idx++ ) - { - if ( mask == 0 ) - { - val = *cursor++; - mask = 0x80; - } - - if ( val & mask ) - psh_hint_table_record( table, idx ); - - mask >>= 1; - } - } - - - /* create hints table */ - static FT_Error - psh_hint_table_init( PSH_Hint_Table table, - PS_Hint_Table hints, - PS_Mask_Table hint_masks, - PS_Mask_Table counter_masks, - FT_Memory memory ) - { - FT_UInt count; - FT_Error error; - - FT_UNUSED( counter_masks ); - - - count = hints->num_hints; - - /* allocate our tables */ - if ( FT_NEW_ARRAY( table->sort, 2 * count ) || - FT_NEW_ARRAY( table->hints, count ) || - FT_NEW_ARRAY( table->zones, 2 * count + 1 ) ) - goto Exit; - - table->max_hints = count; - table->sort_global = table->sort + count; - table->num_hints = 0; - table->num_zones = 0; - table->zone = 0; - - /* initialize the `table->hints' array */ - { - PSH_Hint write = table->hints; - PS_Hint read = hints->hints; - - - for ( ; count > 0; count--, write++, read++ ) - { - write->org_pos = read->pos; - write->org_len = read->len; - write->flags = read->flags; - } - } - - /* we now need to determine the initial `parent' stems; first */ - /* activate the hints that are given by the initial hint masks */ - if ( hint_masks ) - { - PS_Mask mask = hint_masks->masks; - - - count = hint_masks->num_masks; - table->hint_masks = hint_masks; - - for ( ; count > 0; count--, mask++ ) - psh_hint_table_record_mask( table, mask ); - } - - /* finally, do a linear parse in case some hints were left alone */ - if ( table->num_hints != table->max_hints ) - { - FT_UInt idx; - - - FT_TRACE0(( "psh_hint_table_init: missing/incorrect hint masks\n" )); - - count = table->max_hints; - for ( idx = 0; idx < count; idx++ ) - psh_hint_table_record( table, idx ); - } - - Exit: - return error; - } - - - static void - psh_hint_table_activate_mask( PSH_Hint_Table table, - PS_Mask hint_mask ) - { - FT_Int mask = 0, val = 0; - FT_Byte* cursor = hint_mask->bytes; - FT_UInt idx, limit, count; - - - limit = hint_mask->num_bits; - count = 0; - - psh_hint_table_deactivate( table ); - - for ( idx = 0; idx < limit; idx++ ) - { - if ( mask == 0 ) - { - val = *cursor++; - mask = 0x80; - } - - if ( val & mask ) - { - PSH_Hint hint = &table->hints[idx]; - - - if ( !psh_hint_is_active( hint ) ) - { - FT_UInt count2; - -#if 0 - PSH_Hint* sort = table->sort; - PSH_Hint hint2; - - - for ( count2 = count; count2 > 0; count2--, sort++ ) - { - hint2 = sort[0]; - if ( psh_hint_overlap( hint, hint2 ) ) - FT_TRACE0(( "psh_hint_table_activate_mask:" - " found overlapping hints\n" )) - } -#else - count2 = 0; -#endif - - if ( count2 == 0 ) - { - psh_hint_activate( hint ); - if ( count < table->max_hints ) - table->sort[count++] = hint; - else - FT_TRACE0(( "psh_hint_tableactivate_mask:" - " too many active hints\n" )); - } - } - } - - mask >>= 1; - } - table->num_hints = count; - - /* now, sort the hints; they are guaranteed to not overlap */ - /* so we can compare their "org_pos" field directly */ - { - FT_Int i1, i2; - PSH_Hint hint1, hint2; - PSH_Hint* sort = table->sort; - - - /* a simple bubble sort will do, since in 99% of cases, the hints */ - /* will be already sorted -- and the sort will be linear */ - for ( i1 = 1; i1 < (FT_Int)count; i1++ ) - { - hint1 = sort[i1]; - for ( i2 = i1 - 1; i2 >= 0; i2-- ) - { - hint2 = sort[i2]; - - if ( hint2->org_pos < hint1->org_pos ) - break; - - sort[i2 + 1] = hint2; - sort[i2] = hint1; - } - } - } - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** HINTS GRID-FITTING AND OPTIMIZATION *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#if 1 - static FT_Pos - psh_dimension_quantize_len( PSH_Dimension dim, - FT_Pos len, - FT_Bool do_snapping ) - { - if ( len <= 64 ) - len = 64; - else - { - FT_Pos delta = len - dim->stdw.widths[0].cur; - - - if ( delta < 0 ) - delta = -delta; - - if ( delta < 40 ) - { - len = dim->stdw.widths[0].cur; - if ( len < 48 ) - len = 48; - } - - if ( len < 3 * 64 ) - { - delta = ( len & 63 ); - len &= -64; - - if ( delta < 10 ) - len += delta; - - else if ( delta < 32 ) - len += 10; - - else if ( delta < 54 ) - len += 54; - - else - len += delta; - } - else - len = FT_PIX_ROUND( len ); - } - - if ( do_snapping ) - len = FT_PIX_ROUND( len ); - - return len; - } -#endif /* 0 */ - - -#ifdef DEBUG_HINTER - - static void - ps_simple_scale( PSH_Hint_Table table, - FT_Fixed scale, - FT_Fixed delta, - FT_Int dimension ) - { - PSH_Hint hint; - FT_UInt count; - - - for ( count = 0; count < table->max_hints; count++ ) - { - hint = table->hints + count; - - hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta; - hint->cur_len = FT_MulFix( hint->org_len, scale ); - - if ( ps_debug_hint_func ) - ps_debug_hint_func( hint, dimension ); - } - } - -#endif /* DEBUG_HINTER */ - - - static FT_Fixed - psh_hint_snap_stem_side_delta( FT_Fixed pos, - FT_Fixed len ) - { - FT_Fixed delta1 = FT_PIX_ROUND( pos ) - pos; - FT_Fixed delta2 = FT_PIX_ROUND( pos + len ) - pos - len; - - - if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) ) - return delta1; - else - return delta2; - } - - - static void - psh_hint_align( PSH_Hint hint, - PSH_Globals globals, - FT_Int dimension, - PSH_Glyph glyph ) - { - PSH_Dimension dim = &globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - FT_Fixed delta = dim->scale_delta; - - - if ( !psh_hint_is_fitted( hint ) ) - { - FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; - FT_Pos len = FT_MulFix( hint->org_len, scale ); - - FT_Int do_snapping; - FT_Pos fit_len; - PSH_AlignmentRec align; - - - /* ignore stem alignments when requested through the hint flags */ - if ( ( dimension == 0 && !glyph->do_horz_hints ) || - ( dimension == 1 && !glyph->do_vert_hints ) ) - { - hint->cur_pos = pos; - hint->cur_len = len; - - psh_hint_set_fitted( hint ); - return; - } - - /* perform stem snapping when requested - this is necessary - * for monochrome and LCD hinting modes only - */ - do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) || - ( dimension == 1 && glyph->do_vert_snapping ); - - hint->cur_len = fit_len = len; - - /* check blue zones for horizontal stems */ - align.align = PSH_BLUE_ALIGN_NONE; - align.align_bot = align.align_top = 0; - - if ( dimension == 1 ) - psh_blues_snap_stem( &globals->blues, - hint->org_pos + hint->org_len, - hint->org_pos, - &align ); - - switch ( align.align ) - { - case PSH_BLUE_ALIGN_TOP: - /* the top of the stem is aligned against a blue zone */ - hint->cur_pos = align.align_top - fit_len; - break; - - case PSH_BLUE_ALIGN_BOT: - /* the bottom of the stem is aligned against a blue zone */ - hint->cur_pos = align.align_bot; - break; - - case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: - /* both edges of the stem are aligned against blue zones */ - hint->cur_pos = align.align_bot; - hint->cur_len = align.align_top - align.align_bot; - break; - - default: - { - PSH_Hint parent = hint->parent; - - - if ( parent ) - { - FT_Pos par_org_center, par_cur_center; - FT_Pos cur_org_center, cur_delta; - - - /* ensure that parent is already fitted */ - if ( !psh_hint_is_fitted( parent ) ) - psh_hint_align( parent, globals, dimension, glyph ); - - /* keep original relation between hints, this is, use the */ - /* scaled distance between the centers of the hints to */ - /* compute the new position */ - par_org_center = parent->org_pos + ( parent->org_len >> 1 ); - par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 ); - cur_org_center = hint->org_pos + ( hint->org_len >> 1 ); - - cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); - pos = par_cur_center + cur_delta - ( len >> 1 ); - } - - hint->cur_pos = pos; - hint->cur_len = fit_len; - - /* Stem adjustment tries to snap stem widths to standard - * ones. This is important to prevent unpleasant rounding - * artefacts. - */ - if ( glyph->do_stem_adjust ) - { - if ( len <= 64 ) - { - /* the stem is less than one pixel; we will center it - * around the nearest pixel center - */ - if ( len >= 32 ) - { - /* This is a special case where we also widen the stem - * and align it to the pixel grid. - * - * stem_center = pos + (len/2) - * nearest_pixel_center = FT_ROUND(stem_center-32)+32 - * new_pos = nearest_pixel_center-32 - * = FT_ROUND(stem_center-32) - * = FT_FLOOR(stem_center-32+32) - * = FT_FLOOR(stem_center) - * new_len = 64 - */ - pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ); - len = 64; - } - else if ( len > 0 ) - { - /* This is a very small stem; we simply align it to the - * pixel grid, trying to find the minimal displacement. - * - * left = pos - * right = pos + len - * left_nearest_edge = ROUND(pos) - * right_nearest_edge = ROUND(right) - * - * if ( ABS(left_nearest_edge - left) <= - * ABS(right_nearest_edge - right) ) - * new_pos = left - * else - * new_pos = right - */ - FT_Pos left_nearest = FT_PIX_ROUND( pos ); - FT_Pos right_nearest = FT_PIX_ROUND( pos + len ); - FT_Pos left_disp = left_nearest - pos; - FT_Pos right_disp = right_nearest - ( pos + len ); - - - if ( left_disp < 0 ) - left_disp = -left_disp; - if ( right_disp < 0 ) - right_disp = -right_disp; - if ( left_disp <= right_disp ) - pos = left_nearest; - else - pos = right_nearest; - } - else - { - /* this is a ghost stem; we simply round it */ - pos = FT_PIX_ROUND( pos ); - } - } - else - { - len = psh_dimension_quantize_len( dim, len, 0 ); - } - } - - /* now that we have a good hinted stem width, try to position */ - /* the stem along a pixel grid integer coordinate */ - hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len ); - hint->cur_len = len; - } - } - - if ( do_snapping ) - { - pos = hint->cur_pos; - len = hint->cur_len; - - if ( len < 64 ) - len = 64; - else - len = FT_PIX_ROUND( len ); - - switch ( align.align ) - { - case PSH_BLUE_ALIGN_TOP: - hint->cur_pos = align.align_top - len; - hint->cur_len = len; - break; - - case PSH_BLUE_ALIGN_BOT: - hint->cur_len = len; - break; - - case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP: - /* don't touch */ - break; - - - default: - hint->cur_len = len; - if ( len & 64 ) - pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32; - else - pos = FT_PIX_ROUND( pos + ( len >> 1 ) ); - - hint->cur_pos = pos - ( len >> 1 ); - hint->cur_len = len; - } - } - - psh_hint_set_fitted( hint ); - -#ifdef DEBUG_HINTER - if ( ps_debug_hint_func ) - ps_debug_hint_func( hint, dimension ); -#endif - } - } - - -#if 0 /* not used for now, experimental */ - - /* - * A variant to perform "light" hinting (i.e. FT_RENDER_MODE_LIGHT) - * of stems - */ - static void - psh_hint_align_light( PSH_Hint hint, - PSH_Globals globals, - FT_Int dimension, - PSH_Glyph glyph ) - { - PSH_Dimension dim = &globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - FT_Fixed delta = dim->scale_delta; - - - if ( !psh_hint_is_fitted( hint ) ) - { - FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; - FT_Pos len = FT_MulFix( hint->org_len, scale ); - - FT_Pos fit_len; - - PSH_AlignmentRec align; - - - /* ignore stem alignments when requested through the hint flags */ - if ( ( dimension == 0 && !glyph->do_horz_hints ) || - ( dimension == 1 && !glyph->do_vert_hints ) ) - { - hint->cur_pos = pos; - hint->cur_len = len; - - psh_hint_set_fitted( hint ); - return; - } - - fit_len = len; - - hint->cur_len = fit_len; - - /* check blue zones for horizontal stems */ - align.align = PSH_BLUE_ALIGN_NONE; - align.align_bot = align.align_top = 0; - - if ( dimension == 1 ) - psh_blues_snap_stem( &globals->blues, - hint->org_pos + hint->org_len, - hint->org_pos, - &align ); - - switch ( align.align ) - { - case PSH_BLUE_ALIGN_TOP: - /* the top of the stem is aligned against a blue zone */ - hint->cur_pos = align.align_top - fit_len; - break; - - case PSH_BLUE_ALIGN_BOT: - /* the bottom of the stem is aligned against a blue zone */ - hint->cur_pos = align.align_bot; - break; - - case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: - /* both edges of the stem are aligned against blue zones */ - hint->cur_pos = align.align_bot; - hint->cur_len = align.align_top - align.align_bot; - break; - - default: - { - PSH_Hint parent = hint->parent; - - - if ( parent ) - { - FT_Pos par_org_center, par_cur_center; - FT_Pos cur_org_center, cur_delta; - - - /* ensure that parent is already fitted */ - if ( !psh_hint_is_fitted( parent ) ) - psh_hint_align_light( parent, globals, dimension, glyph ); - - par_org_center = parent->org_pos + ( parent->org_len / 2 ); - par_cur_center = parent->cur_pos + ( parent->cur_len / 2 ); - cur_org_center = hint->org_pos + ( hint->org_len / 2 ); - - cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); - pos = par_cur_center + cur_delta - ( len >> 1 ); - } - - /* Stems less than one pixel wide are easy -- we want to - * make them as dark as possible, so they must fall within - * one pixel. If the stem is split between two pixels - * then snap the edge that is nearer to the pixel boundary - * to the pixel boundary. - */ - if ( len <= 64 ) - { - if ( ( pos + len + 63 ) / 64 != pos / 64 + 1 ) - pos += psh_hint_snap_stem_side_delta ( pos, len ); - } - - /* Position stems other to minimize the amount of mid-grays. - * There are, in general, two positions that do this, - * illustrated as A) and B) below. - * - * + + + + - * - * A) |--------------------------------| - * B) |--------------------------------| - * C) |--------------------------------| - * - * Position A) (split the excess stem equally) should be better - * for stems of width N + f where f < 0.5. - * - * Position B) (split the deficiency equally) should be better - * for stems of width N + f where f > 0.5. - * - * It turns out though that minimizing the total number of lit - * pixels is also important, so position C), with one edge - * aligned with a pixel boundary is actually preferable - * to A). There are also more possibile positions for C) than - * for A) or B), so it involves less distortion of the overall - * character shape. - */ - else /* len > 64 */ - { - FT_Fixed frac_len = len & 63; - FT_Fixed center = pos + ( len >> 1 ); - FT_Fixed delta_a, delta_b; - - - if ( ( len / 64 ) & 1 ) - { - delta_a = FT_PIX_FLOOR( center ) + 32 - center; - delta_b = FT_PIX_ROUND( center ) - center; - } - else - { - delta_a = FT_PIX_ROUND( center ) - center; - delta_b = FT_PIX_FLOOR( center ) + 32 - center; - } - - /* We choose between B) and C) above based on the amount - * of fractinal stem width; for small amounts, choose - * C) always, for large amounts, B) always, and inbetween, - * pick whichever one involves less stem movement. - */ - if ( frac_len < 32 ) - { - pos += psh_hint_snap_stem_side_delta ( pos, len ); - } - else if ( frac_len < 48 ) - { - FT_Fixed side_delta = psh_hint_snap_stem_side_delta ( pos, - len ); - - if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) ) - pos += side_delta; - else - pos += delta_b; - } - else - { - pos += delta_b; - } - } - - hint->cur_pos = pos; - } - } /* switch */ - - psh_hint_set_fitted( hint ); - -#ifdef DEBUG_HINTER - if ( ps_debug_hint_func ) - ps_debug_hint_func( hint, dimension ); -#endif - } - } - -#endif /* 0 */ - - - static void - psh_hint_table_align_hints( PSH_Hint_Table table, - PSH_Globals globals, - FT_Int dimension, - PSH_Glyph glyph ) - { - PSH_Hint hint; - FT_UInt count; - -#ifdef DEBUG_HINTER - - PSH_Dimension dim = &globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - FT_Fixed delta = dim->scale_delta; - - - if ( ps_debug_no_vert_hints && dimension == 0 ) - { - ps_simple_scale( table, scale, delta, dimension ); - return; - } - - if ( ps_debug_no_horz_hints && dimension == 1 ) - { - ps_simple_scale( table, scale, delta, dimension ); - return; - } - -#endif /* DEBUG_HINTER*/ - - hint = table->hints; - count = table->max_hints; - - for ( ; count > 0; count--, hint++ ) - psh_hint_align( hint, globals, dimension, glyph ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** POINTS INTERPOLATION ROUTINES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define PSH_ZONE_MIN -3200000L -#define PSH_ZONE_MAX +3200000L - -#define xxDEBUG_ZONES - - -#ifdef DEBUG_ZONES - -#include FT_CONFIG_STANDARD_LIBRARY_H - - static void - psh_print_zone( PSH_Zone zone ) - { - printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n", - zone->scale / 65536.0, - zone->delta / 64.0, - zone->min, - zone->max ); - } - -#else - -#define psh_print_zone( x ) do { } while ( 0 ) - -#endif /* DEBUG_ZONES */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** HINTER GLYPH MANAGEMENT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#if 1 - -#define psh_corner_is_flat ft_corner_is_flat -#define psh_corner_orientation ft_corner_orientation - -#else - - FT_LOCAL_DEF( FT_Int ) - psh_corner_is_flat( FT_Pos x_in, - FT_Pos y_in, - FT_Pos x_out, - FT_Pos y_out ) - { - FT_Pos ax = x_in; - FT_Pos ay = y_in; - - FT_Pos d_in, d_out, d_corner; - - - if ( ax < 0 ) - ax = -ax; - if ( ay < 0 ) - ay = -ay; - d_in = ax + ay; - - ax = x_out; - if ( ax < 0 ) - ax = -ax; - ay = y_out; - if ( ay < 0 ) - ay = -ay; - d_out = ax + ay; - - ax = x_out + x_in; - if ( ax < 0 ) - ax = -ax; - ay = y_out + y_in; - if ( ay < 0 ) - ay = -ay; - d_corner = ax + ay; - - return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); - } - - static FT_Int - psh_corner_orientation( FT_Pos in_x, - FT_Pos in_y, - FT_Pos out_x, - FT_Pos out_y ) - { - FT_Int result; - - - /* deal with the trivial cases quickly */ - if ( in_y == 0 ) - { - if ( in_x >= 0 ) - result = out_y; - else - result = -out_y; - } - else if ( in_x == 0 ) - { - if ( in_y >= 0 ) - result = -out_x; - else - result = out_x; - } - else if ( out_y == 0 ) - { - if ( out_x >= 0 ) - result = in_y; - else - result = -in_y; - } - else if ( out_x == 0 ) - { - if ( out_y >= 0 ) - result = -in_x; - else - result = in_x; - } - else /* general case */ - { - long long delta = (long long)in_x * out_y - (long long)in_y * out_x; - - if ( delta == 0 ) - result = 0; - else - result = 1 - 2 * ( delta < 0 ); - } - - return result; - } - -#endif /* !1 */ - - -#ifdef COMPUTE_INFLEXS - - /* compute all inflex points in a given glyph */ - static void - psh_glyph_compute_inflections( PSH_Glyph glyph ) - { - FT_UInt n; - - - for ( n = 0; n < glyph->num_contours; n++ ) - { - PSH_Point first, start, end, before, after; - FT_Pos in_x, in_y, out_x, out_y; - FT_Int orient_prev, orient_cur; - FT_Int finished = 0; - - - /* we need at least 4 points to create an inflection point */ - if ( glyph->contours[n].count < 4 ) - continue; - - /* compute first segment in contour */ - first = glyph->contours[n].start; - - start = end = first; - do - { - end = end->next; - if ( end == first ) - goto Skip; - - in_x = end->org_u - start->org_u; - in_y = end->org_v - start->org_v; - - } while ( in_x == 0 && in_y == 0 ); - - /* extend the segment start whenever possible */ - before = start; - do - { - do - { - start = before; - before = before->prev; - if ( before == first ) - goto Skip; - - out_x = start->org_u - before->org_u; - out_y = start->org_v - before->org_v; - - } while ( out_x == 0 && out_y == 0 ); - - orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y ); - - } while ( orient_prev == 0 ); - - first = start; - in_x = out_x; - in_y = out_y; - - /* now, process all segments in the contour */ - do - { - /* first, extend current segment's end whenever possible */ - after = end; - do - { - do - { - end = after; - after = after->next; - if ( after == first ) - finished = 1; - - out_x = after->org_u - end->org_u; - out_y = after->org_v - end->org_v; - - } while ( out_x == 0 && out_y == 0 ); - - orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y ); - - } while ( orient_cur == 0 ); - - if ( ( orient_cur ^ orient_prev ) < 0 ) - { - do - { - psh_point_set_inflex( start ); - start = start->next; - } - while ( start != end ); - - psh_point_set_inflex( start ); - } - - start = end; - end = after; - orient_prev = orient_cur; - in_x = out_x; - in_y = out_y; - - } while ( !finished ); - - Skip: - ; - } - } - -#endif /* COMPUTE_INFLEXS */ - - - static void - psh_glyph_done( PSH_Glyph glyph ) - { - FT_Memory memory = glyph->memory; - - - psh_hint_table_done( &glyph->hint_tables[1], memory ); - psh_hint_table_done( &glyph->hint_tables[0], memory ); - - FT_FREE( glyph->points ); - FT_FREE( glyph->contours ); - - glyph->num_points = 0; - glyph->num_contours = 0; - - glyph->memory = 0; - } - - - static int - psh_compute_dir( FT_Pos dx, - FT_Pos dy ) - { - FT_Pos ax, ay; - int result = PSH_DIR_NONE; - - - ax = ( dx >= 0 ) ? dx : -dx; - ay = ( dy >= 0 ) ? dy : -dy; - - if ( ay * 12 < ax ) - { - /* |dy| <<< |dx| means a near-horizontal segment */ - result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT; - } - else if ( ax * 12 < ay ) - { - /* |dx| <<< |dy| means a near-vertical segment */ - result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN; - } - - return result; - } - - - /* load outline point coordinates into hinter glyph */ - static void - psh_glyph_load_points( PSH_Glyph glyph, - FT_Int dimension ) - { - FT_Vector* vec = glyph->outline->points; - PSH_Point point = glyph->points; - FT_UInt count = glyph->num_points; - - - for ( ; count > 0; count--, point++, vec++ ) - { - point->flags2 = 0; - point->hint = NULL; - if ( dimension == 0 ) - { - point->org_u = vec->x; - point->org_v = vec->y; - } - else - { - point->org_u = vec->y; - point->org_v = vec->x; - } - -#ifdef DEBUG_HINTER - point->org_x = vec->x; - point->org_y = vec->y; -#endif - - } - } - - - /* save hinted point coordinates back to outline */ - static void - psh_glyph_save_points( PSH_Glyph glyph, - FT_Int dimension ) - { - FT_UInt n; - PSH_Point point = glyph->points; - FT_Vector* vec = glyph->outline->points; - char* tags = glyph->outline->tags; - - - for ( n = 0; n < glyph->num_points; n++ ) - { - if ( dimension == 0 ) - vec[n].x = point->cur_u; - else - vec[n].y = point->cur_u; - - if ( psh_point_is_strong( point ) ) - tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 ); - -#ifdef DEBUG_HINTER - - if ( dimension == 0 ) - { - point->cur_x = point->cur_u; - point->flags_x = point->flags2 | point->flags; - } - else - { - point->cur_y = point->cur_u; - point->flags_y = point->flags2 | point->flags; - } - -#endif - - point++; - } - } - - - static FT_Error - psh_glyph_init( PSH_Glyph glyph, - FT_Outline* outline, - PS_Hints ps_hints, - PSH_Globals globals ) - { - FT_Error error; - FT_Memory memory; - - - /* clear all fields */ - FT_MEM_ZERO( glyph, sizeof ( *glyph ) ); - - memory = glyph->memory = globals->memory; - - /* allocate and setup points + contours arrays */ - if ( FT_NEW_ARRAY( glyph->points, outline->n_points ) || - FT_NEW_ARRAY( glyph->contours, outline->n_contours ) ) - goto Exit; - - glyph->num_points = outline->n_points; - glyph->num_contours = outline->n_contours; - - { - FT_UInt first = 0, next, n; - PSH_Point points = glyph->points; - PSH_Contour contour = glyph->contours; - - - for ( n = 0; n < glyph->num_contours; n++ ) - { - FT_Int count; - PSH_Point point; - - - next = outline->contours[n] + 1; - count = next - first; - - contour->start = points + first; - contour->count = (FT_UInt)count; - - if ( count > 0 ) - { - point = points + first; - - point->prev = points + next - 1; - point->contour = contour; - - for ( ; count > 1; count-- ) - { - point[0].next = point + 1; - point[1].prev = point; - point++; - point->contour = contour; - } - point->next = points + first; - } - - contour++; - first = next; - } - } - - { - PSH_Point points = glyph->points; - PSH_Point point = points; - FT_Vector* vec = outline->points; - FT_UInt n; - - - for ( n = 0; n < glyph->num_points; n++, point++ ) - { - FT_Int n_prev = (FT_Int)( point->prev - points ); - FT_Int n_next = (FT_Int)( point->next - points ); - FT_Pos dxi, dyi, dxo, dyo; - - - if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) ) - point->flags = PSH_POINT_OFF; - - dxi = vec[n].x - vec[n_prev].x; - dyi = vec[n].y - vec[n_prev].y; - - point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi ); - - dxo = vec[n_next].x - vec[n].x; - dyo = vec[n_next].y - vec[n].y; - - point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo ); - - /* detect smooth points */ - if ( point->flags & PSH_POINT_OFF ) - point->flags |= PSH_POINT_SMOOTH; - - else if ( point->dir_in == point->dir_out ) - { - if ( point->dir_out != PSH_DIR_NONE || - psh_corner_is_flat( dxi, dyi, dxo, dyo ) ) - point->flags |= PSH_POINT_SMOOTH; - } - } - } - - glyph->outline = outline; - glyph->globals = globals; - -#ifdef COMPUTE_INFLEXS - psh_glyph_load_points( glyph, 0 ); - psh_glyph_compute_inflections( glyph ); -#endif /* COMPUTE_INFLEXS */ - - /* now deal with hints tables */ - error = psh_hint_table_init( &glyph->hint_tables [0], - &ps_hints->dimension[0].hints, - &ps_hints->dimension[0].masks, - &ps_hints->dimension[0].counters, - memory ); - if ( error ) - goto Exit; - - error = psh_hint_table_init( &glyph->hint_tables [1], - &ps_hints->dimension[1].hints, - &ps_hints->dimension[1].masks, - &ps_hints->dimension[1].counters, - memory ); - if ( error ) - goto Exit; - - Exit: - return error; - } - - - /* compute all extrema in a glyph for a given dimension */ - static void - psh_glyph_compute_extrema( PSH_Glyph glyph ) - { - FT_UInt n; - - - /* first of all, compute all local extrema */ - for ( n = 0; n < glyph->num_contours; n++ ) - { - PSH_Point first = glyph->contours[n].start; - PSH_Point point, before, after; - - - if ( glyph->contours[n].count == 0 ) - continue; - - point = first; - before = point; - after = point; - - do - { - before = before->prev; - if ( before == first ) - goto Skip; - - } while ( before->org_u == point->org_u ); - - first = point = before->next; - - for (;;) - { - after = point; - do - { - after = after->next; - if ( after == first ) - goto Next; - - } while ( after->org_u == point->org_u ); - - if ( before->org_u < point->org_u ) - { - if ( after->org_u < point->org_u ) - { - /* local maximum */ - goto Extremum; - } - } - else /* before->org_u > point->org_u */ - { - if ( after->org_u > point->org_u ) - { - /* local minimum */ - Extremum: - do - { - psh_point_set_extremum( point ); - point = point->next; - - } while ( point != after ); - } - } - - before = after->prev; - point = after; - - } /* for */ - - Next: - ; - } - - /* for each extremum, determine its direction along the */ - /* orthogonal axis */ - for ( n = 0; n < glyph->num_points; n++ ) - { - PSH_Point point, before, after; - - - point = &glyph->points[n]; - before = point; - after = point; - - if ( psh_point_is_extremum( point ) ) - { - do - { - before = before->prev; - if ( before == point ) - goto Skip; - - } while ( before->org_v == point->org_v ); - - do - { - after = after->next; - if ( after == point ) - goto Skip; - - } while ( after->org_v == point->org_v ); - } - - if ( before->org_v < point->org_v && - after->org_v > point->org_v ) - { - psh_point_set_positive( point ); - } - else if ( before->org_v > point->org_v && - after->org_v < point->org_v ) - { - psh_point_set_negative( point ); - } - - Skip: - ; - } - } - - - /* major_dir is the direction for points on the bottom/left of the stem; */ - /* Points on the top/right of the stem will have a direction of */ - /* -major_dir. */ - - static void - psh_hint_table_find_strong_points( PSH_Hint_Table table, - PSH_Point point, - FT_UInt count, - FT_Int threshold, - FT_Int major_dir ) - { - PSH_Hint* sort = table->sort; - FT_UInt num_hints = table->num_hints; - - - for ( ; count > 0; count--, point++ ) - { - FT_Int point_dir = 0; - FT_Pos org_u = point->org_u; - - - if ( psh_point_is_strong( point ) ) - continue; - - if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) ) - point_dir = point->dir_in; - - else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) ) - point_dir = point->dir_out; - - if ( point_dir ) - { - if ( point_dir == major_dir ) - { - FT_UInt nn; - - - for ( nn = 0; nn < num_hints; nn++ ) - { - PSH_Hint hint = sort[nn]; - FT_Pos d = org_u - hint->org_pos; - - - if ( d < threshold && -d < threshold ) - { - psh_point_set_strong( point ); - point->flags2 |= PSH_POINT_EDGE_MIN; - point->hint = hint; - break; - } - } - } - else if ( point_dir == -major_dir ) - { - FT_UInt nn; - - - for ( nn = 0; nn < num_hints; nn++ ) - { - PSH_Hint hint = sort[nn]; - FT_Pos d = org_u - hint->org_pos - hint->org_len; - - - if ( d < threshold && -d < threshold ) - { - psh_point_set_strong( point ); - point->flags2 |= PSH_POINT_EDGE_MAX; - point->hint = hint; - break; - } - } - } - } - -#if 1 - else if ( psh_point_is_extremum( point ) ) - { - /* treat extrema as special cases for stem edge alignment */ - FT_UInt nn, min_flag, max_flag; - - - if ( major_dir == PSH_DIR_HORIZONTAL ) - { - min_flag = PSH_POINT_POSITIVE; - max_flag = PSH_POINT_NEGATIVE; - } - else - { - min_flag = PSH_POINT_NEGATIVE; - max_flag = PSH_POINT_POSITIVE; - } - - if ( point->flags2 & min_flag ) - { - for ( nn = 0; nn < num_hints; nn++ ) - { - PSH_Hint hint = sort[nn]; - FT_Pos d = org_u - hint->org_pos; - - - if ( d < threshold && -d < threshold ) - { - point->flags2 |= PSH_POINT_EDGE_MIN; - point->hint = hint; - psh_point_set_strong( point ); - break; - } - } - } - else if ( point->flags2 & max_flag ) - { - for ( nn = 0; nn < num_hints; nn++ ) - { - PSH_Hint hint = sort[nn]; - FT_Pos d = org_u - hint->org_pos - hint->org_len; - - - if ( d < threshold && -d < threshold ) - { - point->flags2 |= PSH_POINT_EDGE_MAX; - point->hint = hint; - psh_point_set_strong( point ); - break; - } - } - } - - if ( point->hint == NULL ) - { - for ( nn = 0; nn < num_hints; nn++ ) - { - PSH_Hint hint = sort[nn]; - - - if ( org_u >= hint->org_pos && - org_u <= hint->org_pos + hint->org_len ) - { - point->hint = hint; - break; - } - } - } - } - -#endif /* 1 */ - } - } - - - /* the accepted shift for strong points in fractional pixels */ -#define PSH_STRONG_THRESHOLD 32 - - /* the maximum shift value in font units */ -#define PSH_STRONG_THRESHOLD_MAXIMUM 30 - - - /* find strong points in a glyph */ - static void - psh_glyph_find_strong_points( PSH_Glyph glyph, - FT_Int dimension ) - { - /* a point is `strong' if it is located on a stem edge and */ - /* has an `in' or `out' tangent parallel to the hint's direction */ - - PSH_Hint_Table table = &glyph->hint_tables[dimension]; - PS_Mask mask = table->hint_masks->masks; - FT_UInt num_masks = table->hint_masks->num_masks; - FT_UInt first = 0; - FT_Int major_dir = dimension == 0 ? PSH_DIR_VERTICAL - : PSH_DIR_HORIZONTAL; - PSH_Dimension dim = &glyph->globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - FT_Int threshold; - - - threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale ); - if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM ) - threshold = PSH_STRONG_THRESHOLD_MAXIMUM; - - /* process secondary hints to `selected' points */ - if ( num_masks > 1 && glyph->num_points > 0 ) - { - /* the `endchar' op can reduce the number of points */ - first = mask->end_point > glyph->num_points - ? glyph->num_points - : mask->end_point; - mask++; - for ( ; num_masks > 1; num_masks--, mask++ ) - { - FT_UInt next; - FT_Int count; - - - next = mask->end_point > glyph->num_points - ? glyph->num_points - : mask->end_point; - count = next - first; - if ( count > 0 ) - { - PSH_Point point = glyph->points + first; - - - psh_hint_table_activate_mask( table, mask ); - - psh_hint_table_find_strong_points( table, point, count, - threshold, major_dir ); - } - first = next; - } - } - - /* process primary hints for all points */ - if ( num_masks == 1 ) - { - FT_UInt count = glyph->num_points; - PSH_Point point = glyph->points; - - - psh_hint_table_activate_mask( table, table->hint_masks->masks ); - - psh_hint_table_find_strong_points( table, point, count, - threshold, major_dir ); - } - - /* now, certain points may have been attached to a hint and */ - /* not marked as strong; update their flags then */ - { - FT_UInt count = glyph->num_points; - PSH_Point point = glyph->points; - - - for ( ; count > 0; count--, point++ ) - if ( point->hint && !psh_point_is_strong( point ) ) - psh_point_set_strong( point ); - } - } - - - /* find points in a glyph which are in a blue zone and have `in' or */ - /* `out' tangents parallel to the horizontal axis */ - static void - psh_glyph_find_blue_points( PSH_Blues blues, - PSH_Glyph glyph ) - { - PSH_Blue_Table table; - PSH_Blue_Zone zone; - FT_UInt glyph_count = glyph->num_points; - FT_UInt blue_count; - PSH_Point point = glyph->points; - - - for ( ; glyph_count > 0; glyph_count--, point++ ) - { - FT_Pos y; - - - /* check tangents */ - if ( !PSH_DIR_COMPARE( point->dir_in, PSH_DIR_HORIZONTAL ) && - !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) ) - continue; - - /* skip strong points */ - if ( psh_point_is_strong( point ) ) - continue; - - y = point->org_u; - - /* look up top zones */ - table = &blues->normal_top; - blue_count = table->count; - zone = table->zones; - - for ( ; blue_count > 0; blue_count--, zone++ ) - { - FT_Pos delta = y - zone->org_bottom; - - - if ( delta < -blues->blue_fuzz ) - break; - - if ( y <= zone->org_top + blues->blue_fuzz ) - if ( blues->no_overshoots || delta <= blues->blue_threshold ) - { - point->cur_u = zone->cur_bottom; - psh_point_set_strong( point ); - psh_point_set_fitted( point ); - } - } - - /* look up bottom zones */ - table = &blues->normal_bottom; - blue_count = table->count; - zone = table->zones + blue_count - 1; - - for ( ; blue_count > 0; blue_count--, zone-- ) - { - FT_Pos delta = zone->org_top - y; - - - if ( delta < -blues->blue_fuzz ) - break; - - if ( y >= zone->org_bottom - blues->blue_fuzz ) - if ( blues->no_overshoots || delta < blues->blue_threshold ) - { - point->cur_u = zone->cur_top; - psh_point_set_strong( point ); - psh_point_set_fitted( point ); - } - } - } - } - - - /* interpolate strong points with the help of hinted coordinates */ - static void - psh_glyph_interpolate_strong_points( PSH_Glyph glyph, - FT_Int dimension ) - { - PSH_Dimension dim = &glyph->globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - - FT_UInt count = glyph->num_points; - PSH_Point point = glyph->points; - - - for ( ; count > 0; count--, point++ ) - { - PSH_Hint hint = point->hint; - - - if ( hint ) - { - FT_Pos delta; - - - if ( psh_point_is_edge_min( point ) ) - point->cur_u = hint->cur_pos; - - else if ( psh_point_is_edge_max( point ) ) - point->cur_u = hint->cur_pos + hint->cur_len; - - else - { - delta = point->org_u - hint->org_pos; - - if ( delta <= 0 ) - point->cur_u = hint->cur_pos + FT_MulFix( delta, scale ); - - else if ( delta >= hint->org_len ) - point->cur_u = hint->cur_pos + hint->cur_len + - FT_MulFix( delta - hint->org_len, scale ); - - else if ( hint->org_len > 0 ) - point->cur_u = hint->cur_pos + - FT_MulDiv( delta, hint->cur_len, - hint->org_len ); - else - point->cur_u = hint->cur_pos; - } - psh_point_set_fitted( point ); - } - } - } - - -#define PSH_MAX_STRONG_INTERNAL 16 - - static void - psh_glyph_interpolate_normal_points( PSH_Glyph glyph, - FT_Int dimension ) - { - -#if 1 - /* first technique: a point is strong if it is a local extremum */ - - PSH_Dimension dim = &glyph->globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - FT_Memory memory = glyph->memory; - - PSH_Point* strongs = NULL; - PSH_Point strongs_0[PSH_MAX_STRONG_INTERNAL]; - FT_UInt num_strongs = 0; - - PSH_Point points = glyph->points; - PSH_Point points_end = points + glyph->num_points; - PSH_Point point; - - - /* first count the number of strong points */ - for ( point = points; point < points_end; point++ ) - { - if ( psh_point_is_strong( point ) ) - num_strongs++; - } - - if ( num_strongs == 0 ) /* nothing to do here */ - return; - - /* allocate an array to store a list of points, */ - /* stored in increasing org_u order */ - if ( num_strongs <= PSH_MAX_STRONG_INTERNAL ) - strongs = strongs_0; - else - { - FT_Error error; - - - if ( FT_NEW_ARRAY( strongs, num_strongs ) ) - return; - } - - num_strongs = 0; - for ( point = points; point < points_end; point++ ) - { - PSH_Point* insert; - - - if ( !psh_point_is_strong( point ) ) - continue; - - for ( insert = strongs + num_strongs; insert > strongs; insert-- ) - { - if ( insert[-1]->org_u <= point->org_u ) - break; - - insert[0] = insert[-1]; - } - insert[0] = point; - num_strongs++; - } - - /* now try to interpolate all normal points */ - for ( point = points; point < points_end; point++ ) - { - if ( psh_point_is_strong( point ) ) - continue; - - /* sometimes, some local extrema are smooth points */ - if ( psh_point_is_smooth( point ) ) - { - if ( point->dir_in == PSH_DIR_NONE || - point->dir_in != point->dir_out ) - continue; - - if ( !psh_point_is_extremum( point ) && - !psh_point_is_inflex( point ) ) - continue; - - point->flags &= ~PSH_POINT_SMOOTH; - } - - /* find best enclosing point coordinates then interpolate */ - { - PSH_Point before, after; - FT_UInt nn; - - - for ( nn = 0; nn < num_strongs; nn++ ) - if ( strongs[nn]->org_u > point->org_u ) - break; - - if ( nn == 0 ) /* point before the first strong point */ - { - after = strongs[0]; - - point->cur_u = after->cur_u + - FT_MulFix( point->org_u - after->org_u, - scale ); - } - else - { - before = strongs[nn - 1]; - - for ( nn = num_strongs; nn > 0; nn-- ) - if ( strongs[nn - 1]->org_u < point->org_u ) - break; - - if ( nn == num_strongs ) /* point is after last strong point */ - { - before = strongs[nn - 1]; - - point->cur_u = before->cur_u + - FT_MulFix( point->org_u - before->org_u, - scale ); - } - else - { - FT_Pos u; - - - after = strongs[nn]; - - /* now interpolate point between before and after */ - u = point->org_u; - - if ( u == before->org_u ) - point->cur_u = before->cur_u; - - else if ( u == after->org_u ) - point->cur_u = after->cur_u; - - else - point->cur_u = before->cur_u + - FT_MulDiv( u - before->org_u, - after->cur_u - before->cur_u, - after->org_u - before->org_u ); - } - } - psh_point_set_fitted( point ); - } - } - - if ( strongs != strongs_0 ) - FT_FREE( strongs ); - -#endif /* 1 */ - - } - - - /* interpolate other points */ - static void - psh_glyph_interpolate_other_points( PSH_Glyph glyph, - FT_Int dimension ) - { - PSH_Dimension dim = &glyph->globals->dimension[dimension]; - FT_Fixed scale = dim->scale_mult; - FT_Fixed delta = dim->scale_delta; - PSH_Contour contour = glyph->contours; - FT_UInt num_contours = glyph->num_contours; - - - for ( ; num_contours > 0; num_contours--, contour++ ) - { - PSH_Point start = contour->start; - PSH_Point first, next, point; - FT_UInt fit_count; - - - /* count the number of strong points in this contour */ - next = start + contour->count; - fit_count = 0; - first = 0; - - for ( point = start; point < next; point++ ) - if ( psh_point_is_fitted( point ) ) - { - if ( !first ) - first = point; - - fit_count++; - } - - /* if there are less than 2 fitted points in the contour, we */ - /* simply scale and eventually translate the contour points */ - if ( fit_count < 2 ) - { - if ( fit_count == 1 ) - delta = first->cur_u - FT_MulFix( first->org_u, scale ); - - for ( point = start; point < next; point++ ) - if ( point != first ) - point->cur_u = FT_MulFix( point->org_u, scale ) + delta; - - goto Next_Contour; - } - - /* there are more than 2 strong points in this contour; we */ - /* need to interpolate weak points between them */ - start = first; - do - { - point = first; - - /* skip consecutive fitted points */ - for (;;) - { - next = first->next; - if ( next == start ) - goto Next_Contour; - - if ( !psh_point_is_fitted( next ) ) - break; - - first = next; - } - - /* find next fitted point after unfitted one */ - for (;;) - { - next = next->next; - if ( psh_point_is_fitted( next ) ) - break; - } - - /* now interpolate between them */ - { - FT_Pos org_a, org_ab, cur_a, cur_ab; - FT_Pos org_c, org_ac, cur_c; - FT_Fixed scale_ab; - - - if ( first->org_u <= next->org_u ) - { - org_a = first->org_u; - cur_a = first->cur_u; - org_ab = next->org_u - org_a; - cur_ab = next->cur_u - cur_a; - } - else - { - org_a = next->org_u; - cur_a = next->cur_u; - org_ab = first->org_u - org_a; - cur_ab = first->cur_u - cur_a; - } - - scale_ab = 0x10000L; - if ( org_ab > 0 ) - scale_ab = FT_DivFix( cur_ab, org_ab ); - - point = first->next; - do - { - org_c = point->org_u; - org_ac = org_c - org_a; - - if ( org_ac <= 0 ) - { - /* on the left of the interpolation zone */ - cur_c = cur_a + FT_MulFix( org_ac, scale ); - } - else if ( org_ac >= org_ab ) - { - /* on the right on the interpolation zone */ - cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale ); - } - else - { - /* within the interpolation zone */ - cur_c = cur_a + FT_MulFix( org_ac, scale_ab ); - } - - point->cur_u = cur_c; - - point = point->next; - - } while ( point != next ); - } - - /* keep going until all points in the contours have been processed */ - first = next; - - } while ( first != start ); - - Next_Contour: - ; - } - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** HIGH-LEVEL INTERFACE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_Error - ps_hints_apply( PS_Hints ps_hints, - FT_Outline* outline, - PSH_Globals globals, - FT_Render_Mode hint_mode ) - { - PSH_GlyphRec glyphrec; - PSH_Glyph glyph = &glyphrec; - FT_Error error; -#ifdef DEBUG_HINTER - FT_Memory memory; -#endif - FT_Int dimension; - - - /* something to do? */ - if ( outline->n_points == 0 || outline->n_contours == 0 ) - return PSH_Err_Ok; - -#ifdef DEBUG_HINTER - - memory = globals->memory; - - if ( ps_debug_glyph ) - { - psh_glyph_done( ps_debug_glyph ); - FT_FREE( ps_debug_glyph ); - } - - if ( FT_NEW( glyph ) ) - return error; - - ps_debug_glyph = glyph; - -#endif /* DEBUG_HINTER */ - - error = psh_glyph_init( glyph, outline, ps_hints, globals ); - if ( error ) - goto Exit; - - /* try to optimize the y_scale so that the top of non-capital letters - * is aligned on a pixel boundary whenever possible - */ - { - PSH_Dimension dim_x = &glyph->globals->dimension[0]; - PSH_Dimension dim_y = &glyph->globals->dimension[1]; - - FT_Fixed x_scale = dim_x->scale_mult; - FT_Fixed y_scale = dim_y->scale_mult; - - FT_Fixed old_x_scale = x_scale; - FT_Fixed old_y_scale = y_scale; - - FT_Fixed scaled; - FT_Fixed fitted; - - FT_Bool rescale = FALSE; - - - scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale ); - fitted = FT_PIX_ROUND( scaled ); - - if ( fitted != 0 && scaled != fitted ) - { - rescale = TRUE; - - y_scale = FT_MulDiv( y_scale, fitted, scaled ); - - if ( fitted < scaled ) - x_scale -= x_scale / 50; - - psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 ); - } - - glyph->do_horz_hints = 1; - glyph->do_vert_hints = 1; - - glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || - hint_mode == FT_RENDER_MODE_LCD ); - - glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || - hint_mode == FT_RENDER_MODE_LCD_V ); - - glyph->do_stem_adjust = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT ); - - for ( dimension = 0; dimension < 2; dimension++ ) - { - /* load outline coordinates into glyph */ - psh_glyph_load_points( glyph, dimension ); - - /* compute local extrema */ - psh_glyph_compute_extrema( glyph ); - - /* compute aligned stem/hints positions */ - psh_hint_table_align_hints( &glyph->hint_tables[dimension], - glyph->globals, - dimension, - glyph ); - - /* find strong points, align them, then interpolate others */ - psh_glyph_find_strong_points( glyph, dimension ); - if ( dimension == 1 ) - psh_glyph_find_blue_points( &globals->blues, glyph ); - psh_glyph_interpolate_strong_points( glyph, dimension ); - psh_glyph_interpolate_normal_points( glyph, dimension ); - psh_glyph_interpolate_other_points( glyph, dimension ); - - /* save hinted coordinates back to outline */ - psh_glyph_save_points( glyph, dimension ); - - if ( rescale ) - psh_globals_set_scale( glyph->globals, - old_x_scale, old_y_scale, 0, 0 ); - } - } - - Exit: - -#ifndef DEBUG_HINTER - psh_glyph_done( glyph ); -#endif - - return error; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshalgo.h b/android/jni/ndk_modules/freetype/src/pshinter/pshalgo.h deleted file mode 100644 index 1a248a70..00000000 --- a/android/jni/ndk_modules/freetype/src/pshinter/pshalgo.h +++ /dev/null @@ -1,255 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshalgo.h */ -/* */ -/* PostScript hinting algorithm (specification). */ -/* */ -/* Copyright 2001, 2002, 2003, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __PSHALGO_H__ -#define __PSHALGO_H__ - - -#include "pshrec.h" -#include "pshglob.h" -#include FT_TRIGONOMETRY_H - - -FT_BEGIN_HEADER - - - /* handle to Hint structure */ - typedef struct PSH_HintRec_* PSH_Hint; - - /* hint bit-flags */ - typedef enum PSH_Hint_Flags_ - { - PSH_HINT_GHOST = PS_HINT_FLAG_GHOST, - PSH_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM, - PSH_HINT_ACTIVE = 4, - PSH_HINT_FITTED = 8 - - } PSH_Hint_Flags; - - -#define psh_hint_is_active( x ) ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 ) -#define psh_hint_is_ghost( x ) ( ( (x)->flags & PSH_HINT_GHOST ) != 0 ) -#define psh_hint_is_fitted( x ) ( ( (x)->flags & PSH_HINT_FITTED ) != 0 ) - -#define psh_hint_activate( x ) (x)->flags |= PSH_HINT_ACTIVE -#define psh_hint_deactivate( x ) (x)->flags &= ~PSH_HINT_ACTIVE -#define psh_hint_set_fitted( x ) (x)->flags |= PSH_HINT_FITTED - - /* hint structure */ - typedef struct PSH_HintRec_ - { - FT_Int org_pos; - FT_Int org_len; - FT_Pos cur_pos; - FT_Pos cur_len; - FT_UInt flags; - PSH_Hint parent; - FT_Int order; - - } PSH_HintRec; - - - /* this is an interpolation zone used for strong points; */ - /* weak points are interpolated according to their strong */ - /* neighbours */ - typedef struct PSH_ZoneRec_ - { - FT_Fixed scale; - FT_Fixed delta; - FT_Pos min; - FT_Pos max; - - } PSH_ZoneRec, *PSH_Zone; - - - typedef struct PSH_Hint_TableRec_ - { - FT_UInt max_hints; - FT_UInt num_hints; - PSH_Hint hints; - PSH_Hint* sort; - PSH_Hint* sort_global; - FT_UInt num_zones; - PSH_ZoneRec* zones; - PSH_Zone zone; - PS_Mask_Table hint_masks; - PS_Mask_Table counter_masks; - - } PSH_Hint_TableRec, *PSH_Hint_Table; - - - typedef struct PSH_PointRec_* PSH_Point; - typedef struct PSH_ContourRec_* PSH_Contour; - - enum - { - PSH_DIR_NONE = 4, - PSH_DIR_UP = -1, - PSH_DIR_DOWN = 1, - PSH_DIR_LEFT = -2, - PSH_DIR_RIGHT = 2 - }; - -#define PSH_DIR_HORIZONTAL 2 -#define PSH_DIR_VERTICAL 1 - -#define PSH_DIR_COMPARE( d1, d2 ) ( (d1) == (d2) || (d1) == -(d2) ) -#define PSH_DIR_IS_HORIZONTAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL ) -#define PSH_DIR_IS_VERTICAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL ) - - - /* the following bit-flags are computed once by the glyph */ - /* analyzer, for both dimensions */ - enum - { - PSH_POINT_OFF = 1, /* point is off the curve */ - PSH_POINT_SMOOTH = 2, /* point is smooth */ - PSH_POINT_INFLEX = 4 /* point is inflection */ - }; - -#define psh_point_is_smooth( p ) ( (p)->flags & PSH_POINT_SMOOTH ) -#define psh_point_is_off( p ) ( (p)->flags & PSH_POINT_OFF ) -#define psh_point_is_inflex( p ) ( (p)->flags & PSH_POINT_INFLEX ) - -#define psh_point_set_smooth( p ) (p)->flags |= PSH_POINT_SMOOTH -#define psh_point_set_off( p ) (p)->flags |= PSH_POINT_OFF -#define psh_point_set_inflex( p ) (p)->flags |= PSH_POINT_INFLEX - - /* the following bit-flags are re-computed for each dimension */ - enum - { - PSH_POINT_STRONG = 16, /* point is strong */ - PSH_POINT_FITTED = 32, /* point is already fitted */ - PSH_POINT_EXTREMUM = 64, /* point is local extremum */ - PSH_POINT_POSITIVE = 128, /* extremum has positive contour flow */ - PSH_POINT_NEGATIVE = 256, /* extremum has negative contour flow */ - PSH_POINT_EDGE_MIN = 512, /* point is aligned to left/bottom stem edge */ - PSH_POINT_EDGE_MAX = 1024 /* point is aligned to top/right stem edge */ - }; - -#define psh_point_is_strong( p ) ( (p)->flags2 & PSH_POINT_STRONG ) -#define psh_point_is_fitted( p ) ( (p)->flags2 & PSH_POINT_FITTED ) -#define psh_point_is_extremum( p ) ( (p)->flags2 & PSH_POINT_EXTREMUM ) -#define psh_point_is_positive( p ) ( (p)->flags2 & PSH_POINT_POSITIVE ) -#define psh_point_is_negative( p ) ( (p)->flags2 & PSH_POINT_NEGATIVE ) -#define psh_point_is_edge_min( p ) ( (p)->flags2 & PSH_POINT_EDGE_MIN ) -#define psh_point_is_edge_max( p ) ( (p)->flags2 & PSH_POINT_EDGE_MAX ) - -#define psh_point_set_strong( p ) (p)->flags2 |= PSH_POINT_STRONG -#define psh_point_set_fitted( p ) (p)->flags2 |= PSH_POINT_FITTED -#define psh_point_set_extremum( p ) (p)->flags2 |= PSH_POINT_EXTREMUM -#define psh_point_set_positive( p ) (p)->flags2 |= PSH_POINT_POSITIVE -#define psh_point_set_negative( p ) (p)->flags2 |= PSH_POINT_NEGATIVE -#define psh_point_set_edge_min( p ) (p)->flags2 |= PSH_POINT_EDGE_MIN -#define psh_point_set_edge_max( p ) (p)->flags2 |= PSH_POINT_EDGE_MAX - - - typedef struct PSH_PointRec_ - { - PSH_Point prev; - PSH_Point next; - PSH_Contour contour; - FT_UInt flags; - FT_UInt flags2; - FT_Char dir_in; - FT_Char dir_out; - FT_Angle angle_in; - FT_Angle angle_out; - PSH_Hint hint; - FT_Pos org_u; - FT_Pos org_v; - FT_Pos cur_u; -#ifdef DEBUG_HINTER - FT_Pos org_x; - FT_Pos cur_x; - FT_Pos org_y; - FT_Pos cur_y; - FT_UInt flags_x; - FT_UInt flags_y; -#endif - - } PSH_PointRec; - - -#define PSH_POINT_EQUAL_ORG( a, b ) ( (a)->org_u == (b)->org_u && \ - (a)->org_v == (b)->org_v ) - -#define PSH_POINT_ANGLE( a, b ) FT_Atan2( (b)->org_u - (a)->org_u, \ - (b)->org_v - (a)->org_v ) - - typedef struct PSH_ContourRec_ - { - PSH_Point start; - FT_UInt count; - - } PSH_ContourRec; - - - typedef struct PSH_GlyphRec_ - { - FT_UInt num_points; - FT_UInt num_contours; - - PSH_Point points; - PSH_Contour contours; - - FT_Memory memory; - FT_Outline* outline; - PSH_Globals globals; - PSH_Hint_TableRec hint_tables[2]; - - FT_Bool vertical; - FT_Int major_dir; - FT_Int minor_dir; - - FT_Bool do_horz_hints; - FT_Bool do_vert_hints; - FT_Bool do_horz_snapping; - FT_Bool do_vert_snapping; - FT_Bool do_stem_adjust; - - } PSH_GlyphRec, *PSH_Glyph; - - -#ifdef DEBUG_HINTER - extern PSH_Hint_Table ps_debug_hint_table; - - typedef void - (*PSH_HintFunc)( PSH_Hint hint, - FT_Bool vertical ); - - extern PSH_HintFunc ps_debug_hint_func; - - extern PSH_Glyph ps_debug_glyph; -#endif - - - extern FT_Error - ps_hints_apply( PS_Hints ps_hints, - FT_Outline* outline, - PSH_Globals globals, - FT_Render_Mode hint_mode ); - - -FT_END_HEADER - - -#endif /* __PSHALGO_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshglob.c b/android/jni/ndk_modules/freetype/src/pshinter/pshglob.c deleted file mode 100644 index 31231ad0..00000000 --- a/android/jni/ndk_modules/freetype/src/pshinter/pshglob.c +++ /dev/null @@ -1,750 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshglob.c */ -/* */ -/* PostScript hinter global hinting management (body). */ -/* Inspired by the new auto-hinter module. */ -/* */ -/* Copyright 2001, 2002, 2003, 2004, 2006, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "pshglob.h" - -#ifdef DEBUG_HINTER - PSH_Globals ps_debug_globals = 0; -#endif - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** STANDARD WIDTHS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* scale the widths/heights table */ - static void - psh_globals_scale_widths( PSH_Globals globals, - FT_UInt direction ) - { - PSH_Dimension dim = &globals->dimension[direction]; - PSH_Widths stdw = &dim->stdw; - FT_UInt count = stdw->count; - PSH_Width width = stdw->widths; - PSH_Width stand = width; /* standard width/height */ - FT_Fixed scale = dim->scale_mult; - - - if ( count > 0 ) - { - width->cur = FT_MulFix( width->org, scale ); - width->fit = FT_PIX_ROUND( width->cur ); - - width++; - count--; - - for ( ; count > 0; count--, width++ ) - { - FT_Pos w, dist; - - - w = FT_MulFix( width->org, scale ); - dist = w - stand->cur; - - if ( dist < 0 ) - dist = -dist; - - if ( dist < 128 ) - w = stand->cur; - - width->cur = w; - width->fit = FT_PIX_ROUND( w ); - } - } - } - - -#if 0 - - /* org_width is is font units, result in device pixels, 26.6 format */ - FT_LOCAL_DEF( FT_Pos ) - psh_dimension_snap_width( PSH_Dimension dimension, - FT_Int org_width ) - { - FT_UInt n; - FT_Pos width = FT_MulFix( org_width, dimension->scale_mult ); - FT_Pos best = 64 + 32 + 2; - FT_Pos reference = width; - - - for ( n = 0; n < dimension->stdw.count; n++ ) - { - FT_Pos w; - FT_Pos dist; - - - w = dimension->stdw.widths[n].cur; - dist = width - w; - if ( dist < 0 ) - dist = -dist; - if ( dist < best ) - { - best = dist; - reference = w; - } - } - - if ( width >= reference ) - { - width -= 0x21; - if ( width < reference ) - width = reference; - } - else - { - width += 0x21; - if ( width > reference ) - width = reference; - } - - return width; - } - -#endif /* 0 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** BLUE ZONES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - psh_blues_set_zones_0( PSH_Blues target, - FT_Bool is_others, - FT_UInt read_count, - FT_Short* read, - PSH_Blue_Table top_table, - PSH_Blue_Table bot_table ) - { - FT_UInt count_top = top_table->count; - FT_UInt count_bot = bot_table->count; - FT_Bool first = 1; - - FT_UNUSED( target ); - - - for ( ; read_count > 1; read_count -= 2 ) - { - FT_Int reference, delta; - FT_UInt count; - PSH_Blue_Zone zones, zone; - FT_Bool top; - - - /* read blue zone entry, and select target top/bottom zone */ - top = 0; - if ( first || is_others ) - { - reference = read[1]; - delta = read[0] - reference; - - zones = bot_table->zones; - count = count_bot; - first = 0; - } - else - { - reference = read[0]; - delta = read[1] - reference; - - zones = top_table->zones; - count = count_top; - top = 1; - } - - /* insert into sorted table */ - zone = zones; - for ( ; count > 0; count--, zone++ ) - { - if ( reference < zone->org_ref ) - break; - - if ( reference == zone->org_ref ) - { - FT_Int delta0 = zone->org_delta; - - - /* we have two zones on the same reference position -- */ - /* only keep the largest one */ - if ( delta < 0 ) - { - if ( delta < delta0 ) - zone->org_delta = delta; - } - else - { - if ( delta > delta0 ) - zone->org_delta = delta; - } - goto Skip; - } - } - - for ( ; count > 0; count-- ) - zone[count] = zone[count-1]; - - zone->org_ref = reference; - zone->org_delta = delta; - - if ( top ) - count_top++; - else - count_bot++; - - Skip: - read += 2; - } - - top_table->count = count_top; - bot_table->count = count_bot; - } - - - /* Re-read blue zones from the original fonts and store them into out */ - /* private structure. This function re-orders, sanitizes and */ - /* fuzz-expands the zones as well. */ - static void - psh_blues_set_zones( PSH_Blues target, - FT_UInt count, - FT_Short* blues, - FT_UInt count_others, - FT_Short* other_blues, - FT_Int fuzz, - FT_Int family ) - { - PSH_Blue_Table top_table, bot_table; - FT_Int count_top, count_bot; - - - if ( family ) - { - top_table = &target->family_top; - bot_table = &target->family_bottom; - } - else - { - top_table = &target->normal_top; - bot_table = &target->normal_bottom; - } - - /* read the input blue zones, and build two sorted tables */ - /* (one for the top zones, the other for the bottom zones) */ - top_table->count = 0; - bot_table->count = 0; - - /* first, the blues */ - psh_blues_set_zones_0( target, 0, - count, blues, top_table, bot_table ); - psh_blues_set_zones_0( target, 1, - count_others, other_blues, top_table, bot_table ); - - count_top = top_table->count; - count_bot = bot_table->count; - - /* sanitize top table */ - if ( count_top > 0 ) - { - PSH_Blue_Zone zone = top_table->zones; - - - for ( count = count_top; count > 0; count--, zone++ ) - { - FT_Int delta; - - - if ( count > 1 ) - { - delta = zone[1].org_ref - zone[0].org_ref; - if ( zone->org_delta > delta ) - zone->org_delta = delta; - } - - zone->org_bottom = zone->org_ref; - zone->org_top = zone->org_delta + zone->org_ref; - } - } - - /* sanitize bottom table */ - if ( count_bot > 0 ) - { - PSH_Blue_Zone zone = bot_table->zones; - - - for ( count = count_bot; count > 0; count--, zone++ ) - { - FT_Int delta; - - - if ( count > 1 ) - { - delta = zone[0].org_ref - zone[1].org_ref; - if ( zone->org_delta < delta ) - zone->org_delta = delta; - } - - zone->org_top = zone->org_ref; - zone->org_bottom = zone->org_delta + zone->org_ref; - } - } - - /* expand top and bottom tables with blue fuzz */ - { - FT_Int dim, top, bot, delta; - PSH_Blue_Zone zone; - - - zone = top_table->zones; - count = count_top; - - for ( dim = 1; dim >= 0; dim-- ) - { - if ( count > 0 ) - { - /* expand the bottom of the lowest zone normally */ - zone->org_bottom -= fuzz; - - /* expand the top and bottom of intermediate zones; */ - /* checking that the interval is smaller than the fuzz */ - top = zone->org_top; - - for ( count--; count > 0; count-- ) - { - bot = zone[1].org_bottom; - delta = bot - top; - - if ( delta < 2 * fuzz ) - zone[0].org_top = zone[1].org_bottom = top + delta / 2; - else - { - zone[0].org_top = top + fuzz; - zone[1].org_bottom = bot - fuzz; - } - - zone++; - top = zone->org_top; - } - - /* expand the top of the highest zone normally */ - zone->org_top = top + fuzz; - } - zone = bot_table->zones; - count = count_bot; - } - } - } - - - /* reset the blues table when the device transform changes */ - static void - psh_blues_scale_zones( PSH_Blues blues, - FT_Fixed scale, - FT_Pos delta ) - { - FT_UInt count; - FT_UInt num; - PSH_Blue_Table table = 0; - - /* */ - /* Determine whether we need to suppress overshoots or */ - /* not. We simply need to compare the vertical scale */ - /* parameter to the raw bluescale value. Here is why: */ - /* */ - /* We need to suppress overshoots for all pointsizes. */ - /* At 300dpi that satisfies: */ - /* */ - /* pointsize < 240*bluescale + 0.49 */ - /* */ - /* This corresponds to: */ - /* */ - /* pixelsize < 1000*bluescale + 49/24 */ - /* */ - /* scale*EM_Size < 1000*bluescale + 49/24 */ - /* */ - /* However, for normal Type 1 fonts, EM_Size is 1000! */ - /* We thus only check: */ - /* */ - /* scale < bluescale + 49/24000 */ - /* */ - /* which we shorten to */ - /* */ - /* "scale < bluescale" */ - /* */ - /* Note that `blue_scale' is stored 1000 times its real */ - /* value, and that `scale' converts from font units to */ - /* fractional pixels. */ - /* */ - - /* 1000 / 64 = 125 / 8 */ - if ( scale >= 0x20C49BAL ) - blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 ); - else - blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 ); - - /* */ - /* The blue threshold is the font units distance under */ - /* which overshoots are suppressed due to the BlueShift */ - /* even if the scale is greater than BlueScale. */ - /* */ - /* It is the smallest distance such that */ - /* */ - /* dist <= BlueShift && dist*scale <= 0.5 pixels */ - /* */ - { - FT_Int threshold = blues->blue_shift; - - - while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 ) - threshold--; - - blues->blue_threshold = threshold; - } - - for ( num = 0; num < 4; num++ ) - { - PSH_Blue_Zone zone; - - - switch ( num ) - { - case 0: - table = &blues->normal_top; - break; - case 1: - table = &blues->normal_bottom; - break; - case 2: - table = &blues->family_top; - break; - default: - table = &blues->family_bottom; - break; - } - - zone = table->zones; - count = table->count; - for ( ; count > 0; count--, zone++ ) - { - zone->cur_top = FT_MulFix( zone->org_top, scale ) + delta; - zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta; - zone->cur_ref = FT_MulFix( zone->org_ref, scale ) + delta; - zone->cur_delta = FT_MulFix( zone->org_delta, scale ); - - /* round scaled reference position */ - zone->cur_ref = FT_PIX_ROUND( zone->cur_ref ); - -#if 0 - if ( zone->cur_ref > zone->cur_top ) - zone->cur_ref -= 64; - else if ( zone->cur_ref < zone->cur_bottom ) - zone->cur_ref += 64; -#endif - } - } - - /* process the families now */ - - for ( num = 0; num < 2; num++ ) - { - PSH_Blue_Zone zone1, zone2; - FT_UInt count1, count2; - PSH_Blue_Table normal, family; - - - switch ( num ) - { - case 0: - normal = &blues->normal_top; - family = &blues->family_top; - break; - - default: - normal = &blues->normal_bottom; - family = &blues->family_bottom; - } - - zone1 = normal->zones; - count1 = normal->count; - - for ( ; count1 > 0; count1--, zone1++ ) - { - /* try to find a family zone whose reference position is less */ - /* than 1 pixel far from the current zone */ - zone2 = family->zones; - count2 = family->count; - - for ( ; count2 > 0; count2--, zone2++ ) - { - FT_Pos Delta; - - - Delta = zone1->org_ref - zone2->org_ref; - if ( Delta < 0 ) - Delta = -Delta; - - if ( FT_MulFix( Delta, scale ) < 64 ) - { - zone1->cur_top = zone2->cur_top; - zone1->cur_bottom = zone2->cur_bottom; - zone1->cur_ref = zone2->cur_ref; - zone1->cur_delta = zone2->cur_delta; - break; - } - } - } - } - } - - - FT_LOCAL_DEF( void ) - psh_blues_snap_stem( PSH_Blues blues, - FT_Int stem_top, - FT_Int stem_bot, - PSH_Alignment alignment ) - { - PSH_Blue_Table table; - FT_UInt count; - FT_Pos delta; - PSH_Blue_Zone zone; - FT_Int no_shoots; - - - alignment->align = PSH_BLUE_ALIGN_NONE; - - no_shoots = blues->no_overshoots; - - /* look up stem top in top zones table */ - table = &blues->normal_top; - count = table->count; - zone = table->zones; - - for ( ; count > 0; count--, zone++ ) - { - delta = stem_top - zone->org_bottom; - if ( delta < -blues->blue_fuzz ) - break; - - if ( stem_top <= zone->org_top + blues->blue_fuzz ) - { - if ( no_shoots || delta <= blues->blue_threshold ) - { - alignment->align |= PSH_BLUE_ALIGN_TOP; - alignment->align_top = zone->cur_ref; - } - break; - } - } - - /* look up stem bottom in bottom zones table */ - table = &blues->normal_bottom; - count = table->count; - zone = table->zones + count-1; - - for ( ; count > 0; count--, zone-- ) - { - delta = zone->org_top - stem_bot; - if ( delta < -blues->blue_fuzz ) - break; - - if ( stem_bot >= zone->org_bottom - blues->blue_fuzz ) - { - if ( no_shoots || delta < blues->blue_threshold ) - { - alignment->align |= PSH_BLUE_ALIGN_BOT; - alignment->align_bot = zone->cur_ref; - } - break; - } - } - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GLOBAL HINTS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - psh_globals_destroy( PSH_Globals globals ) - { - if ( globals ) - { - FT_Memory memory; - - - memory = globals->memory; - globals->dimension[0].stdw.count = 0; - globals->dimension[1].stdw.count = 0; - - globals->blues.normal_top.count = 0; - globals->blues.normal_bottom.count = 0; - globals->blues.family_top.count = 0; - globals->blues.family_bottom.count = 0; - - FT_FREE( globals ); - -#ifdef DEBUG_HINTER - ps_debug_globals = 0; -#endif - } - } - - - static FT_Error - psh_globals_new( FT_Memory memory, - T1_Private* priv, - PSH_Globals *aglobals ) - { - PSH_Globals globals = NULL; - FT_Error error; - - - if ( !FT_NEW( globals ) ) - { - FT_UInt count; - FT_Short* read; - - - globals->memory = memory; - - /* copy standard widths */ - { - PSH_Dimension dim = &globals->dimension[1]; - PSH_Width write = dim->stdw.widths; - - - write->org = priv->standard_width[0]; - write++; - - read = priv->snap_widths; - for ( count = priv->num_snap_widths; count > 0; count-- ) - { - write->org = *read; - write++; - read++; - } - - dim->stdw.count = priv->num_snap_widths + 1; - } - - /* copy standard heights */ - { - PSH_Dimension dim = &globals->dimension[0]; - PSH_Width write = dim->stdw.widths; - - - write->org = priv->standard_height[0]; - write++; - read = priv->snap_heights; - for ( count = priv->num_snap_heights; count > 0; count-- ) - { - write->org = *read; - write++; - read++; - } - - dim->stdw.count = priv->num_snap_heights + 1; - } - - /* copy blue zones */ - psh_blues_set_zones( &globals->blues, priv->num_blue_values, - priv->blue_values, priv->num_other_blues, - priv->other_blues, priv->blue_fuzz, 0 ); - - psh_blues_set_zones( &globals->blues, priv->num_family_blues, - priv->family_blues, priv->num_family_other_blues, - priv->family_other_blues, priv->blue_fuzz, 1 ); - - globals->blues.blue_scale = priv->blue_scale; - globals->blues.blue_shift = priv->blue_shift; - globals->blues.blue_fuzz = priv->blue_fuzz; - - globals->dimension[0].scale_mult = 0; - globals->dimension[0].scale_delta = 0; - globals->dimension[1].scale_mult = 0; - globals->dimension[1].scale_delta = 0; - -#ifdef DEBUG_HINTER - ps_debug_globals = globals; -#endif - } - - *aglobals = globals; - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - psh_globals_set_scale( PSH_Globals globals, - FT_Fixed x_scale, - FT_Fixed y_scale, - FT_Fixed x_delta, - FT_Fixed y_delta ) - { - PSH_Dimension dim = &globals->dimension[0]; - - - dim = &globals->dimension[0]; - if ( x_scale != dim->scale_mult || - x_delta != dim->scale_delta ) - { - dim->scale_mult = x_scale; - dim->scale_delta = x_delta; - - psh_globals_scale_widths( globals, 0 ); - } - - dim = &globals->dimension[1]; - if ( y_scale != dim->scale_mult || - y_delta != dim->scale_delta ) - { - dim->scale_mult = y_scale; - dim->scale_delta = y_delta; - - psh_globals_scale_widths( globals, 1 ); - psh_blues_scale_zones( &globals->blues, y_scale, y_delta ); - } - - return 0; - } - - - FT_LOCAL_DEF( void ) - psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ) - { - funcs->create = psh_globals_new; - funcs->set_scale = psh_globals_set_scale; - funcs->destroy = psh_globals_destroy; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshglob.h b/android/jni/ndk_modules/freetype/src/pshinter/pshglob.h deleted file mode 100644 index c5116261..00000000 --- a/android/jni/ndk_modules/freetype/src/pshinter/pshglob.h +++ /dev/null @@ -1,196 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshglob.h */ -/* */ -/* PostScript hinter global hinting management. */ -/* */ -/* Copyright 2001, 2002, 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __PSHGLOB_H__ -#define __PSHGLOB_H__ - - -#include FT_FREETYPE_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GLOBAL HINTS INTERNALS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* @constant: */ - /* PS_GLOBALS_MAX_BLUE_ZONES */ - /* */ - /* @description: */ - /* The maximum number of blue zones in a font global hints structure. */ - /* See @PS_Globals_BluesRec. */ - /* */ -#define PS_GLOBALS_MAX_BLUE_ZONES 16 - - - /*************************************************************************/ - /* */ - /* @constant: */ - /* PS_GLOBALS_MAX_STD_WIDTHS */ - /* */ - /* @description: */ - /* The maximum number of standard and snap widths in either the */ - /* horizontal or vertical direction. See @PS_Globals_WidthsRec. */ - /* */ -#define PS_GLOBALS_MAX_STD_WIDTHS 16 - - - /* standard and snap width */ - typedef struct PSH_WidthRec_ - { - FT_Int org; - FT_Pos cur; - FT_Pos fit; - - } PSH_WidthRec, *PSH_Width; - - - /* standard and snap widths table */ - typedef struct PSH_WidthsRec_ - { - FT_UInt count; - PSH_WidthRec widths[PS_GLOBALS_MAX_STD_WIDTHS]; - - } PSH_WidthsRec, *PSH_Widths; - - - typedef struct PSH_DimensionRec_ - { - PSH_WidthsRec stdw; - FT_Fixed scale_mult; - FT_Fixed scale_delta; - - } PSH_DimensionRec, *PSH_Dimension; - - - /* blue zone descriptor */ - typedef struct PSH_Blue_ZoneRec_ - { - FT_Int org_ref; - FT_Int org_delta; - FT_Int org_top; - FT_Int org_bottom; - - FT_Pos cur_ref; - FT_Pos cur_delta; - FT_Pos cur_bottom; - FT_Pos cur_top; - - } PSH_Blue_ZoneRec, *PSH_Blue_Zone; - - - typedef struct PSH_Blue_TableRec_ - { - FT_UInt count; - PSH_Blue_ZoneRec zones[PS_GLOBALS_MAX_BLUE_ZONES]; - - } PSH_Blue_TableRec, *PSH_Blue_Table; - - - /* blue zones table */ - typedef struct PSH_BluesRec_ - { - PSH_Blue_TableRec normal_top; - PSH_Blue_TableRec normal_bottom; - PSH_Blue_TableRec family_top; - PSH_Blue_TableRec family_bottom; - - FT_Fixed blue_scale; - FT_Int blue_shift; - FT_Int blue_threshold; - FT_Int blue_fuzz; - FT_Bool no_overshoots; - - } PSH_BluesRec, *PSH_Blues; - - - /* font globals. */ - /* dimension 0 => X coordinates + vertical hints/stems */ - /* dimension 1 => Y coordinates + horizontal hints/stems */ - typedef struct PSH_GlobalsRec_ - { - FT_Memory memory; - PSH_DimensionRec dimension[2]; - PSH_BluesRec blues; - - } PSH_GlobalsRec; - - -#define PSH_BLUE_ALIGN_NONE 0 -#define PSH_BLUE_ALIGN_TOP 1 -#define PSH_BLUE_ALIGN_BOT 2 - - - typedef struct PSH_AlignmentRec_ - { - int align; - FT_Pos align_top; - FT_Pos align_bot; - - } PSH_AlignmentRec, *PSH_Alignment; - - - FT_LOCAL( void ) - psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ); - - -#if 0 - /* snap a stem width to fitter coordinates. `org_width' is in font */ - /* units. The result is in device pixels (26.6 format). */ - FT_LOCAL( FT_Pos ) - psh_dimension_snap_width( PSH_Dimension dimension, - FT_Int org_width ); -#endif - - FT_LOCAL( FT_Error ) - psh_globals_set_scale( PSH_Globals globals, - FT_Fixed x_scale, - FT_Fixed y_scale, - FT_Fixed x_delta, - FT_Fixed y_delta ); - - /* snap a stem to one or two blue zones */ - FT_LOCAL( void ) - psh_blues_snap_stem( PSH_Blues blues, - FT_Int stem_top, - FT_Int stem_bot, - PSH_Alignment alignment ); - /* */ - -#ifdef DEBUG_HINTER - extern PSH_Globals ps_debug_globals; -#endif - - -FT_END_HEADER - - -#endif /* __PSHGLOB_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshinter.c b/android/jni/ndk_modules/freetype/src/pshinter/pshinter.c deleted file mode 100644 index b35a2a91..00000000 --- a/android/jni/ndk_modules/freetype/src/pshinter/pshinter.c +++ /dev/null @@ -1,29 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshinter.c */ -/* */ -/* FreeType PostScript Hinting module */ -/* */ -/* Copyright 2001, 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "pshpic.c" -#include "pshrec.c" -#include "pshglob.c" -#include "pshalgo.c" -#include "pshmod.c" - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshmod.c b/android/jni/ndk_modules/freetype/src/pshinter/pshmod.c deleted file mode 100644 index 91da5d7e..00000000 --- a/android/jni/ndk_modules/freetype/src/pshinter/pshmod.c +++ /dev/null @@ -1,118 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshmod.c */ -/* */ -/* FreeType PostScript hinter module implementation (body). */ -/* */ -/* Copyright 2001, 2002, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include "pshrec.h" -#include "pshalgo.h" -#include "pshpic.h" - - - /* the Postscript Hinter module structure */ - typedef struct PS_Hinter_Module_Rec_ - { - FT_ModuleRec root; - PS_HintsRec ps_hints; - - PSH_Globals_FuncsRec globals_funcs; - T1_Hints_FuncsRec t1_funcs; - T2_Hints_FuncsRec t2_funcs; - - } PS_Hinter_ModuleRec, *PS_Hinter_Module; - - - /* finalize module */ - FT_CALLBACK_DEF( void ) - ps_hinter_done( PS_Hinter_Module module ) - { - module->t1_funcs.hints = NULL; - module->t2_funcs.hints = NULL; - - ps_hints_done( &module->ps_hints ); - } - - - /* initialize module, create hints recorder and the interface */ - FT_CALLBACK_DEF( FT_Error ) - ps_hinter_init( PS_Hinter_Module module ) - { - FT_Memory memory = module->root.memory; - void* ph = &module->ps_hints; - - - ps_hints_init( &module->ps_hints, memory ); - - psh_globals_funcs_init( &module->globals_funcs ); - - t1_hints_funcs_init( &module->t1_funcs ); - module->t1_funcs.hints = (T1_Hints)ph; - - t2_hints_funcs_init( &module->t2_funcs ); - module->t2_funcs.hints = (T2_Hints)ph; - - return 0; - } - - - /* returns global hints interface */ - FT_CALLBACK_DEF( PSH_Globals_Funcs ) - pshinter_get_globals_funcs( FT_Module module ) - { - return &((PS_Hinter_Module)module)->globals_funcs; - } - - - /* return Type 1 hints interface */ - FT_CALLBACK_DEF( T1_Hints_Funcs ) - pshinter_get_t1_funcs( FT_Module module ) - { - return &((PS_Hinter_Module)module)->t1_funcs; - } - - - /* return Type 2 hints interface */ - FT_CALLBACK_DEF( T2_Hints_Funcs ) - pshinter_get_t2_funcs( FT_Module module ) - { - return &((PS_Hinter_Module)module)->t2_funcs; - } - - - FT_DEFINE_PSHINTER_INTERFACE(pshinter_interface, - pshinter_get_globals_funcs, - pshinter_get_t1_funcs, - pshinter_get_t2_funcs - ) - - - FT_DEFINE_MODULE(pshinter_module_class, - - 0, - sizeof ( PS_Hinter_ModuleRec ), - "pshinter", - 0x10000L, - 0x20000L, - - &FTPSHINTER_INTERFACE_GET, /* module-specific interface */ - - (FT_Module_Constructor)ps_hinter_init, - (FT_Module_Destructor) ps_hinter_done, - (FT_Module_Requester) 0 /* no additional interface for now */ - ) - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshmod.h b/android/jni/ndk_modules/freetype/src/pshinter/pshmod.h deleted file mode 100644 index 0ae7e96f..00000000 --- a/android/jni/ndk_modules/freetype/src/pshinter/pshmod.h +++ /dev/null @@ -1,39 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshmod.h */ -/* */ -/* PostScript hinter module interface (specification). */ -/* */ -/* Copyright 2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __PSHMOD_H__ -#define __PSHMOD_H__ - - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - FT_DECLARE_MODULE( pshinter_module_class ) - - -FT_END_HEADER - - -#endif /* __PSHMOD_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshnterr.h b/android/jni/ndk_modules/freetype/src/pshinter/pshnterr.h deleted file mode 100644 index 3c0029fb..00000000 --- a/android/jni/ndk_modules/freetype/src/pshinter/pshnterr.h +++ /dev/null @@ -1,40 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshnterr.h */ -/* */ -/* PS Hinter error codes (specification only). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the PSHinter error enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __PSHNTERR_H__ -#define __PSHNTERR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#define FT_ERR_PREFIX PSH_Err_ -#define FT_ERR_BASE FT_Mod_Err_PShinter - -#include FT_ERRORS_H - -#endif /* __PSHNTERR_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshpic.c b/android/jni/ndk_modules/freetype/src/pshinter/pshpic.c deleted file mode 100644 index 5efb4229..00000000 --- a/android/jni/ndk_modules/freetype/src/pshinter/pshpic.c +++ /dev/null @@ -1,69 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshpic.c */ -/* */ -/* The FreeType position independent code services for pshinter module. */ -/* */ -/* Copyright 2009, 2010 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "pshpic.h" - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from pshmod.c */ - void FT_Init_Class_pshinter_interface( FT_Library, PSHinter_Interface*); - - void - pshinter_module_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - if ( pic_container->pshinter ) - { - FT_FREE( pic_container->pshinter ); - pic_container->pshinter = NULL; - } - } - - - FT_Error - pshinter_module_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = PSH_Err_Ok; - PSHinterPIC* container; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->pshinter = container; - - /* add call to initialization function when you add new scripts */ - FT_Init_Class_pshinter_interface(library, &container->pshinter_interface); - -/*Exit:*/ - if(error) - pshinter_module_class_pic_free(library); - return error; - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshpic.h b/android/jni/ndk_modules/freetype/src/pshinter/pshpic.h deleted file mode 100644 index 3555d8e8..00000000 --- a/android/jni/ndk_modules/freetype/src/pshinter/pshpic.h +++ /dev/null @@ -1,53 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshpic.h */ -/* */ -/* The FreeType position independent code services for pshinter module. */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __PSHPIC_H__ -#define __PSHPIC_H__ - - -FT_BEGIN_HEADER - -#include FT_INTERNAL_PIC_H - -#ifndef FT_CONFIG_OPTION_PIC - -#define FTPSHINTER_INTERFACE_GET pshinter_interface - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - - typedef struct PSHinterPIC_ - { - PSHinter_Interface pshinter_interface; - } PSHinterPIC; - -#define GET_PIC(lib) ((PSHinterPIC*)((lib)->pic_container.autofit)) -#define FTPSHINTER_INTERFACE_GET (GET_PIC(library)->pshinter_interface) - - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* __PSHPIC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshrec.c b/android/jni/ndk_modules/freetype/src/pshinter/pshrec.c deleted file mode 100644 index 0910cc5e..00000000 --- a/android/jni/ndk_modules/freetype/src/pshinter/pshrec.c +++ /dev/null @@ -1,1224 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshrec.c */ -/* */ -/* FreeType PostScript hints recorder (body). */ -/* */ -/* Copyright 2001, 2002, 2003, 2004, 2007, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H - -#include "pshrec.h" -#include "pshalgo.h" - -#include "pshnterr.h" - -#undef FT_COMPONENT -#define FT_COMPONENT trace_pshrec - -#ifdef DEBUG_HINTER - PS_Hints ps_debug_hints = 0; - int ps_debug_no_horz_hints = 0; - int ps_debug_no_vert_hints = 0; -#endif - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PS_HINT MANAGEMENT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* destroy hints table */ - static void - ps_hint_table_done( PS_Hint_Table table, - FT_Memory memory ) - { - FT_FREE( table->hints ); - table->num_hints = 0; - table->max_hints = 0; - } - - - /* ensure that a table can contain "count" elements */ - static FT_Error - ps_hint_table_ensure( PS_Hint_Table table, - FT_UInt count, - FT_Memory memory ) - { - FT_UInt old_max = table->max_hints; - FT_UInt new_max = count; - FT_Error error = PSH_Err_Ok; - - - if ( new_max > old_max ) - { - /* try to grow the table */ - new_max = FT_PAD_CEIL( new_max, 8 ); - if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) ) - table->max_hints = new_max; - } - return error; - } - - - static FT_Error - ps_hint_table_alloc( PS_Hint_Table table, - FT_Memory memory, - PS_Hint *ahint ) - { - FT_Error error = PSH_Err_Ok; - FT_UInt count; - PS_Hint hint = 0; - - - count = table->num_hints; - count++; - - if ( count >= table->max_hints ) - { - error = ps_hint_table_ensure( table, count, memory ); - if ( error ) - goto Exit; - } - - hint = table->hints + count - 1; - hint->pos = 0; - hint->len = 0; - hint->flags = 0; - - table->num_hints = count; - - Exit: - *ahint = hint; - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PS_MASK MANAGEMENT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* destroy mask */ - static void - ps_mask_done( PS_Mask mask, - FT_Memory memory ) - { - FT_FREE( mask->bytes ); - mask->num_bits = 0; - mask->max_bits = 0; - mask->end_point = 0; - } - - - /* ensure that a mask can contain "count" bits */ - static FT_Error - ps_mask_ensure( PS_Mask mask, - FT_UInt count, - FT_Memory memory ) - { - FT_UInt old_max = ( mask->max_bits + 7 ) >> 3; - FT_UInt new_max = ( count + 7 ) >> 3; - FT_Error error = PSH_Err_Ok; - - - if ( new_max > old_max ) - { - new_max = FT_PAD_CEIL( new_max, 8 ); - if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) ) - mask->max_bits = new_max * 8; - } - return error; - } - - - /* test a bit value in a given mask */ - static FT_Int - ps_mask_test_bit( PS_Mask mask, - FT_Int idx ) - { - if ( (FT_UInt)idx >= mask->num_bits ) - return 0; - - return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) ); - } - - - /* clear a given bit */ - static void - ps_mask_clear_bit( PS_Mask mask, - FT_Int idx ) - { - FT_Byte* p; - - - if ( (FT_UInt)idx >= mask->num_bits ) - return; - - p = mask->bytes + ( idx >> 3 ); - p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) ); - } - - - /* set a given bit, possibly grow the mask */ - static FT_Error - ps_mask_set_bit( PS_Mask mask, - FT_Int idx, - FT_Memory memory ) - { - FT_Error error = PSH_Err_Ok; - FT_Byte* p; - - - if ( idx < 0 ) - goto Exit; - - if ( (FT_UInt)idx >= mask->num_bits ) - { - error = ps_mask_ensure( mask, idx + 1, memory ); - if ( error ) - goto Exit; - - mask->num_bits = idx + 1; - } - - p = mask->bytes + ( idx >> 3 ); - p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) ); - - Exit: - return error; - } - - - /* destroy mask table */ - static void - ps_mask_table_done( PS_Mask_Table table, - FT_Memory memory ) - { - FT_UInt count = table->max_masks; - PS_Mask mask = table->masks; - - - for ( ; count > 0; count--, mask++ ) - ps_mask_done( mask, memory ); - - FT_FREE( table->masks ); - table->num_masks = 0; - table->max_masks = 0; - } - - - /* ensure that a mask table can contain "count" masks */ - static FT_Error - ps_mask_table_ensure( PS_Mask_Table table, - FT_UInt count, - FT_Memory memory ) - { - FT_UInt old_max = table->max_masks; - FT_UInt new_max = count; - FT_Error error = PSH_Err_Ok; - - - if ( new_max > old_max ) - { - new_max = FT_PAD_CEIL( new_max, 8 ); - if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) ) - table->max_masks = new_max; - } - return error; - } - - - /* allocate a new mask in a table */ - static FT_Error - ps_mask_table_alloc( PS_Mask_Table table, - FT_Memory memory, - PS_Mask *amask ) - { - FT_UInt count; - FT_Error error = PSH_Err_Ok; - PS_Mask mask = 0; - - - count = table->num_masks; - count++; - - if ( count > table->max_masks ) - { - error = ps_mask_table_ensure( table, count, memory ); - if ( error ) - goto Exit; - } - - mask = table->masks + count - 1; - mask->num_bits = 0; - mask->end_point = 0; - table->num_masks = count; - - Exit: - *amask = mask; - return error; - } - - - /* return last hint mask in a table, create one if the table is empty */ - static FT_Error - ps_mask_table_last( PS_Mask_Table table, - FT_Memory memory, - PS_Mask *amask ) - { - FT_Error error = PSH_Err_Ok; - FT_UInt count; - PS_Mask mask; - - - count = table->num_masks; - if ( count == 0 ) - { - error = ps_mask_table_alloc( table, memory, &mask ); - if ( error ) - goto Exit; - } - else - mask = table->masks + count - 1; - - Exit: - *amask = mask; - return error; - } - - - /* set a new mask to a given bit range */ - static FT_Error - ps_mask_table_set_bits( PS_Mask_Table table, - const FT_Byte* source, - FT_UInt bit_pos, - FT_UInt bit_count, - FT_Memory memory ) - { - FT_Error error = PSH_Err_Ok; - PS_Mask mask; - - - error = ps_mask_table_last( table, memory, &mask ); - if ( error ) - goto Exit; - - error = ps_mask_ensure( mask, bit_count, memory ); - if ( error ) - goto Exit; - - mask->num_bits = bit_count; - - /* now, copy bits */ - { - FT_Byte* read = (FT_Byte*)source + ( bit_pos >> 3 ); - FT_Int rmask = 0x80 >> ( bit_pos & 7 ); - FT_Byte* write = mask->bytes; - FT_Int wmask = 0x80; - FT_Int val; - - - for ( ; bit_count > 0; bit_count-- ) - { - val = write[0] & ~wmask; - - if ( read[0] & rmask ) - val |= wmask; - - write[0] = (FT_Byte)val; - - rmask >>= 1; - if ( rmask == 0 ) - { - read++; - rmask = 0x80; - } - - wmask >>= 1; - if ( wmask == 0 ) - { - write++; - wmask = 0x80; - } - } - } - - Exit: - return error; - } - - - /* test whether two masks in a table intersect */ - static FT_Int - ps_mask_table_test_intersect( PS_Mask_Table table, - FT_Int index1, - FT_Int index2 ) - { - PS_Mask mask1 = table->masks + index1; - PS_Mask mask2 = table->masks + index2; - FT_Byte* p1 = mask1->bytes; - FT_Byte* p2 = mask2->bytes; - FT_UInt count1 = mask1->num_bits; - FT_UInt count2 = mask2->num_bits; - FT_UInt count; - - - count = ( count1 <= count2 ) ? count1 : count2; - for ( ; count >= 8; count -= 8 ) - { - if ( p1[0] & p2[0] ) - return 1; - - p1++; - p2++; - } - - if ( count == 0 ) - return 0; - - return ( p1[0] & p2[0] ) & ~( 0xFF >> count ); - } - - - /* merge two masks, used by ps_mask_table_merge_all */ - static FT_Error - ps_mask_table_merge( PS_Mask_Table table, - FT_Int index1, - FT_Int index2, - FT_Memory memory ) - { - FT_UInt temp; - FT_Error error = PSH_Err_Ok; - - - /* swap index1 and index2 so that index1 < index2 */ - if ( index1 > index2 ) - { - temp = index1; - index1 = index2; - index2 = temp; - } - - if ( index1 < index2 && index1 >= 0 && index2 < (FT_Int)table->num_masks ) - { - /* we need to merge the bitsets of index1 and index2 with a */ - /* simple union */ - PS_Mask mask1 = table->masks + index1; - PS_Mask mask2 = table->masks + index2; - FT_UInt count1 = mask1->num_bits; - FT_UInt count2 = mask2->num_bits; - FT_Int delta; - - - if ( count2 > 0 ) - { - FT_UInt pos; - FT_Byte* read; - FT_Byte* write; - - - /* if "count2" is greater than "count1", we need to grow the */ - /* first bitset, and clear the highest bits */ - if ( count2 > count1 ) - { - error = ps_mask_ensure( mask1, count2, memory ); - if ( error ) - goto Exit; - - for ( pos = count1; pos < count2; pos++ ) - ps_mask_clear_bit( mask1, pos ); - } - - /* merge (unite) the bitsets */ - read = mask2->bytes; - write = mask1->bytes; - pos = (FT_UInt)( ( count2 + 7 ) >> 3 ); - - for ( ; pos > 0; pos-- ) - { - write[0] = (FT_Byte)( write[0] | read[0] ); - write++; - read++; - } - } - - /* Now, remove "mask2" from the list. We need to keep the masks */ - /* sorted in order of importance, so move table elements. */ - mask2->num_bits = 0; - mask2->end_point = 0; - - delta = table->num_masks - 1 - index2; /* number of masks to move */ - if ( delta > 0 ) - { - /* move to end of table for reuse */ - PS_MaskRec dummy = *mask2; - - - ft_memmove( mask2, mask2 + 1, delta * sizeof ( PS_MaskRec ) ); - - mask2[delta] = dummy; - } - - table->num_masks--; - } - else - FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n", - index1, index2 )); - - Exit: - return error; - } - - - /* Try to merge all masks in a given table. This is used to merge */ - /* all counter masks into independent counter "paths". */ - /* */ - static FT_Error - ps_mask_table_merge_all( PS_Mask_Table table, - FT_Memory memory ) - { - FT_Int index1, index2; - FT_Error error = PSH_Err_Ok; - - - for ( index1 = table->num_masks - 1; index1 > 0; index1-- ) - { - for ( index2 = index1 - 1; index2 >= 0; index2-- ) - { - if ( ps_mask_table_test_intersect( table, index1, index2 ) ) - { - error = ps_mask_table_merge( table, index2, index1, memory ); - if ( error ) - goto Exit; - - break; - } - } - } - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PS_DIMENSION MANAGEMENT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* finalize a given dimension */ - static void - ps_dimension_done( PS_Dimension dimension, - FT_Memory memory ) - { - ps_mask_table_done( &dimension->counters, memory ); - ps_mask_table_done( &dimension->masks, memory ); - ps_hint_table_done( &dimension->hints, memory ); - } - - - /* initialize a given dimension */ - static void - ps_dimension_init( PS_Dimension dimension ) - { - dimension->hints.num_hints = 0; - dimension->masks.num_masks = 0; - dimension->counters.num_masks = 0; - } - - -#if 0 - - /* set a bit at a given index in the current hint mask */ - static FT_Error - ps_dimension_set_mask_bit( PS_Dimension dim, - FT_UInt idx, - FT_Memory memory ) - { - PS_Mask mask; - FT_Error error = PSH_Err_Ok; - - - /* get last hint mask */ - error = ps_mask_table_last( &dim->masks, memory, &mask ); - if ( error ) - goto Exit; - - error = ps_mask_set_bit( mask, idx, memory ); - - Exit: - return error; - } - -#endif - - /* set the end point in a mask, called from "End" & "Reset" methods */ - static void - ps_dimension_end_mask( PS_Dimension dim, - FT_UInt end_point ) - { - FT_UInt count = dim->masks.num_masks; - PS_Mask mask; - - - if ( count > 0 ) - { - mask = dim->masks.masks + count - 1; - mask->end_point = end_point; - } - } - - - /* set the end point in the current mask, then create a new empty one */ - /* (called by "Reset" method) */ - static FT_Error - ps_dimension_reset_mask( PS_Dimension dim, - FT_UInt end_point, - FT_Memory memory ) - { - PS_Mask mask; - - - /* end current mask */ - ps_dimension_end_mask( dim, end_point ); - - /* allocate new one */ - return ps_mask_table_alloc( &dim->masks, memory, &mask ); - } - - - /* set a new mask, called from the "T2Stem" method */ - static FT_Error - ps_dimension_set_mask_bits( PS_Dimension dim, - const FT_Byte* source, - FT_UInt source_pos, - FT_UInt source_bits, - FT_UInt end_point, - FT_Memory memory ) - { - FT_Error error = PSH_Err_Ok; - - - /* reset current mask, if any */ - error = ps_dimension_reset_mask( dim, end_point, memory ); - if ( error ) - goto Exit; - - /* set bits in new mask */ - error = ps_mask_table_set_bits( &dim->masks, source, - source_pos, source_bits, memory ); - - Exit: - return error; - } - - - /* add a new single stem (called from "T1Stem" method) */ - static FT_Error - ps_dimension_add_t1stem( PS_Dimension dim, - FT_Int pos, - FT_Int len, - FT_Memory memory, - FT_Int *aindex ) - { - FT_Error error = PSH_Err_Ok; - FT_UInt flags = 0; - - - /* detect ghost stem */ - if ( len < 0 ) - { - flags |= PS_HINT_FLAG_GHOST; - if ( len == -21 ) - { - flags |= PS_HINT_FLAG_BOTTOM; - pos += len; - } - len = 0; - } - - if ( aindex ) - *aindex = -1; - - /* now, lookup stem in the current hints table */ - { - PS_Mask mask; - FT_UInt idx; - FT_UInt max = dim->hints.num_hints; - PS_Hint hint = dim->hints.hints; - - - for ( idx = 0; idx < max; idx++, hint++ ) - { - if ( hint->pos == pos && hint->len == len ) - break; - } - - /* we need to create a new hint in the table */ - if ( idx >= max ) - { - error = ps_hint_table_alloc( &dim->hints, memory, &hint ); - if ( error ) - goto Exit; - - hint->pos = pos; - hint->len = len; - hint->flags = flags; - } - - /* now, store the hint in the current mask */ - error = ps_mask_table_last( &dim->masks, memory, &mask ); - if ( error ) - goto Exit; - - error = ps_mask_set_bit( mask, idx, memory ); - if ( error ) - goto Exit; - - if ( aindex ) - *aindex = (FT_Int)idx; - } - - Exit: - return error; - } - - - /* add a "hstem3/vstem3" counter to our dimension table */ - static FT_Error - ps_dimension_add_counter( PS_Dimension dim, - FT_Int hint1, - FT_Int hint2, - FT_Int hint3, - FT_Memory memory ) - { - FT_Error error = PSH_Err_Ok; - FT_UInt count = dim->counters.num_masks; - PS_Mask counter = dim->counters.masks; - - - /* try to find an existing counter mask that already uses */ - /* one of these stems here */ - for ( ; count > 0; count--, counter++ ) - { - if ( ps_mask_test_bit( counter, hint1 ) || - ps_mask_test_bit( counter, hint2 ) || - ps_mask_test_bit( counter, hint3 ) ) - break; - } - - /* create a new counter when needed */ - if ( count == 0 ) - { - error = ps_mask_table_alloc( &dim->counters, memory, &counter ); - if ( error ) - goto Exit; - } - - /* now, set the bits for our hints in the counter mask */ - error = ps_mask_set_bit( counter, hint1, memory ); - if ( error ) - goto Exit; - - error = ps_mask_set_bit( counter, hint2, memory ); - if ( error ) - goto Exit; - - error = ps_mask_set_bit( counter, hint3, memory ); - if ( error ) - goto Exit; - - Exit: - return error; - } - - - /* end of recording session for a given dimension */ - static FT_Error - ps_dimension_end( PS_Dimension dim, - FT_UInt end_point, - FT_Memory memory ) - { - /* end hint mask table */ - ps_dimension_end_mask( dim, end_point ); - - /* merge all counter masks into independent "paths" */ - return ps_mask_table_merge_all( &dim->counters, memory ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** PS_RECORDER MANAGEMENT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* destroy hints */ - FT_LOCAL( void ) - ps_hints_done( PS_Hints hints ) - { - FT_Memory memory = hints->memory; - - - ps_dimension_done( &hints->dimension[0], memory ); - ps_dimension_done( &hints->dimension[1], memory ); - - hints->error = PSH_Err_Ok; - hints->memory = 0; - } - - - FT_LOCAL( FT_Error ) - ps_hints_init( PS_Hints hints, - FT_Memory memory ) - { - FT_MEM_ZERO( hints, sizeof ( *hints ) ); - hints->memory = memory; - return PSH_Err_Ok; - } - - - /* initialize a hints for a new session */ - static void - ps_hints_open( PS_Hints hints, - PS_Hint_Type hint_type ) - { - switch ( hint_type ) - { - case PS_HINT_TYPE_1: - case PS_HINT_TYPE_2: - hints->error = PSH_Err_Ok; - hints->hint_type = hint_type; - - ps_dimension_init( &hints->dimension[0] ); - ps_dimension_init( &hints->dimension[1] ); - break; - - default: - hints->error = PSH_Err_Invalid_Argument; - hints->hint_type = hint_type; - - FT_TRACE0(( "ps_hints_open: invalid charstring type\n" )); - break; - } - } - - - /* add one or more stems to the current hints table */ - static void - ps_hints_stem( PS_Hints hints, - FT_Int dimension, - FT_UInt count, - FT_Long* stems ) - { - if ( !hints->error ) - { - /* limit "dimension" to 0..1 */ - if ( dimension < 0 || dimension > 1 ) - { - FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n", - dimension )); - dimension = ( dimension != 0 ); - } - - /* record the stems in the current hints/masks table */ - switch ( hints->hint_type ) - { - case PS_HINT_TYPE_1: /* Type 1 "hstem" or "vstem" operator */ - case PS_HINT_TYPE_2: /* Type 2 "hstem" or "vstem" operator */ - { - PS_Dimension dim = &hints->dimension[dimension]; - - - for ( ; count > 0; count--, stems += 2 ) - { - FT_Error error; - FT_Memory memory = hints->memory; - - - error = ps_dimension_add_t1stem( - dim, (FT_Int)stems[0], (FT_Int)stems[1], - memory, NULL ); - if ( error ) - { - FT_ERROR(( "ps_hints_stem: could not add stem" - " (%d,%d) to hints table\n", stems[0], stems[1] )); - - hints->error = error; - return; - } - } - break; - } - - default: - FT_TRACE0(( "ps_hints_stem: called with invalid hint type (%d)\n", - hints->hint_type )); - break; - } - } - } - - - /* add one Type1 counter stem to the current hints table */ - static void - ps_hints_t1stem3( PS_Hints hints, - FT_Int dimension, - FT_Fixed* stems ) - { - FT_Error error = PSH_Err_Ok; - - - if ( !hints->error ) - { - PS_Dimension dim; - FT_Memory memory = hints->memory; - FT_Int count; - FT_Int idx[3]; - - - /* limit "dimension" to 0..1 */ - if ( dimension < 0 || dimension > 1 ) - { - FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n", - dimension )); - dimension = ( dimension != 0 ); - } - - dim = &hints->dimension[dimension]; - - /* there must be 6 elements in the 'stem' array */ - if ( hints->hint_type == PS_HINT_TYPE_1 ) - { - /* add the three stems to our hints/masks table */ - for ( count = 0; count < 3; count++, stems += 2 ) - { - error = ps_dimension_add_t1stem( dim, - (FT_Int)FIXED_TO_INT( stems[0] ), - (FT_Int)FIXED_TO_INT( stems[1] ), - memory, &idx[count] ); - if ( error ) - goto Fail; - } - - /* now, add the hints to the counters table */ - error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2], - memory ); - if ( error ) - goto Fail; - } - else - { - FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type\n" )); - error = PSH_Err_Invalid_Argument; - goto Fail; - } - } - - return; - - Fail: - FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" )); - hints->error = error; - } - - - /* reset hints (only with Type 1 hints) */ - static void - ps_hints_t1reset( PS_Hints hints, - FT_UInt end_point ) - { - FT_Error error = PSH_Err_Ok; - - - if ( !hints->error ) - { - FT_Memory memory = hints->memory; - - - if ( hints->hint_type == PS_HINT_TYPE_1 ) - { - error = ps_dimension_reset_mask( &hints->dimension[0], - end_point, memory ); - if ( error ) - goto Fail; - - error = ps_dimension_reset_mask( &hints->dimension[1], - end_point, memory ); - if ( error ) - goto Fail; - } - else - { - /* invalid hint type */ - error = PSH_Err_Invalid_Argument; - goto Fail; - } - } - return; - - Fail: - hints->error = error; - } - - - /* Type2 "hintmask" operator, add a new hintmask to each direction */ - static void - ps_hints_t2mask( PS_Hints hints, - FT_UInt end_point, - FT_UInt bit_count, - const FT_Byte* bytes ) - { - FT_Error error; - - - if ( !hints->error ) - { - PS_Dimension dim = hints->dimension; - FT_Memory memory = hints->memory; - FT_UInt count1 = dim[0].hints.num_hints; - FT_UInt count2 = dim[1].hints.num_hints; - - - /* check bit count; must be equal to current total hint count */ - if ( bit_count != count1 + count2 ) - { - FT_TRACE0(( "ps_hints_t2mask:" - " called with invalid bitcount %d (instead of %d)\n", - bit_count, count1 + count2 )); - - /* simply ignore the operator */ - return; - } - - /* set-up new horizontal and vertical hint mask now */ - error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1, - end_point, memory ); - if ( error ) - goto Fail; - - error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2, - end_point, memory ); - if ( error ) - goto Fail; - } - return; - - Fail: - hints->error = error; - } - - - static void - ps_hints_t2counter( PS_Hints hints, - FT_UInt bit_count, - const FT_Byte* bytes ) - { - FT_Error error; - - - if ( !hints->error ) - { - PS_Dimension dim = hints->dimension; - FT_Memory memory = hints->memory; - FT_UInt count1 = dim[0].hints.num_hints; - FT_UInt count2 = dim[1].hints.num_hints; - - - /* check bit count, must be equal to current total hint count */ - if ( bit_count != count1 + count2 ) - { - FT_TRACE0(( "ps_hints_t2counter:" - " called with invalid bitcount %d (instead of %d)\n", - bit_count, count1 + count2 )); - - /* simply ignore the operator */ - return; - } - - /* set-up new horizontal and vertical hint mask now */ - error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1, - 0, memory ); - if ( error ) - goto Fail; - - error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2, - 0, memory ); - if ( error ) - goto Fail; - } - return; - - Fail: - hints->error = error; - } - - - /* end recording session */ - static FT_Error - ps_hints_close( PS_Hints hints, - FT_UInt end_point ) - { - FT_Error error; - - - error = hints->error; - if ( !error ) - { - FT_Memory memory = hints->memory; - PS_Dimension dim = hints->dimension; - - - error = ps_dimension_end( &dim[0], end_point, memory ); - if ( !error ) - { - error = ps_dimension_end( &dim[1], end_point, memory ); - } - } - -#ifdef DEBUG_HINTER - if ( !error ) - ps_debug_hints = hints; -#endif - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE 1 HINTS RECORDING INTERFACE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - t1_hints_open( T1_Hints hints ) - { - ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 ); - } - - static void - t1_hints_stem( T1_Hints hints, - FT_Int dimension, - FT_Fixed* coords ) - { - FT_Pos stems[2]; - - - stems[0] = FIXED_TO_INT( coords[0] ); - stems[1] = FIXED_TO_INT( coords[1] ); - - ps_hints_stem( (PS_Hints)hints, dimension, 1, stems ); - } - - - FT_LOCAL_DEF( void ) - t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ) - { - FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) ); - - funcs->open = (T1_Hints_OpenFunc) t1_hints_open; - funcs->close = (T1_Hints_CloseFunc) ps_hints_close; - funcs->stem = (T1_Hints_SetStemFunc) t1_hints_stem; - funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3; - funcs->reset = (T1_Hints_ResetFunc) ps_hints_t1reset; - funcs->apply = (T1_Hints_ApplyFunc) ps_hints_apply; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** TYPE 2 HINTS RECORDING INTERFACE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - t2_hints_open( T2_Hints hints ) - { - ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 ); - } - - - static void - t2_hints_stems( T2_Hints hints, - FT_Int dimension, - FT_Int count, - FT_Fixed* coords ) - { - FT_Pos stems[32], y, n; - FT_Int total = count; - - - y = 0; - while ( total > 0 ) - { - /* determine number of stems to write */ - count = total; - if ( count > 16 ) - count = 16; - - /* compute integer stem positions in font units */ - for ( n = 0; n < count * 2; n++ ) - { - y += coords[n]; - stems[n] = FIXED_TO_INT( y ); - } - - /* compute lengths */ - for ( n = 0; n < count * 2; n += 2 ) - stems[n + 1] = stems[n + 1] - stems[n]; - - /* add them to the current dimension */ - ps_hints_stem( (PS_Hints)hints, dimension, count, stems ); - - total -= count; - } - } - - - FT_LOCAL_DEF( void ) - t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ) - { - FT_MEM_ZERO( funcs, sizeof ( *funcs ) ); - - funcs->open = (T2_Hints_OpenFunc) t2_hints_open; - funcs->close = (T2_Hints_CloseFunc) ps_hints_close; - funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems; - funcs->hintmask= (T2_Hints_MaskFunc) ps_hints_t2mask; - funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter; - funcs->apply = (T2_Hints_ApplyFunc) ps_hints_apply; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/pshinter/pshrec.h b/android/jni/ndk_modules/freetype/src/pshinter/pshrec.h deleted file mode 100644 index dcb3197f..00000000 --- a/android/jni/ndk_modules/freetype/src/pshinter/pshrec.h +++ /dev/null @@ -1,176 +0,0 @@ -/***************************************************************************/ -/* */ -/* pshrec.h */ -/* */ -/* Postscript (Type1/Type2) hints recorder (specification). */ -/* */ -/* Copyright 2001, 2002, 2003, 2006, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /**************************************************************************/ - /* */ - /* The functions defined here are called from the Type 1, CID and CFF */ - /* font drivers to record the hints of a given character/glyph. */ - /* */ - /* The hints are recorded in a unified format, and are later processed */ - /* by the `optimizer' and `fitter' to adjust the outlines to the pixel */ - /* grid. */ - /* */ - /**************************************************************************/ - - -#ifndef __PSHREC_H__ -#define __PSHREC_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_HINTS_H -#include "pshglob.h" - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GLYPH HINTS RECORDER INTERNALS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* handle to hint record */ - typedef struct PS_HintRec_* PS_Hint; - - /* hint types */ - typedef enum PS_Hint_Type_ - { - PS_HINT_TYPE_1 = 1, - PS_HINT_TYPE_2 = 2 - - } PS_Hint_Type; - - - /* hint flags */ - typedef enum PS_Hint_Flags_ - { - PS_HINT_FLAG_GHOST = 1, - PS_HINT_FLAG_BOTTOM = 2 - - } PS_Hint_Flags; - - - /* hint descriptor */ - typedef struct PS_HintRec_ - { - FT_Int pos; - FT_Int len; - FT_UInt flags; - - } PS_HintRec; - - -#define ps_hint_is_active( x ) ( (x)->flags & PS_HINT_FLAG_ACTIVE ) -#define ps_hint_is_ghost( x ) ( (x)->flags & PS_HINT_FLAG_GHOST ) -#define ps_hint_is_bottom( x ) ( (x)->flags & PS_HINT_FLAG_BOTTOM ) - - - /* hints table descriptor */ - typedef struct PS_Hint_TableRec_ - { - FT_UInt num_hints; - FT_UInt max_hints; - PS_Hint hints; - - } PS_Hint_TableRec, *PS_Hint_Table; - - - /* hint and counter mask descriptor */ - typedef struct PS_MaskRec_ - { - FT_UInt num_bits; - FT_UInt max_bits; - FT_Byte* bytes; - FT_UInt end_point; - - } PS_MaskRec, *PS_Mask; - - - /* masks and counters table descriptor */ - typedef struct PS_Mask_TableRec_ - { - FT_UInt num_masks; - FT_UInt max_masks; - PS_Mask masks; - - } PS_Mask_TableRec, *PS_Mask_Table; - - - /* dimension-specific hints descriptor */ - typedef struct PS_DimensionRec_ - { - PS_Hint_TableRec hints; - PS_Mask_TableRec masks; - PS_Mask_TableRec counters; - - } PS_DimensionRec, *PS_Dimension; - - - /* glyph hints descriptor */ - /* dimension 0 => X coordinates + vertical hints/stems */ - /* dimension 1 => Y coordinates + horizontal hints/stems */ - typedef struct PS_HintsRec_ - { - FT_Memory memory; - FT_Error error; - FT_UInt32 magic; - PS_Hint_Type hint_type; - PS_DimensionRec dimension[2]; - - } PS_HintsRec, *PS_Hints; - - /* */ - - /* initialize hints recorder */ - FT_LOCAL( FT_Error ) - ps_hints_init( PS_Hints hints, - FT_Memory memory ); - - /* finalize hints recorder */ - FT_LOCAL( void ) - ps_hints_done( PS_Hints hints ); - - /* initialize Type1 hints recorder interface */ - FT_LOCAL( void ) - t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ); - - /* initialize Type2 hints recorder interface */ - FT_LOCAL( void ) - t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ); - - -#ifdef DEBUG_HINTER - extern PS_Hints ps_debug_hints; - extern int ps_debug_no_horz_hints; - extern int ps_debug_no_vert_hints; -#endif - - /* */ - - -FT_END_HEADER - - -#endif /* __PS_HINTER_RECORD_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/psmodule.c b/android/jni/ndk_modules/freetype/src/psnames/psmodule.c deleted file mode 100644 index 75286969..00000000 --- a/android/jni/ndk_modules/freetype/src/psnames/psmodule.c +++ /dev/null @@ -1,597 +0,0 @@ -/***************************************************************************/ -/* */ -/* psmodule.c */ -/* */ -/* PSNames module implementation (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H - -#include "psmodule.h" -#include "pstables.h" - -#include "psnamerr.h" -#include "pspic.h" - - -#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES - - -#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - - -#define VARIANT_BIT 0x80000000UL -#define BASE_GLYPH( code ) ( (FT_UInt32)( (code) & ~VARIANT_BIT ) ) - - - /* Return the Unicode value corresponding to a given glyph. Note that */ - /* we do deal with glyph variants by detecting a non-initial dot in */ - /* the name, as in `A.swash' or `e.final'; in this case, the */ - /* VARIANT_BIT is set in the return value. */ - /* */ - static FT_UInt32 - ps_unicode_value( const char* glyph_name ) - { - /* If the name begins with `uni', then the glyph name may be a */ - /* hard-coded unicode character code. */ - if ( glyph_name[0] == 'u' && - glyph_name[1] == 'n' && - glyph_name[2] == 'i' ) - { - /* determine whether the next four characters following are */ - /* hexadecimal. */ - - /* XXX: Add code to deal with ligatures, i.e. glyph names like */ - /* `uniXXXXYYYYZZZZ'... */ - - FT_Int count; - FT_UInt32 value = 0; - const char* p = glyph_name + 3; - - - for ( count = 4; count > 0; count--, p++ ) - { - char c = *p; - unsigned int d; - - - d = (unsigned char)c - '0'; - if ( d >= 10 ) - { - d = (unsigned char)c - 'A'; - if ( d >= 6 ) - d = 16; - else - d += 10; - } - - /* Exit if a non-uppercase hexadecimal character was found */ - /* -- this also catches character codes below `0' since such */ - /* negative numbers cast to `unsigned int' are far too big. */ - if ( d >= 16 ) - break; - - value = ( value << 4 ) + d; - } - - /* there must be exactly four hex digits */ - if ( count == 0 ) - { - if ( *p == '\0' ) - return value; - if ( *p == '.' ) - return (FT_UInt32)( value | VARIANT_BIT ); - } - } - - /* If the name begins with `u', followed by four to six uppercase */ - /* hexadecimal digits, it is a hard-coded unicode character code. */ - if ( glyph_name[0] == 'u' ) - { - FT_Int count; - FT_UInt32 value = 0; - const char* p = glyph_name + 1; - - - for ( count = 6; count > 0; count--, p++ ) - { - char c = *p; - unsigned int d; - - - d = (unsigned char)c - '0'; - if ( d >= 10 ) - { - d = (unsigned char)c - 'A'; - if ( d >= 6 ) - d = 16; - else - d += 10; - } - - if ( d >= 16 ) - break; - - value = ( value << 4 ) + d; - } - - if ( count <= 2 ) - { - if ( *p == '\0' ) - return value; - if ( *p == '.' ) - return (FT_UInt32)( value | VARIANT_BIT ); - } - } - - /* Look for a non-initial dot in the glyph name in order to */ - /* find variants like `A.swash', `e.final', etc. */ - { - const char* p = glyph_name; - const char* dot = NULL; - - - for ( ; *p; p++ ) - { - if ( *p == '.' && p > glyph_name ) - { - dot = p; - break; - } - } - - /* now look up the glyph in the Adobe Glyph List */ - if ( !dot ) - return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p ); - else - return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) | - VARIANT_BIT ); - } - } - - - /* ft_qsort callback to sort the unicode map */ - FT_CALLBACK_DEF( int ) - compare_uni_maps( const void* a, - const void* b ) - { - PS_UniMap* map1 = (PS_UniMap*)a; - PS_UniMap* map2 = (PS_UniMap*)b; - FT_UInt32 unicode1 = BASE_GLYPH( map1->unicode ); - FT_UInt32 unicode2 = BASE_GLYPH( map2->unicode ); - - - /* sort base glyphs before glyph variants */ - if ( unicode1 == unicode2 ) - { - if ( map1->unicode > map2->unicode ) - return 1; - else if ( map1->unicode < map2->unicode ) - return -1; - else - return 0; - } - else - { - if ( unicode1 > unicode2 ) - return 1; - else if ( unicode1 < unicode2 ) - return -1; - else - return 0; - } - } - - - /* support for extra glyphs not handled (well) in AGL; */ - /* we add extra mappings for them if necessary */ - -#define EXTRA_GLYPH_LIST_SIZE 10 - - static const FT_UInt32 ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] = - { - /* WGL 4 */ - 0x0394, - 0x03A9, - 0x2215, - 0x00AD, - 0x02C9, - 0x03BC, - 0x2219, - 0x00A0, - /* Romanian */ - 0x021A, - 0x021B - }; - - static const char ft_extra_glyph_names[] = - { - 'D','e','l','t','a',0, - 'O','m','e','g','a',0, - 'f','r','a','c','t','i','o','n',0, - 'h','y','p','h','e','n',0, - 'm','a','c','r','o','n',0, - 'm','u',0, - 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0, - 's','p','a','c','e',0, - 'T','c','o','m','m','a','a','c','c','e','n','t',0, - 't','c','o','m','m','a','a','c','c','e','n','t',0 - }; - - static const FT_Int - ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] = - { - 0, - 6, - 12, - 21, - 28, - 35, - 38, - 53, - 59, - 72 - }; - - - static void - ps_check_extra_glyph_name( const char* gname, - FT_UInt glyph, - FT_UInt* extra_glyphs, - FT_UInt *states ) - { - FT_UInt n; - - - for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) - { - if ( ft_strcmp( ft_extra_glyph_names + - ft_extra_glyph_name_offsets[n], gname ) == 0 ) - { - if ( states[n] == 0 ) - { - /* mark this extra glyph as a candidate for the cmap */ - states[n] = 1; - extra_glyphs[n] = glyph; - } - - return; - } - } - } - - - static void - ps_check_extra_glyph_unicode( FT_UInt32 uni_char, - FT_UInt *states ) - { - FT_UInt n; - - - for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) - { - if ( uni_char == ft_extra_glyph_unicodes[n] ) - { - /* disable this extra glyph from being added to the cmap */ - states[n] = 2; - - return; - } - } - } - - - /* Build a table that maps Unicode values to glyph indices. */ - static FT_Error - ps_unicodes_init( FT_Memory memory, - PS_Unicodes table, - FT_UInt num_glyphs, - PS_GetGlyphNameFunc get_glyph_name, - PS_FreeGlyphNameFunc free_glyph_name, - FT_Pointer glyph_data ) - { - FT_Error error; - - FT_UInt extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - FT_UInt extra_glyphs[EXTRA_GLYPH_LIST_SIZE]; - - - /* we first allocate the table */ - table->num_maps = 0; - table->maps = 0; - - if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) ) - { - FT_UInt n; - FT_UInt count; - PS_UniMap* map; - FT_UInt32 uni_char; - - - map = table->maps; - - for ( n = 0; n < num_glyphs; n++ ) - { - const char* gname = get_glyph_name( glyph_data, n ); - - - if ( gname ) - { - ps_check_extra_glyph_name( gname, n, - extra_glyphs, extra_glyph_list_states ); - uni_char = ps_unicode_value( gname ); - - if ( BASE_GLYPH( uni_char ) != 0 ) - { - ps_check_extra_glyph_unicode( uni_char, - extra_glyph_list_states ); - map->unicode = uni_char; - map->glyph_index = n; - map++; - } - - if ( free_glyph_name ) - free_glyph_name( glyph_data, gname ); - } - } - - for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) - { - if ( extra_glyph_list_states[n] == 1 ) - { - /* This glyph name has an additional representation. */ - /* Add it to the cmap. */ - - map->unicode = ft_extra_glyph_unicodes[n]; - map->glyph_index = extra_glyphs[n]; - map++; - } - } - - /* now compress the table a bit */ - count = (FT_UInt)( map - table->maps ); - - if ( count == 0 ) - { - /* No unicode chars here! */ - FT_FREE( table->maps ); - if ( !error ) - error = PSnames_Err_No_Unicode_Glyph_Name; - } - else - { - /* Reallocate if the number of used entries is much smaller. */ - if ( count < num_glyphs / 2 ) - { - (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count ); - error = PSnames_Err_Ok; - } - - /* Sort the table in increasing order of unicode values, */ - /* taking care of glyph variants. */ - ft_qsort( table->maps, count, sizeof ( PS_UniMap ), - compare_uni_maps ); - } - - table->num_maps = count; - } - - return error; - } - - - static FT_UInt - ps_unicodes_char_index( PS_Unicodes table, - FT_UInt32 unicode ) - { - PS_UniMap *min, *max, *mid, *result = NULL; - - - /* Perform a binary search on the table. */ - - min = table->maps; - max = min + table->num_maps - 1; - - while ( min <= max ) - { - FT_UInt32 base_glyph; - - - mid = min + ( ( max - min ) >> 1 ); - - if ( mid->unicode == unicode ) - { - result = mid; - break; - } - - base_glyph = BASE_GLYPH( mid->unicode ); - - if ( base_glyph == unicode ) - result = mid; /* remember match but continue search for base glyph */ - - if ( min == max ) - break; - - if ( base_glyph < unicode ) - min = mid + 1; - else - max = mid - 1; - } - - if ( result ) - return result->glyph_index; - else - return 0; - } - - - static FT_UInt32 - ps_unicodes_char_next( PS_Unicodes table, - FT_UInt32 *unicode ) - { - FT_UInt result = 0; - FT_UInt32 char_code = *unicode + 1; - - - { - FT_UInt min = 0; - FT_UInt max = table->num_maps; - FT_UInt mid; - PS_UniMap* map; - FT_UInt32 base_glyph; - - - while ( min < max ) - { - mid = min + ( ( max - min ) >> 1 ); - map = table->maps + mid; - - if ( map->unicode == char_code ) - { - result = map->glyph_index; - goto Exit; - } - - base_glyph = BASE_GLYPH( map->unicode ); - - if ( base_glyph == char_code ) - result = map->glyph_index; - - if ( base_glyph < char_code ) - min = mid + 1; - else - max = mid; - } - - if ( result ) - goto Exit; /* we have a variant glyph */ - - /* we didn't find it; check whether we have a map just above it */ - char_code = 0; - - if ( min < table->num_maps ) - { - map = table->maps + min; - result = map->glyph_index; - char_code = BASE_GLYPH( map->unicode ); - } - } - - Exit: - *unicode = char_code; - return result; - } - - -#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ - - - static const char* - ps_get_macintosh_name( FT_UInt name_index ) - { - if ( name_index >= FT_NUM_MAC_NAMES ) - name_index = 0; - - return ft_standard_glyph_names + ft_mac_names[name_index]; - } - - - static const char* - ps_get_standard_strings( FT_UInt sid ) - { - if ( sid >= FT_NUM_SID_NAMES ) - return 0; - - return ft_standard_glyph_names + ft_sid_names[sid]; - } - - -#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - FT_DEFINE_SERVICE_PSCMAPSREC(pscmaps_interface, - (PS_Unicode_ValueFunc) ps_unicode_value, - (PS_Unicodes_InitFunc) ps_unicodes_init, - (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, - (PS_Unicodes_CharNextFunc) ps_unicodes_char_next, - - (PS_Macintosh_NameFunc) ps_get_macintosh_name, - (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, - - t1_standard_encoding, - t1_expert_encoding - ) - -#else - - FT_DEFINE_SERVICE_PSCMAPSREC(pscmaps_interface, - 0, - 0, - 0, - 0, - - (PS_Macintosh_NameFunc) ps_get_macintosh_name, - (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, - - t1_standard_encoding, - t1_expert_encoding - ) - -#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ - - - FT_DEFINE_SERVICEDESCREC1(pscmaps_services, - FT_SERVICE_ID_POSTSCRIPT_CMAPS, &FT_PSCMAPS_INTERFACE_GET - ) - - - - - static FT_Pointer - psnames_get_service( FT_Module module, - const char* service_id ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( FT_PSCMAPS_SERVICES_GET, service_id ); - } - -#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ - - -#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES -#define PUT_PS_NAMES_SERVICE(a) 0 -#else -#define PUT_PS_NAMES_SERVICE(a) a -#endif - - FT_DEFINE_MODULE(psnames_module_class, - - 0, /* this is not a font driver, nor a renderer */ - sizeof ( FT_ModuleRec ), - - "psnames", /* driver name */ - 0x10000L, /* driver version */ - 0x20000L, /* driver requires FreeType 2 or above */ - - PUT_PS_NAMES_SERVICE((void*)&FT_PSCMAPS_INTERFACE_GET), /* module specific interface */ - (FT_Module_Constructor)0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) PUT_PS_NAMES_SERVICE(psnames_get_service) - ) - - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/psmodule.h b/android/jni/ndk_modules/freetype/src/psnames/psmodule.h deleted file mode 100644 index 28fa1480..00000000 --- a/android/jni/ndk_modules/freetype/src/psnames/psmodule.h +++ /dev/null @@ -1,38 +0,0 @@ -/***************************************************************************/ -/* */ -/* psmodule.h */ -/* */ -/* High-level PSNames module interface (specification). */ -/* */ -/* Copyright 1996-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __PSMODULE_H__ -#define __PSMODULE_H__ - - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - FT_DECLARE_MODULE( psnames_module_class ) - - -FT_END_HEADER - -#endif /* __PSMODULE_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/psnamerr.h b/android/jni/ndk_modules/freetype/src/psnames/psnamerr.h deleted file mode 100644 index ae1541d9..00000000 --- a/android/jni/ndk_modules/freetype/src/psnames/psnamerr.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* psnamerr.h */ -/* */ -/* PS names module error codes (specification only). */ -/* */ -/* Copyright 2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the PS names module error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __PSNAMERR_H__ -#define __PSNAMERR_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#define FT_ERR_PREFIX PSnames_Err_ -#define FT_ERR_BASE FT_Mod_Err_PSnames - -#include FT_ERRORS_H - -#endif /* __PSNAMERR_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/psnames.c b/android/jni/ndk_modules/freetype/src/psnames/psnames.c deleted file mode 100644 index 1ede225d..00000000 --- a/android/jni/ndk_modules/freetype/src/psnames/psnames.c +++ /dev/null @@ -1,26 +0,0 @@ -/***************************************************************************/ -/* */ -/* psnames.c */ -/* */ -/* FreeType PSNames module component (body only). */ -/* */ -/* Copyright 1996-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "pspic.c" -#include "psmodule.c" - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/pspic.c b/android/jni/ndk_modules/freetype/src/psnames/pspic.c deleted file mode 100644 index b9075d5a..00000000 --- a/android/jni/ndk_modules/freetype/src/psnames/pspic.c +++ /dev/null @@ -1,79 +0,0 @@ -/***************************************************************************/ -/* */ -/* pspic.c */ -/* */ -/* The FreeType position independent code services for psnames module. */ -/* */ -/* Copyright 2009, 2010 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "pspic.h" - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from psmodule.c */ - FT_Error FT_Create_Class_pscmaps_services( FT_Library, FT_ServiceDescRec**); - void FT_Destroy_Class_pscmaps_services( FT_Library, FT_ServiceDescRec*); - void FT_Init_Class_pscmaps_interface( FT_Library, FT_Service_PsCMapsRec*); - - void - psnames_module_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - if ( pic_container->psnames ) - { - PSModulePIC* container = (PSModulePIC*)pic_container->psnames; - if(container->pscmaps_services) - FT_Destroy_Class_pscmaps_services(library, container->pscmaps_services); - container->pscmaps_services = NULL; - FT_FREE( container ); - pic_container->psnames = NULL; - } - } - - - FT_Error - psnames_module_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = PSnames_Err_Ok; - PSModulePIC* container; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof(*container) ); - pic_container->psnames = container; - - /* initialize pointer table - this is how the module usually expects this data */ - error = FT_Create_Class_pscmaps_services(library, &container->pscmaps_services); - if(error) - goto Exit; - FT_Init_Class_pscmaps_interface(library, &container->pscmaps_interface); - -Exit: - if(error) - psnames_module_class_pic_free(library); - return error; - } - - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/pspic.h b/android/jni/ndk_modules/freetype/src/psnames/pspic.h deleted file mode 100644 index 75a14fdc..00000000 --- a/android/jni/ndk_modules/freetype/src/psnames/pspic.h +++ /dev/null @@ -1,54 +0,0 @@ -/***************************************************************************/ -/* */ -/* pspic.h */ -/* */ -/* The FreeType position independent code services for psnames module. */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __PSPIC_H__ -#define __PSPIC_H__ - - -FT_BEGIN_HEADER - -#include FT_INTERNAL_PIC_H - -#ifndef FT_CONFIG_OPTION_PIC -#define FT_PSCMAPS_SERVICES_GET pscmaps_services -#define FT_PSCMAPS_INTERFACE_GET pscmaps_interface - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_SERVICE_POSTSCRIPT_CMAPS_H - - typedef struct PSModulePIC_ - { - FT_ServiceDescRec* pscmaps_services; - FT_Service_PsCMapsRec pscmaps_interface; - } PSModulePIC; - -#define GET_PIC(lib) ((PSModulePIC*)((lib)->pic_container.psnames)) -#define FT_PSCMAPS_SERVICES_GET (GET_PIC(library)->pscmaps_services) -#define FT_PSCMAPS_INTERFACE_GET (GET_PIC(library)->pscmaps_interface) - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* __PSPIC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/psnames/pstables.h b/android/jni/ndk_modules/freetype/src/psnames/pstables.h deleted file mode 100644 index 1521e9c2..00000000 --- a/android/jni/ndk_modules/freetype/src/psnames/pstables.h +++ /dev/null @@ -1,4095 +0,0 @@ -/***************************************************************************/ -/* */ -/* pstables.h */ -/* */ -/* PostScript glyph names. */ -/* */ -/* Copyright 2005, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /* This file has been generated automatically -- do not edit! */ - - - static const char ft_standard_glyph_names[3696] = - { - '.','n','u','l','l', 0, - 'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0, - 'n','o','t','e','q','u','a','l', 0, - 'i','n','f','i','n','i','t','y', 0, - 'l','e','s','s','e','q','u','a','l', 0, - 'g','r','e','a','t','e','r','e','q','u','a','l', 0, - 'p','a','r','t','i','a','l','d','i','f','f', 0, - 's','u','m','m','a','t','i','o','n', 0, - 'p','r','o','d','u','c','t', 0, - 'p','i', 0, - 'i','n','t','e','g','r','a','l', 0, - 'O','m','e','g','a', 0, - 'r','a','d','i','c','a','l', 0, - 'a','p','p','r','o','x','e','q','u','a','l', 0, - 'D','e','l','t','a', 0, - 'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0, - 'l','o','z','e','n','g','e', 0, - 'a','p','p','l','e', 0, - 'f','r','a','n','c', 0, - 'G','b','r','e','v','e', 0, - 'g','b','r','e','v','e', 0, - 'I','d','o','t','a','c','c','e','n','t', 0, - 'S','c','e','d','i','l','l','a', 0, - 's','c','e','d','i','l','l','a', 0, - 'C','a','c','u','t','e', 0, - 'c','a','c','u','t','e', 0, - 'C','c','a','r','o','n', 0, - 'c','c','a','r','o','n', 0, - 'd','c','r','o','a','t', 0, - '.','n','o','t','d','e','f', 0, - 's','p','a','c','e', 0, - 'e','x','c','l','a','m', 0, - 'q','u','o','t','e','d','b','l', 0, - 'n','u','m','b','e','r','s','i','g','n', 0, - 'd','o','l','l','a','r', 0, - 'p','e','r','c','e','n','t', 0, - 'a','m','p','e','r','s','a','n','d', 0, - 'q','u','o','t','e','r','i','g','h','t', 0, - 'p','a','r','e','n','l','e','f','t', 0, - 'p','a','r','e','n','r','i','g','h','t', 0, - 'a','s','t','e','r','i','s','k', 0, - 'p','l','u','s', 0, - 'c','o','m','m','a', 0, - 'h','y','p','h','e','n', 0, - 'p','e','r','i','o','d', 0, - 's','l','a','s','h', 0, - 'z','e','r','o', 0, - 'o','n','e', 0, - 't','w','o', 0, - 't','h','r','e','e', 0, - 'f','o','u','r', 0, - 'f','i','v','e', 0, - 's','i','x', 0, - 's','e','v','e','n', 0, - 'e','i','g','h','t', 0, - 'n','i','n','e', 0, - 'c','o','l','o','n', 0, - 's','e','m','i','c','o','l','o','n', 0, - 'l','e','s','s', 0, - 'e','q','u','a','l', 0, - 'g','r','e','a','t','e','r', 0, - 'q','u','e','s','t','i','o','n', 0, - 'a','t', 0, - 'A', 0, - 'B', 0, - 'C', 0, - 'D', 0, - 'E', 0, - 'F', 0, - 'G', 0, - 'H', 0, - 'I', 0, - 'J', 0, - 'K', 0, - 'L', 0, - 'M', 0, - 'N', 0, - 'O', 0, - 'P', 0, - 'Q', 0, - 'R', 0, - 'S', 0, - 'T', 0, - 'U', 0, - 'V', 0, - 'W', 0, - 'X', 0, - 'Y', 0, - 'Z', 0, - 'b','r','a','c','k','e','t','l','e','f','t', 0, - 'b','a','c','k','s','l','a','s','h', 0, - 'b','r','a','c','k','e','t','r','i','g','h','t', 0, - 'a','s','c','i','i','c','i','r','c','u','m', 0, - 'u','n','d','e','r','s','c','o','r','e', 0, - 'q','u','o','t','e','l','e','f','t', 0, - 'a', 0, - 'b', 0, - 'c', 0, - 'd', 0, - 'e', 0, - 'f', 0, - 'g', 0, - 'h', 0, - 'i', 0, - 'j', 0, - 'k', 0, - 'l', 0, - 'm', 0, - 'n', 0, - 'o', 0, - 'p', 0, - 'q', 0, - 'r', 0, - 's', 0, - 't', 0, - 'u', 0, - 'v', 0, - 'w', 0, - 'x', 0, - 'y', 0, - 'z', 0, - 'b','r','a','c','e','l','e','f','t', 0, - 'b','a','r', 0, - 'b','r','a','c','e','r','i','g','h','t', 0, - 'a','s','c','i','i','t','i','l','d','e', 0, - 'e','x','c','l','a','m','d','o','w','n', 0, - 'c','e','n','t', 0, - 's','t','e','r','l','i','n','g', 0, - 'f','r','a','c','t','i','o','n', 0, - 'y','e','n', 0, - 'f','l','o','r','i','n', 0, - 's','e','c','t','i','o','n', 0, - 'c','u','r','r','e','n','c','y', 0, - 'q','u','o','t','e','s','i','n','g','l','e', 0, - 'q','u','o','t','e','d','b','l','l','e','f','t', 0, - 'g','u','i','l','l','e','m','o','t','l','e','f','t', 0, - 'g','u','i','l','s','i','n','g','l','l','e','f','t', 0, - 'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0, - 'f','i', 0, - 'f','l', 0, - 'e','n','d','a','s','h', 0, - 'd','a','g','g','e','r', 0, - 'd','a','g','g','e','r','d','b','l', 0, - 'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0, - 'p','a','r','a','g','r','a','p','h', 0, - 'b','u','l','l','e','t', 0, - 'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0, - 'q','u','o','t','e','d','b','l','b','a','s','e', 0, - 'q','u','o','t','e','d','b','l','r','i','g','h','t', 0, - 'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0, - 'e','l','l','i','p','s','i','s', 0, - 'p','e','r','t','h','o','u','s','a','n','d', 0, - 'q','u','e','s','t','i','o','n','d','o','w','n', 0, - 'g','r','a','v','e', 0, - 'a','c','u','t','e', 0, - 'c','i','r','c','u','m','f','l','e','x', 0, - 't','i','l','d','e', 0, - 'm','a','c','r','o','n', 0, - 'b','r','e','v','e', 0, - 'd','o','t','a','c','c','e','n','t', 0, - 'd','i','e','r','e','s','i','s', 0, - 'r','i','n','g', 0, - 'c','e','d','i','l','l','a', 0, - 'h','u','n','g','a','r','u','m','l','a','u','t', 0, - 'o','g','o','n','e','k', 0, - 'c','a','r','o','n', 0, - 'e','m','d','a','s','h', 0, - 'A','E', 0, - 'o','r','d','f','e','m','i','n','i','n','e', 0, - 'L','s','l','a','s','h', 0, - 'O','s','l','a','s','h', 0, - 'O','E', 0, - 'o','r','d','m','a','s','c','u','l','i','n','e', 0, - 'a','e', 0, - 'd','o','t','l','e','s','s','i', 0, - 'l','s','l','a','s','h', 0, - 'o','s','l','a','s','h', 0, - 'o','e', 0, - 'g','e','r','m','a','n','d','b','l','s', 0, - 'o','n','e','s','u','p','e','r','i','o','r', 0, - 'l','o','g','i','c','a','l','n','o','t', 0, - 'm','u', 0, - 't','r','a','d','e','m','a','r','k', 0, - 'E','t','h', 0, - 'o','n','e','h','a','l','f', 0, - 'p','l','u','s','m','i','n','u','s', 0, - 'T','h','o','r','n', 0, - 'o','n','e','q','u','a','r','t','e','r', 0, - 'd','i','v','i','d','e', 0, - 'b','r','o','k','e','n','b','a','r', 0, - 'd','e','g','r','e','e', 0, - 't','h','o','r','n', 0, - 't','h','r','e','e','q','u','a','r','t','e','r','s', 0, - 't','w','o','s','u','p','e','r','i','o','r', 0, - 'r','e','g','i','s','t','e','r','e','d', 0, - 'm','i','n','u','s', 0, - 'e','t','h', 0, - 'm','u','l','t','i','p','l','y', 0, - 't','h','r','e','e','s','u','p','e','r','i','o','r', 0, - 'c','o','p','y','r','i','g','h','t', 0, - 'A','a','c','u','t','e', 0, - 'A','c','i','r','c','u','m','f','l','e','x', 0, - 'A','d','i','e','r','e','s','i','s', 0, - 'A','g','r','a','v','e', 0, - 'A','r','i','n','g', 0, - 'A','t','i','l','d','e', 0, - 'C','c','e','d','i','l','l','a', 0, - 'E','a','c','u','t','e', 0, - 'E','c','i','r','c','u','m','f','l','e','x', 0, - 'E','d','i','e','r','e','s','i','s', 0, - 'E','g','r','a','v','e', 0, - 'I','a','c','u','t','e', 0, - 'I','c','i','r','c','u','m','f','l','e','x', 0, - 'I','d','i','e','r','e','s','i','s', 0, - 'I','g','r','a','v','e', 0, - 'N','t','i','l','d','e', 0, - 'O','a','c','u','t','e', 0, - 'O','c','i','r','c','u','m','f','l','e','x', 0, - 'O','d','i','e','r','e','s','i','s', 0, - 'O','g','r','a','v','e', 0, - 'O','t','i','l','d','e', 0, - 'S','c','a','r','o','n', 0, - 'U','a','c','u','t','e', 0, - 'U','c','i','r','c','u','m','f','l','e','x', 0, - 'U','d','i','e','r','e','s','i','s', 0, - 'U','g','r','a','v','e', 0, - 'Y','a','c','u','t','e', 0, - 'Y','d','i','e','r','e','s','i','s', 0, - 'Z','c','a','r','o','n', 0, - 'a','a','c','u','t','e', 0, - 'a','c','i','r','c','u','m','f','l','e','x', 0, - 'a','d','i','e','r','e','s','i','s', 0, - 'a','g','r','a','v','e', 0, - 'a','r','i','n','g', 0, - 'a','t','i','l','d','e', 0, - 'c','c','e','d','i','l','l','a', 0, - 'e','a','c','u','t','e', 0, - 'e','c','i','r','c','u','m','f','l','e','x', 0, - 'e','d','i','e','r','e','s','i','s', 0, - 'e','g','r','a','v','e', 0, - 'i','a','c','u','t','e', 0, - 'i','c','i','r','c','u','m','f','l','e','x', 0, - 'i','d','i','e','r','e','s','i','s', 0, - 'i','g','r','a','v','e', 0, - 'n','t','i','l','d','e', 0, - 'o','a','c','u','t','e', 0, - 'o','c','i','r','c','u','m','f','l','e','x', 0, - 'o','d','i','e','r','e','s','i','s', 0, - 'o','g','r','a','v','e', 0, - 'o','t','i','l','d','e', 0, - 's','c','a','r','o','n', 0, - 'u','a','c','u','t','e', 0, - 'u','c','i','r','c','u','m','f','l','e','x', 0, - 'u','d','i','e','r','e','s','i','s', 0, - 'u','g','r','a','v','e', 0, - 'y','a','c','u','t','e', 0, - 'y','d','i','e','r','e','s','i','s', 0, - 'z','c','a','r','o','n', 0, - 'e','x','c','l','a','m','s','m','a','l','l', 0, - 'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0, - 'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0, - 'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0, - 'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0, - 'A','c','u','t','e','s','m','a','l','l', 0, - 'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0, - 'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0, - 't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0, - 'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0, - 'z','e','r','o','o','l','d','s','t','y','l','e', 0, - 'o','n','e','o','l','d','s','t','y','l','e', 0, - 't','w','o','o','l','d','s','t','y','l','e', 0, - 't','h','r','e','e','o','l','d','s','t','y','l','e', 0, - 'f','o','u','r','o','l','d','s','t','y','l','e', 0, - 'f','i','v','e','o','l','d','s','t','y','l','e', 0, - 's','i','x','o','l','d','s','t','y','l','e', 0, - 's','e','v','e','n','o','l','d','s','t','y','l','e', 0, - 'e','i','g','h','t','o','l','d','s','t','y','l','e', 0, - 'n','i','n','e','o','l','d','s','t','y','l','e', 0, - 'c','o','m','m','a','s','u','p','e','r','i','o','r', 0, - 't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0, - 'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0, - 'q','u','e','s','t','i','o','n','s','m','a','l','l', 0, - 'a','s','u','p','e','r','i','o','r', 0, - 'b','s','u','p','e','r','i','o','r', 0, - 'c','e','n','t','s','u','p','e','r','i','o','r', 0, - 'd','s','u','p','e','r','i','o','r', 0, - 'e','s','u','p','e','r','i','o','r', 0, - 'i','s','u','p','e','r','i','o','r', 0, - 'l','s','u','p','e','r','i','o','r', 0, - 'm','s','u','p','e','r','i','o','r', 0, - 'n','s','u','p','e','r','i','o','r', 0, - 'o','s','u','p','e','r','i','o','r', 0, - 'r','s','u','p','e','r','i','o','r', 0, - 's','s','u','p','e','r','i','o','r', 0, - 't','s','u','p','e','r','i','o','r', 0, - 'f','f', 0, - 'f','f','i', 0, - 'f','f','l', 0, - 'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0, - 'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0, - 'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, - 'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0, - 'G','r','a','v','e','s','m','a','l','l', 0, - 'A','s','m','a','l','l', 0, - 'B','s','m','a','l','l', 0, - 'C','s','m','a','l','l', 0, - 'D','s','m','a','l','l', 0, - 'E','s','m','a','l','l', 0, - 'F','s','m','a','l','l', 0, - 'G','s','m','a','l','l', 0, - 'H','s','m','a','l','l', 0, - 'I','s','m','a','l','l', 0, - 'J','s','m','a','l','l', 0, - 'K','s','m','a','l','l', 0, - 'L','s','m','a','l','l', 0, - 'M','s','m','a','l','l', 0, - 'N','s','m','a','l','l', 0, - 'O','s','m','a','l','l', 0, - 'P','s','m','a','l','l', 0, - 'Q','s','m','a','l','l', 0, - 'R','s','m','a','l','l', 0, - 'S','s','m','a','l','l', 0, - 'T','s','m','a','l','l', 0, - 'U','s','m','a','l','l', 0, - 'V','s','m','a','l','l', 0, - 'W','s','m','a','l','l', 0, - 'X','s','m','a','l','l', 0, - 'Y','s','m','a','l','l', 0, - 'Z','s','m','a','l','l', 0, - 'c','o','l','o','n','m','o','n','e','t','a','r','y', 0, - 'o','n','e','f','i','t','t','e','d', 0, - 'r','u','p','i','a','h', 0, - 'T','i','l','d','e','s','m','a','l','l', 0, - 'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0, - 'c','e','n','t','o','l','d','s','t','y','l','e', 0, - 'L','s','l','a','s','h','s','m','a','l','l', 0, - 'S','c','a','r','o','n','s','m','a','l','l', 0, - 'Z','c','a','r','o','n','s','m','a','l','l', 0, - 'D','i','e','r','e','s','i','s','s','m','a','l','l', 0, - 'B','r','e','v','e','s','m','a','l','l', 0, - 'C','a','r','o','n','s','m','a','l','l', 0, - 'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0, - 'M','a','c','r','o','n','s','m','a','l','l', 0, - 'f','i','g','u','r','e','d','a','s','h', 0, - 'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0, - 'O','g','o','n','e','k','s','m','a','l','l', 0, - 'R','i','n','g','s','m','a','l','l', 0, - 'C','e','d','i','l','l','a','s','m','a','l','l', 0, - 'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0, - 'o','n','e','e','i','g','h','t','h', 0, - 't','h','r','e','e','e','i','g','h','t','h','s', 0, - 'f','i','v','e','e','i','g','h','t','h','s', 0, - 's','e','v','e','n','e','i','g','h','t','h','s', 0, - 'o','n','e','t','h','i','r','d', 0, - 't','w','o','t','h','i','r','d','s', 0, - 'z','e','r','o','s','u','p','e','r','i','o','r', 0, - 'f','o','u','r','s','u','p','e','r','i','o','r', 0, - 'f','i','v','e','s','u','p','e','r','i','o','r', 0, - 's','i','x','s','u','p','e','r','i','o','r', 0, - 's','e','v','e','n','s','u','p','e','r','i','o','r', 0, - 'e','i','g','h','t','s','u','p','e','r','i','o','r', 0, - 'n','i','n','e','s','u','p','e','r','i','o','r', 0, - 'z','e','r','o','i','n','f','e','r','i','o','r', 0, - 'o','n','e','i','n','f','e','r','i','o','r', 0, - 't','w','o','i','n','f','e','r','i','o','r', 0, - 't','h','r','e','e','i','n','f','e','r','i','o','r', 0, - 'f','o','u','r','i','n','f','e','r','i','o','r', 0, - 'f','i','v','e','i','n','f','e','r','i','o','r', 0, - 's','i','x','i','n','f','e','r','i','o','r', 0, - 's','e','v','e','n','i','n','f','e','r','i','o','r', 0, - 'e','i','g','h','t','i','n','f','e','r','i','o','r', 0, - 'n','i','n','e','i','n','f','e','r','i','o','r', 0, - 'c','e','n','t','i','n','f','e','r','i','o','r', 0, - 'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0, - 'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0, - 'c','o','m','m','a','i','n','f','e','r','i','o','r', 0, - 'A','g','r','a','v','e','s','m','a','l','l', 0, - 'A','a','c','u','t','e','s','m','a','l','l', 0, - 'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, - 'A','t','i','l','d','e','s','m','a','l','l', 0, - 'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, - 'A','r','i','n','g','s','m','a','l','l', 0, - 'A','E','s','m','a','l','l', 0, - 'C','c','e','d','i','l','l','a','s','m','a','l','l', 0, - 'E','g','r','a','v','e','s','m','a','l','l', 0, - 'E','a','c','u','t','e','s','m','a','l','l', 0, - 'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, - 'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, - 'I','g','r','a','v','e','s','m','a','l','l', 0, - 'I','a','c','u','t','e','s','m','a','l','l', 0, - 'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, - 'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, - 'E','t','h','s','m','a','l','l', 0, - 'N','t','i','l','d','e','s','m','a','l','l', 0, - 'O','g','r','a','v','e','s','m','a','l','l', 0, - 'O','a','c','u','t','e','s','m','a','l','l', 0, - 'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, - 'O','t','i','l','d','e','s','m','a','l','l', 0, - 'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, - 'O','E','s','m','a','l','l', 0, - 'O','s','l','a','s','h','s','m','a','l','l', 0, - 'U','g','r','a','v','e','s','m','a','l','l', 0, - 'U','a','c','u','t','e','s','m','a','l','l', 0, - 'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, - 'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, - 'Y','a','c','u','t','e','s','m','a','l','l', 0, - 'T','h','o','r','n','s','m','a','l','l', 0, - 'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, - '0','0','1','.','0','0','0', 0, - '0','0','1','.','0','0','1', 0, - '0','0','1','.','0','0','2', 0, - '0','0','1','.','0','0','3', 0, - 'B','l','a','c','k', 0, - 'B','o','l','d', 0, - 'B','o','o','k', 0, - 'L','i','g','h','t', 0, - 'M','e','d','i','u','m', 0, - 'R','e','g','u','l','a','r', 0, - 'R','o','m','a','n', 0, - 'S','e','m','i','b','o','l','d', 0, - }; - - -#define FT_NUM_MAC_NAMES 258 - - /* Values are offsets into the `ft_standard_glyph_names' table */ - - static const short ft_mac_names[FT_NUM_MAC_NAMES] = - { - 253, 0, 6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351, - 360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, - 436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, - 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, - 528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610, - 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, - 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, - 1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652, - 1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776, - 1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346, - 1197, 985,1031, 23,1086,1108, 32,1219, 41, 51, 730,1194, 64, 76, - 86, 94, 97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120, - 132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916, - 598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856, - 888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500, - 163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053, - 1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229, - 1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200, - 209, 218, 225, 232, 239, 246 - }; - - -#define FT_NUM_SID_NAMES 391 - - /* Values are offsets into the `ft_standard_glyph_names' table */ - - static const short ft_sid_names[FT_NUM_SID_NAMES] = - { - 253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365, - 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441, - 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502, - 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530, - 532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614, - 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, - 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707, - 712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832, - 839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985, - 991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089, - 1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197, - 1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319, - 1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443, - 1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562, - 1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680, - 1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797, - 1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973, - 1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167, - 2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319, - 2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454, - 2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552, - 2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684, - 2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860, - 2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034, - 3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220, - 3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409, - 3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586, - 3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687 - }; - - - /* the following are indices into the SID name table */ - static const unsigned short t1_standard_encoding[256] = - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 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, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110, - 0,111,112,113,114, 0,115,116,117,118,119,120,121,122, 0,123, - 0,124,125,126,127,128,129,130,131, 0,132,133, 0,134,135,136, - 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,138, 0,139, 0, 0, 0, 0,140,141,142,143, 0, 0, 0, 0, - 0,144, 0, 0, 0,145, 0, 0,146,147,148,149, 0, 0, 0, 0 - }; - - - /* the following are indices into the SID name table */ - static const unsigned short t1_expert_encoding[256] = - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1,229,230, 0,231,232,233,234,235,236,237,238, 13, 14, 15, 99, - 239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252, - 0,253,254,255,256,257, 0, 0, 0,258, 0, 0,259,260,261,262, - 0, 0,263,264,265, 0,266,109,110,267,268,269, 0,270,271,272, - 273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288, - 289,290,291,292,293,294,295,296,297,298,299,300,301,302,303, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,304,305,306, 0, 0,307,308,309,310,311, 0,312, 0, 0,313, - 0, 0,314,315, 0, 0,316,317,318, 0, 0, 0,158,155,163,319, - 320,321,322,323,324,325, 0, 0,326,150,164,169,327,328,329,330, - 331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346, - 347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362, - 363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378 - }; - - - /* - * This table is a compressed version of the Adobe Glyph List (AGL), - * optimized for efficient searching. It has been generated by the - * `glnames.py' python script located in the `src/tools' directory. - * - * The lookup function to get the Unicode value for a given string - * is defined below the table. - */ - -#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - - static const unsigned char ft_adobe_glyph_list[54791L] = - { - 0, 52, 0,106, 2,167, 3, 63, 4,220, 6,125, 9,143, 10, 23, - 11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88, - 22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107, - 32,222, 33, 55, 34,154, 35,218, 53, 84, 59,196, 68, 6, 75,183, - 83,178, 88,135, 93,242,101,165,109,185,111, 55,117,254,123, 73, - 130,238,138,206,145, 31,153,182,156,189,163,249,178,221,193, 17, - 197, 99,199,240,204, 27,204,155,210,100, 65,143, 0, 65, 0,140, - 0,175, 0,193, 1, 15, 1,147, 1,233, 1,251, 2, 7, 2, 40, - 2, 57, 2, 82, 2, 91, 2,128, 2,136, 2,154, 69,131, 0,198, - 0,150, 0,158, 0,167,225,227,245,244,101,128, 1,252,237,225, - 227,242,239,110,128, 1,226,243,237,225,236,108,128,247,230,225, - 227,245,244,101,129, 0,193, 0,185,243,237,225,236,108,128,247, - 225,226,242,229,246,101,134, 1, 2, 0,213, 0,221, 0,232, 0, - 243, 0,251, 1, 7,225,227,245,244,101,128, 30,174,227,249,242, - 233,236,236,233, 99,128, 4,208,228,239,244,226,229,236,239,119, - 128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225, - 226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99, - 4, 1, 25, 1, 32, 1,121, 1,137,225,242,239,110,128, 1,205, - 233,242, 99, 2, 1, 40, 1, 45,236,101,128, 36,182,245,237,230, - 236,229,120,134, 0,194, 1, 66, 1, 74, 1, 85, 1, 93, 1,105, - 1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236, - 239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239, - 235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247, - 226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201, 1, - 129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99, - 128, 4, 16,100, 3, 1,155, 1,165, 1,209,226,236,231,242,225, - 246,101,128, 2, 0,233,229,242,229,243,233,115,131, 0,196, 1, - 181, 1,192, 1,201,227,249,242,233,236,236,233, 99,128, 4,210, - 237,225,227,242,239,110,128, 1,222,243,237,225,236,108,128,247, - 228,239,116, 2, 1,216, 1,224,226,229,236,239,119,128, 30,160, - 237,225,227,242,239,110,128, 1,224,231,242,225,246,101,129, 0, - 192, 1,243,243,237,225,236,108,128,247,224,232,239,239,235,225, - 226,239,246,101,128, 30,162,105, 2, 2, 13, 2, 25,229,227,249, - 242,233,236,236,233, 99,128, 4,212,238,246,229,242,244,229,228, - 226,242,229,246,101,128, 2, 2,236,240,232, 97,129, 3,145, 2, - 49,244,239,238,239,115,128, 3,134,109, 2, 2, 63, 2, 71,225, - 227,242,239,110,128, 1, 0,239,238,239,243,240,225,227,101,128, - 255, 33,239,231,239,238,229,107,128, 1, 4,242,233,238,103,131, - 0,197, 2,104, 2,112, 2,120,225,227,245,244,101,128, 1,250, - 226,229,236,239,119,128, 30, 0,243,237,225,236,108,128,247,229, - 243,237,225,236,108,128,247, 97,244,233,236,228,101,129, 0,195, - 2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229, - 238,233,225,110,128, 5, 49, 66,137, 0, 66, 2,189, 2,198, 2, - 223, 3, 3, 3, 10, 3, 22, 3, 34, 3, 46, 3, 54,227,233,242, - 227,236,101,128, 36,183,228,239,116, 2, 2,206, 2,215,225,227, - 227,229,238,116,128, 30, 2,226,229,236,239,119,128, 30, 4,101, - 3, 2,231, 2,242, 2,254,227,249,242,233,236,236,233, 99,128, - 4, 17,238,225,242,237,229,238,233,225,110,128, 5, 50,244, 97, - 128, 3,146,232,239,239,107,128, 1,129,236,233,238,229,226,229, - 236,239,119,128, 30, 6,237,239,238,239,243,240,225,227,101,128, - 255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237, - 225,236,108,128,247, 98,244,239,240,226,225,114,128, 1,130, 67, - 137, 0, 67, 3, 85, 3,127, 3,193, 3,210, 3,224, 4,171, 4, - 188, 4,200, 4,212, 97, 3, 3, 93, 3,104, 3,111,225,242,237, - 229,238,233,225,110,128, 5, 62,227,245,244,101,128, 1, 6,242, - 239,110,129,246,202, 3,119,243,237,225,236,108,128,246,245, 99, - 3, 3,135, 3,142, 3,171,225,242,239,110,128, 1, 12,229,228, - 233,236,236, 97,130, 0,199, 3,155, 3,163,225,227,245,244,101, - 128, 30, 8,243,237,225,236,108,128,247,231,233,242, 99, 2, 3, - 179, 3,184,236,101,128, 36,184,245,237,230,236,229,120,128, 1, - 8,228,239,116,129, 1, 10, 3,201,225,227,227,229,238,116,128, - 1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184, - 104, 4, 3,234, 3,246, 4,161, 4,165,225,225,242,237,229,238, - 233,225,110,128, 5, 73,101, 6, 4, 4, 4, 24, 4, 35, 4,103, - 4,115, 4,136,225,226,235,232,225,243,233,225,238,227,249,242, - 233,236,236,233, 99,128, 4,188,227,249,242,233,236,236,233, 99, - 128, 4, 39,100, 2, 4, 41, 4, 85,229,243,227,229,238,228,229, - 114, 2, 4, 54, 4, 74,225,226,235,232,225,243,233,225,238,227, - 249,242,233,236,236,233, 99,128, 4,190,227,249,242,233,236,236, - 233, 99,128, 4,182,233,229,242,229,243,233,243,227,249,242,233, - 236,236,233, 99,128, 4,244,232,225,242,237,229,238,233,225,110, - 128, 5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242, - 233,236,236,233, 99,128, 4,203,246,229,242,244,233,227,225,236, - 243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4, - 184,105,128, 3,167,239,239,107,128, 1,135,233,242,227,245,237, - 230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239, - 243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225, - 110,128, 5, 81,243,237,225,236,108,128,247, 99, 68,142, 0, 68, - 4,252, 5, 10, 5, 36, 5, 96, 5,121, 5,166, 5,173, 5,231, - 5,244, 6, 0, 6, 12, 6, 28, 6, 48, 6, 57, 90,129, 1,241, - 5, 2,227,225,242,239,110,128, 1,196, 97, 2, 5, 16, 5, 27, - 225,242,237,229,238,233,225,110,128, 5, 52,230,242,233,227,225, - 110,128, 1,137, 99, 4, 5, 46, 5, 53, 5, 62, 5, 89,225,242, - 239,110,128, 1, 14,229,228,233,236,236, 97,128, 30, 16,233,242, - 99, 2, 5, 70, 5, 75,236,101,128, 36,185,245,237,230,236,229, - 248,226,229,236,239,119,128, 30, 18,242,239,225,116,128, 1, 16, - 228,239,116, 2, 5,104, 5,113,225,227,227,229,238,116,128, 30, - 10,226,229,236,239,119,128, 30, 12,101, 3, 5,129, 5,140, 5, - 150,227,249,242,233,236,236,233, 99,128, 4, 20,233,227,239,240, - 244,233, 99,128, 3,238,236,244, 97,129, 34, 6, 5,158,231,242, - 229,229,107,128, 3,148,232,239,239,107,128, 1,138,105, 2, 5, - 179, 5,218,229,242,229,243,233,115,131,246,203, 5,194, 5,202, - 5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128, - 246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231, - 242,229,229,107,128, 3,220,234,229,227,249,242,233,236,236,233, - 99,128, 4, 2,236,233,238,229,226,229,236,239,119,128, 30, 14, - 237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227, - 227,229,238,244,243,237,225,236,108,128,246,247,115, 2, 6, 34, - 6, 41,236,225,243,104,128, 1, 16,237,225,236,108,128,247,100, - 244,239,240,226,225,114,128, 1,139,122,131, 1,242, 6, 67, 6, - 75, 6,112,227,225,242,239,110,128, 1,197,101, 2, 6, 81, 6, - 101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236, - 233, 99,128, 4,224,227,249,242,233,236,236,233, 99,128, 4, 5, - 232,229,227,249,242,233,236,236,233, 99,128, 4, 15, 69,146, 0, - 69, 6,165, 6,183, 6,191, 7, 89, 7,153, 7,165, 7,183, 7, - 211, 8, 7, 8, 36, 8, 94, 8,169, 8,189, 8,208, 8,248, 9, - 44, 9,109, 9,115,225,227,245,244,101,129, 0,201, 6,175,243, - 237,225,236,108,128,247,233,226,242,229,246,101,128, 1, 20, 99, - 5, 6,203, 6,210, 6,224, 6,236, 7, 79,225,242,239,110,128, - 1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28, - 232,225,242,237,229,238,233,225,110,128, 5, 53,233,242, 99, 2, - 6,244, 6,249,236,101,128, 36,186,245,237,230,236,229,120,135, - 0,202, 7, 16, 7, 24, 7, 32, 7, 43, 7, 51, 7, 63, 7, 71, - 225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24, - 228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101, - 128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243, - 237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249, - 242,233,236,236,233, 99,128, 4, 4,100, 3, 7, 97, 7,107, 7, - 127,226,236,231,242,225,246,101,128, 2, 4,233,229,242,229,243, - 233,115,129, 0,203, 7,119,243,237,225,236,108,128,247,235,239, - 116,130, 1, 22, 7,136, 7,145,225,227,227,229,238,116,128, 1, - 22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236, - 233, 99,128, 4, 36,231,242,225,246,101,129, 0,200, 7,175,243, - 237,225,236,108,128,247,232,104, 2, 7,189, 7,200,225,242,237, - 229,238,233,225,110,128, 5, 55,239,239,235,225,226,239,246,101, - 128, 30,186,105, 3, 7,219, 7,230, 7,245,231,232,244,242,239, - 237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229, - 246,101,128, 2, 6,239,244,233,230,233,229,228,227,249,242,233, - 236,236,233, 99,128, 4,100,108, 2, 8, 13, 8, 24,227,249,242, - 233,236,236,233, 99,128, 4, 27,229,246,229,238,242,239,237,225, - 110,128, 33,106,109, 3, 8, 44, 8, 72, 8, 83,225,227,242,239, - 110,130, 1, 18, 8, 56, 8, 64,225,227,245,244,101,128, 30, 22, - 231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99, - 128, 4, 28,239,238,239,243,240,225,227,101,128,255, 37,110, 4, - 8,104, 8,115, 8,135, 8,154,227,249,242,233,236,236,233, 99, - 128, 4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233, - 236,236,233, 99,128, 4,162,103,129, 1, 74, 8,141,232,229,227, - 249,242,233,236,236,233, 99,128, 4,164,232,239,239,235,227,249, - 242,233,236,236,233, 99,128, 4,199,111, 2, 8,175, 8,183,231, - 239,238,229,107,128, 1, 24,240,229,110,128, 1,144,240,243,233, - 236,239,110,129, 3,149, 8,200,244,239,238,239,115,128, 3,136, - 114, 2, 8,214, 8,225,227,249,242,233,236,236,233, 99,128, 4, - 32,229,246,229,242,243,229,100,129, 1,142, 8,237,227,249,242, - 233,236,236,233, 99,128, 4, 45,115, 4, 9, 2, 9, 13, 9, 33, - 9, 37,227,249,242,233,236,236,233, 99,128, 4, 33,228,229,243, - 227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4, - 170,104,128, 1,169,237,225,236,108,128,247,101,116, 3, 9, 52, - 9, 78, 9, 92, 97,130, 3,151, 9, 60, 9, 70,242,237,229,238, - 233,225,110,128, 5, 56,244,239,238,239,115,128, 3,137,104,129, - 0,208, 9, 84,243,237,225,236,108,128,247,240,233,236,228,101, - 129, 30,188, 9,101,226,229,236,239,119,128, 30, 26,245,242,111, - 128, 32,172,250,104,130, 1,183, 9,124, 9,132,227,225,242,239, - 110,128, 1,238,242,229,246,229,242,243,229,100,128, 1,184, 70, - 136, 0, 70, 9,163, 9,172, 9,184, 9,212, 9,219, 9,248, 10, - 4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225, - 227,227,229,238,116,128, 30, 30,101, 2, 9,190, 9,202,232,225, - 242,237,229,238,233,225,110,128, 5, 86,233,227,239,240,244,233, - 99,128, 3,228,232,239,239,107,128, 1,145,105, 2, 9,225, 9, - 238,244,225,227,249,242,233,236,236,233, 99,128, 4,114,246,229, - 242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227, - 101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243, - 237,225,236,108,128,247,102, 71,140, 0, 71, 10, 51, 10, 61, 10, - 107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11, - 90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97, 3, 10, - 69, 10, 76, 10, 94,227,245,244,101,128, 1,244,237,237, 97,129, - 3,147, 10, 84,225,230,242,233,227,225,110,128, 1,148,238,231, - 233,225,227,239,240,244,233, 99,128, 3,234,226,242,229,246,101, - 128, 1, 30, 99, 4, 10,125, 10,132, 10,141, 10,163,225,242,239, - 110,128, 1,230,229,228,233,236,236, 97,128, 1, 34,233,242, 99, - 2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120, - 128, 1, 28,239,237,237,225,225,227,227,229,238,116,128, 1, 34, - 228,239,116,129, 1, 32, 10,184,225,227,227,229,238,116,128, 1, - 32,229,227,249,242,233,236,236,233, 99,128, 4, 19,104, 3, 10, - 213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128, - 5, 66,101, 3, 10,234, 10,255, 11, 16,237,233,228,228,236,229, - 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,148,243, - 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,146, - 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4, - 144,239,239,107,128, 1,147,233,237,225,242,237,229,238,233,225, - 110,128, 5, 51,234,229,227,249,242,233,236,236,233, 99,128, 4, - 3,109, 2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239, - 238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246, - 206, 11, 99,243,237,225,236,108,128,247, 96,115, 2, 11,113, 11, - 129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128, 2, - 155,244,242,239,235,101,128, 1,228, 72,140, 0, 72, 11,165, 11, - 190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12, - 157, 12,165, 12,189,177,184, 53, 3, 11,175, 11,180, 11,185,179, - 51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178, - 176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203, - 97, 3, 11,216, 11,236, 12, 0,225,226,235,232,225,243,233,225, - 238,227,249,242,233,236,236,233, 99,128, 4,168,228,229,243,227, - 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,178, - 242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128, 4, - 42, 98, 2, 12, 23, 12, 28,225,114,128, 1, 38,242,229,246,229, - 226,229,236,239,119,128, 30, 42, 99, 2, 12, 46, 12, 55,229,228, - 233,236,236, 97,128, 30, 40,233,242, 99, 2, 12, 63, 12, 68,236, - 101,128, 36,189,245,237,230,236,229,120,128, 1, 36,100, 2, 12, - 83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116, 2, - 12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236, - 239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255, - 40,111, 2, 12,135, 12,146,225,242,237,229,238,233,225,110,128, - 5, 64,242,233,227,239,240,244,233, 99,128, 3,232,243,237,225, - 236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116, - 129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241, - 245,225,242,101,128, 51,144, 73,146, 0, 73, 12,239, 12,251, 12, - 255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13, - 242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193, - 227,249,242,233,236,236,233, 99,128, 4, 47, 74,128, 1, 50,213, - 227,249,242,233,236,236,233, 99,128, 4, 46,225,227,245,244,101, - 129, 0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229, - 246,101,128, 1, 44, 99, 3, 13, 45, 13, 52, 13, 84,225,242,239, - 110,128, 1,207,233,242, 99, 2, 13, 60, 13, 65,236,101,128, 36, - 190,245,237,230,236,229,120,129, 0,206, 13, 76,243,237,225,236, - 108,128,247,238,249,242,233,236,236,233, 99,128, 4, 6,100, 3, - 13,102, 13,112, 13,155,226,236,231,242,225,246,101,128, 2, 8, - 233,229,242,229,243,233,115,131, 0,207, 13,128, 13,136, 13,147, - 225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99, - 128, 4,228,243,237,225,236,108,128,247,239,239,116,130, 1, 48, - 13,164, 13,173,225,227,227,229,238,116,128, 1, 48,226,229,236, - 239,119,128, 30,202,101, 2, 13,187, 13,203,226,242,229,246,229, - 227,249,242,233,236,236,233, 99,128, 4,214,227,249,242,233,236, - 236,233, 99,128, 4, 21,230,242,225,235,244,245,114,128, 33, 17, - 231,242,225,246,101,129, 0,204, 13,234,243,237,225,236,108,128, - 247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105, 3, - 14, 6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128, 4, - 24,238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 10, - 243,232,239,242,244,227,249,242,233,236,236,233, 99,128, 4, 25, - 109, 2, 14, 54, 14, 75,225,227,242,239,110,129, 1, 42, 14, 64, - 227,249,242,233,236,236,233, 99,128, 4,226,239,238,239,243,240, - 225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110, - 128, 5, 59,111, 3, 14,107, 14,118, 14,126,227,249,242,233,236, - 236,233, 99,128, 4, 1,231,239,238,229,107,128, 1, 46,244, 97, - 131, 3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110, - 128, 1,150,228,233,229,242,229,243,233,115,128, 3,170,244,239, - 238,239,115,128, 3,138,115, 2, 14,172, 14,179,237,225,236,108, - 128,247,105,244,242,239,235,101,128, 1,151,244,233,236,228,101, - 129, 1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233, - 244,243, 97, 2, 14,216, 14,227,227,249,242,233,236,236,233, 99, - 128, 4,116,228,226,236,231,242,225,246,229,227,249,242,233,236, - 236,233, 99,128, 4,118, 74,134, 0, 74, 15, 6, 15, 18, 15, 41, - 15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128, - 5, 65,227,233,242, 99, 2, 15, 27, 15, 32,236,101,128, 36,191, - 245,237,230,236,229,120,128, 1, 52,229,227,249,242,233,236,236, - 233, 99,128, 4, 8,232,229,232,225,242,237,229,238,233,225,110, - 128, 5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243, - 237,225,236,108,128,247,106, 75,140, 0, 75, 15,115, 15,125, 15, - 135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16, - 180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241, - 245,225,242,101,128, 51,205, 97, 7, 15,151, 15,169, 15,191, 15, - 211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249, - 242,233,236,236,233, 99,128, 4,160, 99, 2, 15,175, 15,181,245, - 244,101,128, 30, 48,249,242,233,236,236,233, 99,128, 4, 26,228, - 229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99, - 128, 4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128, - 4,195,240,240, 97,128, 3,154,243,244,242,239,235,229,227,249, - 242,233,236,236,233, 99,128, 4,158,246,229,242,244,233,227,225, - 236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, - 4,156, 99, 4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110, - 128, 1,232,229,228,233,236,236, 97,128, 1, 54,233,242,227,236, - 101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128, 1, - 54,228,239,244,226,229,236,239,119,128, 30, 50,101, 2, 16, 82, - 16, 94,232,225,242,237,229,238,233,225,110,128, 5, 84,238,225, - 242,237,229,238,233,225,110,128, 5, 63,104, 3, 16,114, 16,126, - 16,137,225,227,249,242,233,236,236,233, 99,128, 4, 37,229,233, - 227,239,240,244,233, 99,128, 3,230,239,239,107,128, 1,152,234, - 229,227,249,242,233,236,236,233, 99,128, 4, 12,236,233,238,229, - 226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227, - 101,128,255, 43,239,240,240, 97, 2, 16,189, 16,200,227,249,242, - 233,236,236,233, 99,128, 4,128,231,242,229,229,107,128, 3,222, - 115, 2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128, - 4,110,237,225,236,108,128,247,107, 76,138, 0, 76, 17, 1, 17, - 5, 17, 9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17, - 189, 74,128, 1,199, 76,128,246,191, 97, 2, 17, 15, 17, 22,227, - 245,244,101,128, 1, 57,237,226,228, 97,128, 3,155, 99, 4, 17, - 39, 17, 46, 17, 55, 17, 82,225,242,239,110,128, 1, 61,229,228, - 233,236,236, 97,128, 1, 59,233,242, 99, 2, 17, 63, 17, 68,236, - 101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128, - 30, 60,239,237,237,225,225,227,227,229,238,116,128, 1, 59,228, - 239,116,130, 1, 63, 17,105, 17,114,225,227,227,229,238,116,128, - 1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242, - 239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110, - 128, 5, 60,106,129, 1,200, 17,153,229,227,249,242,233,236,236, - 233, 99,128, 4, 9,236,233,238,229,226,229,236,239,119,128, 30, - 58,237,239,238,239,243,240,225,227,101,128,255, 44,115, 2, 17, - 195, 17,212,236,225,243,104,129, 1, 65, 17,204,243,237,225,236, - 108,128,246,249,237,225,236,108,128,247,108, 77,137, 0, 77, 17, - 241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18, - 100,194,243,241,245,225,242,101,128, 51,134,225, 99, 2, 18, 2, - 18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128, - 247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36, - 194,228,239,116, 2, 18, 41, 18, 50,225,227,227,229,238,116,128, - 30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229, - 238,233,225,110,128, 5, 68,237,239,238,239,243,240,225,227,101, - 128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229, - 100,128, 1,156,117,128, 3,156, 78,141, 0, 78, 18,134, 18,138, - 18,146, 18,212, 18,237, 18,248, 19, 3, 19, 21, 19, 33, 19, 45, - 19, 58, 19, 66, 19, 84, 74,128, 1,202,225,227,245,244,101,128, - 1, 67, 99, 4, 18,156, 18,163, 18,172, 18,199,225,242,239,110, - 128, 1, 71,229,228,233,236,236, 97,128, 1, 69,233,242, 99, 2, - 18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226, - 229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238, - 116,128, 1, 69,228,239,116, 2, 18,220, 18,229,225,227,227,229, - 238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239, - 235,236,229,230,116,128, 1,157,233,238,229,242,239,237,225,110, - 128, 33,104,106,129, 1,203, 19, 9,229,227,249,242,233,236,236, - 233, 99,128, 4, 10,236,233,238,229,226,229,236,239,119,128, 30, - 72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225, - 242,237,229,238,233,225,110,128, 5, 70,243,237,225,236,108,128, - 247,110,244,233,236,228,101,129, 0,209, 19, 76,243,237,225,236, - 108,128,247,241,117,128, 3,157, 79,141, 0, 79, 19,118, 19,132, - 19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213, - 21,223, 21,254, 22, 53, 69,129, 1, 82, 19,124,243,237,225,236, - 108,128,246,250,225,227,245,244,101,129, 0,211, 19,142,243,237, - 225,236,108,128,247,243, 98, 2, 19,156, 19,196,225,242,242,229, - 100, 2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128, 4, - 232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, - 99,128, 4,234,242,229,246,101,128, 1, 78, 99, 4, 19,213, 19, - 220, 19,235, 20, 68,225,242,239,110,128, 1,209,229,238,244,229, - 242,229,228,244,233,236,228,101,128, 1,159,233,242, 99, 2, 19, - 243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134, 0, - 212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245, - 244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216, - 231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246, - 101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228, - 101,128, 30,214,249,242,233,236,236,233, 99,128, 4, 30,100, 3, - 20, 86, 20,109, 20,142,226,108, 2, 20, 93, 20,101,225,227,245, - 244,101,128, 1, 80,231,242,225,246,101,128, 2, 12,233,229,242, - 229,243,233,115,130, 0,214, 20,123, 20,134,227,249,242,233,236, - 236,233, 99,128, 4,230,243,237,225,236,108,128,247,246,239,244, - 226,229,236,239,119,128, 30,204,103, 2, 20,158, 20,170,239,238, - 229,235,243,237,225,236,108,128,246,251,242,225,246,101,129, 0, - 210, 20,179,243,237,225,236,108,128,247,242,104, 4, 20,197, 20, - 208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128, 5, 85, - 109,128, 33, 38,111, 2, 20,218, 20,228,239,235,225,226,239,246, - 101,128, 30,206,242,110,133, 1,160, 20,243, 20,251, 21, 6, 21, - 14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229, - 236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239, - 239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128, - 30,224,245,238,231,225,242,245,237,236,225,245,116,128, 1, 80, - 105,129, 1,162, 21, 54,238,246,229,242,244,229,228,226,242,229, - 246,101,128, 2, 14,109, 4, 21, 79, 21,107, 21,184, 21,202,225, - 227,242,239,110,130, 1, 76, 21, 91, 21, 99,225,227,245,244,101, - 128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33, - 38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233, - 99,128, 4, 96,231,242,229,229,107,128, 3,169,242,239,245,238, - 228,227,249,242,233,236,236,233, 99,128, 4,122,116, 2, 21,162, - 21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128, 4, - 124,239,238,239,115,128, 3,143,233,227,242,239,110,129, 3,159, - 21,194,244,239,238,239,115,128, 3,140,239,238,239,243,240,225, - 227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111, - 2, 21,229, 21,248,231,239,238,229,107,129, 1,234, 21,239,237, - 225,227,242,239,110,128, 1,236,240,229,110,128, 1,134,115, 3, - 22, 6, 22, 33, 22, 40,236,225,243,104,130, 0,216, 22, 17, 22, - 25,225,227,245,244,101,128, 1,254,243,237,225,236,108,128,247, - 248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245, - 244,101,128, 1,254,116, 2, 22, 59, 22, 70,227,249,242,233,236, - 236,233, 99,128, 4,126,233,236,228,101,131, 0,213, 22, 83, 22, - 91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229, - 243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136, - 0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246, - 23, 2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101, - 128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101, - 3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128, - 4, 31,232,225,242,237,229,238,233,225,110,128, 5, 74,237,233, - 228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99, - 128, 4,166,104, 2, 22,217, 22,221,105,128, 3,166,239,239,107, - 128, 1,164,105,129, 3,160, 22,233,247,242,225,242,237,229,238, - 233,225,110,128, 5, 83,237,239,238,239,243,240,225,227,101,128, - 255, 48,115, 2, 23, 8, 23, 25,105,129, 3,168, 23, 14,227,249, - 242,233,236,236,233, 99,128, 4,112,237,225,236,108,128,247,112, - 81,131, 0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101, - 128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243, - 237,225,236,108,128,247,113, 82,138, 0, 82, 23, 95, 23,119, 23, - 166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97, - 2, 23,101, 23,112,225,242,237,229,238,233,225,110,128, 5, 76, - 227,245,244,101,128, 1, 84, 99, 4, 23,129, 23,136, 23,145, 23, - 153,225,242,239,110,128, 1, 88,229,228,233,236,236, 97,128, 1, - 86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227, - 229,238,116,128, 1, 86,100, 2, 23,172, 23,182,226,236,231,242, - 225,246,101,128, 2, 16,239,116, 2, 23,189, 23,198,225,227,227, - 229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208, - 237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238, - 233,225,110,128, 5, 80,230,242,225,235,244,245,114,128, 33, 28, - 232,111,128, 3,161,233,110, 2, 23,252, 24, 5,231,243,237,225, - 236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101, - 128, 2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237, - 239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108, - 129,247,114, 24, 53,233,238,246,229,242,244,229,100,129, 2,129, - 24, 66,243,245,240,229,242,233,239,114,128, 2,182, 83,139, 0, - 83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27, - 105, 27,117, 27,135, 27,143, 70, 6, 24,117, 24,209, 24,241, 25, - 77, 25,119, 25,221, 48, 9, 24,137, 24,145, 24,153, 24,161, 24, - 169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37, - 12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37, - 16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37, - 60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37, - 52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37, - 36, 49, 3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37, - 0,177,176,176,176, 48,128, 37, 2,185,176,176,176, 48,128, 37, - 97, 50, 9, 25, 5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25, - 53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176, - 176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176, - 176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176, - 176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176, - 176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51, 4, 25, - 87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183, - 176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185, - 176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25, - 165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176, - 176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176, - 176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176, - 176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176, - 176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176, - 176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53, 5, 25, - 233, 25,241, 25,249, 26, 1, 26, 9,176,176,176,176, 48,128, 37, - 88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37, - 83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37, - 106, 97, 2, 26, 23, 26, 44,227,245,244,101,129, 1, 90, 26, 32, - 228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231, - 242,229,229,107,128, 3,224, 99, 5, 26, 67, 26, 98, 26,107, 26, - 147, 26,169,225,242,239,110,130, 1, 96, 26, 78, 26, 90,228,239, - 244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128, - 246,253,229,228,233,236,236, 97,128, 1, 94,232,247, 97,130, 1, - 143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128, 4,216, - 228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99, - 128, 4,218,233,242, 99, 2, 26,155, 26,160,236,101,128, 36,200, - 245,237,230,236,229,120,128, 1, 92,239,237,237,225,225,227,227, - 229,238,116,128, 2, 24,228,239,116, 2, 26,190, 26,199,225,227, - 227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26, - 209,228,239,244,225,227,227,229,238,116,128, 30,104,101, 2, 26, - 227, 26,239,232,225,242,237,229,238,233,225,110,128, 5, 77,246, - 229,238,242,239,237,225,110,128, 33,102,104, 5, 27, 6, 27, 34, - 27, 48, 27, 59, 27, 72, 97, 2, 27, 12, 27, 23,225,242,237,229, - 238,233,225,110,128, 5, 71,227,249,242,233,236,236,233, 99,128, - 4, 40,227,232,225,227,249,242,233,236,236,233, 99,128, 4, 41, - 229,233,227,239,240,244,233, 99,128, 3,226,232,225,227,249,242, - 233,236,236,233, 99,128, 4,186,233,237,225,227,239,240,244,233, - 99,128, 3,236,105, 2, 27, 90, 27, 96,231,237, 97,128, 3,163, - 248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225, - 227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233, - 236,236,233, 99,128, 4, 44,243,237,225,236,108,128,247,115,244, - 233,231,237,225,231,242,229,229,107,128, 3,218, 84,141, 0, 84, - 27,186, 27,191, 27,197, 28, 7, 28, 32, 28, 96, 28,147, 28,177, - 28,189, 28,201, 28,246, 29, 6, 29, 46,225,117,128, 3,164,226, - 225,114,128, 1,102, 99, 4, 27,207, 27,214, 27,223, 27,250,225, - 242,239,110,128, 1,100,229,228,233,236,236, 97,128, 1, 98,233, - 242, 99, 2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236, - 229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227, - 227,229,238,116,128, 1, 98,228,239,116, 2, 28, 15, 28, 24,225, - 227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108, - 101, 4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236, - 233, 99,128, 4, 34,228,229,243,227,229,238,228,229,242,227,249, - 242,233,236,236,233, 99,128, 4,172,238,242,239,237,225,110,128, - 33,105,244,243,229,227,249,242,233,236,236,233, 99,128, 4,180, - 104, 3, 28,104, 28,110, 28,136,229,244, 97,128, 3,152,111, 2, - 28,116, 28,121,239,107,128, 1,172,242,110,129, 0,222, 28,128, - 243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110, - 128, 33, 98,105, 2, 28,153, 28,164,236,228,229,243,237,225,236, - 108,128,246,254,247,238,225,242,237,229,238,233,225,110,128, 5, - 79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238, - 239,243,240,225,227,101,128,255, 52,111, 2, 28,207, 28,218,225, - 242,237,229,238,233,225,110,128, 5, 57,238,101, 3, 28,227, 28, - 234, 28,240,230,233,246,101,128, 1,188,243,233,120,128, 1,132, - 244,247,111,128, 1,167,242,229,244,242,239,230,236,229,248,232, - 239,239,107,128, 1,174,115, 3, 29, 14, 29, 26, 29, 39,229,227, - 249,242,233,236,236,233, 99,128, 4, 38,232,229,227,249,242,233, - 236,236,233, 99,128, 4, 11,237,225,236,108,128,247,116,119, 2, - 29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107, - 239,242,239,237,225,110,128, 33, 97, 85,142, 0, 85, 29,105, 29, - 123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31, - 21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129, 0, - 218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101, - 128, 1,108, 99, 3, 29,139, 29,146, 29,188,225,242,239,110,128, - 1,211,233,242, 99, 2, 29,154, 29,159,236,101,128, 36,202,245, - 237,230,236,229,120,130, 0,219, 29,172, 29,180,226,229,236,239, - 119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236, - 236,233, 99,128, 4, 35,100, 3, 29,206, 29,229, 30, 59,226,108, - 2, 29,213, 29,221,225,227,245,244,101,128, 1,112,231,242,225, - 246,101,128, 2, 20,233,229,242,229,243,233,115,134, 0,220, 29, - 251, 30, 3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101, - 128, 1,215,226,229,236,239,119,128, 30,114, 99, 2, 30, 17, 30, - 24,225,242,239,110,128, 1,217,249,242,233,236,236,233, 99,128, - 4,240,231,242,225,246,101,128, 1,219,237,225,227,242,239,110, - 128, 1,213,243,237,225,236,108,128,247,252,239,244,226,229,236, - 239,119,128, 30,228,231,242,225,246,101,129, 0,217, 30, 79,243, - 237,225,236,108,128,247,249,104, 2, 30, 93, 30,171,111, 2, 30, - 99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133, - 1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244, - 101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231, - 242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101, - 128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242, - 245,237,236,225,245,116,129, 1,112, 30,187,227,249,242,233,236, - 236,233, 99,128, 4,242,233,238,246,229,242,244,229,228,226,242, - 229,246,101,128, 2, 22,235,227,249,242,233,236,236,233, 99,128, - 4,120,109, 2, 30,232, 31, 10,225,227,242,239,110,130, 1,106, - 30,244, 30,255,227,249,242,233,236,236,233, 99,128, 4,238,228, - 233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225, - 227,101,128,255, 53,239,231,239,238,229,107,128, 1,114,240,243, - 233,236,239,110,133, 3,165, 31, 49, 31, 53, 31, 90, 31,121, 31, - 134, 49,128, 3,210, 97, 2, 31, 59, 31, 81,227,245,244,229,232, - 239,239,235,243,249,237,226,239,236,231,242,229,229,107,128, 3, - 211,230,242,233,227,225,110,128, 1,177,228,233,229,242,229,243, - 233,115,129, 3,171, 31,103,232,239,239,235,243,249,237,226,239, - 236,231,242,229,229,107,128, 3,212,232,239,239,235,243,249,237, - 226,239,108,128, 3,210,244,239,238,239,115,128, 3,142,242,233, - 238,103,128, 1,110,115, 3, 31,157, 31,172, 31,179,232,239,242, - 244,227,249,242,233,236,236,233, 99,128, 4, 14,237,225,236,108, - 128,247,117,244,242,225,233,231,232,116, 2, 31,191, 31,202,227, - 249,242,233,236,236,233, 99,128, 4,174,243,244,242,239,235,229, - 227,249,242,233,236,236,233, 99,128, 4,176,244,233,236,228,101, - 130, 1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226, - 229,236,239,119,128, 30,116, 86,136, 0, 86, 32, 11, 32, 20, 32, - 31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236, - 101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101, - 2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128, 4, 18, - 247,225,242,237,229,238,233,225,110,128, 5, 78,232,239,239,107, - 128, 1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239, - 225,242,237,229,238,233,225,110,128, 5, 72,243,237,225,236,108, - 128,247,118,244,233,236,228,101,128, 30,124, 87,134, 0, 87, 32, - 123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101, - 128, 30,130,227,233,242, 99, 2, 32,140, 32,145,236,101,128, 36, - 204,245,237,230,236,229,120,128, 1,116,100, 2, 32,160, 32,170, - 233,229,242,229,243,233,115,128, 30,132,239,116, 2, 32,177, 32, - 186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128, - 30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240, - 225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134, - 0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233, - 242,227,236,101,128, 36,205,100, 2, 32,253, 33, 7,233,229,242, - 229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128, - 30,138,229,232,225,242,237,229,238,233,225,110,128, 5, 61,105, - 128, 3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243, - 237,225,236,108,128,247,120, 89,139, 0, 89, 33, 81, 33,116, 33, - 139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34, - 68, 97, 2, 33, 87, 33,104,227,245,244,101,129, 0,221, 33, 96, - 243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233, - 99,128, 4, 98,227,233,242, 99, 2, 33,125, 33,130,236,101,128, - 36,206,245,237,230,236,229,120,128, 1,118,100, 2, 33,145, 33, - 165,233,229,242,229,243,233,115,129, 1,120, 33,157,243,237,225, - 236,108,128,247,255,239,116, 2, 33,172, 33,181,225,227,227,229, - 238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114, 2, - 33,196, 33,208,233,227,249,242,233,236,236,233, 99,128, 4, 43, - 245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, - 99,128, 4,248,231,242,225,246,101,128, 30,242,232,239,239,107, - 129, 1,179, 33,245,225,226,239,246,101,128, 30,246,105, 3, 34, - 5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128, 5, 69, - 227,249,242,233,236,236,233, 99,128, 4, 7,247,238,225,242,237, - 229,238,233,225,110,128, 5, 82,237,239,238,239,243,240,225,227, - 101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228, - 101,128, 30,248,245,115, 2, 34, 75, 34,113,226,233,103, 2, 34, - 83, 34, 94,227,249,242,233,236,236,233, 99,128, 4,106,233,239, - 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4, - 108,236,233,244,244,236,101, 2, 34,124, 34,135,227,249,242,233, - 236,236,233, 99,128, 4,102,233,239,244,233,230,233,229,228,227, - 249,242,233,236,236,233, 99,128, 4,104, 90,136, 0, 90, 34,174, - 34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97, 2, - 34,180, 34,191,225,242,237,229,238,233,225,110,128, 5, 54,227, - 245,244,101,128, 1,121, 99, 2, 34,204, 34,221,225,242,239,110, - 129, 1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99, - 2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120, - 128, 30,144,228,239,116,130, 1,123, 34,253, 35, 6,225,227,227, - 229,238,116,128, 1,123,226,229,236,239,119,128, 30,146,101, 3, - 35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128, 4, - 23,100, 2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227, - 249,242,233,236,236,233, 99,128, 4,152,233,229,242,229,243,233, - 243,227,249,242,233,236,236,233, 99,128, 4,222,244, 97,128, 3, - 150,232,101, 4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229, - 238,233,225,110,128, 5, 58,226,242,229,246,229,227,249,242,233, - 236,236,233, 99,128, 4,193,227,249,242,233,236,236,233, 99,128, - 4, 22,100, 2, 35,136, 35,155,229,243,227,229,238,228,229,242, - 227,249,242,233,236,236,233, 99,128, 4,150,233,229,242,229,243, - 233,243,227,249,242,233,236,236,233, 99,128, 4,220,236,233,238, - 229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225, - 227,101,128,255, 58,115, 2, 35,203, 35,210,237,225,236,108,128, - 247,122,244,242,239,235,101,128, 1,181, 97,149, 0, 97, 36, 8, - 36,144, 37, 35, 37,211, 38, 55, 38, 91, 45, 10, 45, 47, 45, 74, - 46, 43, 46, 81, 47,170, 47,242, 48,197, 48,206, 49, 79, 51, 87, - 52, 77, 52,124, 53, 19, 53, 33, 97, 7, 36, 24, 36, 34, 36, 41, - 36, 48, 36, 73, 36, 89, 36,100,226,229,238,231,225,236,105,128, - 9,134,227,245,244,101,128, 0,225,228,229,246, 97,128, 9, 6, - 231,117, 2, 36, 55, 36, 64,234,225,242,225,244,105,128, 10,134, - 242,237,245,235,232,105,128, 10, 6,237,225,244,242,225,231,245, - 242,237,245,235,232,105,128, 10, 62,242,245,243,241,245,225,242, - 101,128, 51, 3,246,239,247,229,236,243,233,231,110, 3, 36,116, - 36,126, 36,133,226,229,238,231,225,236,105,128, 9,190,228,229, - 246, 97,128, 9, 62,231,245,234,225,242,225,244,105,128, 10,190, - 98, 4, 36,154, 36,195, 36,204, 36,214,226,242,229,246,233,225, - 244,233,239,110, 2, 36,169, 36,184,237,225,242,235,225,242,237, - 229,238,233,225,110,128, 5, 95,243,233,231,238,228,229,246, 97, - 128, 9,112,229,238,231,225,236,105,128, 9,133,239,240,239,237, - 239,230,111,128, 49, 26,242,229,246,101,134, 1, 3, 36,233, 36, - 241, 36,252, 37, 7, 37, 15, 37, 27,225,227,245,244,101,128, 30, - 175,227,249,242,233,236,236,233, 99,128, 4,209,228,239,244,226, - 229,236,239,119,128, 30,183,231,242,225,246,101,128, 30,177,232, - 239,239,235,225,226,239,246,101,128, 30,179,244,233,236,228,101, - 128, 30,181, 99, 4, 37, 45, 37, 52, 37,131, 37,201,225,242,239, - 110,128, 1,206,233,242, 99, 2, 37, 60, 37, 65,236,101,128, 36, - 208,245,237,230,236,229,120,133, 0,226, 37, 84, 37, 92, 37,103, - 37,111, 37,123,225,227,245,244,101,128, 30,165,228,239,244,226, - 229,236,239,119,128, 30,173,231,242,225,246,101,128, 30,167,232, - 239,239,235,225,226,239,246,101,128, 30,169,244,233,236,228,101, - 128, 30,171,245,244,101,133, 0,180, 37,147, 37,158, 37,175, 37, - 182, 37,191,226,229,236,239,247,227,237, 98,128, 3, 23, 99, 2, - 37,164, 37,169,237, 98,128, 3, 1,239,237, 98,128, 3, 1,228, - 229,246, 97,128, 9, 84,236,239,247,237,239,100,128, 2,207,244, - 239,238,229,227,237, 98,128, 3, 65,249,242,233,236,236,233, 99, - 128, 4, 48,100, 5, 37,223, 37,233, 37,247, 37,253, 38, 31,226, - 236,231,242,225,246,101,128, 2, 1,228,225,235,231,245,242,237, - 245,235,232,105,128, 10,113,229,246, 97,128, 9, 5,233,229,242, - 229,243,233,115,130, 0,228, 38, 11, 38, 22,227,249,242,233,236, - 236,233, 99,128, 4,211,237,225,227,242,239,110,128, 1,223,239, - 116, 2, 38, 38, 38, 46,226,229,236,239,119,128, 30,161,237,225, - 227,242,239,110,128, 1,225,101,131, 0,230, 38, 65, 38, 73, 38, - 82,225,227,245,244,101,128, 1,253,235,239,242,229,225,110,128, - 49, 80,237,225,227,242,239,110,128, 1,227,230,233,105, 6, 38, - 107, 38,127, 41, 64, 41, 70, 41, 85, 44,185, 48, 2, 38,113, 38, - 120,176,178,176, 56,128, 32, 21,184,185,180, 49,128, 32,164,177, - 48, 3, 38,136, 40,160, 41, 39, 48, 9, 38,156, 38,176, 38,238, - 39, 44, 39,106, 39,168, 39,230, 40, 36, 40, 98, 49, 3, 38,164, - 38,168, 38,172, 55,128, 4, 16, 56,128, 4, 17, 57,128, 4, 18, - 50, 10, 38,198, 38,202, 38,206, 38,210, 38,214, 38,218, 38,222, - 38,226, 38,230, 38,234, 48,128, 4, 19, 49,128, 4, 20, 50,128, - 4, 21, 51,128, 4, 1, 52,128, 4, 22, 53,128, 4, 23, 54,128, - 4, 24, 55,128, 4, 25, 56,128, 4, 26, 57,128, 4, 27, 51, 10, - 39, 4, 39, 8, 39, 12, 39, 16, 39, 20, 39, 24, 39, 28, 39, 32, - 39, 36, 39, 40, 48,128, 4, 28, 49,128, 4, 29, 50,128, 4, 30, - 51,128, 4, 31, 52,128, 4, 32, 53,128, 4, 33, 54,128, 4, 34, - 55,128, 4, 35, 56,128, 4, 36, 57,128, 4, 37, 52, 10, 39, 66, - 39, 70, 39, 74, 39, 78, 39, 82, 39, 86, 39, 90, 39, 94, 39, 98, - 39,102, 48,128, 4, 38, 49,128, 4, 39, 50,128, 4, 40, 51,128, - 4, 41, 52,128, 4, 42, 53,128, 4, 43, 54,128, 4, 44, 55,128, - 4, 45, 56,128, 4, 46, 57,128, 4, 47, 53, 10, 39,128, 39,132, - 39,136, 39,140, 39,144, 39,148, 39,152, 39,156, 39,160, 39,164, - 48,128, 4,144, 49,128, 4, 2, 50,128, 4, 3, 51,128, 4, 4, - 52,128, 4, 5, 53,128, 4, 6, 54,128, 4, 7, 55,128, 4, 8, - 56,128, 4, 9, 57,128, 4, 10, 54, 10, 39,190, 39,194, 39,198, - 39,202, 39,206, 39,210, 39,214, 39,218, 39,222, 39,226, 48,128, - 4, 11, 49,128, 4, 12, 50,128, 4, 14, 51,128,246,196, 52,128, - 246,197, 53,128, 4, 48, 54,128, 4, 49, 55,128, 4, 50, 56,128, - 4, 51, 57,128, 4, 52, 55, 10, 39,252, 40, 0, 40, 4, 40, 8, - 40, 12, 40, 16, 40, 20, 40, 24, 40, 28, 40, 32, 48,128, 4, 53, - 49,128, 4, 81, 50,128, 4, 54, 51,128, 4, 55, 52,128, 4, 56, - 53,128, 4, 57, 54,128, 4, 58, 55,128, 4, 59, 56,128, 4, 60, - 57,128, 4, 61, 56, 10, 40, 58, 40, 62, 40, 66, 40, 70, 40, 74, - 40, 78, 40, 82, 40, 86, 40, 90, 40, 94, 48,128, 4, 62, 49,128, - 4, 63, 50,128, 4, 64, 51,128, 4, 65, 52,128, 4, 66, 53,128, - 4, 67, 54,128, 4, 68, 55,128, 4, 69, 56,128, 4, 70, 57,128, - 4, 71, 57, 10, 40,120, 40,124, 40,128, 40,132, 40,136, 40,140, - 40,144, 40,148, 40,152, 40,156, 48,128, 4, 72, 49,128, 4, 73, - 50,128, 4, 74, 51,128, 4, 75, 52,128, 4, 76, 53,128, 4, 77, - 54,128, 4, 78, 55,128, 4, 79, 56,128, 4,145, 57,128, 4, 82, - 49, 4, 40,170, 40,232, 40,237, 41, 7, 48, 10, 40,192, 40,196, - 40,200, 40,204, 40,208, 40,212, 40,216, 40,220, 40,224, 40,228, - 48,128, 4, 83, 49,128, 4, 84, 50,128, 4, 85, 51,128, 4, 86, - 52,128, 4, 87, 53,128, 4, 88, 54,128, 4, 89, 55,128, 4, 90, - 56,128, 4, 91, 57,128, 4, 92,177, 48,128, 4, 94, 52, 4, 40, - 247, 40,251, 40,255, 41, 3, 53,128, 4, 15, 54,128, 4, 98, 55, - 128, 4,114, 56,128, 4,116, 57, 5, 41, 19, 41, 23, 41, 27, 41, - 31, 41, 35, 50,128,246,198, 51,128, 4, 95, 52,128, 4, 99, 53, - 128, 4,115, 54,128, 4,117, 56, 2, 41, 45, 41, 59, 51, 2, 41, - 51, 41, 55, 49,128,246,199, 50,128,246,200,180, 54,128, 4,217, - 178,185, 57,128, 32, 14,179, 48, 2, 41, 77, 41, 81, 48,128, 32, - 15, 49,128, 32, 13,181, 55, 7, 41,102, 41,172, 42,237, 43, 58, - 44, 15, 44,108, 44,179, 51, 2, 41,108, 41,122, 56, 2, 41,114, - 41,118, 49,128, 6,106, 56,128, 6, 12, 57, 8, 41,140, 41,144, - 41,148, 41,152, 41,156, 41,160, 41,164, 41,168, 50,128, 6, 96, - 51,128, 6, 97, 52,128, 6, 98, 53,128, 6, 99, 54,128, 6,100, - 55,128, 6,101, 56,128, 6,102, 57,128, 6,103, 52, 7, 41,188, - 41,220, 42, 26, 42, 88, 42,120, 42,176, 42,232, 48, 5, 41,200, - 41,204, 41,208, 41,212, 41,216, 48,128, 6,104, 49,128, 6,105, - 51,128, 6, 27, 55,128, 6, 31, 57,128, 6, 33, 49, 10, 41,242, - 41,246, 41,250, 41,254, 42, 2, 42, 6, 42, 10, 42, 14, 42, 18, - 42, 22, 48,128, 6, 34, 49,128, 6, 35, 50,128, 6, 36, 51,128, - 6, 37, 52,128, 6, 38, 53,128, 6, 39, 54,128, 6, 40, 55,128, - 6, 41, 56,128, 6, 42, 57,128, 6, 43, 50, 10, 42, 48, 42, 52, - 42, 56, 42, 60, 42, 64, 42, 68, 42, 72, 42, 76, 42, 80, 42, 84, - 48,128, 6, 44, 49,128, 6, 45, 50,128, 6, 46, 51,128, 6, 47, - 52,128, 6, 48, 53,128, 6, 49, 54,128, 6, 50, 55,128, 6, 51, - 56,128, 6, 52, 57,128, 6, 53, 51, 5, 42,100, 42,104, 42,108, - 42,112, 42,116, 48,128, 6, 54, 49,128, 6, 55, 50,128, 6, 56, - 51,128, 6, 57, 52,128, 6, 58, 52, 9, 42,140, 42,144, 42,148, - 42,152, 42,156, 42,160, 42,164, 42,168, 42,172, 48,128, 6, 64, - 49,128, 6, 65, 50,128, 6, 66, 51,128, 6, 67, 52,128, 6, 68, - 53,128, 6, 69, 54,128, 6, 70, 56,128, 6, 72, 57,128, 6, 73, - 53, 9, 42,196, 42,200, 42,204, 42,208, 42,212, 42,216, 42,220, - 42,224, 42,228, 48,128, 6, 74, 49,128, 6, 75, 50,128, 6, 76, - 51,128, 6, 77, 52,128, 6, 78, 53,128, 6, 79, 54,128, 6, 80, - 55,128, 6, 81, 56,128, 6, 82,183, 48,128, 6, 71, 53, 3, 42, - 245, 43, 21, 43, 53, 48, 5, 43, 1, 43, 5, 43, 9, 43, 13, 43, - 17, 53,128, 6,164, 54,128, 6,126, 55,128, 6,134, 56,128, 6, - 152, 57,128, 6,175, 49, 5, 43, 33, 43, 37, 43, 41, 43, 45, 43, - 49, 49,128, 6,121, 50,128, 6,136, 51,128, 6,145, 52,128, 6, - 186, 57,128, 6,210,179, 52,128, 6,213, 54, 7, 43, 74, 43, 79, - 43, 84, 43, 89, 43,127, 43,189, 43,251,179, 54,128, 32,170,180, - 53,128, 5,190,181, 56,128, 5,195, 54, 6, 43,103, 43,107, 43, - 111, 43,115, 43,119, 43,123, 52,128, 5,208, 53,128, 5,209, 54, - 128, 5,210, 55,128, 5,211, 56,128, 5,212, 57,128, 5,213, 55, - 10, 43,149, 43,153, 43,157, 43,161, 43,165, 43,169, 43,173, 43, - 177, 43,181, 43,185, 48,128, 5,214, 49,128, 5,215, 50,128, 5, - 216, 51,128, 5,217, 52,128, 5,218, 53,128, 5,219, 54,128, 5, - 220, 55,128, 5,221, 56,128, 5,222, 57,128, 5,223, 56, 10, 43, - 211, 43,215, 43,219, 43,223, 43,227, 43,231, 43,235, 43,239, 43, - 243, 43,247, 48,128, 5,224, 49,128, 5,225, 50,128, 5,226, 51, - 128, 5,227, 52,128, 5,228, 53,128, 5,229, 54,128, 5,230, 55, - 128, 5,231, 56,128, 5,232, 57,128, 5,233, 57, 3, 44, 3, 44, - 7, 44, 11, 48,128, 5,234, 52,128,251, 42, 53,128,251, 43, 55, - 4, 44, 25, 44, 39, 44, 59, 44, 64, 48, 2, 44, 31, 44, 35, 48, - 128,251, 75, 53,128,251, 31, 49, 3, 44, 47, 44, 51, 44, 55, 54, - 128, 5,240, 55,128, 5,241, 56,128, 5,242,178, 51,128,251, 53, - 57, 7, 44, 80, 44, 84, 44, 88, 44, 92, 44, 96, 44,100, 44,104, - 51,128, 5,180, 52,128, 5,181, 53,128, 5,182, 54,128, 5,187, - 55,128, 5,184, 56,128, 5,183, 57,128, 5,176, 56, 3, 44,116, - 44,160, 44,165, 48, 7, 44,132, 44,136, 44,140, 44,144, 44,148, - 44,152, 44,156, 48,128, 5,178, 49,128, 5,177, 50,128, 5,179, - 51,128, 5,194, 52,128, 5,193, 54,128, 5,185, 55,128, 5,188, - 179, 57,128, 5,189, 52, 2, 44,171, 44,175, 49,128, 5,191, 50, - 128, 5,192,185,178, 57,128, 2,188, 54, 3, 44,193, 44,252, 45, - 3, 49, 4, 44,203, 44,219, 44,225, 44,246, 50, 2, 44,209, 44, - 214,180, 56,128, 33, 5,184, 57,128, 33, 19,179,181, 50,128, 33, - 22,181, 55, 3, 44,234, 44,238, 44,242, 51,128, 32, 44, 52,128, - 32, 45, 53,128, 32, 46,182,182, 52,128, 32, 12,179,177,182, 55, - 128, 6,109,180,185,179, 55,128, 2,189,103, 2, 45, 16, 45, 23, - 242,225,246,101,128, 0,224,117, 2, 45, 29, 45, 38,234,225,242, - 225,244,105,128, 10,133,242,237,245,235,232,105,128, 10, 5,104, - 2, 45, 53, 45, 63,233,242,225,231,225,238, 97,128, 48, 66,239, - 239,235,225,226,239,246,101,128, 30,163,105, 7, 45, 90, 45,115, - 45,122, 45,134, 45,159, 45,175, 45,255, 98, 2, 45, 96, 45,105, - 229,238,231,225,236,105,128, 9,144,239,240,239,237,239,230,111, - 128, 49, 30,228,229,246, 97,128, 9, 16,229,227,249,242,233,236, - 236,233, 99,128, 4,213,231,117, 2, 45,141, 45,150,234,225,242, - 225,244,105,128, 10,144,242,237,245,235,232,105,128, 10, 16,237, - 225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 72,110, - 5, 45,187, 45,196, 45,210, 45,226, 45,241,225,242,225,226,233, - 99,128, 6, 57,230,233,238,225,236,225,242,225,226,233, 99,128, - 254,202,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, - 254,203,237,229,228,233,225,236,225,242,225,226,233, 99,128,254, - 204,246,229,242,244,229,228,226,242,229,246,101,128, 2, 3,246, - 239,247,229,236,243,233,231,110, 3, 46, 15, 46, 25, 46, 32,226, - 229,238,231,225,236,105,128, 9,200,228,229,246, 97,128, 9, 72, - 231,245,234,225,242,225,244,105,128, 10,200,107, 2, 46, 49, 46, - 73,225,244,225,235,225,238, 97,129, 48,162, 46, 61,232,225,236, - 230,247,233,228,244,104,128,255,113,239,242,229,225,110,128, 49, - 79,108, 3, 46, 89, 47,145, 47,154,101, 2, 46, 95, 47,140,102, - 136, 5,208, 46,115, 46,124, 46,139, 46,153, 46,242, 47, 0, 47, - 111, 47,125,225,242,225,226,233, 99,128, 6, 39,228,225,231,229, - 243,232,232,229,226,242,229,119,128,251, 48,230,233,238,225,236, - 225,242,225,226,233, 99,128,254,142,104, 2, 46,159, 46,234,225, - 237,250, 97, 2, 46,168, 46,201,225,226,239,246,101, 2, 46,178, - 46,187,225,242,225,226,233, 99,128, 6, 35,230,233,238,225,236, - 225,242,225,226,233, 99,128,254,132,226,229,236,239,119, 2, 46, - 211, 46,220,225,242,225,226,233, 99,128, 6, 37,230,233,238,225, - 236,225,242,225,226,233, 99,128,254,136,229,226,242,229,119,128, - 5,208,236,225,237,229,228,232,229,226,242,229,119,128,251, 79, - 237, 97, 2, 47, 7, 47, 43,228,228,225,225,226,239,246,101, 2, - 47, 20, 47, 29,225,242,225,226,233, 99,128, 6, 34,230,233,238, - 225,236,225,242,225,226,233, 99,128,254,130,235,243,245,242, 97, - 4, 47, 57, 47, 66, 47, 80, 47, 96,225,242,225,226,233, 99,128, - 6, 73,230,233,238,225,236,225,242,225,226,233, 99,128,254,240, - 233,238,233,244,233,225,236,225,242,225,226,233, 99,128,254,243, - 237,229,228,233,225,236,225,242,225,226,233, 99,128,254,244,240, - 225,244,225,232,232,229,226,242,229,119,128,251, 46,241,225,237, - 225,244,243,232,229,226,242,229,119,128,251, 47,240,104,128, 33, - 53,236,229,241,245,225,108,128, 34, 76,240,232, 97,129, 3,177, - 47,162,244,239,238,239,115,128, 3,172,109, 4, 47,180, 47,188, - 47,199, 47,233,225,227,242,239,110,128, 1, 1,239,238,239,243, - 240,225,227,101,128,255, 65,240,229,242,243,225,238,100,130, 0, - 38, 47,213, 47,225,237,239,238,239,243,240,225,227,101,128,255, - 6,243,237,225,236,108,128,247, 38,243,241,245,225,242,101,128, - 51,194,110, 4, 47,252, 48, 7, 48,129, 48,139,226,239,240,239, - 237,239,230,111,128, 49, 34,103, 4, 48, 17, 48, 28, 48, 42, 48, - 121,226,239,240,239,237,239,230,111,128, 49, 36,235,232,225,238, - 235,232,245,244,232,225,105,128, 14, 90,236,101,131, 34, 32, 48, - 53, 48,106, 48,113,226,242,225,227,235,229,116, 2, 48, 65, 48, - 85,236,229,230,116,129, 48, 8, 48, 74,246,229,242,244,233,227, - 225,108,128,254, 63,242,233,231,232,116,129, 48, 9, 48, 95,246, - 229,242,244,233,227,225,108,128,254, 64,236,229,230,116,128, 35, - 41,242,233,231,232,116,128, 35, 42,243,244,242,239,109,128, 33, - 43,239,244,229,236,229,233, 97,128, 3,135,117, 2, 48,145, 48, - 157,228,225,244,244,225,228,229,246, 97,128, 9, 82,243,246,225, - 242, 97, 3, 48,169, 48,179, 48,186,226,229,238,231,225,236,105, - 128, 9,130,228,229,246, 97,128, 9, 2,231,245,234,225,242,225, - 244,105,128, 10,130,239,231,239,238,229,107,128, 1, 5,112, 3, - 48,214, 48,238, 49, 12, 97, 2, 48,220, 48,232,225,244,239,243, - 241,245,225,242,101,128, 51, 0,242,229,110,128, 36,156,239,243, - 244,242,239,240,232,101, 2, 48,251, 49, 6,225,242,237,229,238, - 233,225,110,128, 5, 90,237,239,100,128, 2,188,112, 2, 49, 18, - 49, 23,236,101,128,248,255,242,111, 2, 49, 30, 49, 38,225,227, - 232,229,115,128, 34, 80,120, 2, 49, 44, 49, 64,229,241,245,225, - 108,129, 34, 72, 49, 54,239,242,233,237,225,231,101,128, 34, 82, - 233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 69,114, - 4, 49, 89, 49,116, 49,120, 49,165,225,229, 97, 2, 49, 97, 49, - 107,229,235,239,242,229,225,110,128, 49,142,235,239,242,229,225, - 110,128, 49,141, 99,128, 35, 18,105, 2, 49,126, 49,140,231,232, - 244,232,225,236,230,242,233,238,103,128, 30,154,238,103,130, 0, - 229, 49,149, 49,157,225,227,245,244,101,128, 1,251,226,229,236, - 239,119,128, 30, 1,242,239,119, 8, 49,185, 49,192, 50, 65, 50, - 131, 50,181, 50,236, 51, 3, 51, 78,226,239,244,104,128, 33,148, - 100, 3, 49,200, 49,239, 50, 30,225,243,104, 4, 49,212, 49,219, - 49,226, 49,234,228,239,247,110,128, 33,227,236,229,230,116,128, - 33,224,242,233,231,232,116,128, 33,226,245,112,128, 33,225,226, - 108, 5, 49,252, 50, 3, 50, 10, 50, 17, 50, 25,226,239,244,104, - 128, 33,212,228,239,247,110,128, 33,211,236,229,230,116,128, 33, - 208,242,233,231,232,116,128, 33,210,245,112,128, 33,209,239,247, - 110,131, 33,147, 50, 42, 50, 49, 50, 57,236,229,230,116,128, 33, - 153,242,233,231,232,116,128, 33,152,247,232,233,244,101,128, 33, - 233,104, 2, 50, 71, 50,122,229,225,100, 4, 50, 83, 50, 93, 50, - 103, 50,114,228,239,247,238,237,239,100,128, 2,197,236,229,230, - 244,237,239,100,128, 2,194,242,233,231,232,244,237,239,100,128, - 2,195,245,240,237,239,100,128, 2,196,239,242,233,250,229,120, - 128,248,231,236,229,230,116,131, 33,144, 50,144, 50,161, 50,173, - 228,226,108,129, 33,208, 50,152,243,244,242,239,235,101,128, 33, - 205,239,246,229,242,242,233,231,232,116,128, 33,198,247,232,233, - 244,101,128, 33,230,242,233,231,232,116,132, 33,146, 50,197, 50, - 209, 50,217, 50,228,228,226,236,243,244,242,239,235,101,128, 33, - 207,232,229,225,246,121,128, 39,158,239,246,229,242,236,229,230, - 116,128, 33,196,247,232,233,244,101,128, 33,232,244,225, 98, 2, - 50,244, 50,251,236,229,230,116,128, 33,228,242,233,231,232,116, - 128, 33,229,245,112,132, 33,145, 51, 16, 51, 44, 51, 62, 51, 70, - 100, 2, 51, 22, 51, 34,110,129, 33,149, 51, 28,226,243,101,128, - 33,168,239,247,238,226,225,243,101,128, 33,168,236,229,230,116, - 129, 33,150, 51, 53,239,230,228,239,247,110,128, 33,197,242,233, - 231,232,116,128, 33,151,247,232,233,244,101,128, 33,231,246,229, - 242,244,229,120,128,248,230,115, 5, 51, 99, 51,175, 51,220, 52, - 47, 52, 57, 99, 2, 51,105, 51,157,233,105, 2, 51,112, 51,135, - 227,233,242,227,245,109,129, 0, 94, 51,123,237,239,238,239,243, - 240,225,227,101,128,255, 62,244,233,236,228,101,129, 0,126, 51, - 145,237,239,238,239,243,240,225,227,101,128,255, 94,242,233,240, - 116,129, 2, 81, 51,166,244,245,242,238,229,100,128, 2, 82,237, - 225,236,108, 2, 51,184, 51,195,232,233,242,225,231,225,238, 97, - 128, 48, 65,235,225,244,225,235,225,238, 97,129, 48,161, 51,208, - 232,225,236,230,247,233,228,244,104,128,255,103,244,229,242,233, - 115, 2, 51,230, 52, 43,107,131, 0, 42, 51,240, 52, 12, 52, 35, - 97, 2, 51,246, 52, 4,236,244,239,238,229,225,242,225,226,233, - 99,128, 6,109,242,225,226,233, 99,128, 6,109,109, 2, 52, 18, - 52, 24,225,244,104,128, 34, 23,239,238,239,243,240,225,227,101, - 128,255, 10,243,237,225,236,108,128,254, 97,109,128, 32, 66,245, - 240,229,242,233,239,114,128,246,233,249,237,240,244,239,244,233, - 227,225,236,236,249,229,241,245,225,108,128, 34, 67,116,132, 0, - 64, 52, 89, 52, 96, 52,108, 52,116,233,236,228,101,128, 0,227, - 237,239,238,239,243,240,225,227,101,128,255, 32,243,237,225,236, - 108,128,254,107,245,242,238,229,100,128, 2, 80,117, 6, 52,138, - 52,163, 52,170, 52,195, 52,215, 52,231, 98, 2, 52,144, 52,153, - 229,238,231,225,236,105,128, 9,148,239,240,239,237,239,230,111, - 128, 49, 32,228,229,246, 97,128, 9, 20,231,117, 2, 52,177, 52, - 186,234,225,242,225,244,105,128, 10,148,242,237,245,235,232,105, - 128, 10, 20,236,229,238,231,244,232,237,225,242,235,226,229,238, - 231,225,236,105,128, 9,215,237,225,244,242,225,231,245,242,237, - 245,235,232,105,128, 10, 76,246,239,247,229,236,243,233,231,110, - 3, 52,247, 53, 1, 53, 8,226,229,238,231,225,236,105,128, 9, - 204,228,229,246, 97,128, 9, 76,231,245,234,225,242,225,244,105, - 128, 10,204,246,225,231,242,225,232,225,228,229,246, 97,128, 9, - 61,121, 2, 53, 39, 53, 51,226,225,242,237,229,238,233,225,110, - 128, 5, 97,233,110,130, 5,226, 53, 60, 53, 75,225,236,244,239, - 238,229,232,229,226,242,229,119,128,251, 32,232,229,226,242,229, - 119,128, 5,226, 98,144, 0, 98, 53,120, 53,255, 54, 10, 54, 19, - 54, 44, 55, 85, 55,147, 55,220, 57,146, 57,158, 57,201, 57,209, - 57,219, 59, 89, 59,113, 59,122, 97, 7, 53,136, 53,146, 53,170, - 53,177, 53,202, 53,226, 53,237,226,229,238,231,225,236,105,128, - 9,172,227,235,243,236,225,243,104,129, 0, 92, 53,158,237,239, - 238,239,243,240,225,227,101,128,255, 60,228,229,246, 97,128, 9, - 44,231,117, 2, 53,184, 53,193,234,225,242,225,244,105,128, 10, - 172,242,237,245,235,232,105,128, 10, 44,104, 2, 53,208, 53,218, - 233,242,225,231,225,238, 97,128, 48,112,244,244,232,225,105,128, - 14, 63,235,225,244,225,235,225,238, 97,128, 48,208,114,129, 0, - 124, 53,243,237,239,238,239,243,240,225,227,101,128,255, 92,226, - 239,240,239,237,239,230,111,128, 49, 5,227,233,242,227,236,101, - 128, 36,209,228,239,116, 2, 54, 27, 54, 36,225,227,227,229,238, - 116,128, 30, 3,226,229,236,239,119,128, 30, 5,101, 6, 54, 58, - 54, 79, 54,102, 54,244, 54,255, 55, 11,225,237,229,228,243,233, - 248,244,229,229,238,244,232,238,239,244,229,115,128, 38,108, 99, - 2, 54, 85, 54, 92,225,245,243,101,128, 34, 53,249,242,233,236, - 236,233, 99,128, 4, 49,104, 5, 54,114, 54,123, 54,137, 54,167, - 54,226,225,242,225,226,233, 99,128, 6, 40,230,233,238,225,236, - 225,242,225,226,233, 99,128,254,144,105, 2, 54,143, 54,158,238, - 233,244,233,225,236,225,242,225,226,233, 99,128,254,145,242,225, - 231,225,238, 97,128, 48,121,237,101, 2, 54,174, 54,187,228,233, - 225,236,225,242,225,226,233, 99,128,254,146,229,237,105, 2, 54, - 195, 54,210,238,233,244,233,225,236,225,242,225,226,233, 99,128, - 252,159,243,239,236,225,244,229,228,225,242,225,226,233, 99,128, - 252, 8,238,239,239,238,230,233,238,225,236,225,242,225,226,233, - 99,128,252,109,235,225,244,225,235,225,238, 97,128, 48,217,238, - 225,242,237,229,238,233,225,110,128, 5, 98,116,132, 5,209, 55, - 23, 55, 43, 55, 63, 55, 72, 97,129, 3,178, 55, 29,243,249,237, - 226,239,236,231,242,229,229,107,128, 3,208,228,225,231,229,243, - 104,129,251, 49, 55, 54,232,229,226,242,229,119,128,251, 49,232, - 229,226,242,229,119,128, 5,209,242,225,230,229,232,229,226,242, - 229,119,128,251, 76,104, 2, 55, 91, 55,141, 97, 3, 55, 99, 55, - 109, 55,116,226,229,238,231,225,236,105,128, 9,173,228,229,246, - 97,128, 9, 45,231,117, 2, 55,123, 55,132,234,225,242,225,244, - 105,128, 10,173,242,237,245,235,232,105,128, 10, 45,239,239,107, - 128, 2, 83,105, 5, 55,159, 55,170, 55,181, 55,195, 55,209,232, - 233,242,225,231,225,238, 97,128, 48,115,235,225,244,225,235,225, - 238, 97,128, 48,211,236,225,226,233,225,236,227,236,233,227,107, - 128, 2,152,238,228,233,231,245,242,237,245,235,232,105,128, 10, - 2,242,245,243,241,245,225,242,101,128, 51, 49,108, 3, 55,228, - 57,129, 57,140, 97, 2, 55,234, 57,124,227,107, 6, 55,249, 56, - 2, 56, 39, 56,188, 56,243, 57, 39,227,233,242,227,236,101,128, - 37,207,100, 2, 56, 8, 56, 17,233,225,237,239,238,100,128, 37, - 198,239,247,238,240,239,233,238,244,233,238,231,244,242,233,225, - 238,231,236,101,128, 37,188,108, 2, 56, 45, 56,148,101, 2, 56, - 51, 56, 87,230,244,240,239,233,238,244,233,238,103, 2, 56, 66, - 56, 76,240,239,233,238,244,229,114,128, 37,196,244,242,233,225, - 238,231,236,101,128, 37,192,238,244,233,227,245,236,225,242,226, - 242,225,227,235,229,116, 2, 56,107, 56,127,236,229,230,116,129, - 48, 16, 56,116,246,229,242,244,233,227,225,108,128,254, 59,242, - 233,231,232,116,129, 48, 17, 56,137,246,229,242,244,233,227,225, - 108,128,254, 60,239,247,229,114, 2, 56,157, 56,172,236,229,230, - 244,244,242,233,225,238,231,236,101,128, 37,227,242,233,231,232, - 244,244,242,233,225,238,231,236,101,128, 37,226,114, 2, 56,194, - 56,205,229,227,244,225,238,231,236,101,128, 37,172,233,231,232, - 244,240,239,233,238,244,233,238,103, 2, 56,222, 56,232,240,239, - 233,238,244,229,114,128, 37,186,244,242,233,225,238,231,236,101, - 128, 37,182,115, 3, 56,251, 57, 25, 57, 33,109, 2, 57, 1, 57, - 13,225,236,236,243,241,245,225,242,101,128, 37,170,233,236,233, - 238,231,230,225,227,101,128, 38, 59,241,245,225,242,101,128, 37, - 160,244,225,114,128, 38, 5,245,240,112, 2, 57, 47, 57, 85,229, - 114, 2, 57, 54, 57, 69,236,229,230,244,244,242,233,225,238,231, - 236,101,128, 37,228,242,233,231,232,244,244,242,233,225,238,231, - 236,101,128, 37,229,239,233,238,244,233,238,103, 2, 57, 97, 57, - 113,243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37, - 180,244,242,233,225,238,231,236,101,128, 37,178,238,107,128, 36, - 35,233,238,229,226,229,236,239,119,128, 30, 7,239,227,107,128, - 37,136,237,239,238,239,243,240,225,227,101,128,255, 66,111, 3, - 57,166, 57,179, 57,190,226,225,233,237,225,233,244,232,225,105, - 128, 14, 26,232,233,242,225,231,225,238, 97,128, 48,124,235,225, - 244,225,235,225,238, 97,128, 48,220,240,225,242,229,110,128, 36, - 157,241,243,241,245,225,242,101,128, 51,195,114, 4, 57,229, 58, - 223, 59, 40, 59, 79,225, 99, 2, 57,236, 58,130,101, 3, 57,244, - 57,249, 58, 61,229,120,128,248,244,236,229,230,116,133, 0,123, - 58, 10, 58, 15, 58, 37, 58, 45, 58, 50,226,116,128,248,243,109, - 2, 58, 21, 58, 26,233,100,128,248,242,239,238,239,243,240,225, - 227,101,128,255, 91,243,237,225,236,108,128,254, 91,244,112,128, - 248,241,246,229,242,244,233,227,225,108,128,254, 55,242,233,231, - 232,116,133, 0,125, 58, 79, 58, 84, 58,106, 58,114, 58,119,226, - 116,128,248,254,109, 2, 58, 90, 58, 95,233,100,128,248,253,239, - 238,239,243,240,225,227,101,128,255, 93,243,237,225,236,108,128, - 254, 92,244,112,128,248,252,246,229,242,244,233,227,225,108,128, - 254, 56,235,229,116, 2, 58,138, 58,180,236,229,230,116,132, 0, - 91, 58,153, 58,158, 58,163, 58,175,226,116,128,248,240,229,120, - 128,248,239,237,239,238,239,243,240,225,227,101,128,255, 59,244, - 112,128,248,238,242,233,231,232,116,132, 0, 93, 58,196, 58,201, - 58,206, 58,218,226,116,128,248,251,229,120,128,248,250,237,239, - 238,239,243,240,225,227,101,128,255, 61,244,112,128,248,249,229, - 246,101,131, 2,216, 58,235, 58,246, 58,252,226,229,236,239,247, - 227,237, 98,128, 3, 46,227,237, 98,128, 3, 6,233,238,246,229, - 242,244,229,100, 3, 59, 11, 59, 22, 59, 28,226,229,236,239,247, - 227,237, 98,128, 3, 47,227,237, 98,128, 3, 17,228,239,245,226, - 236,229,227,237, 98,128, 3, 97,233,228,231,101, 2, 59, 49, 59, - 60,226,229,236,239,247,227,237, 98,128, 3, 42,233,238,246,229, - 242,244,229,228,226,229,236,239,247,227,237, 98,128, 3, 58,239, - 235,229,238,226,225,114,128, 0,166,115, 2, 59, 95, 59,103,244, - 242,239,235,101,128, 1,128,245,240,229,242,233,239,114,128,246, - 234,244,239,240,226,225,114,128, 1,131,117, 3, 59,130, 59,141, - 59,152,232,233,242,225,231,225,238, 97,128, 48,118,235,225,244, - 225,235,225,238, 97,128, 48,214,236,108, 2, 59,159, 59,189,229, - 116,130, 32, 34, 59,168, 59,178,233,238,246,229,242,243,101,128, - 37,216,239,240,229,242,225,244,239,114,128, 34, 25,243,229,249, - 101,128, 37,206, 99,143, 0, 99, 59,230, 60,179, 60,190, 60,254, - 61, 29, 61,122, 63, 33, 64, 17, 64,117, 64,166, 67,158, 67,166, - 67,176, 67,188, 67,221, 97, 9, 59,250, 60, 5, 60, 15, 60, 22, - 60, 29, 60, 54, 60, 64, 60,116, 60,125,225,242,237,229,238,233, - 225,110,128, 5,110,226,229,238,231,225,236,105,128, 9,154,227, - 245,244,101,128, 1, 7,228,229,246, 97,128, 9, 26,231,117, 2, - 60, 36, 60, 45,234,225,242,225,244,105,128, 10,154,242,237,245, - 235,232,105,128, 10, 26,236,243,241,245,225,242,101,128, 51,136, - 238,228,242,225,226,233,238,228,117, 4, 60, 82, 60, 92, 60, 98, - 60,105,226,229,238,231,225,236,105,128, 9,129,227,237, 98,128, - 3, 16,228,229,246, 97,128, 9, 1,231,245,234,225,242,225,244, - 105,128, 10,129,240,243,236,239,227,107,128, 33,234,114, 3, 60, - 133, 60,139, 60,165,229,239,102,128, 33, 5,239,110,130, 2,199, - 60,148, 60,159,226,229,236,239,247,227,237, 98,128, 3, 44,227, - 237, 98,128, 3, 12,242,233,225,231,229,242,229,244,245,242,110, - 128, 33,181,226,239,240,239,237,239,230,111,128, 49, 24, 99, 4, - 60,200, 60,207, 60,226, 60,248,225,242,239,110,128, 1, 13,229, - 228,233,236,236, 97,129, 0,231, 60,218,225,227,245,244,101,128, - 30, 9,233,242, 99, 2, 60,234, 60,239,236,101,128, 36,210,245, - 237,230,236,229,120,128, 1, 9,245,242,108,128, 2, 85,100, 2, - 61, 4, 61, 20,239,116,129, 1, 11, 61, 11,225,227,227,229,238, - 116,128, 1, 11,243,241,245,225,242,101,128, 51,197,101, 2, 61, - 35, 61, 51,228,233,236,236, 97,129, 0,184, 61, 45,227,237, 98, - 128, 3, 39,238,116,132, 0,162, 61, 64, 61, 88, 61,100, 61,111, - 105, 2, 61, 70, 61, 78,231,242,225,228,101,128, 33, 3,238,230, - 229,242,233,239,114,128,246,223,237,239,238,239,243,240,225,227, - 101,128,255,224,239,236,228,243,244,249,236,101,128,247,162,243, - 245,240,229,242,233,239,114,128,246,224,104, 5, 61,134, 61,197, - 61,208, 62,136, 62,228, 97, 4, 61,144, 61,155, 61,165, 61,172, - 225,242,237,229,238,233,225,110,128, 5,121,226,229,238,231,225, - 236,105,128, 9,155,228,229,246, 97,128, 9, 27,231,117, 2, 61, - 179, 61,188,234,225,242,225,244,105,128, 10,155,242,237,245,235, - 232,105,128, 10, 27,226,239,240,239,237,239,230,111,128, 49, 20, - 101, 6, 61,222, 61,242, 62, 10, 62, 78, 62, 90, 62,111,225,226, - 235,232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, - 4,189, 99, 2, 61,248, 62, 0,235,237,225,242,107,128, 39, 19, - 249,242,233,236,236,233, 99,128, 4, 71,100, 2, 62, 16, 62, 60, - 229,243,227,229,238,228,229,114, 2, 62, 29, 62, 49,225,226,235, - 232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, 4, - 191,227,249,242,233,236,236,233, 99,128, 4,183,233,229,242,229, - 243,233,243,227,249,242,233,236,236,233, 99,128, 4,245,232,225, - 242,237,229,238,233,225,110,128, 5,115,235,232,225,235,225,243, - 243,233,225,238,227,249,242,233,236,236,233, 99,128, 4,204,246, - 229,242,244,233,227,225,236,243,244,242,239,235,229,227,249,242, - 233,236,236,233, 99,128, 4,185,105,129, 3,199, 62,142,229,245, - 227,104, 4, 62,155, 62,190, 62,205, 62,214, 97, 2, 62,161, 62, - 176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,119, - 240,225,242,229,238,235,239,242,229,225,110,128, 50, 23,227,233, - 242,227,236,229,235,239,242,229,225,110,128, 50,105,235,239,242, - 229,225,110,128, 49, 74,240,225,242,229,238,235,239,242,229,225, - 110,128, 50, 9,111, 2, 62,234, 63, 28,227,104, 3, 62,243, 63, - 9, 63, 19,225,110, 2, 62,250, 63, 2,231,244,232,225,105,128, - 14, 10,244,232,225,105,128, 14, 8,233,238,231,244,232,225,105, - 128, 14, 9,239,229,244,232,225,105,128, 14, 12,239,107,128, 1, - 136,105, 2, 63, 39, 63,141,229,245, 99, 5, 63, 53, 63, 88, 63, - 103, 63,112, 63,126, 97, 2, 63, 59, 63, 74,227,233,242,227,236, - 229,235,239,242,229,225,110,128, 50,118,240,225,242,229,238,235, - 239,242,229,225,110,128, 50, 22,227,233,242,227,236,229,235,239, - 242,229,225,110,128, 50,104,235,239,242,229,225,110,128, 49, 72, - 240,225,242,229,238,235,239,242,229,225,110,128, 50, 8,245,240, - 225,242,229,238,235,239,242,229,225,110,128, 50, 28,242, 99, 2, - 63,148, 63,243,236,101,132, 37,203, 63,161, 63,172, 63,177, 63, - 201,237,245,236,244,233,240,236,121,128, 34,151,239,116,128, 34, - 153,112, 2, 63,183, 63,189,236,245,115,128, 34,149,239,243,244, - 225,236,237,225,242,107,128, 48, 54,247,233,244,104, 2, 63,210, - 63,226,236,229,230,244,232,225,236,230,226,236,225,227,107,128, - 37,208,242,233,231,232,244,232,225,236,230,226,236,225,227,107, - 128, 37,209,245,237,230,236,229,120,130, 2,198, 64, 0, 64, 11, - 226,229,236,239,247,227,237, 98,128, 3, 45,227,237, 98,128, 3, - 2,108, 3, 64, 25, 64, 31, 64, 85,229,225,114,128, 35, 39,233, - 227,107, 4, 64, 43, 64, 54, 64, 63, 64, 73,225,236,246,229,239, - 236,225,114,128, 1,194,228,229,238,244,225,108,128, 1,192,236, - 225,244,229,242,225,108,128, 1,193,242,229,244,242,239,230,236, - 229,120,128, 1,195,245, 98,129, 38, 99, 64, 92,243,245,233,116, - 2, 64,101, 64,109,226,236,225,227,107,128, 38, 99,247,232,233, - 244,101,128, 38,103,109, 3, 64,125, 64,139, 64,150,227,245,226, - 229,228,243,241,245,225,242,101,128, 51,164,239,238,239,243,240, - 225,227,101,128,255, 67,243,241,245,225,242,229,228,243,241,245, - 225,242,101,128, 51,160,111, 8, 64,184, 64,195, 65, 26, 65,224, - 66,253, 67, 28, 67,135, 67,144,225,242,237,229,238,233,225,110, - 128, 5,129,236,239,110,131, 0, 58, 64,207, 64,232, 64,251,237, - 239,110, 2, 64,215, 64,223,229,244,225,242,121,128, 32,161,239, - 243,240,225,227,101,128,255, 26,115, 2, 64,238, 64,244,233,231, - 110,128, 32,161,237,225,236,108,128,254, 85,244,242,233,225,238, - 231,245,236,225,114, 2, 65, 10, 65, 20,232,225,236,230,237,239, - 100,128, 2,209,237,239,100,128, 2,208,109, 2, 65, 32, 65,217, - 237, 97,134, 0, 44, 65, 49, 65,113, 65,124, 65,136, 65,166, 65, - 189, 97, 3, 65, 57, 65, 83, 65, 91,226,239,246,101, 2, 65, 66, - 65, 72,227,237, 98,128, 3, 19,242,233,231,232,244,227,237, 98, - 128, 3, 21,227,227,229,238,116,128,246,195,114, 2, 65, 97, 65, - 104,225,226,233, 99,128, 6, 12,237,229,238,233,225,110,128, 5, - 93,233,238,230,229,242,233,239,114,128,246,225,237,239,238,239, - 243,240,225,227,101,128,255, 12,242,229,246,229,242,243,229,100, - 2, 65,149, 65,160,225,226,239,246,229,227,237, 98,128, 3, 20, - 237,239,100,128, 2,189,115, 2, 65,172, 65,179,237,225,236,108, - 128,254, 80,245,240,229,242,233,239,114,128,246,226,244,245,242, - 238,229,100, 2, 65,200, 65,211,225,226,239,246,229,227,237, 98, - 128, 3, 18,237,239,100,128, 2,187,240,225,243,115,128, 38, 60, - 110, 2, 65,230, 65,239,231,242,245,229,238,116,128, 34, 69,116, - 2, 65,245, 66, 3,239,245,242,233,238,244,229,231,242,225,108, - 128, 34, 46,242,239,108,142, 35, 3, 66, 37, 66, 43, 66, 58, 66, - 73, 66,117, 66,162, 66,176, 66,181, 66,186, 66,191, 66,197, 66, - 202, 66,243, 66,248,193,195, 75,128, 0, 6, 66, 2, 66, 49, 66, - 54,197, 76,128, 0, 7, 83,128, 0, 8, 67, 2, 66, 64, 66, 69, - 193, 78,128, 0, 24, 82,128, 0, 13, 68, 3, 66, 81, 66,107, 66, - 112, 67, 4, 66, 91, 66, 95, 66, 99, 66,103, 49,128, 0, 17, 50, - 128, 0, 18, 51,128, 0, 19, 52,128, 0, 20,197, 76,128, 0,127, - 204, 69,128, 0, 16, 69, 5, 66,129, 66,133, 66,138, 66,143, 66, - 148, 77,128, 0, 25,206, 81,128, 0, 5,207, 84,128, 0, 4,211, - 67,128, 0, 27, 84, 2, 66,154, 66,158, 66,128, 0, 23, 88,128, - 0, 3, 70, 2, 66,168, 66,172, 70,128, 0, 12, 83,128, 0, 28, - 199, 83,128, 0, 29,200, 84,128, 0, 9,204, 70,128, 0, 10,206, - 193, 75,128, 0, 21,210, 83,128, 0, 30, 83, 5, 66,214, 66,218, - 66,228, 66,233, 66,238, 73,128, 0, 15, 79,129, 0, 14, 66,224, - 84,128, 0, 2,212, 88,128, 0, 1,213, 66,128, 0, 26,217, 78, - 128, 0, 22,213, 83,128, 0, 31,214, 84,128, 0, 11,240,249,242, - 233,231,232,116,129, 0,169, 67, 9,115, 2, 67, 15, 67, 21,225, - 238,115,128,248,233,229,242,233,102,128,246,217,114, 2, 67, 34, - 67,118,238,229,242,226,242,225,227,235,229,116, 2, 67, 49, 67, - 83,236,229,230,116,130, 48, 12, 67, 60, 67, 72,232,225,236,230, - 247,233,228,244,104,128,255, 98,246,229,242,244,233,227,225,108, - 128,254, 65,242,233,231,232,116,130, 48, 13, 67, 95, 67,107,232, - 225,236,230,247,233,228,244,104,128,255, 99,246,229,242,244,233, - 227,225,108,128,254, 66,240,239,242,225,244,233,239,238,243,241, - 245,225,242,101,128, 51,127,243,241,245,225,242,101,128, 51,199, - 246,229,242,235,231,243,241,245,225,242,101,128, 51,198,240,225, - 242,229,110,128, 36,158,242,245,250,229,233,242,111,128, 32,162, - 243,244,242,229,244,227,232,229,100,128, 2,151,245,114, 2, 67, - 195, 67,213,236,121, 2, 67,202, 67,208,225,238,100,128, 34,207, - 239,114,128, 34,206,242,229,238,227,121,128, 0,164,249,114, 4, - 67,232, 67,240, 67,247, 67,255,194,242,229,246,101,128,246,209, - 198,236,229,120,128,246,210,226,242,229,246,101,128,246,212,230, - 236,229,120,128,246,213,100,146, 0,100, 68, 46, 69,184, 70,208, - 71, 12, 71,188, 72,142, 72,204, 73,133, 73,146, 73,155, 73,181, - 73,206, 73,215, 75, 26, 75, 34, 75, 45, 75, 65, 75, 93, 97, 11, - 68, 70, 68, 81, 68, 91, 68,163, 68,226, 68,237, 68,248, 69, 61, - 69,123, 69,129, 69,159,225,242,237,229,238,233,225,110,128, 5, - 100,226,229,238,231,225,236,105,128, 9,166,100, 5, 68,103, 68, - 112, 68,118, 68,132, 68,148,225,242,225,226,233, 99,128, 6, 54, - 229,246, 97,128, 9, 38,230,233,238,225,236,225,242,225,226,233, - 99,128,254,190,233,238,233,244,233,225,236,225,242,225,226,233, - 99,128,254,191,237,229,228,233,225,236,225,242,225,226,233, 99, - 128,254,192,103, 3, 68,171, 68,188, 68,202,229,243,104,129, 5, - 188, 68,179,232,229,226,242,229,119,128, 5,188,231,229,114,129, - 32, 32, 68,196,228,226,108,128, 32, 33,117, 2, 68,208, 68,217, - 234,225,242,225,244,105,128, 10,166,242,237,245,235,232,105,128, - 10, 38,232,233,242,225,231,225,238, 97,128, 48, 96,235,225,244, - 225,235,225,238, 97,128, 48,192,108, 3, 69, 0, 69, 9, 69, 47, - 225,242,225,226,233, 99,128, 6, 47,229,116,130, 5,211, 69, 18, - 69, 38,228,225,231,229,243,104,129,251, 51, 69, 29,232,229,226, - 242,229,119,128,251, 51,232,229,226,242,229,119,128, 5,211,230, - 233,238,225,236,225,242,225,226,233, 99,128,254,170,237,237, 97, - 3, 69, 71, 69, 80, 69, 92,225,242,225,226,233, 99,128, 6, 79, - 236,239,247,225,242,225,226,233, 99,128, 6, 79,244,225,238, 97, - 2, 69,101, 69,115,236,244,239,238,229,225,242,225,226,233, 99, - 128, 6, 76,242,225,226,233, 99,128, 6, 76,238,228, 97,128, 9, - 100,242,231, 97, 2, 69,137, 69,146,232,229,226,242,229,119,128, - 5,167,236,229,230,244,232,229,226,242,229,119,128, 5,167,243, - 233,225,240,238,229,245,237,225,244,225,227,249,242,233,236,236, - 233,227,227,237, 98,128, 4,133, 98, 3, 69,192, 70,189, 70,199, - 108, 9, 69,212, 69,220, 70, 77, 70, 85, 70,101, 70,112, 70,130, - 70,144, 70,155,199,242,225,246,101,128,246,211, 97, 2, 69,226, - 70, 27,238,231,236,229,226,242,225,227,235,229,116, 2, 69,242, - 70, 6,236,229,230,116,129, 48, 10, 69,251,246,229,242,244,233, - 227,225,108,128,254, 61,242,233,231,232,116,129, 48, 11, 70, 16, - 246,229,242,244,233,227,225,108,128,254, 62,114, 2, 70, 33, 70, - 54,227,232,233,238,246,229,242,244,229,228,226,229,236,239,247, - 227,237, 98,128, 3, 43,242,239,119, 2, 70, 62, 70, 69,236,229, - 230,116,128, 33,212,242,233,231,232,116,128, 33,210,228,225,238, - 228, 97,128, 9,101,231,242,225,246,101,129,246,214, 70, 95,227, - 237, 98,128, 3, 15,233,238,244,229,231,242,225,108,128, 34, 44, - 236,239,247,236,233,238,101,129, 32, 23, 70,124,227,237, 98,128, - 3, 51,239,246,229,242,236,233,238,229,227,237, 98,128, 3, 63, - 240,242,233,237,229,237,239,100,128, 2,186,246,229,242,244,233, - 227,225,108, 2, 70,168, 70,174,226,225,114,128, 32, 22,236,233, - 238,229,225,226,239,246,229,227,237, 98,128, 3, 14,239,240,239, - 237,239,230,111,128, 49, 9,243,241,245,225,242,101,128, 51,200, - 99, 4, 70,218, 70,225, 70,234, 71, 5,225,242,239,110,128, 1, - 15,229,228,233,236,236, 97,128, 30, 17,233,242, 99, 2, 70,242, - 70,247,236,101,128, 36,211,245,237,230,236,229,248,226,229,236, - 239,119,128, 30, 19,242,239,225,116,128, 1, 17,100, 4, 71, 22, - 71,103, 71,113, 71,164, 97, 4, 71, 32, 71, 42, 71, 49, 71, 74, - 226,229,238,231,225,236,105,128, 9,161,228,229,246, 97,128, 9, - 33,231,117, 2, 71, 56, 71, 65,234,225,242,225,244,105,128, 10, - 161,242,237,245,235,232,105,128, 10, 33,108, 2, 71, 80, 71, 89, - 225,242,225,226,233, 99,128, 6,136,230,233,238,225,236,225,242, - 225,226,233, 99,128,251,137,228,232,225,228,229,246, 97,128, 9, - 92,232, 97, 3, 71,122, 71,132, 71,139,226,229,238,231,225,236, - 105,128, 9,162,228,229,246, 97,128, 9, 34,231,117, 2, 71,146, - 71,155,234,225,242,225,244,105,128, 10,162,242,237,245,235,232, - 105,128, 10, 34,239,116, 2, 71,171, 71,180,225,227,227,229,238, - 116,128, 30, 11,226,229,236,239,119,128, 30, 13,101, 8, 71,206, - 72, 3, 72, 10, 72, 35, 72, 45, 72, 56, 72,101, 72,137, 99, 2, - 71,212, 71,249,233,237,225,236,243,229,240,225,242,225,244,239, - 114, 2, 71,230, 71,239,225,242,225,226,233, 99,128, 6,107,240, - 229,242,243,233,225,110,128, 6,107,249,242,233,236,236,233, 99, - 128, 4, 52,231,242,229,101,128, 0,176,232,105, 2, 72, 17, 72, - 26,232,229,226,242,229,119,128, 5,173,242,225,231,225,238, 97, - 128, 48,103,233,227,239,240,244,233, 99,128, 3,239,235,225,244, - 225,235,225,238, 97,128, 48,199,108, 2, 72, 62, 72, 85,229,244, - 101, 2, 72, 70, 72, 77,236,229,230,116,128, 35, 43,242,233,231, - 232,116,128, 35, 38,244, 97,129, 3,180, 72, 92,244,245,242,238, - 229,100,128, 1,141,238,239,237,233,238,225,244,239,242,237,233, - 238,245,243,239,238,229,238,245,237,229,242,225,244,239,242,226, - 229,238,231,225,236,105,128, 9,248,250,104,128, 2,164,104, 2, - 72,148, 72,198, 97, 3, 72,156, 72,166, 72,173,226,229,238,231, - 225,236,105,128, 9,167,228,229,246, 97,128, 9, 39,231,117, 2, - 72,180, 72,189,234,225,242,225,244,105,128, 10,167,242,237,245, - 235,232,105,128, 10, 39,239,239,107,128, 2, 87,105, 6, 72,218, - 73, 11, 73, 71, 73, 82, 73, 93, 73,103, 97, 2, 72,224, 72,246, - 236,249,244,233,235,225,244,239,238,239,115,129, 3,133, 72,240, - 227,237, 98,128, 3, 68,237,239,238,100,129, 38,102, 72,255,243, - 245,233,244,247,232,233,244,101,128, 38, 98,229,242,229,243,233, - 115,133, 0,168, 73, 30, 73, 38, 73, 49, 73, 55, 73, 63,225,227, - 245,244,101,128,246,215,226,229,236,239,247,227,237, 98,128, 3, - 36,227,237, 98,128, 3, 8,231,242,225,246,101,128,246,216,244, - 239,238,239,115,128, 3,133,232,233,242,225,231,225,238, 97,128, - 48, 98,235,225,244,225,235,225,238, 97,128, 48,194,244,244,239, - 237,225,242,107,128, 48, 3,246,105, 2, 73,110, 73,121,228,101, - 129, 0,247, 73,117,115,128, 34, 35,243,233,239,238,243,236,225, - 243,104,128, 34, 21,234,229,227,249,242,233,236,236,233, 99,128, - 4, 82,235,243,232,225,228,101,128, 37,147,108, 2, 73,161, 73, - 172,233,238,229,226,229,236,239,119,128, 30, 15,243,241,245,225, - 242,101,128, 51,151,109, 2, 73,187, 73,195,225,227,242,239,110, - 128, 1, 17,239,238,239,243,240,225,227,101,128,255, 68,238,226, - 236,239,227,107,128, 37,132,111, 10, 73,237, 73,249, 74, 3, 74, - 14, 74, 25, 74, 97, 74,102, 74,113, 74,228, 74,254,227,232,225, - 228,225,244,232,225,105,128, 14, 14,228,229,235,244,232,225,105, - 128, 14, 20,232,233,242,225,231,225,238, 97,128, 48,105,235,225, - 244,225,235,225,238, 97,128, 48,201,236,236,225,114,132, 0, 36, - 74, 40, 74, 51, 74, 63, 74, 74,233,238,230,229,242,233,239,114, - 128,246,227,237,239,238,239,243,240,225,227,101,128,255, 4,239, - 236,228,243,244,249,236,101,128,247, 36,115, 2, 74, 80, 74, 87, - 237,225,236,108,128,254,105,245,240,229,242,233,239,114,128,246, - 228,238,103,128, 32,171,242,245,243,241,245,225,242,101,128, 51, - 38,116, 6, 74,127, 74,144, 74,166, 74,177, 74,209, 74,216,225, - 227,227,229,238,116,129, 2,217, 74,138,227,237, 98,128, 3, 7, - 226,229,236,239,247, 99, 2, 74,155, 74,160,237, 98,128, 3, 35, - 239,237, 98,128, 3, 35,235,225,244,225,235,225,238, 97,128, 48, - 251,236,229,243,115, 2, 74,186, 74,190,105,128, 1, 49,106,129, - 246,190, 74,196,243,244,242,239,235,229,232,239,239,107,128, 2, - 132,237,225,244,104,128, 34,197,244,229,228,227,233,242,227,236, - 101,128, 37,204,245,226,236,229,249,239,228,240,225,244,225,104, - 129,251, 31, 74,245,232,229,226,242,229,119,128,251, 31,247,238, - 244,225,227,107, 2, 75, 9, 75, 20,226,229,236,239,247,227,237, - 98,128, 3, 30,237,239,100,128, 2,213,240,225,242,229,110,128, - 36,159,243,245,240,229,242,233,239,114,128,246,235,116, 2, 75, - 51, 75, 57,225,233,108,128, 2, 86,239,240,226,225,114,128, 1, - 140,117, 2, 75, 71, 75, 82,232,233,242,225,231,225,238, 97,128, - 48,101,235,225,244,225,235,225,238, 97,128, 48,197,122,132, 1, - 243, 75,105, 75,114, 75,133, 75,170,225,236,244,239,238,101,128, - 2,163, 99, 2, 75,120, 75,127,225,242,239,110,128, 1,198,245, - 242,108,128, 2,165,101, 2, 75,139, 75,159,225,226,235,232,225, - 243,233,225,238,227,249,242,233,236,236,233, 99,128, 4,225,227, - 249,242,233,236,236,233, 99,128, 4, 85,232,229,227,249,242,233, - 236,236,233, 99,128, 4, 95,101,151, 0,101, 75,233, 75,252, 76, - 30, 77, 4, 77, 66, 77, 99, 77,111, 77,134, 77,187, 79, 43, 79, - 101, 79,203, 80, 63, 80,198, 81, 17, 81, 48, 81,110, 81,163, 82, - 98, 82,231, 82,251, 83, 39, 83,130, 97, 2, 75,239, 75,246,227, - 245,244,101,128, 0,233,242,244,104,128, 38, 65, 98, 3, 76, 4, - 76, 13, 76, 23,229,238,231,225,236,105,128, 9,143,239,240,239, - 237,239,230,111,128, 49, 28,242,229,246,101,128, 1, 21, 99, 5, - 76, 42, 76,115, 76,129, 76,161, 76,250, 97, 2, 76, 48, 76,109, - 238,228,242, 97, 3, 76, 59, 76, 66, 76, 77,228,229,246, 97,128, - 9, 13,231,245,234,225,242,225,244,105,128, 10,141,246,239,247, - 229,236,243,233,231,110, 2, 76, 91, 76, 98,228,229,246, 97,128, - 9, 69,231,245,234,225,242,225,244,105,128, 10,197,242,239,110, - 128, 1, 27,229,228,233,236,236,225,226,242,229,246,101,128, 30, - 29,104, 2, 76,135, 76,146,225,242,237,229,238,233,225,110,128, - 5,101,249,233,247,238,225,242,237,229,238,233,225,110,128, 5, - 135,233,242, 99, 2, 76,169, 76,174,236,101,128, 36,212,245,237, - 230,236,229,120,134, 0,234, 76,195, 76,203, 76,211, 76,222, 76, - 230, 76,242,225,227,245,244,101,128, 30,191,226,229,236,239,119, - 128, 30, 25,228,239,244,226,229,236,239,119,128, 30,199,231,242, - 225,246,101,128, 30,193,232,239,239,235,225,226,239,246,101,128, - 30,195,244,233,236,228,101,128, 30,197,249,242,233,236,236,233, - 99,128, 4, 84,100, 4, 77, 14, 77, 24, 77, 30, 77, 40,226,236, - 231,242,225,246,101,128, 2, 5,229,246, 97,128, 9, 15,233,229, - 242,229,243,233,115,128, 0,235,239,116,130, 1, 23, 77, 49, 77, - 58,225,227,227,229,238,116,128, 1, 23,226,229,236,239,119,128, - 30,185,101, 2, 77, 72, 77, 83,231,245,242,237,245,235,232,105, - 128, 10, 15,237,225,244,242,225,231,245,242,237,245,235,232,105, - 128, 10, 71,230,227,249,242,233,236,236,233, 99,128, 4, 68,103, - 2, 77,117, 77,124,242,225,246,101,128, 0,232,245,234,225,242, - 225,244,105,128, 10,143,104, 4, 77,144, 77,155, 77,166, 77,176, - 225,242,237,229,238,233,225,110,128, 5,103,226,239,240,239,237, - 239,230,111,128, 49, 29,233,242,225,231,225,238, 97,128, 48, 72, - 239,239,235,225,226,239,246,101,128, 30,187,105, 4, 77,197, 77, - 208, 79, 10, 79, 25,226,239,240,239,237,239,230,111,128, 49, 31, - 231,232,116,142, 0, 56, 77,242, 77,251, 78, 5, 78, 35, 78, 42, - 78, 80, 78,105, 78,150, 78,184, 78,196, 78,207, 78,240, 78,248, - 79, 3,225,242,225,226,233, 99,128, 6,104,226,229,238,231,225, - 236,105,128, 9,238,227,233,242,227,236,101,129, 36,103, 78, 16, - 233,238,246,229,242,243,229,243,225,238,243,243,229,242,233,102, - 128, 39,145,228,229,246, 97,128, 9,110,229,229,110, 2, 78, 50, - 78, 59,227,233,242,227,236,101,128, 36,113,112, 2, 78, 65, 78, - 72,225,242,229,110,128, 36,133,229,242,233,239,100,128, 36,153, - 231,117, 2, 78, 87, 78, 96,234,225,242,225,244,105,128, 10,238, - 242,237,245,235,232,105,128, 10,110,104, 2, 78,111, 78,137, 97, - 2, 78,117, 78,128,227,235,225,242,225,226,233, 99,128, 6,104, - 238,231,250,232,239,117,128, 48, 40,238,239,244,229,226,229,225, - 237,229,100,128, 38,107,105, 2, 78,156, 78,174,228,229,239,231, - 242,225,240,232,233,227,240,225,242,229,110,128, 50, 39,238,230, - 229,242,233,239,114,128, 32,136,237,239,238,239,243,240,225,227, - 101,128,255, 24,239,236,228,243,244,249,236,101,128,247, 56,112, - 2, 78,213, 78,220,225,242,229,110,128, 36,123,229,114, 2, 78, - 227, 78,233,233,239,100,128, 36,143,243,233,225,110,128, 6,248, - 242,239,237,225,110,128, 33,119,243,245,240,229,242,233,239,114, - 128, 32,120,244,232,225,105,128, 14, 88,238,246,229,242,244,229, - 228,226,242,229,246,101,128, 2, 7,239,244,233,230,233,229,228, - 227,249,242,233,236,236,233, 99,128, 4,101,107, 2, 79, 49, 79, - 73,225,244,225,235,225,238, 97,129, 48,168, 79, 61,232,225,236, - 230,247,233,228,244,104,128,255,116,111, 2, 79, 79, 79, 94,238, - 235,225,242,231,245,242,237,245,235,232,105,128, 10,116,242,229, - 225,110,128, 49, 84,108, 3, 79,109, 79,120, 79,181,227,249,242, - 233,236,236,233, 99,128, 4, 59,101, 2, 79,126, 79,133,237,229, - 238,116,128, 34, 8,246,229,110, 3, 79,143, 79,152, 79,173,227, - 233,242,227,236,101,128, 36,106,112, 2, 79,158, 79,165,225,242, - 229,110,128, 36,126,229,242,233,239,100,128, 36,146,242,239,237, - 225,110,128, 33,122,236,233,240,243,233,115,129, 32, 38, 79,192, - 246,229,242,244,233,227,225,108,128, 34,238,109, 5, 79,215, 79, - 243, 79,254, 80, 18, 80, 29,225,227,242,239,110,130, 1, 19, 79, - 227, 79,235,225,227,245,244,101,128, 30, 23,231,242,225,246,101, - 128, 30, 21,227,249,242,233,236,236,233, 99,128, 4, 60,228,225, - 243,104,129, 32, 20, 80, 7,246,229,242,244,233,227,225,108,128, - 254, 49,239,238,239,243,240,225,227,101,128,255, 69,112, 2, 80, - 35, 80, 55,232,225,243,233,243,237,225,242,235,225,242,237,229, - 238,233,225,110,128, 5, 91,244,249,243,229,116,128, 34, 5,110, - 6, 80, 77, 80, 88, 80, 99, 80,143, 80,175, 80,190,226,239,240, - 239,237,239,230,111,128, 49, 35,227,249,242,233,236,236,233, 99, - 128, 4, 61,100, 2, 80,105, 80,124,225,243,104,129, 32, 19, 80, - 113,246,229,242,244,233,227,225,108,128,254, 50,229,243,227,229, - 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,163,103, - 130, 1, 75, 80,151, 80,162,226,239,240,239,237,239,230,111,128, - 49, 37,232,229,227,249,242,233,236,236,233, 99,128, 4,165,232, - 239,239,235,227,249,242,233,236,236,233, 99,128, 4,200,243,240, - 225,227,101,128, 32, 2,111, 3, 80,206, 80,214, 80,223,231,239, - 238,229,107,128, 1, 25,235,239,242,229,225,110,128, 49, 83,240, - 229,110,130, 2, 91, 80,233, 80,242,227,236,239,243,229,100,128, - 2,154,242,229,246,229,242,243,229,100,130, 2, 92, 81, 1, 81, - 10,227,236,239,243,229,100,128, 2, 94,232,239,239,107,128, 2, - 93,112, 2, 81, 23, 81, 30,225,242,229,110,128, 36,160,243,233, - 236,239,110,129, 3,181, 81, 40,244,239,238,239,115,128, 3,173, - 241,117, 2, 81, 55, 81, 99,225,108,130, 0, 61, 81, 64, 81, 76, - 237,239,238,239,243,240,225,227,101,128,255, 29,115, 2, 81, 82, - 81, 89,237,225,236,108,128,254,102,245,240,229,242,233,239,114, - 128, 32,124,233,246,225,236,229,238,227,101,128, 34, 97,114, 3, - 81,118, 81,129, 81,140,226,239,240,239,237,239,230,111,128, 49, - 38,227,249,242,233,236,236,233, 99,128, 4, 64,229,246,229,242, - 243,229,100,129, 2, 88, 81,152,227,249,242,233,236,236,233, 99, - 128, 4, 77,115, 6, 81,177, 81,188, 81,208, 82, 33, 82, 78, 82, - 88,227,249,242,233,236,236,233, 99,128, 4, 65,228,229,243,227, - 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,171, - 104,132, 2,131, 81,220, 81,227, 82, 2, 82, 17,227,245,242,108, - 128, 2,134,239,242,116, 2, 81,235, 81,242,228,229,246, 97,128, - 9, 14,246,239,247,229,236,243,233,231,238,228,229,246, 97,128, - 9, 70,242,229,246,229,242,243,229,228,236,239,239,112,128, 1, - 170,243,241,245,225,244,242,229,246,229,242,243,229,100,128, 2, - 133,237,225,236,108, 2, 82, 42, 82, 53,232,233,242,225,231,225, - 238, 97,128, 48, 71,235,225,244,225,235,225,238, 97,129, 48,167, - 82, 66,232,225,236,230,247,233,228,244,104,128,255,106,244,233, - 237,225,244,229,100,128, 33, 46,245,240,229,242,233,239,114,128, - 246,236,116, 5, 82,110, 82,136, 82,140, 82,157, 82,223, 97,130, - 3,183, 82,118, 82,128,242,237,229,238,233,225,110,128, 5,104, - 244,239,238,239,115,128, 3,174,104,128, 0,240,233,236,228,101, - 129, 30,189, 82,149,226,229,236,239,119,128, 30, 27,238,225,232, - 244, 97, 3, 82,169, 82,201, 82,210,230,239,245,235,104, 2, 82, - 179, 82,188,232,229,226,242,229,119,128, 5,145,236,229,230,244, - 232,229,226,242,229,119,128, 5,145,232,229,226,242,229,119,128, - 5,145,236,229,230,244,232,229,226,242,229,119,128, 5,145,245, - 242,238,229,100,128, 1,221,117, 2, 82,237, 82,246,235,239,242, - 229,225,110,128, 49, 97,242,111,128, 32,172,246,239,247,229,236, - 243,233,231,110, 3, 83, 11, 83, 21, 83, 28,226,229,238,231,225, - 236,105,128, 9,199,228,229,246, 97,128, 9, 71,231,245,234,225, - 242,225,244,105,128, 10,199,120, 2, 83, 45, 83,118,227,236,225, - 109,132, 0, 33, 83, 60, 83, 71, 83, 98, 83,110,225,242,237,229, - 238,233,225,110,128, 5, 92,100, 2, 83, 77, 83, 82,226,108,128, - 32, 60,239,247,110,129, 0,161, 83, 90,243,237,225,236,108,128, - 247,161,237,239,238,239,243,240,225,227,101,128,255, 1,243,237, - 225,236,108,128,247, 33,233,243,244,229,238,244,233,225,108,128, - 34, 3,250,104,131, 2,146, 83,141, 83,160, 83,171, 99, 2, 83, - 147, 83,154,225,242,239,110,128, 1,239,245,242,108,128, 2,147, - 242,229,246,229,242,243,229,100,128, 1,185,244,225,233,108,128, - 1,186,102,140, 0,102, 83,206, 84, 32, 84, 43, 84, 52, 84, 64, - 84,167, 84,183, 86,191, 86,204, 86,230, 88,107, 88,115, 97, 4, - 83,216, 83,223, 83,234, 83,245,228,229,246, 97,128, 9, 94,231, - 245,242,237,245,235,232,105,128, 10, 94,232,242,229,238,232,229, - 233,116,128, 33, 9,244,232, 97, 3, 83,255, 84, 8, 84, 20,225, - 242,225,226,233, 99,128, 6, 78,236,239,247,225,242,225,226,233, - 99,128, 6, 78,244,225,238,225,242,225,226,233, 99,128, 6, 75, - 226,239,240,239,237,239,230,111,128, 49, 8,227,233,242,227,236, - 101,128, 36,213,228,239,244,225,227,227,229,238,116,128, 30, 31, - 101, 3, 84, 72, 84,150, 84,160,104, 4, 84, 82, 84,105, 84,119, - 84,135,225,114, 2, 84, 89, 84, 96,225,226,233, 99,128, 6, 65, - 237,229,238,233,225,110,128, 5,134,230,233,238,225,236,225,242, - 225,226,233, 99,128,254,210,233,238,233,244,233,225,236,225,242, - 225,226,233, 99,128,254,211,237,229,228,233,225,236,225,242,225, - 226,233, 99,128,254,212,233,227,239,240,244,233, 99,128, 3,229, - 237,225,236,101,128, 38, 64,102,130,251, 0, 84,175, 84,179,105, - 128,251, 3,108,128,251, 4,105,136,251, 1, 84,203, 84,243, 84, - 254, 85, 20, 85,142, 85,159, 85,167, 85,180,230,244,229,229,110, - 2, 84,213, 84,222,227,233,242,227,236,101,128, 36,110,112, 2, - 84,228, 84,235,225,242,229,110,128, 36,130,229,242,233,239,100, - 128, 36,150,231,245,242,229,228,225,243,104,128, 32, 18,236,236, - 229,100, 2, 85, 7, 85, 13,226,239,120,128, 37,160,242,229,227, - 116,128, 37,172,238,225,108, 5, 85, 34, 85, 73, 85, 90, 85,107, - 85,123,235,225,102,130, 5,218, 85, 44, 85, 64,228,225,231,229, - 243,104,129,251, 58, 85, 55,232,229,226,242,229,119,128,251, 58, - 232,229,226,242,229,119,128, 5,218,237,229,109,129, 5,221, 85, - 81,232,229,226,242,229,119,128, 5,221,238,245,110,129, 5,223, - 85, 98,232,229,226,242,229,119,128, 5,223,240,101,129, 5,227, - 85,114,232,229,226,242,229,119,128, 5,227,244,243,225,228,105, - 129, 5,229, 85,133,232,229,226,242,229,119,128, 5,229,242,243, - 244,244,239,238,229,227,232,233,238,229,243,101,128, 2,201,243, - 232,229,249,101,128, 37,201,244,225,227,249,242,233,236,236,233, - 99,128, 4,115,246,101,142, 0, 53, 85,213, 85,222, 85,232, 86, - 6, 86, 13, 86, 23, 86, 48, 86, 75, 86,109, 86,121, 86,132, 86, - 165, 86,173, 86,184,225,242,225,226,233, 99,128, 6,101,226,229, - 238,231,225,236,105,128, 9,235,227,233,242,227,236,101,129, 36, - 100, 85,243,233,238,246,229,242,243,229,243,225,238,243,243,229, - 242,233,102,128, 39,142,228,229,246, 97,128, 9,107,229,233,231, - 232,244,232,115,128, 33, 93,231,117, 2, 86, 30, 86, 39,234,225, - 242,225,244,105,128, 10,235,242,237,245,235,232,105,128, 10,107, - 232, 97, 2, 86, 55, 86, 66,227,235,225,242,225,226,233, 99,128, - 6,101,238,231,250,232,239,117,128, 48, 37,105, 2, 86, 81, 86, - 99,228,229,239,231,242,225,240,232,233,227,240,225,242,229,110, - 128, 50, 36,238,230,229,242,233,239,114,128, 32,133,237,239,238, - 239,243,240,225,227,101,128,255, 21,239,236,228,243,244,249,236, - 101,128,247, 53,112, 2, 86,138, 86,145,225,242,229,110,128, 36, - 120,229,114, 2, 86,152, 86,158,233,239,100,128, 36,140,243,233, - 225,110,128, 6,245,242,239,237,225,110,128, 33,116,243,245,240, - 229,242,233,239,114,128, 32,117,244,232,225,105,128, 14, 85,108, - 129,251, 2, 86,197,239,242,233,110,128, 1,146,109, 2, 86,210, - 86,221,239,238,239,243,240,225,227,101,128,255, 70,243,241,245, - 225,242,101,128, 51,153,111, 4, 86,240, 87, 6, 87, 18, 87, 25, - 230, 97, 2, 86,247, 86,255,238,244,232,225,105,128, 14, 31,244, - 232,225,105,128, 14, 29,238,231,237,225,238,244,232,225,105,128, - 14, 79,242,225,236,108,128, 34, 0,245,114,142, 0, 52, 87, 58, - 87, 67, 87, 77, 87,107, 87,114, 87,139, 87,166, 87,200, 87,212, - 87,231, 87,242, 88, 19, 88, 27, 88, 38,225,242,225,226,233, 99, - 128, 6,100,226,229,238,231,225,236,105,128, 9,234,227,233,242, - 227,236,101,129, 36, 99, 87, 88,233,238,246,229,242,243,229,243, - 225,238,243,243,229,242,233,102,128, 39,141,228,229,246, 97,128, - 9,106,231,117, 2, 87,121, 87,130,234,225,242,225,244,105,128, - 10,234,242,237,245,235,232,105,128, 10,106,232, 97, 2, 87,146, - 87,157,227,235,225,242,225,226,233, 99,128, 6,100,238,231,250, - 232,239,117,128, 48, 36,105, 2, 87,172, 87,190,228,229,239,231, - 242,225,240,232,233,227,240,225,242,229,110,128, 50, 35,238,230, - 229,242,233,239,114,128, 32,132,237,239,238,239,243,240,225,227, - 101,128,255, 20,238,245,237,229,242,225,244,239,242,226,229,238, - 231,225,236,105,128, 9,247,239,236,228,243,244,249,236,101,128, - 247, 52,112, 2, 87,248, 87,255,225,242,229,110,128, 36,119,229, - 114, 2, 88, 6, 88, 12,233,239,100,128, 36,139,243,233,225,110, - 128, 6,244,242,239,237,225,110,128, 33,115,243,245,240,229,242, - 233,239,114,128, 32,116,116, 2, 88, 44, 88, 82,229,229,110, 2, - 88, 52, 88, 61,227,233,242,227,236,101,128, 36,109,112, 2, 88, - 67, 88, 74,225,242,229,110,128, 36,129,229,242,233,239,100,128, - 36,149,104, 2, 88, 88, 88, 93,225,105,128, 14, 84,244,239,238, - 229,227,232,233,238,229,243,101,128, 2,203,240,225,242,229,110, - 128, 36,161,242, 97, 2, 88,122, 88,130,227,244,233,239,110,128, - 32, 68,238, 99,128, 32,163,103,144, 0,103, 88,171, 89,117, 89, - 140, 89,201, 89,218, 90,139, 91,132, 91,217, 91,230, 92, 88, 92, - 113, 92,141, 92,163, 93,108, 93,130, 93,232, 97, 9, 88,191, 88, - 201, 88,208, 88,215, 89, 23, 89, 48, 89, 59, 89, 70, 89,104,226, - 229,238,231,225,236,105,128, 9,151,227,245,244,101,128, 1,245, - 228,229,246, 97,128, 9, 23,102, 4, 88,225, 88,234, 88,248, 89, - 8,225,242,225,226,233, 99,128, 6,175,230,233,238,225,236,225, - 242,225,226,233, 99,128,251,147,233,238,233,244,233,225,236,225, - 242,225,226,233, 99,128,251,148,237,229,228,233,225,236,225,242, - 225,226,233, 99,128,251,149,231,117, 2, 89, 30, 89, 39,234,225, - 242,225,244,105,128, 10,151,242,237,245,235,232,105,128, 10, 23, - 232,233,242,225,231,225,238, 97,128, 48, 76,235,225,244,225,235, - 225,238, 97,128, 48,172,237,237, 97,130, 3,179, 89, 80, 89, 93, - 236,225,244,233,238,243,237,225,236,108,128, 2, 99,243,245,240, - 229,242,233,239,114,128, 2,224,238,231,233,225,227,239,240,244, - 233, 99,128, 3,235, 98, 2, 89,123, 89,133,239,240,239,237,239, - 230,111,128, 49, 13,242,229,246,101,128, 1, 31, 99, 4, 89,150, - 89,157, 89,166, 89,188,225,242,239,110,128, 1,231,229,228,233, - 236,236, 97,128, 1, 35,233,242, 99, 2, 89,174, 89,179,236,101, - 128, 36,214,245,237,230,236,229,120,128, 1, 29,239,237,237,225, - 225,227,227,229,238,116,128, 1, 35,228,239,116,129, 1, 33, 89, - 209,225,227,227,229,238,116,128, 1, 33,101, 6, 89,232, 89,243, - 89,254, 90, 9, 90, 28, 90,130,227,249,242,233,236,236,233, 99, - 128, 4, 51,232,233,242,225,231,225,238, 97,128, 48, 82,235,225, - 244,225,235,225,238, 97,128, 48,178,239,237,229,244,242,233,227, - 225,236,236,249,229,241,245,225,108,128, 34, 81,114, 3, 90, 36, - 90, 85, 90, 95,229,243,104, 3, 90, 46, 90, 61, 90, 70,225,227, - 227,229,238,244,232,229,226,242,229,119,128, 5,156,232,229,226, - 242,229,119,128, 5,243,237,245,241,228,225,237,232,229,226,242, - 229,119,128, 5,157,237,225,238,228,226,236,115,128, 0,223,243, - 232,225,249,233,109, 2, 90,106, 90,121,225,227,227,229,238,244, - 232,229,226,242,229,119,128, 5,158,232,229,226,242,229,119,128, - 5,244,244,225,237,225,242,107,128, 48, 19,104, 5, 90,151, 91, - 28, 91, 91, 91,116, 91,122, 97, 4, 90,161, 90,171, 90,194, 90, - 219,226,229,238,231,225,236,105,128, 9,152,100, 2, 90,177, 90, - 188,225,242,237,229,238,233,225,110,128, 5,114,229,246, 97,128, - 9, 24,231,117, 2, 90,201, 90,210,234,225,242,225,244,105,128, - 10,152,242,237,245,235,232,105,128, 10, 24,233,110, 4, 90,230, - 90,239, 90,253, 91, 13,225,242,225,226,233, 99,128, 6, 58,230, - 233,238,225,236,225,242,225,226,233, 99,128,254,206,233,238,233, - 244,233,225,236,225,242,225,226,233, 99,128,254,207,237,229,228, - 233,225,236,225,242,225,226,233, 99,128,254,208,101, 3, 91, 36, - 91, 57, 91, 74,237,233,228,228,236,229,232,239,239,235,227,249, - 242,233,236,236,233, 99,128, 4,149,243,244,242,239,235,229,227, - 249,242,233,236,236,233, 99,128, 4,147,245,240,244,245,242,238, - 227,249,242,233,236,236,233, 99,128, 4,145,232, 97, 2, 91, 98, - 91,105,228,229,246, 97,128, 9, 90,231,245,242,237,245,235,232, - 105,128, 10, 90,239,239,107,128, 2, 96,250,243,241,245,225,242, - 101,128, 51,147,105, 3, 91,140, 91,151, 91,162,232,233,242,225, - 231,225,238, 97,128, 48, 78,235,225,244,225,235,225,238, 97,128, - 48,174,109, 2, 91,168, 91,179,225,242,237,229,238,233,225,110, - 128, 5, 99,229,108,130, 5,210, 91,188, 91,208,228,225,231,229, - 243,104,129,251, 50, 91,199,232,229,226,242,229,119,128,251, 50, - 232,229,226,242,229,119,128, 5,210,234,229,227,249,242,233,236, - 236,233, 99,128, 4, 83,236,239,244,244,225,108, 2, 91,241, 92, - 2,233,238,246,229,242,244,229,228,243,244,242,239,235,101,128, - 1,190,243,244,239,112,132, 2,148, 92, 17, 92, 28, 92, 34, 92, - 66,233,238,246,229,242,244,229,100,128, 2,150,237,239,100,128, - 2,192,242,229,246,229,242,243,229,100,130, 2,149, 92, 49, 92, - 55,237,239,100,128, 2,193,243,245,240,229,242,233,239,114,128, - 2,228,243,244,242,239,235,101,129, 2,161, 92, 77,242,229,246, - 229,242,243,229,100,128, 2,162,109, 2, 92, 94, 92,102,225,227, - 242,239,110,128, 30, 33,239,238,239,243,240,225,227,101,128,255, - 71,111, 2, 92,119, 92,130,232,233,242,225,231,225,238, 97,128, - 48, 84,235,225,244,225,235,225,238, 97,128, 48,180,240, 97, 2, - 92,148, 92,154,242,229,110,128, 36,162,243,241,245,225,242,101, - 128, 51,172,114, 2, 92,169, 93, 10, 97, 2, 92,175, 92,183,228, - 233,229,238,116,128, 34, 7,246,101,134, 0, 96, 92,200, 92,211, - 92,228, 92,235, 92,244, 93, 0,226,229,236,239,247,227,237, 98, - 128, 3, 22, 99, 2, 92,217, 92,222,237, 98,128, 3, 0,239,237, - 98,128, 3, 0,228,229,246, 97,128, 9, 83,236,239,247,237,239, - 100,128, 2,206,237,239,238,239,243,240,225,227,101,128,255, 64, - 244,239,238,229,227,237, 98,128, 3, 64,229,225,244,229,114,132, - 0, 62, 93, 26, 93, 45, 93, 57, 93,100,229,241,245,225,108,129, - 34,101, 93, 36,239,242,236,229,243,115,128, 34,219,237,239,238, - 239,243,240,225,227,101,128,255, 30,111, 2, 93, 63, 93, 89,114, - 2, 93, 69, 93, 82,229,241,245,233,246,225,236,229,238,116,128, - 34,115,236,229,243,115,128, 34,119,246,229,242,229,241,245,225, - 108,128, 34,103,243,237,225,236,108,128,254,101,115, 2, 93,114, - 93,122,227,242,233,240,116,128, 2, 97,244,242,239,235,101,128, - 1,229,117, 4, 93,140, 93,151, 93,208, 93,219,232,233,242,225, - 231,225,238, 97,128, 48, 80,233,108, 2, 93,158, 93,183,236,229, - 237,239,116, 2, 93,168, 93,175,236,229,230,116,128, 0,171,242, - 233,231,232,116,128, 0,187,243,233,238,231,108, 2, 93,193, 93, - 200,236,229,230,116,128, 32, 57,242,233,231,232,116,128, 32, 58, - 235,225,244,225,235,225,238, 97,128, 48,176,242,225,237,245,243, - 241,245,225,242,101,128, 51, 24,249,243,241,245,225,242,101,128, - 51,201,104,144, 0,104, 94, 22, 96,164, 96,199, 96,236, 97, 20, - 98,164, 98,184, 99,149, 99,161, 99,173,100,241,100,249,101, 4, - 101, 13,101, 93,101, 97, 97, 13, 94, 50, 94, 89, 94, 99, 94,129, - 94,154, 94,232, 94,244, 95, 13, 95, 28, 95, 57, 95, 70, 95,128, - 95,137, 97, 2, 94, 56, 94, 75,226,235,232,225,243,233,225,238, - 227,249,242,233,236,236,233, 99,128, 4,169,236,244,239,238,229, - 225,242,225,226,233, 99,128, 6,193,226,229,238,231,225,236,105, - 128, 9,185,228,101, 2, 94,106, 94,124,243,227,229,238,228,229, - 242,227,249,242,233,236,236,233, 99,128, 4,179,246, 97,128, 9, - 57,231,117, 2, 94,136, 94,145,234,225,242,225,244,105,128, 10, - 185,242,237,245,235,232,105,128, 10, 57,104, 4, 94,164, 94,173, - 94,187, 94,217,225,242,225,226,233, 99,128, 6, 45,230,233,238, - 225,236,225,242,225,226,233, 99,128,254,162,105, 2, 94,193, 94, - 208,238,233,244,233,225,236,225,242,225,226,233, 99,128,254,163, - 242,225,231,225,238, 97,128, 48,111,237,229,228,233,225,236,225, - 242,225,226,233, 99,128,254,164,233,244,245,243,241,245,225,242, - 101,128, 51, 42,235,225,244,225,235,225,238, 97,129, 48,207, 95, - 1,232,225,236,230,247,233,228,244,104,128,255,138,236,225,238, - 244,231,245,242,237,245,235,232,105,128, 10, 77,237,250, 97, 2, - 95, 36, 95, 45,225,242,225,226,233, 99,128, 6, 33,236,239,247, - 225,242,225,226,233, 99,128, 6, 33,238,231,245,236,230,233,236, - 236,229,114,128, 49,100,114, 2, 95, 76, 95, 92,228,243,233,231, - 238,227,249,242,233,236,236,233, 99,128, 4, 74,240,239,239,110, - 2, 95,101, 95,114,236,229,230,244,226,225,242,226,245,112,128, - 33,188,242,233,231,232,244,226,225,242,226,245,112,128, 33,192, - 243,241,245,225,242,101,128, 51,202,244,225,102, 3, 95,147, 95, - 239, 96, 74,240,225,244,225,104,134, 5,178, 95,167, 95,172, 95, - 186, 95,195, 95,210, 95,226,177, 54,128, 5,178, 50, 2, 95,178, - 95,182, 51,128, 5,178,102,128, 5,178,232,229,226,242,229,119, - 128, 5,178,238,225,242,242,239,247,232,229,226,242,229,119,128, - 5,178,241,245,225,242,244,229,242,232,229,226,242,229,119,128, - 5,178,247,233,228,229,232,229,226,242,229,119,128, 5,178,241, - 225,237,225,244,115,135, 5,179, 96, 6, 96, 11, 96, 16, 96, 21, - 96, 30, 96, 45, 96, 61,177, 98,128, 5,179,178, 56,128, 5,179, - 179, 52,128, 5,179,232,229,226,242,229,119,128, 5,179,238,225, - 242,242,239,247,232,229,226,242,229,119,128, 5,179,241,245,225, - 242,244,229,242,232,229,226,242,229,119,128, 5,179,247,233,228, - 229,232,229,226,242,229,119,128, 5,179,243,229,231,239,108,135, - 5,177, 96, 96, 96,101, 96,106, 96,111, 96,120, 96,135, 96,151, - 177, 55,128, 5,177,178, 52,128, 5,177,179, 48,128, 5,177,232, - 229,226,242,229,119,128, 5,177,238,225,242,242,239,247,232,229, - 226,242,229,119,128, 5,177,241,245,225,242,244,229,242,232,229, - 226,242,229,119,128, 5,177,247,233,228,229,232,229,226,242,229, - 119,128, 5,177, 98, 3, 96,172, 96,177, 96,187,225,114,128, 1, - 39,239,240,239,237,239,230,111,128, 49, 15,242,229,246,229,226, - 229,236,239,119,128, 30, 43, 99, 2, 96,205, 96,214,229,228,233, - 236,236, 97,128, 30, 41,233,242, 99, 2, 96,222, 96,227,236,101, - 128, 36,215,245,237,230,236,229,120,128, 1, 37,100, 2, 96,242, - 96,252,233,229,242,229,243,233,115,128, 30, 39,239,116, 2, 97, - 3, 97, 12,225,227,227,229,238,116,128, 30, 35,226,229,236,239, - 119,128, 30, 37,101,136, 5,212, 97, 40, 97, 73, 97, 93, 98, 66, - 98, 82, 98,127, 98,136, 98,149,225,242,116,129, 38,101, 97, 48, - 243,245,233,116, 2, 97, 57, 97, 65,226,236,225,227,107,128, 38, - 101,247,232,233,244,101,128, 38, 97,228,225,231,229,243,104,129, - 251, 52, 97, 84,232,229,226,242,229,119,128,251, 52,104, 6, 97, - 107, 97,135, 97,143, 97,193, 97,239, 98, 32, 97, 2, 97,113, 97, - 127,236,244,239,238,229,225,242,225,226,233, 99,128, 6,193,242, - 225,226,233, 99,128, 6, 71,229,226,242,229,119,128, 5,212,230, - 233,238,225,236, 97, 2, 97,154, 97,185,236,116, 2, 97,161, 97, - 173,239,238,229,225,242,225,226,233, 99,128,251,167,244,247,239, - 225,242,225,226,233, 99,128,254,234,242,225,226,233, 99,128,254, - 234,232,225,237,250,225,225,226,239,246,101, 2, 97,208, 97,222, - 230,233,238,225,236,225,242,225,226,233, 99,128,251,165,233,243, - 239,236,225,244,229,228,225,242,225,226,233, 99,128,251,164,105, - 2, 97,245, 98, 23,238,233,244,233,225,236, 97, 2, 98, 1, 98, - 15,236,244,239,238,229,225,242,225,226,233, 99,128,251,168,242, - 225,226,233, 99,128,254,235,242,225,231,225,238, 97,128, 48,120, - 237,229,228,233,225,236, 97, 2, 98, 44, 98, 58,236,244,239,238, - 229,225,242,225,226,233, 99,128,251,169,242,225,226,233, 99,128, - 254,236,233,243,229,233,229,242,225,243,241,245,225,242,101,128, - 51,123,107, 2, 98, 88, 98,112,225,244,225,235,225,238, 97,129, - 48,216, 98,100,232,225,236,230,247,233,228,244,104,128,255,141, - 245,244,225,225,242,245,243,241,245,225,242,101,128, 51, 54,238, - 231,232,239,239,107,128, 2,103,242,245,244,245,243,241,245,225, - 242,101,128, 51, 57,116,129, 5,215, 98,155,232,229,226,242,229, - 119,128, 5,215,232,239,239,107,129, 2,102, 98,173,243,245,240, - 229,242,233,239,114,128, 2,177,105, 4, 98,194, 99, 23, 99, 34, - 99, 59,229,245,104, 4, 98,206, 98,241, 99, 0, 99, 9, 97, 2, - 98,212, 98,227,227,233,242,227,236,229,235,239,242,229,225,110, - 128, 50,123,240,225,242,229,238,235,239,242,229,225,110,128, 50, - 27,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,109, - 235,239,242,229,225,110,128, 49, 78,240,225,242,229,238,235,239, - 242,229,225,110,128, 50, 13,232,233,242,225,231,225,238, 97,128, - 48,114,235,225,244,225,235,225,238, 97,129, 48,210, 99, 47,232, - 225,236,230,247,233,228,244,104,128,255,139,242,233,113,134, 5, - 180, 99, 77, 99, 82, 99, 96, 99,105, 99,120, 99,136,177, 52,128, - 5,180, 50, 2, 99, 88, 99, 92, 49,128, 5,180,100,128, 5,180, - 232,229,226,242,229,119,128, 5,180,238,225,242,242,239,247,232, - 229,226,242,229,119,128, 5,180,241,245,225,242,244,229,242,232, - 229,226,242,229,119,128, 5,180,247,233,228,229,232,229,226,242, - 229,119,128, 5,180,236,233,238,229,226,229,236,239,119,128, 30, - 150,237,239,238,239,243,240,225,227,101,128,255, 72,111, 9, 99, - 193, 99,204, 99,228, 99,253,100, 85,100, 98,100,184,100,224,100, - 235,225,242,237,229,238,233,225,110,128, 5,112,232,105, 2, 99, - 211, 99,219,240,244,232,225,105,128, 14, 43,242,225,231,225,238, - 97,128, 48,123,235,225,244,225,235,225,238, 97,129, 48,219, 99, - 241,232,225,236,230,247,233,228,244,104,128,255,142,236,225,109, - 135, 5,185,100, 17,100, 22,100, 27,100, 32,100, 41,100, 56,100, - 72,177, 57,128, 5,185,178, 54,128, 5,185,179, 50,128, 5,185, - 232,229,226,242,229,119,128, 5,185,238,225,242,242,239,247,232, - 229,226,242,229,119,128, 5,185,241,245,225,242,244,229,242,232, - 229,226,242,229,119,128, 5,185,247,233,228,229,232,229,226,242, - 229,119,128, 5,185,238,239,235,232,245,235,244,232,225,105,128, - 14, 46,111, 2,100,104,100,174,107, 4,100,114,100,126,100,132, - 100,154,225,226,239,246,229,227,239,237, 98,128, 3, 9,227,237, - 98,128, 3, 9,240,225,236,225,244,225,236,233,250,229,228,226, - 229,236,239,247,227,237, 98,128, 3, 33,242,229,244,242,239,230, - 236,229,248,226,229,236,239,247,227,237, 98,128, 3, 34,238,243, - 241,245,225,242,101,128, 51, 66,114, 2,100,190,100,217,105, 2, - 100,196,100,205,227,239,240,244,233, 99,128, 3,233,250,239,238, - 244,225,236,226,225,114,128, 32, 21,238,227,237, 98,128, 3, 27, - 244,243,240,242,233,238,231,115,128, 38,104,245,243,101,128, 35, - 2,240,225,242,229,110,128, 36,163,243,245,240,229,242,233,239, - 114,128, 2,176,244,245,242,238,229,100,128, 2,101,117, 4,101, - 23,101, 34,101, 47,101, 72,232,233,242,225,231,225,238, 97,128, - 48,117,233,233,244,239,243,241,245,225,242,101,128, 51, 51,235, - 225,244,225,235,225,238, 97,129, 48,213,101, 60,232,225,236,230, - 247,233,228,244,104,128,255,140,238,231,225,242,245,237,236,225, - 245,116,129, 2,221,101, 87,227,237, 98,128, 3, 11,118,128, 1, - 149,249,240,232,229,110,132, 0, 45,101,113,101,124,101,136,101, - 159,233,238,230,229,242,233,239,114,128,246,229,237,239,238,239, - 243,240,225,227,101,128,255, 13,115, 2,101,142,101,149,237,225, - 236,108,128,254, 99,245,240,229,242,233,239,114,128,246,230,244, - 247,111,128, 32, 16,105,149, 0,105,101,211,101,234,102, 12,102, - 59,105,197,106, 61,106, 98,106,125,107, 31,107, 35,107, 73,107, - 95,107,179,108, 88,108,163,108,171,108,184,109, 15,109, 72,109, - 100,109,144,225, 99, 2,101,218,101,224,245,244,101,128, 0,237, - 249,242,233,236,236,233, 99,128, 4, 79, 98, 3,101,242,101,251, - 102, 5,229,238,231,225,236,105,128, 9,135,239,240,239,237,239, - 230,111,128, 49, 39,242,229,246,101,128, 1, 45, 99, 3,102, 20, - 102, 27,102, 49,225,242,239,110,128, 1,208,233,242, 99, 2,102, - 35,102, 40,236,101,128, 36,216,245,237,230,236,229,120,128, 0, - 238,249,242,233,236,236,233, 99,128, 4, 86,100, 4,102, 69,102, - 79,105,154,105,187,226,236,231,242,225,246,101,128, 2, 9,101, - 2,102, 85,105,149,239,231,242,225,240,104, 7,102,106,102,120, - 102,133,105, 62,105, 93,105,106,105,118,229,225,242,244,232,227, - 233,242,227,236,101,128, 50,143,230,233,242,229,227,233,242,227, - 236,101,128, 50,139,233, 99, 14,102,164,102,180,103, 23,103, 77, - 103,143,103,172,103,188,103,245,104, 38,104, 50,104, 77,104,144, - 105, 26,105, 55,225,236,236,233,225,238,227,229,240,225,242,229, - 110,128, 50, 63, 99, 4,102,190,102,201,102,215,102,222,225,236, - 236,240,225,242,229,110,128, 50, 58,229,238,244,242,229,227,233, - 242,227,236,101,128, 50,165,236,239,243,101,128, 48, 6,111, 3, - 102,230,102,245,103, 9,237,237, 97,129, 48, 1,102,238,236,229, - 230,116,128,255,100,238,231,242,225,244,245,236,225,244,233,239, - 238,240,225,242,229,110,128, 50, 55,242,242,229,227,244,227,233, - 242,227,236,101,128, 50,163,101, 3,103, 31,103, 43,103, 60,225, - 242,244,232,240,225,242,229,110,128, 50, 47,238,244,229,242,240, - 242,233,243,229,240,225,242,229,110,128, 50, 61,248,227,229,236, - 236,229,238,244,227,233,242,227,236,101,128, 50,157,102, 2,103, - 83,103, 98,229,243,244,233,246,225,236,240,225,242,229,110,128, - 50, 64,105, 2,103,104,103,133,238,225,238,227,233,225,108, 2, - 103,116,103,125,227,233,242,227,236,101,128, 50,150,240,225,242, - 229,110,128, 50, 54,242,229,240,225,242,229,110,128, 50, 43,104, - 2,103,149,103,160,225,246,229,240,225,242,229,110,128, 50, 50, - 233,231,232,227,233,242,227,236,101,128, 50,164,233,244,229,242, - 225,244,233,239,238,237,225,242,107,128, 48, 5,108, 3,103,196, - 103,222,103,234,225,226,239,114, 2,103,205,103,214,227,233,242, - 227,236,101,128, 50,152,240,225,242,229,110,128, 50, 56,229,230, - 244,227,233,242,227,236,101,128, 50,167,239,247,227,233,242,227, - 236,101,128, 50,166,109, 2,103,251,104, 27,101, 2,104, 1,104, - 16,228,233,227,233,238,229,227,233,242,227,236,101,128, 50,169, - 244,225,236,240,225,242,229,110,128, 50, 46,239,239,238,240,225, - 242,229,110,128, 50, 42,238,225,237,229,240,225,242,229,110,128, - 50, 52,112, 2,104, 56,104, 64,229,242,233,239,100,128, 48, 2, - 242,233,238,244,227,233,242,227,236,101,128, 50,158,114, 2,104, - 83,104,131,101, 3,104, 91,104,102,104,117,225,227,232,240,225, - 242,229,110,128, 50, 67,240,242,229,243,229,238,244,240,225,242, - 229,110,128, 50, 57,243,239,245,242,227,229,240,225,242,229,110, - 128, 50, 62,233,231,232,244,227,233,242,227,236,101,128, 50,168, - 115, 5,104,156,104,185,104,199,104,224,104,252,101, 2,104,162, - 104,175,227,242,229,244,227,233,242,227,236,101,128, 50,153,236, - 230,240,225,242,229,110,128, 50, 66,239,227,233,229,244,249,240, - 225,242,229,110,128, 50, 51,112, 2,104,205,104,211,225,227,101, - 128, 48, 0,229,227,233,225,236,240,225,242,229,110,128, 50, 53, - 116, 2,104,230,104,241,239,227,235,240,225,242,229,110,128, 50, - 49,245,228,249,240,225,242,229,110,128, 50, 59,117, 2,105, 2, - 105, 11,238,240,225,242,229,110,128, 50, 48,240,229,242,246,233, - 243,229,240,225,242,229,110,128, 50, 60,119, 2,105, 32,105, 44, - 225,244,229,242,240,225,242,229,110,128, 50, 44,239,239,228,240, - 225,242,229,110,128, 50, 45,250,229,242,111,128, 48, 7,109, 2, - 105, 68,105, 81,229,244,225,236,227,233,242,227,236,101,128, 50, - 142,239,239,238,227,233,242,227,236,101,128, 50,138,238,225,237, - 229,227,233,242,227,236,101,128, 50,148,243,245,238,227,233,242, - 227,236,101,128, 50,144,119, 2,105,124,105,137,225,244,229,242, - 227,233,242,227,236,101,128, 50,140,239,239,228,227,233,242,227, - 236,101,128, 50,141,246, 97,128, 9, 7,233,229,242,229,243,233, - 115,130, 0,239,105,168,105,176,225,227,245,244,101,128, 30, 47, - 227,249,242,233,236,236,233, 99,128, 4,229,239,244,226,229,236, - 239,119,128, 30,203,101, 3,105,205,105,221,105,232,226,242,229, - 246,229,227,249,242,233,236,236,233, 99,128, 4,215,227,249,242, - 233,236,236,233, 99,128, 4, 53,245,238,103, 4,105,244,106, 23, - 106, 38,106, 47, 97, 2,105,250,106, 9,227,233,242,227,236,229, - 235,239,242,229,225,110,128, 50,117,240,225,242,229,238,235,239, - 242,229,225,110,128, 50, 21,227,233,242,227,236,229,235,239,242, - 229,225,110,128, 50,103,235,239,242,229,225,110,128, 49, 71,240, - 225,242,229,238,235,239,242,229,225,110,128, 50, 7,103, 2,106, - 67,106, 74,242,225,246,101,128, 0,236,117, 2,106, 80,106, 89, - 234,225,242,225,244,105,128, 10,135,242,237,245,235,232,105,128, - 10, 7,104, 2,106,104,106,114,233,242,225,231,225,238, 97,128, - 48, 68,239,239,235,225,226,239,246,101,128, 30,201,105, 8,106, - 143,106,153,106,164,106,171,106,196,106,212,106,227,106,243,226, - 229,238,231,225,236,105,128, 9,136,227,249,242,233,236,236,233, - 99,128, 4, 56,228,229,246, 97,128, 9, 8,231,117, 2,106,178, - 106,187,234,225,242,225,244,105,128, 10,136,242,237,245,235,232, - 105,128, 10, 8,237,225,244,242,225,231,245,242,237,245,235,232, - 105,128, 10, 64,238,246,229,242,244,229,228,226,242,229,246,101, - 128, 2, 11,243,232,239,242,244,227,249,242,233,236,236,233, 99, - 128, 4, 57,246,239,247,229,236,243,233,231,110, 3,107, 3,107, - 13,107, 20,226,229,238,231,225,236,105,128, 9,192,228,229,246, - 97,128, 9, 64,231,245,234,225,242,225,244,105,128, 10,192,106, - 128, 1, 51,107, 2,107, 41,107, 65,225,244,225,235,225,238, 97, - 129, 48,164,107, 53,232,225,236,230,247,233,228,244,104,128,255, - 114,239,242,229,225,110,128, 49, 99,108, 2,107, 79,107, 84,228, - 101,128, 2,220,245,249,232,229,226,242,229,119,128, 5,172,109, - 2,107,101,107,168, 97, 3,107,109,107,129,107,154,227,242,239, - 110,129, 1, 43,107,118,227,249,242,233,236,236,233, 99,128, 4, - 227,231,229,239,242,225,240,240,242,239,248,233,237,225,244,229, - 236,249,229,241,245,225,108,128, 34, 83,244,242,225,231,245,242, - 237,245,235,232,105,128, 10, 63,239,238,239,243,240,225,227,101, - 128,255, 73,110, 5,107,191,107,201,107,210,107,222,108, 50,227, - 242,229,237,229,238,116,128, 34, 6,230,233,238,233,244,121,128, - 34, 30,233,225,242,237,229,238,233,225,110,128, 5,107,116, 2, - 107,228,108, 40,101, 2,107,234,108, 29,231,242,225,108,131, 34, - 43,107,247,108, 9,108, 14, 98, 2,107,253,108, 5,239,244,244, - 239,109,128, 35, 33,116,128, 35, 33,229,120,128,248,245,116, 2, - 108, 20,108, 25,239,112,128, 35, 32,112,128, 35, 32,242,243,229, - 227,244,233,239,110,128, 34, 41,233,243,241,245,225,242,101,128, - 51, 5,118, 3,108, 58,108, 67,108, 76,226,245,236,236,229,116, - 128, 37,216,227,233,242,227,236,101,128, 37,217,243,237,233,236, - 229,230,225,227,101,128, 38, 59,111, 3,108, 96,108,107,108,115, - 227,249,242,233,236,236,233, 99,128, 4, 81,231,239,238,229,107, - 128, 1, 47,244, 97,131, 3,185,108,126,108,147,108,155,228,233, - 229,242,229,243,233,115,129, 3,202,108,139,244,239,238,239,115, - 128, 3,144,236,225,244,233,110,128, 2,105,244,239,238,239,115, - 128, 3,175,240,225,242,229,110,128, 36,164,242,233,231,245,242, - 237,245,235,232,105,128, 10,114,115, 4,108,194,108,239,108,253, - 109, 5,237,225,236,108, 2,108,203,108,214,232,233,242,225,231, - 225,238, 97,128, 48, 67,235,225,244,225,235,225,238, 97,129, 48, - 163,108,227,232,225,236,230,247,233,228,244,104,128,255,104,243, - 232,225,242,226,229,238,231,225,236,105,128, 9,250,244,242,239, - 235,101,128, 2,104,245,240,229,242,233,239,114,128,246,237,116, - 2,109, 21,109, 55,229,242,225,244,233,239,110, 2,109, 33,109, - 44,232,233,242,225,231,225,238, 97,128, 48,157,235,225,244,225, - 235,225,238, 97,128, 48,253,233,236,228,101,129, 1, 41,109, 64, - 226,229,236,239,119,128, 30, 45,117, 2,109, 78,109, 89,226,239, - 240,239,237,239,230,111,128, 49, 41,227,249,242,233,236,236,233, - 99,128, 4, 78,246,239,247,229,236,243,233,231,110, 3,109,116, - 109,126,109,133,226,229,238,231,225,236,105,128, 9,191,228,229, - 246, 97,128, 9, 63,231,245,234,225,242,225,244,105,128, 10,191, - 250,232,233,244,243, 97, 2,109,155,109,166,227,249,242,233,236, - 236,233, 99,128, 4,117,228,226,236,231,242,225,246,229,227,249, - 242,233,236,236,233, 99,128, 4,119,106,138, 0,106,109,209,110, - 16,110, 27,110, 77,110, 93,110,206,111, 19,111, 24,111, 36,111, - 44, 97, 4,109,219,109,230,109,240,109,247,225,242,237,229,238, - 233,225,110,128, 5,113,226,229,238,231,225,236,105,128, 9,156, - 228,229,246, 97,128, 9, 28,231,117, 2,109,254,110, 7,234,225, - 242,225,244,105,128, 10,156,242,237,245,235,232,105,128, 10, 28, - 226,239,240,239,237,239,230,111,128, 49, 16, 99, 3,110, 35,110, - 42,110, 64,225,242,239,110,128, 1,240,233,242, 99, 2,110, 50, - 110, 55,236,101,128, 36,217,245,237,230,236,229,120,128, 1, 53, - 242,239,243,243,229,228,244,225,233,108,128, 2,157,228,239,244, - 236,229,243,243,243,244,242,239,235,101,128, 2, 95,101, 3,110, - 101,110,112,110,177,227,249,242,233,236,236,233, 99,128, 4, 88, - 229,109, 4,110,123,110,132,110,146,110,162,225,242,225,226,233, - 99,128, 6, 44,230,233,238,225,236,225,242,225,226,233, 99,128, - 254,158,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, - 254,159,237,229,228,233,225,236,225,242,225,226,233, 99,128,254, - 160,104, 2,110,183,110,192,225,242,225,226,233, 99,128, 6,152, - 230,233,238,225,236,225,242,225,226,233, 99,128,251,139,104, 2, - 110,212,111, 6, 97, 3,110,220,110,230,110,237,226,229,238,231, - 225,236,105,128, 9,157,228,229,246, 97,128, 9, 29,231,117, 2, - 110,244,110,253,234,225,242,225,244,105,128, 10,157,242,237,245, - 235,232,105,128, 10, 29,229,232,225,242,237,229,238,233,225,110, - 128, 5,123,233,115,128, 48, 4,237,239,238,239,243,240,225,227, - 101,128,255, 74,240,225,242,229,110,128, 36,165,243,245,240,229, - 242,233,239,114,128, 2,178,107,146, 0,107,111, 95,113,184,113, - 195,114, 1,114, 12,114,102,114,116,115,224,116,164,116,177,116, - 203,116,252,117,134,117,156,117,169,117,192,117,234,117,244, 97, - 12,111,121,111,153,111,175,111,205,112, 63,112, 88,112,118,112, - 143,112,249,113, 7,113,130,113,159, 98, 2,111,127,111,144,225, - 243,232,235,233,242,227,249,242,233,236,236,233, 99,128, 4,161, - 229,238,231,225,236,105,128, 9,149, 99, 2,111,159,111,165,245, - 244,101,128, 30, 49,249,242,233,236,236,233, 99,128, 4, 58,228, - 101, 2,111,182,111,200,243,227,229,238,228,229,242,227,249,242, - 233,236,236,233, 99,128, 4,155,246, 97,128, 9, 21,102,135, 5, - 219,111,223,111,232,111,252,112, 10,112, 19,112, 35,112, 50,225, - 242,225,226,233, 99,128, 6, 67,228,225,231,229,243,104,129,251, - 59,111,243,232,229,226,242,229,119,128,251, 59,230,233,238,225, - 236,225,242,225,226,233, 99,128,254,218,232,229,226,242,229,119, - 128, 5,219,233,238,233,244,233,225,236,225,242,225,226,233, 99, - 128,254,219,237,229,228,233,225,236,225,242,225,226,233, 99,128, - 254,220,242,225,230,229,232,229,226,242,229,119,128,251, 77,231, - 117, 2,112, 70,112, 79,234,225,242,225,244,105,128, 10,149,242, - 237,245,235,232,105,128, 10, 21,104, 2,112, 94,112,104,233,242, - 225,231,225,238, 97,128, 48, 75,239,239,235,227,249,242,233,236, - 236,233, 99,128, 4,196,235,225,244,225,235,225,238, 97,129, 48, - 171,112,131,232,225,236,230,247,233,228,244,104,128,255,118,112, - 2,112,149,112,170,240, 97,129, 3,186,112,156,243,249,237,226, - 239,236,231,242,229,229,107,128, 3,240,249,229,239,245,110, 3, - 112,182,112,196,112,230,237,233,229,245,237,235,239,242,229,225, - 110,128, 49,113,112, 2,112,202,112,217,232,233,229,245,240,232, - 235,239,242,229,225,110,128, 49,132,233,229,245,240,235,239,242, - 229,225,110,128, 49,120,243,243,225,238,231,240,233,229,245,240, - 235,239,242,229,225,110,128, 49,121,242,239,242,233,233,243,241, - 245,225,242,101,128, 51, 13,115, 5,113, 19,113, 63,113, 78,113, - 86,113,114,232,233,228,225,225,245,244,111, 2,113, 32,113, 41, - 225,242,225,226,233, 99,128, 6, 64,238,239,243,233,228,229,226, - 229,225,242,233,238,231,225,242,225,226,233, 99,128, 6, 64,237, - 225,236,236,235,225,244,225,235,225,238, 97,128, 48,245,241,245, - 225,242,101,128, 51,132,242, 97, 2,113, 93,113,102,225,242,225, - 226,233, 99,128, 6, 80,244,225,238,225,242,225,226,233, 99,128, - 6, 77,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, - 4,159,244,225,232,233,242,225,240,242,239,236,239,238,231,237, - 225,242,235,232,225,236,230,247,233,228,244,104,128,255,112,246, - 229,242,244,233,227,225,236,243,244,242,239,235,229,227,249,242, - 233,236,236,233, 99,128, 4,157,226,239,240,239,237,239,230,111, - 128, 49, 14, 99, 4,113,205,113,227,113,236,113,244, 97, 2,113, - 211,113,221,236,243,241,245,225,242,101,128, 51,137,242,239,110, - 128, 1,233,229,228,233,236,236, 97,128, 1, 55,233,242,227,236, - 101,128, 36,218,239,237,237,225,225,227,227,229,238,116,128, 1, - 55,228,239,244,226,229,236,239,119,128, 30, 51,101, 4,114, 22, - 114, 49,114, 74,114, 86,104, 2,114, 28,114, 39,225,242,237,229, - 238,233,225,110,128, 5,132,233,242,225,231,225,238, 97,128, 48, - 81,235,225,244,225,235,225,238, 97,129, 48,177,114, 62,232,225, - 236,230,247,233,228,244,104,128,255,121,238,225,242,237,229,238, - 233,225,110,128, 5,111,243,237,225,236,236,235,225,244,225,235, - 225,238, 97,128, 48,246,231,242,229,229,238,236,225,238,228,233, - 99,128, 1, 56,104, 6,114,130,115, 3,115, 14,115, 39,115,126, - 115,214, 97, 5,114,142,114,152,114,163,114,170,114,195,226,229, - 238,231,225,236,105,128, 9,150,227,249,242,233,236,236,233, 99, - 128, 4, 69,228,229,246, 97,128, 9, 22,231,117, 2,114,177,114, - 186,234,225,242,225,244,105,128, 10,150,242,237,245,235,232,105, - 128, 10, 22,104, 4,114,205,114,214,114,228,114,244,225,242,225, - 226,233, 99,128, 6, 46,230,233,238,225,236,225,242,225,226,233, - 99,128,254,166,233,238,233,244,233,225,236,225,242,225,226,233, - 99,128,254,167,237,229,228,233,225,236,225,242,225,226,233, 99, - 128,254,168,229,233,227,239,240,244,233, 99,128, 3,231,232, 97, - 2,115, 21,115, 28,228,229,246, 97,128, 9, 89,231,245,242,237, - 245,235,232,105,128, 10, 89,233,229,245,235,104, 4,115, 53,115, - 88,115,103,115,112, 97, 2,115, 59,115, 74,227,233,242,227,236, - 229,235,239,242,229,225,110,128, 50,120,240,225,242,229,238,235, - 239,242,229,225,110,128, 50, 24,227,233,242,227,236,229,235,239, - 242,229,225,110,128, 50,106,235,239,242,229,225,110,128, 49, 75, - 240,225,242,229,238,235,239,242,229,225,110,128, 50, 10,111, 4, - 115,136,115,185,115,195,115,200,235,104, 4,115,147,115,156,115, - 165,115,175,225,233,244,232,225,105,128, 14, 2,239,238,244,232, - 225,105,128, 14, 5,245,225,244,244,232,225,105,128, 14, 3,247, - 225,233,244,232,225,105,128, 14, 4,237,245,244,244,232,225,105, - 128, 14, 91,239,107,128, 1,153,242,225,235,232,225,238,231,244, - 232,225,105,128, 14, 6,250,243,241,245,225,242,101,128, 51,145, - 105, 4,115,234,115,245,116, 14,116, 63,232,233,242,225,231,225, - 238, 97,128, 48, 77,235,225,244,225,235,225,238, 97,129, 48,173, - 116, 2,232,225,236,230,247,233,228,244,104,128,255,119,242,111, - 3,116, 23,116, 38,116, 54,231,245,242,225,237,245,243,241,245, - 225,242,101,128, 51, 21,237,229,229,244,239,242,245,243,241,245, - 225,242,101,128, 51, 22,243,241,245,225,242,101,128, 51, 20,249, - 229,239,107, 5,116, 78,116,113,116,128,116,137,116,151, 97, 2, - 116, 84,116, 99,227,233,242,227,236,229,235,239,242,229,225,110, - 128, 50,110,240,225,242,229,238,235,239,242,229,225,110,128, 50, - 14,227,233,242,227,236,229,235,239,242,229,225,110,128, 50, 96, - 235,239,242,229,225,110,128, 49, 49,240,225,242,229,238,235,239, - 242,229,225,110,128, 50, 0,243,233,239,243,235,239,242,229,225, - 110,128, 49, 51,234,229,227,249,242,233,236,236,233, 99,128, 4, - 92,108, 2,116,183,116,194,233,238,229,226,229,236,239,119,128, - 30, 53,243,241,245,225,242,101,128, 51,152,109, 3,116,211,116, - 225,116,236,227,245,226,229,228,243,241,245,225,242,101,128, 51, - 166,239,238,239,243,240,225,227,101,128,255, 75,243,241,245,225, - 242,229,228,243,241,245,225,242,101,128, 51,162,111, 5,117, 8, - 117, 34,117, 72,117, 84,117, 98,104, 2,117, 14,117, 24,233,242, - 225,231,225,238, 97,128, 48, 83,237,243,241,245,225,242,101,128, - 51,192,235, 97, 2,117, 41,117, 49,233,244,232,225,105,128, 14, - 1,244,225,235,225,238, 97,129, 48,179,117, 60,232,225,236,230, - 247,233,228,244,104,128,255,122,239,240,239,243,241,245,225,242, - 101,128, 51, 30,240,240,225,227,249,242,233,236,236,233, 99,128, - 4,129,114, 2,117,104,117,124,229,225,238,243,244,225,238,228, - 225,242,228,243,249,237,226,239,108,128, 50,127,239,238,233,243, - 227,237, 98,128, 3, 67,240, 97, 2,117,141,117,147,242,229,110, - 128, 36,166,243,241,245,225,242,101,128, 51,170,243,233,227,249, - 242,233,236,236,233, 99,128, 4,111,116, 2,117,175,117,184,243, - 241,245,225,242,101,128, 51,207,245,242,238,229,100,128, 2,158, - 117, 2,117,198,117,209,232,233,242,225,231,225,238, 97,128, 48, - 79,235,225,244,225,235,225,238, 97,129, 48,175,117,222,232,225, - 236,230,247,233,228,244,104,128,255,120,246,243,241,245,225,242, - 101,128, 51,184,247,243,241,245,225,242,101,128, 51,190,108,146, - 0,108,118, 38,120, 65,120, 94,120,160,120,198,121, 94,121,103, - 121,119,121,143,121,161,122, 23,122, 64,122,199,122,207,122,240, - 122,249,123, 1,123, 63, 97, 7,118, 54,118, 64,118, 71,118, 78, - 118,103,118,119,120, 53,226,229,238,231,225,236,105,128, 9,178, - 227,245,244,101,128, 1, 58,228,229,246, 97,128, 9, 50,231,117, - 2,118, 85,118, 94,234,225,242,225,244,105,128, 10,178,242,237, - 245,235,232,105,128, 10, 50,235,235,232,225,238,231,249,225,239, - 244,232,225,105,128, 14, 69,109, 10,118,141,119, 80,119, 97,119, - 135,119,149,119,168,119,184,119,204,119,224,119,247, 97, 2,118, - 147,119, 72,236,229,102, 4,118,159,118,173,119, 9,119, 26,230, - 233,238,225,236,225,242,225,226,233, 99,128,254,252,232,225,237, - 250, 97, 2,118,183,118,224,225,226,239,246,101, 2,118,193,118, - 207,230,233,238,225,236,225,242,225,226,233, 99,128,254,248,233, - 243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,247, - 226,229,236,239,119, 2,118,234,118,248,230,233,238,225,236,225, - 242,225,226,233, 99,128,254,250,233,243,239,236,225,244,229,228, - 225,242,225,226,233, 99,128,254,249,233,243,239,236,225,244,229, - 228,225,242,225,226,233, 99,128,254,251,237,225,228,228,225,225, - 226,239,246,101, 2,119, 41,119, 55,230,233,238,225,236,225,242, - 225,226,233, 99,128,254,246,233,243,239,236,225,244,229,228,225, - 242,225,226,233, 99,128,254,245,242,225,226,233, 99,128, 6, 68, - 226,228, 97,129, 3,187,119, 88,243,244,242,239,235,101,128, 1, - 155,229,100,130, 5,220,119,106,119,126,228,225,231,229,243,104, - 129,251, 60,119,117,232,229,226,242,229,119,128,251, 60,232,229, - 226,242,229,119,128, 5,220,230,233,238,225,236,225,242,225,226, - 233, 99,128,254,222,232,225,232,233,238,233,244,233,225,236,225, - 242,225,226,233, 99,128,252,202,233,238,233,244,233,225,236,225, - 242,225,226,233, 99,128,254,223,234,229,229,237,233,238,233,244, - 233,225,236,225,242,225,226,233, 99,128,252,201,235,232,225,232, - 233,238,233,244,233,225,236,225,242,225,226,233, 99,128,252,203, - 236,225,237,232,229,232,233,243,239,236,225,244,229,228,225,242, - 225,226,233, 99,128,253,242,237,101, 2,119,254,120, 11,228,233, - 225,236,225,242,225,226,233, 99,128,254,224,229,109, 2,120, 18, - 120, 37,232,225,232,233,238,233,244,233,225,236,225,242,225,226, - 233, 99,128,253,136,233,238,233,244,233,225,236,225,242,225,226, - 233, 99,128,252,204,242,231,229,227,233,242,227,236,101,128, 37, - 239, 98, 3,120, 73,120, 78,120, 84,225,114,128, 1,154,229,236, - 116,128, 2,108,239,240,239,237,239,230,111,128, 49, 12, 99, 4, - 120,104,120,111,120,120,120,147,225,242,239,110,128, 1, 62,229, - 228,233,236,236, 97,128, 1, 60,233,242, 99, 2,120,128,120,133, - 236,101,128, 36,219,245,237,230,236,229,248,226,229,236,239,119, - 128, 30, 61,239,237,237,225,225,227,227,229,238,116,128, 1, 60, - 228,239,116,130, 1, 64,120,170,120,179,225,227,227,229,238,116, - 128, 1, 64,226,229,236,239,119,129, 30, 55,120,189,237,225,227, - 242,239,110,128, 30, 57,101, 3,120,206,120,244,121, 89,230,116, - 2,120,213,120,229,225,238,231,236,229,225,226,239,246,229,227, - 237, 98,128, 3, 26,244,225,227,235,226,229,236,239,247,227,237, - 98,128, 3, 24,243,115,132, 0, 60,121, 1,121, 23,121, 35,121, - 81,229,241,245,225,108,129, 34,100,121, 11,239,242,231,242,229, - 225,244,229,114,128, 34,218,237,239,238,239,243,240,225,227,101, - 128,255, 28,111, 2,121, 41,121, 70,114, 2,121, 47,121, 60,229, - 241,245,233,246,225,236,229,238,116,128, 34,114,231,242,229,225, - 244,229,114,128, 34,118,246,229,242,229,241,245,225,108,128, 34, - 102,243,237,225,236,108,128,254,100,250,104,128, 2,110,230,226, - 236,239,227,107,128, 37,140,232,239,239,235,242,229,244,242,239, - 230,236,229,120,128, 2,109,105, 2,121,125,121,130,242, 97,128, - 32,164,247,238,225,242,237,229,238,233,225,110,128, 5,108,106, - 129, 1,201,121,149,229,227,249,242,233,236,236,233, 99,128, 4, - 89,108,132,246,192,121,173,121,197,121,208,121,217, 97, 2,121, - 179,121,186,228,229,246, 97,128, 9, 51,231,245,234,225,242,225, - 244,105,128, 10,179,233,238,229,226,229,236,239,119,128, 30, 59, - 236,225,228,229,246, 97,128, 9, 52,246,239,227,225,236,233, 99, - 3,121,231,121,241,121,248,226,229,238,231,225,236,105,128, 9, - 225,228,229,246, 97,128, 9, 97,246,239,247,229,236,243,233,231, - 110, 2,122, 6,122, 16,226,229,238,231,225,236,105,128, 9,227, - 228,229,246, 97,128, 9, 99,109, 3,122, 31,122, 44,122, 55,233, - 228,228,236,229,244,233,236,228,101,128, 2,107,239,238,239,243, - 240,225,227,101,128,255, 76,243,241,245,225,242,101,128, 51,208, - 111, 6,122, 78,122, 90,122,132,122,143,122,149,122,191,227,232, - 245,236,225,244,232,225,105,128, 14, 44,231,233,227,225,108, 3, - 122,102,122,108,122,127,225,238,100,128, 34, 39,238,239,116,129, - 0,172,122,116,242,229,246,229,242,243,229,100,128, 35, 16,239, - 114,128, 34, 40,236,233,238,231,244,232,225,105,128, 14, 37,238, - 231,115,128, 1,127,247,236,233,238,101, 2,122,159,122,182, 99, - 2,122,165,122,177,229,238,244,229,242,236,233,238,101,128,254, - 78,237, 98,128, 3, 50,228,225,243,232,229,100,128,254, 77,250, - 229,238,231,101,128, 37,202,240,225,242,229,110,128, 36,167,115, - 3,122,215,122,222,122,230,236,225,243,104,128, 1, 66,241,245, - 225,242,101,128, 33, 19,245,240,229,242,233,239,114,128,246,238, - 244,243,232,225,228,101,128, 37,145,245,244,232,225,105,128, 14, - 38,246,239,227,225,236,233, 99, 3,123, 15,123, 25,123, 32,226, - 229,238,231,225,236,105,128, 9,140,228,229,246, 97,128, 9, 12, - 246,239,247,229,236,243,233,231,110, 2,123, 46,123, 56,226,229, - 238,231,225,236,105,128, 9,226,228,229,246, 97,128, 9, 98,248, - 243,241,245,225,242,101,128, 51,211,109,144, 0,109,123,109,125, - 218,125,243,126, 14,126, 39,127, 92,127,114,128,169,128,199,128, - 248,129, 99,129,121,129,146,129,155,130,182,130,210, 97, 12,123, - 135,123,145,123,209,123,216,123,241,124, 33,125,125,125,150,125, - 155,125,169,125,181,125,186,226,229,238,231,225,236,105,128, 9, - 174, 99, 2,123,151,123,203,242,239,110,132, 0,175,123,165,123, - 176,123,182,123,191,226,229,236,239,247,227,237, 98,128, 3, 49, - 227,237, 98,128, 3, 4,236,239,247,237,239,100,128, 2,205,237, - 239,238,239,243,240,225,227,101,128,255,227,245,244,101,128, 30, - 63,228,229,246, 97,128, 9, 46,231,117, 2,123,223,123,232,234, - 225,242,225,244,105,128, 10,174,242,237,245,235,232,105,128, 10, - 46,104, 2,123,247,124, 23,225,240,225,235,104, 2,124, 1,124, - 10,232,229,226,242,229,119,128, 5,164,236,229,230,244,232,229, - 226,242,229,119,128, 5,164,233,242,225,231,225,238, 97,128, 48, - 126,105, 5,124, 45,124,114,124,177,124,207,125,113,227,232,225, - 244,244,225,247, 97, 3,124, 60,124, 91,124, 98,236,239,119, 2, - 124, 68,124, 79,236,229,230,244,244,232,225,105,128,248,149,242, - 233,231,232,244,244,232,225,105,128,248,148,244,232,225,105,128, - 14, 75,245,240,240,229,242,236,229,230,244,244,232,225,105,128, - 248,147,229,107, 3,124,123,124,154,124,161,236,239,119, 2,124, - 131,124,142,236,229,230,244,244,232,225,105,128,248,140,242,233, - 231,232,244,244,232,225,105,128,248,139,244,232,225,105,128, 14, - 72,245,240,240,229,242,236,229,230,244,244,232,225,105,128,248, - 138,232,225,238,225,235,225,116, 2,124,189,124,200,236,229,230, - 244,244,232,225,105,128,248,132,244,232,225,105,128, 14, 49,116, - 3,124,215,124,243,125, 50,225,233,235,232,117, 2,124,225,124, - 236,236,229,230,244,244,232,225,105,128,248,137,244,232,225,105, - 128, 14, 71,232,111, 3,124,252,125, 27,125, 34,236,239,119, 2, - 125, 4,125, 15,236,229,230,244,244,232,225,105,128,248,143,242, - 233,231,232,244,244,232,225,105,128,248,142,244,232,225,105,128, - 14, 73,245,240,240,229,242,236,229,230,244,244,232,225,105,128, - 248,141,242,105, 3,125, 59,125, 90,125, 97,236,239,119, 2,125, - 67,125, 78,236,229,230,244,244,232,225,105,128,248,146,242,233, - 231,232,244,244,232,225,105,128,248,145,244,232,225,105,128, 14, - 74,245,240,240,229,242,236,229,230,244,244,232,225,105,128,248, - 144,249,225,237,239,235,244,232,225,105,128, 14, 70,235,225,244, - 225,235,225,238, 97,129, 48,222,125,138,232,225,236,230,247,233, - 228,244,104,128,255,143,236,101,128, 38, 66,238,243,249,239,238, - 243,241,245,225,242,101,128, 51, 71,241,225,230,232,229,226,242, - 229,119,128, 5,190,242,115,128, 38, 66,115, 2,125,192,125,210, - 239,242,225,227,233,242,227,236,229,232,229,226,242,229,119,128, - 5,175,241,245,225,242,101,128, 51,131, 98, 2,125,224,125,234, - 239,240,239,237,239,230,111,128, 49, 7,243,241,245,225,242,101, - 128, 51,212, 99, 2,125,249,126, 1,233,242,227,236,101,128, 36, - 220,245,226,229,228,243,241,245,225,242,101,128, 51,165,228,239, - 116, 2,126, 22,126, 31,225,227,227,229,238,116,128, 30, 65,226, - 229,236,239,119,128, 30, 67,101, 7,126, 55,126,182,126,193,126, - 208,126,233,127, 14,127, 26,101, 2,126, 61,126,169,109, 4,126, - 71,126, 80,126, 94,126,110,225,242,225,226,233, 99,128, 6, 69, - 230,233,238,225,236,225,242,225,226,233, 99,128,254,226,233,238, - 233,244,233,225,236,225,242,225,226,233, 99,128,254,227,237,101, - 2,126,117,126,130,228,233,225,236,225,242,225,226,233, 99,128, - 254,228,229,237,105, 2,126,138,126,153,238,233,244,233,225,236, - 225,242,225,226,233, 99,128,252,209,243,239,236,225,244,229,228, - 225,242,225,226,233, 99,128,252, 72,244,239,242,245,243,241,245, - 225,242,101,128, 51, 77,232,233,242,225,231,225,238, 97,128, 48, - 129,233,250,233,229,242,225,243,241,245,225,242,101,128, 51,126, - 235,225,244,225,235,225,238, 97,129, 48,225,126,221,232,225,236, - 230,247,233,228,244,104,128,255,146,109,130, 5,222,126,241,127, - 5,228,225,231,229,243,104,129,251, 62,126,252,232,229,226,242, - 229,119,128,251, 62,232,229,226,242,229,119,128, 5,222,238,225, - 242,237,229,238,233,225,110,128, 5,116,242,235,232, 97, 3,127, - 37,127, 46,127, 79,232,229,226,242,229,119,128, 5,165,235,229, - 230,245,236, 97, 2,127, 57,127, 66,232,229,226,242,229,119,128, - 5,166,236,229,230,244,232,229,226,242,229,119,128, 5,166,236, - 229,230,244,232,229,226,242,229,119,128, 5,165,104, 2,127, 98, - 127,104,239,239,107,128, 2,113,250,243,241,245,225,242,101,128, - 51,146,105, 6,127,128,127,165,128, 46,128, 57,128, 82,128,139, - 228,100, 2,127,135,127,160,236,229,228,239,244,235,225,244,225, - 235,225,238,225,232,225,236,230,247,233,228,244,104,128,255,101, - 239,116,128, 0,183,229,245,109, 5,127,179,127,214,127,229,127, - 238,128, 33, 97, 2,127,185,127,200,227,233,242,227,236,229,235, - 239,242,229,225,110,128, 50,114,240,225,242,229,238,235,239,242, - 229,225,110,128, 50, 18,227,233,242,227,236,229,235,239,242,229, - 225,110,128, 50,100,235,239,242,229,225,110,128, 49, 65,112, 2, - 127,244,128, 20, 97, 2,127,250,128, 8,238,243,233,239,243,235, - 239,242,229,225,110,128, 49,112,242,229,238,235,239,242,229,225, - 110,128, 50, 4,233,229,245,240,235,239,242,229,225,110,128, 49, - 110,243,233,239,243,235,239,242,229,225,110,128, 49,111,232,233, - 242,225,231,225,238, 97,128, 48,127,235,225,244,225,235,225,238, - 97,129, 48,223,128, 70,232,225,236,230,247,233,228,244,104,128, - 255,144,238,117, 2,128, 89,128,134,115,132, 34, 18,128,101,128, - 112,128,121,128,127,226,229,236,239,247,227,237, 98,128, 3, 32, - 227,233,242,227,236,101,128, 34,150,237,239,100,128, 2,215,240, - 236,245,115,128, 34, 19,244,101,128, 32, 50,242,105, 2,128,146, - 128,160,226,225,225,242,245,243,241,245,225,242,101,128, 51, 74, - 243,241,245,225,242,101,128, 51, 73,108, 2,128,175,128,190,239, - 238,231,236,229,231,244,245,242,238,229,100,128, 2,112,243,241, - 245,225,242,101,128, 51,150,109, 3,128,207,128,221,128,232,227, - 245,226,229,228,243,241,245,225,242,101,128, 51,163,239,238,239, - 243,240,225,227,101,128,255, 77,243,241,245,225,242,229,228,243, - 241,245,225,242,101,128, 51,159,111, 5,129, 4,129, 30,129, 55, - 129, 65,129, 74,104, 2,129, 10,129, 20,233,242,225,231,225,238, - 97,128, 48,130,237,243,241,245,225,242,101,128, 51,193,235,225, - 244,225,235,225,238, 97,129, 48,226,129, 43,232,225,236,230,247, - 233,228,244,104,128,255,147,236,243,241,245,225,242,101,128, 51, - 214,237,225,244,232,225,105,128, 14, 33,246,229,242,243,243,241, - 245,225,242,101,129, 51,167,129, 89,228,243,241,245,225,242,101, - 128, 51,168,240, 97, 2,129,106,129,112,242,229,110,128, 36,168, - 243,241,245,225,242,101,128, 51,171,115, 2,129,127,129,136,243, - 241,245,225,242,101,128, 51,179,245,240,229,242,233,239,114,128, - 246,239,244,245,242,238,229,100,128, 2,111,117,141, 0,181,129, - 185,129,189,129,199,129,223,129,233,129,255,130, 10,130, 35,130, - 58,130, 68,130, 98,130,162,130,172, 49,128, 0,181,225,243,241, - 245,225,242,101,128, 51,130,227,104, 2,129,206,129,216,231,242, - 229,225,244,229,114,128, 34,107,236,229,243,115,128, 34,106,230, - 243,241,245,225,242,101,128, 51,140,103, 2,129,239,129,246,242, - 229,229,107,128, 3,188,243,241,245,225,242,101,128, 51,141,232, - 233,242,225,231,225,238, 97,128, 48,128,235,225,244,225,235,225, - 238, 97,129, 48,224,130, 23,232,225,236,230,247,233,228,244,104, - 128,255,145,108, 2,130, 41,130, 50,243,241,245,225,242,101,128, - 51,149,244,233,240,236,121,128, 0,215,237,243,241,245,225,242, - 101,128, 51,155,238,225,104, 2,130, 76,130, 85,232,229,226,242, - 229,119,128, 5,163,236,229,230,244,232,229,226,242,229,119,128, - 5,163,115, 2,130,104,130,153,233, 99, 3,130,113,130,130,130, - 141,225,236,238,239,244,101,129, 38,106,130,124,228,226,108,128, - 38,107,230,236,225,244,243,233,231,110,128, 38,109,243,232,225, - 242,240,243,233,231,110,128, 38,111,243,241,245,225,242,101,128, - 51,178,246,243,241,245,225,242,101,128, 51,182,247,243,241,245, - 225,242,101,128, 51,188,118, 2,130,188,130,201,237,229,231,225, - 243,241,245,225,242,101,128, 51,185,243,241,245,225,242,101,128, - 51,183,119, 2,130,216,130,229,237,229,231,225,243,241,245,225, - 242,101,128, 51,191,243,241,245,225,242,101,128, 51,189,110,150, - 0,110,131, 30,131,164,131,188,131,254,132, 23,132, 81,132, 91, - 132,158,132,201,134,235,134,253,135, 22,135, 53,135, 79,135,144, - 137,126,137,134,137,159,137,167,138,135,138,145,138,155, 97, 8, - 131, 48,131, 68,131, 75,131, 82,131,107,131,118,131,143,131,155, - 98, 2,131, 54,131, 63,229,238,231,225,236,105,128, 9,168,236, - 97,128, 34, 7,227,245,244,101,128, 1, 68,228,229,246, 97,128, - 9, 40,231,117, 2,131, 89,131, 98,234,225,242,225,244,105,128, - 10,168,242,237,245,235,232,105,128, 10, 40,232,233,242,225,231, - 225,238, 97,128, 48,106,235,225,244,225,235,225,238, 97,129, 48, - 202,131,131,232,225,236,230,247,233,228,244,104,128,255,133,240, - 239,243,244,242,239,240,232,101,128, 1, 73,243,241,245,225,242, - 101,128, 51,129, 98, 2,131,170,131,180,239,240,239,237,239,230, - 111,128, 49, 11,243,240,225,227,101,128, 0,160, 99, 4,131,198, - 131,205,131,214,131,241,225,242,239,110,128, 1, 72,229,228,233, - 236,236, 97,128, 1, 70,233,242, 99, 2,131,222,131,227,236,101, - 128, 36,221,245,237,230,236,229,248,226,229,236,239,119,128, 30, - 75,239,237,237,225,225,227,227,229,238,116,128, 1, 70,228,239, - 116, 2,132, 6,132, 15,225,227,227,229,238,116,128, 30, 69,226, - 229,236,239,119,128, 30, 71,101, 3,132, 31,132, 42,132, 67,232, - 233,242,225,231,225,238, 97,128, 48,109,235,225,244,225,235,225, - 238, 97,129, 48,205,132, 55,232,225,236,230,247,233,228,244,104, - 128,255,136,247,243,232,229,241,229,236,243,233,231,110,128, 32, - 170,230,243,241,245,225,242,101,128, 51,139,103, 2,132, 97,132, - 147, 97, 3,132,105,132,115,132,122,226,229,238,231,225,236,105, - 128, 9,153,228,229,246, 97,128, 9, 25,231,117, 2,132,129,132, - 138,234,225,242,225,244,105,128, 10,153,242,237,245,235,232,105, - 128, 10, 25,239,238,231,245,244,232,225,105,128, 14, 7,104, 2, - 132,164,132,174,233,242,225,231,225,238, 97,128, 48,147,239,239, - 107, 2,132,182,132,189,236,229,230,116,128, 2,114,242,229,244, - 242,239,230,236,229,120,128, 2,115,105, 4,132,211,133,124,133, - 135,133,193,229,245,110, 7,132,229,133, 8,133, 40,133, 54,133, - 63,133, 96,133,109, 97, 2,132,235,132,250,227,233,242,227,236, - 229,235,239,242,229,225,110,128, 50,111,240,225,242,229,238,235, - 239,242,229,225,110,128, 50, 15,227,105, 2,133, 15,133, 27,229, - 245,227,235,239,242,229,225,110,128, 49, 53,242,227,236,229,235, - 239,242,229,225,110,128, 50, 97,232,233,229,245,232,235,239,242, - 229,225,110,128, 49, 54,235,239,242,229,225,110,128, 49, 52,240, - 97, 2,133, 70,133, 84,238,243,233,239,243,235,239,242,229,225, - 110,128, 49,104,242,229,238,235,239,242,229,225,110,128, 50, 1, - 243,233,239,243,235,239,242,229,225,110,128, 49,103,244,233,235, - 229,245,244,235,239,242,229,225,110,128, 49,102,232,233,242,225, - 231,225,238, 97,128, 48,107,107, 2,133,141,133,165,225,244,225, - 235,225,238, 97,129, 48,203,133,153,232,225,236,230,247,233,228, - 244,104,128,255,134,232,225,232,233,116, 2,133,175,133,186,236, - 229,230,244,244,232,225,105,128,248,153,244,232,225,105,128, 14, - 77,238,101,141, 0, 57,133,224,133,233,133,243,134, 17,134, 24, - 134, 49,134, 76,134,110,134,122,134,133,134,166,134,174,134,185, - 225,242,225,226,233, 99,128, 6,105,226,229,238,231,225,236,105, - 128, 9,239,227,233,242,227,236,101,129, 36,104,133,254,233,238, - 246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39, - 146,228,229,246, 97,128, 9,111,231,117, 2,134, 31,134, 40,234, - 225,242,225,244,105,128, 10,239,242,237,245,235,232,105,128, 10, - 111,232, 97, 2,134, 56,134, 67,227,235,225,242,225,226,233, 99, - 128, 6,105,238,231,250,232,239,117,128, 48, 41,105, 2,134, 82, - 134,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229, - 110,128, 50, 40,238,230,229,242,233,239,114,128, 32,137,237,239, - 238,239,243,240,225,227,101,128,255, 25,239,236,228,243,244,249, - 236,101,128,247, 57,112, 2,134,139,134,146,225,242,229,110,128, - 36,124,229,114, 2,134,153,134,159,233,239,100,128, 36,144,243, - 233,225,110,128, 6,249,242,239,237,225,110,128, 33,120,243,245, - 240,229,242,233,239,114,128, 32,121,116, 2,134,191,134,229,229, - 229,110, 2,134,199,134,208,227,233,242,227,236,101,128, 36,114, - 112, 2,134,214,134,221,225,242,229,110,128, 36,134,229,242,233, - 239,100,128, 36,154,232,225,105,128, 14, 89,106,129, 1,204,134, - 241,229,227,249,242,233,236,236,233, 99,128, 4, 90,235,225,244, - 225,235,225,238, 97,129, 48,243,135, 10,232,225,236,230,247,233, - 228,244,104,128,255,157,108, 2,135, 28,135, 42,229,231,242,233, - 231,232,244,236,239,238,103,128, 1,158,233,238,229,226,229,236, - 239,119,128, 30, 73,109, 2,135, 59,135, 70,239,238,239,243,240, - 225,227,101,128,255, 78,243,241,245,225,242,101,128, 51,154,110, - 2,135, 85,135,135, 97, 3,135, 93,135,103,135,110,226,229,238, - 231,225,236,105,128, 9,163,228,229,246, 97,128, 9, 35,231,117, - 2,135,117,135,126,234,225,242,225,244,105,128, 10,163,242,237, - 245,235,232,105,128, 10, 35,238,225,228,229,246, 97,128, 9, 41, - 111, 6,135,158,135,169,135,194,135,235,136,187,137,114,232,233, - 242,225,231,225,238, 97,128, 48,110,235,225,244,225,235,225,238, - 97,129, 48,206,135,182,232,225,236,230,247,233,228,244,104,128, - 255,137,110, 3,135,202,135,218,135,227,226,242,229,225,235,233, - 238,231,243,240,225,227,101,128, 0,160,229,238,244,232,225,105, - 128, 14, 19,245,244,232,225,105,128, 14, 25,239,110, 7,135,252, - 136, 5,136, 19,136, 53,136, 69,136,110,136,169,225,242,225,226, - 233, 99,128, 6, 70,230,233,238,225,236,225,242,225,226,233, 99, - 128,254,230,231,232,245,238,238, 97, 2,136, 30,136, 39,225,242, - 225,226,233, 99,128, 6,186,230,233,238,225,236,225,242,225,226, - 233, 99,128,251,159,233,238,233,244,233,225,236,225,242,225,226, - 233, 99,128,254,231,234,229,229,237,105, 2,136, 79,136, 94,238, - 233,244,233,225,236,225,242,225,226,233, 99,128,252,210,243,239, - 236,225,244,229,228,225,242,225,226,233, 99,128,252, 75,237,101, - 2,136,117,136,130,228,233,225,236,225,242,225,226,233, 99,128, - 254,232,229,237,105, 2,136,138,136,153,238,233,244,233,225,236, - 225,242,225,226,233, 99,128,252,213,243,239,236,225,244,229,228, - 225,242,225,226,233, 99,128,252, 78,238,239,239,238,230,233,238, - 225,236,225,242,225,226,233, 99,128,252,141,116, 7,136,203,136, - 214,136,243,137, 22,137, 34,137, 54,137, 80,227,239,238,244,225, - 233,238,115,128, 34, 12,101, 2,136,220,136,236,236,229,237,229, - 238,116,129, 34, 9,136,231,239,102,128, 34, 9,241,245,225,108, - 128, 34, 96,231,242,229,225,244,229,114,129, 34,111,136,255,238, - 239,114, 2,137, 7,137, 15,229,241,245,225,108,128, 34,113,236, - 229,243,115,128, 34,121,233,228,229,238,244,233,227,225,108,128, - 34, 98,236,229,243,115,129, 34,110,137, 43,238,239,242,229,241, - 245,225,108,128, 34,112,112, 2,137, 60,137, 70,225,242,225,236, - 236,229,108,128, 34, 38,242,229,227,229,228,229,115,128, 34,128, - 243,117, 3,137, 89,137, 96,137,105,226,243,229,116,128, 34,132, - 227,227,229,229,228,115,128, 34,129,240,229,242,243,229,116,128, - 34,133,247,225,242,237,229,238,233,225,110,128, 5,118,240,225, - 242,229,110,128, 36,169,115, 2,137,140,137,149,243,241,245,225, - 242,101,128, 51,177,245,240,229,242,233,239,114,128, 32,127,244, - 233,236,228,101,128, 0,241,117,132, 3,189,137,179,137,190,138, - 15,138, 98,232,233,242,225,231,225,238, 97,128, 48,108,107, 2, - 137,196,137,220,225,244,225,235,225,238, 97,129, 48,204,137,208, - 232,225,236,230,247,233,228,244,104,128,255,135,244, 97, 3,137, - 229,137,239,137,246,226,229,238,231,225,236,105,128, 9,188,228, - 229,246, 97,128, 9, 60,231,117, 2,137,253,138, 6,234,225,242, - 225,244,105,128, 10,188,242,237,245,235,232,105,128, 10, 60,109, - 2,138, 21,138, 55,226,229,242,243,233,231,110,130, 0, 35,138, - 35,138, 47,237,239,238,239,243,240,225,227,101,128,255, 3,243, - 237,225,236,108,128,254, 95,229,114, 2,138, 62,138, 94,225,236, - 243,233,231,110, 2,138, 73,138, 81,231,242,229,229,107,128, 3, - 116,236,239,247,229,242,231,242,229,229,107,128, 3,117,111,128, - 33, 22,110,130, 5,224,138,106,138,126,228,225,231,229,243,104, - 129,251, 64,138,117,232,229,226,242,229,119,128,251, 64,232,229, - 226,242,229,119,128, 5,224,246,243,241,245,225,242,101,128, 51, - 181,247,243,241,245,225,242,101,128, 51,187,249, 97, 3,138,164, - 138,174,138,181,226,229,238,231,225,236,105,128, 9,158,228,229, - 246, 97,128, 9, 30,231,117, 2,138,188,138,197,234,225,242,225, - 244,105,128, 10,158,242,237,245,235,232,105,128, 10, 30,111,147, - 0,111,138,248,139, 14,139, 92,140, 6,140, 78,140, 93,140,133, - 141, 0,141, 21,141, 59,141, 70,141,248,143, 82,143,146,143,179, - 143,225,144, 98,144,145,144,157, 97, 2,138,254,139, 5,227,245, - 244,101,128, 0,243,238,231,244,232,225,105,128, 14, 45, 98, 4, - 139, 24,139, 66,139, 75,139, 85,225,242,242,229,100,130, 2,117, - 139, 36,139, 47,227,249,242,233,236,236,233, 99,128, 4,233,228, - 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, - 4,235,229,238,231,225,236,105,128, 9,147,239,240,239,237,239, - 230,111,128, 49, 27,242,229,246,101,128, 1, 79, 99, 3,139,100, - 139,173,139,252, 97, 2,139,106,139,167,238,228,242, 97, 3,139, - 117,139,124,139,135,228,229,246, 97,128, 9, 17,231,245,234,225, - 242,225,244,105,128, 10,145,246,239,247,229,236,243,233,231,110, - 2,139,149,139,156,228,229,246, 97,128, 9, 73,231,245,234,225, - 242,225,244,105,128, 10,201,242,239,110,128, 1,210,233,242, 99, - 2,139,181,139,186,236,101,128, 36,222,245,237,230,236,229,120, - 133, 0,244,139,205,139,213,139,224,139,232,139,244,225,227,245, - 244,101,128, 30,209,228,239,244,226,229,236,239,119,128, 30,217, - 231,242,225,246,101,128, 30,211,232,239,239,235,225,226,239,246, - 101,128, 30,213,244,233,236,228,101,128, 30,215,249,242,233,236, - 236,233, 99,128, 4, 62,100, 4,140, 16,140, 39,140, 45,140, 68, - 226,108, 2,140, 23,140, 31,225,227,245,244,101,128, 1, 81,231, - 242,225,246,101,128, 2, 13,229,246, 97,128, 9, 19,233,229,242, - 229,243,233,115,129, 0,246,140, 57,227,249,242,233,236,236,233, - 99,128, 4,231,239,244,226,229,236,239,119,128, 30,205,101,129, - 1, 83,140, 84,235,239,242,229,225,110,128, 49, 90,103, 3,140, - 101,140,116,140,123,239,238,229,107,129, 2,219,140,110,227,237, - 98,128, 3, 40,242,225,246,101,128, 0,242,245,234,225,242,225, - 244,105,128, 10,147,104, 4,140,143,140,154,140,164,140,242,225, - 242,237,229,238,233,225,110,128, 5,133,233,242,225,231,225,238, - 97,128, 48, 74,111, 2,140,170,140,180,239,235,225,226,239,246, - 101,128, 30,207,242,110,133, 1,161,140,195,140,203,140,214,140, - 222,140,234,225,227,245,244,101,128, 30,219,228,239,244,226,229, - 236,239,119,128, 30,227,231,242,225,246,101,128, 30,221,232,239, - 239,235,225,226,239,246,101,128, 30,223,244,233,236,228,101,128, - 30,225,245,238,231,225,242,245,237,236,225,245,116,128, 1, 81, - 105,129, 1,163,141, 6,238,246,229,242,244,229,228,226,242,229, - 246,101,128, 2, 15,107, 2,141, 27,141, 51,225,244,225,235,225, - 238, 97,129, 48,170,141, 39,232,225,236,230,247,233,228,244,104, - 128,255,117,239,242,229,225,110,128, 49, 87,236,229,232,229,226, - 242,229,119,128, 5,171,109, 6,141, 84,141,112,141,119,141,208, - 141,219,141,237,225,227,242,239,110,130, 1, 77,141, 96,141,104, - 225,227,245,244,101,128, 30, 83,231,242,225,246,101,128, 30, 81, - 228,229,246, 97,128, 9, 80,229,231, 97,133, 3,201,141,135,141, - 139,141,150,141,164,141,180, 49,128, 3,214,227,249,242,233,236, - 236,233, 99,128, 4, 97,236,225,244,233,238,227,236,239,243,229, - 100,128, 2,119,242,239,245,238,228,227,249,242,233,236,236,233, - 99,128, 4,123,116, 2,141,186,141,201,233,244,236,239,227,249, - 242,233,236,236,233, 99,128, 4,125,239,238,239,115,128, 3,206, - 231,245,234,225,242,225,244,105,128, 10,208,233,227,242,239,110, - 129, 3,191,141,229,244,239,238,239,115,128, 3,204,239,238,239, - 243,240,225,227,101,128,255, 79,238,101,145, 0, 49,142, 31,142, - 40,142, 50,142, 80,142,105,142,114,142,123,142,148,142,182,142, - 216,142,228,142,247,143, 2,143, 35,143, 45,143, 53,143, 64,225, - 242,225,226,233, 99,128, 6, 97,226,229,238,231,225,236,105,128, - 9,231,227,233,242,227,236,101,129, 36, 96,142, 61,233,238,246, - 229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39,138, - 100, 2,142, 86,142, 92,229,246, 97,128, 9,103,239,244,229,238, - 236,229,225,228,229,114,128, 32, 36,229,233,231,232,244,104,128, - 33, 91,230,233,244,244,229,100,128,246,220,231,117, 2,142,130, - 142,139,234,225,242,225,244,105,128, 10,231,242,237,245,235,232, - 105,128, 10,103,232, 97, 3,142,157,142,168,142,173,227,235,225, - 242,225,226,233, 99,128, 6, 97,236,102,128, 0,189,238,231,250, - 232,239,117,128, 48, 33,105, 2,142,188,142,206,228,229,239,231, - 242,225,240,232,233,227,240,225,242,229,110,128, 50, 32,238,230, - 229,242,233,239,114,128, 32,129,237,239,238,239,243,240,225,227, - 101,128,255, 17,238,245,237,229,242,225,244,239,242,226,229,238, - 231,225,236,105,128, 9,244,239,236,228,243,244,249,236,101,128, - 247, 49,112, 2,143, 8,143, 15,225,242,229,110,128, 36,116,229, - 114, 2,143, 22,143, 28,233,239,100,128, 36,136,243,233,225,110, - 128, 6,241,241,245,225,242,244,229,114,128, 0,188,242,239,237, - 225,110,128, 33,112,243,245,240,229,242,233,239,114,128, 0,185, - 244,104, 2,143, 71,143, 76,225,105,128, 14, 81,233,242,100,128, - 33, 83,111, 3,143, 90,143,124,143,140,103, 2,143, 96,143,114, - 239,238,229,107,129, 1,235,143,105,237,225,227,242,239,110,128, - 1,237,245,242,237,245,235,232,105,128, 10, 19,237,225,244,242, - 225,231,245,242,237,245,235,232,105,128, 10, 75,240,229,110,128, - 2, 84,112, 3,143,154,143,161,143,172,225,242,229,110,128, 36, - 170,229,238,226,245,236,236,229,116,128, 37,230,244,233,239,110, - 128, 35, 37,114, 2,143,185,143,214,100, 2,143,191,143,202,230, - 229,237,233,238,233,238,101,128, 0,170,237,225,243,227,245,236, - 233,238,101,128, 0,186,244,232,239,231,239,238,225,108,128, 34, - 31,115, 5,143,237,144, 13,144, 30,144, 75,144, 88,232,239,242, - 116, 2,143,246,143,253,228,229,246, 97,128, 9, 18,246,239,247, - 229,236,243,233,231,238,228,229,246, 97,128, 9, 74,236,225,243, - 104,129, 0,248,144, 22,225,227,245,244,101,128, 1,255,237,225, - 236,108, 2,144, 39,144, 50,232,233,242,225,231,225,238, 97,128, - 48, 73,235,225,244,225,235,225,238, 97,129, 48,169,144, 63,232, - 225,236,230,247,233,228,244,104,128,255,107,244,242,239,235,229, - 225,227,245,244,101,128, 1,255,245,240,229,242,233,239,114,128, - 246,240,116, 2,144,104,144,115,227,249,242,233,236,236,233, 99, - 128, 4,127,233,236,228,101,130, 0,245,144,126,144,134,225,227, - 245,244,101,128, 30, 77,228,233,229,242,229,243,233,115,128, 30, - 79,245,226,239,240,239,237,239,230,111,128, 49, 33,118, 2,144, - 163,144,244,229,114, 2,144,170,144,236,236,233,238,101,131, 32, - 62,144,183,144,206,144,229, 99, 2,144,189,144,201,229,238,244, - 229,242,236,233,238,101,128,254, 74,237, 98,128, 3, 5,100, 2, - 144,212,144,220,225,243,232,229,100,128,254, 73,226,236,247,225, - 246,121,128,254, 76,247,225,246,121,128,254, 75,243,227,239,242, - 101,128, 0,175,239,247,229,236,243,233,231,110, 3,145, 3,145, - 13,145, 20,226,229,238,231,225,236,105,128, 9,203,228,229,246, - 97,128, 9, 75,231,245,234,225,242,225,244,105,128, 10,203,112, - 145, 0,112,145, 69,147,197,147,208,147,217,147,229,149,154,149, - 164,150,156,151,175,152, 9,152, 35,152,166,152,174,153, 76,153, - 134,153,162,153,172, 97, 14,145, 99,145,131,145,141,145,148,145, - 155,145,203,145,214,145,228,145,239,146, 30,146, 44,147, 56,147, - 95,147,185, 97, 2,145,105,145,117,237,240,243,243,241,245,225, - 242,101,128, 51,128,243,229,238,244,239,243,241,245,225,242,101, - 128, 51, 43,226,229,238,231,225,236,105,128, 9,170,227,245,244, - 101,128, 30, 85,228,229,246, 97,128, 9, 42,103, 2,145,161,145, - 179,101, 2,145,167,145,174,228,239,247,110,128, 33,223,245,112, - 128, 33,222,117, 2,145,185,145,194,234,225,242,225,244,105,128, - 10,170,242,237,245,235,232,105,128, 10, 42,232,233,242,225,231, - 225,238, 97,128, 48,113,233,249,225,238,238,239,233,244,232,225, - 105,128, 14, 47,235,225,244,225,235,225,238, 97,128, 48,209,108, - 2,145,245,146, 14,225,244,225,236,233,250,225,244,233,239,238, - 227,249,242,233,236,236,233,227,227,237, 98,128, 4,132,239,227, - 232,235,225,227,249,242,233,236,236,233, 99,128, 4,192,238,243, - 233,239,243,235,239,242,229,225,110,128, 49,127,114, 3,146, 52, - 146, 73,147, 45, 97, 2,146, 58,146, 66,231,242,225,240,104,128, - 0,182,236,236,229,108,128, 34, 37,229,110, 2,146, 80,146,190, - 236,229,230,116,136, 0, 40,146,103,146,118,146,123,146,128,146, - 139,146,151,146,174,146,179,225,236,244,239,238,229,225,242,225, - 226,233, 99,128,253, 62,226,116,128,248,237,229,120,128,248,236, - 233,238,230,229,242,233,239,114,128, 32,141,237,239,238,239,243, - 240,225,227,101,128,255, 8,115, 2,146,157,146,164,237,225,236, - 108,128,254, 89,245,240,229,242,233,239,114,128, 32,125,244,112, - 128,248,235,246,229,242,244,233,227,225,108,128,254, 53,242,233, - 231,232,116,136, 0, 41,146,214,146,229,146,234,146,239,146,250, - 147, 6,147, 29,147, 34,225,236,244,239,238,229,225,242,225,226, - 233, 99,128,253, 63,226,116,128,248,248,229,120,128,248,247,233, - 238,230,229,242,233,239,114,128, 32,142,237,239,238,239,243,240, - 225,227,101,128,255, 9,115, 2,147, 12,147, 19,237,225,236,108, - 128,254, 90,245,240,229,242,233,239,114,128, 32,126,244,112,128, - 248,246,246,229,242,244,233,227,225,108,128,254, 54,244,233,225, - 236,228,233,230,102,128, 34, 2,115, 3,147, 64,147, 75,147, 87, - 229,241,232,229,226,242,229,119,128, 5,192,232,244,225,232,229, - 226,242,229,119,128, 5,153,241,245,225,242,101,128, 51,169,244, - 225,104,134, 5,183,147,113,147,127,147,132,147,141,147,156,147, - 172, 49, 2,147,119,147,123, 49,128, 5,183,100,128, 5,183,178, - 97,128, 5,183,232,229,226,242,229,119,128, 5,183,238,225,242, - 242,239,247,232,229,226,242,229,119,128, 5,183,241,245,225,242, - 244,229,242,232,229,226,242,229,119,128, 5,183,247,233,228,229, - 232,229,226,242,229,119,128, 5,183,250,229,242,232,229,226,242, - 229,119,128, 5,161,226,239,240,239,237,239,230,111,128, 49, 6, - 227,233,242,227,236,101,128, 36,223,228,239,244,225,227,227,229, - 238,116,128, 30, 87,101,137, 5,228,147,251,148, 6,148, 26,148, - 38,148, 58,148,160,148,171,148,192,149,147,227,249,242,233,236, - 236,233, 99,128, 4, 63,228,225,231,229,243,104,129,251, 68,148, - 17,232,229,226,242,229,119,128,251, 68,229,250,233,243,241,245, - 225,242,101,128, 51, 59,230,233,238,225,236,228,225,231,229,243, - 232,232,229,226,242,229,119,128,251, 67,104, 5,148, 70,148, 93, - 148,101,148,115,148,145,225,114, 2,148, 77,148, 84,225,226,233, - 99,128, 6,126,237,229,238,233,225,110,128, 5,122,229,226,242, - 229,119,128, 5,228,230,233,238,225,236,225,242,225,226,233, 99, - 128,251, 87,105, 2,148,121,148,136,238,233,244,233,225,236,225, - 242,225,226,233, 99,128,251, 88,242,225,231,225,238, 97,128, 48, - 122,237,229,228,233,225,236,225,242,225,226,233, 99,128,251, 89, - 235,225,244,225,235,225,238, 97,128, 48,218,237,233,228,228,236, - 229,232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,167, - 114, 5,148,204,148,216,149, 2,149,123,149,136,225,230,229,232, - 229,226,242,229,119,128,251, 78,227,229,238,116,131, 0, 37,148, - 229,148,238,148,250,225,242,225,226,233, 99,128, 6,106,237,239, - 238,239,243,240,225,227,101,128,255, 5,243,237,225,236,108,128, - 254,106,105, 2,149, 8,149,105,239,100,134, 0, 46,149, 25,149, - 36,149, 47,149, 59,149, 70,149, 82,225,242,237,229,238,233,225, - 110,128, 5,137,227,229,238,244,229,242,229,100,128, 0,183,232, - 225,236,230,247,233,228,244,104,128,255, 97,233,238,230,229,242, - 233,239,114,128,246,231,237,239,238,239,243,240,225,227,101,128, - 255, 14,115, 2,149, 88,149, 95,237,225,236,108,128,254, 82,245, - 240,229,242,233,239,114,128,246,232,243,240,239,237,229,238,233, - 231,242,229,229,235,227,237, 98,128, 3, 66,240,229,238,228,233, - 227,245,236,225,114,128, 34,165,244,232,239,245,243,225,238,100, - 128, 32, 48,243,229,244, 97,128, 32,167,230,243,241,245,225,242, - 101,128, 51,138,104, 3,149,172,149,222,150,103, 97, 3,149,180, - 149,190,149,197,226,229,238,231,225,236,105,128, 9,171,228,229, - 246, 97,128, 9, 43,231,117, 2,149,204,149,213,234,225,242,225, - 244,105,128, 10,171,242,237,245,235,232,105,128, 10, 43,105,133, - 3,198,149,236,149,240,150, 70,150, 78,150, 89, 49,128, 3,213, - 229,245,240,104, 4,149,253,150, 32,150, 47,150, 56, 97, 2,150, - 3,150, 18,227,233,242,227,236,229,235,239,242,229,225,110,128, - 50,122,240,225,242,229,238,235,239,242,229,225,110,128, 50, 26, - 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,108,235, - 239,242,229,225,110,128, 49, 77,240,225,242,229,238,235,239,242, - 229,225,110,128, 50, 12,236,225,244,233,110,128, 2,120,238,244, - 232,245,244,232,225,105,128, 14, 58,243,249,237,226,239,236,231, - 242,229,229,107,128, 3,213,111, 3,150,111,150,116,150,142,239, - 107,128, 1,165,240,104, 2,150,123,150,132,225,238,244,232,225, - 105,128, 14, 30,245,238,231,244,232,225,105,128, 14, 28,243,225, - 237,240,232,225,239,244,232,225,105,128, 14, 32,105,133, 3,192, - 150,170,151,126,151,137,151,148,151,162,229,245,112, 6,150,186, - 150,221,150,253,151, 25,151, 39,151, 91, 97, 2,150,192,150,207, - 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,115,240, - 225,242,229,238,235,239,242,229,225,110,128, 50, 19,227,105, 2, - 150,228,150,240,229,245,227,235,239,242,229,225,110,128, 49,118, - 242,227,236,229,235,239,242,229,225,110,128, 50,101,107, 2,151, - 3,151, 17,233,249,229,239,235,235,239,242,229,225,110,128, 49, - 114,239,242,229,225,110,128, 49, 66,240,225,242,229,238,235,239, - 242,229,225,110,128, 50, 5,243,233,239,115, 2,151, 48,151, 76, - 107, 2,151, 54,151, 68,233,249,229,239,235,235,239,242,229,225, - 110,128, 49,116,239,242,229,225,110,128, 49, 68,244,233,235,229, - 245,244,235,239,242,229,225,110,128, 49,117,116, 2,151, 97,151, - 112,232,233,229,245,244,232,235,239,242,229,225,110,128, 49,119, - 233,235,229,245,244,235,239,242,229,225,110,128, 49,115,232,233, - 242,225,231,225,238, 97,128, 48,116,235,225,244,225,235,225,238, - 97,128, 48,212,243,249,237,226,239,236,231,242,229,229,107,128, - 3,214,247,242,225,242,237,229,238,233,225,110,128, 5,131,236, - 245,115,132, 0, 43,151,189,151,200,151,209,151,242,226,229,236, - 239,247,227,237, 98,128, 3, 31,227,233,242,227,236,101,128, 34, - 149,109, 2,151,215,151,222,233,238,245,115,128, 0,177,111, 2, - 151,228,151,232,100,128, 2,214,238,239,243,240,225,227,101,128, - 255, 11,115, 2,151,248,151,255,237,225,236,108,128,254, 98,245, - 240,229,242,233,239,114,128, 32,122,109, 2,152, 15,152, 26,239, - 238,239,243,240,225,227,101,128,255, 80,243,241,245,225,242,101, - 128, 51,216,111, 5,152, 47,152, 58,152,125,152,136,152,146,232, - 233,242,225,231,225,238, 97,128, 48,125,233,238,244,233,238,231, - 233,238,228,229,120, 4,152, 78,152, 90,152,102,152,115,228,239, - 247,238,247,232,233,244,101,128, 38, 31,236,229,230,244,247,232, - 233,244,101,128, 38, 28,242,233,231,232,244,247,232,233,244,101, - 128, 38, 30,245,240,247,232,233,244,101,128, 38, 29,235,225,244, - 225,235,225,238, 97,128, 48,221,240,236,225,244,232,225,105,128, - 14, 27,243,244,225,236,237,225,242,107,129, 48, 18,152,159,230, - 225,227,101,128, 48, 32,240,225,242,229,110,128, 36,171,114, 3, - 152,182,152,208,152,233,101, 2,152,188,152,196,227,229,228,229, - 115,128, 34,122,243,227,242,233,240,244,233,239,110,128, 33, 30, - 233,237,101, 2,152,216,152,222,237,239,100,128, 2,185,242,229, - 246,229,242,243,229,100,128, 32, 53,111, 4,152,243,152,250,153, - 4,153, 17,228,245,227,116,128, 34, 15,234,229,227,244,233,246, - 101,128, 35, 5,236,239,238,231,229,228,235,225,238, 97,128, 48, - 252,112, 2,153, 23,153, 60,101, 2,153, 29,153, 36,236,236,239, - 114,128, 35, 24,242,243,117, 2,153, 44,153, 51,226,243,229,116, - 128, 34,130,240,229,242,243,229,116,128, 34,131,239,242,244,233, - 239,110,129, 34, 55,153, 71,225,108,128, 34, 29,115, 2,153, 82, - 153,125,105,130, 3,200,153, 90,153,101,227,249,242,233,236,236, - 233, 99,128, 4,113,236,233,240,238,229,245,237,225,244,225,227, - 249,242,233,236,236,233,227,227,237, 98,128, 4,134,243,241,245, - 225,242,101,128, 51,176,117, 2,153,140,153,151,232,233,242,225, - 231,225,238, 97,128, 48,119,235,225,244,225,235,225,238, 97,128, - 48,215,246,243,241,245,225,242,101,128, 51,180,247,243,241,245, - 225,242,101,128, 51,186,113,136, 0,113,153,202,154,251,155, 6, - 155, 15,155, 22,155, 34,155, 72,155, 80, 97, 4,153,212,153,235, - 154, 43,154,234,100, 2,153,218,153,224,229,246, 97,128, 9, 88, - 237,225,232,229,226,242,229,119,128, 5,168,102, 4,153,245,153, - 254,154, 12,154, 28,225,242,225,226,233, 99,128, 6, 66,230,233, - 238,225,236,225,242,225,226,233, 99,128,254,214,233,238,233,244, - 233,225,236,225,242,225,226,233, 99,128,254,215,237,229,228,233, - 225,236,225,242,225,226,233, 99,128,254,216,237,225,244,115,136, - 5,184,154, 66,154, 86,154,100,154,105,154,110,154,119,154,134, - 154,221, 49, 3,154, 74,154, 78,154, 82, 48,128, 5,184, 97,128, - 5,184, 99,128, 5,184, 50, 2,154, 92,154, 96, 55,128, 5,184, - 57,128, 5,184,179, 51,128, 5,184,228,101,128, 5,184,232,229, - 226,242,229,119,128, 5,184,238,225,242,242,239,247,232,229,226, - 242,229,119,128, 5,184,113, 2,154,140,154,206,225,244,225,110, - 4,154,153,154,162,154,177,154,193,232,229,226,242,229,119,128, - 5,184,238,225,242,242,239,247,232,229,226,242,229,119,128, 5, - 184,241,245,225,242,244,229,242,232,229,226,242,229,119,128, 5, - 184,247,233,228,229,232,229,226,242,229,119,128, 5,184,245,225, - 242,244,229,242,232,229,226,242,229,119,128, 5,184,247,233,228, - 229,232,229,226,242,229,119,128, 5,184,242,238,229,249,240,225, - 242,225,232,229,226,242,229,119,128, 5,159,226,239,240,239,237, - 239,230,111,128, 49, 17,227,233,242,227,236,101,128, 36,224,232, - 239,239,107,128, 2,160,237,239,238,239,243,240,225,227,101,128, - 255, 81,239,102,130, 5,231,155, 43,155, 63,228,225,231,229,243, - 104,129,251, 71,155, 54,232,229,226,242,229,119,128,251, 71,232, - 229,226,242,229,119,128, 5,231,240,225,242,229,110,128, 36,172, - 117, 4,155, 90,155,102,155,191,156, 22,225,242,244,229,242,238, - 239,244,101,128, 38,105,226,245,244,115,135, 5,187,155,123,155, - 128,155,133,155,138,155,147,155,162,155,178,177, 56,128, 5,187, - 178, 53,128, 5,187,179, 49,128, 5,187,232,229,226,242,229,119, - 128, 5,187,238,225,242,242,239,247,232,229,226,242,229,119,128, - 5,187,241,245,225,242,244,229,242,232,229,226,242,229,119,128, - 5,187,247,233,228,229,232,229,226,242,229,119,128, 5,187,229, - 243,244,233,239,110,133, 0, 63,155,210,155,233,155,250,156, 2, - 156, 14,225,114, 2,155,217,155,224,225,226,233, 99,128, 6, 31, - 237,229,238,233,225,110,128, 5, 94,228,239,247,110,129, 0,191, - 155,242,243,237,225,236,108,128,247,191,231,242,229,229,107,128, - 3,126,237,239,238,239,243,240,225,227,101,128,255, 31,243,237, - 225,236,108,128,247, 63,239,244,101, 4,156, 34,156,105,156,125, - 156,154,228,226,108,133, 0, 34,156, 50,156, 57,156, 64,156, 76, - 156, 97,226,225,243,101,128, 32, 30,236,229,230,116,128, 32, 28, - 237,239,238,239,243,240,225,227,101,128,255, 2,240,242,233,237, - 101,129, 48, 30,156, 86,242,229,246,229,242,243,229,100,128, 48, - 29,242,233,231,232,116,128, 32, 29,236,229,230,116,129, 32, 24, - 156,114,242,229,246,229,242,243,229,100,128, 32, 27,114, 2,156, - 131,156,141,229,246,229,242,243,229,100,128, 32, 27,233,231,232, - 116,129, 32, 25,156,150,110,128, 1, 73,243,233,238,231,108, 2, - 156,164,156,171,226,225,243,101,128, 32, 26,101,129, 0, 39,156, - 177,237,239,238,239,243,240,225,227,101,128,255, 7,114,145, 0, - 114,156,227,157,231,157,242,158, 33,158, 84,159,101,159,125,159, - 220,161,254,162, 35,162, 47,162,101,162,109,163, 15,163, 26,163, - 61,163,161, 97, 11,156,251,157, 6,157, 16,157, 23,157, 88,157, - 104,157,129,157,140,157,165,157,188,157,225,225,242,237,229,238, - 233,225,110,128, 5,124,226,229,238,231,225,236,105,128, 9,176, - 227,245,244,101,128, 1, 85,100, 4,157, 33,157, 39,157, 53,157, - 79,229,246, 97,128, 9, 48,233,227,225,108,129, 34, 26,157, 48, - 229,120,128,248,229,239,246,229,242,243,243,241,245,225,242,101, - 129, 51,174,157, 69,228,243,241,245,225,242,101,128, 51,175,243, - 241,245,225,242,101,128, 51,173,230,101,129, 5,191,157, 95,232, - 229,226,242,229,119,128, 5,191,231,117, 2,157,111,157,120,234, - 225,242,225,244,105,128, 10,176,242,237,245,235,232,105,128, 10, - 48,232,233,242,225,231,225,238, 97,128, 48,137,235,225,244,225, - 235,225,238, 97,129, 48,233,157,153,232,225,236,230,247,233,228, - 244,104,128,255,151,236,239,247,229,242,228,233,225,231,239,238, - 225,236,226,229,238,231,225,236,105,128, 9,241,109, 2,157,194, - 157,217,233,228,228,236,229,228,233,225,231,239,238,225,236,226, - 229,238,231,225,236,105,128, 9,240,243,232,239,242,110,128, 2, - 100,244,233,111,128, 34, 54,226,239,240,239,237,239,230,111,128, - 49, 22, 99, 4,157,252,158, 3,158, 12,158, 20,225,242,239,110, - 128, 1, 89,229,228,233,236,236, 97,128, 1, 87,233,242,227,236, - 101,128, 36,225,239,237,237,225,225,227,227,229,238,116,128, 1, - 87,100, 2,158, 39,158, 49,226,236,231,242,225,246,101,128, 2, - 17,239,116, 2,158, 56,158, 65,225,227,227,229,238,116,128, 30, - 89,226,229,236,239,119,129, 30, 91,158, 75,237,225,227,242,239, - 110,128, 30, 93,101, 6,158, 98,158,143,158,178,158,233,159, 2, - 159, 35,102, 2,158,104,158,117,229,242,229,238,227,229,237,225, - 242,107,128, 32, 59,236,229,248,243,117, 2,158,127,158,134,226, - 243,229,116,128, 34,134,240,229,242,243,229,116,128, 34,135,231, - 233,243,244,229,114, 2,158,154,158,159,229,100,128, 0,174,115, - 2,158,165,158,171,225,238,115,128,248,232,229,242,233,102,128, - 246,218,104, 3,158,186,158,209,158,223,225,114, 2,158,193,158, - 200,225,226,233, 99,128, 6, 49,237,229,238,233,225,110,128, 5, - 128,230,233,238,225,236,225,242,225,226,233, 99,128,254,174,233, - 242,225,231,225,238, 97,128, 48,140,235,225,244,225,235,225,238, - 97,129, 48,236,158,246,232,225,236,230,247,233,228,244,104,128, - 255,154,243,104,130, 5,232,159, 11,159, 26,228,225,231,229,243, - 232,232,229,226,242,229,119,128,251, 72,232,229,226,242,229,119, - 128, 5,232,118, 3,159, 43,159, 56,159, 88,229,242,243,229,228, - 244,233,236,228,101,128, 34, 61,233, 97, 2,159, 63,159, 72,232, - 229,226,242,229,119,128, 5,151,237,245,231,242,225,243,232,232, - 229,226,242,229,119,128, 5,151,236,239,231,233,227,225,236,238, - 239,116,128, 35, 16,230,233,243,232,232,239,239,107,129, 2,126, - 159,114,242,229,246,229,242,243,229,100,128, 2,127,104, 2,159, - 131,159,154, 97, 2,159,137,159,147,226,229,238,231,225,236,105, - 128, 9,221,228,229,246, 97,128, 9, 93,111,131, 3,193,159,164, - 159,193,159,207,239,107,129, 2,125,159,171,244,245,242,238,229, - 100,129, 2,123,159,182,243,245,240,229,242,233,239,114,128, 2, - 181,243,249,237,226,239,236,231,242,229,229,107,128, 3,241,244, - 233,227,232,239,239,235,237,239,100,128, 2,222,105, 6,159,234, - 161, 22,161, 68,161, 79,161,104,161,240,229,245,108, 9,160, 0, - 160, 35,160, 50,160, 64,160,110,160,124,160,210,160,223,161, 2, - 97, 2,160, 6,160, 21,227,233,242,227,236,229,235,239,242,229, - 225,110,128, 50,113,240,225,242,229,238,235,239,242,229,225,110, - 128, 50, 17,227,233,242,227,236,229,235,239,242,229,225,110,128, - 50, 99,232,233,229,245,232,235,239,242,229,225,110,128, 49, 64, - 107, 2,160, 70,160,102,233,249,229,239,107, 2,160, 80,160, 89, - 235,239,242,229,225,110,128, 49, 58,243,233,239,243,235,239,242, - 229,225,110,128, 49,105,239,242,229,225,110,128, 49, 57,237,233, - 229,245,237,235,239,242,229,225,110,128, 49, 59,112, 3,160,132, - 160,164,160,179, 97, 2,160,138,160,152,238,243,233,239,243,235, - 239,242,229,225,110,128, 49,108,242,229,238,235,239,242,229,225, - 110,128, 50, 3,232,233,229,245,240,232,235,239,242,229,225,110, - 128, 49, 63,233,229,245,112, 2,160,188,160,197,235,239,242,229, - 225,110,128, 49, 60,243,233,239,243,235,239,242,229,225,110,128, - 49,107,243,233,239,243,235,239,242,229,225,110,128, 49, 61,116, - 2,160,229,160,244,232,233,229,245,244,232,235,239,242,229,225, - 110,128, 49, 62,233,235,229,245,244,235,239,242,229,225,110,128, - 49,106,249,229,239,242,233,238,232,233,229,245,232,235,239,242, - 229,225,110,128, 49,109,231,232,116, 2,161, 30,161, 38,225,238, - 231,236,101,128, 34, 31,116, 2,161, 44,161, 58,225,227,235,226, - 229,236,239,247,227,237, 98,128, 3, 25,242,233,225,238,231,236, - 101,128, 34,191,232,233,242,225,231,225,238, 97,128, 48,138,235, - 225,244,225,235,225,238, 97,129, 48,234,161, 92,232,225,236,230, - 247,233,228,244,104,128,255,152,110, 2,161,110,161,226,103,131, - 2,218,161,120,161,131,161,137,226,229,236,239,247,227,237, 98, - 128, 3, 37,227,237, 98,128, 3, 10,232,225,236,102, 2,161,146, - 161,192,236,229,230,116,131, 2,191,161,159,161,170,161,181,225, - 242,237,229,238,233,225,110,128, 5, 89,226,229,236,239,247,227, - 237, 98,128, 3, 28,227,229,238,244,229,242,229,100,128, 2,211, - 242,233,231,232,116,130, 2,190,161,204,161,215,226,229,236,239, - 247,227,237, 98,128, 3, 57,227,229,238,244,229,242,229,100,128, - 2,210,246,229,242,244,229,228,226,242,229,246,101,128, 2, 19, - 244,244,239,242,245,243,241,245,225,242,101,128, 51, 81,108, 2, - 162, 4,162, 15,233,238,229,226,229,236,239,119,128, 30, 95,239, - 238,231,236,229,103,129, 2,124,162, 26,244,245,242,238,229,100, - 128, 2,122,237,239,238,239,243,240,225,227,101,128,255, 82,111, - 3,162, 55,162, 66,162, 91,232,233,242,225,231,225,238, 97,128, - 48,141,235,225,244,225,235,225,238, 97,129, 48,237,162, 79,232, - 225,236,230,247,233,228,244,104,128,255,155,242,245,225,244,232, - 225,105,128, 14, 35,240,225,242,229,110,128, 36,173,114, 3,162, - 117,162,153,162,183, 97, 3,162,125,162,135,162,142,226,229,238, - 231,225,236,105,128, 9,220,228,229,246, 97,128, 9, 49,231,245, - 242,237,245,235,232,105,128, 10, 92,229,104, 2,162,160,162,169, - 225,242,225,226,233, 99,128, 6,145,230,233,238,225,236,225,242, - 225,226,233, 99,128,251,141,246,239,227,225,236,233, 99, 4,162, - 199,162,209,162,216,162,227,226,229,238,231,225,236,105,128, 9, - 224,228,229,246, 97,128, 9, 96,231,245,234,225,242,225,244,105, - 128, 10,224,246,239,247,229,236,243,233,231,110, 3,162,243,162, - 253,163, 4,226,229,238,231,225,236,105,128, 9,196,228,229,246, - 97,128, 9, 68,231,245,234,225,242,225,244,105,128, 10,196,243, - 245,240,229,242,233,239,114,128,246,241,116, 2,163, 32,163, 40, - 226,236,239,227,107,128, 37,144,245,242,238,229,100,129, 2,121, - 163, 50,243,245,240,229,242,233,239,114,128, 2,180,117, 4,163, - 71,163, 82,163,107,163,154,232,233,242,225,231,225,238, 97,128, - 48,139,235,225,244,225,235,225,238, 97,129, 48,235,163, 95,232, - 225,236,230,247,233,228,244,104,128,255,153,112, 2,163,113,163, - 148,229,101, 2,163,120,163,134,237,225,242,235,226,229,238,231, - 225,236,105,128, 9,242,243,233,231,238,226,229,238,231,225,236, - 105,128, 9,243,233,225,104,128,246,221,244,232,225,105,128, 14, - 36,246,239,227,225,236,233, 99, 4,163,177,163,187,163,194,163, - 205,226,229,238,231,225,236,105,128, 9,139,228,229,246, 97,128, - 9, 11,231,245,234,225,242,225,244,105,128, 10,139,246,239,247, - 229,236,243,233,231,110, 3,163,221,163,231,163,238,226,229,238, - 231,225,236,105,128, 9,195,228,229,246, 97,128, 9, 67,231,245, - 234,225,242,225,244,105,128, 10,195,115,147, 0,115,164, 35,166, - 5,166, 16,166,142,166,181,169,123,169,134,172, 21,174,159,174, - 205,174,232,175,167,175,234,177, 11,177, 21,177,207,178, 24,178, - 194,178,204, 97, 9,164, 55,164, 65,164, 86,164,158,164,183,164, - 194,164,219,164,251,165, 35,226,229,238,231,225,236,105,128, 9, - 184,227,245,244,101,129, 1, 91,164, 74,228,239,244,225,227,227, - 229,238,116,128, 30,101,100, 5,164, 98,164,107,164,113,164,127, - 164,143,225,242,225,226,233, 99,128, 6, 53,229,246, 97,128, 9, - 56,230,233,238,225,236,225,242,225,226,233, 99,128,254,186,233, - 238,233,244,233,225,236,225,242,225,226,233, 99,128,254,187,237, - 229,228,233,225,236,225,242,225,226,233, 99,128,254,188,231,117, - 2,164,165,164,174,234,225,242,225,244,105,128, 10,184,242,237, - 245,235,232,105,128, 10, 56,232,233,242,225,231,225,238, 97,128, - 48, 85,235,225,244,225,235,225,238, 97,129, 48,181,164,207,232, - 225,236,230,247,233,228,244,104,128,255,123,236,236,225,236,236, - 225,232,239,245,225,236,225,249,232,229,247,225,243,225,236,236, - 225,237,225,242,225,226,233, 99,128,253,250,237,229,235,104,130, - 5,225,165, 6,165, 26,228,225,231,229,243,104,129,251, 65,165, - 17,232,229,226,242,229,119,128,251, 65,232,229,226,242,229,119, - 128, 5,225,242, 97, 5,165, 48,165,122,165,130,165,180,165,188, - 97, 5,165, 60,165, 68,165, 76,165,107,165,115,225,244,232,225, - 105,128, 14, 50,229,244,232,225,105,128, 14, 65,233,237,225,233, - 109, 2,165, 86,165, 97,225,236,225,233,244,232,225,105,128, 14, - 68,245,225,238,244,232,225,105,128, 14, 67,237,244,232,225,105, - 128, 14, 51,244,232,225,105,128, 14, 48,229,244,232,225,105,128, - 14, 64,105, 3,165,138,165,162,165,173,105, 2,165,144,165,155, - 236,229,230,244,244,232,225,105,128,248,134,244,232,225,105,128, - 14, 53,236,229,230,244,244,232,225,105,128,248,133,244,232,225, - 105,128, 14, 52,239,244,232,225,105,128, 14, 66,117, 3,165,196, - 165,246,165,253,101, 3,165,204,165,228,165,239,101, 2,165,210, - 165,221,236,229,230,244,244,232,225,105,128,248,136,244,232,225, - 105,128, 14, 55,236,229,230,244,244,232,225,105,128,248,135,244, - 232,225,105,128, 14, 54,244,232,225,105,128, 14, 56,245,244,232, - 225,105,128, 14, 57,226,239,240,239,237,239,230,111,128, 49, 25, - 99, 5,166, 28,166, 49,166, 58,166,107,166,129,225,242,239,110, - 129, 1, 97,166, 37,228,239,244,225,227,227,229,238,116,128, 30, - 103,229,228,233,236,236, 97,128, 1, 95,232,247, 97,131, 2, 89, - 166, 70,166, 81,166,100,227,249,242,233,236,236,233, 99,128, 4, - 217,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, - 99,128, 4,219,232,239,239,107,128, 2, 90,233,242, 99, 2,166, - 115,166,120,236,101,128, 36,226,245,237,230,236,229,120,128, 1, - 93,239,237,237,225,225,227,227,229,238,116,128, 2, 25,228,239, - 116, 2,166,150,166,159,225,227,227,229,238,116,128, 30, 97,226, - 229,236,239,119,129, 30, 99,166,169,228,239,244,225,227,227,229, - 238,116,128, 30,105,101, 9,166,201,166,217,166,252,167, 61,167, - 164,167,191,167,216,168, 41,168, 68,225,231,245,236,236,226,229, - 236,239,247,227,237, 98,128, 3, 60, 99, 2,166,223,166,245,239, - 238,100,129, 32, 51,166,231,244,239,238,229,227,232,233,238,229, - 243,101,128, 2,202,244,233,239,110,128, 0,167,229,110, 4,167, - 7,167, 16,167, 30,167, 46,225,242,225,226,233, 99,128, 6, 51, - 230,233,238,225,236,225,242,225,226,233, 99,128,254,178,233,238, - 233,244,233,225,236,225,242,225,226,233, 99,128,254,179,237,229, - 228,233,225,236,225,242,225,226,233, 99,128,254,180,231,239,108, - 135, 5,182,167, 81,167, 95,167,100,167,109,167,124,167,140,167, - 151, 49, 2,167, 87,167, 91, 51,128, 5,182,102,128, 5,182,178, - 99,128, 5,182,232,229,226,242,229,119,128, 5,182,238,225,242, - 242,239,247,232,229,226,242,229,119,128, 5,182,241,245,225,242, - 244,229,242,232,229,226,242,229,119,128, 5,182,244,225,232,229, - 226,242,229,119,128, 5,146,247,233,228,229,232,229,226,242,229, - 119,128, 5,182,104, 2,167,170,167,181,225,242,237,229,238,233, - 225,110,128, 5,125,233,242,225,231,225,238, 97,128, 48, 91,235, - 225,244,225,235,225,238, 97,129, 48,187,167,204,232,225,236,230, - 247,233,228,244,104,128,255,126,237,105, 2,167,223,168, 10,227, - 239,236,239,110,131, 0, 59,167,237,167,246,168, 2,225,242,225, - 226,233, 99,128, 6, 27,237,239,238,239,243,240,225,227,101,128, - 255, 27,243,237,225,236,108,128,254, 84,246,239,233,227,229,228, - 237,225,242,235,235,225,238, 97,129, 48,156,168, 29,232,225,236, - 230,247,233,228,244,104,128,255,159,238,116, 2,168, 48,168, 58, - 233,243,241,245,225,242,101,128, 51, 34,239,243,241,245,225,242, - 101,128, 51, 35,246,229,110,142, 0, 55,168,102,168,111,168,121, - 168,151,168,158,168,168,168,193,168,220,168,254,169, 10,169, 21, - 169, 54,169, 62,169, 73,225,242,225,226,233, 99,128, 6,103,226, - 229,238,231,225,236,105,128, 9,237,227,233,242,227,236,101,129, - 36,102,168,132,233,238,246,229,242,243,229,243,225,238,243,243, - 229,242,233,102,128, 39,144,228,229,246, 97,128, 9,109,229,233, - 231,232,244,232,115,128, 33, 94,231,117, 2,168,175,168,184,234, - 225,242,225,244,105,128, 10,237,242,237,245,235,232,105,128, 10, - 109,232, 97, 2,168,200,168,211,227,235,225,242,225,226,233, 99, - 128, 6,103,238,231,250,232,239,117,128, 48, 39,105, 2,168,226, - 168,244,228,229,239,231,242,225,240,232,233,227,240,225,242,229, - 110,128, 50, 38,238,230,229,242,233,239,114,128, 32,135,237,239, - 238,239,243,240,225,227,101,128,255, 23,239,236,228,243,244,249, - 236,101,128,247, 55,112, 2,169, 27,169, 34,225,242,229,110,128, - 36,122,229,114, 2,169, 41,169, 47,233,239,100,128, 36,142,243, - 233,225,110,128, 6,247,242,239,237,225,110,128, 33,118,243,245, - 240,229,242,233,239,114,128, 32,119,116, 2,169, 79,169,117,229, - 229,110, 2,169, 87,169, 96,227,233,242,227,236,101,128, 36,112, - 112, 2,169,102,169,109,225,242,229,110,128, 36,132,229,242,233, - 239,100,128, 36,152,232,225,105,128, 14, 87,230,244,232,249,240, - 232,229,110,128, 0,173,104, 7,169,150,170,124,170,135,170,149, - 171, 94,171,107,172, 15, 97, 6,169,164,169,175,169,185,169,196, - 170, 83,170,108,225,242,237,229,238,233,225,110,128, 5,119,226, - 229,238,231,225,236,105,128, 9,182,227,249,242,233,236,236,233, - 99,128, 4, 72,100, 2,169,202,170, 42,228, 97, 4,169,213,169, - 222,169,253,170, 11,225,242,225,226,233, 99,128, 6, 81,228,225, - 237,237, 97, 2,169,232,169,241,225,242,225,226,233, 99,128,252, - 97,244,225,238,225,242,225,226,233, 99,128,252, 94,230,225,244, - 232,225,225,242,225,226,233, 99,128,252, 96,235,225,243,242, 97, - 2,170, 21,170, 30,225,242,225,226,233, 99,128,252, 98,244,225, - 238,225,242,225,226,233, 99,128,252, 95,101,132, 37,146,170, 54, - 170, 61,170, 69,170, 78,228,225,242,107,128, 37,147,236,233,231, - 232,116,128, 37,145,237,229,228,233,245,109,128, 37,146,246, 97, - 128, 9, 54,231,117, 2,170, 90,170, 99,234,225,242,225,244,105, - 128, 10,182,242,237,245,235,232,105,128, 10, 54,236,243,232,229, - 236,229,244,232,229,226,242,229,119,128, 5,147,226,239,240,239, - 237,239,230,111,128, 49, 21,227,232,225,227,249,242,233,236,236, - 233, 99,128, 4, 73,101, 4,170,159,170,224,170,234,170,251,229, - 110, 4,170,170,170,179,170,193,170,209,225,242,225,226,233, 99, - 128, 6, 52,230,233,238,225,236,225,242,225,226,233, 99,128,254, - 182,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,254, - 183,237,229,228,233,225,236,225,242,225,226,233, 99,128,254,184, - 233,227,239,240,244,233, 99,128, 3,227,241,229,108,129, 32,170, - 170,242,232,229,226,242,229,119,128, 32,170,246, 97,134, 5,176, - 171, 12,171, 27,171, 41,171, 50,171, 65,171, 81, 49, 2,171, 18, - 171, 23,177, 53,128, 5,176, 53,128, 5,176, 50, 2,171, 33,171, - 37, 50,128, 5,176,101,128, 5,176,232,229,226,242,229,119,128, - 5,176,238,225,242,242,239,247,232,229,226,242,229,119,128, 5, - 176,241,245,225,242,244,229,242,232,229,226,242,229,119,128, 5, - 176,247,233,228,229,232,229,226,242,229,119,128, 5,176,232,225, - 227,249,242,233,236,236,233, 99,128, 4,187,105, 2,171,113,171, - 124,237,225,227,239,240,244,233, 99,128, 3,237,110,131, 5,233, - 171,134,171,217,171,226,100, 2,171,140,171,206,225,231,229,243, - 104,130,251, 73,171,152,171,161,232,229,226,242,229,119,128,251, - 73,115, 2,171,167,171,187,232,233,238,228,239,116,129,251, 44, - 171,178,232,229,226,242,229,119,128,251, 44,233,238,228,239,116, - 129,251, 45,171,197,232,229,226,242,229,119,128,251, 45,239,244, - 232,229,226,242,229,119,128, 5,193,232,229,226,242,229,119,128, - 5,233,115, 2,171,232,171,252,232,233,238,228,239,116,129,251, - 42,171,243,232,229,226,242,229,119,128,251, 42,233,238,228,239, - 116,129,251, 43,172, 6,232,229,226,242,229,119,128,251, 43,239, - 239,107,128, 2,130,105, 8,172, 39,172, 83,172, 94,172,119,172, - 149,172,157,172,170,173, 85,231,237, 97,131, 3,195,172, 51,172, - 55,172, 63, 49,128, 3,194,230,233,238,225,108,128, 3,194,236, - 245,238,225,244,229,243,249,237,226,239,236,231,242,229,229,107, - 128, 3,242,232,233,242,225,231,225,238, 97,128, 48, 87,235,225, - 244,225,235,225,238, 97,129, 48,183,172,107,232,225,236,230,247, - 233,228,244,104,128,255,124,236,245,113, 2,172,127,172,136,232, - 229,226,242,229,119,128, 5,189,236,229,230,244,232,229,226,242, - 229,119,128, 5,189,237,233,236,225,114,128, 34, 60,238,228,239, - 244,232,229,226,242,229,119,128, 5,194,239,115, 6,172,185,172, - 220,172,252,173, 24,173, 38,173, 70, 97, 2,172,191,172,206,227, - 233,242,227,236,229,235,239,242,229,225,110,128, 50,116,240,225, - 242,229,238,235,239,242,229,225,110,128, 50, 20,227,105, 2,172, - 227,172,239,229,245,227,235,239,242,229,225,110,128, 49,126,242, - 227,236,229,235,239,242,229,225,110,128, 50,102,107, 2,173, 2, - 173, 16,233,249,229,239,235,235,239,242,229,225,110,128, 49,122, - 239,242,229,225,110,128, 49, 69,238,233,229,245,238,235,239,242, - 229,225,110,128, 49,123,112, 2,173, 44,173, 57,225,242,229,238, - 235,239,242,229,225,110,128, 50, 6,233,229,245,240,235,239,242, - 229,225,110,128, 49,125,244,233,235,229,245,244,235,239,242,229, - 225,110,128, 49,124,120,141, 0, 54,173,115,173,124,173,134,173, - 164,173,171,173,196,173,223,174, 1,174, 13,174, 24,174, 57,174, - 65,174, 76,225,242,225,226,233, 99,128, 6,102,226,229,238,231, - 225,236,105,128, 9,236,227,233,242,227,236,101,129, 36,101,173, - 145,233,238,246,229,242,243,229,243,225,238,243,243,229,242,233, - 102,128, 39,143,228,229,246, 97,128, 9,108,231,117, 2,173,178, - 173,187,234,225,242,225,244,105,128, 10,236,242,237,245,235,232, - 105,128, 10,108,232, 97, 2,173,203,173,214,227,235,225,242,225, - 226,233, 99,128, 6,102,238,231,250,232,239,117,128, 48, 38,105, - 2,173,229,173,247,228,229,239,231,242,225,240,232,233,227,240, - 225,242,229,110,128, 50, 37,238,230,229,242,233,239,114,128, 32, - 134,237,239,238,239,243,240,225,227,101,128,255, 22,239,236,228, - 243,244,249,236,101,128,247, 54,112, 2,174, 30,174, 37,225,242, - 229,110,128, 36,121,229,114, 2,174, 44,174, 50,233,239,100,128, - 36,141,243,233,225,110,128, 6,246,242,239,237,225,110,128, 33, - 117,243,245,240,229,242,233,239,114,128, 32,118,116, 2,174, 82, - 174,153,229,229,110, 2,174, 90,174,132, 99, 2,174, 96,174,104, - 233,242,227,236,101,128, 36,111,245,242,242,229,238,227,249,228, - 229,238,239,237,233,238,225,244,239,242,226,229,238,231,225,236, - 105,128, 9,249,112, 2,174,138,174,145,225,242,229,110,128, 36, - 131,229,242,233,239,100,128, 36,151,232,225,105,128, 14, 86,108, - 2,174,165,174,185,225,243,104,129, 0, 47,174,173,237,239,238, - 239,243,240,225,227,101,128,255, 15,239,238,103,129, 1,127,174, - 193,228,239,244,225,227,227,229,238,116,128, 30,155,109, 2,174, - 211,174,221,233,236,229,230,225,227,101,128, 38, 58,239,238,239, - 243,240,225,227,101,128,255, 83,111, 6,174,246,175, 40,175, 51, - 175, 76,175,121,175,132,102, 2,174,252,175, 10,240,225,243,245, - 241,232,229,226,242,229,119,128, 5,195,116, 2,175, 16,175, 25, - 232,249,240,232,229,110,128, 0,173,243,233,231,238,227,249,242, - 233,236,236,233, 99,128, 4, 76,232,233,242,225,231,225,238, 97, - 128, 48, 93,235,225,244,225,235,225,238, 97,129, 48,189,175, 64, - 232,225,236,230,247,233,228,244,104,128,255,127,236,233,228,245, - 115, 2,175, 86,175,103,236,239,238,231,239,246,229,242,236,225, - 249,227,237, 98,128, 3, 56,243,232,239,242,244,239,246,229,242, - 236,225,249,227,237, 98,128, 3, 55,242,245,243,233,244,232,225, - 105,128, 14, 41,115, 3,175,140,175,150,175,158,225,236,225,244, - 232,225,105,128, 14, 40,239,244,232,225,105,128, 14, 11,245,225, - 244,232,225,105,128, 14, 42,240, 97, 3,175,176,175,196,175,228, - 227,101,129, 0, 32,175,183,232,225,227,235,225,242,225,226,233, - 99,128, 0, 32,228,101,129, 38, 96,175,203,243,245,233,116, 2, - 175,212,175,220,226,236,225,227,107,128, 38, 96,247,232,233,244, - 101,128, 38,100,242,229,110,128, 36,174,241,245,225,242,101, 11, - 176, 6,176, 17,176, 31,176, 56,176, 73,176, 99,176,114,176,147, - 176,174,176,230,176,245,226,229,236,239,247,227,237, 98,128, 3, - 59, 99, 2,176, 23,176, 27, 99,128, 51,196,109,128, 51,157,228, - 233,225,231,239,238,225,236,227,242,239,243,243,232,225,244,227, - 232,230,233,236,108,128, 37,169,232,239,242,233,250,239,238,244, - 225,236,230,233,236,108,128, 37,164,107, 2,176, 79,176, 83,103, - 128, 51,143,109,129, 51,158,176, 89,227,225,240,233,244,225,108, - 128, 51,206,108, 2,176,105,176,109,110,128, 51,209,239,103,128, - 51,210,109, 4,176,124,176,128,176,133,176,137,103,128, 51,142, - 233,108,128, 51,213,109,128, 51,156,243,241,245,225,242,229,100, - 128, 51,161,239,242,244,232,239,231,239,238,225,236,227,242,239, - 243,243,232,225,244,227,232,230,233,236,108,128, 37,166,245,240, - 240,229,114, 2,176,184,176,207,236,229,230,244,244,239,236,239, - 247,229,242,242,233,231,232,244,230,233,236,108,128, 37,167,242, - 233,231,232,244,244,239,236,239,247,229,242,236,229,230,244,230, - 233,236,108,128, 37,168,246,229,242,244,233,227,225,236,230,233, - 236,108,128, 37,165,247,232,233,244,229,247,233,244,232,243,237, - 225,236,236,226,236,225,227,107,128, 37,163,242,243,241,245,225, - 242,101,128, 51,219,115, 2,177, 27,177,197, 97, 4,177, 37,177, - 47,177, 54,177, 65,226,229,238,231,225,236,105,128, 9,183,228, - 229,246, 97,128, 9, 55,231,245,234,225,242,225,244,105,128, 10, - 183,238,103, 8,177, 84,177, 98,177,112,177,126,177,141,177,155, - 177,169,177,182,227,233,229,245,227,235,239,242,229,225,110,128, - 49, 73,232,233,229,245,232,235,239,242,229,225,110,128, 49,133, - 233,229,245,238,231,235,239,242,229,225,110,128, 49,128,235,233, - 249,229,239,235,235,239,242,229,225,110,128, 49, 50,238,233,229, - 245,238,235,239,242,229,225,110,128, 49,101,240,233,229,245,240, - 235,239,242,229,225,110,128, 49, 67,243,233,239,243,235,239,242, - 229,225,110,128, 49, 70,244,233,235,229,245,244,235,239,242,229, - 225,110,128, 49, 56,245,240,229,242,233,239,114,128,246,242,116, - 2,177,213,177,236,229,242,236,233,238,103,129, 0,163,177,224, - 237,239,238,239,243,240,225,227,101,128,255,225,242,239,235,101, - 2,177,245,178, 6,236,239,238,231,239,246,229,242,236,225,249, - 227,237, 98,128, 3, 54,243,232,239,242,244,239,246,229,242,236, - 225,249,227,237, 98,128, 3, 53,117, 7,178, 40,178, 72,178, 94, - 178,105,178,146,178,156,178,160,226,243,229,116,130, 34,130,178, - 51,178, 62,238,239,244,229,241,245,225,108,128, 34,138,239,242, - 229,241,245,225,108,128, 34,134, 99, 2,178, 78,178, 86,227,229, - 229,228,115,128, 34,123,232,244,232,225,116,128, 34, 11,232,233, - 242,225,231,225,238, 97,128, 48, 89,107, 2,178,111,178,135,225, - 244,225,235,225,238, 97,129, 48,185,178,123,232,225,236,230,247, - 233,228,244,104,128,255,125,245,238,225,242,225,226,233, 99,128, - 6, 82,237,237,225,244,233,239,110,128, 34, 17,110,128, 38, 60, - 240,229,242,243,229,116,130, 34,131,178,173,178,184,238,239,244, - 229,241,245,225,108,128, 34,139,239,242,229,241,245,225,108,128, - 34,135,246,243,241,245,225,242,101,128, 51,220,249,239,245,247, - 225,229,242,225,243,241,245,225,242,101,128, 51,124,116,144, 0, - 116,179, 1,180, 10,180, 31,180,174,180,214,183, 6,186,144,187, - 219,187,231,187,243,189, 20,189, 45,189,131,190, 55,190,239,191, - 73, 97, 10,179, 23,179, 33,179, 54,179, 61,179, 86,179,164,179, - 181,179,206,179,220,179,224,226,229,238,231,225,236,105,128, 9, - 164,227,107, 2,179, 40,179, 47,228,239,247,110,128, 34,164,236, - 229,230,116,128, 34,163,228,229,246, 97,128, 9, 36,231,117, 2, - 179, 68,179, 77,234,225,242,225,244,105,128, 10,164,242,237,245, - 235,232,105,128, 10, 36,104, 4,179, 96,179,105,179,119,179,149, - 225,242,225,226,233, 99,128, 6, 55,230,233,238,225,236,225,242, - 225,226,233, 99,128,254,194,105, 2,179,125,179,140,238,233,244, - 233,225,236,225,242,225,226,233, 99,128,254,195,242,225,231,225, - 238, 97,128, 48, 95,237,229,228,233,225,236,225,242,225,226,233, - 99,128,254,196,233,243,249,239,245,229,242,225,243,241,245,225, - 242,101,128, 51,125,235,225,244,225,235,225,238, 97,129, 48,191, - 179,194,232,225,236,230,247,233,228,244,104,128,255,128,244,247, - 229,229,236,225,242,225,226,233, 99,128, 6, 64,117,128, 3,196, - 118,130, 5,234,179,232,180, 1,228,225,231,229,115,129,251, 74, - 179,242,104,129,251, 74,179,248,232,229,226,242,229,119,128,251, - 74,232,229,226,242,229,119,128, 5,234, 98, 2,180, 16,180, 21, - 225,114,128, 1,103,239,240,239,237,239,230,111,128, 49, 10, 99, - 6,180, 45,180, 52,180, 59,180, 68,180,134,180,161,225,242,239, - 110,128, 1,101,227,245,242,108,128, 2,168,229,228,233,236,236, - 97,128, 1, 99,232,229,104, 4,180, 80,180, 89,180,103,180,119, - 225,242,225,226,233, 99,128, 6,134,230,233,238,225,236,225,242, - 225,226,233, 99,128,251,123,233,238,233,244,233,225,236,225,242, - 225,226,233, 99,128,251,124,237,229,228,233,225,236,225,242,225, - 226,233, 99,128,251,125,233,242, 99, 2,180,142,180,147,236,101, - 128, 36,227,245,237,230,236,229,248,226,229,236,239,119,128, 30, - 113,239,237,237,225,225,227,227,229,238,116,128, 1, 99,100, 2, - 180,180,180,190,233,229,242,229,243,233,115,128, 30,151,239,116, - 2,180,197,180,206,225,227,227,229,238,116,128, 30,107,226,229, - 236,239,119,128, 30,109,101, 9,180,234,180,245,181, 9,182, 19, - 182, 44,182,108,182,175,182,180,182,232,227,249,242,233,236,236, - 233, 99,128, 4, 66,228,229,243,227,229,238,228,229,242,227,249, - 242,233,236,236,233, 99,128, 4,173,104, 7,181, 25,181, 34,181, - 48,181, 88,181,118,181,159,182, 1,225,242,225,226,233, 99,128, - 6, 42,230,233,238,225,236,225,242,225,226,233, 99,128,254,150, - 232,225,232,105, 2,181, 57,181, 72,238,233,244,233,225,236,225, - 242,225,226,233, 99,128,252,162,243,239,236,225,244,229,228,225, - 242,225,226,233, 99,128,252, 12,105, 2,181, 94,181,109,238,233, - 244,233,225,236,225,242,225,226,233, 99,128,254,151,242,225,231, - 225,238, 97,128, 48,102,234,229,229,237,105, 2,181,128,181,143, - 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,161,243, - 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 11,109, - 2,181,165,181,199,225,242,226,245,244, 97, 2,181,176,181,185, - 225,242,225,226,233, 99,128, 6, 41,230,233,238,225,236,225,242, - 225,226,233, 99,128,254,148,101, 2,181,205,181,218,228,233,225, - 236,225,242,225,226,233, 99,128,254,152,229,237,105, 2,181,226, - 181,241,238,233,244,233,225,236,225,242,225,226,233, 99,128,252, - 164,243,239,236,225,244,229,228,225,242,225,226,233, 99,128,252, - 14,238,239,239,238,230,233,238,225,236,225,242,225,226,233, 99, - 128,252,115,235,225,244,225,235,225,238, 97,129, 48,198,182, 32, - 232,225,236,230,247,233,228,244,104,128,255,131,108, 2,182, 50, - 182, 69,229,240,232,239,238,101,129, 33, 33,182, 61,226,236,225, - 227,107,128, 38, 14,233,243,232, 97, 2,182, 78,182, 93,231,229, - 228,239,236,225,232,229,226,242,229,119,128, 5,160,241,229,244, - 225,238,225,232,229,226,242,229,119,128, 5,169,110, 4,182,118, - 182,127,182,146,182,167,227,233,242,227,236,101,128, 36,105,233, - 228,229,239,231,242,225,240,232,233,227,240,225,242,229,110,128, - 50, 41,112, 2,182,152,182,159,225,242,229,110,128, 36,125,229, - 242,233,239,100,128, 36,145,242,239,237,225,110,128, 33,121,243, - 104,128, 2,167,116,131, 5,216,182,190,182,210,182,219,228,225, - 231,229,243,104,129,251, 56,182,201,232,229,226,242,229,119,128, - 251, 56,232,229,226,242,229,119,128, 5,216,243,229,227,249,242, - 233,236,236,233, 99,128, 4,181,246,233,114, 2,182,240,182,249, - 232,229,226,242,229,119,128, 5,155,236,229,230,244,232,229,226, - 242,229,119,128, 5,155,104, 6,183, 20,183,172,184, 38,184,170, - 185, 77,186,134, 97, 5,183, 32,183, 42,183, 49,183, 74,183,103, - 226,229,238,231,225,236,105,128, 9,165,228,229,246, 97,128, 9, - 37,231,117, 2,183, 56,183, 65,234,225,242,225,244,105,128, 10, - 165,242,237,245,235,232,105,128, 10, 37,108, 2,183, 80,183, 89, - 225,242,225,226,233, 99,128, 6, 48,230,233,238,225,236,225,242, - 225,226,233, 99,128,254,172,238,244,232,225,235,232,225,116, 3, - 183,118,183,149,183,156,236,239,119, 2,183,126,183,137,236,229, - 230,244,244,232,225,105,128,248,152,242,233,231,232,244,244,232, - 225,105,128,248,151,244,232,225,105,128, 14, 76,245,240,240,229, - 242,236,229,230,244,244,232,225,105,128,248,150,101, 3,183,180, - 183,244,184, 11,104, 4,183,190,183,199,183,213,183,229,225,242, - 225,226,233, 99,128, 6, 43,230,233,238,225,236,225,242,225,226, - 233, 99,128,254,154,233,238,233,244,233,225,236,225,242,225,226, - 233, 99,128,254,155,237,229,228,233,225,236,225,242,225,226,233, - 99,128,254,156,242,101, 2,183,251,184, 4,229,248,233,243,244, - 115,128, 34, 3,230,239,242,101,128, 34, 52,244, 97,130, 3,184, - 184, 20,184, 24, 49,128, 3,209,243,249,237,226,239,236,231,242, - 229,229,107,128, 3,209,105, 2,184, 44,184,130,229,245,244,104, - 4,184, 57,184, 92,184,107,184,116, 97, 2,184, 63,184, 78,227, - 233,242,227,236,229,235,239,242,229,225,110,128, 50,121,240,225, - 242,229,238,235,239,242,229,225,110,128, 50, 25,227,233,242,227, - 236,229,235,239,242,229,225,110,128, 50,107,235,239,242,229,225, - 110,128, 49, 76,240,225,242,229,238,235,239,242,229,225,110,128, - 50, 11,242,244,229,229,110, 2,184,140,184,149,227,233,242,227, - 236,101,128, 36,108,112, 2,184,155,184,162,225,242,229,110,128, - 36,128,229,242,233,239,100,128, 36,148,111, 6,184,184,184,201, - 184,206,184,220,184,225,185, 22,238,225,238,231,237,239,238,244, - 232,239,244,232,225,105,128, 14, 17,239,107,128, 1,173,240,232, - 245,244,232,225,239,244,232,225,105,128, 14, 18,242,110,128, 0, - 254,244,104, 3,184,234,185, 2,185, 12, 97, 2,184,240,184,250, - 232,225,238,244,232,225,105,128, 14, 23,238,244,232,225,105,128, - 14, 16,239,238,231,244,232,225,105,128, 14, 24,245,238,231,244, - 232,225,105,128, 14, 22,245,243,225,238,100, 2,185, 32,185, 43, - 227,249,242,233,236,236,233, 99,128, 4,130,243,243,229,240,225, - 242,225,244,239,114, 2,185, 58,185, 67,225,242,225,226,233, 99, - 128, 6,108,240,229,242,243,233,225,110,128, 6,108,242,229,101, - 144, 0, 51,185,115,185,124,185,134,185,164,185,171,185,181,185, - 206,185,233,186, 11,186, 23,186, 42,186, 53,186, 86,186,108,186, - 116,186,127,225,242,225,226,233, 99,128, 6, 99,226,229,238,231, - 225,236,105,128, 9,233,227,233,242,227,236,101,129, 36, 98,185, - 145,233,238,246,229,242,243,229,243,225,238,243,243,229,242,233, - 102,128, 39,140,228,229,246, 97,128, 9,105,229,233,231,232,244, - 232,115,128, 33, 92,231,117, 2,185,188,185,197,234,225,242,225, - 244,105,128, 10,233,242,237,245,235,232,105,128, 10,105,232, 97, - 2,185,213,185,224,227,235,225,242,225,226,233, 99,128, 6, 99, - 238,231,250,232,239,117,128, 48, 35,105, 2,185,239,186, 1,228, - 229,239,231,242,225,240,232,233,227,240,225,242,229,110,128, 50, - 34,238,230,229,242,233,239,114,128, 32,131,237,239,238,239,243, - 240,225,227,101,128,255, 19,238,245,237,229,242,225,244,239,242, - 226,229,238,231,225,236,105,128, 9,246,239,236,228,243,244,249, - 236,101,128,247, 51,112, 2,186, 59,186, 66,225,242,229,110,128, - 36,118,229,114, 2,186, 73,186, 79,233,239,100,128, 36,138,243, - 233,225,110,128, 6,243,241,245,225,242,244,229,242,115,129, 0, - 190,186, 99,229,237,228,225,243,104,128,246,222,242,239,237,225, - 110,128, 33,114,243,245,240,229,242,233,239,114,128, 0,179,244, - 232,225,105,128, 14, 83,250,243,241,245,225,242,101,128, 51,148, - 105, 7,186,160,186,171,187, 30,187,128,187,140,187,189,187,206, - 232,233,242,225,231,225,238, 97,128, 48, 97,107, 2,186,177,186, - 201,225,244,225,235,225,238, 97,129, 48,193,186,189,232,225,236, - 230,247,233,228,244,104,128,255,129,229,245,116, 4,186,213,186, - 248,187, 7,187, 16, 97, 2,186,219,186,234,227,233,242,227,236, - 229,235,239,242,229,225,110,128, 50,112,240,225,242,229,238,235, - 239,242,229,225,110,128, 50, 16,227,233,242,227,236,229,235,239, - 242,229,225,110,128, 50, 98,235,239,242,229,225,110,128, 49, 55, - 240,225,242,229,238,235,239,242,229,225,110,128, 50, 2,236,228, - 101,133, 2,220,187, 46,187, 57,187, 74,187, 86,187,114,226,229, - 236,239,247,227,237, 98,128, 3, 48, 99, 2,187, 63,187, 68,237, - 98,128, 3, 3,239,237, 98,128, 3, 3,228,239,245,226,236,229, - 227,237, 98,128, 3, 96,111, 2,187, 92,187,102,240,229,242,225, - 244,239,114,128, 34, 60,246,229,242,236,225,249,227,237, 98,128, - 3, 52,246,229,242,244,233,227,225,236,227,237, 98,128, 3, 62, - 237,229,243,227,233,242,227,236,101,128, 34,151,112, 2,187,146, - 187,176,229,232, 97, 2,187,154,187,163,232,229,226,242,229,119, - 128, 5,150,236,229,230,244,232,229,226,242,229,119,128, 5,150, - 240,233,231,245,242,237,245,235,232,105,128, 10,112,244,236,239, - 227,249,242,233,236,236,233,227,227,237, 98,128, 4,131,247,238, - 225,242,237,229,238,233,225,110,128, 5,127,236,233,238,229,226, - 229,236,239,119,128, 30,111,237,239,238,239,243,240,225,227,101, - 128,255, 84,111, 7,188, 3,188, 14,188, 25,188, 50,188,170,188, - 182,189, 10,225,242,237,229,238,233,225,110,128, 5,105,232,233, - 242,225,231,225,238, 97,128, 48,104,235,225,244,225,235,225,238, - 97,129, 48,200,188, 38,232,225,236,230,247,233,228,244,104,128, - 255,132,110, 3,188, 58,188,156,188,161,101, 4,188, 68,188,137, - 188,144,188,150,226,225,114, 4,188, 80,188,109,188,119,188,128, - 229,248,244,242, 97, 2,188, 90,188,100,232,233,231,232,237,239, - 100,128, 2,229,236,239,247,237,239,100,128, 2,233,232,233,231, - 232,237,239,100,128, 2,230,236,239,247,237,239,100,128, 2,232, - 237,233,228,237,239,100,128, 2,231,230,233,246,101,128, 1,189, - 243,233,120,128, 1,133,244,247,111,128, 1,168,239,115,128, 3, - 132,243,241,245,225,242,101,128, 51, 39,240,225,244,225,235,244, - 232,225,105,128, 14, 15,242,244,239,233,243,229,243,232,229,236, - 236,226,242,225,227,235,229,116, 2,188,205,188,235,236,229,230, - 116,130, 48, 20,188,216,188,224,243,237,225,236,108,128,254, 93, - 246,229,242,244,233,227,225,108,128,254, 57,242,233,231,232,116, - 130, 48, 21,188,247,188,255,243,237,225,236,108,128,254, 94,246, - 229,242,244,233,227,225,108,128,254, 58,244,225,239,244,232,225, - 105,128, 14, 21,240, 97, 2,189, 27,189, 39,236,225,244,225,236, - 232,239,239,107,128, 1,171,242,229,110,128, 36,175,114, 3,189, - 53,189, 84,189, 99,225,228,229,237,225,242,107,129, 33, 34,189, - 65,115, 2,189, 71,189, 77,225,238,115,128,248,234,229,242,233, - 102,128,246,219,229,244,242,239,230,236,229,248,232,239,239,107, - 128, 2,136,233,225,103, 4,189,111,189,116,189,121,189,126,228, - 110,128, 37,188,236,102,128, 37,196,242,116,128, 37,186,245,112, - 128, 37,178,115,132, 2,166,189,143,189,182,190, 32,190, 45,225, - 228,105,130, 5,230,189,153,189,173,228,225,231,229,243,104,129, - 251, 70,189,164,232,229,226,242,229,119,128,251, 70,232,229,226, - 242,229,119,128, 5,230,101, 2,189,188,189,199,227,249,242,233, - 236,236,233, 99,128, 4, 70,242,101,134, 5,181,189,216,189,230, - 189,235,189,244,190, 3,190, 19, 49, 2,189,222,189,226, 50,128, - 5,181,101,128, 5,181,178, 98,128, 5,181,232,229,226,242,229, - 119,128, 5,181,238,225,242,242,239,247,232,229,226,242,229,119, - 128, 5,181,241,245,225,242,244,229,242,232,229,226,242,229,119, - 128, 5,181,247,233,228,229,232,229,226,242,229,119,128, 5,181, - 232,229,227,249,242,233,236,236,233, 99,128, 4, 91,245,240,229, - 242,233,239,114,128,246,243,116, 4,190, 65,190,115,190,180,190, - 231, 97, 3,190, 73,190, 83,190, 90,226,229,238,231,225,236,105, - 128, 9,159,228,229,246, 97,128, 9, 31,231,117, 2,190, 97,190, - 106,234,225,242,225,244,105,128, 10,159,242,237,245,235,232,105, - 128, 10, 31,229,104, 4,190,126,190,135,190,149,190,165,225,242, - 225,226,233, 99,128, 6,121,230,233,238,225,236,225,242,225,226, - 233, 99,128,251,103,233,238,233,244,233,225,236,225,242,225,226, - 233, 99,128,251,104,237,229,228,233,225,236,225,242,225,226,233, - 99,128,251,105,232, 97, 3,190,189,190,199,190,206,226,229,238, - 231,225,236,105,128, 9,160,228,229,246, 97,128, 9, 32,231,117, - 2,190,213,190,222,234,225,242,225,244,105,128, 10,160,242,237, - 245,235,232,105,128, 10, 32,245,242,238,229,100,128, 2,135,117, - 3,190,247,191, 2,191, 27,232,233,242,225,231,225,238, 97,128, - 48,100,235,225,244,225,235,225,238, 97,129, 48,196,191, 15,232, - 225,236,230,247,233,228,244,104,128,255,130,243,237,225,236,108, - 2,191, 37,191, 48,232,233,242,225,231,225,238, 97,128, 48, 99, - 235,225,244,225,235,225,238, 97,129, 48,195,191, 61,232,225,236, - 230,247,233,228,244,104,128,255,111,119, 2,191, 79,191,184,101, - 2,191, 85,191,133,236,246,101, 3,191, 95,191,104,191,125,227, - 233,242,227,236,101,128, 36,107,112, 2,191,110,191,117,225,242, - 229,110,128, 36,127,229,242,233,239,100,128, 36,147,242,239,237, - 225,110,128, 33,123,238,244,121, 3,191,143,191,152,191,163,227, - 233,242,227,236,101,128, 36,115,232,225,238,231,250,232,239,117, - 128, 83, 68,112, 2,191,169,191,176,225,242,229,110,128, 36,135, - 229,242,233,239,100,128, 36,155,111,142, 0, 50,191,216,191,225, - 191,235,192, 9,192, 61,192, 86,192,113,192,147,192,159,192,178, - 192,189,192,222,192,230,192,254,225,242,225,226,233, 99,128, 6, - 98,226,229,238,231,225,236,105,128, 9,232,227,233,242,227,236, - 101,129, 36, 97,191,246,233,238,246,229,242,243,229,243,225,238, - 243,243,229,242,233,102,128, 39,139,100, 2,192, 15,192, 21,229, - 246, 97,128, 9,104,239,116, 2,192, 28,192, 39,229,238,236,229, - 225,228,229,114,128, 32, 37,236,229,225,228,229,114,129, 32, 37, - 192, 50,246,229,242,244,233,227,225,108,128,254, 48,231,117, 2, - 192, 68,192, 77,234,225,242,225,244,105,128, 10,232,242,237,245, - 235,232,105,128, 10,104,232, 97, 2,192, 93,192,104,227,235,225, - 242,225,226,233, 99,128, 6, 98,238,231,250,232,239,117,128, 48, - 34,105, 2,192,119,192,137,228,229,239,231,242,225,240,232,233, - 227,240,225,242,229,110,128, 50, 33,238,230,229,242,233,239,114, - 128, 32,130,237,239,238,239,243,240,225,227,101,128,255, 18,238, - 245,237,229,242,225,244,239,242,226,229,238,231,225,236,105,128, - 9,245,239,236,228,243,244,249,236,101,128,247, 50,112, 2,192, - 195,192,202,225,242,229,110,128, 36,117,229,114, 2,192,209,192, - 215,233,239,100,128, 36,137,243,233,225,110,128, 6,242,242,239, - 237,225,110,128, 33,113,115, 2,192,236,192,244,244,242,239,235, - 101,128, 1,187,245,240,229,242,233,239,114,128, 0,178,244,104, - 2,193, 5,193, 10,225,105,128, 14, 82,233,242,228,115,128, 33, - 84,117,145, 0,117,193, 55,193, 63,193,104,193,161,194, 43,194, - 80,194,203,194,219,195, 14,195, 84,195,165,195,174,196, 37,196, - 61,196,169,196,197,197, 55,225,227,245,244,101,128, 0,250, 98, - 4,193, 73,193, 78,193, 87,193, 97,225,114,128, 2,137,229,238, - 231,225,236,105,128, 9,137,239,240,239,237,239,230,111,128, 49, - 40,242,229,246,101,128, 1,109, 99, 3,193,112,193,119,193,151, - 225,242,239,110,128, 1,212,233,242, 99, 2,193,127,193,132,236, - 101,128, 36,228,245,237,230,236,229,120,129, 0,251,193,143,226, - 229,236,239,119,128, 30,119,249,242,233,236,236,233, 99,128, 4, - 67,100, 5,193,173,193,184,193,207,193,213,194, 33,225,244,244, - 225,228,229,246, 97,128, 9, 81,226,108, 2,193,191,193,199,225, - 227,245,244,101,128, 1,113,231,242,225,246,101,128, 2, 21,229, - 246, 97,128, 9, 9,233,229,242,229,243,233,115,133, 0,252,193, - 233,193,241,193,249,194, 16,194, 24,225,227,245,244,101,128, 1, - 216,226,229,236,239,119,128, 30,115, 99, 2,193,255,194, 6,225, - 242,239,110,128, 1,218,249,242,233,236,236,233, 99,128, 4,241, - 231,242,225,246,101,128, 1,220,237,225,227,242,239,110,128, 1, - 214,239,244,226,229,236,239,119,128, 30,229,103, 2,194, 49,194, - 56,242,225,246,101,128, 0,249,117, 2,194, 62,194, 71,234,225, - 242,225,244,105,128, 10,137,242,237,245,235,232,105,128, 10, 9, - 104, 3,194, 88,194, 98,194,176,233,242,225,231,225,238, 97,128, - 48, 70,111, 2,194,104,194,114,239,235,225,226,239,246,101,128, - 30,231,242,110,133, 1,176,194,129,194,137,194,148,194,156,194, - 168,225,227,245,244,101,128, 30,233,228,239,244,226,229,236,239, - 119,128, 30,241,231,242,225,246,101,128, 30,235,232,239,239,235, - 225,226,239,246,101,128, 30,237,244,233,236,228,101,128, 30,239, - 245,238,231,225,242,245,237,236,225,245,116,129, 1,113,194,192, - 227,249,242,233,236,236,233, 99,128, 4,243,233,238,246,229,242, - 244,229,228,226,242,229,246,101,128, 2, 23,107, 3,194,227,194, - 251,195, 6,225,244,225,235,225,238, 97,129, 48,166,194,239,232, - 225,236,230,247,233,228,244,104,128,255,115,227,249,242,233,236, - 236,233, 99,128, 4,121,239,242,229,225,110,128, 49, 92,109, 2, - 195, 20,195, 73, 97, 2,195, 26,195, 59,227,242,239,110,130, 1, - 107,195, 37,195, 48,227,249,242,233,236,236,233, 99,128, 4,239, - 228,233,229,242,229,243,233,115,128, 30,123,244,242,225,231,245, - 242,237,245,235,232,105,128, 10, 65,239,238,239,243,240,225,227, - 101,128,255, 85,110, 2,195, 90,195,145,228,229,242,243,227,239, - 242,101,132, 0, 95,195,109,195,115,195,127,195,138,228,226,108, - 128, 32, 23,237,239,238,239,243,240,225,227,101,128,255, 63,246, - 229,242,244,233,227,225,108,128,254, 51,247,225,246,121,128,254, - 79,105, 2,195,151,195,156,239,110,128, 34, 42,246,229,242,243, - 225,108,128, 34, 0,239,231,239,238,229,107,128, 1,115,112, 5, - 195,186,195,193,195,201,195,216,196, 11,225,242,229,110,128, 36, - 176,226,236,239,227,107,128, 37,128,240,229,242,228,239,244,232, - 229,226,242,229,119,128, 5,196,243,233,236,239,110,131, 3,197, - 195,230,195,251,196, 3,228,233,229,242,229,243,233,115,129, 3, - 203,195,243,244,239,238,239,115,128, 3,176,236,225,244,233,110, - 128, 2,138,244,239,238,239,115,128, 3,205,244,225,227,107, 2, - 196, 20,196, 31,226,229,236,239,247,227,237, 98,128, 3, 29,237, - 239,100,128, 2,212,114, 2,196, 43,196, 55,225,231,245,242,237, - 245,235,232,105,128, 10,115,233,238,103,128, 1,111,115, 3,196, - 69,196, 84,196,129,232,239,242,244,227,249,242,233,236,236,233, - 99,128, 4, 94,237,225,236,108, 2,196, 93,196,104,232,233,242, - 225,231,225,238, 97,128, 48, 69,235,225,244,225,235,225,238, 97, - 129, 48,165,196,117,232,225,236,230,247,233,228,244,104,128,255, - 105,244,242,225,233,231,232,116, 2,196,141,196,152,227,249,242, - 233,236,236,233, 99,128, 4,175,243,244,242,239,235,229,227,249, - 242,233,236,236,233, 99,128, 4,177,244,233,236,228,101,130, 1, - 105,196,181,196,189,225,227,245,244,101,128, 30,121,226,229,236, - 239,119,128, 30,117,117, 5,196,209,196,219,196,226,196,251,197, - 11,226,229,238,231,225,236,105,128, 9,138,228,229,246, 97,128, - 9, 10,231,117, 2,196,233,196,242,234,225,242,225,244,105,128, - 10,138,242,237,245,235,232,105,128, 10, 10,237,225,244,242,225, - 231,245,242,237,245,235,232,105,128, 10, 66,246,239,247,229,236, - 243,233,231,110, 3,197, 27,197, 37,197, 44,226,229,238,231,225, - 236,105,128, 9,194,228,229,246, 97,128, 9, 66,231,245,234,225, - 242,225,244,105,128, 10,194,246,239,247,229,236,243,233,231,110, - 3,197, 71,197, 81,197, 88,226,229,238,231,225,236,105,128, 9, - 193,228,229,246, 97,128, 9, 65,231,245,234,225,242,225,244,105, - 128, 10,193,118,139, 0,118,197,125,198, 17,198, 26,198, 37,198, - 222,198,229,199, 71,199, 83,199,183,199,191,199,212, 97, 4,197, - 135,197,142,197,167,197,178,228,229,246, 97,128, 9, 53,231,117, - 2,197,149,197,158,234,225,242,225,244,105,128, 10,181,242,237, - 245,235,232,105,128, 10, 53,235,225,244,225,235,225,238, 97,128, - 48,247,118,132, 5,213,197,190,197,217,197,249,198, 5,228,225, - 231,229,243,104,130,251, 53,197,203,197,208,182, 53,128,251, 53, - 232,229,226,242,229,119,128,251, 53,104, 2,197,223,197,231,229, - 226,242,229,119,128, 5,213,239,236,225,109,129,251, 75,197,240, - 232,229,226,242,229,119,128,251, 75,246,225,246,232,229,226,242, - 229,119,128, 5,240,249,239,228,232,229,226,242,229,119,128, 5, - 241,227,233,242,227,236,101,128, 36,229,228,239,244,226,229,236, - 239,119,128, 30,127,101, 6,198, 51,198, 62,198,126,198,137,198, - 143,198,210,227,249,242,233,236,236,233, 99,128, 4, 50,104, 4, - 198, 72,198, 81,198, 95,198,111,225,242,225,226,233, 99,128, 6, - 164,230,233,238,225,236,225,242,225,226,233, 99,128,251,107,233, - 238,233,244,233,225,236,225,242,225,226,233, 99,128,251,108,237, - 229,228,233,225,236,225,242,225,226,233, 99,128,251,109,235,225, - 244,225,235,225,238, 97,128, 48,249,238,245,115,128, 38, 64,242, - 244,233,227,225,108, 2,198,154,198,160,226,225,114,128, 0,124, - 236,233,238,101, 4,198,173,198,184,198,195,198,204,225,226,239, - 246,229,227,237, 98,128, 3, 13,226,229,236,239,247,227,237, 98, - 128, 3, 41,236,239,247,237,239,100,128, 2,204,237,239,100,128, - 2,200,247,225,242,237,229,238,233,225,110,128, 5,126,232,239, - 239,107,128, 2,139,105, 3,198,237,198,248,199, 31,235,225,244, - 225,235,225,238, 97,128, 48,248,242,225,237, 97, 3,199, 3,199, - 13,199, 20,226,229,238,231,225,236,105,128, 9,205,228,229,246, - 97,128, 9, 77,231,245,234,225,242,225,244,105,128, 10,205,243, - 225,242,231, 97, 3,199, 43,199, 53,199, 60,226,229,238,231,225, - 236,105,128, 9,131,228,229,246, 97,128, 9, 3,231,245,234,225, - 242,225,244,105,128, 10,131,237,239,238,239,243,240,225,227,101, - 128,255, 86,111, 3,199, 91,199,102,199,172,225,242,237,229,238, - 233,225,110,128, 5,120,233,227,229,100, 2,199,111,199,147,233, - 244,229,242,225,244,233,239,110, 2,199,125,199,136,232,233,242, - 225,231,225,238, 97,128, 48,158,235,225,244,225,235,225,238, 97, - 128, 48,254,237,225,242,235,235,225,238, 97,129, 48,155,199,160, - 232,225,236,230,247,233,228,244,104,128,255,158,235,225,244,225, - 235,225,238, 97,128, 48,250,240,225,242,229,110,128, 36,177,116, - 2,199,197,199,204,233,236,228,101,128, 30,125,245,242,238,229, - 100,128, 2,140,117, 2,199,218,199,229,232,233,242,225,231,225, - 238, 97,128, 48,148,235,225,244,225,235,225,238, 97,128, 48,244, - 119,143, 0,119,200, 18,200,251,201, 5,201, 28,201, 68,201,135, - 201,143,203,114,203,155,203,167,203,242,203,250,204, 1,204, 12, - 204, 21, 97, 8,200, 36,200, 43,200, 53,200, 64,200,102,200,134, - 200,146,200,182,227,245,244,101,128, 30,131,229,235,239,242,229, - 225,110,128, 49, 89,232,233,242,225,231,225,238, 97,128, 48,143, - 107, 2,200, 70,200, 94,225,244,225,235,225,238, 97,129, 48,239, - 200, 82,232,225,236,230,247,233,228,244,104,128,255,156,239,242, - 229,225,110,128, 49, 88,243,237,225,236,108, 2,200,112,200,123, - 232,233,242,225,231,225,238, 97,128, 48,142,235,225,244,225,235, - 225,238, 97,128, 48,238,244,244,239,243,241,245,225,242,101,128, - 51, 87,118, 2,200,152,200,160,229,228,225,243,104,128, 48, 28, - 249,245,238,228,229,242,243,227,239,242,229,246,229,242,244,233, - 227,225,108,128,254, 52,119, 3,200,190,200,199,200,213,225,242, - 225,226,233, 99,128, 6, 72,230,233,238,225,236,225,242,225,226, - 233, 99,128,254,238,232,225,237,250,225,225,226,239,246,101, 2, - 200,228,200,237,225,242,225,226,233, 99,128, 6, 36,230,233,238, - 225,236,225,242,225,226,233, 99,128,254,134,226,243,241,245,225, - 242,101,128, 51,221,227,233,242, 99, 2,201, 14,201, 19,236,101, - 128, 36,230,245,237,230,236,229,120,128, 1,117,100, 2,201, 34, - 201, 44,233,229,242,229,243,233,115,128, 30,133,239,116, 2,201, - 51,201, 60,225,227,227,229,238,116,128, 30,135,226,229,236,239, - 119,128, 30,137,101, 4,201, 78,201, 89,201,101,201,125,232,233, - 242,225,231,225,238, 97,128, 48,145,233,229,242,243,244,242,225, - 243,115,128, 33, 24,107, 2,201,107,201,117,225,244,225,235,225, - 238, 97,128, 48,241,239,242,229,225,110,128, 49, 94,239,235,239, - 242,229,225,110,128, 49, 93,231,242,225,246,101,128, 30,129,232, - 233,244,101, 8,201,164,201,173,202, 1,202, 91,202,175,202,220, - 203, 16,203, 72,226,245,236,236,229,116,128, 37,230, 99, 2,201, - 179,201,199,233,242,227,236,101,129, 37,203,201,189,233,238,246, - 229,242,243,101,128, 37,217,239,242,238,229,242,226,242,225,227, - 235,229,116, 2,201,216,201,236,236,229,230,116,129, 48, 14,201, - 225,246,229,242,244,233,227,225,108,128,254, 67,242,233,231,232, - 116,129, 48, 15,201,246,246,229,242,244,233,227,225,108,128,254, - 68,100, 2,202, 7,202, 48,233,225,237,239,238,100,129, 37,199, - 202, 18,227,239,238,244,225,233,238,233,238,231,226,236,225,227, - 235,243,237,225,236,236,228,233,225,237,239,238,100,128, 37,200, - 239,247,238,240,239,233,238,244,233,238,103, 2,202, 64,202, 80, - 243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37,191, - 244,242,233,225,238,231,236,101,128, 37,189,236,101, 2,202, 98, - 202,140,230,244,240,239,233,238,244,233,238,103, 2,202,113,202, - 129,243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37, - 195,244,242,233,225,238,231,236,101,128, 37,193,238,244,233,227, - 245,236,225,242,226,242,225,227,235,229,116, 2,202,160,202,167, - 236,229,230,116,128, 48, 22,242,233,231,232,116,128, 48, 23,242, - 233,231,232,244,240,239,233,238,244,233,238,103, 2,202,193,202, - 209,243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37, - 185,244,242,233,225,238,231,236,101,128, 37,183,115, 3,202,228, - 203, 2,203, 10,109, 2,202,234,202,246,225,236,236,243,241,245, - 225,242,101,128, 37,171,233,236,233,238,231,230,225,227,101,128, - 38, 58,241,245,225,242,101,128, 37,161,244,225,114,128, 38, 6, - 116, 2,203, 22,203, 33,229,236,229,240,232,239,238,101,128, 38, - 15,239,242,244,239,233,243,229,243,232,229,236,236,226,242,225, - 227,235,229,116, 2,203, 57,203, 64,236,229,230,116,128, 48, 24, - 242,233,231,232,116,128, 48, 25,245,240,240,239,233,238,244,233, - 238,103, 2,203, 87,203,103,243,237,225,236,236,244,242,233,225, - 238,231,236,101,128, 37,181,244,242,233,225,238,231,236,101,128, - 37,179,105, 2,203,120,203,131,232,233,242,225,231,225,238, 97, - 128, 48,144,107, 2,203,137,203,147,225,244,225,235,225,238, 97, - 128, 48,240,239,242,229,225,110,128, 49, 95,237,239,238,239,243, - 240,225,227,101,128,255, 87,111, 4,203,177,203,188,203,213,203, - 231,232,233,242,225,231,225,238, 97,128, 48,146,235,225,244,225, - 235,225,238, 97,129, 48,242,203,201,232,225,236,230,247,233,228, - 244,104,128,255,102,110,129, 32,169,203,219,237,239,238,239,243, - 240,225,227,101,128,255,230,247,225,229,238,244,232,225,105,128, - 14, 39,240,225,242,229,110,128, 36,178,242,233,238,103,128, 30, - 152,243,245,240,229,242,233,239,114,128, 2,183,244,245,242,238, - 229,100,128, 2,141,249,238,110,128, 1,191,120,137, 0,120,204, - 49,204, 60,204, 71,204, 80,204,107,204,120,204,124,204,136,204, - 144,225,226,239,246,229,227,237, 98,128, 3, 61,226,239,240,239, - 237,239,230,111,128, 49, 18,227,233,242,227,236,101,128, 36,231, - 100, 2,204, 86,204, 96,233,229,242,229,243,233,115,128, 30,141, - 239,244,225,227,227,229,238,116,128, 30,139,229,232,225,242,237, - 229,238,233,225,110,128, 5,109,105,128, 3,190,237,239,238,239, - 243,240,225,227,101,128,255, 88,240,225,242,229,110,128, 36,179, - 243,245,240,229,242,233,239,114,128, 2,227,121,143, 0,121,204, - 189,205,148,205,171,205,211,207,177,207,185,207,202,208, 10,208, - 22,209, 19,209, 59,209, 71,209, 82,209,103,210, 76, 97, 11,204, - 213,204,225,204,235,204,242,204,249,205, 3,205, 28,205, 39,205, - 77,205, 90,205,136,225,228,239,243,241,245,225,242,101,128, 51, - 78,226,229,238,231,225,236,105,128, 9,175,227,245,244,101,128, - 0,253,228,229,246, 97,128, 9, 47,229,235,239,242,229,225,110, - 128, 49, 82,231,117, 2,205, 10,205, 19,234,225,242,225,244,105, - 128, 10,175,242,237,245,235,232,105,128, 10, 47,232,233,242,225, - 231,225,238, 97,128, 48,132,107, 2,205, 45,205, 69,225,244,225, - 235,225,238, 97,129, 48,228,205, 57,232,225,236,230,247,233,228, - 244,104,128,255,148,239,242,229,225,110,128, 49, 81,237,225,235, - 235,225,238,244,232,225,105,128, 14, 78,243,237,225,236,108, 2, - 205,100,205,111,232,233,242,225,231,225,238, 97,128, 48,131,235, - 225,244,225,235,225,238, 97,129, 48,227,205,124,232,225,236,230, - 247,233,228,244,104,128,255,108,244,227,249,242,233,236,236,233, - 99,128, 4, 99,227,233,242, 99, 2,205,157,205,162,236,101,128, - 36,232,245,237,230,236,229,120,128, 1,119,100, 2,205,177,205, - 187,233,229,242,229,243,233,115,128, 0,255,239,116, 2,205,194, - 205,203,225,227,227,229,238,116,128, 30,143,226,229,236,239,119, - 128, 30,245,101, 7,205,227,206,235,206,244,207, 6,207, 38,207, - 114,207,165,104, 8,205,245,205,254,206, 32,206, 46,206,119,206, - 135,206,194,206,212,225,242,225,226,233, 99,128, 6, 74,226,225, - 242,242,229,101, 2,206, 9,206, 18,225,242,225,226,233, 99,128, - 6,210,230,233,238,225,236,225,242,225,226,233, 99,128,251,175, - 230,233,238,225,236,225,242,225,226,233, 99,128,254,242,232,225, - 237,250,225,225,226,239,246,101, 4,206, 65,206, 74,206, 88,206, - 104,225,242,225,226,233, 99,128, 6, 38,230,233,238,225,236,225, - 242,225,226,233, 99,128,254,138,233,238,233,244,233,225,236,225, - 242,225,226,233, 99,128,254,139,237,229,228,233,225,236,225,242, - 225,226,233, 99,128,254,140,233,238,233,244,233,225,236,225,242, - 225,226,233, 99,128,254,243,237,101, 2,206,142,206,155,228,233, - 225,236,225,242,225,226,233, 99,128,254,244,229,237,105, 2,206, - 163,206,178,238,233,244,233,225,236,225,242,225,226,233, 99,128, - 252,221,243,239,236,225,244,229,228,225,242,225,226,233, 99,128, - 252, 88,238,239,239,238,230,233,238,225,236,225,242,225,226,233, - 99,128,252,148,244,232,242,229,229,228,239,244,243,226,229,236, - 239,247,225,242,225,226,233, 99,128, 6,209,235,239,242,229,225, - 110,128, 49, 86,110,129, 0,165,206,250,237,239,238,239,243,240, - 225,227,101,128,255,229,111, 2,207, 12,207, 21,235,239,242,229, - 225,110,128, 49, 85,242,233,238,232,233,229,245,232,235,239,242, - 229,225,110,128, 49,134,114, 3,207, 46,207, 82,207, 94,225,232, - 226,229,238,249,239,237,111, 2,207, 60,207, 69,232,229,226,242, - 229,119,128, 5,170,236,229,230,244,232,229,226,242,229,119,128, - 5,170,233,227,249,242,233,236,236,233, 99,128, 4, 75,245,228, - 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, - 4,249,243,233,229,245,238,103, 3,207,127,207,136,207,152,235, - 239,242,229,225,110,128, 49,129,240,225,238,243,233,239,243,235, - 239,242,229,225,110,128, 49,131,243,233,239,243,235,239,242,229, - 225,110,128, 49,130,244,233,246,232,229,226,242,229,119,128, 5, - 154,231,242,225,246,101,128, 30,243,232,239,239,107,129, 1,180, - 207,194,225,226,239,246,101,128, 30,247,105, 5,207,214,207,225, - 207,236,207,245,207,253,225,242,237,229,238,233,225,110,128, 5, - 117,227,249,242,233,236,236,233, 99,128, 4, 87,235,239,242,229, - 225,110,128, 49, 98,238,249,225,238,103,128, 38, 47,247,238,225, - 242,237,229,238,233,225,110,128, 5,130,237,239,238,239,243,240, - 225,227,101,128,255, 89,111, 7,208, 38,208,108,208,119,208,129, - 208,167,208,213,208,222,100,131, 5,217,208, 48,208, 68,208, 77, - 228,225,231,229,243,104,129,251, 57,208, 59,232,229,226,242,229, - 119,128,251, 57,232,229,226,242,229,119,128, 5,217,249,239,100, - 2,208, 85,208, 94,232,229,226,242,229,119,128, 5,242,240,225, - 244,225,232,232,229,226,242,229,119,128,251, 31,232,233,242,225, - 231,225,238, 97,128, 48,136,233,235,239,242,229,225,110,128, 49, - 137,107, 2,208,135,208,159,225,244,225,235,225,238, 97,129, 48, - 232,208,147,232,225,236,230,247,233,228,244,104,128,255,150,239, - 242,229,225,110,128, 49, 91,243,237,225,236,108, 2,208,177,208, - 188,232,233,242,225,231,225,238, 97,128, 48,135,235,225,244,225, - 235,225,238, 97,129, 48,231,208,201,232,225,236,230,247,233,228, - 244,104,128,255,110,244,231,242,229,229,107,128, 3,243,121, 2, - 208,228,209, 9, 97, 2,208,234,208,244,229,235,239,242,229,225, - 110,128, 49,136,107, 2,208,250,209, 2,239,242,229,225,110,128, - 49,135,244,232,225,105,128, 14, 34,233,238,231,244,232,225,105, - 128, 14, 13,112, 2,209, 25,209, 32,225,242,229,110,128, 36,180, - 239,231,229,231,242,225,237,237,229,238,105,129, 3,122,209, 48, - 231,242,229,229,235,227,237, 98,128, 3, 69,114,129, 1,166,209, - 65,233,238,103,128, 30,153,243,245,240,229,242,233,239,114,128, - 2,184,116, 2,209, 88,209, 95,233,236,228,101,128, 30,249,245, - 242,238,229,100,128, 2,142,117, 5,209,115,209,126,209,136,209, - 174,210, 50,232,233,242,225,231,225,238, 97,128, 48,134,233,235, - 239,242,229,225,110,128, 49,140,107, 2,209,142,209,166,225,244, - 225,235,225,238, 97,129, 48,230,209,154,232,225,236,230,247,233, - 228,244,104,128,255,149,239,242,229,225,110,128, 49, 96,115, 3, - 209,182,209,220,210, 5,226,233,103, 2,209,190,209,201,227,249, - 242,233,236,236,233, 99,128, 4,107,233,239,244,233,230,233,229, - 228,227,249,242,233,236,236,233, 99,128, 4,109,236,233,244,244, - 236,101, 2,209,231,209,242,227,249,242,233,236,236,233, 99,128, - 4,103,233,239,244,233,230,233,229,228,227,249,242,233,236,236, - 233, 99,128, 4,105,237,225,236,108, 2,210, 14,210, 25,232,233, - 242,225,231,225,238, 97,128, 48,133,235,225,244,225,235,225,238, - 97,129, 48,229,210, 38,232,225,236,230,247,233,228,244,104,128, - 255,109,249,101, 2,210, 57,210, 66,235,239,242,229,225,110,128, - 49,139,239,235,239,242,229,225,110,128, 49,138,249, 97, 2,210, - 83,210, 93,226,229,238,231,225,236,105,128, 9,223,228,229,246, - 97,128, 9, 95,122,142, 0,122,210,132,211,140,211,151,211,194, - 211,221,213, 0,213,108,213,150,213,162,213,174,213,202,213,210, - 213,226,213,235, 97, 10,210,154,210,165,210,172,210,179,210,190, - 211, 12,211, 42,211, 53,211, 89,211,101,225,242,237,229,238,233, - 225,110,128, 5,102,227,245,244,101,128, 1,122,228,229,246, 97, - 128, 9, 91,231,245,242,237,245,235,232,105,128, 10, 91,104, 4, - 210,200,210,209,210,223,210,253,225,242,225,226,233, 99,128, 6, - 56,230,233,238,225,236,225,242,225,226,233, 99,128,254,198,105, - 2,210,229,210,244,238,233,244,233,225,236,225,242,225,226,233, - 99,128,254,199,242,225,231,225,238, 97,128, 48, 86,237,229,228, - 233,225,236,225,242,225,226,233, 99,128,254,200,233,110, 2,211, - 19,211, 28,225,242,225,226,233, 99,128, 6, 50,230,233,238,225, - 236,225,242,225,226,233, 99,128,254,176,235,225,244,225,235,225, - 238, 97,128, 48,182,241,229,102, 2,211, 61,211, 75,231,225,228, - 239,236,232,229,226,242,229,119,128, 5,149,241,225,244,225,238, - 232,229,226,242,229,119,128, 5,148,242,241,225,232,229,226,242, - 229,119,128, 5,152,249,233,110,130, 5,214,211,111,211,131,228, - 225,231,229,243,104,129,251, 54,211,122,232,229,226,242,229,119, - 128,251, 54,232,229,226,242,229,119,128, 5,214,226,239,240,239, - 237,239,230,111,128, 49, 23, 99, 3,211,159,211,166,211,188,225, - 242,239,110,128, 1,126,233,242, 99, 2,211,174,211,179,236,101, - 128, 36,233,245,237,230,236,229,120,128, 30,145,245,242,108,128, - 2,145,228,239,116,130, 1,124,211,204,211,213,225,227,227,229, - 238,116,128, 1,124,226,229,236,239,119,128, 30,147,101, 6,211, - 235,211,246,212, 33,212, 44,212, 55,212,251,227,249,242,233,236, - 236,233, 99,128, 4, 55,100, 2,211,252,212, 15,229,243,227,229, - 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,153,233, - 229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, 4, - 223,232,233,242,225,231,225,238, 97,128, 48, 92,235,225,244,225, - 235,225,238, 97,128, 48,188,242,111,140, 0, 48,212, 84,212, 93, - 212,103,212,110,212,135,212,148,212,159,212,171,212,182,212,192, - 212,203,212,210,225,242,225,226,233, 99,128, 6, 96,226,229,238, - 231,225,236,105,128, 9,230,228,229,246, 97,128, 9,102,231,117, - 2,212,117,212,126,234,225,242,225,244,105,128, 10,230,242,237, - 245,235,232,105,128, 10,102,232,225,227,235,225,242,225,226,233, - 99,128, 6, 96,233,238,230,229,242,233,239,114,128, 32,128,237, - 239,238,239,243,240,225,227,101,128,255, 16,239,236,228,243,244, - 249,236,101,128,247, 48,240,229,242,243,233,225,110,128, 6,240, - 243,245,240,229,242,233,239,114,128, 32,112,244,232,225,105,128, - 14, 80,247,233,228,244,104, 3,212,222,212,231,212,243,234,239, - 233,238,229,114,128,254,255,238,239,238,234,239,233,238,229,114, - 128, 32, 12,243,240,225,227,101,128, 32, 11,244, 97,128, 3,182, - 104, 2,213, 6,213, 17,226,239,240,239,237,239,230,111,128, 49, - 19,101, 4,213, 27,213, 38,213, 54,213, 65,225,242,237,229,238, - 233,225,110,128, 5,106,226,242,229,246,229,227,249,242,233,236, - 236,233, 99,128, 4,194,227,249,242,233,236,236,233, 99,128, 4, - 54,100, 2,213, 71,213, 90,229,243,227,229,238,228,229,242,227, - 249,242,233,236,236,233, 99,128, 4,151,233,229,242,229,243,233, - 243,227,249,242,233,236,236,233, 99,128, 4,221,105, 3,213,116, - 213,127,213,138,232,233,242,225,231,225,238, 97,128, 48, 88,235, - 225,244,225,235,225,238, 97,128, 48,184,238,239,242,232,229,226, - 242,229,119,128, 5,174,236,233,238,229,226,229,236,239,119,128, - 30,149,237,239,238,239,243,240,225,227,101,128,255, 90,111, 2, - 213,180,213,191,232,233,242,225,231,225,238, 97,128, 48, 94,235, - 225,244,225,235,225,238, 97,128, 48,190,240,225,242,229,110,128, - 36,181,242,229,244,242,239,230,236,229,248,232,239,239,107,128, - 2,144,243,244,242,239,235,101,128, 1,182,117, 2,213,241,213, - 252,232,233,242,225,231,225,238, 97,128, 48, 90,235,225,244,225, - 235,225,238, 97,128, 48,186 - }; - - - /* - * This function searches the compressed table efficiently. - */ - static unsigned long - ft_get_adobe_glyph_index( const char* name, - const char* limit ) - { - int c = 0; - int count, min, max; - const unsigned char* p = ft_adobe_glyph_list; - - - if ( name == 0 || name >= limit ) - goto NotFound; - - c = *name++; - count = p[1]; - p += 2; - - min = 0; - max = count; - - while ( min < max ) - { - int mid = ( min + max ) >> 1; - const unsigned char* q = p + mid * 2; - int c2; - - - q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] ); - - c2 = q[0] & 127; - if ( c2 == c ) - { - p = q; - goto Found; - } - if ( c2 < c ) - min = mid + 1; - else - max = mid; - } - goto NotFound; - - Found: - for (;;) - { - /* assert (*p & 127) == c */ - - if ( name >= limit ) - { - if ( (p[0] & 128) == 0 && - (p[1] & 128) != 0 ) - return (unsigned long)( ( (int)p[2] << 8 ) | p[3] ); - - goto NotFound; - } - c = *name++; - if ( p[0] & 128 ) - { - p++; - if ( c != (p[0] & 127) ) - goto NotFound; - - continue; - } - - p++; - count = p[0] & 127; - if ( p[0] & 128 ) - p += 2; - - p++; - - for ( ; count > 0; count--, p += 2 ) - { - int offset = ( (int)p[0] << 8 ) | p[1]; - const unsigned char* q = ft_adobe_glyph_list + offset; - - if ( c == ( q[0] & 127 ) ) - { - p = q; - goto NextIter; - } - } - goto NotFound; - - NextIter: - ; - } - - NotFound: - return 0; - } - -#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/ftmisc.h b/android/jni/ndk_modules/freetype/src/raster/ftmisc.h deleted file mode 100644 index 7773924f..00000000 --- a/android/jni/ndk_modules/freetype/src/raster/ftmisc.h +++ /dev/null @@ -1,121 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmisc.h */ -/* */ -/* Miscellaneous macros for stand-alone rasterizer (specification */ -/* only). */ -/* */ -/* Copyright 2005, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /***************************************************/ - /* */ - /* This file is *not* portable! You have to adapt */ - /* its definitions to your platform. */ - /* */ - /***************************************************/ - -#ifndef __FTMISC_H__ -#define __FTMISC_H__ - - - /* memset */ -#include FT_CONFIG_STANDARD_LIBRARY_H - -#define FT_BEGIN_HEADER -#define FT_END_HEADER - -#define FT_LOCAL_DEF( x ) static x - - - /* from include/freetype2/fttypes.h */ - - typedef unsigned char FT_Byte; - typedef signed int FT_Int; - typedef unsigned int FT_UInt; - typedef signed long FT_Long; - typedef unsigned long FT_ULong; - typedef signed long FT_F26Dot6; - typedef int FT_Error; - -#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ - ( ( (FT_ULong)_x1 << 24 ) | \ - ( (FT_ULong)_x2 << 16 ) | \ - ( (FT_ULong)_x3 << 8 ) | \ - (FT_ULong)_x4 ) - - - /* from include/freetype2/ftsystem.h */ - - typedef struct FT_MemoryRec_* FT_Memory; - - typedef void* (*FT_Alloc_Func)( FT_Memory memory, - long size ); - - typedef void (*FT_Free_Func)( FT_Memory memory, - void* block ); - - typedef void* (*FT_Realloc_Func)( FT_Memory memory, - long cur_size, - long new_size, - void* block ); - - typedef struct FT_MemoryRec_ - { - void* user; - - FT_Alloc_Func alloc; - FT_Free_Func free; - FT_Realloc_Func realloc; - - } FT_MemoryRec; - - - /* from src/ftcalc.c */ - -#if ( defined _WIN32 || defined _WIN64 ) - - typedef __int64 FT_Int64; - -#else - -#include "inttypes.h" - - typedef int64_t FT_Int64; - -#endif - - - static FT_Long - FT_MulDiv( FT_Long a, - FT_Long b, - FT_Long c ) - { - FT_Int s; - FT_Long d; - - - s = 1; - if ( a < 0 ) { a = -a; s = -1; } - if ( b < 0 ) { b = -b; s = -s; } - if ( c < 0 ) { c = -c; s = -s; } - - d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c - : 0x7FFFFFFFL ); - - return ( s > 0 ) ? d : -d; - } - -#endif /* __FTMISC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/ftraster.c b/android/jni/ndk_modules/freetype/src/raster/ftraster.c deleted file mode 100644 index ce6fdfe5..00000000 --- a/android/jni/ndk_modules/freetype/src/raster/ftraster.c +++ /dev/null @@ -1,3565 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftraster.c */ -/* */ -/* The FreeType glyph rasterizer (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2005, 2007, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* This file can be compiled without the rest of the FreeType engine, by */ - /* defining the _STANDALONE_ macro when compiling it. You also need to */ - /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir) */ - /* directory. Typically, you should do something like */ - /* */ - /* - copy `src/raster/ftraster.c' (this file) to your current directory */ - /* */ - /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h' */ - /* to your current directory */ - /* */ - /* - compile `ftraster' with the _STANDALONE_ macro defined, as in */ - /* */ - /* cc -c -D_STANDALONE_ ftraster.c */ - /* */ - /* The renderer can be initialized with a call to */ - /* `ft_standard_raster.raster_new'; a bitmap can be generated */ - /* with a call to `ft_standard_raster.raster_render'. */ - /* */ - /* See the comments and documentation in the file `ftimage.h' for more */ - /* details on how the raster works. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This is a rewrite of the FreeType 1.x scan-line converter */ - /* */ - /*************************************************************************/ - -#ifdef _STANDALONE_ - -#define FT_CONFIG_STANDARD_LIBRARY_H <stdlib.h> - -#include <string.h> /* for memset */ - -#include "ftmisc.h" -#include "ftimage.h" - -#else /* !_STANDALONE_ */ - -#include <ft2build.h> -#include "ftraster.h" -#include FT_INTERNAL_CALC_H /* for FT_MulDiv only */ - -#include "rastpic.h" - -#endif /* !_STANDALONE_ */ - - - /*************************************************************************/ - /* */ - /* A simple technical note on how the raster works */ - /* ----------------------------------------------- */ - /* */ - /* Converting an outline into a bitmap is achieved in several steps: */ - /* */ - /* 1 - Decomposing the outline into successive `profiles'. Each */ - /* profile is simply an array of scanline intersections on a given */ - /* dimension. A profile's main attributes are */ - /* */ - /* o its scanline position boundaries, i.e. `Ymin' and `Ymax' */ - /* */ - /* o an array of intersection coordinates for each scanline */ - /* between `Ymin' and `Ymax' */ - /* */ - /* o a direction, indicating whether it was built going `up' or */ - /* `down', as this is very important for filling rules */ - /* */ - /* o its drop-out mode */ - /* */ - /* 2 - Sweeping the target map's scanlines in order to compute segment */ - /* `spans' which are then filled. Additionally, this pass */ - /* performs drop-out control. */ - /* */ - /* The outline data is parsed during step 1 only. The profiles are */ - /* built from the bottom of the render pool, used as a stack. The */ - /* following graphics shows the profile list under construction: */ - /* */ - /* __________________________________________________________ _ _ */ - /* | | | | | */ - /* | profile | coordinates for | profile | coordinates for |--> */ - /* | 1 | profile 1 | 2 | profile 2 |--> */ - /* |_________|_________________|_________|_________________|__ _ _ */ - /* */ - /* ^ ^ */ - /* | | */ - /* start of render pool top */ - /* */ - /* The top of the profile stack is kept in the `top' variable. */ - /* */ - /* As you can see, a profile record is pushed on top of the render */ - /* pool, which is then followed by its coordinates/intersections. If */ - /* a change of direction is detected in the outline, a new profile is */ - /* generated until the end of the outline. */ - /* */ - /* Note that when all profiles have been generated, the function */ - /* Finalize_Profile_Table() is used to record, for each profile, its */ - /* bottom-most scanline as well as the scanline above its upmost */ - /* boundary. These positions are called `y-turns' because they (sort */ - /* of) correspond to local extrema. They are stored in a sorted list */ - /* built from the top of the render pool as a downwards stack: */ - /* */ - /* _ _ _______________________________________ */ - /* | | */ - /* <--| sorted list of | */ - /* <--| extrema scanlines | */ - /* _ _ __________________|____________________| */ - /* */ - /* ^ ^ */ - /* | | */ - /* maxBuff sizeBuff = end of pool */ - /* */ - /* This list is later used during the sweep phase in order to */ - /* optimize performance (see technical note on the sweep below). */ - /* */ - /* Of course, the raster detects whether the two stacks collide and */ - /* handles the situation properly. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /** **/ - /** CONFIGURATION MACROS **/ - /** **/ - /*************************************************************************/ - /*************************************************************************/ - - /* define DEBUG_RASTER if you want to compile a debugging version */ -/* #define DEBUG_RASTER */ - - /* define FT_RASTER_OPTION_ANTI_ALIASING if you want to support */ - /* 5-levels anti-aliasing */ -/* #define FT_RASTER_OPTION_ANTI_ALIASING */ - - /* The size of the two-lines intermediate bitmap used */ - /* for anti-aliasing, in bytes. */ -#define RASTER_GRAY_LINES 2048 - - - /*************************************************************************/ - /*************************************************************************/ - /** **/ - /** OTHER MACROS (do not change) **/ - /** **/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_raster - - -#ifdef _STANDALONE_ - - - /* This macro is used to indicate that a function parameter is unused. */ - /* Its purpose is simply to reduce compiler warnings. Note also that */ - /* simply defining it as `(void)x' doesn't avoid warnings with certain */ - /* ANSI compilers (e.g. LCC). */ -#define FT_UNUSED( x ) (x) = (x) - - /* Disable the tracing mechanism for simplicity -- developers can */ - /* activate it easily by redefining these two macros. */ -#ifndef FT_ERROR -#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ -#endif - -#ifndef FT_TRACE -#define FT_TRACE( x ) do { } while ( 0 ) /* nothing */ -#define FT_TRACE1( x ) do { } while ( 0 ) /* nothing */ -#define FT_TRACE6( x ) do { } while ( 0 ) /* nothing */ -#endif - -#define Raster_Err_None 0 -#define Raster_Err_Not_Ini -1 -#define Raster_Err_Overflow -2 -#define Raster_Err_Neg_Height -3 -#define Raster_Err_Invalid -4 -#define Raster_Err_Unsupported -5 - -#define ft_memset memset - -#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \ - raster_reset_, raster_set_mode_, \ - raster_render_, raster_done_ ) \ - const FT_Raster_Funcs class_ = \ - { \ - glyph_format_, \ - raster_new_, \ - raster_reset_, \ - raster_set_mode_, \ - raster_render_, \ - raster_done_ \ - }; - -#else /* !_STANDALONE_ */ - - -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H /* for FT_TRACE() and FT_ERROR() */ - -#include "rasterrs.h" - -#define Raster_Err_None Raster_Err_Ok -#define Raster_Err_Not_Ini Raster_Err_Raster_Uninitialized -#define Raster_Err_Overflow Raster_Err_Raster_Overflow -#define Raster_Err_Neg_Height Raster_Err_Raster_Negative_Height -#define Raster_Err_Invalid Raster_Err_Invalid_Outline -#define Raster_Err_Unsupported Raster_Err_Cannot_Render_Glyph - - -#endif /* !_STANDALONE_ */ - - -#ifndef FT_MEM_SET -#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) -#endif - -#ifndef FT_MEM_ZERO -#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) -#endif - - /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is */ - /* typically a small value and the result of a*b is known to fit into */ - /* 32 bits. */ -#define FMulDiv( a, b, c ) ( (a) * (b) / (c) ) - - /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */ - /* for clipping computations. It simply uses the FT_MulDiv() function */ - /* defined in `ftcalc.h'. */ -#define SMulDiv FT_MulDiv - - /* The rasterizer is a very general purpose component; please leave */ - /* the following redefinitions there (you never know your target */ - /* environment). */ - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef NULL -#define NULL (void*)0 -#endif - -#ifndef SUCCESS -#define SUCCESS 0 -#endif - -#ifndef FAILURE -#define FAILURE 1 -#endif - - -#define MaxBezier 32 /* The maximum number of stacked Bezier curves. */ - /* Setting this constant to more than 32 is a */ - /* pure waste of space. */ - -#define Pixel_Bits 6 /* fractional bits of *input* coordinates */ - - - /*************************************************************************/ - /*************************************************************************/ - /** **/ - /** SIMPLE TYPE DECLARATIONS **/ - /** **/ - /*************************************************************************/ - /*************************************************************************/ - - typedef int Int; - typedef unsigned int UInt; - typedef short Short; - typedef unsigned short UShort, *PUShort; - typedef long Long, *PLong; - typedef unsigned long ULong; - - typedef unsigned char Byte, *PByte; - typedef char Bool; - - - typedef union Alignment_ - { - long l; - void* p; - void (*f)(void); - - } Alignment, *PAlignment; - - - typedef struct TPoint_ - { - Long x; - Long y; - - } TPoint; - - - /* values for the `flags' bit field */ -#define Flow_Up 0x8 -#define Overshoot_Top 0x10 -#define Overshoot_Bottom 0x20 - - - /* States of each line, arc, and profile */ - typedef enum TStates_ - { - Unknown_State, - Ascending_State, - Descending_State, - Flat_State - - } TStates; - - - typedef struct TProfile_ TProfile; - typedef TProfile* PProfile; - - struct TProfile_ - { - FT_F26Dot6 X; /* current coordinate during sweep */ - PProfile link; /* link to next profile (various purposes) */ - PLong offset; /* start of profile's data in render pool */ - unsigned flags; /* Bit 0-2: drop-out mode */ - /* Bit 3: profile orientation (up/down) */ - /* Bit 4: is top profile? */ - /* Bit 5: is bottom profile? */ - long height; /* profile's height in scanlines */ - long start; /* profile's starting scanline */ - - unsigned countL; /* number of lines to step before this */ - /* profile becomes drawable */ - - PProfile next; /* next profile in same contour, used */ - /* during drop-out control */ - }; - - typedef PProfile TProfileList; - typedef PProfile* PProfileList; - - - /* Simple record used to implement a stack of bands, required */ - /* by the sub-banding mechanism */ - typedef struct TBand_ - { - Short y_min; /* band's minimum */ - Short y_max; /* band's maximum */ - - } TBand; - - -#define AlignProfileSize \ - ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( long ) ) - - -#ifdef FT_STATIC_RASTER - - -#define RAS_ARGS /* void */ -#define RAS_ARG /* void */ - -#define RAS_VARS /* void */ -#define RAS_VAR /* void */ - -#define FT_UNUSED_RASTER do { } while ( 0 ) - - -#else /* !FT_STATIC_RASTER */ - - -#define RAS_ARGS PWorker worker, -#define RAS_ARG PWorker worker - -#define RAS_VARS worker, -#define RAS_VAR worker - -#define FT_UNUSED_RASTER FT_UNUSED( worker ) - - -#endif /* !FT_STATIC_RASTER */ - - - typedef struct TWorker_ TWorker, *PWorker; - - - /* prototypes used for sweep function dispatch */ - typedef void - Function_Sweep_Init( RAS_ARGS Short* min, - Short* max ); - - typedef void - Function_Sweep_Span( RAS_ARGS Short y, - FT_F26Dot6 x1, - FT_F26Dot6 x2, - PProfile left, - PProfile right ); - - typedef void - Function_Sweep_Step( RAS_ARG ); - - - /* NOTE: These operations are only valid on 2's complement processors */ - -#define FLOOR( x ) ( (x) & -ras.precision ) -#define CEILING( x ) ( ( (x) + ras.precision - 1 ) & -ras.precision ) -#define TRUNC( x ) ( (signed long)(x) >> ras.precision_bits ) -#define FRAC( x ) ( (x) & ( ras.precision - 1 ) ) -#define SCALED( x ) ( ( (x) << ras.scale_shift ) - ras.precision_half ) - -#define IS_BOTTOM_OVERSHOOT( x ) ( CEILING( x ) - x >= ras.precision_half ) -#define IS_TOP_OVERSHOOT( x ) ( x - FLOOR( x ) >= ras.precision_half ) - - /* The most used variables are positioned at the top of the structure. */ - /* Thus, their offset can be coded with less opcodes, resulting in a */ - /* smaller executable. */ - - struct TWorker_ - { - Int precision_bits; /* precision related variables */ - Int precision; - Int precision_half; - Long precision_mask; - Int precision_shift; - Int precision_step; - Int precision_jitter; - - Int scale_shift; /* == precision_shift for bitmaps */ - /* == precision_shift+1 for pixmaps */ - - PLong buff; /* The profiles buffer */ - PLong sizeBuff; /* Render pool size */ - PLong maxBuff; /* Profiles buffer size */ - PLong top; /* Current cursor in buffer */ - - FT_Error error; - - Int numTurns; /* number of Y-turns in outline */ - - TPoint* arc; /* current Bezier arc pointer */ - - UShort bWidth; /* target bitmap width */ - PByte bTarget; /* target bitmap buffer */ - PByte gTarget; /* target pixmap buffer */ - - Long lastX, lastY; - Long minY, maxY; - - UShort num_Profs; /* current number of profiles */ - - Bool fresh; /* signals a fresh new profile which */ - /* `start' field must be completed */ - Bool joint; /* signals that the last arc ended */ - /* exactly on a scanline. Allows */ - /* removal of doublets */ - PProfile cProfile; /* current profile */ - PProfile fProfile; /* head of linked list of profiles */ - PProfile gProfile; /* contour's first profile in case */ - /* of impact */ - - TStates state; /* rendering state */ - - FT_Bitmap target; /* description of target bit/pixmap */ - FT_Outline outline; - - Long traceOfs; /* current offset in target bitmap */ - Long traceG; /* current offset in target pixmap */ - - Short traceIncr; /* sweep's increment in target bitmap */ - - Short gray_min_x; /* current min x during gray rendering */ - Short gray_max_x; /* current max x during gray rendering */ - - /* dispatch variables */ - - Function_Sweep_Init* Proc_Sweep_Init; - Function_Sweep_Span* Proc_Sweep_Span; - Function_Sweep_Span* Proc_Sweep_Drop; - Function_Sweep_Step* Proc_Sweep_Step; - - Byte dropOutControl; /* current drop_out control method */ - - Bool second_pass; /* indicates whether a horizontal pass */ - /* should be performed to control */ - /* drop-out accurately when calling */ - /* Render_Glyph. Note that there is */ - /* no horizontal pass during gray */ - /* rendering. */ - - TPoint arcs[3 * MaxBezier + 1]; /* The Bezier stack */ - - TBand band_stack[16]; /* band stack used for sub-banding */ - Int band_top; /* band stack top */ - -#ifdef FT_RASTER_OPTION_ANTI_ALIASING - - Byte* grays; - - Byte gray_lines[RASTER_GRAY_LINES]; - /* Intermediate table used to render the */ - /* graylevels pixmaps. */ - /* gray_lines is a buffer holding two */ - /* monochrome scanlines */ - - Short gray_width; /* width in bytes of one monochrome */ - /* intermediate scanline of gray_lines. */ - /* Each gray pixel takes 2 bits long there */ - - /* The gray_lines must hold 2 lines, thus with size */ - /* in bytes of at least `gray_width*2'. */ - -#endif /* FT_RASTER_ANTI_ALIASING */ - - }; - - - typedef struct TRaster_ - { - char* buffer; - long buffer_size; - void* memory; - PWorker worker; - Byte grays[5]; - Short gray_width; - - } TRaster, *PRaster; - -#ifdef FT_STATIC_RASTER - - static TWorker cur_ras; -#define ras cur_ras - -#else /* !FT_STATIC_RASTER */ - -#define ras (*worker) - -#endif /* !FT_STATIC_RASTER */ - - -#ifdef FT_RASTER_OPTION_ANTI_ALIASING - - /* A lookup table used to quickly count set bits in four gray 2x2 */ - /* cells. The values of the table have been produced with the */ - /* following code: */ - /* */ - /* for ( i = 0; i < 256; i++ ) */ - /* { */ - /* l = 0; */ - /* j = i; */ - /* */ - /* for ( c = 0; c < 4; c++ ) */ - /* { */ - /* l <<= 4; */ - /* */ - /* if ( j & 0x80 ) l++; */ - /* if ( j & 0x40 ) l++; */ - /* */ - /* j = ( j << 2 ) & 0xFF; */ - /* } */ - /* printf( "0x%04X", l ); */ - /* } */ - /* */ - - static const short count_table[256] = - { - 0x0000, 0x0001, 0x0001, 0x0002, 0x0010, 0x0011, 0x0011, 0x0012, - 0x0010, 0x0011, 0x0011, 0x0012, 0x0020, 0x0021, 0x0021, 0x0022, - 0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112, - 0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122, - 0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112, - 0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122, - 0x0200, 0x0201, 0x0201, 0x0202, 0x0210, 0x0211, 0x0211, 0x0212, - 0x0210, 0x0211, 0x0211, 0x0212, 0x0220, 0x0221, 0x0221, 0x0222, - 0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012, - 0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022, - 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112, - 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122, - 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112, - 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122, - 0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212, - 0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222, - 0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012, - 0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022, - 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112, - 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122, - 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112, - 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122, - 0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212, - 0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222, - 0x2000, 0x2001, 0x2001, 0x2002, 0x2010, 0x2011, 0x2011, 0x2012, - 0x2010, 0x2011, 0x2011, 0x2012, 0x2020, 0x2021, 0x2021, 0x2022, - 0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112, - 0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122, - 0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112, - 0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122, - 0x2200, 0x2201, 0x2201, 0x2202, 0x2210, 0x2211, 0x2211, 0x2212, - 0x2210, 0x2211, 0x2211, 0x2212, 0x2220, 0x2221, 0x2221, 0x2222 - }; - -#endif /* FT_RASTER_OPTION_ANTI_ALIASING */ - - - - /*************************************************************************/ - /*************************************************************************/ - /** **/ - /** PROFILES COMPUTATION **/ - /** **/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Set_High_Precision */ - /* */ - /* <Description> */ - /* Set precision variables according to param flag. */ - /* */ - /* <Input> */ - /* High :: Set to True for high precision (typically for ppem < 18), */ - /* false otherwise. */ - /* */ - static void - Set_High_Precision( RAS_ARGS Int High ) - { - if ( High ) - { - ras.precision_bits = 12; - ras.precision_step = 256; - ras.precision_jitter = 50; - } - else - { - ras.precision_bits = 6; - ras.precision_step = 32; - ras.precision_jitter = 2; - } - - FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" )); - - ras.precision = 1 << ras.precision_bits; - ras.precision_half = ras.precision / 2; - ras.precision_shift = ras.precision_bits - Pixel_Bits; - ras.precision_mask = -ras.precision; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* New_Profile */ - /* */ - /* <Description> */ - /* Create a new profile in the render pool. */ - /* */ - /* <Input> */ - /* aState :: The state/orientation of the new profile. */ - /* */ - /* overshoot :: Whether the profile's unrounded start position */ - /* differs by at least a half pixel. */ - /* */ - /* <Return> */ - /* SUCCESS on success. FAILURE in case of overflow or of incoherent */ - /* profile. */ - /* */ - static Bool - New_Profile( RAS_ARGS TStates aState, - Bool overshoot ) - { - if ( !ras.fProfile ) - { - ras.cProfile = (PProfile)ras.top; - ras.fProfile = ras.cProfile; - ras.top += AlignProfileSize; - } - - if ( ras.top >= ras.maxBuff ) - { - ras.error = Raster_Err_Overflow; - return FAILURE; - } - - ras.cProfile->flags = 0; - ras.cProfile->start = 0; - ras.cProfile->height = 0; - ras.cProfile->offset = ras.top; - ras.cProfile->link = (PProfile)0; - ras.cProfile->next = (PProfile)0; - ras.cProfile->flags = ras.dropOutControl; - - switch ( aState ) - { - case Ascending_State: - ras.cProfile->flags |= Flow_Up; - if ( overshoot ) - ras.cProfile->flags |= Overshoot_Bottom; - - FT_TRACE6(( "New ascending profile = %lx\n", (long)ras.cProfile )); - break; - - case Descending_State: - if ( overshoot ) - ras.cProfile->flags |= Overshoot_Top; - FT_TRACE6(( "New descending profile = %lx\n", (long)ras.cProfile )); - break; - - default: - FT_ERROR(( "New_Profile: invalid profile direction\n" )); - ras.error = Raster_Err_Invalid; - return FAILURE; - } - - if ( !ras.gProfile ) - ras.gProfile = ras.cProfile; - - ras.state = aState; - ras.fresh = TRUE; - ras.joint = FALSE; - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* End_Profile */ - /* */ - /* <Description> */ - /* Finalize the current profile. */ - /* */ - /* <Input> */ - /* overshoot :: Whether the profile's unrounded end position differs */ - /* by at least a half pixel. */ - /* */ - /* <Return> */ - /* SUCCESS on success. FAILURE in case of overflow or incoherency. */ - /* */ - static Bool - End_Profile( RAS_ARGS Bool overshoot ) - { - Long h; - PProfile oldProfile; - - - h = (Long)( ras.top - ras.cProfile->offset ); - - if ( h < 0 ) - { - FT_ERROR(( "End_Profile: negative height encountered\n" )); - ras.error = Raster_Err_Neg_Height; - return FAILURE; - } - - if ( h > 0 ) - { - FT_TRACE6(( "Ending profile %lx, start = %ld, height = %ld\n", - (long)ras.cProfile, ras.cProfile->start, h )); - - ras.cProfile->height = h; - if ( overshoot ) - { - if ( ras.cProfile->flags & Flow_Up ) - ras.cProfile->flags |= Overshoot_Top; - else - ras.cProfile->flags |= Overshoot_Bottom; - } - - oldProfile = ras.cProfile; - ras.cProfile = (PProfile)ras.top; - - ras.top += AlignProfileSize; - - ras.cProfile->height = 0; - ras.cProfile->offset = ras.top; - - oldProfile->next = ras.cProfile; - ras.num_Profs++; - } - - if ( ras.top >= ras.maxBuff ) - { - FT_TRACE1(( "overflow in End_Profile\n" )); - ras.error = Raster_Err_Overflow; - return FAILURE; - } - - ras.joint = FALSE; - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Insert_Y_Turn */ - /* */ - /* <Description> */ - /* Insert a salient into the sorted list placed on top of the render */ - /* pool. */ - /* */ - /* <Input> */ - /* New y scanline position. */ - /* */ - /* <Return> */ - /* SUCCESS on success. FAILURE in case of overflow. */ - /* */ - static Bool - Insert_Y_Turn( RAS_ARGS Int y ) - { - PLong y_turns; - Int y2, n; - - - n = ras.numTurns - 1; - y_turns = ras.sizeBuff - ras.numTurns; - - /* look for first y value that is <= */ - while ( n >= 0 && y < y_turns[n] ) - n--; - - /* if it is <, simply insert it, ignore if == */ - if ( n >= 0 && y > y_turns[n] ) - while ( n >= 0 ) - { - y2 = (Int)y_turns[n]; - y_turns[n] = y; - y = y2; - n--; - } - - if ( n < 0 ) - { - ras.maxBuff--; - if ( ras.maxBuff <= ras.top ) - { - ras.error = Raster_Err_Overflow; - return FAILURE; - } - ras.numTurns++; - ras.sizeBuff[-ras.numTurns] = y; - } - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Finalize_Profile_Table */ - /* */ - /* <Description> */ - /* Adjust all links in the profiles list. */ - /* */ - /* <Return> */ - /* SUCCESS on success. FAILURE in case of overflow. */ - /* */ - static Bool - Finalize_Profile_Table( RAS_ARG ) - { - Int bottom, top; - UShort n; - PProfile p; - - - n = ras.num_Profs; - p = ras.fProfile; - - if ( n > 1 && p ) - { - while ( n > 0 ) - { - if ( n > 1 ) - p->link = (PProfile)( p->offset + p->height ); - else - p->link = NULL; - - if ( p->flags & Flow_Up ) - { - bottom = (Int)p->start; - top = (Int)( p->start + p->height - 1 ); - } - else - { - bottom = (Int)( p->start - p->height + 1 ); - top = (Int)p->start; - p->start = bottom; - p->offset += p->height - 1; - } - - if ( Insert_Y_Turn( RAS_VARS bottom ) || - Insert_Y_Turn( RAS_VARS top + 1 ) ) - return FAILURE; - - p = p->link; - n--; - } - } - else - ras.fProfile = NULL; - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Split_Conic */ - /* */ - /* <Description> */ - /* Subdivide one conic Bezier into two joint sub-arcs in the Bezier */ - /* stack. */ - /* */ - /* <Input> */ - /* None (subdivided Bezier is taken from the top of the stack). */ - /* */ - /* <Note> */ - /* This routine is the `beef' of this component. It is _the_ inner */ - /* loop that should be optimized to hell to get the best performance. */ - /* */ - static void - Split_Conic( TPoint* base ) - { - Long a, b; - - - base[4].x = base[2].x; - b = base[1].x; - a = base[3].x = ( base[2].x + b ) / 2; - b = base[1].x = ( base[0].x + b ) / 2; - base[2].x = ( a + b ) / 2; - - base[4].y = base[2].y; - b = base[1].y; - a = base[3].y = ( base[2].y + b ) / 2; - b = base[1].y = ( base[0].y + b ) / 2; - base[2].y = ( a + b ) / 2; - - /* hand optimized. gcc doesn't seem to be too good at common */ - /* expression substitution and instruction scheduling ;-) */ - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Split_Cubic */ - /* */ - /* <Description> */ - /* Subdivide a third-order Bezier arc into two joint sub-arcs in the */ - /* Bezier stack. */ - /* */ - /* <Note> */ - /* This routine is the `beef' of the component. It is one of _the_ */ - /* inner loops that should be optimized like hell to get the best */ - /* performance. */ - /* */ - static void - Split_Cubic( TPoint* base ) - { - Long a, b, c, d; - - - base[6].x = base[3].x; - c = base[1].x; - d = base[2].x; - base[1].x = a = ( base[0].x + c + 1 ) >> 1; - base[5].x = b = ( base[3].x + d + 1 ) >> 1; - c = ( c + d + 1 ) >> 1; - base[2].x = a = ( a + c + 1 ) >> 1; - base[4].x = b = ( b + c + 1 ) >> 1; - base[3].x = ( a + b + 1 ) >> 1; - - base[6].y = base[3].y; - c = base[1].y; - d = base[2].y; - base[1].y = a = ( base[0].y + c + 1 ) >> 1; - base[5].y = b = ( base[3].y + d + 1 ) >> 1; - c = ( c + d + 1 ) >> 1; - base[2].y = a = ( a + c + 1 ) >> 1; - base[4].y = b = ( b + c + 1 ) >> 1; - base[3].y = ( a + b + 1 ) >> 1; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Line_Up */ - /* */ - /* <Description> */ - /* Compute the x-coordinates of an ascending line segment and store */ - /* them in the render pool. */ - /* */ - /* <Input> */ - /* x1 :: The x-coordinate of the segment's start point. */ - /* */ - /* y1 :: The y-coordinate of the segment's start point. */ - /* */ - /* x2 :: The x-coordinate of the segment's end point. */ - /* */ - /* y2 :: The y-coordinate of the segment's end point. */ - /* */ - /* miny :: A lower vertical clipping bound value. */ - /* */ - /* maxy :: An upper vertical clipping bound value. */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow. */ - /* */ - static Bool - Line_Up( RAS_ARGS Long x1, - Long y1, - Long x2, - Long y2, - Long miny, - Long maxy ) - { - Long Dx, Dy; - Int e1, e2, f1, f2, size; /* XXX: is `Short' sufficient? */ - Long Ix, Rx, Ax; - - PLong top; - - - Dx = x2 - x1; - Dy = y2 - y1; - - if ( Dy <= 0 || y2 < miny || y1 > maxy ) - return SUCCESS; - - if ( y1 < miny ) - { - /* Take care: miny-y1 can be a very large value; we use */ - /* a slow MulDiv function to avoid clipping bugs */ - x1 += SMulDiv( Dx, miny - y1, Dy ); - e1 = (Int)TRUNC( miny ); - f1 = 0; - } - else - { - e1 = (Int)TRUNC( y1 ); - f1 = (Int)FRAC( y1 ); - } - - if ( y2 > maxy ) - { - /* x2 += FMulDiv( Dx, maxy - y2, Dy ); UNNECESSARY */ - e2 = (Int)TRUNC( maxy ); - f2 = 0; - } - else - { - e2 = (Int)TRUNC( y2 ); - f2 = (Int)FRAC( y2 ); - } - - if ( f1 > 0 ) - { - if ( e1 == e2 ) - return SUCCESS; - else - { - x1 += FMulDiv( Dx, ras.precision - f1, Dy ); - e1 += 1; - } - } - else - if ( ras.joint ) - { - ras.top--; - ras.joint = FALSE; - } - - ras.joint = (char)( f2 == 0 ); - - if ( ras.fresh ) - { - ras.cProfile->start = e1; - ras.fresh = FALSE; - } - - size = e2 - e1 + 1; - if ( ras.top + size >= ras.maxBuff ) - { - ras.error = Raster_Err_Overflow; - return FAILURE; - } - - if ( Dx > 0 ) - { - Ix = SMulDiv( ras.precision, Dx, Dy); - Rx = ( ras.precision * Dx ) % Dy; - Dx = 1; - } - else - { - Ix = SMulDiv( ras.precision, -Dx, Dy) * -1; - Rx = ( ras.precision * -Dx ) % Dy; - Dx = -1; - } - - Ax = -Dy; - top = ras.top; - - while ( size > 0 ) - { - *top++ = x1; - - x1 += Ix; - Ax += Rx; - if ( Ax >= 0 ) - { - Ax -= Dy; - x1 += Dx; - } - size--; - } - - ras.top = top; - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Line_Down */ - /* */ - /* <Description> */ - /* Compute the x-coordinates of an descending line segment and store */ - /* them in the render pool. */ - /* */ - /* <Input> */ - /* x1 :: The x-coordinate of the segment's start point. */ - /* */ - /* y1 :: The y-coordinate of the segment's start point. */ - /* */ - /* x2 :: The x-coordinate of the segment's end point. */ - /* */ - /* y2 :: The y-coordinate of the segment's end point. */ - /* */ - /* miny :: A lower vertical clipping bound value. */ - /* */ - /* maxy :: An upper vertical clipping bound value. */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow. */ - /* */ - static Bool - Line_Down( RAS_ARGS Long x1, - Long y1, - Long x2, - Long y2, - Long miny, - Long maxy ) - { - Bool result, fresh; - - - fresh = ras.fresh; - - result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny ); - - if ( fresh && !ras.fresh ) - ras.cProfile->start = -ras.cProfile->start; - - return result; - } - - - /* A function type describing the functions used to split Bezier arcs */ - typedef void (*TSplitter)( TPoint* base ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Bezier_Up */ - /* */ - /* <Description> */ - /* Compute the x-coordinates of an ascending Bezier arc and store */ - /* them in the render pool. */ - /* */ - /* <Input> */ - /* degree :: The degree of the Bezier arc (either 2 or 3). */ - /* */ - /* splitter :: The function to split Bezier arcs. */ - /* */ - /* miny :: A lower vertical clipping bound value. */ - /* */ - /* maxy :: An upper vertical clipping bound value. */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow. */ - /* */ - static Bool - Bezier_Up( RAS_ARGS Int degree, - TSplitter splitter, - Long miny, - Long maxy ) - { - Long y1, y2, e, e2, e0; - Short f1; - - TPoint* arc; - TPoint* start_arc; - - PLong top; - - - arc = ras.arc; - y1 = arc[degree].y; - y2 = arc[0].y; - top = ras.top; - - if ( y2 < miny || y1 > maxy ) - goto Fin; - - e2 = FLOOR( y2 ); - - if ( e2 > maxy ) - e2 = maxy; - - e0 = miny; - - if ( y1 < miny ) - e = miny; - else - { - e = CEILING( y1 ); - f1 = (Short)( FRAC( y1 ) ); - e0 = e; - - if ( f1 == 0 ) - { - if ( ras.joint ) - { - top--; - ras.joint = FALSE; - } - - *top++ = arc[degree].x; - - e += ras.precision; - } - } - - if ( ras.fresh ) - { - ras.cProfile->start = TRUNC( e0 ); - ras.fresh = FALSE; - } - - if ( e2 < e ) - goto Fin; - - if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff ) - { - ras.top = top; - ras.error = Raster_Err_Overflow; - return FAILURE; - } - - start_arc = arc; - - while ( arc >= start_arc && e <= e2 ) - { - ras.joint = FALSE; - - y2 = arc[0].y; - - if ( y2 > e ) - { - y1 = arc[degree].y; - if ( y2 - y1 >= ras.precision_step ) - { - splitter( arc ); - arc += degree; - } - else - { - *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x, - e - y1, y2 - y1 ); - arc -= degree; - e += ras.precision; - } - } - else - { - if ( y2 == e ) - { - ras.joint = TRUE; - *top++ = arc[0].x; - - e += ras.precision; - } - arc -= degree; - } - } - - Fin: - ras.top = top; - ras.arc -= degree; - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Bezier_Down */ - /* */ - /* <Description> */ - /* Compute the x-coordinates of an descending Bezier arc and store */ - /* them in the render pool. */ - /* */ - /* <Input> */ - /* degree :: The degree of the Bezier arc (either 2 or 3). */ - /* */ - /* splitter :: The function to split Bezier arcs. */ - /* */ - /* miny :: A lower vertical clipping bound value. */ - /* */ - /* maxy :: An upper vertical clipping bound value. */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow. */ - /* */ - static Bool - Bezier_Down( RAS_ARGS Int degree, - TSplitter splitter, - Long miny, - Long maxy ) - { - TPoint* arc = ras.arc; - Bool result, fresh; - - - arc[0].y = -arc[0].y; - arc[1].y = -arc[1].y; - arc[2].y = -arc[2].y; - if ( degree > 2 ) - arc[3].y = -arc[3].y; - - fresh = ras.fresh; - - result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny ); - - if ( fresh && !ras.fresh ) - ras.cProfile->start = -ras.cProfile->start; - - arc[0].y = -arc[0].y; - return result; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Line_To */ - /* */ - /* <Description> */ - /* Inject a new line segment and adjust the Profiles list. */ - /* */ - /* <Input> */ - /* x :: The x-coordinate of the segment's end point (its start point */ - /* is stored in `lastX'). */ - /* */ - /* y :: The y-coordinate of the segment's end point (its start point */ - /* is stored in `lastY'). */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ - /* profile. */ - /* */ - static Bool - Line_To( RAS_ARGS Long x, - Long y ) - { - /* First, detect a change of direction */ - - switch ( ras.state ) - { - case Unknown_State: - if ( y > ras.lastY ) - { - if ( New_Profile( RAS_VARS Ascending_State, - IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) - return FAILURE; - } - else - { - if ( y < ras.lastY ) - if ( New_Profile( RAS_VARS Descending_State, - IS_TOP_OVERSHOOT( ras.lastY ) ) ) - return FAILURE; - } - break; - - case Ascending_State: - if ( y < ras.lastY ) - { - if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) || - New_Profile( RAS_VARS Descending_State, - IS_TOP_OVERSHOOT( ras.lastY ) ) ) - return FAILURE; - } - break; - - case Descending_State: - if ( y > ras.lastY ) - { - if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) || - New_Profile( RAS_VARS Ascending_State, - IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) - return FAILURE; - } - break; - - default: - ; - } - - /* Then compute the lines */ - - switch ( ras.state ) - { - case Ascending_State: - if ( Line_Up( RAS_VARS ras.lastX, ras.lastY, - x, y, ras.minY, ras.maxY ) ) - return FAILURE; - break; - - case Descending_State: - if ( Line_Down( RAS_VARS ras.lastX, ras.lastY, - x, y, ras.minY, ras.maxY ) ) - return FAILURE; - break; - - default: - ; - } - - ras.lastX = x; - ras.lastY = y; - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Conic_To */ - /* */ - /* <Description> */ - /* Inject a new conic arc and adjust the profile list. */ - /* */ - /* <Input> */ - /* cx :: The x-coordinate of the arc's new control point. */ - /* */ - /* cy :: The y-coordinate of the arc's new control point. */ - /* */ - /* x :: The x-coordinate of the arc's end point (its start point is */ - /* stored in `lastX'). */ - /* */ - /* y :: The y-coordinate of the arc's end point (its start point is */ - /* stored in `lastY'). */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ - /* profile. */ - /* */ - static Bool - Conic_To( RAS_ARGS Long cx, - Long cy, - Long x, - Long y ) - { - Long y1, y2, y3, x3, ymin, ymax; - TStates state_bez; - - - ras.arc = ras.arcs; - ras.arc[2].x = ras.lastX; - ras.arc[2].y = ras.lastY; - ras.arc[1].x = cx; - ras.arc[1].y = cy; - ras.arc[0].x = x; - ras.arc[0].y = y; - - do - { - y1 = ras.arc[2].y; - y2 = ras.arc[1].y; - y3 = ras.arc[0].y; - x3 = ras.arc[0].x; - - /* first, categorize the Bezier arc */ - - if ( y1 <= y3 ) - { - ymin = y1; - ymax = y3; - } - else - { - ymin = y3; - ymax = y1; - } - - if ( y2 < ymin || y2 > ymax ) - { - /* this arc has no given direction, split it! */ - Split_Conic( ras.arc ); - ras.arc += 2; - } - else if ( y1 == y3 ) - { - /* this arc is flat, ignore it and pop it from the Bezier stack */ - ras.arc -= 2; - } - else - { - /* the arc is y-monotonous, either ascending or descending */ - /* detect a change of direction */ - state_bez = y1 < y3 ? Ascending_State : Descending_State; - if ( ras.state != state_bez ) - { - Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 ) - : IS_TOP_OVERSHOOT( y1 ); - - - /* finalize current profile if any */ - if ( ras.state != Unknown_State && - End_Profile( RAS_VARS o ) ) - goto Fail; - - /* create a new profile */ - if ( New_Profile( RAS_VARS state_bez, o ) ) - goto Fail; - } - - /* now call the appropriate routine */ - if ( state_bez == Ascending_State ) - { - if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) ) - goto Fail; - } - else - if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) ) - goto Fail; - } - - } while ( ras.arc >= ras.arcs ); - - ras.lastX = x3; - ras.lastY = y3; - - return SUCCESS; - - Fail: - return FAILURE; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Cubic_To */ - /* */ - /* <Description> */ - /* Inject a new cubic arc and adjust the profile list. */ - /* */ - /* <Input> */ - /* cx1 :: The x-coordinate of the arc's first new control point. */ - /* */ - /* cy1 :: The y-coordinate of the arc's first new control point. */ - /* */ - /* cx2 :: The x-coordinate of the arc's second new control point. */ - /* */ - /* cy2 :: The y-coordinate of the arc's second new control point. */ - /* */ - /* x :: The x-coordinate of the arc's end point (its start point is */ - /* stored in `lastX'). */ - /* */ - /* y :: The y-coordinate of the arc's end point (its start point is */ - /* stored in `lastY'). */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ - /* profile. */ - /* */ - static Bool - Cubic_To( RAS_ARGS Long cx1, - Long cy1, - Long cx2, - Long cy2, - Long x, - Long y ) - { - Long y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2; - TStates state_bez; - - - ras.arc = ras.arcs; - ras.arc[3].x = ras.lastX; - ras.arc[3].y = ras.lastY; - ras.arc[2].x = cx1; - ras.arc[2].y = cy1; - ras.arc[1].x = cx2; - ras.arc[1].y = cy2; - ras.arc[0].x = x; - ras.arc[0].y = y; - - do - { - y1 = ras.arc[3].y; - y2 = ras.arc[2].y; - y3 = ras.arc[1].y; - y4 = ras.arc[0].y; - x4 = ras.arc[0].x; - - /* first, categorize the Bezier arc */ - - if ( y1 <= y4 ) - { - ymin1 = y1; - ymax1 = y4; - } - else - { - ymin1 = y4; - ymax1 = y1; - } - - if ( y2 <= y3 ) - { - ymin2 = y2; - ymax2 = y3; - } - else - { - ymin2 = y3; - ymax2 = y2; - } - - if ( ymin2 < ymin1 || ymax2 > ymax1 ) - { - /* this arc has no given direction, split it! */ - Split_Cubic( ras.arc ); - ras.arc += 3; - } - else if ( y1 == y4 ) - { - /* this arc is flat, ignore it and pop it from the Bezier stack */ - ras.arc -= 3; - } - else - { - state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State; - - /* detect a change of direction */ - if ( ras.state != state_bez ) - { - Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 ) - : IS_TOP_OVERSHOOT( y1 ); - - - /* finalize current profile if any */ - if ( ras.state != Unknown_State && - End_Profile( RAS_VARS o ) ) - goto Fail; - - if ( New_Profile( RAS_VARS state_bez, o ) ) - goto Fail; - } - - /* compute intersections */ - if ( state_bez == Ascending_State ) - { - if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) - goto Fail; - } - else - if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) - goto Fail; - } - - } while ( ras.arc >= ras.arcs ); - - ras.lastX = x4; - ras.lastY = y4; - - return SUCCESS; - - Fail: - return FAILURE; - } - - -#undef SWAP_ -#define SWAP_( x, y ) do \ - { \ - Long swap = x; \ - \ - \ - x = y; \ - y = swap; \ - } while ( 0 ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Decompose_Curve */ - /* */ - /* <Description> */ - /* Scan the outline arrays in order to emit individual segments and */ - /* Beziers by calling Line_To() and Bezier_To(). It handles all */ - /* weird cases, like when the first point is off the curve, or when */ - /* there are simply no `on' points in the contour! */ - /* */ - /* <Input> */ - /* first :: The index of the first point in the contour. */ - /* */ - /* last :: The index of the last point in the contour. */ - /* */ - /* flipped :: If set, flip the direction of the curve. */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE on error. */ - /* */ - static Bool - Decompose_Curve( RAS_ARGS UShort first, - UShort last, - int flipped ) - { - FT_Vector v_last; - FT_Vector v_control; - FT_Vector v_start; - - FT_Vector* points; - FT_Vector* point; - FT_Vector* limit; - char* tags; - - unsigned tag; /* current point's state */ - - - points = ras.outline.points; - limit = points + last; - - v_start.x = SCALED( points[first].x ); - v_start.y = SCALED( points[first].y ); - v_last.x = SCALED( points[last].x ); - v_last.y = SCALED( points[last].y ); - - if ( flipped ) - { - SWAP_( v_start.x, v_start.y ); - SWAP_( v_last.x, v_last.y ); - } - - v_control = v_start; - - point = points + first; - tags = ras.outline.tags + first; - - /* set scan mode if necessary */ - if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE ) - ras.dropOutControl = (Byte)tags[0] >> 5; - - tag = FT_CURVE_TAG( tags[0] ); - - /* A contour cannot start with a cubic control point! */ - if ( tag == FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - /* check first point to determine origin */ - if ( tag == FT_CURVE_TAG_CONIC ) - { - /* first point is conic control. Yes, this happens. */ - if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON ) - { - /* start at last point if it is on the curve */ - v_start = v_last; - limit--; - } - else - { - /* if both first and last points are conic, */ - /* start at their middle and record its position */ - /* for closure */ - v_start.x = ( v_start.x + v_last.x ) / 2; - v_start.y = ( v_start.y + v_last.y ) / 2; - - v_last = v_start; - } - point--; - tags--; - } - - ras.lastX = v_start.x; - ras.lastY = v_start.y; - - while ( point < limit ) - { - point++; - tags++; - - tag = FT_CURVE_TAG( tags[0] ); - - switch ( tag ) - { - case FT_CURVE_TAG_ON: /* emit a single line_to */ - { - Long x, y; - - - x = SCALED( point->x ); - y = SCALED( point->y ); - if ( flipped ) - SWAP_( x, y ); - - if ( Line_To( RAS_VARS x, y ) ) - goto Fail; - continue; - } - - case FT_CURVE_TAG_CONIC: /* consume conic arcs */ - v_control.x = SCALED( point[0].x ); - v_control.y = SCALED( point[0].y ); - - if ( flipped ) - SWAP_( v_control.x, v_control.y ); - - Do_Conic: - if ( point < limit ) - { - FT_Vector v_middle; - Long x, y; - - - point++; - tags++; - tag = FT_CURVE_TAG( tags[0] ); - - x = SCALED( point[0].x ); - y = SCALED( point[0].y ); - - if ( flipped ) - SWAP_( x, y ); - - if ( tag == FT_CURVE_TAG_ON ) - { - if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) ) - goto Fail; - continue; - } - - if ( tag != FT_CURVE_TAG_CONIC ) - goto Invalid_Outline; - - v_middle.x = ( v_control.x + x ) / 2; - v_middle.y = ( v_control.y + y ) / 2; - - if ( Conic_To( RAS_VARS v_control.x, v_control.y, - v_middle.x, v_middle.y ) ) - goto Fail; - - v_control.x = x; - v_control.y = y; - - goto Do_Conic; - } - - if ( Conic_To( RAS_VARS v_control.x, v_control.y, - v_start.x, v_start.y ) ) - goto Fail; - - goto Close; - - default: /* FT_CURVE_TAG_CUBIC */ - { - Long x1, y1, x2, y2, x3, y3; - - - if ( point + 1 > limit || - FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - point += 2; - tags += 2; - - x1 = SCALED( point[-2].x ); - y1 = SCALED( point[-2].y ); - x2 = SCALED( point[-1].x ); - y2 = SCALED( point[-1].y ); - - if ( flipped ) - { - SWAP_( x1, y1 ); - SWAP_( x2, y2 ); - } - - if ( point <= limit ) - { - x3 = SCALED( point[0].x ); - y3 = SCALED( point[0].y ); - - if ( flipped ) - SWAP_( x3, y3 ); - - if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) ) - goto Fail; - continue; - } - - if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) ) - goto Fail; - goto Close; - } - } - } - - /* close the contour with a line segment */ - if ( Line_To( RAS_VARS v_start.x, v_start.y ) ) - goto Fail; - - Close: - return SUCCESS; - - Invalid_Outline: - ras.error = Raster_Err_Invalid; - - Fail: - return FAILURE; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Convert_Glyph */ - /* */ - /* <Description> */ - /* Convert a glyph into a series of segments and arcs and make a */ - /* profiles list with them. */ - /* */ - /* <Input> */ - /* flipped :: If set, flip the direction of curve. */ - /* */ - /* <Return> */ - /* SUCCESS on success, FAILURE if any error was encountered during */ - /* rendering. */ - /* */ - static Bool - Convert_Glyph( RAS_ARGS int flipped ) - { - int i; - unsigned start; - - PProfile lastProfile; - - - ras.fProfile = NULL; - ras.joint = FALSE; - ras.fresh = FALSE; - - ras.maxBuff = ras.sizeBuff - AlignProfileSize; - - ras.numTurns = 0; - - ras.cProfile = (PProfile)ras.top; - ras.cProfile->offset = ras.top; - ras.num_Profs = 0; - - start = 0; - - for ( i = 0; i < ras.outline.n_contours; i++ ) - { - Bool o; - - - ras.state = Unknown_State; - ras.gProfile = NULL; - - if ( Decompose_Curve( RAS_VARS (unsigned short)start, - ras.outline.contours[i], - flipped ) ) - return FAILURE; - - start = ras.outline.contours[i] + 1; - - /* we must now check whether the extreme arcs join or not */ - if ( FRAC( ras.lastY ) == 0 && - ras.lastY >= ras.minY && - ras.lastY <= ras.maxY ) - if ( ras.gProfile && - ( ras.gProfile->flags & Flow_Up ) == - ( ras.cProfile->flags & Flow_Up ) ) - ras.top--; - /* Note that ras.gProfile can be nil if the contour was too small */ - /* to be drawn. */ - - lastProfile = ras.cProfile; - if ( ras.cProfile->flags & Flow_Up ) - o = IS_TOP_OVERSHOOT( ras.lastY ); - else - o = IS_BOTTOM_OVERSHOOT( ras.lastY ); - if ( End_Profile( RAS_VARS o ) ) - return FAILURE; - - /* close the `next profile in contour' linked list */ - if ( ras.gProfile ) - lastProfile->next = ras.gProfile; - } - - if ( Finalize_Profile_Table( RAS_VAR ) ) - return FAILURE; - - return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /** **/ - /** SCAN-LINE SWEEPS AND DRAWING **/ - /** **/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Init_Linked */ - /* */ - /* Initializes an empty linked list. */ - /* */ - static void - Init_Linked( TProfileList* l ) - { - *l = NULL; - } - - - /*************************************************************************/ - /* */ - /* InsNew */ - /* */ - /* Inserts a new profile in a linked list. */ - /* */ - static void - InsNew( PProfileList list, - PProfile profile ) - { - PProfile *old, current; - Long x; - - - old = list; - current = *old; - x = profile->X; - - while ( current ) - { - if ( x < current->X ) - break; - old = ¤t->link; - current = *old; - } - - profile->link = current; - *old = profile; - } - - - /*************************************************************************/ - /* */ - /* DelOld */ - /* */ - /* Removes an old profile from a linked list. */ - /* */ - static void - DelOld( PProfileList list, - PProfile profile ) - { - PProfile *old, current; - - - old = list; - current = *old; - - while ( current ) - { - if ( current == profile ) - { - *old = current->link; - return; - } - - old = ¤t->link; - current = *old; - } - - /* we should never get there, unless the profile was not part of */ - /* the list. */ - } - - - /*************************************************************************/ - /* */ - /* Sort */ - /* */ - /* Sorts a trace list. In 95%, the list is already sorted. We need */ - /* an algorithm which is fast in this case. Bubble sort is enough */ - /* and simple. */ - /* */ - static void - Sort( PProfileList list ) - { - PProfile *old, current, next; - - - /* First, set the new X coordinate of each profile */ - current = *list; - while ( current ) - { - current->X = *current->offset; - current->offset += current->flags & Flow_Up ? 1 : -1; - current->height--; - current = current->link; - } - - /* Then sort them */ - old = list; - current = *old; - - if ( !current ) - return; - - next = current->link; - - while ( next ) - { - if ( current->X <= next->X ) - { - old = ¤t->link; - current = *old; - - if ( !current ) - return; - } - else - { - *old = next; - current->link = next->link; - next->link = current; - - old = list; - current = *old; - } - - next = current->link; - } - } - - - /*************************************************************************/ - /* */ - /* Vertical Sweep Procedure Set */ - /* */ - /* These four routines are used during the vertical black/white sweep */ - /* phase by the generic Draw_Sweep() function. */ - /* */ - /*************************************************************************/ - - static void - Vertical_Sweep_Init( RAS_ARGS Short* min, - Short* max ) - { - Long pitch = ras.target.pitch; - - FT_UNUSED( max ); - - - ras.traceIncr = (Short)-pitch; - ras.traceOfs = -*min * pitch; - if ( pitch > 0 ) - ras.traceOfs += ( ras.target.rows - 1 ) * pitch; - - ras.gray_min_x = 0; - ras.gray_max_x = 0; - } - - - static void - Vertical_Sweep_Span( RAS_ARGS Short y, - FT_F26Dot6 x1, - FT_F26Dot6 x2, - PProfile left, - PProfile right ) - { - Long e1, e2; - int c1, c2; - Byte f1, f2; - Byte* target; - - FT_UNUSED( y ); - FT_UNUSED( left ); - FT_UNUSED( right ); - - - /* Drop-out control */ - - e1 = TRUNC( CEILING( x1 ) ); - - if ( x2 - x1 - ras.precision <= ras.precision_jitter ) - e2 = e1; - else - e2 = TRUNC( FLOOR( x2 ) ); - - if ( e2 >= 0 && e1 < ras.bWidth ) - { - if ( e1 < 0 ) - e1 = 0; - if ( e2 >= ras.bWidth ) - e2 = ras.bWidth - 1; - - c1 = (Short)( e1 >> 3 ); - c2 = (Short)( e2 >> 3 ); - - f1 = (Byte) ( 0xFF >> ( e1 & 7 ) ); - f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) ); - - if ( ras.gray_min_x > c1 ) - ras.gray_min_x = (short)c1; - if ( ras.gray_max_x < c2 ) - ras.gray_max_x = (short)c2; - - target = ras.bTarget + ras.traceOfs + c1; - c2 -= c1; - - if ( c2 > 0 ) - { - target[0] |= f1; - - /* memset() is slower than the following code on many platforms. */ - /* This is due to the fact that, in the vast majority of cases, */ - /* the span length in bytes is relatively small. */ - c2--; - while ( c2 > 0 ) - { - *(++target) = 0xFF; - c2--; - } - target[1] |= f2; - } - else - *target |= ( f1 & f2 ); - } - } - - - static void - Vertical_Sweep_Drop( RAS_ARGS Short y, - FT_F26Dot6 x1, - FT_F26Dot6 x2, - PProfile left, - PProfile right ) - { - Long e1, e2, pxl; - Short c1, f1; - - - /* Drop-out control */ - - /* e2 x2 x1 e1 */ - /* */ - /* ^ | */ - /* | | */ - /* +-------------+---------------------+------------+ */ - /* | | */ - /* | v */ - /* */ - /* pixel contour contour pixel */ - /* center center */ - - /* drop-out mode scan conversion rules (as defined in OpenType) */ - /* --------------------------------------------------------------- */ - /* 0 1, 2, 3 */ - /* 1 1, 2, 4 */ - /* 2 1, 2 */ - /* 3 same as mode 2 */ - /* 4 1, 2, 5 */ - /* 5 1, 2, 6 */ - /* 6, 7 same as mode 2 */ - - e1 = CEILING( x1 ); - e2 = FLOOR ( x2 ); - pxl = e1; - - if ( e1 > e2 ) - { - Int dropOutControl = left->flags & 7; - - - if ( e1 == e2 + ras.precision ) - { - switch ( dropOutControl ) - { - case 0: /* simple drop-outs including stubs */ - pxl = e2; - break; - - case 4: /* smart drop-outs including stubs */ - pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); - break; - - case 1: /* simple drop-outs excluding stubs */ - case 5: /* smart drop-outs excluding stubs */ - - /* Drop-out Control Rules #4 and #6 */ - - /* The specification neither provides an exact definition */ - /* of a `stub' nor gives exact rules to exclude them. */ - /* */ - /* Here the constraints we use to recognize a stub. */ - /* */ - /* upper stub: */ - /* */ - /* - P_Left and P_Right are in the same contour */ - /* - P_Right is the successor of P_Left in that contour */ - /* - y is the top of P_Left and P_Right */ - /* */ - /* lower stub: */ - /* */ - /* - P_Left and P_Right are in the same contour */ - /* - P_Left is the successor of P_Right in that contour */ - /* - y is the bottom of P_Left */ - /* */ - /* We draw a stub if the following constraints are met. */ - /* */ - /* - for an upper or lower stub, there is top or bottom */ - /* overshoot, respectively */ - /* - the covered interval is greater or equal to a half */ - /* pixel */ - - /* upper stub test */ - if ( left->next == right && - left->height <= 0 && - !( left->flags & Overshoot_Top && - x2 - x1 >= ras.precision_half ) ) - return; - - /* lower stub test */ - if ( right->next == left && - left->start == y && - !( left->flags & Overshoot_Bottom && - x2 - x1 >= ras.precision_half ) ) - return; - - if ( dropOutControl == 1 ) - pxl = e2; - else - pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); - break; - - default: /* modes 2, 3, 6, 7 */ - return; /* no drop-out control */ - } - - /* check that the other pixel isn't set */ - e1 = pxl == e1 ? e2 : e1; - - e1 = TRUNC( e1 ); - - c1 = (Short)( e1 >> 3 ); - f1 = (Short)( e1 & 7 ); - - if ( e1 >= 0 && e1 < ras.bWidth && - ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) ) - return; - } - else - return; - } - - e1 = TRUNC( pxl ); - - if ( e1 >= 0 && e1 < ras.bWidth ) - { - c1 = (Short)( e1 >> 3 ); - f1 = (Short)( e1 & 7 ); - - if ( ras.gray_min_x > c1 ) - ras.gray_min_x = c1; - if ( ras.gray_max_x < c1 ) - ras.gray_max_x = c1; - - ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 ); - } - } - - - static void - Vertical_Sweep_Step( RAS_ARG ) - { - ras.traceOfs += ras.traceIncr; - } - - - /***********************************************************************/ - /* */ - /* Horizontal Sweep Procedure Set */ - /* */ - /* These four routines are used during the horizontal black/white */ - /* sweep phase by the generic Draw_Sweep() function. */ - /* */ - /***********************************************************************/ - - static void - Horizontal_Sweep_Init( RAS_ARGS Short* min, - Short* max ) - { - /* nothing, really */ - FT_UNUSED_RASTER; - FT_UNUSED( min ); - FT_UNUSED( max ); - } - - - static void - Horizontal_Sweep_Span( RAS_ARGS Short y, - FT_F26Dot6 x1, - FT_F26Dot6 x2, - PProfile left, - PProfile right ) - { - Long e1, e2; - PByte bits; - Byte f1; - - FT_UNUSED( left ); - FT_UNUSED( right ); - - - if ( x2 - x1 < ras.precision ) - { - e1 = CEILING( x1 ); - e2 = FLOOR ( x2 ); - - if ( e1 == e2 ) - { - bits = ras.bTarget + ( y >> 3 ); - f1 = (Byte)( 0x80 >> ( y & 7 ) ); - - e1 = TRUNC( e1 ); - - if ( e1 >= 0 && e1 < ras.target.rows ) - { - PByte p; - - - p = bits - e1 * ras.target.pitch; - if ( ras.target.pitch > 0 ) - p += ( ras.target.rows - 1 ) * ras.target.pitch; - - p[0] |= f1; - } - } - } - } - - - static void - Horizontal_Sweep_Drop( RAS_ARGS Short y, - FT_F26Dot6 x1, - FT_F26Dot6 x2, - PProfile left, - PProfile right ) - { - Long e1, e2, pxl; - PByte bits; - Byte f1; - - - /* During the horizontal sweep, we only take care of drop-outs */ - - /* e1 + <-- pixel center */ - /* | */ - /* x1 ---+--> <-- contour */ - /* | */ - /* | */ - /* x2 <--+--- <-- contour */ - /* | */ - /* | */ - /* e2 + <-- pixel center */ - - e1 = CEILING( x1 ); - e2 = FLOOR ( x2 ); - pxl = e1; - - if ( e1 > e2 ) - { - Int dropOutControl = left->flags & 7; - - - if ( e1 == e2 + ras.precision ) - { - switch ( dropOutControl ) - { - case 0: /* simple drop-outs including stubs */ - pxl = e2; - break; - - case 4: /* smart drop-outs including stubs */ - pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); - break; - - case 1: /* simple drop-outs excluding stubs */ - case 5: /* smart drop-outs excluding stubs */ - /* see Vertical_Sweep_Drop for details */ - - /* rightmost stub test */ - if ( left->next == right && - left->height <= 0 && - !( left->flags & Overshoot_Top && - x2 - x1 >= ras.precision_half ) ) - return; - - /* leftmost stub test */ - if ( right->next == left && - left->start == y && - !( left->flags & Overshoot_Bottom && - x2 - x1 >= ras.precision_half ) ) - return; - - if ( dropOutControl == 1 ) - pxl = e2; - else - pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); - break; - - default: /* modes 2, 3, 6, 7 */ - return; /* no drop-out control */ - } - - /* check that the other pixel isn't set */ - e1 = pxl == e1 ? e2 : e1; - - e1 = TRUNC( e1 ); - - bits = ras.bTarget + ( y >> 3 ); - f1 = (Byte)( 0x80 >> ( y & 7 ) ); - - bits -= e1 * ras.target.pitch; - if ( ras.target.pitch > 0 ) - bits += ( ras.target.rows - 1 ) * ras.target.pitch; - - if ( e1 >= 0 && - e1 < ras.target.rows && - *bits & f1 ) - return; - } - else - return; - } - - bits = ras.bTarget + ( y >> 3 ); - f1 = (Byte)( 0x80 >> ( y & 7 ) ); - - e1 = TRUNC( pxl ); - - if ( e1 >= 0 && e1 < ras.target.rows ) - { - bits -= e1 * ras.target.pitch; - if ( ras.target.pitch > 0 ) - bits += ( ras.target.rows - 1 ) * ras.target.pitch; - - bits[0] |= f1; - } - } - - - static void - Horizontal_Sweep_Step( RAS_ARG ) - { - /* Nothing, really */ - FT_UNUSED_RASTER; - } - - -#ifdef FT_RASTER_OPTION_ANTI_ALIASING - - - /*************************************************************************/ - /* */ - /* Vertical Gray Sweep Procedure Set */ - /* */ - /* These two routines are used during the vertical gray-levels sweep */ - /* phase by the generic Draw_Sweep() function. */ - /* */ - /* NOTES */ - /* */ - /* - The target pixmap's width *must* be a multiple of 4. */ - /* */ - /* - You have to use the function Vertical_Sweep_Span() for the gray */ - /* span call. */ - /* */ - /*************************************************************************/ - - static void - Vertical_Gray_Sweep_Init( RAS_ARGS Short* min, - Short* max ) - { - Long pitch, byte_len; - - - *min = *min & -2; - *max = ( *max + 3 ) & -2; - - ras.traceOfs = 0; - pitch = ras.target.pitch; - byte_len = -pitch; - ras.traceIncr = (Short)byte_len; - ras.traceG = ( *min / 2 ) * byte_len; - - if ( pitch > 0 ) - { - ras.traceG += ( ras.target.rows - 1 ) * pitch; - byte_len = -byte_len; - } - - ras.gray_min_x = (Short)byte_len; - ras.gray_max_x = -(Short)byte_len; - } - - - static void - Vertical_Gray_Sweep_Step( RAS_ARG ) - { - Int c1, c2; - PByte pix, bit, bit2; - short* count = (short*)count_table; - Byte* grays; - - - ras.traceOfs += ras.gray_width; - - if ( ras.traceOfs > ras.gray_width ) - { - pix = ras.gTarget + ras.traceG + ras.gray_min_x * 4; - grays = ras.grays; - - if ( ras.gray_max_x >= 0 ) - { - Long last_pixel = ras.target.width - 1; - Int last_cell = last_pixel >> 2; - Int last_bit = last_pixel & 3; - Bool over = 0; - - - if ( ras.gray_max_x >= last_cell && last_bit != 3 ) - { - ras.gray_max_x = last_cell - 1; - over = 1; - } - - if ( ras.gray_min_x < 0 ) - ras.gray_min_x = 0; - - bit = ras.bTarget + ras.gray_min_x; - bit2 = bit + ras.gray_width; - - c1 = ras.gray_max_x - ras.gray_min_x; - - while ( c1 >= 0 ) - { - c2 = count[*bit] + count[*bit2]; - - if ( c2 ) - { - pix[0] = grays[(c2 >> 12) & 0x000F]; - pix[1] = grays[(c2 >> 8 ) & 0x000F]; - pix[2] = grays[(c2 >> 4 ) & 0x000F]; - pix[3] = grays[ c2 & 0x000F]; - - *bit = 0; - *bit2 = 0; - } - - bit++; - bit2++; - pix += 4; - c1--; - } - - if ( over ) - { - c2 = count[*bit] + count[*bit2]; - if ( c2 ) - { - switch ( last_bit ) - { - case 2: - pix[2] = grays[(c2 >> 4 ) & 0x000F]; - case 1: - pix[1] = grays[(c2 >> 8 ) & 0x000F]; - default: - pix[0] = grays[(c2 >> 12) & 0x000F]; - } - - *bit = 0; - *bit2 = 0; - } - } - } - - ras.traceOfs = 0; - ras.traceG += ras.traceIncr; - - ras.gray_min_x = 32000; - ras.gray_max_x = -32000; - } - } - - - static void - Horizontal_Gray_Sweep_Span( RAS_ARGS Short y, - FT_F26Dot6 x1, - FT_F26Dot6 x2, - PProfile left, - PProfile right ) - { - /* nothing, really */ - FT_UNUSED_RASTER; - FT_UNUSED( y ); - FT_UNUSED( x1 ); - FT_UNUSED( x2 ); - FT_UNUSED( left ); - FT_UNUSED( right ); - } - - - static void - Horizontal_Gray_Sweep_Drop( RAS_ARGS Short y, - FT_F26Dot6 x1, - FT_F26Dot6 x2, - PProfile left, - PProfile right ) - { - Long e1, e2; - PByte pixel; - Byte color; - - - /* During the horizontal sweep, we only take care of drop-outs */ - - e1 = CEILING( x1 ); - e2 = FLOOR ( x2 ); - - if ( e1 > e2 ) - { - Int dropOutControl = left->flags & 7; - - - if ( e1 == e2 + ras.precision ) - { - switch ( dropOutControl ) - { - case 0: /* simple drop-outs including stubs */ - e1 = e2; - break; - - case 4: /* smart drop-outs including stubs */ - e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); - break; - - case 1: /* simple drop-outs excluding stubs */ - case 5: /* smart drop-outs excluding stubs */ - /* see Vertical_Sweep_Drop for details */ - - /* rightmost stub test */ - if ( left->next == right && left->height <= 0 ) - return; - - /* leftmost stub test */ - if ( right->next == left && left->start == y ) - return; - - if ( dropOutControl == 1 ) - e1 = e2; - else - e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); - - break; - - default: /* modes 2, 3, 6, 7 */ - return; /* no drop-out control */ - } - } - else - return; - } - - if ( e1 >= 0 ) - { - if ( x2 - x1 >= ras.precision_half ) - color = ras.grays[2]; - else - color = ras.grays[1]; - - e1 = TRUNC( e1 ) / 2; - if ( e1 < ras.target.rows ) - { - pixel = ras.gTarget - e1 * ras.target.pitch + y / 2; - if ( ras.target.pitch > 0 ) - pixel += ( ras.target.rows - 1 ) * ras.target.pitch; - - if ( pixel[0] == ras.grays[0] ) - pixel[0] = color; - } - } - } - - -#endif /* FT_RASTER_OPTION_ANTI_ALIASING */ - - - /*************************************************************************/ - /* */ - /* Generic Sweep Drawing routine */ - /* */ - /*************************************************************************/ - - static Bool - Draw_Sweep( RAS_ARG ) - { - Short y, y_change, y_height; - - PProfile P, Q, P_Left, P_Right; - - Short min_Y, max_Y, top, bottom, dropouts; - - Long x1, x2, xs, e1, e2; - - TProfileList waiting; - TProfileList draw_left, draw_right; - - - /* initialize empty linked lists */ - - Init_Linked( &waiting ); - - Init_Linked( &draw_left ); - Init_Linked( &draw_right ); - - /* first, compute min and max Y */ - - P = ras.fProfile; - max_Y = (Short)TRUNC( ras.minY ); - min_Y = (Short)TRUNC( ras.maxY ); - - while ( P ) - { - Q = P->link; - - bottom = (Short)P->start; - top = (Short)( P->start + P->height - 1 ); - - if ( min_Y > bottom ) - min_Y = bottom; - if ( max_Y < top ) - max_Y = top; - - P->X = 0; - InsNew( &waiting, P ); - - P = Q; - } - - /* check the Y-turns */ - if ( ras.numTurns == 0 ) - { - ras.error = Raster_Err_Invalid; - return FAILURE; - } - - /* now initialize the sweep */ - - ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y ); - - /* then compute the distance of each profile from min_Y */ - - P = waiting; - - while ( P ) - { - P->countL = (UShort)( P->start - min_Y ); - P = P->link; - } - - /* let's go */ - - y = min_Y; - y_height = 0; - - if ( ras.numTurns > 0 && - ras.sizeBuff[-ras.numTurns] == min_Y ) - ras.numTurns--; - - while ( ras.numTurns > 0 ) - { - /* check waiting list for new activations */ - - P = waiting; - - while ( P ) - { - Q = P->link; - P->countL -= y_height; - if ( P->countL == 0 ) - { - DelOld( &waiting, P ); - - if ( P->flags & Flow_Up ) - InsNew( &draw_left, P ); - else - InsNew( &draw_right, P ); - } - - P = Q; - } - - /* sort the drawing lists */ - - Sort( &draw_left ); - Sort( &draw_right ); - - y_change = (Short)ras.sizeBuff[-ras.numTurns--]; - y_height = (Short)( y_change - y ); - - while ( y < y_change ) - { - /* let's trace */ - - dropouts = 0; - - P_Left = draw_left; - P_Right = draw_right; - - while ( P_Left ) - { - x1 = P_Left ->X; - x2 = P_Right->X; - - if ( x1 > x2 ) - { - xs = x1; - x1 = x2; - x2 = xs; - } - - e1 = FLOOR( x1 ); - e2 = CEILING( x2 ); - - if ( x2 - x1 <= ras.precision && - e1 != x1 && e2 != x2 ) - { - if ( e1 > e2 || e2 == e1 + ras.precision ) - { - Int dropOutControl = P_Left->flags & 7; - - - if ( dropOutControl != 2 ) - { - /* a drop-out was detected */ - - P_Left ->X = x1; - P_Right->X = x2; - - /* mark profile for drop-out processing */ - P_Left->countL = 1; - dropouts++; - } - - goto Skip_To_Next; - } - } - - ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right ); - - Skip_To_Next: - - P_Left = P_Left->link; - P_Right = P_Right->link; - } - - /* handle drop-outs _after_ the span drawing -- */ - /* drop-out processing has been moved out of the loop */ - /* for performance tuning */ - if ( dropouts > 0 ) - goto Scan_DropOuts; - - Next_Line: - - ras.Proc_Sweep_Step( RAS_VAR ); - - y++; - - if ( y < y_change ) - { - Sort( &draw_left ); - Sort( &draw_right ); - } - } - - /* now finalize the profiles that need it */ - - P = draw_left; - while ( P ) - { - Q = P->link; - if ( P->height == 0 ) - DelOld( &draw_left, P ); - P = Q; - } - - P = draw_right; - while ( P ) - { - Q = P->link; - if ( P->height == 0 ) - DelOld( &draw_right, P ); - P = Q; - } - } - - /* for gray-scaling, flush the bitmap scanline cache */ - while ( y <= max_Y ) - { - ras.Proc_Sweep_Step( RAS_VAR ); - y++; - } - - return SUCCESS; - - Scan_DropOuts: - - P_Left = draw_left; - P_Right = draw_right; - - while ( P_Left ) - { - if ( P_Left->countL ) - { - P_Left->countL = 0; -#if 0 - dropouts--; /* -- this is useful when debugging only */ -#endif - ras.Proc_Sweep_Drop( RAS_VARS y, - P_Left->X, - P_Right->X, - P_Left, - P_Right ); - } - - P_Left = P_Left->link; - P_Right = P_Right->link; - } - - goto Next_Line; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Render_Single_Pass */ - /* */ - /* <Description> */ - /* Perform one sweep with sub-banding. */ - /* */ - /* <Input> */ - /* flipped :: If set, flip the direction of the outline. */ - /* */ - /* <Return> */ - /* Renderer error code. */ - /* */ - static int - Render_Single_Pass( RAS_ARGS Bool flipped ) - { - Short i, j, k; - - - while ( ras.band_top >= 0 ) - { - ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision; - ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision; - - ras.top = ras.buff; - - ras.error = Raster_Err_None; - - if ( Convert_Glyph( RAS_VARS flipped ) ) - { - if ( ras.error != Raster_Err_Overflow ) - return FAILURE; - - ras.error = Raster_Err_None; - - /* sub-banding */ - -#ifdef DEBUG_RASTER - ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) ); -#endif - - i = ras.band_stack[ras.band_top].y_min; - j = ras.band_stack[ras.band_top].y_max; - - k = (Short)( ( i + j ) / 2 ); - - if ( ras.band_top >= 7 || k < i ) - { - ras.band_top = 0; - ras.error = Raster_Err_Invalid; - - return ras.error; - } - - ras.band_stack[ras.band_top + 1].y_min = k; - ras.band_stack[ras.band_top + 1].y_max = j; - - ras.band_stack[ras.band_top].y_max = (Short)( k - 1 ); - - ras.band_top++; - } - else - { - if ( ras.fProfile ) - if ( Draw_Sweep( RAS_VAR ) ) - return ras.error; - ras.band_top--; - } - } - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Render_Glyph */ - /* */ - /* <Description> */ - /* Render a glyph in a bitmap. Sub-banding if needed. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - Render_Glyph( RAS_ARG ) - { - FT_Error error; - - - Set_High_Precision( RAS_VARS ras.outline.flags & - FT_OUTLINE_HIGH_PRECISION ); - ras.scale_shift = ras.precision_shift; - - if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS ) - ras.dropOutControl = 2; - else - { - if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS ) - ras.dropOutControl = 4; - else - ras.dropOutControl = 0; - - if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) ) - ras.dropOutControl += 1; - } - - ras.second_pass = (FT_Byte)( !( ras.outline.flags & - FT_OUTLINE_SINGLE_PASS ) ); - - /* Vertical Sweep */ - ras.Proc_Sweep_Init = Vertical_Sweep_Init; - ras.Proc_Sweep_Span = Vertical_Sweep_Span; - ras.Proc_Sweep_Drop = Vertical_Sweep_Drop; - ras.Proc_Sweep_Step = Vertical_Sweep_Step; - - ras.band_top = 0; - ras.band_stack[0].y_min = 0; - ras.band_stack[0].y_max = (short)( ras.target.rows - 1 ); - - ras.bWidth = (unsigned short)ras.target.width; - ras.bTarget = (Byte*)ras.target.buffer; - - if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 ) - return error; - - /* Horizontal Sweep */ - if ( ras.second_pass && ras.dropOutControl != 2 ) - { - ras.Proc_Sweep_Init = Horizontal_Sweep_Init; - ras.Proc_Sweep_Span = Horizontal_Sweep_Span; - ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop; - ras.Proc_Sweep_Step = Horizontal_Sweep_Step; - - ras.band_top = 0; - ras.band_stack[0].y_min = 0; - ras.band_stack[0].y_max = (short)( ras.target.width - 1 ); - - if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 ) - return error; - } - - return Raster_Err_None; - } - - -#ifdef FT_RASTER_OPTION_ANTI_ALIASING - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Render_Gray_Glyph */ - /* */ - /* <Description> */ - /* Render a glyph with grayscaling. Sub-banding if needed. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - Render_Gray_Glyph( RAS_ARG ) - { - Long pixel_width; - FT_Error error; - - - Set_High_Precision( RAS_VARS ras.outline.flags & - FT_OUTLINE_HIGH_PRECISION ); - ras.scale_shift = ras.precision_shift + 1; - - if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS ) - ras.dropOutControl = 2; - else - { - if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS ) - ras.dropOutControl = 4; - else - ras.dropOutControl = 0; - - if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) ) - ras.dropOutControl += 1; - } - - ras.second_pass = !( ras.outline.flags & FT_OUTLINE_SINGLE_PASS ); - - /* Vertical Sweep */ - - ras.band_top = 0; - ras.band_stack[0].y_min = 0; - ras.band_stack[0].y_max = 2 * ras.target.rows - 1; - - ras.bWidth = ras.gray_width; - pixel_width = 2 * ( ( ras.target.width + 3 ) >> 2 ); - - if ( ras.bWidth > pixel_width ) - ras.bWidth = pixel_width; - - ras.bWidth = ras.bWidth * 8; - ras.bTarget = (Byte*)ras.gray_lines; - ras.gTarget = (Byte*)ras.target.buffer; - - ras.Proc_Sweep_Init = Vertical_Gray_Sweep_Init; - ras.Proc_Sweep_Span = Vertical_Sweep_Span; - ras.Proc_Sweep_Drop = Vertical_Sweep_Drop; - ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step; - - error = Render_Single_Pass( RAS_VARS 0 ); - if ( error ) - return error; - - /* Horizontal Sweep */ - if ( ras.second_pass && ras.dropOutControl != 2 ) - { - ras.Proc_Sweep_Init = Horizontal_Sweep_Init; - ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span; - ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop; - ras.Proc_Sweep_Step = Horizontal_Sweep_Step; - - ras.band_top = 0; - ras.band_stack[0].y_min = 0; - ras.band_stack[0].y_max = ras.target.width * 2 - 1; - - error = Render_Single_Pass( RAS_VARS 1 ); - if ( error ) - return error; - } - - return Raster_Err_None; - } - -#else /* !FT_RASTER_OPTION_ANTI_ALIASING */ - - FT_LOCAL_DEF( FT_Error ) - Render_Gray_Glyph( RAS_ARG ) - { - FT_UNUSED_RASTER; - - return Raster_Err_Unsupported; - } - -#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */ - - - static void - ft_black_init( PRaster raster ) - { -#ifdef FT_RASTER_OPTION_ANTI_ALIASING - FT_UInt n; - - - /* set default 5-levels gray palette */ - for ( n = 0; n < 5; n++ ) - raster->grays[n] = n * 255 / 4; - - raster->gray_width = RASTER_GRAY_LINES / 2; -#else - FT_UNUSED( raster ); -#endif - } - - - /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/ - /**** a static object. *****/ - - -#ifdef _STANDALONE_ - - - static int - ft_black_new( void* memory, - FT_Raster *araster ) - { - static TRaster the_raster; - - - *araster = (FT_Raster)&the_raster; - FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); - ft_black_init( &the_raster ); - - return 0; - } - - - static void - ft_black_done( FT_Raster raster ) - { - /* nothing */ - FT_UNUSED( raster ); - } - - -#else /* !_STANDALONE_ */ - - - static int - ft_black_new( FT_Memory memory, - PRaster *araster ) - { - FT_Error error; - PRaster raster = NULL; - - - *araster = 0; - if ( !FT_NEW( raster ) ) - { - raster->memory = memory; - ft_black_init( raster ); - - *araster = raster; - } - - return error; - } - - - static void - ft_black_done( PRaster raster ) - { - FT_Memory memory = (FT_Memory)raster->memory; - FT_FREE( raster ); - } - - -#endif /* !_STANDALONE_ */ - - - static void - ft_black_reset( PRaster raster, - char* pool_base, - long pool_size ) - { - if ( raster ) - { - if ( pool_base && pool_size >= (long)sizeof(TWorker) + 2048 ) - { - PWorker worker = (PWorker)pool_base; - - - raster->buffer = pool_base + ( ( sizeof ( *worker ) + 7 ) & ~7 ); - raster->buffer_size = pool_base + pool_size - (char*)raster->buffer; - raster->worker = worker; - } - else - { - raster->buffer = NULL; - raster->buffer_size = 0; - raster->worker = NULL; - } - } - } - - - static void - ft_black_set_mode( PRaster raster, - unsigned long mode, - const char* palette ) - { -#ifdef FT_RASTER_OPTION_ANTI_ALIASING - - if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) ) - { - /* set 5-levels gray palette */ - raster->grays[0] = palette[0]; - raster->grays[1] = palette[1]; - raster->grays[2] = palette[2]; - raster->grays[3] = palette[3]; - raster->grays[4] = palette[4]; - } - -#else - - FT_UNUSED( raster ); - FT_UNUSED( mode ); - FT_UNUSED( palette ); - -#endif - } - - - static int - ft_black_render( PRaster raster, - const FT_Raster_Params* params ) - { - const FT_Outline* outline = (const FT_Outline*)params->source; - const FT_Bitmap* target_map = params->target; - PWorker worker; - - - if ( !raster || !raster->buffer || !raster->buffer_size ) - return Raster_Err_Not_Ini; - - if ( !outline ) - return Raster_Err_Invalid; - - /* return immediately if the outline is empty */ - if ( outline->n_points == 0 || outline->n_contours <= 0 ) - return Raster_Err_None; - - if ( !outline->contours || !outline->points ) - return Raster_Err_Invalid; - - if ( outline->n_points != - outline->contours[outline->n_contours - 1] + 1 ) - return Raster_Err_Invalid; - - worker = raster->worker; - - /* this version of the raster does not support direct rendering, sorry */ - if ( params->flags & FT_RASTER_FLAG_DIRECT ) - return Raster_Err_Unsupported; - - if ( !target_map ) - return Raster_Err_Invalid; - - /* nothing to do */ - if ( !target_map->width || !target_map->rows ) - return Raster_Err_None; - - if ( !target_map->buffer ) - return Raster_Err_Invalid; - - ras.outline = *outline; - ras.target = *target_map; - - worker->buff = (PLong) raster->buffer; - worker->sizeBuff = worker->buff + - raster->buffer_size / sizeof ( Long ); -#ifdef FT_RASTER_OPTION_ANTI_ALIASING - worker->grays = raster->grays; - worker->gray_width = raster->gray_width; - - FT_MEM_ZERO( worker->gray_lines, worker->gray_width * 2 ); -#endif - - return ( params->flags & FT_RASTER_FLAG_AA ) - ? Render_Gray_Glyph( RAS_VAR ) - : Render_Glyph( RAS_VAR ); - } - - - FT_DEFINE_RASTER_FUNCS( ft_standard_raster, - FT_GLYPH_FORMAT_OUTLINE, - (FT_Raster_New_Func) ft_black_new, - (FT_Raster_Reset_Func) ft_black_reset, - (FT_Raster_Set_Mode_Func)ft_black_set_mode, - (FT_Raster_Render_Func) ft_black_render, - (FT_Raster_Done_Func) ft_black_done - ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/ftraster.h b/android/jni/ndk_modules/freetype/src/raster/ftraster.h deleted file mode 100644 index 80fe46de..00000000 --- a/android/jni/ndk_modules/freetype/src/raster/ftraster.h +++ /dev/null @@ -1,46 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftraster.h */ -/* */ -/* The FreeType glyph rasterizer (specification). */ -/* */ -/* Copyright 1996-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTRASTER_H__ -#define __FTRASTER_H__ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_IMAGE_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* Uncomment the following line if you are using ftraster.c as a */ - /* standalone module, fully independent of FreeType. */ - /* */ -/* #define _STANDALONE_ */ - - FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_standard_raster; - - -FT_END_HEADER - -#endif /* __FTRASTER_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/ftrend1.c b/android/jni/ndk_modules/freetype/src/raster/ftrend1.c deleted file mode 100644 index 1ed8af61..00000000 --- a/android/jni/ndk_modules/freetype/src/raster/ftrend1.c +++ /dev/null @@ -1,291 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftrend1.c */ -/* */ -/* The FreeType glyph rasterizer interface (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2005, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_OUTLINE_H -#include "ftrend1.h" -#include "ftraster.h" -#include "rastpic.h" - -#include "rasterrs.h" - - - /* initialize renderer -- init its raster */ - static FT_Error - ft_raster1_init( FT_Renderer render ) - { - FT_Library library = FT_MODULE_LIBRARY( render ); - - - render->clazz->raster_class->raster_reset( render->raster, - library->raster_pool, - library->raster_pool_size ); - - return Raster_Err_Ok; - } - - - /* set render-specific mode */ - static FT_Error - ft_raster1_set_mode( FT_Renderer render, - FT_ULong mode_tag, - FT_Pointer data ) - { - /* we simply pass it to the raster */ - return render->clazz->raster_class->raster_set_mode( render->raster, - mode_tag, - data ); - } - - - /* transform a given glyph image */ - static FT_Error - ft_raster1_transform( FT_Renderer render, - FT_GlyphSlot slot, - const FT_Matrix* matrix, - const FT_Vector* delta ) - { - FT_Error error = Raster_Err_Ok; - - - if ( slot->format != render->glyph_format ) - { - error = Raster_Err_Invalid_Argument; - goto Exit; - } - - if ( matrix ) - FT_Outline_Transform( &slot->outline, matrix ); - - if ( delta ) - FT_Outline_Translate( &slot->outline, delta->x, delta->y ); - - Exit: - return error; - } - - - /* return the glyph's control box */ - static void - ft_raster1_get_cbox( FT_Renderer render, - FT_GlyphSlot slot, - FT_BBox* cbox ) - { - FT_MEM_ZERO( cbox, sizeof ( *cbox ) ); - - if ( slot->format == render->glyph_format ) - FT_Outline_Get_CBox( &slot->outline, cbox ); - } - - - /* convert a slot's glyph image into a bitmap */ - static FT_Error - ft_raster1_render( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin ) - { - FT_Error error; - FT_Outline* outline; - FT_BBox cbox; - FT_UInt width, height, pitch; - FT_Bitmap* bitmap; - FT_Memory memory; - - FT_Raster_Params params; - - - /* check glyph image format */ - if ( slot->format != render->glyph_format ) - { - error = Raster_Err_Invalid_Argument; - goto Exit; - } - - /* check rendering mode */ -#ifndef FT_CONFIG_OPTION_PIC - if ( mode != FT_RENDER_MODE_MONO ) - { - /* raster1 is only capable of producing monochrome bitmaps */ - if ( render->clazz == &ft_raster1_renderer_class ) - return Raster_Err_Cannot_Render_Glyph; - } - else - { - /* raster5 is only capable of producing 5-gray-levels bitmaps */ - if ( render->clazz == &ft_raster5_renderer_class ) - return Raster_Err_Cannot_Render_Glyph; - } -#else /* FT_CONFIG_OPTION_PIC */ - /* When PIC is enabled, we cannot get to the class object */ - /* so instead we check the final character in the class name */ - /* ("raster5" or "raster1"). Yes this is a hack. */ - /* The "correct" thing to do is have different render function */ - /* for each of the classes. */ - if ( mode != FT_RENDER_MODE_MONO ) - { - /* raster1 is only capable of producing monochrome bitmaps */ - if ( render->clazz->root.module_name[6] == '1' ) - return Raster_Err_Cannot_Render_Glyph; - } - else - { - /* raster5 is only capable of producing 5-gray-levels bitmaps */ - if ( render->clazz->root.module_name[6] == '5' ) - return Raster_Err_Cannot_Render_Glyph; - } -#endif /* FT_CONFIG_OPTION_PIC */ - - outline = &slot->outline; - - /* translate the outline to the new origin if needed */ - if ( origin ) - FT_Outline_Translate( outline, origin->x, origin->y ); - - /* compute the control box, and grid fit it */ - FT_Outline_Get_CBox( outline, &cbox ); - - cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); - cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); - cbox.xMax = FT_PIX_CEIL( cbox.xMax ); - cbox.yMax = FT_PIX_CEIL( cbox.yMax ); - - width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); - height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); - bitmap = &slot->bitmap; - memory = render->root.memory; - - /* release old bitmap buffer */ - if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) - { - FT_FREE( bitmap->buffer ); - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; - } - - /* allocate new one, depends on pixel format */ - if ( !( mode & FT_RENDER_MODE_MONO ) ) - { - /* we pad to 32 bits, only for backwards compatibility with FT 1.x */ - pitch = FT_PAD_CEIL( width, 4 ); - bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; - bitmap->num_grays = 256; - } - else - { - pitch = ( ( width + 15 ) >> 4 ) << 1; - bitmap->pixel_mode = FT_PIXEL_MODE_MONO; - } - - bitmap->width = width; - bitmap->rows = height; - bitmap->pitch = pitch; - - if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) ) - goto Exit; - - slot->internal->flags |= FT_GLYPH_OWN_BITMAP; - - /* translate outline to render it into the bitmap */ - FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin ); - - /* set up parameters */ - params.target = bitmap; - params.source = outline; - params.flags = 0; - - if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY ) - params.flags |= FT_RASTER_FLAG_AA; - - /* render outline into the bitmap */ - error = render->raster_render( render->raster, ¶ms ); - - FT_Outline_Translate( outline, cbox.xMin, cbox.yMin ); - - if ( error ) - goto Exit; - - slot->format = FT_GLYPH_FORMAT_BITMAP; - slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 ); - slot->bitmap_top = (FT_Int)( cbox.yMax >> 6 ); - - Exit: - return error; - } - - - FT_DEFINE_RENDERER(ft_raster1_renderer_class, - - FT_MODULE_RENDERER, - sizeof( FT_RendererRec ), - - "raster1", - 0x10000L, - 0x20000L, - - 0, /* module specific interface */ - - (FT_Module_Constructor)ft_raster1_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Renderer_RenderFunc) ft_raster1_render, - (FT_Renderer_TransformFunc)ft_raster1_transform, - (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, - (FT_Renderer_SetModeFunc) ft_raster1_set_mode, - - (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET - ) - - - /* This renderer is _NOT_ part of the default modules; you will need */ - /* to register it by hand in your application. It should only be */ - /* used for backwards-compatibility with FT 1.x anyway. */ - /* */ - FT_DEFINE_RENDERER(ft_raster5_renderer_class, - - - FT_MODULE_RENDERER, - sizeof( FT_RendererRec ), - - "raster5", - 0x10000L, - 0x20000L, - - 0, /* module specific interface */ - - (FT_Module_Constructor)ft_raster1_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Renderer_RenderFunc) ft_raster1_render, - (FT_Renderer_TransformFunc)ft_raster1_transform, - (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, - (FT_Renderer_SetModeFunc) ft_raster1_set_mode, - - (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET - ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/ftrend1.h b/android/jni/ndk_modules/freetype/src/raster/ftrend1.h deleted file mode 100644 index 4cf12862..00000000 --- a/android/jni/ndk_modules/freetype/src/raster/ftrend1.h +++ /dev/null @@ -1,44 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftrend1.h */ -/* */ -/* The FreeType glyph rasterizer interface (specification). */ -/* */ -/* Copyright 1996-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTREND1_H__ -#define __FTREND1_H__ - - -#include <ft2build.h> -#include FT_RENDER_H - - -FT_BEGIN_HEADER - - - FT_DECLARE_RENDERER( ft_raster1_renderer_class ) - - /* this renderer is _NOT_ part of the default modules, you'll need */ - /* to register it by hand in your application. It should only be */ - /* used for backwards-compatibility with FT 1.x anyway. */ - /* */ - FT_DECLARE_RENDERER( ft_raster5_renderer_class ) - - -FT_END_HEADER - -#endif /* __FTREND1_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/raster.c b/android/jni/ndk_modules/freetype/src/raster/raster.c deleted file mode 100644 index 1202a116..00000000 --- a/android/jni/ndk_modules/freetype/src/raster/raster.c +++ /dev/null @@ -1,27 +0,0 @@ -/***************************************************************************/ -/* */ -/* raster.c */ -/* */ -/* FreeType monochrome rasterer module component (body only). */ -/* */ -/* Copyright 1996-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "rastpic.c" -#include "ftraster.c" -#include "ftrend1.c" - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/rasterrs.h b/android/jni/ndk_modules/freetype/src/raster/rasterrs.h deleted file mode 100644 index 5df9a7ab..00000000 --- a/android/jni/ndk_modules/freetype/src/raster/rasterrs.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* rasterrs.h */ -/* */ -/* monochrome renderer error codes (specification only). */ -/* */ -/* Copyright 2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the monochrome renderer error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __RASTERRS_H__ -#define __RASTERRS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#define FT_ERR_PREFIX Raster_Err_ -#define FT_ERR_BASE FT_Mod_Err_Raster - -#include FT_ERRORS_H - -#endif /* __RASTERRS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/rastpic.c b/android/jni/ndk_modules/freetype/src/raster/rastpic.c deleted file mode 100644 index e31c5497..00000000 --- a/android/jni/ndk_modules/freetype/src/raster/rastpic.c +++ /dev/null @@ -1,90 +0,0 @@ -/***************************************************************************/ -/* */ -/* rastpic.c */ -/* */ -/* The FreeType position independent code services for raster module. */ -/* */ -/* Copyright 2009, 2010 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "rastpic.h" - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from ftraster.c */ - void FT_Init_Class_ft_standard_raster(FT_Raster_Funcs*); - - void - ft_raster1_renderer_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - if ( pic_container->raster ) - { - RasterPIC* container = (RasterPIC*)pic_container->raster; - if(--container->ref_count) - return; - FT_FREE( container ); - pic_container->raster = NULL; - } - } - - - FT_Error - ft_raster1_renderer_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = Raster_Err_Ok; - RasterPIC* container; - FT_Memory memory = library->memory; - - - /* since this function also serve raster5 renderer, - it implements reference counting */ - if ( pic_container->raster ) - { - ((RasterPIC*)pic_container->raster)->ref_count++; - return error; - } - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof(*container) ); - pic_container->raster = container; - container->ref_count = 1; - - /* initialize pointer table - this is how the module usually expects this data */ - FT_Init_Class_ft_standard_raster(&container->ft_standard_raster); -/*Exit:*/ - if(error) - ft_raster1_renderer_class_pic_free(library); - return error; - } - - /* re-route these init and free functions to the above functions */ - FT_Error ft_raster5_renderer_class_pic_init(FT_Library library) - { - return ft_raster1_renderer_class_pic_init(library); - } - void ft_raster5_renderer_class_pic_free(FT_Library library) - { - ft_raster1_renderer_class_pic_free(library); - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/raster/rastpic.h b/android/jni/ndk_modules/freetype/src/raster/rastpic.h deleted file mode 100644 index dcd82b8c..00000000 --- a/android/jni/ndk_modules/freetype/src/raster/rastpic.h +++ /dev/null @@ -1,50 +0,0 @@ -/***************************************************************************/ -/* */ -/* rastpic.h */ -/* */ -/* The FreeType position independent code services for raster module. */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __RASTPIC_H__ -#define __RASTPIC_H__ - - -FT_BEGIN_HEADER - -#include FT_INTERNAL_PIC_H - -#ifndef FT_CONFIG_OPTION_PIC -#define FT_STANDARD_RASTER_GET ft_standard_raster - -#else /* FT_CONFIG_OPTION_PIC */ - - typedef struct RasterPIC_ - { - int ref_count; - FT_Raster_Funcs ft_standard_raster; - } RasterPIC; - -#define GET_PIC(lib) ((RasterPIC*)((lib)->pic_container.raster)) -#define FT_STANDARD_RASTER_GET (GET_PIC(library)->ft_standard_raster) - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* __RASTPIC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfdriver.c b/android/jni/ndk_modules/freetype/src/sfnt/sfdriver.c deleted file mode 100644 index b74679b3..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/sfdriver.c +++ /dev/null @@ -1,651 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfdriver.c */ -/* */ -/* High-level SFNT driver interface (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_OBJECTS_H - -#include "sfdriver.h" -#include "ttload.h" -#include "sfobjs.h" -#include "sfntpic.h" - -#include "sferrors.h" - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS -#include "ttsbit.h" -#endif - -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES -#include "ttpost.h" -#endif - -#ifdef TT_CONFIG_OPTION_BDF -#include "ttbdf.h" -#include FT_SERVICE_BDF_H -#endif - -#include "ttcmap.h" -#include "ttkern.h" -#include "ttmtx.h" - -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_TT_CMAP_H - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_sfdriver - - - /* - * SFNT TABLE SERVICE - * - */ - - static void* - get_sfnt_table( TT_Face face, - FT_Sfnt_Tag tag ) - { - void* table; - - - switch ( tag ) - { - case ft_sfnt_head: - table = &face->header; - break; - - case ft_sfnt_hhea: - table = &face->horizontal; - break; - - case ft_sfnt_vhea: - table = face->vertical_info ? &face->vertical : 0; - break; - - case ft_sfnt_os2: - table = face->os2.version == 0xFFFFU ? 0 : &face->os2; - break; - - case ft_sfnt_post: - table = &face->postscript; - break; - - case ft_sfnt_maxp: - table = &face->max_profile; - break; - - case ft_sfnt_pclt: - table = face->pclt.Version ? &face->pclt : 0; - break; - - default: - table = 0; - } - - return table; - } - - - static FT_Error - sfnt_table_info( TT_Face face, - FT_UInt idx, - FT_ULong *tag, - FT_ULong *offset, - FT_ULong *length ) - { - if ( !tag || !offset || !length ) - return SFNT_Err_Invalid_Argument; - - if ( idx >= face->num_tables ) - return SFNT_Err_Table_Missing; - - *tag = face->dir_tables[idx].Tag; - *offset = face->dir_tables[idx].Offset; - *length = face->dir_tables[idx].Length; - - return SFNT_Err_Ok; - } - - - FT_DEFINE_SERVICE_SFNT_TABLEREC(sfnt_service_sfnt_table, - (FT_SFNT_TableLoadFunc)tt_face_load_any, - (FT_SFNT_TableGetFunc) get_sfnt_table, - (FT_SFNT_TableInfoFunc)sfnt_table_info - ) - - -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - - /* - * GLYPH DICT SERVICE - * - */ - - static FT_Error - sfnt_get_glyph_name( TT_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ) - { - FT_String* gname; - FT_Error error; - - - error = tt_face_get_ps_name( face, glyph_index, &gname ); - if ( !error ) - FT_STRCPYN( buffer, gname, buffer_max ); - - return error; - } - - - static FT_UInt - sfnt_get_name_index( TT_Face face, - FT_String* glyph_name ) - { - FT_Face root = &face->root; - FT_UInt i, max_gid = FT_UINT_MAX; - - - if ( root->num_glyphs < 0 ) - return 0; - else if ( ( FT_ULong ) root->num_glyphs < FT_UINT_MAX ) - max_gid = ( FT_UInt ) root->num_glyphs; - else - FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n", - FT_UINT_MAX, root->num_glyphs )); - - for ( i = 0; i < max_gid; i++ ) - { - FT_String* gname; - FT_Error error = tt_face_get_ps_name( face, i, &gname ); - - - if ( error ) - continue; - - if ( !ft_strcmp( glyph_name, gname ) ) - return i; - } - - return 0; - } - - - FT_DEFINE_SERVICE_GLYPHDICTREC(sfnt_service_glyph_dict, - (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, - (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index - ) - -#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ - - - /* - * POSTSCRIPT NAME SERVICE - * - */ - - static const char* - sfnt_get_ps_name( TT_Face face ) - { - FT_Int n, found_win, found_apple; - const char* result = NULL; - - - /* shouldn't happen, but just in case to avoid memory leaks */ - if ( face->postscript_name ) - return face->postscript_name; - - /* scan the name table to see whether we have a Postscript name here, */ - /* either in Macintosh or Windows platform encodings */ - found_win = -1; - found_apple = -1; - - for ( n = 0; n < face->num_names; n++ ) - { - TT_NameEntryRec* name = face->name_table.names + n; - - - if ( name->nameID == 6 && name->stringLength > 0 ) - { - if ( name->platformID == 3 && - name->encodingID == 1 && - name->languageID == 0x409 ) - found_win = n; - - if ( name->platformID == 1 && - name->encodingID == 0 && - name->languageID == 0 ) - found_apple = n; - } - } - - if ( found_win != -1 ) - { - FT_Memory memory = face->root.memory; - TT_NameEntryRec* name = face->name_table.names + found_win; - FT_UInt len = name->stringLength / 2; - FT_Error error = SFNT_Err_Ok; - - FT_UNUSED( error ); - - - if ( !FT_ALLOC( result, name->stringLength + 1 ) ) - { - FT_Stream stream = face->name_table.stream; - FT_String* r = (FT_String*)result; - FT_Byte* p = (FT_Byte*)name->string; - - - if ( FT_STREAM_SEEK( name->stringOffset ) || - FT_FRAME_ENTER( name->stringLength ) ) - { - FT_FREE( result ); - name->stringLength = 0; - name->stringOffset = 0; - FT_FREE( name->string ); - - goto Exit; - } - - p = (FT_Byte*)stream->cursor; - - for ( ; len > 0; len--, p += 2 ) - { - if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 ) - *r++ = p[1]; - } - *r = '\0'; - - FT_FRAME_EXIT(); - } - goto Exit; - } - - if ( found_apple != -1 ) - { - FT_Memory memory = face->root.memory; - TT_NameEntryRec* name = face->name_table.names + found_apple; - FT_UInt len = name->stringLength; - FT_Error error = SFNT_Err_Ok; - - FT_UNUSED( error ); - - - if ( !FT_ALLOC( result, len + 1 ) ) - { - FT_Stream stream = face->name_table.stream; - - - if ( FT_STREAM_SEEK( name->stringOffset ) || - FT_STREAM_READ( result, len ) ) - { - name->stringOffset = 0; - name->stringLength = 0; - FT_FREE( name->string ); - FT_FREE( result ); - goto Exit; - } - ((char*)result)[len] = '\0'; - } - } - - Exit: - face->postscript_name = result; - return result; - } - - FT_DEFINE_SERVICE_PSFONTNAMEREC(sfnt_service_ps_name, - (FT_PsName_GetFunc)sfnt_get_ps_name - ) - - - /* - * TT CMAP INFO - */ - FT_DEFINE_SERVICE_TTCMAPSREC(tt_service_get_cmap_info, - (TT_CMap_Info_GetFunc)tt_get_cmap_info - ) - - -#ifdef TT_CONFIG_OPTION_BDF - - static FT_Error - sfnt_get_charset_id( TT_Face face, - const char* *acharset_encoding, - const char* *acharset_registry ) - { - BDF_PropertyRec encoding, registry; - FT_Error error; - - - /* XXX: I don't know whether this is correct, since - * tt_face_find_bdf_prop only returns something correct if we have - * previously selected a size that is listed in the BDF table. - * Should we change the BDF table format to include single offsets - * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'? - */ - error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", ®istry ); - if ( !error ) - { - error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding ); - if ( !error ) - { - if ( registry.type == BDF_PROPERTY_TYPE_ATOM && - encoding.type == BDF_PROPERTY_TYPE_ATOM ) - { - *acharset_encoding = encoding.u.atom; - *acharset_registry = registry.u.atom; - } - else - error = SFNT_Err_Invalid_Argument; - } - } - - return error; - } - - - FT_DEFINE_SERVICE_BDFRec(sfnt_service_bdf, - (FT_BDF_GetCharsetIdFunc) sfnt_get_charset_id, - (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop - ) - -#endif /* TT_CONFIG_OPTION_BDF */ - - - /* - * SERVICE LIST - */ - -#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF - FT_DEFINE_SERVICEDESCREC5(sfnt_services, - FT_SERVICE_ID_SFNT_TABLE, &FT_SFNT_SERVICE_SFNT_TABLE_GET, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET, - FT_SERVICE_ID_GLYPH_DICT, &FT_SFNT_SERVICE_GLYPH_DICT_GET, - FT_SERVICE_ID_BDF, &FT_SFNT_SERVICE_BDF_GET, - FT_SERVICE_ID_TT_CMAP, &FT_TT_SERVICE_GET_CMAP_INFO_GET - ) -#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES - FT_DEFINE_SERVICEDESCREC4(sfnt_services, - FT_SERVICE_ID_SFNT_TABLE, &FT_SFNT_SERVICE_SFNT_TABLE_GET, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET, - FT_SERVICE_ID_GLYPH_DICT, &FT_SFNT_SERVICE_GLYPH_DICT_GET, - FT_SERVICE_ID_TT_CMAP, &FT_TT_SERVICE_GET_CMAP_INFO_GET - ) -#elif defined TT_CONFIG_OPTION_BDF - FT_DEFINE_SERVICEDESCREC4(sfnt_services, - FT_SERVICE_ID_SFNT_TABLE, &FT_SFNT_SERVICE_SFNT_TABLE_GET, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET, - FT_SERVICE_ID_BDF, &FT_SFNT_SERVICE_BDF_GET, - FT_SERVICE_ID_TT_CMAP, &FT_TT_SERVICE_GET_CMAP_INFO_GET - ) -#else - FT_DEFINE_SERVICEDESCREC3(sfnt_services, - FT_SERVICE_ID_SFNT_TABLE, &FT_SFNT_SERVICE_SFNT_TABLE_GET, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET, - FT_SERVICE_ID_TT_CMAP, &FT_TT_SERVICE_GET_CMAP_INFO_GET - ) -#endif - - - FT_CALLBACK_DEF( FT_Module_Interface ) - sfnt_get_interface( FT_Module module, - const char* module_interface ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( FT_SFNT_SERVICES_GET, module_interface ); - } - - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - - FT_CALLBACK_DEF( FT_Error ) - tt_face_load_sfnt_header_stub( TT_Face face, - FT_Stream stream, - FT_Long face_index, - SFNT_Header header ) - { - FT_UNUSED( face ); - FT_UNUSED( stream ); - FT_UNUSED( face_index ); - FT_UNUSED( header ); - - return SFNT_Err_Unimplemented_Feature; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_face_load_directory_stub( TT_Face face, - FT_Stream stream, - SFNT_Header header ) - { - FT_UNUSED( face ); - FT_UNUSED( stream ); - FT_UNUSED( header ); - - return SFNT_Err_Unimplemented_Feature; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_face_load_hdmx_stub( TT_Face face, - FT_Stream stream ) - { - FT_UNUSED( face ); - FT_UNUSED( stream ); - - return SFNT_Err_Unimplemented_Feature; - } - - - FT_CALLBACK_DEF( void ) - tt_face_free_hdmx_stub( TT_Face face ) - { - FT_UNUSED( face ); - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_face_set_sbit_strike_stub( TT_Face face, - FT_UInt x_ppem, - FT_UInt y_ppem, - FT_ULong* astrike_index ) - { - /* - * We simply forge a FT_Size_Request and call the real function - * that does all the work. - * - * This stub might be called by libXfont in the X.Org Xserver, - * compiled against version 2.1.8 or newer. - */ - - FT_Size_RequestRec req; - - - req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; - req.width = (FT_F26Dot6)x_ppem; - req.height = (FT_F26Dot6)y_ppem; - req.horiResolution = 0; - req.vertResolution = 0; - - *astrike_index = 0x7FFFFFFFUL; - - return tt_face_set_sbit_strike( face, &req, astrike_index ); - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_face_load_sbit_stub( TT_Face face, - FT_Stream stream ) - { - FT_UNUSED( face ); - FT_UNUSED( stream ); - - /* - * This function was originally implemented to load the sbit table. - * However, it has been replaced by `tt_face_load_eblc', and this stub - * is only there for some rogue clients which would want to call it - * directly (which doesn't make much sense). - */ - return SFNT_Err_Unimplemented_Feature; - } - - - FT_CALLBACK_DEF( void ) - tt_face_free_sbit_stub( TT_Face face ) - { - /* nothing to do in this stub */ - FT_UNUSED( face ); - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_face_load_charmap_stub( TT_Face face, - void* cmap, - FT_Stream input ) - { - FT_UNUSED( face ); - FT_UNUSED( cmap ); - FT_UNUSED( input ); - - return SFNT_Err_Unimplemented_Feature; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_face_free_charmap_stub( TT_Face face, - void* cmap ) - { - FT_UNUSED( face ); - FT_UNUSED( cmap ); - - return SFNT_Err_Ok; - } - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS -#define PUT_EMBEDDED_BITMAPS(a) a -#else -#define PUT_EMBEDDED_BITMAPS(a) 0 -#endif -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES -#define PUT_PS_NAMES(a) a -#else -#define PUT_PS_NAMES(a) 0 -#endif - - FT_DEFINE_SFNT_INTERFACE(sfnt_interface, - tt_face_goto_table, - - sfnt_init_face, - sfnt_load_face, - sfnt_done_face, - sfnt_get_interface, - - tt_face_load_any, - - tt_face_load_sfnt_header_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - tt_face_load_directory_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - tt_face_load_head, - tt_face_load_hhea, - tt_face_load_cmap, - tt_face_load_maxp, - tt_face_load_os2, - tt_face_load_post, - - tt_face_load_name, - tt_face_free_name, - - tt_face_load_hdmx_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - tt_face_free_hdmx_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - tt_face_load_kern, - tt_face_load_gasp, - tt_face_load_pclt, - - /* see `ttload.h' */ - PUT_EMBEDDED_BITMAPS(tt_face_load_bhed), - - tt_face_set_sbit_strike_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - tt_face_load_sbit_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - tt_find_sbit_image, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - tt_load_sbit_metrics, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - PUT_EMBEDDED_BITMAPS(tt_face_load_sbit_image), - - tt_face_free_sbit_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - /* see `ttpost.h' */ - PUT_PS_NAMES(tt_face_get_ps_name), - PUT_PS_NAMES(tt_face_free_ps_names), - - tt_face_load_charmap_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - tt_face_free_charmap_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - /* since version 2.1.8 */ - - tt_face_get_kerning, - - /* since version 2.2 */ - - tt_face_load_font_dir, - tt_face_load_hmtx, - - /* see `ttsbit.h' and `sfnt.h' */ - PUT_EMBEDDED_BITMAPS(tt_face_load_eblc), - PUT_EMBEDDED_BITMAPS(tt_face_free_eblc), - - PUT_EMBEDDED_BITMAPS(tt_face_set_sbit_strike), - PUT_EMBEDDED_BITMAPS(tt_face_load_strike_metrics), - - tt_face_get_metrics - ) - - - FT_DEFINE_MODULE(sfnt_module_class, - - 0, /* not a font driver or renderer */ - sizeof( FT_ModuleRec ), - - "sfnt", /* driver name */ - 0x10000L, /* driver version 1.0 */ - 0x20000L, /* driver requires FreeType 2.0 or higher */ - - (const void*)&FT_SFNT_INTERFACE_GET, /* module specific interface */ - - (FT_Module_Constructor)0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) sfnt_get_interface - ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfdriver.h b/android/jni/ndk_modules/freetype/src/sfnt/sfdriver.h deleted file mode 100644 index 5de25d51..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/sfdriver.h +++ /dev/null @@ -1,38 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfdriver.h */ -/* */ -/* High-level SFNT driver interface (specification). */ -/* */ -/* Copyright 1996-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SFDRIVER_H__ -#define __SFDRIVER_H__ - - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - FT_DECLARE_MODULE( sfnt_module_class ) - - -FT_END_HEADER - -#endif /* __SFDRIVER_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sferrors.h b/android/jni/ndk_modules/freetype/src/sfnt/sferrors.h deleted file mode 100644 index 27f90de2..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/sferrors.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* sferrors.h */ -/* */ -/* SFNT error codes (specification only). */ -/* */ -/* Copyright 2001, 2004 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the SFNT error enumeration constants. */ - /* */ - /*************************************************************************/ - -#ifndef __SFERRORS_H__ -#define __SFERRORS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#define FT_ERR_PREFIX SFNT_Err_ -#define FT_ERR_BASE FT_Mod_Err_SFNT - -#define FT_KEEP_ERR_PREFIX - -#include FT_ERRORS_H - -#endif /* __SFERRORS_H__ */ - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfnt.c b/android/jni/ndk_modules/freetype/src/sfnt/sfnt.c deleted file mode 100644 index fc507b49..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/sfnt.c +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfnt.c */ -/* */ -/* Single object library component. */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "sfntpic.c" -#include "ttload.c" -#include "ttmtx.c" -#include "ttcmap.c" -#include "ttkern.c" -#include "sfobjs.c" -#include "sfdriver.c" - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS -#include "ttsbit.c" -#endif - -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES -#include "ttpost.c" -#endif - -#ifdef TT_CONFIG_OPTION_BDF -#include "ttbdf.c" -#endif - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfntpic.c b/android/jni/ndk_modules/freetype/src/sfnt/sfntpic.c deleted file mode 100644 index 53aca17b..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/sfntpic.c +++ /dev/null @@ -1,102 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfntpic.c */ -/* */ -/* The FreeType position independent code services for sfnt module. */ -/* */ -/* Copyright 2009, 2010 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "sfntpic.h" - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from sfdriver.c */ - FT_Error FT_Create_Class_sfnt_services( FT_Library, FT_ServiceDescRec**); - void FT_Destroy_Class_sfnt_services( FT_Library, FT_ServiceDescRec*); - void FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec*); - void FT_Init_Class_sfnt_interface( FT_Library, SFNT_Interface*); - void FT_Init_Class_sfnt_service_glyph_dict( FT_Library, FT_Service_GlyphDictRec*); - void FT_Init_Class_sfnt_service_ps_name( FT_Library, FT_Service_PsFontNameRec*); - void FT_Init_Class_tt_service_get_cmap_info( FT_Library, FT_Service_TTCMapsRec*); - void FT_Init_Class_sfnt_service_sfnt_table( FT_Service_SFNT_TableRec*); - - /* forward declaration of PIC init functions from ttcmap.c */ - FT_Error FT_Create_Class_tt_cmap_classes( FT_Library, TT_CMap_Class**); - void FT_Destroy_Class_tt_cmap_classes( FT_Library, TT_CMap_Class*); - - void - sfnt_module_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - if ( pic_container->sfnt ) - { - sfntModulePIC* container = (sfntModulePIC*)pic_container->sfnt; - if(container->sfnt_services) - FT_Destroy_Class_sfnt_services(library, container->sfnt_services); - container->sfnt_services = NULL; - if(container->tt_cmap_classes) - FT_Destroy_Class_tt_cmap_classes(library, container->tt_cmap_classes); - container->tt_cmap_classes = NULL; - FT_FREE( container ); - pic_container->sfnt = NULL; - } - } - - - FT_Error - sfnt_module_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = SFNT_Err_Ok; - sfntModulePIC* container; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof ( *container ) ); - pic_container->sfnt = container; - - /* initialize pointer table - this is how the module usually expects this data */ - error = FT_Create_Class_sfnt_services(library, &container->sfnt_services); - if(error) - goto Exit; - error = FT_Create_Class_tt_cmap_classes(library, &container->tt_cmap_classes); - if(error) - goto Exit; - FT_Init_Class_sfnt_service_glyph_dict(library, &container->sfnt_service_glyph_dict); - FT_Init_Class_sfnt_service_ps_name(library, &container->sfnt_service_ps_name); - FT_Init_Class_tt_service_get_cmap_info(library, &container->tt_service_get_cmap_info); - FT_Init_Class_sfnt_service_sfnt_table(&container->sfnt_service_sfnt_table); -#ifdef TT_CONFIG_OPTION_BDF - FT_Init_Class_sfnt_service_bdf(&container->sfnt_service_bdf); -#endif - FT_Init_Class_sfnt_interface(library, &container->sfnt_interface); - -Exit: - if(error) - sfnt_module_class_pic_free(library); - return error; - } - - - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfntpic.h b/android/jni/ndk_modules/freetype/src/sfnt/sfntpic.h deleted file mode 100644 index 6943b425..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/sfntpic.h +++ /dev/null @@ -1,88 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfntpic.h */ -/* */ -/* The FreeType position independent code services for sfnt module. */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SFNTPIC_H__ -#define __SFNTPIC_H__ - - -FT_BEGIN_HEADER - -#include FT_INTERNAL_PIC_H - - #ifndef FT_CONFIG_OPTION_PIC -#define FT_SFNT_SERVICES_GET sfnt_services -#define FT_SFNT_SERVICE_GLYPH_DICT_GET sfnt_service_glyph_dict -#define FT_SFNT_SERVICE_PS_NAME_GET sfnt_service_ps_name -#define FT_TT_SERVICE_GET_CMAP_INFO_GET tt_service_get_cmap_info -#define FT_SFNT_SERVICES_GET sfnt_services -#define FT_TT_CMAP_CLASSES_GET tt_cmap_classes -#define FT_SFNT_SERVICE_SFNT_TABLE_GET sfnt_service_sfnt_table -#define FT_SFNT_SERVICE_BDF_GET sfnt_service_bdf -#define FT_SFNT_INTERFACE_GET sfnt_interface - -#else /* FT_CONFIG_OPTION_PIC */ - -/* some include files required for members of sfntModulePIC */ -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_TT_CMAP_H -#ifdef TT_CONFIG_OPTION_BDF -#include "ttbdf.h" -#include FT_SERVICE_BDF_H -#endif -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include "ttcmap.h" - -typedef struct sfntModulePIC_ - { - FT_ServiceDescRec* sfnt_services; - FT_Service_GlyphDictRec sfnt_service_glyph_dict; - FT_Service_PsFontNameRec sfnt_service_ps_name; - FT_Service_TTCMapsRec tt_service_get_cmap_info; - TT_CMap_Class* tt_cmap_classes; - FT_Service_SFNT_TableRec sfnt_service_sfnt_table; -#ifdef TT_CONFIG_OPTION_BDF - FT_Service_BDFRec sfnt_service_bdf; -#endif - SFNT_Interface sfnt_interface; - } sfntModulePIC; - -#define GET_PIC(lib) ((sfntModulePIC*)((lib)->pic_container.sfnt)) -#define FT_SFNT_SERVICES_GET (GET_PIC(library)->sfnt_services) -#define FT_SFNT_SERVICE_GLYPH_DICT_GET (GET_PIC(library)->sfnt_service_glyph_dict) -#define FT_SFNT_SERVICE_PS_NAME_GET (GET_PIC(library)->sfnt_service_ps_name) -#define FT_TT_SERVICE_GET_CMAP_INFO_GET (GET_PIC(library)->tt_service_get_cmap_info) -#define FT_SFNT_SERVICES_GET (GET_PIC(library)->sfnt_services) -#define FT_TT_CMAP_CLASSES_GET (GET_PIC(library)->tt_cmap_classes) -#define FT_SFNT_SERVICE_SFNT_TABLE_GET (GET_PIC(library)->sfnt_service_sfnt_table) -#define FT_SFNT_SERVICE_BDF_GET (GET_PIC(library)->sfnt_service_bdf) -#define FT_SFNT_INTERFACE_GET (GET_PIC(library)->sfnt_interface) - -#endif /* FT_CONFIG_OPTION_PIC */ - -/* */ - -FT_END_HEADER - -#endif /* __SFNTPIC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfobjs.c b/android/jni/ndk_modules/freetype/src/sfnt/sfobjs.c deleted file mode 100644 index 6e35e2db..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/sfobjs.c +++ /dev/null @@ -1,1149 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfobjs.c */ -/* */ -/* SFNT object management (base). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include "sfobjs.h" -#include "ttload.h" -#include "ttcmap.h" -#include "ttkern.h" -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_DEBUG_H -#include FT_TRUETYPE_IDS_H -#include FT_TRUETYPE_TAGS_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_SFNT_NAMES_H -#include "sferrors.h" - -#ifdef TT_CONFIG_OPTION_BDF -#include "ttbdf.h" -#endif - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_sfobjs - - - - /* convert a UTF-16 name entry to ASCII */ - static FT_String* - tt_name_entry_ascii_from_utf16( TT_NameEntry entry, - FT_Memory memory ) - { - FT_String* string = NULL; - FT_UInt len, code, n; - FT_Byte* read = (FT_Byte*)entry->string; - FT_Error error; - - - len = (FT_UInt)entry->stringLength / 2; - - if ( FT_NEW_ARRAY( string, len + 1 ) ) - return NULL; - - for ( n = 0; n < len; n++ ) - { - code = FT_NEXT_USHORT( read ); - if ( code < 32 || code > 127 ) - code = '?'; - - string[n] = (char)code; - } - - string[len] = 0; - - return string; - } - - - /* convert an Apple Roman or symbol name entry to ASCII */ - static FT_String* - tt_name_entry_ascii_from_other( TT_NameEntry entry, - FT_Memory memory ) - { - FT_String* string = NULL; - FT_UInt len, code, n; - FT_Byte* read = (FT_Byte*)entry->string; - FT_Error error; - - - len = (FT_UInt)entry->stringLength; - - if ( FT_NEW_ARRAY( string, len + 1 ) ) - return NULL; - - for ( n = 0; n < len; n++ ) - { - code = *read++; - if ( code < 32 || code > 127 ) - code = '?'; - - string[n] = (char)code; - } - - string[len] = 0; - - return string; - } - - - typedef FT_String* (*TT_NameEntry_ConvertFunc)( TT_NameEntry entry, - FT_Memory memory ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_get_name */ - /* */ - /* <Description> */ - /* Returns a given ENGLISH name record in ASCII. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* nameid :: The name id of the name record to return. */ - /* */ - /* <InOut> */ - /* name :: The address of a string pointer. NULL if no name is */ - /* present. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - tt_face_get_name( TT_Face face, - FT_UShort nameid, - FT_String** name ) - { - FT_Memory memory = face->root.memory; - FT_Error error = SFNT_Err_Ok; - FT_String* result = NULL; - FT_UShort n; - TT_NameEntryRec* rec; - FT_Int found_apple = -1; - FT_Int found_apple_roman = -1; - FT_Int found_apple_english = -1; - FT_Int found_win = -1; - FT_Int found_unicode = -1; - - FT_Bool is_english = 0; - - TT_NameEntry_ConvertFunc convert; - - - FT_ASSERT( name ); - - rec = face->name_table.names; - for ( n = 0; n < face->num_names; n++, rec++ ) - { - /* According to the OpenType 1.3 specification, only Microsoft or */ - /* Apple platform IDs might be used in the `name' table. The */ - /* `Unicode' platform is reserved for the `cmap' table, and the */ - /* `ISO' one is deprecated. */ - /* */ - /* However, the Apple TrueType specification doesn't say the same */ - /* thing and goes to suggest that all Unicode `name' table entries */ - /* should be coded in UTF-16 (in big-endian format I suppose). */ - /* */ - if ( rec->nameID == nameid && rec->stringLength > 0 ) - { - switch ( rec->platformID ) - { - case TT_PLATFORM_APPLE_UNICODE: - case TT_PLATFORM_ISO: - /* there is `languageID' to check there. We should use this */ - /* field only as a last solution when nothing else is */ - /* available. */ - /* */ - found_unicode = n; - break; - - case TT_PLATFORM_MACINTOSH: - /* This is a bit special because some fonts will use either */ - /* an English language id, or a Roman encoding id, to indicate */ - /* the English version of its font name. */ - /* */ - if ( rec->languageID == TT_MAC_LANGID_ENGLISH ) - found_apple_english = n; - else if ( rec->encodingID == TT_MAC_ID_ROMAN ) - found_apple_roman = n; - break; - - case TT_PLATFORM_MICROSOFT: - /* we only take a non-English name when there is nothing */ - /* else available in the font */ - /* */ - if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 ) - { - switch ( rec->encodingID ) - { - case TT_MS_ID_SYMBOL_CS: - case TT_MS_ID_UNICODE_CS: - case TT_MS_ID_UCS_4: - is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 ); - found_win = n; - break; - - default: - ; - } - } - break; - - default: - ; - } - } - } - - found_apple = found_apple_roman; - if ( found_apple_english >= 0 ) - found_apple = found_apple_english; - - /* some fonts contain invalid Unicode or Macintosh formatted entries; */ - /* we will thus favor names encoded in Windows formats if available */ - /* (provided it is an English name) */ - /* */ - convert = NULL; - if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) ) - { - rec = face->name_table.names + found_win; - switch ( rec->encodingID ) - { - /* all Unicode strings are encoded using UTF-16BE */ - case TT_MS_ID_UNICODE_CS: - case TT_MS_ID_SYMBOL_CS: - convert = tt_name_entry_ascii_from_utf16; - break; - - case TT_MS_ID_UCS_4: - /* Apparently, if this value is found in a name table entry, it is */ - /* documented as `full Unicode repertoire'. Experience with the */ - /* MsGothic font shipped with Windows Vista shows that this really */ - /* means UTF-16 encoded names (UCS-4 values are only used within */ - /* charmaps). */ - convert = tt_name_entry_ascii_from_utf16; - break; - - default: - ; - } - } - else if ( found_apple >= 0 ) - { - rec = face->name_table.names + found_apple; - convert = tt_name_entry_ascii_from_other; - } - else if ( found_unicode >= 0 ) - { - rec = face->name_table.names + found_unicode; - convert = tt_name_entry_ascii_from_utf16; - } - - if ( rec && convert ) - { - if ( rec->string == NULL ) - { - FT_Stream stream = face->name_table.stream; - - - if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) || - FT_STREAM_SEEK( rec->stringOffset ) || - FT_STREAM_READ( rec->string, rec->stringLength ) ) - { - FT_FREE( rec->string ); - rec->stringLength = 0; - result = NULL; - goto Exit; - } - } - - result = convert( rec, memory ); - } - - Exit: - *name = result; - return error; - } - - - static FT_Encoding - sfnt_find_encoding( int platform_id, - int encoding_id ) - { - typedef struct TEncoding_ - { - int platform_id; - int encoding_id; - FT_Encoding encoding; - - } TEncoding; - - static - const TEncoding tt_encodings[] = - { - { TT_PLATFORM_ISO, -1, FT_ENCODING_UNICODE }, - - { TT_PLATFORM_APPLE_UNICODE, -1, FT_ENCODING_UNICODE }, - - { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, FT_ENCODING_APPLE_ROMAN }, - - { TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, FT_ENCODING_MS_SYMBOL }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, FT_ENCODING_UNICODE }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, FT_ENCODING_SJIS }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, FT_ENCODING_GB2312 }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, FT_ENCODING_BIG5 }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, FT_ENCODING_WANSUNG }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, FT_ENCODING_JOHAB } - }; - - const TEncoding *cur, *limit; - - - cur = tt_encodings; - limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] ); - - for ( ; cur < limit; cur++ ) - { - if ( cur->platform_id == platform_id ) - { - if ( cur->encoding_id == encoding_id || - cur->encoding_id == -1 ) - return cur->encoding; - } - } - - return FT_ENCODING_NONE; - } - - - /* Fill in face->ttc_header. If the font is not a TTC, it is */ - /* synthesized into a TTC with one offset table. */ - static FT_Error - sfnt_open_font( FT_Stream stream, - TT_Face face ) - { - FT_Memory memory = stream->memory; - FT_Error error; - FT_ULong tag, offset; - - static const FT_Frame_Field ttc_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TTC_HeaderRec - - FT_FRAME_START( 8 ), - FT_FRAME_LONG( version ), - FT_FRAME_LONG( count ), - FT_FRAME_END - }; - - - face->ttc_header.tag = 0; - face->ttc_header.version = 0; - face->ttc_header.count = 0; - - offset = FT_STREAM_POS(); - - if ( FT_READ_ULONG( tag ) ) - return error; - - if ( tag != 0x00010000UL && - tag != TTAG_ttcf && - tag != TTAG_OTTO && - tag != TTAG_true && - tag != TTAG_typ1 && - tag != 0x00020000UL ) - return SFNT_Err_Unknown_File_Format; - - face->ttc_header.tag = TTAG_ttcf; - - if ( tag == TTAG_ttcf ) - { - FT_Int n; - - - FT_TRACE3(( "sfnt_open_font: file is a collection\n" )); - - if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) ) - return error; - - /* now read the offsets of each font in the file */ - if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) ) - return error; - - if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) ) - return error; - - for ( n = 0; n < face->ttc_header.count; n++ ) - face->ttc_header.offsets[n] = FT_GET_ULONG(); - - FT_FRAME_EXIT(); - } - else - { - FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" )); - - face->ttc_header.version = 1 << 16; - face->ttc_header.count = 1; - - if ( FT_NEW( face->ttc_header.offsets ) ) - return error; - - face->ttc_header.offsets[0] = offset; - } - - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - sfnt_init_face( FT_Stream stream, - TT_Face face, - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ) - { - FT_Error error; - FT_Library library = face->root.driver->root.library; - SFNT_Service sfnt; - - - /* for now, parameters are unused */ - FT_UNUSED( num_params ); - FT_UNUSED( params ); - - - sfnt = (SFNT_Service)face->sfnt; - if ( !sfnt ) - { - sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); - if ( !sfnt ) - return SFNT_Err_Invalid_File_Format; - - face->sfnt = sfnt; - face->goto_table = sfnt->goto_table; - } - - FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS ); - - error = sfnt_open_font( stream, face ); - if ( error ) - return error; - - FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index )); - - if ( face_index < 0 ) - face_index = 0; - - if ( face_index >= face->ttc_header.count ) - return SFNT_Err_Invalid_Argument; - - if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) ) - return error; - - /* check that we have a valid TrueType file */ - error = sfnt->load_font_dir( face, stream ); - if ( error ) - return error; - - face->root.num_faces = face->ttc_header.count; - face->root.face_index = face_index; - - return error; - } - - -#define LOAD_( x ) \ - do { \ - FT_TRACE2(( "`" #x "' " )); \ - FT_TRACE3(( "-->\n" )); \ - \ - error = sfnt->load_##x( face, stream ); \ - \ - FT_TRACE2(( "%s\n", ( !error ) \ - ? "loaded" \ - : ( error == SFNT_Err_Table_Missing ) \ - ? "missing" \ - : "failed to load" )); \ - FT_TRACE3(( "\n" )); \ - } while ( 0 ) - -#define LOADM_( x, vertical ) \ - do { \ - FT_TRACE2(( "`%s" #x "' ", \ - vertical ? "vertical " : "" )); \ - FT_TRACE3(( "-->\n" )); \ - \ - error = sfnt->load_##x( face, stream, vertical ); \ - \ - FT_TRACE2(( "%s\n", ( !error ) \ - ? "loaded" \ - : ( error == SFNT_Err_Table_Missing ) \ - ? "missing" \ - : "failed to load" )); \ - FT_TRACE3(( "\n" )); \ - } while ( 0 ) - -#define GET_NAME( id, field ) \ - do { \ - error = tt_face_get_name( face, TT_NAME_ID_##id, field ); \ - if ( error ) \ - goto Exit; \ - } while ( 0 ) - - - FT_LOCAL_DEF( FT_Error ) - sfnt_load_face( FT_Stream stream, - TT_Face face, - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ) - { - FT_Error error; -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - FT_Error psnames_error; -#endif - FT_Bool has_outline; - FT_Bool is_apple_sbit; - FT_Bool ignore_preferred_family = FALSE; - FT_Bool ignore_preferred_subfamily = FALSE; - - SFNT_Service sfnt = (SFNT_Service)face->sfnt; - - FT_UNUSED( face_index ); - - /* Check parameters */ - - { - FT_Int i; - - - for ( i = 0; i < num_params; i++ ) - { - if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY ) - ignore_preferred_family = TRUE; - else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY ) - ignore_preferred_subfamily = TRUE; - } - } - - /* Load tables */ - - /* We now support two SFNT-based bitmapped font formats. They */ - /* are recognized easily as they do not include a `glyf' */ - /* table. */ - /* */ - /* The first format comes from Apple, and uses a table named */ - /* `bhed' instead of `head' to store the font header (using */ - /* the same format). It also doesn't include horizontal and */ - /* vertical metrics tables (i.e. `hhea' and `vhea' tables are */ - /* missing). */ - /* */ - /* The other format comes from Microsoft, and is used with */ - /* WinCE/PocketPC. It looks like a standard TTF, except that */ - /* it doesn't contain outlines. */ - /* */ - - FT_TRACE2(( "sfnt_load_face: %08p\n\n", face )); - - /* do we have outlines in there? */ -#ifdef FT_CONFIG_OPTION_INCREMENTAL - has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 || - tt_face_lookup_table( face, TTAG_glyf ) != 0 || - tt_face_lookup_table( face, TTAG_CFF ) != 0 ); -#else - has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 || - tt_face_lookup_table( face, TTAG_CFF ) != 0 ); -#endif - - is_apple_sbit = 0; - - /* if this font doesn't contain outlines, we try to load */ - /* a `bhed' table */ - if ( !has_outline && sfnt->load_bhed ) - { - LOAD_( bhed ); - is_apple_sbit = FT_BOOL( !error ); - } - - /* load the font header (`head' table) if this isn't an Apple */ - /* sbit font file */ - if ( !is_apple_sbit ) - { - LOAD_( head ); - if ( error ) - goto Exit; - } - - if ( face->header.Units_Per_EM == 0 ) - { - error = SFNT_Err_Invalid_Table; - - goto Exit; - } - - /* the following tables are often not present in embedded TrueType */ - /* fonts within PDF documents, so don't check for them. */ - LOAD_( maxp ); - LOAD_( cmap ); - - /* the following tables are optional in PCL fonts -- */ - /* don't check for errors */ - LOAD_( name ); - LOAD_( post ); - -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - psnames_error = error; -#endif - - /* do not load the metrics headers and tables if this is an Apple */ - /* sbit font file */ - if ( !is_apple_sbit ) - { - /* load the `hhea' and `hmtx' tables */ - LOADM_( hhea, 0 ); - if ( !error ) - { - LOADM_( hmtx, 0 ); - if ( error == SFNT_Err_Table_Missing ) - { - error = SFNT_Err_Hmtx_Table_Missing; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* If this is an incrementally loaded font and there are */ - /* overriding metrics, tolerate a missing `hmtx' table. */ - if ( face->root.internal->incremental_interface && - face->root.internal->incremental_interface->funcs-> - get_glyph_metrics ) - { - face->horizontal.number_Of_HMetrics = 0; - error = SFNT_Err_Ok; - } -#endif - } - } - else if ( error == SFNT_Err_Table_Missing ) - { - /* No `hhea' table necessary for SFNT Mac fonts. */ - if ( face->format_tag == TTAG_true ) - { - FT_TRACE2(( "This is an SFNT Mac font.\n" )); - has_outline = 0; - error = SFNT_Err_Ok; - } - else - { - error = SFNT_Err_Horiz_Header_Missing; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* If this is an incrementally loaded font and there are */ - /* overriding metrics, tolerate a missing `hhea' table. */ - if ( face->root.internal->incremental_interface && - face->root.internal->incremental_interface->funcs-> - get_glyph_metrics ) - { - face->horizontal.number_Of_HMetrics = 0; - error = SFNT_Err_Ok; - } -#endif - - } - } - - if ( error ) - goto Exit; - - /* try to load the `vhea' and `vmtx' tables */ - LOADM_( hhea, 1 ); - if ( !error ) - { - LOADM_( hmtx, 1 ); - if ( !error ) - face->vertical_info = 1; - } - - if ( error && error != SFNT_Err_Table_Missing ) - goto Exit; - - LOAD_( os2 ); - if ( error ) - { - if ( error != SFNT_Err_Table_Missing ) - goto Exit; - - face->os2.version = 0xFFFFU; - } - } - - /* the optional tables */ - - /* embedded bitmap support */ - if ( sfnt->load_eblc ) - { - LOAD_( eblc ); - if ( error ) - { - /* a font which contains neither bitmaps nor outlines is */ - /* still valid (although rather useless in most cases); */ - /* however, you can find such stripped fonts in PDFs */ - if ( error == SFNT_Err_Table_Missing ) - error = SFNT_Err_Ok; - else - goto Exit; - } - } - - LOAD_( pclt ); - if ( error ) - { - if ( error != SFNT_Err_Table_Missing ) - goto Exit; - - face->pclt.Version = 0; - } - - /* consider the kerning and gasp tables as optional */ - LOAD_( gasp ); - LOAD_( kern ); - - face->root.num_glyphs = face->max_profile.numGlyphs; - - /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes */ - /* a WWS-only font face. `WWS' stands for `weight', width', and */ - /* `slope', a term used by Microsoft's Windows Presentation */ - /* Foundation (WPF). This flag has been introduced in version */ - /* 1.5 of the OpenType specification (May 2008). */ - - face->root.family_name = NULL; - face->root.style_name = NULL; - if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 ) - { - if ( !ignore_preferred_family ) - GET_NAME( PREFERRED_FAMILY, &face->root.family_name ); - if ( !face->root.family_name ) - GET_NAME( FONT_FAMILY, &face->root.family_name ); - - if ( !ignore_preferred_subfamily ) - GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name ); - if ( !face->root.style_name ) - GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); - } - else - { - GET_NAME( WWS_FAMILY, &face->root.family_name ); - if ( !face->root.family_name && !ignore_preferred_family ) - GET_NAME( PREFERRED_FAMILY, &face->root.family_name ); - if ( !face->root.family_name ) - GET_NAME( FONT_FAMILY, &face->root.family_name ); - - GET_NAME( WWS_SUBFAMILY, &face->root.style_name ); - if ( !face->root.style_name && !ignore_preferred_subfamily ) - GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name ); - if ( !face->root.style_name ) - GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); - } - - /* now set up root fields */ - { - FT_Face root = &face->root; - FT_Long flags = root->face_flags; - - - /*********************************************************************/ - /* */ - /* Compute face flags. */ - /* */ - if ( has_outline == TRUE ) - flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */ - - /* The sfnt driver only supports bitmap fonts natively, thus we */ - /* don't set FT_FACE_FLAG_HINTER. */ - flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */ - FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ - -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - if ( psnames_error == SFNT_Err_Ok && - face->postscript.FormatType != 0x00030000L ) - flags |= FT_FACE_FLAG_GLYPH_NAMES; -#endif - - /* fixed width font? */ - if ( face->postscript.isFixedPitch ) - flags |= FT_FACE_FLAG_FIXED_WIDTH; - - /* vertical information? */ - if ( face->vertical_info ) - flags |= FT_FACE_FLAG_VERTICAL; - - /* kerning available ? */ - if ( TT_FACE_HAS_KERNING( face ) ) - flags |= FT_FACE_FLAG_KERNING; - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - /* Don't bother to load the tables unless somebody asks for them. */ - /* No need to do work which will (probably) not be used. */ - if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 && - tt_face_lookup_table( face, TTAG_fvar ) != 0 && - tt_face_lookup_table( face, TTAG_gvar ) != 0 ) - flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; -#endif - - root->face_flags = flags; - - /*********************************************************************/ - /* */ - /* Compute style flags. */ - /* */ - - flags = 0; - if ( has_outline == TRUE && face->os2.version != 0xFFFFU ) - { - /* We have an OS/2 table; use the `fsSelection' field. Bit 9 */ - /* indicates an oblique font face. This flag has been */ - /* introduced in version 1.5 of the OpenType specification. */ - - if ( face->os2.fsSelection & 512 ) /* bit 9 */ - flags |= FT_STYLE_FLAG_ITALIC; - else if ( face->os2.fsSelection & 1 ) /* bit 0 */ - flags |= FT_STYLE_FLAG_ITALIC; - - if ( face->os2.fsSelection & 32 ) /* bit 5 */ - flags |= FT_STYLE_FLAG_BOLD; - } - else - { - /* this is an old Mac font, use the header field */ - - if ( face->header.Mac_Style & 1 ) - flags |= FT_STYLE_FLAG_BOLD; - - if ( face->header.Mac_Style & 2 ) - flags |= FT_STYLE_FLAG_ITALIC; - } - - root->style_flags = flags; - - /*********************************************************************/ - /* */ - /* Polish the charmaps. */ - /* */ - /* Try to set the charmap encoding according to the platform & */ - /* encoding ID of each charmap. */ - /* */ - - tt_face_build_cmaps( face ); /* ignore errors */ - - - /* set the encoding fields */ - { - FT_Int m; - - - for ( m = 0; m < root->num_charmaps; m++ ) - { - FT_CharMap charmap = root->charmaps[m]; - - - charmap->encoding = sfnt_find_encoding( charmap->platform_id, - charmap->encoding_id ); - -#if 0 - if ( root->charmap == NULL && - charmap->encoding == FT_ENCODING_UNICODE ) - { - /* set 'root->charmap' to the first Unicode encoding we find */ - root->charmap = charmap; - } -#endif - } - } - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - /* - * Now allocate the root array of FT_Bitmap_Size records and - * populate them. Unfortunately, it isn't possible to indicate bit - * depths in the FT_Bitmap_Size record. This is a design error. - */ - { - FT_UInt i, count; - - -#ifndef FT_CONFIG_OPTION_OLD_INTERNALS - count = face->sbit_num_strikes; -#else - count = (FT_UInt)face->num_sbit_strikes; -#endif - - if ( count > 0 ) - { - FT_Memory memory = face->root.stream->memory; - FT_UShort em_size = face->header.Units_Per_EM; - FT_Short avgwidth = face->os2.xAvgCharWidth; - FT_Size_Metrics metrics; - - - if ( em_size == 0 || face->os2.version == 0xFFFFU ) - { - avgwidth = 0; - em_size = 1; - } - - if ( FT_NEW_ARRAY( root->available_sizes, count ) ) - goto Exit; - - for ( i = 0; i < count; i++ ) - { - FT_Bitmap_Size* bsize = root->available_sizes + i; - - - error = sfnt->load_strike_metrics( face, i, &metrics ); - if ( error ) - goto Exit; - - bsize->height = (FT_Short)( metrics.height >> 6 ); - bsize->width = (FT_Short)( - ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size ); - - bsize->x_ppem = metrics.x_ppem << 6; - bsize->y_ppem = metrics.y_ppem << 6; - - /* assume 72dpi */ - bsize->size = metrics.y_ppem << 6; - } - - root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; - root->num_fixed_sizes = (FT_Int)count; - } - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - /* a font with no bitmaps and no outlines is scalable; */ - /* it has only empty glyphs then */ - if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) ) - root->face_flags |= FT_FACE_FLAG_SCALABLE; - - - /*********************************************************************/ - /* */ - /* Set up metrics. */ - /* */ - if ( FT_IS_SCALABLE( root ) ) - { - /* XXX What about if outline header is missing */ - /* (e.g. sfnt wrapped bitmap)? */ - root->bbox.xMin = face->header.xMin; - root->bbox.yMin = face->header.yMin; - root->bbox.xMax = face->header.xMax; - root->bbox.yMax = face->header.yMax; - root->units_per_EM = face->header.Units_Per_EM; - - - /* XXX: Computing the ascender/descender/height is very different */ - /* from what the specification tells you. Apparently, we */ - /* must be careful because */ - /* */ - /* - not all fonts have an OS/2 table; in this case, we take */ - /* the values in the horizontal header. However, these */ - /* values very often are not reliable. */ - /* */ - /* - otherwise, the correct typographic values are in the */ - /* sTypoAscender, sTypoDescender & sTypoLineGap fields. */ - /* */ - /* However, certain fonts have these fields set to 0. */ - /* Rather, they have usWinAscent & usWinDescent correctly */ - /* set (but with different values). */ - /* */ - /* As an example, Arial Narrow is implemented through four */ - /* files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */ - /* */ - /* Strangely, all fonts have the same values in their */ - /* sTypoXXX fields, except ARIALNB which sets them to 0. */ - /* */ - /* On the other hand, they all have different */ - /* usWinAscent/Descent values -- as a conclusion, the OS/2 */ - /* table cannot be used to compute the text height reliably! */ - /* */ - - /* The ascender/descender/height are computed from the OS/2 table */ - /* when found. Otherwise, they're taken from the horizontal */ - /* header. */ - /* */ - - root->ascender = face->horizontal.Ascender; - root->descender = face->horizontal.Descender; - - root->height = (FT_Short)( root->ascender - root->descender + - face->horizontal.Line_Gap ); - -#if 0 - /* if the line_gap is 0, we add an extra 15% to the text height -- */ - /* this computation is based on various versions of Times New Roman */ - if ( face->horizontal.Line_Gap == 0 ) - root->height = (FT_Short)( ( root->height * 115 + 50 ) / 100 ); -#endif /* 0 */ - -#if 0 - /* some fonts have the OS/2 "sTypoAscender", "sTypoDescender" & */ - /* "sTypoLineGap" fields set to 0, like ARIALNB.TTF */ - if ( face->os2.version != 0xFFFFU && root->ascender ) - { - FT_Int height; - - - root->ascender = face->os2.sTypoAscender; - root->descender = -face->os2.sTypoDescender; - - height = root->ascender + root->descender + face->os2.sTypoLineGap; - if ( height > root->height ) - root->height = height; - } -#endif /* 0 */ - - root->max_advance_width = face->horizontal.advance_Width_Max; - root->max_advance_height = (FT_Short)( face->vertical_info - ? face->vertical.advance_Height_Max - : root->height ); - - /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */ - /* Adjust underline position from top edge to centre of */ - /* stroke to convert TrueType meaning to FreeType meaning. */ - root->underline_position = face->postscript.underlinePosition - - face->postscript.underlineThickness / 2; - root->underline_thickness = face->postscript.underlineThickness; - } - - } - - Exit: - FT_TRACE2(( "sfnt_load_face: done\n" )); - - return error; - } - - -#undef LOAD_ -#undef LOADM_ -#undef GET_NAME - - - FT_LOCAL_DEF( void ) - sfnt_done_face( TT_Face face ) - { - FT_Memory memory; - SFNT_Service sfnt; - - - if ( !face ) - return; - - memory = face->root.memory; - sfnt = (SFNT_Service)face->sfnt; - - if ( sfnt ) - { - /* destroy the postscript names table if it is loaded */ - if ( sfnt->free_psnames ) - sfnt->free_psnames( face ); - - /* destroy the embedded bitmaps table if it is loaded */ - if ( sfnt->free_eblc ) - sfnt->free_eblc( face ); - } - -#ifdef TT_CONFIG_OPTION_BDF - /* freeing the embedded BDF properties */ - tt_face_free_bdf_props( face ); -#endif - - /* freeing the kerning table */ - tt_face_done_kern( face ); - - /* freeing the collection table */ - FT_FREE( face->ttc_header.offsets ); - face->ttc_header.count = 0; - - /* freeing table directory */ - FT_FREE( face->dir_tables ); - face->num_tables = 0; - - { - FT_Stream stream = FT_FACE_STREAM( face ); - - - /* simply release the 'cmap' table frame */ - FT_FRAME_RELEASE( face->cmap_table ); - face->cmap_size = 0; - } - - /* freeing the horizontal metrics */ -#ifndef FT_CONFIG_OPTION_OLD_INTERNALS - { - FT_Stream stream = FT_FACE_STREAM( face ); - - - FT_FRAME_RELEASE( face->horz_metrics ); - FT_FRAME_RELEASE( face->vert_metrics ); - face->horz_metrics_size = 0; - face->vert_metrics_size = 0; - } -#else - FT_FREE( face->horizontal.long_metrics ); - FT_FREE( face->horizontal.short_metrics ); -#endif - - /* freeing the vertical ones, if any */ - if ( face->vertical_info ) - { - FT_FREE( face->vertical.long_metrics ); - FT_FREE( face->vertical.short_metrics ); - face->vertical_info = 0; - } - - /* freeing the gasp table */ - FT_FREE( face->gasp.gaspRanges ); - face->gasp.numRanges = 0; - - /* freeing the name table */ - if ( sfnt ) - sfnt->free_name( face ); - - /* freeing family and style name */ - FT_FREE( face->root.family_name ); - FT_FREE( face->root.style_name ); - - /* freeing sbit size table */ - FT_FREE( face->root.available_sizes ); - face->root.num_fixed_sizes = 0; - - FT_FREE( face->postscript_name ); - - face->sfnt = 0; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/sfobjs.h b/android/jni/ndk_modules/freetype/src/sfnt/sfobjs.h deleted file mode 100644 index 6241c93b..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/sfobjs.h +++ /dev/null @@ -1,54 +0,0 @@ -/***************************************************************************/ -/* */ -/* sfobjs.h */ -/* */ -/* SFNT object management (specification). */ -/* */ -/* Copyright 1996-2001, 2002 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SFOBJS_H__ -#define __SFOBJS_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - sfnt_init_face( FT_Stream stream, - TT_Face face, - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - FT_LOCAL( FT_Error ) - sfnt_load_face( FT_Stream stream, - TT_Face face, - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - FT_LOCAL( void ) - sfnt_done_face( TT_Face face ); - - -FT_END_HEADER - -#endif /* __SFDRIVER_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttbdf.c b/android/jni/ndk_modules/freetype/src/sfnt/ttbdf.c deleted file mode 100644 index 18845c39..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttbdf.c +++ /dev/null @@ -1,250 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttbdf.c */ -/* */ -/* TrueType and OpenType embedded BDF properties (body). */ -/* */ -/* Copyright 2005, 2006, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include "ttbdf.h" - -#include "sferrors.h" - - -#ifdef TT_CONFIG_OPTION_BDF - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttbdf - - - FT_LOCAL_DEF( void ) - tt_face_free_bdf_props( TT_Face face ) - { - TT_BDF bdf = &face->bdf; - - - if ( bdf->loaded ) - { - FT_Stream stream = FT_FACE(face)->stream; - - - if ( bdf->table != NULL ) - FT_FRAME_RELEASE( bdf->table ); - - bdf->table_end = NULL; - bdf->strings = NULL; - bdf->strings_size = 0; - } - } - - - static FT_Error - tt_face_load_bdf_props( TT_Face face, - FT_Stream stream ) - { - TT_BDF bdf = &face->bdf; - FT_ULong length; - FT_Error error; - - - FT_ZERO( bdf ); - - error = tt_face_goto_table( face, TTAG_BDF, stream, &length ); - if ( error || - length < 8 || - FT_FRAME_EXTRACT( length, bdf->table ) ) - { - error = SFNT_Err_Invalid_Table; - goto Exit; - } - - bdf->table_end = bdf->table + length; - - { - FT_Byte* p = bdf->table; - FT_UInt version = FT_NEXT_USHORT( p ); - FT_UInt num_strikes = FT_NEXT_USHORT( p ); - FT_ULong strings = FT_NEXT_ULONG ( p ); - FT_UInt count; - FT_Byte* strike; - - - if ( version != 0x0001 || - strings < 8 || - ( strings - 8 ) / 4 < num_strikes || - strings + 1 > length ) - { - goto BadTable; - } - - bdf->num_strikes = num_strikes; - bdf->strings = bdf->table + strings; - bdf->strings_size = length - strings; - - count = bdf->num_strikes; - p = bdf->table + 8; - strike = p + count * 4; - - - for ( ; count > 0; count-- ) - { - FT_UInt num_items = FT_PEEK_USHORT( p + 2 ); - - /* - * We don't need to check the value sets themselves, since this - * is done later. - */ - strike += 10 * num_items; - - p += 4; - } - - if ( strike > bdf->strings ) - goto BadTable; - } - - bdf->loaded = 1; - - Exit: - return error; - - BadTable: - FT_FRAME_RELEASE( bdf->table ); - FT_ZERO( bdf ); - error = SFNT_Err_Invalid_Table; - goto Exit; - } - - - FT_LOCAL_DEF( FT_Error ) - tt_face_find_bdf_prop( TT_Face face, - const char* property_name, - BDF_PropertyRec *aprop ) - { - TT_BDF bdf = &face->bdf; - FT_Size size = FT_FACE(face)->size; - FT_Error error = SFNT_Err_Ok; - FT_Byte* p; - FT_UInt count; - FT_Byte* strike; - FT_Offset property_len; - - - aprop->type = BDF_PROPERTY_TYPE_NONE; - - if ( bdf->loaded == 0 ) - { - error = tt_face_load_bdf_props( face, FT_FACE( face )->stream ); - if ( error ) - goto Exit; - } - - count = bdf->num_strikes; - p = bdf->table + 8; - strike = p + 4 * count; - - error = SFNT_Err_Invalid_Argument; - - if ( size == NULL || property_name == NULL ) - goto Exit; - - property_len = ft_strlen( property_name ); - if ( property_len == 0 ) - goto Exit; - - for ( ; count > 0; count-- ) - { - FT_UInt _ppem = FT_NEXT_USHORT( p ); - FT_UInt _count = FT_NEXT_USHORT( p ); - - if ( _ppem == size->metrics.y_ppem ) - { - count = _count; - goto FoundStrike; - } - - strike += 10 * _count; - } - goto Exit; - - FoundStrike: - p = strike; - for ( ; count > 0; count-- ) - { - FT_UInt type = FT_PEEK_USHORT( p + 4 ); - - if ( ( type & 0x10 ) != 0 ) - { - FT_UInt32 name_offset = FT_PEEK_ULONG( p ); - FT_UInt32 value = FT_PEEK_ULONG( p + 6 ); - - /* be a bit paranoid for invalid entries here */ - if ( name_offset < bdf->strings_size && - property_len < bdf->strings_size - name_offset && - ft_strncmp( property_name, - (const char*)bdf->strings + name_offset, - bdf->strings_size - name_offset ) == 0 ) - { - switch ( type & 0x0F ) - { - case 0x00: /* string */ - case 0x01: /* atoms */ - /* check that the content is really 0-terminated */ - if ( value < bdf->strings_size && - ft_memchr( bdf->strings + value, 0, bdf->strings_size ) ) - { - aprop->type = BDF_PROPERTY_TYPE_ATOM; - aprop->u.atom = (const char*)bdf->strings + value; - error = SFNT_Err_Ok; - goto Exit; - } - break; - - case 0x02: - aprop->type = BDF_PROPERTY_TYPE_INTEGER; - aprop->u.integer = (FT_Int32)value; - error = SFNT_Err_Ok; - goto Exit; - - case 0x03: - aprop->type = BDF_PROPERTY_TYPE_CARDINAL; - aprop->u.cardinal = value; - error = SFNT_Err_Ok; - goto Exit; - - default: - ; - } - } - } - p += 10; - } - - Exit: - return error; - } - -#endif /* TT_CONFIG_OPTION_BDF */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttbdf.h b/android/jni/ndk_modules/freetype/src/sfnt/ttbdf.h deleted file mode 100644 index 48a10d6e..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttbdf.h +++ /dev/null @@ -1,46 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttbdf.h */ -/* */ -/* TrueType and OpenType embedded BDF properties (specification). */ -/* */ -/* Copyright 2005 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTBDF_H__ -#define __TTBDF_H__ - - -#include <ft2build.h> -#include "ttload.h" -#include FT_BDF_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( void ) - tt_face_free_bdf_props( TT_Face face ); - - - FT_LOCAL( FT_Error ) - tt_face_find_bdf_prop( TT_Face face, - const char* property_name, - BDF_PropertyRec *aprop ); - - -FT_END_HEADER - -#endif /* __TTBDF_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttcmap.c b/android/jni/ndk_modules/freetype/src/sfnt/ttcmap.c deleted file mode 100644 index 544750ab..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttcmap.c +++ /dev/null @@ -1,3512 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttcmap.c */ -/* */ -/* TrueType character mapping table (cmap) support (body). */ -/* */ -/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H - -#include "sferrors.h" /* must come before FT_INTERNAL_VALIDATE_H */ - -#include FT_INTERNAL_VALIDATE_H -#include FT_INTERNAL_STREAM_H -#include "ttload.h" -#include "ttcmap.h" -#include "sfntpic.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttcmap - - -#define TT_PEEK_SHORT FT_PEEK_SHORT -#define TT_PEEK_USHORT FT_PEEK_USHORT -#define TT_PEEK_UINT24 FT_PEEK_UOFF3 -#define TT_PEEK_LONG FT_PEEK_LONG -#define TT_PEEK_ULONG FT_PEEK_ULONG - -#define TT_NEXT_SHORT FT_NEXT_SHORT -#define TT_NEXT_USHORT FT_NEXT_USHORT -#define TT_NEXT_UINT24 FT_NEXT_UOFF3 -#define TT_NEXT_LONG FT_NEXT_LONG -#define TT_NEXT_ULONG FT_NEXT_ULONG - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap_init( TT_CMap cmap, - FT_Byte* table ) - { - cmap->data = table; - return SFNT_Err_Ok; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 0 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 0 */ - /* length 2 USHORT table length in bytes */ - /* language 4 USHORT Mac language code */ - /* glyph_ids 6 BYTE[256] array of glyph indices */ - /* 262 */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_0 - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap0_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p = table + 2; - FT_UInt length = TT_NEXT_USHORT( p ); - - - if ( table + length > valid->limit || length < 262 ) - FT_INVALID_TOO_SHORT; - - /* check glyph indices whenever necessary */ - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - FT_UInt n, idx; - - - p = table + 6; - for ( n = 0; n < 256; n++ ) - { - idx = *p++; - if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - } - - return SFNT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap0_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - FT_Byte* table = cmap->data; - - - return char_code < 256 ? table[6 + char_code] : 0; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap0_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_Byte* table = cmap->data; - FT_UInt32 charcode = *pchar_code; - FT_UInt32 result = 0; - FT_UInt gindex = 0; - - - table += 6; /* go to glyph IDs */ - while ( ++charcode < 256 ) - { - gindex = table[charcode]; - if ( gindex != 0 ) - { - result = charcode; - break; - } - } - - *pchar_code = result; - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap0_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 4; - - - cmap_info->format = 0; - cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); - - return SFNT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP(tt_cmap0_class_rec, - sizeof ( TT_CMapRec ), - - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap0_char_index, - (FT_CMap_CharNextFunc) tt_cmap0_char_next, - - NULL, NULL, NULL, NULL, NULL - , - 0, - (TT_CMap_ValidateFunc) tt_cmap0_validate, - (TT_CMap_Info_GetFunc) tt_cmap0_get_info - ) - -#endif /* TT_CONFIG_CMAP_FORMAT_0 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 2 *****/ - /***** *****/ - /***** This is used for certain CJK encodings that encode text in a *****/ - /***** mixed 8/16 bits encoding along the following lines: *****/ - /***** *****/ - /***** * Certain byte values correspond to an 8-bit character code *****/ - /***** (typically in the range 0..127 for ASCII compatibility). *****/ - /***** *****/ - /***** * Certain byte values signal the first byte of a 2-byte *****/ - /***** character code (but these values are also valid as the *****/ - /***** second byte of a 2-byte character). *****/ - /***** *****/ - /***** The following charmap lookup and iteration functions all *****/ - /***** assume that the value "charcode" correspond to following: *****/ - /***** *****/ - /***** - For one byte characters, "charcode" is simply the *****/ - /***** character code. *****/ - /***** *****/ - /***** - For two byte characters, "charcode" is the 2-byte *****/ - /***** character code in big endian format. More exactly: *****/ - /***** *****/ - /***** (charcode >> 8) is the first byte value *****/ - /***** (charcode & 0xFF) is the second byte value *****/ - /***** *****/ - /***** Note that not all values of "charcode" are valid according *****/ - /***** to these rules, and the function moderately check the *****/ - /***** arguments. *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 2 */ - /* length 2 USHORT table length in bytes */ - /* language 4 USHORT Mac language code */ - /* keys 6 USHORT[256] sub-header keys */ - /* subs 518 SUBHEAD[NSUBS] sub-headers array */ - /* glyph_ids 518+NSUB*8 USHORT[] glyph ID array */ - /* */ - /* The `keys' table is used to map charcode high-bytes to sub-headers. */ - /* The value of `NSUBS' is the number of sub-headers defined in the */ - /* table and is computed by finding the maximum of the `keys' table. */ - /* */ - /* Note that for any n, `keys[n]' is a byte offset within the `subs' */ - /* table, i.e., it is the corresponding sub-header index multiplied */ - /* by 8. */ - /* */ - /* Each sub-header has the following format: */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* first 0 USHORT first valid low-byte */ - /* count 2 USHORT number of valid low-bytes */ - /* delta 4 SHORT see below */ - /* offset 6 USHORT see below */ - /* */ - /* A sub-header defines, for each high-byte, the range of valid */ - /* low-bytes within the charmap. Note that the range defined by `first' */ - /* and `count' must be completely included in the interval [0..255] */ - /* according to the specification. */ - /* */ - /* If a character code is contained within a given sub-header, then */ - /* mapping it to a glyph index is done as follows: */ - /* */ - /* * The value of `offset' is read. This is a _byte_ distance from the */ - /* location of the `offset' field itself into a slice of the */ - /* `glyph_ids' table. Let's call it `slice' (it is a USHORT[] too). */ - /* */ - /* * The value `slice[char.lo - first]' is read. If it is 0, there is */ - /* no glyph for the charcode. Otherwise, the value of `delta' is */ - /* added to it (modulo 65536) to form a new glyph index. */ - /* */ - /* It is up to the validation routine to check that all offsets fall */ - /* within the glyph IDs table (and not within the `subs' table itself or */ - /* outside of the CMap). */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_2 - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap2_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p = table + 2; /* skip format */ - FT_UInt length = TT_PEEK_USHORT( p ); - FT_UInt n, max_subs; - FT_Byte* keys; /* keys table */ - FT_Byte* subs; /* sub-headers */ - FT_Byte* glyph_ids; /* glyph ID array */ - - - if ( table + length > valid->limit || length < 6 + 512 ) - FT_INVALID_TOO_SHORT; - - keys = table + 6; - - /* parse keys to compute sub-headers count */ - p = keys; - max_subs = 0; - for ( n = 0; n < 256; n++ ) - { - FT_UInt idx = TT_NEXT_USHORT( p ); - - - /* value must be multiple of 8 */ - if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 ) - FT_INVALID_DATA; - - idx >>= 3; - - if ( idx > max_subs ) - max_subs = idx; - } - - FT_ASSERT( p == table + 518 ); - - subs = p; - glyph_ids = subs + (max_subs + 1) * 8; - if ( glyph_ids > valid->limit ) - FT_INVALID_TOO_SHORT; - - /* parse sub-headers */ - for ( n = 0; n <= max_subs; n++ ) - { - FT_UInt first_code, code_count, offset; - FT_Int delta; - FT_Byte* ids; - - - first_code = TT_NEXT_USHORT( p ); - code_count = TT_NEXT_USHORT( p ); - delta = TT_NEXT_SHORT( p ); - offset = TT_NEXT_USHORT( p ); - - /* many Dynalab fonts have empty sub-headers */ - if ( code_count == 0 ) - continue; - - /* check range within 0..255 */ - if ( valid->level >= FT_VALIDATE_PARANOID ) - { - if ( first_code >= 256 || first_code + code_count > 256 ) - FT_INVALID_DATA; - } - - /* check offset */ - if ( offset != 0 ) - { - ids = p - 2 + offset; - if ( ids < glyph_ids || ids + code_count*2 > table + length ) - FT_INVALID_OFFSET; - - /* check glyph IDs */ - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - FT_Byte* limit = p + code_count * 2; - FT_UInt idx; - - - for ( ; p < limit; ) - { - idx = TT_NEXT_USHORT( p ); - if ( idx != 0 ) - { - idx = ( idx + delta ) & 0xFFFFU; - if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - } - } - } - } - - return SFNT_Err_Ok; - } - - - /* return sub header corresponding to a given character code */ - /* NULL on invalid charcode */ - static FT_Byte* - tt_cmap2_get_subheader( FT_Byte* table, - FT_UInt32 char_code ) - { - FT_Byte* result = NULL; - - - if ( char_code < 0x10000UL ) - { - FT_UInt char_lo = (FT_UInt)( char_code & 0xFF ); - FT_UInt char_hi = (FT_UInt)( char_code >> 8 ); - FT_Byte* p = table + 6; /* keys table */ - FT_Byte* subs = table + 518; /* subheaders table */ - FT_Byte* sub; - - - if ( char_hi == 0 ) - { - /* an 8-bit character code -- we use subHeader 0 in this case */ - /* to test whether the character code is in the charmap */ - /* */ - sub = subs; /* jump to first sub-header */ - - /* check that the sub-header for this byte is 0, which */ - /* indicates that it is really a valid one-byte value */ - /* Otherwise, return 0 */ - /* */ - p += char_lo * 2; - if ( TT_PEEK_USHORT( p ) != 0 ) - goto Exit; - } - else - { - /* a 16-bit character code */ - - /* jump to key entry */ - p += char_hi * 2; - /* jump to sub-header */ - sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) ); - - /* check that the high byte isn't a valid one-byte value */ - if ( sub == subs ) - goto Exit; - } - result = sub; - } - Exit: - return result; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap2_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - FT_Byte* table = cmap->data; - FT_UInt result = 0; - FT_Byte* subheader; - - - subheader = tt_cmap2_get_subheader( table, char_code ); - if ( subheader ) - { - FT_Byte* p = subheader; - FT_UInt idx = (FT_UInt)(char_code & 0xFF); - FT_UInt start, count; - FT_Int delta; - FT_UInt offset; - - - start = TT_NEXT_USHORT( p ); - count = TT_NEXT_USHORT( p ); - delta = TT_NEXT_SHORT ( p ); - offset = TT_PEEK_USHORT( p ); - - idx -= start; - if ( idx < count && offset != 0 ) - { - p += offset + 2 * idx; - idx = TT_PEEK_USHORT( p ); - - if ( idx != 0 ) - result = (FT_UInt)( idx + delta ) & 0xFFFFU; - } - } - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap2_char_next( TT_CMap cmap, - FT_UInt32 *pcharcode ) - { - FT_Byte* table = cmap->data; - FT_UInt gindex = 0; - FT_UInt32 result = 0; - FT_UInt32 charcode = *pcharcode + 1; - FT_Byte* subheader; - - - while ( charcode < 0x10000UL ) - { - subheader = tt_cmap2_get_subheader( table, charcode ); - if ( subheader ) - { - FT_Byte* p = subheader; - FT_UInt start = TT_NEXT_USHORT( p ); - FT_UInt count = TT_NEXT_USHORT( p ); - FT_Int delta = TT_NEXT_SHORT ( p ); - FT_UInt offset = TT_PEEK_USHORT( p ); - FT_UInt char_lo = (FT_UInt)( charcode & 0xFF ); - FT_UInt pos, idx; - - - if ( offset == 0 ) - goto Next_SubHeader; - - if ( char_lo < start ) - { - char_lo = start; - pos = 0; - } - else - pos = (FT_UInt)( char_lo - start ); - - p += offset + pos * 2; - charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo; - - for ( ; pos < count; pos++, charcode++ ) - { - idx = TT_NEXT_USHORT( p ); - - if ( idx != 0 ) - { - gindex = ( idx + delta ) & 0xFFFFU; - if ( gindex != 0 ) - { - result = charcode; - goto Exit; - } - } - } - } - - /* jump to next sub-header, i.e. higher byte value */ - Next_SubHeader: - charcode = FT_PAD_FLOOR( charcode, 256 ) + 256; - } - - Exit: - *pcharcode = result; - - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap2_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 4; - - - cmap_info->format = 2; - cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); - - return SFNT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP(tt_cmap2_class_rec, - sizeof ( TT_CMapRec ), - - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap2_char_index, - (FT_CMap_CharNextFunc) tt_cmap2_char_next, - - NULL, NULL, NULL, NULL, NULL - , - 2, - (TT_CMap_ValidateFunc) tt_cmap2_validate, - (TT_CMap_Info_GetFunc) tt_cmap2_get_info - ) - -#endif /* TT_CONFIG_CMAP_FORMAT_2 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 4 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 4 */ - /* length 2 USHORT table length */ - /* in bytes */ - /* language 4 USHORT Mac language code */ - /* */ - /* segCountX2 6 USHORT 2*NUM_SEGS */ - /* searchRange 8 USHORT 2*(1 << LOG_SEGS) */ - /* entrySelector 10 USHORT LOG_SEGS */ - /* rangeShift 12 USHORT segCountX2 - */ - /* searchRange */ - /* */ - /* endCount 14 USHORT[NUM_SEGS] end charcode for */ - /* each segment; last */ - /* is 0xFFFF */ - /* */ - /* pad 14+NUM_SEGS*2 USHORT padding */ - /* */ - /* startCount 16+NUM_SEGS*2 USHORT[NUM_SEGS] first charcode for */ - /* each segment */ - /* */ - /* idDelta 16+NUM_SEGS*4 SHORT[NUM_SEGS] delta for each */ - /* segment */ - /* idOffset 16+NUM_SEGS*6 SHORT[NUM_SEGS] range offset for */ - /* each segment; can be */ - /* zero */ - /* */ - /* glyphIds 16+NUM_SEGS*8 USHORT[] array of glyph ID */ - /* ranges */ - /* */ - /* Character codes are modelled by a series of ordered (increasing) */ - /* intervals called segments. Each segment has start and end codes, */ - /* provided by the `startCount' and `endCount' arrays. Segments must */ - /* not overlap, and the last segment should always contain the value */ - /* 0xFFFF for `endCount'. */ - /* */ - /* The fields `searchRange', `entrySelector' and `rangeShift' are better */ - /* ignored (they are traces of over-engineering in the TrueType */ - /* specification). */ - /* */ - /* Each segment also has a signed `delta', as well as an optional offset */ - /* within the `glyphIds' table. */ - /* */ - /* If a segment's idOffset is 0, the glyph index corresponding to any */ - /* charcode within the segment is obtained by adding the value of */ - /* `idDelta' directly to the charcode, modulo 65536. */ - /* */ - /* Otherwise, a glyph index is taken from the glyph IDs sub-array for */ - /* the segment, and the value of `idDelta' is added to it. */ - /* */ - /* */ - /* Finally, note that a lot of fonts contain an invalid last segment, */ - /* where `start' and `end' are correctly set to 0xFFFF but both `delta' */ - /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with */ - /* OpenOffice.org). We need special code to deal with them correctly. */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_4 - - typedef struct TT_CMap4Rec_ - { - TT_CMapRec cmap; - FT_UInt32 cur_charcode; /* current charcode */ - FT_UInt cur_gindex; /* current glyph index */ - - FT_UInt num_ranges; - FT_UInt cur_range; - FT_UInt cur_start; - FT_UInt cur_end; - FT_Int cur_delta; - FT_Byte* cur_values; - - } TT_CMap4Rec, *TT_CMap4; - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap4_init( TT_CMap4 cmap, - FT_Byte* table ) - { - FT_Byte* p; - - - cmap->cmap.data = table; - - p = table + 6; - cmap->num_ranges = FT_PEEK_USHORT( p ) >> 1; - cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; - cmap->cur_gindex = 0; - - return SFNT_Err_Ok; - } - - - static FT_Int - tt_cmap4_set_range( TT_CMap4 cmap, - FT_UInt range_index ) - { - FT_Byte* table = cmap->cmap.data; - FT_Byte* p; - FT_UInt num_ranges = cmap->num_ranges; - - - while ( range_index < num_ranges ) - { - FT_UInt offset; - - - p = table + 14 + range_index * 2; - cmap->cur_end = FT_PEEK_USHORT( p ); - - p += 2 + num_ranges * 2; - cmap->cur_start = FT_PEEK_USHORT( p ); - - p += num_ranges * 2; - cmap->cur_delta = FT_PEEK_SHORT( p ); - - p += num_ranges * 2; - offset = FT_PEEK_USHORT( p ); - - /* some fonts have an incorrect last segment; */ - /* we have to catch it */ - if ( range_index >= num_ranges - 1 && - cmap->cur_start == 0xFFFFU && - cmap->cur_end == 0xFFFFU ) - { - TT_Face face = (TT_Face)cmap->cmap.cmap.charmap.face; - FT_Byte* limit = face->cmap_table + face->cmap_size; - - - if ( offset && p + offset + 2 > limit ) - { - cmap->cur_delta = 1; - offset = 0; - } - } - - if ( offset != 0xFFFFU ) - { - cmap->cur_values = offset ? p + offset : NULL; - cmap->cur_range = range_index; - return 0; - } - - /* we skip empty segments */ - range_index++; - } - - return -1; - } - - - /* search the index of the charcode next to cmap->cur_charcode; */ - /* caller should call tt_cmap4_set_range with proper range */ - /* before calling this function */ - /* */ - static void - tt_cmap4_next( TT_CMap4 cmap ) - { - FT_UInt charcode; - - - if ( cmap->cur_charcode >= 0xFFFFUL ) - goto Fail; - - charcode = (FT_UInt)cmap->cur_charcode + 1; - - if ( charcode < cmap->cur_start ) - charcode = cmap->cur_start; - - for ( ;; ) - { - FT_Byte* values = cmap->cur_values; - FT_UInt end = cmap->cur_end; - FT_Int delta = cmap->cur_delta; - - - if ( charcode <= end ) - { - if ( values ) - { - FT_Byte* p = values + 2 * ( charcode - cmap->cur_start ); - - - do - { - FT_UInt gindex = FT_NEXT_USHORT( p ); - - - if ( gindex != 0 ) - { - gindex = (FT_UInt)( ( gindex + delta ) & 0xFFFFU ); - if ( gindex != 0 ) - { - cmap->cur_charcode = charcode; - cmap->cur_gindex = gindex; - return; - } - } - } while ( ++charcode <= end ); - } - else - { - do - { - FT_UInt gindex = (FT_UInt)( ( charcode + delta ) & 0xFFFFU ); - - - if ( gindex != 0 ) - { - cmap->cur_charcode = charcode; - cmap->cur_gindex = gindex; - return; - } - } while ( ++charcode <= end ); - } - } - - /* we need to find another range */ - if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 ) - break; - - if ( charcode < cmap->cur_start ) - charcode = cmap->cur_start; - } - - Fail: - cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; - cmap->cur_gindex = 0; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap4_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p = table + 2; /* skip format */ - FT_UInt length = TT_NEXT_USHORT( p ); - FT_Byte *ends, *starts, *offsets, *deltas, *glyph_ids; - FT_UInt num_segs; - FT_Error error = SFNT_Err_Ok; - - - if ( length < 16 ) - FT_INVALID_TOO_SHORT; - - /* in certain fonts, the `length' field is invalid and goes */ - /* out of bound. We try to correct this here... */ - if ( table + length > valid->limit ) - { - if ( valid->level >= FT_VALIDATE_TIGHT ) - FT_INVALID_TOO_SHORT; - - length = (FT_UInt)( valid->limit - table ); - } - - p = table + 6; - num_segs = TT_NEXT_USHORT( p ); /* read segCountX2 */ - - if ( valid->level >= FT_VALIDATE_PARANOID ) - { - /* check that we have an even value here */ - if ( num_segs & 1 ) - FT_INVALID_DATA; - } - - num_segs /= 2; - - if ( length < 16 + num_segs * 2 * 4 ) - FT_INVALID_TOO_SHORT; - - /* check the search parameters - even though we never use them */ - /* */ - if ( valid->level >= FT_VALIDATE_PARANOID ) - { - /* check the values of `searchRange', `entrySelector', `rangeShift' */ - FT_UInt search_range = TT_NEXT_USHORT( p ); - FT_UInt entry_selector = TT_NEXT_USHORT( p ); - FT_UInt range_shift = TT_NEXT_USHORT( p ); - - - if ( ( search_range | range_shift ) & 1 ) /* must be even values */ - FT_INVALID_DATA; - - search_range /= 2; - range_shift /= 2; - - /* `search range' is the greatest power of 2 that is <= num_segs */ - - if ( search_range > num_segs || - search_range * 2 < num_segs || - search_range + range_shift != num_segs || - search_range != ( 1U << entry_selector ) ) - FT_INVALID_DATA; - } - - ends = table + 14; - starts = table + 16 + num_segs * 2; - deltas = starts + num_segs * 2; - offsets = deltas + num_segs * 2; - glyph_ids = offsets + num_segs * 2; - - /* check last segment; its end count value must be 0xFFFF */ - if ( valid->level >= FT_VALIDATE_PARANOID ) - { - p = ends + ( num_segs - 1 ) * 2; - if ( TT_PEEK_USHORT( p ) != 0xFFFFU ) - FT_INVALID_DATA; - } - - { - FT_UInt start, end, offset, n; - FT_UInt last_start = 0, last_end = 0; - FT_Int delta; - FT_Byte* p_start = starts; - FT_Byte* p_end = ends; - FT_Byte* p_delta = deltas; - FT_Byte* p_offset = offsets; - - - for ( n = 0; n < num_segs; n++ ) - { - p = p_offset; - start = TT_NEXT_USHORT( p_start ); - end = TT_NEXT_USHORT( p_end ); - delta = TT_NEXT_SHORT( p_delta ); - offset = TT_NEXT_USHORT( p_offset ); - - if ( start > end ) - FT_INVALID_DATA; - - /* this test should be performed at default validation level; */ - /* unfortunately, some popular Asian fonts have overlapping */ - /* ranges in their charmaps */ - /* */ - if ( start <= last_end && n > 0 ) - { - if ( valid->level >= FT_VALIDATE_TIGHT ) - FT_INVALID_DATA; - else - { - /* allow overlapping segments, provided their start points */ - /* and end points, respectively, are in ascending order */ - /* */ - if ( last_start > start || last_end > end ) - error |= TT_CMAP_FLAG_UNSORTED; - else - error |= TT_CMAP_FLAG_OVERLAPPING; - } - } - - if ( offset && offset != 0xFFFFU ) - { - p += offset; /* start of glyph ID array */ - - /* check that we point within the glyph IDs table only */ - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - if ( p < glyph_ids || - p + ( end - start + 1 ) * 2 > table + length ) - FT_INVALID_DATA; - } - /* Some fonts handle the last segment incorrectly. In */ - /* theory, 0xFFFF might point to an ordinary glyph -- */ - /* a cmap 4 is versatile and could be used for any */ - /* encoding, not only Unicode. However, reality shows */ - /* that far too many fonts are sloppy and incorrectly */ - /* set all fields but `start' and `end' for the last */ - /* segment if it contains only a single character. */ - /* */ - /* We thus omit the test here, delaying it to the */ - /* routines which actually access the cmap. */ - else if ( n != num_segs - 1 || - !( start == 0xFFFFU && end == 0xFFFFU ) ) - { - if ( p < glyph_ids || - p + ( end - start + 1 ) * 2 > valid->limit ) - FT_INVALID_DATA; - } - - /* check glyph indices within the segment range */ - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - FT_UInt i, idx; - - - for ( i = start; i < end; i++ ) - { - idx = FT_NEXT_USHORT( p ); - if ( idx != 0 ) - { - idx = (FT_UInt)( idx + delta ) & 0xFFFFU; - - if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - } - } - } - else if ( offset == 0xFFFFU ) - { - /* some fonts (erroneously?) use a range offset of 0xFFFF */ - /* to mean missing glyph in cmap table */ - /* */ - if ( valid->level >= FT_VALIDATE_PARANOID || - n != num_segs - 1 || - !( start == 0xFFFFU && end == 0xFFFFU ) ) - FT_INVALID_DATA; - } - - last_start = start; - last_end = end; - } - } - - return error; - } - - - static FT_UInt - tt_cmap4_char_map_linear( TT_CMap cmap, - FT_UInt32* pcharcode, - FT_Bool next ) - { - FT_UInt num_segs2, start, end, offset; - FT_Int delta; - FT_UInt i, num_segs; - FT_UInt32 charcode = *pcharcode; - FT_UInt gindex = 0; - FT_Byte* p; - - - p = cmap->data + 6; - num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); - - num_segs = num_segs2 >> 1; - - if ( !num_segs ) - return 0; - - if ( next ) - charcode++; - - /* linear search */ - for ( ; charcode <= 0xFFFFU; charcode++ ) - { - FT_Byte* q; - - - p = cmap->data + 14; /* ends table */ - q = cmap->data + 16 + num_segs2; /* starts table */ - - for ( i = 0; i < num_segs; i++ ) - { - end = TT_NEXT_USHORT( p ); - start = TT_NEXT_USHORT( q ); - - if ( charcode >= start && charcode <= end ) - { - p = q - 2 + num_segs2; - delta = TT_PEEK_SHORT( p ); - p += num_segs2; - offset = TT_PEEK_USHORT( p ); - - /* some fonts have an incorrect last segment; */ - /* we have to catch it */ - if ( i >= num_segs - 1 && - start == 0xFFFFU && end == 0xFFFFU ) - { - TT_Face face = (TT_Face)cmap->cmap.charmap.face; - FT_Byte* limit = face->cmap_table + face->cmap_size; - - - if ( offset && p + offset + 2 > limit ) - { - delta = 1; - offset = 0; - } - } - - if ( offset == 0xFFFFU ) - continue; - - if ( offset ) - { - p += offset + ( charcode - start ) * 2; - gindex = TT_PEEK_USHORT( p ); - if ( gindex != 0 ) - gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU; - } - else - gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU; - - break; - } - } - - if ( !next || gindex ) - break; - } - - if ( next && gindex ) - *pcharcode = charcode; - - return gindex; - } - - - static FT_UInt - tt_cmap4_char_map_binary( TT_CMap cmap, - FT_UInt32* pcharcode, - FT_Bool next ) - { - FT_UInt num_segs2, start, end, offset; - FT_Int delta; - FT_UInt max, min, mid, num_segs; - FT_UInt charcode = (FT_UInt)*pcharcode; - FT_UInt gindex = 0; - FT_Byte* p; - - - p = cmap->data + 6; - num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); - - if ( !num_segs2 ) - return 0; - - num_segs = num_segs2 >> 1; - - /* make compiler happy */ - mid = num_segs; - end = 0xFFFFU; - - if ( next ) - charcode++; - - min = 0; - max = num_segs; - - /* binary search */ - while ( min < max ) - { - mid = ( min + max ) >> 1; - p = cmap->data + 14 + mid * 2; - end = TT_PEEK_USHORT( p ); - p += 2 + num_segs2; - start = TT_PEEK_USHORT( p ); - - if ( charcode < start ) - max = mid; - else if ( charcode > end ) - min = mid + 1; - else - { - p += num_segs2; - delta = TT_PEEK_SHORT( p ); - p += num_segs2; - offset = TT_PEEK_USHORT( p ); - - /* some fonts have an incorrect last segment; */ - /* we have to catch it */ - if ( mid >= num_segs - 1 && - start == 0xFFFFU && end == 0xFFFFU ) - { - TT_Face face = (TT_Face)cmap->cmap.charmap.face; - FT_Byte* limit = face->cmap_table + face->cmap_size; - - - if ( offset && p + offset + 2 > limit ) - { - delta = 1; - offset = 0; - } - } - - /* search the first segment containing `charcode' */ - if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING ) - { - FT_UInt i; - - - /* call the current segment `max' */ - max = mid; - - if ( offset == 0xFFFFU ) - mid = max + 1; - - /* search in segments before the current segment */ - for ( i = max ; i > 0; i-- ) - { - FT_UInt prev_end; - FT_Byte* old_p; - - - old_p = p; - p = cmap->data + 14 + ( i - 1 ) * 2; - prev_end = TT_PEEK_USHORT( p ); - - if ( charcode > prev_end ) - { - p = old_p; - break; - } - - end = prev_end; - p += 2 + num_segs2; - start = TT_PEEK_USHORT( p ); - p += num_segs2; - delta = TT_PEEK_SHORT( p ); - p += num_segs2; - offset = TT_PEEK_USHORT( p ); - - if ( offset != 0xFFFFU ) - mid = i - 1; - } - - /* no luck */ - if ( mid == max + 1 ) - { - if ( i != max ) - { - p = cmap->data + 14 + max * 2; - end = TT_PEEK_USHORT( p ); - p += 2 + num_segs2; - start = TT_PEEK_USHORT( p ); - p += num_segs2; - delta = TT_PEEK_SHORT( p ); - p += num_segs2; - offset = TT_PEEK_USHORT( p ); - } - - mid = max; - - /* search in segments after the current segment */ - for ( i = max + 1; i < num_segs; i++ ) - { - FT_UInt next_end, next_start; - - - p = cmap->data + 14 + i * 2; - next_end = TT_PEEK_USHORT( p ); - p += 2 + num_segs2; - next_start = TT_PEEK_USHORT( p ); - - if ( charcode < next_start ) - break; - - end = next_end; - start = next_start; - p += num_segs2; - delta = TT_PEEK_SHORT( p ); - p += num_segs2; - offset = TT_PEEK_USHORT( p ); - - if ( offset != 0xFFFFU ) - mid = i; - } - i--; - - /* still no luck */ - if ( mid == max ) - { - mid = i; - - break; - } - } - - /* end, start, delta, and offset are for the i'th segment */ - if ( mid != i ) - { - p = cmap->data + 14 + mid * 2; - end = TT_PEEK_USHORT( p ); - p += 2 + num_segs2; - start = TT_PEEK_USHORT( p ); - p += num_segs2; - delta = TT_PEEK_SHORT( p ); - p += num_segs2; - offset = TT_PEEK_USHORT( p ); - } - } - else - { - if ( offset == 0xFFFFU ) - break; - } - - if ( offset ) - { - p += offset + ( charcode - start ) * 2; - gindex = TT_PEEK_USHORT( p ); - if ( gindex != 0 ) - gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU; - } - else - gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU; - - break; - } - } - - if ( next ) - { - TT_CMap4 cmap4 = (TT_CMap4)cmap; - - - /* if `charcode' is not in any segment, then `mid' is */ - /* the segment nearest to `charcode' */ - /* */ - - if ( charcode > end ) - { - mid++; - if ( mid == num_segs ) - return 0; - } - - if ( tt_cmap4_set_range( cmap4, mid ) ) - { - if ( gindex ) - *pcharcode = charcode; - } - else - { - cmap4->cur_charcode = charcode; - - if ( gindex ) - cmap4->cur_gindex = gindex; - else - { - cmap4->cur_charcode = charcode; - tt_cmap4_next( cmap4 ); - gindex = cmap4->cur_gindex; - } - - if ( gindex ) - *pcharcode = cmap4->cur_charcode; - } - } - - return gindex; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap4_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - if ( char_code >= 0x10000UL ) - return 0; - - if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) - return tt_cmap4_char_map_linear( cmap, &char_code, 0 ); - else - return tt_cmap4_char_map_binary( cmap, &char_code, 0 ); - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap4_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_UInt gindex; - - - if ( *pchar_code >= 0xFFFFU ) - return 0; - - if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) - gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 ); - else - { - TT_CMap4 cmap4 = (TT_CMap4)cmap; - - - /* no need to search */ - if ( *pchar_code == cmap4->cur_charcode ) - { - tt_cmap4_next( cmap4 ); - gindex = cmap4->cur_gindex; - if ( gindex ) - *pchar_code = cmap4->cur_charcode; - } - else - gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 ); - } - - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap4_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 4; - - - cmap_info->format = 4; - cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); - - return SFNT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP(tt_cmap4_class_rec, - sizeof ( TT_CMap4Rec ), - (FT_CMap_InitFunc) tt_cmap4_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap4_char_index, - (FT_CMap_CharNextFunc) tt_cmap4_char_next, - - NULL, NULL, NULL, NULL, NULL - , - 4, - (TT_CMap_ValidateFunc) tt_cmap4_validate, - (TT_CMap_Info_GetFunc) tt_cmap4_get_info - ) - -#endif /* TT_CONFIG_CMAP_FORMAT_4 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 6 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 4 */ - /* length 2 USHORT table length in bytes */ - /* language 4 USHORT Mac language code */ - /* */ - /* first 6 USHORT first segment code */ - /* count 8 USHORT segment size in chars */ - /* glyphIds 10 USHORT[count] glyph IDs */ - /* */ - /* A very simplified segment mapping. */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_6 - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap6_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p; - FT_UInt length, count; - - - if ( table + 10 > valid->limit ) - FT_INVALID_TOO_SHORT; - - p = table + 2; - length = TT_NEXT_USHORT( p ); - - p = table + 8; /* skip language and start index */ - count = TT_NEXT_USHORT( p ); - - if ( table + length > valid->limit || length < 10 + count * 2 ) - FT_INVALID_TOO_SHORT; - - /* check glyph indices */ - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - FT_UInt gindex; - - - for ( ; count > 0; count-- ) - { - gindex = TT_NEXT_USHORT( p ); - if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - } - - return SFNT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap6_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - FT_Byte* table = cmap->data; - FT_UInt result = 0; - FT_Byte* p = table + 6; - FT_UInt start = TT_NEXT_USHORT( p ); - FT_UInt count = TT_NEXT_USHORT( p ); - FT_UInt idx = (FT_UInt)( char_code - start ); - - - if ( idx < count ) - { - p += 2 * idx; - result = TT_PEEK_USHORT( p ); - } - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap6_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_Byte* table = cmap->data; - FT_UInt32 result = 0; - FT_UInt32 char_code = *pchar_code + 1; - FT_UInt gindex = 0; - - FT_Byte* p = table + 6; - FT_UInt start = TT_NEXT_USHORT( p ); - FT_UInt count = TT_NEXT_USHORT( p ); - FT_UInt idx; - - - if ( char_code >= 0x10000UL ) - goto Exit; - - if ( char_code < start ) - char_code = start; - - idx = (FT_UInt)( char_code - start ); - p += 2 * idx; - - for ( ; idx < count; idx++ ) - { - gindex = TT_NEXT_USHORT( p ); - if ( gindex != 0 ) - { - result = char_code; - break; - } - char_code++; - } - - Exit: - *pchar_code = result; - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap6_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 4; - - - cmap_info->format = 6; - cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); - - return SFNT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP(tt_cmap6_class_rec, - sizeof ( TT_CMapRec ), - - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap6_char_index, - (FT_CMap_CharNextFunc) tt_cmap6_char_next, - - NULL, NULL, NULL, NULL, NULL - , - 6, - (TT_CMap_ValidateFunc) tt_cmap6_validate, - (TT_CMap_Info_GetFunc) tt_cmap6_get_info - ) - -#endif /* TT_CONFIG_CMAP_FORMAT_6 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 8 *****/ - /***** *****/ - /***** It is hard to completely understand what the OpenType spec *****/ - /***** says about this format, but here is my conclusion. *****/ - /***** *****/ - /***** The purpose of this format is to easily map UTF-16 text to *****/ - /***** glyph indices. Basically, the `char_code' must be in one of *****/ - /***** the following formats: *****/ - /***** *****/ - /***** - A 16-bit value that isn't part of the Unicode Surrogates *****/ - /***** Area (i.e. U+D800-U+DFFF). *****/ - /***** *****/ - /***** - A 32-bit value, made of two surrogate values, i.e.. if *****/ - /***** `char_code = (char_hi << 16) | char_lo', then both *****/ - /***** `char_hi' and `char_lo' must be in the Surrogates Area. *****/ - /***** Area. *****/ - /***** *****/ - /***** The `is32' table embedded in the charmap indicates whether a *****/ - /***** given 16-bit value is in the surrogates area or not. *****/ - /***** *****/ - /***** So, for any given `char_code', we can assert the following: *****/ - /***** *****/ - /***** If `char_hi == 0' then we must have `is32[char_lo] == 0'. *****/ - /***** *****/ - /***** If `char_hi != 0' then we must have both *****/ - /***** `is32[char_hi] != 0' and `is32[char_lo] != 0'. *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 8 */ - /* reserved 2 USHORT reserved */ - /* length 4 ULONG length in bytes */ - /* language 8 ULONG Mac language code */ - /* is32 12 BYTE[8192] 32-bitness bitmap */ - /* count 8204 ULONG number of groups */ - /* */ - /* This header is followed by `count' groups of the following format: */ - /* */ - /* start 0 ULONG first charcode */ - /* end 4 ULONG last charcode */ - /* startId 8 ULONG start glyph ID for the group */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_8 - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap8_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p = table + 4; - FT_Byte* is32; - FT_UInt32 length; - FT_UInt32 num_groups; - - - if ( table + 16 + 8192 > valid->limit ) - FT_INVALID_TOO_SHORT; - - length = TT_NEXT_ULONG( p ); - if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 ) - FT_INVALID_TOO_SHORT; - - is32 = table + 12; - p = is32 + 8192; /* skip `is32' array */ - num_groups = TT_NEXT_ULONG( p ); - - if ( p + num_groups * 12 > valid->limit ) - FT_INVALID_TOO_SHORT; - - /* check groups, they must be in increasing order */ - { - FT_UInt32 n, start, end, start_id, count, last = 0; - - - for ( n = 0; n < num_groups; n++ ) - { - FT_UInt hi, lo; - - - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - start_id = TT_NEXT_ULONG( p ); - - if ( start > end ) - FT_INVALID_DATA; - - if ( n > 0 && start <= last ) - FT_INVALID_DATA; - - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - - count = (FT_UInt32)( end - start + 1 ); - - if ( start & ~0xFFFFU ) - { - /* start_hi != 0; check that is32[i] is 1 for each i in */ - /* the `hi' and `lo' of the range [start..end] */ - for ( ; count > 0; count--, start++ ) - { - hi = (FT_UInt)( start >> 16 ); - lo = (FT_UInt)( start & 0xFFFFU ); - - if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 ) - FT_INVALID_DATA; - - if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 ) - FT_INVALID_DATA; - } - } - else - { - /* start_hi == 0; check that is32[i] is 0 for each i in */ - /* the range [start..end] */ - - /* end_hi cannot be != 0! */ - if ( end & ~0xFFFFU ) - FT_INVALID_DATA; - - for ( ; count > 0; count--, start++ ) - { - lo = (FT_UInt)( start & 0xFFFFU ); - - if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 ) - FT_INVALID_DATA; - } - } - } - - last = end; - } - } - - return SFNT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap8_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - FT_Byte* table = cmap->data; - FT_UInt result = 0; - FT_Byte* p = table + 8204; - FT_UInt32 num_groups = TT_NEXT_ULONG( p ); - FT_UInt32 start, end, start_id; - - - for ( ; num_groups > 0; num_groups-- ) - { - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - start_id = TT_NEXT_ULONG( p ); - - if ( char_code < start ) - break; - - if ( char_code <= end ) - { - result = (FT_UInt)( start_id + char_code - start ); - break; - } - } - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap8_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_UInt32 result = 0; - FT_UInt32 char_code = *pchar_code + 1; - FT_UInt gindex = 0; - FT_Byte* table = cmap->data; - FT_Byte* p = table + 8204; - FT_UInt32 num_groups = TT_NEXT_ULONG( p ); - FT_UInt32 start, end, start_id; - - - p = table + 8208; - - for ( ; num_groups > 0; num_groups-- ) - { - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - start_id = TT_NEXT_ULONG( p ); - - if ( char_code < start ) - char_code = start; - - if ( char_code <= end ) - { - gindex = (FT_UInt)( char_code - start + start_id ); - if ( gindex != 0 ) - { - result = char_code; - goto Exit; - } - } - } - - Exit: - *pchar_code = result; - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap8_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 8; - - - cmap_info->format = 8; - cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); - - return SFNT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP(tt_cmap8_class_rec, - sizeof ( TT_CMapRec ), - - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap8_char_index, - (FT_CMap_CharNextFunc) tt_cmap8_char_next, - - NULL, NULL, NULL, NULL, NULL - , - 8, - (TT_CMap_ValidateFunc) tt_cmap8_validate, - (TT_CMap_Info_GetFunc) tt_cmap8_get_info - ) - -#endif /* TT_CONFIG_CMAP_FORMAT_8 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 10 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 10 */ - /* reserved 2 USHORT reserved */ - /* length 4 ULONG length in bytes */ - /* language 8 ULONG Mac language code */ - /* */ - /* start 12 ULONG first char in range */ - /* count 16 ULONG number of chars in range */ - /* glyphIds 20 USHORT[count] glyph indices covered */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_10 - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap10_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p = table + 4; - FT_ULong length, count; - - - if ( table + 20 > valid->limit ) - FT_INVALID_TOO_SHORT; - - length = TT_NEXT_ULONG( p ); - p = table + 16; - count = TT_NEXT_ULONG( p ); - - if ( length > (FT_ULong)( valid->limit - table ) || - length < 20 + count * 2 ) - FT_INVALID_TOO_SHORT; - - /* check glyph indices */ - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - FT_UInt gindex; - - - for ( ; count > 0; count-- ) - { - gindex = TT_NEXT_USHORT( p ); - if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - } - - return SFNT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap10_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - FT_Byte* table = cmap->data; - FT_UInt result = 0; - FT_Byte* p = table + 12; - FT_UInt32 start = TT_NEXT_ULONG( p ); - FT_UInt32 count = TT_NEXT_ULONG( p ); - FT_UInt32 idx = (FT_ULong)( char_code - start ); - - - if ( idx < count ) - { - p += 2 * idx; - result = TT_PEEK_USHORT( p ); - } - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap10_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_Byte* table = cmap->data; - FT_UInt32 char_code = *pchar_code + 1; - FT_UInt gindex = 0; - FT_Byte* p = table + 12; - FT_UInt32 start = TT_NEXT_ULONG( p ); - FT_UInt32 count = TT_NEXT_ULONG( p ); - FT_UInt32 idx; - - - if ( char_code < start ) - char_code = start; - - idx = (FT_UInt32)( char_code - start ); - p += 2 * idx; - - for ( ; idx < count; idx++ ) - { - gindex = TT_NEXT_USHORT( p ); - if ( gindex != 0 ) - break; - char_code++; - } - - *pchar_code = char_code; - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap10_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 8; - - - cmap_info->format = 10; - cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); - - return SFNT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP(tt_cmap10_class_rec, - sizeof ( TT_CMapRec ), - - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap10_char_index, - (FT_CMap_CharNextFunc) tt_cmap10_char_next, - - NULL, NULL, NULL, NULL, NULL - , - 10, - (TT_CMap_ValidateFunc) tt_cmap10_validate, - (TT_CMap_Info_GetFunc) tt_cmap10_get_info - ) - -#endif /* TT_CONFIG_CMAP_FORMAT_10 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 12 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 12 */ - /* reserved 2 USHORT reserved */ - /* length 4 ULONG length in bytes */ - /* language 8 ULONG Mac language code */ - /* count 12 ULONG number of groups */ - /* 16 */ - /* */ - /* This header is followed by `count' groups of the following format: */ - /* */ - /* start 0 ULONG first charcode */ - /* end 4 ULONG last charcode */ - /* startId 8 ULONG start glyph ID for the group */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_12 - - typedef struct TT_CMap12Rec_ - { - TT_CMapRec cmap; - FT_Bool valid; - FT_ULong cur_charcode; - FT_UInt cur_gindex; - FT_ULong cur_group; - FT_ULong num_groups; - - } TT_CMap12Rec, *TT_CMap12; - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap12_init( TT_CMap12 cmap, - FT_Byte* table ) - { - cmap->cmap.data = table; - - table += 12; - cmap->num_groups = FT_PEEK_ULONG( table ); - - cmap->valid = 0; - - return SFNT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap12_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p; - FT_ULong length; - FT_ULong num_groups; - - - if ( table + 16 > valid->limit ) - FT_INVALID_TOO_SHORT; - - p = table + 4; - length = TT_NEXT_ULONG( p ); - - p = table + 12; - num_groups = TT_NEXT_ULONG( p ); - - if ( length > (FT_ULong)( valid->limit - table ) || - length < 16 + 12 * num_groups ) - FT_INVALID_TOO_SHORT; - - /* check groups, they must be in increasing order */ - { - FT_ULong n, start, end, start_id, last = 0; - - - for ( n = 0; n < num_groups; n++ ) - { - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - start_id = TT_NEXT_ULONG( p ); - - if ( start > end ) - FT_INVALID_DATA; - - if ( n > 0 && start <= last ) - FT_INVALID_DATA; - - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - - last = end; - } - } - - return SFNT_Err_Ok; - } - - - /* search the index of the charcode next to cmap->cur_charcode */ - /* cmap->cur_group should be set up properly by caller */ - /* */ - static void - tt_cmap12_next( TT_CMap12 cmap ) - { - FT_Byte* p; - FT_ULong start, end, start_id, char_code; - FT_ULong n; - FT_UInt gindex; - - - if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) - goto Fail; - - char_code = cmap->cur_charcode + 1; - - n = cmap->cur_group; - - for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) - { - p = cmap->cmap.data + 16 + 12 * n; - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - start_id = TT_PEEK_ULONG( p ); - - if ( char_code < start ) - char_code = start; - - for ( ; char_code <= end; char_code++ ) - { - gindex = (FT_UInt)( start_id + char_code - start ); - - if ( gindex ) - { - cmap->cur_charcode = char_code;; - cmap->cur_gindex = gindex; - cmap->cur_group = n; - - return; - } - } - } - - Fail: - cmap->valid = 0; - } - - - static FT_UInt - tt_cmap12_char_map_binary( TT_CMap cmap, - FT_UInt32* pchar_code, - FT_Bool next ) - { - FT_UInt gindex = 0; - FT_Byte* p = cmap->data + 12; - FT_UInt32 num_groups = TT_PEEK_ULONG( p ); - FT_UInt32 char_code = *pchar_code; - FT_UInt32 start, end, start_id; - FT_UInt32 max, min, mid; - - - if ( !num_groups ) - return 0; - - /* make compiler happy */ - mid = num_groups; - end = 0xFFFFFFFFUL; - - if ( next ) - char_code++; - - min = 0; - max = num_groups; - - /* binary search */ - while ( min < max ) - { - mid = ( min + max ) >> 1; - p = cmap->data + 16 + 12 * mid; - - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - - if ( char_code < start ) - max = mid; - else if ( char_code > end ) - min = mid + 1; - else - { - start_id = TT_PEEK_ULONG( p ); - gindex = (FT_UInt)( start_id + char_code - start ); - - break; - } - } - - if ( next ) - { - TT_CMap12 cmap12 = (TT_CMap12)cmap; - - - /* if `char_code' is not in any group, then `mid' is */ - /* the group nearest to `char_code' */ - /* */ - - if ( char_code > end ) - { - mid++; - if ( mid == num_groups ) - return 0; - } - - cmap12->valid = 1; - cmap12->cur_charcode = char_code; - cmap12->cur_group = mid; - - if ( !gindex ) - { - tt_cmap12_next( cmap12 ); - - if ( cmap12->valid ) - gindex = cmap12->cur_gindex; - } - else - cmap12->cur_gindex = gindex; - - if ( gindex ) - *pchar_code = cmap12->cur_charcode; - } - - return gindex; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap12_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - return tt_cmap12_char_map_binary( cmap, &char_code, 0 ); - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap12_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - TT_CMap12 cmap12 = (TT_CMap12)cmap; - FT_ULong gindex; - - - if ( cmap12->cur_charcode >= 0xFFFFFFFFUL ) - return 0; - - /* no need to search */ - if ( cmap12->valid && cmap12->cur_charcode == *pchar_code ) - { - tt_cmap12_next( cmap12 ); - if ( cmap12->valid ) - { - gindex = cmap12->cur_gindex; - - /* XXX: check cur_charcode overflow is expected */ - if ( gindex ) - *pchar_code = (FT_UInt32)cmap12->cur_charcode; - } - else - gindex = 0; - } - else - gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 ); - - /* XXX: check gindex overflow is expected */ - return (FT_UInt32)gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap12_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 8; - - - cmap_info->format = 12; - cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); - - return SFNT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP(tt_cmap12_class_rec, - sizeof ( TT_CMap12Rec ), - - (FT_CMap_InitFunc) tt_cmap12_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap12_char_index, - (FT_CMap_CharNextFunc) tt_cmap12_char_next, - - NULL, NULL, NULL, NULL, NULL - , - 12, - (TT_CMap_ValidateFunc) tt_cmap12_validate, - (TT_CMap_Info_GetFunc) tt_cmap12_get_info - ) - -#endif /* TT_CONFIG_CMAP_FORMAT_12 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 13 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 13 */ - /* reserved 2 USHORT reserved */ - /* length 4 ULONG length in bytes */ - /* language 8 ULONG Mac language code */ - /* count 12 ULONG number of groups */ - /* 16 */ - /* */ - /* This header is followed by `count' groups of the following format: */ - /* */ - /* start 0 ULONG first charcode */ - /* end 4 ULONG last charcode */ - /* glyphId 8 ULONG glyph ID for the whole group */ - /* */ - -#ifdef TT_CONFIG_CMAP_FORMAT_13 - - typedef struct TT_CMap13Rec_ - { - TT_CMapRec cmap; - FT_Bool valid; - FT_ULong cur_charcode; - FT_UInt cur_gindex; - FT_ULong cur_group; - FT_ULong num_groups; - - } TT_CMap13Rec, *TT_CMap13; - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap13_init( TT_CMap13 cmap, - FT_Byte* table ) - { - cmap->cmap.data = table; - - table += 12; - cmap->num_groups = FT_PEEK_ULONG( table ); - - cmap->valid = 0; - - return SFNT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap13_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p; - FT_ULong length; - FT_ULong num_groups; - - - if ( table + 16 > valid->limit ) - FT_INVALID_TOO_SHORT; - - p = table + 4; - length = TT_NEXT_ULONG( p ); - - p = table + 12; - num_groups = TT_NEXT_ULONG( p ); - - if ( length > (FT_ULong)( valid->limit - table ) || - length < 16 + 12 * num_groups ) - FT_INVALID_TOO_SHORT; - - /* check groups, they must be in increasing order */ - { - FT_ULong n, start, end, glyph_id, last = 0; - - - for ( n = 0; n < num_groups; n++ ) - { - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - glyph_id = TT_NEXT_ULONG( p ); - - if ( start > end ) - FT_INVALID_DATA; - - if ( n > 0 && start <= last ) - FT_INVALID_DATA; - - if ( valid->level >= FT_VALIDATE_TIGHT ) - { - if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - - last = end; - } - } - - return SFNT_Err_Ok; - } - - - /* search the index of the charcode next to cmap->cur_charcode */ - /* cmap->cur_group should be set up properly by caller */ - /* */ - static void - tt_cmap13_next( TT_CMap13 cmap ) - { - FT_Byte* p; - FT_ULong start, end, glyph_id, char_code; - FT_ULong n; - FT_UInt gindex; - - - if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) - goto Fail; - - char_code = cmap->cur_charcode + 1; - - n = cmap->cur_group; - - for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) - { - p = cmap->cmap.data + 16 + 12 * n; - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - glyph_id = TT_PEEK_ULONG( p ); - - if ( char_code < start ) - char_code = start; - - if ( char_code <= end ) - { - gindex = (FT_UInt)glyph_id; - - if ( gindex ) - { - cmap->cur_charcode = char_code;; - cmap->cur_gindex = gindex; - cmap->cur_group = n; - - return; - } - } - } - - Fail: - cmap->valid = 0; - } - - - static FT_UInt - tt_cmap13_char_map_binary( TT_CMap cmap, - FT_UInt32* pchar_code, - FT_Bool next ) - { - FT_UInt gindex = 0; - FT_Byte* p = cmap->data + 12; - FT_UInt32 num_groups = TT_PEEK_ULONG( p ); - FT_UInt32 char_code = *pchar_code; - FT_UInt32 start, end; - FT_UInt32 max, min, mid; - - - if ( !num_groups ) - return 0; - - /* make compiler happy */ - mid = num_groups; - end = 0xFFFFFFFFUL; - - if ( next ) - char_code++; - - min = 0; - max = num_groups; - - /* binary search */ - while ( min < max ) - { - mid = ( min + max ) >> 1; - p = cmap->data + 16 + 12 * mid; - - start = TT_NEXT_ULONG( p ); - end = TT_NEXT_ULONG( p ); - - if ( char_code < start ) - max = mid; - else if ( char_code > end ) - min = mid + 1; - else - { - gindex = (FT_UInt)TT_PEEK_ULONG( p ); - - break; - } - } - - if ( next ) - { - TT_CMap13 cmap13 = (TT_CMap13)cmap; - - - /* if `char_code' is not in any group, then `mid' is */ - /* the group nearest to `char_code' */ - /* */ - - if ( char_code > end ) - { - mid++; - if ( mid == num_groups ) - return 0; - } - - cmap13->valid = 1; - cmap13->cur_charcode = char_code; - cmap13->cur_group = mid; - - if ( !gindex ) - { - tt_cmap13_next( cmap13 ); - - if ( cmap13->valid ) - gindex = cmap13->cur_gindex; - } - else - cmap13->cur_gindex = gindex; - - if ( gindex ) - *pchar_code = cmap13->cur_charcode; - } - - return gindex; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap13_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - return tt_cmap13_char_map_binary( cmap, &char_code, 0 ); - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap13_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - TT_CMap13 cmap13 = (TT_CMap13)cmap; - FT_UInt gindex; - - - if ( cmap13->cur_charcode >= 0xFFFFFFFFUL ) - return 0; - - /* no need to search */ - if ( cmap13->valid && cmap13->cur_charcode == *pchar_code ) - { - tt_cmap13_next( cmap13 ); - if ( cmap13->valid ) - { - gindex = cmap13->cur_gindex; - if ( gindex ) - *pchar_code = cmap13->cur_charcode; - } - else - gindex = 0; - } - else - gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 ); - - return gindex; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap13_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 8; - - - cmap_info->format = 13; - cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); - - return SFNT_Err_Ok; - } - - - FT_DEFINE_TT_CMAP(tt_cmap13_class_rec, - sizeof ( TT_CMap13Rec ), - - (FT_CMap_InitFunc) tt_cmap13_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap13_char_index, - (FT_CMap_CharNextFunc) tt_cmap13_char_next, - - NULL, NULL, NULL, NULL, NULL - , - 13, - (TT_CMap_ValidateFunc) tt_cmap13_validate, - (TT_CMap_Info_GetFunc) tt_cmap13_get_info - ) - -#endif /* TT_CONFIG_CMAP_FORMAT_13 */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FORMAT 14 *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* TABLE OVERVIEW */ - /* -------------- */ - /* */ - /* NAME OFFSET TYPE DESCRIPTION */ - /* */ - /* format 0 USHORT must be 14 */ - /* length 2 ULONG table length in bytes */ - /* numSelector 6 ULONG number of variation sel. records */ - /* */ - /* Followed by numSelector records, each of which looks like */ - /* */ - /* varSelector 0 UINT24 Unicode codepoint of sel. */ - /* defaultOff 3 ULONG offset to a default UVS table */ - /* describing any variants to be found in */ - /* the normal Unicode subtable. */ - /* nonDefOff 7 ULONG offset to a non-default UVS table */ - /* describing any variants not in the */ - /* standard cmap, with GIDs here */ - /* (either offset may be 0 NULL) */ - /* */ - /* Selectors are sorted by code point. */ - /* */ - /* A default Unicode Variation Selector (UVS) subtable is just a list of */ - /* ranges of code points which are to be found in the standard cmap. No */ - /* glyph IDs (GIDs) here. */ - /* */ - /* numRanges 0 ULONG number of ranges following */ - /* */ - /* A range looks like */ - /* */ - /* uniStart 0 UINT24 code point of the first character in */ - /* this range */ - /* additionalCnt 3 UBYTE count of additional characters in this */ - /* range (zero means a range of a single */ - /* character) */ - /* */ - /* Ranges are sorted by `uniStart'. */ - /* */ - /* A non-default Unicode Variation Selector (UVS) subtable is a list of */ - /* mappings from codepoint to GID. */ - /* */ - /* numMappings 0 ULONG number of mappings */ - /* */ - /* A range looks like */ - /* */ - /* uniStart 0 UINT24 code point of the first character in */ - /* this range */ - /* GID 3 USHORT and its GID */ - /* */ - /* Ranges are sorted by `uniStart'. */ - -#ifdef TT_CONFIG_CMAP_FORMAT_14 - - typedef struct TT_CMap14Rec_ - { - TT_CMapRec cmap; - FT_ULong num_selectors; - - /* This array is used to store the results of various - * cmap 14 query functions. The data is overwritten - * on each call to these functions. - */ - FT_UInt32 max_results; - FT_UInt32* results; - FT_Memory memory; - - } TT_CMap14Rec, *TT_CMap14; - - - FT_CALLBACK_DEF( void ) - tt_cmap14_done( TT_CMap14 cmap ) - { - FT_Memory memory = cmap->memory; - - - cmap->max_results = 0; - if ( memory != NULL && cmap->results != NULL ) - FT_FREE( cmap->results ); - } - - - static FT_Error - tt_cmap14_ensure( TT_CMap14 cmap, - FT_UInt32 num_results, - FT_Memory memory ) - { - FT_UInt32 old_max = cmap->max_results; - FT_Error error = SFNT_Err_Ok; - - - if ( num_results > cmap->max_results ) - { - cmap->memory = memory; - - if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) ) - return error; - - cmap->max_results = num_results; - } - - return error; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap14_init( TT_CMap14 cmap, - FT_Byte* table ) - { - cmap->cmap.data = table; - - table += 6; - cmap->num_selectors = FT_PEEK_ULONG( table ); - cmap->max_results = 0; - cmap->results = NULL; - - return SFNT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap14_validate( FT_Byte* table, - FT_Validator valid ) - { - FT_Byte* p = table + 2; - FT_ULong length = TT_NEXT_ULONG( p ); - FT_ULong num_selectors = TT_NEXT_ULONG( p ); - - - if ( length > (FT_ULong)( valid->limit - table ) || - length < 10 + 11 * num_selectors ) - FT_INVALID_TOO_SHORT; - - /* check selectors, they must be in increasing order */ - { - /* we start lastVarSel at 1 because a variant selector value of 0 - * isn't valid. - */ - FT_ULong n, lastVarSel = 1; - - - for ( n = 0; n < num_selectors; n++ ) - { - FT_ULong varSel = TT_NEXT_UINT24( p ); - FT_ULong defOff = TT_NEXT_ULONG( p ); - FT_ULong nondefOff = TT_NEXT_ULONG( p ); - - - if ( defOff >= length || nondefOff >= length ) - FT_INVALID_TOO_SHORT; - - if ( varSel < lastVarSel ) - FT_INVALID_DATA; - - lastVarSel = varSel + 1; - - /* check the default table (these glyphs should be reached */ - /* through the normal Unicode cmap, no GIDs, just check order) */ - if ( defOff != 0 ) - { - FT_Byte* defp = table + defOff; - FT_ULong numRanges = TT_NEXT_ULONG( defp ); - FT_ULong i; - FT_ULong lastBase = 0; - - - if ( defp + numRanges * 4 > valid->limit ) - FT_INVALID_TOO_SHORT; - - for ( i = 0; i < numRanges; ++i ) - { - FT_ULong base = TT_NEXT_UINT24( defp ); - FT_ULong cnt = FT_NEXT_BYTE( defp ); - - - if ( base + cnt >= 0x110000UL ) /* end of Unicode */ - FT_INVALID_DATA; - - if ( base < lastBase ) - FT_INVALID_DATA; - - lastBase = base + cnt + 1U; - } - } - - /* and the non-default table (these glyphs are specified here) */ - if ( nondefOff != 0 ) - { - FT_Byte* ndp = table + nondefOff; - FT_ULong numMappings = TT_NEXT_ULONG( ndp ); - FT_ULong i, lastUni = 0; - - - if ( numMappings * 4 > (FT_ULong)( valid->limit - ndp ) ) - FT_INVALID_TOO_SHORT; - - for ( i = 0; i < numMappings; ++i ) - { - FT_ULong uni = TT_NEXT_UINT24( ndp ); - FT_ULong gid = TT_NEXT_USHORT( ndp ); - - - if ( uni >= 0x110000UL ) /* end of Unicode */ - FT_INVALID_DATA; - - if ( uni < lastUni ) - FT_INVALID_DATA; - - lastUni = uni + 1U; - - if ( valid->level >= FT_VALIDATE_TIGHT && - gid >= TT_VALID_GLYPH_COUNT( valid ) ) - FT_INVALID_GLYPH_ID; - } - } - } - } - - return SFNT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap14_char_index( TT_CMap cmap, - FT_UInt32 char_code ) - { - FT_UNUSED( cmap ); - FT_UNUSED( char_code ); - - /* This can't happen */ - return 0; - } - - - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap14_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) - { - FT_UNUSED( cmap ); - - /* This can't happen */ - *pchar_code = 0; - return 0; - } - - - FT_CALLBACK_DEF( FT_Error ) - tt_cmap14_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_UNUSED( cmap ); - - cmap_info->format = 14; - /* subtable 14 does not define a language field */ - cmap_info->language = 0xFFFFFFFFUL; - - return SFNT_Err_Ok; - } - - - static FT_UInt - tt_cmap14_char_map_def_binary( FT_Byte *base, - FT_UInt32 char_code ) - { - FT_UInt32 numRanges = TT_PEEK_ULONG( base ); - FT_UInt32 max, min; - - - min = 0; - max = numRanges; - - base += 4; - - /* binary search */ - while ( min < max ) - { - FT_UInt32 mid = ( min + max ) >> 1; - FT_Byte* p = base + 4 * mid; - FT_ULong start = TT_NEXT_UINT24( p ); - FT_UInt cnt = FT_NEXT_BYTE( p ); - - - if ( char_code < start ) - max = mid; - else if ( char_code > start+cnt ) - min = mid + 1; - else - return TRUE; - } - - return FALSE; - } - - - static FT_UInt - tt_cmap14_char_map_nondef_binary( FT_Byte *base, - FT_UInt32 char_code ) - { - FT_UInt32 numMappings = TT_PEEK_ULONG( base ); - FT_UInt32 max, min; - - - min = 0; - max = numMappings; - - base += 4; - - /* binary search */ - while ( min < max ) - { - FT_UInt32 mid = ( min + max ) >> 1; - FT_Byte* p = base + 5 * mid; - FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); - - - if ( char_code < uni ) - max = mid; - else if ( char_code > uni ) - min = mid + 1; - else - return TT_PEEK_USHORT( p ); - } - - return 0; - } - - - static FT_Byte* - tt_cmap14_find_variant( FT_Byte *base, - FT_UInt32 variantCode ) - { - FT_UInt32 numVar = TT_PEEK_ULONG( base ); - FT_UInt32 max, min; - - - min = 0; - max = numVar; - - base += 4; - - /* binary search */ - while ( min < max ) - { - FT_UInt32 mid = ( min + max ) >> 1; - FT_Byte* p = base + 11 * mid; - FT_ULong varSel = TT_NEXT_UINT24( p ); - - - if ( variantCode < varSel ) - max = mid; - else if ( variantCode > varSel ) - min = mid + 1; - else - return p; - } - - return NULL; - } - - - FT_CALLBACK_DEF( FT_UInt ) - tt_cmap14_char_var_index( TT_CMap cmap, - TT_CMap ucmap, - FT_UInt32 charcode, - FT_UInt32 variantSelector) - { - FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); - FT_ULong defOff; - FT_ULong nondefOff; - - - if ( !p ) - return 0; - - defOff = TT_NEXT_ULONG( p ); - nondefOff = TT_PEEK_ULONG( p ); - - if ( defOff != 0 && - tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) - { - /* This is the default variant of this charcode. GID not stored */ - /* here; stored in the normal Unicode charmap instead. */ - return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode ); - } - - if ( nondefOff != 0 ) - return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, - charcode ); - - return 0; - } - - - FT_CALLBACK_DEF( FT_Int ) - tt_cmap14_char_var_isdefault( TT_CMap cmap, - FT_UInt32 charcode, - FT_UInt32 variantSelector ) - { - FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); - FT_ULong defOff; - FT_ULong nondefOff; - - - if ( !p ) - return -1; - - defOff = TT_NEXT_ULONG( p ); - nondefOff = TT_NEXT_ULONG( p ); - - if ( defOff != 0 && - tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) - return 1; - - if ( nondefOff != 0 && - tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, - charcode ) != 0 ) - return 0; - - return -1; - } - - - FT_CALLBACK_DEF( FT_UInt32* ) - tt_cmap14_variants( TT_CMap cmap, - FT_Memory memory ) - { - TT_CMap14 cmap14 = (TT_CMap14)cmap; - FT_UInt32 count = cmap14->num_selectors; - FT_Byte* p = cmap->data + 10; - FT_UInt32* result; - FT_UInt32 i; - - - if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) - return NULL; - - result = cmap14->results; - for ( i = 0; i < count; ++i ) - { - result[i] = (FT_UInt32)TT_NEXT_UINT24( p ); - p += 8; - } - result[i] = 0; - - return result; - } - - - FT_CALLBACK_DEF( FT_UInt32 * ) - tt_cmap14_char_variants( TT_CMap cmap, - FT_Memory memory, - FT_UInt32 charCode ) - { - TT_CMap14 cmap14 = (TT_CMap14) cmap; - FT_UInt32 count = cmap14->num_selectors; - FT_Byte* p = cmap->data + 10; - FT_UInt32* q; - - - if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) - return NULL; - - for ( q = cmap14->results; count > 0; --count ) - { - FT_UInt32 varSel = TT_NEXT_UINT24( p ); - FT_ULong defOff = TT_NEXT_ULONG( p ); - FT_ULong nondefOff = TT_NEXT_ULONG( p ); - - - if ( ( defOff != 0 && - tt_cmap14_char_map_def_binary( cmap->data + defOff, - charCode ) ) || - ( nondefOff != 0 && - tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, - charCode ) != 0 ) ) - { - q[0] = varSel; - q++; - } - } - q[0] = 0; - - return cmap14->results; - } - - - static FT_UInt - tt_cmap14_def_char_count( FT_Byte *p ) - { - FT_UInt32 numRanges = (FT_UInt32)TT_NEXT_ULONG( p ); - FT_UInt tot = 0; - - - p += 3; /* point to the first `cnt' field */ - for ( ; numRanges > 0; numRanges-- ) - { - tot += 1 + p[0]; - p += 4; - } - - return tot; - } - - - static FT_UInt32* - tt_cmap14_get_def_chars( TT_CMap cmap, - FT_Byte* p, - FT_Memory memory ) - { - TT_CMap14 cmap14 = (TT_CMap14) cmap; - FT_UInt32 numRanges; - FT_UInt cnt; - FT_UInt32* q; - - - cnt = tt_cmap14_def_char_count( p ); - numRanges = (FT_UInt32)TT_NEXT_ULONG( p ); - - if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) ) - return NULL; - - for ( q = cmap14->results; numRanges > 0; --numRanges ) - { - FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); - - - cnt = FT_NEXT_BYTE( p ) + 1; - do - { - q[0] = uni; - uni += 1; - q += 1; - } while ( --cnt != 0 ); - } - q[0] = 0; - - return cmap14->results; - } - - - static FT_UInt32* - tt_cmap14_get_nondef_chars( TT_CMap cmap, - FT_Byte *p, - FT_Memory memory ) - { - TT_CMap14 cmap14 = (TT_CMap14) cmap; - FT_UInt32 numMappings; - FT_UInt i; - FT_UInt32 *ret; - - - numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); - - if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) ) - return NULL; - - ret = cmap14->results; - for ( i = 0; i < numMappings; ++i ) - { - ret[i] = (FT_UInt32)TT_NEXT_UINT24( p ); - p += 2; - } - ret[i] = 0; - - return ret; - } - - - FT_CALLBACK_DEF( FT_UInt32 * ) - tt_cmap14_variant_chars( TT_CMap cmap, - FT_Memory memory, - FT_UInt32 variantSelector ) - { - FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6, - variantSelector ); - FT_UInt32 *ret; - FT_Int i; - FT_ULong defOff; - FT_ULong nondefOff; - - - if ( !p ) - return NULL; - - defOff = TT_NEXT_ULONG( p ); - nondefOff = TT_NEXT_ULONG( p ); - - if ( defOff == 0 && nondefOff == 0 ) - return NULL; - - if ( defOff == 0 ) - return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, - memory ); - else if ( nondefOff == 0 ) - return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, - memory ); - else - { - /* Both a default and a non-default glyph set? That's probably not */ - /* good font design, but the spec allows for it... */ - TT_CMap14 cmap14 = (TT_CMap14) cmap; - FT_UInt32 numRanges; - FT_UInt32 numMappings; - FT_UInt32 duni; - FT_UInt32 dcnt; - FT_UInt32 nuni; - FT_Byte* dp; - FT_UInt di, ni, k; - - - p = cmap->data + nondefOff; - dp = cmap->data + defOff; - - numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); - dcnt = tt_cmap14_def_char_count( dp ); - numRanges = (FT_UInt32)TT_NEXT_ULONG( dp ); - - if ( numMappings == 0 ) - return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, - memory ); - if ( dcnt == 0 ) - return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, - memory ); - - if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) ) - return NULL; - - ret = cmap14->results; - duni = (FT_UInt32)TT_NEXT_UINT24( dp ); - dcnt = FT_NEXT_BYTE( dp ); - di = 1; - nuni = (FT_UInt32)TT_NEXT_UINT24( p ); - p += 2; - ni = 1; - i = 0; - - for ( ;; ) - { - if ( nuni > duni + dcnt ) - { - for ( k = 0; k <= dcnt; ++k ) - ret[i++] = duni + k; - - ++di; - - if ( di > numRanges ) - break; - - duni = (FT_UInt32)TT_NEXT_UINT24( dp ); - dcnt = FT_NEXT_BYTE( dp ); - } - else - { - if ( nuni < duni ) - ret[i++] = nuni; - /* If it is within the default range then ignore it -- */ - /* that should not have happened */ - ++ni; - if ( ni > numMappings ) - break; - - nuni = (FT_UInt32)TT_NEXT_UINT24( p ); - p += 2; - } - } - - if ( ni <= numMappings ) - { - /* If we get here then we have run out of all default ranges. */ - /* We have read one non-default mapping which we haven't stored */ - /* and there may be others that need to be read. */ - ret[i++] = nuni; - while ( ni < numMappings ) - { - ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p ); - p += 2; - ++ni; - } - } - else if ( di <= numRanges ) - { - /* If we get here then we have run out of all non-default */ - /* mappings. We have read one default range which we haven't */ - /* stored and there may be others that need to be read. */ - for ( k = 0; k <= dcnt; ++k ) - ret[i++] = duni + k; - - while ( di < numRanges ) - { - duni = (FT_UInt32)TT_NEXT_UINT24( dp ); - dcnt = FT_NEXT_BYTE( dp ); - - for ( k = 0; k <= dcnt; ++k ) - ret[i++] = duni + k; - ++di; - } - } - - ret[i] = 0; - - return ret; - } - } - - - FT_DEFINE_TT_CMAP(tt_cmap14_class_rec, - sizeof ( TT_CMap14Rec ), - - (FT_CMap_InitFunc) tt_cmap14_init, - (FT_CMap_DoneFunc) tt_cmap14_done, - (FT_CMap_CharIndexFunc)tt_cmap14_char_index, - (FT_CMap_CharNextFunc) tt_cmap14_char_next, - - /* Format 14 extension functions */ - (FT_CMap_CharVarIndexFunc) tt_cmap14_char_var_index, - (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault, - (FT_CMap_VariantListFunc) tt_cmap14_variants, - (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants, - (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars - , - 14, - (TT_CMap_ValidateFunc)tt_cmap14_validate, - (TT_CMap_Info_GetFunc)tt_cmap14_get_info - ) - -#endif /* TT_CONFIG_CMAP_FORMAT_14 */ - - -#ifndef FT_CONFIG_OPTION_PIC - - static const TT_CMap_Class tt_cmap_classes[] = - { -#define TTCMAPCITEM(a) &a, -#include "ttcmapc.h" - NULL, - }; - -#else /*FT_CONFIG_OPTION_PIC*/ - - void FT_Destroy_Class_tt_cmap_classes(FT_Library library, TT_CMap_Class* clazz) - { - FT_Memory memory = library->memory; - if ( clazz ) - FT_FREE( clazz ); - } - - FT_Error FT_Create_Class_tt_cmap_classes(FT_Library library, TT_CMap_Class** output_class) - { - TT_CMap_Class* clazz; - TT_CMap_ClassRec* recs; - FT_Error error; - FT_Memory memory = library->memory; - int i = 0; - -#define TTCMAPCITEM(a) i++; -#include "ttcmapc.h" - - /* allocate enough space for both the pointers +terminator and the class instances */ - if ( FT_ALLOC( clazz, sizeof(*clazz)*(i+1)+sizeof(TT_CMap_ClassRec)*i ) ) - return error; - - /* the location of the class instances follows the array of pointers */ - recs = (TT_CMap_ClassRec*) (((char*)clazz)+(sizeof(*clazz)*(i+1))); - i=0; - -#undef TTCMAPCITEM -#define TTCMAPCITEM(a) \ - FT_Init_Class_##a(&recs[i]); \ - clazz[i] = &recs[i]; \ - i++; -#include "ttcmapc.h" - - clazz[i] = NULL; - - *output_class = clazz; - return SFNT_Err_Ok; - } - -#endif /*FT_CONFIG_OPTION_PIC*/ - - - /* parse the `cmap' table and build the corresponding TT_CMap objects */ - /* in the current face */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_build_cmaps( TT_Face face ) - { - FT_Byte* table = face->cmap_table; - FT_Byte* limit = table + face->cmap_size; - FT_UInt volatile num_cmaps; - FT_Byte* volatile p = table; - FT_Library library = FT_FACE_LIBRARY( face ); - - FT_UNUSED( library ); - - - if ( !p || p + 4 > limit ) - return SFNT_Err_Invalid_Table; - - /* only recognize format 0 */ - if ( TT_NEXT_USHORT( p ) != 0 ) - { - p -= 2; - FT_ERROR(( "tt_face_build_cmaps:" - " unsupported `cmap' table format = %d\n", - TT_PEEK_USHORT( p ) )); - return SFNT_Err_Invalid_Table; - } - - num_cmaps = TT_NEXT_USHORT( p ); -#ifdef FT_MAX_CHARMAP_CACHEABLE - if ( num_cmaps > FT_MAX_CHARMAP_CACHEABLE ) - FT_ERROR(( "tt_face_build_cmaps: too many cmap subtables(%d) " - "subtable#%d and later are loaded but cannot be searched\n", - num_cmaps, FT_MAX_CHARMAP_CACHEABLE + 1 )); -#endif - - for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- ) - { - FT_CharMapRec charmap; - FT_UInt32 offset; - - - charmap.platform_id = TT_NEXT_USHORT( p ); - charmap.encoding_id = TT_NEXT_USHORT( p ); - charmap.face = FT_FACE( face ); - charmap.encoding = FT_ENCODING_NONE; /* will be filled later */ - offset = TT_NEXT_ULONG( p ); - - if ( offset && offset <= face->cmap_size - 2 ) - { - FT_Byte* volatile cmap = table + offset; - volatile FT_UInt format = TT_PEEK_USHORT( cmap ); - const TT_CMap_Class* volatile pclazz = FT_TT_CMAP_CLASSES_GET; - TT_CMap_Class volatile clazz; - - - for ( ; *pclazz; pclazz++ ) - { - clazz = *pclazz; - if ( clazz->format == format ) - { - volatile TT_ValidatorRec valid; - volatile FT_Error error = SFNT_Err_Ok; - - - ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit, - FT_VALIDATE_DEFAULT ); - - valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs; - - if ( ft_setjmp( - *((ft_jmp_buf*)&FT_VALIDATOR( &valid )->jump_buffer) ) == 0 ) - { - /* validate this cmap sub-table */ - error = clazz->validate( cmap, FT_VALIDATOR( &valid ) ); - } - - if ( valid.validator.error == 0 ) - { - FT_CMap ttcmap; - - - /* It might make sense to store the single variation selector */ - /* cmap somewhere special. But it would have to be in the */ - /* public FT_FaceRec, and we can't change that. */ - - if ( !FT_CMap_New( (FT_CMap_Class)clazz, - cmap, &charmap, &ttcmap ) ) - { - /* it is simpler to directly set `flags' than adding */ - /* a parameter to FT_CMap_New */ - ((TT_CMap)ttcmap)->flags = (FT_Int)error; - } - } - else - { - FT_TRACE0(( "tt_face_build_cmaps:" - " broken cmap sub-table ignored\n" )); - } - break; - } - } - - if ( *pclazz == NULL ) - { - FT_TRACE0(( "tt_face_build_cmaps:" - " unsupported cmap sub-table ignored\n" )); - } - } - } - - return SFNT_Err_Ok; - } - - - FT_LOCAL( FT_Error ) - tt_get_cmap_info( FT_CharMap charmap, - TT_CMapInfo *cmap_info ) - { - FT_CMap cmap = (FT_CMap)charmap; - TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz; - - - return clazz->get_cmap_info( charmap, cmap_info ); - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttcmap.h b/android/jni/ndk_modules/freetype/src/sfnt/ttcmap.h deleted file mode 100644 index 15a4a21e..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttcmap.h +++ /dev/null @@ -1,125 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttcmap.h */ -/* */ -/* TrueType character mapping table (cmap) support (specification). */ -/* */ -/* Copyright 2002, 2003, 2004, 2005 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTCMAP_H__ -#define __TTCMAP_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_INTERNAL_VALIDATE_H -#include FT_SERVICE_TT_CMAP_H - -FT_BEGIN_HEADER - - -#define TT_CMAP_FLAG_UNSORTED 1 -#define TT_CMAP_FLAG_OVERLAPPING 2 - - typedef struct TT_CMapRec_ - { - FT_CMapRec cmap; - FT_Byte* data; /* pointer to in-memory cmap table */ - FT_Int flags; /* for format 4 only */ - - } TT_CMapRec, *TT_CMap; - - typedef const struct TT_CMap_ClassRec_* TT_CMap_Class; - - - typedef FT_Error - (*TT_CMap_ValidateFunc)( FT_Byte* data, - FT_Validator valid ); - - typedef struct TT_CMap_ClassRec_ - { - FT_CMap_ClassRec clazz; - FT_UInt format; - TT_CMap_ValidateFunc validate; - TT_CMap_Info_GetFunc get_cmap_info; - - } TT_CMap_ClassRec; - -#ifndef FT_CONFIG_OPTION_PIC - -#define FT_DEFINE_TT_CMAP(class_, size_, init_, done_, char_index_, \ - char_next_, char_var_index_, char_var_default_, variant_list_, \ - charvariant_list_,variantchar_list_, \ - format_, validate_, get_cmap_info_) \ - FT_CALLBACK_TABLE_DEF \ - const TT_CMap_ClassRec class_ = \ - { \ - {size_, init_, done_, char_index_, \ - char_next_, char_var_index_, char_var_default_, variant_list_, \ - charvariant_list_, variantchar_list_}, \ - format_, validate_, get_cmap_info_ \ - }; - -#else /* FT_CONFIG_OPTION_PIC */ - -#define FT_DEFINE_TT_CMAP(class_, size_, init_, done_, char_index_, \ - char_next_, char_var_index_, char_var_default_, variant_list_, \ - charvariant_list_,variantchar_list_, \ - format_, validate_, get_cmap_info_) \ - void \ - FT_Init_Class_##class_( TT_CMap_ClassRec* clazz ) \ - { \ - clazz->clazz.size = size_; \ - clazz->clazz.init = init_; \ - clazz->clazz.done = done_; \ - clazz->clazz.char_index = char_index_; \ - clazz->clazz.char_next = char_next_; \ - clazz->clazz.char_var_index = char_var_index_; \ - clazz->clazz.char_var_default = char_var_default_; \ - clazz->clazz.variant_list = variant_list_; \ - clazz->clazz.charvariant_list = charvariant_list_; \ - clazz->clazz.variantchar_list = variantchar_list_; \ - clazz->format = format_; \ - clazz->validate = validate_; \ - clazz->get_cmap_info = get_cmap_info_; \ - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - typedef struct TT_ValidatorRec_ - { - FT_ValidatorRec validator; - FT_UInt num_glyphs; - - } TT_ValidatorRec, *TT_Validator; - - -#define TT_VALIDATOR( x ) ((TT_Validator)( x )) -#define TT_VALID_GLYPH_COUNT( x ) TT_VALIDATOR( x )->num_glyphs - - - FT_LOCAL( FT_Error ) - tt_face_build_cmaps( TT_Face face ); - - /* used in tt-cmaps service */ - FT_LOCAL( FT_Error ) - tt_get_cmap_info( FT_CharMap charmap, - TT_CMapInfo *cmap_info ); - - -FT_END_HEADER - -#endif /* __TTCMAP_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttcmapc.h b/android/jni/ndk_modules/freetype/src/sfnt/ttcmapc.h deleted file mode 100644 index 4c9c6a56..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttcmapc.h +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttcmapc.h */ -/* */ -/* TT CMAP classes definitions (specification only). */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifdef TT_CONFIG_CMAP_FORMAT_0 - TTCMAPCITEM(tt_cmap0_class_rec) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_2 - TTCMAPCITEM(tt_cmap2_class_rec) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_4 - TTCMAPCITEM(tt_cmap4_class_rec) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_6 - TTCMAPCITEM(tt_cmap6_class_rec) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_8 - TTCMAPCITEM(tt_cmap8_class_rec) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_10 - TTCMAPCITEM(tt_cmap10_class_rec) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_12 - TTCMAPCITEM(tt_cmap12_class_rec) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_13 - TTCMAPCITEM(tt_cmap13_class_rec) -#endif - -#ifdef TT_CONFIG_CMAP_FORMAT_14 - TTCMAPCITEM(tt_cmap14_class_rec) -#endif - - /* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttkern.c b/android/jni/ndk_modules/freetype/src/sfnt/ttkern.c deleted file mode 100644 index 46888988..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttkern.c +++ /dev/null @@ -1,306 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttkern.c */ -/* */ -/* Load the basic TrueType kerning table. This doesn't handle */ -/* kerning data within the GPOS table at the moment. */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include "ttkern.h" - -#include "sferrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttkern - - -#undef TT_KERN_INDEX -#define TT_KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) ) - - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_kern( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_ULong table_size; - FT_Byte* p; - FT_Byte* p_limit; - FT_UInt nn, num_tables; - FT_UInt32 avail = 0, ordered = 0; - - - /* the kern table is optional; exit silently if it is missing */ - error = face->goto_table( face, TTAG_kern, stream, &table_size ); - if ( error ) - goto Exit; - - if ( table_size < 4 ) /* the case of a malformed table */ - { - FT_ERROR(( "tt_face_load_kern:" - " kerning table is too small - ignored\n" )); - error = SFNT_Err_Table_Missing; - goto Exit; - } - - if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) ) - { - FT_ERROR(( "tt_face_load_kern:" - " could not extract kerning table\n" )); - goto Exit; - } - - face->kern_table_size = table_size; - - p = face->kern_table; - p_limit = p + table_size; - - p += 2; /* skip version */ - num_tables = FT_NEXT_USHORT( p ); - - if ( num_tables > 32 ) /* we only support up to 32 sub-tables */ - num_tables = 32; - - for ( nn = 0; nn < num_tables; nn++ ) - { - FT_UInt num_pairs, length, coverage; - FT_Byte* p_next; - FT_UInt32 mask = (FT_UInt32)1UL << nn; - - - if ( p + 6 > p_limit ) - break; - - p_next = p; - - p += 2; /* skip version */ - length = FT_NEXT_USHORT( p ); - coverage = FT_NEXT_USHORT( p ); - - if ( length <= 6 ) - break; - - p_next += length; - - if ( p_next > p_limit ) /* handle broken table */ - p_next = p_limit; - - /* only use horizontal kerning tables */ - if ( ( coverage & ~8 ) != 0x0001 || - p + 8 > p_limit ) - goto NextTable; - - num_pairs = FT_NEXT_USHORT( p ); - p += 6; - - if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */ - num_pairs = (FT_UInt)( ( p_next - p ) / 6 ); - - avail |= mask; - - /* - * Now check whether the pairs in this table are ordered. - * We then can use binary search. - */ - if ( num_pairs > 0 ) - { - FT_ULong count; - FT_ULong old_pair; - - - old_pair = FT_NEXT_ULONG( p ); - p += 2; - - for ( count = num_pairs - 1; count > 0; count-- ) - { - FT_UInt32 cur_pair; - - - cur_pair = FT_NEXT_ULONG( p ); - if ( cur_pair <= old_pair ) - break; - - p += 2; - old_pair = cur_pair; - } - - if ( count == 0 ) - ordered |= mask; - } - - NextTable: - p = p_next; - } - - face->num_kern_tables = nn; - face->kern_avail_bits = avail; - face->kern_order_bits = ordered; - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - tt_face_done_kern( TT_Face face ) - { - FT_Stream stream = face->root.stream; - - - FT_FRAME_RELEASE( face->kern_table ); - face->kern_table_size = 0; - face->num_kern_tables = 0; - face->kern_avail_bits = 0; - face->kern_order_bits = 0; - } - - - FT_LOCAL_DEF( FT_Int ) - tt_face_get_kerning( TT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph ) - { - FT_Int result = 0; - FT_UInt count, mask = 1; - FT_Byte* p = face->kern_table; - FT_Byte* p_limit = p + face->kern_table_size; - - - p += 4; - mask = 0x0001; - - for ( count = face->num_kern_tables; - count > 0 && p + 6 <= p_limit; - count--, mask <<= 1 ) - { - FT_Byte* base = p; - FT_Byte* next = base; - FT_UInt version = FT_NEXT_USHORT( p ); - FT_UInt length = FT_NEXT_USHORT( p ); - FT_UInt coverage = FT_NEXT_USHORT( p ); - FT_UInt num_pairs; - FT_Int value = 0; - - FT_UNUSED( version ); - - - next = base + length; - - if ( next > p_limit ) /* handle broken table */ - next = p_limit; - - if ( ( face->kern_avail_bits & mask ) == 0 ) - goto NextTable; - - if ( p + 8 > next ) - goto NextTable; - - num_pairs = FT_NEXT_USHORT( p ); - p += 6; - - if ( ( next - p ) < 6 * (int)num_pairs ) /* handle broken count */ - num_pairs = (FT_UInt)( ( next - p ) / 6 ); - - switch ( coverage >> 8 ) - { - case 0: - { - FT_ULong key0 = TT_KERN_INDEX( left_glyph, right_glyph ); - - - if ( face->kern_order_bits & mask ) /* binary search */ - { - FT_UInt min = 0; - FT_UInt max = num_pairs; - - - while ( min < max ) - { - FT_UInt mid = ( min + max ) >> 1; - FT_Byte* q = p + 6 * mid; - FT_ULong key; - - - key = FT_NEXT_ULONG( q ); - - if ( key == key0 ) - { - value = FT_PEEK_SHORT( q ); - goto Found; - } - if ( key < key0 ) - min = mid + 1; - else - max = mid; - } - } - else /* linear search */ - { - FT_UInt count2; - - - for ( count2 = num_pairs; count2 > 0; count2-- ) - { - FT_ULong key = FT_NEXT_ULONG( p ); - - - if ( key == key0 ) - { - value = FT_PEEK_SHORT( p ); - goto Found; - } - p += 2; - } - } - } - break; - - /* - * We don't support format 2 because we haven't seen a single font - * using it in real life... - */ - - default: - ; - } - - goto NextTable; - - Found: - if ( coverage & 8 ) /* override or add */ - result = value; - else - result += value; - - NextTable: - p = next; - } - - return result; - } - -#undef TT_KERN_INDEX - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttkern.h b/android/jni/ndk_modules/freetype/src/sfnt/ttkern.h deleted file mode 100644 index df1da9b2..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttkern.h +++ /dev/null @@ -1,52 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttkern.h */ -/* */ -/* Load the basic TrueType kerning table. This doesn't handle */ -/* kerning data within the GPOS table at the moment. */ -/* */ -/* Copyright 1996-2001, 2002, 2005, 2007 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTKERN_H__ -#define __TTKERN_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - tt_face_load_kern( TT_Face face, - FT_Stream stream ); - - FT_LOCAL( void ) - tt_face_done_kern( TT_Face face ); - - FT_LOCAL( FT_Int ) - tt_face_get_kerning( TT_Face face, - FT_UInt left_glyph, - FT_UInt right_glyph ); - -#define TT_FACE_HAS_KERNING( face ) ( (face)->kern_avail_bits != 0 ) - - -FT_END_HEADER - -#endif /* __TTKERN_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttload.c b/android/jni/ndk_modules/freetype/src/sfnt/ttload.c deleted file mode 100644 index 1c174aff..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttload.c +++ /dev/null @@ -1,1262 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttload.c */ -/* */ -/* Load the basic TrueType tables, i.e., tables that can be either in */ -/* TTF or OTF fonts (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include "ttload.h" - -#include "sferrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttload - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_lookup_table */ - /* */ - /* <Description> */ - /* Looks for a TrueType table by name. */ - /* */ - /* <Input> */ - /* face :: A face object handle. */ - /* */ - /* tag :: The searched tag. */ - /* */ - /* <Return> */ - /* A pointer to the table directory entry. 0 if not found. */ - /* */ - FT_LOCAL_DEF( TT_Table ) - tt_face_lookup_table( TT_Face face, - FT_ULong tag ) - { - TT_Table entry; - TT_Table limit; -#ifdef FT_DEBUG_LEVEL_TRACE - FT_Bool zero_length = FALSE; -#endif - - - FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ", - face, - (FT_Char)( tag >> 24 ), - (FT_Char)( tag >> 16 ), - (FT_Char)( tag >> 8 ), - (FT_Char)( tag ) )); - - entry = face->dir_tables; - limit = entry + face->num_tables; - - for ( ; entry < limit; entry++ ) - { - /* For compatibility with Windows, we consider */ - /* zero-length tables the same as missing tables. */ - if ( entry->Tag == tag ) - { - if ( entry->Length != 0 ) - { - FT_TRACE4(( "found table.\n" )); - return entry; - } -#ifdef FT_DEBUG_LEVEL_TRACE - zero_length = TRUE; -#endif - } - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( zero_length ) - FT_TRACE4(( "ignoring empty table\n" )); - else - FT_TRACE4(( "could not find table\n" )); -#endif - - return NULL; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_goto_table */ - /* */ - /* <Description> */ - /* Looks for a TrueType table by name, then seek a stream to it. */ - /* */ - /* <Input> */ - /* face :: A face object handle. */ - /* */ - /* tag :: The searched tag. */ - /* */ - /* stream :: The stream to seek when the table is found. */ - /* */ - /* <Output> */ - /* length :: The length of the table if found, undefined otherwise. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_goto_table( TT_Face face, - FT_ULong tag, - FT_Stream stream, - FT_ULong* length ) - { - TT_Table table; - FT_Error error; - - - table = tt_face_lookup_table( face, tag ); - if ( table ) - { - if ( length ) - *length = table->Length; - - if ( FT_STREAM_SEEK( table->Offset ) ) - goto Exit; - } - else - error = SFNT_Err_Table_Missing; - - Exit: - return error; - } - - - /* Here, we */ - /* */ - /* - check that `num_tables' is valid (and adjust it if necessary) */ - /* */ - /* - look for a `head' table, check its size, and parse it to check */ - /* whether its `magic' field is correctly set */ - /* */ - /* - errors (except errors returned by stream handling) */ - /* */ - /* SFNT_Err_Unknown_File_Format: */ - /* no table is defined in directory, it is not sfnt-wrapped */ - /* data */ - /* SFNT_Err_Table_Missing: */ - /* table directory is valid, but essential tables */ - /* (head/bhed/SING) are missing */ - /* */ - static FT_Error - check_table_dir( SFNT_Header sfnt, - FT_Stream stream ) - { - FT_Error error; - FT_UShort nn, valid_entries = 0; - FT_UInt has_head = 0, has_sing = 0, has_meta = 0; - FT_ULong offset = sfnt->offset + 12; - - static const FT_Frame_Field table_dir_entry_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_TableRec - - FT_FRAME_START( 16 ), - FT_FRAME_ULONG( Tag ), - FT_FRAME_ULONG( CheckSum ), - FT_FRAME_ULONG( Offset ), - FT_FRAME_ULONG( Length ), - FT_FRAME_END - }; - - - if ( FT_STREAM_SEEK( offset ) ) - goto Exit; - - for ( nn = 0; nn < sfnt->num_tables; nn++ ) - { - TT_TableRec table; - - - if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) ) - { - nn--; - FT_TRACE2(( "check_table_dir:" - " can read only %d table%s in font (instead of %d)\n", - nn, nn == 1 ? "" : "s", sfnt->num_tables )); - sfnt->num_tables = nn; - break; - } - - /* we ignore invalid tables */ - if ( table.Offset + table.Length > stream->size ) - { - FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn )); - continue; - } - else - valid_entries++; - - if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed ) - { - FT_UInt32 magic; - - -#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - if ( table.Tag == TTAG_head ) -#endif - has_head = 1; - - /* - * The table length should be 0x36, but certain font tools make it - * 0x38, so we will just check that it is greater. - * - * Note that according to the specification, the table must be - * padded to 32-bit lengths, but this doesn't apply to the value of - * its `Length' field! - * - */ - if ( table.Length < 0x36 ) - { - FT_TRACE2(( "check_table_dir: `head' table too small\n" )); - error = SFNT_Err_Table_Missing; - goto Exit; - } - - if ( FT_STREAM_SEEK( table.Offset + 12 ) || - FT_READ_ULONG( magic ) ) - goto Exit; - - if ( magic != 0x5F0F3CF5UL ) - { - FT_TRACE2(( "check_table_dir:" - " no magic number found in `head' table\n")); - error = SFNT_Err_Table_Missing; - goto Exit; - } - - if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) ) - goto Exit; - } - else if ( table.Tag == TTAG_SING ) - has_sing = 1; - else if ( table.Tag == TTAG_META ) - has_meta = 1; - } - - sfnt->num_tables = valid_entries; - - if ( sfnt->num_tables == 0 ) - { - FT_TRACE2(( "check_table_dir: no tables found\n" )); - error = SFNT_Err_Unknown_File_Format; - goto Exit; - } - - /* if `sing' and `meta' tables are present, there is no `head' table */ - if ( has_head || ( has_sing && has_meta ) ) - { - error = SFNT_Err_Ok; - goto Exit; - } - else - { - FT_TRACE2(( "check_table_dir:" )); -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" )); -#else - FT_TRACE2(( " neither `head' nor `sing' table found\n" )); -#endif - error = SFNT_Err_Table_Missing; - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_font_dir */ - /* */ - /* <Description> */ - /* Loads the header of a SFNT font file. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Output> */ - /* sfnt :: The SFNT header. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The stream cursor must be at the beginning of the font directory. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_font_dir( TT_Face face, - FT_Stream stream ) - { - SFNT_HeaderRec sfnt; - FT_Error error; - FT_Memory memory = stream->memory; - TT_TableRec* entry; - FT_Int nn; - - static const FT_Frame_Field offset_table_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE SFNT_HeaderRec - - FT_FRAME_START( 8 ), - FT_FRAME_USHORT( num_tables ), - FT_FRAME_USHORT( search_range ), - FT_FRAME_USHORT( entry_selector ), - FT_FRAME_USHORT( range_shift ), - FT_FRAME_END - }; - - - FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face )); - - /* read the offset table */ - - sfnt.offset = FT_STREAM_POS(); - - if ( FT_READ_ULONG( sfnt.format_tag ) || - FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) ) - goto Exit; - - /* many fonts don't have these fields set correctly */ -#if 0 - if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 ) || - sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 ) - return SFNT_Err_Unknown_File_Format; -#endif - - /* load the table directory */ - - FT_TRACE2(( "-- Number of tables: %10u\n", sfnt.num_tables )); - FT_TRACE2(( "-- Format version: 0x%08lx\n", sfnt.format_tag )); - - /* check first */ - error = check_table_dir( &sfnt, stream ); - if ( error ) - { - FT_TRACE2(( "tt_face_load_font_dir:" - " invalid table directory for TrueType\n" )); - - goto Exit; - } - - face->num_tables = sfnt.num_tables; - face->format_tag = sfnt.format_tag; - - if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) ) - goto Exit; - - if ( FT_STREAM_SEEK( sfnt.offset + 12 ) || - FT_FRAME_ENTER( face->num_tables * 16L ) ) - goto Exit; - - entry = face->dir_tables; - - for ( nn = 0; nn < sfnt.num_tables; nn++ ) - { - entry->Tag = FT_GET_TAG4(); - entry->CheckSum = FT_GET_ULONG(); - entry->Offset = FT_GET_LONG(); - entry->Length = FT_GET_LONG(); - - /* ignore invalid tables */ - if ( entry->Offset + entry->Length > stream->size ) - continue; - else - { - FT_TRACE2(( " %c%c%c%c - %08lx - %08lx\n", - (FT_Char)( entry->Tag >> 24 ), - (FT_Char)( entry->Tag >> 16 ), - (FT_Char)( entry->Tag >> 8 ), - (FT_Char)( entry->Tag ), - entry->Offset, - entry->Length )); - entry++; - } - } - - FT_FRAME_EXIT(); - - FT_TRACE2(( "table directory loaded\n\n" )); - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_any */ - /* */ - /* <Description> */ - /* Loads any font table into client memory. */ - /* */ - /* <Input> */ - /* face :: The face object to look for. */ - /* */ - /* tag :: The tag of table to load. Use the value 0 if you want */ - /* to access the whole font file, else set this parameter */ - /* to a valid TrueType table tag that you can forge with */ - /* the MAKE_TT_TAG macro. */ - /* */ - /* offset :: The starting offset in the table (or the file if */ - /* tag == 0). */ - /* */ - /* length :: The address of the decision variable: */ - /* */ - /* If length == NULL: */ - /* Loads the whole table. Returns an error if */ - /* `offset' == 0! */ - /* */ - /* If *length == 0: */ - /* Exits immediately; returning the length of the given */ - /* table or of the font file, depending on the value of */ - /* `tag'. */ - /* */ - /* If *length != 0: */ - /* Loads the next `length' bytes of table or font, */ - /* starting at offset `offset' (in table or font too). */ - /* */ - /* <Output> */ - /* buffer :: The address of target buffer. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_any( TT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte* buffer, - FT_ULong* length ) - { - FT_Error error; - FT_Stream stream; - TT_Table table; - FT_ULong size; - - - if ( tag != 0 ) - { - /* look for tag in font directory */ - table = tt_face_lookup_table( face, tag ); - if ( !table ) - { - error = SFNT_Err_Table_Missing; - goto Exit; - } - - offset += table->Offset; - size = table->Length; - } - else - /* tag == 0 -- the user wants to access the font file directly */ - size = face->root.stream->size; - - if ( length && *length == 0 ) - { - *length = size; - - return SFNT_Err_Ok; - } - - if ( length ) - size = *length; - - stream = face->root.stream; - /* the `if' is syntactic sugar for picky compilers */ - if ( FT_STREAM_READ_AT( offset, buffer, size ) ) - goto Exit; - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_generic_header */ - /* */ - /* <Description> */ - /* Loads the TrueType table `head' or `bhed'. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - tt_face_load_generic_header( TT_Face face, - FT_Stream stream, - FT_ULong tag ) - { - FT_Error error; - TT_Header* header; - - static const FT_Frame_Field header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_Header - - FT_FRAME_START( 54 ), - FT_FRAME_ULONG ( Table_Version ), - FT_FRAME_ULONG ( Font_Revision ), - FT_FRAME_LONG ( CheckSum_Adjust ), - FT_FRAME_LONG ( Magic_Number ), - FT_FRAME_USHORT( Flags ), - FT_FRAME_USHORT( Units_Per_EM ), - FT_FRAME_LONG ( Created[0] ), - FT_FRAME_LONG ( Created[1] ), - FT_FRAME_LONG ( Modified[0] ), - FT_FRAME_LONG ( Modified[1] ), - FT_FRAME_SHORT ( xMin ), - FT_FRAME_SHORT ( yMin ), - FT_FRAME_SHORT ( xMax ), - FT_FRAME_SHORT ( yMax ), - FT_FRAME_USHORT( Mac_Style ), - FT_FRAME_USHORT( Lowest_Rec_PPEM ), - FT_FRAME_SHORT ( Font_Direction ), - FT_FRAME_SHORT ( Index_To_Loc_Format ), - FT_FRAME_SHORT ( Glyph_Data_Format ), - FT_FRAME_END - }; - - - error = face->goto_table( face, tag, stream, 0 ); - if ( error ) - goto Exit; - - header = &face->header; - - if ( FT_STREAM_READ_FIELDS( header_fields, header ) ) - goto Exit; - - FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM )); - FT_TRACE3(( "IndexToLoc: %4d\n", header->Index_To_Loc_Format )); - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_head( TT_Face face, - FT_Stream stream ) - { - return tt_face_load_generic_header( face, stream, TTAG_head ); - } - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_bhed( TT_Face face, - FT_Stream stream ) - { - return tt_face_load_generic_header( face, stream, TTAG_bhed ); - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_max_profile */ - /* */ - /* <Description> */ - /* Loads the maximum profile into a face object. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_maxp( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - TT_MaxProfile* maxProfile = &face->max_profile; - - const FT_Frame_Field maxp_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_MaxProfile - - FT_FRAME_START( 6 ), - FT_FRAME_LONG ( version ), - FT_FRAME_USHORT( numGlyphs ), - FT_FRAME_END - }; - - const FT_Frame_Field maxp_fields_extra[] = - { - FT_FRAME_START( 26 ), - FT_FRAME_USHORT( maxPoints ), - FT_FRAME_USHORT( maxContours ), - FT_FRAME_USHORT( maxCompositePoints ), - FT_FRAME_USHORT( maxCompositeContours ), - FT_FRAME_USHORT( maxZones ), - FT_FRAME_USHORT( maxTwilightPoints ), - FT_FRAME_USHORT( maxStorage ), - FT_FRAME_USHORT( maxFunctionDefs ), - FT_FRAME_USHORT( maxInstructionDefs ), - FT_FRAME_USHORT( maxStackElements ), - FT_FRAME_USHORT( maxSizeOfInstructions ), - FT_FRAME_USHORT( maxComponentElements ), - FT_FRAME_USHORT( maxComponentDepth ), - FT_FRAME_END - }; - - - error = face->goto_table( face, TTAG_maxp, stream, 0 ); - if ( error ) - goto Exit; - - if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) ) - goto Exit; - - maxProfile->maxPoints = 0; - maxProfile->maxContours = 0; - maxProfile->maxCompositePoints = 0; - maxProfile->maxCompositeContours = 0; - maxProfile->maxZones = 0; - maxProfile->maxTwilightPoints = 0; - maxProfile->maxStorage = 0; - maxProfile->maxFunctionDefs = 0; - maxProfile->maxInstructionDefs = 0; - maxProfile->maxStackElements = 0; - maxProfile->maxSizeOfInstructions = 0; - maxProfile->maxComponentElements = 0; - maxProfile->maxComponentDepth = 0; - - if ( maxProfile->version >= 0x10000L ) - { - if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) ) - goto Exit; - - /* XXX: an adjustment that is necessary to load certain */ - /* broken fonts like `Keystrokes MT' :-( */ - /* */ - /* We allocate 64 function entries by default when */ - /* the maxFunctionDefs field is null. */ - - if ( maxProfile->maxFunctionDefs == 0 ) - maxProfile->maxFunctionDefs = 64; - - /* we add 4 phantom points later */ - if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) ) - { - FT_TRACE0(( "tt_face_load_maxp:" - " too much twilight points in `maxp' table;\n" - " " - " some glyphs might be rendered incorrectly\n" )); - - maxProfile->maxTwilightPoints = 0xFFFFU - 4; - } - - /* we arbitrarily limit recursion to avoid stack exhaustion */ - if ( maxProfile->maxComponentDepth > 100 ) - { - FT_TRACE0(( "tt_face_load_maxp:" - " abnormally large component depth (%d) set to 100\n", - maxProfile->maxComponentDepth )); - maxProfile->maxComponentDepth = 100; - } - } - - FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs )); - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_names */ - /* */ - /* <Description> */ - /* Loads the name records. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_name( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_Memory memory = stream->memory; - FT_ULong table_pos, table_len; - FT_ULong storage_start, storage_limit; - FT_UInt count; - TT_NameTable table; - - static const FT_Frame_Field name_table_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_NameTableRec - - FT_FRAME_START( 6 ), - FT_FRAME_USHORT( format ), - FT_FRAME_USHORT( numNameRecords ), - FT_FRAME_USHORT( storageOffset ), - FT_FRAME_END - }; - - static const FT_Frame_Field name_record_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_NameEntryRec - - /* no FT_FRAME_START */ - FT_FRAME_USHORT( platformID ), - FT_FRAME_USHORT( encodingID ), - FT_FRAME_USHORT( languageID ), - FT_FRAME_USHORT( nameID ), - FT_FRAME_USHORT( stringLength ), - FT_FRAME_USHORT( stringOffset ), - FT_FRAME_END - }; - - - table = &face->name_table; - table->stream = stream; - - error = face->goto_table( face, TTAG_name, stream, &table_len ); - if ( error ) - goto Exit; - - table_pos = FT_STREAM_POS(); - - - if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) ) - goto Exit; - - /* Some popular Asian fonts have an invalid `storageOffset' value */ - /* (it should be at least "6 + 12*num_names"). However, the string */ - /* offsets, computed as "storageOffset + entry->stringOffset", are */ - /* valid pointers within the name table... */ - /* */ - /* We thus can't check `storageOffset' right now. */ - /* */ - storage_start = table_pos + 6 + 12*table->numNameRecords; - storage_limit = table_pos + table_len; - - if ( storage_start > storage_limit ) - { - FT_ERROR(( "tt_face_load_name: invalid `name' table\n" )); - error = SFNT_Err_Name_Table_Missing; - goto Exit; - } - - /* Allocate the array of name records. */ - count = table->numNameRecords; - table->numNameRecords = 0; - - if ( FT_NEW_ARRAY( table->names, count ) || - FT_FRAME_ENTER( count * 12 ) ) - goto Exit; - - /* Load the name records and determine how much storage is needed */ - /* to hold the strings themselves. */ - { - TT_NameEntryRec* entry = table->names; - - - for ( ; count > 0; count-- ) - { - if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) ) - continue; - - /* check that the name is not empty */ - if ( entry->stringLength == 0 ) - continue; - - /* check that the name string is within the table */ - entry->stringOffset += table_pos + table->storageOffset; - if ( entry->stringOffset < storage_start || - entry->stringOffset + entry->stringLength > storage_limit ) - { - /* invalid entry - ignore it */ - entry->stringOffset = 0; - entry->stringLength = 0; - continue; - } - - entry++; - } - - table->numNameRecords = (FT_UInt)( entry - table->names ); - } - - FT_FRAME_EXIT(); - - /* everything went well, update face->num_names */ - face->num_names = (FT_UShort) table->numNameRecords; - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_free_names */ - /* */ - /* <Description> */ - /* Frees the name records. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - FT_LOCAL_DEF( void ) - tt_face_free_name( TT_Face face ) - { - FT_Memory memory = face->root.driver->root.memory; - TT_NameTable table = &face->name_table; - TT_NameEntry entry = table->names; - FT_UInt count = table->numNameRecords; - - - if ( table->names ) - { - for ( ; count > 0; count--, entry++ ) - { - FT_FREE( entry->string ); - entry->stringLength = 0; - } - - /* free strings table */ - FT_FREE( table->names ); - } - - table->numNameRecords = 0; - table->format = 0; - table->storageOffset = 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_cmap */ - /* */ - /* <Description> */ - /* Loads the cmap directory in a face object. The cmaps themselves */ - /* are loaded on demand in the `ttcmap.c' module. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_cmap( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - - - error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size ); - if ( error ) - goto Exit; - - if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) ) - face->cmap_size = 0; - - Exit: - return error; - } - - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_os2 */ - /* */ - /* <Description> */ - /* Loads the OS2 table. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_os2( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - TT_OS2* os2; - - const FT_Frame_Field os2_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_OS2 - - FT_FRAME_START( 78 ), - FT_FRAME_USHORT( version ), - FT_FRAME_SHORT ( xAvgCharWidth ), - FT_FRAME_USHORT( usWeightClass ), - FT_FRAME_USHORT( usWidthClass ), - FT_FRAME_SHORT ( fsType ), - FT_FRAME_SHORT ( ySubscriptXSize ), - FT_FRAME_SHORT ( ySubscriptYSize ), - FT_FRAME_SHORT ( ySubscriptXOffset ), - FT_FRAME_SHORT ( ySubscriptYOffset ), - FT_FRAME_SHORT ( ySuperscriptXSize ), - FT_FRAME_SHORT ( ySuperscriptYSize ), - FT_FRAME_SHORT ( ySuperscriptXOffset ), - FT_FRAME_SHORT ( ySuperscriptYOffset ), - FT_FRAME_SHORT ( yStrikeoutSize ), - FT_FRAME_SHORT ( yStrikeoutPosition ), - FT_FRAME_SHORT ( sFamilyClass ), - FT_FRAME_BYTE ( panose[0] ), - FT_FRAME_BYTE ( panose[1] ), - FT_FRAME_BYTE ( panose[2] ), - FT_FRAME_BYTE ( panose[3] ), - FT_FRAME_BYTE ( panose[4] ), - FT_FRAME_BYTE ( panose[5] ), - FT_FRAME_BYTE ( panose[6] ), - FT_FRAME_BYTE ( panose[7] ), - FT_FRAME_BYTE ( panose[8] ), - FT_FRAME_BYTE ( panose[9] ), - FT_FRAME_ULONG ( ulUnicodeRange1 ), - FT_FRAME_ULONG ( ulUnicodeRange2 ), - FT_FRAME_ULONG ( ulUnicodeRange3 ), - FT_FRAME_ULONG ( ulUnicodeRange4 ), - FT_FRAME_BYTE ( achVendID[0] ), - FT_FRAME_BYTE ( achVendID[1] ), - FT_FRAME_BYTE ( achVendID[2] ), - FT_FRAME_BYTE ( achVendID[3] ), - - FT_FRAME_USHORT( fsSelection ), - FT_FRAME_USHORT( usFirstCharIndex ), - FT_FRAME_USHORT( usLastCharIndex ), - FT_FRAME_SHORT ( sTypoAscender ), - FT_FRAME_SHORT ( sTypoDescender ), - FT_FRAME_SHORT ( sTypoLineGap ), - FT_FRAME_USHORT( usWinAscent ), - FT_FRAME_USHORT( usWinDescent ), - FT_FRAME_END - }; - - const FT_Frame_Field os2_fields_extra[] = - { - FT_FRAME_START( 8 ), - FT_FRAME_ULONG( ulCodePageRange1 ), - FT_FRAME_ULONG( ulCodePageRange2 ), - FT_FRAME_END - }; - - const FT_Frame_Field os2_fields_extra2[] = - { - FT_FRAME_START( 10 ), - FT_FRAME_SHORT ( sxHeight ), - FT_FRAME_SHORT ( sCapHeight ), - FT_FRAME_USHORT( usDefaultChar ), - FT_FRAME_USHORT( usBreakChar ), - FT_FRAME_USHORT( usMaxContext ), - FT_FRAME_END - }; - - - /* We now support old Mac fonts where the OS/2 table doesn't */ - /* exist. Simply put, we set the `version' field to 0xFFFF */ - /* and test this value each time we need to access the table. */ - error = face->goto_table( face, TTAG_OS2, stream, 0 ); - if ( error ) - goto Exit; - - os2 = &face->os2; - - if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) ) - goto Exit; - - os2->ulCodePageRange1 = 0; - os2->ulCodePageRange2 = 0; - os2->sxHeight = 0; - os2->sCapHeight = 0; - os2->usDefaultChar = 0; - os2->usBreakChar = 0; - os2->usMaxContext = 0; - - if ( os2->version >= 0x0001 ) - { - /* only version 1 tables */ - if ( FT_STREAM_READ_FIELDS( os2_fields_extra, os2 ) ) - goto Exit; - - if ( os2->version >= 0x0002 ) - { - /* only version 2 tables */ - if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) ) - goto Exit; - } - } - - FT_TRACE3(( "sTypoAscender: %4d\n", os2->sTypoAscender )); - FT_TRACE3(( "sTypoDescender: %4d\n", os2->sTypoDescender )); - FT_TRACE3(( "usWinAscent: %4u\n", os2->usWinAscent )); - FT_TRACE3(( "usWinDescent: %4u\n", os2->usWinDescent )); - FT_TRACE3(( "fsSelection: 0x%2x\n", os2->fsSelection )); - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_postscript */ - /* */ - /* <Description> */ - /* Loads the Postscript table. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_post( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - TT_Postscript* post = &face->postscript; - - static const FT_Frame_Field post_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_Postscript - - FT_FRAME_START( 32 ), - FT_FRAME_ULONG( FormatType ), - FT_FRAME_ULONG( italicAngle ), - FT_FRAME_SHORT( underlinePosition ), - FT_FRAME_SHORT( underlineThickness ), - FT_FRAME_ULONG( isFixedPitch ), - FT_FRAME_ULONG( minMemType42 ), - FT_FRAME_ULONG( maxMemType42 ), - FT_FRAME_ULONG( minMemType1 ), - FT_FRAME_ULONG( maxMemType1 ), - FT_FRAME_END - }; - - - error = face->goto_table( face, TTAG_post, stream, 0 ); - if ( error ) - return error; - - if ( FT_STREAM_READ_FIELDS( post_fields, post ) ) - return error; - - /* we don't load the glyph names, we do that in another */ - /* module (ttpost). */ - - FT_TRACE3(( "FormatType: 0x%x\n", post->FormatType )); - FT_TRACE3(( "isFixedPitch: %s\n", post->isFixedPitch - ? " yes" : " no" )); - - return SFNT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_pclt */ - /* */ - /* <Description> */ - /* Loads the PCL 5 Table. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_pclt( TT_Face face, - FT_Stream stream ) - { - static const FT_Frame_Field pclt_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_PCLT - - FT_FRAME_START( 54 ), - FT_FRAME_ULONG ( Version ), - FT_FRAME_ULONG ( FontNumber ), - FT_FRAME_USHORT( Pitch ), - FT_FRAME_USHORT( xHeight ), - FT_FRAME_USHORT( Style ), - FT_FRAME_USHORT( TypeFamily ), - FT_FRAME_USHORT( CapHeight ), - FT_FRAME_BYTES ( TypeFace, 16 ), - FT_FRAME_BYTES ( CharacterComplement, 8 ), - FT_FRAME_BYTES ( FileName, 6 ), - FT_FRAME_CHAR ( StrokeWeight ), - FT_FRAME_CHAR ( WidthType ), - FT_FRAME_BYTE ( SerifStyle ), - FT_FRAME_BYTE ( Reserved ), - FT_FRAME_END - }; - - FT_Error error; - TT_PCLT* pclt = &face->pclt; - - - /* optional table */ - error = face->goto_table( face, TTAG_PCLT, stream, 0 ); - if ( error ) - goto Exit; - - if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) ) - goto Exit; - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_gasp */ - /* */ - /* <Description> */ - /* Loads the `gasp' table into a face object. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_gasp( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_Memory memory = stream->memory; - - FT_UInt j,num_ranges; - TT_GaspRange gaspranges; - - - /* the gasp table is optional */ - error = face->goto_table( face, TTAG_gasp, stream, 0 ); - if ( error ) - goto Exit; - - if ( FT_FRAME_ENTER( 4L ) ) - goto Exit; - - face->gasp.version = FT_GET_USHORT(); - face->gasp.numRanges = FT_GET_USHORT(); - - FT_FRAME_EXIT(); - - /* only support versions 0 and 1 of the table */ - if ( face->gasp.version >= 2 ) - { - face->gasp.numRanges = 0; - error = SFNT_Err_Invalid_Table; - goto Exit; - } - - num_ranges = face->gasp.numRanges; - FT_TRACE3(( "numRanges: %u\n", num_ranges )); - - if ( FT_QNEW_ARRAY( gaspranges, num_ranges ) || - FT_FRAME_ENTER( num_ranges * 4L ) ) - goto Exit; - - face->gasp.gaspRanges = gaspranges; - - for ( j = 0; j < num_ranges; j++ ) - { - gaspranges[j].maxPPEM = FT_GET_USHORT(); - gaspranges[j].gaspFlag = FT_GET_USHORT(); - - FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n", - j, - gaspranges[j].maxPPEM, - gaspranges[j].gaspFlag )); - } - - FT_FRAME_EXIT(); - - Exit: - return error; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttload.h b/android/jni/ndk_modules/freetype/src/sfnt/ttload.h deleted file mode 100644 index 49a1aee1..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttload.h +++ /dev/null @@ -1,112 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttload.h */ -/* */ -/* Load the basic TrueType tables, i.e., tables that can be either in */ -/* TTF or OTF fonts (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2005, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTLOAD_H__ -#define __TTLOAD_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( TT_Table ) - tt_face_lookup_table( TT_Face face, - FT_ULong tag ); - - FT_LOCAL( FT_Error ) - tt_face_goto_table( TT_Face face, - FT_ULong tag, - FT_Stream stream, - FT_ULong* length ); - - - FT_LOCAL( FT_Error ) - tt_face_load_font_dir( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_any( TT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte* buffer, - FT_ULong* length ); - - - FT_LOCAL( FT_Error ) - tt_face_load_head( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_cmap( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_maxp( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_name( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_os2( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_post( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_pclt( TT_Face face, - FT_Stream stream ); - - FT_LOCAL( void ) - tt_face_free_name( TT_Face face ); - - - FT_LOCAL( FT_Error ) - tt_face_load_gasp( TT_Face face, - FT_Stream stream ); - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - FT_LOCAL( FT_Error ) - tt_face_load_bhed( TT_Face face, - FT_Stream stream ); - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - -FT_END_HEADER - -#endif /* __TTLOAD_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttmtx.c b/android/jni/ndk_modules/freetype/src/sfnt/ttmtx.c deleted file mode 100644 index 53e6ac78..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttmtx.c +++ /dev/null @@ -1,468 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttmtx.c */ -/* */ -/* Load the metrics tables common to TTF and OTF fonts (body). */ -/* */ -/* Copyright 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include "ttmtx.h" - -#include "sferrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttmtx - - - /* - * Unfortunately, we can't enable our memory optimizations if - * FT_CONFIG_OPTION_OLD_INTERNALS is defined. This is because at least - * one rogue client (libXfont in the X.Org XServer) is directly accessing - * the metrics. - */ - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_hmtx */ - /* */ - /* <Description> */ - /* Load the `hmtx' or `vmtx' table into a face object. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* vertical :: A boolean flag. If set, load `vmtx'. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ -#ifndef FT_CONFIG_OPTION_OLD_INTERNALS - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_hmtx( TT_Face face, - FT_Stream stream, - FT_Bool vertical ) - { - FT_Error error; - FT_ULong tag, table_size; - FT_ULong* ptable_offset; - FT_ULong* ptable_size; - - - if ( vertical ) - { - tag = TTAG_vmtx; - ptable_offset = &face->vert_metrics_offset; - ptable_size = &face->vert_metrics_size; - } - else - { - tag = TTAG_hmtx; - ptable_offset = &face->horz_metrics_offset; - ptable_size = &face->horz_metrics_size; - } - - error = face->goto_table( face, tag, stream, &table_size ); - if ( error ) - goto Fail; - - *ptable_size = table_size; - *ptable_offset = FT_STREAM_POS(); - - Fail: - return error; - } - -#else /* !FT_CONFIG_OPTION_OLD_INTERNALS */ - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_hmtx( TT_Face face, - FT_Stream stream, - FT_Bool vertical ) - { - FT_Error error; - FT_Memory memory = stream->memory; - - FT_ULong table_len; - FT_Long num_shorts, num_longs, num_shorts_checked; - - TT_LongMetrics* longs; - TT_ShortMetrics** shorts; - FT_Byte* p; - - - if ( vertical ) - { - void* lm = &face->vertical.long_metrics; - void** sm = &face->vertical.short_metrics; - - - error = face->goto_table( face, TTAG_vmtx, stream, &table_len ); - if ( error ) - goto Fail; - - num_longs = face->vertical.number_Of_VMetrics; - if ( (FT_ULong)num_longs > table_len / 4 ) - num_longs = (FT_Long)( table_len / 4 ); - - face->vertical.number_Of_VMetrics = 0; - - longs = (TT_LongMetrics*)lm; - shorts = (TT_ShortMetrics**)sm; - } - else - { - void* lm = &face->horizontal.long_metrics; - void** sm = &face->horizontal.short_metrics; - - - error = face->goto_table( face, TTAG_hmtx, stream, &table_len ); - if ( error ) - goto Fail; - - num_longs = face->horizontal.number_Of_HMetrics; - if ( (FT_ULong)num_longs > table_len / 4 ) - num_longs = (FT_Long)( table_len / 4 ); - - face->horizontal.number_Of_HMetrics = 0; - - longs = (TT_LongMetrics*)lm; - shorts = (TT_ShortMetrics**)sm; - } - - /* never trust derived values */ - - num_shorts = face->max_profile.numGlyphs - num_longs; - num_shorts_checked = ( table_len - num_longs * 4L ) / 2; - - if ( num_shorts < 0 ) - { - FT_TRACE0(( "tt_face_load_hmtx:" - " %cmtx has more metrics than glyphs.\n", - vertical ? "v" : "h" )); - - /* Adobe simply ignores this problem. So we shall do the same. */ -#if 0 - error = vertical ? SFNT_Err_Invalid_Vert_Metrics - : SFNT_Err_Invalid_Horiz_Metrics; - goto Exit; -#else - num_shorts = 0; -#endif - } - - if ( FT_QNEW_ARRAY( *longs, num_longs ) || - FT_QNEW_ARRAY( *shorts, num_shorts ) ) - goto Fail; - - if ( FT_FRAME_ENTER( table_len ) ) - goto Fail; - - p = stream->cursor; - - { - TT_LongMetrics cur = *longs; - TT_LongMetrics limit = cur + num_longs; - - - for ( ; cur < limit; cur++ ) - { - cur->advance = FT_NEXT_USHORT( p ); - cur->bearing = FT_NEXT_SHORT( p ); - } - } - - /* do we have an inconsistent number of metric values? */ - { - TT_ShortMetrics* cur = *shorts; - TT_ShortMetrics* limit = cur + - FT_MIN( num_shorts, num_shorts_checked ); - - - for ( ; cur < limit; cur++ ) - *cur = FT_NEXT_SHORT( p ); - - /* We fill up the missing left side bearings with the */ - /* last valid value. Since this will occur for buggy CJK */ - /* fonts usually only, nothing serious will happen. */ - if ( num_shorts > num_shorts_checked && num_shorts_checked > 0 ) - { - FT_Short val = (*shorts)[num_shorts_checked - 1]; - - - limit = *shorts + num_shorts; - for ( ; cur < limit; cur++ ) - *cur = val; - } - } - - FT_FRAME_EXIT(); - - if ( vertical ) - face->vertical.number_Of_VMetrics = (FT_UShort)num_longs; - else - face->horizontal.number_Of_HMetrics = (FT_UShort)num_longs; - - Fail: - return error; - } - -#endif /* !FT_CONFIG_OPTION_OLD_INTERNALS */ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_hhea */ - /* */ - /* <Description> */ - /* Load the `hhea' or 'vhea' table into a face object. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* vertical :: A boolean flag. If set, load `vhea'. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_hhea( TT_Face face, - FT_Stream stream, - FT_Bool vertical ) - { - FT_Error error; - TT_HoriHeader* header; - - const FT_Frame_Field metrics_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_HoriHeader - - FT_FRAME_START( 36 ), - FT_FRAME_ULONG ( Version ), - FT_FRAME_SHORT ( Ascender ), - FT_FRAME_SHORT ( Descender ), - FT_FRAME_SHORT ( Line_Gap ), - FT_FRAME_USHORT( advance_Width_Max ), - FT_FRAME_SHORT ( min_Left_Side_Bearing ), - FT_FRAME_SHORT ( min_Right_Side_Bearing ), - FT_FRAME_SHORT ( xMax_Extent ), - FT_FRAME_SHORT ( caret_Slope_Rise ), - FT_FRAME_SHORT ( caret_Slope_Run ), - FT_FRAME_SHORT ( caret_Offset ), - FT_FRAME_SHORT ( Reserved[0] ), - FT_FRAME_SHORT ( Reserved[1] ), - FT_FRAME_SHORT ( Reserved[2] ), - FT_FRAME_SHORT ( Reserved[3] ), - FT_FRAME_SHORT ( metric_Data_Format ), - FT_FRAME_USHORT( number_Of_HMetrics ), - FT_FRAME_END - }; - - - if ( vertical ) - { - void *v = &face->vertical; - - - error = face->goto_table( face, TTAG_vhea, stream, 0 ); - if ( error ) - goto Fail; - - header = (TT_HoriHeader*)v; - } - else - { - error = face->goto_table( face, TTAG_hhea, stream, 0 ); - if ( error ) - goto Fail; - - header = &face->horizontal; - } - - if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) ) - goto Fail; - - FT_TRACE3(( "Ascender: %5d\n", header->Ascender )); - FT_TRACE3(( "Descender: %5d\n", header->Descender )); - FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics )); - - header->long_metrics = NULL; - header->short_metrics = NULL; - - Fail: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_get_metrics */ - /* */ - /* <Description> */ - /* Returns the horizontal or vertical metrics in font units for a */ - /* given glyph. The metrics are the left side bearing (resp. top */ - /* side bearing) and advance width (resp. advance height). */ - /* */ - /* <Input> */ - /* header :: A pointer to either the horizontal or vertical metrics */ - /* structure. */ - /* */ - /* idx :: The glyph index. */ - /* */ - /* <Output> */ - /* bearing :: The bearing, either left side or top side. */ - /* */ - /* advance :: The advance width resp. advance height. */ - /* */ -#ifndef FT_CONFIG_OPTION_OLD_INTERNALS - - FT_LOCAL_DEF( FT_Error ) - tt_face_get_metrics( TT_Face face, - FT_Bool vertical, - FT_UInt gindex, - FT_Short *abearing, - FT_UShort *aadvance ) - { - FT_Error error; - FT_Stream stream = face->root.stream; - TT_HoriHeader* header; - FT_ULong table_pos, table_size, table_end; - FT_UShort k; - - - if ( vertical ) - { - void* v = &face->vertical; - - - header = (TT_HoriHeader*)v; - table_pos = face->vert_metrics_offset; - table_size = face->vert_metrics_size; - } - else - { - header = &face->horizontal; - table_pos = face->horz_metrics_offset; - table_size = face->horz_metrics_size; - } - - table_end = table_pos + table_size; - - k = header->number_Of_HMetrics; - - if ( k > 0 ) - { - if ( gindex < (FT_UInt)k ) - { - table_pos += 4 * gindex; - if ( table_pos + 4 > table_end ) - goto NoData; - - if ( FT_STREAM_SEEK( table_pos ) || - FT_READ_USHORT( *aadvance ) || - FT_READ_SHORT( *abearing ) ) - goto NoData; - } - else - { - table_pos += 4 * ( k - 1 ); - if ( table_pos + 4 > table_end ) - goto NoData; - - if ( FT_STREAM_SEEK( table_pos ) || - FT_READ_USHORT( *aadvance ) ) - goto NoData; - - table_pos += 4 + 2 * ( gindex - k ); - if ( table_pos + 2 > table_end ) - *abearing = 0; - else - { - if ( !FT_STREAM_SEEK( table_pos ) ) - (void)FT_READ_SHORT( *abearing ); - } - } - } - else - { - NoData: - *abearing = 0; - *aadvance = 0; - } - - return SFNT_Err_Ok; - } - -#else /* !FT_CONFIG_OPTION_OLD_INTERNALS */ - - FT_LOCAL_DEF( FT_Error ) - tt_face_get_metrics( TT_Face face, - FT_Bool vertical, - FT_UInt gindex, - FT_Short* abearing, - FT_UShort* aadvance ) - { - void* v = &face->vertical; - void* h = &face->horizontal; - TT_HoriHeader* header = vertical ? (TT_HoriHeader*)v - : (TT_HoriHeader*)h; - TT_LongMetrics longs_m; - FT_UShort k = header->number_Of_HMetrics; - - - if ( k == 0 || - !header->long_metrics || - gindex >= (FT_UInt)face->max_profile.numGlyphs ) - { - *abearing = *aadvance = 0; - return SFNT_Err_Ok; - } - - if ( gindex < (FT_UInt)k ) - { - longs_m = (TT_LongMetrics)header->long_metrics + gindex; - *abearing = longs_m->bearing; - *aadvance = longs_m->advance; - } - else - { - *abearing = ((TT_ShortMetrics*)header->short_metrics)[gindex - k]; - *aadvance = ((TT_LongMetrics)header->long_metrics)[k - 1].advance; - } - - return SFNT_Err_Ok; - } - -#endif /* !FT_CONFIG_OPTION_OLD_INTERNALS */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttmtx.h b/android/jni/ndk_modules/freetype/src/sfnt/ttmtx.h deleted file mode 100644 index 8b91a113..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttmtx.h +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttmtx.h */ -/* */ -/* Load the metrics tables common to TTF and OTF fonts (specification). */ -/* */ -/* Copyright 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTMTX_H__ -#define __TTMTX_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - tt_face_load_hhea( TT_Face face, - FT_Stream stream, - FT_Bool vertical ); - - - FT_LOCAL( FT_Error ) - tt_face_load_hmtx( TT_Face face, - FT_Stream stream, - FT_Bool vertical ); - - - FT_LOCAL( FT_Error ) - tt_face_get_metrics( TT_Face face, - FT_Bool vertical, - FT_UInt gindex, - FT_Short* abearing, - FT_UShort* aadvance ); - -FT_END_HEADER - -#endif /* __TTMTX_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttpost.c b/android/jni/ndk_modules/freetype/src/sfnt/ttpost.c deleted file mode 100644 index aa0bf1ec..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttpost.c +++ /dev/null @@ -1,521 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpost.c */ -/* */ -/* Postcript name table processing for TrueType and OpenType fonts */ -/* (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* The post table is not completely loaded by the core engine. This */ - /* file loads the missing PS glyph names and implements an API to access */ - /* them. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include "ttpost.h" - -#include "sferrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttpost - - - /* If this configuration macro is defined, we rely on the `PSNames' */ - /* module to grab the glyph names. */ - -#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES - - -#include FT_SERVICE_POSTSCRIPT_CMAPS_H - -#define MAC_NAME( x ) ( (FT_String*)psnames->macintosh_name( x ) ) - - -#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ - - - /* Otherwise, we ignore the `PSNames' module, and provide our own */ - /* table of Mac names. Thus, it is possible to build a version of */ - /* FreeType without the Type 1 driver & PSNames module. */ - -#define MAC_NAME( x ) ( (FT_String*)tt_post_default_names[x] ) - - /* the 258 default Mac PS glyph names */ - - static const FT_String* const tt_post_default_names[258] = - { - /* 0 */ - ".notdef", ".null", "CR", "space", "exclam", - "quotedbl", "numbersign", "dollar", "percent", "ampersand", - /* 10 */ - "quotesingle", "parenleft", "parenright", "asterisk", "plus", - "comma", "hyphen", "period", "slash", "zero", - /* 20 */ - "one", "two", "three", "four", "five", - "six", "seven", "eight", "nine", "colon", - /* 30 */ - "semicolon", "less", "equal", "greater", "question", - "at", "A", "B", "C", "D", - /* 40 */ - "E", "F", "G", "H", "I", - "J", "K", "L", "M", "N", - /* 50 */ - "O", "P", "Q", "R", "S", - "T", "U", "V", "W", "X", - /* 60 */ - "Y", "Z", "bracketleft", "backslash", "bracketright", - "asciicircum", "underscore", "grave", "a", "b", - /* 70 */ - "c", "d", "e", "f", "g", - "h", "i", "j", "k", "l", - /* 80 */ - "m", "n", "o", "p", "q", - "r", "s", "t", "u", "v", - /* 90 */ - "w", "x", "y", "z", "braceleft", - "bar", "braceright", "asciitilde", "Adieresis", "Aring", - /* 100 */ - "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", - "aacute", "agrave", "acircumflex", "adieresis", "atilde", - /* 110 */ - "aring", "ccedilla", "eacute", "egrave", "ecircumflex", - "edieresis", "iacute", "igrave", "icircumflex", "idieresis", - /* 120 */ - "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", - "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", - /* 130 */ - "dagger", "degree", "cent", "sterling", "section", - "bullet", "paragraph", "germandbls", "registered", "copyright", - /* 140 */ - "trademark", "acute", "dieresis", "notequal", "AE", - "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", - /* 150 */ - "yen", "mu", "partialdiff", "summation", "product", - "pi", "integral", "ordfeminine", "ordmasculine", "Omega", - /* 160 */ - "ae", "oslash", "questiondown", "exclamdown", "logicalnot", - "radical", "florin", "approxequal", "Delta", "guillemotleft", - /* 170 */ - "guillemotright", "ellipsis", "nbspace", "Agrave", "Atilde", - "Otilde", "OE", "oe", "endash", "emdash", - /* 180 */ - "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", - "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", - /* 190 */ - "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", - "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", - /* 200 */ - "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", - "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", - /* 210 */ - "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", - "dotlessi", "circumflex", "tilde", "macron", "breve", - /* 220 */ - "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", - "caron", "Lslash", "lslash", "Scaron", "scaron", - /* 230 */ - "Zcaron", "zcaron", "brokenbar", "Eth", "eth", - "Yacute", "yacute", "Thorn", "thorn", "minus", - /* 240 */ - "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", - "onequarter", "threequarters", "franc", "Gbreve", "gbreve", - /* 250 */ - "Idot", "Scedilla", "scedilla", "Cacute", "cacute", - "Ccaron", "ccaron", "dmacron", - }; - - -#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ - - - static FT_Error - load_format_20( TT_Face face, - FT_Stream stream ) - { - FT_Memory memory = stream->memory; - FT_Error error; - - FT_Int num_glyphs; - FT_UShort num_names; - - FT_UShort* glyph_indices = 0; - FT_Char** name_strings = 0; - - - if ( FT_READ_USHORT( num_glyphs ) ) - goto Exit; - - /* UNDOCUMENTED! The number of glyphs in this table can be smaller */ - /* than the value in the maxp table (cf. cyberbit.ttf). */ - - /* There already exist fonts which have more than 32768 glyph names */ - /* in this table, so the test for this threshold has been dropped. */ - - if ( num_glyphs > face->max_profile.numGlyphs ) - { - error = SFNT_Err_Invalid_File_Format; - goto Exit; - } - - /* load the indices */ - { - FT_Int n; - - - if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) || - FT_FRAME_ENTER( num_glyphs * 2L ) ) - goto Fail; - - for ( n = 0; n < num_glyphs; n++ ) - glyph_indices[n] = FT_GET_USHORT(); - - FT_FRAME_EXIT(); - } - - /* compute number of names stored in table */ - { - FT_Int n; - - - num_names = 0; - - for ( n = 0; n < num_glyphs; n++ ) - { - FT_Int idx; - - - idx = glyph_indices[n]; - if ( idx >= 258 ) - { - idx -= 257; - if ( idx > num_names ) - num_names = (FT_UShort)idx; - } - } - } - - /* now load the name strings */ - { - FT_UShort n; - - - if ( FT_NEW_ARRAY( name_strings, num_names ) ) - goto Fail; - - for ( n = 0; n < num_names; n++ ) - { - FT_UInt len; - - - if ( FT_READ_BYTE ( len ) || - FT_NEW_ARRAY( name_strings[n], len + 1 ) || - FT_STREAM_READ ( name_strings[n], len ) ) - goto Fail1; - - name_strings[n][len] = '\0'; - } - } - - /* all right, set table fields and exit successfully */ - { - TT_Post_20 table = &face->postscript_names.names.format_20; - - - table->num_glyphs = (FT_UShort)num_glyphs; - table->num_names = (FT_UShort)num_names; - table->glyph_indices = glyph_indices; - table->glyph_names = name_strings; - } - return SFNT_Err_Ok; - - Fail1: - { - FT_UShort n; - - - for ( n = 0; n < num_names; n++ ) - FT_FREE( name_strings[n] ); - } - - Fail: - FT_FREE( name_strings ); - FT_FREE( glyph_indices ); - - Exit: - return error; - } - - - static FT_Error - load_format_25( TT_Face face, - FT_Stream stream ) - { - FT_Memory memory = stream->memory; - FT_Error error; - - FT_Int num_glyphs; - FT_Char* offset_table = 0; - - - /* UNDOCUMENTED! This value appears only in the Apple TT specs. */ - if ( FT_READ_USHORT( num_glyphs ) ) - goto Exit; - - /* check the number of glyphs */ - if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 ) - { - error = SFNT_Err_Invalid_File_Format; - goto Exit; - } - - if ( FT_NEW_ARRAY( offset_table, num_glyphs ) || - FT_STREAM_READ( offset_table, num_glyphs ) ) - goto Fail; - - /* now check the offset table */ - { - FT_Int n; - - - for ( n = 0; n < num_glyphs; n++ ) - { - FT_Long idx = (FT_Long)n + offset_table[n]; - - - if ( idx < 0 || idx > num_glyphs ) - { - error = SFNT_Err_Invalid_File_Format; - goto Fail; - } - } - } - - /* OK, set table fields and exit successfully */ - { - TT_Post_25 table = &face->postscript_names.names.format_25; - - - table->num_glyphs = (FT_UShort)num_glyphs; - table->offsets = offset_table; - } - - return SFNT_Err_Ok; - - Fail: - FT_FREE( offset_table ); - - Exit: - return error; - } - - - static FT_Error - load_post_names( TT_Face face ) - { - FT_Stream stream; - FT_Error error; - FT_Fixed format; - - - /* get a stream for the face's resource */ - stream = face->root.stream; - - /* seek to the beginning of the PS names table */ - error = face->goto_table( face, TTAG_post, stream, 0 ); - if ( error ) - goto Exit; - - format = face->postscript.FormatType; - - /* go to beginning of subtable */ - if ( FT_STREAM_SKIP( 32 ) ) - goto Exit; - - /* now read postscript table */ - if ( format == 0x00020000L ) - error = load_format_20( face, stream ); - else if ( format == 0x00028000L ) - error = load_format_25( face, stream ); - else - error = SFNT_Err_Invalid_File_Format; - - face->postscript_names.loaded = 1; - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - tt_face_free_ps_names( TT_Face face ) - { - FT_Memory memory = face->root.memory; - TT_Post_Names names = &face->postscript_names; - FT_Fixed format; - - - if ( names->loaded ) - { - format = face->postscript.FormatType; - - if ( format == 0x00020000L ) - { - TT_Post_20 table = &names->names.format_20; - FT_UShort n; - - - FT_FREE( table->glyph_indices ); - table->num_glyphs = 0; - - for ( n = 0; n < table->num_names; n++ ) - FT_FREE( table->glyph_names[n] ); - - FT_FREE( table->glyph_names ); - table->num_names = 0; - } - else if ( format == 0x00028000L ) - { - TT_Post_25 table = &names->names.format_25; - - - FT_FREE( table->offsets ); - table->num_glyphs = 0; - } - } - names->loaded = 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_get_ps_name */ - /* */ - /* <Description> */ - /* Get the PostScript glyph name of a glyph. */ - /* */ - /* <Input> */ - /* face :: A handle to the parent face. */ - /* */ - /* idx :: The glyph index. */ - /* */ - /* <InOut> */ - /* PSname :: The address of a string pointer. Will be NULL in case */ - /* of error, otherwise it is a pointer to the glyph name. */ - /* */ - /* You must not modify the returned string! */ - /* */ - /* <Output> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_get_ps_name( TT_Face face, - FT_UInt idx, - FT_String** PSname ) - { - FT_Error error; - TT_Post_Names names; - FT_Fixed format; - -#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES - FT_Service_PsCMaps psnames; -#endif - - - if ( !face ) - return SFNT_Err_Invalid_Face_Handle; - - if ( idx >= (FT_UInt)face->max_profile.numGlyphs ) - return SFNT_Err_Invalid_Glyph_Index; - -#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES - psnames = (FT_Service_PsCMaps)face->psnames; - if ( !psnames ) - return SFNT_Err_Unimplemented_Feature; -#endif - - names = &face->postscript_names; - - /* `.notdef' by default */ - *PSname = MAC_NAME( 0 ); - - format = face->postscript.FormatType; - - if ( format == 0x00010000L ) - { - if ( idx < 258 ) /* paranoid checking */ - *PSname = MAC_NAME( idx ); - } - else if ( format == 0x00020000L ) - { - TT_Post_20 table = &names->names.format_20; - - - if ( !names->loaded ) - { - error = load_post_names( face ); - if ( error ) - goto End; - } - - if ( idx < (FT_UInt)table->num_glyphs ) - { - FT_UShort name_index = table->glyph_indices[idx]; - - - if ( name_index < 258 ) - *PSname = MAC_NAME( name_index ); - else - *PSname = (FT_String*)table->glyph_names[name_index - 258]; - } - } - else if ( format == 0x00028000L ) - { - TT_Post_25 table = &names->names.format_25; - - - if ( !names->loaded ) - { - error = load_post_names( face ); - if ( error ) - goto End; - } - - if ( idx < (FT_UInt)table->num_glyphs ) /* paranoid checking */ - { - idx += table->offsets[idx]; - *PSname = MAC_NAME( idx ); - } - } - - /* nothing to do for format == 0x00030000L */ - - End: - return SFNT_Err_Ok; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttpost.h b/android/jni/ndk_modules/freetype/src/sfnt/ttpost.h deleted file mode 100644 index 6f06d75a..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttpost.h +++ /dev/null @@ -1,46 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpost.h */ -/* */ -/* Postcript name table processing for TrueType and OpenType fonts */ -/* (specification). */ -/* */ -/* Copyright 1996-2001, 2002 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTPOST_H__ -#define __TTPOST_H__ - - -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - tt_face_get_ps_name( TT_Face face, - FT_UInt idx, - FT_String** PSname ); - - FT_LOCAL( void ) - tt_face_free_ps_names( TT_Face face ); - - -FT_END_HEADER - -#endif /* __TTPOST_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttsbit.c b/android/jni/ndk_modules/freetype/src/sfnt/ttsbit.c deleted file mode 100644 index faa8f88f..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttsbit.c +++ /dev/null @@ -1,1508 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttsbit.c */ -/* */ -/* TrueType and OpenType embedded bitmap support (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H - - /* - * Alas, the memory-optimized sbit loader can't be used when implementing - * the `old internals' hack - */ -#ifndef FT_CONFIG_OPTION_OLD_INTERNALS - -#include "ttsbit0.c" - -#else /* FT_CONFIG_OPTION_OLD_INTERNALS */ - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include "ttsbit.h" - -#include "sferrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttsbit - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* blit_sbit */ - /* */ - /* <Description> */ - /* Blits a bitmap from an input stream into a given target. Supports */ - /* x and y offsets as well as byte padded lines. */ - /* */ - /* <Input> */ - /* target :: The target bitmap/pixmap. */ - /* */ - /* source :: The input packed bitmap data. */ - /* */ - /* line_bits :: The number of bits per line. */ - /* */ - /* byte_padded :: A flag which is true if lines are byte-padded. */ - /* */ - /* x_offset :: The horizontal offset. */ - /* */ - /* y_offset :: The vertical offset. */ - /* */ - /* <Note> */ - /* IMPORTANT: The x and y offsets are relative to the top corner of */ - /* the target bitmap (unlike the normal TrueType */ - /* convention). A positive y offset indicates a downwards */ - /* direction! */ - /* */ - static void - blit_sbit( FT_Bitmap* target, - FT_Byte* source, - FT_Int line_bits, - FT_Bool byte_padded, - FT_Int x_offset, - FT_Int y_offset, - FT_Int source_height ) - { - FT_Byte* line_buff; - FT_Int line_incr; - FT_Int height; - - FT_UShort acc; - FT_UInt loaded; - - - /* first of all, compute starting write position */ - line_incr = target->pitch; - line_buff = target->buffer; - - if ( line_incr < 0 ) - line_buff -= line_incr * ( target->rows - 1 ); - - line_buff += ( x_offset >> 3 ) + y_offset * line_incr; - - /***********************************************************************/ - /* */ - /* We use the extra-classic `accumulator' trick to extract the bits */ - /* from the source byte stream. */ - /* */ - /* Namely, the variable `acc' is a 16-bit accumulator containing the */ - /* last `loaded' bits from the input stream. The bits are shifted to */ - /* the upmost position in `acc'. */ - /* */ - /***********************************************************************/ - - acc = 0; /* clear accumulator */ - loaded = 0; /* no bits were loaded */ - - for ( height = source_height; height > 0; height-- ) - { - FT_Byte* cur = line_buff; /* current write cursor */ - FT_Int count = line_bits; /* # of bits to extract per line */ - FT_Byte shift = (FT_Byte)( x_offset & 7 ); /* current write shift */ - FT_Byte space = (FT_Byte)( 8 - shift ); - - - /* first of all, read individual source bytes */ - if ( count >= 8 ) - { - count -= 8; - { - do - { - FT_Byte val; - - - /* ensure that there are at least 8 bits in the accumulator */ - if ( loaded < 8 ) - { - acc |= (FT_UShort)((FT_UShort)*source++ << ( 8 - loaded )); - loaded += 8; - } - - /* now write one byte */ - val = (FT_Byte)( acc >> 8 ); - if ( shift ) - { - cur[0] |= (FT_Byte)( val >> shift ); - cur[1] |= (FT_Byte)( val << space ); - } - else - cur[0] |= val; - - cur++; - acc <<= 8; /* remove bits from accumulator */ - loaded -= 8; - count -= 8; - - } while ( count >= 0 ); - } - - /* restore `count' to correct value */ - count += 8; - } - - /* now write remaining bits (count < 8) */ - if ( count > 0 ) - { - FT_Byte val; - - - /* ensure that there are at least `count' bits in the accumulator */ - if ( (FT_Int)loaded < count ) - { - acc |= (FT_UShort)((FT_UShort)*source++ << ( 8 - loaded )); - loaded += 8; - } - - /* now write remaining bits */ - val = (FT_Byte)( ( (FT_Byte)( acc >> 8 ) ) & ~( 0xFF >> count ) ); - cur[0] |= (FT_Byte)( val >> shift ); - - if ( count > space ) - cur[1] |= (FT_Byte)( val << space ); - - acc <<= count; - loaded -= count; - } - - /* now, skip to next line */ - if ( byte_padded ) - { - acc = 0; - loaded = 0; /* clear accumulator on byte-padded lines */ - } - - line_buff += line_incr; - } - } - - - static const FT_Frame_Field sbit_metrics_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_SBit_MetricsRec - - FT_FRAME_START( 8 ), - FT_FRAME_BYTE( height ), - FT_FRAME_BYTE( width ), - - FT_FRAME_CHAR( horiBearingX ), - FT_FRAME_CHAR( horiBearingY ), - FT_FRAME_BYTE( horiAdvance ), - - FT_FRAME_CHAR( vertBearingX ), - FT_FRAME_CHAR( vertBearingY ), - FT_FRAME_BYTE( vertAdvance ), - FT_FRAME_END - }; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Load_SBit_Const_Metrics */ - /* */ - /* <Description> */ - /* Loads the metrics for `EBLC' index tables format 2 and 5. */ - /* */ - /* <Input> */ - /* range :: The target range. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - Load_SBit_Const_Metrics( TT_SBit_Range range, - FT_Stream stream ) - { - FT_Error error; - - - if ( FT_READ_ULONG( range->image_size ) ) - return error; - - return FT_STREAM_READ_FIELDS( sbit_metrics_fields, &range->metrics ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Load_SBit_Range_Codes */ - /* */ - /* <Description> */ - /* Loads the range codes for `EBLC' index tables format 4 and 5. */ - /* */ - /* <Input> */ - /* range :: The target range. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* load_offsets :: A flag whether to load the glyph offset table. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - Load_SBit_Range_Codes( TT_SBit_Range range, - FT_Stream stream, - FT_Bool load_offsets ) - { - FT_Error error; - FT_ULong count, n, size; - FT_Memory memory = stream->memory; - - - if ( FT_READ_ULONG( count ) ) - goto Exit; - - range->num_glyphs = count; - - /* Allocate glyph offsets table if needed */ - if ( load_offsets ) - { - if ( FT_NEW_ARRAY( range->glyph_offsets, count ) ) - goto Exit; - - size = count * 4L; - } - else - size = count * 2L; - - /* Allocate glyph codes table and access frame */ - if ( FT_NEW_ARRAY ( range->glyph_codes, count ) || - FT_FRAME_ENTER( size ) ) - goto Exit; - - for ( n = 0; n < count; n++ ) - { - range->glyph_codes[n] = FT_GET_USHORT(); - - if ( load_offsets ) - range->glyph_offsets[n] = (FT_ULong)range->image_offset + - FT_GET_USHORT(); - } - - FT_FRAME_EXIT(); - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Load_SBit_Range */ - /* */ - /* <Description> */ - /* Loads a given `EBLC' index/range table. */ - /* */ - /* <Input> */ - /* range :: The target range. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - Load_SBit_Range( TT_SBit_Range range, - FT_Stream stream ) - { - FT_Error error; - FT_Memory memory = stream->memory; - - - switch( range->index_format ) - { - case 1: /* variable metrics with 4-byte offsets */ - case 3: /* variable metrics with 2-byte offsets */ - { - FT_ULong num_glyphs, n; - FT_Int size_elem; - FT_Bool large = FT_BOOL( range->index_format == 1 ); - - - - if ( range->last_glyph < range->first_glyph ) - { - error = SFNT_Err_Invalid_File_Format; - goto Exit; - } - - num_glyphs = range->last_glyph - range->first_glyph + 1L; - range->num_glyphs = num_glyphs; - num_glyphs++; /* XXX: BEWARE - see spec */ - - size_elem = large ? 4 : 2; - - if ( FT_NEW_ARRAY( range->glyph_offsets, num_glyphs ) || - FT_FRAME_ENTER( num_glyphs * size_elem ) ) - goto Exit; - - for ( n = 0; n < num_glyphs; n++ ) - range->glyph_offsets[n] = (FT_ULong)( range->image_offset + - ( large ? FT_GET_ULONG() - : FT_GET_USHORT() ) ); - FT_FRAME_EXIT(); - } - break; - - case 2: /* all glyphs have identical metrics */ - error = Load_SBit_Const_Metrics( range, stream ); - break; - - case 4: - error = Load_SBit_Range_Codes( range, stream, 1 ); - break; - - case 5: - error = Load_SBit_Const_Metrics( range, stream ); - if ( !error ) - error = Load_SBit_Range_Codes( range, stream, 0 ); - break; - - default: - error = SFNT_Err_Invalid_File_Format; - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_eblc */ - /* */ - /* <Description> */ - /* Loads the table of embedded bitmap sizes for this face. */ - /* */ - /* <Input> */ - /* face :: The target face object. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_eblc( TT_Face face, - FT_Stream stream ) - { - FT_Error error = SFNT_Err_Ok; - FT_Memory memory = stream->memory; - FT_Fixed version; - FT_ULong num_strikes; - FT_ULong table_base; - - static const FT_Frame_Field sbit_line_metrics_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_SBit_LineMetricsRec - - /* no FT_FRAME_START */ - FT_FRAME_CHAR( ascender ), - FT_FRAME_CHAR( descender ), - FT_FRAME_BYTE( max_width ), - - FT_FRAME_CHAR( caret_slope_numerator ), - FT_FRAME_CHAR( caret_slope_denominator ), - FT_FRAME_CHAR( caret_offset ), - - FT_FRAME_CHAR( min_origin_SB ), - FT_FRAME_CHAR( min_advance_SB ), - FT_FRAME_CHAR( max_before_BL ), - FT_FRAME_CHAR( min_after_BL ), - FT_FRAME_CHAR( pads[0] ), - FT_FRAME_CHAR( pads[1] ), - FT_FRAME_END - }; - - static const FT_Frame_Field strike_start_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_SBit_StrikeRec - - /* no FT_FRAME_START */ - FT_FRAME_ULONG( ranges_offset ), - FT_FRAME_SKIP_LONG, - FT_FRAME_ULONG( num_ranges ), - FT_FRAME_ULONG( color_ref ), - FT_FRAME_END - }; - - static const FT_Frame_Field strike_end_fields[] = - { - /* no FT_FRAME_START */ - FT_FRAME_USHORT( start_glyph ), - FT_FRAME_USHORT( end_glyph ), - FT_FRAME_BYTE ( x_ppem ), - FT_FRAME_BYTE ( y_ppem ), - FT_FRAME_BYTE ( bit_depth ), - FT_FRAME_CHAR ( flags ), - FT_FRAME_END - }; - - - face->num_sbit_strikes = 0; - - /* this table is optional */ - error = face->goto_table( face, TTAG_EBLC, stream, 0 ); - if ( error ) - error = face->goto_table( face, TTAG_bloc, stream, 0 ); - if ( error ) - goto Exit; - - table_base = FT_STREAM_POS(); - if ( FT_FRAME_ENTER( 8L ) ) - goto Exit; - - version = FT_GET_LONG(); - num_strikes = FT_GET_ULONG(); - - FT_FRAME_EXIT(); - - /* check version number and strike count */ - if ( version != 0x00020000L || - num_strikes >= 0x10000L ) - { - FT_ERROR(( "tt_face_load_sbit_strikes: invalid table version\n" )); - error = SFNT_Err_Invalid_File_Format; - - goto Exit; - } - - /* allocate the strikes table */ - if ( FT_NEW_ARRAY( face->sbit_strikes, num_strikes ) ) - goto Exit; - - face->num_sbit_strikes = num_strikes; - - /* now read each strike table separately */ - { - TT_SBit_Strike strike = face->sbit_strikes; - FT_ULong count = num_strikes; - - - if ( FT_FRAME_ENTER( 48L * num_strikes ) ) - goto Exit; - - while ( count > 0 ) - { - if ( FT_STREAM_READ_FIELDS( strike_start_fields, strike ) || - FT_STREAM_READ_FIELDS( sbit_line_metrics_fields, &strike->hori ) || - FT_STREAM_READ_FIELDS( sbit_line_metrics_fields, &strike->vert ) || - FT_STREAM_READ_FIELDS( strike_end_fields, strike ) ) - break; - - count--; - strike++; - } - - FT_FRAME_EXIT(); - } - - /* allocate the index ranges for each strike table */ - { - TT_SBit_Strike strike = face->sbit_strikes; - FT_ULong count = num_strikes; - - - while ( count > 0 ) - { - TT_SBit_Range range; - FT_ULong count2 = strike->num_ranges; - - - /* read each range */ - if ( FT_STREAM_SEEK( table_base + strike->ranges_offset ) || - FT_FRAME_ENTER( strike->num_ranges * 8L ) ) - goto Exit; - - if ( FT_NEW_ARRAY( strike->sbit_ranges, strike->num_ranges ) ) - goto Exit; - - range = strike->sbit_ranges; - while ( count2 > 0 ) - { - range->first_glyph = FT_GET_USHORT(); - range->last_glyph = FT_GET_USHORT(); - range->table_offset = table_base + strike->ranges_offset + - FT_GET_ULONG(); - count2--; - range++; - } - - FT_FRAME_EXIT(); - - /* Now, read each index table */ - count2 = strike->num_ranges; - range = strike->sbit_ranges; - while ( count2 > 0 ) - { - /* Read the header */ - if ( FT_STREAM_SEEK( range->table_offset ) || - FT_FRAME_ENTER( 8L ) ) - goto Exit; - - range->index_format = FT_GET_USHORT(); - range->image_format = FT_GET_USHORT(); - range->image_offset = FT_GET_ULONG(); - - FT_FRAME_EXIT(); - - error = Load_SBit_Range( range, stream ); - if ( error ) - goto Exit; - - count2--; - range++; - } - - count--; - strike++; - } - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_free_eblc */ - /* */ - /* <Description> */ - /* Releases the embedded bitmap tables. */ - /* */ - /* <Input> */ - /* face :: The target face object. */ - /* */ - FT_LOCAL_DEF( void ) - tt_face_free_eblc( TT_Face face ) - { - FT_Memory memory = face->root.memory; - TT_SBit_Strike strike = face->sbit_strikes; - TT_SBit_Strike strike_limit = strike + face->num_sbit_strikes; - - - if ( strike ) - { - for ( ; strike < strike_limit; strike++ ) - { - TT_SBit_Range range = strike->sbit_ranges; - TT_SBit_Range range_limit = range + strike->num_ranges; - - - if ( range ) - { - for ( ; range < range_limit; range++ ) - { - /* release the glyph offsets and codes tables */ - /* where appropriate */ - FT_FREE( range->glyph_offsets ); - FT_FREE( range->glyph_codes ); - } - } - FT_FREE( strike->sbit_ranges ); - strike->num_ranges = 0; - } - FT_FREE( face->sbit_strikes ); - } - face->num_sbit_strikes = 0; - } - - - FT_LOCAL_DEF( FT_Error ) - tt_face_set_sbit_strike( TT_Face face, - FT_Size_Request req, - FT_ULong* astrike_index ) - { - return FT_Match_Size( (FT_Face)face, req, 0, astrike_index ); - } - - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_strike_metrics( TT_Face face, - FT_ULong strike_index, - FT_Size_Metrics* metrics ) - { - TT_SBit_Strike strike; - - - if ( strike_index >= face->num_sbit_strikes ) - return SFNT_Err_Invalid_Argument; - - strike = face->sbit_strikes + strike_index; - - metrics->x_ppem = strike->x_ppem; - metrics->y_ppem = strike->y_ppem; - - metrics->ascender = strike->hori.ascender << 6; - metrics->descender = strike->hori.descender << 6; - - /* XXX: Is this correct? */ - metrics->max_advance = ( strike->hori.min_origin_SB + - strike->hori.max_width + - strike->hori.min_advance_SB ) << 6; - - metrics->height = metrics->ascender - metrics->descender; - - return SFNT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* find_sbit_range */ - /* */ - /* <Description> */ - /* Scans a given strike's ranges and return, for a given glyph */ - /* index, the corresponding sbit range, and `EBDT' offset. */ - /* */ - /* <Input> */ - /* glyph_index :: The glyph index. */ - /* */ - /* strike :: The source/current sbit strike. */ - /* */ - /* <Output> */ - /* arange :: The sbit range containing the glyph index. */ - /* */ - /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means the glyph index was found. */ - /* */ - static FT_Error - find_sbit_range( FT_UInt glyph_index, - TT_SBit_Strike strike, - TT_SBit_Range *arange, - FT_ULong *aglyph_offset ) - { - TT_SBit_RangeRec *range, *range_limit; - - - /* check whether the glyph index is within this strike's */ - /* glyph range */ - if ( glyph_index < (FT_UInt)strike->start_glyph || - glyph_index > (FT_UInt)strike->end_glyph ) - goto Fail; - - /* scan all ranges in strike */ - range = strike->sbit_ranges; - range_limit = range + strike->num_ranges; - if ( !range ) - goto Fail; - - for ( ; range < range_limit; range++ ) - { - if ( glyph_index >= (FT_UInt)range->first_glyph && - glyph_index <= (FT_UInt)range->last_glyph ) - { - FT_UShort delta = (FT_UShort)( glyph_index - range->first_glyph ); - - - switch ( range->index_format ) - { - case 1: - case 3: - *aglyph_offset = range->glyph_offsets[delta]; - break; - - case 2: - *aglyph_offset = range->image_offset + - range->image_size * delta; - break; - - case 4: - case 5: - { - FT_ULong n; - - - for ( n = 0; n < range->num_glyphs; n++ ) - { - if ( (FT_UInt)range->glyph_codes[n] == glyph_index ) - { - if ( range->index_format == 4 ) - *aglyph_offset = range->glyph_offsets[n]; - else - *aglyph_offset = range->image_offset + - n * range->image_size; - goto Found; - } - } - } - - /* fall-through */ - default: - goto Fail; - } - - Found: - /* return successfully! */ - *arange = range; - return SFNT_Err_Ok; - } - } - - Fail: - *arange = 0; - *aglyph_offset = 0; - - return SFNT_Err_Invalid_Argument; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_find_sbit_image */ - /* */ - /* <Description> */ - /* Checks whether an embedded bitmap (an `sbit') exists for a given */ - /* glyph, at a given strike. */ - /* */ - /* <Input> */ - /* face :: The target face object. */ - /* */ - /* glyph_index :: The glyph index. */ - /* */ - /* strike_index :: The current strike index. */ - /* */ - /* <Output> */ - /* arange :: The SBit range containing the glyph index. */ - /* */ - /* astrike :: The SBit strike containing the glyph index. */ - /* */ - /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. Returns */ - /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */ - /* glyph. */ - /* */ - FT_LOCAL( FT_Error ) - tt_find_sbit_image( TT_Face face, - FT_UInt glyph_index, - FT_ULong strike_index, - TT_SBit_Range *arange, - TT_SBit_Strike *astrike, - FT_ULong *aglyph_offset ) - { - FT_Error error; - TT_SBit_Strike strike; - - - if ( !face->sbit_strikes || - ( face->num_sbit_strikes <= strike_index ) ) - goto Fail; - - strike = &face->sbit_strikes[strike_index]; - - error = find_sbit_range( glyph_index, strike, - arange, aglyph_offset ); - if ( error ) - goto Fail; - - *astrike = strike; - - return SFNT_Err_Ok; - - Fail: - /* no embedded bitmap for this glyph in face */ - *arange = 0; - *astrike = 0; - *aglyph_offset = 0; - - return SFNT_Err_Invalid_Argument; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_load_sbit_metrics */ - /* */ - /* <Description> */ - /* Gets the big metrics for a given SBit. */ - /* */ - /* <Input> */ - /* stream :: The input stream. */ - /* */ - /* range :: The SBit range containing the glyph. */ - /* */ - /* <Output> */ - /* big_metrics :: A big SBit metrics structure for the glyph. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The stream cursor must be positioned at the glyph's offset within */ - /* the `EBDT' table before the call. */ - /* */ - /* If the image format uses variable metrics, the stream cursor is */ - /* positioned just after the metrics header in the `EBDT' table on */ - /* function exit. */ - /* */ - FT_LOCAL( FT_Error ) - tt_load_sbit_metrics( FT_Stream stream, - TT_SBit_Range range, - TT_SBit_Metrics metrics ) - { - FT_Error error = SFNT_Err_Ok; - - - switch ( range->image_format ) - { - case 1: - case 2: - case 8: - /* variable small metrics */ - { - TT_SBit_SmallMetricsRec smetrics; - - static const FT_Frame_Field sbit_small_metrics_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE TT_SBit_SmallMetricsRec - - FT_FRAME_START( 5 ), - FT_FRAME_BYTE( height ), - FT_FRAME_BYTE( width ), - FT_FRAME_CHAR( bearingX ), - FT_FRAME_CHAR( bearingY ), - FT_FRAME_BYTE( advance ), - FT_FRAME_END - }; - - - /* read small metrics */ - if ( FT_STREAM_READ_FIELDS( sbit_small_metrics_fields, &smetrics ) ) - goto Exit; - - /* convert it to a big metrics */ - metrics->height = smetrics.height; - metrics->width = smetrics.width; - metrics->horiBearingX = smetrics.bearingX; - metrics->horiBearingY = smetrics.bearingY; - metrics->horiAdvance = smetrics.advance; - - /* these metrics are made up at a higher level when */ - /* needed. */ - metrics->vertBearingX = 0; - metrics->vertBearingY = 0; - metrics->vertAdvance = 0; - } - break; - - case 6: - case 7: - case 9: - /* variable big metrics */ - if ( FT_STREAM_READ_FIELDS( sbit_metrics_fields, metrics ) ) - goto Exit; - break; - - case 5: - default: /* constant metrics */ - if ( range->index_format == 2 || range->index_format == 5 ) - *metrics = range->metrics; - else - return SFNT_Err_Invalid_File_Format; - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* crop_bitmap */ - /* */ - /* <Description> */ - /* Crops a bitmap to its tightest bounding box, and adjusts its */ - /* metrics. */ - /* */ - /* <InOut> */ - /* map :: The bitmap. */ - /* */ - /* metrics :: The corresponding metrics structure. */ - /* */ - static void - crop_bitmap( FT_Bitmap* map, - TT_SBit_Metrics metrics ) - { - /***********************************************************************/ - /* */ - /* In this situation, some bounding boxes of embedded bitmaps are too */ - /* large. We need to crop it to a reasonable size. */ - /* */ - /* --------- */ - /* | | ----- */ - /* | *** | |***| */ - /* | * | | * | */ - /* | * | ------> | * | */ - /* | * | | * | */ - /* | * | | * | */ - /* | *** | |***| */ - /* --------- ----- */ - /* */ - /***********************************************************************/ - - FT_Int rows, count; - FT_Long line_len; - FT_Byte* line; - - - /***********************************************************************/ - /* */ - /* first of all, check the top-most lines of the bitmap, and remove */ - /* them if they're empty. */ - /* */ - { - line = (FT_Byte*)map->buffer; - rows = map->rows; - line_len = map->pitch; - - - for ( count = 0; count < rows; count++ ) - { - FT_Byte* cur = line; - FT_Byte* limit = line + line_len; - - - for ( ; cur < limit; cur++ ) - if ( cur[0] ) - goto Found_Top; - - /* the current line was empty - skip to next one */ - line = limit; - } - - Found_Top: - /* check that we have at least one filled line */ - if ( count >= rows ) - goto Empty_Bitmap; - - /* now, crop the empty upper lines */ - if ( count > 0 ) - { - line = (FT_Byte*)map->buffer; - - FT_MEM_MOVE( line, line + count * line_len, - ( rows - count ) * line_len ); - - metrics->height = (FT_Byte)( metrics->height - count ); - metrics->horiBearingY = (FT_Char)( metrics->horiBearingY - count ); - metrics->vertBearingY = (FT_Char)( metrics->vertBearingY - count ); - - map->rows -= count; - rows -= count; - } - } - - /***********************************************************************/ - /* */ - /* second, crop the lower lines */ - /* */ - { - line = (FT_Byte*)map->buffer + ( rows - 1 ) * line_len; - - for ( count = 0; count < rows; count++ ) - { - FT_Byte* cur = line; - FT_Byte* limit = line + line_len; - - - for ( ; cur < limit; cur++ ) - if ( cur[0] ) - goto Found_Bottom; - - /* the current line was empty - skip to previous one */ - line -= line_len; - } - - Found_Bottom: - if ( count > 0 ) - { - metrics->height = (FT_Byte)( metrics->height - count ); - rows -= count; - map->rows -= count; - } - } - - /***********************************************************************/ - /* */ - /* third, get rid of the space on the left side of the glyph */ - /* */ - do - { - FT_Byte* limit; - - - line = (FT_Byte*)map->buffer; - limit = line + rows * line_len; - - for ( ; line < limit; line += line_len ) - if ( line[0] & 0x80 ) - goto Found_Left; - - /* shift the whole glyph one pixel to the left */ - line = (FT_Byte*)map->buffer; - limit = line + rows * line_len; - - for ( ; line < limit; line += line_len ) - { - FT_Int n, width = map->width; - FT_Byte old; - FT_Byte* cur = line; - - - old = (FT_Byte)(cur[0] << 1); - for ( n = 8; n < width; n += 8 ) - { - FT_Byte val; - - - val = cur[1]; - cur[0] = (FT_Byte)( old | ( val >> 7 ) ); - old = (FT_Byte)( val << 1 ); - cur++; - } - cur[0] = old; - } - - map->width--; - metrics->horiBearingX++; - metrics->vertBearingX++; - metrics->width--; - - } while ( map->width > 0 ); - - Found_Left: - - /***********************************************************************/ - /* */ - /* finally, crop the bitmap width to get rid of the space on the right */ - /* side of the glyph. */ - /* */ - do - { - FT_Int right = map->width - 1; - FT_Byte* limit; - FT_Byte mask; - - - line = (FT_Byte*)map->buffer + ( right >> 3 ); - limit = line + rows * line_len; - mask = (FT_Byte)( 0x80 >> ( right & 7 ) ); - - for ( ; line < limit; line += line_len ) - if ( line[0] & mask ) - goto Found_Right; - - /* crop the whole glyph to the right */ - map->width--; - metrics->width--; - - } while ( map->width > 0 ); - - Found_Right: - /* all right, the bitmap was cropped */ - return; - - Empty_Bitmap: - map->width = 0; - map->rows = 0; - map->pitch = 0; - map->pixel_mode = FT_PIXEL_MODE_MONO; - } - - - static FT_Error - Load_SBit_Single( FT_Bitmap* map, - FT_Int x_offset, - FT_Int y_offset, - FT_Int pix_bits, - FT_UShort image_format, - TT_SBit_Metrics metrics, - FT_Stream stream ) - { - FT_Error error; - - - /* check that the source bitmap fits into the target pixmap */ - if ( x_offset < 0 || x_offset + metrics->width > map->width || - y_offset < 0 || y_offset + metrics->height > map->rows ) - { - error = SFNT_Err_Invalid_Argument; - - goto Exit; - } - - { - FT_Int glyph_width = metrics->width; - FT_Int glyph_height = metrics->height; - FT_Int glyph_size; - FT_Int line_bits = pix_bits * glyph_width; - FT_Bool pad_bytes = 0; - - - /* compute size of glyph image */ - switch ( image_format ) - { - case 1: /* byte-padded formats */ - case 6: - { - FT_Int line_length; - - - switch ( pix_bits ) - { - case 1: - line_length = ( glyph_width + 7 ) >> 3; - break; - case 2: - line_length = ( glyph_width + 3 ) >> 2; - break; - case 4: - line_length = ( glyph_width + 1 ) >> 1; - break; - default: - line_length = glyph_width; - } - - glyph_size = glyph_height * line_length; - pad_bytes = 1; - } - break; - - case 2: - case 5: - case 7: - line_bits = glyph_width * pix_bits; - glyph_size = ( glyph_height * line_bits + 7 ) >> 3; - break; - - default: /* invalid format */ - return SFNT_Err_Invalid_File_Format; - } - - /* Now read data and draw glyph into target pixmap */ - if ( FT_FRAME_ENTER( glyph_size ) ) - goto Exit; - - /* don't forget to multiply `x_offset' by `map->pix_bits' as */ - /* the sbit blitter doesn't make a difference between pixmap */ - /* depths. */ - blit_sbit( map, (FT_Byte*)stream->cursor, line_bits, pad_bytes, - x_offset * pix_bits, y_offset, metrics->height ); - - FT_FRAME_EXIT(); - } - - Exit: - return error; - } - - - static FT_Error - Load_SBit_Image( TT_SBit_Strike strike, - TT_SBit_Range range, - FT_ULong ebdt_pos, - FT_ULong glyph_offset, - FT_GlyphSlot slot, - FT_Int x_offset, - FT_Int y_offset, - FT_Stream stream, - TT_SBit_Metrics metrics, - FT_Int depth ) - { - FT_Memory memory = stream->memory; - FT_Bitmap* map = &slot->bitmap; - FT_Error error; - - - /* place stream at beginning of glyph data and read metrics */ - if ( FT_STREAM_SEEK( ebdt_pos + glyph_offset ) ) - goto Exit; - - error = tt_load_sbit_metrics( stream, range, metrics ); - if ( error ) - goto Exit; - - /* This function is recursive. At the top-level call, we */ - /* compute the dimensions of the higher-level glyph to */ - /* allocate the final pixmap buffer. */ - if ( depth == 0 ) - { - FT_Long size; - - - map->width = metrics->width; - map->rows = metrics->height; - - switch ( strike->bit_depth ) - { - case 1: - map->pixel_mode = FT_PIXEL_MODE_MONO; - map->pitch = ( map->width + 7 ) >> 3; - break; - - case 2: - map->pixel_mode = FT_PIXEL_MODE_GRAY2; - map->pitch = ( map->width + 3 ) >> 2; - break; - - case 4: - map->pixel_mode = FT_PIXEL_MODE_GRAY4; - map->pitch = ( map->width + 1 ) >> 1; - break; - - case 8: - map->pixel_mode = FT_PIXEL_MODE_GRAY; - map->pitch = map->width; - break; - - default: - return SFNT_Err_Invalid_File_Format; - } - - size = map->rows * map->pitch; - - /* check that there is no empty image */ - if ( size == 0 ) - goto Exit; /* exit successfully! */ - - error = ft_glyphslot_alloc_bitmap( slot, size ); - if (error) - goto Exit; - } - - switch ( range->image_format ) - { - case 1: /* single sbit image - load it */ - case 2: - case 5: - case 6: - case 7: - return Load_SBit_Single( map, x_offset, y_offset, strike->bit_depth, - range->image_format, metrics, stream ); - - case 8: /* compound format */ - if ( FT_STREAM_SKIP( 1L ) ) - { - error = SFNT_Err_Invalid_Stream_Skip; - goto Exit; - } - /* fallthrough */ - - case 9: - break; - - default: /* invalid image format */ - return SFNT_Err_Invalid_File_Format; - } - - /* All right, we have a compound format. First of all, read */ - /* the array of elements. */ - { - TT_SBit_Component components; - TT_SBit_Component comp; - FT_UShort num_components, count; - - - if ( FT_READ_USHORT( num_components ) || - FT_NEW_ARRAY( components, num_components ) ) - goto Exit; - - count = num_components; - - if ( FT_FRAME_ENTER( 4L * num_components ) ) - goto Fail_Memory; - - for ( comp = components; count > 0; count--, comp++ ) - { - comp->glyph_code = FT_GET_USHORT(); - comp->x_offset = FT_GET_CHAR(); - comp->y_offset = FT_GET_CHAR(); - } - - FT_FRAME_EXIT(); - - /* Now recursively load each element glyph */ - count = num_components; - comp = components; - for ( ; count > 0; count--, comp++ ) - { - TT_SBit_Range elem_range; - TT_SBit_MetricsRec elem_metrics; - FT_ULong elem_offset; - - - /* find the range for this element */ - error = find_sbit_range( comp->glyph_code, - strike, - &elem_range, - &elem_offset ); - if ( error ) - goto Fail_Memory; - - /* now load the element, recursively */ - error = Load_SBit_Image( strike, - elem_range, - ebdt_pos, - elem_offset, - slot, - x_offset + comp->x_offset, - y_offset + comp->y_offset, - stream, - &elem_metrics, - depth + 1 ); - if ( error ) - goto Fail_Memory; - } - - Fail_Memory: - FT_FREE( components ); - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_sbit_image */ - /* */ - /* <Description> */ - /* Loads a given glyph sbit image from the font resource. This also */ - /* returns its metrics. */ - /* */ - /* <Input> */ - /* face :: The target face object. */ - /* */ - /* strike_index :: The current strike index. */ - /* */ - /* glyph_index :: The current glyph index. */ - /* */ - /* load_flags :: The glyph load flags (the code checks for the flag */ - /* FT_LOAD_CROP_BITMAP). */ - /* */ - /* stream :: The input stream. */ - /* */ - /* <Output> */ - /* map :: The target pixmap. */ - /* */ - /* metrics :: A big sbit metrics structure for the glyph image. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. Returns an error if no */ - /* glyph sbit exists for the index. */ - /* */ - /* <Note> */ - /* The `map.buffer' field is always freed before the glyph is loaded. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_sbit_image( TT_Face face, - FT_ULong strike_index, - FT_UInt glyph_index, - FT_UInt load_flags, - FT_Stream stream, - FT_Bitmap *map, - TT_SBit_MetricsRec *metrics ) - { - FT_Error error; - FT_ULong ebdt_pos, glyph_offset; - - TT_SBit_Strike strike; - TT_SBit_Range range; - - - /* Check whether there is a glyph sbit for the current index */ - error = tt_find_sbit_image( face, glyph_index, strike_index, - &range, &strike, &glyph_offset ); - if ( error ) - goto Exit; - - /* now, find the location of the `EBDT' table in */ - /* the font file */ - error = face->goto_table( face, TTAG_EBDT, stream, 0 ); - if ( error ) - error = face->goto_table( face, TTAG_bdat, stream, 0 ); - if ( error ) - goto Exit; - - ebdt_pos = FT_STREAM_POS(); - - error = Load_SBit_Image( strike, range, ebdt_pos, glyph_offset, - face->root.glyph, 0, 0, stream, metrics, 0 ); - if ( error ) - goto Exit; - - /* setup vertical metrics if needed */ - if ( strike->flags & 1 ) - { - /* in case of a horizontal strike only */ - FT_Int advance; - - - advance = strike->hori.ascender - strike->hori.descender; - - /* some heuristic values */ - - metrics->vertBearingX = (FT_Char)(-metrics->width / 2 ); - metrics->vertBearingY = (FT_Char)( ( advance - metrics->height ) / 2 ); - metrics->vertAdvance = (FT_Char)( advance * 12 / 10 ); - } - - /* Crop the bitmap now, unless specified otherwise */ - if ( load_flags & FT_LOAD_CROP_BITMAP ) - crop_bitmap( map, metrics ); - - Exit: - return error; - } - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttsbit.h b/android/jni/ndk_modules/freetype/src/sfnt/ttsbit.h deleted file mode 100644 index 7ea2af18..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttsbit.h +++ /dev/null @@ -1,79 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttsbit.h */ -/* */ -/* TrueType and OpenType embedded bitmap support (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTSBIT_H__ -#define __TTSBIT_H__ - - -#include <ft2build.h> -#include "ttload.h" - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - tt_face_load_eblc( TT_Face face, - FT_Stream stream ); - - FT_LOCAL( void ) - tt_face_free_eblc( TT_Face face ); - - - FT_LOCAL( FT_Error ) - tt_face_set_sbit_strike( TT_Face face, - FT_Size_Request req, - FT_ULong* astrike_index ); - - FT_LOCAL( FT_Error ) - tt_face_load_strike_metrics( TT_Face face, - FT_ULong strike_index, - FT_Size_Metrics* metrics ); - -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS - FT_LOCAL( FT_Error ) - tt_find_sbit_image( TT_Face face, - FT_UInt glyph_index, - FT_ULong strike_index, - TT_SBit_Range *arange, - TT_SBit_Strike *astrike, - FT_ULong *aglyph_offset ); - - FT_LOCAL( FT_Error ) - tt_load_sbit_metrics( FT_Stream stream, - TT_SBit_Range range, - TT_SBit_Metrics metrics ); - -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - FT_LOCAL( FT_Error ) - tt_face_load_sbit_image( TT_Face face, - FT_ULong strike_index, - FT_UInt glyph_index, - FT_UInt load_flags, - FT_Stream stream, - FT_Bitmap *map, - TT_SBit_MetricsRec *metrics ); - - -FT_END_HEADER - -#endif /* __TTSBIT_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/sfnt/ttsbit0.c b/android/jni/ndk_modules/freetype/src/sfnt/ttsbit0.c deleted file mode 100644 index 38bcf210..00000000 --- a/android/jni/ndk_modules/freetype/src/sfnt/ttsbit0.c +++ /dev/null @@ -1,1011 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttsbit0.c */ -/* */ -/* TrueType and OpenType embedded bitmap support (body). */ -/* This is a heap-optimized version. */ -/* */ -/* Copyright 2005, 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -/* This file is included by ttsbit.c */ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include "ttsbit.h" - -#include "sferrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttsbit - - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_eblc( TT_Face face, - FT_Stream stream ) - { - FT_Error error = SFNT_Err_Ok; - FT_Fixed version; - FT_ULong num_strikes, table_size; - FT_Byte* p; - FT_Byte* p_limit; - FT_UInt count; - - - face->sbit_num_strikes = 0; - - /* this table is optional */ - error = face->goto_table( face, TTAG_EBLC, stream, &table_size ); - if ( error ) - error = face->goto_table( face, TTAG_bloc, stream, &table_size ); - if ( error ) - goto Exit; - - if ( table_size < 8 ) - { - FT_ERROR(( "tt_face_load_sbit_strikes: table too short\n" )); - error = SFNT_Err_Invalid_File_Format; - goto Exit; - } - - if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) ) - goto Exit; - - face->sbit_table_size = table_size; - - p = face->sbit_table; - p_limit = p + table_size; - - version = FT_NEXT_ULONG( p ); - num_strikes = FT_NEXT_ULONG( p ); - - if ( version != 0x00020000UL || num_strikes >= 0x10000UL ) - { - FT_ERROR(( "tt_face_load_sbit_strikes: invalid table version\n" )); - error = SFNT_Err_Invalid_File_Format; - goto Fail; - } - - /* - * Count the number of strikes available in the table. We are a bit - * paranoid there and don't trust the data. - */ - count = (FT_UInt)num_strikes; - if ( 8 + 48UL * count > table_size ) - count = (FT_UInt)( ( p_limit - p ) / 48 ); - - face->sbit_num_strikes = count; - - FT_TRACE3(( "sbit_num_strikes: %u\n", count )); - Exit: - return error; - - Fail: - FT_FRAME_RELEASE( face->sbit_table ); - face->sbit_table_size = 0; - goto Exit; - } - - - FT_LOCAL_DEF( void ) - tt_face_free_eblc( TT_Face face ) - { - FT_Stream stream = face->root.stream; - - - FT_FRAME_RELEASE( face->sbit_table ); - face->sbit_table_size = 0; - face->sbit_num_strikes = 0; - } - - - FT_LOCAL_DEF( FT_Error ) - tt_face_set_sbit_strike( TT_Face face, - FT_Size_Request req, - FT_ULong* astrike_index ) - { - return FT_Match_Size( (FT_Face)face, req, 0, astrike_index ); - } - - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_strike_metrics( TT_Face face, - FT_ULong strike_index, - FT_Size_Metrics* metrics ) - { - FT_Byte* strike; - - - if ( strike_index >= (FT_ULong)face->sbit_num_strikes ) - return SFNT_Err_Invalid_Argument; - - strike = face->sbit_table + 8 + strike_index * 48; - - metrics->x_ppem = (FT_UShort)strike[44]; - metrics->y_ppem = (FT_UShort)strike[45]; - - metrics->ascender = (FT_Char)strike[16] << 6; /* hori.ascender */ - metrics->descender = (FT_Char)strike[17] << 6; /* hori.descender */ - metrics->height = metrics->ascender - metrics->descender; - - /* XXX: Is this correct? */ - metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB */ - strike[18] + /* max_width */ - (FT_Char)strike[23] /* min_advance_SB */ - ) << 6; - - return SFNT_Err_Ok; - } - - - typedef struct TT_SBitDecoderRec_ - { - TT_Face face; - FT_Stream stream; - FT_Bitmap* bitmap; - TT_SBit_Metrics metrics; - FT_Bool metrics_loaded; - FT_Bool bitmap_allocated; - FT_Byte bit_depth; - - FT_ULong ebdt_start; - FT_ULong ebdt_size; - - FT_ULong strike_index_array; - FT_ULong strike_index_count; - FT_Byte* eblc_base; - FT_Byte* eblc_limit; - - } TT_SBitDecoderRec, *TT_SBitDecoder; - - - static FT_Error - tt_sbit_decoder_init( TT_SBitDecoder decoder, - TT_Face face, - FT_ULong strike_index, - TT_SBit_MetricsRec* metrics ) - { - FT_Error error; - FT_Stream stream = face->root.stream; - FT_ULong ebdt_size; - - - error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size ); - if ( error ) - error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size ); - if ( error ) - goto Exit; - - decoder->face = face; - decoder->stream = stream; - decoder->bitmap = &face->root.glyph->bitmap; - decoder->metrics = metrics; - - decoder->metrics_loaded = 0; - decoder->bitmap_allocated = 0; - - decoder->ebdt_start = FT_STREAM_POS(); - decoder->ebdt_size = ebdt_size; - - decoder->eblc_base = face->sbit_table; - decoder->eblc_limit = face->sbit_table + face->sbit_table_size; - - /* now find the strike corresponding to the index */ - { - FT_Byte* p; - - - if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size ) - { - error = SFNT_Err_Invalid_File_Format; - goto Exit; - } - - p = decoder->eblc_base + 8 + 48 * strike_index; - - decoder->strike_index_array = FT_NEXT_ULONG( p ); - p += 4; - decoder->strike_index_count = FT_NEXT_ULONG( p ); - p += 34; - decoder->bit_depth = *p; - - if ( decoder->strike_index_array > face->sbit_table_size || - decoder->strike_index_array + 8 * decoder->strike_index_count > - face->sbit_table_size ) - error = SFNT_Err_Invalid_File_Format; - } - - Exit: - return error; - } - - - static void - tt_sbit_decoder_done( TT_SBitDecoder decoder ) - { - FT_UNUSED( decoder ); - } - - - static FT_Error - tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder decoder ) - { - FT_Error error = SFNT_Err_Ok; - FT_UInt width, height; - FT_Bitmap* map = decoder->bitmap; - FT_Long size; - - - if ( !decoder->metrics_loaded ) - { - error = SFNT_Err_Invalid_Argument; - goto Exit; - } - - width = decoder->metrics->width; - height = decoder->metrics->height; - - map->width = (int)width; - map->rows = (int)height; - - switch ( decoder->bit_depth ) - { - case 1: - map->pixel_mode = FT_PIXEL_MODE_MONO; - map->pitch = ( map->width + 7 ) >> 3; - break; - - case 2: - map->pixel_mode = FT_PIXEL_MODE_GRAY2; - map->pitch = ( map->width + 3 ) >> 2; - break; - - case 4: - map->pixel_mode = FT_PIXEL_MODE_GRAY4; - map->pitch = ( map->width + 1 ) >> 1; - break; - - case 8: - map->pixel_mode = FT_PIXEL_MODE_GRAY; - map->pitch = map->width; - break; - - default: - error = SFNT_Err_Invalid_File_Format; - goto Exit; - } - - size = map->rows * map->pitch; - - /* check that there is no empty image */ - if ( size == 0 ) - goto Exit; /* exit successfully! */ - - error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size ); - if ( error ) - goto Exit; - - decoder->bitmap_allocated = 1; - - Exit: - return error; - } - - - static FT_Error - tt_sbit_decoder_load_metrics( TT_SBitDecoder decoder, - FT_Byte* *pp, - FT_Byte* limit, - FT_Bool big ) - { - FT_Byte* p = *pp; - TT_SBit_Metrics metrics = decoder->metrics; - - - if ( p + 5 > limit ) - goto Fail; - - metrics->height = p[0]; - metrics->width = p[1]; - metrics->horiBearingX = (FT_Char)p[2]; - metrics->horiBearingY = (FT_Char)p[3]; - metrics->horiAdvance = p[4]; - - p += 5; - if ( big ) - { - if ( p + 3 > limit ) - goto Fail; - - metrics->vertBearingX = (FT_Char)p[0]; - metrics->vertBearingY = (FT_Char)p[1]; - metrics->vertAdvance = p[2]; - - p += 3; - } - - decoder->metrics_loaded = 1; - *pp = p; - return SFNT_Err_Ok; - - Fail: - return SFNT_Err_Invalid_Argument; - } - - - /* forward declaration */ - static FT_Error - tt_sbit_decoder_load_image( TT_SBitDecoder decoder, - FT_UInt glyph_index, - FT_Int x_pos, - FT_Int y_pos ); - - typedef FT_Error (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder decoder, - FT_Byte* p, - FT_Byte* plimit, - FT_Int x_pos, - FT_Int y_pos ); - - - static FT_Error - tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder decoder, - FT_Byte* p, - FT_Byte* limit, - FT_Int x_pos, - FT_Int y_pos ) - { - FT_Error error = SFNT_Err_Ok; - FT_Byte* line; - FT_Int bit_height, bit_width, pitch, width, height, h; - FT_Bitmap* bitmap; - - - if ( !decoder->bitmap_allocated ) - { - error = tt_sbit_decoder_alloc_bitmap( decoder ); - if ( error ) - goto Exit; - } - - /* check that we can write the glyph into the bitmap */ - bitmap = decoder->bitmap; - bit_width = bitmap->width; - bit_height = bitmap->rows; - pitch = bitmap->pitch; - line = bitmap->buffer; - - width = decoder->metrics->width; - height = decoder->metrics->height; - - if ( x_pos < 0 || x_pos + width > bit_width || - y_pos < 0 || y_pos + height > bit_height ) - { - error = SFNT_Err_Invalid_File_Format; - goto Exit; - } - - if ( p + ( ( width + 7 ) >> 3 ) * height > limit ) - { - error = SFNT_Err_Invalid_File_Format; - goto Exit; - } - - /* now do the blit */ - line += y_pos * pitch + ( x_pos >> 3 ); - x_pos &= 7; - - if ( x_pos == 0 ) /* the easy one */ - { - for ( h = height; h > 0; h--, line += pitch ) - { - FT_Byte* write = line; - FT_Int w; - - - for ( w = width; w >= 8; w -= 8 ) - { - write[0] = (FT_Byte)( write[0] | *p++ ); - write += 1; - } - - if ( w > 0 ) - write[0] = (FT_Byte)( write[0] | ( *p++ & ( 0xFF00U >> w ) ) ); - } - } - else /* x_pos > 0 */ - { - for ( h = height; h > 0; h--, line += pitch ) - { - FT_Byte* write = line; - FT_Int w; - FT_UInt wval = 0; - - - for ( w = width; w >= 8; w -= 8 ) - { - wval = (FT_UInt)( wval | *p++ ); - write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) ); - write += 1; - wval <<= 8; - } - - if ( w > 0 ) - wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) ); - - /* all bits read and there are `x_pos + w' bits to be written */ - - write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) ); - - if ( x_pos + w > 8 ) - { - write++; - wval <<= 8; - write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) ); - } - } - } - - Exit: - return error; - } - - - /* - * Load a bit-aligned bitmap (with pointer `p') into a line-aligned bitmap - * (with pointer `write'). In the example below, the width is 3 pixel, - * and `x_pos' is 1 pixel. - * - * p p+1 - * | | | - * | 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |... - * | | | - * +-------+ +-------+ +-------+ ... - * . . . - * . . . - * v . . - * +-------+ . . - * | | . - * | 7 6 5 4 3 2 1 0 | . - * | | . - * write . . - * . . - * v . - * +-------+ . - * | | - * | 7 6 5 4 3 2 1 0 | - * | | - * write+1 . - * . - * v - * +-------+ - * | | - * | 7 6 5 4 3 2 1 0 | - * | | - * write+2 - * - */ - - static FT_Error - tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder decoder, - FT_Byte* p, - FT_Byte* limit, - FT_Int x_pos, - FT_Int y_pos ) - { - FT_Error error = SFNT_Err_Ok; - FT_Byte* line; - FT_Int bit_height, bit_width, pitch, width, height, h, nbits; - FT_Bitmap* bitmap; - FT_UShort rval; - - - if ( !decoder->bitmap_allocated ) - { - error = tt_sbit_decoder_alloc_bitmap( decoder ); - if ( error ) - goto Exit; - } - - /* check that we can write the glyph into the bitmap */ - bitmap = decoder->bitmap; - bit_width = bitmap->width; - bit_height = bitmap->rows; - pitch = bitmap->pitch; - line = bitmap->buffer; - - width = decoder->metrics->width; - height = decoder->metrics->height; - - if ( x_pos < 0 || x_pos + width > bit_width || - y_pos < 0 || y_pos + height > bit_height ) - { - error = SFNT_Err_Invalid_File_Format; - goto Exit; - } - - if ( p + ( ( width * height + 7 ) >> 3 ) > limit ) - { - error = SFNT_Err_Invalid_File_Format; - goto Exit; - } - - /* now do the blit */ - - /* adjust `line' to point to the first byte of the bitmap */ - line += y_pos * pitch + ( x_pos >> 3 ); - x_pos &= 7; - - /* the higher byte of `rval' is used as a buffer */ - rval = 0; - nbits = 0; - - for ( h = height; h > 0; h--, line += pitch ) - { - FT_Byte* write = line; - FT_Int w = width; - - - /* handle initial byte (in target bitmap) specially if necessary */ - if ( x_pos ) - { - w = ( width < 8 - x_pos ) ? width : 8 - x_pos; - - if ( h == height ) - { - rval = *p++; - nbits = x_pos; - } - else if ( nbits < w ) - { - if ( p < limit ) - rval |= *p++; - nbits += 8 - w; - } - else - { - rval >>= 8; - nbits -= w; - } - - *write++ |= ( ( rval >> nbits ) & 0xFF ) & - ( ~( 0xFF << w ) << ( 8 - w - x_pos ) ); - rval <<= 8; - - w = width - w; - } - - /* handle medial bytes */ - for ( ; w >= 8; w -= 8 ) - { - rval |= *p++; - *write++ |= ( rval >> nbits ) & 0xFF; - - rval <<= 8; - } - - /* handle final byte if necessary */ - if ( w > 0 ) - { - if ( nbits < w ) - { - if ( p < limit ) - rval |= *p++; - *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); - nbits += 8 - w; - - rval <<= 8; - } - else - { - *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); - nbits -= w; - } - } - } - - Exit: - return error; - } - - - static FT_Error - tt_sbit_decoder_load_compound( TT_SBitDecoder decoder, - FT_Byte* p, - FT_Byte* limit, - FT_Int x_pos, - FT_Int y_pos ) - { - FT_Error error = SFNT_Err_Ok; - FT_UInt num_components, nn; - - FT_Char horiBearingX = decoder->metrics->horiBearingX; - FT_Char horiBearingY = decoder->metrics->horiBearingY; - FT_Byte horiAdvance = decoder->metrics->horiAdvance; - FT_Char vertBearingX = decoder->metrics->vertBearingX; - FT_Char vertBearingY = decoder->metrics->vertBearingY; - FT_Byte vertAdvance = decoder->metrics->vertAdvance; - - - if ( p + 2 > limit ) - goto Fail; - - num_components = FT_NEXT_USHORT( p ); - if ( p + 4 * num_components > limit ) - goto Fail; - - if ( !decoder->bitmap_allocated ) - { - error = tt_sbit_decoder_alloc_bitmap( decoder ); - if ( error ) - goto Exit; - } - - for ( nn = 0; nn < num_components; nn++ ) - { - FT_UInt gindex = FT_NEXT_USHORT( p ); - FT_Byte dx = FT_NEXT_BYTE( p ); - FT_Byte dy = FT_NEXT_BYTE( p ); - - - /* NB: a recursive call */ - error = tt_sbit_decoder_load_image( decoder, gindex, - x_pos + dx, y_pos + dy ); - if ( error ) - break; - } - - decoder->metrics->horiBearingX = horiBearingX; - decoder->metrics->horiBearingY = horiBearingY; - decoder->metrics->horiAdvance = horiAdvance; - decoder->metrics->vertBearingX = vertBearingX; - decoder->metrics->vertBearingY = vertBearingY; - decoder->metrics->vertAdvance = vertAdvance; - decoder->metrics->width = (FT_UInt)decoder->bitmap->width; - decoder->metrics->height = (FT_UInt)decoder->bitmap->rows; - - Exit: - return error; - - Fail: - error = SFNT_Err_Invalid_File_Format; - goto Exit; - } - - - static FT_Error - tt_sbit_decoder_load_bitmap( TT_SBitDecoder decoder, - FT_UInt glyph_format, - FT_ULong glyph_start, - FT_ULong glyph_size, - FT_Int x_pos, - FT_Int y_pos ) - { - FT_Error error; - FT_Stream stream = decoder->stream; - FT_Byte* p; - FT_Byte* p_limit; - FT_Byte* data; - - - /* seek into the EBDT table now */ - if ( glyph_start + glyph_size > decoder->ebdt_size ) - { - error = SFNT_Err_Invalid_Argument; - goto Exit; - } - - if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) || - FT_FRAME_EXTRACT( glyph_size, data ) ) - goto Exit; - - p = data; - p_limit = p + glyph_size; - - /* read the data, depending on the glyph format */ - switch ( glyph_format ) - { - case 1: - case 2: - case 8: - error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 ); - break; - - case 6: - case 7: - case 9: - error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ); - break; - - default: - error = SFNT_Err_Ok; - } - - if ( error ) - goto Fail; - - { - TT_SBitDecoder_LoadFunc loader; - - - switch ( glyph_format ) - { - case 1: - case 6: - loader = tt_sbit_decoder_load_byte_aligned; - break; - - case 2: - case 5: - case 7: - loader = tt_sbit_decoder_load_bit_aligned; - break; - - case 8: - if ( p + 1 > p_limit ) - goto Fail; - - p += 1; /* skip padding */ - /* fall-through */ - - case 9: - loader = tt_sbit_decoder_load_compound; - break; - - default: - goto Fail; - } - - error = loader( decoder, p, p_limit, x_pos, y_pos ); - } - - Fail: - FT_FRAME_RELEASE( data ); - - Exit: - return error; - } - - - static FT_Error - tt_sbit_decoder_load_image( TT_SBitDecoder decoder, - FT_UInt glyph_index, - FT_Int x_pos, - FT_Int y_pos ) - { - /* - * First, we find the correct strike range that applies to this - * glyph index. - */ - - FT_Byte* p = decoder->eblc_base + decoder->strike_index_array; - FT_Byte* p_limit = decoder->eblc_limit; - FT_ULong num_ranges = decoder->strike_index_count; - FT_UInt start, end, index_format, image_format; - FT_ULong image_start = 0, image_end = 0, image_offset; - - - for ( ; num_ranges > 0; num_ranges-- ) - { - start = FT_NEXT_USHORT( p ); - end = FT_NEXT_USHORT( p ); - - if ( glyph_index >= start && glyph_index <= end ) - goto FoundRange; - - p += 4; /* ignore index offset */ - } - goto NoBitmap; - - FoundRange: - image_offset = FT_NEXT_ULONG( p ); - - /* overflow check */ - if ( decoder->eblc_base + decoder->strike_index_array + image_offset < - decoder->eblc_base ) - goto Failure; - - p = decoder->eblc_base + decoder->strike_index_array + image_offset; - if ( p + 8 > p_limit ) - goto NoBitmap; - - /* now find the glyph's location and extend within the ebdt table */ - index_format = FT_NEXT_USHORT( p ); - image_format = FT_NEXT_USHORT( p ); - image_offset = FT_NEXT_ULONG ( p ); - - switch ( index_format ) - { - case 1: /* 4-byte offsets relative to `image_offset' */ - { - p += 4 * ( glyph_index - start ); - if ( p + 8 > p_limit ) - goto NoBitmap; - - image_start = FT_NEXT_ULONG( p ); - image_end = FT_NEXT_ULONG( p ); - - if ( image_start == image_end ) /* missing glyph */ - goto NoBitmap; - } - break; - - case 2: /* big metrics, constant image size */ - { - FT_ULong image_size; - - - if ( p + 12 > p_limit ) - goto NoBitmap; - - image_size = FT_NEXT_ULONG( p ); - - if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) - goto NoBitmap; - - image_start = image_size * ( glyph_index - start ); - image_end = image_start + image_size; - } - break; - - case 3: /* 2-byte offsets relative to 'image_offset' */ - { - p += 2 * ( glyph_index - start ); - if ( p + 4 > p_limit ) - goto NoBitmap; - - image_start = FT_NEXT_USHORT( p ); - image_end = FT_NEXT_USHORT( p ); - - if ( image_start == image_end ) /* missing glyph */ - goto NoBitmap; - } - break; - - case 4: /* sparse glyph array with (glyph,offset) pairs */ - { - FT_ULong mm, num_glyphs; - - - if ( p + 4 > p_limit ) - goto NoBitmap; - - num_glyphs = FT_NEXT_ULONG( p ); - - /* overflow check */ - if ( p + ( num_glyphs + 1 ) * 4 < p ) - goto Failure; - - if ( p + ( num_glyphs + 1 ) * 4 > p_limit ) - goto NoBitmap; - - for ( mm = 0; mm < num_glyphs; mm++ ) - { - FT_UInt gindex = FT_NEXT_USHORT( p ); - - - if ( gindex == glyph_index ) - { - image_start = FT_NEXT_USHORT( p ); - p += 2; - image_end = FT_PEEK_USHORT( p ); - break; - } - p += 2; - } - - if ( mm >= num_glyphs ) - goto NoBitmap; - } - break; - - case 5: /* constant metrics with sparse glyph codes */ - { - FT_ULong image_size, mm, num_glyphs; - - - if ( p + 16 > p_limit ) - goto NoBitmap; - - image_size = FT_NEXT_ULONG( p ); - - if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) - goto NoBitmap; - - num_glyphs = FT_NEXT_ULONG( p ); - - /* overflow check */ - if ( p + 2 * num_glyphs < p ) - goto Failure; - - if ( p + 2 * num_glyphs > p_limit ) - goto NoBitmap; - - for ( mm = 0; mm < num_glyphs; mm++ ) - { - FT_UInt gindex = FT_NEXT_USHORT( p ); - - - if ( gindex == glyph_index ) - break; - } - - if ( mm >= num_glyphs ) - goto NoBitmap; - - image_start = image_size * mm; - image_end = image_start + image_size; - } - break; - - default: - goto NoBitmap; - } - - if ( image_start > image_end ) - goto NoBitmap; - - image_end -= image_start; - image_start = image_offset + image_start; - - return tt_sbit_decoder_load_bitmap( decoder, - image_format, - image_start, - image_end, - x_pos, - y_pos ); - - Failure: - return SFNT_Err_Invalid_Table; - - NoBitmap: - return SFNT_Err_Invalid_Argument; - } - - - FT_LOCAL( FT_Error ) - tt_face_load_sbit_image( TT_Face face, - FT_ULong strike_index, - FT_UInt glyph_index, - FT_UInt load_flags, - FT_Stream stream, - FT_Bitmap *map, - TT_SBit_MetricsRec *metrics ) - { - TT_SBitDecoderRec decoder[1]; - FT_Error error; - - FT_UNUSED( load_flags ); - FT_UNUSED( stream ); - FT_UNUSED( map ); - - - error = tt_sbit_decoder_init( decoder, face, strike_index, metrics ); - if ( !error ) - { - error = tt_sbit_decoder_load_image( decoder, glyph_index, 0, 0 ); - tt_sbit_decoder_done( decoder ); - } - - return error; - } - -/* EOF */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftgrays.c b/android/jni/ndk_modules/freetype/src/smooth/ftgrays.c deleted file mode 100644 index 0b941433..00000000 --- a/android/jni/ndk_modules/freetype/src/smooth/ftgrays.c +++ /dev/null @@ -1,2091 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgrays.c */ -/* */ -/* A new `perfect' anti-aliasing renderer (body). */ -/* */ -/* Copyright 2000-2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* This file can be compiled without the rest of the FreeType engine, by */ - /* defining the _STANDALONE_ macro when compiling it. You also need to */ - /* put the files `ftgrays.h' and `ftimage.h' into the current */ - /* compilation directory. Typically, you could do something like */ - /* */ - /* - copy `src/smooth/ftgrays.c' (this file) to your current directory */ - /* */ - /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */ - /* same directory */ - /* */ - /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in */ - /* */ - /* cc -c -D_STANDALONE_ ftgrays.c */ - /* */ - /* The renderer can be initialized with a call to */ - /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated */ - /* with a call to `ft_gray_raster.raster_render'. */ - /* */ - /* See the comments and documentation in the file `ftimage.h' for more */ - /* details on how the raster works. */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* This is a new anti-aliasing scan-converter for FreeType 2. The */ - /* algorithm used here is _very_ different from the one in the standard */ - /* `ftraster' module. Actually, `ftgrays' computes the _exact_ */ - /* coverage of the outline on each pixel cell. */ - /* */ - /* It is based on ideas that I initially found in Raph Levien's */ - /* excellent LibArt graphics library (see http://www.levien.com/libart */ - /* for more information, though the web pages do not tell anything */ - /* about the renderer; you'll have to dive into the source code to */ - /* understand how it works). */ - /* */ - /* Note, however, that this is a _very_ different implementation */ - /* compared to Raph's. Coverage information is stored in a very */ - /* different way, and I don't use sorted vector paths. Also, it doesn't */ - /* use floating point values. */ - /* */ - /* This renderer has the following advantages: */ - /* */ - /* - It doesn't need an intermediate bitmap. Instead, one can supply a */ - /* callback function that will be called by the renderer to draw gray */ - /* spans on any target surface. You can thus do direct composition on */ - /* any kind of bitmap, provided that you give the renderer the right */ - /* callback. */ - /* */ - /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on */ - /* each pixel cell. */ - /* */ - /* - It performs a single pass on the outline (the `standard' FT2 */ - /* renderer makes two passes). */ - /* */ - /* - It can easily be modified to render to _any_ number of gray levels */ - /* cheaply. */ - /* */ - /* - For small (< 20) pixel sizes, it is faster than the standard */ - /* renderer. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_smooth - - -#ifdef _STANDALONE_ - - - /* define this to dump debugging information */ -/* #define FT_DEBUG_LEVEL_TRACE */ - - -#ifdef FT_DEBUG_LEVEL_TRACE -#include <stdio.h> -#include <stdarg.h> -#endif - -#include <stddef.h> -#include <string.h> -#include <setjmp.h> -#include <limits.h> -#define FT_UINT_MAX UINT_MAX -#define FT_INT_MAX INT_MAX - -#define ft_memset memset - -#define ft_setjmp setjmp -#define ft_longjmp longjmp -#define ft_jmp_buf jmp_buf - -typedef ptrdiff_t FT_PtrDist; - - -#define ErrRaster_Invalid_Mode -2 -#define ErrRaster_Invalid_Outline -1 -#define ErrRaster_Invalid_Argument -3 -#define ErrRaster_Memory_Overflow -4 - -#define FT_BEGIN_HEADER -#define FT_END_HEADER - -#include "ftimage.h" -#include "ftgrays.h" - - - /* This macro is used to indicate that a function parameter is unused. */ - /* Its purpose is simply to reduce compiler warnings. Note also that */ - /* simply defining it as `(void)x' doesn't avoid warnings with certain */ - /* ANSI compilers (e.g. LCC). */ -#define FT_UNUSED( x ) (x) = (x) - - - /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */ - -#ifdef FT_DEBUG_LEVEL_TRACE - - void - FT_Message( const char* fmt, - ... ) - { - va_list ap; - - - va_start( ap, fmt ); - vfprintf( stderr, fmt, ap ); - va_end( ap ); - } - - /* we don't handle tracing levels in stand-alone mode; */ -#ifndef FT_TRACE5 -#define FT_TRACE5( varformat ) FT_Message varformat -#endif -#ifndef FT_TRACE7 -#define FT_TRACE7( varformat ) FT_Message varformat -#endif -#ifndef FT_ERROR -#define FT_ERROR( varformat ) FT_Message varformat -#endif - -#else /* !FT_DEBUG_LEVEL_TRACE */ - -#define FT_TRACE5( x ) do { } while ( 0 ) /* nothing */ -#define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */ -#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ - -#endif /* !FT_DEBUG_LEVEL_TRACE */ - - -#define FT_DEFINE_OUTLINE_FUNCS( class_, \ - move_to_, line_to_, \ - conic_to_, cubic_to_, \ - shift_, delta_ ) \ - static const FT_Outline_Funcs class_ = \ - { \ - move_to_, \ - line_to_, \ - conic_to_, \ - cubic_to_, \ - shift_, \ - delta_ \ - }; - -#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, \ - raster_new_, raster_reset_, \ - raster_set_mode_, raster_render_, \ - raster_done_ ) \ - const FT_Raster_Funcs class_ = \ - { \ - glyph_format_, \ - raster_new_, \ - raster_reset_, \ - raster_set_mode_, \ - raster_render_, \ - raster_done_ \ - }; - -#else /* !_STANDALONE_ */ - - -#include <ft2build.h> -#include "ftgrays.h" -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_OUTLINE_H - -#include "ftsmerrs.h" - -#include "ftspic.h" - -#define ErrRaster_Invalid_Mode Smooth_Err_Cannot_Render_Glyph -#define ErrRaster_Invalid_Outline Smooth_Err_Invalid_Outline -#define ErrRaster_Memory_Overflow Smooth_Err_Out_Of_Memory -#define ErrRaster_Invalid_Argument Smooth_Err_Invalid_Argument - -#endif /* !_STANDALONE_ */ - -#ifndef FT_MEM_SET -#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) -#endif - -#ifndef FT_MEM_ZERO -#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) -#endif - - /* as usual, for the speed hungry :-) */ - -#ifndef FT_STATIC_RASTER - -#define RAS_ARG PWorker worker -#define RAS_ARG_ PWorker worker, - -#define RAS_VAR worker -#define RAS_VAR_ worker, - -#else /* FT_STATIC_RASTER */ - -#define RAS_ARG /* empty */ -#define RAS_ARG_ /* empty */ -#define RAS_VAR /* empty */ -#define RAS_VAR_ /* empty */ - -#endif /* FT_STATIC_RASTER */ - - - /* must be at least 6 bits! */ -#define PIXEL_BITS 8 - -#define ONE_PIXEL ( 1L << PIXEL_BITS ) -#define PIXEL_MASK ( -1L << PIXEL_BITS ) -#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) ) -#define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS ) -#define FLOOR( x ) ( (x) & -ONE_PIXEL ) -#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL ) -#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL ) - -#if PIXEL_BITS >= 6 -#define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) ) -#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) ) -#else -#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) ) -#define DOWNSCALE( x ) ( (x) << ( 6 - PIXEL_BITS ) ) -#endif - - - /*************************************************************************/ - /* */ - /* TYPE DEFINITIONS */ - /* */ - - /* don't change the following types to FT_Int or FT_Pos, since we might */ - /* need to define them to "float" or "double" when experimenting with */ - /* new algorithms */ - - typedef long TCoord; /* integer scanline/pixel coordinate */ - typedef long TPos; /* sub-pixel coordinate */ - - /* determine the type used to store cell areas. This normally takes at */ - /* least PIXEL_BITS*2 + 1 bits. On 16-bit systems, we need to use */ - /* `long' instead of `int', otherwise bad things happen */ - -#if PIXEL_BITS <= 7 - - typedef int TArea; - -#else /* PIXEL_BITS >= 8 */ - - /* approximately determine the size of integers using an ANSI-C header */ -#if FT_UINT_MAX == 0xFFFFU - typedef long TArea; -#else - typedef int TArea; -#endif - -#endif /* PIXEL_BITS >= 8 */ - - - /* maximal number of gray spans in a call to the span callback */ -#define FT_MAX_GRAY_SPANS 32 - - - typedef struct TCell_* PCell; - - typedef struct TCell_ - { - TPos x; /* same with TWorker.ex */ - TCoord cover; /* same with TWorker.cover */ - TArea area; - PCell next; - - } TCell; - - - typedef struct TWorker_ - { - TCoord ex, ey; - TPos min_ex, max_ex; - TPos min_ey, max_ey; - TPos count_ex, count_ey; - - TArea area; - TCoord cover; - int invalid; - - PCell cells; - FT_PtrDist max_cells; - FT_PtrDist num_cells; - - TCoord cx, cy; - TPos x, y; - - TPos last_ey; - - FT_Vector bez_stack[32 * 3 + 1]; - int lev_stack[32]; - - FT_Outline outline; - FT_Bitmap target; - FT_BBox clip_box; - - FT_Span gray_spans[FT_MAX_GRAY_SPANS]; - int num_gray_spans; - - FT_Raster_Span_Func render_span; - void* render_span_data; - int span_y; - - int band_size; - int band_shoot; - int conic_level; - int cubic_level; - - ft_jmp_buf jump_buffer; - - void* buffer; - long buffer_size; - - PCell* ycells; - TPos ycount; - - } TWorker, *PWorker; - - -#ifndef FT_STATIC_RASTER -#define ras (*worker) -#else - static TWorker ras; -#endif - - - typedef struct TRaster_ - { - void* buffer; - long buffer_size; - int band_size; - void* memory; - PWorker worker; - - } TRaster, *PRaster; - - - - /*************************************************************************/ - /* */ - /* Initialize the cells table. */ - /* */ - static void - gray_init_cells( RAS_ARG_ void* buffer, - long byte_size ) - { - ras.buffer = buffer; - ras.buffer_size = byte_size; - - ras.ycells = (PCell*) buffer; - ras.cells = NULL; - ras.max_cells = 0; - ras.num_cells = 0; - ras.area = 0; - ras.cover = 0; - ras.invalid = 1; - } - - - /*************************************************************************/ - /* */ - /* Compute the outline bounding box. */ - /* */ - static void - gray_compute_cbox( RAS_ARG ) - { - FT_Outline* outline = &ras.outline; - FT_Vector* vec = outline->points; - FT_Vector* limit = vec + outline->n_points; - - - if ( outline->n_points <= 0 ) - { - ras.min_ex = ras.max_ex = 0; - ras.min_ey = ras.max_ey = 0; - return; - } - - ras.min_ex = ras.max_ex = vec->x; - ras.min_ey = ras.max_ey = vec->y; - - vec++; - - for ( ; vec < limit; vec++ ) - { - TPos x = vec->x; - TPos y = vec->y; - - - if ( x < ras.min_ex ) ras.min_ex = x; - if ( x > ras.max_ex ) ras.max_ex = x; - if ( y < ras.min_ey ) ras.min_ey = y; - if ( y > ras.max_ey ) ras.max_ey = y; - } - - /* truncate the bounding box to integer pixels */ - ras.min_ex = ras.min_ex >> 6; - ras.min_ey = ras.min_ey >> 6; - ras.max_ex = ( ras.max_ex + 63 ) >> 6; - ras.max_ey = ( ras.max_ey + 63 ) >> 6; - } - - - /*************************************************************************/ - /* */ - /* Record the current cell in the table. */ - /* */ - static PCell - gray_find_cell( RAS_ARG ) - { - PCell *pcell, cell; - TPos x = ras.ex; - - - if ( x > ras.count_ex ) - x = ras.count_ex; - - pcell = &ras.ycells[ras.ey]; - for (;;) - { - cell = *pcell; - if ( cell == NULL || cell->x > x ) - break; - - if ( cell->x == x ) - goto Exit; - - pcell = &cell->next; - } - - if ( ras.num_cells >= ras.max_cells ) - ft_longjmp( ras.jump_buffer, 1 ); - - cell = ras.cells + ras.num_cells++; - cell->x = x; - cell->area = 0; - cell->cover = 0; - - cell->next = *pcell; - *pcell = cell; - - Exit: - return cell; - } - - - static void - gray_record_cell( RAS_ARG ) - { - if ( !ras.invalid && ( ras.area | ras.cover ) ) - { - PCell cell = gray_find_cell( RAS_VAR ); - - - cell->area += ras.area; - cell->cover += ras.cover; - } - } - - - /*************************************************************************/ - /* */ - /* Set the current cell to a new position. */ - /* */ - static void - gray_set_cell( RAS_ARG_ TCoord ex, - TCoord ey ) - { - /* Move the cell pointer to a new position. We set the `invalid' */ - /* flag to indicate that the cell isn't part of those we're interested */ - /* in during the render phase. This means that: */ - /* */ - /* . the new vertical position must be within min_ey..max_ey-1. */ - /* . the new horizontal position must be strictly less than max_ex */ - /* */ - /* Note that if a cell is to the left of the clipping region, it is */ - /* actually set to the (min_ex-1) horizontal position. */ - - /* All cells that are on the left of the clipping region go to the */ - /* min_ex - 1 horizontal position. */ - ey -= ras.min_ey; - - if ( ex > ras.max_ex ) - ex = ras.max_ex; - - ex -= ras.min_ex; - if ( ex < 0 ) - ex = -1; - - /* are we moving to a different cell ? */ - if ( ex != ras.ex || ey != ras.ey ) - { - /* record the current one if it is valid */ - if ( !ras.invalid ) - gray_record_cell( RAS_VAR ); - - ras.area = 0; - ras.cover = 0; - } - - ras.ex = ex; - ras.ey = ey; - ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey || - ex >= ras.count_ex ); - } - - - /*************************************************************************/ - /* */ - /* Start a new contour at a given cell. */ - /* */ - static void - gray_start_cell( RAS_ARG_ TCoord ex, - TCoord ey ) - { - if ( ex > ras.max_ex ) - ex = (TCoord)( ras.max_ex ); - - if ( ex < ras.min_ex ) - ex = (TCoord)( ras.min_ex - 1 ); - - ras.area = 0; - ras.cover = 0; - ras.ex = ex - ras.min_ex; - ras.ey = ey - ras.min_ey; - ras.last_ey = SUBPIXELS( ey ); - ras.invalid = 0; - - gray_set_cell( RAS_VAR_ ex, ey ); - } - - - /*************************************************************************/ - /* */ - /* Render a scanline as one or more cells. */ - /* */ - static void - gray_render_scanline( RAS_ARG_ TCoord ey, - TPos x1, - TCoord y1, - TPos x2, - TCoord y2 ) - { - TCoord ex1, ex2, fx1, fx2, delta, mod, lift, rem; - long p, first, dx; - int incr; - - - dx = x2 - x1; - - ex1 = TRUNC( x1 ); - ex2 = TRUNC( x2 ); - fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) ); - fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) ); - - /* trivial case. Happens often */ - if ( y1 == y2 ) - { - gray_set_cell( RAS_VAR_ ex2, ey ); - return; - } - - /* everything is located in a single cell. That is easy! */ - /* */ - if ( ex1 == ex2 ) - { - delta = y2 - y1; - ras.area += (TArea)(( fx1 + fx2 ) * delta); - ras.cover += delta; - return; - } - - /* ok, we'll have to render a run of adjacent cells on the same */ - /* scanline... */ - /* */ - p = ( ONE_PIXEL - fx1 ) * ( y2 - y1 ); - first = ONE_PIXEL; - incr = 1; - - if ( dx < 0 ) - { - p = fx1 * ( y2 - y1 ); - first = 0; - incr = -1; - dx = -dx; - } - - delta = (TCoord)( p / dx ); - mod = (TCoord)( p % dx ); - if ( mod < 0 ) - { - delta--; - mod += (TCoord)dx; - } - - ras.area += (TArea)(( fx1 + first ) * delta); - ras.cover += delta; - - ex1 += incr; - gray_set_cell( RAS_VAR_ ex1, ey ); - y1 += delta; - - if ( ex1 != ex2 ) - { - p = ONE_PIXEL * ( y2 - y1 + delta ); - lift = (TCoord)( p / dx ); - rem = (TCoord)( p % dx ); - if ( rem < 0 ) - { - lift--; - rem += (TCoord)dx; - } - - mod -= (int)dx; - - while ( ex1 != ex2 ) - { - delta = lift; - mod += rem; - if ( mod >= 0 ) - { - mod -= (TCoord)dx; - delta++; - } - - ras.area += (TArea)(ONE_PIXEL * delta); - ras.cover += delta; - y1 += delta; - ex1 += incr; - gray_set_cell( RAS_VAR_ ex1, ey ); - } - } - - delta = y2 - y1; - ras.area += (TArea)(( fx2 + ONE_PIXEL - first ) * delta); - ras.cover += delta; - } - - - /*************************************************************************/ - /* */ - /* Render a given line as a series of scanlines. */ - /* */ - static void - gray_render_line( RAS_ARG_ TPos to_x, - TPos to_y ) - { - TCoord ey1, ey2, fy1, fy2, mod; - TPos dx, dy, x, x2; - long p, first; - int delta, rem, lift, incr; - - - ey1 = TRUNC( ras.last_ey ); - ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */ - fy1 = (TCoord)( ras.y - ras.last_ey ); - fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) ); - - dx = to_x - ras.x; - dy = to_y - ras.y; - - /* XXX: we should do something about the trivial case where dx == 0, */ - /* as it happens very often! */ - - /* perform vertical clipping */ - { - TCoord min, max; - - - min = ey1; - max = ey2; - if ( ey1 > ey2 ) - { - min = ey2; - max = ey1; - } - if ( min >= ras.max_ey || max < ras.min_ey ) - goto End; - } - - /* everything is on a single scanline */ - if ( ey1 == ey2 ) - { - gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 ); - goto End; - } - - /* vertical line - avoid calling gray_render_scanline */ - incr = 1; - - if ( dx == 0 ) - { - TCoord ex = TRUNC( ras.x ); - TCoord two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 ); - TArea area; - - - first = ONE_PIXEL; - if ( dy < 0 ) - { - first = 0; - incr = -1; - } - - delta = (int)( first - fy1 ); - ras.area += (TArea)two_fx * delta; - ras.cover += delta; - ey1 += incr; - - gray_set_cell( RAS_VAR_ ex, ey1 ); - - delta = (int)( first + first - ONE_PIXEL ); - area = (TArea)two_fx * delta; - while ( ey1 != ey2 ) - { - ras.area += area; - ras.cover += delta; - ey1 += incr; - - gray_set_cell( RAS_VAR_ ex, ey1 ); - } - - delta = (int)( fy2 - ONE_PIXEL + first ); - ras.area += (TArea)two_fx * delta; - ras.cover += delta; - - goto End; - } - - /* ok, we have to render several scanlines */ - p = ( ONE_PIXEL - fy1 ) * dx; - first = ONE_PIXEL; - incr = 1; - - if ( dy < 0 ) - { - p = fy1 * dx; - first = 0; - incr = -1; - dy = -dy; - } - - delta = (int)( p / dy ); - mod = (int)( p % dy ); - if ( mod < 0 ) - { - delta--; - mod += (TCoord)dy; - } - - x = ras.x + delta; - gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first ); - - ey1 += incr; - gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); - - if ( ey1 != ey2 ) - { - p = ONE_PIXEL * dx; - lift = (int)( p / dy ); - rem = (int)( p % dy ); - if ( rem < 0 ) - { - lift--; - rem += (int)dy; - } - mod -= (int)dy; - - while ( ey1 != ey2 ) - { - delta = lift; - mod += rem; - if ( mod >= 0 ) - { - mod -= (int)dy; - delta++; - } - - x2 = x + delta; - gray_render_scanline( RAS_VAR_ ey1, x, - (TCoord)( ONE_PIXEL - first ), x2, - (TCoord)first ); - x = x2; - - ey1 += incr; - gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); - } - } - - gray_render_scanline( RAS_VAR_ ey1, x, - (TCoord)( ONE_PIXEL - first ), to_x, - fy2 ); - - End: - ras.x = to_x; - ras.y = to_y; - ras.last_ey = SUBPIXELS( ey2 ); - } - - - static void - gray_split_conic( FT_Vector* base ) - { - TPos a, b; - - - base[4].x = base[2].x; - b = base[1].x; - a = base[3].x = ( base[2].x + b ) / 2; - b = base[1].x = ( base[0].x + b ) / 2; - base[2].x = ( a + b ) / 2; - - base[4].y = base[2].y; - b = base[1].y; - a = base[3].y = ( base[2].y + b ) / 2; - b = base[1].y = ( base[0].y + b ) / 2; - base[2].y = ( a + b ) / 2; - } - - - static void - gray_render_conic( RAS_ARG_ const FT_Vector* control, - const FT_Vector* to ) - { - TPos dx, dy; - int top, level; - int* levels; - FT_Vector* arc; - - - dx = DOWNSCALE( ras.x ) + to->x - ( control->x << 1 ); - if ( dx < 0 ) - dx = -dx; - dy = DOWNSCALE( ras.y ) + to->y - ( control->y << 1 ); - if ( dy < 0 ) - dy = -dy; - if ( dx < dy ) - dx = dy; - - level = 1; - dx = dx / ras.conic_level; - while ( dx > 0 ) - { - dx >>= 2; - level++; - } - - /* a shortcut to speed things up */ - if ( level <= 1 ) - { - /* we compute the mid-point directly in order to avoid */ - /* calling gray_split_conic() */ - TPos to_x, to_y, mid_x, mid_y; - - - to_x = UPSCALE( to->x ); - to_y = UPSCALE( to->y ); - mid_x = ( ras.x + to_x + 2 * UPSCALE( control->x ) ) / 4; - mid_y = ( ras.y + to_y + 2 * UPSCALE( control->y ) ) / 4; - - gray_render_line( RAS_VAR_ mid_x, mid_y ); - gray_render_line( RAS_VAR_ to_x, to_y ); - - return; - } - - arc = ras.bez_stack; - levels = ras.lev_stack; - top = 0; - levels[0] = level; - - arc[0].x = UPSCALE( to->x ); - arc[0].y = UPSCALE( to->y ); - arc[1].x = UPSCALE( control->x ); - arc[1].y = UPSCALE( control->y ); - arc[2].x = ras.x; - arc[2].y = ras.y; - - while ( top >= 0 ) - { - level = levels[top]; - if ( level > 1 ) - { - /* check that the arc crosses the current band */ - TPos min, max, y; - - - min = max = arc[0].y; - - y = arc[1].y; - if ( y < min ) min = y; - if ( y > max ) max = y; - - y = arc[2].y; - if ( y < min ) min = y; - if ( y > max ) max = y; - - if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey ) - goto Draw; - - gray_split_conic( arc ); - arc += 2; - top++; - levels[top] = levels[top - 1] = level - 1; - continue; - } - - Draw: - { - TPos to_x, to_y, mid_x, mid_y; - - - to_x = arc[0].x; - to_y = arc[0].y; - mid_x = ( ras.x + to_x + 2 * arc[1].x ) / 4; - mid_y = ( ras.y + to_y + 2 * arc[1].y ) / 4; - - gray_render_line( RAS_VAR_ mid_x, mid_y ); - gray_render_line( RAS_VAR_ to_x, to_y ); - - top--; - arc -= 2; - } - } - - return; - } - - - static void - gray_split_cubic( FT_Vector* base ) - { - TPos a, b, c, d; - - - base[6].x = base[3].x; - c = base[1].x; - d = base[2].x; - base[1].x = a = ( base[0].x + c ) / 2; - base[5].x = b = ( base[3].x + d ) / 2; - c = ( c + d ) / 2; - base[2].x = a = ( a + c ) / 2; - base[4].x = b = ( b + c ) / 2; - base[3].x = ( a + b ) / 2; - - base[6].y = base[3].y; - c = base[1].y; - d = base[2].y; - base[1].y = a = ( base[0].y + c ) / 2; - base[5].y = b = ( base[3].y + d ) / 2; - c = ( c + d ) / 2; - base[2].y = a = ( a + c ) / 2; - base[4].y = b = ( b + c ) / 2; - base[3].y = ( a + b ) / 2; - } - - - static void - gray_render_cubic( RAS_ARG_ const FT_Vector* control1, - const FT_Vector* control2, - const FT_Vector* to ) - { - int top, level; - int* levels; - FT_Vector* arc; - int mid_x = ( DOWNSCALE( ras.x ) + to->x + - 3 * (control1->x + control2->x ) ) / 8; - int mid_y = ( DOWNSCALE( ras.y ) + to->y + - 3 * (control1->y + control2->y ) ) / 8; - TPos dx = DOWNSCALE( ras.x ) + to->x - ( mid_x << 1 ); - TPos dy = DOWNSCALE( ras.y ) + to->y - ( mid_y << 1 ); - - - if ( dx < 0 ) - dx = -dx; - if ( dy < 0 ) - dy = -dy; - if ( dx < dy ) - dx = dy; - - level = 1; - dx /= ras.cubic_level; - while ( dx > 0 ) - { - dx >>= 2; - level++; - } - - if ( level <= 1 ) - { - TPos to_x, to_y; - - - to_x = UPSCALE( to->x ); - to_y = UPSCALE( to->y ); - - /* Recalculation of midpoint is needed only if */ - /* UPSCALE and DOWNSCALE have any effect. */ - -#if ( PIXEL_BITS != 6 ) - mid_x = ( ras.x + to_x + - 3 * UPSCALE( control1->x + control2->x ) ) / 8; - mid_y = ( ras.y + to_y + - 3 * UPSCALE( control1->y + control2->y ) ) / 8; -#endif - - gray_render_line( RAS_VAR_ mid_x, mid_y ); - gray_render_line( RAS_VAR_ to_x, to_y ); - - return; - } - - arc = ras.bez_stack; - arc[0].x = UPSCALE( to->x ); - arc[0].y = UPSCALE( to->y ); - arc[1].x = UPSCALE( control2->x ); - arc[1].y = UPSCALE( control2->y ); - arc[2].x = UPSCALE( control1->x ); - arc[2].y = UPSCALE( control1->y ); - arc[3].x = ras.x; - arc[3].y = ras.y; - - levels = ras.lev_stack; - top = 0; - levels[0] = level; - - while ( top >= 0 ) - { - level = levels[top]; - if ( level > 1 ) - { - /* check that the arc crosses the current band */ - TPos min, max, y; - - - min = max = arc[0].y; - y = arc[1].y; - if ( y < min ) min = y; - if ( y > max ) max = y; - y = arc[2].y; - if ( y < min ) min = y; - if ( y > max ) max = y; - y = arc[3].y; - if ( y < min ) min = y; - if ( y > max ) max = y; - if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < 0 ) - goto Draw; - gray_split_cubic( arc ); - arc += 3; - top ++; - levels[top] = levels[top - 1] = level - 1; - continue; - } - - Draw: - { - TPos to_x, to_y; - - - to_x = arc[0].x; - to_y = arc[0].y; - mid_x = ( ras.x + to_x + 3 * ( arc[1].x + arc[2].x ) ) / 8; - mid_y = ( ras.y + to_y + 3 * ( arc[1].y + arc[2].y ) ) / 8; - - gray_render_line( RAS_VAR_ mid_x, mid_y ); - gray_render_line( RAS_VAR_ to_x, to_y ); - top --; - arc -= 3; - } - } - - return; - } - - - - static int - gray_move_to( const FT_Vector* to, - PWorker worker ) - { - TPos x, y; - - - /* record current cell, if any */ - gray_record_cell( RAS_VAR ); - - /* start to a new position */ - x = UPSCALE( to->x ); - y = UPSCALE( to->y ); - - gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) ); - - worker->x = x; - worker->y = y; - return 0; - } - - - static int - gray_line_to( const FT_Vector* to, - PWorker worker ) - { - gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) ); - return 0; - } - - - static int - gray_conic_to( const FT_Vector* control, - const FT_Vector* to, - PWorker worker ) - { - gray_render_conic( RAS_VAR_ control, to ); - return 0; - } - - - static int - gray_cubic_to( const FT_Vector* control1, - const FT_Vector* control2, - const FT_Vector* to, - PWorker worker ) - { - gray_render_cubic( RAS_VAR_ control1, control2, to ); - return 0; - } - - - static void - gray_render_span( int y, - int count, - const FT_Span* spans, - PWorker worker ) - { - unsigned char* p; - FT_Bitmap* map = &worker->target; - - - /* first of all, compute the scanline offset */ - p = (unsigned char*)map->buffer - y * map->pitch; - if ( map->pitch >= 0 ) - p += (unsigned)( ( map->rows - 1 ) * map->pitch ); - - for ( ; count > 0; count--, spans++ ) - { - unsigned char coverage = spans->coverage; - - - if ( coverage ) - { - /* For small-spans it is faster to do it by ourselves than - * calling `memset'. This is mainly due to the cost of the - * function call. - */ - if ( spans->len >= 8 ) - FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len ); - else - { - unsigned char* q = p + spans->x; - - - switch ( spans->len ) - { - case 7: *q++ = (unsigned char)coverage; - case 6: *q++ = (unsigned char)coverage; - case 5: *q++ = (unsigned char)coverage; - case 4: *q++ = (unsigned char)coverage; - case 3: *q++ = (unsigned char)coverage; - case 2: *q++ = (unsigned char)coverage; - case 1: *q = (unsigned char)coverage; - default: - ; - } - } - } - } - } - - - static void - gray_hline( RAS_ARG_ TCoord x, - TCoord y, - TPos area, - TCoord acount ) - { - FT_Span* span; - int count; - int coverage; - - - /* compute the coverage line's coverage, depending on the */ - /* outline fill rule */ - /* */ - /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */ - /* */ - coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) ); - /* use range 0..256 */ - if ( coverage < 0 ) - coverage = -coverage; - - if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL ) - { - coverage &= 511; - - if ( coverage > 256 ) - coverage = 512 - coverage; - else if ( coverage == 256 ) - coverage = 255; - } - else - { - /* normal non-zero winding rule */ - if ( coverage >= 256 ) - coverage = 255; - } - - y += (TCoord)ras.min_ey; - x += (TCoord)ras.min_ex; - - /* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */ - if ( x >= 32767 ) - x = 32767; - - /* FT_Span.y is an integer, so limit our coordinates appropriately */ - if ( y >= FT_INT_MAX ) - y = FT_INT_MAX; - - if ( coverage ) - { - /* see whether we can add this span to the current list */ - count = ras.num_gray_spans; - span = ras.gray_spans + count - 1; - if ( count > 0 && - ras.span_y == y && - (int)span->x + span->len == (int)x && - span->coverage == coverage ) - { - span->len = (unsigned short)( span->len + acount ); - return; - } - - if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS ) - { - if ( ras.render_span && count > 0 ) - ras.render_span( ras.span_y, count, ras.gray_spans, - ras.render_span_data ); - -#ifdef FT_DEBUG_LEVEL_TRACE - - if ( count > 0 ) - { - int n; - - - FT_TRACE7(( "y = %3d ", ras.span_y )); - span = ras.gray_spans; - for ( n = 0; n < count; n++, span++ ) - FT_TRACE7(( "[%d..%d]:%02x ", - span->x, span->x + span->len - 1, span->coverage )); - FT_TRACE7(( "\n" )); - } - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - ras.num_gray_spans = 0; - ras.span_y = (int)y; - - count = 0; - span = ras.gray_spans; - } - else - span++; - - /* add a gray span to the current list */ - span->x = (short)x; - span->len = (unsigned short)acount; - span->coverage = (unsigned char)coverage; - - ras.num_gray_spans++; - } - } - - -#ifdef FT_DEBUG_LEVEL_TRACE - - /* to be called while in the debugger -- */ - /* this function causes a compiler warning since it is unused otherwise */ - static void - gray_dump_cells( RAS_ARG ) - { - int yindex; - - - for ( yindex = 0; yindex < ras.ycount; yindex++ ) - { - PCell cell; - - - printf( "%3d:", yindex ); - - for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next ) - printf( " (%3ld, c:%4ld, a:%6d)", cell->x, cell->cover, cell->area ); - printf( "\n" ); - } - } - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - - static void - gray_sweep( RAS_ARG_ const FT_Bitmap* target ) - { - int yindex; - - FT_UNUSED( target ); - - - if ( ras.num_cells == 0 ) - return; - - ras.num_gray_spans = 0; - - FT_TRACE7(( "gray_sweep: start\n" )); - - for ( yindex = 0; yindex < ras.ycount; yindex++ ) - { - PCell cell = ras.ycells[yindex]; - TCoord cover = 0; - TCoord x = 0; - - - for ( ; cell != NULL; cell = cell->next ) - { - TPos area; - - - if ( cell->x > x && cover != 0 ) - gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), - cell->x - x ); - - cover += cell->cover; - area = cover * ( ONE_PIXEL * 2 ) - cell->area; - - if ( area != 0 && cell->x >= 0 ) - gray_hline( RAS_VAR_ cell->x, yindex, area, 1 ); - - x = cell->x + 1; - } - - if ( cover != 0 ) - gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), - ras.count_ex - x ); - } - - if ( ras.render_span && ras.num_gray_spans > 0 ) - ras.render_span( ras.span_y, ras.num_gray_spans, - ras.gray_spans, ras.render_span_data ); - - FT_TRACE7(( "gray_sweep: end\n" )); - } - - -#ifdef _STANDALONE_ - - /*************************************************************************/ - /* */ - /* The following function should only compile in stand-alone mode, */ - /* i.e., when building this component without the rest of FreeType. */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Outline_Decompose */ - /* */ - /* <Description> */ - /* Walk over an outline's structure to decompose it into individual */ - /* segments and Bézier arcs. This function is also able to emit */ - /* `move to' and `close to' operations to indicate the start and end */ - /* of new contours in the outline. */ - /* */ - /* <Input> */ - /* outline :: A pointer to the source target. */ - /* */ - /* func_interface :: A table of `emitters', i.e., function pointers */ - /* called during decomposition to indicate path */ - /* operations. */ - /* */ - /* <InOut> */ - /* user :: A typeless pointer which is passed to each */ - /* emitter during the decomposition. It can be */ - /* used to store the state during the */ - /* decomposition. */ - /* */ - /* <Return> */ - /* Error code. 0 means success. */ - /* */ - static int - FT_Outline_Decompose( const FT_Outline* outline, - const FT_Outline_Funcs* func_interface, - void* user ) - { -#undef SCALED -#define SCALED( x ) ( ( (x) << shift ) - delta ) - - FT_Vector v_last; - FT_Vector v_control; - FT_Vector v_start; - - FT_Vector* point; - FT_Vector* limit; - char* tags; - - int error; - - int n; /* index of contour in outline */ - int first; /* index of first point in contour */ - char tag; /* current point's state */ - - int shift; - TPos delta; - - - if ( !outline || !func_interface ) - return ErrRaster_Invalid_Argument; - - shift = func_interface->shift; - delta = func_interface->delta; - first = 0; - - for ( n = 0; n < outline->n_contours; n++ ) - { - int last; /* index of last point in contour */ - - - FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); - - last = outline->contours[n]; - if ( last < 0 ) - goto Invalid_Outline; - limit = outline->points + last; - - v_start = outline->points[first]; - v_start.x = SCALED( v_start.x ); - v_start.y = SCALED( v_start.y ); - - v_last = outline->points[last]; - v_last.x = SCALED( v_last.x ); - v_last.y = SCALED( v_last.y ); - - v_control = v_start; - - point = outline->points + first; - tags = outline->tags + first; - tag = FT_CURVE_TAG( tags[0] ); - - /* A contour cannot start with a cubic control point! */ - if ( tag == FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - /* check first point to determine origin */ - if ( tag == FT_CURVE_TAG_CONIC ) - { - /* first point is conic control. Yes, this happens. */ - if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) - { - /* start at last point if it is on the curve */ - v_start = v_last; - limit--; - } - else - { - /* if both first and last points are conic, */ - /* start at their middle and record its position */ - /* for closure */ - v_start.x = ( v_start.x + v_last.x ) / 2; - v_start.y = ( v_start.y + v_last.y ) / 2; - - v_last = v_start; - } - point--; - tags--; - } - - FT_TRACE5(( " move to (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0 )); - error = func_interface->move_to( &v_start, user ); - if ( error ) - goto Exit; - - while ( point < limit ) - { - point++; - tags++; - - tag = FT_CURVE_TAG( tags[0] ); - switch ( tag ) - { - case FT_CURVE_TAG_ON: /* emit a single line_to */ - { - FT_Vector vec; - - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - FT_TRACE5(( " line to (%.2f, %.2f)\n", - vec.x / 64.0, vec.y / 64.0 )); - error = func_interface->line_to( &vec, user ); - if ( error ) - goto Exit; - continue; - } - - case FT_CURVE_TAG_CONIC: /* consume conic arcs */ - v_control.x = SCALED( point->x ); - v_control.y = SCALED( point->y ); - - Do_Conic: - if ( point < limit ) - { - FT_Vector vec; - FT_Vector v_middle; - - - point++; - tags++; - tag = FT_CURVE_TAG( tags[0] ); - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - if ( tag == FT_CURVE_TAG_ON ) - { - FT_TRACE5(( " conic to (%.2f, %.2f)" - " with control (%.2f, %.2f)\n", - vec.x / 64.0, vec.y / 64.0, - v_control.x / 64.0, v_control.y / 64.0 )); - error = func_interface->conic_to( &v_control, &vec, user ); - if ( error ) - goto Exit; - continue; - } - - if ( tag != FT_CURVE_TAG_CONIC ) - goto Invalid_Outline; - - v_middle.x = ( v_control.x + vec.x ) / 2; - v_middle.y = ( v_control.y + vec.y ) / 2; - - FT_TRACE5(( " conic to (%.2f, %.2f)" - " with control (%.2f, %.2f)\n", - v_middle.x / 64.0, v_middle.y / 64.0, - v_control.x / 64.0, v_control.y / 64.0 )); - error = func_interface->conic_to( &v_control, &v_middle, user ); - if ( error ) - goto Exit; - - v_control = vec; - goto Do_Conic; - } - - FT_TRACE5(( " conic to (%.2f, %.2f)" - " with control (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0, - v_control.x / 64.0, v_control.y / 64.0 )); - error = func_interface->conic_to( &v_control, &v_start, user ); - goto Close; - - default: /* FT_CURVE_TAG_CUBIC */ - { - FT_Vector vec1, vec2; - - - if ( point + 1 > limit || - FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - point += 2; - tags += 2; - - vec1.x = SCALED( point[-2].x ); - vec1.y = SCALED( point[-2].y ); - - vec2.x = SCALED( point[-1].x ); - vec2.y = SCALED( point[-1].y ); - - if ( point <= limit ) - { - FT_Vector vec; - - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - FT_TRACE5(( " cubic to (%.2f, %.2f)" - " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", - vec.x / 64.0, vec.y / 64.0, - vec1.x / 64.0, vec1.y / 64.0, - vec2.x / 64.0, vec2.y / 64.0 )); - error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); - if ( error ) - goto Exit; - continue; - } - - FT_TRACE5(( " cubic to (%.2f, %.2f)" - " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0, - vec1.x / 64.0, vec1.y / 64.0, - vec2.x / 64.0, vec2.y / 64.0 )); - error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); - goto Close; - } - } - } - - /* close the contour with a line segment */ - FT_TRACE5(( " line to (%.2f, %.2f)\n", - v_start.x / 64.0, v_start.y / 64.0 )); - error = func_interface->line_to( &v_start, user ); - - Close: - if ( error ) - goto Exit; - - first = last + 1; - } - - FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); - return 0; - - Exit: - FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); - return error; - - Invalid_Outline: - return ErrRaster_Invalid_Outline; - } - -#endif /* _STANDALONE_ */ - - - typedef struct TBand_ - { - TPos min, max; - - } TBand; - - FT_DEFINE_OUTLINE_FUNCS(func_interface, - (FT_Outline_MoveTo_Func) gray_move_to, - (FT_Outline_LineTo_Func) gray_line_to, - (FT_Outline_ConicTo_Func)gray_conic_to, - (FT_Outline_CubicTo_Func)gray_cubic_to, - 0, - 0 - ) - - static int - gray_convert_glyph_inner( RAS_ARG ) - { - - volatile int error = 0; - -#ifdef FT_CONFIG_OPTION_PIC - FT_Outline_Funcs func_interface; - Init_Class_func_interface(&func_interface); -#endif - - if ( ft_setjmp( ras.jump_buffer ) == 0 ) - { - error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras ); - gray_record_cell( RAS_VAR ); - } - else - error = ErrRaster_Memory_Overflow; - - return error; - } - - - static int - gray_convert_glyph( RAS_ARG ) - { - TBand bands[40]; - TBand* volatile band; - int volatile n, num_bands; - TPos volatile min, max, max_y; - FT_BBox* clip; - - - /* Set up state in the raster object */ - gray_compute_cbox( RAS_VAR ); - - /* clip to target bitmap, exit if nothing to do */ - clip = &ras.clip_box; - - if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax || - ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax ) - return 0; - - if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin; - if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin; - - if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax; - if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax; - - ras.count_ex = ras.max_ex - ras.min_ex; - ras.count_ey = ras.max_ey - ras.min_ey; - - /* simple heuristic used to speed up the bezier decomposition -- see */ - /* the code in gray_render_conic() and gray_render_cubic() for more */ - /* details */ - ras.conic_level = 32; - ras.cubic_level = 16; - - { - int level = 0; - - - if ( ras.count_ex > 24 || ras.count_ey > 24 ) - level++; - if ( ras.count_ex > 120 || ras.count_ey > 120 ) - level++; - - ras.conic_level <<= level; - ras.cubic_level <<= level; - } - - /* set up vertical bands */ - num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size ); - if ( num_bands == 0 ) - num_bands = 1; - if ( num_bands >= 39 ) - num_bands = 39; - - ras.band_shoot = 0; - - min = ras.min_ey; - max_y = ras.max_ey; - - for ( n = 0; n < num_bands; n++, min = max ) - { - max = min + ras.band_size; - if ( n == num_bands - 1 || max > max_y ) - max = max_y; - - bands[0].min = min; - bands[0].max = max; - band = bands; - - while ( band >= bands ) - { - TPos bottom, top, middle; - int error; - - { - PCell cells_max; - int yindex; - long cell_start, cell_end, cell_mod; - - - ras.ycells = (PCell*)ras.buffer; - ras.ycount = band->max - band->min; - - cell_start = sizeof ( PCell ) * ras.ycount; - cell_mod = cell_start % sizeof ( TCell ); - if ( cell_mod > 0 ) - cell_start += sizeof ( TCell ) - cell_mod; - - cell_end = ras.buffer_size; - cell_end -= cell_end % sizeof( TCell ); - - cells_max = (PCell)( (char*)ras.buffer + cell_end ); - ras.cells = (PCell)( (char*)ras.buffer + cell_start ); - if ( ras.cells >= cells_max ) - goto ReduceBands; - - ras.max_cells = cells_max - ras.cells; - if ( ras.max_cells < 2 ) - goto ReduceBands; - - for ( yindex = 0; yindex < ras.ycount; yindex++ ) - ras.ycells[yindex] = NULL; - } - - ras.num_cells = 0; - ras.invalid = 1; - ras.min_ey = band->min; - ras.max_ey = band->max; - ras.count_ey = band->max - band->min; - - error = gray_convert_glyph_inner( RAS_VAR ); - - if ( !error ) - { - gray_sweep( RAS_VAR_ &ras.target ); - band--; - continue; - } - else if ( error != ErrRaster_Memory_Overflow ) - return 1; - - ReduceBands: - /* render pool overflow; we will reduce the render band by half */ - bottom = band->min; - top = band->max; - middle = bottom + ( ( top - bottom ) >> 1 ); - - /* This is too complex for a single scanline; there must */ - /* be some problems. */ - if ( middle == bottom ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" )); -#endif - return 1; - } - - if ( bottom-top >= ras.band_size ) - ras.band_shoot++; - - band[1].min = bottom; - band[1].max = middle; - band[0].min = middle; - band[0].max = top; - band++; - } - } - - if ( ras.band_shoot > 8 && ras.band_size > 16 ) - ras.band_size = ras.band_size / 2; - - return 0; - } - - - static int - gray_raster_render( PRaster raster, - const FT_Raster_Params* params ) - { - const FT_Outline* outline = (const FT_Outline*)params->source; - const FT_Bitmap* target_map = params->target; - PWorker worker; - - - if ( !raster || !raster->buffer || !raster->buffer_size ) - return ErrRaster_Invalid_Argument; - - if ( !outline ) - return ErrRaster_Invalid_Outline; - - /* return immediately if the outline is empty */ - if ( outline->n_points == 0 || outline->n_contours <= 0 ) - return 0; - - if ( !outline->contours || !outline->points ) - return ErrRaster_Invalid_Outline; - - if ( outline->n_points != - outline->contours[outline->n_contours - 1] + 1 ) - return ErrRaster_Invalid_Outline; - - worker = raster->worker; - - /* if direct mode is not set, we must have a target bitmap */ - if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) ) - { - if ( !target_map ) - return ErrRaster_Invalid_Argument; - - /* nothing to do */ - if ( !target_map->width || !target_map->rows ) - return 0; - - if ( !target_map->buffer ) - return ErrRaster_Invalid_Argument; - } - - /* this version does not support monochrome rendering */ - if ( !( params->flags & FT_RASTER_FLAG_AA ) ) - return ErrRaster_Invalid_Mode; - - /* compute clipping box */ - if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) ) - { - /* compute clip box from target pixmap */ - ras.clip_box.xMin = 0; - ras.clip_box.yMin = 0; - ras.clip_box.xMax = target_map->width; - ras.clip_box.yMax = target_map->rows; - } - else if ( params->flags & FT_RASTER_FLAG_CLIP ) - ras.clip_box = params->clip_box; - else - { - ras.clip_box.xMin = -32768L; - ras.clip_box.yMin = -32768L; - ras.clip_box.xMax = 32767L; - ras.clip_box.yMax = 32767L; - } - - gray_init_cells( RAS_VAR_ raster->buffer, raster->buffer_size ); - - ras.outline = *outline; - ras.num_cells = 0; - ras.invalid = 1; - ras.band_size = raster->band_size; - ras.num_gray_spans = 0; - - if ( params->flags & FT_RASTER_FLAG_DIRECT ) - { - ras.render_span = (FT_Raster_Span_Func)params->gray_spans; - ras.render_span_data = params->user; - } - else - { - ras.target = *target_map; - ras.render_span = (FT_Raster_Span_Func)gray_render_span; - ras.render_span_data = &ras; - } - - return gray_convert_glyph( RAS_VAR ); - } - - - /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/ - /**** a static object. *****/ - -#ifdef _STANDALONE_ - - static int - gray_raster_new( void* memory, - FT_Raster* araster ) - { - static TRaster the_raster; - - FT_UNUSED( memory ); - - - *araster = (FT_Raster)&the_raster; - FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); - - return 0; - } - - - static void - gray_raster_done( FT_Raster raster ) - { - /* nothing */ - FT_UNUSED( raster ); - } - -#else /* !_STANDALONE_ */ - - static int - gray_raster_new( FT_Memory memory, - FT_Raster* araster ) - { - FT_Error error; - PRaster raster = NULL; - - - *araster = 0; - if ( !FT_ALLOC( raster, sizeof ( TRaster ) ) ) - { - raster->memory = memory; - *araster = (FT_Raster)raster; - } - - return error; - } - - - static void - gray_raster_done( FT_Raster raster ) - { - FT_Memory memory = (FT_Memory)((PRaster)raster)->memory; - - - FT_FREE( raster ); - } - -#endif /* !_STANDALONE_ */ - - - static void - gray_raster_reset( FT_Raster raster, - char* pool_base, - long pool_size ) - { - PRaster rast = (PRaster)raster; - - - if ( raster ) - { - if ( pool_base && pool_size >= (long)sizeof ( TWorker ) + 2048 ) - { - PWorker worker = (PWorker)pool_base; - - - rast->worker = worker; - rast->buffer = pool_base + - ( ( sizeof ( TWorker ) + sizeof ( TCell ) - 1 ) & - ~( sizeof ( TCell ) - 1 ) ); - rast->buffer_size = (long)( ( pool_base + pool_size ) - - (char*)rast->buffer ) & - ~( sizeof ( TCell ) - 1 ); - rast->band_size = (int)( rast->buffer_size / - ( sizeof ( TCell ) * 8 ) ); - } - else - { - rast->buffer = NULL; - rast->buffer_size = 0; - rast->worker = NULL; - } - } - } - - - FT_DEFINE_RASTER_FUNCS(ft_grays_raster, - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Raster_New_Func) gray_raster_new, - (FT_Raster_Reset_Func) gray_raster_reset, - (FT_Raster_Set_Mode_Func)0, - (FT_Raster_Render_Func) gray_raster_render, - (FT_Raster_Done_Func) gray_raster_done - ) - - -/* END */ - - -/* Local Variables: */ -/* coding: utf-8 */ -/* End: */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftgrays.h b/android/jni/ndk_modules/freetype/src/smooth/ftgrays.h deleted file mode 100644 index f20f55f1..00000000 --- a/android/jni/ndk_modules/freetype/src/smooth/ftgrays.h +++ /dev/null @@ -1,58 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftgrays.h */ -/* */ -/* FreeType smooth renderer declaration */ -/* */ -/* Copyright 1996-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTGRAYS_H__ -#define __FTGRAYS_H__ - -#ifdef __cplusplus - extern "C" { -#endif - - -#ifdef _STANDALONE_ -#include "ftimage.h" -#else -#include <ft2build.h> -#include FT_CONFIG_CONFIG_H /* for FT_CONFIG_OPTION_PIC */ -#include FT_IMAGE_H -#endif - - - /*************************************************************************/ - /* */ - /* To make ftgrays.h independent from configuration files we check */ - /* whether FT_EXPORT_VAR has been defined already. */ - /* */ - /* On some systems and compilers (Win32 mostly), an extra keyword is */ - /* necessary to compile the library as a DLL. */ - /* */ -#ifndef FT_EXPORT_VAR -#define FT_EXPORT_VAR( x ) extern x -#endif - - FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_grays_raster; - - -#ifdef __cplusplus - } -#endif - -#endif /* __FTGRAYS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftsmerrs.h b/android/jni/ndk_modules/freetype/src/smooth/ftsmerrs.h deleted file mode 100644 index 0c2a2ecd..00000000 --- a/android/jni/ndk_modules/freetype/src/smooth/ftsmerrs.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsmerrs.h */ -/* */ -/* smooth renderer error codes (specification only). */ -/* */ -/* Copyright 2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the smooth renderer error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __FTSMERRS_H__ -#define __FTSMERRS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#define FT_ERR_PREFIX Smooth_Err_ -#define FT_ERR_BASE FT_Mod_Err_Smooth - -#include FT_ERRORS_H - -#endif /* __FTSMERRS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftsmooth.c b/android/jni/ndk_modules/freetype/src/smooth/ftsmooth.c deleted file mode 100644 index 7d16b94a..00000000 --- a/android/jni/ndk_modules/freetype/src/smooth/ftsmooth.c +++ /dev/null @@ -1,481 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsmooth.c */ -/* */ -/* Anti-aliasing renderer interface (body). */ -/* */ -/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_OUTLINE_H -#include "ftsmooth.h" -#include "ftgrays.h" -#include "ftspic.h" - -#include "ftsmerrs.h" - - - /* initialize renderer -- init its raster */ - static FT_Error - ft_smooth_init( FT_Renderer render ) - { - FT_Library library = FT_MODULE_LIBRARY( render ); - - - render->clazz->raster_class->raster_reset( render->raster, - library->raster_pool, - library->raster_pool_size ); - - return 0; - } - - - /* sets render-specific mode */ - static FT_Error - ft_smooth_set_mode( FT_Renderer render, - FT_ULong mode_tag, - FT_Pointer data ) - { - /* we simply pass it to the raster */ - return render->clazz->raster_class->raster_set_mode( render->raster, - mode_tag, - data ); - } - - /* transform a given glyph image */ - static FT_Error - ft_smooth_transform( FT_Renderer render, - FT_GlyphSlot slot, - const FT_Matrix* matrix, - const FT_Vector* delta ) - { - FT_Error error = Smooth_Err_Ok; - - - if ( slot->format != render->glyph_format ) - { - error = Smooth_Err_Invalid_Argument; - goto Exit; - } - - if ( matrix ) - FT_Outline_Transform( &slot->outline, matrix ); - - if ( delta ) - FT_Outline_Translate( &slot->outline, delta->x, delta->y ); - - Exit: - return error; - } - - - /* return the glyph's control box */ - static void - ft_smooth_get_cbox( FT_Renderer render, - FT_GlyphSlot slot, - FT_BBox* cbox ) - { - FT_MEM_ZERO( cbox, sizeof ( *cbox ) ); - - if ( slot->format == render->glyph_format ) - FT_Outline_Get_CBox( &slot->outline, cbox ); - } - - - /* convert a slot's glyph image into a bitmap */ - static FT_Error - ft_smooth_render_generic( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin, - FT_Render_Mode required_mode ) - { - FT_Error error; - FT_Outline* outline = NULL; - FT_BBox cbox; - FT_UInt width, height, height_org, width_org, pitch; - FT_Bitmap* bitmap; - FT_Memory memory; - FT_Int hmul = mode == FT_RENDER_MODE_LCD; - FT_Int vmul = mode == FT_RENDER_MODE_LCD_V; - FT_Pos x_shift, y_shift, x_left, y_top; - - FT_Raster_Params params; - - - /* check glyph image format */ - if ( slot->format != render->glyph_format ) - { - error = Smooth_Err_Invalid_Argument; - goto Exit; - } - - /* check mode */ - if ( mode != required_mode ) - return Smooth_Err_Cannot_Render_Glyph; - - outline = &slot->outline; - - /* translate the outline to the new origin if needed */ - if ( origin ) - FT_Outline_Translate( outline, origin->x, origin->y ); - - /* compute the control box, and grid fit it */ - FT_Outline_Get_CBox( outline, &cbox ); - - cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); - cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); - cbox.xMax = FT_PIX_CEIL( cbox.xMax ); - cbox.yMax = FT_PIX_CEIL( cbox.yMax ); - - width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); - height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); - bitmap = &slot->bitmap; - memory = render->root.memory; - - width_org = width; - height_org = height; - - /* release old bitmap buffer */ - if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) - { - FT_FREE( bitmap->buffer ); - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; - } - - /* allocate new one */ - pitch = width; - if ( hmul ) - { - width = width * 3; - pitch = FT_PAD_CEIL( width, 4 ); - } - - if ( vmul ) - height *= 3; - - x_shift = (FT_Int) cbox.xMin; - y_shift = (FT_Int) cbox.yMin; - x_left = (FT_Int)( cbox.xMin >> 6 ); - y_top = (FT_Int)( cbox.yMax >> 6 ); - -#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - - if ( slot->library->lcd_filter_func ) - { - FT_Int extra = slot->library->lcd_extra; - - - if ( hmul ) - { - x_shift -= 64 * ( extra >> 1 ); - width += 3 * extra; - pitch = FT_PAD_CEIL( width, 4 ); - x_left -= extra >> 1; - } - - if ( vmul ) - { - y_shift -= 64 * ( extra >> 1 ); - height += 3 * extra; - y_top += extra >> 1; - } - } - -#endif - -#if FT_UINT_MAX > 0xFFFFU - - /* Required check is ( pitch * height < FT_ULONG_MAX ), */ - /* but we care realistic cases only. Always pitch <= width. */ - if ( width > 0x7FFFU || height > 0x7FFFU ) - { - FT_ERROR(( "ft_smooth_render_generic: glyph too large: %d x %d\n", - width, height )); - return Smooth_Err_Raster_Overflow; - } - -#endif - - bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; - bitmap->num_grays = 256; - bitmap->width = width; - bitmap->rows = height; - bitmap->pitch = pitch; - - /* translate outline to render it into the bitmap */ - FT_Outline_Translate( outline, -x_shift, -y_shift ); - - if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) ) - goto Exit; - - slot->internal->flags |= FT_GLYPH_OWN_BITMAP; - - /* set up parameters */ - params.target = bitmap; - params.source = outline; - params.flags = FT_RASTER_FLAG_AA; - -#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - - /* implode outline if needed */ - { - FT_Vector* points = outline->points; - FT_Vector* points_end = points + outline->n_points; - FT_Vector* vec; - - - if ( hmul ) - for ( vec = points; vec < points_end; vec++ ) - vec->x *= 3; - - if ( vmul ) - for ( vec = points; vec < points_end; vec++ ) - vec->y *= 3; - } - - /* render outline into the bitmap */ - error = render->raster_render( render->raster, ¶ms ); - - /* deflate outline if needed */ - { - FT_Vector* points = outline->points; - FT_Vector* points_end = points + outline->n_points; - FT_Vector* vec; - - - if ( hmul ) - for ( vec = points; vec < points_end; vec++ ) - vec->x /= 3; - - if ( vmul ) - for ( vec = points; vec < points_end; vec++ ) - vec->y /= 3; - } - - if ( slot->library->lcd_filter_func ) - slot->library->lcd_filter_func( bitmap, mode, slot->library ); - -#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - - /* render outline into bitmap */ - error = render->raster_render( render->raster, ¶ms ); - - /* expand it horizontally */ - if ( hmul ) - { - FT_Byte* line = bitmap->buffer; - FT_UInt hh; - - - for ( hh = height_org; hh > 0; hh--, line += pitch ) - { - FT_UInt xx; - FT_Byte* end = line + width; - - - for ( xx = width_org; xx > 0; xx-- ) - { - FT_UInt pixel = line[xx-1]; - - - end[-3] = (FT_Byte)pixel; - end[-2] = (FT_Byte)pixel; - end[-1] = (FT_Byte)pixel; - end -= 3; - } - } - } - - /* expand it vertically */ - if ( vmul ) - { - FT_Byte* read = bitmap->buffer + ( height - height_org ) * pitch; - FT_Byte* write = bitmap->buffer; - FT_UInt hh; - - - for ( hh = height_org; hh > 0; hh-- ) - { - ft_memcpy( write, read, pitch ); - write += pitch; - - ft_memcpy( write, read, pitch ); - write += pitch; - - ft_memcpy( write, read, pitch ); - write += pitch; - read += pitch; - } - } - -#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ - - FT_Outline_Translate( outline, x_shift, y_shift ); - - /* - * XXX: on 16bit system, we return an error for huge bitmap - * to prevent an overflow. - */ - if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX ) - return Smooth_Err_Invalid_Pixel_Size; - - if ( error ) - goto Exit; - - slot->format = FT_GLYPH_FORMAT_BITMAP; - slot->bitmap_left = (FT_Int)x_left; - slot->bitmap_top = (FT_Int)y_top; - - Exit: - if ( outline && origin ) - FT_Outline_Translate( outline, -origin->x, -origin->y ); - - return error; - } - - - /* convert a slot's glyph image into a bitmap */ - static FT_Error - ft_smooth_render( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin ) - { - if ( mode == FT_RENDER_MODE_LIGHT ) - mode = FT_RENDER_MODE_NORMAL; - - return ft_smooth_render_generic( render, slot, mode, origin, - FT_RENDER_MODE_NORMAL ); - } - - - /* convert a slot's glyph image into a horizontal LCD bitmap */ - static FT_Error - ft_smooth_render_lcd( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin ) - { - FT_Error error; - - error = ft_smooth_render_generic( render, slot, mode, origin, - FT_RENDER_MODE_LCD ); - if ( !error ) - slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD; - - return error; - } - - - /* convert a slot's glyph image into a vertical LCD bitmap */ - static FT_Error - ft_smooth_render_lcd_v( FT_Renderer render, - FT_GlyphSlot slot, - FT_Render_Mode mode, - const FT_Vector* origin ) - { - FT_Error error; - - error = ft_smooth_render_generic( render, slot, mode, origin, - FT_RENDER_MODE_LCD_V ); - if ( !error ) - slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V; - - return error; - } - - - FT_DEFINE_RENDERER(ft_smooth_renderer_class, - - FT_MODULE_RENDERER, - sizeof( FT_RendererRec ), - - "smooth", - 0x10000L, - 0x20000L, - - 0, /* module specific interface */ - - (FT_Module_Constructor)ft_smooth_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Renderer_RenderFunc) ft_smooth_render, - (FT_Renderer_TransformFunc)ft_smooth_transform, - (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, - (FT_Renderer_SetModeFunc) ft_smooth_set_mode, - - (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET - ) - - - FT_DEFINE_RENDERER(ft_smooth_lcd_renderer_class, - - FT_MODULE_RENDERER, - sizeof( FT_RendererRec ), - - "smooth-lcd", - 0x10000L, - 0x20000L, - - 0, /* module specific interface */ - - (FT_Module_Constructor)ft_smooth_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Renderer_RenderFunc) ft_smooth_render_lcd, - (FT_Renderer_TransformFunc)ft_smooth_transform, - (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, - (FT_Renderer_SetModeFunc) ft_smooth_set_mode, - - (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET - ) - - FT_DEFINE_RENDERER(ft_smooth_lcdv_renderer_class, - - FT_MODULE_RENDERER, - sizeof( FT_RendererRec ), - - "smooth-lcdv", - 0x10000L, - 0x20000L, - - 0, /* module specific interface */ - - (FT_Module_Constructor)ft_smooth_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , - - FT_GLYPH_FORMAT_OUTLINE, - - (FT_Renderer_RenderFunc) ft_smooth_render_lcd_v, - (FT_Renderer_TransformFunc)ft_smooth_transform, - (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, - (FT_Renderer_SetModeFunc) ft_smooth_set_mode, - - (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET - ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftsmooth.h b/android/jni/ndk_modules/freetype/src/smooth/ftsmooth.h deleted file mode 100644 index 3708790d..00000000 --- a/android/jni/ndk_modules/freetype/src/smooth/ftsmooth.h +++ /dev/null @@ -1,49 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftsmooth.h */ -/* */ -/* Anti-aliasing renderer interface (specification). */ -/* */ -/* Copyright 1996-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTSMOOTH_H__ -#define __FTSMOOTH_H__ - - -#include <ft2build.h> -#include FT_RENDER_H - - -FT_BEGIN_HEADER - - -#ifndef FT_CONFIG_OPTION_NO_STD_RASTER - FT_DECLARE_RENDERER( ft_std_renderer_class ) -#endif - -#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER - FT_DECLARE_RENDERER( ft_smooth_renderer_class ) - - FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class ) - - FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class ) -#endif - - - -FT_END_HEADER - -#endif /* __FTSMOOTH_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftspic.c b/android/jni/ndk_modules/freetype/src/smooth/ftspic.c deleted file mode 100644 index 7adaab17..00000000 --- a/android/jni/ndk_modules/freetype/src/smooth/ftspic.c +++ /dev/null @@ -1,98 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftspic.c */ -/* */ -/* The FreeType position independent code services for smooth module. */ -/* */ -/* Copyright 2009, 2010 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "ftspic.h" - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from ftgrays.c */ - void FT_Init_Class_ft_grays_raster(FT_Raster_Funcs*); - - void - ft_smooth_renderer_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - if ( pic_container->smooth ) - { - SmoothPIC* container = (SmoothPIC*)pic_container->smooth; - if(--container->ref_count) - return; - FT_FREE( container ); - pic_container->smooth = NULL; - } - } - - - FT_Error - ft_smooth_renderer_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = Smooth_Err_Ok; - SmoothPIC* container; - FT_Memory memory = library->memory; - - - /* since this function also serve smooth_lcd and smooth_lcdv renderers, - it implements reference counting */ - if(pic_container->smooth) - { - ((SmoothPIC*)pic_container->smooth)->ref_count++; - return error; - } - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof(*container) ); - pic_container->smooth = container; - container->ref_count = 1; - - /* initialize pointer table - this is how the module usually expects this data */ - FT_Init_Class_ft_grays_raster(&container->ft_grays_raster); -/*Exit:*/ - if(error) - ft_smooth_renderer_class_pic_free(library); - return error; - } - - /* re-route these init and free functions to the above functions */ - FT_Error ft_smooth_lcd_renderer_class_pic_init(FT_Library library) - { - return ft_smooth_renderer_class_pic_init(library); - } - void ft_smooth_lcd_renderer_class_pic_free(FT_Library library) - { - ft_smooth_renderer_class_pic_free(library); - } - FT_Error ft_smooth_lcdv_renderer_class_pic_init(FT_Library library) - { - return ft_smooth_renderer_class_pic_init(library); - } - void ft_smooth_lcdv_renderer_class_pic_free(FT_Library library) - { - ft_smooth_renderer_class_pic_free(library); - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/ftspic.h b/android/jni/ndk_modules/freetype/src/smooth/ftspic.h deleted file mode 100644 index c7e0ce9d..00000000 --- a/android/jni/ndk_modules/freetype/src/smooth/ftspic.h +++ /dev/null @@ -1,50 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftspic.h */ -/* */ -/* The FreeType position independent code services for smooth module. */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTSPIC_H__ -#define __FTSPIC_H__ - - -FT_BEGIN_HEADER - -#include FT_INTERNAL_PIC_H - -#ifndef FT_CONFIG_OPTION_PIC -#define FT_GRAYS_RASTER_GET ft_grays_raster - -#else /* FT_CONFIG_OPTION_PIC */ - - typedef struct SmoothPIC_ - { - int ref_count; - FT_Raster_Funcs ft_grays_raster; - } SmoothPIC; - -#define GET_PIC(lib) ((SmoothPIC*)((lib)->pic_container.smooth)) -#define FT_GRAYS_RASTER_GET (GET_PIC(library)->ft_grays_raster) - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* __FTSPIC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/smooth/smooth.c b/android/jni/ndk_modules/freetype/src/smooth/smooth.c deleted file mode 100644 index a8ac51f9..00000000 --- a/android/jni/ndk_modules/freetype/src/smooth/smooth.c +++ /dev/null @@ -1,27 +0,0 @@ -/***************************************************************************/ -/* */ -/* smooth.c */ -/* */ -/* FreeType anti-aliasing rasterer module component (body only). */ -/* */ -/* Copyright 1996-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "ftspic.c" -#include "ftgrays.c" -#include "ftsmooth.c" - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/truetype.c b/android/jni/ndk_modules/freetype/src/truetype/truetype.c deleted file mode 100644 index 4bd12097..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/truetype.c +++ /dev/null @@ -1,37 +0,0 @@ -/***************************************************************************/ -/* */ -/* truetype.c */ -/* */ -/* FreeType TrueType driver component (body only). */ -/* */ -/* Copyright 1996-2001, 2004, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT - -#include <ft2build.h> -#include "ttpic.c" -#include "ttdriver.c" /* driver interface */ -#include "ttpload.c" /* tables loader */ -#include "ttgload.c" /* glyph loader */ -#include "ttobjs.c" /* object manager */ - -#ifdef TT_USE_BYTECODE_INTERPRETER -#include "ttinterp.c" -#endif - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include "ttgxvar.c" /* gx distortable font */ -#endif - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttdriver.c b/android/jni/ndk_modules/freetype/src/truetype/ttdriver.c deleted file mode 100644 index d723b57a..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttdriver.c +++ /dev/null @@ -1,487 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttdriver.c */ -/* */ -/* TrueType font driver implementation (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_SERVICE_XFREE86_NAME_H - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include FT_MULTIPLE_MASTERS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H -#endif - -#include FT_SERVICE_TRUETYPE_ENGINE_H -#include FT_SERVICE_TRUETYPE_GLYF_H - -#include "ttdriver.h" -#include "ttgload.h" -#include "ttpload.h" - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include "ttgxvar.h" -#endif - -#include "tterrors.h" - -#include "ttpic.h" - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttdriver - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** F A C E S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#undef PAIR_TAG -#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \ - (FT_ULong)right ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_get_kerning */ - /* */ - /* <Description> */ - /* A driver method used to return the kerning vector between two */ - /* glyphs of the same face. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* left_glyph :: The index of the left glyph in the kern pair. */ - /* */ - /* right_glyph :: The index of the right glyph in the kern pair. */ - /* */ - /* <Output> */ - /* kerning :: The kerning vector. This is in font units for */ - /* scalable formats, and in pixels for fixed-sizes */ - /* formats. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* Only horizontal layouts (left-to-right & right-to-left) are */ - /* supported by this function. Other layouts, or more sophisticated */ - /* kernings, are out of scope of this method (the basic driver */ - /* interface is meant to be simple). */ - /* */ - /* They can be implemented by format-specific interfaces. */ - /* */ - static FT_Error - tt_get_kerning( FT_Face ttface, /* TT_Face */ - FT_UInt left_glyph, - FT_UInt right_glyph, - FT_Vector* kerning ) - { - TT_Face face = (TT_Face)ttface; - SFNT_Service sfnt = (SFNT_Service)face->sfnt; - - - kerning->x = 0; - kerning->y = 0; - - if ( sfnt ) - kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); - - return 0; - } - - -#undef PAIR_TAG - - - static FT_Error - tt_get_advances( FT_Face ttface, - FT_UInt start, - FT_UInt count, - FT_Int32 flags, - FT_Fixed *advances ) - { - FT_UInt nn; - TT_Face face = (TT_Face) ttface; - FT_Bool check = FT_BOOL( - !( flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) ); - - - /* XXX: TODO: check for sbits */ - - if ( flags & FT_LOAD_VERTICAL_LAYOUT ) - { - for ( nn = 0; nn < count; nn++ ) - { - FT_Short tsb; - FT_UShort ah; - - - TT_Get_VMetrics( face, start + nn, check, &tsb, &ah ); - advances[nn] = ah; - } - } - else - { - for ( nn = 0; nn < count; nn++ ) - { - FT_Short lsb; - FT_UShort aw; - - - TT_Get_HMetrics( face, start + nn, check, &lsb, &aw ); - advances[nn] = aw; - } - } - - return TT_Err_Ok; - } - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** S I Z E S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - static FT_Error - tt_size_select( FT_Size size, - FT_ULong strike_index ) - { - TT_Face ttface = (TT_Face)size->face; - TT_Size ttsize = (TT_Size)size; - FT_Error error = TT_Err_Ok; - - - ttsize->strike_index = strike_index; - - if ( FT_IS_SCALABLE( size->face ) ) - { - /* use the scaled metrics, even when tt_size_reset fails */ - FT_Select_Metrics( size->face, strike_index ); - - tt_size_reset( ttsize ); - } - else - { - SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; - FT_Size_Metrics* metrics = &size->metrics; - - - error = sfnt->load_strike_metrics( ttface, strike_index, metrics ); - if ( error ) - ttsize->strike_index = 0xFFFFFFFFUL; - } - - return error; - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - - static FT_Error - tt_size_request( FT_Size size, - FT_Size_Request req ) - { - TT_Size ttsize = (TT_Size)size; - FT_Error error = TT_Err_Ok; - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - if ( FT_HAS_FIXED_SIZES( size->face ) ) - { - TT_Face ttface = (TT_Face)size->face; - SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; - FT_ULong strike_index; - - - error = sfnt->set_sbit_strike( ttface, req, &strike_index ); - - if ( error ) - ttsize->strike_index = 0xFFFFFFFFUL; - else - return tt_size_select( size, strike_index ); - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - FT_Request_Metrics( size->face, req ); - - if ( FT_IS_SCALABLE( size->face ) ) - error = tt_size_reset( ttsize ); - - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Load_Glyph */ - /* */ - /* <Description> */ - /* A driver method used to load a glyph within a given glyph slot. */ - /* */ - /* <Input> */ - /* slot :: A handle to the target slot object where the glyph */ - /* will be loaded. */ - /* */ - /* size :: A handle to the source face size at which the glyph */ - /* must be scaled, loaded, etc. */ - /* */ - /* glyph_index :: The index of the glyph in the font file. */ - /* */ - /* load_flags :: A flag indicating what to load for this glyph. The */ - /* FT_LOAD_XXX constants can be used to control the */ - /* glyph loading process (e.g., whether the outline */ - /* should be scaled, whether to load bitmaps or not, */ - /* whether to hint the outline, etc). */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - Load_Glyph( FT_GlyphSlot ttslot, /* TT_GlyphSlot */ - FT_Size ttsize, /* TT_Size */ - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - TT_GlyphSlot slot = (TT_GlyphSlot)ttslot; - TT_Size size = (TT_Size)ttsize; - FT_Face face = ttslot->face; - FT_Error error; - - - if ( !slot ) - return TT_Err_Invalid_Slot_Handle; - - if ( !size ) - return TT_Err_Invalid_Size_Handle; - - if ( !face ) - return TT_Err_Invalid_Argument; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - if ( glyph_index >= (FT_UInt)face->num_glyphs && - !face->internal->incremental_interface ) -#else - if ( glyph_index >= (FT_UInt)face->num_glyphs ) -#endif - return TT_Err_Invalid_Argument; - - if ( load_flags & FT_LOAD_NO_HINTING ) - { - /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT */ - /* are necessary to disable hinting for tricky fonts */ - - if ( FT_IS_TRICKY( face ) ) - load_flags &= ~FT_LOAD_NO_HINTING; - - if ( load_flags & FT_LOAD_NO_AUTOHINT ) - load_flags |= FT_LOAD_NO_HINTING; - } - - if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) ) - { - load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE; - - if ( !FT_IS_TRICKY( face ) ) - load_flags |= FT_LOAD_NO_HINTING; - } - - /* now load the glyph outline if necessary */ - error = TT_Load_Glyph( size, slot, glyph_index, load_flags ); - - /* force drop-out mode to 2 - irrelevant now */ - /* slot->outline.dropout_mode = 2; */ - - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** D R I V E R I N T E R F A C E ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_DEFINE_SERVICE_MULTIMASTERSREC(tt_service_gx_multi_masters, - (FT_Get_MM_Func) NULL, - (FT_Set_MM_Design_Func) NULL, - (FT_Set_MM_Blend_Func) TT_Set_MM_Blend, - (FT_Get_MM_Var_Func) TT_Get_MM_Var, - (FT_Set_Var_Design_Func)TT_Set_Var_Design - ) -#endif - - static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine = - { -#ifdef TT_USE_BYTECODE_INTERPRETER - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - FT_TRUETYPE_ENGINE_TYPE_UNPATENTED -#else - FT_TRUETYPE_ENGINE_TYPE_PATENTED -#endif - -#else /* !TT_USE_BYTECODE_INTERPRETER */ - - FT_TRUETYPE_ENGINE_TYPE_NONE - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - }; - - FT_DEFINE_SERVICE_TTGLYFREC(tt_service_truetype_glyf, - (TT_Glyf_GetLocationFunc)tt_face_get_location - ) - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_DEFINE_SERVICEDESCREC4(tt_services, - FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE, - FT_SERVICE_ID_MULTI_MASTERS, &FT_TT_SERVICE_GX_MULTI_MASTERS_GET, - FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, - FT_SERVICE_ID_TT_GLYF, &FT_TT_SERVICE_TRUETYPE_GLYF_GET - ) -#else - FT_DEFINE_SERVICEDESCREC3(tt_services, - FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE, - FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, - FT_SERVICE_ID_TT_GLYF, &FT_TT_SERVICE_TRUETYPE_GLYF_GET - ) -#endif - - FT_CALLBACK_DEF( FT_Module_Interface ) - tt_get_interface( FT_Module driver, /* TT_Driver */ - const char* tt_interface ) - { - FT_Module_Interface result; - FT_Module sfntd; - SFNT_Service sfnt; - - result = ft_service_list_lookup( FT_TT_SERVICES_GET, tt_interface ); - if ( result != NULL ) - return result; - - if ( !driver ) - return NULL; - - /* only return the default interface from the SFNT module */ - sfntd = FT_Get_Module( driver->library, "sfnt" ); - if ( sfntd ) - { - sfnt = (SFNT_Service)( sfntd->clazz->module_interface ); - if ( sfnt ) - return sfnt->get_interface( driver, tt_interface ); - } - - return 0; - } - - - /* The FT_DriverInterface structure is defined in ftdriver.h. */ - -#ifdef TT_USE_BYTECODE_INTERPRETER -#define TT_HINTER_FLAG FT_MODULE_DRIVER_HAS_HINTER -#else -#define TT_HINTER_FLAG 0 -#endif - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS -#define TT_SIZE_SELECT tt_size_select -#else -#define TT_SIZE_SELECT 0 -#endif - - FT_DEFINE_DRIVER(tt_driver_class, - - - FT_MODULE_FONT_DRIVER | - FT_MODULE_DRIVER_SCALABLE | - TT_HINTER_FLAG, - - sizeof ( TT_DriverRec ), - - "truetype", /* driver name */ - 0x10000L, /* driver version == 1.0 */ - 0x20000L, /* driver requires FreeType 2.0 or above */ - - (void*)0, /* driver specific interface */ - - tt_driver_init, - tt_driver_done, - tt_get_interface, - - sizeof ( TT_FaceRec ), - sizeof ( TT_SizeRec ), - sizeof ( FT_GlyphSlotRec ), - - tt_face_init, - tt_face_done, - tt_size_init, - tt_size_done, - tt_slot_init, - 0, /* FT_Slot_DoneFunc */ - - ft_stub_set_char_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ - - Load_Glyph, - - tt_get_kerning, - 0, /* FT_Face_AttachFunc */ - tt_get_advances, - - tt_size_request, - TT_SIZE_SELECT - ) - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttdriver.h b/android/jni/ndk_modules/freetype/src/truetype/ttdriver.h deleted file mode 100644 index aae00f26..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttdriver.h +++ /dev/null @@ -1,38 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttdriver.h */ -/* */ -/* High-level TrueType driver interface (specification). */ -/* */ -/* Copyright 1996-2001, 2002 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTDRIVER_H__ -#define __TTDRIVER_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_DRIVER_H - - -FT_BEGIN_HEADER - - - FT_DECLARE_DRIVER( tt_driver_class ) - - -FT_END_HEADER - -#endif /* __TTDRIVER_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/tterrors.h b/android/jni/ndk_modules/freetype/src/truetype/tterrors.h deleted file mode 100644 index d317c70e..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/tterrors.h +++ /dev/null @@ -1,40 +0,0 @@ -/***************************************************************************/ -/* */ -/* tterrors.h */ -/* */ -/* TrueType error codes (specification only). */ -/* */ -/* Copyright 2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* This file is used to define the TrueType error enumeration */ - /* constants. */ - /* */ - /*************************************************************************/ - -#ifndef __TTERRORS_H__ -#define __TTERRORS_H__ - -#include FT_MODULE_ERRORS_H - -#undef __FTERRORS_H__ - -#define FT_ERR_PREFIX TT_Err_ -#define FT_ERR_BASE FT_Mod_Err_TrueType - -#include FT_ERRORS_H - -#endif /* __TTERRORS_H__ */ - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttgload.c b/android/jni/ndk_modules/freetype/src/truetype/ttgload.c deleted file mode 100644 index 1b496c04..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttgload.c +++ /dev/null @@ -1,2144 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttgload.c */ -/* */ -/* TrueType Glyph Loader (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_TRUETYPE_TAGS_H -#include FT_OUTLINE_H - -#include "ttgload.h" -#include "ttpload.h" - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include "ttgxvar.h" -#endif - -#include "tterrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttgload - - - /*************************************************************************/ - /* */ - /* Composite font flags. */ - /* */ -#define ARGS_ARE_WORDS 0x0001 -#define ARGS_ARE_XY_VALUES 0x0002 -#define ROUND_XY_TO_GRID 0x0004 -#define WE_HAVE_A_SCALE 0x0008 -/* reserved 0x0010 */ -#define MORE_COMPONENTS 0x0020 -#define WE_HAVE_AN_XY_SCALE 0x0040 -#define WE_HAVE_A_2X2 0x0080 -#define WE_HAVE_INSTR 0x0100 -#define USE_MY_METRICS 0x0200 -#define OVERLAP_COMPOUND 0x0400 -#define SCALED_COMPONENT_OFFSET 0x0800 -#define UNSCALED_COMPONENT_OFFSET 0x1000 - - - /*************************************************************************/ - /* */ - /* Returns the horizontal metrics in font units for a given glyph. If */ - /* `check' is true, take care of monospaced fonts by returning the */ - /* advance width maximum. */ - /* */ - FT_LOCAL_DEF( void ) - TT_Get_HMetrics( TT_Face face, - FT_UInt idx, - FT_Bool check, - FT_Short* lsb, - FT_UShort* aw ) - { - ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw ); - - if ( check && face->postscript.isFixedPitch ) - *aw = face->horizontal.advance_Width_Max; - - FT_TRACE5(( " advance width (font units): %d\n", *aw )); - FT_TRACE5(( " left side bearing (font units): %d\n", *lsb )); - } - - - /*************************************************************************/ - /* */ - /* Returns the vertical metrics in font units for a given glyph. */ - /* Greg Hitchcock from Microsoft told us that if there were no `vmtx' */ - /* table, typoAscender/Descender from the `OS/2' table would be used */ - /* instead, and if there were no `OS/2' table, use ascender/descender */ - /* from the `hhea' table. But that is not what Microsoft's rasterizer */ - /* apparently does: It uses the ppem value as the advance height, and */ - /* sets the top side bearing to be zero. */ - /* */ - /* The monospace `check' is probably not meaningful here, but we leave */ - /* it in for a consistent interface. */ - /* */ - FT_LOCAL_DEF( void ) - TT_Get_VMetrics( TT_Face face, - FT_UInt idx, - FT_Bool check, - FT_Short* tsb, - FT_UShort* ah ) - { - FT_UNUSED( check ); - - if ( face->vertical_info ) - ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah ); - -#if 1 /* Empirically determined, at variance with what MS said */ - - else - { - *tsb = 0; - *ah = face->root.units_per_EM; - } - -#else /* This is what MS said to do. It isn't what they do, however. */ - - else if ( face->os2.version != 0xFFFFU ) - { - *tsb = face->os2.sTypoAscender; - *ah = face->os2.sTypoAscender - face->os2.sTypoDescender; - } - else - { - *tsb = face->horizontal.Ascender; - *ah = face->horizontal.Ascender - face->horizontal.Descender; - } - -#endif - - FT_TRACE5(( " advance height (font units): %d\n", *ah )); - FT_TRACE5(( " top side bearing (font units): %d\n", *tsb )); - } - - - static void - tt_get_metrics( TT_Loader loader, - FT_UInt glyph_index ) - { - TT_Face face = (TT_Face)loader->face; - - FT_Short left_bearing = 0, top_bearing = 0; - FT_UShort advance_width = 0, advance_height = 0; - - - TT_Get_HMetrics( face, glyph_index, - (FT_Bool)!( loader->load_flags & - FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), - &left_bearing, - &advance_width ); - TT_Get_VMetrics( face, glyph_index, - (FT_Bool)!( loader->load_flags & - FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), - &top_bearing, - &advance_height ); - - loader->left_bearing = left_bearing; - loader->advance = advance_width; - loader->top_bearing = top_bearing; - loader->vadvance = advance_height; - - if ( !loader->linear_def ) - { - loader->linear_def = 1; - loader->linear = advance_width; - } - } - - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - static void - tt_get_metrics_incr_overrides( TT_Loader loader, - FT_UInt glyph_index ) - { - TT_Face face = (TT_Face)loader->face; - - FT_Short left_bearing = 0, top_bearing = 0; - FT_UShort advance_width = 0, advance_height = 0; - - - /* If this is an incrementally loaded font check whether there are */ - /* overriding metrics for this glyph. */ - if ( face->root.internal->incremental_interface && - face->root.internal->incremental_interface->funcs->get_glyph_metrics ) - { - FT_Incremental_MetricsRec metrics; - FT_Error error; - - - metrics.bearing_x = loader->left_bearing; - metrics.bearing_y = 0; - metrics.advance = loader->advance; - metrics.advance_v = 0; - - error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( - face->root.internal->incremental_interface->object, - glyph_index, FALSE, &metrics ); - if ( error ) - goto Exit; - - left_bearing = (FT_Short)metrics.bearing_x; - advance_width = (FT_UShort)metrics.advance; - -#if 0 - - /* GWW: Do I do the same for vertical metrics? */ - metrics.bearing_x = 0; - metrics.bearing_y = loader->top_bearing; - metrics.advance = loader->vadvance; - - error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( - face->root.internal->incremental_interface->object, - glyph_index, TRUE, &metrics ); - if ( error ) - goto Exit; - - top_bearing = (FT_Short)metrics.bearing_y; - advance_height = (FT_UShort)metrics.advance; - -#endif /* 0 */ - - loader->left_bearing = left_bearing; - loader->advance = advance_width; - loader->top_bearing = top_bearing; - loader->vadvance = advance_height; - - if ( !loader->linear_def ) - { - loader->linear_def = 1; - loader->linear = advance_width; - } - } - - Exit: - return; - } - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - - /*************************************************************************/ - /* */ - /* Translates an array of coordinates. */ - /* */ - static void - translate_array( FT_UInt n, - FT_Vector* coords, - FT_Pos delta_x, - FT_Pos delta_y ) - { - FT_UInt k; - - - if ( delta_x ) - for ( k = 0; k < n; k++ ) - coords[k].x += delta_x; - - if ( delta_y ) - for ( k = 0; k < n; k++ ) - coords[k].y += delta_y; - } - - -#undef IS_HINTED -#define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 ) - - - /*************************************************************************/ - /* */ - /* The following functions are used by default with TrueType fonts. */ - /* However, they can be replaced by alternatives if we need to support */ - /* TrueType-compressed formats (like MicroType) in the future. */ - /* */ - /*************************************************************************/ - - FT_CALLBACK_DEF( FT_Error ) - TT_Access_Glyph_Frame( TT_Loader loader, - FT_UInt glyph_index, - FT_ULong offset, - FT_UInt byte_count ) - { - FT_Error error; - FT_Stream stream = loader->stream; - - /* for non-debug mode */ - FT_UNUSED( glyph_index ); - - - FT_TRACE4(( "Glyph %ld\n", glyph_index )); - - /* the following line sets the `error' variable through macros! */ - if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) ) - return error; - - loader->cursor = stream->cursor; - loader->limit = stream->limit; - - return TT_Err_Ok; - } - - - FT_CALLBACK_DEF( void ) - TT_Forget_Glyph_Frame( TT_Loader loader ) - { - FT_Stream stream = loader->stream; - - - FT_FRAME_EXIT(); - } - - - FT_CALLBACK_DEF( FT_Error ) - TT_Load_Glyph_Header( TT_Loader loader ) - { - FT_Byte* p = loader->cursor; - FT_Byte* limit = loader->limit; - - - if ( p + 10 > limit ) - return TT_Err_Invalid_Outline; - - loader->n_contours = FT_NEXT_SHORT( p ); - - loader->bbox.xMin = FT_NEXT_SHORT( p ); - loader->bbox.yMin = FT_NEXT_SHORT( p ); - loader->bbox.xMax = FT_NEXT_SHORT( p ); - loader->bbox.yMax = FT_NEXT_SHORT( p ); - - FT_TRACE5(( " # of contours: %d\n", loader->n_contours )); - FT_TRACE5(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin, - loader->bbox.xMax )); - FT_TRACE5(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin, - loader->bbox.yMax )); - loader->cursor = p; - - return TT_Err_Ok; - } - - - FT_CALLBACK_DEF( FT_Error ) - TT_Load_Simple_Glyph( TT_Loader load ) - { - FT_Error error; - FT_Byte* p = load->cursor; - FT_Byte* limit = load->limit; - FT_GlyphLoader gloader = load->gloader; - FT_Int n_contours = load->n_contours; - FT_Outline* outline; - TT_Face face = (TT_Face)load->face; - FT_UShort n_ins; - FT_Int n_points; - - FT_Byte *flag, *flag_limit; - FT_Byte c, count; - FT_Vector *vec, *vec_limit; - FT_Pos x; - FT_Short *cont, *cont_limit, prev_cont; - FT_Int xy_size = 0; - - - /* check that we can add the contours to the glyph */ - error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours ); - if ( error ) - goto Fail; - - /* reading the contours' endpoints & number of points */ - cont = gloader->current.outline.contours; - cont_limit = cont + n_contours; - - /* check space for contours array + instructions count */ - if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit ) - goto Invalid_Outline; - - prev_cont = FT_NEXT_USHORT( p ); - - if ( n_contours > 0 ) - cont[0] = prev_cont; - - for ( cont++; cont < cont_limit; cont++ ) - { - cont[0] = FT_NEXT_USHORT( p ); - if ( cont[0] <= prev_cont ) - { - /* unordered contours: this is invalid */ - error = TT_Err_Invalid_Table; - goto Fail; - } - prev_cont = cont[0]; - } - - n_points = 0; - if ( n_contours > 0 ) - { - n_points = cont[-1] + 1; - if ( n_points < 0 ) - goto Invalid_Outline; - } - - /* note that we will add four phantom points later */ - error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 ); - if ( error ) - goto Fail; - - /* we'd better check the contours table right now */ - outline = &gloader->current.outline; - - for ( cont = outline->contours + 1; cont < cont_limit; cont++ ) - if ( cont[-1] >= cont[0] ) - goto Invalid_Outline; - - /* reading the bytecode instructions */ - load->glyph->control_len = 0; - load->glyph->control_data = 0; - - if ( p + 2 > limit ) - goto Invalid_Outline; - - n_ins = FT_NEXT_USHORT( p ); - - FT_TRACE5(( " Instructions size: %u\n", n_ins )); - - if ( n_ins > face->max_profile.maxSizeOfInstructions ) - { - FT_TRACE0(( "TT_Load_Simple_Glyph: too many instructions (%d)\n", - n_ins )); - error = TT_Err_Too_Many_Hints; - goto Fail; - } - - if ( ( limit - p ) < n_ins ) - { - FT_TRACE0(( "TT_Load_Simple_Glyph: instruction count mismatch\n" )); - error = TT_Err_Too_Many_Hints; - goto Fail; - } - -#ifdef TT_USE_BYTECODE_INTERPRETER - - if ( IS_HINTED( load->load_flags ) ) - { - load->glyph->control_len = n_ins; - load->glyph->control_data = load->exec->glyphIns; - - FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins ); - } - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - p += n_ins; - - /* reading the point tags */ - flag = (FT_Byte*)outline->tags; - flag_limit = flag + n_points; - - FT_ASSERT( flag != NULL ); - - while ( flag < flag_limit ) - { - if ( p + 1 > limit ) - goto Invalid_Outline; - - *flag++ = c = FT_NEXT_BYTE( p ); - if ( c & 8 ) - { - if ( p + 1 > limit ) - goto Invalid_Outline; - - count = FT_NEXT_BYTE( p ); - if ( flag + (FT_Int)count > flag_limit ) - goto Invalid_Outline; - - for ( ; count > 0; count-- ) - *flag++ = c; - } - } - - /* reading the X coordinates */ - - vec = outline->points; - vec_limit = vec + n_points; - flag = (FT_Byte*)outline->tags; - x = 0; - - if ( p + xy_size > limit ) - goto Invalid_Outline; - - for ( ; vec < vec_limit; vec++, flag++ ) - { - FT_Pos y = 0; - FT_Byte f = *flag; - - - if ( f & 2 ) - { - if ( p + 1 > limit ) - goto Invalid_Outline; - - y = (FT_Pos)FT_NEXT_BYTE( p ); - if ( ( f & 16 ) == 0 ) - y = -y; - } - else if ( ( f & 16 ) == 0 ) - { - if ( p + 2 > limit ) - goto Invalid_Outline; - - y = (FT_Pos)FT_NEXT_SHORT( p ); - } - - x += y; - vec->x = x; - /* the cast is for stupid compilers */ - *flag = (FT_Byte)( f & ~( 2 | 16 ) ); - } - - /* reading the Y coordinates */ - - vec = gloader->current.outline.points; - vec_limit = vec + n_points; - flag = (FT_Byte*)outline->tags; - x = 0; - - for ( ; vec < vec_limit; vec++, flag++ ) - { - FT_Pos y = 0; - FT_Byte f = *flag; - - - if ( f & 4 ) - { - if ( p + 1 > limit ) - goto Invalid_Outline; - - y = (FT_Pos)FT_NEXT_BYTE( p ); - if ( ( f & 32 ) == 0 ) - y = -y; - } - else if ( ( f & 32 ) == 0 ) - { - if ( p + 2 > limit ) - goto Invalid_Outline; - - y = (FT_Pos)FT_NEXT_SHORT( p ); - } - - x += y; - vec->y = x; - /* the cast is for stupid compilers */ - *flag = (FT_Byte)( f & FT_CURVE_TAG_ON ); - } - - outline->n_points = (FT_UShort)n_points; - outline->n_contours = (FT_Short) n_contours; - - load->cursor = p; - - Fail: - return error; - - Invalid_Outline: - error = TT_Err_Invalid_Outline; - goto Fail; - } - - - FT_CALLBACK_DEF( FT_Error ) - TT_Load_Composite_Glyph( TT_Loader loader ) - { - FT_Error error; - FT_Byte* p = loader->cursor; - FT_Byte* limit = loader->limit; - FT_GlyphLoader gloader = loader->gloader; - FT_SubGlyph subglyph; - FT_UInt num_subglyphs; - - - num_subglyphs = 0; - - do - { - FT_Fixed xx, xy, yy, yx; - FT_UInt count; - - - /* check that we can load a new subglyph */ - error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 ); - if ( error ) - goto Fail; - - /* check space */ - if ( p + 4 > limit ) - goto Invalid_Composite; - - subglyph = gloader->current.subglyphs + num_subglyphs; - - subglyph->arg1 = subglyph->arg2 = 0; - - subglyph->flags = FT_NEXT_USHORT( p ); - subglyph->index = FT_NEXT_USHORT( p ); - - /* check space */ - count = 2; - if ( subglyph->flags & ARGS_ARE_WORDS ) - count += 2; - if ( subglyph->flags & WE_HAVE_A_SCALE ) - count += 2; - else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) - count += 4; - else if ( subglyph->flags & WE_HAVE_A_2X2 ) - count += 8; - - if ( p + count > limit ) - goto Invalid_Composite; - - /* read arguments */ - if ( subglyph->flags & ARGS_ARE_WORDS ) - { - subglyph->arg1 = FT_NEXT_SHORT( p ); - subglyph->arg2 = FT_NEXT_SHORT( p ); - } - else - { - subglyph->arg1 = FT_NEXT_CHAR( p ); - subglyph->arg2 = FT_NEXT_CHAR( p ); - } - - /* read transform */ - xx = yy = 0x10000L; - xy = yx = 0; - - if ( subglyph->flags & WE_HAVE_A_SCALE ) - { - xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; - yy = xx; - } - else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) - { - xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; - yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; - } - else if ( subglyph->flags & WE_HAVE_A_2X2 ) - { - xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; - yx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; - xy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; - yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; - } - - subglyph->transform.xx = xx; - subglyph->transform.xy = xy; - subglyph->transform.yx = yx; - subglyph->transform.yy = yy; - - num_subglyphs++; - - } while ( subglyph->flags & MORE_COMPONENTS ); - - gloader->current.num_subglyphs = num_subglyphs; - -#ifdef TT_USE_BYTECODE_INTERPRETER - - { - FT_Stream stream = loader->stream; - - - /* we must undo the FT_FRAME_ENTER in order to point */ - /* to the composite instructions, if we find some. */ - /* We will process them later. */ - /* */ - loader->ins_pos = (FT_ULong)( FT_STREAM_POS() + - p - limit ); - } - -#endif - - loader->cursor = p; - - Fail: - return error; - - Invalid_Composite: - error = TT_Err_Invalid_Composite; - goto Fail; - } - - - FT_LOCAL_DEF( void ) - TT_Init_Glyph_Loading( TT_Face face ) - { - face->access_glyph_frame = TT_Access_Glyph_Frame; - face->read_glyph_header = TT_Load_Glyph_Header; - face->read_simple_glyph = TT_Load_Simple_Glyph; - face->read_composite_glyph = TT_Load_Composite_Glyph; - face->forget_glyph_frame = TT_Forget_Glyph_Frame; - } - - - static void - tt_prepare_zone( TT_GlyphZone zone, - FT_GlyphLoad load, - FT_UInt start_point, - FT_UInt start_contour ) - { - zone->n_points = (FT_UShort)( load->outline.n_points - start_point ); - zone->n_contours = (FT_Short) ( load->outline.n_contours - - start_contour ); - zone->org = load->extra_points + start_point; - zone->cur = load->outline.points + start_point; - zone->orus = load->extra_points2 + start_point; - zone->tags = (FT_Byte*)load->outline.tags + start_point; - zone->contours = (FT_UShort*)load->outline.contours + start_contour; - zone->first_point = (FT_UShort)start_point; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Hint_Glyph */ - /* */ - /* <Description> */ - /* Hint the glyph using the zone prepared by the caller. Note that */ - /* the zone is supposed to include four phantom points. */ - /* */ - static FT_Error - TT_Hint_Glyph( TT_Loader loader, - FT_Bool is_composite ) - { - TT_GlyphZone zone = &loader->zone; - FT_Pos origin; - -#ifdef TT_USE_BYTECODE_INTERPRETER - FT_UInt n_ins; -#else - FT_UNUSED( is_composite ); -#endif - - -#ifdef TT_USE_BYTECODE_INTERPRETER - if ( loader->glyph->control_len > 0xFFFFL ) - { - FT_TRACE1(( "TT_Hint_Glyph: too long instructions " )); - FT_TRACE1(( "(0x%lx byte) is truncated\n", - loader->glyph->control_len )); - } - n_ins = (FT_UInt)( loader->glyph->control_len ); -#endif - - origin = zone->cur[zone->n_points - 4].x; - origin = FT_PIX_ROUND( origin ) - origin; - if ( origin ) - translate_array( zone->n_points, zone->cur, origin, 0 ); - -#ifdef TT_USE_BYTECODE_INTERPRETER - /* save original point position in org */ - if ( n_ins > 0 ) - FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points ); - - /* Reset graphics state. */ - loader->exec->GS = ((TT_Size)loader->size)->GS; - - /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */ - /* completely refer to the (already) hinted subglyphs. */ - if ( is_composite ) - { - loader->exec->metrics.x_scale = 1 << 16; - loader->exec->metrics.y_scale = 1 << 16; - - FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points ); - } - else - { - loader->exec->metrics.x_scale = - ((TT_Size)loader->size)->metrics.x_scale; - loader->exec->metrics.y_scale = - ((TT_Size)loader->size)->metrics.y_scale; - } -#endif - - /* round pp2 and pp4 */ - zone->cur[zone->n_points - 3].x = - FT_PIX_ROUND( zone->cur[zone->n_points - 3].x ); - zone->cur[zone->n_points - 1].y = - FT_PIX_ROUND( zone->cur[zone->n_points - 1].y ); - -#ifdef TT_USE_BYTECODE_INTERPRETER - - if ( n_ins > 0 ) - { - FT_Bool debug; - FT_Error error; - - FT_GlyphLoader gloader = loader->gloader; - FT_Outline current_outline = gloader->current.outline; - - - error = TT_Set_CodeRange( loader->exec, tt_coderange_glyph, - loader->exec->glyphIns, n_ins ); - if ( error ) - return error; - - loader->exec->is_composite = is_composite; - loader->exec->pts = *zone; - - debug = FT_BOOL( !( loader->load_flags & FT_LOAD_NO_SCALE ) && - ((TT_Size)loader->size)->debug ); - - error = TT_Run_Context( loader->exec, debug ); - if ( error && loader->exec->pedantic_hinting ) - return error; - - /* store drop-out mode in bits 5-7; set bit 2 also as a marker */ - current_outline.tags[0] |= - ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE; - } - -#endif - - /* save glyph phantom points */ - if ( !loader->preserve_pps ) - { - loader->pp1 = zone->cur[zone->n_points - 4]; - loader->pp2 = zone->cur[zone->n_points - 3]; - loader->pp3 = zone->cur[zone->n_points - 2]; - loader->pp4 = zone->cur[zone->n_points - 1]; - } - - return TT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Process_Simple_Glyph */ - /* */ - /* <Description> */ - /* Once a simple glyph has been loaded, it needs to be processed. */ - /* Usually, this means scaling and hinting through bytecode */ - /* interpretation. */ - /* */ - static FT_Error - TT_Process_Simple_Glyph( TT_Loader loader ) - { - FT_GlyphLoader gloader = loader->gloader; - FT_Error error = TT_Err_Ok; - FT_Outline* outline; - FT_Int n_points; - - - outline = &gloader->current.outline; - n_points = outline->n_points; - - /* set phantom points */ - - outline->points[n_points ] = loader->pp1; - outline->points[n_points + 1] = loader->pp2; - outline->points[n_points + 2] = loader->pp3; - outline->points[n_points + 3] = loader->pp4; - - outline->tags[n_points ] = 0; - outline->tags[n_points + 1] = 0; - outline->tags[n_points + 2] = 0; - outline->tags[n_points + 3] = 0; - - n_points += 4; - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - - if ( ((TT_Face)loader->face)->doblend ) - { - /* Deltas apply to the unscaled data. */ - FT_Vector* deltas; - FT_Memory memory = loader->face->memory; - FT_Int i; - - - error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face), - loader->glyph_index, - &deltas, - n_points ); - if ( error ) - return error; - - for ( i = 0; i < n_points; ++i ) - { - outline->points[i].x += deltas[i].x; - outline->points[i].y += deltas[i].y; - } - - FT_FREE( deltas ); - } - -#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ - - if ( IS_HINTED( loader->load_flags ) ) - { - tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 ); - - FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur, - loader->zone.n_points + 4 ); - } - - /* scale the glyph */ - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) - { - FT_Vector* vec = outline->points; - FT_Vector* limit = outline->points + n_points; - FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale; - FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale; - - - for ( ; vec < limit; vec++ ) - { - vec->x = FT_MulFix( vec->x, x_scale ); - vec->y = FT_MulFix( vec->y, y_scale ); - } - - loader->pp1 = outline->points[n_points - 4]; - loader->pp2 = outline->points[n_points - 3]; - loader->pp3 = outline->points[n_points - 2]; - loader->pp4 = outline->points[n_points - 1]; - } - - if ( IS_HINTED( loader->load_flags ) ) - { - loader->zone.n_points += 4; - - error = TT_Hint_Glyph( loader, 0 ); - } - - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Process_Composite_Component */ - /* */ - /* <Description> */ - /* Once a composite component has been loaded, it needs to be */ - /* processed. Usually, this means transforming and translating. */ - /* */ - static FT_Error - TT_Process_Composite_Component( TT_Loader loader, - FT_SubGlyph subglyph, - FT_UInt start_point, - FT_UInt num_base_points ) - { - FT_GlyphLoader gloader = loader->gloader; - FT_Vector* base_vec = gloader->base.outline.points; - FT_UInt num_points = gloader->base.outline.n_points; - FT_Bool have_scale; - FT_Pos x, y; - - - have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE | - WE_HAVE_AN_XY_SCALE | - WE_HAVE_A_2X2 ) ); - - /* perform the transform required for this subglyph */ - if ( have_scale ) - { - FT_UInt i; - - - for ( i = num_base_points; i < num_points; i++ ) - FT_Vector_Transform( base_vec + i, &subglyph->transform ); - } - - /* get offset */ - if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) ) - { - FT_UInt k = subglyph->arg1; - FT_UInt l = subglyph->arg2; - FT_Vector* p1; - FT_Vector* p2; - - - /* match l-th point of the newly loaded component to the k-th point */ - /* of the previously loaded components. */ - - /* change to the point numbers used by our outline */ - k += start_point; - l += num_base_points; - if ( k >= num_base_points || - l >= num_points ) - return TT_Err_Invalid_Composite; - - p1 = gloader->base.outline.points + k; - p2 = gloader->base.outline.points + l; - - x = p1->x - p2->x; - y = p1->y - p2->y; - } - else - { - x = subglyph->arg1; - y = subglyph->arg2; - - if ( !x && !y ) - return TT_Err_Ok; - - /* Use a default value dependent on */ - /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED. This is useful for old TT */ - /* fonts which don't set the xxx_COMPONENT_OFFSET bit. */ - - if ( have_scale && -#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED - !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) ) -#else - ( subglyph->flags & SCALED_COMPONENT_OFFSET ) ) -#endif - { - -#if 0 - - /*************************************************************************/ - /* */ - /* This algorithm is what Apple documents. But it doesn't work. */ - /* */ - int a = subglyph->transform.xx > 0 ? subglyph->transform.xx - : -subglyph->transform.xx; - int b = subglyph->transform.yx > 0 ? subglyph->transform.yx - : -subglyph->transform.yx; - int c = subglyph->transform.xy > 0 ? subglyph->transform.xy - : -subglyph->transform.xy; - int d = subglyph->transform.yy > 0 ? subglyph->transform.yy - : -subglyph->transform.yy; - int m = a > b ? a : b; - int n = c > d ? c : d; - - - if ( a - b <= 33 && a - b >= -33 ) - m *= 2; - if ( c - d <= 33 && c - d >= -33 ) - n *= 2; - x = FT_MulFix( x, m ); - y = FT_MulFix( y, n ); - -#else /* 0 */ - - /*************************************************************************/ - /* */ - /* This algorithm is a guess and works much better than the above. */ - /* */ - FT_Fixed mac_xscale = FT_SqrtFixed( - (FT_Int32)FT_MulFix( subglyph->transform.xx, - subglyph->transform.xx ) + - (FT_Int32)FT_MulFix( subglyph->transform.xy, - subglyph->transform.xy ) ); - FT_Fixed mac_yscale = FT_SqrtFixed( - (FT_Int32)FT_MulFix( subglyph->transform.yy, - subglyph->transform.yy ) + - (FT_Int32)FT_MulFix( subglyph->transform.yx, - subglyph->transform.yx ) ); - - - x = FT_MulFix( x, mac_xscale ); - y = FT_MulFix( y, mac_yscale ); - -#endif /* 0 */ - - } - - if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) - { - FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale; - FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale; - - - x = FT_MulFix( x, x_scale ); - y = FT_MulFix( y, y_scale ); - - if ( subglyph->flags & ROUND_XY_TO_GRID ) - { - x = FT_PIX_ROUND( x ); - y = FT_PIX_ROUND( y ); - } - } - } - - if ( x || y ) - translate_array( num_points - num_base_points, - base_vec + num_base_points, - x, y ); - - return TT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Process_Composite_Glyph */ - /* */ - /* <Description> */ - /* This is slightly different from TT_Process_Simple_Glyph, in that */ - /* its sole purpose is to hint the glyph. Thus this function is */ - /* only available when bytecode interpreter is enabled. */ - /* */ - static FT_Error - TT_Process_Composite_Glyph( TT_Loader loader, - FT_UInt start_point, - FT_UInt start_contour ) - { - FT_Error error; - FT_Outline* outline; - FT_UInt i; - - - outline = &loader->gloader->base.outline; - - /* make room for phantom points */ - error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader, - outline->n_points + 4, - 0 ); - if ( error ) - return error; - - outline->points[outline->n_points ] = loader->pp1; - outline->points[outline->n_points + 1] = loader->pp2; - outline->points[outline->n_points + 2] = loader->pp3; - outline->points[outline->n_points + 3] = loader->pp4; - - outline->tags[outline->n_points ] = 0; - outline->tags[outline->n_points + 1] = 0; - outline->tags[outline->n_points + 2] = 0; - outline->tags[outline->n_points + 3] = 0; - -#ifdef TT_USE_BYTECODE_INTERPRETER - - { - FT_Stream stream = loader->stream; - FT_UShort n_ins, max_ins; - FT_ULong tmp; - - - /* TT_Load_Composite_Glyph only gives us the offset of instructions */ - /* so we read them here */ - if ( FT_STREAM_SEEK( loader->ins_pos ) || - FT_READ_USHORT( n_ins ) ) - return error; - - FT_TRACE5(( " Instructions size = %d\n", n_ins )); - - /* check it */ - max_ins = ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions; - if ( n_ins > max_ins ) - { - /* acroread ignores this field, so we only do a rough safety check */ - if ( (FT_Int)n_ins > loader->byte_len ) - { - FT_TRACE1(( "TT_Process_Composite_Glyph: " - "too many instructions (%d) for glyph with length %d\n", - n_ins, loader->byte_len )); - return TT_Err_Too_Many_Hints; - } - - tmp = loader->exec->glyphSize; - error = Update_Max( loader->exec->memory, - &tmp, - sizeof ( FT_Byte ), - (void*)&loader->exec->glyphIns, - n_ins ); - loader->exec->glyphSize = (FT_UShort)tmp; - if ( error ) - return error; - } - else if ( n_ins == 0 ) - return TT_Err_Ok; - - if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) ) - return error; - - loader->glyph->control_data = loader->exec->glyphIns; - loader->glyph->control_len = n_ins; - } - -#endif - - tt_prepare_zone( &loader->zone, &loader->gloader->base, - start_point, start_contour ); - - /* Some points are likely touched during execution of */ - /* instructions on components. So let's untouch them. */ - for ( i = start_point; i < loader->zone.n_points; i++ ) - loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH; - - loader->zone.n_points += 4; - - return TT_Hint_Glyph( loader, 1 ); - } - - - /* Calculate the four phantom points. */ - /* The first two stand for horizontal origin and advance. */ - /* The last two stand for vertical origin and advance. */ -#define TT_LOADER_SET_PP( loader ) \ - do { \ - (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \ - (loader)->pp1.y = 0; \ - (loader)->pp2.x = (loader)->pp1.x + (loader)->advance; \ - (loader)->pp2.y = 0; \ - (loader)->pp3.x = 0; \ - (loader)->pp3.y = (loader)->top_bearing + (loader)->bbox.yMax; \ - (loader)->pp4.x = 0; \ - (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance; \ - } while ( 0 ) - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* load_truetype_glyph */ - /* */ - /* <Description> */ - /* Loads a given truetype glyph. Handles composites and uses a */ - /* TT_Loader object. */ - /* */ - static FT_Error - load_truetype_glyph( TT_Loader loader, - FT_UInt glyph_index, - FT_UInt recurse_count, - FT_Bool header_only ) - { - FT_Error error = TT_Err_Ok; - FT_Fixed x_scale, y_scale; - FT_ULong offset; - TT_Face face = (TT_Face)loader->face; - FT_GlyphLoader gloader = loader->gloader; - FT_Bool opened_frame = 0; - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Vector* deltas = NULL; -#endif - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - FT_StreamRec inc_stream; - FT_Data glyph_data; - FT_Bool glyph_data_loaded = 0; -#endif - - - /* some fonts have an incorrect value of `maxComponentDepth', */ - /* thus we allow depth 1 to catch the majority of them */ - if ( recurse_count > 1 && - recurse_count > face->max_profile.maxComponentDepth ) - { - error = TT_Err_Invalid_Composite; - goto Exit; - } - - /* check glyph index */ - if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) - { - error = TT_Err_Invalid_Glyph_Index; - goto Exit; - } - - loader->glyph_index = glyph_index; - - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) - { - x_scale = ((TT_Size)loader->size)->metrics.x_scale; - y_scale = ((TT_Size)loader->size)->metrics.y_scale; - } - else - { - x_scale = 0x10000L; - y_scale = 0x10000L; - } - - tt_get_metrics( loader, glyph_index ); - - /* Set `offset' to the start of the glyph relative to the start of */ - /* the `glyf' table, and `byte_len' to the length of the glyph in */ - /* bytes. */ - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - /* If we are loading glyph data via the incremental interface, set */ - /* the loader stream to a memory stream reading the data returned */ - /* by the interface. */ - if ( face->root.internal->incremental_interface ) - { - error = face->root.internal->incremental_interface->funcs->get_glyph_data( - face->root.internal->incremental_interface->object, - glyph_index, &glyph_data ); - if ( error ) - goto Exit; - - glyph_data_loaded = 1; - offset = 0; - loader->byte_len = glyph_data.length; - - FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) ); - FT_Stream_OpenMemory( &inc_stream, - glyph_data.pointer, glyph_data.length ); - - loader->stream = &inc_stream; - } - else - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - offset = tt_face_get_location( face, glyph_index, - (FT_UInt*)&loader->byte_len ); - - if ( loader->byte_len > 0 ) - { -#ifdef FT_CONFIG_OPTION_INCREMENTAL - /* for the incremental interface, `glyf_offset' is always zero */ - if ( !loader->glyf_offset && - !face->root.internal->incremental_interface ) -#else - if ( !loader->glyf_offset ) -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - { - FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" )); - error = TT_Err_Invalid_Table; - goto Exit; - } - - error = face->access_glyph_frame( loader, glyph_index, - loader->glyf_offset + offset, - loader->byte_len ); - if ( error ) - goto Exit; - - opened_frame = 1; - - /* read glyph header first */ - error = face->read_glyph_header( loader ); - if ( error || header_only ) - goto Exit; - } - - if ( loader->byte_len == 0 || loader->n_contours == 0 ) - { - loader->bbox.xMin = 0; - loader->bbox.xMax = 0; - loader->bbox.yMin = 0; - loader->bbox.yMax = 0; - - if ( header_only ) - goto Exit; - - /* must initialize points before (possibly) overriding */ - /* glyph metrics from the incremental interface */ - TT_LOADER_SET_PP( loader ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - tt_get_metrics_incr_overrides( loader, glyph_index ); -#endif - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - - if ( ((TT_Face)(loader->face))->doblend ) - { - /* this must be done before scaling */ - FT_Memory memory = loader->face->memory; - - - error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face), - glyph_index, &deltas, 4 ); - if ( error ) - goto Exit; - - loader->pp1.x += deltas[0].x; loader->pp1.y += deltas[0].y; - loader->pp2.x += deltas[1].x; loader->pp2.y += deltas[1].y; - loader->pp3.x += deltas[2].x; loader->pp3.y += deltas[2].y; - loader->pp4.x += deltas[3].x; loader->pp4.y += deltas[3].y; - - FT_FREE( deltas ); - } - -#endif - - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) - { - loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); - loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); - loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); - loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); - } - - error = TT_Err_Ok; - goto Exit; - } - - /* must initialize points before (possibly) overriding */ - /* glyph metrics from the incremental interface */ - TT_LOADER_SET_PP( loader ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - tt_get_metrics_incr_overrides( loader, glyph_index ); -#endif - - /***********************************************************************/ - /***********************************************************************/ - /***********************************************************************/ - - /* if it is a simple glyph, load it */ - - if ( loader->n_contours > 0 ) - { - error = face->read_simple_glyph( loader ); - if ( error ) - goto Exit; - - /* all data have been read */ - face->forget_glyph_frame( loader ); - opened_frame = 0; - - error = TT_Process_Simple_Glyph( loader ); - if ( error ) - goto Exit; - - FT_GlyphLoader_Add( gloader ); - } - - /***********************************************************************/ - /***********************************************************************/ - /***********************************************************************/ - - /* otherwise, load a composite! */ - else if ( loader->n_contours == -1 ) - { - FT_UInt start_point; - FT_UInt start_contour; - FT_ULong ins_pos; /* position of composite instructions, if any */ - - - start_point = gloader->base.outline.n_points; - start_contour = gloader->base.outline.n_contours; - - /* for each subglyph, read composite header */ - error = face->read_composite_glyph( loader ); - if ( error ) - goto Exit; - - /* store the offset of instructions */ - ins_pos = loader->ins_pos; - - /* all data we need are read */ - face->forget_glyph_frame( loader ); - opened_frame = 0; - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - - if ( face->doblend ) - { - FT_Int i, limit; - FT_SubGlyph subglyph; - FT_Memory memory = face->root.memory; - - - /* this provides additional offsets */ - /* for each component's translation */ - - if ( ( error = TT_Vary_Get_Glyph_Deltas( - face, - glyph_index, - &deltas, - gloader->current.num_subglyphs + 4 )) != 0 ) - goto Exit; - - subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs; - limit = gloader->current.num_subglyphs; - - for ( i = 0; i < limit; ++i, ++subglyph ) - { - if ( subglyph->flags & ARGS_ARE_XY_VALUES ) - { - /* XXX: overflow check for subglyph->{arg1,arg2}. */ - /* deltas[i].{x,y} must be within signed 16-bit, */ - /* but the restriction of summed delta is not clear */ - subglyph->arg1 += (FT_Int16)deltas[i].x; - subglyph->arg2 += (FT_Int16)deltas[i].y; - } - } - - loader->pp1.x += deltas[i + 0].x; loader->pp1.y += deltas[i + 0].y; - loader->pp2.x += deltas[i + 1].x; loader->pp2.y += deltas[i + 1].y; - loader->pp3.x += deltas[i + 2].x; loader->pp3.y += deltas[i + 2].y; - loader->pp4.x += deltas[i + 3].x; loader->pp4.y += deltas[i + 3].y; - - FT_FREE( deltas ); - } - -#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ - - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) - { - loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); - loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); - loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); - loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); - } - - /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */ - /* `as is' in the glyph slot (the client application will be */ - /* responsible for interpreting these data)... */ - if ( loader->load_flags & FT_LOAD_NO_RECURSE ) - { - FT_GlyphLoader_Add( gloader ); - loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE; - - goto Exit; - } - - /*********************************************************************/ - /*********************************************************************/ - /*********************************************************************/ - - { - FT_UInt n, num_base_points; - FT_SubGlyph subglyph = 0; - - FT_UInt num_points = start_point; - FT_UInt num_subglyphs = gloader->current.num_subglyphs; - FT_UInt num_base_subgs = gloader->base.num_subglyphs; - - FT_Stream old_stream = loader->stream; - FT_Int old_byte_len = loader->byte_len; - - - FT_GlyphLoader_Add( gloader ); - - /* read each subglyph independently */ - for ( n = 0; n < num_subglyphs; n++ ) - { - FT_Vector pp[4]; - - - /* Each time we call load_truetype_glyph in this loop, the */ - /* value of `gloader.base.subglyphs' can change due to table */ - /* reallocations. We thus need to recompute the subglyph */ - /* pointer on each iteration. */ - subglyph = gloader->base.subglyphs + num_base_subgs + n; - - pp[0] = loader->pp1; - pp[1] = loader->pp2; - pp[2] = loader->pp3; - pp[3] = loader->pp4; - - num_base_points = gloader->base.outline.n_points; - - error = load_truetype_glyph( loader, subglyph->index, - recurse_count + 1, FALSE ); - if ( error ) - goto Exit; - - /* restore subglyph pointer */ - subglyph = gloader->base.subglyphs + num_base_subgs + n; - - if ( !( subglyph->flags & USE_MY_METRICS ) ) - { - loader->pp1 = pp[0]; - loader->pp2 = pp[1]; - loader->pp3 = pp[2]; - loader->pp4 = pp[3]; - } - - num_points = gloader->base.outline.n_points; - - if ( num_points == num_base_points ) - continue; - - /* gloader->base.outline consists of three parts: */ - /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */ - /* */ - /* (1): exists from the beginning */ - /* (2): components that have been loaded so far */ - /* (3): the newly loaded component */ - TT_Process_Composite_Component( loader, subglyph, start_point, - num_base_points ); - } - - loader->stream = old_stream; - loader->byte_len = old_byte_len; - - /* process the glyph */ - loader->ins_pos = ins_pos; - if ( IS_HINTED( loader->load_flags ) && - -#ifdef TT_USE_BYTECODE_INTERPRETER - - subglyph->flags & WE_HAVE_INSTR && - -#endif - - num_points > start_point ) - TT_Process_Composite_Glyph( loader, start_point, start_contour ); - - } - } - else - { - /* invalid composite count (negative but not -1) */ - error = TT_Err_Invalid_Outline; - goto Exit; - } - - /***********************************************************************/ - /***********************************************************************/ - /***********************************************************************/ - - Exit: - - if ( opened_frame ) - face->forget_glyph_frame( loader ); - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - if ( glyph_data_loaded ) - face->root.internal->incremental_interface->funcs->free_glyph_data( - face->root.internal->incremental_interface->object, - &glyph_data ); - -#endif - - return error; - } - - - static FT_Error - compute_glyph_metrics( TT_Loader loader, - FT_UInt glyph_index ) - { - FT_BBox bbox; - TT_Face face = (TT_Face)loader->face; - FT_Fixed y_scale; - TT_GlyphSlot glyph = loader->glyph; - TT_Size size = (TT_Size)loader->size; - - - y_scale = 0x10000L; - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) - y_scale = size->root.metrics.y_scale; - - if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE ) - FT_Outline_Get_CBox( &glyph->outline, &bbox ); - else - bbox = loader->bbox; - - /* get the device-independent horizontal advance; it is scaled later */ - /* by the base layer. */ - { - FT_Pos advance = loader->linear; - - - /* the flag FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH was introduced to */ - /* correctly support DynaLab fonts, which have an incorrect */ - /* `advance_Width_Max' field! It is used, to my knowledge, */ - /* exclusively in the X-TrueType font server. */ - /* */ - if ( face->postscript.isFixedPitch && - ( loader->load_flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) == 0 ) - advance = face->horizontal.advance_Width_Max; - - /* we need to return the advance in font units in linearHoriAdvance, */ - /* it will be scaled later by the base layer. */ - glyph->linearHoriAdvance = advance; - } - - glyph->metrics.horiBearingX = bbox.xMin; - glyph->metrics.horiBearingY = bbox.yMax; - glyph->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; - - /* adjust advance width to the value contained in the hdmx table */ - if ( !face->postscript.isFixedPitch && - IS_HINTED( loader->load_flags ) ) - { - FT_Byte* widthp; - - - widthp = tt_face_get_device_metrics( face, - size->root.metrics.x_ppem, - glyph_index ); - - if ( widthp ) - glyph->metrics.horiAdvance = *widthp << 6; - } - - /* set glyph dimensions */ - glyph->metrics.width = bbox.xMax - bbox.xMin; - glyph->metrics.height = bbox.yMax - bbox.yMin; - - /* Now take care of vertical metrics. In the case where there is */ - /* no vertical information within the font (relatively common), */ - /* create some metrics manually */ - { - FT_Pos top; /* scaled vertical top side bearing */ - FT_Pos advance; /* scaled vertical advance height */ - - - /* Get the unscaled top bearing and advance height. */ - if ( face->vertical_info && - face->vertical.number_Of_VMetrics > 0 ) - { - top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax, - y_scale ); - - if ( loader->pp3.y <= loader->pp4.y ) - advance = 0; - else - advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y, - y_scale ); - } - else - { - FT_Pos height; - - - /* XXX Compute top side bearing and advance height in */ - /* Get_VMetrics instead of here. */ - - /* NOTE: The OS/2 values are the only `portable' ones, */ - /* which is why we use them, if there is an OS/2 */ - /* table in the font. Otherwise, we use the */ - /* values defined in the horizontal header. */ - - height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin, - y_scale ); - if ( face->os2.version != 0xFFFFU ) - advance = (FT_Pos)( face->os2.sTypoAscender - - face->os2.sTypoDescender ); - else - advance = (FT_Pos)( face->horizontal.Ascender - - face->horizontal.Descender ); - - top = ( advance - height ) / 2; - } - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - { - FT_Incremental_InterfaceRec* incr; - FT_Incremental_MetricsRec metrics; - FT_Error error; - - - incr = face->root.internal->incremental_interface; - - /* If this is an incrementally loaded font see if there are */ - /* overriding metrics for this glyph. */ - if ( incr && incr->funcs->get_glyph_metrics ) - { - metrics.bearing_x = 0; - metrics.bearing_y = top; - metrics.advance = advance; - - error = incr->funcs->get_glyph_metrics( incr->object, - glyph_index, - TRUE, - &metrics ); - if ( error ) - return error; - - top = metrics.bearing_y; - advance = metrics.advance; - } - } - - /* GWW: Do vertical metrics get loaded incrementally too? */ - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - glyph->linearVertAdvance = advance; - - /* scale the metrics */ - if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) - { - top = FT_MulFix( top, y_scale ); - advance = FT_MulFix( advance, y_scale ); - } - - /* XXX: for now, we have no better algorithm for the lsb, but it */ - /* should work fine. */ - /* */ - glyph->metrics.vertBearingX = glyph->metrics.horiBearingX - - glyph->metrics.horiAdvance / 2; - glyph->metrics.vertBearingY = top; - glyph->metrics.vertAdvance = advance; - } - - return 0; - } - - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - static FT_Error - load_sbit_image( TT_Size size, - TT_GlyphSlot glyph, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - TT_Face face; - SFNT_Service sfnt; - FT_Stream stream; - FT_Error error; - TT_SBit_MetricsRec metrics; - - - face = (TT_Face)glyph->face; - sfnt = (SFNT_Service)face->sfnt; - stream = face->root.stream; - - error = sfnt->load_sbit_image( face, - size->strike_index, - glyph_index, - (FT_Int)load_flags, - stream, - &glyph->bitmap, - &metrics ); - if ( !error ) - { - glyph->outline.n_points = 0; - glyph->outline.n_contours = 0; - - glyph->metrics.width = (FT_Pos)metrics.width << 6; - glyph->metrics.height = (FT_Pos)metrics.height << 6; - - glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6; - glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6; - glyph->metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6; - - glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6; - glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6; - glyph->metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6; - - glyph->format = FT_GLYPH_FORMAT_BITMAP; - - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - { - glyph->bitmap_left = metrics.vertBearingX; - glyph->bitmap_top = metrics.vertBearingY; - } - else - { - glyph->bitmap_left = metrics.horiBearingX; - glyph->bitmap_top = metrics.horiBearingY; - } - } - - return error; - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - - static FT_Error - tt_loader_init( TT_Loader loader, - TT_Size size, - TT_GlyphSlot glyph, - FT_Int32 load_flags, - FT_Bool glyf_table_only ) - { - TT_Face face; - FT_Stream stream; - - - face = (TT_Face)glyph->face; - stream = face->root.stream; - - FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) ); - -#ifdef TT_USE_BYTECODE_INTERPRETER - - /* load execution context */ - if ( IS_HINTED( load_flags ) && !glyf_table_only ) - { - TT_ExecContext exec; - FT_Bool grayscale; - - - if ( !size->cvt_ready ) - { - FT_Error error = tt_size_ready_bytecode( size ); - if ( error ) - return error; - } - - /* query new execution context */ - exec = size->debug ? size->context - : ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; - if ( !exec ) - return TT_Err_Could_Not_Find_Context; - - grayscale = - FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != FT_RENDER_MODE_MONO ); - - TT_Load_Context( exec, face, size ); - - /* a change from mono to grayscale rendering (and vice versa) */ - /* requires a re-execution of the CVT program */ - if ( grayscale != exec->grayscale ) - { - FT_UInt i; - - - exec->grayscale = grayscale; - - for ( i = 0; i < size->cvt_size; i++ ) - size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); - tt_size_run_prep( size ); - } - - /* see whether the cvt program has disabled hinting */ - if ( exec->GS.instruct_control & 1 ) - load_flags |= FT_LOAD_NO_HINTING; - - /* load default graphics state -- if needed */ - if ( exec->GS.instruct_control & 2 ) - exec->GS = tt_default_graphics_state; - - exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); - loader->exec = exec; - loader->instructions = exec->glyphIns; - } - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - /* seek to the beginning of the glyph table -- for Type 42 fonts */ - /* the table might be accessed from a Postscript stream or something */ - /* else... */ - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - if ( face->root.internal->incremental_interface ) - loader->glyf_offset = 0; - else - -#endif - - { - FT_Error error = face->goto_table( face, TTAG_glyf, stream, 0 ); - - - if ( error == TT_Err_Table_Missing ) - loader->glyf_offset = 0; - else if ( error ) - { - FT_ERROR(( "tt_loader_init: could not access glyph table\n" )); - return error; - } - else - loader->glyf_offset = FT_STREAM_POS(); - } - - /* get face's glyph loader */ - if ( !glyf_table_only ) - { - FT_GlyphLoader gloader = glyph->internal->loader; - - - FT_GlyphLoader_Rewind( gloader ); - loader->gloader = gloader; - } - - loader->load_flags = load_flags; - - loader->face = (FT_Face)face; - loader->size = (FT_Size)size; - loader->glyph = (FT_GlyphSlot)glyph; - loader->stream = stream; - - return TT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Load_Glyph */ - /* */ - /* <Description> */ - /* A function used to load a single glyph within a given glyph slot, */ - /* for a given size. */ - /* */ - /* <Input> */ - /* glyph :: A handle to a target slot object where the glyph */ - /* will be loaded. */ - /* */ - /* size :: A handle to the source face size at which the glyph */ - /* must be scaled/loaded. */ - /* */ - /* glyph_index :: The index of the glyph in the font file. */ - /* */ - /* load_flags :: A flag indicating what to load for this glyph. The */ - /* FT_LOAD_XXX constants can be used to control the */ - /* glyph loading process (e.g., whether the outline */ - /* should be scaled, whether to load bitmaps or not, */ - /* whether to hint the outline, etc). */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Load_Glyph( TT_Size size, - TT_GlyphSlot glyph, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - TT_Face face; - FT_Error error; - TT_LoaderRec loader; - - - face = (TT_Face)glyph->face; - error = TT_Err_Ok; - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - - /* try to load embedded bitmap if any */ - /* */ - /* XXX: The convention should be emphasized in */ - /* the documents because it can be confusing. */ - if ( size->strike_index != 0xFFFFFFFFUL && - ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) - { - error = load_sbit_image( size, glyph, glyph_index, load_flags ); - if ( !error ) - { - FT_Face root = &face->root; - - - if ( FT_IS_SCALABLE( root ) ) - { - /* for the bbox we need the header only */ - (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE ); - (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE ); - glyph->linearHoriAdvance = loader.linear; - glyph->linearVertAdvance = loader.top_bearing + loader.bbox.yMax - - loader.vadvance; - if ( face->postscript.isFixedPitch && - ( load_flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) == 0 ) - glyph->linearHoriAdvance = face->horizontal.advance_Width_Max; - } - - return TT_Err_Ok; - } - } - -#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - - /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */ - if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid ) - return TT_Err_Invalid_Size_Handle; - - if ( load_flags & FT_LOAD_SBITS_ONLY ) - return TT_Err_Invalid_Argument; - - error = tt_loader_init( &loader, size, glyph, load_flags, FALSE ); - if ( error ) - return error; - - glyph->format = FT_GLYPH_FORMAT_OUTLINE; - glyph->num_subglyphs = 0; - glyph->outline.flags = 0; - - /* main loading loop */ - error = load_truetype_glyph( &loader, glyph_index, 0, FALSE ); - if ( !error ) - { - if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE ) - { - glyph->num_subglyphs = loader.gloader->base.num_subglyphs; - glyph->subglyphs = loader.gloader->base.subglyphs; - } - else - { - glyph->outline = loader.gloader->base.outline; - glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS; - - /* Translate array so that (0,0) is the glyph's origin. Note */ - /* that this behaviour is independent on the value of bit 1 of */ - /* the `flags' field in the `head' table -- at least major */ - /* applications like Acroread indicate that. */ - if ( loader.pp1.x ) - FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 ); - } - -#ifdef TT_USE_BYTECODE_INTERPRETER - - if ( IS_HINTED( load_flags ) ) - { - if ( loader.exec->GS.scan_control ) - { - /* convert scan conversion mode to FT_OUTLINE_XXX flags */ - switch ( loader.exec->GS.scan_type ) - { - case 0: /* simple drop-outs including stubs */ - glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS; - break; - case 1: /* simple drop-outs excluding stubs */ - /* nothing; it's the default rendering mode */ - break; - case 4: /* smart drop-outs including stubs */ - glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS | - FT_OUTLINE_INCLUDE_STUBS; - break; - case 5: /* smart drop-outs excluding stubs */ - glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS; - break; - - default: /* no drop-out control */ - glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; - break; - } - } - else - glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; - } - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - compute_glyph_metrics( &loader, glyph_index ); - } - - /* Set the `high precision' bit flag. */ - /* This is _critical_ to get correct output for monochrome */ - /* TrueType glyphs at all sizes using the bytecode interpreter. */ - /* */ - if ( !( load_flags & FT_LOAD_NO_SCALE ) && - size->root.metrics.y_ppem < 24 ) - glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; - - return error; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttgload.h b/android/jni/ndk_modules/freetype/src/truetype/ttgload.h deleted file mode 100644 index 958d67d2..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttgload.h +++ /dev/null @@ -1,63 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttgload.h */ -/* */ -/* TrueType Glyph Loader (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTGLOAD_H__ -#define __TTGLOAD_H__ - - -#include <ft2build.h> -#include "ttobjs.h" - -#ifdef TT_USE_BYTECODE_INTERPRETER -#include "ttinterp.h" -#endif - - -FT_BEGIN_HEADER - - - FT_LOCAL( void ) - TT_Init_Glyph_Loading( TT_Face face ); - - FT_LOCAL( void ) - TT_Get_HMetrics( TT_Face face, - FT_UInt idx, - FT_Bool check, - FT_Short* lsb, - FT_UShort* aw ); - - FT_LOCAL( void ) - TT_Get_VMetrics( TT_Face face, - FT_UInt idx, - FT_Bool check, - FT_Short* tsb, - FT_UShort* ah ); - - FT_LOCAL( FT_Error ) - TT_Load_Glyph( TT_Size size, - TT_GlyphSlot glyph, - FT_UInt glyph_index, - FT_Int32 load_flags ); - - -FT_END_HEADER - -#endif /* __TTGLOAD_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttgxvar.c b/android/jni/ndk_modules/freetype/src/truetype/ttgxvar.c deleted file mode 100644 index 653d9d5c..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttgxvar.c +++ /dev/null @@ -1,1548 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttgxvar.c */ -/* */ -/* TrueType GX Font Variation loader */ -/* */ -/* Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ -/* David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at */ - /* */ - /* http://developer.apple.com/fonts/TTRefMan/RM06/Chap6[fgca]var.html */ - /* */ - /* The documentation for `fvar' is inconsistent. At one point it says */ - /* that `countSizePairs' should be 3, at another point 2. It should */ - /* be 2. */ - /* */ - /* The documentation for `gvar' is not intelligible; `cvar' refers you */ - /* to `gvar' and is thus also incomprehensible. */ - /* */ - /* The documentation for `avar' appears correct, but Apple has no fonts */ - /* with an `avar' table, so it is hard to test. */ - /* */ - /* Many thanks to John Jenkins (at Apple) in figuring this out. */ - /* */ - /* */ - /* Apple's `kern' table has some references to tuple indices, but as */ - /* there is no indication where these indices are defined, nor how to */ - /* interpolate the kerning values (different tuples have different */ - /* classes) this issue is ignored. */ - /* */ - /*************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_CONFIG_CONFIG_H -#include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_SFNT_H -#include FT_TRUETYPE_TAGS_H -#include FT_MULTIPLE_MASTERS_H - -#include "ttpload.h" -#include "ttgxvar.h" - -#include "tterrors.h" - - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - - -#define FT_Stream_FTell( stream ) \ - ( (stream)->cursor - (stream)->base ) -#define FT_Stream_SeekSet( stream, off ) \ - ( (stream)->cursor = (stream)->base+(off) ) - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttgxvar - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** Internal Routines *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'. It */ - /* indicates that there is a delta for every point without needing to */ - /* enumerate all of them. */ - /* */ -#define ALL_POINTS (FT_UShort*)( -1 ) - - -#define GX_PT_POINTS_ARE_WORDS 0x80 -#define GX_PT_POINT_RUN_COUNT_MASK 0x7F - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_var_readpackedpoints */ - /* */ - /* <Description> */ - /* Read a set of points to which the following deltas will apply. */ - /* Points are packed with a run length encoding. */ - /* */ - /* <Input> */ - /* stream :: The data stream. */ - /* */ - /* <Output> */ - /* point_cnt :: The number of points read. A zero value means that */ - /* all points in the glyph will be affected, without */ - /* enumerating them individually. */ - /* */ - /* <Return> */ - /* An array of FT_UShort containing the affected points or the */ - /* special value ALL_POINTS. */ - /* */ - static FT_UShort* - ft_var_readpackedpoints( FT_Stream stream, - FT_UInt *point_cnt ) - { - FT_UShort *points; - FT_Int n; - FT_Int runcnt; - FT_Int i; - FT_Int j; - FT_Int first; - FT_Memory memory = stream->memory; - FT_Error error = TT_Err_Ok; - - FT_UNUSED( error ); - - - *point_cnt = n = FT_GET_BYTE(); - if ( n == 0 ) - return ALL_POINTS; - - if ( n & GX_PT_POINTS_ARE_WORDS ) - n = FT_GET_BYTE() | ( ( n & GX_PT_POINT_RUN_COUNT_MASK ) << 8 ); - - if ( FT_NEW_ARRAY( points, n ) ) - return NULL; - - i = 0; - while ( i < n ) - { - runcnt = FT_GET_BYTE(); - if ( runcnt & GX_PT_POINTS_ARE_WORDS ) - { - runcnt = runcnt & GX_PT_POINT_RUN_COUNT_MASK; - first = points[i++] = FT_GET_USHORT(); - - if ( runcnt < 1 ) - goto Exit; - - /* first point not included in runcount */ - for ( j = 0; j < runcnt; ++j ) - points[i++] = (FT_UShort)( first += FT_GET_USHORT() ); - } - else - { - first = points[i++] = FT_GET_BYTE(); - - if ( runcnt < 1 ) - goto Exit; - - for ( j = 0; j < runcnt; ++j ) - points[i++] = (FT_UShort)( first += FT_GET_BYTE() ); - } - } - - Exit: - return points; - } - - - enum - { - GX_DT_DELTAS_ARE_ZERO = 0x80, - GX_DT_DELTAS_ARE_WORDS = 0x40, - GX_DT_DELTA_RUN_COUNT_MASK = 0x3F - }; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_var_readpackeddeltas */ - /* */ - /* <Description> */ - /* Read a set of deltas. These are packed slightly differently than */ - /* points. In particular there is no overall count. */ - /* */ - /* <Input> */ - /* stream :: The data stream. */ - /* */ - /* delta_cnt :: The number of to be read. */ - /* */ - /* <Return> */ - /* An array of FT_Short containing the deltas for the affected */ - /* points. (This only gets the deltas for one dimension. It will */ - /* generally be called twice, once for x, once for y. When used in */ - /* cvt table, it will only be called once.) */ - /* */ - static FT_Short* - ft_var_readpackeddeltas( FT_Stream stream, - FT_Offset delta_cnt ) - { - FT_Short *deltas = NULL; - FT_UInt runcnt; - FT_Offset i; - FT_UInt j; - FT_Memory memory = stream->memory; - FT_Error error = TT_Err_Ok; - - FT_UNUSED( error ); - - - if ( FT_NEW_ARRAY( deltas, delta_cnt ) ) - return NULL; - - i = 0; - while ( i < delta_cnt ) - { - runcnt = FT_GET_BYTE(); - if ( runcnt & GX_DT_DELTAS_ARE_ZERO ) - { - /* runcnt zeroes get added */ - for ( j = 0; - j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt; - ++j ) - deltas[i++] = 0; - } - else if ( runcnt & GX_DT_DELTAS_ARE_WORDS ) - { - /* runcnt shorts from the stack */ - for ( j = 0; - j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt; - ++j ) - deltas[i++] = FT_GET_SHORT(); - } - else - { - /* runcnt signed bytes from the stack */ - for ( j = 0; - j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt; - ++j ) - deltas[i++] = FT_GET_CHAR(); - } - - if ( j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) ) - { - /* Bad format */ - FT_FREE( deltas ); - return NULL; - } - } - - return deltas; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_var_load_avar */ - /* */ - /* <Description> */ - /* Parse the `avar' table if present. It need not be, so we return */ - /* nothing. */ - /* */ - /* <InOut> */ - /* face :: The font face. */ - /* */ - static void - ft_var_load_avar( TT_Face face ) - { - FT_Stream stream = FT_FACE_STREAM(face); - FT_Memory memory = stream->memory; - GX_Blend blend = face->blend; - GX_AVarSegment segment; - FT_Error error = TT_Err_Ok; - FT_ULong version; - FT_Long axisCount; - FT_Int i, j; - FT_ULong table_len; - - FT_UNUSED( error ); - - - blend->avar_checked = TRUE; - if ( (error = face->goto_table( face, TTAG_avar, stream, &table_len )) != 0 ) - return; - - if ( FT_FRAME_ENTER( table_len ) ) - return; - - version = FT_GET_LONG(); - axisCount = FT_GET_LONG(); - - if ( version != 0x00010000L || - axisCount != (FT_Long)blend->mmvar->num_axis ) - goto Exit; - - if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) ) - goto Exit; - - segment = &blend->avar_segment[0]; - for ( i = 0; i < axisCount; ++i, ++segment ) - { - segment->pairCount = FT_GET_USHORT(); - if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) ) - { - /* Failure. Free everything we have done so far. We must do */ - /* it right now since loading the `avar' table is optional. */ - - for ( j = i - 1; j >= 0; --j ) - FT_FREE( blend->avar_segment[j].correspondence ); - - FT_FREE( blend->avar_segment ); - blend->avar_segment = NULL; - goto Exit; - } - - for ( j = 0; j < segment->pairCount; ++j ) - { - segment->correspondence[j].fromCoord = - FT_GET_SHORT() << 2; /* convert to Fixed */ - segment->correspondence[j].toCoord = - FT_GET_SHORT()<<2; /* convert to Fixed */ - } - } - - Exit: - FT_FRAME_EXIT(); - } - - - typedef struct GX_GVar_Head_ - { - FT_Long version; - FT_UShort axisCount; - FT_UShort globalCoordCount; - FT_ULong offsetToCoord; - FT_UShort glyphCount; - FT_UShort flags; - FT_ULong offsetToData; - - } GX_GVar_Head; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_var_load_gvar */ - /* */ - /* <Description> */ - /* Parses the `gvar' table if present. If `fvar' is there, `gvar' */ - /* had better be there too. */ - /* */ - /* <InOut> */ - /* face :: The font face. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - ft_var_load_gvar( TT_Face face ) - { - FT_Stream stream = FT_FACE_STREAM(face); - FT_Memory memory = stream->memory; - GX_Blend blend = face->blend; - FT_Error error; - FT_UInt i, j; - FT_ULong table_len; - FT_ULong gvar_start; - FT_ULong offsetToData; - GX_GVar_Head gvar_head; - - static const FT_Frame_Field gvar_fields[] = - { - -#undef FT_STRUCTURE -#define FT_STRUCTURE GX_GVar_Head - - FT_FRAME_START( 20 ), - FT_FRAME_LONG ( version ), - FT_FRAME_USHORT( axisCount ), - FT_FRAME_USHORT( globalCoordCount ), - FT_FRAME_ULONG ( offsetToCoord ), - FT_FRAME_USHORT( glyphCount ), - FT_FRAME_USHORT( flags ), - FT_FRAME_ULONG ( offsetToData ), - FT_FRAME_END - }; - - if ( (error = face->goto_table( face, TTAG_gvar, stream, &table_len )) != 0 ) - goto Exit; - - gvar_start = FT_STREAM_POS( ); - if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) ) - goto Exit; - - blend->tuplecount = gvar_head.globalCoordCount; - blend->gv_glyphcnt = gvar_head.glyphCount; - offsetToData = gvar_start + gvar_head.offsetToData; - - if ( gvar_head.version != (FT_Long)0x00010000L || - gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis ) - { - error = TT_Err_Invalid_Table; - goto Exit; - } - - if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) ) - goto Exit; - - if ( gvar_head.flags & 1 ) - { - /* long offsets (one more offset than glyphs, to mark size of last) */ - if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) ) - goto Exit; - - for ( i = 0; i <= blend->gv_glyphcnt; ++i ) - blend->glyphoffsets[i] = offsetToData + FT_GET_LONG(); - - FT_FRAME_EXIT(); - } - else - { - /* short offsets (one more offset than glyphs, to mark size of last) */ - if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) ) - goto Exit; - - for ( i = 0; i <= blend->gv_glyphcnt; ++i ) - blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2; - /* XXX: Undocumented: `*2'! */ - - FT_FRAME_EXIT(); - } - - if ( blend->tuplecount != 0 ) - { - if ( FT_NEW_ARRAY( blend->tuplecoords, - gvar_head.axisCount * blend->tuplecount ) ) - goto Exit; - - if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord ) || - FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L ) ) - goto Exit; - - for ( i = 0; i < blend->tuplecount; ++i ) - for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; ++j ) - blend->tuplecoords[i * gvar_head.axisCount + j] = - FT_GET_SHORT() << 2; /* convert to FT_Fixed */ - - FT_FRAME_EXIT(); - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* ft_var_apply_tuple */ - /* */ - /* <Description> */ - /* Figure out whether a given tuple (design) applies to the current */ - /* blend, and if so, what is the scaling factor. */ - /* */ - /* <Input> */ - /* blend :: The current blend of the font. */ - /* */ - /* tupleIndex :: A flag saying whether this is an intermediate */ - /* tuple or not. */ - /* */ - /* tuple_coords :: The coordinates of the tuple in normalized axis */ - /* units. */ - /* */ - /* im_start_coords :: The initial coordinates where this tuple starts */ - /* to apply (for intermediate coordinates). */ - /* */ - /* im_end_coords :: The final coordinates after which this tuple no */ - /* longer applies (for intermediate coordinates). */ - /* */ - /* <Return> */ - /* An FT_Fixed value containing the scaling factor. */ - /* */ - static FT_Fixed - ft_var_apply_tuple( GX_Blend blend, - FT_UShort tupleIndex, - FT_Fixed* tuple_coords, - FT_Fixed* im_start_coords, - FT_Fixed* im_end_coords ) - { - FT_UInt i; - FT_Fixed apply; - FT_Fixed temp; - - - apply = 0x10000L; - for ( i = 0; i < blend->num_axis; ++i ) - { - if ( tuple_coords[i] == 0 ) - /* It's not clear why (for intermediate tuples) we don't need */ - /* to check against start/end -- the documentation says we don't. */ - /* Similarly, it's unclear why we don't need to scale along the */ - /* axis. */ - continue; - - else if ( blend->normalizedcoords[i] == 0 || - ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) || - ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) ) - { - apply = 0; - break; - } - - else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) ) - /* not an intermediate tuple */ - apply = FT_MulDiv( apply, - blend->normalizedcoords[i] > 0 - ? blend->normalizedcoords[i] - : -blend->normalizedcoords[i], - 0x10000L ); - - else if ( blend->normalizedcoords[i] <= im_start_coords[i] || - blend->normalizedcoords[i] >= im_end_coords[i] ) - { - apply = 0; - break; - } - - else if ( blend->normalizedcoords[i] < tuple_coords[i] ) - { - temp = FT_MulDiv( blend->normalizedcoords[i] - im_start_coords[i], - 0x10000L, - tuple_coords[i] - im_start_coords[i]); - apply = FT_MulDiv( apply, temp, 0x10000L ); - } - - else - { - temp = FT_MulDiv( im_end_coords[i] - blend->normalizedcoords[i], - 0x10000L, - im_end_coords[i] - tuple_coords[i] ); - apply = FT_MulDiv( apply, temp, 0x10000L ); - } - } - - return apply; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** MULTIPLE MASTERS SERVICE FUNCTIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - typedef struct GX_FVar_Head_ - { - FT_Long version; - FT_UShort offsetToData; - FT_UShort countSizePairs; - FT_UShort axisCount; - FT_UShort axisSize; - FT_UShort instanceCount; - FT_UShort instanceSize; - - } GX_FVar_Head; - - - typedef struct fvar_axis_ - { - FT_ULong axisTag; - FT_ULong minValue; - FT_ULong defaultValue; - FT_ULong maxValue; - FT_UShort flags; - FT_UShort nameID; - - } GX_FVar_Axis; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Get_MM_Var */ - /* */ - /* <Description> */ - /* Check that the font's `fvar' table is valid, parse it, and return */ - /* those data. */ - /* */ - /* <InOut> */ - /* face :: The font face. */ - /* TT_Get_MM_Var initializes the blend structure. */ - /* */ - /* <Output> */ - /* master :: The `fvar' data (must be freed by caller). */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Get_MM_Var( TT_Face face, - FT_MM_Var* *master ) - { - FT_Stream stream = face->root.stream; - FT_Memory memory = face->root.memory; - FT_ULong table_len; - FT_Error error = TT_Err_Ok; - FT_ULong fvar_start; - FT_Int i, j; - FT_MM_Var* mmvar; - FT_Fixed* next_coords; - FT_String* next_name; - FT_Var_Axis* a; - FT_Var_Named_Style* ns; - GX_FVar_Head fvar_head; - - static const FT_Frame_Field fvar_fields[] = - { - -#undef FT_STRUCTURE -#define FT_STRUCTURE GX_FVar_Head - - FT_FRAME_START( 16 ), - FT_FRAME_LONG ( version ), - FT_FRAME_USHORT( offsetToData ), - FT_FRAME_USHORT( countSizePairs ), - FT_FRAME_USHORT( axisCount ), - FT_FRAME_USHORT( axisSize ), - FT_FRAME_USHORT( instanceCount ), - FT_FRAME_USHORT( instanceSize ), - FT_FRAME_END - }; - - static const FT_Frame_Field fvaraxis_fields[] = - { - -#undef FT_STRUCTURE -#define FT_STRUCTURE GX_FVar_Axis - - FT_FRAME_START( 20 ), - FT_FRAME_ULONG ( axisTag ), - FT_FRAME_ULONG ( minValue ), - FT_FRAME_ULONG ( defaultValue ), - FT_FRAME_ULONG ( maxValue ), - FT_FRAME_USHORT( flags ), - FT_FRAME_USHORT( nameID ), - FT_FRAME_END - }; - - - if ( face->blend == NULL ) - { - /* both `fvar' and `gvar' must be present */ - if ( (error = face->goto_table( face, TTAG_gvar, - stream, &table_len )) != 0 ) - goto Exit; - - if ( (error = face->goto_table( face, TTAG_fvar, - stream, &table_len )) != 0 ) - goto Exit; - - fvar_start = FT_STREAM_POS( ); - - if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) ) - goto Exit; - - if ( fvar_head.version != (FT_Long)0x00010000L || - fvar_head.countSizePairs != 2 || - fvar_head.axisSize != 20 || - /* axisCount limit implied by 16-bit instanceSize */ - fvar_head.axisCount > 0x3FFE || - fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount || - /* instanceCount limit implied by limited range of name IDs */ - fvar_head.instanceCount > 0x7EFF || - fvar_head.offsetToData + fvar_head.axisCount * 20U + - fvar_head.instanceCount * fvar_head.instanceSize > table_len ) - { - error = TT_Err_Invalid_Table; - goto Exit; - } - - if ( FT_NEW( face->blend ) ) - goto Exit; - - /* cannot overflow 32-bit arithmetic because of limits above */ - face->blend->mmvar_len = - sizeof ( FT_MM_Var ) + - fvar_head.axisCount * sizeof ( FT_Var_Axis ) + - fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) + - fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) + - 5 * fvar_head.axisCount; - - if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) - goto Exit; - face->blend->mmvar = mmvar; - - mmvar->num_axis = - fvar_head.axisCount; - mmvar->num_designs = - (FT_UInt)-1; /* meaningless in this context; each glyph */ - /* may have a different number of designs */ - /* (or tuples, as called by Apple) */ - mmvar->num_namedstyles = - fvar_head.instanceCount; - mmvar->axis = - (FT_Var_Axis*)&(mmvar[1]); - mmvar->namedstyle = - (FT_Var_Named_Style*)&(mmvar->axis[fvar_head.axisCount]); - - next_coords = - (FT_Fixed*)&(mmvar->namedstyle[fvar_head.instanceCount]); - for ( i = 0; i < fvar_head.instanceCount; ++i ) - { - mmvar->namedstyle[i].coords = next_coords; - next_coords += fvar_head.axisCount; - } - - next_name = (FT_String*)next_coords; - for ( i = 0; i < fvar_head.axisCount; ++i ) - { - mmvar->axis[i].name = next_name; - next_name += 5; - } - - if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) ) - goto Exit; - - a = mmvar->axis; - for ( i = 0; i < fvar_head.axisCount; ++i ) - { - GX_FVar_Axis axis_rec; - - - if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) ) - goto Exit; - a->tag = axis_rec.axisTag; - a->minimum = axis_rec.minValue; /* A Fixed */ - a->def = axis_rec.defaultValue; /* A Fixed */ - a->maximum = axis_rec.maxValue; /* A Fixed */ - a->strid = axis_rec.nameID; - - a->name[0] = (FT_String)( a->tag >> 24 ); - a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF ); - a->name[2] = (FT_String)( ( a->tag >> 8 ) & 0xFF ); - a->name[3] = (FT_String)( ( a->tag ) & 0xFF ); - a->name[4] = 0; - - ++a; - } - - ns = mmvar->namedstyle; - for ( i = 0; i < fvar_head.instanceCount; ++i, ++ns ) - { - if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) ) - goto Exit; - - ns->strid = FT_GET_USHORT(); - (void) /* flags = */ FT_GET_USHORT(); - - for ( j = 0; j < fvar_head.axisCount; ++j ) - ns->coords[j] = FT_GET_ULONG(); /* A Fixed */ - - FT_FRAME_EXIT(); - } - } - - if ( master != NULL ) - { - FT_UInt n; - - - if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) - goto Exit; - FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len ); - - mmvar->axis = - (FT_Var_Axis*)&(mmvar[1]); - mmvar->namedstyle = - (FT_Var_Named_Style*)&(mmvar->axis[mmvar->num_axis]); - next_coords = - (FT_Fixed*)&(mmvar->namedstyle[mmvar->num_namedstyles]); - - for ( n = 0; n < mmvar->num_namedstyles; ++n ) - { - mmvar->namedstyle[n].coords = next_coords; - next_coords += mmvar->num_axis; - } - - a = mmvar->axis; - next_name = (FT_String*)next_coords; - for ( n = 0; n < mmvar->num_axis; ++n ) - { - a->name = next_name; - - /* standard PostScript names for some standard apple tags */ - if ( a->tag == TTAG_wght ) - a->name = (char *)"Weight"; - else if ( a->tag == TTAG_wdth ) - a->name = (char *)"Width"; - else if ( a->tag == TTAG_opsz ) - a->name = (char *)"OpticalSize"; - else if ( a->tag == TTAG_slnt ) - a->name = (char *)"Slant"; - - next_name += 5; - ++a; - } - - *master = mmvar; - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Set_MM_Blend */ - /* */ - /* <Description> */ - /* Set the blend (normalized) coordinates for this instance of the */ - /* font. Check that the `gvar' table is reasonable and does some */ - /* initial preparation. */ - /* */ - /* <InOut> */ - /* face :: The font. */ - /* Initialize the blend structure with `gvar' data. */ - /* */ - /* <Input> */ - /* num_coords :: Must be the axis count of the font. */ - /* */ - /* coords :: An array of num_coords, each between [-1,1]. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Set_MM_Blend( TT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ) - { - FT_Error error = TT_Err_Ok; - GX_Blend blend; - FT_MM_Var* mmvar; - FT_UInt i; - FT_Memory memory = face->root.memory; - - enum - { - mcvt_retain, - mcvt_modify, - mcvt_load - - } manageCvt; - - - face->doblend = FALSE; - - if ( face->blend == NULL ) - { - if ( (error = TT_Get_MM_Var( face, NULL)) != 0 ) - goto Exit; - } - - blend = face->blend; - mmvar = blend->mmvar; - - if ( num_coords != mmvar->num_axis ) - { - error = TT_Err_Invalid_Argument; - goto Exit; - } - - for ( i = 0; i < num_coords; ++i ) - if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L ) - { - error = TT_Err_Invalid_Argument; - goto Exit; - } - - if ( blend->glyphoffsets == NULL ) - if ( (error = ft_var_load_gvar( face )) != 0 ) - goto Exit; - - if ( blend->normalizedcoords == NULL ) - { - if ( FT_NEW_ARRAY( blend->normalizedcoords, num_coords ) ) - goto Exit; - - manageCvt = mcvt_modify; - - /* If we have not set the blend coordinates before this, then the */ - /* cvt table will still be what we read from the `cvt ' table and */ - /* we don't need to reload it. We may need to change it though... */ - } - else - { - manageCvt = mcvt_retain; - for ( i = 0; i < num_coords; ++i ) - { - if ( blend->normalizedcoords[i] != coords[i] ) - { - manageCvt = mcvt_load; - break; - } - } - - /* If we don't change the blend coords then we don't need to do */ - /* anything to the cvt table. It will be correct. Otherwise we */ - /* no longer have the original cvt (it was modified when we set */ - /* the blend last time), so we must reload and then modify it. */ - } - - blend->num_axis = num_coords; - FT_MEM_COPY( blend->normalizedcoords, - coords, - num_coords * sizeof ( FT_Fixed ) ); - - face->doblend = TRUE; - - if ( face->cvt != NULL ) - { - switch ( manageCvt ) - { - case mcvt_load: - /* The cvt table has been loaded already; every time we change the */ - /* blend we may need to reload and remodify the cvt table. */ - FT_FREE( face->cvt ); - face->cvt = NULL; - - tt_face_load_cvt( face, face->root.stream ); - break; - - case mcvt_modify: - /* The original cvt table is in memory. All we need to do is */ - /* apply the `cvar' table (if any). */ - tt_face_vary_cvt( face, face->root.stream ); - break; - - case mcvt_retain: - /* The cvt table is correct for this set of coordinates. */ - break; - } - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Set_Var_Design */ - /* */ - /* <Description> */ - /* Set the coordinates for the instance, measured in the user */ - /* coordinate system. Parse the `avar' table (if present) to convert */ - /* from user to normalized coordinates. */ - /* */ - /* <InOut> */ - /* face :: The font face. */ - /* Initialize the blend struct with `gvar' data. */ - /* */ - /* <Input> */ - /* num_coords :: This must be the axis count of the font. */ - /* */ - /* coords :: A coordinate array with `num_coords' elements. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Set_Var_Design( TT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ) - { - FT_Error error = TT_Err_Ok; - FT_Fixed* normalized = NULL; - GX_Blend blend; - FT_MM_Var* mmvar; - FT_UInt i, j; - FT_Var_Axis* a; - GX_AVarSegment av; - FT_Memory memory = face->root.memory; - - - if ( face->blend == NULL ) - { - if ( (error = TT_Get_MM_Var( face, NULL )) != 0 ) - goto Exit; - } - - blend = face->blend; - mmvar = blend->mmvar; - - if ( num_coords != mmvar->num_axis ) - { - error = TT_Err_Invalid_Argument; - goto Exit; - } - - /* Axis normalization is a two stage process. First we normalize */ - /* based on the [min,def,max] values for the axis to be [-1,0,1]. */ - /* Then, if there's an `avar' table, we renormalize this range. */ - - if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) ) - goto Exit; - - a = mmvar->axis; - for ( i = 0; i < mmvar->num_axis; ++i, ++a ) - { - if ( coords[i] > a->maximum || coords[i] < a->minimum ) - { - error = TT_Err_Invalid_Argument; - goto Exit; - } - - if ( coords[i] < a->def ) - { - normalized[i] = -FT_MulDiv( coords[i] - a->def, - 0x10000L, - a->minimum - a->def ); - } - else if ( a->maximum == a->def ) - normalized[i] = 0; - else - { - normalized[i] = FT_MulDiv( coords[i] - a->def, - 0x10000L, - a->maximum - a->def ); - } - } - - if ( !blend->avar_checked ) - ft_var_load_avar( face ); - - if ( blend->avar_segment != NULL ) - { - av = blend->avar_segment; - for ( i = 0; i < mmvar->num_axis; ++i, ++av ) - { - for ( j = 1; j < (FT_UInt)av->pairCount; ++j ) - if ( normalized[i] < av->correspondence[j].fromCoord ) - { - normalized[i] = - FT_MulDiv( - FT_MulDiv( - normalized[i] - av->correspondence[j - 1].fromCoord, - 0x10000L, - av->correspondence[j].fromCoord - - av->correspondence[j - 1].fromCoord ), - av->correspondence[j].toCoord - - av->correspondence[j - 1].toCoord, - 0x10000L ) + - av->correspondence[j - 1].toCoord; - break; - } - } - } - - error = TT_Set_MM_Blend( face, num_coords, normalized ); - - Exit: - FT_FREE( normalized ); - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GX VAR PARSING ROUTINES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_vary_cvt */ - /* */ - /* <Description> */ - /* Modify the loaded cvt table according to the `cvar' table and the */ - /* font's blend. */ - /* */ - /* <InOut> */ - /* face :: A handle to the target face object. */ - /* */ - /* <Input> */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* Most errors are ignored. It is perfectly valid not to have a */ - /* `cvar' table even if there is a `gvar' and `fvar' table. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_vary_cvt( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_Memory memory = stream->memory; - FT_ULong table_start; - FT_ULong table_len; - FT_UInt tupleCount; - FT_ULong offsetToData; - FT_ULong here; - FT_UInt i, j; - FT_Fixed* tuple_coords = NULL; - FT_Fixed* im_start_coords = NULL; - FT_Fixed* im_end_coords = NULL; - GX_Blend blend = face->blend; - FT_UInt point_count; - FT_UShort* localpoints; - FT_Short* deltas; - - - FT_TRACE2(( "CVAR " )); - - if ( blend == NULL ) - { - FT_TRACE2(( "tt_face_vary_cvt: no blend specified\n" )); - - error = TT_Err_Ok; - goto Exit; - } - - if ( face->cvt == NULL ) - { - FT_TRACE2(( "tt_face_vary_cvt: no `cvt ' table\n" )); - - error = TT_Err_Ok; - goto Exit; - } - - error = face->goto_table( face, TTAG_cvar, stream, &table_len ); - if ( error ) - { - FT_TRACE2(( "is missing\n" )); - - error = TT_Err_Ok; - goto Exit; - } - - if ( FT_FRAME_ENTER( table_len ) ) - { - error = TT_Err_Ok; - goto Exit; - } - - table_start = FT_Stream_FTell( stream ); - if ( FT_GET_LONG() != 0x00010000L ) - { - FT_TRACE2(( "bad table version\n" )); - - error = TT_Err_Ok; - goto FExit; - } - - if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || - FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || - FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) - goto FExit; - - tupleCount = FT_GET_USHORT(); - offsetToData = table_start + FT_GET_USHORT(); - - /* The documentation implies there are flags packed into the */ - /* tuplecount, but John Jenkins says that shared points don't apply */ - /* to `cvar', and no other flags are defined. */ - - for ( i = 0; i < ( tupleCount & 0xFFF ); ++i ) - { - FT_UInt tupleDataSize; - FT_UInt tupleIndex; - FT_Fixed apply; - - - tupleDataSize = FT_GET_USHORT(); - tupleIndex = FT_GET_USHORT(); - - /* There is no provision here for a global tuple coordinate section, */ - /* so John says. There are no tuple indices, just embedded tuples. */ - - if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) - { - for ( j = 0; j < blend->num_axis; ++j ) - tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from */ - /* short frac to fixed */ - } - else - { - /* skip this tuple; it makes no sense */ - - if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) - for ( j = 0; j < 2 * blend->num_axis; ++j ) - (void)FT_GET_SHORT(); - - offsetToData += tupleDataSize; - continue; - } - - if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) - { - for ( j = 0; j < blend->num_axis; ++j ) - im_start_coords[j] = FT_GET_SHORT() << 2; - for ( j = 0; j < blend->num_axis; ++j ) - im_end_coords[j] = FT_GET_SHORT() << 2; - } - - apply = ft_var_apply_tuple( blend, - (FT_UShort)tupleIndex, - tuple_coords, - im_start_coords, - im_end_coords ); - if ( /* tuple isn't active for our blend */ - apply == 0 || - /* global points not allowed, */ - /* if they aren't local, makes no sense */ - !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) ) - { - offsetToData += tupleDataSize; - continue; - } - - here = FT_Stream_FTell( stream ); - - FT_Stream_SeekSet( stream, offsetToData ); - - localpoints = ft_var_readpackedpoints( stream, &point_count ); - deltas = ft_var_readpackeddeltas( stream, - point_count == 0 ? face->cvt_size - : point_count ); - if ( localpoints == NULL || deltas == NULL ) - /* failure, ignore it */; - - else if ( localpoints == ALL_POINTS ) - { - /* this means that there are deltas for every entry in cvt */ - for ( j = 0; j < face->cvt_size; ++j ) - face->cvt[j] = (FT_Short)( face->cvt[j] + - FT_MulFix( deltas[j], apply ) ); - } - - else - { - for ( j = 0; j < point_count; ++j ) - { - int pindex = localpoints[j]; - - face->cvt[pindex] = (FT_Short)( face->cvt[pindex] + - FT_MulFix( deltas[j], apply ) ); - } - } - - if ( localpoints != ALL_POINTS ) - FT_FREE( localpoints ); - FT_FREE( deltas ); - - offsetToData += tupleDataSize; - - FT_Stream_SeekSet( stream, here ); - } - - FExit: - FT_FRAME_EXIT(); - - Exit: - FT_FREE( tuple_coords ); - FT_FREE( im_start_coords ); - FT_FREE( im_end_coords ); - - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Vary_Get_Glyph_Deltas */ - /* */ - /* <Description> */ - /* Load the appropriate deltas for the current glyph. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* glyph_index :: The index of the glyph being modified. */ - /* */ - /* n_points :: The number of the points in the glyph, including */ - /* phantom points. */ - /* */ - /* <Output> */ - /* deltas :: The array of points to change. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Vary_Get_Glyph_Deltas( TT_Face face, - FT_UInt glyph_index, - FT_Vector* *deltas, - FT_UInt n_points ) - { - FT_Stream stream = face->root.stream; - FT_Memory memory = stream->memory; - GX_Blend blend = face->blend; - FT_Vector* delta_xy; - - FT_Error error; - FT_ULong glyph_start; - FT_UInt tupleCount; - FT_ULong offsetToData; - FT_ULong here; - FT_UInt i, j; - FT_Fixed* tuple_coords = NULL; - FT_Fixed* im_start_coords = NULL; - FT_Fixed* im_end_coords = NULL; - FT_UInt point_count, spoint_count = 0; - FT_UShort* sharedpoints = NULL; - FT_UShort* localpoints = NULL; - FT_UShort* points; - FT_Short *deltas_x, *deltas_y; - - - if ( !face->doblend || blend == NULL ) - return TT_Err_Invalid_Argument; - - /* to be freed by the caller */ - if ( FT_NEW_ARRAY( delta_xy, n_points ) ) - goto Exit; - *deltas = delta_xy; - - if ( glyph_index >= blend->gv_glyphcnt || - blend->glyphoffsets[glyph_index] == - blend->glyphoffsets[glyph_index + 1] ) - return TT_Err_Ok; /* no variation data for this glyph */ - - if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] ) || - FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] - - blend->glyphoffsets[glyph_index] ) ) - goto Fail1; - - glyph_start = FT_Stream_FTell( stream ); - - /* each set of glyph variation data is formatted similarly to `cvar' */ - /* (except we get shared points and global tuples) */ - - if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || - FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || - FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) - goto Fail2; - - tupleCount = FT_GET_USHORT(); - offsetToData = glyph_start + FT_GET_USHORT(); - - if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS ) - { - here = FT_Stream_FTell( stream ); - - FT_Stream_SeekSet( stream, offsetToData ); - - sharedpoints = ft_var_readpackedpoints( stream, &spoint_count ); - offsetToData = FT_Stream_FTell( stream ); - - FT_Stream_SeekSet( stream, here ); - } - - for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); ++i ) - { - FT_UInt tupleDataSize; - FT_UInt tupleIndex; - FT_Fixed apply; - - - tupleDataSize = FT_GET_USHORT(); - tupleIndex = FT_GET_USHORT(); - - if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) - { - for ( j = 0; j < blend->num_axis; ++j ) - tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from */ - /* short frac to fixed */ - } - else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) - { - error = TT_Err_Invalid_Table; - goto Fail3; - } - else - { - FT_MEM_COPY( - tuple_coords, - &blend->tuplecoords[(tupleIndex & 0xFFF) * blend->num_axis], - blend->num_axis * sizeof ( FT_Fixed ) ); - } - - if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) - { - for ( j = 0; j < blend->num_axis; ++j ) - im_start_coords[j] = FT_GET_SHORT() << 2; - for ( j = 0; j < blend->num_axis; ++j ) - im_end_coords[j] = FT_GET_SHORT() << 2; - } - - apply = ft_var_apply_tuple( blend, - (FT_UShort)tupleIndex, - tuple_coords, - im_start_coords, - im_end_coords ); - - if ( apply == 0 ) /* tuple isn't active for our blend */ - { - offsetToData += tupleDataSize; - continue; - } - - here = FT_Stream_FTell( stream ); - - if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) - { - FT_Stream_SeekSet( stream, offsetToData ); - - localpoints = ft_var_readpackedpoints( stream, &point_count ); - points = localpoints; - } - else - { - points = sharedpoints; - point_count = spoint_count; - } - - deltas_x = ft_var_readpackeddeltas( stream, - point_count == 0 ? n_points - : point_count ); - deltas_y = ft_var_readpackeddeltas( stream, - point_count == 0 ? n_points - : point_count ); - - if ( points == NULL || deltas_y == NULL || deltas_x == NULL ) - ; /* failure, ignore it */ - - else if ( points == ALL_POINTS ) - { - /* this means that there are deltas for every point in the glyph */ - for ( j = 0; j < n_points; ++j ) - { - delta_xy[j].x += FT_MulFix( deltas_x[j], apply ); - delta_xy[j].y += FT_MulFix( deltas_y[j], apply ); - } - } - - else - { - for ( j = 0; j < point_count; ++j ) - { - delta_xy[localpoints[j]].x += FT_MulFix( deltas_x[j], apply ); - delta_xy[localpoints[j]].y += FT_MulFix( deltas_y[j], apply ); - } - } - - if ( localpoints != ALL_POINTS ) - FT_FREE( localpoints ); - FT_FREE( deltas_x ); - FT_FREE( deltas_y ); - - offsetToData += tupleDataSize; - - FT_Stream_SeekSet( stream, here ); - } - - Fail3: - FT_FREE( tuple_coords ); - FT_FREE( im_start_coords ); - FT_FREE( im_end_coords ); - - Fail2: - FT_FRAME_EXIT(); - - Fail1: - if ( error ) - { - FT_FREE( delta_xy ); - *deltas = NULL; - } - - Exit: - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_done_blend */ - /* */ - /* <Description> */ - /* Frees the blend internal data structure. */ - /* */ - FT_LOCAL_DEF( void ) - tt_done_blend( FT_Memory memory, - GX_Blend blend ) - { - if ( blend != NULL ) - { - FT_UInt i; - - - FT_FREE( blend->normalizedcoords ); - FT_FREE( blend->mmvar ); - - if ( blend->avar_segment != NULL ) - { - for ( i = 0; i < blend->num_axis; ++i ) - FT_FREE( blend->avar_segment[i].correspondence ); - FT_FREE( blend->avar_segment ); - } - - FT_FREE( blend->tuplecoords ); - FT_FREE( blend->glyphoffsets ); - FT_FREE( blend ); - } - } - -#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttgxvar.h b/android/jni/ndk_modules/freetype/src/truetype/ttgxvar.h deleted file mode 100644 index 82dfc443..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttgxvar.h +++ /dev/null @@ -1,182 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttgxvar.h */ -/* */ -/* TrueType GX Font Variation loader (specification) */ -/* */ -/* Copyright 2004 by */ -/* David Turner, Robert Wilhelm, Werner Lemberg and George Williams. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTGXVAR_H__ -#define __TTGXVAR_H__ - - -#include <ft2build.h> -#include "ttobjs.h" - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* GX_AVarCorrespondenceRec */ - /* */ - /* <Description> */ - /* A data structure representing `shortFracCorrespondence' in `avar' */ - /* table according to the specifications from Apple. */ - /* */ - typedef struct GX_AVarCorrespondenceRec_ - { - FT_Fixed fromCoord; - FT_Fixed toCoord; - - } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* GX_AVarRec */ - /* */ - /* <Description> */ - /* Data from the segment field of `avar' table. */ - /* There is one of these for each axis. */ - /* */ - typedef struct GX_AVarSegmentRec_ - { - FT_UShort pairCount; - GX_AVarCorrespondence correspondence; /* array with pairCount entries */ - - } GX_AVarSegmentRec, *GX_AVarSegment; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* GX_BlendRec */ - /* */ - /* <Description> */ - /* Data for interpolating a font from a distortable font specified */ - /* by the GX *var tables ([fgca]var). */ - /* */ - /* <Fields> */ - /* num_axis :: The number of axes along which interpolation */ - /* may happen */ - /* */ - /* normalizedcoords :: A normalized value (between [-1,1]) indicating */ - /* the contribution along each axis to the final */ - /* interpolated font. */ - /* */ - typedef struct GX_BlendRec_ - { - FT_UInt num_axis; - FT_Fixed* normalizedcoords; - - FT_MM_Var* mmvar; - FT_Offset mmvar_len; - - FT_Bool avar_checked; - GX_AVarSegment avar_segment; - - FT_UInt tuplecount; /* shared tuples in `gvar' */ - FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */ - - FT_UInt gv_glyphcnt; - FT_ULong* glyphoffsets; - - } GX_BlendRec; - - - /*************************************************************************/ - /* */ - /* <enum> */ - /* GX_TupleCountFlags */ - /* */ - /* <Description> */ - /* Flags used within the `TupleCount' field of the `gvar' table. */ - /* */ - typedef enum GX_TupleCountFlags_ - { - GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000, - GX_TC_RESERVED_TUPLE_FLAGS = 0x7000, - GX_TC_TUPLE_COUNT_MASK = 0x0FFF - - } GX_TupleCountFlags; - - - /*************************************************************************/ - /* */ - /* <enum> */ - /* GX_TupleIndexFlags */ - /* */ - /* <Description> */ - /* Flags used within the `TupleIndex' field of the `gvar' and `cvar' */ - /* tables. */ - /* */ - typedef enum GX_TupleIndexFlags_ - { - GX_TI_EMBEDDED_TUPLE_COORD = 0x8000, - GX_TI_INTERMEDIATE_TUPLE = 0x4000, - GX_TI_PRIVATE_POINT_NUMBERS = 0x2000, - GX_TI_RESERVED_TUPLE_FLAG = 0x1000, - GX_TI_TUPLE_INDEX_MASK = 0x0FFF - - } GX_TupleIndexFlags; - - -#define TTAG_wght FT_MAKE_TAG( 'w', 'g', 'h', 't' ) -#define TTAG_wdth FT_MAKE_TAG( 'w', 'd', 't', 'h' ) -#define TTAG_opsz FT_MAKE_TAG( 'o', 'p', 's', 'z' ) -#define TTAG_slnt FT_MAKE_TAG( 's', 'l', 'n', 't' ) - - - FT_LOCAL( FT_Error ) - TT_Set_MM_Blend( TT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - FT_LOCAL( FT_Error ) - TT_Set_Var_Design( TT_Face face, - FT_UInt num_coords, - FT_Fixed* coords ); - - FT_LOCAL( FT_Error ) - TT_Get_MM_Var( TT_Face face, - FT_MM_Var* *master ); - - - FT_LOCAL( FT_Error ) - tt_face_vary_cvt( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - TT_Vary_Get_Glyph_Deltas( TT_Face face, - FT_UInt glyph_index, - FT_Vector* *deltas, - FT_UInt n_points ); - - - FT_LOCAL( void ) - tt_done_blend( FT_Memory memory, - GX_Blend blend ); - - -FT_END_HEADER - - -#endif /* __TTGXVAR_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttinterp.c b/android/jni/ndk_modules/freetype/src/truetype/ttinterp.c deleted file mode 100644 index d22e94f5..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttinterp.c +++ /dev/null @@ -1,8138 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttinterp.c */ -/* */ -/* TrueType bytecode interpreter (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ -/* 2010 */ -/* by David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_CALC_H -#include FT_TRIGONOMETRY_H -#include FT_SYSTEM_H - -#include "ttinterp.h" - -#include "tterrors.h" - - -#ifdef TT_USE_BYTECODE_INTERPRETER - - -#define TT_MULFIX FT_MulFix -#define TT_MULDIV FT_MulDiv -#define TT_MULDIV_NO_ROUND FT_MulDiv_No_Round - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttinterp - - /*************************************************************************/ - /* */ - /* In order to detect infinite loops in the code, we set up a counter */ - /* within the run loop. A single stroke of interpretation is now */ - /* limited to a maximal number of opcodes defined below. */ - /* */ -#define MAX_RUNNABLE_OPCODES 1000000L - - - /*************************************************************************/ - /* */ - /* There are two kinds of implementations: */ - /* */ - /* a. static implementation */ - /* */ - /* The current execution context is a static variable, which fields */ - /* are accessed directly by the interpreter during execution. The */ - /* context is named `cur'. */ - /* */ - /* This version is non-reentrant, of course. */ - /* */ - /* b. indirect implementation */ - /* */ - /* The current execution context is passed to _each_ function as its */ - /* first argument, and each field is thus accessed indirectly. */ - /* */ - /* This version is fully re-entrant. */ - /* */ - /* The idea is that an indirect implementation may be slower to execute */ - /* on low-end processors that are used in some systems (like 386s or */ - /* even 486s). */ - /* */ - /* As a consequence, the indirect implementation is now the default, as */ - /* its performance costs can be considered negligible in our context. */ - /* Note, however, that we kept the same source with macros because: */ - /* */ - /* - The code is kept very close in design to the Pascal code used for */ - /* development. */ - /* */ - /* - It's much more readable that way! */ - /* */ - /* - It's still open to experimentation and tuning. */ - /* */ - /*************************************************************************/ - - -#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */ - -#define CUR (*exc) /* see ttobjs.h */ - - /*************************************************************************/ - /* */ - /* This macro is used whenever `exec' is unused in a function, to avoid */ - /* stupid warnings from pedantic compilers. */ - /* */ -#define FT_UNUSED_EXEC FT_UNUSED( exc ) - -#else /* static implementation */ - -#define CUR cur - -#define FT_UNUSED_EXEC int __dummy = __dummy - - static - TT_ExecContextRec cur; /* static exec. context variable */ - - /* apparently, we have a _lot_ of direct indexing when accessing */ - /* the static `cur', which makes the code bigger (due to all the */ - /* four bytes addresses). */ - -#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */ - - - /*************************************************************************/ - /* */ - /* The instruction argument stack. */ - /* */ -#define INS_ARG EXEC_OP_ FT_Long* args /* see ttobjs.h for EXEC_OP_ */ - - - /*************************************************************************/ - /* */ - /* This macro is used whenever `args' is unused in a function, to avoid */ - /* stupid warnings from pedantic compilers. */ - /* */ -#define FT_UNUSED_ARG FT_UNUSED_EXEC; FT_UNUSED( args ) - - - /*************************************************************************/ - /* */ - /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to */ - /* increase readability of the code. */ - /* */ - /*************************************************************************/ - - -#define SKIP_Code() \ - SkipCode( EXEC_ARG ) - -#define GET_ShortIns() \ - GetShortIns( EXEC_ARG ) - -#define NORMalize( x, y, v ) \ - Normalize( EXEC_ARG_ x, y, v ) - -#define SET_SuperRound( scale, flags ) \ - SetSuperRound( EXEC_ARG_ scale, flags ) - -#define ROUND_None( d, c ) \ - Round_None( EXEC_ARG_ d, c ) - -#define INS_Goto_CodeRange( range, ip ) \ - Ins_Goto_CodeRange( EXEC_ARG_ range, ip ) - -#define CUR_Func_move( z, p, d ) \ - CUR.func_move( EXEC_ARG_ z, p, d ) - -#define CUR_Func_move_orig( z, p, d ) \ - CUR.func_move_orig( EXEC_ARG_ z, p, d ) - -#define CUR_Func_round( d, c ) \ - CUR.func_round( EXEC_ARG_ d, c ) - -#define CUR_Func_read_cvt( index ) \ - CUR.func_read_cvt( EXEC_ARG_ index ) - -#define CUR_Func_write_cvt( index, val ) \ - CUR.func_write_cvt( EXEC_ARG_ index, val ) - -#define CUR_Func_move_cvt( index, val ) \ - CUR.func_move_cvt( EXEC_ARG_ index, val ) - -#define CURRENT_Ratio() \ - Current_Ratio( EXEC_ARG ) - -#define CURRENT_Ppem() \ - Current_Ppem( EXEC_ARG ) - -#define CUR_Ppem() \ - Cur_PPEM( EXEC_ARG ) - -#define INS_SxVTL( a, b, c, d ) \ - Ins_SxVTL( EXEC_ARG_ a, b, c, d ) - -#define COMPUTE_Funcs() \ - Compute_Funcs( EXEC_ARG ) - -#define COMPUTE_Round( a ) \ - Compute_Round( EXEC_ARG_ a ) - -#define COMPUTE_Point_Displacement( a, b, c, d ) \ - Compute_Point_Displacement( EXEC_ARG_ a, b, c, d ) - -#define MOVE_Zp2_Point( a, b, c, t ) \ - Move_Zp2_Point( EXEC_ARG_ a, b, c, t ) - - -#define CUR_Func_project( v1, v2 ) \ - CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y ) - -#define CUR_Func_dualproj( v1, v2 ) \ - CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y ) - -#define CUR_fast_project( v ) \ - CUR.func_project( EXEC_ARG_ (v)->x, (v)->y ) - -#define CUR_fast_dualproj( v ) \ - CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y ) - - - /*************************************************************************/ - /* */ - /* Instruction dispatch function, as used by the interpreter. */ - /* */ - typedef void (*TInstruction_Function)( INS_ARG ); - - - /*************************************************************************/ - /* */ - /* Two simple bounds-checking macros. */ - /* */ -#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) ) -#define BOUNDSL( x, n ) ( (FT_ULong)(x) >= (FT_ULong)(n) ) - -#undef SUCCESS -#define SUCCESS 0 - -#undef FAILURE -#define FAILURE 1 - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING -#define GUESS_VECTOR( V ) \ - if ( CUR.face->unpatented_hinting ) \ - { \ - CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \ - CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \ - } -#else -#define GUESS_VECTOR( V ) -#endif - - /*************************************************************************/ - /* */ - /* CODERANGE FUNCTIONS */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Goto_CodeRange */ - /* */ - /* <Description> */ - /* Switches to a new code range (updates the code related elements in */ - /* `exec', and `IP'). */ - /* */ - /* <Input> */ - /* range :: The new execution code range. */ - /* */ - /* IP :: The new IP in the new code range. */ - /* */ - /* <InOut> */ - /* exec :: The target execution context. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Goto_CodeRange( TT_ExecContext exec, - FT_Int range, - FT_Long IP ) - { - TT_CodeRange* coderange; - - - FT_ASSERT( range >= 1 && range <= 3 ); - - coderange = &exec->codeRangeTable[range - 1]; - - FT_ASSERT( coderange->base != NULL ); - - /* NOTE: Because the last instruction of a program may be a CALL */ - /* which will return to the first byte *after* the code */ - /* range, we test for IP <= Size instead of IP < Size. */ - /* */ - FT_ASSERT( (FT_ULong)IP <= coderange->size ); - - exec->code = coderange->base; - exec->codeSize = coderange->size; - exec->IP = IP; - exec->curRange = range; - - return TT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Set_CodeRange */ - /* */ - /* <Description> */ - /* Sets a code range. */ - /* */ - /* <Input> */ - /* range :: The code range index. */ - /* */ - /* base :: The new code base. */ - /* */ - /* length :: The range size in bytes. */ - /* */ - /* <InOut> */ - /* exec :: The target execution context. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Set_CodeRange( TT_ExecContext exec, - FT_Int range, - void* base, - FT_Long length ) - { - FT_ASSERT( range >= 1 && range <= 3 ); - - exec->codeRangeTable[range - 1].base = (FT_Byte*)base; - exec->codeRangeTable[range - 1].size = length; - - return TT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Clear_CodeRange */ - /* */ - /* <Description> */ - /* Clears a code range. */ - /* */ - /* <Input> */ - /* range :: The code range index. */ - /* */ - /* <InOut> */ - /* exec :: The target execution context. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* Does not set the Error variable. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Clear_CodeRange( TT_ExecContext exec, - FT_Int range ) - { - FT_ASSERT( range >= 1 && range <= 3 ); - - exec->codeRangeTable[range - 1].base = NULL; - exec->codeRangeTable[range - 1].size = 0; - - return TT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* EXECUTION CONTEXT ROUTINES */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Done_Context */ - /* */ - /* <Description> */ - /* Destroys a given context. */ - /* */ - /* <Input> */ - /* exec :: A handle to the target execution context. */ - /* */ - /* memory :: A handle to the parent memory object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* Only the glyph loader and debugger should call this function. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Done_Context( TT_ExecContext exec ) - { - FT_Memory memory = exec->memory; - - - /* points zone */ - exec->maxPoints = 0; - exec->maxContours = 0; - - /* free stack */ - FT_FREE( exec->stack ); - exec->stackSize = 0; - - /* free call stack */ - FT_FREE( exec->callStack ); - exec->callSize = 0; - exec->callTop = 0; - - /* free glyph code range */ - FT_FREE( exec->glyphIns ); - exec->glyphSize = 0; - - exec->size = NULL; - exec->face = NULL; - - FT_FREE( exec ); - - return TT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Init_Context */ - /* */ - /* <Description> */ - /* Initializes a context object. */ - /* */ - /* <Input> */ - /* memory :: A handle to the parent memory object. */ - /* */ - /* <InOut> */ - /* exec :: A handle to the target execution context. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - static FT_Error - Init_Context( TT_ExecContext exec, - FT_Memory memory ) - { - FT_Error error; - - - FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec )); - - exec->memory = memory; - exec->callSize = 32; - - if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) ) - goto Fail_Memory; - - /* all values in the context are set to 0 already, but this is */ - /* here as a remainder */ - exec->maxPoints = 0; - exec->maxContours = 0; - - exec->stackSize = 0; - exec->glyphSize = 0; - - exec->stack = NULL; - exec->glyphIns = NULL; - - exec->face = NULL; - exec->size = NULL; - - return TT_Err_Ok; - - Fail_Memory: - FT_ERROR(( "Init_Context: not enough memory for 0x%08lx\n", - (FT_Long)exec )); - TT_Done_Context( exec ); - - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Update_Max */ - /* */ - /* <Description> */ - /* Checks the size of a buffer and reallocates it if necessary. */ - /* */ - /* <Input> */ - /* memory :: A handle to the parent memory object. */ - /* */ - /* multiplier :: The size in bytes of each element in the buffer. */ - /* */ - /* new_max :: The new capacity (size) of the buffer. */ - /* */ - /* <InOut> */ - /* size :: The address of the buffer's current size expressed */ - /* in elements. */ - /* */ - /* buff :: The address of the buffer base pointer. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - Update_Max( FT_Memory memory, - FT_ULong* size, - FT_Long multiplier, - void* _pbuff, - FT_ULong new_max ) - { - FT_Error error; - void** pbuff = (void**)_pbuff; - - - if ( *size < new_max ) - { - if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) ) - return error; - *size = new_max; - } - - return TT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Load_Context */ - /* */ - /* <Description> */ - /* Prepare an execution context for glyph hinting. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* size :: A handle to the source size object. */ - /* */ - /* <InOut> */ - /* exec :: A handle to the target execution context. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* Only the glyph loader and debugger should call this function. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Load_Context( TT_ExecContext exec, - TT_Face face, - TT_Size size ) - { - FT_Int i; - FT_ULong tmp; - TT_MaxProfile* maxp; - FT_Error error; - - - exec->face = face; - maxp = &face->max_profile; - exec->size = size; - - if ( size ) - { - exec->numFDefs = size->num_function_defs; - exec->maxFDefs = size->max_function_defs; - exec->numIDefs = size->num_instruction_defs; - exec->maxIDefs = size->max_instruction_defs; - exec->FDefs = size->function_defs; - exec->IDefs = size->instruction_defs; - exec->tt_metrics = size->ttmetrics; - exec->metrics = size->metrics; - - exec->maxFunc = size->max_func; - exec->maxIns = size->max_ins; - - for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) - exec->codeRangeTable[i] = size->codeRangeTable[i]; - - /* set graphics state */ - exec->GS = size->GS; - - exec->cvtSize = size->cvt_size; - exec->cvt = size->cvt; - - exec->storeSize = size->storage_size; - exec->storage = size->storage; - - exec->twilight = size->twilight; - } - - /* XXX: We reserve a little more elements on the stack to deal safely */ - /* with broken fonts like arialbs, courbs, timesbs, etc. */ - tmp = exec->stackSize; - error = Update_Max( exec->memory, - &tmp, - sizeof ( FT_F26Dot6 ), - (void*)&exec->stack, - maxp->maxStackElements + 32 ); - exec->stackSize = (FT_UInt)tmp; - if ( error ) - return error; - - tmp = exec->glyphSize; - error = Update_Max( exec->memory, - &tmp, - sizeof ( FT_Byte ), - (void*)&exec->glyphIns, - maxp->maxSizeOfInstructions ); - exec->glyphSize = (FT_UShort)tmp; - if ( error ) - return error; - - exec->pts.n_points = 0; - exec->pts.n_contours = 0; - - exec->zp1 = exec->pts; - exec->zp2 = exec->pts; - exec->zp0 = exec->pts; - - exec->instruction_trap = FALSE; - - return TT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Save_Context */ - /* */ - /* <Description> */ - /* Saves the code ranges in a `size' object. */ - /* */ - /* <Input> */ - /* exec :: A handle to the source execution context. */ - /* */ - /* <InOut> */ - /* size :: A handle to the target size object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* Only the glyph loader and debugger should call this function. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Save_Context( TT_ExecContext exec, - TT_Size size ) - { - FT_Int i; - - - /* XXXX: Will probably disappear soon with all the code range */ - /* management, which is now rather obsolete. */ - /* */ - size->num_function_defs = exec->numFDefs; - size->num_instruction_defs = exec->numIDefs; - - size->max_func = exec->maxFunc; - size->max_ins = exec->maxIns; - - for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) - size->codeRangeTable[i] = exec->codeRangeTable[i]; - - return TT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Run_Context */ - /* */ - /* <Description> */ - /* Executes one or more instructions in the execution context. */ - /* */ - /* <Input> */ - /* debug :: A Boolean flag. If set, the function sets some internal */ - /* variables and returns immediately, otherwise TT_RunIns() */ - /* is called. */ - /* */ - /* This is commented out currently. */ - /* */ - /* <Input> */ - /* exec :: A handle to the target execution context. */ - /* */ - /* <Return> */ - /* TrueType error code. 0 means success. */ - /* */ - /* <Note> */ - /* Only the glyph loader and debugger should call this function. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Run_Context( TT_ExecContext exec, - FT_Bool debug ) - { - FT_Error error; - - - if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) ) - != TT_Err_Ok ) - return error; - - exec->zp0 = exec->pts; - exec->zp1 = exec->pts; - exec->zp2 = exec->pts; - - exec->GS.gep0 = 1; - exec->GS.gep1 = 1; - exec->GS.gep2 = 1; - - exec->GS.projVector.x = 0x4000; - exec->GS.projVector.y = 0x0000; - - exec->GS.freeVector = exec->GS.projVector; - exec->GS.dualVector = exec->GS.projVector; - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - exec->GS.both_x_axis = TRUE; -#endif - - exec->GS.round_state = 1; - exec->GS.loop = 1; - - /* some glyphs leave something on the stack. so we clean it */ - /* before a new execution. */ - exec->top = 0; - exec->callTop = 0; - -#if 1 - FT_UNUSED( debug ); - - return exec->face->interpreter( exec ); -#else - if ( !debug ) - return TT_RunIns( exec ); - else - return TT_Err_Ok; -#endif - } - - - /* The default value for `scan_control' is documented as FALSE in the */ - /* TrueType specification. This is confusing since it implies a */ - /* Boolean value. However, this is not the case, thus both the */ - /* default values of our `scan_type' and `scan_control' fields (which */ - /* the documentation's `scan_control' variable is split into) are */ - /* zero. */ - - const TT_GraphicsState tt_default_graphics_state = - { - 0, 0, 0, - { 0x4000, 0 }, - { 0x4000, 0 }, - { 0x4000, 0 }, - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - TRUE, -#endif - - 1, 64, 1, - TRUE, 68, 0, 0, 9, 3, - 0, FALSE, 0, 1, 1, 1 - }; - - - /* documentation is in ttinterp.h */ - - FT_EXPORT_DEF( TT_ExecContext ) - TT_New_Context( TT_Driver driver ) - { - TT_ExecContext exec; - FT_Memory memory; - - - memory = driver->root.root.memory; - exec = driver->context; - - if ( !driver->context ) - { - FT_Error error; - - - /* allocate object */ - if ( FT_NEW( exec ) ) - goto Fail; - - /* initialize it; in case of error this deallocates `exec' too */ - error = Init_Context( exec, memory ); - if ( error ) - goto Fail; - - /* store it into the driver */ - driver->context = exec; - } - - return driver->context; - - Fail: - return NULL; - } - - - /*************************************************************************/ - /* */ - /* Before an opcode is executed, the interpreter verifies that there are */ - /* enough arguments on the stack, with the help of the `Pop_Push_Count' */ - /* table. */ - /* */ - /* For each opcode, the first column gives the number of arguments that */ - /* are popped from the stack; the second one gives the number of those */ - /* that are pushed in result. */ - /* */ - /* Opcodes which have a varying number of parameters in the data stream */ - /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */ - /* the `opcode_length' table, and the value in `Pop_Push_Count' is set */ - /* to zero. */ - /* */ - /*************************************************************************/ - - -#undef PACK -#define PACK( x, y ) ( ( x << 4 ) | y ) - - - static - const FT_Byte Pop_Push_Count[256] = - { - /* opcodes are gathered in groups of 16 */ - /* please keep the spaces as they are */ - - /* SVTCA y */ PACK( 0, 0 ), - /* SVTCA x */ PACK( 0, 0 ), - /* SPvTCA y */ PACK( 0, 0 ), - /* SPvTCA x */ PACK( 0, 0 ), - /* SFvTCA y */ PACK( 0, 0 ), - /* SFvTCA x */ PACK( 0, 0 ), - /* SPvTL // */ PACK( 2, 0 ), - /* SPvTL + */ PACK( 2, 0 ), - /* SFvTL // */ PACK( 2, 0 ), - /* SFvTL + */ PACK( 2, 0 ), - /* SPvFS */ PACK( 2, 0 ), - /* SFvFS */ PACK( 2, 0 ), - /* GPV */ PACK( 0, 2 ), - /* GFV */ PACK( 0, 2 ), - /* SFvTPv */ PACK( 0, 0 ), - /* ISECT */ PACK( 5, 0 ), - - /* SRP0 */ PACK( 1, 0 ), - /* SRP1 */ PACK( 1, 0 ), - /* SRP2 */ PACK( 1, 0 ), - /* SZP0 */ PACK( 1, 0 ), - /* SZP1 */ PACK( 1, 0 ), - /* SZP2 */ PACK( 1, 0 ), - /* SZPS */ PACK( 1, 0 ), - /* SLOOP */ PACK( 1, 0 ), - /* RTG */ PACK( 0, 0 ), - /* RTHG */ PACK( 0, 0 ), - /* SMD */ PACK( 1, 0 ), - /* ELSE */ PACK( 0, 0 ), - /* JMPR */ PACK( 1, 0 ), - /* SCvTCi */ PACK( 1, 0 ), - /* SSwCi */ PACK( 1, 0 ), - /* SSW */ PACK( 1, 0 ), - - /* DUP */ PACK( 1, 2 ), - /* POP */ PACK( 1, 0 ), - /* CLEAR */ PACK( 0, 0 ), - /* SWAP */ PACK( 2, 2 ), - /* DEPTH */ PACK( 0, 1 ), - /* CINDEX */ PACK( 1, 1 ), - /* MINDEX */ PACK( 1, 0 ), - /* AlignPTS */ PACK( 2, 0 ), - /* INS_$28 */ PACK( 0, 0 ), - /* UTP */ PACK( 1, 0 ), - /* LOOPCALL */ PACK( 2, 0 ), - /* CALL */ PACK( 1, 0 ), - /* FDEF */ PACK( 1, 0 ), - /* ENDF */ PACK( 0, 0 ), - /* MDAP[0] */ PACK( 1, 0 ), - /* MDAP[1] */ PACK( 1, 0 ), - - /* IUP[0] */ PACK( 0, 0 ), - /* IUP[1] */ PACK( 0, 0 ), - /* SHP[0] */ PACK( 0, 0 ), - /* SHP[1] */ PACK( 0, 0 ), - /* SHC[0] */ PACK( 1, 0 ), - /* SHC[1] */ PACK( 1, 0 ), - /* SHZ[0] */ PACK( 1, 0 ), - /* SHZ[1] */ PACK( 1, 0 ), - /* SHPIX */ PACK( 1, 0 ), - /* IP */ PACK( 0, 0 ), - /* MSIRP[0] */ PACK( 2, 0 ), - /* MSIRP[1] */ PACK( 2, 0 ), - /* AlignRP */ PACK( 0, 0 ), - /* RTDG */ PACK( 0, 0 ), - /* MIAP[0] */ PACK( 2, 0 ), - /* MIAP[1] */ PACK( 2, 0 ), - - /* NPushB */ PACK( 0, 0 ), - /* NPushW */ PACK( 0, 0 ), - /* WS */ PACK( 2, 0 ), - /* RS */ PACK( 1, 1 ), - /* WCvtP */ PACK( 2, 0 ), - /* RCvt */ PACK( 1, 1 ), - /* GC[0] */ PACK( 1, 1 ), - /* GC[1] */ PACK( 1, 1 ), - /* SCFS */ PACK( 2, 0 ), - /* MD[0] */ PACK( 2, 1 ), - /* MD[1] */ PACK( 2, 1 ), - /* MPPEM */ PACK( 0, 1 ), - /* MPS */ PACK( 0, 1 ), - /* FlipON */ PACK( 0, 0 ), - /* FlipOFF */ PACK( 0, 0 ), - /* DEBUG */ PACK( 1, 0 ), - - /* LT */ PACK( 2, 1 ), - /* LTEQ */ PACK( 2, 1 ), - /* GT */ PACK( 2, 1 ), - /* GTEQ */ PACK( 2, 1 ), - /* EQ */ PACK( 2, 1 ), - /* NEQ */ PACK( 2, 1 ), - /* ODD */ PACK( 1, 1 ), - /* EVEN */ PACK( 1, 1 ), - /* IF */ PACK( 1, 0 ), - /* EIF */ PACK( 0, 0 ), - /* AND */ PACK( 2, 1 ), - /* OR */ PACK( 2, 1 ), - /* NOT */ PACK( 1, 1 ), - /* DeltaP1 */ PACK( 1, 0 ), - /* SDB */ PACK( 1, 0 ), - /* SDS */ PACK( 1, 0 ), - - /* ADD */ PACK( 2, 1 ), - /* SUB */ PACK( 2, 1 ), - /* DIV */ PACK( 2, 1 ), - /* MUL */ PACK( 2, 1 ), - /* ABS */ PACK( 1, 1 ), - /* NEG */ PACK( 1, 1 ), - /* FLOOR */ PACK( 1, 1 ), - /* CEILING */ PACK( 1, 1 ), - /* ROUND[0] */ PACK( 1, 1 ), - /* ROUND[1] */ PACK( 1, 1 ), - /* ROUND[2] */ PACK( 1, 1 ), - /* ROUND[3] */ PACK( 1, 1 ), - /* NROUND[0] */ PACK( 1, 1 ), - /* NROUND[1] */ PACK( 1, 1 ), - /* NROUND[2] */ PACK( 1, 1 ), - /* NROUND[3] */ PACK( 1, 1 ), - - /* WCvtF */ PACK( 2, 0 ), - /* DeltaP2 */ PACK( 1, 0 ), - /* DeltaP3 */ PACK( 1, 0 ), - /* DeltaCn[0] */ PACK( 1, 0 ), - /* DeltaCn[1] */ PACK( 1, 0 ), - /* DeltaCn[2] */ PACK( 1, 0 ), - /* SROUND */ PACK( 1, 0 ), - /* S45Round */ PACK( 1, 0 ), - /* JROT */ PACK( 2, 0 ), - /* JROF */ PACK( 2, 0 ), - /* ROFF */ PACK( 0, 0 ), - /* INS_$7B */ PACK( 0, 0 ), - /* RUTG */ PACK( 0, 0 ), - /* RDTG */ PACK( 0, 0 ), - /* SANGW */ PACK( 1, 0 ), - /* AA */ PACK( 1, 0 ), - - /* FlipPT */ PACK( 0, 0 ), - /* FlipRgON */ PACK( 2, 0 ), - /* FlipRgOFF */ PACK( 2, 0 ), - /* INS_$83 */ PACK( 0, 0 ), - /* INS_$84 */ PACK( 0, 0 ), - /* ScanCTRL */ PACK( 1, 0 ), - /* SDVPTL[0] */ PACK( 2, 0 ), - /* SDVPTL[1] */ PACK( 2, 0 ), - /* GetINFO */ PACK( 1, 1 ), - /* IDEF */ PACK( 1, 0 ), - /* ROLL */ PACK( 3, 3 ), - /* MAX */ PACK( 2, 1 ), - /* MIN */ PACK( 2, 1 ), - /* ScanTYPE */ PACK( 1, 0 ), - /* InstCTRL */ PACK( 2, 0 ), - /* INS_$8F */ PACK( 0, 0 ), - - /* INS_$90 */ PACK( 0, 0 ), - /* INS_$91 */ PACK( 0, 0 ), - /* INS_$92 */ PACK( 0, 0 ), - /* INS_$93 */ PACK( 0, 0 ), - /* INS_$94 */ PACK( 0, 0 ), - /* INS_$95 */ PACK( 0, 0 ), - /* INS_$96 */ PACK( 0, 0 ), - /* INS_$97 */ PACK( 0, 0 ), - /* INS_$98 */ PACK( 0, 0 ), - /* INS_$99 */ PACK( 0, 0 ), - /* INS_$9A */ PACK( 0, 0 ), - /* INS_$9B */ PACK( 0, 0 ), - /* INS_$9C */ PACK( 0, 0 ), - /* INS_$9D */ PACK( 0, 0 ), - /* INS_$9E */ PACK( 0, 0 ), - /* INS_$9F */ PACK( 0, 0 ), - - /* INS_$A0 */ PACK( 0, 0 ), - /* INS_$A1 */ PACK( 0, 0 ), - /* INS_$A2 */ PACK( 0, 0 ), - /* INS_$A3 */ PACK( 0, 0 ), - /* INS_$A4 */ PACK( 0, 0 ), - /* INS_$A5 */ PACK( 0, 0 ), - /* INS_$A6 */ PACK( 0, 0 ), - /* INS_$A7 */ PACK( 0, 0 ), - /* INS_$A8 */ PACK( 0, 0 ), - /* INS_$A9 */ PACK( 0, 0 ), - /* INS_$AA */ PACK( 0, 0 ), - /* INS_$AB */ PACK( 0, 0 ), - /* INS_$AC */ PACK( 0, 0 ), - /* INS_$AD */ PACK( 0, 0 ), - /* INS_$AE */ PACK( 0, 0 ), - /* INS_$AF */ PACK( 0, 0 ), - - /* PushB[0] */ PACK( 0, 1 ), - /* PushB[1] */ PACK( 0, 2 ), - /* PushB[2] */ PACK( 0, 3 ), - /* PushB[3] */ PACK( 0, 4 ), - /* PushB[4] */ PACK( 0, 5 ), - /* PushB[5] */ PACK( 0, 6 ), - /* PushB[6] */ PACK( 0, 7 ), - /* PushB[7] */ PACK( 0, 8 ), - /* PushW[0] */ PACK( 0, 1 ), - /* PushW[1] */ PACK( 0, 2 ), - /* PushW[2] */ PACK( 0, 3 ), - /* PushW[3] */ PACK( 0, 4 ), - /* PushW[4] */ PACK( 0, 5 ), - /* PushW[5] */ PACK( 0, 6 ), - /* PushW[6] */ PACK( 0, 7 ), - /* PushW[7] */ PACK( 0, 8 ), - - /* MDRP[00] */ PACK( 1, 0 ), - /* MDRP[01] */ PACK( 1, 0 ), - /* MDRP[02] */ PACK( 1, 0 ), - /* MDRP[03] */ PACK( 1, 0 ), - /* MDRP[04] */ PACK( 1, 0 ), - /* MDRP[05] */ PACK( 1, 0 ), - /* MDRP[06] */ PACK( 1, 0 ), - /* MDRP[07] */ PACK( 1, 0 ), - /* MDRP[08] */ PACK( 1, 0 ), - /* MDRP[09] */ PACK( 1, 0 ), - /* MDRP[10] */ PACK( 1, 0 ), - /* MDRP[11] */ PACK( 1, 0 ), - /* MDRP[12] */ PACK( 1, 0 ), - /* MDRP[13] */ PACK( 1, 0 ), - /* MDRP[14] */ PACK( 1, 0 ), - /* MDRP[15] */ PACK( 1, 0 ), - - /* MDRP[16] */ PACK( 1, 0 ), - /* MDRP[17] */ PACK( 1, 0 ), - /* MDRP[18] */ PACK( 1, 0 ), - /* MDRP[19] */ PACK( 1, 0 ), - /* MDRP[20] */ PACK( 1, 0 ), - /* MDRP[21] */ PACK( 1, 0 ), - /* MDRP[22] */ PACK( 1, 0 ), - /* MDRP[23] */ PACK( 1, 0 ), - /* MDRP[24] */ PACK( 1, 0 ), - /* MDRP[25] */ PACK( 1, 0 ), - /* MDRP[26] */ PACK( 1, 0 ), - /* MDRP[27] */ PACK( 1, 0 ), - /* MDRP[28] */ PACK( 1, 0 ), - /* MDRP[29] */ PACK( 1, 0 ), - /* MDRP[30] */ PACK( 1, 0 ), - /* MDRP[31] */ PACK( 1, 0 ), - - /* MIRP[00] */ PACK( 2, 0 ), - /* MIRP[01] */ PACK( 2, 0 ), - /* MIRP[02] */ PACK( 2, 0 ), - /* MIRP[03] */ PACK( 2, 0 ), - /* MIRP[04] */ PACK( 2, 0 ), - /* MIRP[05] */ PACK( 2, 0 ), - /* MIRP[06] */ PACK( 2, 0 ), - /* MIRP[07] */ PACK( 2, 0 ), - /* MIRP[08] */ PACK( 2, 0 ), - /* MIRP[09] */ PACK( 2, 0 ), - /* MIRP[10] */ PACK( 2, 0 ), - /* MIRP[11] */ PACK( 2, 0 ), - /* MIRP[12] */ PACK( 2, 0 ), - /* MIRP[13] */ PACK( 2, 0 ), - /* MIRP[14] */ PACK( 2, 0 ), - /* MIRP[15] */ PACK( 2, 0 ), - - /* MIRP[16] */ PACK( 2, 0 ), - /* MIRP[17] */ PACK( 2, 0 ), - /* MIRP[18] */ PACK( 2, 0 ), - /* MIRP[19] */ PACK( 2, 0 ), - /* MIRP[20] */ PACK( 2, 0 ), - /* MIRP[21] */ PACK( 2, 0 ), - /* MIRP[22] */ PACK( 2, 0 ), - /* MIRP[23] */ PACK( 2, 0 ), - /* MIRP[24] */ PACK( 2, 0 ), - /* MIRP[25] */ PACK( 2, 0 ), - /* MIRP[26] */ PACK( 2, 0 ), - /* MIRP[27] */ PACK( 2, 0 ), - /* MIRP[28] */ PACK( 2, 0 ), - /* MIRP[29] */ PACK( 2, 0 ), - /* MIRP[30] */ PACK( 2, 0 ), - /* MIRP[31] */ PACK( 2, 0 ) - }; - - -#ifdef FT_DEBUG_LEVEL_TRACE - - static - const char* const opcode_name[256] = - { - "SVTCA y", - "SVTCA x", - "SPvTCA y", - "SPvTCA x", - "SFvTCA y", - "SFvTCA x", - "SPvTL ||", - "SPvTL +", - "SFvTL ||", - "SFvTL +", - "SPvFS", - "SFvFS", - "GPV", - "GFV", - "SFvTPv", - "ISECT", - - "SRP0", - "SRP1", - "SRP2", - "SZP0", - "SZP1", - "SZP2", - "SZPS", - "SLOOP", - "RTG", - "RTHG", - "SMD", - "ELSE", - "JMPR", - "SCvTCi", - "SSwCi", - "SSW", - - "DUP", - "POP", - "CLEAR", - "SWAP", - "DEPTH", - "CINDEX", - "MINDEX", - "AlignPTS", - "INS_$28", - "UTP", - "LOOPCALL", - "CALL", - "FDEF", - "ENDF", - "MDAP[0]", - "MDAP[1]", - - "IUP[0]", - "IUP[1]", - "SHP[0]", - "SHP[1]", - "SHC[0]", - "SHC[1]", - "SHZ[0]", - "SHZ[1]", - "SHPIX", - "IP", - "MSIRP[0]", - "MSIRP[1]", - "AlignRP", - "RTDG", - "MIAP[0]", - "MIAP[1]", - - "NPushB", - "NPushW", - "WS", - "RS", - "WCvtP", - "RCvt", - "GC[0]", - "GC[1]", - "SCFS", - "MD[0]", - "MD[1]", - "MPPEM", - "MPS", - "FlipON", - "FlipOFF", - "DEBUG", - - "LT", - "LTEQ", - "GT", - "GTEQ", - "EQ", - "NEQ", - "ODD", - "EVEN", - "IF", - "EIF", - "AND", - "OR", - "NOT", - "DeltaP1", - "SDB", - "SDS", - - "ADD", - "SUB", - "DIV", - "MUL", - "ABS", - "NEG", - "FLOOR", - "CEILING", - "ROUND[0]", - "ROUND[1]", - "ROUND[2]", - "ROUND[3]", - "NROUND[0]", - "NROUND[1]", - "NROUND[2]", - "NROUND[3]", - - "WCvtF", - "DeltaP2", - "DeltaP3", - "DeltaCn[0]", - "DeltaCn[1]", - "DeltaCn[2]", - "SROUND", - "S45Round", - "JROT", - "JROF", - "ROFF", - "INS_$7B", - "RUTG", - "RDTG", - "SANGW", - "AA", - - "FlipPT", - "FlipRgON", - "FlipRgOFF", - "INS_$83", - "INS_$84", - "ScanCTRL", - "SDVPTL[0]", - "SDVPTL[1]", - "GetINFO", - "IDEF", - "ROLL", - "MAX", - "MIN", - "ScanTYPE", - "InstCTRL", - "INS_$8F", - - "INS_$90", - "INS_$91", - "INS_$92", - "INS_$93", - "INS_$94", - "INS_$95", - "INS_$96", - "INS_$97", - "INS_$98", - "INS_$99", - "INS_$9A", - "INS_$9B", - "INS_$9C", - "INS_$9D", - "INS_$9E", - "INS_$9F", - - "INS_$A0", - "INS_$A1", - "INS_$A2", - "INS_$A3", - "INS_$A4", - "INS_$A5", - "INS_$A6", - "INS_$A7", - "INS_$A8", - "INS_$A9", - "INS_$AA", - "INS_$AB", - "INS_$AC", - "INS_$AD", - "INS_$AE", - "INS_$AF", - - "PushB[0]", - "PushB[1]", - "PushB[2]", - "PushB[3]", - "PushB[4]", - "PushB[5]", - "PushB[6]", - "PushB[7]", - "PushW[0]", - "PushW[1]", - "PushW[2]", - "PushW[3]", - "PushW[4]", - "PushW[5]", - "PushW[6]", - "PushW[7]", - - "MDRP[00]", - "MDRP[01]", - "MDRP[02]", - "MDRP[03]", - "MDRP[04]", - "MDRP[05]", - "MDRP[06]", - "MDRP[07]", - "MDRP[08]", - "MDRP[09]", - "MDRP[10]", - "MDRP[11]", - "MDRP[12]", - "MDRP[13]", - "MDRP[14]", - "MDRP[15]", - - "MDRP[16]", - "MDRP[17]", - "MDRP[18]", - "MDRP[19]", - "MDRP[20]", - "MDRP[21]", - "MDRP[22]", - "MDRP[23]", - "MDRP[24]", - "MDRP[25]", - "MDRP[26]", - "MDRP[27]", - "MDRP[28]", - "MDRP[29]", - "MDRP[30]", - "MDRP[31]", - - "MIRP[00]", - "MIRP[01]", - "MIRP[02]", - "MIRP[03]", - "MIRP[04]", - "MIRP[05]", - "MIRP[06]", - "MIRP[07]", - "MIRP[08]", - "MIRP[09]", - "MIRP[10]", - "MIRP[11]", - "MIRP[12]", - "MIRP[13]", - "MIRP[14]", - "MIRP[15]", - - "MIRP[16]", - "MIRP[17]", - "MIRP[18]", - "MIRP[19]", - "MIRP[20]", - "MIRP[21]", - "MIRP[22]", - "MIRP[23]", - "MIRP[24]", - "MIRP[25]", - "MIRP[26]", - "MIRP[27]", - "MIRP[28]", - "MIRP[29]", - "MIRP[30]", - "MIRP[31]" - }; - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - - static - const FT_Char opcode_length[256] = - { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - -1,-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 3, 4, 5, 6, 7, 8, 9, 3, 5, 7, 9, 11,13,15,17, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - }; - -#undef PACK - -#if 1 - - static FT_Int32 - TT_MulFix14( FT_Int32 a, - FT_Int b ) - { - FT_Int32 sign; - FT_UInt32 ah, al, mid, lo, hi; - - - sign = a ^ b; - - if ( a < 0 ) - a = -a; - if ( b < 0 ) - b = -b; - - ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU ); - al = (FT_UInt32)( a & 0xFFFFU ); - - lo = al * b; - mid = ah * b; - hi = mid >> 16; - mid = ( mid << 16 ) + ( 1 << 13 ); /* rounding */ - lo += mid; - if ( lo < mid ) - hi += 1; - - mid = ( lo >> 14 ) | ( hi << 18 ); - - return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid; - } - -#else - - /* compute (a*b)/2^14 with maximal accuracy and rounding */ - static FT_Int32 - TT_MulFix14( FT_Int32 a, - FT_Int b ) - { - FT_Int32 m, s, hi; - FT_UInt32 l, lo; - - - /* compute ax*bx as 64-bit value */ - l = (FT_UInt32)( ( a & 0xFFFFU ) * b ); - m = ( a >> 16 ) * b; - - lo = l + (FT_UInt32)( m << 16 ); - hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l ); - - /* divide the result by 2^14 with rounding */ - s = hi >> 31; - l = lo + (FT_UInt32)s; - hi += s + ( l < lo ); - lo = l; - - l = lo + 0x2000U; - hi += l < lo; - - return ( hi << 18 ) | ( l >> 14 ); - } -#endif - - - /* compute (ax*bx+ay*by)/2^14 with maximal accuracy and rounding */ - static FT_Int32 - TT_DotFix14( FT_Int32 ax, - FT_Int32 ay, - FT_Int bx, - FT_Int by ) - { - FT_Int32 m, s, hi1, hi2, hi; - FT_UInt32 l, lo1, lo2, lo; - - - /* compute ax*bx as 64-bit value */ - l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx ); - m = ( ax >> 16 ) * bx; - - lo1 = l + (FT_UInt32)( m << 16 ); - hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l ); - - /* compute ay*by as 64-bit value */ - l = (FT_UInt32)( ( ay & 0xFFFFU ) * by ); - m = ( ay >> 16 ) * by; - - lo2 = l + (FT_UInt32)( m << 16 ); - hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l ); - - /* add them */ - lo = lo1 + lo2; - hi = hi1 + hi2 + ( lo < lo1 ); - - /* divide the result by 2^14 with rounding */ - s = hi >> 31; - l = lo + (FT_UInt32)s; - hi += s + ( l < lo ); - lo = l; - - l = lo + 0x2000U; - hi += ( l < lo ); - - return ( hi << 18 ) | ( l >> 14 ); - } - - - /* return length of given vector */ - -#if 0 - - static FT_Int32 - TT_VecLen( FT_Int32 x, - FT_Int32 y ) - { - FT_Int32 m, hi1, hi2, hi; - FT_UInt32 l, lo1, lo2, lo; - - - /* compute x*x as 64-bit value */ - lo = (FT_UInt32)( x & 0xFFFFU ); - hi = x >> 16; - - l = lo * lo; - m = hi * lo; - hi = hi * hi; - - lo1 = l + (FT_UInt32)( m << 17 ); - hi1 = hi + ( m >> 15 ) + ( lo1 < l ); - - /* compute y*y as 64-bit value */ - lo = (FT_UInt32)( y & 0xFFFFU ); - hi = y >> 16; - - l = lo * lo; - m = hi * lo; - hi = hi * hi; - - lo2 = l + (FT_UInt32)( m << 17 ); - hi2 = hi + ( m >> 15 ) + ( lo2 < l ); - - /* add them to get 'x*x+y*y' as 64-bit value */ - lo = lo1 + lo2; - hi = hi1 + hi2 + ( lo < lo1 ); - - /* compute the square root of this value */ - { - FT_UInt32 root, rem, test_div; - FT_Int count; - - - root = 0; - - { - rem = 0; - count = 32; - do - { - rem = ( rem << 2 ) | ( (FT_UInt32)hi >> 30 ); - hi = ( hi << 2 ) | ( lo >> 30 ); - lo <<= 2; - root <<= 1; - test_div = ( root << 1 ) + 1; - - if ( rem >= test_div ) - { - rem -= test_div; - root += 1; - } - } while ( --count ); - } - - return (FT_Int32)root; - } - } - -#else - - /* this version uses FT_Vector_Length which computes the same value */ - /* much, much faster.. */ - /* */ - static FT_F26Dot6 - TT_VecLen( FT_F26Dot6 X, - FT_F26Dot6 Y ) - { - FT_Vector v; - - - v.x = X; - v.y = Y; - - return FT_Vector_Length( &v ); - } - -#endif - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Current_Ratio */ - /* */ - /* <Description> */ - /* Returns the current aspect ratio scaling factor depending on the */ - /* projection vector's state and device resolutions. */ - /* */ - /* <Return> */ - /* The aspect ratio in 16.16 format, always <= 1.0 . */ - /* */ - static FT_Long - Current_Ratio( EXEC_OP ) - { - if ( !CUR.tt_metrics.ratio ) - { -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - if ( CUR.face->unpatented_hinting ) - { - if ( CUR.GS.both_x_axis ) - CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio; - else - CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio; - } - else -#endif - { - if ( CUR.GS.projVector.y == 0 ) - CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio; - - else if ( CUR.GS.projVector.x == 0 ) - CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio; - - else - { - FT_Long x, y; - - - x = TT_MULDIV( CUR.GS.projVector.x, - CUR.tt_metrics.x_ratio, 0x4000 ); - y = TT_MULDIV( CUR.GS.projVector.y, - CUR.tt_metrics.y_ratio, 0x4000 ); - CUR.tt_metrics.ratio = TT_VecLen( x, y ); - } - } - } - return CUR.tt_metrics.ratio; - } - - - static FT_Long - Current_Ppem( EXEC_OP ) - { - return TT_MULFIX( CUR.tt_metrics.ppem, CURRENT_Ratio() ); - } - - - /*************************************************************************/ - /* */ - /* Functions related to the control value table (CVT). */ - /* */ - /*************************************************************************/ - - - FT_CALLBACK_DEF( FT_F26Dot6 ) - Read_CVT( EXEC_OP_ FT_ULong idx ) - { - return CUR.cvt[idx]; - } - - - FT_CALLBACK_DEF( FT_F26Dot6 ) - Read_CVT_Stretched( EXEC_OP_ FT_ULong idx ) - { - return TT_MULFIX( CUR.cvt[idx], CURRENT_Ratio() ); - } - - - FT_CALLBACK_DEF( void ) - Write_CVT( EXEC_OP_ FT_ULong idx, - FT_F26Dot6 value ) - { - CUR.cvt[idx] = value; - } - - - FT_CALLBACK_DEF( void ) - Write_CVT_Stretched( EXEC_OP_ FT_ULong idx, - FT_F26Dot6 value ) - { - CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() ); - } - - - FT_CALLBACK_DEF( void ) - Move_CVT( EXEC_OP_ FT_ULong idx, - FT_F26Dot6 value ) - { - CUR.cvt[idx] += value; - } - - - FT_CALLBACK_DEF( void ) - Move_CVT_Stretched( EXEC_OP_ FT_ULong idx, - FT_F26Dot6 value ) - { - CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* GetShortIns */ - /* */ - /* <Description> */ - /* Returns a short integer taken from the instruction stream at */ - /* address IP. */ - /* */ - /* <Return> */ - /* Short read at code[IP]. */ - /* */ - /* <Note> */ - /* This one could become a macro. */ - /* */ - static FT_Short - GetShortIns( EXEC_OP ) - { - /* Reading a byte stream so there is no endianess (DaveP) */ - CUR.IP += 2; - return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) + - CUR.code[CUR.IP - 1] ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Ins_Goto_CodeRange */ - /* */ - /* <Description> */ - /* Goes to a certain code range in the instruction stream. */ - /* */ - /* <Input> */ - /* aRange :: The index of the code range. */ - /* */ - /* aIP :: The new IP address in the code range. */ - /* */ - /* <Return> */ - /* SUCCESS or FAILURE. */ - /* */ - static FT_Bool - Ins_Goto_CodeRange( EXEC_OP_ FT_Int aRange, - FT_ULong aIP ) - { - TT_CodeRange* range; - - - if ( aRange < 1 || aRange > 3 ) - { - CUR.error = TT_Err_Bad_Argument; - return FAILURE; - } - - range = &CUR.codeRangeTable[aRange - 1]; - - if ( range->base == NULL ) /* invalid coderange */ - { - CUR.error = TT_Err_Invalid_CodeRange; - return FAILURE; - } - - /* NOTE: Because the last instruction of a program may be a CALL */ - /* which will return to the first byte *after* the code */ - /* range, we test for AIP <= Size, instead of AIP < Size. */ - - if ( aIP > range->size ) - { - CUR.error = TT_Err_Code_Overflow; - return FAILURE; - } - - CUR.code = range->base; - CUR.codeSize = range->size; - CUR.IP = aIP; - CUR.curRange = aRange; - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Direct_Move */ - /* */ - /* <Description> */ - /* Moves a point by a given distance along the freedom vector. The */ - /* point will be `touched'. */ - /* */ - /* <Input> */ - /* point :: The index of the point to move. */ - /* */ - /* distance :: The distance to apply. */ - /* */ - /* <InOut> */ - /* zone :: The affected glyph zone. */ - /* */ - static void - Direct_Move( EXEC_OP_ TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_F26Dot6 v; - - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - FT_ASSERT( !CUR.face->unpatented_hinting ); -#endif - - v = CUR.GS.freeVector.x; - - if ( v != 0 ) - { - zone->cur[point].x += TT_MULDIV( distance, - v * 0x10000L, - CUR.F_dot_P ); - - zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; - } - - v = CUR.GS.freeVector.y; - - if ( v != 0 ) - { - zone->cur[point].y += TT_MULDIV( distance, - v * 0x10000L, - CUR.F_dot_P ); - - zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; - } - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Direct_Move_Orig */ - /* */ - /* <Description> */ - /* Moves the *original* position of a point by a given distance along */ - /* the freedom vector. Obviously, the point will not be `touched'. */ - /* */ - /* <Input> */ - /* point :: The index of the point to move. */ - /* */ - /* distance :: The distance to apply. */ - /* */ - /* <InOut> */ - /* zone :: The affected glyph zone. */ - /* */ - static void - Direct_Move_Orig( EXEC_OP_ TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_F26Dot6 v; - - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - FT_ASSERT( !CUR.face->unpatented_hinting ); -#endif - - v = CUR.GS.freeVector.x; - - if ( v != 0 ) - zone->org[point].x += TT_MULDIV( distance, - v * 0x10000L, - CUR.F_dot_P ); - - v = CUR.GS.freeVector.y; - - if ( v != 0 ) - zone->org[point].y += TT_MULDIV( distance, - v * 0x10000L, - CUR.F_dot_P ); - } - - - /*************************************************************************/ - /* */ - /* Special versions of Direct_Move() */ - /* */ - /* The following versions are used whenever both vectors are both */ - /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ - /* */ - /*************************************************************************/ - - - static void - Direct_Move_X( EXEC_OP_ TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_UNUSED_EXEC; - - zone->cur[point].x += distance; - zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; - } - - - static void - Direct_Move_Y( EXEC_OP_ TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_UNUSED_EXEC; - - zone->cur[point].y += distance; - zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; - } - - - /*************************************************************************/ - /* */ - /* Special versions of Direct_Move_Orig() */ - /* */ - /* The following versions are used whenever both vectors are both */ - /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ - /* */ - /*************************************************************************/ - - - static void - Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_UNUSED_EXEC; - - zone->org[point].x += distance; - } - - - static void - Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_UNUSED_EXEC; - - zone->org[point].y += distance; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Round_None */ - /* */ - /* <Description> */ - /* Does not round, but adds engine compensation. */ - /* */ - /* <Input> */ - /* distance :: The distance (not) to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* <Return> */ - /* The compensated distance. */ - /* */ - /* <Note> */ - /* The TrueType specification says very few about the relationship */ - /* between rounding and engine compensation. However, it seems from */ - /* the description of super round that we should add the compensation */ - /* before rounding. */ - /* */ - static FT_F26Dot6 - Round_None( EXEC_OP_ FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - FT_UNUSED_EXEC; - - - if ( distance >= 0 ) - { - val = distance + compensation; - if ( distance && val < 0 ) - val = 0; - } - else - { - val = distance - compensation; - if ( val > 0 ) - val = 0; - } - return val; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Round_To_Grid */ - /* */ - /* <Description> */ - /* Rounds value to grid after adding engine compensation. */ - /* */ - /* <Input> */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* <Return> */ - /* Rounded distance. */ - /* */ - static FT_F26Dot6 - Round_To_Grid( EXEC_OP_ FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - FT_UNUSED_EXEC; - - - if ( distance >= 0 ) - { - val = distance + compensation + 32; - if ( distance && val > 0 ) - val &= ~63; - else - val = 0; - } - else - { - val = -FT_PIX_ROUND( compensation - distance ); - if ( val > 0 ) - val = 0; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Round_To_Half_Grid */ - /* */ - /* <Description> */ - /* Rounds value to half grid after adding engine compensation. */ - /* */ - /* <Input> */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* <Return> */ - /* Rounded distance. */ - /* */ - static FT_F26Dot6 - Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - FT_UNUSED_EXEC; - - - if ( distance >= 0 ) - { - val = FT_PIX_FLOOR( distance + compensation ) + 32; - if ( distance && val < 0 ) - val = 0; - } - else - { - val = -( FT_PIX_FLOOR( compensation - distance ) + 32 ); - if ( val > 0 ) - val = 0; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Round_Down_To_Grid */ - /* */ - /* <Description> */ - /* Rounds value down to grid after adding engine compensation. */ - /* */ - /* <Input> */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* <Return> */ - /* Rounded distance. */ - /* */ - static FT_F26Dot6 - Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - FT_UNUSED_EXEC; - - - if ( distance >= 0 ) - { - val = distance + compensation; - if ( distance && val > 0 ) - val &= ~63; - else - val = 0; - } - else - { - val = -( ( compensation - distance ) & -64 ); - if ( val > 0 ) - val = 0; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Round_Up_To_Grid */ - /* */ - /* <Description> */ - /* Rounds value up to grid after adding engine compensation. */ - /* */ - /* <Input> */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* <Return> */ - /* Rounded distance. */ - /* */ - static FT_F26Dot6 - Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - FT_UNUSED_EXEC; - - - if ( distance >= 0 ) - { - val = distance + compensation + 63; - if ( distance && val > 0 ) - val &= ~63; - else - val = 0; - } - else - { - val = - FT_PIX_CEIL( compensation - distance ); - if ( val > 0 ) - val = 0; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Round_To_Double_Grid */ - /* */ - /* <Description> */ - /* Rounds value to double grid after adding engine compensation. */ - /* */ - /* <Input> */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* <Return> */ - /* Rounded distance. */ - /* */ - static FT_F26Dot6 - Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - FT_UNUSED_EXEC; - - - if ( distance >= 0 ) - { - val = distance + compensation + 16; - if ( distance && val > 0 ) - val &= ~31; - else - val = 0; - } - else - { - val = -FT_PAD_ROUND( compensation - distance, 32 ); - if ( val > 0 ) - val = 0; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Round_Super */ - /* */ - /* <Description> */ - /* Super-rounds value to grid after adding engine compensation. */ - /* */ - /* <Input> */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* <Return> */ - /* Rounded distance. */ - /* */ - /* <Note> */ - /* The TrueType specification says very few about the relationship */ - /* between rounding and engine compensation. However, it seems from */ - /* the description of super round that we should add the compensation */ - /* before rounding. */ - /* */ - static FT_F26Dot6 - Round_Super( EXEC_OP_ FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - - if ( distance >= 0 ) - { - val = ( distance - CUR.phase + CUR.threshold + compensation ) & - -CUR.period; - if ( distance && val < 0 ) - val = 0; - val += CUR.phase; - } - else - { - val = -( ( CUR.threshold - CUR.phase - distance + compensation ) & - -CUR.period ); - if ( val > 0 ) - val = 0; - val -= CUR.phase; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Round_Super_45 */ - /* */ - /* <Description> */ - /* Super-rounds value to grid after adding engine compensation. */ - /* */ - /* <Input> */ - /* distance :: The distance to round. */ - /* */ - /* compensation :: The engine compensation. */ - /* */ - /* <Return> */ - /* Rounded distance. */ - /* */ - /* <Note> */ - /* There is a separate function for Round_Super_45() as we may need */ - /* greater precision. */ - /* */ - static FT_F26Dot6 - Round_Super_45( EXEC_OP_ FT_F26Dot6 distance, - FT_F26Dot6 compensation ) - { - FT_F26Dot6 val; - - - if ( distance >= 0 ) - { - val = ( ( distance - CUR.phase + CUR.threshold + compensation ) / - CUR.period ) * CUR.period; - if ( distance && val < 0 ) - val = 0; - val += CUR.phase; - } - else - { - val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) / - CUR.period ) * CUR.period ); - if ( val > 0 ) - val = 0; - val -= CUR.phase; - } - - return val; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Compute_Round */ - /* */ - /* <Description> */ - /* Sets the rounding mode. */ - /* */ - /* <Input> */ - /* round_mode :: The rounding mode to be used. */ - /* */ - static void - Compute_Round( EXEC_OP_ FT_Byte round_mode ) - { - switch ( round_mode ) - { - case TT_Round_Off: - CUR.func_round = (TT_Round_Func)Round_None; - break; - - case TT_Round_To_Grid: - CUR.func_round = (TT_Round_Func)Round_To_Grid; - break; - - case TT_Round_Up_To_Grid: - CUR.func_round = (TT_Round_Func)Round_Up_To_Grid; - break; - - case TT_Round_Down_To_Grid: - CUR.func_round = (TT_Round_Func)Round_Down_To_Grid; - break; - - case TT_Round_To_Half_Grid: - CUR.func_round = (TT_Round_Func)Round_To_Half_Grid; - break; - - case TT_Round_To_Double_Grid: - CUR.func_round = (TT_Round_Func)Round_To_Double_Grid; - break; - - case TT_Round_Super: - CUR.func_round = (TT_Round_Func)Round_Super; - break; - - case TT_Round_Super_45: - CUR.func_round = (TT_Round_Func)Round_Super_45; - break; - } - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* SetSuperRound */ - /* */ - /* <Description> */ - /* Sets Super Round parameters. */ - /* */ - /* <Input> */ - /* GridPeriod :: Grid period */ - /* selector :: SROUND opcode */ - /* */ - static void - SetSuperRound( EXEC_OP_ FT_F26Dot6 GridPeriod, - FT_Long selector ) - { - switch ( (FT_Int)( selector & 0xC0 ) ) - { - case 0: - CUR.period = GridPeriod / 2; - break; - - case 0x40: - CUR.period = GridPeriod; - break; - - case 0x80: - CUR.period = GridPeriod * 2; - break; - - /* This opcode is reserved, but... */ - - case 0xC0: - CUR.period = GridPeriod; - break; - } - - switch ( (FT_Int)( selector & 0x30 ) ) - { - case 0: - CUR.phase = 0; - break; - - case 0x10: - CUR.phase = CUR.period / 4; - break; - - case 0x20: - CUR.phase = CUR.period / 2; - break; - - case 0x30: - CUR.phase = CUR.period * 3 / 4; - break; - } - - if ( ( selector & 0x0F ) == 0 ) - CUR.threshold = CUR.period - 1; - else - CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8; - - CUR.period /= 256; - CUR.phase /= 256; - CUR.threshold /= 256; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Project */ - /* */ - /* <Description> */ - /* Computes the projection of vector given by (v2-v1) along the */ - /* current projection vector. */ - /* */ - /* <Input> */ - /* v1 :: First input vector. */ - /* v2 :: Second input vector. */ - /* */ - /* <Return> */ - /* The distance in F26dot6 format. */ - /* */ - static FT_F26Dot6 - Project( EXEC_OP_ FT_Pos dx, - FT_Pos dy ) - { -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - FT_ASSERT( !CUR.face->unpatented_hinting ); -#endif - - return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy, - CUR.GS.projVector.x, - CUR.GS.projVector.y ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Dual_Project */ - /* */ - /* <Description> */ - /* Computes the projection of the vector given by (v2-v1) along the */ - /* current dual vector. */ - /* */ - /* <Input> */ - /* v1 :: First input vector. */ - /* v2 :: Second input vector. */ - /* */ - /* <Return> */ - /* The distance in F26dot6 format. */ - /* */ - static FT_F26Dot6 - Dual_Project( EXEC_OP_ FT_Pos dx, - FT_Pos dy ) - { - return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy, - CUR.GS.dualVector.x, - CUR.GS.dualVector.y ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Project_x */ - /* */ - /* <Description> */ - /* Computes the projection of the vector given by (v2-v1) along the */ - /* horizontal axis. */ - /* */ - /* <Input> */ - /* v1 :: First input vector. */ - /* v2 :: Second input vector. */ - /* */ - /* <Return> */ - /* The distance in F26dot6 format. */ - /* */ - static FT_F26Dot6 - Project_x( EXEC_OP_ FT_Pos dx, - FT_Pos dy ) - { - FT_UNUSED_EXEC; - FT_UNUSED( dy ); - - return dx; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Project_y */ - /* */ - /* <Description> */ - /* Computes the projection of the vector given by (v2-v1) along the */ - /* vertical axis. */ - /* */ - /* <Input> */ - /* v1 :: First input vector. */ - /* v2 :: Second input vector. */ - /* */ - /* <Return> */ - /* The distance in F26dot6 format. */ - /* */ - static FT_F26Dot6 - Project_y( EXEC_OP_ FT_Pos dx, - FT_Pos dy ) - { - FT_UNUSED_EXEC; - FT_UNUSED( dx ); - - return dy; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Compute_Funcs */ - /* */ - /* <Description> */ - /* Computes the projection and movement function pointers according */ - /* to the current graphics state. */ - /* */ - static void - Compute_Funcs( EXEC_OP ) - { -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - if ( CUR.face->unpatented_hinting ) - { - /* If both vectors point rightwards along the x axis, set */ - /* `both-x-axis' true, otherwise set it false. The x values only */ - /* need be tested because the vector has been normalised to a unit */ - /* vector of length 0x4000 = unity. */ - CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 && - CUR.GS.freeVector.x == 0x4000 ); - - /* Throw away projection and freedom vector information */ - /* because the patents don't allow them to be stored. */ - /* The relevant US Patents are 5155805 and 5325479. */ - CUR.GS.projVector.x = 0; - CUR.GS.projVector.y = 0; - CUR.GS.freeVector.x = 0; - CUR.GS.freeVector.y = 0; - - if ( CUR.GS.both_x_axis ) - { - CUR.func_project = Project_x; - CUR.func_move = Direct_Move_X; - CUR.func_move_orig = Direct_Move_Orig_X; - } - else - { - CUR.func_project = Project_y; - CUR.func_move = Direct_Move_Y; - CUR.func_move_orig = Direct_Move_Orig_Y; - } - - if ( CUR.GS.dualVector.x == 0x4000 ) - CUR.func_dualproj = Project_x; - else - { - if ( CUR.GS.dualVector.y == 0x4000 ) - CUR.func_dualproj = Project_y; - else - CUR.func_dualproj = Dual_Project; - } - - /* Force recalculation of cached aspect ratio */ - CUR.tt_metrics.ratio = 0; - - return; - } -#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */ - - if ( CUR.GS.freeVector.x == 0x4000 ) - CUR.F_dot_P = CUR.GS.projVector.x * 0x10000L; - else - { - if ( CUR.GS.freeVector.y == 0x4000 ) - CUR.F_dot_P = CUR.GS.projVector.y * 0x10000L; - else - CUR.F_dot_P = (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x * 4 + - (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y * 4; - } - - if ( CUR.GS.projVector.x == 0x4000 ) - CUR.func_project = (TT_Project_Func)Project_x; - else - { - if ( CUR.GS.projVector.y == 0x4000 ) - CUR.func_project = (TT_Project_Func)Project_y; - else - CUR.func_project = (TT_Project_Func)Project; - } - - if ( CUR.GS.dualVector.x == 0x4000 ) - CUR.func_dualproj = (TT_Project_Func)Project_x; - else - { - if ( CUR.GS.dualVector.y == 0x4000 ) - CUR.func_dualproj = (TT_Project_Func)Project_y; - else - CUR.func_dualproj = (TT_Project_Func)Dual_Project; - } - - CUR.func_move = (TT_Move_Func)Direct_Move; - CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig; - - if ( CUR.F_dot_P == 0x40000000L ) - { - if ( CUR.GS.freeVector.x == 0x4000 ) - { - CUR.func_move = (TT_Move_Func)Direct_Move_X; - CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X; - } - else - { - if ( CUR.GS.freeVector.y == 0x4000 ) - { - CUR.func_move = (TT_Move_Func)Direct_Move_Y; - CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y; - } - } - } - - /* at small sizes, F_dot_P can become too small, resulting */ - /* in overflows and `spikes' in a number of glyphs like `w'. */ - - if ( FT_ABS( CUR.F_dot_P ) < 0x4000000L ) - CUR.F_dot_P = 0x40000000L; - - /* Disable cached aspect ratio */ - CUR.tt_metrics.ratio = 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* Normalize */ - /* */ - /* <Description> */ - /* Norms a vector. */ - /* */ - /* <Input> */ - /* Vx :: The horizontal input vector coordinate. */ - /* Vy :: The vertical input vector coordinate. */ - /* */ - /* <Output> */ - /* R :: The normed unit vector. */ - /* */ - /* <Return> */ - /* Returns FAILURE if a vector parameter is zero. */ - /* */ - /* <Note> */ - /* In case Vx and Vy are both zero, Normalize() returns SUCCESS, and */ - /* R is undefined. */ - /* */ - - - static FT_Bool - Normalize( EXEC_OP_ FT_F26Dot6 Vx, - FT_F26Dot6 Vy, - FT_UnitVector* R ) - { - FT_F26Dot6 W; - FT_Bool S1, S2; - - FT_UNUSED_EXEC; - - - if ( FT_ABS( Vx ) < 0x10000L && FT_ABS( Vy ) < 0x10000L ) - { - Vx *= 0x100; - Vy *= 0x100; - - W = TT_VecLen( Vx, Vy ); - - if ( W == 0 ) - { - /* XXX: UNDOCUMENTED! It seems that it is possible to try */ - /* to normalize the vector (0,0). Return immediately. */ - return SUCCESS; - } - - R->x = (FT_F2Dot14)FT_MulDiv( Vx, 0x4000L, W ); - R->y = (FT_F2Dot14)FT_MulDiv( Vy, 0x4000L, W ); - - return SUCCESS; - } - - W = TT_VecLen( Vx, Vy ); - - Vx = FT_MulDiv( Vx, 0x4000L, W ); - Vy = FT_MulDiv( Vy, 0x4000L, W ); - - W = Vx * Vx + Vy * Vy; - - /* Now, we want that Sqrt( W ) = 0x4000 */ - /* Or 0x10000000 <= W < 0x10004000 */ - - if ( Vx < 0 ) - { - Vx = -Vx; - S1 = TRUE; - } - else - S1 = FALSE; - - if ( Vy < 0 ) - { - Vy = -Vy; - S2 = TRUE; - } - else - S2 = FALSE; - - while ( W < 0x10000000L ) - { - /* We need to increase W by a minimal amount */ - if ( Vx < Vy ) - Vx++; - else - Vy++; - - W = Vx * Vx + Vy * Vy; - } - - while ( W >= 0x10004000L ) - { - /* We need to decrease W by a minimal amount */ - if ( Vx < Vy ) - Vx--; - else - Vy--; - - W = Vx * Vx + Vy * Vy; - } - - /* Note that in various cases, we can only */ - /* compute a Sqrt(W) of 0x3FFF, eg. Vx = Vy */ - - if ( S1 ) - Vx = -Vx; - - if ( S2 ) - Vy = -Vy; - - R->x = (FT_F2Dot14)Vx; /* Type conversion */ - R->y = (FT_F2Dot14)Vy; /* Type conversion */ - - return SUCCESS; - } - - - /*************************************************************************/ - /* */ - /* Here we start with the implementation of the various opcodes. */ - /* */ - /*************************************************************************/ - - - static FT_Bool - Ins_SxVTL( EXEC_OP_ FT_UShort aIdx1, - FT_UShort aIdx2, - FT_Int aOpc, - FT_UnitVector* Vec ) - { - FT_Long A, B, C; - FT_Vector* p1; - FT_Vector* p2; - - - if ( BOUNDS( aIdx1, CUR.zp2.n_points ) || - BOUNDS( aIdx2, CUR.zp1.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return FAILURE; - } - - p1 = CUR.zp1.cur + aIdx2; - p2 = CUR.zp2.cur + aIdx1; - - A = p1->x - p2->x; - B = p1->y - p2->y; - - if ( ( aOpc & 1 ) != 0 ) - { - C = B; /* counter clockwise rotation */ - B = A; - A = -C; - } - - NORMalize( A, B, Vec ); - - return SUCCESS; - } - - - /* When not using the big switch statements, the interpreter uses a */ - /* call table defined later below in this source. Each opcode must */ - /* thus have a corresponding function, even trivial ones. */ - /* */ - /* They are all defined there. */ - -#define DO_SVTCA \ - { \ - FT_Short A, B; \ - \ - \ - A = (FT_Short)( CUR.opcode & 1 ) << 14; \ - B = A ^ (FT_Short)0x4000; \ - \ - CUR.GS.freeVector.x = A; \ - CUR.GS.projVector.x = A; \ - CUR.GS.dualVector.x = A; \ - \ - CUR.GS.freeVector.y = B; \ - CUR.GS.projVector.y = B; \ - CUR.GS.dualVector.y = B; \ - \ - COMPUTE_Funcs(); \ - } - - -#define DO_SPVTCA \ - { \ - FT_Short A, B; \ - \ - \ - A = (FT_Short)( CUR.opcode & 1 ) << 14; \ - B = A ^ (FT_Short)0x4000; \ - \ - CUR.GS.projVector.x = A; \ - CUR.GS.dualVector.x = A; \ - \ - CUR.GS.projVector.y = B; \ - CUR.GS.dualVector.y = B; \ - \ - GUESS_VECTOR( freeVector ); \ - \ - COMPUTE_Funcs(); \ - } - - -#define DO_SFVTCA \ - { \ - FT_Short A, B; \ - \ - \ - A = (FT_Short)( CUR.opcode & 1 ) << 14; \ - B = A ^ (FT_Short)0x4000; \ - \ - CUR.GS.freeVector.x = A; \ - CUR.GS.freeVector.y = B; \ - \ - GUESS_VECTOR( projVector ); \ - \ - COMPUTE_Funcs(); \ - } - - -#define DO_SPVTL \ - if ( INS_SxVTL( (FT_UShort)args[1], \ - (FT_UShort)args[0], \ - CUR.opcode, \ - &CUR.GS.projVector ) == SUCCESS ) \ - { \ - CUR.GS.dualVector = CUR.GS.projVector; \ - GUESS_VECTOR( freeVector ); \ - COMPUTE_Funcs(); \ - } - - -#define DO_SFVTL \ - if ( INS_SxVTL( (FT_UShort)args[1], \ - (FT_UShort)args[0], \ - CUR.opcode, \ - &CUR.GS.freeVector ) == SUCCESS ) \ - { \ - GUESS_VECTOR( projVector ); \ - COMPUTE_Funcs(); \ - } - - -#define DO_SFVTPV \ - GUESS_VECTOR( projVector ); \ - CUR.GS.freeVector = CUR.GS.projVector; \ - COMPUTE_Funcs(); - - -#define DO_SPVFS \ - { \ - FT_Short S; \ - FT_Long X, Y; \ - \ - \ - /* Only use low 16bits, then sign extend */ \ - S = (FT_Short)args[1]; \ - Y = (FT_Long)S; \ - S = (FT_Short)args[0]; \ - X = (FT_Long)S; \ - \ - NORMalize( X, Y, &CUR.GS.projVector ); \ - \ - CUR.GS.dualVector = CUR.GS.projVector; \ - GUESS_VECTOR( freeVector ); \ - COMPUTE_Funcs(); \ - } - - -#define DO_SFVFS \ - { \ - FT_Short S; \ - FT_Long X, Y; \ - \ - \ - /* Only use low 16bits, then sign extend */ \ - S = (FT_Short)args[1]; \ - Y = (FT_Long)S; \ - S = (FT_Short)args[0]; \ - X = S; \ - \ - NORMalize( X, Y, &CUR.GS.freeVector ); \ - GUESS_VECTOR( projVector ); \ - COMPUTE_Funcs(); \ - } - - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING -#define DO_GPV \ - if ( CUR.face->unpatented_hinting ) \ - { \ - args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \ - args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \ - } \ - else \ - { \ - args[0] = CUR.GS.projVector.x; \ - args[1] = CUR.GS.projVector.y; \ - } -#else -#define DO_GPV \ - args[0] = CUR.GS.projVector.x; \ - args[1] = CUR.GS.projVector.y; -#endif - - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING -#define DO_GFV \ - if ( CUR.face->unpatented_hinting ) \ - { \ - args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \ - args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \ - } \ - else \ - { \ - args[0] = CUR.GS.freeVector.x; \ - args[1] = CUR.GS.freeVector.y; \ - } -#else -#define DO_GFV \ - args[0] = CUR.GS.freeVector.x; \ - args[1] = CUR.GS.freeVector.y; -#endif - - -#define DO_SRP0 \ - CUR.GS.rp0 = (FT_UShort)args[0]; - - -#define DO_SRP1 \ - CUR.GS.rp1 = (FT_UShort)args[0]; - - -#define DO_SRP2 \ - CUR.GS.rp2 = (FT_UShort)args[0]; - - -#define DO_RTHG \ - CUR.GS.round_state = TT_Round_To_Half_Grid; \ - CUR.func_round = (TT_Round_Func)Round_To_Half_Grid; - - -#define DO_RTG \ - CUR.GS.round_state = TT_Round_To_Grid; \ - CUR.func_round = (TT_Round_Func)Round_To_Grid; - - -#define DO_RTDG \ - CUR.GS.round_state = TT_Round_To_Double_Grid; \ - CUR.func_round = (TT_Round_Func)Round_To_Double_Grid; - - -#define DO_RUTG \ - CUR.GS.round_state = TT_Round_Up_To_Grid; \ - CUR.func_round = (TT_Round_Func)Round_Up_To_Grid; - - -#define DO_RDTG \ - CUR.GS.round_state = TT_Round_Down_To_Grid; \ - CUR.func_round = (TT_Round_Func)Round_Down_To_Grid; - - -#define DO_ROFF \ - CUR.GS.round_state = TT_Round_Off; \ - CUR.func_round = (TT_Round_Func)Round_None; - - -#define DO_SROUND \ - SET_SuperRound( 0x4000, args[0] ); \ - CUR.GS.round_state = TT_Round_Super; \ - CUR.func_round = (TT_Round_Func)Round_Super; - - -#define DO_S45ROUND \ - SET_SuperRound( 0x2D41, args[0] ); \ - CUR.GS.round_state = TT_Round_Super_45; \ - CUR.func_round = (TT_Round_Func)Round_Super_45; - - -#define DO_SLOOP \ - if ( args[0] < 0 ) \ - CUR.error = TT_Err_Bad_Argument; \ - else \ - CUR.GS.loop = args[0]; - - -#define DO_SMD \ - CUR.GS.minimum_distance = args[0]; - - -#define DO_SCVTCI \ - CUR.GS.control_value_cutin = (FT_F26Dot6)args[0]; - - -#define DO_SSWCI \ - CUR.GS.single_width_cutin = (FT_F26Dot6)args[0]; - - - /* XXX: UNDOCUMENTED! or bug in the Windows engine? */ - /* */ - /* It seems that the value that is read here is */ - /* expressed in 16.16 format rather than in font */ - /* units. */ - /* */ -#define DO_SSW \ - CUR.GS.single_width_value = (FT_F26Dot6)( args[0] >> 10 ); - - -#define DO_FLIPON \ - CUR.GS.auto_flip = TRUE; - - -#define DO_FLIPOFF \ - CUR.GS.auto_flip = FALSE; - - -#define DO_SDB \ - CUR.GS.delta_base = (FT_Short)args[0]; - - -#define DO_SDS \ - CUR.GS.delta_shift = (FT_Short)args[0]; - - -#define DO_MD /* nothing */ - - -#define DO_MPPEM \ - args[0] = CURRENT_Ppem(); - - - /* Note: The pointSize should be irrelevant in a given font program; */ - /* we thus decide to return only the ppem. */ -#if 0 - -#define DO_MPS \ - args[0] = CUR.metrics.pointSize; - -#else - -#define DO_MPS \ - args[0] = CURRENT_Ppem(); - -#endif /* 0 */ - - -#define DO_DUP \ - args[1] = args[0]; - - -#define DO_CLEAR \ - CUR.new_top = 0; - - -#define DO_SWAP \ - { \ - FT_Long L; \ - \ - \ - L = args[0]; \ - args[0] = args[1]; \ - args[1] = L; \ - } - - -#define DO_DEPTH \ - args[0] = CUR.top; - - -#define DO_CINDEX \ - { \ - FT_Long L; \ - \ - \ - L = args[0]; \ - \ - if ( L <= 0 || L > CUR.args ) \ - CUR.error = TT_Err_Invalid_Reference; \ - else \ - args[0] = CUR.stack[CUR.args - L]; \ - } - - -#define DO_JROT \ - if ( args[1] != 0 ) \ - { \ - CUR.IP += args[0]; \ - if ( CUR.IP < 0 ) \ - CUR.error = TT_Err_Bad_Argument; \ - CUR.step_ins = FALSE; \ - } - - -#define DO_JMPR \ - CUR.IP += args[0]; \ - if ( CUR.IP < 0 ) \ - CUR.error = TT_Err_Bad_Argument; \ - CUR.step_ins = FALSE; - - -#define DO_JROF \ - if ( args[1] == 0 ) \ - { \ - CUR.IP += args[0]; \ - if ( CUR.IP < 0 ) \ - CUR.error = TT_Err_Bad_Argument; \ - CUR.step_ins = FALSE; \ - } - - -#define DO_LT \ - args[0] = ( args[0] < args[1] ); - - -#define DO_LTEQ \ - args[0] = ( args[0] <= args[1] ); - - -#define DO_GT \ - args[0] = ( args[0] > args[1] ); - - -#define DO_GTEQ \ - args[0] = ( args[0] >= args[1] ); - - -#define DO_EQ \ - args[0] = ( args[0] == args[1] ); - - -#define DO_NEQ \ - args[0] = ( args[0] != args[1] ); - - -#define DO_ODD \ - args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 ); - - -#define DO_EVEN \ - args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 ); - - -#define DO_AND \ - args[0] = ( args[0] && args[1] ); - - -#define DO_OR \ - args[0] = ( args[0] || args[1] ); - - -#define DO_NOT \ - args[0] = !args[0]; - - -#define DO_ADD \ - args[0] += args[1]; - - -#define DO_SUB \ - args[0] -= args[1]; - - -#define DO_DIV \ - if ( args[1] == 0 ) \ - CUR.error = TT_Err_Divide_By_Zero; \ - else \ - args[0] = TT_MULDIV_NO_ROUND( args[0], 64L, args[1] ); - - -#define DO_MUL \ - args[0] = TT_MULDIV( args[0], args[1], 64L ); - - -#define DO_ABS \ - args[0] = FT_ABS( args[0] ); - - -#define DO_NEG \ - args[0] = -args[0]; - - -#define DO_FLOOR \ - args[0] = FT_PIX_FLOOR( args[0] ); - - -#define DO_CEILING \ - args[0] = FT_PIX_CEIL( args[0] ); - - -#define DO_RS \ - { \ - FT_ULong I = (FT_ULong)args[0]; \ - \ - \ - if ( BOUNDSL( I, CUR.storeSize ) ) \ - { \ - if ( CUR.pedantic_hinting ) \ - { \ - ARRAY_BOUND_ERROR; \ - } \ - else \ - args[0] = 0; \ - } \ - else \ - args[0] = CUR.storage[I]; \ - } - - -#define DO_WS \ - { \ - FT_ULong I = (FT_ULong)args[0]; \ - \ - \ - if ( BOUNDSL( I, CUR.storeSize ) ) \ - { \ - if ( CUR.pedantic_hinting ) \ - { \ - ARRAY_BOUND_ERROR; \ - } \ - } \ - else \ - CUR.storage[I] = args[1]; \ - } - - -#define DO_RCVT \ - { \ - FT_ULong I = (FT_ULong)args[0]; \ - \ - \ - if ( BOUNDSL( I, CUR.cvtSize ) ) \ - { \ - if ( CUR.pedantic_hinting ) \ - { \ - ARRAY_BOUND_ERROR; \ - } \ - else \ - args[0] = 0; \ - } \ - else \ - args[0] = CUR_Func_read_cvt( I ); \ - } - - -#define DO_WCVTP \ - { \ - FT_ULong I = (FT_ULong)args[0]; \ - \ - \ - if ( BOUNDSL( I, CUR.cvtSize ) ) \ - { \ - if ( CUR.pedantic_hinting ) \ - { \ - ARRAY_BOUND_ERROR; \ - } \ - } \ - else \ - CUR_Func_write_cvt( I, args[1] ); \ - } - - -#define DO_WCVTF \ - { \ - FT_ULong I = (FT_ULong)args[0]; \ - \ - \ - if ( BOUNDSL( I, CUR.cvtSize ) ) \ - { \ - if ( CUR.pedantic_hinting ) \ - { \ - ARRAY_BOUND_ERROR; \ - } \ - } \ - else \ - CUR.cvt[I] = TT_MULFIX( args[1], CUR.tt_metrics.scale ); \ - } - - -#define DO_DEBUG \ - CUR.error = TT_Err_Debug_OpCode; - - -#define DO_ROUND \ - args[0] = CUR_Func_round( \ - args[0], \ - CUR.tt_metrics.compensations[CUR.opcode - 0x68] ); - - -#define DO_NROUND \ - args[0] = ROUND_None( args[0], \ - CUR.tt_metrics.compensations[CUR.opcode - 0x6C] ); - - -#define DO_MAX \ - if ( args[1] > args[0] ) \ - args[0] = args[1]; - - -#define DO_MIN \ - if ( args[1] < args[0] ) \ - args[0] = args[1]; - - -#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH - - -#undef ARRAY_BOUND_ERROR -#define ARRAY_BOUND_ERROR \ - { \ - CUR.error = TT_Err_Invalid_Reference; \ - return; \ - } - - - /*************************************************************************/ - /* */ - /* SVTCA[a]: Set (F and P) Vectors to Coordinate Axis */ - /* Opcode range: 0x00-0x01 */ - /* Stack: --> */ - /* */ - static void - Ins_SVTCA( INS_ARG ) - { - DO_SVTCA - } - - - /*************************************************************************/ - /* */ - /* SPVTCA[a]: Set PVector to Coordinate Axis */ - /* Opcode range: 0x02-0x03 */ - /* Stack: --> */ - /* */ - static void - Ins_SPVTCA( INS_ARG ) - { - DO_SPVTCA - } - - - /*************************************************************************/ - /* */ - /* SFVTCA[a]: Set FVector to Coordinate Axis */ - /* Opcode range: 0x04-0x05 */ - /* Stack: --> */ - /* */ - static void - Ins_SFVTCA( INS_ARG ) - { - DO_SFVTCA - } - - - /*************************************************************************/ - /* */ - /* SPVTL[a]: Set PVector To Line */ - /* Opcode range: 0x06-0x07 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_SPVTL( INS_ARG ) - { - DO_SPVTL - } - - - /*************************************************************************/ - /* */ - /* SFVTL[a]: Set FVector To Line */ - /* Opcode range: 0x08-0x09 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_SFVTL( INS_ARG ) - { - DO_SFVTL - } - - - /*************************************************************************/ - /* */ - /* SFVTPV[]: Set FVector To PVector */ - /* Opcode range: 0x0E */ - /* Stack: --> */ - /* */ - static void - Ins_SFVTPV( INS_ARG ) - { - DO_SFVTPV - } - - - /*************************************************************************/ - /* */ - /* SPVFS[]: Set PVector From Stack */ - /* Opcode range: 0x0A */ - /* Stack: f2.14 f2.14 --> */ - /* */ - static void - Ins_SPVFS( INS_ARG ) - { - DO_SPVFS - } - - - /*************************************************************************/ - /* */ - /* SFVFS[]: Set FVector From Stack */ - /* Opcode range: 0x0B */ - /* Stack: f2.14 f2.14 --> */ - /* */ - static void - Ins_SFVFS( INS_ARG ) - { - DO_SFVFS - } - - - /*************************************************************************/ - /* */ - /* GPV[]: Get Projection Vector */ - /* Opcode range: 0x0C */ - /* Stack: ef2.14 --> ef2.14 */ - /* */ - static void - Ins_GPV( INS_ARG ) - { - DO_GPV - } - - - /*************************************************************************/ - /* GFV[]: Get Freedom Vector */ - /* Opcode range: 0x0D */ - /* Stack: ef2.14 --> ef2.14 */ - /* */ - static void - Ins_GFV( INS_ARG ) - { - DO_GFV - } - - - /*************************************************************************/ - /* */ - /* SRP0[]: Set Reference Point 0 */ - /* Opcode range: 0x10 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SRP0( INS_ARG ) - { - DO_SRP0 - } - - - /*************************************************************************/ - /* */ - /* SRP1[]: Set Reference Point 1 */ - /* Opcode range: 0x11 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SRP1( INS_ARG ) - { - DO_SRP1 - } - - - /*************************************************************************/ - /* */ - /* SRP2[]: Set Reference Point 2 */ - /* Opcode range: 0x12 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SRP2( INS_ARG ) - { - DO_SRP2 - } - - - /*************************************************************************/ - /* */ - /* RTHG[]: Round To Half Grid */ - /* Opcode range: 0x19 */ - /* Stack: --> */ - /* */ - static void - Ins_RTHG( INS_ARG ) - { - DO_RTHG - } - - - /*************************************************************************/ - /* */ - /* RTG[]: Round To Grid */ - /* Opcode range: 0x18 */ - /* Stack: --> */ - /* */ - static void - Ins_RTG( INS_ARG ) - { - DO_RTG - } - - - /*************************************************************************/ - /* RTDG[]: Round To Double Grid */ - /* Opcode range: 0x3D */ - /* Stack: --> */ - /* */ - static void - Ins_RTDG( INS_ARG ) - { - DO_RTDG - } - - - /*************************************************************************/ - /* RUTG[]: Round Up To Grid */ - /* Opcode range: 0x7C */ - /* Stack: --> */ - /* */ - static void - Ins_RUTG( INS_ARG ) - { - DO_RUTG - } - - - /*************************************************************************/ - /* */ - /* RDTG[]: Round Down To Grid */ - /* Opcode range: 0x7D */ - /* Stack: --> */ - /* */ - static void - Ins_RDTG( INS_ARG ) - { - DO_RDTG - } - - - /*************************************************************************/ - /* */ - /* ROFF[]: Round OFF */ - /* Opcode range: 0x7A */ - /* Stack: --> */ - /* */ - static void - Ins_ROFF( INS_ARG ) - { - DO_ROFF - } - - - /*************************************************************************/ - /* */ - /* SROUND[]: Super ROUND */ - /* Opcode range: 0x76 */ - /* Stack: Eint8 --> */ - /* */ - static void - Ins_SROUND( INS_ARG ) - { - DO_SROUND - } - - - /*************************************************************************/ - /* */ - /* S45ROUND[]: Super ROUND 45 degrees */ - /* Opcode range: 0x77 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_S45ROUND( INS_ARG ) - { - DO_S45ROUND - } - - - /*************************************************************************/ - /* */ - /* SLOOP[]: Set LOOP variable */ - /* Opcode range: 0x17 */ - /* Stack: int32? --> */ - /* */ - static void - Ins_SLOOP( INS_ARG ) - { - DO_SLOOP - } - - - /*************************************************************************/ - /* */ - /* SMD[]: Set Minimum Distance */ - /* Opcode range: 0x1A */ - /* Stack: f26.6 --> */ - /* */ - static void - Ins_SMD( INS_ARG ) - { - DO_SMD - } - - - /*************************************************************************/ - /* */ - /* SCVTCI[]: Set Control Value Table Cut In */ - /* Opcode range: 0x1D */ - /* Stack: f26.6 --> */ - /* */ - static void - Ins_SCVTCI( INS_ARG ) - { - DO_SCVTCI - } - - - /*************************************************************************/ - /* */ - /* SSWCI[]: Set Single Width Cut In */ - /* Opcode range: 0x1E */ - /* Stack: f26.6 --> */ - /* */ - static void - Ins_SSWCI( INS_ARG ) - { - DO_SSWCI - } - - - /*************************************************************************/ - /* */ - /* SSW[]: Set Single Width */ - /* Opcode range: 0x1F */ - /* Stack: int32? --> */ - /* */ - static void - Ins_SSW( INS_ARG ) - { - DO_SSW - } - - - /*************************************************************************/ - /* */ - /* FLIPON[]: Set auto-FLIP to ON */ - /* Opcode range: 0x4D */ - /* Stack: --> */ - /* */ - static void - Ins_FLIPON( INS_ARG ) - { - DO_FLIPON - } - - - /*************************************************************************/ - /* */ - /* FLIPOFF[]: Set auto-FLIP to OFF */ - /* Opcode range: 0x4E */ - /* Stack: --> */ - /* */ - static void - Ins_FLIPOFF( INS_ARG ) - { - DO_FLIPOFF - } - - - /*************************************************************************/ - /* */ - /* SANGW[]: Set ANGle Weight */ - /* Opcode range: 0x7E */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SANGW( INS_ARG ) - { - /* instruction not supported anymore */ - } - - - /*************************************************************************/ - /* */ - /* SDB[]: Set Delta Base */ - /* Opcode range: 0x5E */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SDB( INS_ARG ) - { - DO_SDB - } - - - /*************************************************************************/ - /* */ - /* SDS[]: Set Delta Shift */ - /* Opcode range: 0x5F */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SDS( INS_ARG ) - { - DO_SDS - } - - - /*************************************************************************/ - /* */ - /* MPPEM[]: Measure Pixel Per EM */ - /* Opcode range: 0x4B */ - /* Stack: --> Euint16 */ - /* */ - static void - Ins_MPPEM( INS_ARG ) - { - DO_MPPEM - } - - - /*************************************************************************/ - /* */ - /* MPS[]: Measure Point Size */ - /* Opcode range: 0x4C */ - /* Stack: --> Euint16 */ - /* */ - static void - Ins_MPS( INS_ARG ) - { - DO_MPS - } - - - /*************************************************************************/ - /* */ - /* DUP[]: DUPlicate the top stack's element */ - /* Opcode range: 0x20 */ - /* Stack: StkElt --> StkElt StkElt */ - /* */ - static void - Ins_DUP( INS_ARG ) - { - DO_DUP - } - - - /*************************************************************************/ - /* */ - /* POP[]: POP the stack's top element */ - /* Opcode range: 0x21 */ - /* Stack: StkElt --> */ - /* */ - static void - Ins_POP( INS_ARG ) - { - /* nothing to do */ - } - - - /*************************************************************************/ - /* */ - /* CLEAR[]: CLEAR the entire stack */ - /* Opcode range: 0x22 */ - /* Stack: StkElt... --> */ - /* */ - static void - Ins_CLEAR( INS_ARG ) - { - DO_CLEAR - } - - - /*************************************************************************/ - /* */ - /* SWAP[]: SWAP the stack's top two elements */ - /* Opcode range: 0x23 */ - /* Stack: 2 * StkElt --> 2 * StkElt */ - /* */ - static void - Ins_SWAP( INS_ARG ) - { - DO_SWAP - } - - - /*************************************************************************/ - /* */ - /* DEPTH[]: return the stack DEPTH */ - /* Opcode range: 0x24 */ - /* Stack: --> uint32 */ - /* */ - static void - Ins_DEPTH( INS_ARG ) - { - DO_DEPTH - } - - - /*************************************************************************/ - /* */ - /* CINDEX[]: Copy INDEXed element */ - /* Opcode range: 0x25 */ - /* Stack: int32 --> StkElt */ - /* */ - static void - Ins_CINDEX( INS_ARG ) - { - DO_CINDEX - } - - - /*************************************************************************/ - /* */ - /* EIF[]: End IF */ - /* Opcode range: 0x59 */ - /* Stack: --> */ - /* */ - static void - Ins_EIF( INS_ARG ) - { - /* nothing to do */ - } - - - /*************************************************************************/ - /* */ - /* JROT[]: Jump Relative On True */ - /* Opcode range: 0x78 */ - /* Stack: StkElt int32 --> */ - /* */ - static void - Ins_JROT( INS_ARG ) - { - DO_JROT - } - - - /*************************************************************************/ - /* */ - /* JMPR[]: JuMP Relative */ - /* Opcode range: 0x1C */ - /* Stack: int32 --> */ - /* */ - static void - Ins_JMPR( INS_ARG ) - { - DO_JMPR - } - - - /*************************************************************************/ - /* */ - /* JROF[]: Jump Relative On False */ - /* Opcode range: 0x79 */ - /* Stack: StkElt int32 --> */ - /* */ - static void - Ins_JROF( INS_ARG ) - { - DO_JROF - } - - - /*************************************************************************/ - /* */ - /* LT[]: Less Than */ - /* Opcode range: 0x50 */ - /* Stack: int32? int32? --> bool */ - /* */ - static void - Ins_LT( INS_ARG ) - { - DO_LT - } - - - /*************************************************************************/ - /* */ - /* LTEQ[]: Less Than or EQual */ - /* Opcode range: 0x51 */ - /* Stack: int32? int32? --> bool */ - /* */ - static void - Ins_LTEQ( INS_ARG ) - { - DO_LTEQ - } - - - /*************************************************************************/ - /* */ - /* GT[]: Greater Than */ - /* Opcode range: 0x52 */ - /* Stack: int32? int32? --> bool */ - /* */ - static void - Ins_GT( INS_ARG ) - { - DO_GT - } - - - /*************************************************************************/ - /* */ - /* GTEQ[]: Greater Than or EQual */ - /* Opcode range: 0x53 */ - /* Stack: int32? int32? --> bool */ - /* */ - static void - Ins_GTEQ( INS_ARG ) - { - DO_GTEQ - } - - - /*************************************************************************/ - /* */ - /* EQ[]: EQual */ - /* Opcode range: 0x54 */ - /* Stack: StkElt StkElt --> bool */ - /* */ - static void - Ins_EQ( INS_ARG ) - { - DO_EQ - } - - - /*************************************************************************/ - /* */ - /* NEQ[]: Not EQual */ - /* Opcode range: 0x55 */ - /* Stack: StkElt StkElt --> bool */ - /* */ - static void - Ins_NEQ( INS_ARG ) - { - DO_NEQ - } - - - /*************************************************************************/ - /* */ - /* ODD[]: Is ODD */ - /* Opcode range: 0x56 */ - /* Stack: f26.6 --> bool */ - /* */ - static void - Ins_ODD( INS_ARG ) - { - DO_ODD - } - - - /*************************************************************************/ - /* */ - /* EVEN[]: Is EVEN */ - /* Opcode range: 0x57 */ - /* Stack: f26.6 --> bool */ - /* */ - static void - Ins_EVEN( INS_ARG ) - { - DO_EVEN - } - - - /*************************************************************************/ - /* */ - /* AND[]: logical AND */ - /* Opcode range: 0x5A */ - /* Stack: uint32 uint32 --> uint32 */ - /* */ - static void - Ins_AND( INS_ARG ) - { - DO_AND - } - - - /*************************************************************************/ - /* */ - /* OR[]: logical OR */ - /* Opcode range: 0x5B */ - /* Stack: uint32 uint32 --> uint32 */ - /* */ - static void - Ins_OR( INS_ARG ) - { - DO_OR - } - - - /*************************************************************************/ - /* */ - /* NOT[]: logical NOT */ - /* Opcode range: 0x5C */ - /* Stack: StkElt --> uint32 */ - /* */ - static void - Ins_NOT( INS_ARG ) - { - DO_NOT - } - - - /*************************************************************************/ - /* */ - /* ADD[]: ADD */ - /* Opcode range: 0x60 */ - /* Stack: f26.6 f26.6 --> f26.6 */ - /* */ - static void - Ins_ADD( INS_ARG ) - { - DO_ADD - } - - - /*************************************************************************/ - /* */ - /* SUB[]: SUBtract */ - /* Opcode range: 0x61 */ - /* Stack: f26.6 f26.6 --> f26.6 */ - /* */ - static void - Ins_SUB( INS_ARG ) - { - DO_SUB - } - - - /*************************************************************************/ - /* */ - /* DIV[]: DIVide */ - /* Opcode range: 0x62 */ - /* Stack: f26.6 f26.6 --> f26.6 */ - /* */ - static void - Ins_DIV( INS_ARG ) - { - DO_DIV - } - - - /*************************************************************************/ - /* */ - /* MUL[]: MULtiply */ - /* Opcode range: 0x63 */ - /* Stack: f26.6 f26.6 --> f26.6 */ - /* */ - static void - Ins_MUL( INS_ARG ) - { - DO_MUL - } - - - /*************************************************************************/ - /* */ - /* ABS[]: ABSolute value */ - /* Opcode range: 0x64 */ - /* Stack: f26.6 --> f26.6 */ - /* */ - static void - Ins_ABS( INS_ARG ) - { - DO_ABS - } - - - /*************************************************************************/ - /* */ - /* NEG[]: NEGate */ - /* Opcode range: 0x65 */ - /* Stack: f26.6 --> f26.6 */ - /* */ - static void - Ins_NEG( INS_ARG ) - { - DO_NEG - } - - - /*************************************************************************/ - /* */ - /* FLOOR[]: FLOOR */ - /* Opcode range: 0x66 */ - /* Stack: f26.6 --> f26.6 */ - /* */ - static void - Ins_FLOOR( INS_ARG ) - { - DO_FLOOR - } - - - /*************************************************************************/ - /* */ - /* CEILING[]: CEILING */ - /* Opcode range: 0x67 */ - /* Stack: f26.6 --> f26.6 */ - /* */ - static void - Ins_CEILING( INS_ARG ) - { - DO_CEILING - } - - - /*************************************************************************/ - /* */ - /* RS[]: Read Store */ - /* Opcode range: 0x43 */ - /* Stack: uint32 --> uint32 */ - /* */ - static void - Ins_RS( INS_ARG ) - { - DO_RS - } - - - /*************************************************************************/ - /* */ - /* WS[]: Write Store */ - /* Opcode range: 0x42 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_WS( INS_ARG ) - { - DO_WS - } - - - /*************************************************************************/ - /* */ - /* WCVTP[]: Write CVT in Pixel units */ - /* Opcode range: 0x44 */ - /* Stack: f26.6 uint32 --> */ - /* */ - static void - Ins_WCVTP( INS_ARG ) - { - DO_WCVTP - } - - - /*************************************************************************/ - /* */ - /* WCVTF[]: Write CVT in Funits */ - /* Opcode range: 0x70 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_WCVTF( INS_ARG ) - { - DO_WCVTF - } - - - /*************************************************************************/ - /* */ - /* RCVT[]: Read CVT */ - /* Opcode range: 0x45 */ - /* Stack: uint32 --> f26.6 */ - /* */ - static void - Ins_RCVT( INS_ARG ) - { - DO_RCVT - } - - - /*************************************************************************/ - /* */ - /* AA[]: Adjust Angle */ - /* Opcode range: 0x7F */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_AA( INS_ARG ) - { - /* intentionally no longer supported */ - } - - - /*************************************************************************/ - /* */ - /* DEBUG[]: DEBUG. Unsupported. */ - /* Opcode range: 0x4F */ - /* Stack: uint32 --> */ - /* */ - /* Note: The original instruction pops a value from the stack. */ - /* */ - static void - Ins_DEBUG( INS_ARG ) - { - DO_DEBUG - } - - - /*************************************************************************/ - /* */ - /* ROUND[ab]: ROUND value */ - /* Opcode range: 0x68-0x6B */ - /* Stack: f26.6 --> f26.6 */ - /* */ - static void - Ins_ROUND( INS_ARG ) - { - DO_ROUND - } - - - /*************************************************************************/ - /* */ - /* NROUND[ab]: No ROUNDing of value */ - /* Opcode range: 0x6C-0x6F */ - /* Stack: f26.6 --> f26.6 */ - /* */ - static void - Ins_NROUND( INS_ARG ) - { - DO_NROUND - } - - - /*************************************************************************/ - /* */ - /* MAX[]: MAXimum */ - /* Opcode range: 0x68 */ - /* Stack: int32? int32? --> int32 */ - /* */ - static void - Ins_MAX( INS_ARG ) - { - DO_MAX - } - - - /*************************************************************************/ - /* */ - /* MIN[]: MINimum */ - /* Opcode range: 0x69 */ - /* Stack: int32? int32? --> int32 */ - /* */ - static void - Ins_MIN( INS_ARG ) - { - DO_MIN - } - - -#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */ - - - /*************************************************************************/ - /* */ - /* The following functions are called as is within the switch statement. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* MINDEX[]: Move INDEXed element */ - /* Opcode range: 0x26 */ - /* Stack: int32? --> StkElt */ - /* */ - static void - Ins_MINDEX( INS_ARG ) - { - FT_Long L, K; - - - L = args[0]; - - if ( L <= 0 || L > CUR.args ) - { - CUR.error = TT_Err_Invalid_Reference; - return; - } - - K = CUR.stack[CUR.args - L]; - - FT_ARRAY_MOVE( &CUR.stack[CUR.args - L ], - &CUR.stack[CUR.args - L + 1], - ( L - 1 ) ); - - CUR.stack[CUR.args - 1] = K; - } - - - /*************************************************************************/ - /* */ - /* ROLL[]: ROLL top three elements */ - /* Opcode range: 0x8A */ - /* Stack: 3 * StkElt --> 3 * StkElt */ - /* */ - static void - Ins_ROLL( INS_ARG ) - { - FT_Long A, B, C; - - FT_UNUSED_EXEC; - - - A = args[2]; - B = args[1]; - C = args[0]; - - args[2] = C; - args[1] = A; - args[0] = B; - } - - - /*************************************************************************/ - /* */ - /* MANAGING THE FLOW OF CONTROL */ - /* */ - /* Instructions appear in the specification's order. */ - /* */ - /*************************************************************************/ - - - static FT_Bool - SkipCode( EXEC_OP ) - { - CUR.IP += CUR.length; - - if ( CUR.IP < CUR.codeSize ) - { - CUR.opcode = CUR.code[CUR.IP]; - - CUR.length = opcode_length[CUR.opcode]; - if ( CUR.length < 0 ) - { - if ( CUR.IP + 1 > CUR.codeSize ) - goto Fail_Overflow; - CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1]; - } - - if ( CUR.IP + CUR.length <= CUR.codeSize ) - return SUCCESS; - } - - Fail_Overflow: - CUR.error = TT_Err_Code_Overflow; - return FAILURE; - } - - - /*************************************************************************/ - /* */ - /* IF[]: IF test */ - /* Opcode range: 0x58 */ - /* Stack: StkElt --> */ - /* */ - static void - Ins_IF( INS_ARG ) - { - FT_Int nIfs; - FT_Bool Out; - - - if ( args[0] != 0 ) - return; - - nIfs = 1; - Out = 0; - - do - { - if ( SKIP_Code() == FAILURE ) - return; - - switch ( CUR.opcode ) - { - case 0x58: /* IF */ - nIfs++; - break; - - case 0x1B: /* ELSE */ - Out = FT_BOOL( nIfs == 1 ); - break; - - case 0x59: /* EIF */ - nIfs--; - Out = FT_BOOL( nIfs == 0 ); - break; - } - } while ( Out == 0 ); - } - - - /*************************************************************************/ - /* */ - /* ELSE[]: ELSE */ - /* Opcode range: 0x1B */ - /* Stack: --> */ - /* */ - static void - Ins_ELSE( INS_ARG ) - { - FT_Int nIfs; - - FT_UNUSED_ARG; - - - nIfs = 1; - - do - { - if ( SKIP_Code() == FAILURE ) - return; - - switch ( CUR.opcode ) - { - case 0x58: /* IF */ - nIfs++; - break; - - case 0x59: /* EIF */ - nIfs--; - break; - } - } while ( nIfs != 0 ); - } - - - /*************************************************************************/ - /* */ - /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS */ - /* */ - /* Instructions appear in the specification's order. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* FDEF[]: Function DEFinition */ - /* Opcode range: 0x2C */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_FDEF( INS_ARG ) - { - FT_ULong n; - TT_DefRecord* rec; - TT_DefRecord* limit; - - - /* some font programs are broken enough to redefine functions! */ - /* We will then parse the current table. */ - - rec = CUR.FDefs; - limit = rec + CUR.numFDefs; - n = args[0]; - - for ( ; rec < limit; rec++ ) - { - if ( rec->opc == n ) - break; - } - - if ( rec == limit ) - { - /* check that there is enough room for new functions */ - if ( CUR.numFDefs >= CUR.maxFDefs ) - { - CUR.error = TT_Err_Too_Many_Function_Defs; - return; - } - CUR.numFDefs++; - } - - /* Although FDEF takes unsigned 32-bit integer, */ - /* func # must be within unsigned 16-bit integer */ - if ( n > 0xFFFFU ) - { - CUR.error = TT_Err_Too_Many_Function_Defs; - return; - } - - rec->range = CUR.curRange; - rec->opc = (FT_UInt16)n; - rec->start = CUR.IP + 1; - rec->active = TRUE; - - if ( n > CUR.maxFunc ) - CUR.maxFunc = (FT_UInt16)n; - - /* Now skip the whole function definition. */ - /* We don't allow nested IDEFS & FDEFs. */ - - while ( SKIP_Code() == SUCCESS ) - { - switch ( CUR.opcode ) - { - case 0x89: /* IDEF */ - case 0x2C: /* FDEF */ - CUR.error = TT_Err_Nested_DEFS; - return; - - case 0x2D: /* ENDF */ - return; - } - } - } - - - /*************************************************************************/ - /* */ - /* ENDF[]: END Function definition */ - /* Opcode range: 0x2D */ - /* Stack: --> */ - /* */ - static void - Ins_ENDF( INS_ARG ) - { - TT_CallRec* pRec; - - FT_UNUSED_ARG; - - - if ( CUR.callTop <= 0 ) /* We encountered an ENDF without a call */ - { - CUR.error = TT_Err_ENDF_In_Exec_Stream; - return; - } - - CUR.callTop--; - - pRec = &CUR.callStack[CUR.callTop]; - - pRec->Cur_Count--; - - CUR.step_ins = FALSE; - - if ( pRec->Cur_Count > 0 ) - { - CUR.callTop++; - CUR.IP = pRec->Cur_Restart; - } - else - /* Loop through the current function */ - INS_Goto_CodeRange( pRec->Caller_Range, - pRec->Caller_IP ); - - /* Exit the current call frame. */ - - /* NOTE: If the last instruction of a program is a */ - /* CALL or LOOPCALL, the return address is */ - /* always out of the code range. This is a */ - /* valid address, and it is why we do not test */ - /* the result of Ins_Goto_CodeRange() here! */ - } - - - /*************************************************************************/ - /* */ - /* CALL[]: CALL function */ - /* Opcode range: 0x2B */ - /* Stack: uint32? --> */ - /* */ - static void - Ins_CALL( INS_ARG ) - { - FT_ULong F; - TT_CallRec* pCrec; - TT_DefRecord* def; - - - /* first of all, check the index */ - - F = args[0]; - if ( BOUNDSL( F, CUR.maxFunc + 1 ) ) - goto Fail; - - /* Except for some old Apple fonts, all functions in a TrueType */ - /* font are defined in increasing order, starting from 0. This */ - /* means that we normally have */ - /* */ - /* CUR.maxFunc+1 == CUR.numFDefs */ - /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */ - /* */ - /* If this isn't true, we need to look up the function table. */ - - def = CUR.FDefs + F; - if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F ) - { - /* look up the FDefs table */ - TT_DefRecord* limit; - - - def = CUR.FDefs; - limit = def + CUR.numFDefs; - - while ( def < limit && def->opc != F ) - def++; - - if ( def == limit ) - goto Fail; - } - - /* check that the function is active */ - if ( !def->active ) - goto Fail; - - /* check the call stack */ - if ( CUR.callTop >= CUR.callSize ) - { - CUR.error = TT_Err_Stack_Overflow; - return; - } - - pCrec = CUR.callStack + CUR.callTop; - - pCrec->Caller_Range = CUR.curRange; - pCrec->Caller_IP = CUR.IP + 1; - pCrec->Cur_Count = 1; - pCrec->Cur_Restart = def->start; - - CUR.callTop++; - - INS_Goto_CodeRange( def->range, - def->start ); - - CUR.step_ins = FALSE; - return; - - Fail: - CUR.error = TT_Err_Invalid_Reference; - } - - - /*************************************************************************/ - /* */ - /* LOOPCALL[]: LOOP and CALL function */ - /* Opcode range: 0x2A */ - /* Stack: uint32? Eint16? --> */ - /* */ - static void - Ins_LOOPCALL( INS_ARG ) - { - FT_ULong F; - TT_CallRec* pCrec; - TT_DefRecord* def; - - - /* first of all, check the index */ - F = args[1]; - if ( BOUNDSL( F, CUR.maxFunc + 1 ) ) - goto Fail; - - /* Except for some old Apple fonts, all functions in a TrueType */ - /* font are defined in increasing order, starting from 0. This */ - /* means that we normally have */ - /* */ - /* CUR.maxFunc+1 == CUR.numFDefs */ - /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */ - /* */ - /* If this isn't true, we need to look up the function table. */ - - def = CUR.FDefs + F; - if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F ) - { - /* look up the FDefs table */ - TT_DefRecord* limit; - - - def = CUR.FDefs; - limit = def + CUR.numFDefs; - - while ( def < limit && def->opc != F ) - def++; - - if ( def == limit ) - goto Fail; - } - - /* check that the function is active */ - if ( !def->active ) - goto Fail; - - /* check stack */ - if ( CUR.callTop >= CUR.callSize ) - { - CUR.error = TT_Err_Stack_Overflow; - return; - } - - if ( args[0] > 0 ) - { - pCrec = CUR.callStack + CUR.callTop; - - pCrec->Caller_Range = CUR.curRange; - pCrec->Caller_IP = CUR.IP + 1; - pCrec->Cur_Count = (FT_Int)args[0]; - pCrec->Cur_Restart = def->start; - - CUR.callTop++; - - INS_Goto_CodeRange( def->range, def->start ); - - CUR.step_ins = FALSE; - } - return; - - Fail: - CUR.error = TT_Err_Invalid_Reference; - } - - - /*************************************************************************/ - /* */ - /* IDEF[]: Instruction DEFinition */ - /* Opcode range: 0x89 */ - /* Stack: Eint8 --> */ - /* */ - static void - Ins_IDEF( INS_ARG ) - { - TT_DefRecord* def; - TT_DefRecord* limit; - - - /* First of all, look for the same function in our table */ - - def = CUR.IDefs; - limit = def + CUR.numIDefs; - - for ( ; def < limit; def++ ) - if ( def->opc == (FT_ULong)args[0] ) - break; - - if ( def == limit ) - { - /* check that there is enough room for a new instruction */ - if ( CUR.numIDefs >= CUR.maxIDefs ) - { - CUR.error = TT_Err_Too_Many_Instruction_Defs; - return; - } - CUR.numIDefs++; - } - - /* opcode must be unsigned 8-bit integer */ - if ( 0 > args[0] || args[0] > 0x00FF ) - { - CUR.error = TT_Err_Too_Many_Instruction_Defs; - return; - } - - def->opc = (FT_Byte)args[0]; - def->start = CUR.IP + 1; - def->range = CUR.curRange; - def->active = TRUE; - - if ( (FT_ULong)args[0] > CUR.maxIns ) - CUR.maxIns = (FT_Byte)args[0]; - - /* Now skip the whole function definition. */ - /* We don't allow nested IDEFs & FDEFs. */ - - while ( SKIP_Code() == SUCCESS ) - { - switch ( CUR.opcode ) - { - case 0x89: /* IDEF */ - case 0x2C: /* FDEF */ - CUR.error = TT_Err_Nested_DEFS; - return; - case 0x2D: /* ENDF */ - return; - } - } - } - - - /*************************************************************************/ - /* */ - /* PUSHING DATA ONTO THE INTERPRETER STACK */ - /* */ - /* Instructions appear in the specification's order. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* NPUSHB[]: PUSH N Bytes */ - /* Opcode range: 0x40 */ - /* Stack: --> uint32... */ - /* */ - static void - Ins_NPUSHB( INS_ARG ) - { - FT_UShort L, K; - - - L = (FT_UShort)CUR.code[CUR.IP + 1]; - - if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) - { - CUR.error = TT_Err_Stack_Overflow; - return; - } - - for ( K = 1; K <= L; K++ ) - args[K - 1] = CUR.code[CUR.IP + K + 1]; - - CUR.new_top += L; - } - - - /*************************************************************************/ - /* */ - /* NPUSHW[]: PUSH N Words */ - /* Opcode range: 0x41 */ - /* Stack: --> int32... */ - /* */ - static void - Ins_NPUSHW( INS_ARG ) - { - FT_UShort L, K; - - - L = (FT_UShort)CUR.code[CUR.IP + 1]; - - if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) - { - CUR.error = TT_Err_Stack_Overflow; - return; - } - - CUR.IP += 2; - - for ( K = 0; K < L; K++ ) - args[K] = GET_ShortIns(); - - CUR.step_ins = FALSE; - CUR.new_top += L; - } - - - /*************************************************************************/ - /* */ - /* PUSHB[abc]: PUSH Bytes */ - /* Opcode range: 0xB0-0xB7 */ - /* Stack: --> uint32... */ - /* */ - static void - Ins_PUSHB( INS_ARG ) - { - FT_UShort L, K; - - - L = (FT_UShort)( CUR.opcode - 0xB0 + 1 ); - - if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) - { - CUR.error = TT_Err_Stack_Overflow; - return; - } - - for ( K = 1; K <= L; K++ ) - args[K - 1] = CUR.code[CUR.IP + K]; - } - - - /*************************************************************************/ - /* */ - /* PUSHW[abc]: PUSH Words */ - /* Opcode range: 0xB8-0xBF */ - /* Stack: --> int32... */ - /* */ - static void - Ins_PUSHW( INS_ARG ) - { - FT_UShort L, K; - - - L = (FT_UShort)( CUR.opcode - 0xB8 + 1 ); - - if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) - { - CUR.error = TT_Err_Stack_Overflow; - return; - } - - CUR.IP++; - - for ( K = 0; K < L; K++ ) - args[K] = GET_ShortIns(); - - CUR.step_ins = FALSE; - } - - - /*************************************************************************/ - /* */ - /* MANAGING THE GRAPHICS STATE */ - /* */ - /* Instructions appear in the specs' order. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* GC[a]: Get Coordinate projected onto */ - /* Opcode range: 0x46-0x47 */ - /* Stack: uint32 --> f26.6 */ - /* */ - /* BULLSHIT: Measures from the original glyph must be taken along the */ - /* dual projection vector! */ - /* */ - static void - Ins_GC( INS_ARG ) - { - FT_ULong L; - FT_F26Dot6 R; - - - L = (FT_ULong)args[0]; - - if ( BOUNDSL( L, CUR.zp2.n_points ) ) - { - if ( CUR.pedantic_hinting ) - { - CUR.error = TT_Err_Invalid_Reference; - return; - } - else - R = 0; - } - else - { - if ( CUR.opcode & 1 ) - R = CUR_fast_dualproj( &CUR.zp2.org[L] ); - else - R = CUR_fast_project( &CUR.zp2.cur[L] ); - } - - args[0] = R; - } - - - /*************************************************************************/ - /* */ - /* SCFS[]: Set Coordinate From Stack */ - /* Opcode range: 0x48 */ - /* Stack: f26.6 uint32 --> */ - /* */ - /* Formula: */ - /* */ - /* OA := OA + ( value - OA.p )/( f.p ) * f */ - /* */ - static void - Ins_SCFS( INS_ARG ) - { - FT_Long K; - FT_UShort L; - - - L = (FT_UShort)args[0]; - - if ( BOUNDS( L, CUR.zp2.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - K = CUR_fast_project( &CUR.zp2.cur[L] ); - - CUR_Func_move( &CUR.zp2, L, args[1] - K ); - - /* not part of the specs, but here for safety */ - - if ( CUR.GS.gep2 == 0 ) - CUR.zp2.org[L] = CUR.zp2.cur[L]; - } - - - /*************************************************************************/ - /* */ - /* MD[a]: Measure Distance */ - /* Opcode range: 0x49-0x4A */ - /* Stack: uint32 uint32 --> f26.6 */ - /* */ - /* BULLSHIT: Measure taken in the original glyph must be along the dual */ - /* projection vector. */ - /* */ - /* Second BULLSHIT: Flag attributes are inverted! */ - /* 0 => measure distance in original outline */ - /* 1 => measure distance in grid-fitted outline */ - /* */ - /* Third one: `zp0 - zp1', and not `zp2 - zp1! */ - /* */ - static void - Ins_MD( INS_ARG ) - { - FT_UShort K, L; - FT_F26Dot6 D; - - - K = (FT_UShort)args[1]; - L = (FT_UShort)args[0]; - - if ( BOUNDS( L, CUR.zp0.n_points ) || - BOUNDS( K, CUR.zp1.n_points ) ) - { - if ( CUR.pedantic_hinting ) - { - CUR.error = TT_Err_Invalid_Reference; - return; - } - D = 0; - } - else - { - if ( CUR.opcode & 1 ) - D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K ); - else - { - FT_Vector* vec1 = CUR.zp0.orus + L; - FT_Vector* vec2 = CUR.zp1.orus + K; - - - if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) - { - /* this should be faster */ - D = CUR_Func_dualproj( vec1, vec2 ); - D = TT_MULFIX( D, CUR.metrics.x_scale ); - } - else - { - FT_Vector vec; - - - vec.x = TT_MULFIX( vec1->x - vec2->x, CUR.metrics.x_scale ); - vec.y = TT_MULFIX( vec1->y - vec2->y, CUR.metrics.y_scale ); - - D = CUR_fast_dualproj( &vec ); - } - } - } - - args[0] = D; - } - - - /*************************************************************************/ - /* */ - /* SDPVTL[a]: Set Dual PVector to Line */ - /* Opcode range: 0x86-0x87 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_SDPVTL( INS_ARG ) - { - FT_Long A, B, C; - FT_UShort p1, p2; /* was FT_Int in pas type ERROR */ - - - p1 = (FT_UShort)args[1]; - p2 = (FT_UShort)args[0]; - - if ( BOUNDS( p2, CUR.zp1.n_points ) || - BOUNDS( p1, CUR.zp2.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - { - FT_Vector* v1 = CUR.zp1.org + p2; - FT_Vector* v2 = CUR.zp2.org + p1; - - - A = v1->x - v2->x; - B = v1->y - v2->y; - } - - if ( ( CUR.opcode & 1 ) != 0 ) - { - C = B; /* counter clockwise rotation */ - B = A; - A = -C; - } - - NORMalize( A, B, &CUR.GS.dualVector ); - - { - FT_Vector* v1 = CUR.zp1.cur + p2; - FT_Vector* v2 = CUR.zp2.cur + p1; - - - A = v1->x - v2->x; - B = v1->y - v2->y; - } - - if ( ( CUR.opcode & 1 ) != 0 ) - { - C = B; /* counter clockwise rotation */ - B = A; - A = -C; - } - - NORMalize( A, B, &CUR.GS.projVector ); - - GUESS_VECTOR( freeVector ); - - COMPUTE_Funcs(); - } - - - /*************************************************************************/ - /* */ - /* SZP0[]: Set Zone Pointer 0 */ - /* Opcode range: 0x13 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SZP0( INS_ARG ) - { - switch ( (FT_Int)args[0] ) - { - case 0: - CUR.zp0 = CUR.twilight; - break; - - case 1: - CUR.zp0 = CUR.pts; - break; - - default: - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - CUR.GS.gep0 = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* SZP1[]: Set Zone Pointer 1 */ - /* Opcode range: 0x14 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SZP1( INS_ARG ) - { - switch ( (FT_Int)args[0] ) - { - case 0: - CUR.zp1 = CUR.twilight; - break; - - case 1: - CUR.zp1 = CUR.pts; - break; - - default: - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - CUR.GS.gep1 = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* SZP2[]: Set Zone Pointer 2 */ - /* Opcode range: 0x15 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SZP2( INS_ARG ) - { - switch ( (FT_Int)args[0] ) - { - case 0: - CUR.zp2 = CUR.twilight; - break; - - case 1: - CUR.zp2 = CUR.pts; - break; - - default: - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - CUR.GS.gep2 = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* SZPS[]: Set Zone PointerS */ - /* Opcode range: 0x16 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SZPS( INS_ARG ) - { - switch ( (FT_Int)args[0] ) - { - case 0: - CUR.zp0 = CUR.twilight; - break; - - case 1: - CUR.zp0 = CUR.pts; - break; - - default: - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - CUR.zp1 = CUR.zp0; - CUR.zp2 = CUR.zp0; - - CUR.GS.gep0 = (FT_UShort)args[0]; - CUR.GS.gep1 = (FT_UShort)args[0]; - CUR.GS.gep2 = (FT_UShort)args[0]; - } - - - /*************************************************************************/ - /* */ - /* INSTCTRL[]: INSTruction ConTRoL */ - /* Opcode range: 0x8e */ - /* Stack: int32 int32 --> */ - /* */ - static void - Ins_INSTCTRL( INS_ARG ) - { - FT_Long K, L; - - - K = args[1]; - L = args[0]; - - if ( K < 1 || K > 2 ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - if ( L != 0 ) - L = K; - - CUR.GS.instruct_control = FT_BOOL( - ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L ); - } - - - /*************************************************************************/ - /* */ - /* SCANCTRL[]: SCAN ConTRoL */ - /* Opcode range: 0x85 */ - /* Stack: uint32? --> */ - /* */ - static void - Ins_SCANCTRL( INS_ARG ) - { - FT_Int A; - - - /* Get Threshold */ - A = (FT_Int)( args[0] & 0xFF ); - - if ( A == 0xFF ) - { - CUR.GS.scan_control = TRUE; - return; - } - else if ( A == 0 ) - { - CUR.GS.scan_control = FALSE; - return; - } - - if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A ) - CUR.GS.scan_control = TRUE; - - if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated ) - CUR.GS.scan_control = TRUE; - - if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched ) - CUR.GS.scan_control = TRUE; - - if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A ) - CUR.GS.scan_control = FALSE; - - if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated ) - CUR.GS.scan_control = FALSE; - - if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched ) - CUR.GS.scan_control = FALSE; - } - - - /*************************************************************************/ - /* */ - /* SCANTYPE[]: SCAN TYPE */ - /* Opcode range: 0x8D */ - /* Stack: uint32? --> */ - /* */ - static void - Ins_SCANTYPE( INS_ARG ) - { - if ( args[0] >= 0 ) - CUR.GS.scan_type = (FT_Int)args[0]; - } - - - /*************************************************************************/ - /* */ - /* MANAGING OUTLINES */ - /* */ - /* Instructions appear in the specification's order. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* FLIPPT[]: FLIP PoinT */ - /* Opcode range: 0x80 */ - /* Stack: uint32... --> */ - /* */ - static void - Ins_FLIPPT( INS_ARG ) - { - FT_UShort point; - - FT_UNUSED_ARG; - - - if ( CUR.top < CUR.GS.loop ) - { - CUR.error = TT_Err_Too_Few_Arguments; - return; - } - - while ( CUR.GS.loop > 0 ) - { - CUR.args--; - - point = (FT_UShort)CUR.stack[CUR.args]; - - if ( BOUNDS( point, CUR.pts.n_points ) ) - { - if ( CUR.pedantic_hinting ) - { - CUR.error = TT_Err_Invalid_Reference; - return; - } - } - else - CUR.pts.tags[point] ^= FT_CURVE_TAG_ON; - - CUR.GS.loop--; - } - - CUR.GS.loop = 1; - CUR.new_top = CUR.args; - } - - - /*************************************************************************/ - /* */ - /* FLIPRGON[]: FLIP RanGe ON */ - /* Opcode range: 0x81 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_FLIPRGON( INS_ARG ) - { - FT_UShort I, K, L; - - - K = (FT_UShort)args[1]; - L = (FT_UShort)args[0]; - - if ( BOUNDS( K, CUR.pts.n_points ) || - BOUNDS( L, CUR.pts.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - for ( I = L; I <= K; I++ ) - CUR.pts.tags[I] |= FT_CURVE_TAG_ON; - } - - - /*************************************************************************/ - /* */ - /* FLIPRGOFF: FLIP RanGe OFF */ - /* Opcode range: 0x82 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_FLIPRGOFF( INS_ARG ) - { - FT_UShort I, K, L; - - - K = (FT_UShort)args[1]; - L = (FT_UShort)args[0]; - - if ( BOUNDS( K, CUR.pts.n_points ) || - BOUNDS( L, CUR.pts.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - for ( I = L; I <= K; I++ ) - CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON; - } - - - static FT_Bool - Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6* x, - FT_F26Dot6* y, - TT_GlyphZone zone, - FT_UShort* refp ) - { - TT_GlyphZoneRec zp; - FT_UShort p; - FT_F26Dot6 d; - - - if ( CUR.opcode & 1 ) - { - zp = CUR.zp0; - p = CUR.GS.rp1; - } - else - { - zp = CUR.zp1; - p = CUR.GS.rp2; - } - - if ( BOUNDS( p, zp.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - *refp = 0; - return FAILURE; - } - - *zone = zp; - *refp = p; - - d = CUR_Func_project( zp.cur + p, zp.org + p ); - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - if ( CUR.face->unpatented_hinting ) - { - if ( CUR.GS.both_x_axis ) - { - *x = d; - *y = 0; - } - else - { - *x = 0; - *y = d; - } - } - else -#endif - { - *x = TT_MULDIV( d, - (FT_Long)CUR.GS.freeVector.x * 0x10000L, - CUR.F_dot_P ); - *y = TT_MULDIV( d, - (FT_Long)CUR.GS.freeVector.y * 0x10000L, - CUR.F_dot_P ); - } - - return SUCCESS; - } - - - static void - Move_Zp2_Point( EXEC_OP_ FT_UShort point, - FT_F26Dot6 dx, - FT_F26Dot6 dy, - FT_Bool touch ) - { -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - if ( CUR.face->unpatented_hinting ) - { - if ( CUR.GS.both_x_axis ) - { - CUR.zp2.cur[point].x += dx; - if ( touch ) - CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; - } - else - { - CUR.zp2.cur[point].y += dy; - if ( touch ) - CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; - } - return; - } -#endif - - if ( CUR.GS.freeVector.x != 0 ) - { - CUR.zp2.cur[point].x += dx; - if ( touch ) - CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; - } - - if ( CUR.GS.freeVector.y != 0 ) - { - CUR.zp2.cur[point].y += dy; - if ( touch ) - CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; - } - } - - - /*************************************************************************/ - /* */ - /* SHP[a]: SHift Point by the last point */ - /* Opcode range: 0x32-0x33 */ - /* Stack: uint32... --> */ - /* */ - static void - Ins_SHP( INS_ARG ) - { - TT_GlyphZoneRec zp; - FT_UShort refp; - - FT_F26Dot6 dx, - dy; - FT_UShort point; - - FT_UNUSED_ARG; - - - if ( CUR.top < CUR.GS.loop ) - { - CUR.error = TT_Err_Invalid_Reference; - return; - } - - if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) - return; - - while ( CUR.GS.loop > 0 ) - { - CUR.args--; - point = (FT_UShort)CUR.stack[CUR.args]; - - if ( BOUNDS( point, CUR.zp2.n_points ) ) - { - if ( CUR.pedantic_hinting ) - { - CUR.error = TT_Err_Invalid_Reference; - return; - } - } - else - /* XXX: UNDOCUMENTED! SHP touches the points */ - MOVE_Zp2_Point( point, dx, dy, TRUE ); - - CUR.GS.loop--; - } - - CUR.GS.loop = 1; - CUR.new_top = CUR.args; - } - - - /*************************************************************************/ - /* */ - /* SHC[a]: SHift Contour */ - /* Opcode range: 0x34-35 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SHC( INS_ARG ) - { - TT_GlyphZoneRec zp; - FT_UShort refp; - FT_F26Dot6 dx, - dy; - - FT_Short contour; - FT_UShort first_point, last_point, i; - - - contour = (FT_UShort)args[0]; - - if ( BOUNDS( contour, CUR.pts.n_contours ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) - return; - - if ( contour == 0 ) - first_point = 0; - else - first_point = (FT_UShort)( CUR.pts.contours[contour - 1] + 1 - - CUR.pts.first_point ); - - last_point = (FT_UShort)( CUR.pts.contours[contour] - - CUR.pts.first_point ); - - /* XXX: this is probably wrong... at least it prevents memory */ - /* corruption when zp2 is the twilight zone */ - if ( BOUNDS( last_point, CUR.zp2.n_points ) ) - { - if ( CUR.zp2.n_points > 0 ) - last_point = (FT_UShort)(CUR.zp2.n_points - 1); - else - last_point = 0; - } - - /* XXX: UNDOCUMENTED! SHC touches the points */ - for ( i = first_point; i <= last_point; i++ ) - { - if ( zp.cur != CUR.zp2.cur || refp != i ) - MOVE_Zp2_Point( i, dx, dy, TRUE ); - } - } - - - /*************************************************************************/ - /* */ - /* SHZ[a]: SHift Zone */ - /* Opcode range: 0x36-37 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_SHZ( INS_ARG ) - { - TT_GlyphZoneRec zp; - FT_UShort refp; - FT_F26Dot6 dx, - dy; - - FT_UShort last_point, i; - - - if ( BOUNDS( args[0], 2 ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) - return; - - /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points. */ - /* Twilight zone has no contours, so use `n_points'. */ - /* Normal zone's `n_points' includes phantoms, so must */ - /* use end of last contour. */ - if ( CUR.GS.gep2 == 0 && CUR.zp2.n_points > 0 ) - last_point = (FT_UShort)( CUR.zp2.n_points - 1 ); - else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 ) - last_point = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] ); - else - last_point = 0; - - /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */ - for ( i = 0; i <= last_point; i++ ) - { - if ( zp.cur != CUR.zp2.cur || refp != i ) - MOVE_Zp2_Point( i, dx, dy, FALSE ); - } - } - - - /*************************************************************************/ - /* */ - /* SHPIX[]: SHift points by a PIXel amount */ - /* Opcode range: 0x38 */ - /* Stack: f26.6 uint32... --> */ - /* */ - static void - Ins_SHPIX( INS_ARG ) - { - FT_F26Dot6 dx, dy; - FT_UShort point; - - - if ( CUR.top < CUR.GS.loop + 1 ) - { - CUR.error = TT_Err_Invalid_Reference; - return; - } - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - if ( CUR.face->unpatented_hinting ) - { - if ( CUR.GS.both_x_axis ) - { - dx = TT_MulFix14( (FT_UInt32)args[0], 0x4000 ); - dy = 0; - } - else - { - dx = 0; - dy = TT_MulFix14( (FT_UInt32)args[0], 0x4000 ); - } - } - else -#endif - { - dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x ); - dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y ); - } - - while ( CUR.GS.loop > 0 ) - { - CUR.args--; - - point = (FT_UShort)CUR.stack[CUR.args]; - - if ( BOUNDS( point, CUR.zp2.n_points ) ) - { - if ( CUR.pedantic_hinting ) - { - CUR.error = TT_Err_Invalid_Reference; - return; - } - } - else - MOVE_Zp2_Point( point, dx, dy, TRUE ); - - CUR.GS.loop--; - } - - CUR.GS.loop = 1; - CUR.new_top = CUR.args; - } - - - /*************************************************************************/ - /* */ - /* MSIRP[a]: Move Stack Indirect Relative Position */ - /* Opcode range: 0x3A-0x3B */ - /* Stack: f26.6 uint32 --> */ - /* */ - static void - Ins_MSIRP( INS_ARG ) - { - FT_UShort point; - FT_F26Dot6 distance; - - - point = (FT_UShort)args[0]; - - if ( BOUNDS( point, CUR.zp1.n_points ) || - BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - /* XXX: UNDOCUMENTED! behaviour */ - if ( CUR.GS.gep1 == 0 ) /* if the point that is to be moved */ - /* is in twilight zone */ - { - CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0]; - CUR_Func_move_orig( &CUR.zp1, point, args[1] ); - CUR.zp1.cur[point] = CUR.zp1.org[point]; - } - - distance = CUR_Func_project( CUR.zp1.cur + point, - CUR.zp0.cur + CUR.GS.rp0 ); - - CUR_Func_move( &CUR.zp1, point, args[1] - distance ); - - CUR.GS.rp1 = CUR.GS.rp0; - CUR.GS.rp2 = point; - - if ( ( CUR.opcode & 1 ) != 0 ) - CUR.GS.rp0 = point; - } - - - /*************************************************************************/ - /* */ - /* MDAP[a]: Move Direct Absolute Point */ - /* Opcode range: 0x2E-0x2F */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_MDAP( INS_ARG ) - { - FT_UShort point; - FT_F26Dot6 cur_dist, - distance; - - - point = (FT_UShort)args[0]; - - if ( BOUNDS( point, CUR.zp0.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - /* XXX: Is there some undocumented feature while in the */ - /* twilight zone? ? */ - if ( ( CUR.opcode & 1 ) != 0 ) - { - cur_dist = CUR_fast_project( &CUR.zp0.cur[point] ); - distance = CUR_Func_round( cur_dist, - CUR.tt_metrics.compensations[0] ) - cur_dist; - } - else - distance = 0; - - CUR_Func_move( &CUR.zp0, point, distance ); - - CUR.GS.rp0 = point; - CUR.GS.rp1 = point; - } - - - /*************************************************************************/ - /* */ - /* MIAP[a]: Move Indirect Absolute Point */ - /* Opcode range: 0x3E-0x3F */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_MIAP( INS_ARG ) - { - FT_ULong cvtEntry; - FT_UShort point; - FT_F26Dot6 distance, - org_dist; - - - cvtEntry = (FT_ULong)args[1]; - point = (FT_UShort)args[0]; - - if ( BOUNDS( point, CUR.zp0.n_points ) || - BOUNDSL( cvtEntry, CUR.cvtSize ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - /* XXX: UNDOCUMENTED! */ - /* */ - /* The behaviour of an MIAP instruction is quite */ - /* different when used in the twilight zone. */ - /* */ - /* First, no control value cut-in test is performed */ - /* as it would fail anyway. Second, the original */ - /* point, i.e. (org_x,org_y) of zp0.point, is set */ - /* to the absolute, unrounded distance found in */ - /* the CVT. */ - /* */ - /* This is used in the CVT programs of the Microsoft */ - /* fonts Arial, Times, etc., in order to re-adjust */ - /* some key font heights. It allows the use of the */ - /* IP instruction in the twilight zone, which */ - /* otherwise would be `illegal' according to the */ - /* specification. */ - /* */ - /* We implement it with a special sequence for the */ - /* twilight zone. This is a bad hack, but it seems */ - /* to work. */ - - distance = CUR_Func_read_cvt( cvtEntry ); - - if ( CUR.GS.gep0 == 0 ) /* If in twilight zone */ - { - CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance, CUR.GS.freeVector.x ); - CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance, CUR.GS.freeVector.y ), - CUR.zp0.cur[point] = CUR.zp0.org[point]; - } - - org_dist = CUR_fast_project( &CUR.zp0.cur[point] ); - - if ( ( CUR.opcode & 1 ) != 0 ) /* rounding and control cutin flag */ - { - if ( FT_ABS( distance - org_dist ) > CUR.GS.control_value_cutin ) - distance = org_dist; - - distance = CUR_Func_round( distance, CUR.tt_metrics.compensations[0] ); - } - - CUR_Func_move( &CUR.zp0, point, distance - org_dist ); - - CUR.GS.rp0 = point; - CUR.GS.rp1 = point; - } - - - /*************************************************************************/ - /* */ - /* MDRP[abcde]: Move Direct Relative Point */ - /* Opcode range: 0xC0-0xDF */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_MDRP( INS_ARG ) - { - FT_UShort point; - FT_F26Dot6 org_dist, distance; - - - point = (FT_UShort)args[0]; - - if ( BOUNDS( point, CUR.zp1.n_points ) || - BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - /* XXX: Is there some undocumented feature while in the */ - /* twilight zone? */ - - /* XXX: UNDOCUMENTED: twilight zone special case */ - - if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 ) - { - FT_Vector* vec1 = &CUR.zp1.org[point]; - FT_Vector* vec2 = &CUR.zp0.org[CUR.GS.rp0]; - - - org_dist = CUR_Func_dualproj( vec1, vec2 ); - } - else - { - FT_Vector* vec1 = &CUR.zp1.orus[point]; - FT_Vector* vec2 = &CUR.zp0.orus[CUR.GS.rp0]; - - - if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) - { - /* this should be faster */ - org_dist = CUR_Func_dualproj( vec1, vec2 ); - org_dist = TT_MULFIX( org_dist, CUR.metrics.x_scale ); - } - else - { - FT_Vector vec; - - - vec.x = TT_MULFIX( vec1->x - vec2->x, CUR.metrics.x_scale ); - vec.y = TT_MULFIX( vec1->y - vec2->y, CUR.metrics.y_scale ); - - org_dist = CUR_fast_dualproj( &vec ); - } - } - - /* single width cut-in test */ - - if ( FT_ABS( org_dist - CUR.GS.single_width_value ) < - CUR.GS.single_width_cutin ) - { - if ( org_dist >= 0 ) - org_dist = CUR.GS.single_width_value; - else - org_dist = -CUR.GS.single_width_value; - } - - /* round flag */ - - if ( ( CUR.opcode & 4 ) != 0 ) - distance = CUR_Func_round( - org_dist, - CUR.tt_metrics.compensations[CUR.opcode & 3] ); - else - distance = ROUND_None( - org_dist, - CUR.tt_metrics.compensations[CUR.opcode & 3] ); - - /* minimum distance flag */ - - if ( ( CUR.opcode & 8 ) != 0 ) - { - if ( org_dist >= 0 ) - { - if ( distance < CUR.GS.minimum_distance ) - distance = CUR.GS.minimum_distance; - } - else - { - if ( distance > -CUR.GS.minimum_distance ) - distance = -CUR.GS.minimum_distance; - } - } - - /* now move the point */ - - org_dist = CUR_Func_project( CUR.zp1.cur + point, - CUR.zp0.cur + CUR.GS.rp0 ); - - CUR_Func_move( &CUR.zp1, point, distance - org_dist ); - - CUR.GS.rp1 = CUR.GS.rp0; - CUR.GS.rp2 = point; - - if ( ( CUR.opcode & 16 ) != 0 ) - CUR.GS.rp0 = point; - } - - - /*************************************************************************/ - /* */ - /* MIRP[abcde]: Move Indirect Relative Point */ - /* Opcode range: 0xE0-0xFF */ - /* Stack: int32? uint32 --> */ - /* */ - static void - Ins_MIRP( INS_ARG ) - { - FT_UShort point; - FT_ULong cvtEntry; - - FT_F26Dot6 cvt_dist, - distance, - cur_dist, - org_dist; - - - point = (FT_UShort)args[0]; - cvtEntry = (FT_ULong)( args[1] + 1 ); - - /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */ - - if ( BOUNDS( point, CUR.zp1.n_points ) || - BOUNDSL( cvtEntry, CUR.cvtSize + 1 ) || - BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - if ( !cvtEntry ) - cvt_dist = 0; - else - cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 ); - - /* single width test */ - - if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) < - CUR.GS.single_width_cutin ) - { - if ( cvt_dist >= 0 ) - cvt_dist = CUR.GS.single_width_value; - else - cvt_dist = -CUR.GS.single_width_value; - } - - /* XXX: UNDOCUMENTED! -- twilight zone */ - - if ( CUR.GS.gep1 == 0 ) - { - CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x + - TT_MulFix14( (FT_UInt32)cvt_dist, - CUR.GS.freeVector.x ); - - CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y + - TT_MulFix14( (FT_UInt32)cvt_dist, - CUR.GS.freeVector.y ); - - CUR.zp1.cur[point] = CUR.zp0.cur[point]; - } - - org_dist = CUR_Func_dualproj( &CUR.zp1.org[point], - &CUR.zp0.org[CUR.GS.rp0] ); - cur_dist = CUR_Func_project ( &CUR.zp1.cur[point], - &CUR.zp0.cur[CUR.GS.rp0] ); - - /* auto-flip test */ - - if ( CUR.GS.auto_flip ) - { - if ( ( org_dist ^ cvt_dist ) < 0 ) - cvt_dist = -cvt_dist; - } - - /* control value cutin and round */ - - if ( ( CUR.opcode & 4 ) != 0 ) - { - /* XXX: UNDOCUMENTED! Only perform cut-in test when both points */ - /* refer to the same zone. */ - - if ( CUR.GS.gep0 == CUR.GS.gep1 ) - if ( FT_ABS( cvt_dist - org_dist ) >= CUR.GS.control_value_cutin ) - cvt_dist = org_dist; - - distance = CUR_Func_round( - cvt_dist, - CUR.tt_metrics.compensations[CUR.opcode & 3] ); - } - else - distance = ROUND_None( - cvt_dist, - CUR.tt_metrics.compensations[CUR.opcode & 3] ); - - /* minimum distance test */ - - if ( ( CUR.opcode & 8 ) != 0 ) - { - if ( org_dist >= 0 ) - { - if ( distance < CUR.GS.minimum_distance ) - distance = CUR.GS.minimum_distance; - } - else - { - if ( distance > -CUR.GS.minimum_distance ) - distance = -CUR.GS.minimum_distance; - } - } - - CUR_Func_move( &CUR.zp1, point, distance - cur_dist ); - - CUR.GS.rp1 = CUR.GS.rp0; - - if ( ( CUR.opcode & 16 ) != 0 ) - CUR.GS.rp0 = point; - - /* XXX: UNDOCUMENTED! */ - CUR.GS.rp2 = point; - } - - - /*************************************************************************/ - /* */ - /* ALIGNRP[]: ALIGN Relative Point */ - /* Opcode range: 0x3C */ - /* Stack: uint32 uint32... --> */ - /* */ - static void - Ins_ALIGNRP( INS_ARG ) - { - FT_UShort point; - FT_F26Dot6 distance; - - FT_UNUSED_ARG; - - - if ( CUR.top < CUR.GS.loop || - BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - while ( CUR.GS.loop > 0 ) - { - CUR.args--; - - point = (FT_UShort)CUR.stack[CUR.args]; - - if ( BOUNDS( point, CUR.zp1.n_points ) ) - { - if ( CUR.pedantic_hinting ) - { - CUR.error = TT_Err_Invalid_Reference; - return; - } - } - else - { - distance = CUR_Func_project( CUR.zp1.cur + point, - CUR.zp0.cur + CUR.GS.rp0 ); - - CUR_Func_move( &CUR.zp1, point, -distance ); - } - - CUR.GS.loop--; - } - - CUR.GS.loop = 1; - CUR.new_top = CUR.args; - } - - - /*************************************************************************/ - /* */ - /* ISECT[]: moves point to InterSECTion */ - /* Opcode range: 0x0F */ - /* Stack: 5 * uint32 --> */ - /* */ - static void - Ins_ISECT( INS_ARG ) - { - FT_UShort point, - a0, a1, - b0, b1; - - FT_F26Dot6 discriminant; - - FT_F26Dot6 dx, dy, - dax, day, - dbx, dby; - - FT_F26Dot6 val; - - FT_Vector R; - - - point = (FT_UShort)args[0]; - - a0 = (FT_UShort)args[1]; - a1 = (FT_UShort)args[2]; - b0 = (FT_UShort)args[3]; - b1 = (FT_UShort)args[4]; - - if ( BOUNDS( b0, CUR.zp0.n_points ) || - BOUNDS( b1, CUR.zp0.n_points ) || - BOUNDS( a0, CUR.zp1.n_points ) || - BOUNDS( a1, CUR.zp1.n_points ) || - BOUNDS( point, CUR.zp2.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x; - dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y; - - dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x; - day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y; - - dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x; - dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y; - - CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH; - - discriminant = TT_MULDIV( dax, -dby, 0x40 ) + - TT_MULDIV( day, dbx, 0x40 ); - - if ( FT_ABS( discriminant ) >= 0x40 ) - { - val = TT_MULDIV( dx, -dby, 0x40 ) + TT_MULDIV( dy, dbx, 0x40 ); - - R.x = TT_MULDIV( val, dax, discriminant ); - R.y = TT_MULDIV( val, day, discriminant ); - - CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x; - CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y; - } - else - { - /* else, take the middle of the middles of A and B */ - - CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x + - CUR.zp1.cur[a1].x + - CUR.zp0.cur[b0].x + - CUR.zp0.cur[b1].x ) / 4; - CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y + - CUR.zp1.cur[a1].y + - CUR.zp0.cur[b0].y + - CUR.zp0.cur[b1].y ) / 4; - } - } - - - /*************************************************************************/ - /* */ - /* ALIGNPTS[]: ALIGN PoinTS */ - /* Opcode range: 0x27 */ - /* Stack: uint32 uint32 --> */ - /* */ - static void - Ins_ALIGNPTS( INS_ARG ) - { - FT_UShort p1, p2; - FT_F26Dot6 distance; - - - p1 = (FT_UShort)args[0]; - p2 = (FT_UShort)args[1]; - - if ( BOUNDS( p1, CUR.zp1.n_points ) || - BOUNDS( p2, CUR.zp0.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - distance = CUR_Func_project( CUR.zp0.cur + p2, - CUR.zp1.cur + p1 ) / 2; - - CUR_Func_move( &CUR.zp1, p1, distance ); - CUR_Func_move( &CUR.zp0, p2, -distance ); - } - - - /*************************************************************************/ - /* */ - /* IP[]: Interpolate Point */ - /* Opcode range: 0x39 */ - /* Stack: uint32... --> */ - /* */ - - /* SOMETIMES, DUMBER CODE IS BETTER CODE */ - - static void - Ins_IP( INS_ARG ) - { - FT_F26Dot6 old_range, cur_range; - FT_Vector* orus_base; - FT_Vector* cur_base; - FT_Int twilight; - - FT_UNUSED_ARG; - - - if ( CUR.top < CUR.GS.loop ) - { - CUR.error = TT_Err_Invalid_Reference; - return; - } - - /* - * We need to deal in a special way with the twilight zone. - * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0), - * for every n. - */ - twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0; - - if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - if ( twilight ) - orus_base = &CUR.zp0.org[CUR.GS.rp1]; - else - orus_base = &CUR.zp0.orus[CUR.GS.rp1]; - - cur_base = &CUR.zp0.cur[CUR.GS.rp1]; - - /* XXX: There are some glyphs in some braindead but popular */ - /* fonts out there (e.g. [aeu]grave in monotype.ttf) */ - /* calling IP[] with bad values of rp[12]. */ - /* Do something sane when this odd thing happens. */ - if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) || - BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) ) - { - old_range = 0; - cur_range = 0; - } - else - { - if ( twilight ) - old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2], - orus_base ); - else - old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2], - orus_base ); - - cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base ); - } - - for ( ; CUR.GS.loop > 0; --CUR.GS.loop ) - { - FT_UInt point = (FT_UInt)CUR.stack[--CUR.args]; - FT_F26Dot6 org_dist, cur_dist, new_dist; - - - /* check point bounds */ - if ( BOUNDS( point, CUR.zp2.n_points ) ) - { - if ( CUR.pedantic_hinting ) - { - CUR.error = TT_Err_Invalid_Reference; - return; - } - continue; - } - - if ( twilight ) - org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base ); - else - org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base ); - - cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base ); - - if ( org_dist ) - new_dist = ( old_range != 0 ) - ? TT_MULDIV( org_dist, cur_range, old_range ) - : cur_dist; - else - new_dist = 0; - - CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist ); - } - CUR.GS.loop = 1; - CUR.new_top = CUR.args; - } - - - /*************************************************************************/ - /* */ - /* UTP[a]: UnTouch Point */ - /* Opcode range: 0x29 */ - /* Stack: uint32 --> */ - /* */ - static void - Ins_UTP( INS_ARG ) - { - FT_UShort point; - FT_Byte mask; - - - point = (FT_UShort)args[0]; - - if ( BOUNDS( point, CUR.zp0.n_points ) ) - { - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - return; - } - - mask = 0xFF; - - if ( CUR.GS.freeVector.x != 0 ) - mask &= ~FT_CURVE_TAG_TOUCH_X; - - if ( CUR.GS.freeVector.y != 0 ) - mask &= ~FT_CURVE_TAG_TOUCH_Y; - - CUR.zp0.tags[point] &= mask; - } - - - /* Local variables for Ins_IUP: */ - typedef struct IUP_WorkerRec_ - { - FT_Vector* orgs; /* original and current coordinate */ - FT_Vector* curs; /* arrays */ - FT_Vector* orus; - FT_UInt max_points; - - } IUP_WorkerRec, *IUP_Worker; - - - static void - _iup_worker_shift( IUP_Worker worker, - FT_UInt p1, - FT_UInt p2, - FT_UInt p ) - { - FT_UInt i; - FT_F26Dot6 dx; - - - dx = worker->curs[p].x - worker->orgs[p].x; - if ( dx != 0 ) - { - for ( i = p1; i < p; i++ ) - worker->curs[i].x += dx; - - for ( i = p + 1; i <= p2; i++ ) - worker->curs[i].x += dx; - } - } - - - static void - _iup_worker_interpolate( IUP_Worker worker, - FT_UInt p1, - FT_UInt p2, - FT_UInt ref1, - FT_UInt ref2 ) - { - FT_UInt i; - FT_F26Dot6 orus1, orus2, org1, org2, delta1, delta2; - - - if ( p1 > p2 ) - return; - - if ( BOUNDS( ref1, worker->max_points ) || - BOUNDS( ref2, worker->max_points ) ) - return; - - orus1 = worker->orus[ref1].x; - orus2 = worker->orus[ref2].x; - - if ( orus1 > orus2 ) - { - FT_F26Dot6 tmp_o; - FT_UInt tmp_r; - - - tmp_o = orus1; - orus1 = orus2; - orus2 = tmp_o; - - tmp_r = ref1; - ref1 = ref2; - ref2 = tmp_r; - } - - org1 = worker->orgs[ref1].x; - org2 = worker->orgs[ref2].x; - delta1 = worker->curs[ref1].x - org1; - delta2 = worker->curs[ref2].x - org2; - - if ( orus1 == orus2 ) - { - /* simple shift of untouched points */ - for ( i = p1; i <= p2; i++ ) - { - FT_F26Dot6 x = worker->orgs[i].x; - - - if ( x <= org1 ) - x += delta1; - else - x += delta2; - - worker->curs[i].x = x; - } - } - else - { - FT_Fixed scale = 0; - FT_Bool scale_valid = 0; - - - /* interpolation */ - for ( i = p1; i <= p2; i++ ) - { - FT_F26Dot6 x = worker->orgs[i].x; - - - if ( x <= org1 ) - x += delta1; - - else if ( x >= org2 ) - x += delta2; - - else - { - if ( !scale_valid ) - { - scale_valid = 1; - scale = TT_MULDIV( org2 + delta2 - ( org1 + delta1 ), - 0x10000L, orus2 - orus1 ); - } - - x = ( org1 + delta1 ) + - TT_MULFIX( worker->orus[i].x - orus1, scale ); - } - worker->curs[i].x = x; - } - } - } - - - /*************************************************************************/ - /* */ - /* IUP[a]: Interpolate Untouched Points */ - /* Opcode range: 0x30-0x31 */ - /* Stack: --> */ - /* */ - static void - Ins_IUP( INS_ARG ) - { - IUP_WorkerRec V; - FT_Byte mask; - - FT_UInt first_point; /* first point of contour */ - FT_UInt end_point; /* end point (last+1) of contour */ - - FT_UInt first_touched; /* first touched point in contour */ - FT_UInt cur_touched; /* current touched point in contour */ - - FT_UInt point; /* current point */ - FT_Short contour; /* current contour */ - - FT_UNUSED_ARG; - - - /* ignore empty outlines */ - if ( CUR.pts.n_contours == 0 ) - return; - - if ( CUR.opcode & 1 ) - { - mask = FT_CURVE_TAG_TOUCH_X; - V.orgs = CUR.pts.org; - V.curs = CUR.pts.cur; - V.orus = CUR.pts.orus; - } - else - { - mask = FT_CURVE_TAG_TOUCH_Y; - V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 ); - V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 ); - V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 ); - } - V.max_points = CUR.pts.n_points; - - contour = 0; - point = 0; - - do - { - end_point = CUR.pts.contours[contour] - CUR.pts.first_point; - first_point = point; - - if ( BOUNDS ( end_point, CUR.pts.n_points ) ) - end_point = CUR.pts.n_points - 1; - - while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 ) - point++; - - if ( point <= end_point ) - { - first_touched = point; - cur_touched = point; - - point++; - - while ( point <= end_point ) - { - if ( ( CUR.pts.tags[point] & mask ) != 0 ) - { - if ( point > 0 ) - _iup_worker_interpolate( &V, - cur_touched + 1, - point - 1, - cur_touched, - point ); - cur_touched = point; - } - - point++; - } - - if ( cur_touched == first_touched ) - _iup_worker_shift( &V, first_point, end_point, cur_touched ); - else - { - _iup_worker_interpolate( &V, - (FT_UShort)( cur_touched + 1 ), - end_point, - cur_touched, - first_touched ); - - if ( first_touched > 0 ) - _iup_worker_interpolate( &V, - first_point, - first_touched - 1, - cur_touched, - first_touched ); - } - } - contour++; - } while ( contour < CUR.pts.n_contours ); - } - - - /*************************************************************************/ - /* */ - /* DELTAPn[]: DELTA exceptions P1, P2, P3 */ - /* Opcode range: 0x5D,0x71,0x72 */ - /* Stack: uint32 (2 * uint32)... --> */ - /* */ - static void - Ins_DELTAP( INS_ARG ) - { - FT_ULong k, nump; - FT_UShort A; - FT_ULong C; - FT_Long B; - - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - /* Delta hinting is covered by US Patent 5159668. */ - if ( CUR.face->unpatented_hinting ) - { - FT_Long n = args[0] * 2; - - - if ( CUR.args < n ) - { - CUR.error = TT_Err_Too_Few_Arguments; - return; - } - - CUR.args -= n; - CUR.new_top = CUR.args; - return; - } -#endif - - nump = (FT_ULong)args[0]; /* some points theoretically may occur more - than once, thus UShort isn't enough */ - - for ( k = 1; k <= nump; k++ ) - { - if ( CUR.args < 2 ) - { - CUR.error = TT_Err_Too_Few_Arguments; - return; - } - - CUR.args -= 2; - - A = (FT_UShort)CUR.stack[CUR.args + 1]; - B = CUR.stack[CUR.args]; - - /* XXX: Because some popular fonts contain some invalid DeltaP */ - /* instructions, we simply ignore them when the stacked */ - /* point reference is off limit, rather than returning an */ - /* error. As a delta instruction doesn't change a glyph */ - /* in great ways, this shouldn't be a problem. */ - - if ( !BOUNDS( A, CUR.zp0.n_points ) ) - { - C = ( (FT_ULong)B & 0xF0 ) >> 4; - - switch ( CUR.opcode ) - { - case 0x5D: - break; - - case 0x71: - C += 16; - break; - - case 0x72: - C += 32; - break; - } - - C += CUR.GS.delta_base; - - if ( CURRENT_Ppem() == (FT_Long)C ) - { - B = ( (FT_ULong)B & 0xF ) - 8; - if ( B >= 0 ) - B++; - B = B * 64 / ( 1L << CUR.GS.delta_shift ); - - CUR_Func_move( &CUR.zp0, A, B ); - } - } - else - if ( CUR.pedantic_hinting ) - CUR.error = TT_Err_Invalid_Reference; - } - - CUR.new_top = CUR.args; - } - - - /*************************************************************************/ - /* */ - /* DELTACn[]: DELTA exceptions C1, C2, C3 */ - /* Opcode range: 0x73,0x74,0x75 */ - /* Stack: uint32 (2 * uint32)... --> */ - /* */ - static void - Ins_DELTAC( INS_ARG ) - { - FT_ULong nump, k; - FT_ULong A, C; - FT_Long B; - - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - /* Delta hinting is covered by US Patent 5159668. */ - if ( CUR.face->unpatented_hinting ) - { - FT_Long n = args[0] * 2; - - - if ( CUR.args < n ) - { - CUR.error = TT_Err_Too_Few_Arguments; - return; - } - - CUR.args -= n; - CUR.new_top = CUR.args; - return; - } -#endif - - nump = (FT_ULong)args[0]; - - for ( k = 1; k <= nump; k++ ) - { - if ( CUR.args < 2 ) - { - CUR.error = TT_Err_Too_Few_Arguments; - return; - } - - CUR.args -= 2; - - A = (FT_ULong)CUR.stack[CUR.args + 1]; - B = CUR.stack[CUR.args]; - - if ( BOUNDSL( A, CUR.cvtSize ) ) - { - if ( CUR.pedantic_hinting ) - { - CUR.error = TT_Err_Invalid_Reference; - return; - } - } - else - { - C = ( (FT_ULong)B & 0xF0 ) >> 4; - - switch ( CUR.opcode ) - { - case 0x73: - break; - - case 0x74: - C += 16; - break; - - case 0x75: - C += 32; - break; - } - - C += CUR.GS.delta_base; - - if ( CURRENT_Ppem() == (FT_Long)C ) - { - B = ( (FT_ULong)B & 0xF ) - 8; - if ( B >= 0 ) - B++; - B = B * 64 / ( 1L << CUR.GS.delta_shift ); - - CUR_Func_move_cvt( A, B ); - } - } - } - - CUR.new_top = CUR.args; - } - - - /*************************************************************************/ - /* */ - /* MISC. INSTRUCTIONS */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* GETINFO[]: GET INFOrmation */ - /* Opcode range: 0x88 */ - /* Stack: uint32 --> uint32 */ - /* */ - static void - Ins_GETINFO( INS_ARG ) - { - FT_Long K; - - - K = 0; - - /* We return MS rasterizer version 1.7 for the font scaler. */ - if ( ( args[0] & 1 ) != 0 ) - K = 35; - - /* Has the glyph been rotated? */ - if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated ) - K |= 0x80; - - /* Has the glyph been stretched? */ - if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched ) - K |= 1 << 8; - - /* Are we hinting for grayscale? */ - if ( ( args[0] & 32 ) != 0 && CUR.grayscale ) - K |= 1 << 12; - - args[0] = K; - } - - - static void - Ins_UNKNOWN( INS_ARG ) - { - TT_DefRecord* def = CUR.IDefs; - TT_DefRecord* limit = def + CUR.numIDefs; - - FT_UNUSED_ARG; - - - for ( ; def < limit; def++ ) - { - if ( (FT_Byte)def->opc == CUR.opcode && def->active ) - { - TT_CallRec* call; - - - if ( CUR.callTop >= CUR.callSize ) - { - CUR.error = TT_Err_Stack_Overflow; - return; - } - - call = CUR.callStack + CUR.callTop++; - - call->Caller_Range = CUR.curRange; - call->Caller_IP = CUR.IP + 1; - call->Cur_Count = 1; - call->Cur_Restart = def->start; - - INS_Goto_CodeRange( def->range, def->start ); - - CUR.step_ins = FALSE; - return; - } - } - - CUR.error = TT_Err_Invalid_Opcode; - } - - -#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH - - - static - TInstruction_Function Instruct_Dispatch[256] = - { - /* Opcodes are gathered in groups of 16. */ - /* Please keep the spaces as they are. */ - - /* SVTCA y */ Ins_SVTCA, - /* SVTCA x */ Ins_SVTCA, - /* SPvTCA y */ Ins_SPVTCA, - /* SPvTCA x */ Ins_SPVTCA, - /* SFvTCA y */ Ins_SFVTCA, - /* SFvTCA x */ Ins_SFVTCA, - /* SPvTL // */ Ins_SPVTL, - /* SPvTL + */ Ins_SPVTL, - /* SFvTL // */ Ins_SFVTL, - /* SFvTL + */ Ins_SFVTL, - /* SPvFS */ Ins_SPVFS, - /* SFvFS */ Ins_SFVFS, - /* GPV */ Ins_GPV, - /* GFV */ Ins_GFV, - /* SFvTPv */ Ins_SFVTPV, - /* ISECT */ Ins_ISECT, - - /* SRP0 */ Ins_SRP0, - /* SRP1 */ Ins_SRP1, - /* SRP2 */ Ins_SRP2, - /* SZP0 */ Ins_SZP0, - /* SZP1 */ Ins_SZP1, - /* SZP2 */ Ins_SZP2, - /* SZPS */ Ins_SZPS, - /* SLOOP */ Ins_SLOOP, - /* RTG */ Ins_RTG, - /* RTHG */ Ins_RTHG, - /* SMD */ Ins_SMD, - /* ELSE */ Ins_ELSE, - /* JMPR */ Ins_JMPR, - /* SCvTCi */ Ins_SCVTCI, - /* SSwCi */ Ins_SSWCI, - /* SSW */ Ins_SSW, - - /* DUP */ Ins_DUP, - /* POP */ Ins_POP, - /* CLEAR */ Ins_CLEAR, - /* SWAP */ Ins_SWAP, - /* DEPTH */ Ins_DEPTH, - /* CINDEX */ Ins_CINDEX, - /* MINDEX */ Ins_MINDEX, - /* AlignPTS */ Ins_ALIGNPTS, - /* INS_0x28 */ Ins_UNKNOWN, - /* UTP */ Ins_UTP, - /* LOOPCALL */ Ins_LOOPCALL, - /* CALL */ Ins_CALL, - /* FDEF */ Ins_FDEF, - /* ENDF */ Ins_ENDF, - /* MDAP[0] */ Ins_MDAP, - /* MDAP[1] */ Ins_MDAP, - - /* IUP[0] */ Ins_IUP, - /* IUP[1] */ Ins_IUP, - /* SHP[0] */ Ins_SHP, - /* SHP[1] */ Ins_SHP, - /* SHC[0] */ Ins_SHC, - /* SHC[1] */ Ins_SHC, - /* SHZ[0] */ Ins_SHZ, - /* SHZ[1] */ Ins_SHZ, - /* SHPIX */ Ins_SHPIX, - /* IP */ Ins_IP, - /* MSIRP[0] */ Ins_MSIRP, - /* MSIRP[1] */ Ins_MSIRP, - /* AlignRP */ Ins_ALIGNRP, - /* RTDG */ Ins_RTDG, - /* MIAP[0] */ Ins_MIAP, - /* MIAP[1] */ Ins_MIAP, - - /* NPushB */ Ins_NPUSHB, - /* NPushW */ Ins_NPUSHW, - /* WS */ Ins_WS, - /* RS */ Ins_RS, - /* WCvtP */ Ins_WCVTP, - /* RCvt */ Ins_RCVT, - /* GC[0] */ Ins_GC, - /* GC[1] */ Ins_GC, - /* SCFS */ Ins_SCFS, - /* MD[0] */ Ins_MD, - /* MD[1] */ Ins_MD, - /* MPPEM */ Ins_MPPEM, - /* MPS */ Ins_MPS, - /* FlipON */ Ins_FLIPON, - /* FlipOFF */ Ins_FLIPOFF, - /* DEBUG */ Ins_DEBUG, - - /* LT */ Ins_LT, - /* LTEQ */ Ins_LTEQ, - /* GT */ Ins_GT, - /* GTEQ */ Ins_GTEQ, - /* EQ */ Ins_EQ, - /* NEQ */ Ins_NEQ, - /* ODD */ Ins_ODD, - /* EVEN */ Ins_EVEN, - /* IF */ Ins_IF, - /* EIF */ Ins_EIF, - /* AND */ Ins_AND, - /* OR */ Ins_OR, - /* NOT */ Ins_NOT, - /* DeltaP1 */ Ins_DELTAP, - /* SDB */ Ins_SDB, - /* SDS */ Ins_SDS, - - /* ADD */ Ins_ADD, - /* SUB */ Ins_SUB, - /* DIV */ Ins_DIV, - /* MUL */ Ins_MUL, - /* ABS */ Ins_ABS, - /* NEG */ Ins_NEG, - /* FLOOR */ Ins_FLOOR, - /* CEILING */ Ins_CEILING, - /* ROUND[0] */ Ins_ROUND, - /* ROUND[1] */ Ins_ROUND, - /* ROUND[2] */ Ins_ROUND, - /* ROUND[3] */ Ins_ROUND, - /* NROUND[0] */ Ins_NROUND, - /* NROUND[1] */ Ins_NROUND, - /* NROUND[2] */ Ins_NROUND, - /* NROUND[3] */ Ins_NROUND, - - /* WCvtF */ Ins_WCVTF, - /* DeltaP2 */ Ins_DELTAP, - /* DeltaP3 */ Ins_DELTAP, - /* DeltaCn[0] */ Ins_DELTAC, - /* DeltaCn[1] */ Ins_DELTAC, - /* DeltaCn[2] */ Ins_DELTAC, - /* SROUND */ Ins_SROUND, - /* S45Round */ Ins_S45ROUND, - /* JROT */ Ins_JROT, - /* JROF */ Ins_JROF, - /* ROFF */ Ins_ROFF, - /* INS_0x7B */ Ins_UNKNOWN, - /* RUTG */ Ins_RUTG, - /* RDTG */ Ins_RDTG, - /* SANGW */ Ins_SANGW, - /* AA */ Ins_AA, - - /* FlipPT */ Ins_FLIPPT, - /* FlipRgON */ Ins_FLIPRGON, - /* FlipRgOFF */ Ins_FLIPRGOFF, - /* INS_0x83 */ Ins_UNKNOWN, - /* INS_0x84 */ Ins_UNKNOWN, - /* ScanCTRL */ Ins_SCANCTRL, - /* SDPVTL[0] */ Ins_SDPVTL, - /* SDPVTL[1] */ Ins_SDPVTL, - /* GetINFO */ Ins_GETINFO, - /* IDEF */ Ins_IDEF, - /* ROLL */ Ins_ROLL, - /* MAX */ Ins_MAX, - /* MIN */ Ins_MIN, - /* ScanTYPE */ Ins_SCANTYPE, - /* InstCTRL */ Ins_INSTCTRL, - /* INS_0x8F */ Ins_UNKNOWN, - - /* INS_0x90 */ Ins_UNKNOWN, - /* INS_0x91 */ Ins_UNKNOWN, - /* INS_0x92 */ Ins_UNKNOWN, - /* INS_0x93 */ Ins_UNKNOWN, - /* INS_0x94 */ Ins_UNKNOWN, - /* INS_0x95 */ Ins_UNKNOWN, - /* INS_0x96 */ Ins_UNKNOWN, - /* INS_0x97 */ Ins_UNKNOWN, - /* INS_0x98 */ Ins_UNKNOWN, - /* INS_0x99 */ Ins_UNKNOWN, - /* INS_0x9A */ Ins_UNKNOWN, - /* INS_0x9B */ Ins_UNKNOWN, - /* INS_0x9C */ Ins_UNKNOWN, - /* INS_0x9D */ Ins_UNKNOWN, - /* INS_0x9E */ Ins_UNKNOWN, - /* INS_0x9F */ Ins_UNKNOWN, - - /* INS_0xA0 */ Ins_UNKNOWN, - /* INS_0xA1 */ Ins_UNKNOWN, - /* INS_0xA2 */ Ins_UNKNOWN, - /* INS_0xA3 */ Ins_UNKNOWN, - /* INS_0xA4 */ Ins_UNKNOWN, - /* INS_0xA5 */ Ins_UNKNOWN, - /* INS_0xA6 */ Ins_UNKNOWN, - /* INS_0xA7 */ Ins_UNKNOWN, - /* INS_0xA8 */ Ins_UNKNOWN, - /* INS_0xA9 */ Ins_UNKNOWN, - /* INS_0xAA */ Ins_UNKNOWN, - /* INS_0xAB */ Ins_UNKNOWN, - /* INS_0xAC */ Ins_UNKNOWN, - /* INS_0xAD */ Ins_UNKNOWN, - /* INS_0xAE */ Ins_UNKNOWN, - /* INS_0xAF */ Ins_UNKNOWN, - - /* PushB[0] */ Ins_PUSHB, - /* PushB[1] */ Ins_PUSHB, - /* PushB[2] */ Ins_PUSHB, - /* PushB[3] */ Ins_PUSHB, - /* PushB[4] */ Ins_PUSHB, - /* PushB[5] */ Ins_PUSHB, - /* PushB[6] */ Ins_PUSHB, - /* PushB[7] */ Ins_PUSHB, - /* PushW[0] */ Ins_PUSHW, - /* PushW[1] */ Ins_PUSHW, - /* PushW[2] */ Ins_PUSHW, - /* PushW[3] */ Ins_PUSHW, - /* PushW[4] */ Ins_PUSHW, - /* PushW[5] */ Ins_PUSHW, - /* PushW[6] */ Ins_PUSHW, - /* PushW[7] */ Ins_PUSHW, - - /* MDRP[00] */ Ins_MDRP, - /* MDRP[01] */ Ins_MDRP, - /* MDRP[02] */ Ins_MDRP, - /* MDRP[03] */ Ins_MDRP, - /* MDRP[04] */ Ins_MDRP, - /* MDRP[05] */ Ins_MDRP, - /* MDRP[06] */ Ins_MDRP, - /* MDRP[07] */ Ins_MDRP, - /* MDRP[08] */ Ins_MDRP, - /* MDRP[09] */ Ins_MDRP, - /* MDRP[10] */ Ins_MDRP, - /* MDRP[11] */ Ins_MDRP, - /* MDRP[12] */ Ins_MDRP, - /* MDRP[13] */ Ins_MDRP, - /* MDRP[14] */ Ins_MDRP, - /* MDRP[15] */ Ins_MDRP, - - /* MDRP[16] */ Ins_MDRP, - /* MDRP[17] */ Ins_MDRP, - /* MDRP[18] */ Ins_MDRP, - /* MDRP[19] */ Ins_MDRP, - /* MDRP[20] */ Ins_MDRP, - /* MDRP[21] */ Ins_MDRP, - /* MDRP[22] */ Ins_MDRP, - /* MDRP[23] */ Ins_MDRP, - /* MDRP[24] */ Ins_MDRP, - /* MDRP[25] */ Ins_MDRP, - /* MDRP[26] */ Ins_MDRP, - /* MDRP[27] */ Ins_MDRP, - /* MDRP[28] */ Ins_MDRP, - /* MDRP[29] */ Ins_MDRP, - /* MDRP[30] */ Ins_MDRP, - /* MDRP[31] */ Ins_MDRP, - - /* MIRP[00] */ Ins_MIRP, - /* MIRP[01] */ Ins_MIRP, - /* MIRP[02] */ Ins_MIRP, - /* MIRP[03] */ Ins_MIRP, - /* MIRP[04] */ Ins_MIRP, - /* MIRP[05] */ Ins_MIRP, - /* MIRP[06] */ Ins_MIRP, - /* MIRP[07] */ Ins_MIRP, - /* MIRP[08] */ Ins_MIRP, - /* MIRP[09] */ Ins_MIRP, - /* MIRP[10] */ Ins_MIRP, - /* MIRP[11] */ Ins_MIRP, - /* MIRP[12] */ Ins_MIRP, - /* MIRP[13] */ Ins_MIRP, - /* MIRP[14] */ Ins_MIRP, - /* MIRP[15] */ Ins_MIRP, - - /* MIRP[16] */ Ins_MIRP, - /* MIRP[17] */ Ins_MIRP, - /* MIRP[18] */ Ins_MIRP, - /* MIRP[19] */ Ins_MIRP, - /* MIRP[20] */ Ins_MIRP, - /* MIRP[21] */ Ins_MIRP, - /* MIRP[22] */ Ins_MIRP, - /* MIRP[23] */ Ins_MIRP, - /* MIRP[24] */ Ins_MIRP, - /* MIRP[25] */ Ins_MIRP, - /* MIRP[26] */ Ins_MIRP, - /* MIRP[27] */ Ins_MIRP, - /* MIRP[28] */ Ins_MIRP, - /* MIRP[29] */ Ins_MIRP, - /* MIRP[30] */ Ins_MIRP, - /* MIRP[31] */ Ins_MIRP - }; - - -#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */ - - - /*************************************************************************/ - /* */ - /* RUN */ - /* */ - /* This function executes a run of opcodes. It will exit in the */ - /* following cases: */ - /* */ - /* - Errors (in which case it returns FALSE). */ - /* */ - /* - Reaching the end of the main code range (returns TRUE). */ - /* Reaching the end of a code range within a function call is an */ - /* error. */ - /* */ - /* - After executing one single opcode, if the flag `Instruction_Trap' */ - /* is set to TRUE (returns TRUE). */ - /* */ - /* On exit with TRUE, test IP < CodeSize to know whether it comes from */ - /* an instruction trap or a normal termination. */ - /* */ - /* */ - /* Note: The documented DEBUG opcode pops a value from the stack. This */ - /* behaviour is unsupported; here a DEBUG opcode is always an */ - /* error. */ - /* */ - /* */ - /* THIS IS THE INTERPRETER'S MAIN LOOP. */ - /* */ - /* Instructions appear in the specification's order. */ - /* */ - /*************************************************************************/ - - - /* documentation is in ttinterp.h */ - - FT_EXPORT_DEF( FT_Error ) - TT_RunIns( TT_ExecContext exc ) - { - FT_Long ins_counter = 0; /* executed instructions counter */ - - -#ifdef TT_CONFIG_OPTION_STATIC_RASTER - cur = *exc; -#endif - - /* set CVT functions */ - CUR.tt_metrics.ratio = 0; - if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem ) - { - /* non-square pixels, use the stretched routines */ - CUR.func_read_cvt = Read_CVT_Stretched; - CUR.func_write_cvt = Write_CVT_Stretched; - CUR.func_move_cvt = Move_CVT_Stretched; - } - else - { - /* square pixels, use normal routines */ - CUR.func_read_cvt = Read_CVT; - CUR.func_write_cvt = Write_CVT; - CUR.func_move_cvt = Move_CVT; - } - - COMPUTE_Funcs(); - COMPUTE_Round( (FT_Byte)exc->GS.round_state ); - - do - { - CUR.opcode = CUR.code[CUR.IP]; - - FT_TRACE7(( " " )); - FT_TRACE7(( opcode_name[CUR.opcode] )); - FT_TRACE7(( "\n" )); - - if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 ) - { - if ( CUR.IP + 1 > CUR.codeSize ) - goto LErrorCodeOverflow_; - - CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1]; - } - - if ( CUR.IP + CUR.length > CUR.codeSize ) - goto LErrorCodeOverflow_; - - /* First, let's check for empty stack and overflow */ - CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 ); - - /* `args' is the top of the stack once arguments have been popped. */ - /* One can also interpret it as the index of the last argument. */ - if ( CUR.args < 0 ) - { - CUR.error = TT_Err_Too_Few_Arguments; - goto LErrorLabel_; - } - - CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 ); - - /* `new_top' is the new top of the stack, after the instruction's */ - /* execution. `top' will be set to `new_top' after the `switch' */ - /* statement. */ - if ( CUR.new_top > CUR.stackSize ) - { - CUR.error = TT_Err_Stack_Overflow; - goto LErrorLabel_; - } - - CUR.step_ins = TRUE; - CUR.error = TT_Err_Ok; - -#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH - - { - FT_Long* args = CUR.stack + CUR.args; - FT_Byte opcode = CUR.opcode; - - -#undef ARRAY_BOUND_ERROR -#define ARRAY_BOUND_ERROR goto Set_Invalid_Ref - - - switch ( opcode ) - { - case 0x00: /* SVTCA y */ - case 0x01: /* SVTCA x */ - case 0x02: /* SPvTCA y */ - case 0x03: /* SPvTCA x */ - case 0x04: /* SFvTCA y */ - case 0x05: /* SFvTCA x */ - { - FT_Short AA, BB; - - - AA = (FT_Short)( ( opcode & 1 ) << 14 ); - BB = (FT_Short)( AA ^ 0x4000 ); - - if ( opcode < 4 ) - { - CUR.GS.projVector.x = AA; - CUR.GS.projVector.y = BB; - - CUR.GS.dualVector.x = AA; - CUR.GS.dualVector.y = BB; - } - else - { - GUESS_VECTOR( projVector ); - } - - if ( ( opcode & 2 ) == 0 ) - { - CUR.GS.freeVector.x = AA; - CUR.GS.freeVector.y = BB; - } - else - { - GUESS_VECTOR( freeVector ); - } - - COMPUTE_Funcs(); - } - break; - - case 0x06: /* SPvTL // */ - case 0x07: /* SPvTL + */ - DO_SPVTL - break; - - case 0x08: /* SFvTL // */ - case 0x09: /* SFvTL + */ - DO_SFVTL - break; - - case 0x0A: /* SPvFS */ - DO_SPVFS - break; - - case 0x0B: /* SFvFS */ - DO_SFVFS - break; - - case 0x0C: /* GPV */ - DO_GPV - break; - - case 0x0D: /* GFV */ - DO_GFV - break; - - case 0x0E: /* SFvTPv */ - DO_SFVTPV - break; - - case 0x0F: /* ISECT */ - Ins_ISECT( EXEC_ARG_ args ); - break; - - case 0x10: /* SRP0 */ - DO_SRP0 - break; - - case 0x11: /* SRP1 */ - DO_SRP1 - break; - - case 0x12: /* SRP2 */ - DO_SRP2 - break; - - case 0x13: /* SZP0 */ - Ins_SZP0( EXEC_ARG_ args ); - break; - - case 0x14: /* SZP1 */ - Ins_SZP1( EXEC_ARG_ args ); - break; - - case 0x15: /* SZP2 */ - Ins_SZP2( EXEC_ARG_ args ); - break; - - case 0x16: /* SZPS */ - Ins_SZPS( EXEC_ARG_ args ); - break; - - case 0x17: /* SLOOP */ - DO_SLOOP - break; - - case 0x18: /* RTG */ - DO_RTG - break; - - case 0x19: /* RTHG */ - DO_RTHG - break; - - case 0x1A: /* SMD */ - DO_SMD - break; - - case 0x1B: /* ELSE */ - Ins_ELSE( EXEC_ARG_ args ); - break; - - case 0x1C: /* JMPR */ - DO_JMPR - break; - - case 0x1D: /* SCVTCI */ - DO_SCVTCI - break; - - case 0x1E: /* SSWCI */ - DO_SSWCI - break; - - case 0x1F: /* SSW */ - DO_SSW - break; - - case 0x20: /* DUP */ - DO_DUP - break; - - case 0x21: /* POP */ - /* nothing :-) */ - break; - - case 0x22: /* CLEAR */ - DO_CLEAR - break; - - case 0x23: /* SWAP */ - DO_SWAP - break; - - case 0x24: /* DEPTH */ - DO_DEPTH - break; - - case 0x25: /* CINDEX */ - DO_CINDEX - break; - - case 0x26: /* MINDEX */ - Ins_MINDEX( EXEC_ARG_ args ); - break; - - case 0x27: /* ALIGNPTS */ - Ins_ALIGNPTS( EXEC_ARG_ args ); - break; - - case 0x28: /* ???? */ - Ins_UNKNOWN( EXEC_ARG_ args ); - break; - - case 0x29: /* UTP */ - Ins_UTP( EXEC_ARG_ args ); - break; - - case 0x2A: /* LOOPCALL */ - Ins_LOOPCALL( EXEC_ARG_ args ); - break; - - case 0x2B: /* CALL */ - Ins_CALL( EXEC_ARG_ args ); - break; - - case 0x2C: /* FDEF */ - Ins_FDEF( EXEC_ARG_ args ); - break; - - case 0x2D: /* ENDF */ - Ins_ENDF( EXEC_ARG_ args ); - break; - - case 0x2E: /* MDAP */ - case 0x2F: /* MDAP */ - Ins_MDAP( EXEC_ARG_ args ); - break; - - - case 0x30: /* IUP */ - case 0x31: /* IUP */ - Ins_IUP( EXEC_ARG_ args ); - break; - - case 0x32: /* SHP */ - case 0x33: /* SHP */ - Ins_SHP( EXEC_ARG_ args ); - break; - - case 0x34: /* SHC */ - case 0x35: /* SHC */ - Ins_SHC( EXEC_ARG_ args ); - break; - - case 0x36: /* SHZ */ - case 0x37: /* SHZ */ - Ins_SHZ( EXEC_ARG_ args ); - break; - - case 0x38: /* SHPIX */ - Ins_SHPIX( EXEC_ARG_ args ); - break; - - case 0x39: /* IP */ - Ins_IP( EXEC_ARG_ args ); - break; - - case 0x3A: /* MSIRP */ - case 0x3B: /* MSIRP */ - Ins_MSIRP( EXEC_ARG_ args ); - break; - - case 0x3C: /* AlignRP */ - Ins_ALIGNRP( EXEC_ARG_ args ); - break; - - case 0x3D: /* RTDG */ - DO_RTDG - break; - - case 0x3E: /* MIAP */ - case 0x3F: /* MIAP */ - Ins_MIAP( EXEC_ARG_ args ); - break; - - case 0x40: /* NPUSHB */ - Ins_NPUSHB( EXEC_ARG_ args ); - break; - - case 0x41: /* NPUSHW */ - Ins_NPUSHW( EXEC_ARG_ args ); - break; - - case 0x42: /* WS */ - DO_WS - break; - - Set_Invalid_Ref: - CUR.error = TT_Err_Invalid_Reference; - break; - - case 0x43: /* RS */ - DO_RS - break; - - case 0x44: /* WCVTP */ - DO_WCVTP - break; - - case 0x45: /* RCVT */ - DO_RCVT - break; - - case 0x46: /* GC */ - case 0x47: /* GC */ - Ins_GC( EXEC_ARG_ args ); - break; - - case 0x48: /* SCFS */ - Ins_SCFS( EXEC_ARG_ args ); - break; - - case 0x49: /* MD */ - case 0x4A: /* MD */ - Ins_MD( EXEC_ARG_ args ); - break; - - case 0x4B: /* MPPEM */ - DO_MPPEM - break; - - case 0x4C: /* MPS */ - DO_MPS - break; - - case 0x4D: /* FLIPON */ - DO_FLIPON - break; - - case 0x4E: /* FLIPOFF */ - DO_FLIPOFF - break; - - case 0x4F: /* DEBUG */ - DO_DEBUG - break; - - case 0x50: /* LT */ - DO_LT - break; - - case 0x51: /* LTEQ */ - DO_LTEQ - break; - - case 0x52: /* GT */ - DO_GT - break; - - case 0x53: /* GTEQ */ - DO_GTEQ - break; - - case 0x54: /* EQ */ - DO_EQ - break; - - case 0x55: /* NEQ */ - DO_NEQ - break; - - case 0x56: /* ODD */ - DO_ODD - break; - - case 0x57: /* EVEN */ - DO_EVEN - break; - - case 0x58: /* IF */ - Ins_IF( EXEC_ARG_ args ); - break; - - case 0x59: /* EIF */ - /* do nothing */ - break; - - case 0x5A: /* AND */ - DO_AND - break; - - case 0x5B: /* OR */ - DO_OR - break; - - case 0x5C: /* NOT */ - DO_NOT - break; - - case 0x5D: /* DELTAP1 */ - Ins_DELTAP( EXEC_ARG_ args ); - break; - - case 0x5E: /* SDB */ - DO_SDB - break; - - case 0x5F: /* SDS */ - DO_SDS - break; - - case 0x60: /* ADD */ - DO_ADD - break; - - case 0x61: /* SUB */ - DO_SUB - break; - - case 0x62: /* DIV */ - DO_DIV - break; - - case 0x63: /* MUL */ - DO_MUL - break; - - case 0x64: /* ABS */ - DO_ABS - break; - - case 0x65: /* NEG */ - DO_NEG - break; - - case 0x66: /* FLOOR */ - DO_FLOOR - break; - - case 0x67: /* CEILING */ - DO_CEILING - break; - - case 0x68: /* ROUND */ - case 0x69: /* ROUND */ - case 0x6A: /* ROUND */ - case 0x6B: /* ROUND */ - DO_ROUND - break; - - case 0x6C: /* NROUND */ - case 0x6D: /* NROUND */ - case 0x6E: /* NRRUND */ - case 0x6F: /* NROUND */ - DO_NROUND - break; - - case 0x70: /* WCVTF */ - DO_WCVTF - break; - - case 0x71: /* DELTAP2 */ - case 0x72: /* DELTAP3 */ - Ins_DELTAP( EXEC_ARG_ args ); - break; - - case 0x73: /* DELTAC0 */ - case 0x74: /* DELTAC1 */ - case 0x75: /* DELTAC2 */ - Ins_DELTAC( EXEC_ARG_ args ); - break; - - case 0x76: /* SROUND */ - DO_SROUND - break; - - case 0x77: /* S45Round */ - DO_S45ROUND - break; - - case 0x78: /* JROT */ - DO_JROT - break; - - case 0x79: /* JROF */ - DO_JROF - break; - - case 0x7A: /* ROFF */ - DO_ROFF - break; - - case 0x7B: /* ???? */ - Ins_UNKNOWN( EXEC_ARG_ args ); - break; - - case 0x7C: /* RUTG */ - DO_RUTG - break; - - case 0x7D: /* RDTG */ - DO_RDTG - break; - - case 0x7E: /* SANGW */ - case 0x7F: /* AA */ - /* nothing - obsolete */ - break; - - case 0x80: /* FLIPPT */ - Ins_FLIPPT( EXEC_ARG_ args ); - break; - - case 0x81: /* FLIPRGON */ - Ins_FLIPRGON( EXEC_ARG_ args ); - break; - - case 0x82: /* FLIPRGOFF */ - Ins_FLIPRGOFF( EXEC_ARG_ args ); - break; - - case 0x83: /* UNKNOWN */ - case 0x84: /* UNKNOWN */ - Ins_UNKNOWN( EXEC_ARG_ args ); - break; - - case 0x85: /* SCANCTRL */ - Ins_SCANCTRL( EXEC_ARG_ args ); - break; - - case 0x86: /* SDPVTL */ - case 0x87: /* SDPVTL */ - Ins_SDPVTL( EXEC_ARG_ args ); - break; - - case 0x88: /* GETINFO */ - Ins_GETINFO( EXEC_ARG_ args ); - break; - - case 0x89: /* IDEF */ - Ins_IDEF( EXEC_ARG_ args ); - break; - - case 0x8A: /* ROLL */ - Ins_ROLL( EXEC_ARG_ args ); - break; - - case 0x8B: /* MAX */ - DO_MAX - break; - - case 0x8C: /* MIN */ - DO_MIN - break; - - case 0x8D: /* SCANTYPE */ - Ins_SCANTYPE( EXEC_ARG_ args ); - break; - - case 0x8E: /* INSTCTRL */ - Ins_INSTCTRL( EXEC_ARG_ args ); - break; - - case 0x8F: - Ins_UNKNOWN( EXEC_ARG_ args ); - break; - - default: - if ( opcode >= 0xE0 ) - Ins_MIRP( EXEC_ARG_ args ); - else if ( opcode >= 0xC0 ) - Ins_MDRP( EXEC_ARG_ args ); - else if ( opcode >= 0xB8 ) - Ins_PUSHW( EXEC_ARG_ args ); - else if ( opcode >= 0xB0 ) - Ins_PUSHB( EXEC_ARG_ args ); - else - Ins_UNKNOWN( EXEC_ARG_ args ); - } - - } - -#else - - Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] ); - -#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */ - - if ( CUR.error != TT_Err_Ok ) - { - switch ( CUR.error ) - { - case TT_Err_Invalid_Opcode: /* looking for redefined instructions */ - { - TT_DefRecord* def = CUR.IDefs; - TT_DefRecord* limit = def + CUR.numIDefs; - - - for ( ; def < limit; def++ ) - { - if ( def->active && CUR.opcode == (FT_Byte)def->opc ) - { - TT_CallRec* callrec; - - - if ( CUR.callTop >= CUR.callSize ) - { - CUR.error = TT_Err_Invalid_Reference; - goto LErrorLabel_; - } - - callrec = &CUR.callStack[CUR.callTop]; - - callrec->Caller_Range = CUR.curRange; - callrec->Caller_IP = CUR.IP + 1; - callrec->Cur_Count = 1; - callrec->Cur_Restart = def->start; - - if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE ) - goto LErrorLabel_; - - goto LSuiteLabel_; - } - } - } - - CUR.error = TT_Err_Invalid_Opcode; - goto LErrorLabel_; - -#if 0 - break; /* Unreachable code warning suppression. */ - /* Leave to remind in case a later change the editor */ - /* to consider break; */ -#endif - - default: - goto LErrorLabel_; - -#if 0 - break; -#endif - } - } - - CUR.top = CUR.new_top; - - if ( CUR.step_ins ) - CUR.IP += CUR.length; - - /* increment instruction counter and check if we didn't */ - /* run this program for too long (e.g. infinite loops). */ - if ( ++ins_counter > MAX_RUNNABLE_OPCODES ) - return TT_Err_Execution_Too_Long; - - LSuiteLabel_: - if ( CUR.IP >= CUR.codeSize ) - { - if ( CUR.callTop > 0 ) - { - CUR.error = TT_Err_Code_Overflow; - goto LErrorLabel_; - } - else - goto LNo_Error_; - } - } while ( !CUR.instruction_trap ); - - LNo_Error_: - -#ifdef TT_CONFIG_OPTION_STATIC_RASTER - *exc = cur; -#endif - - return TT_Err_Ok; - - LErrorCodeOverflow_: - CUR.error = TT_Err_Code_Overflow; - - LErrorLabel_: - -#ifdef TT_CONFIG_OPTION_STATIC_RASTER - *exc = cur; -#endif - - return CUR.error; - } - - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttinterp.h b/android/jni/ndk_modules/freetype/src/truetype/ttinterp.h deleted file mode 100644 index c480dfa5..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttinterp.h +++ /dev/null @@ -1,319 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttinterp.h */ -/* */ -/* TrueType bytecode interpreter (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2010 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTINTERP_H__ -#define __TTINTERP_H__ - -#include <ft2build.h> -#include "ttobjs.h" - - -FT_BEGIN_HEADER - - -#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */ - -#define EXEC_OP_ TT_ExecContext exc, -#define EXEC_OP TT_ExecContext exc -#define EXEC_ARG_ exc, -#define EXEC_ARG exc - -#else /* static implementation */ - -#define EXEC_OP_ /* void */ -#define EXEC_OP /* void */ -#define EXEC_ARG_ /* void */ -#define EXEC_ARG /* void */ - -#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */ - - - /*************************************************************************/ - /* */ - /* Rounding mode constants. */ - /* */ -#define TT_Round_Off 5 -#define TT_Round_To_Half_Grid 0 -#define TT_Round_To_Grid 1 -#define TT_Round_To_Double_Grid 2 -#define TT_Round_Up_To_Grid 4 -#define TT_Round_Down_To_Grid 3 -#define TT_Round_Super 6 -#define TT_Round_Super_45 7 - - - /*************************************************************************/ - /* */ - /* Function types used by the interpreter, depending on various modes */ - /* (e.g. the rounding mode, whether to render a vertical or horizontal */ - /* line etc). */ - /* */ - /*************************************************************************/ - - /* Rounding function */ - typedef FT_F26Dot6 - (*TT_Round_Func)( EXEC_OP_ FT_F26Dot6 distance, - FT_F26Dot6 compensation ); - - /* Point displacement along the freedom vector routine */ - typedef void - (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ); - - /* Distance projection along one of the projection vectors */ - typedef FT_F26Dot6 - (*TT_Project_Func)( EXEC_OP_ FT_Pos dx, - FT_Pos dy ); - - /* reading a cvt value. Take care of non-square pixels if necessary */ - typedef FT_F26Dot6 - (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong idx ); - - /* setting or moving a cvt value. Take care of non-square pixels */ - /* if necessary */ - typedef void - (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong idx, - FT_F26Dot6 value ); - - - /*************************************************************************/ - /* */ - /* This structure defines a call record, used to manage function calls. */ - /* */ - typedef struct TT_CallRec_ - { - FT_Int Caller_Range; - FT_Long Caller_IP; - FT_Long Cur_Count; - FT_Long Cur_Restart; - - } TT_CallRec, *TT_CallStack; - - - /*************************************************************************/ - /* */ - /* The main structure for the interpreter which collects all necessary */ - /* variables and states. */ - /* */ - typedef struct TT_ExecContextRec_ - { - TT_Face face; - TT_Size size; - FT_Memory memory; - - /* instructions state */ - - FT_Error error; /* last execution error */ - - FT_Long top; /* top of exec. stack */ - - FT_UInt stackSize; /* size of exec. stack */ - FT_Long* stack; /* current exec. stack */ - - FT_Long args; - FT_UInt new_top; /* new top after exec. */ - - TT_GlyphZoneRec zp0, /* zone records */ - zp1, - zp2, - pts, - twilight; - - FT_Size_Metrics metrics; - TT_Size_Metrics tt_metrics; /* size metrics */ - - TT_GraphicsState GS; /* current graphics state */ - - FT_Int curRange; /* current code range number */ - FT_Byte* code; /* current code range */ - FT_Long IP; /* current instruction pointer */ - FT_Long codeSize; /* size of current range */ - - FT_Byte opcode; /* current opcode */ - FT_Int length; /* length of current opcode */ - - FT_Bool step_ins; /* true if the interpreter must */ - /* increment IP after ins. exec */ - FT_ULong cvtSize; - FT_Long* cvt; - - FT_UInt glyphSize; /* glyph instructions buffer size */ - FT_Byte* glyphIns; /* glyph instructions buffer */ - - FT_UInt numFDefs; /* number of function defs */ - FT_UInt maxFDefs; /* maximum number of function defs */ - TT_DefArray FDefs; /* table of FDefs entries */ - - FT_UInt numIDefs; /* number of instruction defs */ - FT_UInt maxIDefs; /* maximum number of ins defs */ - TT_DefArray IDefs; /* table of IDefs entries */ - - FT_UInt maxFunc; /* maximum function index */ - FT_UInt maxIns; /* maximum instruction index */ - - FT_Int callTop, /* top of call stack during execution */ - callSize; /* size of call stack */ - TT_CallStack callStack; /* call stack */ - - FT_UShort maxPoints; /* capacity of this context's `pts' */ - FT_Short maxContours; /* record, expressed in points and */ - /* contours. */ - - TT_CodeRangeTable codeRangeTable; /* table of valid code ranges */ - /* useful for the debugger */ - - FT_UShort storeSize; /* size of current storage */ - FT_Long* storage; /* storage area */ - - FT_F26Dot6 period; /* values used for the */ - FT_F26Dot6 phase; /* `SuperRounding' */ - FT_F26Dot6 threshold; - -#if 0 - /* this seems to be unused */ - FT_Int cur_ppem; /* ppem along the current proj vector */ -#endif - - FT_Bool instruction_trap; /* If `True', the interpreter will */ - /* exit after each instruction */ - - TT_GraphicsState default_GS; /* graphics state resulting from */ - /* the prep program */ - FT_Bool is_composite; /* true if the glyph is composite */ - FT_Bool pedantic_hinting; /* true if pedantic interpretation */ - - /* latest interpreter additions */ - - FT_Long F_dot_P; /* dot product of freedom and projection */ - /* vectors */ - TT_Round_Func func_round; /* current rounding function */ - - TT_Project_Func func_project, /* current projection function */ - func_dualproj, /* current dual proj. function */ - func_freeProj; /* current freedom proj. func */ - - TT_Move_Func func_move; /* current point move function */ - TT_Move_Func func_move_orig; /* move original position function */ - - TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */ - TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */ - TT_Set_CVT_Func func_move_cvt; /* incr a cvt entry (in pixels) */ - - FT_Bool grayscale; /* are we hinting for grayscale? */ - - } TT_ExecContextRec; - - - extern const TT_GraphicsState tt_default_graphics_state; - - - FT_LOCAL( FT_Error ) - TT_Goto_CodeRange( TT_ExecContext exec, - FT_Int range, - FT_Long IP ); - - FT_LOCAL( FT_Error ) - TT_Set_CodeRange( TT_ExecContext exec, - FT_Int range, - void* base, - FT_Long length ); - - FT_LOCAL( FT_Error ) - TT_Clear_CodeRange( TT_ExecContext exec, - FT_Int range ); - - - FT_LOCAL( FT_Error ) - Update_Max( FT_Memory memory, - FT_ULong* size, - FT_Long multiplier, - void* _pbuff, - FT_ULong new_max ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_New_Context */ - /* */ - /* <Description> */ - /* Queries the face context for a given font. Note that there is */ - /* now a _single_ execution context in the TrueType driver which is */ - /* shared among faces. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* <Return> */ - /* A handle to the execution context. Initialized for `face'. */ - /* */ - /* <Note> */ - /* Only the glyph loader and debugger should call this function. */ - /* */ - FT_EXPORT( TT_ExecContext ) - TT_New_Context( TT_Driver driver ); - - FT_LOCAL( FT_Error ) - TT_Done_Context( TT_ExecContext exec ); - - FT_LOCAL( FT_Error ) - TT_Load_Context( TT_ExecContext exec, - TT_Face face, - TT_Size size ); - - FT_LOCAL( FT_Error ) - TT_Save_Context( TT_ExecContext exec, - TT_Size ins ); - - FT_LOCAL( FT_Error ) - TT_Run_Context( TT_ExecContext exec, - FT_Bool debug ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_RunIns */ - /* */ - /* <Description> */ - /* Executes one or more instruction in the execution context. This */ - /* is the main function of the TrueType opcode interpreter. */ - /* */ - /* <Input> */ - /* exec :: A handle to the target execution context. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* Only the object manager and debugger should call this function. */ - /* */ - /* This function is publicly exported because it is directly */ - /* invoked by the TrueType debugger. */ - /* */ - FT_EXPORT( FT_Error ) - TT_RunIns( TT_ExecContext exec ); - - -FT_END_HEADER - -#endif /* __TTINTERP_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttobjs.c b/android/jni/ndk_modules/freetype/src/truetype/ttobjs.c deleted file mode 100644 index 11d662d2..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttobjs.c +++ /dev/null @@ -1,951 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttobjs.c */ -/* */ -/* Objects manager (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H -#include FT_INTERNAL_SFNT_H - -#include "ttgload.h" -#include "ttpload.h" - -#include "tterrors.h" - -#ifdef TT_USE_BYTECODE_INTERPRETER -#include "ttinterp.h" -#endif - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING -#include FT_TRUETYPE_UNPATENTED_H -#endif - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include "ttgxvar.h" -#endif - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttobjs - - -#ifdef TT_USE_BYTECODE_INTERPRETER - - /*************************************************************************/ - /* */ - /* GLYPH ZONE FUNCTIONS */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_glyphzone_done */ - /* */ - /* <Description> */ - /* Deallocate a glyph zone. */ - /* */ - /* <Input> */ - /* zone :: A pointer to the target glyph zone. */ - /* */ - FT_LOCAL_DEF( void ) - tt_glyphzone_done( TT_GlyphZone zone ) - { - FT_Memory memory = zone->memory; - - - if ( memory ) - { - FT_FREE( zone->contours ); - FT_FREE( zone->tags ); - FT_FREE( zone->cur ); - FT_FREE( zone->org ); - FT_FREE( zone->orus ); - - zone->max_points = zone->n_points = 0; - zone->max_contours = zone->n_contours = 0; - zone->memory = NULL; - } - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_glyphzone_new */ - /* */ - /* <Description> */ - /* Allocate a new glyph zone. */ - /* */ - /* <Input> */ - /* memory :: A handle to the current memory object. */ - /* */ - /* maxPoints :: The capacity of glyph zone in points. */ - /* */ - /* maxContours :: The capacity of glyph zone in contours. */ - /* */ - /* <Output> */ - /* zone :: A pointer to the target glyph zone record. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_glyphzone_new( FT_Memory memory, - FT_UShort maxPoints, - FT_Short maxContours, - TT_GlyphZone zone ) - { - FT_Error error; - - - FT_MEM_ZERO( zone, sizeof ( *zone ) ); - zone->memory = memory; - - if ( FT_NEW_ARRAY( zone->org, maxPoints ) || - FT_NEW_ARRAY( zone->cur, maxPoints ) || - FT_NEW_ARRAY( zone->orus, maxPoints ) || - FT_NEW_ARRAY( zone->tags, maxPoints ) || - FT_NEW_ARRAY( zone->contours, maxContours ) ) - { - tt_glyphzone_done( zone ); - } - else - { - zone->max_points = maxPoints; - zone->max_contours = maxContours; - } - - return error; - } -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - - /* Compare the face with a list of well-known `tricky' fonts. */ - /* This list shall be expanded as we find more of them. */ - - static FT_Bool - tt_check_trickyness( FT_String* name ) - { -#define TRICK_NAMES_MAX_CHARACTERS 16 -#define TRICK_NAMES_COUNT 7 - static const char trick_names[TRICK_NAMES_COUNT][TRICK_NAMES_MAX_CHARACTERS+1] = - { - "DFKaiSho-SB", /* dfkaisb.ttf */ - "DFKaiShu", - "DFKai-SB", /* kaiu.ttf */ - "HuaTianSongTi?", /* htst3.ttf */ - "MingLiU", /* mingliu.ttf & mingliu.ttc */ - "PMingLiU", /* mingliu.ttc */ - "MingLi43", /* mingli.ttf */ - }; - int nn; - - - if ( !name ) - return FALSE; - - /* Note that we only check the face name at the moment; it might */ - /* be worth to do more checks for a few special cases. */ - for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ ) - if ( ft_strstr( name, trick_names[nn] ) ) - return TRUE; - - return FALSE; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_init */ - /* */ - /* <Description> */ - /* Initialize a given TrueType face object. */ - /* */ - /* <Input> */ - /* stream :: The source font stream. */ - /* */ - /* face_index :: The index of the font face in the resource. */ - /* */ - /* num_params :: Number of additional generic parameters. Ignored. */ - /* */ - /* params :: Additional generic parameters. Ignored. */ - /* */ - /* <InOut> */ - /* face :: The newly built face object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_init( FT_Stream stream, - FT_Face ttface, /* TT_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ) - { - FT_Error error; - FT_Library library; - SFNT_Service sfnt; - TT_Face face = (TT_Face)ttface; - - - library = ttface->driver->root.library; - sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); - if ( !sfnt ) - goto Bad_Format; - - /* create input stream from resource */ - if ( FT_STREAM_SEEK( 0 ) ) - goto Exit; - - /* check that we have a valid TrueType file */ - error = sfnt->init_face( stream, face, face_index, num_params, params ); - if ( error ) - goto Exit; - - /* We must also be able to accept Mac/GX fonts, as well as OT ones. */ - /* The 0x00020000 tag is completely undocumented; some fonts from */ - /* Arphic made for Chinese Windows 3.1 have this. */ - if ( face->format_tag != 0x00010000L && /* MS fonts */ - face->format_tag != 0x00020000L && /* CJK fonts for Win 3.1 */ - face->format_tag != TTAG_true ) /* Mac fonts */ - { - FT_TRACE2(( "[not a valid TTF font]\n" )); - goto Bad_Format; - } - -#ifdef TT_USE_BYTECODE_INTERPRETER - ttface->face_flags |= FT_FACE_FLAG_HINTER; -#endif - - /* If we are performing a simple font format check, exit immediately. */ - if ( face_index < 0 ) - return TT_Err_Ok; - - /* Load font directory */ - error = sfnt->load_face( stream, face, face_index, num_params, params ); - if ( error ) - goto Exit; - - if ( tt_check_trickyness( ttface->family_name ) ) - ttface->face_flags |= FT_FACE_FLAG_TRICKY; - - error = tt_face_load_hdmx( face, stream ); - if ( error ) - goto Exit; - - if ( FT_IS_SCALABLE( ttface ) ) - { - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - if ( !ttface->internal->incremental_interface ) - error = tt_face_load_loca( face, stream ); - if ( !error ) - error = tt_face_load_cvt( face, stream ); - if ( !error ) - error = tt_face_load_fpgm( face, stream ); - if ( !error ) - error = tt_face_load_prep( face, stream ); - -#else - - if ( !error ) - error = tt_face_load_loca( face, stream ); - if ( !error ) - error = tt_face_load_cvt( face, stream ); - if ( !error ) - error = tt_face_load_fpgm( face, stream ); - if ( !error ) - error = tt_face_load_prep( face, stream ); - -#endif - - } - -#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \ - !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER ) - - { - FT_Bool unpatented_hinting; - int i; - - - /* Determine whether unpatented hinting is to be used for this face. */ - unpatented_hinting = FT_BOOL - ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL ); - - for ( i = 0; i < num_params && !face->unpatented_hinting; i++ ) - if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING ) - unpatented_hinting = TRUE; - - if ( !unpatented_hinting ) - ttface->internal->ignore_unpatented_hinter = TRUE; - } - -#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING && - !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ - - /* initialize standard glyph loading routines */ - TT_Init_Glyph_Loading( face ); - - Exit: - return error; - - Bad_Format: - error = TT_Err_Unknown_File_Format; - goto Exit; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_done */ - /* */ - /* <Description> */ - /* Finalize a given face object. */ - /* */ - /* <Input> */ - /* face :: A pointer to the face object to destroy. */ - /* */ - FT_LOCAL_DEF( void ) - tt_face_done( FT_Face ttface ) /* TT_Face */ - { - TT_Face face = (TT_Face)ttface; - FT_Memory memory; - FT_Stream stream; - SFNT_Service sfnt; - - - if ( !face ) - return; - - memory = ttface->memory; - stream = ttface->stream; - sfnt = (SFNT_Service)face->sfnt; - - /* for `extended TrueType formats' (i.e. compressed versions) */ - if ( face->extra.finalizer ) - face->extra.finalizer( face->extra.data ); - - if ( sfnt ) - sfnt->done_face( face ); - - /* freeing the locations table */ - tt_face_done_loca( face ); - - tt_face_free_hdmx( face ); - - /* freeing the CVT */ - FT_FREE( face->cvt ); - face->cvt_size = 0; - - /* freeing the programs */ - FT_FRAME_RELEASE( face->font_program ); - FT_FRAME_RELEASE( face->cvt_program ); - face->font_program_size = 0; - face->cvt_program_size = 0; - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - tt_done_blend( memory, face->blend ); - face->blend = NULL; -#endif - } - - - /*************************************************************************/ - /* */ - /* SIZE FUNCTIONS */ - /* */ - /*************************************************************************/ - -#ifdef TT_USE_BYTECODE_INTERPRETER - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_size_run_fpgm */ - /* */ - /* <Description> */ - /* Run the font program. */ - /* */ - /* <Input> */ - /* size :: A handle to the size object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_size_run_fpgm( TT_Size size ) - { - TT_Face face = (TT_Face)size->root.face; - TT_ExecContext exec; - FT_Error error; - - - /* debugging instances have their own context */ - if ( size->debug ) - exec = size->context; - else - exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; - - if ( !exec ) - return TT_Err_Could_Not_Find_Context; - - TT_Load_Context( exec, face, size ); - - exec->callTop = 0; - exec->top = 0; - - exec->period = 64; - exec->phase = 0; - exec->threshold = 0; - - exec->instruction_trap = FALSE; - exec->F_dot_P = 0x10000L; - - { - FT_Size_Metrics* metrics = &exec->metrics; - TT_Size_Metrics* tt_metrics = &exec->tt_metrics; - - - metrics->x_ppem = 0; - metrics->y_ppem = 0; - metrics->x_scale = 0; - metrics->y_scale = 0; - - tt_metrics->ppem = 0; - tt_metrics->scale = 0; - tt_metrics->ratio = 0x10000L; - } - - /* allow font program execution */ - TT_Set_CodeRange( exec, - tt_coderange_font, - face->font_program, - face->font_program_size ); - - /* disable CVT and glyph programs coderange */ - TT_Clear_CodeRange( exec, tt_coderange_cvt ); - TT_Clear_CodeRange( exec, tt_coderange_glyph ); - - if ( face->font_program_size > 0 ) - { - error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 ); - - if ( !error ) - error = face->interpreter( exec ); - } - else - error = TT_Err_Ok; - - if ( !error ) - TT_Save_Context( exec, size ); - - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_size_run_prep */ - /* */ - /* <Description> */ - /* Run the control value program. */ - /* */ - /* <Input> */ - /* size :: A handle to the size object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_size_run_prep( TT_Size size ) - { - TT_Face face = (TT_Face)size->root.face; - TT_ExecContext exec; - FT_Error error; - - - /* debugging instances have their own context */ - if ( size->debug ) - exec = size->context; - else - exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; - - if ( !exec ) - return TT_Err_Could_Not_Find_Context; - - TT_Load_Context( exec, face, size ); - - exec->callTop = 0; - exec->top = 0; - - exec->instruction_trap = FALSE; - - TT_Set_CodeRange( exec, - tt_coderange_cvt, - face->cvt_program, - face->cvt_program_size ); - - TT_Clear_CodeRange( exec, tt_coderange_glyph ); - - if ( face->cvt_program_size > 0 ) - { - error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 ); - - if ( !error && !size->debug ) - error = face->interpreter( exec ); - } - else - error = TT_Err_Ok; - - /* save as default graphics state */ - size->GS = exec->GS; - - TT_Save_Context( exec, size ); - - return error; - } - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - -#ifdef TT_USE_BYTECODE_INTERPRETER - - static void - tt_size_done_bytecode( FT_Size ftsize ) - { - TT_Size size = (TT_Size)ftsize; - TT_Face face = (TT_Face)ftsize->face; - FT_Memory memory = face->root.memory; - - - if ( size->debug ) - { - /* the debug context must be deleted by the debugger itself */ - size->context = NULL; - size->debug = FALSE; - } - - FT_FREE( size->cvt ); - size->cvt_size = 0; - - /* free storage area */ - FT_FREE( size->storage ); - size->storage_size = 0; - - /* twilight zone */ - tt_glyphzone_done( &size->twilight ); - - FT_FREE( size->function_defs ); - FT_FREE( size->instruction_defs ); - - size->num_function_defs = 0; - size->max_function_defs = 0; - size->num_instruction_defs = 0; - size->max_instruction_defs = 0; - - size->max_func = 0; - size->max_ins = 0; - - size->bytecode_ready = 0; - size->cvt_ready = 0; - } - - - /* Initialize bytecode-related fields in the size object. */ - /* We do this only if bytecode interpretation is really needed. */ - static FT_Error - tt_size_init_bytecode( FT_Size ftsize ) - { - FT_Error error; - TT_Size size = (TT_Size)ftsize; - TT_Face face = (TT_Face)ftsize->face; - FT_Memory memory = face->root.memory; - FT_Int i; - - FT_UShort n_twilight; - TT_MaxProfile* maxp = &face->max_profile; - - - size->bytecode_ready = 1; - size->cvt_ready = 0; - - size->max_function_defs = maxp->maxFunctionDefs; - size->max_instruction_defs = maxp->maxInstructionDefs; - - size->num_function_defs = 0; - size->num_instruction_defs = 0; - - size->max_func = 0; - size->max_ins = 0; - - size->cvt_size = face->cvt_size; - size->storage_size = maxp->maxStorage; - - /* Set default metrics */ - { - TT_Size_Metrics* metrics = &size->ttmetrics; - - - metrics->rotated = FALSE; - metrics->stretched = FALSE; - - /* set default compensation (all 0) */ - for ( i = 0; i < 4; i++ ) - metrics->compensations[i] = 0; - } - - /* allocate function defs, instruction defs, cvt, and storage area */ - if ( FT_NEW_ARRAY( size->function_defs, size->max_function_defs ) || - FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) || - FT_NEW_ARRAY( size->cvt, size->cvt_size ) || - FT_NEW_ARRAY( size->storage, size->storage_size ) ) - goto Exit; - - /* reserve twilight zone */ - n_twilight = maxp->maxTwilightPoints; - - /* there are 4 phantom points (do we need this?) */ - n_twilight += 4; - - error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight ); - if ( error ) - goto Exit; - - size->twilight.n_points = n_twilight; - - size->GS = tt_default_graphics_state; - - /* set `face->interpreter' according to the debug hook present */ - { - FT_Library library = face->root.driver->root.library; - - - face->interpreter = (TT_Interpreter) - library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE]; - if ( !face->interpreter ) - face->interpreter = (TT_Interpreter)TT_RunIns; - } - - /* Fine, now run the font program! */ - error = tt_size_run_fpgm( size ); - - Exit: - if ( error ) - tt_size_done_bytecode( ftsize ); - - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - tt_size_ready_bytecode( TT_Size size ) - { - FT_Error error = TT_Err_Ok; - - - if ( !size->bytecode_ready ) - { - error = tt_size_init_bytecode( (FT_Size)size ); - if ( error ) - goto Exit; - } - - /* rescale CVT when needed */ - if ( !size->cvt_ready ) - { - FT_UInt i; - TT_Face face = (TT_Face)size->root.face; - - - /* Scale the cvt values to the new ppem. */ - /* We use by default the y ppem to scale the CVT. */ - for ( i = 0; i < size->cvt_size; i++ ) - size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); - - /* all twilight points are originally zero */ - for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ ) - { - size->twilight.org[i].x = 0; - size->twilight.org[i].y = 0; - size->twilight.cur[i].x = 0; - size->twilight.cur[i].y = 0; - } - - /* clear storage area */ - for ( i = 0; i < (FT_UInt)size->storage_size; i++ ) - size->storage[i] = 0; - - size->GS = tt_default_graphics_state; - - error = tt_size_run_prep( size ); - if ( !error ) - size->cvt_ready = 1; - } - - Exit: - return error; - } - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_size_init */ - /* */ - /* <Description> */ - /* Initialize a new TrueType size object. */ - /* */ - /* <InOut> */ - /* size :: A handle to the size object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_size_init( FT_Size ttsize ) /* TT_Size */ - { - TT_Size size = (TT_Size)ttsize; - FT_Error error = TT_Err_Ok; - -#ifdef TT_USE_BYTECODE_INTERPRETER - size->bytecode_ready = 0; - size->cvt_ready = 0; -#endif - - size->ttmetrics.valid = FALSE; - size->strike_index = 0xFFFFFFFFUL; - - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_size_done */ - /* */ - /* <Description> */ - /* The TrueType size object finalizer. */ - /* */ - /* <Input> */ - /* size :: A handle to the target size object. */ - /* */ - FT_LOCAL_DEF( void ) - tt_size_done( FT_Size ttsize ) /* TT_Size */ - { - TT_Size size = (TT_Size)ttsize; - - -#ifdef TT_USE_BYTECODE_INTERPRETER - if ( size->bytecode_ready ) - tt_size_done_bytecode( ttsize ); -#endif - - size->ttmetrics.valid = FALSE; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_size_reset */ - /* */ - /* <Description> */ - /* Reset a TrueType size when resolutions and character dimensions */ - /* have been changed. */ - /* */ - /* <Input> */ - /* size :: A handle to the target size object. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_size_reset( TT_Size size ) - { - TT_Face face; - FT_Error error = TT_Err_Ok; - FT_Size_Metrics* metrics; - - - size->ttmetrics.valid = FALSE; - - face = (TT_Face)size->root.face; - - metrics = &size->metrics; - - /* copy the result from base layer */ - *metrics = size->root.metrics; - - if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 ) - return TT_Err_Invalid_PPem; - - /* This bit flag, if set, indicates that the ppems must be */ - /* rounded to integers. Nearly all TrueType fonts have this bit */ - /* set, as hinting won't work really well otherwise. */ - /* */ - if ( face->header.Flags & 8 ) - { - metrics->x_scale = FT_DivFix( metrics->x_ppem << 6, - face->root.units_per_EM ); - metrics->y_scale = FT_DivFix( metrics->y_ppem << 6, - face->root.units_per_EM ); - - metrics->ascender = - FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) ); - metrics->descender = - FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) ); - metrics->height = - FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) ); - metrics->max_advance = - FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width, - metrics->x_scale ) ); - } - - /* compute new transformation */ - if ( metrics->x_ppem >= metrics->y_ppem ) - { - size->ttmetrics.scale = metrics->x_scale; - size->ttmetrics.ppem = metrics->x_ppem; - size->ttmetrics.x_ratio = 0x10000L; - size->ttmetrics.y_ratio = FT_MulDiv( metrics->y_ppem, - 0x10000L, - metrics->x_ppem ); - } - else - { - size->ttmetrics.scale = metrics->y_scale; - size->ttmetrics.ppem = metrics->y_ppem; - size->ttmetrics.x_ratio = FT_MulDiv( metrics->x_ppem, - 0x10000L, - metrics->y_ppem ); - size->ttmetrics.y_ratio = 0x10000L; - } - -#ifdef TT_USE_BYTECODE_INTERPRETER - size->cvt_ready = 0; -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - if ( !error ) - size->ttmetrics.valid = TRUE; - - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_driver_init */ - /* */ - /* <Description> */ - /* Initialize a given TrueType driver object. */ - /* */ - /* <Input> */ - /* driver :: A handle to the target driver object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_driver_init( FT_Module ttdriver ) /* TT_Driver */ - { - -#ifdef TT_USE_BYTECODE_INTERPRETER - - TT_Driver driver = (TT_Driver)ttdriver; - - - if ( !TT_New_Context( driver ) ) - return TT_Err_Could_Not_Find_Context; - -#else - - FT_UNUSED( ttdriver ); - -#endif - - return TT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_driver_done */ - /* */ - /* <Description> */ - /* Finalize a given TrueType driver. */ - /* */ - /* <Input> */ - /* driver :: A handle to the target TrueType driver. */ - /* */ - FT_LOCAL_DEF( void ) - tt_driver_done( FT_Module ttdriver ) /* TT_Driver */ - { -#ifdef TT_USE_BYTECODE_INTERPRETER - TT_Driver driver = (TT_Driver)ttdriver; - - - /* destroy the execution context */ - if ( driver->context ) - { - TT_Done_Context( driver->context ); - driver->context = NULL; - } -#else - FT_UNUSED( ttdriver ); -#endif - - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_slot_init */ - /* */ - /* <Description> */ - /* Initialize a new slot object. */ - /* */ - /* <InOut> */ - /* slot :: A handle to the slot object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_slot_init( FT_GlyphSlot slot ) - { - return FT_GlyphLoader_CreateExtra( slot->internal->loader ); - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttobjs.h b/android/jni/ndk_modules/freetype/src/truetype/ttobjs.h deleted file mode 100644 index 30c8669c..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttobjs.h +++ /dev/null @@ -1,431 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttobjs.h */ -/* */ -/* Objects manager (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTOBJS_H__ -#define __TTOBJS_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* TT_Driver */ - /* */ - /* <Description> */ - /* A handle to a TrueType driver object. */ - /* */ - typedef struct TT_DriverRec_* TT_Driver; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* TT_Instance */ - /* */ - /* <Description> */ - /* A handle to a TrueType size object. */ - /* */ - typedef struct TT_SizeRec_* TT_Size; - - - /*************************************************************************/ - /* */ - /* <Type> */ - /* TT_GlyphSlot */ - /* */ - /* <Description> */ - /* A handle to a TrueType glyph slot object. */ - /* */ - /* <Note> */ - /* This is a direct typedef of FT_GlyphSlot, as there is nothing */ - /* specific about the TrueType glyph slot. */ - /* */ - typedef FT_GlyphSlot TT_GlyphSlot; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_GraphicsState */ - /* */ - /* <Description> */ - /* The TrueType graphics state used during bytecode interpretation. */ - /* */ - typedef struct TT_GraphicsState_ - { - FT_UShort rp0; - FT_UShort rp1; - FT_UShort rp2; - - FT_UnitVector dualVector; - FT_UnitVector projVector; - FT_UnitVector freeVector; - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - FT_Bool both_x_axis; -#endif - - FT_Long loop; - FT_F26Dot6 minimum_distance; - FT_Int round_state; - - FT_Bool auto_flip; - FT_F26Dot6 control_value_cutin; - FT_F26Dot6 single_width_cutin; - FT_F26Dot6 single_width_value; - FT_Short delta_base; - FT_Short delta_shift; - - FT_Byte instruct_control; - /* According to Greg Hitchcock from Microsoft, the `scan_control' */ - /* variable as documented in the TrueType specification is a 32-bit */ - /* integer; the high-word part holds the SCANTYPE value, the low-word */ - /* part the SCANCTRL value. We separate it into two fields. */ - FT_Bool scan_control; - FT_Int scan_type; - - FT_UShort gep0; - FT_UShort gep1; - FT_UShort gep2; - - } TT_GraphicsState; - - -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_LOCAL( void ) - tt_glyphzone_done( TT_GlyphZone zone ); - - FT_LOCAL( FT_Error ) - tt_glyphzone_new( FT_Memory memory, - FT_UShort maxPoints, - FT_Short maxContours, - TT_GlyphZone zone ); - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - - - /*************************************************************************/ - /* */ - /* EXECUTION SUBTABLES */ - /* */ - /* These sub-tables relate to instruction execution. */ - /* */ - /*************************************************************************/ - - -#define TT_MAX_CODE_RANGES 3 - - - /*************************************************************************/ - /* */ - /* There can only be 3 active code ranges at once: */ - /* - the Font Program */ - /* - the CVT Program */ - /* - a glyph's instructions set */ - /* */ - typedef enum TT_CodeRange_Tag_ - { - tt_coderange_none = 0, - tt_coderange_font, - tt_coderange_cvt, - tt_coderange_glyph - - } TT_CodeRange_Tag; - - - typedef struct TT_CodeRange_ - { - FT_Byte* base; - FT_ULong size; - - } TT_CodeRange; - - typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES]; - - - /*************************************************************************/ - /* */ - /* Defines a function/instruction definition record. */ - /* */ - typedef struct TT_DefRecord_ - { - FT_Int range; /* in which code range is it located? */ - FT_Long start; /* where does it start? */ - FT_UInt opc; /* function #, or instruction code */ - FT_Bool active; /* is it active? */ - - } TT_DefRecord, *TT_DefArray; - - - /*************************************************************************/ - /* */ - /* Subglyph transformation record. */ - /* */ - typedef struct TT_Transform_ - { - FT_Fixed xx, xy; /* transformation matrix coefficients */ - FT_Fixed yx, yy; - FT_F26Dot6 ox, oy; /* offsets */ - - } TT_Transform; - - - /*************************************************************************/ - /* */ - /* A note regarding non-squared pixels: */ - /* */ - /* (This text will probably go into some docs at some time; for now, it */ - /* is kept here to explain some definitions in the TT_Size_Metrics */ - /* record). */ - /* */ - /* The CVT is a one-dimensional array containing values that control */ - /* certain important characteristics in a font, like the height of all */ - /* capitals, all lowercase letter, default spacing or stem width/height. */ - /* */ - /* These values are found in FUnits in the font file, and must be scaled */ - /* to pixel coordinates before being used by the CVT and glyph programs. */ - /* Unfortunately, when using distinct x and y resolutions (or distinct x */ - /* and y pointsizes), there are two possible scalings. */ - /* */ - /* A first try was to implement a `lazy' scheme where all values were */ - /* scaled when first used. However, while some values are always used */ - /* in the same direction, some others are used under many different */ - /* circumstances and orientations. */ - /* */ - /* I have found a simpler way to do the same, and it even seems to work */ - /* in most of the cases: */ - /* */ - /* - All CVT values are scaled to the maximum ppem size. */ - /* */ - /* - When performing a read or write in the CVT, a ratio factor is used */ - /* to perform adequate scaling. Example: */ - /* */ - /* x_ppem = 14 */ - /* y_ppem = 10 */ - /* */ - /* We choose ppem = x_ppem = 14 as the CVT scaling size. All cvt */ - /* entries are scaled to it. */ - /* */ - /* x_ratio = 1.0 */ - /* y_ratio = y_ppem/ppem (< 1.0) */ - /* */ - /* We compute the current ratio like: */ - /* */ - /* - If projVector is horizontal, */ - /* ratio = x_ratio = 1.0 */ - /* */ - /* - if projVector is vertical, */ - /* ratio = y_ratio */ - /* */ - /* - else, */ - /* ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */ - /* */ - /* Reading a cvt value returns */ - /* ratio * cvt[index] */ - /* */ - /* Writing a cvt value in pixels: */ - /* cvt[index] / ratio */ - /* */ - /* The current ppem is simply */ - /* ratio * ppem */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* Metrics used by the TrueType size and context objects. */ - /* */ - typedef struct TT_Size_Metrics_ - { - /* for non-square pixels */ - FT_Long x_ratio; - FT_Long y_ratio; - - FT_UShort ppem; /* maximum ppem size */ - FT_Long ratio; /* current ratio */ - FT_Fixed scale; - - FT_F26Dot6 compensations[4]; /* device-specific compensations */ - - FT_Bool valid; - - FT_Bool rotated; /* `is the glyph rotated?'-flag */ - FT_Bool stretched; /* `is the glyph stretched?'-flag */ - - } TT_Size_Metrics; - - - /*************************************************************************/ - /* */ - /* TrueType size class. */ - /* */ - typedef struct TT_SizeRec_ - { - FT_SizeRec root; - - /* we have our own copy of metrics so that we can modify */ - /* it without affecting auto-hinting (when used) */ - FT_Size_Metrics metrics; - - TT_Size_Metrics ttmetrics; - - FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ - -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_UInt num_function_defs; /* number of function definitions */ - FT_UInt max_function_defs; - TT_DefArray function_defs; /* table of function definitions */ - - FT_UInt num_instruction_defs; /* number of ins. definitions */ - FT_UInt max_instruction_defs; - TT_DefArray instruction_defs; /* table of ins. definitions */ - - FT_UInt max_func; - FT_UInt max_ins; - - TT_CodeRangeTable codeRangeTable; - - TT_GraphicsState GS; - - FT_ULong cvt_size; /* the scaled control value table */ - FT_Long* cvt; - - FT_UShort storage_size; /* The storage area is now part of */ - FT_Long* storage; /* the instance */ - - TT_GlyphZoneRec twilight; /* The instance's twilight zone */ - - /* debugging variables */ - - /* When using the debugger, we must keep the */ - /* execution context tied to the instance */ - /* object rather than asking it on demand. */ - - FT_Bool debug; - TT_ExecContext context; - - FT_Bool bytecode_ready; - FT_Bool cvt_ready; - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - } TT_SizeRec; - - - /*************************************************************************/ - /* */ - /* TrueType driver class. */ - /* */ - typedef struct TT_DriverRec_ - { - FT_DriverRec root; - TT_ExecContext context; /* execution context */ - TT_GlyphZoneRec zone; /* glyph loader points zone */ - - void* extension_component; - - } TT_DriverRec; - - - /* Note: All of the functions below (except tt_size_reset()) are used */ - /* as function pointers in a FT_Driver_ClassRec. Therefore their */ - /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face, */ - /* TT_Size, etc., so that the compiler can confirm that the types and */ - /* number of parameters are correct. In all cases the FT_xxx types are */ - /* cast to their TT_xxx counterparts inside the functions since FreeType */ - /* will always use the TT driver to create them. */ - - - /*************************************************************************/ - /* */ - /* Face functions */ - /* */ - FT_LOCAL( FT_Error ) - tt_face_init( FT_Stream stream, - FT_Face ttface, /* TT_Face */ - FT_Int face_index, - FT_Int num_params, - FT_Parameter* params ); - - FT_LOCAL( void ) - tt_face_done( FT_Face ttface ); /* TT_Face */ - - - /*************************************************************************/ - /* */ - /* Size functions */ - /* */ - FT_LOCAL( FT_Error ) - tt_size_init( FT_Size ttsize ); /* TT_Size */ - - FT_LOCAL( void ) - tt_size_done( FT_Size ttsize ); /* TT_Size */ - -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_LOCAL( FT_Error ) - tt_size_run_fpgm( TT_Size size ); - - FT_LOCAL( FT_Error ) - tt_size_run_prep( TT_Size size ); - - FT_LOCAL( FT_Error ) - tt_size_ready_bytecode( TT_Size size ); - -#endif /* TT_USE_BYTECODE_INTERPRETER */ - - FT_LOCAL( FT_Error ) - tt_size_reset( TT_Size size ); - - - /*************************************************************************/ - /* */ - /* Driver functions */ - /* */ - FT_LOCAL( FT_Error ) - tt_driver_init( FT_Module ttdriver ); /* TT_Driver */ - - FT_LOCAL( void ) - tt_driver_done( FT_Module ttdriver ); /* TT_Driver */ - - - /*************************************************************************/ - /* */ - /* Slot functions */ - /* */ - FT_LOCAL( FT_Error ) - tt_slot_init( FT_GlyphSlot slot ); - - -FT_END_HEADER - -#endif /* __TTOBJS_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttpic.c b/android/jni/ndk_modules/freetype/src/truetype/ttpic.c deleted file mode 100644 index 5d725742..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttpic.c +++ /dev/null @@ -1,81 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpic.c */ -/* */ -/* The FreeType position independent code services for truetype module. */ -/* */ -/* Copyright 2009, 2010 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_INTERNAL_OBJECTS_H -#include "ttpic.h" - -#ifdef FT_CONFIG_OPTION_PIC - - /* forward declaration of PIC init functions from ttdriver.c */ - FT_Error FT_Create_Class_tt_services( FT_Library, FT_ServiceDescRec**); - void FT_Destroy_Class_tt_services( FT_Library, FT_ServiceDescRec*); - void FT_Init_Class_tt_service_gx_multi_masters(FT_Service_MultiMastersRec*); - void FT_Init_Class_tt_service_truetype_glyf(FT_Service_TTGlyfRec*); - - void - tt_driver_class_pic_free( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Memory memory = library->memory; - if ( pic_container->truetype ) - { - TTModulePIC* container = (TTModulePIC*)pic_container->truetype; - if(container->tt_services) - FT_Destroy_Class_tt_services(library, container->tt_services); - container->tt_services = NULL; - FT_FREE( container ); - pic_container->truetype = NULL; - } - } - - - FT_Error - tt_driver_class_pic_init( FT_Library library ) - { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = TT_Err_Ok; - TTModulePIC* container; - FT_Memory memory = library->memory; - - - /* allocate pointer, clear and set global container pointer */ - if ( FT_ALLOC ( container, sizeof ( *container ) ) ) - return error; - FT_MEM_SET( container, 0, sizeof(*container) ); - pic_container->truetype = container; - - /* initialize pointer table - this is how the module usually expects this data */ - error = FT_Create_Class_tt_services(library, &container->tt_services); - if(error) - goto Exit; -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Init_Class_tt_service_gx_multi_masters(&container->tt_service_gx_multi_masters); -#endif - FT_Init_Class_tt_service_truetype_glyf(&container->tt_service_truetype_glyf); -Exit: - if(error) - tt_driver_class_pic_free(library); - return error; - } - -#endif /* FT_CONFIG_OPTION_PIC */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttpic.h b/android/jni/ndk_modules/freetype/src/truetype/ttpic.h deleted file mode 100644 index 84de0fee..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttpic.h +++ /dev/null @@ -1,59 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpic.h */ -/* */ -/* The FreeType position independent code services for truetype module. */ -/* */ -/* Copyright 2009 by */ -/* Oran Agra and Mickey Gabel. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTPIC_H__ -#define __TTPIC_H__ - - -FT_BEGIN_HEADER - -#ifndef FT_CONFIG_OPTION_PIC -#define FT_TT_SERVICES_GET tt_services -#define FT_TT_SERVICE_GX_MULTI_MASTERS_GET tt_service_gx_multi_masters -#define FT_TT_SERVICE_TRUETYPE_GLYF_GET tt_service_truetype_glyf - -#else /* FT_CONFIG_OPTION_PIC */ - -#include FT_MULTIPLE_MASTERS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H -#include FT_SERVICE_TRUETYPE_GLYF_H - - typedef struct TTModulePIC_ - { - FT_ServiceDescRec* tt_services; -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Service_MultiMastersRec tt_service_gx_multi_masters; -#endif - FT_Service_TTGlyfRec tt_service_truetype_glyf; - } TTModulePIC; - -#define GET_PIC(lib) ((TTModulePIC*)((lib)->pic_container.truetype)) -#define FT_TT_SERVICES_GET (GET_PIC(library)->tt_services) -#define FT_TT_SERVICE_GX_MULTI_MASTERS_GET (GET_PIC(library)->tt_service_gx_multi_masters) -#define FT_TT_SERVICE_TRUETYPE_GLYF_GET (GET_PIC(library)->tt_service_truetype_glyf) - -#endif /* FT_CONFIG_OPTION_PIC */ - - /* */ - -FT_END_HEADER - -#endif /* __TTPIC_H__ */ - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttpload.c b/android/jni/ndk_modules/freetype/src/truetype/ttpload.c deleted file mode 100644 index a311b03c..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttpload.c +++ /dev/null @@ -1,572 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpload.c */ -/* */ -/* TrueType-specific tables loader (body). */ -/* */ -/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_TAGS_H - -#include "ttpload.h" - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include "ttgxvar.h" -#endif - -#include "tterrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttpload - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_loca */ - /* */ - /* <Description> */ - /* Load the locations table. */ - /* */ - /* <InOut> */ - /* face :: A handle to the target face object. */ - /* */ - /* <Input> */ - /* stream :: The input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_loca( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_ULong table_len; - FT_Int shift; - - - /* we need the size of the `glyf' table for malformed `loca' tables */ - error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len ); - - /* it is possible that a font doesn't have a glyf table at all */ - /* or its size is zero */ - if ( error == TT_Err_Table_Missing ) - face->glyf_len = 0; - else if ( error ) - goto Exit; - - FT_TRACE2(( "Locations " )); - error = face->goto_table( face, TTAG_loca, stream, &table_len ); - if ( error ) - { - error = TT_Err_Locations_Missing; - goto Exit; - } - - if ( face->header.Index_To_Loc_Format != 0 ) - { - shift = 2; - - if ( table_len >= 0x40000L ) - { - FT_TRACE2(( "table too large\n" )); - error = TT_Err_Invalid_Table; - goto Exit; - } - face->num_locations = table_len >> shift; - } - else - { - shift = 1; - - if ( table_len >= 0x20000L ) - { - FT_TRACE2(( "table too large\n" )); - error = TT_Err_Invalid_Table; - goto Exit; - } - face->num_locations = table_len >> shift; - } - - if ( face->num_locations != (FT_ULong)face->root.num_glyphs ) - { - FT_TRACE2(( "glyph count mismatch! loca: %d, maxp: %d\n", - face->num_locations, face->root.num_glyphs )); - - /* we only handle the case where `maxp' gives a larger value */ - if ( face->num_locations < (FT_ULong)face->root.num_glyphs ) - { - FT_Long new_loca_len = (FT_Long)face->root.num_glyphs << shift; - - TT_Table entry = face->dir_tables; - TT_Table limit = entry + face->num_tables; - - FT_Long pos = FT_Stream_Pos( stream ); - FT_Long dist = 0x7FFFFFFFL; - - - /* compute the distance to next table in font file */ - for ( ; entry < limit; entry++ ) - { - FT_Long diff = entry->Offset - pos; - - - if ( diff > 0 && diff < dist ) - dist = diff; - } - - if ( new_loca_len <= dist ) - { - face->num_locations = face->root.num_glyphs; - table_len = new_loca_len; - - FT_TRACE2(( "adjusting num_locations to %d\n", - face->num_locations )); - } - } - } - - /* - * Extract the frame. We don't need to decompress it since - * we are able to parse it directly. - */ - if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) ) - goto Exit; - - FT_TRACE2(( "loaded\n" )); - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_ULong ) - tt_face_get_location( TT_Face face, - FT_UInt gindex, - FT_UInt *asize ) - { - FT_ULong pos1, pos2; - FT_Byte* p; - FT_Byte* p_limit; - - - pos1 = pos2 = 0; - - if ( gindex < face->num_locations ) - { - if ( face->header.Index_To_Loc_Format != 0 ) - { - p = face->glyph_locations + gindex * 4; - p_limit = face->glyph_locations + face->num_locations * 4; - - pos1 = FT_NEXT_ULONG( p ); - pos2 = pos1; - - if ( p + 4 <= p_limit ) - pos2 = FT_NEXT_ULONG( p ); - } - else - { - p = face->glyph_locations + gindex * 2; - p_limit = face->glyph_locations + face->num_locations * 2; - - pos1 = FT_NEXT_USHORT( p ); - pos2 = pos1; - - if ( p + 2 <= p_limit ) - pos2 = FT_NEXT_USHORT( p ); - - pos1 <<= 1; - pos2 <<= 1; - } - } - - /* The `loca' table must be ordered; it refers to the length of */ - /* an entry as the difference between the current and the next */ - /* position. However, there do exist (malformed) fonts which */ - /* don't obey this rule, so we are only able to provide an */ - /* upper bound for the size. */ - /* */ - /* We get (intentionally) a wrong, non-zero result in case the */ - /* `glyf' table is missing. */ - if ( pos2 >= pos1 ) - *asize = (FT_UInt)( pos2 - pos1 ); - else - *asize = (FT_UInt)( face->glyf_len - pos1 ); - - return pos1; - } - - - FT_LOCAL_DEF( void ) - tt_face_done_loca( TT_Face face ) - { - FT_Stream stream = face->root.stream; - - - FT_FRAME_RELEASE( face->glyph_locations ); - face->num_locations = 0; - } - - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_cvt */ - /* */ - /* <Description> */ - /* Load the control value table into a face object. */ - /* */ - /* <InOut> */ - /* face :: A handle to the target face object. */ - /* */ - /* <Input> */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_cvt( TT_Face face, - FT_Stream stream ) - { -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_Error error; - FT_Memory memory = stream->memory; - FT_ULong table_len; - - - FT_TRACE2(( "CVT " )); - - error = face->goto_table( face, TTAG_cvt, stream, &table_len ); - if ( error ) - { - FT_TRACE2(( "is missing\n" )); - - face->cvt_size = 0; - face->cvt = NULL; - error = TT_Err_Ok; - - goto Exit; - } - - face->cvt_size = table_len / 2; - - if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) ) - goto Exit; - - if ( FT_FRAME_ENTER( face->cvt_size * 2L ) ) - goto Exit; - - { - FT_Short* cur = face->cvt; - FT_Short* limit = cur + face->cvt_size; - - - for ( ; cur < limit; cur++ ) - *cur = FT_GET_SHORT(); - } - - FT_FRAME_EXIT(); - FT_TRACE2(( "loaded\n" )); - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - if ( face->doblend ) - error = tt_face_vary_cvt( face, stream ); -#endif - - Exit: - return error; - -#else /* !TT_USE_BYTECODE_INTERPRETER */ - - FT_UNUSED( face ); - FT_UNUSED( stream ); - - return TT_Err_Ok; - -#endif - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_fpgm */ - /* */ - /* <Description> */ - /* Load the font program. */ - /* */ - /* <InOut> */ - /* face :: A handle to the target face object. */ - /* */ - /* <Input> */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_fpgm( TT_Face face, - FT_Stream stream ) - { -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_Error error; - FT_ULong table_len; - - - FT_TRACE2(( "Font program " )); - - /* The font program is optional */ - error = face->goto_table( face, TTAG_fpgm, stream, &table_len ); - if ( error ) - { - face->font_program = NULL; - face->font_program_size = 0; - error = TT_Err_Ok; - - FT_TRACE2(( "is missing\n" )); - } - else - { - face->font_program_size = table_len; - if ( FT_FRAME_EXTRACT( table_len, face->font_program ) ) - goto Exit; - - FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size )); - } - - Exit: - return error; - -#else /* !TT_USE_BYTECODE_INTERPRETER */ - - FT_UNUSED( face ); - FT_UNUSED( stream ); - - return TT_Err_Ok; - -#endif - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_prep */ - /* */ - /* <Description> */ - /* Load the cvt program. */ - /* */ - /* <InOut> */ - /* face :: A handle to the target face object. */ - /* */ - /* <Input> */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_prep( TT_Face face, - FT_Stream stream ) - { -#ifdef TT_USE_BYTECODE_INTERPRETER - - FT_Error error; - FT_ULong table_len; - - - FT_TRACE2(( "Prep program " )); - - error = face->goto_table( face, TTAG_prep, stream, &table_len ); - if ( error ) - { - face->cvt_program = NULL; - face->cvt_program_size = 0; - error = TT_Err_Ok; - - FT_TRACE2(( "is missing\n" )); - } - else - { - face->cvt_program_size = table_len; - if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) ) - goto Exit; - - FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size )); - } - - Exit: - return error; - -#else /* !TT_USE_BYTECODE_INTERPRETER */ - - FT_UNUSED( face ); - FT_UNUSED( stream ); - - return TT_Err_Ok; - -#endif - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_hdmx */ - /* */ - /* <Description> */ - /* Load the `hdmx' table into the face object. */ - /* */ - /* <Input> */ - /* face :: A handle to the target face object. */ - /* */ - /* stream :: A handle to the input stream. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - - FT_LOCAL_DEF( FT_Error ) - tt_face_load_hdmx( TT_Face face, - FT_Stream stream ) - { - FT_Error error; - FT_Memory memory = stream->memory; - FT_UInt version, nn, num_records; - FT_ULong table_size, record_size; - FT_Byte* p; - FT_Byte* limit; - - - /* this table is optional */ - error = face->goto_table( face, TTAG_hdmx, stream, &table_size ); - if ( error || table_size < 8 ) - return TT_Err_Ok; - - if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) ) - goto Exit; - - p = face->hdmx_table; - limit = p + table_size; - - version = FT_NEXT_USHORT( p ); - num_records = FT_NEXT_USHORT( p ); - record_size = FT_NEXT_ULONG( p ); - - /* The maximum number of bytes in an hdmx device record is the */ - /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is */ - /* the reason why `record_size' is a long (which we read as */ - /* unsigned long for convenience). In practice, two bytes */ - /* sufficient to hold the size value. */ - /* */ - /* There are at least two fonts, HANNOM-A and HANNOM-B version */ - /* 2.0 (2005), which get this wrong: The upper two bytes of */ - /* the size value are set to 0xFF instead of 0x00. We catch */ - /* and fix this. */ - - if ( record_size >= 0xFFFF0000UL ) - record_size &= 0xFFFFU; - - /* The limit for `num_records' is a heuristic value. */ - - if ( version != 0 || num_records > 255 || record_size > 0x10001L ) - { - error = TT_Err_Invalid_File_Format; - goto Fail; - } - - if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) ) - goto Fail; - - for ( nn = 0; nn < num_records; nn++ ) - { - if ( p + record_size > limit ) - break; - - face->hdmx_record_sizes[nn] = p[0]; - p += record_size; - } - - face->hdmx_record_count = nn; - face->hdmx_table_size = table_size; - face->hdmx_record_size = record_size; - - Exit: - return error; - - Fail: - FT_FRAME_RELEASE( face->hdmx_table ); - face->hdmx_table_size = 0; - goto Exit; - } - - - FT_LOCAL_DEF( void ) - tt_face_free_hdmx( TT_Face face ) - { - FT_Stream stream = face->root.stream; - FT_Memory memory = stream->memory; - - - FT_FREE( face->hdmx_record_sizes ); - FT_FRAME_RELEASE( face->hdmx_table ); - } - - - /*************************************************************************/ - /* */ - /* Return the advance width table for a given pixel size if it is found */ - /* in the font's `hdmx' table (if any). */ - /* */ - FT_LOCAL_DEF( FT_Byte* ) - tt_face_get_device_metrics( TT_Face face, - FT_UInt ppem, - FT_UInt gindex ) - { - FT_UInt nn; - FT_Byte* result = NULL; - FT_ULong record_size = face->hdmx_record_size; - FT_Byte* record = face->hdmx_table + 8; - - - for ( nn = 0; nn < face->hdmx_record_count; nn++ ) - if ( face->hdmx_record_sizes[nn] == ppem ) - { - gindex += 2; - if ( gindex < record_size ) - result = record + nn * record_size + gindex; - break; - } - - return result; - } - - -/* END */ diff --git a/android/jni/ndk_modules/freetype/src/truetype/ttpload.h b/android/jni/ndk_modules/freetype/src/truetype/ttpload.h deleted file mode 100644 index f61ac079..00000000 --- a/android/jni/ndk_modules/freetype/src/truetype/ttpload.h +++ /dev/null @@ -1,75 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttpload.h */ -/* */ -/* TrueType-specific tables loader (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2005, 2006 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __TTPLOAD_H__ -#define __TTPLOAD_H__ - - -#include <ft2build.h> -#include FT_INTERNAL_TRUETYPE_TYPES_H - - -FT_BEGIN_HEADER - - - FT_LOCAL( FT_Error ) - tt_face_load_loca( TT_Face face, - FT_Stream stream ); - - FT_LOCAL( FT_ULong ) - tt_face_get_location( TT_Face face, - FT_UInt gindex, - FT_UInt *asize ); - - FT_LOCAL( void ) - tt_face_done_loca( TT_Face face ); - - FT_LOCAL( FT_Error ) - tt_face_load_cvt( TT_Face face, - FT_Stream stream ); - - FT_LOCAL( FT_Error ) - tt_face_load_fpgm( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_prep( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( FT_Error ) - tt_face_load_hdmx( TT_Face face, - FT_Stream stream ); - - - FT_LOCAL( void ) - tt_face_free_hdmx( TT_Face face ); - - - FT_LOCAL( FT_Byte* ) - tt_face_get_device_metrics( TT_Face face, - FT_UInt ppem, - FT_UInt gindex ); - -FT_END_HEADER - -#endif /* __TTPLOAD_H__ */ - - -/* END */