[gs-code-review] Make FontDictionary read-only

Igor V. Melichev igor.melichev at artifex.com
Wed Nov 1 00:27:47 PST 2006


Ray, Alex,

I've got 3 remarks about this.

1. Would like to obtain Ray's comparison with Tek hardcopy.
Does Tek set readonly to FontDirectory ?
If not, I would drop this big change and change the
status to AOK.

2. If we accept this change, maybe it can be simplified a little bit.
I noticed Alex adds a call to .force* to gs_init.
My suggestion is to make FontDirectory to be read-only
*at*end* of gs_init, so that it is writable while gs_init works.
Alex, please check whether it gives a real simplification.
Please remember that for dictionaries the read-only feature is
a property of a dictionary rather than a property of the iref.

3.
> -<</Type/FontDescriptor/FontName/GBKXCW+MSTT31c27a/FontBBox[0 0 5523
> 343]/Flags 4
> +<</Type/FontDescriptor/FontName/GBKXCW+MSTT31c27a/FontBBox[0 0 5523
> 343]/Flags 5

I do not like different flags.
It can cause a different font substitution
in 3d party viewers and an additional load
to our Support. Alex, please work out why it happens.

Igor.


----- Original Message ----- 
From: "Alex Cherepanov" <alexcher at quadnet.net>
To: "gs-code-review" <gs-code-review at ghostscript.com>
Sent: Wednesday, November 01, 2006 9:28 AM
Subject: [gs-code-review] Make FontDictionary read-only


> Make FontDirectory read-only to satisfy CET 24-13.ps.
> Make LocalFontDirectory read-only for consistency with FontDirectory.
> Use forced access operators to modify these dictionaries.
> Create .forcesetmaxlength operator and modify .dictcopynew operatot
> to ignore read-only status of the destination.
>
> DIFFERENCES:
> Probably, none.
> The differences in 409-01.ps in enumeration order of .svn directory
> is not important.
> There are many differences in TypeIC fonts generated in PDF files, but
> they don't result in the raster difference.
>
> Also observed the following change in generated fonts. I don't yet know
> the cause.
>
> -<</Type/FontDescriptor/FontName/GBKXCW+MSTT31c27a/FontBBox[0 0 5523
> 343]/Flags 4
> +<</Type/FontDescriptor/FontName/GBKXCW+MSTT31c27a/FontBBox[0 0 5523
> 343]/Flags 5
>  /Ascent 343
>  /CapHeight 343
>  /Descent 0
>  /ItalicAngle 0
>  /StemV 828
> +/AvgWidth 5560
> +/MaxWidth 5560
> +/MissingWidth 5560
>
>
>
>


--------------------------------------------------------------------------------


