[gs-code-review] Make FontDictionary read-only
Alex Cherepanov
alexcher at quadnet.net
Tue Oct 31 22:28:26 PST 2006
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
-------------- next part --------------
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
More information about the gs-code-review
mailing list