git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/fop-1_1@1357883 13f79535-47bb-0310-9956-ffa450edef68tags/fop-1_1rc1^2
@@ -864,16 +864,28 @@ list of possible build targets. | |||
<target name="junit-text-linebreak" depends="junit-compile" description="Runs FOP's JUnit unicode linebreak tests" if="junit.present"> | |||
<junit-run title="Unicode UAX#14 support" testsuite="org.apache.fop.text.linebreak.LineBreakStatusTestCase" outfile="TEST-linebreak"/> | |||
</target> | |||
<target name="junit-fonts" depends="junit-compile"> | |||
<echo message="Running tests for the fonts package"/> | |||
<junit-run title="fonts" testsuite="org.apache.fop.fonts.FOPFontsTestSuite" outfile="TEST-fonts"/> | |||
</target> | |||
<target name="junit-render-ps" depends="junit-compile"> | |||
<echo message="Running tests for the render ps package"/> | |||
<junit-run title="render-ps" testsuite="org.apache.fop.render.ps.RenderPSTestSuite" outfile="TEST-render-ps"/> | |||
</target> | |||
<target name="junit-render-pdf" depends="junit-compile"> | |||
<junit-run title="render-pdf" testsuite="org.apache.fop.render.pdf.RenderPDFTestSuite" outfile="TEST-render-pdf"/> | |||
</target> | |||
<target name="junit-complexscripts" depends="junit-compile"> | |||
<junit-run title="complexscripts" testsuite="org.apache.fop.complexscripts.ComplexScriptsTestSuite" outfile="TEST-complexscripts"/> | |||
</target> | |||
<target name="junit-reduced" depends="junit-userconfig, junit-basic, junit-transcoder, junit-text-linebreak, junit-fotree, junit-render-pdf, junit-complexscripts"/> | |||
<target name="junit-reduced" depends="junit-userconfig, junit-basic, junit-transcoder, | |||
junit-text-linebreak, junit-fotree, junit-fonts, junit-render-pdf, junit-render-ps, | |||
junit-complexscripts"/> | |||
<target name="junit" depends="junit-all" description="Runs all of FOP's JUnit tests" | |||
if="junit.present"> | |||
<fail><condition><or><isset property="fop.junit.error"/><isset property="fop.junit.failure"/><not><isset property="hyphenation.present"/></not></or></condition> | |||
<fail><condition><or><isset property="fop.junit.error"/><isset | |||
property="fop.junit.failure"/><not><isset | |||
property="hyphenation.present"/></not></or></condition> | |||
NOTE: | |||
************************************************************************** | |||
* One or more of the Junit tests had Failures or Errors or were skipped! * |
@@ -369,7 +369,7 @@ This font contains no embedding license restrictions | |||
</fo:block> | |||
</fo:wrapper> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="50mm"/> | |||
<fo:table-column column-width="50mm"/> | |||
<fo:table-column column-width="50mm"/> |
@@ -32,7 +32,7 @@ | |||
<fo:block-container absolute-position="absolute" width="100%" height="100%" border-top-color="silver" border-top-style="dotted" border-top-width="0.13mm"> | |||
<fo:block/> | |||
</fo:block-container> | |||
<fo:table space-before.optimum="1in div 12" margin-left="2in div 12" margin-top="1in div 10" font-family="sans-serif" font-size="7pt" color="green"> | |||
<fo:table space-before.optimum="1in div 12" margin-left="2in div 12" margin-top="1in div 10" font-family="sans-serif" font-size="7pt" color="green" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="8in div 10 - 2in div 12"/> | |||
<fo:table-column border-right-style="solid" border-right-width="0.5mm" column-width="36in div 10"/> | |||
<fo:table-column column-width="5in div 10"/> | |||
@@ -107,7 +107,7 @@ | |||
<fo:block>Från konto nr</fo:block> | |||
</fo:table-cell> | |||
<fo:table-cell border-bottom-style="solid" border-bottom-width="0.13mm" padding-top="6mm" display-align="after"> | |||
<fo:table height="3mm"> | |||
<fo:table height="3mm" table-layout="fixed" width="100%"> | |||
<fo:table-column border-right-style="solid" border-right-width="0.13mm" column-width="0.2in"/> | |||
<fo:table-column border-right-style="solid" border-right-width="0.13mm" column-width="0.2in"/> | |||
<fo:table-column border-right-style="solid" border-right-width="0.13mm" column-width="0.2in"/> | |||
@@ -182,7 +182,7 @@ | |||
<fo:block color="black">16.6.2006</fo:block> | |||
</fo:table-cell> | |||
<fo:table-cell border-bottom-style="solid" border-bottom-width="0.5mm" padding-left="2mm" padding-top="4mm" font-size="10pt"> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="0.5cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-body> | |||
@@ -201,7 +201,7 @@ | |||
<fo:table-row height="13in div 12 - 5mm"> | |||
<fo:table-cell number-columns-spanned="4" padding-left="40mm" display-align="after"> | |||
<fo:block> | |||
<fo:table height="5in div 12" margin-left="2.5mm" margin-right="2.5mm"><!--105--> | |||
<fo:table height="5in div 12" margin-left="2.5mm" margin-right="2.5mm" table-layout="fixed" width="100%"><!--105--> | |||
<fo:table-column column-width="0.5mm"/> | |||
<fo:table-column column-width="0.25mm"/> | |||
<fo:table-column column-width="0.25mm"/> | |||
@@ -950,7 +950,7 @@ | |||
</fo:page-sequence> | |||
<fo:page-sequence master-reference="A4"> | |||
<fo:static-content flow-name="xsl-region-after"> | |||
<fo:table space-before.optimum="1in div 12" margin-left="2in div 12" margin-top="1in div 10" font-family="sans-serif" font-size="7pt" color="green"> | |||
<fo:table space-before.optimum="1in div 12" margin-left="2in div 12" margin-top="1in div 10" font-family="sans-serif" font-size="7pt" color="green" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="8in div 10 - 2in div 12"/> | |||
<fo:table-column border-right-style="solid" border-right-width="0.5mm" column-width="36in div 10"/> | |||
<fo:table-column column-width="5in div 10"/> | |||
@@ -1025,7 +1025,7 @@ | |||
<fo:block>Från konto nr</fo:block> | |||
</fo:table-cell> | |||
<fo:table-cell border-bottom-style="solid" border-bottom-width="0.13mm" padding-top="6mm" display-align="after"> | |||
<fo:table height="3mm"> | |||
<fo:table height="3mm" table-layout="fixed" width="100%"> | |||
<fo:table-column border-right-style="solid" border-right-width="0.13mm" column-width="0.2in"/> | |||
<fo:table-column border-right-style="solid" border-right-width="0.13mm" column-width="0.2in"/> | |||
<fo:table-column border-right-style="solid" border-right-width="0.13mm" column-width="0.2in"/> | |||
@@ -1100,7 +1100,7 @@ | |||
<fo:block color="black">16.6.2006</fo:block> | |||
</fo:table-cell> | |||
<fo:table-cell border-bottom-style="solid" border-bottom-width="0.5mm" padding-left="2mm" padding-top="4mm" font-size="10pt"> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="0.5cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-body> |
@@ -31,8 +31,6 @@ | |||
odd-or-even="even" /> | |||
<fo:conditional-page-master-reference master-reference="right" | |||
odd-or-even="odd" /> | |||
<!-- recommended fallback procedure --> | |||
<fo:conditional-page-master-reference master-reference="rest" /> | |||
</fo:repeatable-page-master-alternatives> | |||
</fo:page-sequence-master> | |||
</fo:layout-master-set> |
@@ -67,9 +67,9 @@ | |||
<fo:block space-before="12pt" space-after="6pt">The next table has width=100% on the table no column widths specified on the table-column element.</fo:block> | |||
<!-- table start --> | |||
<fo:table border-collapse="separate" table-layout="fixed" width="100%"> | |||
<fo:table-column background-color="yellow"/> | |||
<fo:table-column background-color="blue"/> | |||
<fo:table-column background-color="green"/> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="yellow"/> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="blue"/> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="green"/> | |||
<fo:table-body> | |||
<fo:table-row> | |||
<fo:table-cell display-align="before"><fo:block>Some text to make this cell | |||
@@ -83,7 +83,7 @@ | |||
<fo:block space-before="12pt" space-after="6pt">The next table has fixed column widths=13cm, ipd.optimum=12cm and ipd.max = 100%.</fo:block> | |||
<!-- table start --> | |||
<fo:table border-collapse="separate" | |||
table-layout="fixed" | |||
table-layout="fixed" width="100%" | |||
inline-progression-dimension="12cm" | |||
inline-progression-dimension.maximum="100%" | |||
> | |||
@@ -122,8 +122,8 @@ | |||
<!-- table start --> | |||
<fo:table border-collapse="separate" table-layout="fixed" width="70% + 1cm"> | |||
<fo:table-column column-width="from-parent('width') div 3" background-color="yellow"/> | |||
<fo:table-column background-color="blue"/> | |||
<fo:table-column background-color="green"/> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="blue"/> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="green"/> | |||
<fo:table-body> | |||
<fo:table-row> | |||
<fo:table-cell display-align="before"><fo:block>Some text to make this cell | |||
@@ -140,11 +140,11 @@ | |||
</fo:block> | |||
<!-- table start --> | |||
<fo:table border-collapse="separate" | |||
table-layout="fixed" | |||
table-layout="fixed" width="100%" | |||
inline-progression-dimension="15cm"> | |||
<fo:table-column background-color="yellow"/> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="yellow"/> | |||
<fo:table-column column-width="3cm" background-color="blue"/> | |||
<fo:table-column background-color="green"/> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="green"/> | |||
<fo:table-body> | |||
<fo:table-row> | |||
<fo:table-cell display-align="before"><fo:block>Some text to make this cell | |||
@@ -159,10 +159,10 @@ | |||
The next table specifies neither width nor inline-progression-dimension. | |||
</fo:block> | |||
<!-- table start --> | |||
<fo:table table-layout="fixed" border-collapse="separate"> | |||
<fo:table-column background-color="yellow"/> | |||
<fo:table table-layout="fixed" width="100%" border-collapse="separate"> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="yellow"/> | |||
<fo:table-column column-width="3cm" background-color="blue"/> | |||
<fo:table-column background-color="green"/> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="green"/> | |||
<fo:table-body> | |||
<fo:table-row> | |||
<fo:table-cell display-align="before"><fo:block>Some text to make this cell | |||
@@ -178,11 +178,11 @@ | |||
specifies a column width of 5cm on the middle column only. | |||
</fo:block> | |||
<!-- table start --> | |||
<fo:table table-layout="fixed" border-collapse="separate" | |||
<fo:table table-layout="fixed" width="100%" border-collapse="separate" | |||
inline-progression-dimension.minimum="10cm"> | |||
<fo:table-column background-color="yellow"/> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="yellow"/> | |||
<fo:table-column column-width="5cm" background-color="blue"/> | |||
<fo:table-column background-color="green"/> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="green"/> | |||
<fo:table-body> | |||
<fo:table-row> | |||
<fo:table-cell display-align="before"><fo:block>Some text to make this cell | |||
@@ -194,17 +194,17 @@ | |||
</fo:table> | |||
<fo:block space-before="12pt" space-after="6pt"> | |||
The next table specifies inline-progression-dimension.minimum="10cm", | |||
inline-progression-dimension.maximum="17cm and | |||
The next table specifies inline-progression-dimension.minimum="10cm", | |||
inline-progression-dimension.maximum="17cm and | |||
specifies a column width of 5cm on the middle column only. | |||
</fo:block> | |||
<!-- table start --> | |||
<fo:table table-layout="fixed" border-collapse="separate" | |||
<fo:table table-layout="fixed" width="100%" border-collapse="separate" | |||
inline-progression-dimension.minimum="10cm" | |||
inline-progression-dimension.maximum="17cm"> | |||
<fo:table-column background-color="yellow"/> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="yellow"/> | |||
<fo:table-column column-width="5cm" background-color="blue"/> | |||
<fo:table-column background-color="green"/> | |||
<fo:table-column column-width="proportional-column-width(1)" background-color="green"/> | |||
<fo:table-body> | |||
<fo:table-row> | |||
<fo:table-cell display-align="before"><fo:block>Some text to make this cell |
@@ -127,6 +127,7 @@ | |||
</target> | |||
<!-- =================================================================== --> | |||
<!-- Compares new test pdf files to reference pdf files --> | |||
<!-- N.B. All comparisons fail due to differences in /CreationDate --> | |||
<!-- =================================================================== --> | |||
<target name="comparePDF" depends="newPDF"> | |||
<compare referenceDirectory="${referenceDir}" testDirectory="${testDir}" filenames="normal.pdf,table.pdf,list.pdf,link.pdf,border.pdf,images.pdf,extensive.pdf,readme.pdf,fonts.pdf,bordershorthand.pdf,character.pdf,corresprop.pdf,hyphen.pdf,inhprop.pdf,instream.pdf,leader.pdf,newlinktest.pdf,normalex.pdf,pdfoutline.pdf,simple.pdf,textdeko.pdf,tableunits.pdf"/> | |||
@@ -144,6 +145,7 @@ | |||
<!-- =================================================================== --> | |||
<!-- Starts the test --> | |||
<!-- N.B. All tests fail due to differences in /CreationDate --> | |||
<!-- =================================================================== --> | |||
<target name="runtest" depends="comparePDF"> | |||
<echo message="Running Fop tests"/> | |||
@@ -154,6 +156,9 @@ | |||
<target name="clean" depends="init"> | |||
<delete dir="${testDir}"/> | |||
</target> | |||
<target name="cleantest" depends="init"> | |||
<delete dir="${referenceDir}"/> | |||
</target> | |||
</project> | |||
<!-- End of file --> |
@@ -794,7 +794,7 @@ XML Syntax | |||
<fo:block> | |||
Here we have some examples of how the XML can be specified in the fo document. | |||
<fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="350pt"/> | |||
<fo:table-column column-width="150pt"/> | |||
<fo:table-body> | |||
@@ -932,7 +932,7 @@ Sizing | |||
The size of the instream-foreign-object is obtained in a number of ways. | |||
<fo:block> | |||
<fo:table xmlns:svg="http://www.w3.org/2000/svg"> | |||
<fo:table xmlns:svg="http://www.w3.org/2000/svg" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="350pt"/> | |||
<fo:table-column column-width="150pt"/> | |||
<fo:table-body> |
@@ -30,7 +30,7 @@ | |||
Table 1: cell background | |||
</fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -72,7 +72,7 @@ | |||
Table 1: row background | |||
</fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -152,7 +152,7 @@ | |||
Table 1: column background | |||
</fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm" background-color="green"/> | |||
<fo:table-column column-width="3cm" background-color="red"/> | |||
<fo:table-column column-width="3cm" background-color="blue"/> | |||
@@ -219,7 +219,7 @@ | |||
Table 1: column backgrounds over page | |||
</fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm" background-color="green"/> | |||
<fo:table-column column-width="3cm" background-color="red"/> | |||
<fo:table-column column-width="3cm" background-color="blue"/> | |||
@@ -286,7 +286,7 @@ | |||
Table 1: body background | |||
</fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -323,7 +323,7 @@ | |||
</fo:table-body> | |||
</fo:table> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -360,7 +360,7 @@ | |||
</fo:table-body> | |||
</fo:table> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -397,7 +397,7 @@ | |||
</fo:table-body> | |||
</fo:table> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -438,7 +438,7 @@ | |||
Table 1: table background | |||
</fo:block> | |||
<fo:table background-color="green"> | |||
<fo:table background-color="green" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -475,7 +475,7 @@ | |||
</fo:table-body> | |||
</fo:table> | |||
<fo:table background-color="red"> | |||
<fo:table background-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -516,7 +516,7 @@ | |||
Table 1: combinations | |||
</fo:block> | |||
<fo:table background-color="green"> | |||
<fo:table background-color="green" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2.5cm"/> | |||
<fo:table-column column-width="2.5cm" background-color="green"/> | |||
<fo:table-column column-width="2.5cm" background-color="red"/> |
@@ -30,7 +30,7 @@ | |||
Table 1: cell borders | |||
</fo:block> | |||
<fo:table border-collapse="separate"> | |||
<fo:table border-collapse="separate" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -186,7 +186,7 @@ | |||
Table 2: row borders | |||
</fo:block> | |||
<fo:table border-collapse="collapse"> | |||
<fo:table border-collapse="collapse" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -310,7 +310,7 @@ | |||
Table 3: column borders | |||
</fo:block> | |||
<fo:table border-collapse="collapse"> | |||
<fo:table border-collapse="collapse" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm" border-left-color="green" border-left-width="0.5pt" border-left-style="solid"/> | |||
<fo:table-column column-width="3cm" border-top-color="red" border-top-width="0.5pt" border-top-style="solid"/> | |||
<fo:table-column column-width="3cm" border-right-color="blue" border-right-width="0.5pt" border-right-style="solid"/> | |||
@@ -377,7 +377,7 @@ | |||
Table 4: column borders over page | |||
</fo:block> | |||
<fo:table border-collapse="collapse"> | |||
<fo:table border-collapse="collapse" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm" border-left-color="green" border-left-width="0.5pt" border-left-style="solid"/> | |||
<fo:table-column column-width="3cm" border-top-color="red" border-top-width="0.5pt" border-top-style="solid"/> | |||
<fo:table-column column-width="3cm" border-right-color="blue" border-right-width="0.5pt" border-right-style="solid"/> | |||
@@ -444,7 +444,7 @@ | |||
Table 5: body borders | |||
</fo:block> | |||
<fo:table border-collapse="separate"> | |||
<fo:table border-collapse="separate" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -480,7 +480,7 @@ | |||
</fo:table-body> | |||
</fo:table> | |||
<fo:table border-collapse="separate"> | |||
<fo:table border-collapse="separate" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -516,7 +516,7 @@ | |||
</fo:table-body> | |||
</fo:table> | |||
<fo:table border-collapse="separate"> | |||
<fo:table border-collapse="separate" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -552,7 +552,7 @@ | |||
</fo:table-body> | |||
</fo:table> | |||
<fo:table border-collapse="separate"> | |||
<fo:table border-collapse="separate" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -588,7 +588,7 @@ | |||
</fo:table-body> | |||
</fo:table> | |||
<fo:table border-collapse="separate"> | |||
<fo:table border-collapse="separate" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -628,8 +628,7 @@ | |||
Table 6: table borders | |||
</fo:block> | |||
<fo:table border-left-color="green" border-left-width="0.5pt" border-left-style="solid" | |||
border-collapse="separate"> | |||
<fo:table border-left-color="green" border-left-width="0.5pt" border-left-style="solid" border-collapse="separate" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -665,7 +664,7 @@ | |||
</fo:table-body> | |||
</fo:table> | |||
<fo:table border-top-color="red" border-top-width="0.5pt" border-top-style="solid" border-collapse="separate"> | |||
<fo:table border-top-color="red" border-top-width="0.5pt" border-top-style="solid" border-collapse="separate" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -701,7 +700,7 @@ | |||
</fo:table-body> | |||
</fo:table> | |||
<fo:table border-right-color="blue" border-right-width="0.5pt" border-right-style="solid" border-collapse="separate"> | |||
<fo:table border-right-color="blue" border-right-width="0.5pt" border-right-style="solid" border-collapse="separate" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -737,7 +736,7 @@ | |||
</fo:table-body> | |||
</fo:table> | |||
<fo:table border-bottom-color="yellow" border-bottom-width="0.5pt" border-bottom-style="solid" border-collapse="separate"> | |||
<fo:table border-bottom-color="yellow" border-bottom-width="0.5pt" border-bottom-style="solid" border-collapse="separate" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -773,7 +772,7 @@ | |||
</fo:table-body> | |||
</fo:table> | |||
<fo:table border-color="orange" border-width="0.5pt" border-style="solid" border-collapse="separate"> | |||
<fo:table border-color="orange" border-width="0.5pt" border-style="solid" border-collapse="separate" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -813,7 +812,7 @@ | |||
Table 7: combinations | |||
</fo:block> | |||
<fo:table border-left-color="green" border-left-width="0.5pt" border-left-style="solid" border-collapse="collapse"> | |||
<fo:table border-left-color="green" border-left-width="0.5pt" border-left-style="solid" border-collapse="collapse" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2.5cm"/> | |||
<fo:table-column column-width="2.5cm" border-left-color="green" border-left-width="0.5pt" border-left-style="solid"/> | |||
<fo:table-column column-width="2.5cm" border-top-color="red" border-top-width="0.5pt" border-top-style="solid"/> | |||
@@ -1025,7 +1024,7 @@ | |||
implementation status. | |||
</fo:block> | |||
<fo:table border-collapse="collapse" table-layout="fixed"> | |||
<fo:table border-collapse="collapse" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm" border-color="blue" border-width="0.5pt" border-style="solid"/> | |||
<fo:table-column column-width="3cm" border-color="blue" border-width="0.5pt" border-style="solid"/> | |||
<fo:table-column column-width="3cm" border-color="blue" border-width="0.5pt" border-style="solid"/> | |||
@@ -1090,7 +1089,7 @@ | |||
fo:table-cell level. | |||
</fo:block> | |||
<fo:table border-collapse="collapse" table-layout="fixed"> | |||
<fo:table border-collapse="collapse" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -1159,7 +1158,7 @@ | |||
Check the FOP compliance page for current implementation status. | |||
</fo:block> | |||
<fo:table border-collapse="collapse" table-layout="fixed" | |||
<fo:table border-collapse="collapse" table-layout="fixed" width="100%" | |||
border-style="solid" border-width="5pt" border-color="yellow"> | |||
<fo:table-column column-width="3cm" | |||
border-style="solid" border-width="3pt" border-color="black"/> | |||
@@ -1264,7 +1263,7 @@ | |||
the border properties differ only on color. | |||
</fo:block> | |||
<fo:table border-collapse="collapse" table-layout="fixed"> | |||
<fo:table border-collapse="collapse" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm" | |||
border-style="solid" border-width="3pt" border-color="black"/> |
@@ -34,7 +34,7 @@ | |||
Table 1: basic break after with next | |||
</fo:block> | |||
<fo:table border-width="0.5pt" border-color="red"> | |||
<fo:table border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -81,7 +81,7 @@ | |||
Table 2: basic break before with next | |||
</fo:block> | |||
<fo:table border-width="0.5pt" border-color="red"> | |||
<fo:table border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -128,7 +128,7 @@ | |||
Table 3: basic break before a keep with next | |||
</fo:block> | |||
<fo:table border-width="0.5pt" border-color="red"> | |||
<fo:table border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -175,7 +175,7 @@ | |||
Table 4: basic break after a keep with previous | |||
</fo:block> | |||
<fo:table border-width="0.5pt" border-color="red"> | |||
<fo:table border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -222,7 +222,7 @@ | |||
Table 5: basic break after a keep with previous | |||
</fo:block> | |||
<fo:table border-width="0.5pt" border-color="red"> | |||
<fo:table border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> |
@@ -30,7 +30,7 @@ | |||
Table 1: with header | |||
</fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
@@ -311,7 +311,7 @@ | |||
Table 2: with footer | |||
</fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
@@ -592,7 +592,7 @@ | |||
Table 3: with header and footer and keeps | |||
</fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
@@ -888,7 +888,7 @@ | |||
Table 4: cells spanning columns | |||
</fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
@@ -940,7 +940,7 @@ | |||
Table 5: cells spanning rows | |||
</fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="48pt"/> | |||
<fo:table-column column-width="48pt"/> | |||
<fo:table-column column-width="48pt"/> | |||
@@ -1054,7 +1054,7 @@ | |||
Table 6: table with header and multiple body's | |||
</fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
@@ -1242,7 +1242,7 @@ | |||
Table 6: table with footer and multiple body's | |||
</fo:block> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> |
@@ -34,7 +34,7 @@ | |||
Table 1: basic keep with next | |||
</fo:block> | |||
<fo:table border-width="0.5pt" border-color="red"> | |||
<fo:table border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -81,7 +81,7 @@ | |||
Table 1: basic keep with previous | |||
</fo:block> | |||
<fo:table border-width="0.5pt" border-color="red"> | |||
<fo:table border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -128,7 +128,7 @@ | |||
Table 1: basic keep with next and keep with previous | |||
</fo:block> | |||
<fo:table border-width="0.5pt" border-color="red"> | |||
<fo:table border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -192,7 +192,7 @@ | |||
Table 1: basic multiple keep with next after normal row | |||
</fo:block> | |||
<fo:table border-width="0.5pt" border-color="red"> | |||
<fo:table border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -324,7 +324,7 @@ | |||
Table 1: basic multiple keep (next and previous) after normal row | |||
</fo:block> | |||
<fo:table border-width="0.5pt" border-color="red"> | |||
<fo:table border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="6cm"/> | |||
@@ -456,7 +456,7 @@ | |||
Table 1: basic multiple keep with next after normal row with normal row in middle | |||
</fo:block> | |||
<fo:table border-width="0.5pt" border-color="red"> | |||
<fo:table border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="6cm"/> |
@@ -30,7 +30,7 @@ | |||
Table 1: with header | |||
</fo:block> | |||
<fo:table table-omit-header-at-break="true"> | |||
<fo:table table-omit-header-at-break="true" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
@@ -311,7 +311,7 @@ | |||
Table 2: with footer | |||
</fo:block> | |||
<fo:table table-omit-footer-at-break="true"> | |||
<fo:table table-omit-footer-at-break="true" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
@@ -592,7 +592,7 @@ | |||
Table 3: with header and footer and keeps | |||
</fo:block> | |||
<fo:table table-omit-header-at-break="true" table-omit-footer-at-break="true"> | |||
<fo:table table-omit-header-at-break="true" table-omit-footer-at-break="true" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
@@ -888,7 +888,7 @@ | |||
Table 6: table with multiple body's | |||
</fo:block> | |||
<fo:table table-omit-header-at-break="true"> | |||
<fo:table table-omit-header-at-break="true" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
@@ -1076,7 +1076,7 @@ | |||
Table 6: table with multiple body's | |||
</fo:block> | |||
<fo:table table-omit-footer-at-break="true"> | |||
<fo:table table-omit-footer-at-break="true" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> | |||
<fo:table-column column-width="2cm"/> |
@@ -30,7 +30,7 @@ | |||
Table 1: spaces around cells | |||
</fo:block> | |||
<fo:table border-style="solid" border-width="0.5pt" border-color="red"> | |||
<fo:table border-style="solid" border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -109,7 +109,7 @@ | |||
Table 2: spaces around rows | |||
</fo:block> | |||
<fo:table border-style="solid" border-width="0.5pt" border-color="red"> | |||
<fo:table border-style="solid" border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -190,7 +190,7 @@ | |||
Table 3: spaces around body | |||
</fo:block> | |||
<fo:table border-style="solid" border-width="0.5pt" border-color="red"> | |||
<fo:table border-style="solid" border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -281,7 +281,7 @@ | |||
</fo:block> | |||
<fo:block border-style="solid" border-width="0.5pt"> | |||
<fo:table space-before.optimum="5pt" border-style="solid" border-width="0.5pt" border-color="red"> | |||
<fo:table space-before.optimum="5pt" border-style="solid" border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -309,7 +309,7 @@ | |||
</fo:block> | |||
<fo:block border-style="solid" border-width="0.5pt"> | |||
<fo:table padding-left="5pt" border-style="solid" border-width="0.5pt" border-color="red"> | |||
<fo:table padding-left="5pt" border-style="solid" border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -337,7 +337,7 @@ | |||
</fo:block> | |||
<fo:block border-style="solid" border-width="0.5pt"> | |||
<fo:table padding-right="5pt" border-style="solid" border-width="0.5pt" border-color="red"> | |||
<fo:table padding-right="5pt" border-style="solid" border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -365,7 +365,7 @@ | |||
</fo:block> | |||
<fo:block border-style="solid" border-width="0.5pt"> | |||
<fo:table space-after.optimum="5pt" border-style="solid" border-width="0.5pt" border-color="red"> | |||
<fo:table space-after.optimum="5pt" border-style="solid" border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -397,7 +397,7 @@ | |||
</fo:block> | |||
<fo:block border-style="solid" border-width="0.5pt"> | |||
<fo:table space-after.optimum="20pt" border-style="solid" border-width="0.5pt" border-color="red"> | |||
<fo:table space-after.optimum="20pt" border-style="solid" border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
@@ -462,7 +462,7 @@ | |||
</fo:block> | |||
<fo:block border-style="solid" border-width="0.5pt"> | |||
<fo:table space-after.optimum="5pt" border-style="solid" border-width="0.5pt" border-color="red"> | |||
<fo:table space-after.optimum="5pt" border-style="solid" border-width="0.5pt" border-color="red" table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> | |||
<fo:table-column column-width="3cm"/> |
@@ -1,5 +1,14 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<FindBugsFilter> | |||
<Match> | |||
<Class name="org.apache.fop.fonts.truetype.TTFFile$1"/> | |||
<Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON"/> | |||
</Match> | |||
<Match> | |||
<Class name="org.apache.fop.fonts.truetype.FontFileReader"/> | |||
<Method name="getAllBytes"/> | |||
<Bug pattern="EI_EXPOSE_REP"/> | |||
</Match> | |||
<Match> | |||
<Class name="org.apache.fop.fo.properties.FontFamilyProperty"/> | |||
<Bug pattern="EQ_DOESNT_OVERRIDE_EQUALS"/> | |||
@@ -949,11 +958,6 @@ | |||
<Method name="getInputStreamOnFont"/> | |||
<Bug pattern="RV_EXCEPTION_NOT_THROWN"/> | |||
</Match> | |||
<Match> | |||
<Class name="org.apache.fop.hyphenation.HyphenationTreeCache"/> | |||
<Method name="constructUserKey"/> | |||
<Bug pattern="RV_RETURN_VALUE_IGNORED"/> | |||
</Match> | |||
<Match> | |||
<Class name="org.apache.fop.afp.AFPResourceLevel"/> | |||
<Method name="equals"/> | |||
@@ -5162,4 +5166,41 @@ | |||
<Method name="getNonEmptyLevels"/> | |||
<Bug pattern="PZLA_PREFER_ZERO_LENGTH_ARRAYS"/> | |||
</Match> | |||
<Match> | |||
<Class name="org.apache.fop.render.pdf.AbstractImageAdapter"/> | |||
<Method name="populateXObjectDictionaryForIndexColorModel"/> | |||
<Bug pattern="OS_OPEN_STREAM"/> | |||
</Match> | |||
<Match> | |||
<Class name="org.apache.fop.render.pdf.ImageRawPNGAdapter"/> | |||
<Or> | |||
<Method name="outputContents"/> | |||
<Method name="setup"/> | |||
</Or> | |||
<Or> | |||
<Bug pattern="OS_OPEN_STREAM"/> | |||
<Bug pattern="OS_OPEN_STREAM_EXCEPTION_PATH"/> | |||
</Or> | |||
</Match> | |||
<Match> | |||
<Class name="org.apache.fop.render.ps.ImageEncoderPNG"/> | |||
<Method name="writeTo"/> | |||
<Bug pattern="OS_OPEN_STREAM"/> | |||
</Match> | |||
<Match> | |||
<Or> | |||
<Class name="org.apache.fop.render.pdf.PDFImageHandlerRawPNG"/> | |||
<Class name="org.apache.fop.render.ps.PSImageHandlerRawPNG"/> | |||
</Or> | |||
<Method name="getSupportedImageFlavors"/> | |||
<Bug pattern="EI_EXPOSE_REP"/> | |||
</Match> | |||
<Match> | |||
<Class name="org.apache.fop.render.ps.PSImageHandlerRawPNG"/> | |||
<Or> | |||
<Method name="handleImage"/> | |||
<Method name="generateForm"/> | |||
</Or> | |||
<Bug pattern="BC_UNCONFIRMED_CAST"/> | |||
</Match> | |||
</FindBugsFilter> |
@@ -39,7 +39,7 @@ | |||
<tr> | |||
<td>default font characters</td> | |||
<td><link href="fo/fonts.fo">fonts.fo</link></td> | |||
<td><link href="fo/fonts.fo.pdf">fonts.fo.pdf</link></td> | |||
<td><link href="fo/fonts.pdf">fonts.pdf</link></td> | |||
</tr> | |||
</table> | |||
<p>Other basic examples on the use of XSL-FO can be found in the FOP distribution in | |||
@@ -100,17 +100,17 @@ Embedding images in FO: | |||
<tr> | |||
<td>align in larger viewport</td> | |||
<td><link href="fo/align.fo">align.fo</link></td> | |||
<td><link href="fo/align.fo.pdf">align.fo.pdf</link></td> | |||
<td><link href="fo/align.pdf">align.pdf</link></td> | |||
</tr> | |||
<tr> | |||
<td>align in smaller viewport</td> | |||
<td><link href="fo/align2.fo">align2.fo</link></td> | |||
<td><link href="fo/align2.fo.pdf">align2.fo.pdf</link></td> | |||
<td><link href="fo/align2.pdf">align2.pdf</link></td> | |||
</tr> | |||
<tr> | |||
<td>scaling image</td> | |||
<td><link href="fo/size.fo">size.fo</link></td> | |||
<td><link href="fo/size.fo.pdf">size.fo.pdf</link></td> | |||
<td><link href="fo/size.pdf">size.pdf</link></td> | |||
</tr> | |||
</table> | |||
<p>Look also into the directory examples/fo/svg. There you find some very extensive SVG examples. | |||
@@ -132,7 +132,7 @@ Instream Foreign Object images in FO, there are more on the | |||
<tr> | |||
<td>embedding svg in viewport</td> | |||
<td><link href="fo/embed.fo">embed.fo</link></td> | |||
<td><link href="fo/embed.fo.pdf">embed.fo.pdf</link></td> | |||
<td><link href="fo/embed.pdf">embed.pdf</link></td> | |||
</tr> | |||
</table> | |||
</section> |
@@ -19,19 +19,18 @@ | |||
<fo:root font-family="Times Roman" font-size="12pt" text-align="center" xmlns:fo="http://www.w3.org/1999/XSL/Format"> | |||
<fo:layout-master-set> | |||
<fo:simple-page-master | |||
margin-right="1.5cm" | |||
margin-left="1.5cm" | |||
margin-bottom="2cm" | |||
margin-top="1cm" | |||
page-width="21cm" | |||
page-height="29.7cm" | |||
master-name="left"> | |||
<fo:region-before extent="1cm"/> | |||
<fo:region-body margin-top="1cm"/> | |||
<fo:region-after extent="1.5cm"/> | |||
</fo:simple-page-master> | |||
<fo:simple-page-master | |||
margin-right="1.5cm" | |||
margin-left="1.5cm" | |||
margin-bottom="2cm" | |||
margin-top="1cm" | |||
page-width="21cm" | |||
page-height="29.7cm" | |||
master-name="left"> | |||
<fo:region-body margin-top="1cm"/> | |||
<fo:region-before extent="1cm"/> | |||
<fo:region-after extent="1.5cm"/> | |||
</fo:simple-page-master> | |||
</fo:layout-master-set> | |||
<fo:page-sequence id="N2528" master-reference="left"> |
@@ -19,19 +19,18 @@ | |||
<fo:root font-family="Times Roman" font-size="12pt" text-align="center" xmlns:fo="http://www.w3.org/1999/XSL/Format"> | |||
<fo:layout-master-set> | |||
<fo:simple-page-master | |||
margin-right="1.5cm" | |||
margin-left="1.5cm" | |||
margin-bottom="2cm" | |||
margin-top="1cm" | |||
page-width="21cm" | |||
page-height="29.7cm" | |||
master-name="left"> | |||
<fo:region-before extent="1cm"/> | |||
<fo:region-body margin-top="1cm"/> | |||
<fo:region-after extent="1.5cm"/> | |||
</fo:simple-page-master> | |||
<fo:simple-page-master | |||
margin-right="1.5cm" | |||
margin-left="1.5cm" | |||
margin-bottom="2cm" | |||
margin-top="1cm" | |||
page-width="21cm" | |||
page-height="29.7cm" | |||
master-name="left"> | |||
<fo:region-body margin-top="1cm"/> | |||
<fo:region-before extent="1cm"/> | |||
<fo:region-after extent="1.5cm"/> | |||
</fo:simple-page-master> | |||
</fo:layout-master-set> | |||
<fo:page-sequence id="N2528" master-reference="left"> | |||
@@ -59,7 +58,7 @@ Default align: | |||
<fo:block> | |||
Default align: | |||
(<fo:external-graphic width="50pt" height="50pt" overflow="hidden" src="images/fop.jpg"/>), start-before | |||
(<fo:external-graphic width="50pt" height="50pt" overflow="hidden" text-align="start" display-align="start" src="images/fop.jpg"/>), start-center | |||
(<fo:external-graphic width="50pt" height="50pt" overflow="hidden" text-align="start" display-align="before" src="images/fop.jpg"/>), start-center | |||
(<fo:external-graphic width="50pt" height="50pt" overflow="hidden" text-align="start" display-align="center" src="images/fop.jpg"/>), start-after | |||
(<fo:external-graphic width="50pt" height="50pt" overflow="hidden" text-align="start" display-align="after" src="images/fop.jpg"/>), center-before | |||
(<fo:external-graphic width="50pt" height="50pt" overflow="hidden" text-align="center" display-align="before" src="images/fop.jpg"/>), center-after |
@@ -0,0 +1,70 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<!-- =========================================================================== --> | |||
<project default="newPDF" basedir="."> | |||
<!-- =================================================================== --> | |||
<!-- Initialization target --> | |||
<!-- =================================================================== --> | |||
<target name="init"> | |||
<tstamp/> | |||
<mkdir dir="tests"/> | |||
<property name="testDir" value="tests"/> | |||
<property name="foDir" value="."/> | |||
<path id="run-classpath"> | |||
<fileset dir="../../../../../lib"> | |||
<include name="*.jar"/> | |||
</fileset> | |||
<pathelement location="../../../../../build/fop.jar"/> | |||
</path> | |||
<taskdef name="fop" classname="org.apache.fop.tools.anttasks.Fop" classpathref="run-classpath"/> | |||
</target> | |||
<!-- =================================================================== --> | |||
<!-- Help on usage --> | |||
<!-- =================================================================== --> | |||
<target name="usage"> | |||
<echo message="Use '-projecthelp' instead"/> | |||
</target> | |||
<!-- =================================================================== --> | |||
<!-- Produces new test files (function) --> | |||
<!-- =================================================================== --> | |||
<target name="newTestFiles"> | |||
<fop format="${mimetype}" outdir="${outDir}" messagelevel="${msglevel}" relativebase="true" throwexceptions="false"> | |||
<fileset dir="."> | |||
<include name="**/*.fo"/> | |||
</fileset> | |||
</fop> | |||
</target> | |||
<!-- =================================================================== --> | |||
<!-- Produces new test PDF files --> | |||
<!-- =================================================================== --> | |||
<target name="newPDF" depends="init" description="Creates a new set of PDF test files"> | |||
<antcall target="newTestFiles"> | |||
<param name="mimetype" value="application/pdf"/> | |||
<param name="msglevel" value="warn"/> | |||
<param name="outDir" value="${testDir}"/> | |||
</antcall> | |||
</target> | |||
<!-- =================================================================== --> | |||
<!-- Clean targets --> | |||
<!-- =================================================================== --> | |||
<target name="clean" depends="init"> | |||
<delete dir="${testDir}"/> | |||
</target> | |||
</project> | |||
<!-- End of file --> |
@@ -23,19 +23,18 @@ | |||
<fo:root font-family="Times Roman" font-size="12pt" xmlns:fo="http://www.w3.org/1999/XSL/Format"> | |||
<fo:layout-master-set> | |||
<fo:simple-page-master | |||
margin-right="1.5cm" | |||
margin-left="1.5cm" | |||
margin-bottom="2cm" | |||
margin-top="1cm" | |||
page-width="21cm" | |||
page-height="29.7cm" | |||
master-name="left"> | |||
<fo:region-before extent="1cm"/> | |||
<fo:region-body margin-top="1cm"/> | |||
<fo:region-after extent="1.5cm"/> | |||
</fo:simple-page-master> | |||
<fo:simple-page-master | |||
margin-right="1.5cm" | |||
margin-left="1.5cm" | |||
margin-bottom="2cm" | |||
margin-top="1cm" | |||
page-width="21cm" | |||
page-height="29.7cm" | |||
master-name="left"> | |||
<fo:region-body margin-top="1cm"/> | |||
<fo:region-before extent="1cm"/> | |||
<fo:region-after extent="1.5cm"/> | |||
</fo:simple-page-master> | |||
</fo:layout-master-set> | |||
<fo:page-sequence id="N2528" master-reference="left"> |
@@ -1,87 +0,0 @@ | |||
%PDF-1.3 | |||
%ª«¬ | |||
4 0 obj | |||
<< /Type /Info | |||
/Producer (FOP 0.20.5) >> | |||
endobj | |||
5 0 obj | |||
<< /Length 1556 /Filter [ /ASCII85Decode /FlateDecode ] | |||
>> | |||
stream | |||
Gb"0W9p=9h(^KQB5D>011Kd^2(:&!s-8.0G?92NC6am<+$Zp"a8L^3ZrE?Z%8B:u_OFn)DOGr-/INIQ=q\oZh2p:3YpSJW^j5k;[E4:*BGe#CoakN"mYH!sFZ8>$).@Y@g/-!,+\,3geIX]sgn&ks8h-P:I5CJ>(?M<peVjI(+?b[S@pZ8%/ns@)HU2Lio<0CtCPX[Q)8_(<FftM:sit[&L*Ob:OKat[.EkI%ON)unFn92KJrG.J!cH<PB*A9Y6q24X,`S^&S[!UEIh+u"#V93'eZc#bITL93O^P^p,I3BHrmbEFVPF$aP[Jemg]0^JG[GBF4ZUN[?=KSW(*k#W!J+1'Bh;+g]["$p!rMJIh;uH?[:#+dG<U]5@$Jf'eIGN8iGJ0k>3srEp%+j`GFC2lVAW?-k]'A%*A+X0,Y&n>gXrgJRd8etuLIh.uop[SIXoW1(Me8(mZ+eI84[tkfD8Y2>AOP5_.60qf-b].hK50R#%EJ8&ck"-ed6),XDAZ4I/+.NABKpXVTecSBnJhE/-BIl,-QFP0P>7hC<B]QN&C.,Y8Gd*8%[k^9Hi4&$B)L$>kMsi)STHZs%$'J5nT--!YC%F5o`L74Wr:Be]r#sCZ+lgS/E:AD3,3jV\ej=Ch)Mm&T3L9Qof&akqNaE.ePBeD$+%h=PJ*s!3>n&C]igN#KOB]'j8H"aks*5=iHX3ZW>2HPS[b]*`)73_Q%NVce\!_DKr]/-Y/42K3d4X3_6^:.XnTm.M/Ws*C)U,oQ,$R7M5;IQWWpQNXEeNq$<R<Z?j3W^FmcIHJnJLtn"7q,lIV18P-__e<Fgr_6rPiH7SM(LJ5hU;;F)d'"fZPjPmA)PrUM!Qp%*M$jflJgibHB!cmc"N9.VAd;)(V]?<k_^!EQuC=90p["fud#Pn6%clf97o>-MaM&m21cZ'7XGeK>`6"O7>T<ko&E!@qO]XE0/^&3L?dC3.eQYbEX_<h1cDLEnJS=-O,Fo?4qC$r@,-5S^4!<M2Bs<$Qsaan'ESI[F:IQD.j]$*GaN/1&\A3Cq0H&Y'R;YM^/.JlhFK?K]UL7.;t8P=rd#Au7HmY>plj8g:-IOGkatB8+,OGQk;/'tf.M\ap^O]Zf]N/IY_K;_Cf\L-lRiL(u"ei;CH2-j*X=.qf*gTG=iZSQ6qr)cg<j)q4H%YZ.\Z,10D%M5;J,.L4)Jb&CAe^;<tH$=DaBI%@mQK]&)u;bP"C=,]);Y<#<---<LF5r/0+2(Jf:i@B;0YOE:@cJ;PgE8YMeBD+'tMJH7H>BtH@(6&KA0C:ed<NAL]hd<_.;BdP%K4MpV]JSDt]5SSS_HjZ5GBXA0<7Li@R\gm\NFJc%&ogoS@O[.ub!@ekBUfe=Y.td^!a":e>j%+t+a=UNaVEi.YkDdNJud0091bqd)C/fC``XJC$=&-4E!<D[FmcaPJcf8u<fEkZ?OjPcl:rlH2j2]h[<`2[_>YWO/1#n25qkWC<X.PM>_ic-+YL^(]=:7:C?abAqh?bqD4b-,1\n_j+*T5NVnRDAT6?<U@WcP17PIi#^4hB/rspg7gYM~> | |||
endstream | |||
endobj | |||
6 0 obj | |||
<< /Type /Page | |||
/Parent 1 0 R | |||
/MediaBox [ 0 0 595 842 ] | |||
/Resources 3 0 R | |||
/Contents 5 0 R | |||
>> | |||
endobj | |||
7 0 obj | |||
<< /Length 1817 /Filter [ /ASCII85Decode /FlateDecode ] | |||
>> | |||
stream | |||
Gb"0W:N+uG(^BKA5)#"'Yd"$U8imem#OF-PR"6:/*k]utN6sEG3%4Xj7nFsp;3J?+4m;Cb/S%)3?CFKB?VSYnqb?ePK?>&Z1uIXURQk@7VtS,NabaJ,Y-fH"AbkJUs)n(bDSLTWQi$]3.r%#RgR?#YrF>m&j5#._.Gt&lrOg7dfGe=DCLO9.JlJ#\Nu:_+'9XObCm7%pIqEiC#]3r(6ZXV,rHP^:2:!="7[p5gQd%aYoh4"?CMW%pVqf;,\4sMKf<>Y[[oqT?]$9s%n,K_VArek#gUbF!FjDL<f/M_nI7j[N(Sm.]Wjj^^X.[)1g9opE<O[0BX3jCRC#>/(H\Zt^D8g"tMc@0c>I<YL)PBJq<Yb-Gl^BiRqaf,5=oU6pl&g!lMKY/W;-W=o:>%?@\t`PT_@NNSUM//U^7dnFB>]k,gsGT'8p>p-/_"t]4N`X)^SA/n>4O8[WK$DZi:"X[8@`0iGF;K/oBJDZ9tRQ^T20MuX/In(9BX/odV^W3rKV8qhu&C&.Ui@aH`nog^">K.8!\<CbO;jA8pD*MA_f>SZl<4uYB;@Nk0tuRbZQ^4Zl`RW%CQc6l9V>:g\X^LPnhTI(tXiC5P1&O>dih=]W7P0+tFD=.[%`'UfWeAOpP4=dVor(_H")Q=5iGu?005^2='PfY.j8J=(&-[];:<l9bJ,&#hDj."`%!AYQ@k@$<R<Z?sPjq69;_j@GTJ+k>`7n,`KdDas8\bkm\B&A4"hR1fT1/:_fus<N*KP<MaYXc)UX7DLX_9k$aN$,J&\><CpXd;FK$3aTS\ZBtt'X!@qO]XFPH\YU\Vu)St.eR@`EV"d+89V$UU:P#AMhgD3`r/kZfjOs20H@)CZo%(HJMi"k+">B%2tDAdYA`K1Sda):WQ;.YHi:?tGNSg5X.4ecbW9V!N#'S<B)'s>DR\-c<hmODkpY$"i\dtAg/Ar1e%#oi@`P/N$La-;XJaci0JKto3`"g?i!]RnbCo.$QBCOt*6.:L?"KM>*j=-Y$X,X&#FPY<*N9aZGQn-WL<.sM6$CZe\5cE7=W(ZpJ.6/"Y,KQRN)PJi,BKk(lkffCYd>!XZP"g+F4['#tNb0soB]CI].`JJ$#/^9_Q\FLn"+mCRiUL`Z"CJkGNJlhFK?GS.:>s#6[Hb1&@?()XK^4M2BZ*,oS9LsJ(`@./D2(]8Ei@B;0YOE:@Y2*0Q]NkoZ/kuj+,'5q+XHLMT,b>rMPKCr*@3P+I?GS.:"g?j,mCZ'Ym@*'X=+=PH)to%WGsV)l\>r8sj/sOC"]p_r\of,GA;.+H's^0W[EIir]<[S6Z`l&V$F><sVH>)o:D+>(*`=mgV@L0aKjZEIKrqQo[_gV'gWGqjlRK%F1W!Bq+pYQ6,V^J,-0:n4_Uc(NCk]!q't1t[fXc61"a>,!D']\<G9=2?le#JE2Yh5Y,q?c(\&BGM>B?a8_H-VhA(.Qi,aB[Mh<MIJrU<u4p8@NPg4a!]HUU%C"C_!=2A_5k-70un,]&]=]dZ\`!H,[^\,ePH#2F!L4!5Am3d=S.rtet1DeYBZ)9"mCOX)8!]qp+@9YE#Q$:.bW$=0>UFG6l5f<tDUW7J+S>o.&e<C*#%OfU<09Lr])D44.H_C$c8=Wo;+Krg@NZE@KaJDf0nF]6C[:nh/r=d&F?+,c5>K),#!I2T6r<l$7f"fl$RmAr(?41i![XCmel?e:;s#lD"fc\IkNRhp:0Qc#fjKD<PeD8,\(cFYa5L\!.0])1S''m`&lNLkFP?K+K&a,A18gZeADJ+r!>R/Z're+oUP&g(8R_^!@;&u7($?83Z%nS$eZO5XGIU386~> | |||
endstream | |||
endobj | |||
8 0 obj | |||
<< /Type /Page | |||
/Parent 1 0 R | |||
/MediaBox [ 0 0 595 842 ] | |||
/Resources 3 0 R | |||
/Contents 7 0 R | |||
>> | |||
endobj | |||
9 0 obj | |||
<< /Type /Font | |||
/Subtype /Type1 | |||
/Name /F5 | |||
/BaseFont /Times-Roman | |||
/Encoding /WinAnsiEncoding >> | |||
endobj | |||
10 0 obj | |||
<< /Type /Font | |||
/Subtype /Type1 | |||
/Name /F7 | |||
/BaseFont /Times-Bold | |||
/Encoding /WinAnsiEncoding >> | |||
endobj | |||
1 0 obj | |||
<< /Type /Pages | |||
/Count 2 | |||
/Kids [6 0 R 8 0 R ] >> | |||
endobj | |||
2 0 obj | |||
<< /Type /Catalog | |||
/Pages 1 0 R | |||
>> | |||
endobj | |||
3 0 obj | |||
<< | |||
/Font << /F5 9 0 R /F7 10 0 R >> | |||
/ProcSet [ /PDF /ImageC /Text ] >> | |||
endobj | |||
xref | |||
0 11 | |||
0000000000 65535 f | |||
0000004058 00000 n | |||
0000004122 00000 n | |||
0000004172 00000 n | |||
0000000015 00000 n | |||
0000000071 00000 n | |||
0000001719 00000 n | |||
0000001825 00000 n | |||
0000003734 00000 n | |||
0000003840 00000 n | |||
0000003949 00000 n | |||
trailer | |||
<< | |||
/Size 11 | |||
/Root 2 0 R | |||
/Info 4 0 R | |||
>> | |||
startxref | |||
4261 | |||
%%EOF |
@@ -18,32 +18,32 @@ | |||
<!-- $Id$ --> | |||
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> | |||
<!-- defines the layout master --> | |||
<fo:layout-master-set> | |||
<fo:simple-page-master master-name="first" | |||
page-height="29.7cm" | |||
page-width="21cm" | |||
margin-top="1cm" | |||
margin-bottom="2cm" | |||
margin-left="2.5cm" | |||
margin-right="2.5cm"> | |||
<fo:region-body margin-top="1cm"/> | |||
<fo:region-before extent="1cm"/> | |||
<fo:region-after extent="1.5cm"/> | |||
</fo:simple-page-master> | |||
</fo:layout-master-set> | |||
<!-- starts actual layout --> | |||
<fo:page-sequence master-reference="first"> | |||
<!-- defines the layout master --> | |||
<fo:layout-master-set> | |||
<fo:simple-page-master | |||
master-name="first" | |||
page-height="29.7cm" | |||
page-width="21cm" | |||
margin-top="1cm" | |||
margin-bottom="2cm" | |||
margin-left="2.5cm" | |||
margin-right="2.5cm"> | |||
<fo:region-body margin-top="1cm"/> | |||
<fo:region-before extent="1cm"/> | |||
<fo:region-after extent="1.5cm"/> | |||
</fo:simple-page-master> | |||
</fo:layout-master-set> | |||
<!-- starts actual layout --> | |||
<fo:page-sequence master-reference="first"> | |||
<fo:flow flow-name="xsl-region-body"> | |||
<fo:block font-family="Helvetica" font-size="14pt"> | |||
<fo:block font-family="Helvetica" font-size="14pt"> | |||
Helvetica | |||
</fo:block> | |||
<fo:block space-after.optimum="10pt" font-family="Helvetica" font-size="10pt"> | |||
<fo:table> | |||
<fo:block space-after.optimum="10pt" font-family="Helvetica" font-size="10pt"> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="65pt"/> | |||
<fo:table-column column-width="30pt"/> | |||
<fo:table-column column-width="65pt"/> | |||
@@ -303,7 +303,7 @@ Helvetica | |||
Times Roman | |||
</fo:block> | |||
<fo:block space-after.optimum="10pt" font-family="Times Roman" font-size="10pt"> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="65pt"/> | |||
<fo:table-column column-width="30pt"/> | |||
<fo:table-column column-width="65pt"/> | |||
@@ -563,7 +563,7 @@ Times Roman | |||
Courier | |||
</fo:block> | |||
<fo:block space-after.optimum="10pt" font-family="Courier" font-size="10pt"> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="65pt"/> | |||
<fo:table-column column-width="30pt"/> | |||
<fo:table-column column-width="65pt"/> | |||
@@ -823,7 +823,7 @@ Courier | |||
ZapfDingbats: | |||
</fo:block> | |||
<fo:block space-after.optimum="10pt" font-family="ZapfDingbats" font-size="10pt"> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="65pt"/> | |||
<fo:table-column column-width="30pt"/> | |||
<fo:table-column column-width="65pt"/> | |||
@@ -1071,7 +1071,7 @@ Courier | |||
Symbol: | |||
</fo:block> | |||
<fo:block space-after.optimum="10pt" font-family="Symbol" font-size="10pt"> | |||
<fo:table> | |||
<fo:table table-layout="fixed" width="100%"> | |||
<fo:table-column column-width="65pt"/> | |||
<fo:table-column column-width="30pt"/> | |||
<fo:table-column column-width="65pt"/> |
@@ -1,160 +0,0 @@ | |||
%PDF-1.4 | |||
%ª«¬ | |||
4 0 obj | |||
<< /Type /Info | |||
/Producer (FOP 0.20.5) >> | |||
endobj | |||
5 0 obj | |||
<< /Length 2756 /Filter [ /ASCII85Decode /FlateDecode ] | |||
>> | |||
stream | |||
Gas2O=aO+:'LgpN.p>dQQ0),tXf?8Xl8sh^A"4[?L]L?S.Yp(`G)J$07;CF[q0Xk,m[_:;p.hg?\%DUPMj%;2G1eG?n*DpXrcNRk=kqghM^JC4(9q#F6<M1iQEg+@rM.>kF&rk?5<4+=n+NmTMjoY'X2c"#Z%_Ip=kXFJF_B#_[H@&U`<@2^l+]E+l1pZ!Cop\)PH?hg\+B/,61.dsGk/JYH2/>>gUQl'^O&$qIgP0_PeXi&QbNt"`g=GeR$XG9Q\Vt!J+koUIg+m`>Q4&kH259:cpnuO)YE2Y+(Xr3H2XcdDe8Lq]_jXK4.1I\07P#'<[L&Tb:eD$aQ1Beq%DbJ9R`Fs?_!J[FZFa!bf^reYKF[C8A"tK/EcFDnJ:3"S@aEl4-6r5g`7ZS"h?/HmND$@jL1SjK>\"VRr[p,&g'EraP7s/X*K!&QFTB@f-"GBg`c-Q5TXJ(OS?p@pG-s6q\pYrAaYZS2aQkBmZ@1P5]10$OS?4MDT]N!OS<rahNW)"+n(nG\QbDAD^"QiaC@7)(@p=74Hso*+n#NSI6%$;nihZ</a(tWhC"DsEpbO?rEYLhR60L.$HS4N*V01Na;^O/jSeAVgob2UOSAK8*bFc$pCBM1AF>QR%mfVpmZ@1(5i0Z=+n$M*gm)sTOS;O9DTfS;aSVkX2s&gXjSdfFgoS]0HcZ(s+CCCTpQ5,tON2D0*qK<@aA)011uohL?]\T5a@"t%,e`]/LWFs6H3#3#RK&`J6:;k]J"?4`6lo6U"8'`(*b'V<5R'PD*eJm*oKktfP5c!UKo.u\s'*nZ('VeYGGH$-$5!2@U_b]lOT+]?04Yb>rjPHPBG;Th5Cd(n-pReQP$[&p5QTX`^!KW,!k:mL_4pu6n0@1ONrg$24jj]\"Xnnn82#W1TE'Ef]c^4'!k;$P@AEo!56AMb;Ln[0+MCTLJG_VW]jO`kr;T*0iM6bTs-<3X8eLXo)sN'@,38b9klm=rjSpt!Kp<kCs*)m!/4IY['@86]7EGKNU_d9nOT25S(LDu\s$'(.^_@slJ!"&n.74%6-G:O#K`(j;H=<ZVq>ZfR!_j9tru^KZRPp8B"5E*hD.fR'["/K0$b`fV$_aI-UbGs8SLn%O6#@a#a[0o_fg7*%"'J;5H>gtB6;ebYA$XIN>IG*3g-?jGL#1XkKb2dh:@6Wubr&]2<GgsRDE[B@P19c2R4N#)Pccp+c=B4fTnKhI=6S6$?J$t3QI?$nQ7R-Vfg7Z6"+OpHKaotE#\nMOQhDO.a?jR@_ls@dC:4]3l7hQjLRKfJ\N1.Gd%TkY'Y?C7H_@&^G]aksTOH.^_Hn7;4j[L`IWZM$5^T1-em[2Um=dl/LLH7N(Wp/,L-<sk.#N-ap5"&=1tH*f,OL0d=U0G<P6L?-10KB\&SWm4b<#!J8:.%@el,qOQN1P>E7Rrp\;']Dq5gL.E"22g,$Icji>UDXV6lij_DSh>!bsmkKkk?TPgt*F$eNa3.'E6m(TsIF:h&ai0:\`L:h]0o0@Hn"Z4Lp>W@sd8]hih:W@sd8]hj%@W@sd8]hj7FW@sdX]b#qaW@sd8]hj[RW@sd8]hjk2YV.QpKu2VqI:6hCPii8;$VPi?82jp`=P=.Z\cM]FdU"?S%G2J_p-RGM^qR%_(P6i5p4]?V:qRaO0-'A5in]-5iFjkYmfr+d7sgqS2dfuPg'bm3!W0a]?7=Y>fGBSA6Les/^2UFqMK]0rKql=X]Gn+/>1sA']+Oq73^.'^_7L<VU,kIt5Q;eYLj`,@+0pUYh2$JV*?VS@i8'3;;&paaL#CdCI8M",ZA%5mLj`,@+0pUYh2$JV*?TG?MK^<=7<O"!(4p`Tp-j+Oa;0AO,PFQKI)m(TG9cfMFaV7GJp/I5Kr;U\]Gn+/Wr#5n&A/se0<4n<[Lg*@YV3$R7CEc?S$4QGqo-iInSZ4XW9tJT6L\m0^8UH9fg>1G_S2u:(YM.EDSj,dmMFPCn8?+WW9tJT6L\m0^8UH9fg>1G_S2u:(YM.EDSj,dmMFPCn8?+WW9tH`$cT^aqkCZ/A.-5c$2^I.?XsP\]*\A/\mJtU_7L$NU:O]B$c0F]qkCZ/A.-5c`mBo4#I^A5Ca+Cr9^pb<]k#;5Jp<9KV]=,\K%hH1QV?oF>.oUFR4.3oYOU=J]l;.A!d_rkDd4#rAeRJDA:dmcl;_LU&_LmC)Fn&gG-Zt_?=WM*\ZH,`RgAN:`o*FfYa%ocq2u'@V(:?D-3AV;"@l]oF>a`t9."o3XZ1W>U>VA3n>KP3n$7eC?S]I^<&gID"TFPjDJTL;fgP<_RGc(c=28Y#lCM+ZK'J/Y9q:VXI>B>?d%2Wg-54TuF^`?<7e_R"'9mqY1/STV;<<,"NE$Zd-Fg>23A6jih%P+u5?.`Q"PFI+s'tZ2ioFb/G)!V!4POK$Y.#KpgV7rSpuo9+[>.8]*b5XST6W59[<2(ShO[$rp'3YX&jGo!9J#:K?4NTQ1JK:ZDI*gFH!C/Dh9N([,B'Wk<;UquIH&M:l7fE=&%pRn*TtuLH+3^sZV8W]GGf(pF_i,55<YL:F5&mJ>NtD*>T)>jdG.>hO64UG[SQ$do'7Ebd;9uLXlME+0!j:rQWqS4kAp0"8VX^&cbDBrp\]/_g\:X//F^Y+,M^#r5@]95q9'I6W/ag5ns;XcclT*uj'U*;K*"(#%KCI=*L+Xhqu+(VAY::H&:ETgJWBA$n<HcS3^TI0EoiL9NmK8R*;O-<,P9,m2nj=*,;dSX-baVo,F$B.$fAJ/pHP_$<5J~> | |||
endstream | |||
endobj | |||
6 0 obj | |||
<< /Type /Page | |||
/Parent 1 0 R | |||
/MediaBox [ 0 0 595 842 ] | |||
/Resources 3 0 R | |||
/Contents 5 0 R | |||
>> | |||
endobj | |||
7 0 obj | |||
<< /Length 2935 /Filter [ /ASCII85Decode /FlateDecode ] | |||
>> | |||
stream | |||
Gas2O=-jma'SPBB.u%SN_RLo"U`"2C^gpR<OtetcAE%Mt#"GslqY'^#I]5BohPsK0gZn=qd^@Wo9XjJ6B:iGoG+W(r].X%:]@cK]+m`ZsHPb]0m-EK^="`BQb8q_=\pMg#gP@?jrVt48.p$r`m*;b8p^g'q&b&j&msU$7gA(OFhY/=DCr>]H\8rsDC;V+n\@!W1DSmP!\1o:WBuBZFn%'.G[c,iln8L?&E7_MV*Pg^/KUXmT!'HLWF1)Oe!;E>VS86"__#%#PY&D4)J@e^%cF;aRi3lUU$Z1+g\1(G@@N-?hhNb*^i:oYYmZ440*#SY\n0k:=^HVkj+K>OY57DKaWWU"#!q9Mq#C_.:i(d5VIX_da<`B<QIiRCD<*^#`IfeP6WOa/K5.';IYuG!>INJT>-rnlOh^<r0;KY.tI0R27<S)l\(P)7Vl?_ss$?0(HXp;^+$#j+KXp;^+"`RD?Xp;^+%Id+l#CaGEL:a4Z%fH;7^^m/#nGBNlO.n])qf;c3U,qf@o)S5JFl<!1!:EJ0H1:]h!4Sfi4S\k$J=BGZ*rQ!m^q3Ke*rQ"0)fC_5l9+k?%,cn=FWUJ[Wk_?ubu3pp2t%;a9!no_]M!JueK0tH*oWqq#E[7.KU5j_5W^&!?@$_onU*lP.FnOLo+BrX=U1&7a+2cV*C)hJ#VY!p^k)"^iMBca3&*TC]X6u)8&f1pQ[0\1bkR^td]W`m)IF%^$?gquj%I6^_[^X%Hpr:ZfE(pM2;klP#OqaPKU7iB_#N:)?<VLTs*mO`WS%m]s#o>;B1MIk9u9QNNo9pZ#VSn6K)^<G]N"8(rr7iEd^:=ps(B,_foG"j?O/<%4+dKN&ROaG"TSKoGj3rpr;R_pV/Sros6kW-`Z;nqIh5p9G6IsG8U0LT&cDYFiMCW,i4j?fl[%\]TuD?Y$RQ3dd:<S5hZLAB;<XGq;b-p2^kdh6=#HC49)&Bm9GG(@aV7Xk#I%^4d$7>&O>9"M,85d6D)-eZnpr^,l#3;X;EiI5ep>i"'_;@,R4(TB>0[@lB;-MSBL*`UTSZ!X@7,D34eaQ\l69.t9cm4K6$8;=UoBERMkIZ&'N3LPe4!>BA.%Se,O-JQ/i&,[p(;EZ<>V&i>5O,eLoQA,+iSjt>t!+pG4uTS4&M(l[(_S4hhcr,TacI(#+$`/(L#fG-unFQ,@+uDTBI87*U,nkr']_(lUViGjsN2[>XuBP69ijXP2_HLUsi,((TnugBW[mT03h#Yct5L>?FZ#;U#g`t]PrUIU&BG7]PrUITbW'O]PrUITe1bg]PrUITgaI*]PrUITj</B]L[f2;+TN8-nh)6?"i8j-nh)6?"iJp0eY*B6@8`kH!s8\>5`*X$VS(Xp-3%n=OMm5!&Nbk-!f^C0OnEkdY3\^1ZjB[?-"9F@pW9cKh_\*k(P$ckThil?9$Ae:'*66Kd0me,VW_737<LU!]/tm,@0LY0OnEKdY1Et1ZjB9?0EOf@pV.EKhMOUk!`(Wcq.W]]VsuB9HfV8JpC5<WQqu^oa=Bm)JLs\9EGSoWu>\-KhMOU8uikE15/C'$VJUCZnd>/!XhWDX0aX99EGSobH&!*KhMOu8h6jI15/C'.nV=jZq_;r$*5PW5e><6@)\lhO=kVf=RddHU^N^r<]l8>;)_Fp,d?9*</nJW67.6uO.pC=bnMo>XEYFZUMcrj8RTN4W#Be7KhMOuk!_/mSg\[n=>;J/;)_Fp,d:`a<24?.O@`j!]Vn<U9HfV8MKr'Y\sYl3JJIdN)Kdii9ELcYf?NKe.e8uqAq<@%$d7gWcQk7TFGAYCVOn"A+nIrC_$+`,G"s;D&Tic9pkaYFXNgs*"P4gICm%A#.S(hp&?-"0-BYj31Iq?X=)3=[,*P<*Z,#%mb[qKU%;]ZR-WMhG,VgAc&mT9Tbrh32I#png='Q2>R7&BT7"X1.C?.F<k_tToE;s#,Gqt4M$&Je744WDX8RtRe,cK@1G0;-d.3oO*Cpbt>,VgmGs#<J6[I;3_1+aaaN.Pg)P=_i*etRAg@5O/b<NO/^GI7Ip,b6ENDB5W;+iW`rO@W3Qe`J6C*)s1b'/`2ZP!i0Ki<Pi"gM<kC-0+uG+oarT\p'C!_V"a8q5/([](u/]Ri-@mfD$)G:-[dJ5K3#^+a!Nmq!Xi!aT(6&:JkY`)n9b&mf[m`7IN-Rf7r/dnBUKNgq`eFr9cJu*;r'i%G\GOpAk,QIZ`AT(Y\B%!0;SYgci=%L>NC.1c:`hUH>jAo^.?(^#!Y!h%B/Gm=e,PlaICCB]J(+$^2&e^O:?:)\1b3R$:3Oqs^I@*59*?-L;8tLGu^$nEkqo_Z%&nG"Wbahd.;_hJAh>g.&uX(PfN0Rg8\+#1dJ_o&BAS@e8@pfUY4=LjQm^C_#6\05i.Q4?2I\_FrU-YfuEdQalSDR5YC)H/l^sDZX5Ia+J$],.o1]#Lg=[G_mCNXuS]o!XTkX^7i0<)EJpu6[)HdF?EZ\m\Xaa">CAB:"@l&?lutLWjreY5]eqbK."H[8U")ZGljM&F>['m-bt"!2cD#L!k9=*VO$0S_#/L32(s;&Hj7sS\ZN<(R6pIW!;RoJ>'t)gNM+(.>AY`DKr!'$,"r]XpspQ+6&1;K?AN81N?H2.5qbV_N^f+?U7`;H)Fu)Dnq)cZRRnaFnq)cZ)G;;Go7Dl[RS4sV3PL<EiA=H-j,5mc:EpiU(L4o+L`562]&4cmUsqr5']6fjTGldV]&4KeACZKE_7+C+\/I(PE&4JM[?/@4FU'[#87F/]0j!1^bS64B$X(\RG9A\q,h>9tF4D;P'87da65FXm*QUntM7&Ga>]g9,;b1@LA2.0AJ]ngk=:88j?PmNe/S$Sb@Ao$jON7-MTdJ>W-K>nsRTKs.N*dE:@P)+HIUT13[F12]0+9/3<]ZB=IA%q;8d@,d/sO:X0eE*:@@:4JAjnnDQa9>7"16kd=o~> | |||
endstream | |||
endobj | |||
8 0 obj | |||
<< /Type /Page | |||
/Parent 1 0 R | |||
/MediaBox [ 0 0 595 842 ] | |||
/Resources 3 0 R | |||
/Contents 7 0 R | |||
>> | |||
endobj | |||
9 0 obj | |||
<< /Length 3803 /Filter [ /ASCII85Decode /FlateDecode ] | |||
>> | |||
stream | |||
Gat=/BpTgY&cAe=0fD3@gQ_!gWbr-%H[Bq?nSK$`Y[E-$#ltYUY`6udmM]f;-7cEtQ,Vbc]Vh).W&c.ZU3c[qlIOe/ZuagNh:9DIG5(3dgY).YgLY0?P]f'"1YKFQHEqn\p30j>.YR\CFtY4iXLN]Ir1DrnmbQ^L)koHS`^WiIf?5Be+%G9[;Eh1K&"l%F-?rF[f#n^Tu<Piq`1%*JN^&j<gG]mKtEDD[b&h6^KPJT<i@OWN>k?@Hh+4AD$Eo]RpYbO:)SEAEOqh6LAd$7O5a$2!HTlfG=%nhcb*O7%&%r.gqmR*7gVm]^$s)CUZ1alMZ[>qc3i-kB8P2^rt:jYJA>InG_RqXsCe;!tH*jQIf7qZ=p`..QB^,1-3.Pa=Uoo]Uh^0A"C&adRc%*ROZaP`OC+H?;F@YClE+^Zj,H^&Jq6-Yk&TF?o:Z!TeqiNZK4fq\u1j3ofJP!PSLIPQthF4Z]81T7M%ObWq4!kl'\;gc:S^d/gr\!gHo%7XB/An%W*\O-;@53P#7TrE#Y>oZ!#g)h?dp%Ec"9SfHPdo_oe+T"GBjkQ[^S2aR8tbs7;,!.)B]jjBPcNt1CP/QV;fYj+srOPGViT%T;12"qj;1OkR<kWV?+bb-5S\rT]OF!q@9mLrRG/4ouTH\1ON7nGsj:Jj82.1%Ek;c(eG8d<`@%+R/'P(E?+MX$U*aZt6GUO$NO1/QjEW1H#7%-7./Wb5?Y"9&0-eMFCl_8?.4XDc?U"rm:YW1LPb%.sQ7Wb6K$"9&65eMFt'Jc>ZQlFC?F5l^jRous[OT`>%bH=g;8d/SSm4nC3Bkl6.2Ssbl^kjR4qLEMt(R=PJKKLZTt]Z`Wp"bOeM$Gd.p%"q_*Ggri,bf%^jMZn^Qh$UuWbREQ7+F)s16#\V9"%<t2*d]C?1Ggm!jg?0]JmbHf#.c>sW%YZcR=R1&"R6A4DJ#Qe!eL3")k7cOZp=,pn7hh*AcY!]3`pj$'nY,/"j&;tI[h.)3Lp>q/6I@k'nVjE"j&;tI[h.)q4.]2/6I.ebjm;UB#/MU<=%`5(*p4o\]cN+1Hl20=`G5XJpX*naXfF$(Yo!@87o]3^>KK75r&fXo`[9?$^+Y3W%YXk>*-s[6[ceQciR6VJO"Y"h9Z53@=^[l_%"cn$upiKIDJ%n*mP-(qh!Lq4e*<0p'#M,HT3Z@l3hKip2F>_e/-m^mGY_IW%YYLg;A3p;.":/["n7iUV>YUBb0B\7t&45dN6\lJGOj:V*1=b!VHUT8p`NN!pg;,PkK'&"P=O7..-!+#cKDd;;/p5&PuhRUU5gJ,+u[.7VNCr76l:;NRB,C(D6<D2bKEU?3hKW+dc-<K_%O_pb8dV"s'@7'7V2@Jf1Be<,1DgUd?c1FFZtXr/"AYAs<d%WL5u5$Gh\L!@ftu-W2+T;*$t=B)"c];*$t=B!0Vj_2QeC.Q):DSfkO?3^BNRe/-mg*M?:dl3hKo%T',Bo`[9HetL:DCG1'1"^tH2JAAZFL0k*mB$%W;VM5o$YC\I?<'Xjh(X(_FdMaIuclGp`JHs@L;ZT0Iie;NU+NuYW&C`"4bju1YCm/uTI)I3TSNs])Z6&Em06VaI@FiP)#Q$pAQ3tLQ;ZVFc,Jpri&8%OA#^jS-O&cg(TF(t;;\4trJhRR45iAbrLqsgZRA^/gT8kV6'nk8=!WkGa=PF2"N)Th/*@p]&"^tH3r5IVC&97IJ_Tc$\JYPI5iX3Qh;uqR(&RN/&0LJi*i$Fi%+K-F,;AH1jnVB5lS#QMk4&uLE$GpUZ!J)7Agi<Q)hMh)7*Br+jr9k]^c:.?kG=DG3?eO[h*1l3(rSY#;qo;JSIIQ1<0CI4k]36/NTp`2MgLm):o6Bm,E^GQ`_A1J:JRNpn_)V^`L5+0$F&Is8.QC'C;U\N'6T6C3GY,_S#&T_GcIgB50tsLB/7(9a##4ehcWLt!0tsdJ%,&/;r&n!Qhm:-qE;IBZ[c,HdS.t"q$;MD]QlF>US!.;dhc>hB2F+U>\k+?jopln_qVla_UKuq5HFp,lpn!)D?oPM>\aIa[0YXaK9\G)B&hSFT@%:^D5>Z<b/We^Y[.!.Q(b[C!A(_jh,jITuMI@3hA]rKB>W<6WSCTHS]*cgr4N:tG3SQ'M#/_oMm::T#M-TcZD(sb'3SfqEcqGY8]g3SGYM^B*1Gsg+F`5V2,:GNm1r2&>h&E`;L^MF:2B*I)h9aD<0a7eo8Q3'c6`tcg2Af$%)5\`!(XDFXg0eFpVp?\KF3&KBcj!uZE4XQS2&4F)"km?X$;MPbd*A>qGMY4p$7A(6k-h]pG->]hEW=":@nH.V&F*Sn']PAo1T&9iFp)rk:($OV#34qa#;RD*p"8l4D+$X8;aW#I;Gb]Q8kLh@1o)<>"ngfSU_Mi@%B7E>5s>#n.E2(aL6RIh*7UaeP#@7rBh1Zb$L6;G8L_[J25DEC"nhAcU_Mi")H)]]JpR9=Q_.neMXe-0<90jJSq!#i@_AHY'fd]Joa(2-I.$)F`q?`oPp`CJe75_g;N,fWU`q8lFbD`FDhISOL/_][T["*=dUsGL@f0(j.`,(_LPV.+)N=DJU`qBZFc*,n']Xb!<5bW3NY.P@@XOgl'mV6O0@U3d:C9u;Qt#eVD(tsj+Vfh_Ft_>Lj"D<K&Xd,&6>\CtC.Ld*MVSZJ_0Db!'qm("0@U3d6Og"c9sK&=2AhK4U`q_9mY0A&I&%o#\LD\Te-=rC%4Mf__pU:/8!>pP-ONb6S7;4RV%?E:PWUu9F2s/`I^TsMWIe#YVqA[T.E&,'Pc#THam>8A@j/@IQV6C@nsd9S5,G&]0pS)7OIt*Bo'uo`g9I-6@Z]L-Dt<H1Q'-I@<*kGJI`0"C.pb+[FW4CgMEu^e^WFZo<;[ZI'SCccYfY);<(q%j<d?,`iSD'cXLpYl`ME3AQ+)&/jG0iV_TL%X<W!arC>M,L6).d!X("u=[1dHtWsZ.eQNsSDYG2;sn7qSGZ;p7`)\#9qe`^)QX4TY/)iVY7dB?)C0r^^JjeWfJ=/0+7Z=6_$\&q>u$Elq612#_Jk=[N:Y=?8^C?>HX9/-dW7_^]qjmM<d?sNT1dB<s`\bl1\(kl%d?^\I1g7JUoF59VH$Elq613R6:7Ba?<U[W$j/!F%8?[Egfd*XR,(kl%d?Q$S`g8S.[MG\UUqN^k,X7*df3E(mRX3n,0?s2mMO1\!/hI%%(Q%$^<X0LDd2&PCYat6p3`5Z\A73Tb8QWpQN2:gDsXsaGK@WRH-`3HT%>#>RrOlmYKl)0:lO\P*I)=>T$/FmN'-EhZf25qs6Zo>Jc9d2ZKca:eEhJ#^L$!DPC7!AP8C6M`3esb)%o([:Oj.pE'g%igj9j[@%CJmsLb1e2IoB0/D]]/&(Un3\@S=;oir^L[e=1mFZe._DoH^p17,!1;,[E0q*ETo,qlJK'BAEU/42L38GY$!n3.rUWmcC^28n]DYRZ[,06GhYW0rpFTd=1mgeeRPoU2MitQNIL!DY$%;\.rUWm6Ib4#^@7TA$+07]M(D&SIcWYp=e/A=Dj/7/eEBuJp6sM<V=HO$/8X/S<aLp0Ap$G>]M0RXRl?"c=!Y)^A,kET2Miu$h@Q9'AKmU*p?uZmk(tX*h@N^oOiZ[FrHlH:,dOY"6WeV&,+C[fD`M1N'3Wu#+fr=#Oj+pDpP-.KA7>(aYk!Z>2L"NFRr`H[=kLA1XLoa>boQ\*>Y/I7o7jL?MF;X8]a*:[(,g*r.^)BR(YsGB9k7](VQTKI7!?tk#?`8*]W"!_MF;X8]a!4Z[WtYm@MOadU3d3TM/;dLmeg?H94Sjp/$M`YooAJ2lIPt9%SlFX~> | |||
endstream | |||
endobj | |||
10 0 obj | |||
<< /Type /Page | |||
/Parent 1 0 R | |||
/MediaBox [ 0 0 595 842 ] | |||
/Resources 3 0 R | |||
/Contents 9 0 R | |||
>> | |||
endobj | |||
11 0 obj | |||
<< /Length 3625 /Filter [ /ASCII85Decode /FlateDecode ] | |||
>> | |||
stream | |||
Gat=pl'!AO&]MNR?dW8Ah#PVEWCj1r\[H]o!-@0DJ8h!q!>kkWF(9:im::-ZV))$pbtDN\D8a(oQWhOZ:F5](rlJr"nIVTP*U\FKA3.Bt,T\</(CtWqCFP$BQ`t?"E<!c5mAHS'jeGf8m2O@]YGSnZh`Q>cg#8L>rL7GbR:UPuQr7%f``GA"MrkOnAsl"=ML"An:6X*#._o:eW*(n)KJR,*(SgLXJ2tX]-cM$^VUTi#0[gg"WgLoQPT!&B)/E>e`QW4se9D!JV\2m,bh:7*)E3^5b;P,e<QrG*<#W4GF%p(I'XP<;;WA6peeiF*bj&e4NNWH.AICrXTecGa<bd!a@*YRMl;63i9W@PVJ=0&tFWGerXg^p_9n8YoYj+8kF>Kc5[fC$a+mM,\!b]s=7\fKjJ2tTQkW3hGAkJ'O4O.3_/Sr!.\bi;Qpb'?-mA0'0]72;imfCX16;_kR]DJMSpccJuQ8#:!Phl::C&@s=c8fFsLU+OA.ZGM[R'A1_'=P]/Rprob1TBn7"PUAi"Wgs(8rZ%Yd)LelnF/24CA\s#=s(0m*RK-&\5M??#h0ctjTl[<'Xs0edJ,3n[8(O`!P=%"f9[4KC&AEk2HFX65YGn3rXM140=KZO*bBh!V=>'!g6f-VoffA'p]uF/DJXl0$:CZ0`sC2KZ+@_/AR@2bj.?UanRDsn;]$uAre3TV6aeu*l#e1ANIN2"`fVjW;dlWSp^[FC/D1)/'cp\\nQuFQGd?>s1.pSkjp5p1?WPsA7VNDm+l(),'fZRW=)&:*,M^;2'fZ^[=)&:j7_"FJ.r]B9Y1+T^JoD[$<npD>Bb7`^\<KKF<c*Q23QKcU[8WYdj36;uXf_(P1KS<&G;RUhD%,/+O#(jR#'$>VDYD@V\A'h$C(Riugh-S&Kj-Z\V8at)$/mdhBIhm"R4C.N40"LgD9U`A2u4MtqnH$]\>)*qF5+C8(%1`V=(r4i<%"*g=L])`pGlRS#c%ZEOnIJ?\/"H,b`s*b7FlBmjAreTo/KAPiZd]tol;Rq7rd[_pF)71EKTqKg:7ZQdec(')Q0*ep"MO=%JDg+Po@S0eo,?h2V@1H=)&9_>/-'#gL-Yk>ik9l6Ip)@lS`tee\3X`AGnF#0)EUkqmr;Zp"T8QpjYE0noZr9laQD,EHD!dmH^]k+l()hD=7D(I9k-nop_<)(>KMq)tR%`pRimS=pVV-F[u4PRB(aAKq>dDF[t)&0N\._3iZ9*D1(.Op)EV1L/Jst=%Dq@\W*dS_L@-Jg=OkP]jbm>lgSc,H+IkqC0t%4onp;>Y<0UMK=T^fePX$6\ZN%s_L>u:BB/=CW*V41pq"*1(@M'4DX6W:cp'><pq"*1`pp]GW7CaU1s@Dm285*B([f'9]ZSj&ToWcfnTFK:pq3@$T^H<;>oMikjr.Ss>Xs4>H"AjhMpt>alY)es?cV3.HsIZQ,N]nO8'gM"=4__oHsIZY1GIGU3oW3sd<1uPIbf[Y,O=ZO$g351odVlsFi3"Z>iY.+lf^j*EAm]:'@I\uY9U3Fs'E^um+4tQ]X#83\9L6LY$\MB2r$o4Y46YANaNs@Y9UA\2pB%\bqW0tYARe+c<R>7>kS'@qJZ)ZaCLFaFh.Fl>9A@amYC8G55;M:^RDVGAed'Bri!B`(-V]<@MD!0&8NT8/;TiD1*B2C<rc^':FLia-WUY3;W4q^ENV?#F>bfX7&9kpF4-r";aL^WWGm.j+NYj?l/t.YA:TmOVe6!MU<b6iI&B7nKHpY<'u'/s0s<G[C#V4NlX=7^7cB7*Z)3VYIIEQ8r\H$X!"bKsNI.Q455[j8aXFe+&Eab%W&hVE4oM@T'LlAP-`.fVW&hV%4ThEX)#9)\)!M]kWma&Z1E];D;5_)?doO@3W_R_=<i%M@'K_H:MmVWWdpNDKWA&@N40d-['LaC]CUm=[p%+`aS@=4Vd9Xq\_C0]r6jaBmW&_C%3sJ*P0ZnQ#0u^ARRZlR`6Rf):Ob1;(hq?gJPf!,R0lE-OOW\g@GJC:1"i+?]>/Db)Nk8LEKf9!@Thd(PNk8LEKeEJF\V)GJ:+)J@Lf33T!7BHbm-]p,!Ot6YL0SS#Ap8`($Gb2S89)(qRaX?_1jDKhnFkn\Q#`ED3PDabrNB'*]^n+d`_](>=kl@o"b&YnmADmZd$aG/Q^m[3%9eWm@s%:5TdK(:'WsL[o1s'X)P^g3$oN$[T^_S^W72ZTK4h,S49U@RcPa<+UG4e8cVP:$#R\m^L.[HQ8U,uYfL&KF!qGbPNLq=i'7:&mYF+qJXiY78cJS(eRsh13*;8XoP:DR>!ITWjpd7m1W\[Uh+K+18![9&ZSJ`n7hEmk^";)?VcO?'WpB]:0+G.H?R\<X>7gRU4+bIQXR\<VhFJEZ-g,)2ofLPC,V(oP*aA<P+#RXdML.[Gt,#FJ[VL3J=)5Zjr"DVBX6/d@;:oWt;!]A)UT^Hs&1u:Tm-6*WI]hXj4Y7RYS7g*t<;l0#"!,<_k6/Cj+Bcoq8D+Z"NH^uXGh]bl1PR-P\Vb.'%M.Eq*5oga5$C)OE6_GbY&_(5T=#+;Uj7`i/,US+(/Edfu2;Uir-8Z=ai<E@eT17iO!7^'V@QM`kj[#^GE]_<0-UKkqi5P=\M%9j4rJ4GEQ=u`G&pQSaeV'hjNqtQ`^+5qbl/kTt;]`XkB!-Pl'I-j(Qn(%MM]=TjhAaE>Vl6pfC/PacOe\2dgS9S>Z/Xr3)F$]apAIk,2ffk:hB:q=q$Q9<QUnB*??a2M)Q0qbPIYt('RT"cqcos`>i\"[o0TF'Nc`(%)T5(iF#L4e@dgttJ1EL5Mk&t;\Z1..Fhj7\`'kHFNE.LfQL2>0RqQr=D]7T'FHtjF@m47WL=/'CN6GoRY__V4cPNb4+>,FAD8md&@m481;M2L#I'tbf\;pB4j[p!A,2]Ru>/YR-k:9VK&/Ub\2Jf3H\a-'>pbW%0@>gfH@\knVWBagna]l]+(Fu?P)$"FC(.$as:hbG=h/)-rY.NL?NR9Bs1"8TDK#0O/Ti)!*Y$t<GESXqrBn4ftD"&W$SG&>NNe(WjO_j_8/tBWK2P`/nO$HG5+t+F'c4>9YT2llg>nn$fB]ZiXQ'=8iiD&6+DGI277T=SkOqOr.OSb`g-@o#!6^dQ<_!A$k/eKkj-EskoFcj3qJO,(HRfo%'Q_"FeS\TuH2484n=R'0U*cQ6'K+<l!#qYa%*tPmH"Q/uP/9>Y69>*u""0Mr=d.>s&7S_=T<?Z1+WI<qf+Y;U@5L,UWRWhq"6_H>gV&(cJ98BY_f_B%tF);!%]jIH!&$er<\KHg/8RNE#<m4g6^iD^f<Kk3RIO:>j.Y6^?07P\--Eu;&KtY<udKuutga7S(0-&cjNi,HV1NJ,A8RSC)kESeMPYVjn9jjgl9.'hE8mo$#&?\`8V>#lm"0P7(Bn=!*S%qYb(In[7WBjeQq_]P`Y4QUh4?TgQIH1"A9l&m[&4TpFI,;`Q)3%.(QLA(J_h\\)k+-:.f^OVSF%m.V>Ar>G6#$5uJXRQJ:rfBC6<+Lgco"Oe_hdXBpfFW@@0sNBBlb,2iV^`$S\p1HbJ[YL_hdV\6s$P@+>0sUC_S+s].'*q2LJT4F%m>nXCD]FYU55Nhl_fF7"o!8lml.0&9Vms\+`\t#E)-F\G~> | |||
endstream | |||
endobj | |||
12 0 obj | |||
<< /Type /Page | |||
/Parent 1 0 R | |||
/MediaBox [ 0 0 595 842 ] | |||
/Resources 3 0 R | |||
/Contents 11 0 R | |||
>> | |||
endobj | |||
13 0 obj | |||
<< /Length 1495 /Filter [ /ASCII85Decode /FlateDecode ] | |||
>> | |||
stream | |||
Gat%e6#YO:&4Z-f'`nFNG*'!T7j=r);VSgQ,.A\Q*a85ECc>(H)@>c+9oufu4l[f^3$X(O#[b5&oKA>r%%k$GqigJlY&i1HDZA_7G/'ZZcLR%^U,=BQ0#lc#0m<H[m[)C@*kVlMn'AR`I8#%-l/T,<f5CW\/q\2c*8m>CdA_d(b8%&cB&YK_)\unqBH]F-n,X[*I"tZ40:U!a-N"5_4l;qbM!_NP-N")[*LSW7`:J^<HBZ!6R#(+\Tj^W,lkel>D1.Wm@IaGM-GE8W5[?1Q9OOe$THT_f$L#hF/JG8fi]nh"$ZQhaQ]Obr@J0\cpa5q@h).I"$!&?G4sCNePDM^9Z>T:gf(85tPqi(u!*G^a/GbI)&RS*c[`g`23cc/62G#TlLFP&3!%)>K/""i1/2NjtbWmLC_8H^nAsO<=JCu:`HGL$7bVJ3kJ4Y-L:,)3qR@.X+Nr[WT1F0e1c-.s'=bZ+WE3CTj\qGFDGL7[6)6XXN1'NEL'q1h-`XMuLZG9;H6o23op^)L$?XP9eUD[6Ig`fRk$k2NmTk24_!32<8Tl=Y3Td&MK!`dCY:q/AnBUSAlJLY5=.,5as[*1KP:h:(EKptGaQ5T-'W3QV^Nm5p+iu\E(XarCTbs>l&7A)/DfJGMlOhn%qZd5&Op4c:_eVK/K&a2h,2U,5H1B'b9arJ(e%5T!Tk.osq&[&DEju*W+XR1Sp[jKmuWsljLC*.A^_(3YQ>\+MkD:ijFg*1d5CKu=r]2p7?Y8!3om^'T_N/%[<M$-2lEMtf[WJl[]m0t:]PtNeI4p\[YY$?Q+GsJl3-^_M_*cII_M[JGnU[[-XQC&bs4GN@5(W`#FV1Q8&Mb9R/&CoKTjsmQB0"fqNXuM@_6Ae=7"`rW32fm0$M/9:cB!/EIju1hR4I%#o4^TKPb_6Q:1KPPi&Cdeg@sCeR+m4+d-PI.[<Kb0tpb6XS)C"3k!3-LGF2bTu<Fl#X5a>b3[(1WR#&h)+E4'6G5FT,\1*Y."<g)DDm&ZVU,Qh2i/'7:SGo^\BJEC!-#&dkn>U:7F/e.QI<p\6MhKO<.RXS3R'+M?5Q+>$nQj`Ap]tN0M<h;%qelCi^cX?1DKhG!a"q@t_Q+>$nG%h35;/`6";0rKVd.:8/_-FL1108eA:m:R?X$)*GYcQ/UjV^G1X"mb%#'43UcWo]P6d8so=*Y!kiP(GbdPHWHB4S19%-GET,BK\o<58CQ>lF=cg;,FnRB&FPRV1_"b_?!QF+n7'oqaTgQ"_oghL@=_*+r+@$_NifAV7Ot^Wp)H_-Ed3C>WDOm&tK&PeKH6rASe_D_N"$f?=uD5ul7Q>icpKKh_-eIRMmKW-YD)\]QjugT^^,i<nJ8M"F:+)pE0QIm;2an-t8LI_EDVb;V3TfULC&c^-bDFa[MV\$(jJ5Hauhrc!+-F`V\MF1f&Smm`'YB4qe0^:eg">W\K/^]/I>/0EO>qa\iMQcF<n#B.pAVmFE4MRRYdDYGM#!>>4h*r~> | |||
endstream | |||
endobj | |||
14 0 obj | |||
<< /Type /Page | |||
/Parent 1 0 R | |||
/MediaBox [ 0 0 595 842 ] | |||
/Resources 3 0 R | |||
/Contents 13 0 R | |||
>> | |||
endobj | |||
15 0 obj | |||
<< /Type /Font | |||
/Subtype /Type1 | |||
/Name /F14 | |||
/BaseFont /ZapfDingbats >> | |||
endobj | |||
16 0 obj | |||
<< /Type /Font | |||
/Subtype /Type1 | |||
/Name /F5 | |||
/BaseFont /Times-Roman | |||
/Encoding /WinAnsiEncoding >> | |||
endobj | |||
17 0 obj | |||
<< /Type /Font | |||
/Subtype /Type1 | |||
/Name /F13 | |||
/BaseFont /Symbol >> | |||
endobj | |||
18 0 obj | |||
<< /Type /Font | |||
/Subtype /Type1 | |||
/Name /F1 | |||
/BaseFont /Helvetica | |||
/Encoding /WinAnsiEncoding >> | |||
endobj | |||
19 0 obj | |||
<< /Type /Font | |||
/Subtype /Type1 | |||
/Name /F9 | |||
/BaseFont /Courier | |||
/Encoding /WinAnsiEncoding >> | |||
endobj | |||
1 0 obj | |||
<< /Type /Pages | |||
/Count 5 | |||
/Kids [6 0 R 8 0 R 10 0 R 12 0 R 14 0 R ] >> | |||
endobj | |||
2 0 obj | |||
<< /Type /Catalog | |||
/Pages 1 0 R | |||
>> | |||
endobj | |||
3 0 obj | |||
<< | |||
/Font << /F5 16 0 R /F14 15 0 R /F13 17 0 R /F1 18 0 R /F9 19 0 R >> | |||
/ProcSet [ /PDF /ImageB /ImageC /Text ] >> | |||
endobj | |||
xref | |||
0 20 | |||
0000000000 65535 f | |||
0000016170 00000 n | |||
0000016255 00000 n | |||
0000016305 00000 n | |||
0000000015 00000 n | |||
0000000071 00000 n | |||
0000002919 00000 n | |||
0000003025 00000 n | |||
0000006052 00000 n | |||
0000006158 00000 n | |||
0000010053 00000 n | |||
0000010160 00000 n | |||
0000013878 00000 n | |||
0000013986 00000 n | |||
0000015574 00000 n | |||
0000015682 00000 n | |||
0000015767 00000 n | |||
0000015877 00000 n | |||
0000015956 00000 n | |||
0000016064 00000 n | |||
trailer | |||
<< | |||
/Size 20 | |||
/Root 2 0 R | |||
/Info 4 0 R | |||
>> | |||
startxref | |||
16438 | |||
%%EOF |
@@ -19,19 +19,18 @@ | |||
<fo:root font-family="Times Roman" font-size="12pt" xmlns:fo="http://www.w3.org/1999/XSL/Format"> | |||
<fo:layout-master-set> | |||
<fo:simple-page-master | |||
margin-right="1.5cm" | |||
margin-left="1.5cm" | |||
margin-bottom="2cm" | |||
margin-top="1cm" | |||
page-width="21cm" | |||
page-height="29.7cm" | |||
master-name="left"> | |||
<fo:region-before extent="0.5cm"/> | |||
<fo:region-body margin-top="0.5cm" margin-bottom="1.7cm"/> | |||
<fo:region-after extent="1.5cm"/> | |||
</fo:simple-page-master> | |||
<fo:simple-page-master | |||
margin-right="1.5cm" | |||
margin-left="1.5cm" | |||
margin-bottom="2cm" | |||
margin-top="1cm" | |||
page-width="21cm" | |||
page-height="29.7cm" | |||
master-name="left"> | |||
<fo:region-body margin-top="0.5cm" margin-bottom="1.7cm"/> | |||
<fo:region-before extent="0.5cm"/> | |||
<fo:region-after extent="1.5cm"/> | |||
</fo:simple-page-master> | |||
</fo:layout-master-set> | |||
<fo:page-sequence id="N2528" master-reference="left"> |
@@ -281,6 +281,24 @@ | |||
treated as zero penalty in most cases. For more details on the image loading framework, | |||
please consult the documentation there. | |||
</p> | |||
<p> | |||
The ImageLoaderPNG and ImageLoaderRawPNG have a hard-coded penalty of 1000 and as such the | |||
ImageLoaderImageIO image loader will be selected by default when loading PNGs unless | |||
the latter is disabled by awarding a INFINITE penalty to it, or one of the former two is | |||
promoted by awarding a strong negative penalty (say, -10000) to it. | |||
</p> | |||
<source><![CDATA[<fop version="1.0"> | |||
[..] | |||
<image-loading> | |||
<penalty value="-10000" | |||
class="org.apache.xmlgraphics.image.loader.impl.ImageLoaderRawPNG"/> | |||
<penalty value="INFINITE" | |||
class="org.apache.xmlgraphics.image.loader.impl.ImageLoaderPNG"/> | |||
<penalty value="INFINITE" | |||
class="org.apache.xmlgraphics.image.loader.impl.imageio.ImageLoaderImageIO"/> | |||
</image-loading> | |||
<renderers.... | |||
</fop>]]></source> | |||
</section> | |||
<section id="renderers"> | |||
<title>Renderer configuration</title> |
@@ -493,10 +493,10 @@ | |||
Various notes related to embedded fonts: | |||
</p> | |||
<ul> | |||
<li>The PostScript renderer does not yet support TrueType fonts, but can embed Type 1 fonts.</li> | |||
<li>The font is simply embedded into the PDF file, it is not converted.</li> | |||
<li>When FOP embeds a font, it adds a prefix to the fontname to ensure that the name will not match the fontname of an installed font. | |||
This is helpful with older versions of Acrobat Reader that preferred installed fonts over embedded fonts.</li> | |||
<li>The font is simply embedded into the output file, it is not converted.</li> | |||
<li>When FOP embeds a font in a PDF file, it adds a prefix to the fontname to ensure that | |||
the name will not match the fontname of an installed font. This is helpful with older | |||
versions of Acrobat Reader that preferred installed fonts over embedded fonts.</li> | |||
<li>When embedding PostScript fonts, the entire font is always embedded.</li> | |||
<li>When embedding TrueType fonts (ttf) or TrueType Collections (ttc), a subset of the | |||
original font, containing only the glyphs used, is embedded in the output document. | |||
@@ -576,4 +576,4 @@ | |||
</p> | |||
</section> | |||
</body> | |||
</document> | |||
</document> |
@@ -108,7 +108,7 @@ | |||
<tr> | |||
<td><a href="#png">PNG</a> (Portable Network Graphic)</td> | |||
<td>bitmap</td> | |||
<td/> | |||
<td>(X)</td> | |||
<td/> | |||
<td>X</td> | |||
</tr> | |||
@@ -217,8 +217,8 @@ | |||
</tr> | |||
<tr> | |||
<td><a href="#png">PNG</a> (Portable Network Graphic)</td> | |||
<td>X</td> | |||
<td>X</td> | |||
<td>X [2]</td> | |||
<td>X [2]</td> | |||
<td>X</td> | |||
<td>X</td> | |||
<td>X</td> | |||
@@ -383,8 +383,11 @@ | |||
<section id="png"> | |||
<title>PNG</title> | |||
<p> | |||
PNG images are supported through an Image&nbsp;I/O codec. Transparency is supported but | |||
not guaranteed to work with every output format. | |||
FOP native support of PNG only includes the variants with 8 bits per channel and without | |||
interlacing. Native support requires using the ImageLoaderRawPNG image loader. | |||
Support through a Image I/O codec can use either the internal XGC PNG codec or the JRE PNG | |||
codec. The associated image loaders are, respectively, ImageLoaderPNG and ImageLoaderImageIO. | |||
Transparency is supported but not guaranteed to work with every output format. | |||
</p> | |||
</section> | |||
<section id="svg"> |
@@ -34,6 +34,7 @@ | |||
<xs:element ref="mf:page-sequence" minOccurs="1" maxOccurs="unbounded"/> | |||
<xs:element ref="mf:trailer"/> | |||
</xs:sequence> | |||
<xs:attribute name="version" type="xs:string"/> | |||
</xs:complexType> | |||
</xs:element> | |||
<xs:element name="header"> |
@@ -1,6 +1,7 @@ | |||
org.apache.fop.render.pdf.PDFImageHandlerGraphics2D | |||
org.apache.fop.render.pdf.PDFImageHandlerRenderedImage | |||
org.apache.fop.render.pdf.PDFImageHandlerRawJPEG | |||
org.apache.fop.render.pdf.PDFImageHandlerRawPNG | |||
org.apache.fop.render.pdf.PDFImageHandlerRawCCITTFax | |||
org.apache.fop.render.pdf.PDFImageHandlerSVG | |||
org.apache.fop.render.java2d.Java2DImageHandlerRenderedImage | |||
@@ -11,6 +12,7 @@ org.apache.fop.render.ps.PSImageHandlerRenderedImage | |||
org.apache.fop.render.ps.PSImageHandlerEPS | |||
org.apache.fop.render.ps.PSImageHandlerRawCCITTFax | |||
org.apache.fop.render.ps.PSImageHandlerRawJPEG | |||
org.apache.fop.render.ps.PSImageHandlerRawPNG | |||
org.apache.fop.render.ps.PSImageHandlerGraphics2D | |||
org.apache.fop.render.ps.PSImageHandlerSVG | |||
org.apache.fop.render.afp.AFPImageHandlerRenderedImage |
@@ -28,6 +28,12 @@ public final class Accessibility { | |||
/** Constant string for the rendering options key to enable accessibility features. */ | |||
public static final String ACCESSIBILITY = "accessibility"; | |||
/** | |||
* The value to be set on the 'role' property for the element and its descendants to | |||
* be considered as artifacts. | |||
*/ | |||
public static final String ROLE_ARTIFACT = "artifact"; | |||
private Accessibility() { } | |||
} |
@@ -23,6 +23,7 @@ import java.util.Stack; | |||
import org.xml.sax.SAXException; | |||
import org.apache.fop.accessibility.Accessibility; | |||
import org.apache.fop.accessibility.StructureTreeEventHandler; | |||
import org.apache.fop.fo.DelegatingFOEventHandler; | |||
import org.apache.fop.fo.FOEventHandler; | |||
@@ -57,6 +58,8 @@ import org.apache.fop.fo.pagination.Flow; | |||
import org.apache.fop.fo.pagination.PageSequence; | |||
import org.apache.fop.fo.pagination.Root; | |||
import org.apache.fop.fo.pagination.StaticContent; | |||
import org.apache.fop.fo.properties.CommonAccessibility; | |||
import org.apache.fop.fo.properties.CommonAccessibilityHolder; | |||
/** | |||
* Allows to create the structure tree of an FO document, by converting FO | |||
@@ -355,6 +358,7 @@ public class FO2StructureTreeConverter extends DelegatingFOEventHandler { | |||
@Override | |||
public void startStatic(StaticContent staticContent) { | |||
handleStartArtifact(staticContent); | |||
converter.startStatic(staticContent); | |||
super.startStatic(staticContent); | |||
} | |||
@@ -362,6 +366,7 @@ public class FO2StructureTreeConverter extends DelegatingFOEventHandler { | |||
@Override | |||
public void endStatic(StaticContent statisContent) { | |||
converter.endStatic(statisContent); | |||
handleEndArtifact(statisContent); | |||
super.endStatic(statisContent); | |||
} | |||
@@ -454,6 +459,7 @@ public class FO2StructureTreeConverter extends DelegatingFOEventHandler { | |||
@Override | |||
public void startWrapper(Wrapper wrapper) { | |||
handleStartArtifact(wrapper); | |||
converter.startWrapper(wrapper); | |||
super.startWrapper(wrapper); | |||
} | |||
@@ -461,6 +467,7 @@ public class FO2StructureTreeConverter extends DelegatingFOEventHandler { | |||
@Override | |||
public void endWrapper(Wrapper wrapper) { | |||
converter.endWrapper(wrapper); | |||
handleEndArtifact(wrapper); | |||
super.endWrapper(wrapper); | |||
} | |||
@@ -488,4 +495,22 @@ public class FO2StructureTreeConverter extends DelegatingFOEventHandler { | |||
super.endExternalDocument(document); | |||
} | |||
private void handleStartArtifact(CommonAccessibilityHolder fobj) { | |||
if (isArtifact(fobj)) { | |||
converters.push(converter); | |||
converter = eventSwallower; | |||
} | |||
} | |||
private void handleEndArtifact(CommonAccessibilityHolder fobj) { | |||
if (isArtifact(fobj)) { | |||
converter = converters.pop(); | |||
} | |||
} | |||
private boolean isArtifact(CommonAccessibilityHolder fobj) { | |||
CommonAccessibility accessibility = fobj.getCommonAccessibility(); | |||
return Accessibility.ROLE_ARTIFACT.equalsIgnoreCase(accessibility.getRole()); | |||
} | |||
} |
@@ -67,7 +67,7 @@ import org.apache.fop.svg.NativeImageHandler; | |||
/** | |||
* This is a concrete implementation of {@link AbstractGraphics2D} (and | |||
* therefore of {@link Graphics2D}) which is able to generate GOCA byte | |||
* therefore of {@link java.awt.Graphics2D}) which is able to generate GOCA byte | |||
* codes. | |||
* | |||
* @see org.apache.xmlgraphics.java2d.AbstractGraphics2D | |||
@@ -165,7 +165,7 @@ public class AFPGraphics2D extends AbstractGraphics2D implements NativeImageHand | |||
} | |||
/** | |||
* Returns the AFP resource manager associated with this {@link Graphics2D} instance. | |||
* Returns the AFP resource manager associated with this {@link java.awt.Graphics2D} instance. | |||
* @return the resource manager | |||
*/ | |||
public AFPResourceManager getResourceManager() { |
@@ -119,7 +119,8 @@ public class ImageObject extends AbstractDataObject { | |||
* Sets the image IDE color model. | |||
* | |||
* @param colorModel the IDE color model. | |||
* @deprecated Use {@link IDEStructureParameter#setColorModel(byte)} instead. | |||
* @deprecated Use {@link org.apache.fop.afp.ioca.IDEStructureParameter#setColorModel(byte)} | |||
* instead. | |||
*/ | |||
public void setIDEColorModel(byte colorModel) { | |||
getImageSegment().setIDEColorModel(colorModel); | |||
@@ -128,7 +129,8 @@ public class ImageObject extends AbstractDataObject { | |||
/** | |||
* Set either additive or subtractive mode (used for ASFLAG). | |||
* @param subtractive true for subtractive mode, false for additive mode | |||
* @deprecated Use {@link IDEStructureParameter#setSubtractive(boolean)} instead. | |||
* @deprecated Use {@link org.apache.fop.afp.ioca.IDEStructureParameter#setSubtractive(boolean)} | |||
* instead. | |||
*/ | |||
public void setSubtractive(boolean subtractive) { | |||
getImageSegment().setSubtractive(subtractive); |
@@ -46,7 +46,7 @@ import org.apache.fop.afp.util.BinaryUtils; | |||
* which signal an alternate mode of processing for the content of the current | |||
* Presentation Text data. | |||
* <p> | |||
* The content for this object can be created using {@link PtocaBuilder}. | |||
* The content for this object can be created using {@link org.apache.fop.afp.ptoca.PtocaBuilder}. | |||
*/ | |||
public class PresentationTextData extends AbstractAFPObject implements PtocaConstants { | |||
@@ -44,7 +44,8 @@ public class DefaultFOPResourceAccessor extends SimpleResourceAccessor { | |||
* Constructor for resource to be accessed via the {@link FOUserAgent}. This contructor | |||
* can take two base URIs: the category base URI is the one to use when differentiating between | |||
* normal resources (ex. images) and font resources. So, if fonts need to be accessed, you can | |||
* set the {@link FontManager}'s base URI instead of the one on the {@link FopFactory}. | |||
* set the {@link org.apache.fop.fonts.FontManager}'s base URI instead of the one on the | |||
* {@link org.apache.fop.apps.FopFactory}. | |||
* @param userAgent the FO user agent | |||
* @param categoryBaseURI the category base URI (may be null) | |||
* @param baseURI the custom base URI to resolve relative URIs against (may be null) |
@@ -355,7 +355,7 @@ public class FOUserAgent { | |||
/** | |||
* Sets font base URL. | |||
* @param fontBaseUrl font base URL | |||
* @deprecated Use {@link FontManager#setFontBaseURL(String)} instead. | |||
* @deprecated Use {@link org.apache.fop.fonts.FontManager#setFontBaseURL(String)} instead. | |||
*/ | |||
public void setFontBaseURL(String fontBaseUrl) { | |||
try { | |||
@@ -500,7 +500,8 @@ public class FOUserAgent { | |||
/** | |||
* Returns the font base URL. | |||
* @return the font base URL | |||
* @deprecated Use {@link FontManager#getFontBaseURL()} instead. This method is not used by FOP. | |||
* @deprecated Use {@link org.apache.fop.fonts.FontManager#getFontBaseURL()} instead. | |||
* This method is not used by FOP. | |||
*/ | |||
public String getFontBaseURL() { | |||
String fontBase = getFactory().getFontManager().getFontBaseURL(); |
@@ -1783,9 +1783,9 @@ public class GlyphPositioningTable extends GlyphTable { | |||
* Find device adjustment. | |||
* @param fontSize the font size to search for | |||
* @return an adjustment if font size matches an entry | |||
* @asf.todo at present, assumes that 1 device unit equals one point | |||
*/ | |||
public int findAdjustment ( int fontSize ) { | |||
// [TODO] at present, assumes that 1 device unit equals one point | |||
int fs = fontSize / 1000; | |||
if ( fs < startSize ) { | |||
return 0; |
@@ -31,6 +31,7 @@ import org.apache.commons.logging.LogFactory; | |||
import org.apache.fop.fonts.truetype.FontFileReader; | |||
import org.apache.fop.fonts.truetype.TTFDirTabEntry; | |||
import org.apache.fop.fonts.truetype.TTFFile; | |||
import org.apache.fop.fonts.truetype.TTFTableName; | |||
// CSOFF: AvoidNestedBlocksCheck | |||
// CSOFF: NoWhitespaceAfterCheck | |||
@@ -126,7 +127,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
return gpos; | |||
} | |||
private void readLangSysTable(String tableTag, long langSysTable, String langSysTag) throws IOException { | |||
private void readLangSysTable(TTFTableName tableTag, long langSysTable, String langSysTag) throws IOException { | |||
in.seekSet(langSysTable); | |||
if (log.isDebugEnabled()) { | |||
log.debug(tableTag + " lang sys table: " + langSysTag ); | |||
@@ -168,7 +169,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
private static String defaultTag = "dflt"; | |||
private void readScriptTable(String tableTag, long scriptTable, String scriptTag) throws IOException { | |||
private void readScriptTable(TTFTableName tableTag, long scriptTable, String scriptTag) throws IOException { | |||
in.seekSet(scriptTable); | |||
if (log.isDebugEnabled()) { | |||
log.debug(tableTag + " script table: " + scriptTag ); | |||
@@ -221,7 +222,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
seLanguages = null; | |||
} | |||
private void readScriptList(String tableTag, long scriptList) throws IOException { | |||
private void readScriptList(TTFTableName tableTag, long scriptList) throws IOException { | |||
in.seekSet(scriptList); | |||
// read script record count | |||
int ns = in.readTTFUShort(); | |||
@@ -250,7 +251,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
} | |||
} | |||
private void readFeatureTable(String tableTag, long featureTable, String featureTag, int featureIndex) throws IOException { | |||
private void readFeatureTable(TTFTableName tableTag, long featureTable, String featureTag, int featureIndex) throws IOException { | |||
in.seekSet(featureTable); | |||
if (log.isDebugEnabled()) { | |||
log.debug(tableTag + " feature table: " + featureTag ); | |||
@@ -278,7 +279,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
seFeatures.put ( "f" + featureIndex, new Object[] { featureTag, lul } ); | |||
} | |||
private void readFeatureList(String tableTag, long featureList) throws IOException { | |||
private void readFeatureList(TTFTableName tableTag, long featureList) throws IOException { | |||
in.seekSet(featureList); | |||
// read feature record count | |||
int nf = in.readTTFUShort(); | |||
@@ -3144,9 +3145,9 @@ public final class OTFAdvancedTypographicTableReader { | |||
resetATSubState(); | |||
} | |||
private void readLookupTable(String tableTag, int lookupSequence, long lookupTable) throws IOException { | |||
boolean isGSUB = tableTag.equals ( "GSUB" ); | |||
boolean isGPOS = tableTag.equals ( "GPOS" ); | |||
private void readLookupTable(TTFTableName tableTag, int lookupSequence, long lookupTable) throws IOException { | |||
boolean isGSUB = tableTag.equals ( TTFTableName.GSUB ); | |||
boolean isGPOS = tableTag.equals ( TTFTableName.GPOS ); | |||
in.seekSet(lookupTable); | |||
// read lookup type | |||
int lt = in.readTTFUShort(); | |||
@@ -3197,7 +3198,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
} | |||
} | |||
private void readLookupList(String tableTag, long lookupList) throws IOException { | |||
private void readLookupList(TTFTableName tableTag, long lookupList) throws IOException { | |||
in.seekSet(lookupList); | |||
// read lookup record count | |||
int nl = in.readTTFUShort(); | |||
@@ -3232,7 +3233,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
* @param lookupList offset to lookup list from beginning of font file | |||
* @throws IOException In case of a I/O problem | |||
*/ | |||
private void readCommonLayoutTables(String tableTag, long scriptList, long featureList, long lookupList) throws IOException { | |||
private void readCommonLayoutTables(TTFTableName tableTag, long scriptList, long featureList, long lookupList) throws IOException { | |||
if ( scriptList > 0 ) { | |||
readScriptList ( tableTag, scriptList ); | |||
} | |||
@@ -3244,7 +3245,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
} | |||
} | |||
private void readGDEFClassDefTable(String tableTag, int lookupSequence, long subtableOffset) throws IOException { | |||
private void readGDEFClassDefTable(TTFTableName tableTag, int lookupSequence, long subtableOffset) throws IOException { | |||
initATSubState(); | |||
in.seekSet(subtableOffset); | |||
// subtable is a bare class definition table | |||
@@ -3256,7 +3257,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
resetATSubState(); | |||
} | |||
private void readGDEFAttachmentTable(String tableTag, int lookupSequence, long subtableOffset) throws IOException { | |||
private void readGDEFAttachmentTable(TTFTableName tableTag, int lookupSequence, long subtableOffset) throws IOException { | |||
initATSubState(); | |||
in.seekSet(subtableOffset); | |||
// read coverage offset | |||
@@ -3274,7 +3275,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
resetATSubState(); | |||
} | |||
private void readGDEFLigatureCaretTable(String tableTag, int lookupSequence, long subtableOffset) throws IOException { | |||
private void readGDEFLigatureCaretTable(TTFTableName tableTag, int lookupSequence, long subtableOffset) throws IOException { | |||
initATSubState(); | |||
in.seekSet(subtableOffset); | |||
// read coverage offset | |||
@@ -3304,7 +3305,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
resetATSubState(); | |||
} | |||
private void readGDEFMarkAttachmentTable(String tableTag, int lookupSequence, long subtableOffset) throws IOException { | |||
private void readGDEFMarkAttachmentTable(TTFTableName tableTag, int lookupSequence, long subtableOffset) throws IOException { | |||
initATSubState(); | |||
in.seekSet(subtableOffset); | |||
// subtable is a bare class definition table | |||
@@ -3316,7 +3317,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
resetATSubState(); | |||
} | |||
private void readGDEFMarkGlyphsTableFormat1(String tableTag, int lookupSequence, long subtableOffset, int subtableFormat) throws IOException { | |||
private void readGDEFMarkGlyphsTableFormat1(TTFTableName tableTag, int lookupSequence, long subtableOffset, int subtableFormat) throws IOException { | |||
initATSubState(); | |||
in.seekSet(subtableOffset); | |||
// skip over format (already known) | |||
@@ -3350,7 +3351,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
resetATSubState(); | |||
} | |||
private void readGDEFMarkGlyphsTable(String tableTag, int lookupSequence, long subtableOffset) throws IOException { | |||
private void readGDEFMarkGlyphsTable(TTFTableName tableTag, int lookupSequence, long subtableOffset) throws IOException { | |||
in.seekSet(subtableOffset); | |||
// read mark set subtable format | |||
int sf = in.readTTFUShort(); | |||
@@ -3366,11 +3367,11 @@ public final class OTFAdvancedTypographicTableReader { | |||
* @throws IOException In case of a I/O problem | |||
*/ | |||
private void readGDEF() throws IOException { | |||
String tableTag = "GDEF"; | |||
TTFTableName tableTag = TTFTableName.GDEF; | |||
// Initialize temporary state | |||
initATState(); | |||
// Read glyph definition (GDEF) table | |||
TTFDirTabEntry dirTab = ttf.getDirectoryEntry ( tableTag ); | |||
TTFDirTabEntry dirTab = ttf.getDirectoryEntry( tableTag ); | |||
if ( gdef != null ) { | |||
if (log.isDebugEnabled()) { | |||
log.debug(tableTag + ": ignoring duplicate table"); | |||
@@ -3439,7 +3440,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
* @throws IOException In case of a I/O problem | |||
*/ | |||
private void readGSUB() throws IOException { | |||
String tableTag = "GSUB"; | |||
TTFTableName tableTag = TTFTableName.GSUB; | |||
// Initialize temporary state | |||
initATState(); | |||
// Read glyph substitution (GSUB) table | |||
@@ -3476,7 +3477,7 @@ public final class OTFAdvancedTypographicTableReader { | |||
* @throws IOException In case of a I/O problem | |||
*/ | |||
private void readGPOS() throws IOException { | |||
String tableTag = "GPOS"; | |||
TTFTableName tableTag = TTFTableName.GPOS; | |||
// Initialize temporary state | |||
initATState(); | |||
// Read glyph positioning (GPOS) table |
@@ -360,7 +360,7 @@ public class IndicScriptProcessor extends DefaultScriptProcessor { | |||
} | |||
/** Abstract syllabizer. */ | |||
protected abstract static class Syllabizer { | |||
protected abstract static class Syllabizer implements Comparable { | |||
private String script; | |||
private String language; | |||
Syllabizer ( String script, String language ) { |
@@ -123,11 +123,17 @@ public abstract class FOEventHandler { | |||
public void endDocument() throws SAXException { | |||
} | |||
/** {@inheritDoc} */ | |||
/** | |||
* Called upon start of root element. | |||
* @param root element | |||
*/ | |||
public void startRoot(Root root) { | |||
} | |||
/** {@inheritDoc} */ | |||
/** | |||
* Called upon end of root element. | |||
* @param root element | |||
*/ | |||
public void endRoot(Root root) { | |||
} | |||
@@ -413,9 +419,9 @@ public abstract class FOEventHandler { | |||
/** | |||
* Process end of a Static. | |||
* @param statisContent StaticContent that is ending | |||
* @param staticContent StaticContent that is ending | |||
*/ | |||
public void endStatic(StaticContent statisContent) { | |||
public void endStatic(StaticContent staticContent) { | |||
} | |||
@@ -26,7 +26,10 @@ import org.apache.fop.fo.Constants; | |||
import org.apache.fop.fo.FONode; | |||
import org.apache.fop.fo.FOText; | |||
import org.apache.fop.fo.FObjMixed; | |||
import org.apache.fop.fo.PropertyList; | |||
import org.apache.fop.fo.ValidationException; | |||
import org.apache.fop.fo.properties.CommonAccessibility; | |||
import org.apache.fop.fo.properties.CommonAccessibilityHolder; | |||
/** | |||
* Class modelling the <a href=http://www.w3.org/TR/xsl/#fo_wrapper"> | |||
@@ -34,13 +37,13 @@ import org.apache.fop.fo.ValidationException; | |||
* The <code>fo:wrapper</code> object serves as a property holder for | |||
* its child node objects. | |||
*/ | |||
public class Wrapper extends FObjMixed { | |||
// The value of properties relevant for fo:wrapper. | |||
// End of property values | |||
public class Wrapper extends FObjMixed implements CommonAccessibilityHolder { | |||
// used for FO validation | |||
private boolean blockOrInlineItemFound = false; | |||
private CommonAccessibility commonAccessibility; | |||
/** | |||
* Create a Wrapper instance that is a child of the | |||
* given {@link FONode} | |||
@@ -51,6 +54,12 @@ public class Wrapper extends FObjMixed { | |||
super(parent); | |||
} | |||
@Override | |||
public void bind(PropertyList pList) throws FOPException { | |||
super.bind(pList); | |||
commonAccessibility = CommonAccessibility.getInstance(pList); | |||
} | |||
@Override | |||
protected void startOfNode() throws FOPException { | |||
super.startOfNode(); | |||
@@ -136,6 +145,10 @@ public class Wrapper extends FObjMixed { | |||
return FO_WRAPPER; | |||
} | |||
public CommonAccessibility getCommonAccessibility() { | |||
return commonAccessibility; | |||
} | |||
@Override | |||
public boolean isDelimitedTextRangeBoundary ( int boundary ) { | |||
return false; |
@@ -26,6 +26,7 @@ import org.apache.fop.fo.Constants; | |||
import org.apache.fop.fo.FObj; | |||
import org.apache.fop.fo.PropertyList; | |||
import org.apache.fop.fo.expr.PropertyException; | |||
import org.apache.fop.util.CompareUtil; | |||
/** | |||
* Superclass for properties that have conditional lengths | |||
@@ -192,8 +193,8 @@ public class CondLengthProperty extends Property implements CompoundDatatype { | |||
if (obj instanceof CondLengthProperty) { | |||
CondLengthProperty clp = (CondLengthProperty)obj; | |||
return (this.length == clp.length | |||
&& this.conditionality == clp.conditionality); | |||
return (CompareUtil.equal(this.length, clp.length) | |||
&& CompareUtil.equal(this.conditionality, clp.conditionality)); | |||
} | |||
return false; | |||
} |
@@ -34,7 +34,7 @@ public class CIDFontType extends ValuedEnum { | |||
/** | |||
* CID Font Type 2 (based on TrueType format) | |||
*/ | |||
public static final CIDFontType CIDTYPE2 = new CIDFontType("CIDFontType2", 1); | |||
public static final CIDFontType CIDTYPE2 = new CIDFontType("CIDFontType2", 2); | |||
/** |
@@ -20,26 +20,49 @@ | |||
package org.apache.fop.fonts; | |||
/** | |||
* This is just a holder class for bfentries, groups of characters of a base font (bf). | |||
* A segment in a cmap table of format 4. Unicode code points between | |||
* {@link #getUnicodeStart()} and {@link #getUnicodeEnd()} map to contiguous glyph indices | |||
* starting from {@link #getGlyphStartIndex()}. | |||
*/ | |||
public class BFEntry { | |||
public final class CMapSegment { | |||
private int unicodeStart; | |||
private int unicodeEnd; | |||
private int glyphStartIndex; | |||
private final int unicodeStart; | |||
private final int unicodeEnd; | |||
private final int glyphStartIndex; | |||
/** | |||
* Main constructor. | |||
* Creates a new segment. | |||
* | |||
* @param unicodeStart Unicode start index | |||
* @param unicodeEnd Unicode end index | |||
* @param glyphStartIndex glyph start index | |||
*/ | |||
public BFEntry(int unicodeStart, int unicodeEnd, int glyphStartIndex) { | |||
public CMapSegment(int unicodeStart, int unicodeEnd, int glyphStartIndex) { | |||
this.unicodeStart = unicodeStart; | |||
this.unicodeEnd = unicodeEnd; | |||
this.glyphStartIndex = glyphStartIndex; | |||
} | |||
@Override | |||
public int hashCode() { | |||
int hc = 17; | |||
hc = 31 * hc + unicodeStart; | |||
hc = 31 * hc + unicodeEnd; | |||
hc = 31 * hc + glyphStartIndex; | |||
return hc; | |||
} | |||
@Override | |||
public boolean equals(Object o) { | |||
if (o instanceof CMapSegment) { | |||
CMapSegment ce = (CMapSegment) o; | |||
return ce.unicodeStart == this.unicodeStart | |||
&& ce.unicodeEnd == this.unicodeEnd | |||
&& ce.glyphStartIndex == this.glyphStartIndex; | |||
} | |||
return false; | |||
} | |||
/** | |||
* Returns the unicodeStart. | |||
* @return the Unicode start index | |||
@@ -67,7 +90,7 @@ public class BFEntry { | |||
/** {@inheritDoc} */ | |||
@Override | |||
public String toString() { | |||
StringBuilder sb = new StringBuilder("BFEntry: "); | |||
StringBuilder sb = new StringBuilder("CMapSegment: "); | |||
sb.append ( "{ UC[" ); | |||
sb.append ( unicodeStart ); | |||
sb.append ( ',' ); |
@@ -42,6 +42,7 @@ public abstract class CustomFont extends Typeface | |||
private String embedFileName = null; | |||
private String embedResourceName = null; | |||
private FontResolver resolver = null; | |||
private EmbeddingMode embeddingMode = EmbeddingMode.AUTO; | |||
private int capHeight = 0; | |||
private int xHeight = 0; | |||
@@ -62,6 +63,9 @@ public abstract class CustomFont extends Typeface | |||
private boolean useKerning = true; | |||
private boolean useAdvanced = true; | |||
/** the character map, mapping Unicode ranges to glyph indices. */ | |||
protected CMapSegment[] cmap; | |||
/** {@inheritDoc} */ | |||
public String getFontName() { | |||
return fontName; | |||
@@ -111,6 +115,14 @@ public abstract class CustomFont extends Typeface | |||
return embedFileName; | |||
} | |||
/** | |||
* Returns the embedding mode for this font. | |||
* @return embedding mode | |||
*/ | |||
public EmbeddingMode getEmbeddingMode() { | |||
return embeddingMode; | |||
} | |||
/** | |||
* Returns a Source representing an embeddable font file. | |||
* @return Source for an embeddable font file | |||
@@ -334,6 +346,13 @@ public abstract class CustomFont extends Typeface | |||
this.embedResourceName = name; | |||
} | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public void setEmbeddingMode(EmbeddingMode embeddingMode) { | |||
this.embeddingMode = embeddingMode; | |||
} | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
@@ -473,4 +492,25 @@ public abstract class CustomFont extends Typeface | |||
} | |||
} | |||
/** | |||
* Sets the character map for this font. It maps all available Unicode characters | |||
* to their glyph indices inside the font. | |||
* @param cmap the character map | |||
*/ | |||
public void setCMap(CMapSegment[] cmap) { | |||
this.cmap = new CMapSegment[cmap.length]; | |||
System.arraycopy(cmap, 0, this.cmap, 0, cmap.length); | |||
} | |||
/** | |||
* Returns the character map for this font. It maps all available Unicode characters | |||
* to their glyph indices inside the font. | |||
* @return the character map | |||
*/ | |||
public CMapSegment[] getCMap() { | |||
CMapSegment[] copy = new CMapSegment[cmap.length]; | |||
System.arraycopy(this.cmap, 0, copy, 0, this.cmap.length); | |||
return copy; | |||
} | |||
} |
@@ -72,7 +72,7 @@ public class CustomFontCollection implements FontCollection { | |||
List<FontTriplet> triplets = embedFontInfo.getFontTriplets(); | |||
for (int tripletIndex = 0; tripletIndex < triplets.size(); tripletIndex++) { | |||
FontTriplet triplet = (FontTriplet) triplets.get(tripletIndex); | |||
FontTriplet triplet = triplets.get(tripletIndex); | |||
fontInfo.addFontProperties(internalName, triplet); | |||
} | |||
} |
@@ -25,6 +25,8 @@ import java.util.List; | |||
/** | |||
* FontInfo contains meta information on fonts (where is the metrics file etc.) | |||
* TODO: We need to remove this class and think about more intelligent design patterns | |||
* (Data classes => Procedural code) | |||
*/ | |||
public class EmbedFontInfo implements Serializable { | |||
@@ -41,6 +43,8 @@ public class EmbedFontInfo implements Serializable { | |||
protected boolean advanced; | |||
/** the requested encoding mode for the font */ | |||
protected EncodingMode encodingMode = EncodingMode.AUTO; | |||
/** the requested embedding mode for this font */ | |||
protected EmbeddingMode embeddingMode = EmbeddingMode.AUTO; | |||
/** the PostScript name of the font */ | |||
protected String postScriptName = null; | |||
@@ -148,6 +152,14 @@ public class EmbedFontInfo implements Serializable { | |||
} | |||
} | |||
/** | |||
* Returns the embedding mode for this font. | |||
* @return the embedding mode. | |||
*/ | |||
public EmbeddingMode getEmbeddingMode() { | |||
return embeddingMode; | |||
} | |||
/** | |||
* Defines whether the font is embedded or not. | |||
* @param value true to embed the font, false to reference it | |||
@@ -175,6 +187,17 @@ public class EmbedFontInfo implements Serializable { | |||
this.encodingMode = mode; | |||
} | |||
/** | |||
* Sets the embedding mode for this font, currently not supported for Type 1 fonts. | |||
* @param embeddingMode the new embedding mode. | |||
*/ | |||
public void setEmbeddingMode(EmbeddingMode embeddingMode) { | |||
if (embeddingMode == null) { | |||
throw new NullPointerException("embeddingMode must not be null"); | |||
} | |||
this.embeddingMode = embeddingMode; | |||
} | |||
private void readObject(java.io.ObjectInputStream in) | |||
throws IOException, ClassNotFoundException { | |||
in.defaultReadObject(); |
@@ -0,0 +1,58 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You 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. | |||
*/ | |||
/* $Id$ */ | |||
package org.apache.fop.fonts; | |||
import java.util.Locale; | |||
/** | |||
* This enumerates the embedding mode of fonts; full; subset; auto (auto defaults to full for | |||
* Type 1 fonts and subset for TrueType fonts. | |||
*/ | |||
public enum EmbeddingMode { | |||
/** Default option: assumes FULL for Type 1 fonts and SUBSET for TrueType fonts. */ | |||
AUTO, | |||
/** Full font embedding: This means the whole of the font is written to file. */ | |||
FULL, | |||
/** Subset font embedding: Only the mandatory tables and a subset of glyphs are written | |||
* to file.*/ | |||
SUBSET; | |||
/** | |||
* Returns the name of this embedding mode. | |||
* @return the name of this embedding mode in lower case. | |||
*/ | |||
public String getName() { | |||
return this.toString().toLowerCase(Locale.ENGLISH); | |||
} | |||
/** | |||
* Returns the embedding mode corresponding to the given name. | |||
* @param value the name of an embedding mode (not case sensitive) | |||
* @return the corresponding embedding mode | |||
*/ | |||
public static EmbeddingMode getValue(String value) { | |||
for (EmbeddingMode mode : EmbeddingMode.values()) { | |||
if (mode.toString().equalsIgnoreCase(value)) { | |||
return mode; | |||
} | |||
} | |||
throw new IllegalArgumentException("Invalid embedding-mode: " + value); | |||
} | |||
} |
@@ -52,7 +52,7 @@ public enum EncodingMode { | |||
* @param name the name of the encoding mode to look up | |||
* @return the encoding mode constant | |||
*/ | |||
public static EncodingMode getEncodingMode(String name) { | |||
public static EncodingMode getValue(String name) { | |||
for (EncodingMode em : EncodingMode.values()) { | |||
if (name.equalsIgnoreCase(em.getName())) { | |||
return em; |
@@ -254,12 +254,16 @@ public class FontInfoConfigurator { | |||
boolean useKerning = fontCfg.getAttributeAsBoolean("kerning", true); | |||
boolean useAdvanced = fontCfg.getAttributeAsBoolean("advanced", true); | |||
EncodingMode encodingMode = EncodingMode.getEncodingMode( | |||
EncodingMode encodingMode = EncodingMode.getValue( | |||
fontCfg.getAttribute("encoding-mode", EncodingMode.AUTO.getName())); | |||
EmbeddingMode embeddingMode = EmbeddingMode.getValue( | |||
fontCfg.getAttribute("embedding-mode", EmbeddingMode.AUTO.toString())); | |||
EmbedFontInfo embedFontInfo | |||
= new EmbedFontInfo(metricsUrl, useKerning, useAdvanced, tripletList, embedUrl, | |||
subFont); | |||
embedFontInfo.setEncodingMode(encodingMode); | |||
embedFontInfo.setEmbeddingMode(embeddingMode); | |||
boolean skipCachedFont = false; | |||
if (fontCache != null) { | |||
if (!fontCache.containsFont(embedFontInfo)) { |
@@ -85,15 +85,17 @@ public abstract class FontLoader { | |||
* @param fontFile the File representation of the font | |||
* @param subFontName the sub-fontname of a font (for TrueType Collections, null otherwise) | |||
* @param embedded indicates whether the font is embedded or referenced | |||
* @param embeddingMode the embedding mode | |||
* @param encodingMode the requested encoding mode | |||
* @param resolver the font resolver to use when resolving URIs | |||
* @return the newly loaded font | |||
* @throws IOException In case of an I/O error | |||
*/ | |||
public static CustomFont loadFont(File fontFile, String subFontName, | |||
boolean embedded, EncodingMode encodingMode, FontResolver resolver) throws IOException { | |||
boolean embedded, EmbeddingMode embeddingMode, EncodingMode encodingMode, | |||
FontResolver resolver) throws IOException { | |||
return loadFont(fontFile.toURI().toURL(), subFontName, | |||
embedded, encodingMode, resolver); | |||
embedded, embeddingMode, encodingMode, resolver); | |||
} | |||
/** | |||
@@ -101,16 +103,17 @@ public abstract class FontLoader { | |||
* @param fontUrl the URL representation of the font | |||
* @param subFontName the sub-fontname of a font (for TrueType Collections, null otherwise) | |||
* @param embedded indicates whether the font is embedded or referenced | |||
* @param embeddingMode the embedding mode of the font | |||
* @param encodingMode the requested encoding mode | |||
* @param resolver the font resolver to use when resolving URIs | |||
* @return the newly loaded font | |||
* @throws IOException In case of an I/O error | |||
*/ | |||
public static CustomFont loadFont(URL fontUrl, String subFontName, | |||
boolean embedded, EncodingMode encodingMode, | |||
boolean embedded, EmbeddingMode embeddingMode, EncodingMode encodingMode, | |||
FontResolver resolver) throws IOException { | |||
return loadFont(fontUrl.toExternalForm(), subFontName, | |||
embedded, encodingMode, true, true, | |||
embedded, embeddingMode, encodingMode, true, true, | |||
resolver); | |||
} | |||
@@ -119,6 +122,7 @@ public abstract class FontLoader { | |||
* @param fontFileURI the URI to the font | |||
* @param subFontName the sub-fontname of a font (for TrueType Collections, null otherwise) | |||
* @param embedded indicates whether the font is embedded or referenced | |||
* @param embeddingMode the embedding mode of the font | |||
* @param encodingMode the requested encoding mode | |||
* @param useKerning indicates whether kerning information should be loaded if available | |||
* @param useAdvanced indicates whether advanced typographic information shall be loaded if | |||
@@ -128,8 +132,8 @@ public abstract class FontLoader { | |||
* @throws IOException In case of an I/O error | |||
*/ | |||
public static CustomFont loadFont(String fontFileURI, String subFontName, | |||
boolean embedded, EncodingMode encodingMode, boolean useKerning, | |||
boolean useAdvanced, FontResolver resolver) throws IOException { | |||
boolean embedded, EmbeddingMode embeddingMode, EncodingMode encodingMode, | |||
boolean useKerning, boolean useAdvanced, FontResolver resolver) throws IOException { | |||
fontFileURI = fontFileURI.trim(); | |||
boolean type1 = isType1(fontFileURI); | |||
FontLoader loader; | |||
@@ -138,10 +142,14 @@ public abstract class FontLoader { | |||
throw new IllegalArgumentException( | |||
"CID encoding mode not supported for Type 1 fonts"); | |||
} | |||
if (embeddingMode == EmbeddingMode.SUBSET) { | |||
throw new IllegalArgumentException( | |||
"Subset embedding for Type 1 fonts is not supported"); | |||
} | |||
loader = new Type1FontLoader(fontFileURI, embedded, useKerning, resolver); | |||
} else { | |||
loader = new TTFFontLoader(fontFileURI, subFontName, | |||
embedded, encodingMode, useKerning, useAdvanced, resolver); | |||
embedded, embeddingMode, encodingMode, useKerning, useAdvanced, resolver); | |||
} | |||
return loader.getFont(); | |||
} |
@@ -64,7 +64,7 @@ public class FontReader extends DefaultHandler { | |||
private Map<Integer, Integer> currentKerning = null; | |||
private List<BFEntry> bfranges = null; | |||
private List<CMapSegment> bfranges = null; | |||
private void createFont(InputSource source) throws FOPException { | |||
XMLReader parser = null; | |||
@@ -154,12 +154,14 @@ public class FontReader extends DefaultHandler { | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
@Override | |||
public void startDocument() { | |||
} | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
@Override | |||
public void setDocumentLocator(Locator locator) { | |||
// this.locator = locator; // not used at present | |||
} | |||
@@ -167,6 +169,7 @@ public class FontReader extends DefaultHandler { | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
@Override | |||
public void startElement(String uri, String localName, String qName, | |||
Attributes attributes) throws SAXException { | |||
if (localName.equals("font-metrics")) { | |||
@@ -198,9 +201,9 @@ public class FontReader extends DefaultHandler { | |||
returnFont.putKerningEntry(new Integer(attributes.getValue("kpx1")), | |||
currentKerning); | |||
} else if ("bfranges".equals(localName)) { | |||
bfranges = new ArrayList<BFEntry>(); | |||
bfranges = new ArrayList<CMapSegment>(); | |||
} else if ("bf".equals(localName)) { | |||
BFEntry entry = new BFEntry(getInt(attributes.getValue("us")), | |||
CMapSegment entry = new CMapSegment(getInt(attributes.getValue("us")), | |||
getInt(attributes.getValue("ue")), | |||
getInt(attributes.getValue("gi"))); | |||
bfranges.add(entry); | |||
@@ -236,6 +239,7 @@ public class FontReader extends DefaultHandler { | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
@Override | |||
public void endElement(String uri, String localName, String qName) throws SAXException { | |||
String content = text.toString().trim(); | |||
if ("font-name".equals(localName)) { | |||
@@ -303,7 +307,7 @@ public class FontReader extends DefaultHandler { | |||
multiFont.setWidthArray(wds); | |||
} else if ("bfranges".equals(localName)) { | |||
multiFont.setBFEntries(bfranges.toArray(new BFEntry[0])); | |||
multiFont.setCMap(bfranges.toArray(new CMapSegment[0])); | |||
} | |||
text.setLength(0); //Reset text buffer (see characters()) | |||
} | |||
@@ -311,6 +315,7 @@ public class FontReader extends DefaultHandler { | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
@Override | |||
public void characters(char[] ch, int start, int length) { | |||
text.append(ch, start, length); | |||
} |
@@ -130,4 +130,9 @@ public class FontType { | |||
return value; | |||
} | |||
@Override | |||
public String toString() { | |||
return name; | |||
} | |||
} |
@@ -36,7 +36,6 @@ import org.apache.fop.apps.FOPException; | |||
import org.apache.fop.complexscripts.fonts.Positionable; | |||
import org.apache.fop.complexscripts.fonts.Substitutable; | |||
/** | |||
* This class is used to defer the loading of a font until it is really used. | |||
*/ | |||
@@ -49,7 +48,8 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable, | |||
private boolean useKerning; | |||
private boolean useAdvanced; | |||
private EncodingMode encodingMode = EncodingMode.AUTO; | |||
private boolean embedded; | |||
private EmbeddingMode embeddingMode = EmbeddingMode.AUTO; | |||
private boolean embedded = true; | |||
private String subFontName; | |||
private boolean isMetricsLoaded; | |||
@@ -74,6 +74,7 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable, | |||
this.useAdvanced = fontInfo.getAdvanced(); | |||
} | |||
this.encodingMode = fontInfo.getEncodingMode(); | |||
this.embeddingMode = fontInfo.getEmbeddingMode(); | |||
this.subFontName = fontInfo.getSubFontName(); | |||
this.embedded = fontInfo.isEmbedded(); | |||
this.resolver = resolver; | |||
@@ -147,8 +148,9 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable, | |||
if (fontEmbedPath == null) { | |||
throw new RuntimeException("Cannot load font. No font URIs available."); | |||
} | |||
realFont = FontLoader.loadFont(fontEmbedPath, this.subFontName, | |||
this.embedded, this.encodingMode, useKerning, useAdvanced, resolver); | |||
realFont = FontLoader.loadFont(fontEmbedPath, subFontName, | |||
embedded, embeddingMode, encodingMode, | |||
useKerning, useAdvanced, resolver); | |||
} | |||
if (realFont instanceof FontDescriptor) { | |||
realFontDescriptor = (FontDescriptor) realFont; |
@@ -51,14 +51,6 @@ public class MultiByteFont extends CIDFont implements Substitutable, Positionabl | |||
private CIDSubset subset = new CIDSubset(); | |||
/** | |||
* A map from Unicode indices to glyph indices. No assumption | |||
* about ordering is made below. If lookup is changed to a binary | |||
* search (from the current linear search), then addPrivateUseMapping() | |||
* needs to be changed to perform ordered inserts. | |||
*/ | |||
private BFEntry[] bfentries = null; | |||
/* advanced typographic support */ | |||
private GlyphDefinitionTable gdef; | |||
private GlyphSubstitutionTable gsub; | |||
@@ -82,26 +74,31 @@ public class MultiByteFont extends CIDFont implements Substitutable, Positionabl | |||
} | |||
/** {@inheritDoc} */ | |||
@Override | |||
public int getDefaultWidth() { | |||
return defaultWidth; | |||
} | |||
/** {@inheritDoc} */ | |||
@Override | |||
public String getRegistry() { | |||
return "Adobe"; | |||
} | |||
/** {@inheritDoc} */ | |||
@Override | |||
public String getOrdering() { | |||
return "UCS"; | |||
} | |||
/** {@inheritDoc} */ | |||
@Override | |||
public int getSupplement() { | |||
return 0; | |||
} | |||
/** {@inheritDoc} */ | |||
@Override | |||
public CIDFontType getCIDType() { | |||
return cidType; | |||
} | |||
@@ -115,6 +112,7 @@ public class MultiByteFont extends CIDFont implements Substitutable, Positionabl | |||
} | |||
/** {@inheritDoc} */ | |||
@Override | |||
public String getEmbedFontName() { | |||
if (isEmbeddable()) { | |||
return FontUtil.stripWhiteSpace(super.getFontName()); | |||
@@ -128,17 +126,18 @@ public class MultiByteFont extends CIDFont implements Substitutable, Positionabl | |||
return !(getEmbedFileName() == null && getEmbedResourceName() == null); | |||
} | |||
/** {@inheritDoc} */ | |||
public boolean isSubsetEmbedded() { | |||
return true; | |||
} | |||
/** {@inheritDoc} */ | |||
@Override | |||
public CIDSubset getCIDSubset() { | |||
return this.subset; | |||
} | |||
/** {@inheritDoc} */ | |||
@Override | |||
public String getEncodingName() { | |||
return encoding; | |||
} | |||
@@ -171,30 +170,30 @@ public class MultiByteFont extends CIDFont implements Substitutable, Positionabl | |||
int idx = c; | |||
int retIdx = SingleByteEncoding.NOT_FOUND_CODE_POINT; | |||
for (int i = 0; (i < bfentries.length) && retIdx == 0; i++) { | |||
if (bfentries[i].getUnicodeStart() <= idx | |||
&& bfentries[i].getUnicodeEnd() >= idx) { | |||
for (int i = 0; (i < cmap.length) && retIdx == 0; i++) { | |||
if (cmap[i].getUnicodeStart() <= idx | |||
&& cmap[i].getUnicodeEnd() >= idx) { | |||
retIdx = bfentries[i].getGlyphStartIndex() | |||
retIdx = cmap[i].getGlyphStartIndex() | |||
+ idx | |||
- bfentries[i].getUnicodeStart(); | |||
- cmap[i].getUnicodeStart(); | |||
} | |||
} | |||
return retIdx; | |||
} | |||
/** | |||
* Add a private use mapping {PU,GI} to the existing BFENTRIES map. | |||
* Add a private use mapping {PU,GI} to the existing character map. | |||
* N.B. Does not insert in order, merely appends to end of existing map. | |||
*/ | |||
private synchronized void addPrivateUseMapping ( int pu, int gi ) { | |||
assert findGlyphIndex ( pu ) == SingleByteEncoding.NOT_FOUND_CODE_POINT; | |||
BFEntry[] bfeOld = bfentries; | |||
int bfeCnt = bfeOld.length; | |||
BFEntry[] bfeNew = new BFEntry [ bfeCnt + 1 ]; | |||
System.arraycopy ( bfeOld, 0, bfeNew, 0, bfeCnt ); | |||
bfeNew [ bfeCnt ] = new BFEntry ( pu, pu, gi ); | |||
bfentries = bfeNew; | |||
CMapSegment[] oldCmap = cmap; | |||
int cmapLength = oldCmap.length; | |||
CMapSegment[] newCmap = new CMapSegment [ cmapLength + 1 ]; | |||
System.arraycopy ( oldCmap, 0, newCmap, 0, cmapLength ); | |||
newCmap [ cmapLength ] = new CMapSegment ( pu, pu, gi ); | |||
cmap = newCmap; | |||
} | |||
/** | |||
@@ -252,12 +251,12 @@ public class MultiByteFont extends CIDFont implements Substitutable, Positionabl | |||
// [TBD] - needs optimization, i.e., change from linear search to binary search | |||
private int findCharacterFromGlyphIndex ( int gi, boolean augment ) { | |||
int cc = 0; | |||
for ( int i = 0, n = bfentries.length; i < n; i++ ) { | |||
BFEntry be = bfentries [ i ]; | |||
int s = be.getGlyphStartIndex(); | |||
int e = s + ( be.getUnicodeEnd() - be.getUnicodeStart() ); | |||
for ( int i = 0, n = cmap.length; i < n; i++ ) { | |||
CMapSegment segment = cmap [ i ]; | |||
int s = segment.getGlyphStartIndex(); | |||
int e = s + ( segment.getUnicodeEnd() - segment.getUnicodeStart() ); | |||
if ( ( gi >= s ) && ( gi <= e ) ) { | |||
cc = be.getUnicodeStart() + ( gi - s ); | |||
cc = segment.getUnicodeStart() + ( gi - s ); | |||
break; | |||
} | |||
} | |||
@@ -273,6 +272,7 @@ public class MultiByteFont extends CIDFont implements Substitutable, Positionabl | |||
/** {@inheritDoc} */ | |||
@Override | |||
public char mapChar(char c) { | |||
notifyMapOperation(); | |||
int glyphIndex = findGlyphIndex(c); | |||
@@ -287,19 +287,11 @@ public class MultiByteFont extends CIDFont implements Substitutable, Positionabl | |||
} | |||
/** {@inheritDoc} */ | |||
@Override | |||
public boolean hasChar(char c) { | |||
return (findGlyphIndex(c) != SingleByteEncoding.NOT_FOUND_CODE_POINT); | |||
} | |||
/** | |||
* Sets the array of BFEntry instances which constitutes the Unicode to glyph index map for | |||
* a font. ("BF" means "base font") | |||
* @param entries the Unicode to glyph index map | |||
*/ | |||
public void setBFEntries(BFEntry[] entries) { | |||
this.bfentries = entries; | |||
} | |||
/** | |||
* Sets the defaultWidth. | |||
* @param defaultWidth The defaultWidth to set |
@@ -60,6 +60,12 @@ public interface MutableFont { | |||
*/ | |||
void setEmbedResourceName(String name); | |||
/** | |||
* Sets the embedding mode. | |||
* @param embeddingMode the embedding mode | |||
*/ | |||
void setEmbeddingMode(EmbeddingMode embeddingMode); | |||
/** | |||
* Sets the capital height value. | |||
* @param capHeight capital height |
@@ -31,6 +31,8 @@ import org.apache.commons.logging.LogFactory; | |||
import org.apache.xmlgraphics.fonts.Glyphs; | |||
import org.apache.fop.fonts.truetype.TTFFile.PostScriptVersion; | |||
/** | |||
* Generic SingleByte font | |||
*/ | |||
@@ -48,6 +50,7 @@ public class SingleByteFont extends CustomFont { | |||
private List<SimpleSingleByteEncoding> additionalEncodings; | |||
private Map<Character, Character> alternativeCodes; | |||
private PostScriptVersion ttPostScriptVersion; | |||
/** | |||
* Main constructor. | |||
@@ -397,5 +400,26 @@ public class SingleByteFont extends CustomFont { | |||
} | |||
} | |||
/** | |||
* Sets the version of the PostScript table stored in the TrueType font represented by | |||
* this instance. | |||
* | |||
* @param version version of the <q>post</q> table | |||
*/ | |||
public void setTrueTypePostScriptVersion(PostScriptVersion version) { | |||
ttPostScriptVersion = version; | |||
} | |||
/** | |||
* Returns the version of the PostScript table stored in the TrueType font represented by | |||
* this instance. | |||
* | |||
* @return the version of the <q>post</q> table | |||
*/ | |||
public PostScriptVersion getTrueTypePostScriptVersion() { | |||
assert getFontType() == FontType.TRUETYPE; | |||
return ttPostScriptVersion; | |||
} | |||
} | |||
@@ -20,7 +20,6 @@ | |||
package org.apache.fop.fonts.apps; | |||
import java.io.IOException; | |||
import java.util.Iterator; | |||
import java.util.Map; | |||
import java.util.Set; | |||
@@ -34,9 +33,9 @@ import org.xml.sax.SAXException; | |||
import org.apache.commons.logging.LogFactory; | |||
import org.apache.fop.Version; | |||
import org.apache.fop.fonts.CMapSegment; | |||
import org.apache.fop.fonts.FontUtil; | |||
import org.apache.fop.fonts.truetype.FontFileReader; | |||
import org.apache.fop.fonts.truetype.TTFCmapEntry; | |||
import org.apache.fop.fonts.truetype.TTFFile; | |||
import org.apache.fop.util.CommandLineLogger; | |||
@@ -288,9 +287,9 @@ public class TTFReader extends AbstractFontReader { | |||
root.appendChild(el); | |||
el.appendChild(doc.createTextNode(ttf.getFullName())); | |||
} | |||
Set familyNames = ttf.getFamilyNames(); | |||
Set<String> familyNames = ttf.getFamilyNames(); | |||
if (familyNames.size() > 0) { | |||
String familyName = (String)familyNames.iterator().next(); | |||
String familyName = familyNames.iterator().next(); | |||
el = doc.createElement("family-name"); | |||
root.appendChild(el); | |||
el.appendChild(doc.createTextNode(familyName)); | |||
@@ -386,9 +385,7 @@ public class TTFReader extends AbstractFontReader { | |||
el = doc.createElement("bfranges"); | |||
mel.appendChild(el); | |||
Iterator iter = ttf.getCMaps().listIterator(); | |||
while (iter.hasNext()) { | |||
TTFCmapEntry ce = (TTFCmapEntry)iter.next(); | |||
for (CMapSegment ce : ttf.getCMaps()) { | |||
Element el2 = doc.createElement("bf"); | |||
el.appendChild(el2); | |||
el2.setAttribute("us", String.valueOf(ce.getUnicodeStart())); | |||
@@ -443,31 +440,28 @@ public class TTFReader extends AbstractFontReader { | |||
Document doc = parent.getOwnerDocument(); | |||
// Get kerning | |||
Iterator iter; | |||
Set<Integer> kerningKeys; | |||
if (isCid) { | |||
iter = ttf.getKerning().keySet().iterator(); | |||
kerningKeys = ttf.getKerning().keySet(); | |||
} else { | |||
iter = ttf.getAnsiKerning().keySet().iterator(); | |||
kerningKeys = ttf.getAnsiKerning().keySet(); | |||
} | |||
while (iter.hasNext()) { | |||
Integer kpx1 = (Integer)iter.next(); | |||
for (Integer kpx1 : kerningKeys) { | |||
el = doc.createElement("kerning"); | |||
el.setAttribute("kpx1", kpx1.toString()); | |||
parent.appendChild(el); | |||
Element el2 = null; | |||
Map h2; | |||
Map<Integer, Integer> h2; | |||
if (isCid) { | |||
h2 = (Map)ttf.getKerning().get(kpx1); | |||
h2 = ttf.getKerning().get(kpx1); | |||
} else { | |||
h2 = (Map)ttf.getAnsiKerning().get(kpx1); | |||
h2 = ttf.getAnsiKerning().get(kpx1); | |||
} | |||
Iterator iter2 = h2.keySet().iterator(); | |||
while (iter2.hasNext()) { | |||
Integer kpx2 = (Integer)iter2.next(); | |||
for (Integer kpx2 : h2.keySet()) { | |||
if (isCid || kpx2.intValue() < 256) { | |||
el2 = doc.createElement("pair"); | |||
el2.setAttribute("kpx2", kpx2.toString()); |
@@ -32,6 +32,7 @@ import org.apache.commons.logging.LogFactory; | |||
import org.apache.fop.fonts.CustomFont; | |||
import org.apache.fop.fonts.EmbedFontInfo; | |||
import org.apache.fop.fonts.EmbeddingMode; | |||
import org.apache.fop.fonts.EncodingMode; | |||
import org.apache.fop.fonts.Font; | |||
import org.apache.fop.fonts.FontCache; | |||
@@ -222,7 +223,7 @@ public class FontInfoFinder { | |||
} | |||
try { | |||
TTFFontLoader ttfLoader = new TTFFontLoader( | |||
fontFileURL, fontName, true, EncodingMode.AUTO, | |||
fontFileURL, fontName, true, EmbeddingMode.AUTO, EncodingMode.AUTO, | |||
useKerning, useAdvanced, resolver); | |||
customFont = ttfLoader.getFont(); | |||
if (this.eventListener != null) { | |||
@@ -247,7 +248,8 @@ public class FontInfoFinder { | |||
} else { | |||
// The normal case | |||
try { | |||
customFont = FontLoader.loadFont(fontURL, null, true, EncodingMode.AUTO, resolver); | |||
customFont = FontLoader.loadFont(fontURL, null, true, EmbeddingMode.AUTO, | |||
EncodingMode.AUTO, resolver); | |||
if (this.eventListener != null) { | |||
customFont.setEventListener(this.eventListener); | |||
} |
@@ -89,16 +89,6 @@ public class FontFileReader { | |||
current = (int)offset; | |||
} | |||
/** | |||
* Set current file position to offset | |||
* | |||
* @param add The number of bytes to advance | |||
* @throws IOException In case of an I/O problem | |||
*/ | |||
public void seekAdd(long add) throws IOException { | |||
seekSet(current + add); | |||
} | |||
/** | |||
* Skip a given number of bytes. | |||
* | |||
@@ -106,7 +96,7 @@ public class FontFileReader { | |||
* @throws IOException In case of an I/O problem | |||
*/ | |||
public void skip(long add) throws IOException { | |||
seekAdd(add); | |||
seekSet(current + add); | |||
} | |||
/** | |||
@@ -133,7 +123,7 @@ public class FontFileReader { | |||
* @return One byte | |||
* @throws IOException If EOF is reached | |||
*/ | |||
public byte read() throws IOException { | |||
private byte read() throws IOException { | |||
if (current >= fsize) { | |||
throw new java.io.EOFException("Reached EOF, file size=" + fsize); | |||
} | |||
@@ -278,14 +268,14 @@ public class FontFileReader { | |||
public final String readTTFString() throws IOException { | |||
int i = current; | |||
while (file[i++] != 0) { | |||
if (i > fsize) { | |||
if (i >= fsize) { | |||
throw new java.io.EOFException("Reached EOF, file size=" | |||
+ fsize); | |||
} | |||
} | |||
byte[] tmp = new byte[i - current]; | |||
System.arraycopy(file, current, tmp, 0, i - current); | |||
byte[] tmp = new byte[i - current - 1]; | |||
System.arraycopy(file, current, tmp, 0, i - current - 1); | |||
return new String(tmp, "ISO-8859-1"); | |||
} | |||
@@ -353,6 +343,11 @@ public class FontFileReader { | |||
System.arraycopy(file, offset, ret, 0, length); | |||
return ret; | |||
} | |||
/** | |||
* Returns the full byte array representation of the file. | |||
* @return byte array. | |||
*/ | |||
public byte[] getAllBytes() { | |||
return file; | |||
} | |||
} |
@@ -1,118 +0,0 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You 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. | |||
*/ | |||
/* $Id$ */ | |||
package org.apache.fop.fonts.truetype; | |||
/** | |||
* The CMap entry contains information of a Unicode range and the | |||
* the glyph indexes related to the range | |||
*/ | |||
public class TTFCmapEntry { | |||
private int unicodeStart; | |||
private int unicodeEnd; | |||
private int glyphStartIndex; | |||
TTFCmapEntry() { | |||
unicodeStart = 0; | |||
unicodeEnd = 0; | |||
glyphStartIndex = 0; | |||
} | |||
TTFCmapEntry(int unicodeStart, int unicodeEnd, int glyphStartIndex) { | |||
this.unicodeStart = unicodeStart; | |||
this.unicodeEnd = unicodeEnd; | |||
this.glyphStartIndex = glyphStartIndex; | |||
} | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public int hashCode() { | |||
int hc = super.hashCode(); | |||
hc ^= ( hc * 11 ) + unicodeStart; | |||
hc ^= ( hc * 19 ) + unicodeEnd; | |||
hc ^= ( hc * 23 ) + glyphStartIndex; | |||
return hc; | |||
} | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public boolean equals(Object o) { | |||
if (o instanceof TTFCmapEntry) { | |||
TTFCmapEntry ce = (TTFCmapEntry)o; | |||
if (ce.unicodeStart == this.unicodeStart | |||
&& ce.unicodeEnd == this.unicodeEnd | |||
&& ce.glyphStartIndex == this.glyphStartIndex) { | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
/** | |||
* Returns the glyphStartIndex. | |||
* @return int | |||
*/ | |||
public int getGlyphStartIndex() { | |||
return glyphStartIndex; | |||
} | |||
/** | |||
* Returns the unicodeEnd. | |||
* @return int | |||
*/ | |||
public int getUnicodeEnd() { | |||
return unicodeEnd; | |||
} | |||
/** | |||
* Returns the unicodeStart. | |||
* @return int | |||
*/ | |||
public int getUnicodeStart() { | |||
return unicodeStart; | |||
} | |||
/** | |||
* Sets the glyphStartIndex. | |||
* @param glyphStartIndex The glyphStartIndex to set | |||
*/ | |||
public void setGlyphStartIndex(int glyphStartIndex) { | |||
this.glyphStartIndex = glyphStartIndex; | |||
} | |||
/** | |||
* Sets the unicodeEnd. | |||
* @param unicodeEnd The unicodeEnd to set | |||
*/ | |||
public void setUnicodeEnd(int unicodeEnd) { | |||
this.unicodeEnd = unicodeEnd; | |||
} | |||
/** | |||
* Sets the unicodeStart. | |||
* @param unicodeStart The unicodeStart to set | |||
*/ | |||
public void setUnicodeStart(int unicodeStart) { | |||
this.unicodeStart = unicodeStart; | |||
} | |||
} |
@@ -33,6 +33,14 @@ public class TTFDirTabEntry { | |||
private long offset; | |||
private long length; | |||
public TTFDirTabEntry() { | |||
} | |||
public TTFDirTabEntry(long offset, long length) { | |||
this.offset = offset; | |||
this.length = length; | |||
} | |||
/** | |||
* Read Dir Tab. | |||
* @param in font file reader |
@@ -21,17 +21,14 @@ package org.apache.fop.fonts.truetype; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Set; | |||
import org.apache.commons.io.IOUtils; | |||
import org.apache.xmlgraphics.fonts.Glyphs; | |||
import org.apache.fop.fonts.BFEntry; | |||
import org.apache.fop.fonts.CIDFontType; | |||
import org.apache.fop.fonts.CMapSegment; | |||
import org.apache.fop.fonts.EmbeddingMode; | |||
import org.apache.fop.fonts.EncodingMode; | |||
import org.apache.fop.fonts.FontLoader; | |||
import org.apache.fop.fonts.FontResolver; | |||
@@ -39,6 +36,8 @@ import org.apache.fop.fonts.FontType; | |||
import org.apache.fop.fonts.MultiByteFont; | |||
import org.apache.fop.fonts.NamedCharacter; | |||
import org.apache.fop.fonts.SingleByteFont; | |||
import org.apache.fop.fonts.truetype.TTFFile.PostScriptVersion; | |||
import org.apache.fop.util.HexEncoder; | |||
/** | |||
* Loads a TrueType font into memory directly from the original font file. | |||
@@ -49,6 +48,7 @@ public class TTFFontLoader extends FontLoader { | |||
private SingleByteFont singleFont; | |||
private final String subFontName; | |||
private EncodingMode encodingMode; | |||
private EmbeddingMode embeddingMode; | |||
/** | |||
* Default constructor | |||
@@ -56,7 +56,7 @@ public class TTFFontLoader extends FontLoader { | |||
* @param resolver the FontResolver for font URI resolution | |||
*/ | |||
public TTFFontLoader(String fontFileURI, FontResolver resolver) { | |||
this(fontFileURI, null, true, EncodingMode.AUTO, true, true, resolver); | |||
this(fontFileURI, null, true, EmbeddingMode.AUTO, EncodingMode.AUTO, true, true, resolver); | |||
} | |||
/** | |||
@@ -65,24 +65,28 @@ public class TTFFontLoader extends FontLoader { | |||
* @param subFontName the sub-fontname of a font in a TrueType Collection (or null for normal | |||
* TrueType fonts) | |||
* @param embedded indicates whether the font is embedded or referenced | |||
* @param embeddingMode the embedding mode of the font | |||
* @param encodingMode the requested encoding mode | |||
* @param useKerning true to enable loading kerning info if available, false to disable | |||
* @param useAdvanced true to enable loading advanced info if available, false to disable | |||
* @param resolver the FontResolver for font URI resolution | |||
*/ | |||
public TTFFontLoader(String fontFileURI, String subFontName, | |||
boolean embedded, EncodingMode encodingMode, boolean useKerning, | |||
boolean useAdvanced, FontResolver resolver) { | |||
boolean embedded, EmbeddingMode embeddingMode, EncodingMode encodingMode, | |||
boolean useKerning, boolean useAdvanced, FontResolver resolver) { | |||
super(fontFileURI, embedded, useKerning, useAdvanced, resolver); | |||
this.subFontName = subFontName; | |||
this.encodingMode = encodingMode; | |||
this.embeddingMode = embeddingMode; | |||
if (this.encodingMode == EncodingMode.AUTO) { | |||
this.encodingMode = EncodingMode.CID; //Default to CID mode for TrueType | |||
} | |||
if (this.embeddingMode == EmbeddingMode.AUTO) { | |||
this.embeddingMode = EmbeddingMode.SUBSET; | |||
} | |||
} | |||
/** {@inheritDoc} */ | |||
@Override | |||
protected void read() throws IOException { | |||
read(this.subFontName); | |||
} | |||
@@ -145,29 +149,20 @@ public class TTFFontLoader extends FontLoader { | |||
returnFont.setItalicAngle(Integer.parseInt(ttf.getItalicAngle())); | |||
returnFont.setMissingWidth(0); | |||
returnFont.setWeight(ttf.getWeightClass()); | |||
returnFont.setEmbeddingMode(this.embeddingMode); | |||
if (isCid) { | |||
multiFont.setCIDType(CIDFontType.CIDTYPE2); | |||
int[] wx = ttf.getWidths(); | |||
multiFont.setWidthArray(wx); | |||
List entries = ttf.getCMaps(); | |||
BFEntry[] bfentries = new BFEntry[entries.size()]; | |||
int pos = 0; | |||
Iterator iter = ttf.getCMaps().listIterator(); | |||
while (iter.hasNext()) { | |||
TTFCmapEntry ce = (TTFCmapEntry)iter.next(); | |||
bfentries[pos] = new BFEntry(ce.getUnicodeStart(), ce.getUnicodeEnd(), | |||
ce.getGlyphStartIndex()); | |||
pos++; | |||
} | |||
multiFont.setBFEntries(bfentries); | |||
} else { | |||
singleFont.setFontType(FontType.TRUETYPE); | |||
singleFont.setEncoding(ttf.getCharSetName()); | |||
returnFont.setFirstChar(ttf.getFirstChar()); | |||
returnFont.setLastChar(ttf.getLastChar()); | |||
singleFont.setTrueTypePostScriptVersion(ttf.getPostScriptVersion()); | |||
copyWidthsSingleByte(ttf); | |||
} | |||
returnFont.setCMap(getCMap(ttf)); | |||
if (useKerning) { | |||
copyKerning(ttf, isCid); | |||
@@ -186,23 +181,30 @@ public class TTFFontLoader extends FontLoader { | |||
} | |||
} | |||
private CMapSegment[] getCMap(TTFFile ttf) { | |||
CMapSegment[] array = new CMapSegment[ttf.getCMaps().size()]; | |||
return ttf.getCMaps().toArray(array); | |||
} | |||
private void copyWidthsSingleByte(TTFFile ttf) { | |||
int[] wx = ttf.getWidths(); | |||
for (int i = singleFont.getFirstChar(); i <= singleFont.getLastChar(); i++) { | |||
singleFont.setWidth(i, ttf.getCharWidth(i)); | |||
} | |||
Iterator iter = ttf.getCMaps().listIterator(); | |||
while (iter.hasNext()) { | |||
TTFCmapEntry ce = (TTFCmapEntry)iter.next(); | |||
if (ce.getUnicodeStart() < 0xFFFE) { | |||
for (char u = (char)ce.getUnicodeStart(); u <= ce.getUnicodeEnd(); u++) { | |||
for (CMapSegment segment : ttf.getCMaps()) { | |||
if (segment.getUnicodeStart() < 0xFFFE) { | |||
for (char u = (char)segment.getUnicodeStart(); u <= segment.getUnicodeEnd(); u++) { | |||
int codePoint = singleFont.getEncoding().mapChar(u); | |||
if (codePoint <= 0) { | |||
String unicode = Character.toString(u); | |||
String charName = Glyphs.stringToGlyph(unicode); | |||
if (charName.length() > 0) { | |||
NamedCharacter nc = new NamedCharacter(charName, unicode); | |||
int glyphIndex = ce.getGlyphStartIndex() + u - ce.getUnicodeStart(); | |||
int glyphIndex = segment.getGlyphStartIndex() + u - segment.getUnicodeStart(); | |||
String glyphName = ttf.getGlyphName(glyphIndex); | |||
if (glyphName.length() == 0 && ttf.getPostScriptVersion() != PostScriptVersion.V2) { | |||
glyphName = "u" + HexEncoder.encode(u); | |||
} | |||
if (glyphName.length() > 0) { | |||
String unicode = Character.toString(u); | |||
NamedCharacter nc = new NamedCharacter(glyphName, unicode); | |||
singleFont.addUnencodedCharacter(nc, wx[glyphIndex]); | |||
} | |||
} | |||
@@ -225,7 +227,6 @@ public class TTFFontLoader extends FontLoader { | |||
} | |||
for (Integer kpx1 : kerningSet) { | |||
Map<Integer, Integer> h2; | |||
if (isCid) { | |||
h2 = ttf.getKerning().get(kpx1); |
@@ -0,0 +1,48 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You 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. | |||
*/ | |||
/* $Id$ */ | |||
package org.apache.fop.fonts.truetype; | |||
import java.io.IOException; | |||
/** | |||
* An interface for writing individual glyphs from the glyf table of a TrueType font to an output stream. | |||
*/ | |||
public interface TTFGlyphOutputStream { | |||
/** | |||
* Begins the streaming of glyphs. | |||
*/ | |||
void startGlyphStream() throws IOException; | |||
/** | |||
* Streams an individual glyph from the given byte array. | |||
* | |||
* @param glyphData the source of the glyph data to stream from | |||
* @param offset the position in the glyph data where the glyph starts | |||
* @param size the size of the glyph data in bytes | |||
*/ | |||
void streamGlyph(byte[] glyphData, int offset, int size) throws IOException; | |||
/** | |||
* Ends the streaming of glyphs. | |||
*/ | |||
void endGlyphStream() throws IOException; | |||
} |
@@ -0,0 +1,49 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You 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. | |||
*/ | |||
/* $Id$ */ | |||
package org.apache.fop.fonts.truetype; | |||
import java.io.IOException; | |||
/** | |||
* An interface for writing a TrueType font to an output stream. | |||
*/ | |||
public interface TTFOutputStream { | |||
/** | |||
* Starts writing the font. | |||
*/ | |||
void startFontStream() throws IOException; | |||
/** | |||
* Returns an object for streaming TrueType tables. | |||
*/ | |||
TTFTableOutputStream getTableOutputStream(); | |||
/** | |||
* Returns an object for streaming TrueType glyphs in the glyf table. | |||
*/ | |||
TTFGlyphOutputStream getGlyphOutputStream(); | |||
/** | |||
* Ends writing the font. | |||
*/ | |||
void endFontStream() throws IOException; | |||
} |
@@ -20,8 +20,9 @@ | |||
package org.apache.fop.fonts.truetype; | |||
import java.io.IOException; | |||
import java.util.Iterator; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
import java.util.SortedSet; | |||
/** | |||
@@ -42,24 +43,18 @@ public class TTFSubSetFile extends TTFFile { | |||
* Offsets in name table to be filled out by table. | |||
* The offsets are to the checkSum field | |||
*/ | |||
private int cvtDirOffset = 0; | |||
private int fpgmDirOffset = 0; | |||
private int glyfDirOffset = 0; | |||
private int headDirOffset = 0; | |||
private int hheaDirOffset = 0; | |||
private int hmtxDirOffset = 0; | |||
private int locaDirOffset = 0; | |||
private int maxpDirOffset = 0; | |||
private int prepDirOffset = 0; | |||
private Map<TTFTableName, Integer> offsets = new HashMap<TTFTableName, Integer>(); | |||
private int checkSumAdjustmentOffset = 0; | |||
private int locaOffset = 0; | |||
/** Stores the glyph offsets so that we can end strings at glyph boundaries */ | |||
private int[] glyphOffsets; | |||
/** | |||
* Default Constructor | |||
*/ | |||
public TTFSubSetFile() { | |||
this(false, false); | |||
} | |||
/** | |||
@@ -71,16 +66,9 @@ public class TTFSubSetFile extends TTFFile { | |||
super(useKerning, useAdvanced); | |||
} | |||
/** | |||
* Initalize the output array | |||
*/ | |||
private void init(int size) { | |||
output = new byte[size]; | |||
realSize = 0; | |||
currentPos = 0; | |||
// createDirectory() | |||
} | |||
/** The dir tab entries in the new subset font. */ | |||
private Map<TTFTableName, TTFDirTabEntry> newDirTabs | |||
= new HashMap<TTFTableName, TTFDirTabEntry>(); | |||
private int determineTableCount() { | |||
int numTables = 4; //4 req'd tables: head,hhea,hmtx,maxp | |||
@@ -88,7 +76,7 @@ public class TTFSubSetFile extends TTFFile { | |||
throw new UnsupportedOperationException( | |||
"OpenType fonts with CFF glyphs are not supported"); | |||
} else { | |||
numTables += 2; //1 req'd table: glyf,loca | |||
numTables += 5; //5 req'd tables: glyf,loca,post,name,OS/2 | |||
if (hasCvt()) { | |||
numTables++; | |||
} | |||
@@ -119,7 +107,7 @@ public class TTFSubSetFile extends TTFFile { | |||
// Create searchRange, entrySelector and rangeShift | |||
int maxPow = maxPow2(numTables); | |||
int searchRange = maxPow * 16; | |||
int searchRange = (int) Math.pow(2, maxPow) * 16; | |||
writeUShort(searchRange); | |||
realSize += 2; | |||
@@ -128,151 +116,122 @@ public class TTFSubSetFile extends TTFFile { | |||
writeUShort((numTables * 16) - searchRange); | |||
realSize += 2; | |||
// Create space for the table entries (these must be in ASCII alphabetical order[A-Z] then[a-z]) | |||
writeTableName(TTFTableName.OS2); | |||
// Create space for the table entries | |||
if (hasCvt()) { | |||
writeString("cvt "); | |||
cvtDirOffset = currentPos; | |||
currentPos += 12; | |||
realSize += 16; | |||
writeTableName(TTFTableName.CVT); | |||
} | |||
if (hasFpgm()) { | |||
writeString("fpgm"); | |||
fpgmDirOffset = currentPos; | |||
currentPos += 12; | |||
realSize += 16; | |||
writeTableName(TTFTableName.FPGM); | |||
} | |||
writeTableName(TTFTableName.GLYF); | |||
writeTableName(TTFTableName.HEAD); | |||
writeTableName(TTFTableName.HHEA); | |||
writeTableName(TTFTableName.HMTX); | |||
writeTableName(TTFTableName.LOCA); | |||
writeTableName(TTFTableName.MAXP); | |||
writeTableName(TTFTableName.NAME); | |||
writeTableName(TTFTableName.POST); | |||
if (hasPrep()) { | |||
writeTableName(TTFTableName.PREP); | |||
} | |||
newDirTabs.put(TTFTableName.TABLE_DIRECTORY, new TTFDirTabEntry(0, currentPos)); | |||
} | |||
writeString("glyf"); | |||
glyfDirOffset = currentPos; | |||
currentPos += 12; | |||
realSize += 16; | |||
writeString("head"); | |||
headDirOffset = currentPos; | |||
currentPos += 12; | |||
realSize += 16; | |||
writeString("hhea"); | |||
hheaDirOffset = currentPos; | |||
private void writeTableName(TTFTableName tableName) { | |||
writeString(tableName.getName()); | |||
offsets.put(tableName, currentPos); | |||
currentPos += 12; | |||
realSize += 16; | |||
} | |||
writeString("hmtx"); | |||
hmtxDirOffset = currentPos; | |||
currentPos += 12; | |||
realSize += 16; | |||
writeString("loca"); | |||
locaDirOffset = currentPos; | |||
currentPos += 12; | |||
realSize += 16; | |||
writeString("maxp"); | |||
maxpDirOffset = currentPos; | |||
currentPos += 12; | |||
realSize += 16; | |||
private boolean hasCvt() { | |||
return dirTabs.containsKey(TTFTableName.CVT); | |||
} | |||
if (hasPrep()) { | |||
writeString("prep"); | |||
prepDirOffset = currentPos; | |||
currentPos += 12; | |||
realSize += 16; | |||
} | |||
private boolean hasFpgm() { | |||
return dirTabs.containsKey(TTFTableName.FPGM); | |||
} | |||
private boolean hasPrep() { | |||
return dirTabs.containsKey(TTFTableName.PREP); | |||
} | |||
/** | |||
* Copy the cvt table as is from original font to subset font | |||
* Create an empty loca table without updating checksum | |||
*/ | |||
private boolean createCvt(FontFileReader in) throws IOException { | |||
TTFDirTabEntry entry = (TTFDirTabEntry)dirTabs.get("cvt "); | |||
private void createLoca(int size) throws IOException { | |||
pad4(); | |||
locaOffset = currentPos; | |||
int dirTableOffset = offsets.get(TTFTableName.LOCA); | |||
writeULong(dirTableOffset + 4, currentPos); | |||
writeULong(dirTableOffset + 8, size * 4 + 4); | |||
currentPos += size * 4 + 4; | |||
realSize += size * 4 + 4; | |||
} | |||
private boolean copyTable(FontFileReader in, TTFTableName tableName) throws IOException { | |||
TTFDirTabEntry entry = dirTabs.get(tableName); | |||
if (entry != null) { | |||
pad4(); | |||
seekTab(in, "cvt ", 0); | |||
seekTab(in, tableName, 0); | |||
System.arraycopy(in.getBytes((int)entry.getOffset(), (int)entry.getLength()), | |||
0, output, currentPos, (int)entry.getLength()); | |||
int checksum = getCheckSum(currentPos, (int)entry.getLength()); | |||
writeULong(cvtDirOffset, checksum); | |||
writeULong(cvtDirOffset + 4, currentPos); | |||
writeULong(cvtDirOffset + 8, (int)entry.getLength()); | |||
currentPos += (int)entry.getLength(); | |||
realSize += (int)entry.getLength(); | |||
updateCheckSum(currentPos, (int) entry.getLength(), tableName); | |||
currentPos += (int) entry.getLength(); | |||
realSize += (int) entry.getLength(); | |||
return true; | |||
} else { | |||
return false; | |||
//throw new IOException("Can't find cvt table"); | |||
} | |||
} | |||
private boolean hasCvt() { | |||
return dirTabs.containsKey("cvt "); | |||
} | |||
private boolean hasFpgm() { | |||
return dirTabs.containsKey("fpgm"); | |||
} | |||
private boolean hasPrep() { | |||
return dirTabs.containsKey("prep"); | |||
/** | |||
* Copy the cvt table as is from original font to subset font | |||
*/ | |||
private boolean createCvt(FontFileReader in) throws IOException { | |||
return copyTable(in, TTFTableName.CVT); | |||
} | |||
/** | |||
* Copy the fpgm table as is from original font to subset font | |||
*/ | |||
private boolean createFpgm(FontFileReader in) throws IOException { | |||
TTFDirTabEntry entry = (TTFDirTabEntry)dirTabs.get("fpgm"); | |||
if (entry != null) { | |||
pad4(); | |||
seekTab(in, "fpgm", 0); | |||
System.arraycopy(in.getBytes((int)entry.getOffset(), (int)entry.getLength()), | |||
0, output, currentPos, (int)entry.getLength()); | |||
int checksum = getCheckSum(currentPos, (int)entry.getLength()); | |||
writeULong(fpgmDirOffset, checksum); | |||
writeULong(fpgmDirOffset + 4, currentPos); | |||
writeULong(fpgmDirOffset + 8, (int)entry.getLength()); | |||
currentPos += (int)entry.getLength(); | |||
realSize += (int)entry.getLength(); | |||
return true; | |||
} else { | |||
return false; | |||
} | |||
return copyTable(in, TTFTableName.FPGM); | |||
} | |||
/** | |||
* Create an empty loca table without updating checksum | |||
* Copy the name table as is from the original. | |||
*/ | |||
private void createLoca(int size) throws IOException { | |||
pad4(); | |||
locaOffset = currentPos; | |||
writeULong(locaDirOffset + 4, currentPos); | |||
writeULong(locaDirOffset + 8, size * 4 + 4); | |||
currentPos += size * 4 + 4; | |||
realSize += size * 4 + 4; | |||
private boolean createName(FontFileReader in) throws IOException { | |||
return copyTable(in, TTFTableName.NAME); | |||
} | |||
/** | |||
* Copy the OS/2 table as is from the original. | |||
*/ | |||
private boolean createOS2(FontFileReader in) throws IOException { | |||
return copyTable(in, TTFTableName.OS2); | |||
} | |||
/** | |||
* Copy the maxp table as is from original font to subset font | |||
* and set num glyphs to size | |||
*/ | |||
private void createMaxp(FontFileReader in, int size) throws IOException { | |||
TTFDirTabEntry entry = (TTFDirTabEntry)dirTabs.get("maxp"); | |||
TTFTableName maxp = TTFTableName.MAXP; | |||
TTFDirTabEntry entry = dirTabs.get(maxp); | |||
if (entry != null) { | |||
pad4(); | |||
seekTab(in, "maxp", 0); | |||
seekTab(in, maxp, 0); | |||
System.arraycopy(in.getBytes((int)entry.getOffset(), (int)entry.getLength()), | |||
0, output, currentPos, (int)entry.getLength()); | |||
writeUShort(currentPos + 4, size); | |||
int checksum = getCheckSum(currentPos, (int)entry.getLength()); | |||
writeULong(maxpDirOffset, checksum); | |||
writeULong(maxpDirOffset + 4, currentPos); | |||
writeULong(maxpDirOffset + 8, (int)entry.getLength()); | |||
updateCheckSum(currentPos, (int)entry.getLength(), maxp); | |||
currentPos += (int)entry.getLength(); | |||
realSize += (int)entry.getLength(); | |||
} else { | |||
@@ -280,28 +239,34 @@ public class TTFSubSetFile extends TTFFile { | |||
} | |||
} | |||
private void createPost(FontFileReader in) throws IOException { | |||
TTFTableName post = TTFTableName.POST; | |||
TTFDirTabEntry entry = dirTabs.get(post); | |||
if (entry != null) { | |||
pad4(); | |||
seekTab(in, post, 0); | |||
int newTableSize = 32; // This is the post table size with glyphs truncated | |||
byte[] newPostTable = new byte[newTableSize]; | |||
// We only want the first 28 bytes (truncate the glyph names); | |||
System.arraycopy(in.getBytes((int) entry.getOffset(), newTableSize), | |||
0, newPostTable, 0, newTableSize); | |||
// set the post table to Format 3.0 | |||
newPostTable[1] = 0x03; | |||
System.arraycopy(newPostTable, 0, output, currentPos, newTableSize); | |||
updateCheckSum(currentPos, newTableSize, post); | |||
currentPos += newTableSize; | |||
realSize += newTableSize; | |||
} else { | |||
throw new IOException("Can't find post table"); | |||
} | |||
} | |||
/** | |||
* Copy the prep table as is from original font to subset font | |||
*/ | |||
private boolean createPrep(FontFileReader in) throws IOException { | |||
TTFDirTabEntry entry = (TTFDirTabEntry)dirTabs.get("prep"); | |||
if (entry != null) { | |||
pad4(); | |||
seekTab(in, "prep", 0); | |||
System.arraycopy(in.getBytes((int)entry.getOffset(), (int)entry.getLength()), | |||
0, output, currentPos, (int)entry.getLength()); | |||
int checksum = getCheckSum(currentPos, (int)entry.getLength()); | |||
writeULong(prepDirOffset, checksum); | |||
writeULong(prepDirOffset + 4, currentPos); | |||
writeULong(prepDirOffset + 8, (int)entry.getLength()); | |||
currentPos += (int)entry.getLength(); | |||
realSize += (int)entry.getLength(); | |||
return true; | |||
} else { | |||
return false; | |||
} | |||
return copyTable(in, TTFTableName.PREP); | |||
} | |||
@@ -310,20 +275,17 @@ public class TTFSubSetFile extends TTFFile { | |||
* and fill in size of hmtx table | |||
*/ | |||
private void createHhea(FontFileReader in, int size) throws IOException { | |||
TTFDirTabEntry entry = (TTFDirTabEntry)dirTabs.get("hhea"); | |||
TTFDirTabEntry entry = dirTabs.get(TTFTableName.HHEA); | |||
if (entry != null) { | |||
pad4(); | |||
seekTab(in, "hhea", 0); | |||
System.arraycopy(in.getBytes((int)entry.getOffset(), (int)entry.getLength()), | |||
0, output, currentPos, (int)entry.getLength()); | |||
writeUShort((int)entry.getLength() + currentPos - 2, size); | |||
int checksum = getCheckSum(currentPos, (int)entry.getLength()); | |||
writeULong(hheaDirOffset, checksum); | |||
writeULong(hheaDirOffset + 4, currentPos); | |||
writeULong(hheaDirOffset + 8, (int)entry.getLength()); | |||
currentPos += (int)entry.getLength(); | |||
realSize += (int)entry.getLength(); | |||
seekTab(in, TTFTableName.HHEA, 0); | |||
System.arraycopy(in.getBytes((int) entry.getOffset(), (int) entry.getLength()), 0, | |||
output, currentPos, (int) entry.getLength()); | |||
writeUShort((int) entry.getLength() + currentPos - 2, size); | |||
updateCheckSum(currentPos, (int) entry.getLength(), TTFTableName.HHEA); | |||
currentPos += (int) entry.getLength(); | |||
realSize += (int) entry.getLength(); | |||
} else { | |||
throw new IOException("Can't find hhea table"); | |||
} | |||
@@ -337,10 +299,11 @@ public class TTFSubSetFile extends TTFFile { | |||
* in checkSumAdjustmentOffset | |||
*/ | |||
private void createHead(FontFileReader in) throws IOException { | |||
TTFDirTabEntry entry = (TTFDirTabEntry)dirTabs.get("head"); | |||
TTFTableName head = TTFTableName.HEAD; | |||
TTFDirTabEntry entry = dirTabs.get(head); | |||
if (entry != null) { | |||
pad4(); | |||
seekTab(in, "head", 0); | |||
seekTab(in, head, 0); | |||
System.arraycopy(in.getBytes((int)entry.getOffset(), (int)entry.getLength()), | |||
0, output, currentPos, (int)entry.getLength()); | |||
@@ -352,11 +315,7 @@ public class TTFSubSetFile extends TTFFile { | |||
output[currentPos + 50] = 0; // long locaformat | |||
output[currentPos + 51] = 1; // long locaformat | |||
int checksum = getCheckSum(currentPos, (int)entry.getLength()); | |||
writeULong(headDirOffset, checksum); | |||
writeULong(headDirOffset + 4, currentPos); | |||
writeULong(headDirOffset + 8, (int)entry.getLength()); | |||
updateCheckSum(currentPos, (int)entry.getLength(), head); | |||
currentPos += (int)entry.getLength(); | |||
realSize += (int)entry.getLength(); | |||
} else { | |||
@@ -369,30 +328,24 @@ public class TTFSubSetFile extends TTFFile { | |||
* Create the glyf table and fill in loca table | |||
*/ | |||
private void createGlyf(FontFileReader in, | |||
Map glyphs) throws IOException { | |||
TTFDirTabEntry entry = (TTFDirTabEntry)dirTabs.get("glyf"); | |||
Map<Integer, Integer> glyphs) throws IOException { | |||
TTFTableName glyf = TTFTableName.GLYF; | |||
TTFDirTabEntry entry = dirTabs.get(glyf); | |||
int size = 0; | |||
int start = 0; | |||
int startPos = 0; | |||
int endOffset = 0; // Store this as the last loca | |||
if (entry != null) { | |||
pad4(); | |||
start = currentPos; | |||
startPos = currentPos; | |||
/* Loca table must be in order by glyph index, so build | |||
* an array first and then write the glyph info and | |||
* location offset. | |||
*/ | |||
int[] origIndexes = new int[glyphs.size()]; | |||
Iterator e = glyphs.keySet().iterator(); | |||
while (e.hasNext()) { | |||
Integer origIndex = (Integer)e.next(); | |||
Integer subsetIndex = (Integer)glyphs.get(origIndex); | |||
origIndexes[subsetIndex.intValue()] = origIndex.intValue(); | |||
} | |||
int[] origIndexes = buildSubsetIndexToOrigIndexMap(glyphs); | |||
glyphOffsets = new int[origIndexes.length]; | |||
for (int i = 0; i < origIndexes.length; i++) { | |||
int glyphLength = 0; | |||
int nextOffset = 0; | |||
int origGlyphIndex = origIndexes[i]; | |||
if (origGlyphIndex >= (mtxTab.length - 1)) { | |||
@@ -400,46 +353,64 @@ public class TTFSubSetFile extends TTFFile { | |||
} else { | |||
nextOffset = (int)mtxTab[origGlyphIndex + 1].getOffset(); | |||
} | |||
glyphLength = nextOffset - (int)mtxTab[origGlyphIndex].getOffset(); | |||
int glyphOffset = (int)mtxTab[origGlyphIndex].getOffset(); | |||
int glyphLength = nextOffset - glyphOffset; | |||
byte[] glyphData = in.getBytes( | |||
(int)entry.getOffset() + glyphOffset, | |||
glyphLength); | |||
int endOffset1 = endOffset; | |||
// Copy glyph | |||
System.arraycopy( | |||
in.getBytes((int)entry.getOffset() + (int)mtxTab[origGlyphIndex].getOffset(), | |||
glyphLength), 0, | |||
glyphData, 0, | |||
output, currentPos, | |||
glyphLength); | |||
// Update loca table | |||
writeULong(locaOffset + i * 4, currentPos - start); | |||
if ((currentPos - start + glyphLength) > endOffset) { | |||
endOffset = (currentPos - start + glyphLength); | |||
writeULong(locaOffset + i * 4, currentPos - startPos); | |||
if ((currentPos - startPos + glyphLength) > endOffset1) { | |||
endOffset1 = (currentPos - startPos + glyphLength); | |||
} | |||
// Store the glyph boundary positions relative to the start of the font | |||
glyphOffsets[i] = currentPos; | |||
currentPos += glyphLength; | |||
realSize += glyphLength; | |||
endOffset = endOffset1; | |||
} | |||
size = currentPos - start; | |||
int checksum = getCheckSum(start, size); | |||
writeULong(glyfDirOffset, checksum); | |||
writeULong(glyfDirOffset + 4, start); | |||
writeULong(glyfDirOffset + 8, size); | |||
size = currentPos - startPos; | |||
currentPos += 12; | |||
realSize += 12; | |||
updateCheckSum(startPos, size + 12, glyf); | |||
// Update loca checksum and last loca index | |||
writeULong(locaOffset + glyphs.size() * 4, endOffset); | |||
checksum = getCheckSum(locaOffset, glyphs.size() * 4 + 4); | |||
writeULong(locaDirOffset, checksum); | |||
int locaSize = glyphs.size() * 4 + 4; | |||
int checksum = getCheckSum(output, locaOffset, locaSize); | |||
writeULong(offsets.get(TTFTableName.LOCA), checksum); | |||
int padSize = (locaOffset + locaSize) % 4; | |||
newDirTabs.put(TTFTableName.LOCA, | |||
new TTFDirTabEntry(locaOffset, locaSize + padSize)); | |||
} else { | |||
throw new IOException("Can't find glyf table"); | |||
} | |||
} | |||
private int[] buildSubsetIndexToOrigIndexMap(Map<Integer, Integer> glyphs) { | |||
int[] origIndexes = new int[glyphs.size()]; | |||
for (Map.Entry<Integer, Integer> glyph : glyphs.entrySet()) { | |||
int origIndex = glyph.getKey(); | |||
int subsetIndex = glyph.getValue(); | |||
origIndexes[subsetIndex] = origIndex; | |||
} | |||
return origIndexes; | |||
} | |||
/** | |||
* Create the hmtx table by copying metrics from original | |||
@@ -448,8 +419,9 @@ public class TTFSubSetFile extends TTFFile { | |||
* metric (key) to the subset metric (value) | |||
*/ | |||
private void createHmtx(FontFileReader in, | |||
Map glyphs) throws IOException { | |||
TTFDirTabEntry entry = (TTFDirTabEntry)dirTabs.get("hmtx"); | |||
Map<Integer, Integer> glyphs) throws IOException { | |||
TTFTableName hmtx = TTFTableName.HMTX; | |||
TTFDirTabEntry entry = dirTabs.get(hmtx); | |||
int longHorMetricSize = glyphs.size() * 2; | |||
int leftSideBearingSize = glyphs.size() * 2; | |||
@@ -458,10 +430,9 @@ public class TTFSubSetFile extends TTFFile { | |||
if (entry != null) { | |||
pad4(); | |||
//int offset = (int)entry.offset; | |||
Iterator e = glyphs.keySet().iterator(); | |||
while (e.hasNext()) { | |||
Integer origIndex = (Integer)e.next(); | |||
Integer subsetIndex = (Integer)glyphs.get(origIndex); | |||
for (Map.Entry<Integer, Integer> glyph : glyphs.entrySet()) { | |||
Integer origIndex = glyph.getKey(); | |||
Integer subsetIndex = glyph.getValue(); | |||
writeUShort(currentPos + subsetIndex.intValue() * 4, | |||
mtxTab[origIndex.intValue()].getWx()); | |||
@@ -469,10 +440,7 @@ public class TTFSubSetFile extends TTFFile { | |||
mtxTab[origIndex.intValue()].getLsb()); | |||
} | |||
int checksum = getCheckSum(currentPos, hmtxSize); | |||
writeULong(hmtxDirOffset, checksum); | |||
writeULong(hmtxDirOffset + 4, currentPos); | |||
writeULong(hmtxDirOffset + 8, hmtxSize); | |||
updateCheckSum(currentPos, hmtxSize, hmtx); | |||
currentPos += hmtxSize; | |||
realSize += hmtxSize; | |||
} else { | |||
@@ -481,43 +449,37 @@ public class TTFSubSetFile extends TTFFile { | |||
} | |||
/** | |||
* Returns a subset of the original font. | |||
* Reads a font and creates a subset of the font. | |||
* | |||
* @param in FontFileReader to read from | |||
* @param name Name to be checked for in the font file | |||
* @param glyphs Map of glyphs (glyphs has old index as (Integer) key and | |||
* new index as (Integer) value) | |||
* @return A subset of the original font | |||
* @throws IOException in case of an I/O problem | |||
*/ | |||
public byte[] readFont(FontFileReader in, String name, | |||
public void readFont(FontFileReader in, String name, | |||
Map<Integer, Integer> glyphs) throws IOException { | |||
fontFile = in; | |||
//Check if TrueType collection, and that the name exists in the collection | |||
if (!checkTTC(in, name)) { | |||
if (!checkTTC(name)) { | |||
throw new IOException("Failed to read font"); | |||
} | |||
//Copy the Map as we're going to modify it | |||
Map<Integer, Integer> subsetGlyphs = new java.util.HashMap<Integer, Integer>(glyphs); | |||
Map<Integer, Integer> subsetGlyphs = new HashMap<Integer, Integer>(glyphs); | |||
output = new byte[in.getFileSize()]; | |||
readDirTabs(in); | |||
readFontHeader(in); | |||
getNumGlyphs(in); | |||
readHorizontalHeader(in); | |||
readHorizontalMetrics(in); | |||
readIndexToLocation(in); | |||
readDirTabs(); | |||
readFontHeader(); | |||
getNumGlyphs(); | |||
readHorizontalHeader(); | |||
readHorizontalMetrics(); | |||
readIndexToLocation(); | |||
scanGlyphs(in, subsetGlyphs); | |||
createDirectory(); // Create the TrueType header and directory | |||
createHead(in); | |||
createHhea(in, subsetGlyphs.size()); // Create the hhea table | |||
createHmtx(in, subsetGlyphs); // Create hmtx table | |||
createMaxp(in, subsetGlyphs.size()); // copy the maxp table | |||
createDirectory(); // Create the TrueType header and directory | |||
boolean optionalTableFound; | |||
optionalTableFound = createCvt(in); // copy the cvt table | |||
@@ -531,6 +493,16 @@ public class TTFSubSetFile extends TTFFile { | |||
// fpgm is optional (used in TrueType fonts only) | |||
log.debug("TrueType: fpgm table not present. Skipped."); | |||
} | |||
createLoca(subsetGlyphs.size()); // create empty loca table | |||
createGlyf(in, subsetGlyphs); //create glyf table and update loca table | |||
createOS2(in); // copy the OS/2 table | |||
createHead(in); | |||
createHhea(in, subsetGlyphs.size()); // Create the hhea table | |||
createHmtx(in, subsetGlyphs); // Create hmtx table | |||
createMaxp(in, subsetGlyphs.size()); // copy the maxp table | |||
createName(in); // copy the name table | |||
createPost(in); // copy the post table | |||
optionalTableFound = createPrep(in); // copy prep table | |||
if (!optionalTableFound) { | |||
@@ -538,21 +510,59 @@ public class TTFSubSetFile extends TTFFile { | |||
log.debug("TrueType: prep table not present. Skipped."); | |||
} | |||
createLoca(subsetGlyphs.size()); // create empty loca table | |||
createGlyf(in, subsetGlyphs); //create glyf table and update loca table | |||
pad4(); | |||
createCheckSumAdjustment(); | |||
} | |||
/** | |||
* Returns a subset of the fonts (readFont() MUST be called first in order to create the | |||
* subset). | |||
* @return byte array | |||
*/ | |||
public byte[] getFontSubset() { | |||
byte[] ret = new byte[realSize]; | |||
System.arraycopy(output, 0, ret, 0, realSize); | |||
return ret; | |||
} | |||
private void handleGlyphSubset(TTFGlyphOutputStream glyphOut) throws IOException { | |||
glyphOut.startGlyphStream(); | |||
// Stream all but the last glyph | |||
for (int i = 0; i < glyphOffsets.length - 1; i++) { | |||
glyphOut.streamGlyph(output, glyphOffsets[i], | |||
glyphOffsets[i + 1] - glyphOffsets[i]); | |||
} | |||
// Stream the last glyph | |||
TTFDirTabEntry glyf = newDirTabs.get(TTFTableName.GLYF); | |||
long lastGlyphLength = glyf.getLength() | |||
- (glyphOffsets[glyphOffsets.length - 1] - glyf.getOffset()); | |||
glyphOut.streamGlyph(output, glyphOffsets[glyphOffsets.length - 1], | |||
(int) lastGlyphLength); | |||
glyphOut.endGlyphStream(); | |||
} | |||
@Override | |||
public void stream(TTFOutputStream ttfOut) throws IOException { | |||
SortedSet<Map.Entry<TTFTableName, TTFDirTabEntry>> sortedDirTabs | |||
= sortDirTabMap(newDirTabs); | |||
TTFTableOutputStream tableOut = ttfOut.getTableOutputStream(); | |||
TTFGlyphOutputStream glyphOut = ttfOut.getGlyphOutputStream(); | |||
ttfOut.startFontStream(); | |||
for (Map.Entry<TTFTableName, TTFDirTabEntry> entry : sortedDirTabs) { | |||
if (entry.getKey().equals(TTFTableName.GLYF)) { | |||
handleGlyphSubset(glyphOut); | |||
} else { | |||
tableOut.streamTable(output, (int) entry.getValue().getOffset(), | |||
(int) entry.getValue().getLength()); | |||
} | |||
} | |||
ttfOut.endFontStream(); | |||
} | |||
private void scanGlyphs(FontFileReader in, Map<Integer, Integer> subsetGlyphs) | |||
throws IOException { | |||
TTFDirTabEntry glyfTableInfo = (TTFDirTabEntry) dirTabs.get("glyf"); | |||
TTFDirTabEntry glyfTableInfo = dirTabs.get(TTFTableName.GLYF); | |||
if (glyfTableInfo == null) { | |||
throw new IOException("Glyf table could not be found"); | |||
} | |||
@@ -610,20 +620,6 @@ public class TTFSubSetFile extends TTFFile { | |||
output[pos + 1] = b2; | |||
} | |||
/** | |||
* Appends a ULONG to the output array, | |||
* updates currentPos but not realSize | |||
*/ | |||
private void writeULong(int s) { | |||
byte b1 = (byte)((s >> 24) & 0xff); | |||
byte b2 = (byte)((s >> 16) & 0xff); | |||
byte b3 = (byte)((s >> 8) & 0xff); | |||
byte b4 = (byte)(s & 0xff); | |||
writeByte(b1); | |||
writeByte(b2); | |||
writeByte(b3); | |||
writeByte(b4); | |||
} | |||
/** | |||
* Appends a ULONG to the output array, | |||
@@ -640,41 +636,17 @@ public class TTFSubSetFile extends TTFFile { | |||
output[pos + 3] = b4; | |||
} | |||
/** | |||
* Read a signed short value at given position | |||
*/ | |||
private short readShort(int pos) { | |||
int ret = readUShort(pos); | |||
return (short)ret; | |||
} | |||
/** | |||
* Read a unsigned short value at given position | |||
*/ | |||
private int readUShort(int pos) { | |||
int ret = output[pos]; | |||
if (ret < 0) { | |||
ret += 256; | |||
} | |||
ret = ret << 8; | |||
if (output[pos + 1] < 0) { | |||
ret |= output[pos + 1] + 256; | |||
} else { | |||
ret |= output[pos + 1]; | |||
} | |||
return ret; | |||
} | |||
/** | |||
* Create a padding in the fontfile to align | |||
* on a 4-byte boundary | |||
*/ | |||
private void pad4() { | |||
int padSize = currentPos % 4; | |||
for (int i = 0; i < padSize; i++) { | |||
output[currentPos++] = 0; | |||
realSize++; | |||
int padSize = getPadSize(currentPos); | |||
if (padSize < 4) { | |||
for (int i = 0; i < padSize; i++) { | |||
output[currentPos++] = 0; | |||
realSize++; | |||
} | |||
} | |||
} | |||
@@ -683,23 +655,25 @@ public class TTFSubSetFile extends TTFFile { | |||
*/ | |||
private int maxPow2(int max) { | |||
int i = 0; | |||
while (Math.pow(2, i) < max) { | |||
while (Math.pow(2, i) <= max) { | |||
i++; | |||
} | |||
return (i - 1); | |||
} | |||
private int log2(int num) { | |||
return (int)(Math.log(num) / Math.log(2)); | |||
} | |||
private int getCheckSum(int start, int size) { | |||
return (int)getLongCheckSum(start, size); | |||
private void updateCheckSum(int tableStart, int tableSize, TTFTableName tableName) { | |||
int checksum = getCheckSum(output, tableStart, tableSize); | |||
int offset = offsets.get(tableName); | |||
int padSize = getPadSize(tableStart + tableSize); | |||
newDirTabs.put(tableName, new TTFDirTabEntry(tableStart, tableSize + padSize)); | |||
writeULong(offset, checksum); | |||
writeULong(offset + 4, tableStart); | |||
writeULong(offset + 8, tableSize); | |||
} | |||
private long getLongCheckSum(int start, int size) { | |||
private static int getCheckSum(byte[] data, int start, int size) { | |||
// All the tables here are aligned on four byte boundaries | |||
// Add remainder to size if it's not a multiple of 4 | |||
int remainder = size % 4; | |||
@@ -710,26 +684,19 @@ public class TTFSubSetFile extends TTFFile { | |||
long sum = 0; | |||
for (int i = 0; i < size; i += 4) { | |||
int l = (output[start + i] << 24); | |||
l += (output[start + i + 1] << 16); | |||
l += (output[start + i + 2] << 16); | |||
l += (output[start + i + 3] << 16); | |||
sum += l; | |||
if (sum > 0xffffffff) { | |||
sum = sum - 0xffffffff; | |||
long l = 0; | |||
for (int j = 0; j < 4; j++) { | |||
l <<= 8; | |||
l |= data[start + i + j] & 0xff; | |||
} | |||
sum += l; | |||
} | |||
return sum; | |||
return (int) sum; | |||
} | |||
private void createCheckSumAdjustment() { | |||
long sum = getLongCheckSum(0, realSize); | |||
long sum = getCheckSum(output, 0, realSize); | |||
int checksum = (int)(0xb1b0afba - sum); | |||
writeULong(checkSumAdjustmentOffset, checksum); | |||
} | |||
} | |||
@@ -0,0 +1,163 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You 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. | |||
*/ | |||
/* $Id$ */ | |||
package org.apache.fop.fonts.truetype; | |||
/** | |||
* Represents table names as found in a TrueType font's Table Directory. | |||
* TrueType fonts may have custom tables so we cannot use an enum. | |||
*/ | |||
public final class TTFTableName { | |||
/** The first table in a TrueType font file containing metadata about other tables. */ | |||
public static final TTFTableName TABLE_DIRECTORY = new TTFTableName("tableDirectory"); | |||
/** Embedded bitmap data. */ | |||
public static final TTFTableName EBDT = new TTFTableName("EBDT"); | |||
/** Embedded bitmap location data. */ | |||
public static final TTFTableName EBLC = new TTFTableName("EBLC"); | |||
/** Embedded bitmap scaling data. */ | |||
public static final TTFTableName EBSC = new TTFTableName("EBSC"); | |||
/** A FontForge specific table. */ | |||
public static final TTFTableName FFTM = new TTFTableName("FFTM"); | |||
/** Divides glyphs into various classes that make using the GPOS/GSUB tables easier. */ | |||
public static final TTFTableName GDEF = new TTFTableName("GDEF"); | |||
/** Provides kerning information, mark-to-base, etc. for opentype fonts. */ | |||
public static final TTFTableName GPOS = new TTFTableName("GPOS"); | |||
/** Provides ligature information, swash, etc. for opentype fonts. */ | |||
public static final TTFTableName GSUB = new TTFTableName("GSUB"); | |||
/** Linear threshold table. */ | |||
public static final TTFTableName LTSH = new TTFTableName("LTSH"); | |||
/** OS/2 and Windows specific metrics. */ | |||
public static final TTFTableName OS2 = new TTFTableName("OS/2"); | |||
/** PCL 5 data. */ | |||
public static final TTFTableName PCLT = new TTFTableName("PCLT"); | |||
/** Vertical Device Metrics table. */ | |||
public static final TTFTableName VDMX = new TTFTableName("VDMX"); | |||
/** Character to glyph mapping. */ | |||
public static final TTFTableName CMAP = new TTFTableName("cmap"); | |||
/** Control Value Table. */ | |||
public static final TTFTableName CVT = new TTFTableName("cvt "); | |||
/** Font program. */ | |||
public static final TTFTableName FPGM = new TTFTableName("fpgm"); | |||
/** Grid-fitting and scan conversion procedure (grayscale). */ | |||
public static final TTFTableName GASP = new TTFTableName("gasp"); | |||
/** Glyph data. */ | |||
public static final TTFTableName GLYF = new TTFTableName("glyf"); | |||
/** Horizontal device metrics. */ | |||
public static final TTFTableName HDMX = new TTFTableName("hdmx"); | |||
/** Font header. */ | |||
public static final TTFTableName HEAD = new TTFTableName("head"); | |||
/** Horizontal header. */ | |||
public static final TTFTableName HHEA = new TTFTableName("hhea"); | |||
/** Horizontal metrics. */ | |||
public static final TTFTableName HMTX = new TTFTableName("hmtx"); | |||
/** Kerning. */ | |||
public static final TTFTableName KERN = new TTFTableName("kern"); | |||
/** Index to location. */ | |||
public static final TTFTableName LOCA = new TTFTableName("loca"); | |||
/** Maximum profile. */ | |||
public static final TTFTableName MAXP = new TTFTableName("maxp"); | |||
/** Naming table. */ | |||
public static final TTFTableName NAME = new TTFTableName("name"); | |||
/** PostScript information. */ | |||
public static final TTFTableName POST = new TTFTableName("post"); | |||
/** CVT Program. */ | |||
public static final TTFTableName PREP = new TTFTableName("prep"); | |||
/** Vertical Metrics header. */ | |||
public static final TTFTableName VHEA = new TTFTableName("vhea"); | |||
/** Vertical Metrics. */ | |||
public static final TTFTableName VMTX = new TTFTableName("vmtx"); | |||
private final String name; | |||
private TTFTableName(String name) { | |||
this.name = name; | |||
} | |||
/** | |||
* Returns the name of the table as it should be in the Directory Table. | |||
*/ | |||
public String getName() { | |||
return name; | |||
} | |||
/** | |||
* Returns an instance of this class corresponding to the given string representation. | |||
* @param tableName table name as in the Table Directory | |||
* @return TTFTableName | |||
*/ | |||
public static TTFTableName getValue(String tableName) { | |||
if (tableName != null) { | |||
return new TTFTableName(tableName); | |||
} | |||
throw new IllegalArgumentException("A TrueType font table name must not be null"); | |||
} | |||
@Override | |||
public int hashCode() { | |||
return name.hashCode(); | |||
} | |||
@Override | |||
public boolean equals(Object o) { | |||
if (o == this) { | |||
return true; | |||
} | |||
if (!(o instanceof TTFTableName)) { | |||
return false; | |||
} | |||
TTFTableName to = (TTFTableName) o; | |||
return this.name.equals(to.getName()); | |||
} | |||
@Override | |||
public String toString() { | |||
return name; | |||
} | |||
} |
@@ -0,0 +1,37 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You 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. | |||
*/ | |||
/* $Id$ */ | |||
package org.apache.fop.fonts.truetype; | |||
import java.io.IOException; | |||
/** | |||
* An interface for writing a TrueType table to an output stream. | |||
*/ | |||
public interface TTFTableOutputStream { | |||
/** | |||
* Streams a table from the given byte array. | |||
* | |||
* @param ttfData the source of the table to stream from | |||
* @param offset the position in the byte array where the table starts | |||
* @param size the size of the table in bytes | |||
*/ | |||
void streamTable(byte[] ttfData, int offset, int size) throws IOException; | |||
} |
@@ -79,7 +79,7 @@ public class HyphenationTreeCache { | |||
String userKey = null; | |||
if (hyphPatNames != null) { | |||
String key = constructLlccKey(lang, country); | |||
key.replace('_', '-'); | |||
key = key.replace('_', '-'); | |||
userKey = (String) hyphPatNames.get(key); | |||
} | |||
return userKey; | |||
@@ -96,7 +96,7 @@ public class HyphenationTreeCache { | |||
/** | |||
* Notes a key to a hyphenation tree as missing. | |||
* This is to avoid searching a second time for a hyphneation pattern file which is not | |||
* This is to avoid searching a second time for a hyphenation pattern file which is not | |||
* available. | |||
* @param key the key (ex. "de_CH" or "en") | |||
*/ | |||
@@ -109,7 +109,7 @@ public class HyphenationTreeCache { | |||
/** | |||
* Indicates whether a hyphenation file has been requested before but it wasn't available. | |||
* This is to avoid searching a second time for a hyphneation pattern file which is not | |||
* This is to avoid searching a second time for a hyphenation pattern file which is not | |||
* available. | |||
* @param key the key (ex. "de_CH" or "en") | |||
* @return true if the hyphenation tree is unavailable |
@@ -41,12 +41,16 @@ public class BalancingColumnBreakingAlgorithm extends PageBreakingAlgorithm { | |||
* @param topLevelLM the top level layout manager | |||
* @param pageProvider the page provider | |||
* @param layoutListener the layout listener | |||
* @param alignment alignment of the paragraph/page. One of {@link Constants#EN_START}, | |||
* {@link Constants#EN_JUSTIFY}, {@link Constants#EN_CENTER}, | |||
* {@link Constants#EN_END}. | |||
* For pages, {@link Constants#EN_BEFORE} and {@link Constants#EN_AFTER} | |||
* are mapped to the corresponding inline properties, | |||
* {@link Constants#EN_START} and {@link Constants#EN_END}. | |||
* @param alignment alignment of the paragraph/page. One of | |||
* {@link org.apache.fop.fo.Constants#EN_START}, | |||
* {@link org.apache.fop.fo.Constants#EN_JUSTIFY}, | |||
* {@link org.apache.fop.fo.Constants#EN_CENTER}, | |||
* {@link org.apache.fop.fo.Constants#EN_END}. | |||
* For pages, {@link org.apache.fop.fo.Constants#EN_BEFORE} and | |||
* {@link org.apache.fop.fo.Constants#EN_AFTER} | |||
* are mapped to the corresponding inline properties, | |||
* {@link org.apache.fop.fo.Constants#EN_START} and | |||
* {@link org.apache.fop.fo.Constants#EN_END}. | |||
* @param alignmentLast alignment of the paragraph's last line | |||
* @param footnoteSeparatorLength length of footnote separator | |||
* @param partOverflowRecovery {@code true} if too long elements should be moved to |
@@ -46,8 +46,11 @@ public class BreakElement extends UnresolvedListElement { | |||
* Create a new BreakElement for the given {@code position}, {@code penaltyValue} | |||
* and {@code breakClass}. (Used principally to generate break-possibilities in | |||
* ranges of content that must be kept together within the context corresponding | |||
* to the {@code breakClass}; expected to be one of {@link Constants#EN_AUTO}, | |||
* {@link Constants#EN_LINE}, {@link Constants#EN_COLUMN} or {@link Constants#EN_PAGE}) | |||
* to the {@code breakClass}; expected to be one of | |||
* {@link org.apache.fop.fo.Constants#EN_AUTO}, | |||
* {@link org.apache.fop.fo.Constants#EN_LINE}, | |||
* {@link org.apache.fop.fo.Constants#EN_COLUMN} or | |||
* {@link org.apache.fop.fo.Constants#EN_PAGE}) | |||
* @param position the corresponding {@link Position} | |||
* @param penaltyValue the penalty value | |||
* @param breakClass the break class | |||
@@ -64,9 +67,12 @@ public class BreakElement extends UnresolvedListElement { | |||
* @param position the Position instance needed by the addAreas stage of the LMs. | |||
* @param penaltyWidth the penalty width | |||
* @param penaltyValue the penalty value for the penalty element to be constructed | |||
* @param breakClass the break class of this penalty (one of {@link Constants#EN_AUTO}, | |||
* {@link Constants#EN_COLUMN}, {@link Constants#EN_PAGE}, | |||
* {@link Constants#EN_EVEN_PAGE}, {@link Constants#EN_ODD_PAGE}) | |||
* @param breakClass the break class of this penalty (one of | |||
* {@link org.apache.fop.fo.Constants#EN_AUTO}, | |||
* {@link org.apache.fop.fo.Constants#EN_COLUMN}, | |||
* {@link org.apache.fop.fo.Constants#EN_PAGE}, | |||
* {@link org.apache.fop.fo.Constants#EN_EVEN_PAGE}, | |||
* {@link org.apache.fop.fo.Constants#EN_ODD_PAGE}) | |||
* @param context the layout context which contains the pending conditional elements | |||
*/ | |||
public BreakElement(Position position, int penaltyWidth, int penaltyValue, | |||
@@ -120,9 +126,12 @@ public class BreakElement extends UnresolvedListElement { | |||
/** | |||
* Returns the break class of this penalty. | |||
* | |||
* @return one of {@link Constants#EN_AUTO}, {@link Constants#EN_COLUMN}, | |||
* {@link Constants#EN_PAGE}, {@link Constants#EN_EVEN_PAGE}, | |||
* {@link Constants#EN_ODD_PAGE} | |||
* @return one of | |||
* {@link org.apache.fop.fo.Constants#EN_AUTO}, | |||
* {@link org.apache.fop.fo.Constants#EN_COLUMN}, | |||
* {@link org.apache.fop.fo.Constants#EN_PAGE}, | |||
* {@link org.apache.fop.fo.Constants#EN_EVEN_PAGE}, | |||
* {@link org.apache.fop.fo.Constants#EN_ODD_PAGE}. | |||
*/ | |||
public int getBreakClass() { | |||
return breakClass; | |||
@@ -131,9 +140,12 @@ public class BreakElement extends UnresolvedListElement { | |||
/** | |||
* Sets the break class. | |||
* | |||
* @param breakClass one of {@link Constants#EN_AUTO}, {@link Constants#EN_COLUMN}, | |||
* {@link Constants#EN_PAGE}, {@link Constants#EN_EVEN_PAGE}, | |||
* {@link Constants#EN_ODD_PAGE} | |||
* @param breakClass one of | |||
* {@link org.apache.fop.fo.Constants#EN_AUTO}, | |||
* {@link org.apache.fop.fo.Constants#EN_COLUMN}, | |||
* {@link org.apache.fop.fo.Constants#EN_PAGE}, | |||
* {@link org.apache.fop.fo.Constants#EN_EVEN_PAGE}, | |||
* {@link org.apache.fop.fo.Constants#EN_ODD_PAGE}. | |||
*/ | |||
public void setBreakClass(int breakClass) { | |||
this.breakClass = breakClass; |
@@ -72,8 +72,11 @@ public class KnuthPenalty extends KnuthElement { | |||
* @param penalty the penalty value of this penalty | |||
* @param penaltyFlagged is this penalty flagged? | |||
* @param breakClass the break class of this penalty (one of | |||
* {@link Constants#EN_AUTO}, {@link Constants#EN_COLUMN}, {@link Constants#EN_PAGE}, | |||
* {@link Constants#EN_EVEN_PAGE}, {@link Constants#EN_ODD_PAGE}) | |||
* {@link org.apache.fop.fo.Constants#EN_AUTO}, | |||
* {@link org.apache.fop.fo.Constants#EN_COLUMN}, | |||
* {@link org.apache.fop.fo.Constants#EN_PAGE}, | |||
* {@link org.apache.fop.fo.Constants#EN_EVEN_PAGE}, | |||
* {@link org.apache.fop.fo.Constants#EN_ODD_PAGE}). | |||
* @param pos the Position stored in this penalty | |||
* @param isAuxiliary is this penalty auxiliary? | |||
*/ |
@@ -78,7 +78,7 @@ public abstract class AbstractPDFStream extends PDFObject { | |||
* from outside. | |||
*/ | |||
protected void setupFilterList() { | |||
if (!getFilterList().isInitialized()) { | |||
if (multipleFiltersAllowed() && !getFilterList().isInitialized()) { | |||
getFilterList().addDefaultFilters( | |||
getDocumentSafely().getFilterMap(), | |||
getDefaultFilterName()); | |||
@@ -273,4 +273,11 @@ public abstract class AbstractPDFStream extends PDFObject { | |||
//nop: No default implicit filters | |||
} | |||
/** | |||
* Whether multiple filters can be applied. | |||
* @return true if multiple filters allowed | |||
*/ | |||
protected boolean multipleFiltersAllowed() { | |||
return true; | |||
} | |||
} |
@@ -212,6 +212,10 @@ public class AlphaRasterImage implements PDFImage { | |||
return null; | |||
} | |||
/** {@inheritDoc} */ | |||
public boolean multipleFiltersAllowed() { | |||
return true; | |||
} | |||
} | |||
@@ -37,6 +37,8 @@ public class BitmapImage implements PDFImage { | |||
private PDFColor transparent = null; | |||
private String key; | |||
private PDFDocument pdfDoc; | |||
private PDFFilter pdfFilter; | |||
private boolean multipleFiltersAllowed = true; | |||
/** | |||
* Create a bitmap image. | |||
@@ -208,9 +210,23 @@ public class BitmapImage implements PDFImage { | |||
* {@inheritDoc} | |||
*/ | |||
public PDFFilter getPDFFilter() { | |||
return null; | |||
return pdfFilter; | |||
} | |||
} | |||
public void setPDFFilter(PDFFilter pdfFilter) { | |||
this.pdfFilter = pdfFilter; | |||
} | |||
/** {@inheritDoc} */ | |||
public boolean multipleFiltersAllowed() { | |||
return multipleFiltersAllowed; | |||
} | |||
/** | |||
* Disallows multiple filters. | |||
*/ | |||
public void disallowMultipleFilters() { | |||
multipleFiltersAllowed = false; | |||
} | |||
} |
@@ -30,7 +30,7 @@ import org.apache.xmlgraphics.java2d.color.DeviceCMYKColorSpace; | |||
* image. And in this context, only RGB and Gray values are used. | |||
* <p> | |||
* Use of this class is discouraged. {@link PDFColorHandler} is now used for in-content color | |||
* selection. For masked bitmaps, it may be wiser to switch to {@link Color} in the long run. | |||
* selection. For masked bitmaps, it may be wiser to switch to {@link java.awt.Color} in the long run. | |||
*/ | |||
public class PDFColor extends PDFPathPaint { | |||
// could be 3.0 as well. |
@@ -38,7 +38,10 @@ public class PDFEmbeddedFile extends PDFStream { | |||
put("Params", params); | |||
} | |||
/** {@inheritDoc} */ | |||
/** | |||
* Determine if should encode on the fly. | |||
* @return true if should encode on the fly | |||
*/ | |||
protected boolean isEncodingOnTheFly() { | |||
//Acrobat doesn't like an indirect /Length object in this case, | |||
//but only when the embedded file is a PDF file. |
@@ -45,6 +45,7 @@ import org.apache.commons.logging.LogFactory; | |||
import org.apache.xmlgraphics.java2d.color.ColorUtil; | |||
import org.apache.xmlgraphics.java2d.color.NamedColorSpace; | |||
import org.apache.xmlgraphics.xmp.Metadata; | |||
import org.apache.fop.fonts.CIDFont; | |||
@@ -1674,8 +1675,8 @@ public class PDFFactory { | |||
FontFileReader reader = new FontFileReader(in); | |||
TTFSubSetFile subset = new TTFSubSetFile(); | |||
byte[] subsetFont = subset.readFont(reader, | |||
mbfont.getTTCName(), mbfont.getUsedGlyphs()); | |||
subset.readFont(reader, mbfont.getTTCName(), mbfont.getUsedGlyphs()); | |||
byte[] subsetFont = subset.getFontSubset(); | |||
// Only TrueType CID fonts are supported now | |||
embeddedFont = new PDFTTFStream(subsetFont.length); |
@@ -151,5 +151,13 @@ public interface PDFImage { | |||
*/ | |||
String getFilterHint(); | |||
/** | |||
* Indicates whether multiple image filters are allowed; this is implemented because Adobe | |||
* Reader does not like multiple FlateDecode filters applied to an image even though that | |||
* allowed by the PDF spec; this is probable due to security concerns since many PDF malware | |||
* exploits, like zip bombs, make use of a chain of FlateDecode filters. | |||
*/ | |||
boolean multipleFiltersAllowed(); | |||
} | |||
@@ -166,4 +166,9 @@ public class PDFImageXObject extends PDFXObject { | |||
return pdfimage.getFilterHint(); | |||
} | |||
/** {@inheritDoc} */ | |||
protected boolean multipleFiltersAllowed() { | |||
return pdfimage.multipleFiltersAllowed(); | |||
} | |||
} |
@@ -22,7 +22,6 @@ package org.apache.fop.pdf; | |||
// Java | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.io.Writer; | |||
import org.apache.commons.logging.Log; | |||
import org.apache.commons.logging.LogFactory; | |||
@@ -210,11 +209,6 @@ public abstract class PDFObject implements PDFWritable { | |||
return pdf.length; | |||
} | |||
/** {@inheritDoc} */ | |||
public void outputInline(OutputStream out, Writer writer) throws IOException { | |||
throw new UnsupportedOperationException("Don't use anymore: " + getClass().getName()); | |||
} | |||
/** {@inheritDoc} */ | |||
public void outputInline(OutputStream out, StringBuilder textBuffer) throws IOException { | |||
if (hasObjectNumber()) { |
@@ -21,9 +21,8 @@ package org.apache.fop.pdf; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.HashMap; | |||
import java.util.HashSet; | |||
import java.util.Iterator; | |||
import java.util.LinkedHashMap; | |||
import java.util.LinkedHashSet; | |||
import java.util.Map; | |||
import java.util.Set; | |||
@@ -46,33 +45,33 @@ public class PDFResources extends PDFDictionary { | |||
/** | |||
* /Font objects keyed by their internal name | |||
*/ | |||
protected Map fonts = new HashMap(); | |||
protected Map<String, PDFFont> fonts = new LinkedHashMap<String, PDFFont>(); | |||
/** | |||
* Set of XObjects | |||
*/ | |||
protected Set xObjects = new HashSet(); | |||
protected Set<PDFXObject> xObjects = new LinkedHashSet<PDFXObject>(); | |||
/** | |||
* Set of patterns | |||
*/ | |||
protected Set patterns = new HashSet(); | |||
protected Set<PDFPattern> patterns = new LinkedHashSet<PDFPattern>(); | |||
/** | |||
* Set of shadings | |||
*/ | |||
protected Set shadings = new HashSet(); | |||
protected Set<PDFShading> shadings = new LinkedHashSet<PDFShading>(); | |||
/** | |||
* Set of ExtGStates | |||
*/ | |||
protected Set gstates = new HashSet(); | |||
protected Set<PDFGState> gstates = new LinkedHashSet<PDFGState>(); | |||
/** Map of color spaces (key: color space name) */ | |||
protected Map colorSpaces = new HashMap(); | |||
protected Map<PDFName, PDFColorSpace> colorSpaces = new LinkedHashMap<PDFName, PDFColorSpace>(); | |||
/** Map of ICC color spaces (key: ICC profile description) */ | |||
protected Map iccColorSpaces = new HashMap(); | |||
protected Map<String, PDFICCBasedColorSpace> iccColorSpaces = new LinkedHashMap<String, PDFICCBasedColorSpace>(); | |||
/** | |||
* create a /Resources object. | |||
@@ -168,7 +167,7 @@ public class PDFResources extends PDFDictionary { | |||
PDFICCBasedColorSpace icc = (PDFICCBasedColorSpace)colorSpace; | |||
String desc = ColorProfileUtil.getICCProfileDescription( | |||
icc.getICCStream().getICCProfile()); | |||
this.iccColorSpaces.put(desc, colorSpace); | |||
this.iccColorSpaces.put(desc, icc); | |||
} | |||
} | |||
@@ -178,7 +177,7 @@ public class PDFResources extends PDFDictionary { | |||
* @return the requested color space or null if it wasn't found | |||
*/ | |||
public PDFICCBasedColorSpace getICCColorSpaceByProfileName(String desc) { | |||
PDFICCBasedColorSpace cs = (PDFICCBasedColorSpace)this.iccColorSpaces.get(desc); | |||
PDFICCBasedColorSpace cs = this.iccColorSpaces.get(desc); | |||
return cs; | |||
} | |||
@@ -188,7 +187,7 @@ public class PDFResources extends PDFDictionary { | |||
* @return the requested color space or null if it wasn't found | |||
*/ | |||
public PDFColorSpace getColorSpace(PDFName name) { | |||
PDFColorSpace cs = (PDFColorSpace)this.colorSpaces.get(name); | |||
PDFColorSpace cs = this.colorSpaces.get(name); | |||
return cs; | |||
} | |||
@@ -202,28 +201,24 @@ public class PDFResources extends PDFDictionary { | |||
if (!this.fonts.isEmpty()) { | |||
PDFDictionary dict = new PDFDictionary(this); | |||
/* construct PDF dictionary of font object references */ | |||
Iterator fontIterator = this.fonts.keySet().iterator(); | |||
while (fontIterator.hasNext()) { | |||
String fontName = (String)fontIterator.next(); | |||
dict.put(fontName, (PDFFont)this.fonts.get(fontName)); | |||
for (Map.Entry<String, PDFFont> entry : fonts.entrySet()) { | |||
dict.put(entry.getKey(), entry.getValue()); | |||
} | |||
put("Font", dict); | |||
} | |||
if (!this.shadings.isEmpty()) { | |||
PDFDictionary dict = new PDFDictionary(this); | |||
for (Iterator iter = shadings.iterator(); iter.hasNext();) { | |||
PDFShading currentShading = (PDFShading)iter.next(); | |||
dict.put(currentShading.getName(), currentShading); | |||
for (PDFShading shading : shadings) { | |||
dict.put(shading.getName(), shading); | |||
} | |||
put("Shading", dict); | |||
} | |||
if (!this.patterns.isEmpty()) { | |||
PDFDictionary dict = new PDFDictionary(this); | |||
for (Iterator iter = patterns.iterator(); iter.hasNext();) { | |||
PDFPattern currentPattern = (PDFPattern)iter.next(); | |||
dict.put(currentPattern.getName(), currentPattern); | |||
for (PDFPattern pattern : patterns) { | |||
dict.put(pattern.getName(), pattern); | |||
} | |||
put("Pattern", dict); | |||
} | |||
@@ -237,26 +232,23 @@ public class PDFResources extends PDFDictionary { | |||
if (this.xObjects != null && !this.xObjects.isEmpty()) { | |||
PDFDictionary dict = new PDFDictionary(this); | |||
for (Iterator iter = xObjects.iterator(); iter.hasNext();) { | |||
PDFXObject xobj = (PDFXObject)iter.next(); | |||
dict.put(xobj.getName().toString(), xobj); | |||
for (PDFXObject xObject : xObjects) { | |||
dict.put(xObject.getName().toString(), xObject); | |||
} | |||
put("XObject", dict); | |||
} | |||
if (!this.gstates.isEmpty()) { | |||
PDFDictionary dict = new PDFDictionary(this); | |||
for (Iterator iter = gstates.iterator(); iter.hasNext();) { | |||
PDFGState gs = (PDFGState)iter.next(); | |||
dict.put(gs.getName(), gs); | |||
for (PDFGState gstate : gstates) { | |||
dict.put(gstate.getName(), gstate); | |||
} | |||
put("ExtGState", dict); | |||
} | |||
if (!this.colorSpaces.isEmpty()) { | |||
PDFDictionary dict = new PDFDictionary(this); | |||
for (Iterator iter = colorSpaces.values().iterator(); iter.hasNext();) { | |||
PDFColorSpace colorSpace = (PDFColorSpace)iter.next(); | |||
for (PDFColorSpace colorSpace : colorSpaces.values()) { | |||
dict.put(colorSpace.getName(), colorSpace); | |||
} | |||
put("ColorSpace", dict); |
@@ -33,7 +33,8 @@ public interface ImageHandler extends ImageHandlerBase { | |||
* Indicates whether the image handler is compatible with the indicated target represented | |||
* by the rendering context object and with the image to be processed. The image is also | |||
* passed as a parameter because a handler might not support every subtype of image that is | |||
* presented. For example: in the case of {@link ImageXMLDOM}, the image might carry an SVG | |||
* presented. For example: in the case of | |||
* {@link org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM}, the image might carry an SVG | |||
* or some other XML format. One handler might only handle SVG but no other XML format. | |||
* @param targetContext the target rendering context | |||
* @param image the image to be processed (or null if only to check based on the rendering |
@@ -58,7 +58,8 @@ import org.apache.fop.render.intermediate.IFException; | |||
import org.apache.fop.render.intermediate.IFPainter; | |||
/** | |||
* {@link IFDocumentHandler} implementation that produces AFP (MO:DCA). | |||
* {@link org.apache.fop.render.intermediate.IFDocumentHandler} implementation that | |||
* produces AFP (MO:DCA). | |||
*/ | |||
public class AFPDocumentHandler extends AbstractBinaryWritingIFDocumentHandler | |||
implements AFPCustomizable { |
@@ -27,7 +27,7 @@ import org.xml.sax.helpers.AttributesImpl; | |||
/** | |||
* This extension allows to include an AFP form map resource. It is implemented as an extension | |||
* attachment ({@link ExtensionAttachment}). | |||
* attachment ({@link org.apache.fop.fo.extensions.ExtensionAttachment}). | |||
*/ | |||
public class AFPIncludeFormMap extends AFPExtensionAttachment { | |||
@@ -32,8 +32,8 @@ import org.apache.fop.fo.PropertyList; | |||
import org.apache.fop.fo.extensions.ExtensionAttachment; | |||
/** | |||
* This class extends the {@link ExtensionObj} class. It represents the "include-form-map" | |||
* extension in the FO tree. | |||
* This class extends the {@link org.apache.fop.fo.extensions.ExtensionObj} class. | |||
* It represents the "include-form-map" extension in the FO tree. | |||
*/ | |||
public class AFPIncludeFormMapElement extends AbstractAFPExtensionObject { | |||
@@ -25,7 +25,7 @@ import org.xml.sax.helpers.AttributesImpl; | |||
/** | |||
* This extension allows to include an AFP Page Overlay resource. It is implemented as an extension | |||
* attachment ({@link ExtensionAttachment}). | |||
* attachment ({@link org.apache.fop.fo.extensions.ExtensionAttachment}). | |||
*/ | |||
public class AFPPageOverlay extends AFPExtensionAttachment { | |||
@@ -47,7 +47,8 @@ import org.apache.fop.render.java2d.Java2DPainter; | |||
import org.apache.fop.render.java2d.Java2DUtil; | |||
/** | |||
* Abstract {@link IFDocumentHandler} implementation for producing bitmap images. | |||
* Abstract {@link org.apache.fop.render.intermediate.IFDocumentHandler} implementation | |||
* for producing bitmap images. | |||
*/ | |||
public abstract class AbstractBitmapDocumentHandler extends AbstractBinaryWritingIFDocumentHandler { | |||
@@ -23,7 +23,8 @@ import org.apache.fop.apps.MimeConstants; | |||
import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator; | |||
/** | |||
* {@link IFDocumentHandler} implementation that produces PNG files. | |||
* {@link org.apache.fop.render.intermediate.IFDocumentHandler} implementation | |||
* that produces PNG files. | |||
*/ | |||
public class PNGDocumentHandler extends AbstractBitmapDocumentHandler { | |||