summaryrefslogtreecommitdiff
path: root/src/cff/cffobjs.c
diff options
context:
space:
mode:
authorWerner Lemberg <wl@gnu.org>2017-02-20 09:15:13 +0100
committerWerner Lemberg <wl@gnu.org>2017-02-20 09:15:13 +0100
commite706798d43da47cea09d1372db88aa16b3f06f5f (patch)
tree90497ac016aeb7c03df9e8277bb692c484c47dbf /src/cff/cffobjs.c
parent156b30b1aadb958f795e9888f5dfd115aae0fcec (diff)
downloadfreetype2-e706798d43da47cea09d1372db88aa16b3f06f5f.tar.gz
[cff] Finish support for `random' operator.
* src/cff/cfftypes.h (CFF_SubFontRec): Add `random' field. * src/cff/cffobjs.c: Updated. (cff_driver_init): Initialize random seed value. * src/cff/cffload.c (cff_random): New function. (cff_subfont_load): Add `face' argument. Update all callers. Initialize random number generator with a proper seed value. (cff_font_load): Add `face' argument. Update all callers. * src/cff/cffload.h: Updated. * src/cff/cf2intrp.c (CF2_FIXME): Removed. (cf2_interpT2CharString) <cf2_escRANDOM>: Implement opcode. * src/cff/cffgload.c (cff_decoder_parse_charstrings): Don't initialize random seed value. <cff_op_random>: Use new random seed framework.
Diffstat (limited to 'src/cff/cffobjs.c')
-rw-r--r--src/cff/cffobjs.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/cff/cffobjs.c b/src/cff/cffobjs.c
index f0320afa4..67bf0cc41 100644
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -595,6 +595,7 @@
stream,
face_index,
cff,
+ face,
pure_cff,
cff2 );
if ( error )
@@ -1157,6 +1158,8 @@
{
CFF_Driver driver = (CFF_Driver)module;
+ FT_UInt32 seed;
+
/* set default property values, cf. `ftcffdrv.h' */
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
@@ -1176,6 +1179,18 @@
driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4;
driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4;
+ /* compute random seed from some memory addresses */
+ seed = (FT_UInt32)( (FT_Offset)(char*)&seed ^
+ (FT_Offset)(char*)&module ^
+ (FT_Offset)(char*)module->memory );
+ seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 );
+
+ driver->random_seed = (FT_Int32)seed;
+ if ( driver->random_seed < 0 )
+ driver->random_seed = -driver->random_seed;
+ else if ( driver->random_seed == 0 )
+ driver->random_seed = 123456789;
+
return FT_Err_Ok;
}