> Index: gs/src/zdict.c
> ===================================================================
> --- gs/src/zdict.c (revision 7132)
> +++ gs/src/zdict.c (working copy)
> @@ -363,7 +363,7 @@
>     check_type(*op1, t_dictionary);
>     check_dict_read(*op1);
>     check_type(*op, t_dictionary);
> -    check_dict_write(*op);
> +    check_dict_read(*op); /* This is the destination, but we ignore 
> read-only status */
>     /* This is only recognized in Level 2 mode. */
>     if (!imemory->gs_lib_ctx->dict_auto_expand)
>  return_error(e_undefined);
> @@ -465,7 +465,7 @@
>
> /* <dict> <int> .setmaxlength - */
> private int
> -zsetmaxlength(i_ctx_t *i_ctx_p)
> +setmaxlength_impl(i_ctx_t *i_ctx_p, bool force)
> {
>     os_ptr op = osp;
>     os_ptr op1 = op - 1;
> @@ -473,7 +473,11 @@
>     int code;
>
>     check_type(*op1, t_dictionary);
> -    check_dict_write(*op1);
> +    if (force) {
> +      check_type(*op1, t_dictionary);
> +    } else {
> +      check_dict_write(*op1);
> +    }
>     check_type(*op, t_integer);
> #if arch_sizeof_int < arch_sizeof_long
>     check_int_leu(*op, max_uint);
> @@ -490,6 +494,24 @@
>     return code;
> }
>
> +
> +/* <dict> <int> .setmaxlength - */
> +private int
> +zsetmaxlength(i_ctx_t *i_ctx_p)
> +{
> +    return setmaxlength_impl(i_ctx_p, false);
> +}
> +
> +
> +/* <dict> <int> .setmaxlength - */
> +/* Mainly to grow a read-only FontDirectory */
> +private int
> +zforcesetmaxlength(i_ctx_t *i_ctx_p)
> +{
> +    return setmaxlength_impl(i_ctx_p, true);
> +}
> +
> +
> /* ------ Initialization procedure ------ */
>
> /* We need to split the table because of the 16-element limit. */
> @@ -517,6 +539,7 @@
>     {"2.knownget", zknownget},
>     {"1.knownundef", zknownundef},
>     {"2.setmaxlength", zsetmaxlength},
> +    {"2.forcesetmaxlength", zforcesetmaxlength},
>  /*
>  * In Level 2, >> is a synonym for .dicttomark, and undef for
>  * .undef.  By giving the former their own entries, they will not be
> Index: gs/lib/gs_dps1.ps
> ===================================================================
> --- gs/lib/gs_dps1.ps (revision 7132)
> +++ gs/lib/gs_dps1.ps (working copy)
> @@ -34,13 +34,13 @@
>
> /SharedFontDirectory .FontDirectory .gcheck
>  { .currentglobal false .setglobal
> -   /LocalFontDirectory .FontDirectory dup maxlength dict copy
> +   /LocalFontDirectory .FontDirectory dup maxlength dict copy readonly
>    .forcedef % LocalFontDirectory is local, systemdict is global
>    .setglobal .FontDirectory
>  }
>  { /LocalFontDirectory .FontDirectory
>    .forcedef % LocalFontDirectory is local, systemdict is global
> -   50 dict
> +   50 dict readonly
>  }
> ifelse def
>
> @@ -74,18 +74,18 @@
>  } odef
> % undefinefont has to take local/global VM into account.
> /undefinefont % <fontname> undefinefont -
> - { .FontDirectory 1 .argindex .undef
> + { .FontDirectory 1 .argindex .forceundef
>    .currentglobal
>     { % Current mode is global; delete from local directory too.
>       //systemdict /LocalFontDirectory .knownget
> -       { 1 index .undef }
> +       { 1 index .forceundef }
>       if
>     }
>     { % Current mode is local; if there was a shadowed global
>  % definition, copy it into the local directory.
>       //systemdict /SharedFontDirectory .knownget
>        { 1 index .knownget
> -   { .FontDirectory 2 index 3 -1 roll put }
> +   { .FontDirectory 2 index 3 -1 roll .forceput }
>  if
>        }
>       if
> @@ -126,7 +126,7 @@
>    }
>  ifelse
>        } forall
> -      pop counttomark 2 idiv { .undef } repeat pop
> +      pop counttomark 2 idiv { .forceundef } repeat pop
>     }
>    if
>    //SharedFontDirectory exch .dictcopynew pop
> Index: gs/lib/gs_init.ps
> ===================================================================
> --- gs/lib/gs_init.ps (revision 7132)
> +++ gs/lib/gs_init.ps (working copy)
> @@ -1206,7 +1206,7 @@
> (END PROCS) VMDEBUG
>
> % Define the font directory.
> -/FontDirectory false .setglobal 100 dict true .setglobal
> +/FontDirectory false .setglobal 100 dict readonly true .setglobal
> .forcedef % FontDirectory is local, systemdict is global
>
> % Define the encoding dictionary.
> @@ -1705,7 +1705,7 @@
> /undefinefont where {
>   pop /NullFont undefinefont
> } {
> -  FontDirectory /NullFont .undef
> +  FontDirectory /NullFont .forceundef
> } ifelse
>
> (END FONTS) VMDEBUG
> @@ -2251,6 +2251,7 @@
> currentdict /.patterntypes .undef
> currentdict /.shadingtypes .undef
> currentdict /.wheredict .undef
> +currentdict /.dictcopynew .undef
> end
>
> % Clean up VM, and enable GC.
> @@ -2261,6 +2262,7 @@
>   systemdict /.forcedef .undef % remove temptation
>   systemdict /.forceput .undef % ditto
>   systemdict /.forceundef .undef % ditto
> +  systemdict /.forcesetmaxlength .undef
> } if
> WRITESYSTEMDICT not { systemdict readonly pop } if
> (END GC) VMDEBUG
> Index: gs/lib/gs_fonts.ps
> ===================================================================
> --- gs/lib/gs_fonts.ps (revision 7132)
> +++ gs/lib/gs_fonts.ps (working copy)
> @@ -490,11 +490,15 @@
>                 % the font in LocalFontDirectory.
>    .currentglobal
>     { //systemdict /LocalFontDirectory .knownget
> -       { 2 index 2 index .growput }
> +        { dup dup .growdictlength .forcesetmaxlength
> +          2 index 2 index .forceput
> +        }
>       if
>     }
>    if
> -   dup .FontDirectory 4 -2 roll .growput
> +   dup .FontDirectory
> +   dup dup .growdictlength .forcesetmaxlength
> +   4 -2 roll .forceput
>                 % If the font originated as a resource, register it.
>    currentfile .currentresourcefile eq { dup .registerfont } if
>  } odef
> @@ -1035,7 +1039,7 @@
>                 % because it's different depending on language level.
>            .currentglobal exch /.setglobal .systemvar exec
>                 % Remove the fake definition, if any.
> -           .FontDirectory 3 index .undef
> +           .FontDirectory 3 index .forceundef
>            1 index (r) file .loadfont .FontDirectory exch
>            /.setglobal .systemvar exec
>          }
> @@ -1131,7 +1135,7 @@
>         } ifelse
>       } forall
>     }
> -FAKEFONTS { exch } if pop def   % don't bind, .current/setglobal get 
> redefined
> +FAKEFONTS { exch } if pop .bind executeonly def
>
> % Install initial fonts from Fontmap.
> /.loadinitialfonts
>


--------------------------------------------------------------------------------


> _______________________________________________
> gs-code-review mailing list
> gs-code-review at ghostscript.com
> http://www.ghostscript.com/mailman/listinfo/gs-code-review
> 



More information about the gs-code-review mailing list